diff --git a/src/components/script/dom/bindings/error.rs b/src/components/script/dom/bindings/error.rs index da30f40588b..aa4c84cd981 100644 --- a/src/components/script/dom/bindings/error.rs +++ b/src/components/script/dom/bindings/error.rs @@ -9,6 +9,7 @@ use js::glue::{ReportError}; #[deriving(Show)] pub enum Error { + IndexSize, FailureUnknown, NotFound, HierarchyRequest, diff --git a/src/components/script/dom/characterdata.rs b/src/components/script/dom/characterdata.rs index f7b1afabde0..3cc503a50fd 100644 --- a/src/components/script/dom/characterdata.rs +++ b/src/components/script/dom/characterdata.rs @@ -6,7 +6,7 @@ use dom::bindings::codegen::InheritTypes::CharacterDataDerived; use dom::bindings::js::JS; -use dom::bindings::error::{Fallible, ErrorResult}; +use dom::bindings::error::{Fallible, ErrorResult, IndexSize}; use dom::bindings::utils::{Reflectable, Reflector}; use dom::document::Document; use dom::eventtarget::{EventTarget, NodeTargetTypeId}; @@ -59,6 +59,32 @@ impl CharacterData { self.data.push_str(arg); Ok(()) } + + pub fn InsertData(&mut self, offset: u32, arg: DOMString) -> ErrorResult { + self.ReplaceData(offset, 0, arg) + } + + pub fn DeleteData(&mut self, offset: u32, count: u32) -> ErrorResult { + self.ReplaceData(offset, count, ~"") + } + + pub fn ReplaceData(&mut self, offset: u32, count: u32, arg: DOMString) -> ErrorResult { + let length = self.data.len() as u32; + if offset > length { + return Err(IndexSize); + } + let count = if offset + count > length { + length - offset + } else { + count + }; + let mut data = self.data.slice(0, offset as uint).to_owned(); + data.push_str(arg); + data.push_str(self.data.slice((offset + count) as uint, length as uint)); + self.data = data; + // FIXME: Once we have `Range`, we should implement step7 to step11 + Ok(()) + } } impl Reflectable for CharacterData { diff --git a/src/components/script/dom/webidls/CharacterData.webidl b/src/components/script/dom/webidls/CharacterData.webidl index 88c6c135a0c..00085fcc6b0 100644 --- a/src/components/script/dom/webidls/CharacterData.webidl +++ b/src/components/script/dom/webidls/CharacterData.webidl @@ -17,6 +17,12 @@ interface CharacterData : Node { DOMString substringData(unsigned long offset, unsigned long count); [Throws] void appendData(DOMString data); + [Throws] + void insertData(unsigned long offset, DOMString data); + [Throws] + void deleteData(unsigned long offset, unsigned long count); + [Throws] + void replaceData(unsigned long offset, unsigned long count, DOMString data); }; //CharacterData implements ChildNode;