aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/nodeiterator.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/nodeiterator.rs')
-rw-r--r--components/script/dom/nodeiterator.rs118
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>),
}