aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/node.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/node.rs')
-rw-r--r--components/script/dom/node.rs169
1 files changed, 56 insertions, 113 deletions
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs
index 9143677d1e0..048ee28b3a9 100644
--- a/components/script/dom/node.rs
+++ b/components/script/dom/node.rs
@@ -179,7 +179,6 @@ impl NodeFlags {
}
}
-#[unsafe_destructor]
impl Drop for Node {
#[allow(unsafe_code)]
fn drop(&mut self) {
@@ -286,7 +285,7 @@ trait PrivateNodeHelpers {
impl<'a> PrivateNodeHelpers for JSRef<'a, Node> {
// https://dom.spec.whatwg.org/#node-is-inserted
fn node_inserted(self) {
- assert!(self.parent_node().is_some());
+ assert!(self.parent_node.get().is_some());
let document = document_from_node(self).root();
let is_in_doc = self.is_in_doc();
@@ -295,14 +294,14 @@ impl<'a> PrivateNodeHelpers for JSRef<'a, Node> {
vtable_for(&node.r()).bind_to_tree(is_in_doc);
}
- let parent = self.parent_node().root();
+ let parent = self.parent_node.get().root();
parent.r().map(|parent| vtable_for(&parent).child_inserted(self));
document.r().content_and_heritage_changed(self, NodeDamage::OtherNodeDamage);
}
// https://dom.spec.whatwg.org/#node-is-removed
fn node_removed(self, parent_in_doc: bool) {
- assert!(self.parent_node().is_none());
+ assert!(self.parent_node.get().is_none());
for node in self.traverse_preorder() {
let node = node.root();
vtable_for(&node.r()).unbind_from_tree(parent_in_doc);
@@ -318,15 +317,15 @@ impl<'a> PrivateNodeHelpers for JSRef<'a, Node> {
///
/// Fails unless `new_child` is disconnected from the tree.
fn add_child(self, new_child: JSRef<Node>, before: Option<JSRef<Node>>) {
- assert!(new_child.parent_node().is_none());
- assert!(new_child.prev_sibling().is_none());
- assert!(new_child.next_sibling().is_none());
+ assert!(new_child.parent_node.get().is_none());
+ assert!(new_child.prev_sibling.get().is_none());
+ assert!(new_child.next_sibling.get().is_none());
match before {
Some(ref before) => {
- assert!(before.parent_node().root().r() == Some(self));
- match before.prev_sibling().root() {
+ assert!(before.parent_node.get().root().r() == Some(self));
+ match before.prev_sibling.get().root() {
None => {
- assert!(Some(*before) == self.first_child().root().r());
+ assert!(Some(*before) == self.first_child.get().root().r());
self.first_child.set(Some(JS::from_rooted(new_child)));
},
Some(ref prev_sibling) => {
@@ -338,10 +337,10 @@ impl<'a> PrivateNodeHelpers for JSRef<'a, Node> {
new_child.next_sibling.set(Some(JS::from_rooted(*before)));
},
None => {
- match self.last_child().root() {
+ match self.last_child.get().root() {
None => self.first_child.set(Some(JS::from_rooted(new_child))),
Some(ref last_child) => {
- assert!(last_child.r().next_sibling().is_none());
+ assert!(last_child.r().next_sibling.get().is_none());
last_child.r().next_sibling.set(Some(JS::from_rooted(new_child)));
new_child.prev_sibling.set(Some(JS::from_rooted(last_child.r())));
}
@@ -358,7 +357,7 @@ impl<'a> PrivateNodeHelpers for JSRef<'a, Node> {
///
/// Fails unless `child` is a child of this node.
fn remove_child(self, child: JSRef<Node>) {
- assert!(child.parent_node().root().r() == Some(self));
+ assert!(child.parent_node.get().root().r() == Some(self));
match child.prev_sibling.get().root() {
None => {
@@ -430,12 +429,6 @@ pub trait NodeHelpers {
fn len(self) -> u32;
fn index(self) -> u32;
- fn parent_node(self) -> Option<Temporary<Node>>;
- fn first_child(self) -> Option<Temporary<Node>>;
- fn last_child(self) -> Option<Temporary<Node>>;
- fn prev_sibling(self) -> Option<Temporary<Node>>;
- fn next_sibling(self) -> Option<Temporary<Node>>;
-
fn owner_doc(self) -> Temporary<Document>;
fn set_owner_doc(self, document: JSRef<Document>);
fn is_in_html_doc(self) -> bool;
@@ -585,28 +578,6 @@ impl<'a> NodeHelpers for JSRef<'a, Node> {
self.preceding_siblings().count() as u32
}
- fn parent_node(self) -> Option<Temporary<Node>> {
- self.parent_node.get().map(Temporary::from_rooted)
- }
-
- fn first_child(self) -> Option<Temporary<Node>> {
- self.first_child.get().map(Temporary::from_rooted)
- }
-
- fn last_child(self) -> Option<Temporary<Node>> {
- self.last_child.get().map(Temporary::from_rooted)
- }
-
- /// Returns the previous sibling of this node. Fails if this node is borrowed mutably.
- fn prev_sibling(self) -> Option<Temporary<Node>> {
- self.prev_sibling.get().map(Temporary::from_rooted)
- }
-
- /// Returns the next sibling of this node. Fails if this node is borrowed mutably.
- fn next_sibling(self) -> Option<Temporary<Node>> {
- self.next_sibling.get().map(Temporary::from_rooted)
- }
-
#[inline]
fn is_element(self) -> bool {
match self.type_id {
@@ -757,12 +728,12 @@ impl<'a> NodeHelpers for JSRef<'a, Node> {
// selectors. Maybe we can do something smarter in the future.
if !self.get_has_dirty_siblings() {
let parent =
- match self.parent_node() {
+ match self.parent_node.get() {
None => return,
Some(parent) => parent,
- };
+ }.root();
- for sibling in parent.root().r().children() {
+ for sibling in parent.r().children() {
let sibling = sibling.root();
sibling.r().set_has_dirty_siblings(true);
}
@@ -799,20 +770,20 @@ impl<'a> NodeHelpers for JSRef<'a, Node> {
fn following_siblings(self) -> NodeSiblingIterator {
NodeSiblingIterator {
- current: self.next_sibling(),
+ current: self.GetNextSibling(),
}
}
fn preceding_siblings(self) -> ReverseSiblingIterator {
ReverseSiblingIterator {
- current: self.prev_sibling(),
+ current: self.GetPreviousSibling(),
}
}
fn is_parent_of(self, child: JSRef<Node>) -> bool {
- match child.parent_node() {
- Some(ref parent) if parent == &Temporary::from_rooted(self) => true,
- _ => false
+ match child.parent_node.get().root() {
+ Some(ref parent) => parent.r() == self,
+ None => false,
}
}
@@ -830,7 +801,7 @@ impl<'a> NodeHelpers for JSRef<'a, Node> {
// https://dom.spec.whatwg.org/#dom-childnode-before
fn before(self, nodes: Vec<NodeOrString>) -> ErrorResult {
- match self.parent_node().root() {
+ match self.parent_node.get().root() {
None => {
// Step 1.
Ok(())
@@ -848,7 +819,7 @@ impl<'a> NodeHelpers for JSRef<'a, Node> {
// https://dom.spec.whatwg.org/#dom-childnode-after
fn after(self, nodes: Vec<NodeOrString>) -> ErrorResult {
- match self.parent_node().root() {
+ match self.parent_node.get().root() {
None => {
// Step 1.
Ok(())
@@ -859,7 +830,7 @@ impl<'a> NodeHelpers for JSRef<'a, Node> {
let node = try!(doc.r().node_from_nodes_and_strings(nodes)).root();
// Step 3.
// FIXME(https://github.com/servo/servo/issues/5720)
- let next_sibling = self.next_sibling().root();
+ let next_sibling = self.next_sibling.get().root();
Node::pre_insert(node.r(), parent_node.r(),
next_sibling.r()).map(|_| ())
},
@@ -868,7 +839,7 @@ impl<'a> NodeHelpers for JSRef<'a, Node> {
// https://dom.spec.whatwg.org/#dom-childnode-replacewith
fn replace_with(self, nodes: Vec<NodeOrString>) -> ErrorResult {
- match self.parent_node().root() {
+ match self.parent_node.get().root() {
None => {
// Step 1.
Ok(())
@@ -889,7 +860,7 @@ impl<'a> NodeHelpers for JSRef<'a, Node> {
let doc = self.owner_doc().root();
let node = try!(doc.r().node_from_nodes_and_strings(nodes)).root();
// Step 2.
- let first_child = self.first_child().root();
+ let first_child = self.first_child.get().root();
Node::pre_insert(node.r(), self, first_child.r()).map(|_| ())
}
@@ -952,7 +923,7 @@ impl<'a> NodeHelpers for JSRef<'a, Node> {
fn ancestors(self) -> AncestorIterator {
AncestorIterator {
- current: self.parent_node()
+ current: self.GetParentNode()
}
}
@@ -976,24 +947,27 @@ impl<'a> NodeHelpers for JSRef<'a, Node> {
fn children(self) -> NodeSiblingIterator {
NodeSiblingIterator {
- current: self.first_child(),
+ current: self.GetFirstChild(),
}
}
fn rev_children(self) -> ReverseSiblingIterator {
ReverseSiblingIterator {
- current: self.last_child(),
+ current: self.GetLastChild(),
}
}
fn child_elements(self) -> ChildElementIterator {
+ fn to_temporary(node: Temporary<Node>) -> Option<Temporary<Element>> {
+ ElementCast::to_temporary(node)
+ }
self.children()
- .filter_map(ElementCast::to_temporary as fn(_) -> _)
+ .filter_map(to_temporary as fn(_) -> _)
.peekable()
}
fn remove_self(self) {
- match self.parent_node().root() {
+ match self.parent_node.get().root() {
Some(ref parent) => parent.r().remove_child(self),
None => ()
}
@@ -1241,7 +1215,7 @@ impl Iterator for NodeSiblingIterator {
None => return None,
Some(current) => current,
}.root();
- self.current = current.r().next_sibling();
+ self.current = current.r().GetNextSibling();
Some(Temporary::from_rooted(current.r()))
}
}
@@ -1258,7 +1232,7 @@ impl Iterator for ReverseSiblingIterator {
None => return None,
Some(current) => current,
}.root();
- self.current = current.r().prev_sibling();
+ self.current = current.r().GetPreviousSibling();
Some(Temporary::from_rooted(current.r()))
}
}
@@ -1275,7 +1249,7 @@ impl Iterator for AncestorIterator {
None => return None,
Some(current) => current,
}.root();
- self.current = current.r().parent_node();
+ self.current = current.r().GetParentNode();
Some(Temporary::from_rooted(current.r()))
}
}
@@ -1304,7 +1278,7 @@ impl Iterator for TreeIterator {
Some(current) => current,
};
let node = current.root();
- if let Some(first_child) = node.r().first_child() {
+ if let Some(first_child) = node.r().GetFirstChild() {
self.current = Some(first_child);
self.depth += 1;
return Some(current);
@@ -1313,7 +1287,7 @@ impl Iterator for TreeIterator {
if self.depth == 0 {
break;
}
- if let Some(next_sibling) = ancestor.root().r().next_sibling() {
+ if let Some(next_sibling) = ancestor.root().r().GetNextSibling() {
self.current = Some(next_sibling);
return Some(current);
}
@@ -1392,7 +1366,7 @@ impl Node {
// https://dom.spec.whatwg.org/#concept-node-adopt
pub fn adopt(node: JSRef<Node>, document: JSRef<Document>) {
// Step 1.
- match node.parent_node().root() {
+ match node.parent_node.get().root() {
Some(ref parent) => {
Node::remove(node, parent.r(), SuppressObserver::Unsuppressed);
}
@@ -1532,7 +1506,7 @@ impl Node {
// Step 7-8.
let reference_child = match child {
- Some(child) if child == node => node.next_sibling(),
+ Some(child) if child == node => node.GetNextSibling(),
_ => None
}.root();
let reference_child = reference_child.r().or(child);
@@ -1670,7 +1644,7 @@ impl Node {
// https://dom.spec.whatwg.org/#concept-node-pre-remove
fn pre_remove(child: JSRef<Node>, parent: JSRef<Node>) -> Fallible<Temporary<Node>> {
// Step 1.
- match child.parent_node() {
+ match child.GetParentNode() {
Some(ref node) if node != &Temporary::from_rooted(parent) => return Err(NotFound),
None => return Err(NotFound),
_ => ()
@@ -1685,7 +1659,7 @@ impl Node {
// https://dom.spec.whatwg.org/#concept-node-remove
fn remove(node: JSRef<Node>, parent: JSRef<Node>, suppress_observers: SuppressObserver) {
- assert!(node.parent_node().map_or(false, |node_parent| node_parent == Temporary::from_rooted(parent)));
+ assert!(node.GetParentNode().map_or(false, |node_parent| node_parent == Temporary::from_rooted(parent)));
// Step 1-5: ranges.
// Step 6-7: mutation observers.
@@ -1890,13 +1864,7 @@ impl<'a> NodeMethods for JSRef<'a, Node> {
// https://dom.spec.whatwg.org/#dom-node-parentelement
fn GetParentElement(self) -> Option<Temporary<Element>> {
- self.parent_node.get()
- .and_then(|parent| {
- let parent = parent.root();
- ElementCast::to_ref(parent.r()).map(|elem| {
- Temporary::from_rooted(elem)
- })
- })
+ self.GetParentNode().and_then(ElementCast::to_temporary)
}
// https://dom.spec.whatwg.org/#dom-node-haschildnodes
@@ -2122,8 +2090,8 @@ impl<'a> NodeMethods for JSRef<'a, Node> {
}
// Step 7-8.
- let child_next_sibling = child.next_sibling().root();
- let node_next_sibling = node.next_sibling().root();
+ let child_next_sibling = child.next_sibling.get().root();
+ let node_next_sibling = node.next_sibling.get().root();
let reference_child = if child_next_sibling.r() == Some(node) {
node_next_sibling.r()
} else {
@@ -2431,53 +2399,28 @@ impl<'a> style::node::TNode<'a> for JSRef<'a, Node> {
type Element = JSRef<'a, Element>;
fn parent_node(self) -> Option<JSRef<'a, Node>> {
- // FIXME(zwarich): Remove this when UFCS lands and there is a better way
- // of disambiguating methods.
- fn parent_node<'a, T: NodeHelpers>(this: T) -> Option<Temporary<Node>> {
- this.parent_node()
- }
-
- parent_node(self).map(|node| node.root().get_unsound_ref_forever())
+ (*self).parent_node.get()
+ .map(|node| node.root().get_unsound_ref_forever())
}
fn first_child(self) -> Option<JSRef<'a, Node>> {
- // FIXME(zwarich): Remove this when UFCS lands and there is a better way
- // of disambiguating methods.
- fn first_child<'a, T: NodeHelpers>(this: T) -> Option<Temporary<Node>> {
- this.first_child()
- }
-
- first_child(self).map(|node| node.root().get_unsound_ref_forever())
+ (*self).first_child.get()
+ .map(|node| node.root().get_unsound_ref_forever())
}
fn last_child(self) -> Option<JSRef<'a, Node>> {
- // FIXME(zwarich): Remove this when UFCS lands and there is a better way
- // of disambiguating methods.
- fn last_child<'a, T: NodeHelpers>(this: T) -> Option<Temporary<Node>> {
- this.last_child()
- }
-
- last_child(self).map(|node| node.root().get_unsound_ref_forever())
+ (*self).last_child.get()
+ .map(|node| node.root().get_unsound_ref_forever())
}
fn prev_sibling(self) -> Option<JSRef<'a, Node>> {
- // FIXME(zwarich): Remove this when UFCS lands and there is a better way
- // of disambiguating methods.
- fn prev_sibling<'a, T: NodeHelpers>(this: T) -> Option<Temporary<Node>> {
- this.prev_sibling()
- }
-
- prev_sibling(self).map(|node| node.root().get_unsound_ref_forever())
+ (*self).prev_sibling.get()
+ .map(|node| node.root().get_unsound_ref_forever())
}
fn next_sibling(self) -> Option<JSRef<'a, Node>> {
- // FIXME(zwarich): Remove this when UFCS lands and there is a better way
- // of disambiguating methods.
- fn next_sibling<'a, T: NodeHelpers>(this: T) -> Option<Temporary<Node>> {
- this.next_sibling()
- }
-
- next_sibling(self).map(|node| node.root().get_unsound_ref_forever())
+ (*self).next_sibling.get()
+ .map(|node| node.root().get_unsound_ref_forever())
}
fn is_document(self) -> bool {
@@ -2595,7 +2538,7 @@ impl<'a> DisabledStateHelpers for JSRef<'a, Node> {
fn check_parent_disabled_state_for_option(self) {
if self.get_disabled_state() { return; }
- if let Some(ref parent) = self.parent_node().root() {
+ if let Some(ref parent) = self.GetParentNode().root() {
if parent.r().is_htmloptgroupelement() && parent.r().get_disabled_state() {
self.set_disabled_state(true);
self.set_enabled_state(false);