diff options
Diffstat (limited to 'components/script/dom/document.rs')
-rw-r--r-- | components/script/dom/document.rs | 51 |
1 files changed, 27 insertions, 24 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 57cee418838..f001f0268f3 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -26,6 +26,7 @@ use dom::bindings::global::GlobalRef; use dom::bindings::js::{MutNullableJS, JS, JSRef, LayoutJS, Temporary, TemporaryPushable}; use dom::bindings::js::{OptionalRootable, RootedReference}; use dom::bindings::refcounted::Trusted; +use dom::bindings::trace::RootedVec; use dom::bindings::utils::reflect_dom_object; use dom::bindings::utils::{xml_name_type, validate_and_extract}; use dom::bindings::utils::XMLName::InvalidXMLName; @@ -343,12 +344,12 @@ impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> { let mut head: usize = 0; let root: JSRef<Node> = NodeCast::from_ref(root.r()); for node in root.traverse_preorder() { - let elem: Option<JSRef<Element>> = ElementCast::to_ref(node); - if let Some(elem) = elem { + let node = node.root(); + if let Some(elem) = ElementCast::to_ref(node.r()) { if (*elements)[head].root().r() == elem { head += 1; } - if new_node == node || head == elements.len() { + if new_node == node.r() || head == elements.len() { break; } } @@ -379,9 +380,9 @@ impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> { }; let doc_node: JSRef<Node> = NodeCast::from_ref(self); doc_node.traverse_preorder() - .filter_map(HTMLAnchorElementCast::to_ref) - .find(check_anchor) - .map(|node| Temporary::from_rooted(ElementCast::from_ref(node))) + .filter_map(HTMLAnchorElementCast::to_temporary) + .find(|node| check_anchor(&node.root().r())) + .map(ElementCast::from_temporary) }) } @@ -493,7 +494,7 @@ impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> { fn dirty_all_nodes(self) { let root: JSRef<Node> = NodeCast::from_ref(self); for node in root.traverse_preorder() { - node.dirty(NodeDamage::OtherNodeDamage) + node.root().r().dirty(NodeDamage::OtherNodeDamage) } } @@ -817,22 +818,24 @@ impl Document { } trait PrivateDocumentHelpers { - fn createNodeList<F: Fn(JSRef<Node>) -> bool>(self, callback: F) -> Temporary<NodeList>; + fn create_node_list<F: Fn(JSRef<Node>) -> bool>(self, callback: F) -> Temporary<NodeList>; fn get_html_element(self) -> Option<Temporary<HTMLHtmlElement>>; } impl<'a> PrivateDocumentHelpers for JSRef<'a, Document> { - fn createNodeList<F: Fn(JSRef<Node>) -> bool>(self, callback: F) -> Temporary<NodeList> { + fn create_node_list<F: Fn(JSRef<Node>) -> bool>(self, callback: F) -> Temporary<NodeList> { let window = self.window.root(); let document_element = self.GetDocumentElement().root(); - let nodes = match document_element { - None => vec!(), - Some(ref root) => { - let root: JSRef<Node> = NodeCast::from_ref(root.r()); - root.traverse_preorder().filter(|&node| callback(node)).collect() + let mut nodes = RootedVec::new(); + if let Some(ref root) = document_element { + for node in NodeCast::from_ref(root.r()).traverse_preorder() { + let node = node.root(); + if callback(node.r()) { + nodes.push(node.r().unrooted()); + } } }; - NodeList::new_simple_list(window.r(), nodes) + NodeList::new_simple_list(window.r(), &nodes) } fn get_html_element(self) -> Option<Temporary<HTMLHtmlElement>> { @@ -1118,14 +1121,14 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { // http://www.whatwg.org/specs/web-apps/current-work/#document.title fn Title(self) -> DOMString { let title_element = self.GetDocumentElement().root().and_then(|root| { - NodeCast::from_ref(root.get_unsound_ref_forever()) - .traverse_preorder() - .find(|node| node.type_id() == NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTitleElement))) - }); + NodeCast::from_ref(root.r()).traverse_preorder().find(|node| { + node.root().r().type_id() == NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTitleElement)) + }) + }).root(); let mut title = String::new(); if let Some(title_element) = title_element { - for child in title_element.children() { + for child in title_element.r().children() { let child = child.root(); if let Some(text) = TextCast::to_ref(child.r()) { title.push_str(&CharacterDataCast::from_ref(text).data()); @@ -1142,9 +1145,9 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { self.GetDocumentElement().root().map(|root| { let root: JSRef<Node> = NodeCast::from_ref(root.r()); let head_node = root.traverse_preorder().find(|child| { - child.type_id() == NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLHeadElement)) - }); - head_node.map(|head| { + child.root().r().type_id() == NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLHeadElement)) + }).root(); + head_node.r().map(|head| { let title_node = head.children().map(|c| c.root()).find(|child| { child.r().type_id() == NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTitleElement)) }); @@ -1255,7 +1258,7 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { // http://www.whatwg.org/specs/web-apps/current-work/#dom-document-getelementsbyname fn GetElementsByName(self, name: DOMString) -> Temporary<NodeList> { - self.createNodeList(|node| { + self.create_node_list(|node| { let element: JSRef<Element> = match ElementCast::to_ref(node) { Some(element) => element, None => return false, |