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