diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index 08941b232f6b..2805ea8c25e8 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -21,7 +21,7 @@ use dom::eventtarget::{EventTarget, NodeTargetTypeId}; use dom::htmlimageelement::HTMLImageElement; use dom::htmliframeelement::HTMLIFrameElement; use dom::htmlobjectelement::HTMLObjectElement; -use dom::node::{ElementNodeTypeId, Node, NodeHelpers, NodeIterator}; +use dom::node::{ElementNodeTypeId, Node, NodeHelpers, NodeIterator, document_from_node}; use dom::htmlserializer::serialize; use layout_interface::{ContentBoxQuery, ContentBoxResponse, ContentBoxesQuery}; use layout_interface::{ContentBoxesResponse, ContentChangedDocumentDamage}; @@ -586,7 +586,7 @@ impl IElement for JS { fn bind_to_tree_impl(&self) { match self.get().get_attribute(Null, "id") { Some(attr) => { - let mut doc = self.get().node.owner_doc(); + let mut doc = document_from_node(self); doc.get_mut().register_named_element(self, attr.get().Value()); } _ => () @@ -596,7 +596,7 @@ impl IElement for JS { fn unbind_from_tree_impl(&self) { match self.get().get_attribute(Null, "id") { Some(attr) => { - let mut doc = self.get().node.owner_doc(); + let mut doc = document_from_node(self); doc.get_mut().unregister_named_element(attr.get().Value()); } _ => () diff --git a/src/components/script/dom/htmlimageelement.rs b/src/components/script/dom/htmlimageelement.rs index 345090cffe09..5f2566ed0891 100644 --- a/src/components/script/dom/htmlimageelement.rs +++ b/src/components/script/dom/htmlimageelement.rs @@ -11,7 +11,7 @@ use dom::document::Document; use dom::element::{Element, HTMLImageElementTypeId}; use dom::eventtarget::{EventTarget, NodeTargetTypeId}; use dom::htmlelement::HTMLElement; -use dom::node::{Node, ElementNodeTypeId, NodeHelpers}; +use dom::node::{Node, ElementNodeTypeId, NodeHelpers, window_from_node}; use extra::url::Url; use servo_util::geometry::to_px; use layout_interface::{ContentBoxQuery, ContentBoxResponse}; @@ -146,8 +146,8 @@ impl HTMLImageElement { pub fn Width(&self, abstract_self: &JS) -> u32 { let node: JS = NodeCast::from(abstract_self); - let doc = node.get().owner_doc(); - let page = doc.get().window.get().page(); + let window = window_from_node(&node); + let page = window.get().page(); let (port, chan) = Chan::new(); let addr = node.to_trusted_node_address(); match page.query_layout(ContentBoxQuery(addr, chan), port) { diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs index 50b70cf14e8f..ef3b4a03ffae 100644 --- a/src/components/script/dom/node.rs +++ b/src/components/script/dom/node.rs @@ -19,6 +19,7 @@ use dom::eventtarget::{EventTarget, NodeTargetTypeId}; use dom::nodelist::{NodeList}; use dom::text::Text; use dom::processinginstruction::ProcessingInstruction; +use dom::window::Window; use layout_interface::{LayoutChan, ReapLayoutDataMsg, UntrustedNodeAddress}; use layout_interface::TrustedNodeAddress; use servo_util::str::{DOMString, null_str_as_empty}; @@ -396,7 +397,7 @@ impl NodeHelpers for JS { // http://dom.spec.whatwg.org/#node-is-inserted fn node_inserted(&self) { assert!(self.parent_node().is_some()); - let document = self.get().owner_doc(); + let document = document_from_node(self); for node in self.traverse_preorder() { if node.is_element() { @@ -411,7 +412,7 @@ impl NodeHelpers for JS { // http://dom.spec.whatwg.org/#node-is-removed fn node_removed(&self) { assert!(self.parent_node().is_none()); - let document = self.get().owner_doc(); + let document = document_from_node(self); for node in self.traverse_preorder() { if node.is_element() { @@ -964,7 +965,7 @@ impl Node { } // Step 2. - if node.get().owner_doc() != *document { + if document_from_node(node) != *document { for mut descendant in node.traverse_preorder() { descendant.get_mut().set_owner_doc(document); } @@ -1101,7 +1102,7 @@ impl Node { }; // Step 9. - Node::adopt(node, &parent.get().owner_doc()); + Node::adopt(node, &document_from_node(parent)); // Step 10. Node::insert(node, parent, referenceChild, Unsuppressed); @@ -1156,7 +1157,7 @@ impl Node { pub fn replace_all(mut node: Option>, parent: &mut JS) { // Step 1. match node { - Some(ref mut node) => Node::adopt(node, &parent.get().owner_doc()), + Some(ref mut node) => Node::adopt(node, &document_from_node(parent)), None => (), } @@ -1381,7 +1382,7 @@ impl Node { }; // Step 9. - Node::adopt(node, &parent.get().owner_doc()); + Node::adopt(node, &document_from_node(parent)); { // Step 10. @@ -1627,3 +1628,12 @@ impl Reflectable for Node { } } +pub fn document_from_node(derived: &JS) -> JS { + let node: JS = NodeCast::from(derived); + node.get().owner_doc().clone() +} + +pub fn window_from_node(derived: &JS) -> JS { + let document: JS = document_from_node(derived); + document.get().window.clone() +}