diff options
Diffstat (limited to 'components/script/dom/text.rs')
-rw-r--r-- | components/script/dom/text.rs | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/components/script/dom/text.rs b/components/script/dom/text.rs index 5df59274e9e..1698377f4bd 100644 --- a/components/script/dom/text.rs +++ b/components/script/dom/text.rs @@ -3,12 +3,15 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::codegen::Bindings::TextBinding::{self, TextMethods}; +use dom::bindings::codegen::Bindings::CharacterDataBinding::CharacterDataMethods; +use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods; +use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use dom::bindings::codegen::InheritTypes::{CharacterDataCast, TextDerived}; use dom::bindings::codegen::InheritTypes::NodeCast; -use dom::bindings::error::Fallible; +use dom::bindings::error::{Error, Fallible}; use dom::bindings::global::GlobalRef; -use dom::bindings::js::{JSRef, Temporary}; +use dom::bindings::js::{JSRef, OptionalRootable, RootedReference, Temporary}; use dom::characterdata::{CharacterData, CharacterDataHelpers}; use dom::document::Document; use dom::eventtarget::{EventTarget, EventTargetTypeId}; @@ -46,6 +49,42 @@ impl Text { } impl<'a> TextMethods for JSRef<'a, Text> { + // https://dom.spec.whatwg.org/#dom-text-splittextoffset + fn SplitText(self, offset: u32) -> Fallible<Temporary<Text>> { + let cdata = CharacterDataCast::from_ref(self); + // Step 1. + let length = cdata.Length(); + if offset > length { + // Step 2. + return Err(Error::IndexSize); + } + // Step 3. + let count = length - offset; + // Step 4. + let new_data = cdata.SubstringData(offset, count).unwrap(); + // Step 5. + let node = NodeCast::from_ref(self); + let owner_doc = node.owner_doc().root(); + let new_node = owner_doc.r().CreateTextNode(new_data).root(); + // Step 6. + let parent = node.parent_node().root(); + if let Some(ref parent) = parent { + // Step 7. + parent.r().InsertBefore(NodeCast::from_ref(new_node.r()), + node.next_sibling().root().r()) + .unwrap(); + // TODO: Ranges. + } + // Step 8. + cdata.DeleteData(offset, count).unwrap(); + if parent.is_none() { + // Step 9. + // TODO: Ranges + } + // Step 10. + Ok(Temporary::from_rooted(new_node.r())) + } + // https://dom.spec.whatwg.org/#dom-text-wholetext fn WholeText(self) -> DOMString { let first = NodeCast::from_ref(self).inclusively_preceding_siblings() |