aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/nodeiterator.rs
diff options
context:
space:
mode:
authorCYBAI <cyb.ai.815@gmail.com>2017-08-27 02:22:11 +0800
committerCYBAI <cyb.ai.815@gmail.com>2017-10-19 22:01:30 +0800
commitcb8b52c5fe2bc77f69aaa9ecb4f859fd27c2c8a3 (patch)
tree6de9a3ef36669b13c3fd11800577bda31fe0e48b /components/script/dom/nodeiterator.rs
parent6268f482084179ed54e63028da038ae39c947359 (diff)
downloadservo-cb8b52c5fe2bc77f69aaa9ecb4f859fd27c2c8a3.tar.gz
servo-cb8b52c5fe2bc77f69aaa9ecb4f859fd27c2c8a3.zip
Update concept of node filter algorithm
Diffstat (limited to 'components/script/dom/nodeiterator.rs')
-rw-r--r--components/script/dom/nodeiterator.rs26
1 files changed, 21 insertions, 5 deletions
diff --git a/components/script/dom/nodeiterator.rs b/components/script/dom/nodeiterator.rs
index 5897c4075c9..5da1bffb6d8 100644
--- a/components/script/dom/nodeiterator.rs
+++ b/components/script/dom/nodeiterator.rs
@@ -8,7 +8,7 @@ use dom::bindings::codegen::Bindings::NodeFilterBinding::NodeFilter;
use dom::bindings::codegen::Bindings::NodeFilterBinding::NodeFilterConstants;
use dom::bindings::codegen::Bindings::NodeIteratorBinding;
use dom::bindings::codegen::Bindings::NodeIteratorBinding::NodeIteratorMethods;
-use dom::bindings::error::Fallible;
+use dom::bindings::error::{Error, Fallible};
use dom::bindings::reflector::{Reflector, reflect_dom_object};
use dom::bindings::root::{Dom, DomRoot, MutDom};
use dom::document::Document;
@@ -27,6 +27,7 @@ pub struct NodeIterator {
what_to_show: u32,
#[ignore_malloc_size_of = "Can't measure due to #6870"]
filter: Filter,
+ active: Cell<bool>,
}
impl NodeIterator {
@@ -39,7 +40,8 @@ impl NodeIterator {
reference_node: MutDom::new(root_node),
pointer_before_reference_node: Cell::new(true),
what_to_show: what_to_show,
- filter: filter
+ filter: filter,
+ active: Cell::new(false),
}
}
@@ -192,15 +194,29 @@ impl NodeIterator {
// https://dom.spec.whatwg.org/#concept-node-filter
fn accept_node(&self, node: &Node) -> Fallible<u16> {
// Step 1.
- let n = node.NodeType() - 1;
+ if self.active.get() {
+ return Err(Error::InvalidState);
+ }
// Step 2.
+ let n = node.NodeType() - 1;
+ // Step 3.
if (self.what_to_show & (1 << n)) == 0 {
return Ok(NodeFilterConstants::FILTER_SKIP)
}
- // Step 3-5.
+
match self.filter {
+ // Step 4.
Filter::None => Ok(NodeFilterConstants::FILTER_ACCEPT),
- Filter::Callback(ref callback) => callback.AcceptNode_(self, node, Rethrow)
+ Filter::Callback(ref callback) => {
+ // Step 5.
+ self.active.set(true);
+ // Step 6.
+ let result = callback.AcceptNode_(self, node, Rethrow);
+ // Step 7.
+ self.active.set(false);
+ // Step 8.
+ result
+ }
}
}
}