aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorKeith Yeung <kungfukeith11@gmail.com>2016-02-28 12:53:10 -0500
committerKeith Yeung <kungfukeith11@gmail.com>2016-03-09 15:27:37 -0500
commitb32e859c3a41fb48b540928f12a247133080aa8a (patch)
tree457f21164fc867f23cf13adec435ee065daae6d2 /components/script/dom
parentae67ae9cdb3f102a71af4ec45e88e5751e564a0e (diff)
downloadservo-b32e859c3a41fb48b540928f12a247133080aa8a.tar.gz
servo-b32e859c3a41fb48b540928f12a247133080aa8a.zip
Implement Stringifier for Range
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/range.rs45
-rw-r--r--components/script/dom/webidls/Range.webidl2
2 files changed, 45 insertions, 2 deletions
diff --git a/components/script/dom/range.rs b/components/script/dom/range.rs
index 235a4dbcc9b..7d94d95f0e4 100644
--- a/components/script/dom/range.rs
+++ b/components/script/dom/range.rs
@@ -118,7 +118,7 @@ impl Range {
// Step 11.
let contained_children: Vec<Root<Node>> =
- common_ancestor.children().filter(|n| Range::contains(self, n)).collect();
+ common_ancestor.children().filter(|n| self.contains(n)).collect();
// Step 12.
if contained_children.iter().any(|n| n.is_doctype()) {
@@ -850,6 +850,49 @@ impl RangeMethods for Range {
// Step 7.
self.SelectNode(new_parent)
}
+
+ // https://dom.spec.whatwg.org/#dom-range-stringifier
+ fn Stringifier(&self) -> DOMString {
+ let start_node = self.StartContainer();
+ let end_node = self.EndContainer();
+
+ // Step 1.
+ let mut s = DOMString::new();
+
+ if let Some(text_node) = start_node.downcast::<Text>() {
+ let char_data = text_node.upcast::<CharacterData>();
+
+ // Step 2.
+ if start_node == end_node {
+ return char_data.SubstringData(self.StartOffset(),
+ self.EndOffset() - self.StartOffset()).unwrap();
+ }
+
+ // Step 3.
+ s.push_str(&*char_data.SubstringData(self.StartOffset(),
+ char_data.Length() - self.StartOffset()).unwrap());
+ }
+
+ // Step 4.
+ let ancestor = self.CommonAncestorContainer();
+ let mut iter = start_node.following_nodes(ancestor.r())
+ .filter_map(Root::downcast::<Text>);
+
+ while let Some(child) = iter.next() {
+ if self.contains(child.upcast()) {
+ s.push_str(&*child.upcast::<CharacterData>().Data());
+ }
+ }
+
+ // Step 5.
+ if let Some(text_node) = end_node.downcast::<Text>() {
+ let char_data = text_node.upcast::<CharacterData>();
+ s.push_str(&*char_data.SubstringData(0, self.EndOffset()).unwrap());
+ }
+
+ // Step 6.
+ s
+ }
}
#[derive(JSTraceable)]
diff --git a/components/script/dom/webidls/Range.webidl b/components/script/dom/webidls/Range.webidl
index 1d91c89b505..4c7413e3456 100644
--- a/components/script/dom/webidls/Range.webidl
+++ b/components/script/dom/webidls/Range.webidl
@@ -72,7 +72,7 @@ interface Range {
[Pure]
boolean intersectsNode(Node node);
- // stringifier;
+ stringifier;
};
// https://dvcs.w3.org/hg/innerhtml/raw-file/tip/index.html#extensions-to-the-range-interface