mirror of
https://github.com/servo/servo.git
synced 2025-07-25 00:00:20 +01:00
Implement Stringifier for Range
This commit is contained in:
parent
ae67ae9cdb
commit
b32e859c3a
5 changed files with 95 additions and 5 deletions
|
@ -118,7 +118,7 @@ impl Range {
|
||||||
|
|
||||||
// Step 11.
|
// Step 11.
|
||||||
let contained_children: Vec<Root<Node>> =
|
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.
|
// Step 12.
|
||||||
if contained_children.iter().any(|n| n.is_doctype()) {
|
if contained_children.iter().any(|n| n.is_doctype()) {
|
||||||
|
@ -850,6 +850,49 @@ impl RangeMethods for Range {
|
||||||
// Step 7.
|
// Step 7.
|
||||||
self.SelectNode(new_parent)
|
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)]
|
#[derive(JSTraceable)]
|
||||||
|
|
|
@ -72,7 +72,7 @@ interface Range {
|
||||||
[Pure]
|
[Pure]
|
||||||
boolean intersectsNode(Node node);
|
boolean intersectsNode(Node node);
|
||||||
|
|
||||||
// stringifier;
|
stringifier;
|
||||||
};
|
};
|
||||||
|
|
||||||
// https://dvcs.w3.org/hg/innerhtml/raw-file/tip/index.html#extensions-to-the-range-interface
|
// https://dvcs.w3.org/hg/innerhtml/raw-file/tip/index.html#extensions-to-the-range-interface
|
||||||
|
|
|
@ -34520,6 +34520,12 @@
|
||||||
"url": "/dom/lists/DOMTokenList-value.html"
|
"url": "/dom/lists/DOMTokenList-value.html"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"dom/ranges/Range-stringifier.html": [
|
||||||
|
{
|
||||||
|
"path": "dom/ranges/Range-stringifier.html",
|
||||||
|
"url": "/dom/ranges/Range-stringifier.html"
|
||||||
|
}
|
||||||
|
],
|
||||||
"html/webappapis/scripting/events/event-handler-processing-algorithm.html": [
|
"html/webappapis/scripting/events/event-handler-processing-algorithm.html": [
|
||||||
{
|
{
|
||||||
"path": "html/webappapis/scripting/events/event-handler-processing-algorithm.html",
|
"path": "html/webappapis/scripting/events/event-handler-processing-algorithm.html",
|
||||||
|
|
|
@ -129,9 +129,6 @@
|
||||||
[Element interface: calling queryAll(DOMString) on element with too few arguments must throw TypeError]
|
[Element interface: calling queryAll(DOMString) on element with too few arguments must throw TypeError]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[Range interface: stringifier]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMSettableTokenList interface: existence and properties of interface prototype object]
|
[DOMSettableTokenList interface: existence and properties of interface prototype object]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
<!doctype html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Range stringifier</title>
|
||||||
|
<link rel="author" title="KiChjang" href="mailto:kungfukeith11@gmail.com">
|
||||||
|
<script src="/resources/testharness.js"></script>
|
||||||
|
<script src="/resources/testharnessreport.js"></script>
|
||||||
|
<div id=test>Test div</div>
|
||||||
|
<div id=another>Another div</div>
|
||||||
|
<div id=last>Last div</div>
|
||||||
|
<div id=log></div>
|
||||||
|
<script>
|
||||||
|
test(function() {
|
||||||
|
var r = new Range();
|
||||||
|
var testDiv = document.getElementById("test");
|
||||||
|
test(function() {
|
||||||
|
r.selectNodeContents(testDiv);
|
||||||
|
assert_equals(r.collapsed, false);
|
||||||
|
assert_equals(r.toString(), testDiv.textContent);
|
||||||
|
}, "Node contents of a single div");
|
||||||
|
|
||||||
|
var textNode = testDiv.childNodes[0];
|
||||||
|
test(function() {
|
||||||
|
r.setStart(textNode, 5);
|
||||||
|
r.setEnd(textNode, 7);
|
||||||
|
assert_equals(r.collapsed, false);
|
||||||
|
assert_equals(r.toString(), "di");
|
||||||
|
}, "Text node with offsets");
|
||||||
|
|
||||||
|
var anotherDiv = document.getElementById("another");
|
||||||
|
test(function() {
|
||||||
|
r.setStart(testDiv, 0);
|
||||||
|
r.setEnd(anotherDiv, 0);
|
||||||
|
assert_equals(r.toString(), "Test div\n");
|
||||||
|
}, "Two nodes, each with a text node");
|
||||||
|
|
||||||
|
var lastDiv = document.getElementById("last");
|
||||||
|
var lastText = lastDiv.childNodes[0];
|
||||||
|
test(function() {
|
||||||
|
r.setStart(textNode, 5);
|
||||||
|
r.setEnd(lastText, 4);
|
||||||
|
assert_equals(r.toString(), "div\nAnother div\nLast");
|
||||||
|
}, "Three nodes with start offset and end offset on text nodes");
|
||||||
|
});
|
||||||
|
</script>
|
Loading…
Add table
Add a link
Reference in a new issue