From 7b3e6d1f2125faf598919722b72cc56197d0102c Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Thu, 17 Apr 2014 23:26:42 -0400 Subject: [PATCH] Remove all root collections. --- src/components/script/dom/attr.rs | 5 +- src/components/script/dom/attrlist.rs | 8 +- .../dom/bindings/codegen/CodegenRust.py | 38 ++- src/components/script/dom/bindings/js.rs | 29 ++- src/components/script/dom/bindings/utils.rs | 8 +- src/components/script/dom/blob.rs | 5 +- src/components/script/dom/browsercontext.rs | 8 +- src/components/script/dom/comment.rs | 5 +- src/components/script/dom/document.rs | 101 +++----- src/components/script/dom/documentfragment.rs | 8 +- .../script/dom/domimplementation.rs | 31 ++- src/components/script/dom/domparser.rs | 5 +- src/components/script/dom/element.rs | 85 +++---- src/components/script/dom/event.rs | 5 +- src/components/script/dom/eventdispatcher.rs | 5 +- .../script/dom/htmlbuttonelement.rs | 5 +- src/components/script/dom/htmlcollection.rs | 19 +- .../script/dom/htmldatalistelement.rs | 5 +- .../script/dom/htmlfieldsetelement.rs | 8 +- src/components/script/dom/htmlformelement.rs | 5 +- src/components/script/dom/htmlimageelement.rs | 10 +- src/components/script/dom/htmlmapelement.rs | 5 +- .../script/dom/htmlobjectelement.rs | 13 +- .../script/dom/htmloutputelement.rs | 5 +- .../script/dom/htmlselectelement.rs | 5 +- src/components/script/dom/htmlserializer.rs | 10 +- src/components/script/dom/htmlstyleelement.rs | 5 +- src/components/script/dom/mouseevent.rs | 9 +- src/components/script/dom/node.rs | 218 +++++++----------- src/components/script/dom/nodelist.rs | 8 +- src/components/script/dom/testbinding.rs | 8 +- src/components/script/dom/text.rs | 5 +- src/components/script/dom/uievent.rs | 7 +- .../script/html/hubbub_html_parser.rs | 47 ++-- src/components/script/script_task.rs | 61 ++--- 35 files changed, 329 insertions(+), 475 deletions(-) diff --git a/src/components/script/dom/attr.rs b/src/components/script/dom/attr.rs index fe4ea856cff..76bf3ff1ede 100644 --- a/src/components/script/dom/attr.rs +++ b/src/components/script/dom/attr.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::BindingDeclarations::AttrBinding; use dom::bindings::codegen::InheritTypes::NodeCast; -use dom::bindings::js::{JS, JSRef, Temporary, RootCollection}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::element::Element; use dom::node::Node; @@ -65,8 +65,7 @@ impl Attr { } pub fn set_value(&mut self, set_type: AttrSettingType, value: DOMString) { - let roots = RootCollection::new(); - let owner = self.owner.root(&roots); + let owner = self.owner.root(); let node: &JSRef = NodeCast::from_ref(&*owner); let namespace_is_null = self.namespace == namespace::Null; diff --git a/src/components/script/dom/attrlist.rs b/src/components/script/dom/attrlist.rs index 7bc7f18bdfa..70db8f59971 100644 --- a/src/components/script/dom/attrlist.rs +++ b/src/components/script/dom/attrlist.rs @@ -4,7 +4,7 @@ use dom::attr::Attr; use dom::bindings::codegen::BindingDeclarations::AttrListBinding; -use dom::bindings::js::{JS, JSRef, Temporary, RootCollection}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::element::Element; use dom::window::Window; @@ -39,13 +39,11 @@ pub trait AttrListMethods { impl<'a> AttrListMethods for JSRef<'a, AttrList> { fn Length(&self) -> u32 { - let roots = RootCollection::new(); - self.owner.root(&roots).attrs.len() as u32 + self.owner.root().attrs.len() as u32 } fn Item(&self, index: u32) -> Option> { - let roots = RootCollection::new(); - self.owner.root(&roots).attrs.as_slice().get(index as uint).map(|x| Temporary::new(x.clone())) + self.owner.root().attrs.as_slice().get(index as uint).map(|x| Temporary::new(x.clone())) } fn IndexedGetter(&self, index: u32, found: &mut bool) -> Option> { diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index b7df283d2b8..8472686e536 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -903,10 +903,10 @@ def instantiateJSToNativeConversionTemplate(templateTuple, replacements, if type and 'JS<' in type: if dealWithOptional or 'Option<' in type: rootBody = """let ${simpleDeclName} = ${declName}.as_ref().map(|inner| { - inner.root(&roots) //second root code + inner.root() //second root code });""" else: - rootBody = "let ${simpleDeclName} = ${declName}.root(&roots); //third root code" + rootBody = "let ${simpleDeclName} = ${declName}.root(); //third root code" result.append(CGGeneric(string.Template(rootBody).substitute(replacements))) result.append(CGGeneric("")) @@ -1799,7 +1799,7 @@ class CGAbstractMethod(CGThing): def _returnType(self): return (" -> %s" % self.returnType) if self.returnType != "void" else "" def _unsafe_open(self): - return "\n unsafe {\n let roots = RootCollection::new();\n" if self.unsafe else "" + return "\n unsafe {\n" if self.unsafe else "" def _unsafe_close(self): return "\n }\n" if self.unsafe else "" @@ -2247,7 +2247,7 @@ class CGCallGenerator(CGThing): self.cgRoot.append(CGGeneric("result = result_fallible.unwrap();")) if typeRetValNeedsRooting(returnType): - self.cgRoot.append(CGGeneric("let result = result.root(&roots);")) + self.cgRoot.append(CGGeneric("let result = result.root();")) def define(self): return self.cgRoot.define() @@ -2498,7 +2498,7 @@ class CGSpecializedMethod(CGAbstractExternMethod): self.descriptor, self.method), pre=extraPre + " let this = JS::from_raw(this);\n" + - " let mut this = this.root(&roots);\n").define() + " let mut this = this.root();\n").define() class CGGenericGetter(CGAbstractBindingMethod): """ @@ -2552,7 +2552,7 @@ class CGSpecializedGetter(CGAbstractExternMethod): self.descriptor, self.attr)), pre=extraPre + " let this = JS::from_raw(this);\n" + - " let mut this = this.root(&roots);\n").define() + " let mut this = this.root();\n").define() class CGGenericSetter(CGAbstractBindingMethod): """ @@ -2606,7 +2606,7 @@ class CGSpecializedSetter(CGAbstractExternMethod): self.descriptor, self.attr)), pre=extraPre + " let this = JS::from_raw(this);\n" + - " let mut this = this.root(&roots);\n").define() + " let mut this = this.root();\n").define() class CGMemberJITInfo(CGThing): @@ -3531,7 +3531,7 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod): " let index = index.unwrap();\n" + " let this = UnwrapProxy(proxy);\n" + " let this = JS::from_raw(this);\n" + - " let mut this = this.root(&roots);\n" + + " let mut this = this.root();\n" + CGIndenter(CGProxyIndexedGetter(self.descriptor, templateValues)).define() + "\n" + "}\n") @@ -3578,7 +3578,7 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod): " let name = Some(jsid_to_str(cx, id));\n" + " let this = UnwrapProxy(proxy);\n" + " let this = JS::from_raw(this);\n" + - " let mut this = this.root(&roots);\n" + + " let mut this = this.root();\n" + CGIndenter(CGProxyNamedGetter(self.descriptor, templateValues)).define() + "\n" + "}\n") else: @@ -3623,7 +3623,7 @@ class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod): " let index = index.unwrap();\n" + " let this = UnwrapProxy(proxy);\n" + " let this = JS::from_raw(this);\n" + - " let mut this = this.root(&roots);\n" + + " let mut this = this.root();\n" + CGIndenter(CGProxyIndexedSetter(self.descriptor)).define() + " return 1;\n" + "}\n") @@ -3641,7 +3641,7 @@ class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod): " let name = Some(jsid_to_str(cx, id));\n" + " let this = UnwrapProxy(proxy);\n" + " let this = JS::from_raw(this);\n" + - " let mut this = this.root(&roots);\n" + + " let mut this = this.root();\n" + CGIndenter(CGProxyNamedSetter(self.descriptor)).define() + "\n" + "}\n") elif self.descriptor.operations['NamedGetter']: @@ -3649,7 +3649,7 @@ class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod): " let name = Some(jsid_to_str(cx, id));\n" + " let this = UnwrapProxy(proxy);\n" + " let this = JS::from_raw(this);\n" + - " let mut this = this.root(&roots);\n" + + " let mut this = this.root();\n" + CGIndenter(CGProxyNamedGetter(self.descriptor)).define() + " if (found) {\n" " return 0;\n" + @@ -3676,7 +3676,7 @@ class CGDOMJSProxyHandler_hasOwn(CGAbstractExternMethod): " let index = index.unwrap();\n" + " let this = UnwrapProxy(proxy);\n" + " let this = JS::from_raw(this);\n" + - " let mut this = this.root(&roots);\n" + + " let mut this = this.root();\n" + CGIndenter(CGProxyIndexedGetter(self.descriptor)).define() + "\n" + " *bp = found as JSBool;\n" + " return 1;\n" + @@ -3690,7 +3690,7 @@ class CGDOMJSProxyHandler_hasOwn(CGAbstractExternMethod): " let name = Some(jsid_to_str(cx, id));\n" + " let this = UnwrapProxy(proxy);\n" + " let this = JS::from_raw(this);\n" + - " let mut this = this.root(&roots);\n" + + " let mut this = this.root();\n" + CGIndenter(CGProxyNamedGetter(self.descriptor)).define() + "\n" + " *bp = found as JSBool;\n" " return 1;\n" @@ -3744,7 +3744,7 @@ if expando.is_not_null() { " let index = index.unwrap();\n" + " let this = UnwrapProxy(proxy);\n" + " let this = JS::from_raw(this);\n" + - " let mut this = this.root(&roots);\n" + + " let mut this = this.root();\n" + CGIndenter(CGProxyIndexedGetter(self.descriptor, templateValues)).define()) getIndexedOrExpando += """ // Even if we don't have this index, we don't forward the @@ -3762,7 +3762,7 @@ if expando.is_not_null() { " let name = Some(jsid_to_str(cx, id));\n" + " let this = UnwrapProxy(proxy);\n" + " let this = JS::from_raw(this);\n" + - " let mut this = this.root(&roots);\n" + + " let mut this = this.root();\n" + CGIndenter(CGProxyNamedGetter(self.descriptor, templateValues)).define() + "}\n") % (self.descriptor.concreteType) else: @@ -3879,9 +3879,8 @@ class CGClassConstructHook(CGAbstractExternMethod): def generate_code(self): preamble = """ - let roots = RootCollection::new(); let global = global_object_for_js_object(JS_CALLEE(cx, &*vp).to_object()); - let global = global.root(&roots); + let global = global.root(); let obj = global.reflector().get_jsobject(); """ nativeName = MakeNativeName(self._ctor.identifier.name) @@ -4123,7 +4122,6 @@ class CGDictionary(CGThing): return string.Template( "impl ${selfName} {\n" " pub fn new(cx: *JSContext, val: JSVal) -> Result<${selfName}, ()> {\n" - " let roots = RootCollection::new();\n" # XXXjdm need to root dict members outside of Init " let object = if val.is_null_or_undefined() {\n" " ptr::null()\n" " } else if val.is_object() {\n" @@ -4323,7 +4321,7 @@ class CGBindingRoot(CGThing): 'js::glue::{RUST_JS_NumberValue, RUST_JSID_IS_STRING}', 'dom::types::*', 'dom::bindings', - 'dom::bindings::js::{JS, JSRef, RootCollection, RootedReference, Temporary, OptionalRootable}', + 'dom::bindings::js::{JS, JSRef, RootedReference, Temporary, OptionalRootable}', 'dom::bindings::utils::{CreateDOMGlobal, CreateInterfaceObjects2}', 'dom::bindings::utils::{ConstantSpec, cx_for_dom_object, Default}', 'dom::bindings::utils::{dom_object_slot, DOM_OBJECT_SLOT, DOMClass}', diff --git a/src/components/script/dom/bindings/js.rs b/src/components/script/dom/bindings/js.rs index 1efd25dc72c..1ee1b8da51d 100644 --- a/src/components/script/dom/bindings/js.rs +++ b/src/components/script/dom/bindings/js.rs @@ -54,7 +54,7 @@ impl Temporary { } /// Root this unrooted value. - pub fn root<'a, 'b>(self, _collection: &'a RootCollection) -> Root<'a, 'b, T> { + pub fn root<'a, 'b>(self) -> Root<'a, 'b, T> { local_data::get(StackRoots, |opt| { let collection = opt.unwrap(); unsafe { @@ -119,8 +119,13 @@ impl JS { } /// Root this JS-owned value to prevent its collection as garbage. - pub fn root<'a, 'b>(&self, collection: &'a RootCollection) -> Root<'a, 'b, T> { - collection.new_root(self) + pub fn root<'a, 'b>(&self) -> Root<'a, 'b, T> { + local_data::get(StackRoots, |opt| { + let collection = opt.unwrap(); + unsafe { + (**collection).new_root(self) + } + }) } } @@ -214,32 +219,32 @@ impl, U: Reflectable> OptionalAssignable for Option> { } pub trait OptionalRootable { - fn root<'a, 'b>(self, roots: &'a RootCollection) -> Option>; + fn root<'a, 'b>(self) -> Option>; } impl OptionalRootable for Option> { - fn root<'a, 'b>(self, roots: &'a RootCollection) -> Option> { - self.map(|inner| inner.root(roots)) + fn root<'a, 'b>(self) -> Option> { + self.map(|inner| inner.root()) } } pub trait OptionalRootedRootable { - fn root<'a, 'b>(&self, roots: &'a RootCollection) -> Option>; + fn root<'a, 'b>(&self) -> Option>; } impl OptionalRootedRootable for Option> { - fn root<'a, 'b>(&self, roots: &'a RootCollection) -> Option> { - self.as_ref().map(|inner| inner.root(roots)) + fn root<'a, 'b>(&self) -> Option> { + self.as_ref().map(|inner| inner.root()) } } pub trait ResultRootable { - fn root<'a, 'b>(self, roots: &'a RootCollection) -> Result, U>; + fn root<'a, 'b>(self) -> Result, U>; } impl ResultRootable for Result, U> { - fn root<'a, 'b>(self, roots: &'a RootCollection) -> Result, U> { - self.map(|inner| inner.root(roots)) + fn root<'a, 'b>(self) -> Result, U> { + self.map(|inner| inner.root()) } } diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs index 96982ebb6e2..7c74a8b8085 100644 --- a/src/components/script/dom/bindings/utils.rs +++ b/src/components/script/dom/bindings/utils.rs @@ -5,7 +5,7 @@ use dom::bindings::codegen::PrototypeList; use dom::bindings::codegen::PrototypeList::MAX_PROTO_CHAIN_LENGTH; use dom::bindings::conversions::{FromJSValConvertible, IDLInterface}; -use dom::bindings::js::{JS, JSRef, RootCollection, Temporary, Root}; +use dom::bindings::js::{JS, JSRef, Temporary, Root}; use dom::bindings::trace::Untraceable; use dom::browsercontext; use dom::window; @@ -606,7 +606,6 @@ pub extern fn wrap_for_same_compartment(cx: *JSContext, obj: *JSObject) -> *JSOb pub extern fn outerize_global(_cx: *JSContext, obj: JSHandleObject) -> *JSObject { unsafe { - let roots = RootCollection::new(); debug!("outerizing"); let obj = *obj.unnamed; let win: Root = @@ -614,7 +613,7 @@ pub extern fn outerize_global(_cx: *JSContext, obj: JSHandleObject) -> *JSObject IDLInterface::get_prototype_id(None::), IDLInterface::get_prototype_depth(None::)) .unwrap() - .root(&roots); + .root(); win.deref().browser_context.get_ref().window_proxy() } } @@ -631,8 +630,7 @@ pub fn global_object_for_js_object(obj: *JSObject) -> JS { } fn cx_for_dom_reflector(obj: *JSObject) -> *JSContext { - let roots = RootCollection::new(); - let win = global_object_for_js_object(obj).root(&roots); + let win = global_object_for_js_object(obj).root(); let js_info = win.get().page().js_info(); match *js_info { Some(ref info) => info.js_context.deref().deref().ptr, diff --git a/src/components/script/dom/blob.rs b/src/components/script/dom/blob.rs index 10cc93ef089..9df9287bc9f 100644 --- a/src/components/script/dom/blob.rs +++ b/src/components/script/dom/blob.rs @@ -2,7 +2,7 @@ * 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::js::{JS, JSRef, RootCollection, Temporary}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::bindings::error::Fallible; use dom::bindings::codegen::BindingDeclarations::BlobBinding; @@ -51,8 +51,7 @@ impl<'a> BlobMethods for JSRef<'a, Blob> { } fn Slice(&self, _start: Option, _end: Option, _contentType: Option) -> Temporary { - let roots = RootCollection::new(); - let window = self.window.root(&roots); + let window = self.window.root(); Blob::new(&window.root_ref()) } diff --git a/src/components/script/dom/browsercontext.rs b/src/components/script/dom/browsercontext.rs index 5b0be5ccf0c..fea7dc9a8a7 100644 --- a/src/components/script/dom/browsercontext.rs +++ b/src/components/script/dom/browsercontext.rs @@ -2,7 +2,7 @@ * 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::js::{JS, JSRef, Temporary, RootCollection}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::trace::Traceable; use dom::bindings::utils::Reflectable; use dom::document::Document; @@ -37,8 +37,7 @@ impl BrowserContext { } pub fn active_window(&self) -> Temporary { - let roots = RootCollection::new(); - let doc = self.active_document().root(&roots); + let doc = self.active_document().root(); Temporary::new(doc.deref().window.clone()) } @@ -48,8 +47,7 @@ impl BrowserContext { } pub fn create_window_proxy(&self) -> *JSObject { - let roots = RootCollection::new(); - let win = self.active_window().root(&roots); + let win = self.active_window().root(); let page = win.get().page(); let js_info = page.js_info(); diff --git a/src/components/script/dom/comment.rs b/src/components/script/dom/comment.rs index 33bb395488c..5d2fce2d212 100644 --- a/src/components/script/dom/comment.rs +++ b/src/components/script/dom/comment.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::InheritTypes::CommentDerived; use dom::bindings::codegen::BindingDeclarations::CommentBinding; -use dom::bindings::js::{JS, JSRef, RootCollection, Temporary}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::error::Fallible; use dom::characterdata::CharacterData; use dom::document::Document; @@ -41,8 +41,7 @@ impl Comment { } pub fn Constructor(owner: &JSRef, data: DOMString) -> Fallible> { - let roots = RootCollection::new(); - let document = owner.Document().root(&roots); + let document = owner.Document().root(); Ok(Comment::new(data, &*document)) } } diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs index 09a2a2c2ffa..6ba18526127 100644 --- a/src/components/script/dom/document.rs +++ b/src/components/script/dom/document.rs @@ -6,7 +6,7 @@ use dom::bindings::codegen::InheritTypes::{DocumentDerived, EventCast, HTMLEleme use dom::bindings::codegen::InheritTypes::{HTMLHeadElementCast, TextCast, ElementCast}; use dom::bindings::codegen::InheritTypes::{DocumentTypeCast, HTMLHtmlElementCast, NodeCast}; use dom::bindings::codegen::BindingDeclarations::DocumentBinding; -use dom::bindings::js::{JS, JSRef, RootCollection, Temporary, OptionalAssignable}; +use dom::bindings::js::{JS, JSRef, Temporary, OptionalAssignable}; use dom::bindings::js::OptionalRootable; use dom::bindings::trace::Untraceable; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; @@ -110,13 +110,11 @@ impl<'a> DocumentHelpers for JSRef<'a, Document> { } fn damage_and_reflow(&self, damage: DocumentDamageLevel) { - let roots = RootCollection::new(); - self.window.root(&roots).damage_and_reflow(damage); + self.window.root().damage_and_reflow(damage); } fn wait_until_safe_to_modify_dom(&self) { - let roots = RootCollection::new(); - self.window.root(&roots).wait_until_safe_to_modify_dom(); + self.window.root().wait_until_safe_to_modify_dom(); } @@ -124,13 +122,12 @@ impl<'a> DocumentHelpers for JSRef<'a, Document> { fn unregister_named_element(&mut self, to_unregister: &JSRef, id: DOMString) { - let roots = RootCollection::new(); let mut is_empty = false; match self.idmap.find_mut(&id) { None => {}, Some(elements) => { let position = elements.iter() - .map(|elem| elem.root(&roots)) + .map(|elem| elem.root()) .position(|element| &*element == to_unregister) .expect("This element should be in registered."); elements.remove(position); @@ -146,7 +143,6 @@ impl<'a> DocumentHelpers for JSRef<'a, Document> { fn register_named_element(&mut self, element: &JSRef, id: DOMString) { - let roots = RootCollection::new(); assert!({ let node: &JSRef = NodeCast::from_ref(element); node.is_in_doc() @@ -154,13 +150,13 @@ impl<'a> DocumentHelpers for JSRef<'a, Document> { // FIXME https://github.com/mozilla/rust/issues/13195 // Use mangle() when it exists again. - let root = self.GetDocumentElement().expect("The element is in the document, so there must be a document element.").root(&roots); + let root = self.GetDocumentElement().expect("The element is in the document, so there must be a document element.").root(); match self.idmap.find_mut(&id) { Some(elements) => { let new_node: &JSRef = NodeCast::from_ref(element); let mut head : uint = 0u; let root: &JSRef = NodeCast::from_ref(&*root); - for node in root.traverse_preorder(&roots) { + for node in root.traverse_preorder() { let elem: Option<&JSRef> = ElementCast::to_ref(&node); match elem { Some(elem) => { @@ -188,9 +184,8 @@ impl Document { window: &JSRef, wrap_fn: extern "Rust" fn(*JSContext, &JSRef, ~Document) -> JS) -> Temporary { - let roots = RootCollection::new(); assert!(document.reflector().get_jsobject().is_null()); - let mut raw_doc = reflect_dom_object(document, window, wrap_fn).root(&roots); + let mut raw_doc = reflect_dom_object(document, window, wrap_fn).root(); assert!(raw_doc.reflector().get_jsobject().is_not_null()); let mut doc_alias = raw_doc.clone(); @@ -257,15 +252,14 @@ trait PrivateDocumentHelpers { impl<'a> PrivateDocumentHelpers for JSRef<'a, Document> { fn createNodeList(&self, callback: |node: &JSRef| -> bool) -> Temporary { - let roots = RootCollection::new(); - let window = self.window.root(&roots); + let window = self.window.root(); let mut nodes = vec!(); - match self.GetDocumentElement().root(&roots) { + match self.GetDocumentElement().root() { None => {}, Some(root) => { let root: &JSRef = NodeCast::from_ref(&*root); - for child in root.traverse_preorder(&roots) { + for child in root.traverse_preorder() { if callback(&child) { nodes.push(child); } @@ -277,8 +271,7 @@ impl<'a> PrivateDocumentHelpers for JSRef<'a, Document> { } fn get_html_element(&self) -> Option> { - let roots = RootCollection::new(); - self.GetDocumentElement().root(&roots).filtered(|root| { + self.GetDocumentElement().root().filtered(|root| { root.node.type_id == ElementNodeTypeId(HTMLHtmlElementTypeId) }).map(|elem| { Temporary::new_rooted(HTMLHtmlElementCast::to_ref(&*elem).unwrap()) @@ -330,8 +323,7 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { // http://dom.spec.whatwg.org/#dom-document-implementation fn Implementation(&mut self) -> Temporary { if self.implementation.is_none() { - let roots = RootCollection::new(); - let window = self.window.root(&roots); + let window = self.window.root(); self.implementation.assign(Some(DOMImplementation::new(&*window))); } Temporary::new(self.implementation.get_ref().clone()) @@ -384,15 +376,13 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { // http://dom.spec.whatwg.org/#dom-document-getelementsbytagname fn GetElementsByTagName(&self, tag_name: DOMString) -> Temporary { - let roots = RootCollection::new(); - let window = self.window.root(&roots); + let window = self.window.root(); HTMLCollection::by_tag_name(&*window, NodeCast::from_ref(self), tag_name) } // http://dom.spec.whatwg.org/#dom-document-getelementsbytagnamens fn GetElementsByTagNameNS(&self, maybe_ns: Option, tag_name: DOMString) -> Temporary { - let roots = RootCollection::new(); - let window = self.window.root(&roots); + let window = self.window.root(); let namespace = match maybe_ns { Some(namespace) => Namespace::from_str(namespace), @@ -403,8 +393,7 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { // http://dom.spec.whatwg.org/#dom-document-getelementsbyclassname fn GetElementsByClassName(&self, classes: DOMString) -> Temporary { - let roots = RootCollection::new(); - let window = self.window.root(&roots); + let window = self.window.root(); HTMLCollection::by_class_name(&*window, NodeCast::from_ref(self), classes) } @@ -538,8 +527,7 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { // http://dom.spec.whatwg.org/#dom-document-createevent fn CreateEvent(&self, interface: DOMString) -> Fallible> { - let roots = RootCollection::new(); - let window = self.window.root(&roots); + let window = self.window.root(); match interface.to_ascii_lower().as_slice() { // FIXME: Implement CustomEvent (http://dom.spec.whatwg.org/#customevent) @@ -553,10 +541,9 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { // http://www.whatwg.org/specs/web-apps/current-work/#document.title fn Title(&self) -> DOMString { let mut title = ~""; - let roots = RootCollection::new(); - self.GetDocumentElement().root(&roots).map(|root| { + self.GetDocumentElement().root().map(|root| { let root: &JSRef = NodeCast::from_ref(&*root); - root.traverse_preorder(&roots) + root.traverse_preorder() .find(|node| node.type_id() == ElementNodeTypeId(HTMLTitleElementTypeId)) .map(|title_elem| { for child in title_elem.children() { @@ -574,11 +561,10 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { // http://www.whatwg.org/specs/web-apps/current-work/#document.title fn SetTitle(&self, title: DOMString) -> ErrorResult { - let roots = RootCollection::new(); - self.GetDocumentElement().root(&roots).map(|root| { + self.GetDocumentElement().root().map(|root| { let root: &JSRef = NodeCast::from_ref(&*root); - let mut head_node = root.traverse_preorder(&roots).find(|child| { + let mut head_node = root.traverse_preorder().find(|child| { child.get().type_id == ElementNodeTypeId(HTMLHeadElementTypeId) }); head_node.as_mut().map(|head| { @@ -591,15 +577,15 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { for mut title_child in title_node.children() { assert!(title_node.RemoveChild(&mut title_child).is_ok()); } - let mut new_text = self.CreateTextNode(title.clone()).root(&roots); + let mut new_text = self.CreateTextNode(title.clone()).root(); assert!(title_node.AppendChild(NodeCast::from_mut_ref(&mut *new_text)).is_ok()); }, None => { - let mut new_title = HTMLTitleElement::new(~"title", self).root(&roots); + let mut new_title = HTMLTitleElement::new(~"title", self).root(); let new_title: &mut JSRef = NodeCast::from_mut_ref(&mut *new_title); - let mut new_text = self.CreateTextNode(title.clone()).root(&roots); + let mut new_text = self.CreateTextNode(title.clone()).root(); assert!(new_title.AppendChild(NodeCast::from_mut_ref(&mut *new_text)).is_ok()); assert!(head.AppendChild(&mut *new_title).is_ok()); @@ -612,9 +598,8 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { // http://www.whatwg.org/specs/web-apps/current-work/#dom-document-head fn GetHead(&self) -> Option> { - let roots = RootCollection::new(); self.get_html_element().and_then(|root| { - let root = root.root(&roots); + let root = root.root(); let node: &JSRef = NodeCast::from_ref(&*root); node.children().find(|child| { child.type_id() == ElementNodeTypeId(HTMLHeadElementTypeId) @@ -626,9 +611,8 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { // http://www.whatwg.org/specs/web-apps/current-work/#dom-document-body fn GetBody(&self) -> Option> { - let roots = RootCollection::new(); self.get_html_element().and_then(|root| { - let root = root.root(&roots); + let root = root.root(); let node: &JSRef = NodeCast::from_ref(&*root); node.children().find(|child| { match child.type_id() { @@ -644,7 +628,6 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { // http://www.whatwg.org/specs/web-apps/current-work/#dom-document-body fn SetBody(&self, new_body: Option>) -> ErrorResult { - let roots = RootCollection::new(); // Step 1. match new_body { @@ -659,14 +642,14 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { } // Step 2. - let mut old_body = self.GetBody().root(&roots); + let mut old_body = self.GetBody().root(); //FIXME: covariant lifetime workaround. do not judge. if old_body.as_ref().map(|body| body.deref()) == new_body.as_ref().map(|a| &*a) { return Ok(()); } // Step 3. - match self.get_html_element().root(&roots) { + match self.get_html_element().root() { // Step 4. None => return Err(HierarchyRequest), Some(ref mut root) => { @@ -689,7 +672,6 @@ 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 { - let roots = RootCollection::new(); self.createNodeList(|node| { if !node.is_element() { @@ -697,15 +679,14 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { } let element: &JSRef = ElementCast::to_ref(node).unwrap(); - element.get_attribute(Null, "name").root(&roots).map_or(false, |mut attr| { + element.get_attribute(Null, "name").root().map_or(false, |mut attr| { attr.value_ref() == name }) }) } fn Images(&self) -> Temporary { - let roots = RootCollection::new(); - let window = self.window.root(&roots); + let window = self.window.root(); // FIXME: https://github.com/mozilla/servo/issues/1847 struct ImagesFilter; @@ -719,8 +700,7 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { } fn Embeds(&self) -> Temporary { - let roots = RootCollection::new(); - let window = self.window.root(&roots); + let window = self.window.root(); // FIXME: https://github.com/mozilla/servo/issues/1847 struct EmbedsFilter; @@ -739,8 +719,7 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { } fn Links(&self) -> Temporary { - let roots = RootCollection::new(); - let window = self.window.root(&roots); + let window = self.window.root(); // FIXME: https://github.com/mozilla/servo/issues/1847 struct LinksFilter; @@ -755,8 +734,7 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { } fn Forms(&self) -> Temporary { - let roots = RootCollection::new(); - let window = self.window.root(&roots); + let window = self.window.root(); // FIXME: https://github.com/mozilla/servo/issues/1847 struct FormsFilter; @@ -770,8 +748,7 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { } fn Scripts(&self) -> Temporary { - let roots = RootCollection::new(); - let window = self.window.root(&roots); + let window = self.window.root(); // FIXME: https://github.com/mozilla/servo/issues/1847 struct ScriptsFilter; @@ -785,8 +762,7 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { } fn Anchors(&self) -> Temporary { - let roots = RootCollection::new(); - let window = self.window.root(&roots); + let window = self.window.root(); // FIXME: https://github.com/mozilla/servo/issues/1847 struct AnchorsFilter; @@ -800,8 +776,7 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { } fn Applets(&self) -> Temporary { - let roots = RootCollection::new(); - let window = self.window.root(&roots); + let window = self.window.root(); // FIXME: This should be return OBJECT elements containing applets. struct AppletsFilter; @@ -815,14 +790,12 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { } fn Location(&mut self) -> Temporary { - let roots = RootCollection::new(); - let mut window = self.window.root(&roots); + let mut window = self.window.root(); window.Location() } fn Children(&self) -> Temporary { - let roots = RootCollection::new(); - let window = self.window.root(&roots); + let window = self.window.root(); HTMLCollection::children(&*window, NodeCast::from_ref(self)) } } diff --git a/src/components/script/dom/documentfragment.rs b/src/components/script/dom/documentfragment.rs index 1dfd92c6f66..b6287696300 100644 --- a/src/components/script/dom/documentfragment.rs +++ b/src/components/script/dom/documentfragment.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::InheritTypes::{DocumentFragmentDerived, NodeCast}; use dom::bindings::codegen::BindingDeclarations::DocumentFragmentBinding; -use dom::bindings::js::{JS, JSRef, RootCollection, Temporary}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::error::Fallible; use dom::document::Document; use dom::eventtarget::{EventTarget, NodeTargetTypeId}; @@ -40,9 +40,8 @@ impl DocumentFragment { } pub fn Constructor(owner: &JSRef) -> Fallible> { - let roots = RootCollection::new(); let document = owner.Document(); - let document = document.root(&roots); + let document = document.root(); Ok(DocumentFragment::new(&document.root_ref())) } @@ -54,8 +53,7 @@ pub trait DocumentFragmentMethods { impl<'a> DocumentFragmentMethods for JSRef<'a, DocumentFragment> { fn Children(&self) -> Temporary { - let roots = RootCollection::new(); - let window = window_from_node(self).root(&roots); + let window = window_from_node(self).root(); HTMLCollection::children(&window.root_ref(), NodeCast::from_ref(self)) } } diff --git a/src/components/script/dom/domimplementation.rs b/src/components/script/dom/domimplementation.rs index 4346e6044c4..231c1e4ac99 100644 --- a/src/components/script/dom/domimplementation.rs +++ b/src/components/script/dom/domimplementation.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::BindingDeclarations::DOMImplementationBinding; use dom::bindings::codegen::InheritTypes::NodeCast; -use dom::bindings::js::{JS, JSRef, RootCollection, Temporary, OptionalRootable}; +use dom::bindings::js::{JS, JSRef, Temporary, OptionalRootable}; use dom::bindings::utils::{Reflector, Reflectable, reflect_dom_object}; use dom::bindings::error::{Fallible, InvalidCharacter, NamespaceError}; use dom::bindings::utils::{QName, Name, InvalidXMLName, xml_name_type}; @@ -60,7 +60,6 @@ pub trait DOMImplementationMethods { impl<'a> DOMImplementationMethods for JSRef<'a, DOMImplementation> { // http://dom.spec.whatwg.org/#dom-domimplementation-createdocumenttype fn CreateDocumentType(&self, qname: DOMString, pubid: DOMString, sysid: DOMString) -> Fallible> { - let roots = RootCollection::new(); match xml_name_type(qname) { // Step 1. InvalidXMLName => Err(InvalidCharacter), @@ -68,8 +67,8 @@ impl<'a> DOMImplementationMethods for JSRef<'a, DOMImplementation> { Name => Err(NamespaceError), // Step 3. QName => { - let owner = self.owner.root(&roots); - let document = owner.deref().Document().root(&roots); + let owner = self.owner.root(); + let document = owner.deref().Document().root(); Ok(DocumentType::new(qname, Some(pubid), Some(sysid), &*document)) } } @@ -78,11 +77,10 @@ impl<'a> DOMImplementationMethods for JSRef<'a, DOMImplementation> { // http://dom.spec.whatwg.org/#dom-domimplementation-createdocument fn CreateDocument(&self, namespace: Option, qname: DOMString, mut maybe_doctype: Option>) -> Fallible> { - let roots = RootCollection::new(); - let win = self.owner.root(&roots); + let win = self.owner.root(); // Step 1. - let mut doc = Document::new(&win.root_ref(), None, NonHTMLDocument, None).root(&roots); + let mut doc = Document::new(&win.root_ref(), None, NonHTMLDocument, None).root(); // Step 2-3. let mut maybe_elem = if qname.is_empty() { None @@ -105,7 +103,7 @@ impl<'a> DOMImplementationMethods for JSRef<'a, DOMImplementation> { } // Step 5. - match maybe_elem.root(&roots) { + match maybe_elem.root() { None => (), Some(mut elem) => { assert!(doc_node.AppendChild(NodeCast::from_mut_ref(&mut *elem)).is_ok()) @@ -122,28 +120,27 @@ impl<'a> DOMImplementationMethods for JSRef<'a, DOMImplementation> { // http://dom.spec.whatwg.org/#dom-domimplementation-createhtmldocument fn CreateHTMLDocument(&self, title: Option) -> Temporary { - let roots = RootCollection::new(); - let owner = self.owner.root(&roots); + let owner = self.owner.root(); // Step 1-2. - let mut doc = Document::new(&owner.root_ref(), None, HTMLDocument, None).root(&roots); + let mut doc = Document::new(&owner.root_ref(), None, HTMLDocument, None).root(); let mut doc_alias = doc.clone(); let doc_node: &mut JSRef = NodeCast::from_mut_ref(&mut doc_alias); { // Step 3. - let mut doc_type = DocumentType::new(~"html", None, None, &*doc).root(&roots); + let mut doc_type = DocumentType::new(~"html", None, None, &*doc).root(); assert!(doc_node.AppendChild(NodeCast::from_mut_ref(&mut *doc_type)).is_ok()); } { // Step 4. - let mut doc_html = NodeCast::from_unrooted(HTMLHtmlElement::new(~"html", &*doc)).root(&roots); + let mut doc_html = NodeCast::from_unrooted(HTMLHtmlElement::new(~"html", &*doc)).root(); assert!(doc_node.AppendChild(&mut *doc_html).is_ok()); { // Step 5. - let mut doc_head = NodeCast::from_unrooted(HTMLHeadElement::new(~"head", &*doc)).root(&roots); + let mut doc_head = NodeCast::from_unrooted(HTMLHeadElement::new(~"head", &*doc)).root(); assert!(doc_html.AppendChild(&mut *doc_head).is_ok()); // Step 6. @@ -151,18 +148,18 @@ impl<'a> DOMImplementationMethods for JSRef<'a, DOMImplementation> { None => (), Some(title_str) => { // Step 6.1. - let mut doc_title = NodeCast::from_unrooted(HTMLTitleElement::new(~"title", &*doc)).root(&roots); + let mut doc_title = NodeCast::from_unrooted(HTMLTitleElement::new(~"title", &*doc)).root(); assert!(doc_head.AppendChild(&mut *doc_title).is_ok()); // Step 6.2. - let mut title_text = Text::new(title_str, &*doc).root(&roots); + let mut title_text = Text::new(title_str, &*doc).root(); assert!(doc_title.AppendChild(NodeCast::from_mut_ref(&mut *title_text)).is_ok()); } } } // Step 7. - let mut doc_body = HTMLBodyElement::new(~"body", &*doc).root(&roots); + let mut doc_body = HTMLBodyElement::new(~"body", &*doc).root(); assert!(doc_html.AppendChild(NodeCast::from_mut_ref(&mut *doc_body)).is_ok()); } diff --git a/src/components/script/dom/domparser.rs b/src/components/script/dom/domparser.rs index 3dc95f57d27..41424d24c0d 100644 --- a/src/components/script/dom/domparser.rs +++ b/src/components/script/dom/domparser.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::BindingDeclarations::DOMParserBinding; use dom::bindings::codegen::BindingDeclarations::DOMParserBinding::SupportedTypeValues::{Text_html, Text_xml}; -use dom::bindings::js::{JS, JSRef, RootCollection, Temporary}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::utils::{Reflector, Reflectable, reflect_dom_object}; use dom::bindings::error::{Fallible, FailureUnknown}; use dom::document::{Document, HTMLDocument, NonHTMLDocument}; @@ -44,8 +44,7 @@ impl<'a> DOMParserMethods for JSRef<'a, DOMParser> { _s: DOMString, ty: DOMParserBinding::SupportedType) -> Fallible> { - let roots = RootCollection::new(); - let owner = self.owner.root(&roots); + let owner = self.owner.root(); match ty { Text_html => { Ok(Document::new(&owner.root_ref(), None, HTMLDocument, Some(~"text/html"))) diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index fdf9db3e5b0..f316b1765f6 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -8,7 +8,7 @@ use dom::attr::{Attr, ReplacedAttr, FirstSetAttr, AttrMethods}; use dom::attrlist::AttrList; use dom::bindings::codegen::BindingDeclarations::ElementBinding; use dom::bindings::codegen::InheritTypes::{ElementDerived, NodeCast}; -use dom::bindings::js::{JS, JSRef, RootCollection, Temporary, TemporaryPushable}; +use dom::bindings::js::{JS, JSRef, Temporary, TemporaryPushable}; use dom::bindings::js::{OptionalAssignable, OptionalRootable, Root}; use dom::bindings::utils::{Reflectable, Reflector}; use dom::bindings::error::{ErrorResult, Fallible, NamespaceError, InvalidCharacter}; @@ -198,10 +198,9 @@ pub trait ElementHelpers { impl<'a> ElementHelpers for JSRef<'a, Element> { fn html_element_in_html_document(&self) -> bool { - let roots = RootCollection::new(); let is_html = self.namespace == namespace::HTML; let node: &JSRef = NodeCast::from_ref(self); - is_html && node.owner_doc().root(&roots).is_html_document + is_html && node.owner_doc().root().is_html_document } } @@ -228,13 +227,12 @@ pub trait AttributeHandlers { impl<'a> AttributeHandlers for JSRef<'a, Element> { fn get_attribute(&self, namespace: Namespace, name: &str) -> Option> { - let roots = RootCollection::new(); if self.html_element_in_html_document() { - self.get().attrs.iter().map(|attr| attr.root(&roots)).find(|attr| { + self.get().attrs.iter().map(|attr| attr.root()).find(|attr| { name.to_ascii_lower() == attr.local_name && attr.namespace == namespace }).map(|x| Temporary::new_rooted(&*x)) } else { - self.get().attrs.iter().map(|attr| attr.root(&roots)).find(|attr| { + self.get().attrs.iter().map(|attr| attr.root()).find(|attr| { name == attr.local_name && attr.namespace == namespace }).map(|x| Temporary::new_rooted(&*x)) } @@ -275,14 +273,13 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { fn do_set_attribute(&mut self, local_name: DOMString, value: DOMString, name: DOMString, namespace: Namespace, prefix: Option, cb: |&JSRef| -> bool) { - let roots = RootCollection::new(); let idx = self.get().attrs.iter() - .map(|attr| attr.root(&roots)) + .map(|attr| attr.root()) .position(|attr| cb(&*attr)); let (idx, set_type) = match idx { Some(idx) => (idx, ReplacedAttr), None => { - let window = window_from_node(self).root(&roots); + let window = window_from_node(self).root(); let attr = Attr::new(&*window, local_name.clone(), value.clone(), name, namespace.clone(), prefix, self); self.get_mut().attrs.push_unrooted(attr); @@ -290,14 +287,13 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { } }; - self.get_mut().attrs.get(idx).root(&roots).set_value(set_type, value); + self.get_mut().attrs.get(idx).root().set_value(set_type, value); } fn remove_attribute(&mut self, namespace: Namespace, name: DOMString) -> ErrorResult { - let roots = RootCollection::new(); let (_, local_name) = get_attribute_parts(name.clone()); - let idx = self.get().attrs.iter().map(|attr| attr.root(&roots)).position(|attr| { + let idx = self.get().attrs.iter().map(|attr| attr.root()).position(|attr| { attr.local_name == local_name }); @@ -310,7 +306,7 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { } if namespace == namespace::Null { - let removed_raw_value = self.get().attrs.get(idx).root(&roots).Value(); + let removed_raw_value = self.get().attrs.get(idx).root().Value(); vtable_for(NodeCast::from_ref(self)).before_remove_attr(local_name.clone(), removed_raw_value); } @@ -322,14 +318,13 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { } fn notify_attribute_changed(&self, local_name: DOMString) { - let roots = RootCollection::new(); let node: &JSRef = NodeCast::from_ref(self); if node.is_in_doc() { let damage = match local_name.as_slice() { "style" | "id" | "class" => MatchSelectorsDocumentDamage, _ => ContentChangedDocumentDamage }; - let document = node.owner_doc().root(&roots); + let document = node.owner_doc().root(); document.deref().damage_and_reflow(damage); } } @@ -349,10 +344,9 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> { } fn get_string_attribute(&self, name: &str) -> DOMString { - let roots = RootCollection::new(); match self.get_attribute(Null, name) { Some(x) => { - let x = x.root(&roots); + let x = x.root(); x.deref().Value() } None => ~"" @@ -462,7 +456,6 @@ impl<'a> ElementMethods for JSRef<'a, Element> { // http://dom.spec.whatwg.org/#dom-element-attributes fn Attributes(&mut self) -> Temporary { - let roots = RootCollection::new(); match self.attr_list { None => (), Some(ref list) => return Temporary::new(list.clone()), @@ -470,9 +463,9 @@ impl<'a> ElementMethods for JSRef<'a, Element> { let doc = { let node: &JSRef = NodeCast::from_ref(self); - node.owner_doc() - }.root(&roots); - let window = doc.deref().window.root(&roots); + node.owner_doc().root() + }; + let window = doc.deref().window.root(); let list = AttrList::new(&*window, self); self.attr_list.assign(Some(list)); Temporary::new(self.attr_list.get_ref().clone()) @@ -480,13 +473,12 @@ impl<'a> ElementMethods for JSRef<'a, Element> { // http://dom.spec.whatwg.org/#dom-element-getattribute fn GetAttribute(&self, name: DOMString) -> Option { - let roots = RootCollection::new(); let name = if self.html_element_in_html_document() { name.to_ascii_lower() } else { name }; - self.get_attribute(Null, name).root(&roots) + self.get_attribute(Null, name).root() .map(|s| s.deref().Value()) } @@ -494,9 +486,8 @@ impl<'a> ElementMethods for JSRef<'a, Element> { fn GetAttributeNS(&self, namespace: Option, local_name: DOMString) -> Option { - let roots = RootCollection::new(); let namespace = Namespace::from_str(null_str_as_empty_ref(&namespace)); - self.get_attribute(namespace, local_name).root(&roots) + self.get_attribute(namespace, local_name).root() .map(|attr| attr.deref().Value()) } @@ -624,32 +615,28 @@ impl<'a> ElementMethods for JSRef<'a, Element> { } fn GetElementsByTagName(&self, localname: DOMString) -> Temporary { - let roots = RootCollection::new(); - let window = window_from_node(self).root(&roots); + let window = window_from_node(self).root(); HTMLCollection::by_tag_name(&*window, NodeCast::from_ref(self), localname) } fn GetElementsByTagNameNS(&self, maybe_ns: Option, localname: DOMString) -> Temporary { - let roots = RootCollection::new(); let namespace = match maybe_ns { Some(namespace) => Namespace::from_str(namespace), None => Null }; - let window = window_from_node(self).root(&roots); + let window = window_from_node(self).root(); HTMLCollection::by_tag_name_ns(&*window, NodeCast::from_ref(self), localname, namespace) } fn GetElementsByClassName(&self, classes: DOMString) -> Temporary { - let roots = RootCollection::new(); - let window = window_from_node(self).root(&roots); + let window = window_from_node(self).root(); HTMLCollection::by_class_name(&*window, NodeCast::from_ref(self), classes) } // http://dev.w3.org/csswg/cssom-view/#dom-element-getclientrects fn GetClientRects(&self) -> Temporary { - let roots = RootCollection::new(); - let win = window_from_node(self).root(&roots); + let win = window_from_node(self).root(); let node: &JSRef = NodeCast::from_ref(self); let rects = node.get_content_boxes(); let rects: ~[Root] = rects.iter().map(|r| { @@ -658,7 +645,7 @@ impl<'a> ElementMethods for JSRef<'a, Element> { r.origin.y, r.origin.y + r.size.height, r.origin.x, - r.origin.x + r.size.width).root(&roots) + r.origin.x + r.size.width).root() }).collect(); ClientRectList::new(&*win, rects.iter().map(|rect| rect.deref().clone()).collect()) @@ -666,8 +653,7 @@ impl<'a> ElementMethods for JSRef<'a, Element> { // http://dev.w3.org/csswg/cssom-view/#dom-element-getboundingclientrect fn GetBoundingClientRect(&self) -> Temporary { - let roots = RootCollection::new(); - let win = window_from_node(self).root(&roots); + let win = window_from_node(self).root(); let node: &JSRef = NodeCast::from_ref(self); let rect = node.get_bounding_content_box(); ClientRect::new( @@ -680,18 +666,15 @@ impl<'a> ElementMethods for JSRef<'a, Element> { fn GetInnerHTML(&self) -> Fallible { //XXX TODO: XML case - let roots = RootCollection::new(); - Ok(serialize(&mut NodeIterator::new(&roots, NodeCast::from_ref(self), false, false))) + Ok(serialize(&mut NodeIterator::new(NodeCast::from_ref(self), false, false))) } fn GetOuterHTML(&self) -> Fallible { - let roots = RootCollection::new(); - Ok(serialize(&mut NodeIterator::new(&roots, NodeCast::from_ref(self), true, false))) + Ok(serialize(&mut NodeIterator::new(NodeCast::from_ref(self), true, false))) } fn Children(&self) -> Temporary { - let roots = RootCollection::new(); - let window = window_from_node(self).root(&roots); + let window = window_from_node(self).root(); HTMLCollection::children(&*window, NodeCast::from_ref(self)) } } @@ -716,7 +699,6 @@ impl<'a> VirtualMethods for JSRef<'a, Element> { } fn after_set_attr(&mut self, name: DOMString, value: DOMString) { - let roots = RootCollection::new(); match self.super_type() { Some(ref mut s) => s.after_set_attr(name.clone(), value.clone()), _ => (), @@ -724,14 +706,14 @@ impl<'a> VirtualMethods for JSRef<'a, Element> { match name.as_slice() { "style" => { - let doc = document_from_node(self).root(&roots); + let doc = document_from_node(self).root(); let base_url = doc.deref().url().clone(); self.get_mut().style_attribute = Some(style::parse_style_attribute(value, &base_url)) } "id" => { let node: &JSRef = NodeCast::from_ref(self); if node.is_in_doc() { - let mut doc = document_from_node(self).root(&roots); + let mut doc = document_from_node(self).root(); doc.register_named_element(self, value.clone()); } } @@ -742,7 +724,6 @@ impl<'a> VirtualMethods for JSRef<'a, Element> { } fn before_remove_attr(&mut self, name: DOMString, value: DOMString) { - let roots = RootCollection::new(); match self.super_type() { Some(ref mut s) => s.before_remove_attr(name.clone(), value.clone()), _ => (), @@ -755,7 +736,7 @@ impl<'a> VirtualMethods for JSRef<'a, Element> { "id" => { let node: &JSRef = NodeCast::from_ref(self); if node.is_in_doc() { - let mut doc = document_from_node(self).root(&roots); + let mut doc = document_from_node(self).root(); doc.unregister_named_element(self, value); } } @@ -766,15 +747,14 @@ impl<'a> VirtualMethods for JSRef<'a, Element> { } fn bind_to_tree(&mut self) { - let roots = RootCollection::new(); match self.super_type() { Some(ref mut s) => s.bind_to_tree(), _ => (), } - match self.get_attribute(Null, "id").root(&roots) { + match self.get_attribute(Null, "id").root() { Some(attr) => { - let mut doc = document_from_node(self).root(&roots); + let mut doc = document_from_node(self).root(); doc.register_named_element(self, attr.deref().Value()); } _ => () @@ -782,15 +762,14 @@ impl<'a> VirtualMethods for JSRef<'a, Element> { } fn unbind_from_tree(&mut self) { - let roots = RootCollection::new(); match self.super_type() { Some(ref mut s) => s.unbind_from_tree(), _ => (), } - match self.get_attribute(Null, "id").root(&roots) { + match self.get_attribute(Null, "id").root() { Some(attr) => { - let mut doc = document_from_node(self).root(&roots); + let mut doc = document_from_node(self).root(); doc.unregister_named_element(self, attr.deref().Value()); } _ => () diff --git a/src/components/script/dom/event.rs b/src/components/script/dom/event.rs index 3b3254c0f0c..9ce0cd4f981 100644 --- a/src/components/script/dom/event.rs +++ b/src/components/script/dom/event.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::BindingDeclarations::EventBinding; use dom::bindings::codegen::BindingDeclarations::EventBinding::EventConstants; -use dom::bindings::js::{JS, JSRef, Temporary, RootCollection}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::bindings::error::Fallible; use dom::eventtarget::EventTarget; @@ -89,8 +89,7 @@ impl Event { pub fn Constructor(global: &JSRef, type_: DOMString, init: &EventBinding::EventInit) -> Fallible> { - let roots = RootCollection::new(); - let mut ev = Event::new(global).root(&roots); + let mut ev = Event::new(global).root(); ev.InitEvent(type_, init.bubbles, init.cancelable); Ok(Temporary::new_rooted(&*ev)) } diff --git a/src/components/script/dom/eventdispatcher.rs b/src/components/script/dom/eventdispatcher.rs index 1e0097bbdc4..b4e6b4644cf 100644 --- a/src/components/script/dom/eventdispatcher.rs +++ b/src/components/script/dom/eventdispatcher.rs @@ -4,7 +4,7 @@ use dom::bindings::callback::ReportExceptions; use dom::bindings::codegen::InheritTypes::{EventTargetCast, NodeCast, NodeDerived}; -use dom::bindings::js::{JSRef, OptionalAssignable, RootCollection, Root}; +use dom::bindings::js::{JSRef, OptionalAssignable, Root}; use dom::eventtarget::{Capturing, Bubbling, EventTarget}; use dom::event::{Event, PhaseAtTarget, PhaseNone, PhaseBubbling, PhaseCapturing, EventMethods}; use dom::node::{Node, NodeHelpers}; @@ -13,7 +13,6 @@ use dom::node::{Node, NodeHelpers}; pub fn dispatch_event<'a, 'b>(target: &JSRef<'a, EventTarget>, pseudo_target: Option>, event: &mut JSRef) -> bool { - let roots = RootCollection::new(); assert!(!event.get().dispatching); { @@ -32,7 +31,7 @@ pub fn dispatch_event<'a, 'b>(target: &JSRef<'a, EventTarget>, let target_node: &JSRef = NodeCast::to_ref(target).unwrap(); target_node.ancestors().map(|ancestor| { let ancestor_target: &JSRef = EventTargetCast::from_ref(&ancestor); - ancestor_target.unrooted().root(&roots) + ancestor_target.unrooted().root() }).collect() } else { vec!() diff --git a/src/components/script/dom/htmlbuttonelement.rs b/src/components/script/dom/htmlbuttonelement.rs index 7458c7df50b..1474c9cb563 100644 --- a/src/components/script/dom/htmlbuttonelement.rs +++ b/src/components/script/dom/htmlbuttonelement.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::BindingDeclarations::HTMLButtonElementBinding; use dom::bindings::codegen::InheritTypes::HTMLButtonElementDerived; -use dom::bindings::js::{JS, JSRef, RootCollection, Temporary}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::error::ErrorResult; use dom::document::Document; use dom::element::HTMLButtonElementTypeId; @@ -167,8 +167,7 @@ impl<'a> HTMLButtonElementMethods for JSRef<'a, HTMLButtonElement> { } fn Validity(&self) -> Temporary { - let roots = RootCollection::new(); - let window = window_from_node(self).root(&roots); + let window = window_from_node(self).root(); ValidityState::new(&*window) } diff --git a/src/components/script/dom/htmlcollection.rs b/src/components/script/dom/htmlcollection.rs index 3be0a84a2a2..0047247ffad 100644 --- a/src/components/script/dom/htmlcollection.rs +++ b/src/components/script/dom/htmlcollection.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::InheritTypes::{ElementCast, NodeCast}; use dom::bindings::codegen::BindingDeclarations::HTMLCollectionBinding; -use dom::bindings::js::{JS, JSRef, RootCollection, Temporary}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::element::{Element, AttributeHandlers}; use dom::node::{Node, NodeHelpers}; @@ -129,12 +129,11 @@ pub trait HTMLCollectionMethods { impl<'a> HTMLCollectionMethods for JSRef<'a, HTMLCollection> { // http://dom.spec.whatwg.org/#dom-htmlcollection-length fn Length(&self) -> u32 { - let roots = RootCollection::new(); match self.collection { Static(ref elems) => elems.len() as u32, Live(ref root, ref filter) => { - let root = root.root(&roots); - root.deref().traverse_preorder(&roots) + let root = root.root(); + root.deref().traverse_preorder() .count(|child| { let elem: Option<&JSRef> = ElementCast::to_ref(&child); elem.map_or(false, |elem| filter.filter(elem, &*root)) @@ -145,15 +144,14 @@ impl<'a> HTMLCollectionMethods for JSRef<'a, HTMLCollection> { // http://dom.spec.whatwg.org/#dom-htmlcollection-item fn Item(&self, index: u32) -> Option> { - let roots = RootCollection::new(); match self.collection { Static(ref elems) => elems .as_slice() .get(index as uint) .map(|elem| Temporary::new(elem.clone())), Live(ref root, ref filter) => { - let root = root.root(&roots); - root.deref().traverse_preorder(&roots) + let root = root.root(); + root.deref().traverse_preorder() .filter_map(|node| { let elem: Option<&JSRef> = ElementCast::to_ref(&node); elem.filtered(|&elem| filter.filter(elem, &*root)) @@ -168,7 +166,6 @@ impl<'a> HTMLCollectionMethods for JSRef<'a, HTMLCollection> { // http://dom.spec.whatwg.org/#dom-htmlcollection-nameditem fn NamedItem(&self, key: DOMString) -> Option> { - let roots = RootCollection::new(); // Step 1. if key.is_empty() { @@ -178,14 +175,14 @@ impl<'a> HTMLCollectionMethods for JSRef<'a, HTMLCollection> { // Step 2. match self.collection { Static(ref elems) => elems.iter() - .map(|elem| elem.root(&roots)) + .map(|elem| elem.root()) .find(|elem| { elem.get_string_attribute("name") == key || elem.get_string_attribute("id") == key }) .map(|maybe_elem| Temporary::new_rooted(&*maybe_elem)), Live(ref root, ref filter) => { - let root = root.root(&roots); - root.deref().traverse_preorder(&roots) + let root = root.root(); + root.deref().traverse_preorder() .filter_map(|node| { let elem: Option<&JSRef> = ElementCast::to_ref(&node); elem.filtered(|&elem| filter.filter(elem, &*root)) diff --git a/src/components/script/dom/htmldatalistelement.rs b/src/components/script/dom/htmldatalistelement.rs index 398920bdc61..caaad975c0e 100644 --- a/src/components/script/dom/htmldatalistelement.rs +++ b/src/components/script/dom/htmldatalistelement.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::BindingDeclarations::HTMLDataListElementBinding; use dom::bindings::codegen::InheritTypes::{HTMLDataListElementDerived, NodeCast}; -use dom::bindings::js::{JS, JSRef, RootCollection, Temporary}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::document::Document; use dom::element::{Element, HTMLDataListElementTypeId}; use dom::eventtarget::{EventTarget, NodeTargetTypeId}; @@ -52,10 +52,9 @@ impl<'a> HTMLDataListElementMethods for JSRef<'a, HTMLDataListElement> { elem.get().local_name == ~"option" } } - let roots = RootCollection::new(); let node: &JSRef = NodeCast::from_ref(self); let filter = ~HTMLDataListOptionsFilter; - let window = window_from_node(node).root(&roots); + let window = window_from_node(node).root(); HTMLCollection::create(&*window, node, filter) } } diff --git a/src/components/script/dom/htmlfieldsetelement.rs b/src/components/script/dom/htmlfieldsetelement.rs index f3872235f27..0b32c0b916a 100644 --- a/src/components/script/dom/htmlfieldsetelement.rs +++ b/src/components/script/dom/htmlfieldsetelement.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::BindingDeclarations::HTMLFieldSetElementBinding; use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLFieldSetElementDerived, NodeCast}; -use dom::bindings::js::{JS, JSRef, RootCollection, Temporary}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::error::ErrorResult; use dom::document::Document; use dom::element::{Element, HTMLFieldSetElementTypeId}; @@ -94,10 +94,9 @@ impl<'a> HTMLFieldSetElementMethods for JSRef<'a, HTMLFieldSetElement> { elem != root && tag_names.iter().any(|&tag_name| tag_name == elem.get().local_name) } } - let roots = RootCollection::new(); let node: &JSRef = NodeCast::from_ref(self); let filter = ~ElementsFilter; - let window = window_from_node(node).root(&roots); + let window = window_from_node(node).root(); HTMLCollection::create(&*window, node, filter) } @@ -106,8 +105,7 @@ impl<'a> HTMLFieldSetElementMethods for JSRef<'a, HTMLFieldSetElement> { } fn Validity(&self) -> Temporary { - let roots = RootCollection::new(); - let window = window_from_node(self).root(&roots); + let window = window_from_node(self).root(); ValidityState::new(&*window) } diff --git a/src/components/script/dom/htmlformelement.rs b/src/components/script/dom/htmlformelement.rs index c7773bdf68a..9cba31363ab 100644 --- a/src/components/script/dom/htmlformelement.rs +++ b/src/components/script/dom/htmlformelement.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::BindingDeclarations::HTMLFormElementBinding; use dom::bindings::codegen::InheritTypes::HTMLFormElementDerived; -use dom::bindings::js::{JS, JSRef, RootCollection, Temporary}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::error::ErrorResult; use dom::document::Document; use dom::element::{Element, HTMLFormElementTypeId}; @@ -143,8 +143,7 @@ impl<'a> HTMLFormElementMethods for JSRef<'a, HTMLFormElement> { fn Elements(&self) -> Temporary { // FIXME: https://github.com/mozilla/servo/issues/1844 - let roots = RootCollection::new(); - let window = window_from_node(self).root(&roots); + let window = window_from_node(self).root(); HTMLCollection::new(&*window, Static(vec!())) } diff --git a/src/components/script/dom/htmlimageelement.rs b/src/components/script/dom/htmlimageelement.rs index 956a923f7c0..af31c043d11 100644 --- a/src/components/script/dom/htmlimageelement.rs +++ b/src/components/script/dom/htmlimageelement.rs @@ -5,7 +5,7 @@ use dom::bindings::codegen::BindingDeclarations::HTMLImageElementBinding; use dom::bindings::codegen::InheritTypes::{NodeCast, ElementCast, HTMLElementCast, HTMLImageElementDerived}; use dom::bindings::error::ErrorResult; -use dom::bindings::js::{JS, JSRef, Temporary, RootCollection}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::trace::Untraceable; use dom::document::Document; use dom::element::{Element, HTMLImageElementTypeId}; @@ -43,11 +43,10 @@ impl<'a> PrivateHTMLImageElementHelpers for JSRef<'a, HTMLImageElement> { /// Makes the local `image` member match the status of the `src` attribute and starts /// prefetching the image. This method must be called after `src` is changed. fn update_image(&mut self, value: Option, url: Option) { - let roots = RootCollection::new(); let self_alias = self.clone(); let node_alias: &JSRef = NodeCast::from_ref(&self_alias); - let document = node_alias.owner_doc().root(&roots); - let window = document.deref().window.root(&roots); + let document = node_alias.owner_doc().root(); + let window = document.deref().window.root(); let image_cache = &window.image_cache_task; match value { None => { @@ -275,14 +274,13 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLImageElement> { } fn after_set_attr(&mut self, name: DOMString, value: DOMString) { - let roots = RootCollection::new(); match self.super_type() { Some(ref mut s) => s.after_set_attr(name.clone(), value.clone()), _ => (), } if "src" == name { - let window = window_from_node(self).root(&roots); + let window = window_from_node(self).root(); let url = Some(window.get().get_url()); self.update_image(Some(value), url); } diff --git a/src/components/script/dom/htmlmapelement.rs b/src/components/script/dom/htmlmapelement.rs index 681056a6be6..a6bd9d39ed0 100644 --- a/src/components/script/dom/htmlmapelement.rs +++ b/src/components/script/dom/htmlmapelement.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::BindingDeclarations::HTMLMapElementBinding; use dom::bindings::codegen::InheritTypes::HTMLMapElementDerived; -use dom::bindings::js::{JS, JSRef, RootCollection, Temporary}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::error::ErrorResult; use dom::document::Document; use dom::element::HTMLMapElementTypeId; @@ -57,9 +57,8 @@ impl<'a> HTMLMapElementMethods for JSRef<'a, HTMLMapElement> { } fn Areas(&self) -> Temporary { - let roots = RootCollection::new(); // FIXME: https://github.com/mozilla/servo/issues/1845 - let window = window_from_node(self).root(&roots); + let window = window_from_node(self).root(); HTMLCollection::new(&*window, Static(vec!())) } } diff --git a/src/components/script/dom/htmlobjectelement.rs b/src/components/script/dom/htmlobjectelement.rs index 18f8acce6b2..c560486c565 100644 --- a/src/components/script/dom/htmlobjectelement.rs +++ b/src/components/script/dom/htmlobjectelement.rs @@ -6,7 +6,7 @@ use dom::attr::AttrMethods; use dom::bindings::codegen::BindingDeclarations::HTMLObjectElementBinding; use dom::bindings::codegen::InheritTypes::HTMLObjectElementDerived; use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLElementCast}; -use dom::bindings::js::{JS, JSRef, RootCollection, Temporary}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::error::ErrorResult; use dom::document::Document; use dom::element::{Element, HTMLObjectElementTypeId}; @@ -62,12 +62,11 @@ impl<'a> ProcessDataURL for JSRef<'a, HTMLObjectElement> { // Makes the local `data` member match the status of the `data` attribute and starts /// prefetching the image. This method must be called after `data` is changed. fn process_data_url(&mut self, image_cache: ImageCacheTask, url: Option) { - let roots = RootCollection::new(); let elem: &JSRef = ElementCast::from_ref(self); // TODO: support other values - match (elem.get_attribute(Null, "type").map(|x| x.root(&roots).Value()), - elem.get_attribute(Null, "data").map(|x| x.root(&roots).Value())) { + match (elem.get_attribute(Null, "type").map(|x| x.root().Value()), + elem.get_attribute(Null, "data").map(|x| x.root().Value())) { (None, Some(uri)) => { if is_image_data(uri) { let data_url = parse_url(uri, url); @@ -190,8 +189,7 @@ impl<'a> HTMLObjectElementMethods for JSRef<'a, HTMLObjectElement> { } fn Validity(&self) -> Temporary { - let roots = RootCollection::new(); - let window = window_from_node(self).root(&roots); + let window = window_from_node(self).root(); ValidityState::new(&*window) } @@ -298,14 +296,13 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLObjectElement> { } fn after_set_attr(&mut self, name: DOMString, value: DOMString) { - let roots = RootCollection::new(); match self.super_type() { Some(ref mut s) => s.after_set_attr(name.clone(), value), _ => (), } if "data" == name { - let window = window_from_node(self).root(&roots); + let window = window_from_node(self).root(); let url = Some(window.get().get_url()); self.process_data_url(window.get().image_cache_task.clone(), url); } diff --git a/src/components/script/dom/htmloutputelement.rs b/src/components/script/dom/htmloutputelement.rs index 5bed0a4fb49..91a77daa8e5 100644 --- a/src/components/script/dom/htmloutputelement.rs +++ b/src/components/script/dom/htmloutputelement.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::BindingDeclarations::HTMLOutputElementBinding; use dom::bindings::codegen::InheritTypes::HTMLOutputElementDerived; -use dom::bindings::js::{JS, JSRef, RootCollection, Temporary}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::error::ErrorResult; use dom::document::Document; use dom::element::HTMLOutputElementTypeId; @@ -102,8 +102,7 @@ impl<'a> HTMLOutputElementMethods for JSRef<'a, HTMLOutputElement> { } fn Validity(&self) -> Temporary { - let roots = RootCollection::new(); - let window = window_from_node(self).root(&roots); + let window = window_from_node(self).root(); ValidityState::new(&*window) } diff --git a/src/components/script/dom/htmlselectelement.rs b/src/components/script/dom/htmlselectelement.rs index 8c349315849..54d3c7cf86f 100644 --- a/src/components/script/dom/htmlselectelement.rs +++ b/src/components/script/dom/htmlselectelement.rs @@ -5,7 +5,7 @@ use dom::bindings::codegen::BindingDeclarations::HTMLSelectElementBinding; use dom::bindings::codegen::InheritTypes::HTMLSelectElementDerived; use dom::bindings::codegen::UnionTypes::{HTMLElementOrLong, HTMLOptionElementOrHTMLOptGroupElement}; -use dom::bindings::js::{JS, JSRef, RootCollection, Temporary}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::error::ErrorResult; use dom::document::Document; use dom::element::{Element, HTMLSelectElementTypeId}; @@ -192,8 +192,7 @@ impl<'a> HTMLSelectElementMethods for JSRef<'a, HTMLSelectElement> { } fn Validity(&self) -> Temporary { - let roots = RootCollection::new(); - let window = window_from_node(self).root(&roots); + let window = window_from_node(self).root(); ValidityState::new(&*window) } diff --git a/src/components/script/dom/htmlserializer.rs b/src/components/script/dom/htmlserializer.rs index 55c1ba03d9e..9f2bdf3e40b 100644 --- a/src/components/script/dom/htmlserializer.rs +++ b/src/components/script/dom/htmlserializer.rs @@ -7,7 +7,7 @@ use dom::attr::Attr; use dom::bindings::codegen::InheritTypes::{ElementCast, TextCast, CommentCast, NodeCast}; use dom::bindings::codegen::InheritTypes::{DocumentTypeCast, CharacterDataCast}; use dom::bindings::codegen::InheritTypes::ProcessingInstructionCast; -use dom::bindings::js::{JSRef, RootCollection}; +use dom::bindings::js::JSRef; use dom::characterdata::CharacterData; use dom::comment::Comment; use dom::documenttype::DocumentType; @@ -70,9 +70,8 @@ fn serialize_comment(comment: &JSRef) -> ~str { } fn serialize_text(text: &JSRef) -> ~str { - let roots = RootCollection::new(); let text_node: &JSRef = NodeCast::from_ref(text); - match text_node.parent_node().map(|node| node.root(&roots)) { + match text_node.parent_node().map(|node| node.root()) { Some(ref parent) if parent.is_element() => { let elem: &JSRef = ElementCast::to_ref(&**parent).unwrap(); match elem.get().local_name.as_slice() { @@ -97,17 +96,16 @@ fn serialize_doctype(doctype: &JSRef) -> ~str { } fn serialize_elem(elem: &JSRef, open_elements: &mut Vec<~str>) -> ~str { - let roots = RootCollection::new(); let mut rv = ~"<" + elem.get().local_name; for attr in elem.get().attrs.iter() { - let attr = attr.root(&roots); + let attr = attr.root(); rv.push_str(serialize_attr(&*attr)); }; rv.push_str(">"); match elem.get().local_name.as_slice() { "pre" | "listing" | "textarea" if elem.get().namespace == namespace::HTML => { let node: &JSRef = NodeCast::from_ref(elem); - match node.first_child().map(|child| child.root(&roots)) { + match node.first_child().map(|child| child.root()) { Some(ref child) if child.is_text() => { let text: &JSRef = CharacterDataCast::to_ref(&**child).unwrap(); if text.get().data.len() > 0 && text.get().data[0] == 0x0A as u8 { diff --git a/src/components/script/dom/htmlstyleelement.rs b/src/components/script/dom/htmlstyleelement.rs index 1ee1408e9ef..025375efb73 100644 --- a/src/components/script/dom/htmlstyleelement.rs +++ b/src/components/script/dom/htmlstyleelement.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::BindingDeclarations::HTMLStyleElementBinding; use dom::bindings::codegen::InheritTypes::{HTMLElementCast, HTMLStyleElementDerived, NodeCast}; -use dom::bindings::js::{JS, JSRef, RootCollection, Temporary}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::error::ErrorResult; use dom::document::Document; use dom::element::HTMLStyleElementTypeId; @@ -93,9 +93,8 @@ pub trait StyleElementHelpers { impl<'a> StyleElementHelpers for JSRef<'a, HTMLStyleElement> { fn parse_own_css(&self) { - let roots = RootCollection::new(); let node: &JSRef = NodeCast::from_ref(self); - let win = window_from_node(node).root(&roots); + let win = window_from_node(node).root(); let url = win.get().page().get_url(); let data = node.GetTextContent().expect("Element.textContent must be a string"); diff --git a/src/components/script/dom/mouseevent.rs b/src/components/script/dom/mouseevent.rs index ce46cd47680..f35c088675c 100644 --- a/src/components/script/dom/mouseevent.rs +++ b/src/components/script/dom/mouseevent.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::BindingDeclarations::MouseEventBinding; use dom::bindings::codegen::InheritTypes::{UIEventCast, MouseEventDerived}; -use dom::bindings::js::{JS, JSRef, RootCollection, RootedReference, Temporary}; +use dom::bindings::js::{JS, JSRef, RootedReference, Temporary}; use dom::bindings::error::Fallible; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::event::{Event, MouseEventTypeId}; @@ -60,10 +60,9 @@ impl MouseEvent { pub fn Constructor(owner: &JSRef, type_: DOMString, init: &MouseEventBinding::MouseEventInit) -> Fallible> { - let roots = RootCollection::new(); - let mut ev = MouseEvent::new(owner).root(&roots); - let view = init.view.as_ref().map(|view| view.root(&roots)); - let related_target = init.relatedTarget.as_ref().map(|relatedTarget| relatedTarget.root(&roots)); + let mut ev = MouseEvent::new(owner).root(); + let view = init.view.as_ref().map(|view| view.root()); + let related_target = init.relatedTarget.as_ref().map(|relatedTarget| relatedTarget.root()); ev.InitMouseEvent(type_, init.bubbles, init.cancelable, view.root_ref(), init.detail, init.screenX, init.screenY, init.clientX, init.clientY, init.ctrlKey, diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs index 07b9ecd111d..772d1fbcc39 100644 --- a/src/components/script/dom/node.rs +++ b/src/components/script/dom/node.rs @@ -10,7 +10,7 @@ use dom::bindings::codegen::InheritTypes::{ElementCast, TextCast, NodeCast, Elem use dom::bindings::codegen::InheritTypes::{CharacterDataCast, NodeBase, NodeDerived}; use dom::bindings::codegen::InheritTypes::{ProcessingInstructionCast, EventTargetCast}; use dom::bindings::codegen::BindingDeclarations::NodeBinding::NodeConstants; -use dom::bindings::js::{JS, JSRef, RootCollection, RootedReference, Temporary, Root}; +use dom::bindings::js::{JS, JSRef, RootedReference, Temporary, Root}; use dom::bindings::js::{OptionalAssignable, TemporaryPushable, OptionalRootedRootable}; use dom::bindings::js::{ResultRootable, OptionalRootable}; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; @@ -240,29 +240,26 @@ trait PrivateNodeHelpers { impl<'a> PrivateNodeHelpers for JSRef<'a, Node> { // http://dom.spec.whatwg.org/#node-is-inserted fn node_inserted(&self) { - let roots = RootCollection::new(); assert!(self.parent_node().is_some()); - let document = document_from_node(self).root(&roots); + let document = document_from_node(self).root(); if self.is_in_doc() { - for node in self.traverse_preorder(&roots) { + for node in self.traverse_preorder() { vtable_for(&node).bind_to_tree(); } } - self.parent_node().root(&roots) - .map(|parent| vtable_for(&*parent).child_inserted(self)); + self.parent_node().root().map(|parent| vtable_for(&*parent).child_inserted(self)); document.deref().content_changed(); } // http://dom.spec.whatwg.org/#node-is-removed fn node_removed(&self) { - let roots = RootCollection::new(); assert!(self.parent_node().is_none()); - let document = document_from_node(self).root(&roots); + let document = document_from_node(self).root(); - for node in self.traverse_preorder(&roots) { + for node in self.traverse_preorder() { // XXX how about if the node wasn't in the tree in the first place? vtable_for(&node).unbind_from_tree(); } @@ -278,7 +275,6 @@ impl<'a> PrivateNodeHelpers for JSRef<'a, Node> { /// /// Fails unless `new_child` is disconnected from the tree. fn add_child(&mut self, new_child: &mut JSRef, mut before: Option>) { - let roots = RootCollection::new(); assert!(new_child.parent_node().is_none()); assert!(new_child.prev_sibling().is_none()); assert!(new_child.next_sibling().is_none()); @@ -286,14 +282,13 @@ impl<'a> PrivateNodeHelpers for JSRef<'a, Node> { Some(ref mut before) => { // XXX Should assert that parent is self. assert!(before.parent_node().is_some()); - match before.prev_sibling() { + match before.prev_sibling().root() { None => { // XXX Should assert that before is the first child of // self. self.set_first_child(Some(new_child.clone())); }, - Some(prev_sibling) => { - let mut prev_sibling = prev_sibling.root(&roots); + Some(mut prev_sibling) => { prev_sibling.set_next_sibling(Some(new_child.clone())); new_child.set_prev_sibling(Some((*prev_sibling).clone())); }, @@ -302,7 +297,7 @@ impl<'a> PrivateNodeHelpers for JSRef<'a, Node> { new_child.set_next_sibling(Some(before.clone())); }, None => { - match self.last_child().map(|child| child.root(&roots)) { + match self.last_child().root() { None => self.set_first_child(Some(new_child.clone())), Some(mut last_child) => { assert!(last_child.next_sibling().is_none()); @@ -322,27 +317,26 @@ impl<'a> PrivateNodeHelpers for JSRef<'a, Node> { /// /// Fails unless `child` is a child of this node. (FIXME: This is not yet checked.) fn remove_child(&mut self, child: &mut JSRef) { - let roots = RootCollection::new(); assert!(child.parent_node.is_some()); - match child.prev_sibling.root(&roots) { + match child.prev_sibling.root() { None => { - let next_sibling = child.next_sibling.as_ref().map(|next| next.root(&roots)); + let next_sibling = child.next_sibling.root(); self.set_first_child(next_sibling.root_ref()); } Some(ref mut prev_sibling) => { - let next_sibling = child.next_sibling.as_ref().map(|next| next.root(&roots)); + let next_sibling = child.next_sibling.root(); prev_sibling.set_next_sibling(next_sibling.root_ref()); } } - match child.next_sibling.root(&roots) { + match child.next_sibling.root() { None => { - let prev_sibling = child.prev_sibling.as_ref().map(|prev| prev.root(&roots)); + let prev_sibling = child.prev_sibling.root(); self.set_last_child(prev_sibling.root_ref()); } Some(ref mut next_sibling) => { - let prev_sibling = child.prev_sibling.as_ref().map(|prev| prev.root(&roots)); + let prev_sibling = child.prev_sibling.root(); next_sibling.set_prev_sibling(prev_sibling.root_ref()); } } @@ -357,36 +351,31 @@ impl<'a> PrivateNodeHelpers for JSRef<'a, Node> { // fn set_parent_node(&mut self, new_parent_node: Option>) { - let roots = RootCollection::new(); - let doc = self.owner_doc().root(&roots); + let doc = self.owner_doc().root(); doc.deref().wait_until_safe_to_modify_dom(); self.parent_node.assign(new_parent_node); } fn set_first_child(&mut self, new_first_child: Option>) { - let roots = RootCollection::new(); - let doc = self.owner_doc().root(&roots); + let doc = self.owner_doc().root(); doc.deref().wait_until_safe_to_modify_dom(); self.first_child.assign(new_first_child); } fn set_last_child(&mut self, new_last_child: Option>) { - let roots = RootCollection::new(); - let doc = self.owner_doc().root(&roots); + let doc = self.owner_doc().root(); doc.deref().wait_until_safe_to_modify_dom(); self.last_child.assign(new_last_child); } fn set_prev_sibling(&mut self, new_prev_sibling: Option>) { - let roots = RootCollection::new(); - let doc = self.owner_doc().root(&roots); + let doc = self.owner_doc().root(); doc.deref().wait_until_safe_to_modify_dom(); self.prev_sibling.assign(new_prev_sibling); } fn set_next_sibling(&mut self, new_next_sibling: Option>) { - let roots = RootCollection::new(); - let doc = self.owner_doc().root(&roots); + let doc = self.owner_doc().root(); doc.deref().wait_until_safe_to_modify_dom(); self.next_sibling.assign(new_next_sibling); } @@ -427,8 +416,8 @@ pub trait NodeHelpers { fn dump_indent(&self, indent: uint); fn debug_str(&self) -> ~str; - fn traverse_preorder<'a>(&self, roots: &'a RootCollection) -> TreeIterator<'a>; - fn sequential_traverse_postorder<'a>(&self, roots: &'a RootCollection) -> TreeIterator<'a>; + fn traverse_preorder<'a>(&self) -> TreeIterator<'a>; + fn sequential_traverse_postorder<'a>(&self) -> TreeIterator<'a>; fn inclusively_following_siblings(&self) -> AbstractNodeChildrenIterator; fn to_trusted_node_address(&self) -> TrustedNodeAddress; @@ -546,24 +535,22 @@ impl<'a> NodeHelpers for JSRef<'a, Node> { } /// Iterates over this node and all its descendants, in preorder. - fn traverse_preorder<'a>(&self, roots: &'a RootCollection) -> TreeIterator<'a> { + fn traverse_preorder<'a>(&self) -> TreeIterator<'a> { let mut nodes = vec!(); - gather_abstract_nodes(self, roots, &mut nodes, false); + gather_abstract_nodes(self, &mut nodes, false); TreeIterator::new(nodes) } /// Iterates over this node and all its descendants, in postorder. - fn sequential_traverse_postorder<'a>(&self, roots: &'a RootCollection) -> TreeIterator<'a> { + fn sequential_traverse_postorder<'a>(&self) -> TreeIterator<'a> { let mut nodes = vec!(); - gather_abstract_nodes(self, roots, &mut nodes, true); + gather_abstract_nodes(self, &mut nodes, true); TreeIterator::new(nodes) } fn inclusively_following_siblings(&self) -> AbstractNodeChildrenIterator { - let roots = RootCollection::new(); AbstractNodeChildrenIterator { - current_node: Some((*self.unrooted().root(&roots)).clone()), - roots: roots, + current_node: Some((*self.unrooted().root()).clone()), } } @@ -572,10 +559,8 @@ impl<'a> NodeHelpers for JSRef<'a, Node> { } fn following_siblings(&self) -> AbstractNodeChildrenIterator { - let roots = RootCollection::new(); AbstractNodeChildrenIterator { - current_node: self.next_sibling().map(|node| (*node.root(&roots)).clone()), - roots: roots, + current_node: self.next_sibling().map(|node| (*node.root()).clone()), } } @@ -591,8 +576,7 @@ impl<'a> NodeHelpers for JSRef<'a, Node> { } fn get_bounding_content_box(&self) -> Rect { - let roots = RootCollection::new(); - let window = window_from_node(self).root(&roots); + let window = window_from_node(self).root(); let page = window.get().page(); let (chan, port) = channel(); let addr = self.to_trusted_node_address(); @@ -601,8 +585,7 @@ impl<'a> NodeHelpers for JSRef<'a, Node> { } fn get_content_boxes(&self) -> Vec> { - let roots = RootCollection::new(); - let window = window_from_node(self).root(&roots); + let window = window_from_node(self).root(); let page = window.get().page(); let (chan, port) = channel(); let addr = self.to_trusted_node_address(); @@ -611,10 +594,8 @@ impl<'a> NodeHelpers for JSRef<'a, Node> { } fn ancestors(&self) -> AncestorIterator { - let roots = RootCollection::new(); AncestorIterator { - current: self.parent_node.clone().map(|node| (*node.root(&roots)).clone()), - roots: roots, + current: self.parent_node.clone().map(|node| (*node.root()).clone()), } } @@ -627,10 +608,8 @@ impl<'a> NodeHelpers for JSRef<'a, Node> { } fn children(&self) -> AbstractNodeChildrenIterator { - let roots = RootCollection::new(); AbstractNodeChildrenIterator { - current_node: self.first_child.clone().map(|node| (*node.root(&roots)).clone()), - roots: roots, + current_node: self.first_child.clone().map(|node| (*node.root()).clone()), } } @@ -646,8 +625,7 @@ impl<'a> NodeHelpers for JSRef<'a, Node> { } fn wait_until_safe_to_modify_dom(&self) { - let roots = RootCollection::new(); - let document = self.owner_doc().root(&roots); + let document = self.owner_doc().root(); document.deref().wait_until_safe_to_modify_dom(); } @@ -743,14 +721,13 @@ pub type ChildElementIterator<'a, 'b> = Map<'a, JSRef<'b, Node>, pub struct AbstractNodeChildrenIterator<'a> { current_node: Option>, - roots: RootCollection, } impl<'a> Iterator> for AbstractNodeChildrenIterator<'a> { fn next(&mut self) -> Option> { let node = self.current_node.clone(); self.current_node = node.clone().and_then(|node| { - node.next_sibling().map(|node| (*node.root(&self.roots)).clone()) + node.next_sibling().map(|node| (*node.root()).clone()) }); node } @@ -758,7 +735,6 @@ impl<'a> Iterator> for AbstractNodeChildrenIterator<'a> { pub struct AncestorIterator<'a> { current: Option>, - roots: RootCollection, } impl<'a> Iterator> for AncestorIterator<'a> { @@ -769,7 +745,7 @@ impl<'a> Iterator> for AncestorIterator<'a> { // FIXME: Do we need two clones here? let x = self.current.get_ref().clone(); - self.current = x.parent_node().map(|node| (*node.root(&self.roots)).clone()); + self.current = x.parent_node().map(|node| (*node.root()).clone()); Some(x) } } @@ -802,8 +778,7 @@ impl<'a> Iterator> for TreeIterator<'a> { } } -pub struct NodeIterator<'a> { - roots: &'a RootCollection, +pub struct NodeIterator { pub start_node: JS, pub current_node: Option>, pub depth: uint, @@ -811,13 +786,11 @@ pub struct NodeIterator<'a> { include_descendants_of_void: bool } -impl<'a> NodeIterator<'a> { - pub fn new<'a, 'b>(roots: &'a RootCollection, - start_node: &JSRef<'b, Node>, - include_start: bool, - include_descendants_of_void: bool) -> NodeIterator<'a> { +impl NodeIterator { + pub fn new<'a>(start_node: &JSRef<'a, Node>, + include_start: bool, + include_descendants_of_void: bool) -> NodeIterator { NodeIterator { - roots: roots, start_node: start_node.unrooted(), current_node: None, depth: 0, @@ -832,22 +805,22 @@ impl<'a> NodeIterator<'a> { if elem.get().is_void() { None } else { - node.first_child().map(|child| (*child.root(self.roots)).clone()) + node.first_child().map(|child| (*child.root()).clone()) } } else { - node.first_child().map(|child| (*child.root(self.roots)).clone()) + node.first_child().map(|child| (*child.root()).clone()) } } } -impl<'a, 'b> Iterator> for NodeIterator<'a> { +impl<'a> Iterator> for NodeIterator { fn next(&mut self) -> Option> { - self.current_node = match self.current_node.as_ref().map(|node| node.root(self.roots)) { + self.current_node = match self.current_node.as_ref().map(|node| node.root()) { None => { if self.include_start { Some(self.start_node.clone()) } else { - self.next_child(&*self.start_node.root(self.roots)) + self.next_child(&*self.start_node.root()) .map(|child| child.unrooted()) } }, @@ -859,21 +832,21 @@ impl<'a, 'b> Iterator> for NodeIterator<'a> { }, None if node.deref().unrooted() == self.start_node => None, None => { - match node.deref().next_sibling().root(self.roots) { + match node.deref().next_sibling().root() { Some(sibling) => Some(sibling.deref().unrooted()), None => { let mut candidate = node.deref().clone(); while candidate.next_sibling().is_none() { candidate = (*candidate.parent_node() .expect("Got to root without reaching start node") - .root(self.roots)).clone(); + .root()).clone(); self.depth -= 1; if candidate.unrooted() == self.start_node { break; } } if candidate.unrooted() != self.start_node { - candidate.next_sibling().map(|node| node.root(self.roots).unrooted()) + candidate.next_sibling().map(|node| node.root().unrooted()) } else { None } @@ -883,19 +856,19 @@ impl<'a, 'b> Iterator> for NodeIterator<'a> { } } }; - self.current_node.clone().map(|node| (*node.root(self.roots)).clone()) + self.current_node.clone().map(|node| (*node.root()).clone()) } } -fn gather_abstract_nodes<'a>(cur: &JSRef, roots: &'a RootCollection, refs: &mut Vec>, postorder: bool) { +fn gather_abstract_nodes<'a>(cur: &JSRef, refs: &mut Vec>, postorder: bool) { if !postorder { - refs.push((*cur.unrooted().root(roots)).clone()); + refs.push((*cur.unrooted().root()).clone()); } for kid in cur.children() { - gather_abstract_nodes(&kid, roots, refs, postorder) + gather_abstract_nodes(&kid, refs, postorder) } if postorder { - refs.push((*cur.unrooted().root(roots)).clone()); + refs.push((*cur.unrooted().root()).clone()); } } @@ -914,17 +887,15 @@ impl Node { document: &JSRef, wrap_fn: extern "Rust" fn(*JSContext, &JSRef, ~N) -> JS) -> Temporary { - let roots = RootCollection::new(); assert!(node.reflector().get_jsobject().is_null()); - let window = document.get().window.root(&roots); - let node = reflect_dom_object(node, &window.root_ref(), wrap_fn).root(&roots); + let window = document.get().window.root(); + let node = reflect_dom_object(node, &window.root_ref(), wrap_fn).root(); assert!(node.reflector().get_jsobject().is_not_null()); Temporary::new_rooted(&*node) } pub fn new_inherited(type_id: NodeTypeId, doc: JS) -> Node { - let roots = RootCollection::new(); - let doc = doc.root(&roots); + let doc = doc.root(); Node::new_(type_id, Some(doc.root_ref())) } @@ -954,9 +925,8 @@ impl Node { // http://dom.spec.whatwg.org/#concept-node-adopt pub fn adopt(node: &mut JSRef, document: &JSRef) { - let roots = RootCollection::new(); // Step 1. - match node.parent_node().root(&roots) { + match node.parent_node().root() { Some(mut parent) => { Node::remove(node, &mut *parent, Unsuppressed); } @@ -964,9 +934,9 @@ impl Node { } // Step 2. - let node_doc = document_from_node(node).root(&roots); + let node_doc = document_from_node(node).root(); if &*node_doc != document { - for mut descendant in node.traverse_preorder(&roots) { + for mut descendant in node.traverse_preorder() { descendant.set_owner_doc(document); } } @@ -978,7 +948,6 @@ impl Node { // http://dom.spec.whatwg.org/#concept-node-pre-insert fn pre_insert(node: &mut JSRef, parent: &mut JSRef, child: Option>) -> Fallible> { - let roots = RootCollection::new(); // Step 1. match parent.type_id() { DocumentNodeTypeId | @@ -1001,13 +970,13 @@ impl Node { // Step 4-5. match node.type_id() { TextNodeTypeId => { - match node.parent_node().root(&roots) { + match node.parent_node().root() { Some(ref parent) if parent.is_document() => return Err(HierarchyRequest), _ => () } } DoctypeNodeTypeId => { - match node.parent_node().root(&roots) { + match node.parent_node().root() { Some(ref parent) if !parent.is_document() => return Err(HierarchyRequest), _ => () } @@ -1098,12 +1067,12 @@ impl Node { // Step 7-8. let referenceChild = match child { - Some(ref child) if child == node => node.next_sibling().map(|node| (*node.root(&roots)).clone()), + Some(ref child) if child == node => node.next_sibling().map(|node| (*node.root()).clone()), _ => child }; // Step 9. - let document = document_from_node(parent).root(&roots); + let document = document_from_node(parent).root(); Node::adopt(node, &*document); // Step 10. @@ -1157,12 +1126,11 @@ impl Node { // http://dom.spec.whatwg.org/#concept-node-replace-all fn replace_all(mut node: Option>, parent: &mut JSRef) { - let roots = RootCollection::new(); // Step 1. match node { Some(ref mut node) => { - let document = document_from_node(parent).root(&roots); + let document = document_from_node(parent).root(); Node::adopt(node, &*document); } None => (), @@ -1237,12 +1205,11 @@ impl Node { // http://dom.spec.whatwg.org/#concept-node-clone pub fn clone(node: &JSRef, maybe_doc: Option<&JSRef>, clone_children: CloneChildrenFlag) -> Temporary { - let roots = RootCollection::new(); // Step 1. let mut document = match maybe_doc { - Some(doc) => doc.unrooted().root(&roots), - None => node.owner_doc().root(&roots) + Some(doc) => doc.unrooted().root(), + None => node.owner_doc().root() }; // Step 2. @@ -1272,7 +1239,7 @@ impl Node { true => HTMLDocument, false => NonHTMLDocument }; - let window = document.window.root(&roots); + let window = document.window.root(); let document = Document::new(&*window, Some(document.url().clone()), is_html_doc, None); NodeCast::from_unrooted(document) @@ -1296,16 +1263,16 @@ impl Node { pi.characterdata.data.clone(), &*document); NodeCast::from_unrooted(pi) }, - }.root(&roots); + }.root(); // Step 3. let document = if copy.is_document() { let doc: &JSRef = DocumentCast::to_ref(&*copy).unwrap(); - doc.unrooted().root(&roots) + doc.unrooted().root() } else { - document.unrooted().root(&roots) + document.unrooted().root() }; - assert!(&*copy.owner_doc().root(&roots) == &*document); + assert!(&*copy.owner_doc().root() == &*document); // Step 4 (some data already copied in step 2). match node.get().type_id { @@ -1326,8 +1293,8 @@ impl Node { let copy_elem = copy_elem.get_mut(); // FIXME: https://github.com/mozilla/servo/issues/1737 copy_elem.namespace = node_elem.namespace.clone(); - let window = document.get().window.root(&roots); - for attr in node_elem.attrs.iter().map(|attr| attr.root(&roots)) { + let window = document.get().window.root(); + for attr in node_elem.attrs.iter().map(|attr| attr.root()) { copy_elem.attrs.push_unrooted( Attr::new(&*window, attr.deref().local_name.clone(), attr.deref().value.clone(), @@ -1343,7 +1310,7 @@ impl Node { // Step 6. if clone_children == CloneChildren { for ref child in node.children() { - let mut child_copy = Node::clone(&*child, Some(&*document), clone_children).root(&roots); + let mut child_copy = Node::clone(&*child, Some(&*document), clone_children).root(); let _inserted_node = Node::pre_insert(&mut *child_copy, &mut *copy, None); } } @@ -1462,10 +1429,9 @@ impl<'a> NodeMethods for JSRef<'a, Node> { // http://dom.spec.whatwg.org/#dom-node-parentelement fn GetParentElement(&self) -> Option> { - let roots = RootCollection::new(); self.parent_node.clone() .and_then(|parent| { - let parent = parent.root(&roots); + let parent = parent.root(); ElementCast::to_ref(&*parent).map(|elem| { Temporary::new_rooted(elem) }) @@ -1479,14 +1445,13 @@ impl<'a> NodeMethods for JSRef<'a, Node> { // http://dom.spec.whatwg.org/#dom-node-childnodes fn ChildNodes(&mut self) -> Temporary { - let roots = RootCollection::new(); match self.child_list { None => (), Some(ref list) => return Temporary::new(list.clone()), } - let doc = self.owner_doc().root(&roots); - let window = doc.deref().window.root(&roots); + let doc = self.owner_doc().root(); + let window = doc.deref().window.root(); let child_list = NodeList::new_child_list(&*window, self); self.child_list.assign(Some(child_list)); Temporary::new(self.child_list.get_ref().clone()) @@ -1542,12 +1507,11 @@ impl<'a> NodeMethods for JSRef<'a, Node> { // http://dom.spec.whatwg.org/#dom-node-textcontent fn GetTextContent(&self) -> Option { - let roots = RootCollection::new(); match self.type_id { DocumentFragmentNodeTypeId | ElementNodeTypeId(..) => { let mut content = ~""; - for node in self.traverse_preorder(&roots) { + for node in self.traverse_preorder() { if node.is_text() { let text: &JSRef = TextCast::to_ref(&node).unwrap(); content.push_str(text.get().characterdata.data.as_slice()); @@ -1571,7 +1535,6 @@ impl<'a> NodeMethods for JSRef<'a, Node> { // http://dom.spec.whatwg.org/#dom-node-textcontent fn SetTextContent(&mut self, value: Option) -> ErrorResult { - let roots = RootCollection::new(); let value = null_str_as_empty(&value); match self.type_id { DocumentFragmentNodeTypeId | @@ -1580,9 +1543,9 @@ impl<'a> NodeMethods for JSRef<'a, Node> { let node = if value.len() == 0 { None } else { - let document = self.owner_doc().root(&roots); + let document = self.owner_doc().root(); Some(NodeCast::from_unrooted(document.deref().CreateTextNode(value))) - }.root(&roots); + }.root(); // Step 3. Node::replace_all(node.root_ref(), self); @@ -1598,7 +1561,7 @@ impl<'a> NodeMethods for JSRef<'a, Node> { } // Notify the document that the content of this node is different - let document = self.owner_doc().root(&roots); + let document = self.owner_doc().root(); document.deref().content_changed(); } DoctypeNodeTypeId | @@ -1619,7 +1582,6 @@ impl<'a> NodeMethods for JSRef<'a, Node> { // http://dom.spec.whatwg.org/#concept-node-replace fn ReplaceChild(&mut self, node: &mut JSRef, child: &mut JSRef) -> Fallible> { - let roots = RootCollection::new(); // Step 1. match self.type_id() { @@ -1714,14 +1676,14 @@ impl<'a> NodeMethods for JSRef<'a, Node> { } // Step 7-8. - let next_sibling = child.next_sibling().map(|node| (*node.root(&roots)).clone()); + let next_sibling = child.next_sibling().map(|node| (*node.root()).clone()); let reference_child = match next_sibling { - Some(ref sibling) if sibling == node => node.next_sibling().map(|node| (*node.root(&roots)).clone()), + Some(ref sibling) if sibling == node => node.next_sibling().map(|node| (*node.root()).clone()), _ => next_sibling }; // Step 9. - let document = document_from_node(self).root(&roots); + let document = document_from_node(self).root(); Node::adopt(node, &*document); { @@ -1755,7 +1717,6 @@ impl<'a> NodeMethods for JSRef<'a, Node> { // http://dom.spec.whatwg.org/#dom-node-normalize fn Normalize(&mut self) { - let roots = RootCollection::new(); let mut prev_text = None; for mut child in self.children() { if child.is_text() { @@ -1818,12 +1779,11 @@ impl<'a> NodeMethods for JSRef<'a, Node> { characterdata.get().data == other_characterdata.get().data } fn is_equal_element_attrs(node: &JSRef, other: &JSRef) -> bool { - let roots = RootCollection::new(); let element: &JSRef = ElementCast::to_ref(node).unwrap(); let other_element: &JSRef = ElementCast::to_ref(other).unwrap(); assert!(element.get().attrs.len() == other_element.get().attrs.len()); - element.get().attrs.iter().map(|attr| attr.root(&roots)).all(|attr| { - other_element.get().attrs.iter().map(|attr| attr.root(&roots)).any(|other_attr| { + element.get().attrs.iter().map(|attr| attr.root()).all(|attr| { + other_element.get().attrs.iter().map(|attr| attr.root()).any(|other_attr| { (attr.namespace == other_attr.namespace) && (attr.local_name == other_attr.local_name) && (attr.value == other_attr.value) @@ -1868,7 +1828,6 @@ impl<'a> NodeMethods for JSRef<'a, Node> { // http://dom.spec.whatwg.org/#dom-node-comparedocumentposition fn CompareDocumentPosition(&self, other: &JSRef) -> u16 { - let roots = RootCollection::new(); if self == other { // step 2. 0 @@ -1907,7 +1866,7 @@ impl<'a> NodeMethods for JSRef<'a, Node> { NodeConstants::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC; } - for child in lastself.traverse_preorder(&roots) { + for child in lastself.traverse_preorder() { if &child == other { // step 6. return NodeConstants::DOCUMENT_POSITION_PRECEDING; @@ -1965,8 +1924,7 @@ pub fn document_from_node(derived: &JSRef) -> Temporary(derived: &JSRef) -> Temporary { - let roots = RootCollection::new(); - let document = document_from_node(derived).root(&roots); + let document = document_from_node(derived).root(); Temporary::new(document.deref().window.clone()) } diff --git a/src/components/script/dom/nodelist.rs b/src/components/script/dom/nodelist.rs index 7157c7ec061..5c02eca8d08 100644 --- a/src/components/script/dom/nodelist.rs +++ b/src/components/script/dom/nodelist.rs @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::codegen::BindingDeclarations::NodeListBinding; -use dom::bindings::js::{JS, JSRef, Temporary, RootCollection}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::node::{Node, NodeHelpers}; use dom::window::Window; @@ -54,23 +54,21 @@ pub trait NodeListMethods { impl<'a> NodeListMethods for JSRef<'a, NodeList> { fn Length(&self) -> u32 { - let roots = RootCollection::new(); match self.list_type { Simple(ref elems) => elems.len() as u32, Children(ref node) => { - let node = node.root(&roots); + let node = node.root(); node.deref().children().len() as u32 } } } fn Item(&self, index: u32) -> Option> { - let roots = RootCollection::new(); match self.list_type { _ if index >= self.Length() => None, Simple(ref elems) => Some(Temporary::new(elems.get(index as uint).clone())), Children(ref node) => { - let node = node.root(&roots); + let node = node.root(); node.deref().children().nth(index as uint) .map(|child| Temporary::new_rooted(&child)) } diff --git a/src/components/script/dom/testbinding.rs b/src/components/script/dom/testbinding.rs index 2c012c1b911..cade75c1f95 100644 --- a/src/components/script/dom/testbinding.rs +++ b/src/components/script/dom/testbinding.rs @@ -2,7 +2,7 @@ * 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::js::{JS, JSRef, RootCollection, Temporary}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::codegen::BindingDeclarations::TestBindingBinding; use dom::bindings::codegen::UnionTypes::HTMLElementOrLong; use self::TestBindingBinding::TestEnum; @@ -232,8 +232,7 @@ impl<'a> TestBindingMethods for JSRef<'a, TestBinding> { fn EnumAttribute(&self) -> TestEnum { _empty } fn SetEnumAttribute(&self, _: TestEnum) {} fn InterfaceAttribute(&self) -> Temporary { - let roots = RootCollection::new(); - let window = self.window.root(&roots); + let window = self.window.root(); Blob::new(&*window) } fn SetInterfaceAttribute(&self, _: &JSRef) {} @@ -268,8 +267,7 @@ impl<'a> TestBindingMethods for JSRef<'a, TestBinding> { fn SetStringAttributeNullable(&self, _: Option) {} fn GetEnumAttributeNullable(&self) -> Option { Some(_empty) } fn GetInterfaceAttributeNullable(&self) -> Option> { - let roots = RootCollection::new(); - let window = self.window.root(&roots); + let window = self.window.root(); Some(Blob::new(&(*window))) } fn SetInterfaceAttributeNullable(&self, _: Option>) {} diff --git a/src/components/script/dom/text.rs b/src/components/script/dom/text.rs index be62565f965..d286c7f5361 100644 --- a/src/components/script/dom/text.rs +++ b/src/components/script/dom/text.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::BindingDeclarations::TextBinding; use dom::bindings::codegen::InheritTypes::TextDerived; -use dom::bindings::js::{JS, JSRef, RootCollection, Temporary}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::error::Fallible; use dom::characterdata::CharacterData; use dom::document::Document; @@ -41,8 +41,7 @@ impl Text { } pub fn Constructor(owner: &JSRef, text: DOMString) -> Fallible> { - let roots = RootCollection::new(); - let document = owner.Document().root(&roots); + let document = owner.Document().root(); Ok(Text::new(text.clone(), &*document)) } } diff --git a/src/components/script/dom/uievent.rs b/src/components/script/dom/uievent.rs index 03140504400..90e4daa872b 100644 --- a/src/components/script/dom/uievent.rs +++ b/src/components/script/dom/uievent.rs @@ -4,7 +4,7 @@ use dom::bindings::codegen::BindingDeclarations::UIEventBinding; use dom::bindings::codegen::InheritTypes::{EventCast, UIEventDerived}; -use dom::bindings::js::{JS, JSRef, RootCollection, RootedReference, Temporary}; +use dom::bindings::js::{JS, JSRef, RootedReference, Temporary}; use dom::bindings::error::Fallible; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::event::{Event, EventMethods, EventTypeId, UIEventTypeId}; @@ -45,9 +45,8 @@ impl UIEvent { pub fn Constructor(owner: &JSRef, type_: DOMString, init: &UIEventBinding::UIEventInit) -> Fallible> { - let roots = RootCollection::new(); - let mut ev = UIEvent::new(owner).root(&roots); - let view = init.view.as_ref().map(|view| view.root(&roots)); + let mut ev = UIEvent::new(owner).root(); + let view = init.view.as_ref().map(|view| view.root()); ev.InitUIEvent(type_, init.parent.bubbles, init.parent.cancelable, view.root_ref(), init.detail); Ok(Temporary::new_rooted(&*ev)) diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index a0490c1621f..452f1c8640b 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -5,7 +5,7 @@ use dom::attr::AttrMethods; use dom::bindings::codegen::InheritTypes::{NodeBase, NodeCast, TextCast, ElementCast}; use dom::bindings::codegen::InheritTypes::HTMLIFrameElementCast; -use dom::bindings::js::{JS, JSRef, RootCollection, Temporary, OptionalRootable, Root}; +use dom::bindings::js::{JS, JSRef, Temporary, OptionalRootable, Root}; use dom::bindings::utils::Reflectable; use dom::document::{Document, DocumentHelpers}; use dom::element::{AttributeHandlers, HTMLLinkElementTypeId, HTMLIFrameElementTypeId}; @@ -76,21 +76,17 @@ pub struct HtmlParserResult { } trait NodeWrapping { - unsafe fn to_hubbub_node(&self, roots: &RootCollection) -> hubbub::NodeDataPtr; + unsafe fn to_hubbub_node(&self) -> hubbub::NodeDataPtr; } impl<'a, T: NodeBase+Reflectable> NodeWrapping for JSRef<'a, T> { - unsafe fn to_hubbub_node(&self, roots: &RootCollection) -> hubbub::NodeDataPtr { - roots.root_raw(self.reflector().get_jsobject()); + unsafe fn to_hubbub_node(&self) -> hubbub::NodeDataPtr { cast::transmute(self.get()) } } -unsafe fn from_hubbub_node(n: hubbub::NodeDataPtr, - roots: Option<&RootCollection>) -> Temporary { - let js = JS::from_raw(cast::transmute(n)); - let _ = roots.map(|roots| roots.unroot_raw(js.reflector().get_jsobject())); - Temporary::new(js) +unsafe fn from_hubbub_node(n: hubbub::NodeDataPtr) -> Temporary { + Temporary::new(JS::from_raw(cast::transmute(n))) } /** @@ -297,9 +293,8 @@ pub fn parse_html(page: &Page, let mut parser = hubbub::Parser("UTF-8", false); debug!("created parser"); - let roots = RootCollection::new(); - parser.set_document_node(unsafe { document.to_hubbub_node(&roots) }); + parser.set_document_node(unsafe { document.to_hubbub_node() }); parser.enable_scripting(true); parser.enable_styling(true); @@ -315,9 +310,9 @@ pub fn parse_html(page: &Page, // NOTE: tmp vars are workaround for lifetime issues. Both required. let tmp_borrow = doc_cell.borrow(); let tmp = &*tmp_borrow; - let comment = Comment::new(data, *tmp).root(&roots); + let comment = Comment::new(data, *tmp).root(); let comment: &JSRef = NodeCast::from_ref(&*comment); - unsafe { comment.to_hubbub_node(&roots) } + unsafe { comment.to_hubbub_node() } }, create_doctype: |doctype: ~hubbub::Doctype| { debug!("create doctype"); @@ -328,9 +323,9 @@ pub fn parse_html(page: &Page, // NOTE: tmp vars are workaround for lifetime issues. Both required. let tmp_borrow = doc_cell.borrow(); let tmp = &*tmp_borrow; - let doctype_node = DocumentType::new(name, public_id, system_id, *tmp).root(&roots); + let doctype_node = DocumentType::new(name, public_id, system_id, *tmp).root(); unsafe { - doctype_node.deref().to_hubbub_node(&roots) + doctype_node.deref().to_hubbub_node() } }, create_element: |tag: ~hubbub::Tag| { @@ -338,7 +333,7 @@ pub fn parse_html(page: &Page, // NOTE: tmp vars are workaround for lifetime issues. Both required. let tmp_borrow = doc_cell.borrow(); let tmp = &*tmp_borrow; - let mut element = build_element_from_tag(tag.name.clone(), *tmp).root(&roots); + let mut element = build_element_from_tag(tag.name.clone(), *tmp).root(); debug!("-- attach attrs"); for attr in tag.attributes.iter() { @@ -351,15 +346,15 @@ pub fn parse_html(page: &Page, //FIXME: workaround for https://github.com/mozilla/rust/issues/13246; // we get unrooting order failures if these are inside the match. let rel = { - let rel = element.get_attribute(Null, "rel").root(&roots); + let rel = element.get_attribute(Null, "rel").root(); rel.map(|a| a.deref().Value()) }; let href = { - let href= element.get_attribute(Null, "href").root(&roots); + let href= element.get_attribute(Null, "href").root(); href.map(|a| a.deref().Value()) }; let src_opt = { - let src_opt = element.get_attribute(Null, "src").root(&roots); + let src_opt = element.get_attribute(Null, "src").root(); src_opt.map(|a| a.deref().Value()) }; @@ -410,23 +405,23 @@ pub fn parse_html(page: &Page, _ => {} } - unsafe { element.to_hubbub_node(&roots) } + unsafe { element.to_hubbub_node() } }, create_text: |data: ~str| { debug!("create text"); // NOTE: tmp vars are workaround for lifetime issues. Both required. let tmp_borrow = doc_cell.borrow(); let tmp = &*tmp_borrow; - let text = Text::new(data, *tmp).root(&roots); - unsafe { text.deref().to_hubbub_node(&roots) } + let text = Text::new(data, *tmp).root(); + unsafe { text.deref().to_hubbub_node() } }, ref_node: |_| {}, unref_node: |_| {}, append_child: |parent: hubbub::NodeDataPtr, child: hubbub::NodeDataPtr| { unsafe { debug!("append child {:x} {:x}", parent, child); - let mut child = from_hubbub_node(child, Some(&roots)).root(&roots); - let mut parent: Root = from_hubbub_node(parent, None).root(&roots); + let mut child = from_hubbub_node(child).root(); + let mut parent: Root = from_hubbub_node(parent).root(); assert!(parent.AppendChild(&mut *child).is_ok()); } child @@ -478,8 +473,8 @@ pub fn parse_html(page: &Page, }, complete_script: |script| { unsafe { - let script: &JSRef = &*from_hubbub_node(script, None).root(&roots); - match script.get_attribute(Null, "src").root(&roots) { + let script: &JSRef = &*from_hubbub_node(script).root(); + match script.get_attribute(Null, "src").root() { Some(src) => { debug!("found script: {:s}", src.deref().Value()); let new_url = parse_url(src.get().value_ref(), Some(url3.clone())); diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs index 2bfe058cc65..fe609cfc467 100644 --- a/src/components/script/script_task.rs +++ b/src/components/script/script_task.rs @@ -278,12 +278,11 @@ impl Page { /// Adds the given damage. pub fn damage(&self, level: DocumentDamageLevel) { - let roots = RootCollection::new(); let root = match *self.frame() { None => return, - Some(ref frame) => frame.document.root(&roots).GetDocumentElement() + Some(ref frame) => frame.document.root().GetDocumentElement() }; - match root.root(&roots) { + match root.root() { None => {}, Some(root) => { let root: &JSRef = NodeCast::from_ref(&*root); @@ -358,16 +357,15 @@ impl Page { goal: ReflowGoal, script_chan: ScriptChan, compositor: &ScriptListener) { - let roots = RootCollection::new(); let root = match *self.frame() { None => return, Some(ref frame) => { - frame.document.root(&roots).GetDocumentElement() + frame.document.root().GetDocumentElement() } }; - match root.root(&roots) { + match root.root() { None => {}, Some(root) => { debug!("script: performing reflow for goal {:?}", goal); @@ -411,17 +409,16 @@ impl Page { } fn find_fragment_node(&self, fragid: ~str) -> Option> { - let roots = RootCollection::new(); - let document = self.frame().get_ref().document.root(&roots); + let document = self.frame().get_ref().document.root(); match document.deref().GetElementById(fragid.to_owned()) { Some(node) => Some(node), None => { let doc_node: &JSRef = NodeCast::from_ref(&*document); - let mut anchors = doc_node.traverse_preorder(&roots) + let mut anchors = doc_node.traverse_preorder() .filter(|node| node.is_anchor_element()); anchors.find(|node| { let elem: &JSRef = ElementCast::to_ref(node).unwrap(); - elem.get_attribute(Null, "name").root(&roots).map_or(false, |attr| { + elem.get_attribute(Null, "name").root().map_or(false, |attr| { attr.get().value_ref() == fragid }) }).map(|node| Temporary::new_rooted(ElementCast::to_ref(&node).unwrap())) @@ -450,10 +447,9 @@ impl Page { } pub fn hit_test(&self, point: &Point2D) -> Option { - let roots = RootCollection::new(); let frame = self.frame(); - let document = frame.get_ref().document.root(&roots); - let root = document.deref().GetDocumentElement().root(&roots); + let document = frame.get_ref().document.root(); + let root = document.deref().GetDocumentElement().root(); if root.is_none() { return None; } @@ -473,10 +469,9 @@ impl Page { } pub fn get_nodes_under_mouse(&self, point: &Point2D) -> Option> { - let roots = RootCollection::new(); let frame = self.frame(); - let document = frame.get_ref().document.root(&roots); - let root = document.deref().GetDocumentElement().root(&roots); + let document = frame.get_ref().document.root(); + let root = document.deref().GetDocumentElement().root(); if root.is_none() { return None; } @@ -763,13 +758,12 @@ impl ScriptTask { /// Handles a timer that fired. fn handle_fire_timer_msg(&self, id: PipelineId, timer_id: TimerId) { - let roots = RootCollection::new(); let mut page_tree = self.page_tree.borrow_mut(); let page = page_tree.find(id).expect("ScriptTask: received fire timer msg for a pipeline ID not associated with this script task. This is a bug.").page(); let frame = page.frame(); - let mut window = frame.get_ref().window.root(&roots); + let mut window = frame.get_ref().window.root(); let is_interval; match window.get().active_timers.find(&timer_id) { @@ -880,7 +874,6 @@ impl ScriptTask { fn load(&self, pipeline_id: PipelineId, url: Url) { debug!("ScriptTask: loading {:?} on page {:?}", url, pipeline_id); - let roots = RootCollection::new(); let mut page_tree = self.page_tree.borrow_mut(); let page_tree = page_tree.find(pipeline_id).expect("ScriptTask: received a load @@ -907,9 +900,9 @@ impl ScriptTask { page_tree.page.clone(), self.chan.clone(), self.compositor.dup(), - self.image_cache_task.clone()).root(&roots); + self.image_cache_task.clone()).root(); page.initialize_js_info(cx.clone(), window.reflector().get_jsobject()); - let mut document = Document::new(&*window, Some(url.clone()), HTMLDocument, None).root(&roots); + let mut document = Document::new(&*window, Some(url.clone()), HTMLDocument, None).root(); window.get_mut().init_browser_context(&*document); { @@ -1010,7 +1003,7 @@ impl ScriptTask { // We have no concept of a document loader right now, so just dispatch the // "load" event as soon as we've finished executing all scripts parsed during // the initial load. - let mut event = Event::new(&*window).root(&roots); + let mut event = Event::new(&*window).root(); event.InitEvent(~"load", false, false); let doctarget: &JSRef = EventTargetCast::from_ref(&*document); let wintarget: &JSRef = EventTargetCast::from_ref(&*window); @@ -1048,7 +1041,6 @@ impl ScriptTask { match event { ResizeEvent(new_width, new_height) => { - let roots = RootCollection::new(); debug!("script got resize event: {:u}, {:u}", new_width, new_height); let window = { @@ -1066,7 +1058,7 @@ impl ScriptTask { } let mut fragment_node = page.fragment_node.deref().borrow_mut(); - match fragment_node.take().map(|node| node.root(&roots)) { + match fragment_node.take().map(|node| node.root()) { Some(node) => self.scroll_fragment_point(pipeline_id, &*node), None => {} } @@ -1074,11 +1066,11 @@ impl ScriptTask { frame.as_ref().map(|frame| Temporary::new(frame.window.clone())) }; - match window.root(&roots) { + match window.root() { Some(mut window) => { // http://dev.w3.org/csswg/cssom-view/#resizing-viewports // https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#event-type-resize - let mut uievent = UIEvent::new(&*window).root(&roots); + let mut uievent = UIEvent::new(&*window).root(); uievent.InitUIEvent(~"resize", false, false, Some((*window).clone()), 0i32); let event: &mut JSRef = EventCast::from_mut_ref(&mut *uievent); @@ -1104,7 +1096,6 @@ impl ScriptTask { } ClickEvent(_button, point) => { - let roots = RootCollection::new(); debug!("ClickEvent: clicked at {:?}", point); let mut page_tree = self.page_tree.borrow_mut(); let page = get_page(&mut *page_tree, pipeline_id); @@ -1113,14 +1104,14 @@ impl ScriptTask { debug!("node address is {:?}", node_address); let mut node = node::from_untrusted_node_address(self.js_runtime.deref().ptr, - node_address).root(&roots); + node_address).root(); debug!("clicked on {:s}", node.deref().debug_str()); // Traverse node generations until a node that is an element is // found. while !node.deref().is_element() { match node.deref().parent_node() { - Some(parent) => node = parent.root(&roots), + Some(parent) => node = parent.root(), None => break, } } @@ -1139,7 +1130,6 @@ impl ScriptTask { MouseDownEvent(..) => {} MouseUpEvent(..) => {} MouseMoveEvent(point) => { - let roots = RootCollection::new(); let mut page_tree = self.page_tree.borrow_mut(); let page = get_page(&mut *page_tree, pipeline_id); match page.get_nodes_under_mouse(&point) { @@ -1152,7 +1142,7 @@ impl ScriptTask { match *mouse_over_targets { Some(ref mut mouse_over_targets) => { for node in mouse_over_targets.mut_iter() { - let mut node = node.root(&roots); + let mut node = node.root(); node.set_hover_state(false); } } @@ -1162,12 +1152,12 @@ impl ScriptTask { for node_address in node_address.iter() { let mut node = node::from_untrusted_node_address( - self.js_runtime.deref().ptr, *node_address).root(&roots); + self.js_runtime.deref().ptr, *node_address).root(); // Traverse node generations until a node that is an element is // found. while !node.is_element() { match node.parent_node() { - Some(parent) => node = parent.root(&roots), + Some(parent) => node = parent.root(), None => break, } } @@ -1211,10 +1201,9 @@ impl ScriptTask { } fn load_url_from_element(&self, page: &Page, element: &JSRef) { - let roots = RootCollection::new(); // if the node's element is "a," load url from href attr let attr = element.get_attribute(Null, "href"); - for href in attr.root(&roots).iter() { + for href in attr.root().iter() { debug!("ScriptTask: clicked on link to {:s}", href.Value()); let click_frag = href.get().value_ref().starts_with("#"); let base_url = Some(page.get_url()); @@ -1222,7 +1211,7 @@ impl ScriptTask { let url = parse_url(href.get().value_ref(), base_url); if click_frag { - match page.find_fragment_node(url.fragment.unwrap()).root(&roots) { + match page.find_fragment_node(url.fragment.unwrap()).root() { Some(node) => self.scroll_fragment_point(page.id, &*node), None => {} }