diff options
author | CYBAI <cyb.ai.815@gmail.com> | 2017-08-27 02:22:11 +0800 |
---|---|---|
committer | CYBAI <cyb.ai.815@gmail.com> | 2017-10-19 22:01:30 +0800 |
commit | cb8b52c5fe2bc77f69aaa9ecb4f859fd27c2c8a3 (patch) | |
tree | 6de9a3ef36669b13c3fd11800577bda31fe0e48b /components/script/dom/nodeiterator.rs | |
parent | 6268f482084179ed54e63028da038ae39c947359 (diff) | |
download | servo-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.rs | 26 |
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 + } } } } |