diff options
Diffstat (limited to 'components/script/dom/nodeiterator.rs')
-rw-r--r-- | components/script/dom/nodeiterator.rs | 118 |
1 files changed, 67 insertions, 51 deletions
diff --git a/components/script/dom/nodeiterator.rs b/components/script/dom/nodeiterator.rs index 91b590a3647..a141785a85d 100644 --- a/components/script/dom/nodeiterator.rs +++ b/components/script/dom/nodeiterator.rs @@ -1,18 +1,17 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -use dom::bindings::callback::ExceptionHandling::Rethrow; -use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; -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::js::{JS, MutJS, Root}; -use dom::bindings::reflector::{Reflector, reflect_dom_object}; -use dom::document::Document; -use dom::node::Node; + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +use crate::dom::bindings::callback::ExceptionHandling::Rethrow; +use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; +use crate::dom::bindings::codegen::Bindings::NodeFilterBinding::NodeFilter; +use crate::dom::bindings::codegen::Bindings::NodeFilterBinding::NodeFilterConstants; +use crate::dom::bindings::codegen::Bindings::NodeIteratorBinding::NodeIteratorMethods; +use crate::dom::bindings::error::{Error, Fallible}; +use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::root::{Dom, DomRoot, MutDom}; +use crate::dom::document::Document; +use crate::dom::node::Node; use dom_struct::dom_struct; use std::cell::Cell; use std::rc::Rc; @@ -20,45 +19,50 @@ use std::rc::Rc; #[dom_struct] pub struct NodeIterator { reflector_: Reflector, - root_node: JS<Node>, - #[ignore_heap_size_of = "Defined in rust-mozjs"] - reference_node: MutJS<Node>, + root_node: Dom<Node>, + #[ignore_malloc_size_of = "Defined in rust-mozjs"] + reference_node: MutDom<Node>, pointer_before_reference_node: Cell<bool>, what_to_show: u32, - #[ignore_heap_size_of = "Can't measure due to #6870"] + #[ignore_malloc_size_of = "Can't measure due to #6870"] filter: Filter, + active: Cell<bool>, } impl NodeIterator { - fn new_inherited(root_node: &Node, - what_to_show: u32, - filter: Filter) -> NodeIterator { + fn new_inherited(root_node: &Node, what_to_show: u32, filter: Filter) -> NodeIterator { NodeIterator { reflector_: Reflector::new(), - root_node: JS::from_ref(root_node), - reference_node: MutJS::new(root_node), + root_node: Dom::from_ref(root_node), + 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), } } - pub fn new_with_filter(document: &Document, - root_node: &Node, - what_to_show: u32, - filter: Filter) -> Root<NodeIterator> { - reflect_dom_object(box NodeIterator::new_inherited(root_node, what_to_show, filter), - document.window(), - NodeIteratorBinding::Wrap) + pub fn new_with_filter( + document: &Document, + root_node: &Node, + what_to_show: u32, + filter: Filter, + ) -> DomRoot<NodeIterator> { + reflect_dom_object( + Box::new(NodeIterator::new_inherited(root_node, what_to_show, filter)), + document.window(), + ) } - pub fn new(document: &Document, - root_node: &Node, - what_to_show: u32, - node_filter: Option<Rc<NodeFilter>>) -> Root<NodeIterator> { + pub fn new( + document: &Document, + root_node: &Node, + what_to_show: u32, + node_filter: Option<Rc<NodeFilter>>, + ) -> DomRoot<NodeIterator> { let filter = match node_filter { None => Filter::None, - Some(jsfilter) => Filter::Callback(jsfilter) + Some(jsfilter) => Filter::Callback(jsfilter), }; NodeIterator::new_with_filter(document, root_node, what_to_show, filter) } @@ -66,8 +70,8 @@ impl NodeIterator { impl NodeIteratorMethods for NodeIterator { // https://dom.spec.whatwg.org/#dom-nodeiterator-root - fn Root(&self) -> Root<Node> { - Root::from_ref(&*self.root_node) + fn Root(&self) -> DomRoot<Node> { + DomRoot::from_ref(&*self.root_node) } // https://dom.spec.whatwg.org/#dom-nodeiterator-whattoshow @@ -84,7 +88,7 @@ impl NodeIteratorMethods for NodeIterator { } // https://dom.spec.whatwg.org/#dom-nodeiterator-referencenode - fn ReferenceNode(&self) -> Root<Node> { + fn ReferenceNode(&self) -> DomRoot<Node> { self.reference_node.get() } @@ -94,7 +98,7 @@ impl NodeIteratorMethods for NodeIterator { } // https://dom.spec.whatwg.org/#dom-nodeiterator-nextnode - fn NextNode(&self) -> Fallible<Option<Root<Node>>> { + fn NextNode(&self) -> Fallible<Option<DomRoot<Node>>> { // https://dom.spec.whatwg.org/#concept-NodeIterator-traverse // Step 1. let node = self.reference_node.get(); @@ -107,7 +111,7 @@ impl NodeIteratorMethods for NodeIterator { before_node = false; // Step 3-2. - let result = try!(self.accept_node(&node)); + let result = self.accept_node(&node)?; // Step 3-3. if result == NodeFilterConstants::FILTER_ACCEPT { @@ -122,7 +126,7 @@ impl NodeIteratorMethods for NodeIterator { // Step 3-1. for following_node in node.following_nodes(&self.root_node) { // Step 3-2. - let result = try!(self.accept_node(&following_node)); + let result = self.accept_node(&following_node)?; // Step 3-3. if result == NodeFilterConstants::FILTER_ACCEPT { @@ -138,7 +142,7 @@ impl NodeIteratorMethods for NodeIterator { } // https://dom.spec.whatwg.org/#dom-nodeiterator-previousnode - fn PreviousNode(&self) -> Fallible<Option<Root<Node>>> { + fn PreviousNode(&self) -> Fallible<Option<DomRoot<Node>>> { // https://dom.spec.whatwg.org/#concept-NodeIterator-traverse // Step 1. let node = self.reference_node.get(); @@ -151,7 +155,7 @@ impl NodeIteratorMethods for NodeIterator { before_node = true; // Step 3-2. - let result = try!(self.accept_node(&node)); + let result = self.accept_node(&node)?; // Step 3-3. if result == NodeFilterConstants::FILTER_ACCEPT { @@ -166,7 +170,7 @@ impl NodeIteratorMethods for NodeIterator { // Step 3-1. for preceding_node in node.preceding_nodes(&self.root_node) { // Step 3-2. - let result = try!(self.accept_node(&preceding_node)); + let result = self.accept_node(&preceding_node)?; // Step 3-3. if result == NodeFilterConstants::FILTER_ACCEPT { @@ -187,27 +191,39 @@ impl NodeIteratorMethods for NodeIterator { } } - 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) + 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 + }, } } } - #[derive(JSTraceable)] pub enum Filter { None, - Callback(Rc<NodeFilter>) + Callback(Rc<NodeFilter>), } |