diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2015-04-23 10:56:41 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2015-04-23 16:36:50 +0200 |
commit | 163d97d2702cc4cb35fafbf89ae2ba98a29d2b3b (patch) | |
tree | 357004874c1c4d67bdd4708af679cd50258d40d4 /components/script/dom/text.rs | |
parent | a3dafe49999d24e12b2f6b5cc74b468e58b7384a (diff) | |
download | servo-163d97d2702cc4cb35fafbf89ae2ba98a29d2b3b.tar.gz servo-163d97d2702cc4cb35fafbf89ae2ba98a29d2b3b.zip |
Implement Text.splitText()
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() |