mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
auto merge of #4868 : Ms2ger/servo/treewalker, r=saneyuki
This commit is contained in:
commit
83a6b5d770
2 changed files with 26 additions and 34 deletions
|
@ -11,7 +11,7 @@ use dom::bindings::codegen::Bindings::NodeFilterBinding::NodeFilter;
|
|||
// to move to the NodeFilter binding file (#3149).
|
||||
// For now, it is defined in this file.
|
||||
// use dom::bindings::codegen::Bindings::NodeFilterBinding::NodeFilterConstants;
|
||||
use dom::bindings::error::{ErrorResult, Fallible};
|
||||
use dom::bindings::error::Fallible;
|
||||
use dom::bindings::global::GlobalRef;
|
||||
use dom::bindings::js::{JS, JSRef, OptionalRootable, Temporary, MutHeap};
|
||||
use dom::bindings::utils::{Reflector, reflect_dom_object};
|
||||
|
@ -84,10 +84,8 @@ impl<'a> TreeWalkerMethods for JSRef<'a, TreeWalker> {
|
|||
Temporary::new(self.current_node.get())
|
||||
}
|
||||
|
||||
fn SetCurrentNode(self, node: JSRef<Node>) -> ErrorResult {
|
||||
// XXX Future: check_same_origin(root_node, node) (throws)
|
||||
fn SetCurrentNode(self, node: JSRef<Node>) {
|
||||
self.current_node.set(JS::from_rooted(node));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn ParentNode(self) -> Fallible<Option<Temporary<Node>>> {
|
||||
|
@ -162,16 +160,16 @@ impl<'a> PrivateTreeWalkerHelpers for JSRef<'a, TreeWalker> {
|
|||
None => break,
|
||||
Some(node) => {
|
||||
// "1. Filter node and let result be the return value."
|
||||
match self.accept_node(node) {
|
||||
Err(e) => return Err(e),
|
||||
let result = try!(self.accept_node(node));
|
||||
match result {
|
||||
// "2. If result is FILTER_ACCEPT, then set the currentNode
|
||||
// attribute to node and return node."
|
||||
Ok(NodeFilterConstants::FILTER_ACCEPT) => {
|
||||
NodeFilterConstants::FILTER_ACCEPT => {
|
||||
self.current_node.set(JS::from_rooted(node));
|
||||
return Ok(Some(Temporary::from_rooted(node)))
|
||||
},
|
||||
// "3. If result is FILTER_SKIP, run these subsubsteps:"
|
||||
Ok(NodeFilterConstants::FILTER_SKIP) => {
|
||||
NodeFilterConstants::FILTER_SKIP => {
|
||||
// "1. Let child be node's first child if type is first,
|
||||
// and node's last child if type is last."
|
||||
match next_child(node) {
|
||||
|
@ -249,12 +247,11 @@ impl<'a> PrivateTreeWalkerHelpers for JSRef<'a, TreeWalker> {
|
|||
// "1. Set node to sibling."
|
||||
node = sibling_op.unwrap().root().get_unsound_ref_forever();
|
||||
// "2. Filter node and let result be the return value."
|
||||
let result = self.accept_node(node);
|
||||
let result = try!(self.accept_node(node));
|
||||
// "3. If result is FILTER_ACCEPT, then set the currentNode
|
||||
// attribute to node and return node."
|
||||
match result {
|
||||
Err(e) => return Err(e),
|
||||
Ok(NodeFilterConstants::FILTER_ACCEPT) => {
|
||||
NodeFilterConstants::FILTER_ACCEPT => {
|
||||
self.current_node.set(JS::from_rooted(node));
|
||||
return Ok(Some(Temporary::from_rooted(node)))
|
||||
},
|
||||
|
@ -267,7 +264,7 @@ impl<'a> PrivateTreeWalkerHelpers for JSRef<'a, TreeWalker> {
|
|||
// then set sibling to node's next sibling if type is next,
|
||||
// and node's previous sibling if type is previous."
|
||||
match (result, &sibling_op) {
|
||||
(Ok(NodeFilterConstants::FILTER_REJECT), _)
|
||||
(NodeFilterConstants::FILTER_REJECT, _)
|
||||
| (_, &None) => sibling_op = next_sibling(node),
|
||||
_ => {}
|
||||
}
|
||||
|
@ -280,9 +277,8 @@ impl<'a> PrivateTreeWalkerHelpers for JSRef<'a, TreeWalker> {
|
|||
// "5. Filter node and if the return value is FILTER_ACCEPT, then return null."
|
||||
Some(n) => {
|
||||
node = n;
|
||||
match self.accept_node(node) {
|
||||
Err(e) => return Err(e),
|
||||
Ok(NodeFilterConstants::FILTER_ACCEPT) => return Ok(None),
|
||||
match try!(self.accept_node(node)) {
|
||||
NodeFilterConstants::FILTER_ACCEPT => return Ok(None),
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
@ -371,9 +367,8 @@ impl<'a> TreeWalkerHelpers<'a> for JSRef<'a, TreeWalker> {
|
|||
node = n.root().get_unsound_ref_forever();
|
||||
// "2. If node is not null and filtering node returns FILTER_ACCEPT,
|
||||
// then set the currentNode attribute to node, return node."
|
||||
match self.accept_node(node) {
|
||||
Err(e) => return Err(e),
|
||||
Ok(NodeFilterConstants::FILTER_ACCEPT) => {
|
||||
match try!(self.accept_node(node)) {
|
||||
NodeFilterConstants::FILTER_ACCEPT => {
|
||||
self.current_node.set(JS::from_rooted(node));
|
||||
return Ok(Some(Temporary::from_rooted(node)))
|
||||
},
|
||||
|
@ -434,12 +429,12 @@ impl<'a> TreeWalkerHelpers<'a> for JSRef<'a, TreeWalker> {
|
|||
// "4. If result is FILTER_ACCEPT, then
|
||||
// set the currentNode attribute to node and return node."
|
||||
loop {
|
||||
match self.accept_node(node) {
|
||||
Err(e) => return Err(e),
|
||||
Ok(NodeFilterConstants::FILTER_REJECT) => break,
|
||||
let result = try!(self.accept_node(node));
|
||||
match result {
|
||||
NodeFilterConstants::FILTER_REJECT => break,
|
||||
_ if node.first_child().is_some() =>
|
||||
node = node.last_child().unwrap().root().get_unsound_ref_forever(),
|
||||
Ok(NodeFilterConstants::FILTER_ACCEPT) => {
|
||||
NodeFilterConstants::FILTER_ACCEPT => {
|
||||
self.current_node.set(JS::from_rooted(node));
|
||||
return Ok(Some(Temporary::from_rooted(node)))
|
||||
},
|
||||
|
@ -463,9 +458,8 @@ impl<'a> TreeWalkerHelpers<'a> for JSRef<'a, TreeWalker> {
|
|||
}
|
||||
// "5. Filter node and if the return value is FILTER_ACCEPT, then
|
||||
// set the currentNode attribute to node and return node."
|
||||
match self.accept_node(node) {
|
||||
Err(e) => return Err(e),
|
||||
Ok(NodeFilterConstants::FILTER_ACCEPT) => {
|
||||
match try!(self.accept_node(node)) {
|
||||
NodeFilterConstants::FILTER_ACCEPT => {
|
||||
self.current_node.set(JS::from_rooted(node));
|
||||
return Ok(Some(Temporary::from_rooted(node)))
|
||||
},
|
||||
|
@ -481,13 +475,13 @@ impl<'a> TreeWalkerHelpers<'a> for JSRef<'a, TreeWalker> {
|
|||
// "1. Let node be the value of the currentNode attribute."
|
||||
let mut node = self.current_node.get().root().get_unsound_ref_forever();
|
||||
// "2. Let result be FILTER_ACCEPT."
|
||||
let mut result = Ok(NodeFilterConstants::FILTER_ACCEPT);
|
||||
let mut result = NodeFilterConstants::FILTER_ACCEPT;
|
||||
// "3. Run these substeps:"
|
||||
loop {
|
||||
// "1. While result is not FILTER_REJECT and node has a child, run these subsubsteps:"
|
||||
loop {
|
||||
match result {
|
||||
Ok(NodeFilterConstants::FILTER_REJECT) => break,
|
||||
NodeFilterConstants::FILTER_REJECT => break,
|
||||
_ => {}
|
||||
}
|
||||
match node.first_child() {
|
||||
|
@ -496,12 +490,11 @@ impl<'a> TreeWalkerHelpers<'a> for JSRef<'a, TreeWalker> {
|
|||
// "1. Set node to its first child."
|
||||
node = child.root().get_unsound_ref_forever();
|
||||
// "2. Filter node and set result to the return value."
|
||||
result = self.accept_node(node);
|
||||
result = try!(self.accept_node(node));
|
||||
// "3. If result is FILTER_ACCEPT, then
|
||||
// set the currentNode attribute to node and return node."
|
||||
match result {
|
||||
Err(e) => return Err(e),
|
||||
Ok(NodeFilterConstants::FILTER_ACCEPT) => {
|
||||
NodeFilterConstants::FILTER_ACCEPT => {
|
||||
self.current_node.set(JS::from_rooted(node));
|
||||
return Ok(Some(Temporary::from_rooted(node)))
|
||||
},
|
||||
|
@ -518,12 +511,11 @@ impl<'a> TreeWalkerHelpers<'a> for JSRef<'a, TreeWalker> {
|
|||
Some(n) => {
|
||||
node = n.root().get_unsound_ref_forever();
|
||||
// "3. Filter node and set result to the return value."
|
||||
result = self.accept_node(node);
|
||||
result = try!(self.accept_node(node));
|
||||
// "4. If result is FILTER_ACCEPT, then
|
||||
// set the currentNode attribute to node and return node."
|
||||
match result {
|
||||
Err(e) => return Err(e),
|
||||
Ok(NodeFilterConstants::FILTER_ACCEPT) => {
|
||||
NodeFilterConstants::FILTER_ACCEPT => {
|
||||
self.current_node.set(JS::from_rooted(node));
|
||||
return Ok(Some(Temporary::from_rooted(node)))
|
||||
},
|
||||
|
|
|
@ -14,7 +14,7 @@ interface TreeWalker {
|
|||
readonly attribute unsigned long whatToShow;
|
||||
[Constant]
|
||||
readonly attribute NodeFilter? filter;
|
||||
[Pure, SetterThrows]
|
||||
[Pure]
|
||||
attribute Node currentNode;
|
||||
|
||||
[Throws]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue