aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/text.rs
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2015-04-23 10:56:41 +0200
committerAnthony Ramine <n.oxyde@gmail.com>2015-04-23 16:36:50 +0200
commit163d97d2702cc4cb35fafbf89ae2ba98a29d2b3b (patch)
tree357004874c1c4d67bdd4708af679cd50258d40d4 /components/script/dom/text.rs
parenta3dafe49999d24e12b2f6b5cc74b468e58b7384a (diff)
downloadservo-163d97d2702cc4cb35fafbf89ae2ba98a29d2b3b.tar.gz
servo-163d97d2702cc4cb35fafbf89ae2ba98a29d2b3b.zip
Implement Text.splitText()
Diffstat (limited to 'components/script/dom/text.rs')
-rw-r--r--components/script/dom/text.rs43
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()