From 12dc54d23849f6bc90667e2df432e30587e4af49 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Tue, 16 Sep 2014 01:28:36 +0530 Subject: [PATCH 1/6] Add unrooted_must_root lint for enums and structs containing JS, as well as functions with JS in their parameter list For safe wrappers over JS (eg Temporary) use #[allow(unrooted_must_root)]. For all other types containing a #[must_root] value, annotate the type with #[must_root] to ensure that it is never used unrooted --- components/macros/lib.rs | 74 ++++++++++++++++++- components/script/dom/attr.rs | 1 + .../dom/bindings/codegen/CodegenRust.py | 5 +- components/script/dom/bindings/global.rs | 1 + components/script/dom/bindings/js.rs | 2 + components/script/dom/browsercontext.rs | 1 + .../script/dom/canvasrenderingcontext2d.rs | 1 + components/script/dom/document.rs | 1 + components/script/dom/domimplementation.rs | 1 + components/script/dom/domparser.rs | 1 + components/script/dom/domrectlist.rs | 1 + components/script/dom/domtokenlist.rs | 1 + components/script/dom/formdata.rs | 2 + components/script/dom/htmlcollection.rs | 2 + components/script/dom/namednodemap.rs | 1 + components/script/dom/node.rs | 1 + components/script/dom/nodelist.rs | 4 + components/script/dom/performance.rs | 1 + components/script/dom/testbinding.rs | 1 + components/script/dom/worker.rs | 1 + components/script/dom/xmlhttprequest.rs | 1 + components/script/page.rs | 1 + 22 files changed, 101 insertions(+), 4 deletions(-) diff --git a/components/macros/lib.rs b/components/macros/lib.rs index 554d9833c98..9191af72ce8 100644 --- a/components/macros/lib.rs +++ b/components/macros/lib.rs @@ -16,18 +16,23 @@ extern crate rustc; extern crate sync; use syntax::ast; +use syntax::attr::AttrMetaMethods; use rustc::lint::{Context, LintPass, LintPassObject, LintArray}; use rustc::plugin::Registry; use rustc::middle::ty::expr_ty; +use rustc::middle::{ty, def}; use rustc::middle::typeck::astconv::AstConv; use rustc::util::ppaux::Repr; declare_lint!(TRANSMUTE_TYPE_LINT, Allow, "Warn and report types being transmuted") +declare_lint!(UNROOTED_MUST_ROOT, Deny, + "Warn and report usage of unrooted jsmanaged objects") -struct Pass; +struct TransmutePass; +struct UnrootedPass; -impl LintPass for Pass { +impl LintPass for TransmutePass { fn get_lints(&self) -> LintArray { lint_array!(TRANSMUTE_TYPE_LINT) } @@ -56,9 +61,72 @@ impl LintPass for Pass { } } +fn lint_unrooted_ty(cx: &Context, ty: &ast::Ty, warning: &str) { + match ty.node { + ast::TyPath(_, _, id) => { + match cx.tcx.def_map.borrow().get_copy(&id) { + def::DefTy(def_id) => { + if ty::has_attr(cx.tcx, def_id, "must_root") { + cx.span_lint(UNROOTED_MUST_ROOT, ty.span, warning); + } + } + _ => (), + } + } + _ => (), + } +} + +impl LintPass for UnrootedPass { + fn get_lints(&self) -> LintArray { + lint_array!(UNROOTED_MUST_ROOT) + } + + fn check_struct_def(&mut self, cx: &Context, def: &ast::StructDef, _i: ast::Ident, _gen: &ast::Generics, id: ast::NodeId) { + if cx.tcx.map.expect_item(id).attrs.iter().all(|a| !a.check_name("must_root")) { + for ref field in def.fields.iter() { + lint_unrooted_ty(cx, &*field.node.ty, "Type must be rooted, use #[must_root] on the struct definition to propagate"); + } + } + } + + fn check_variant(&mut self, cx: &Context, var: &ast::Variant, _gen: &ast::Generics) { + let ref map = cx.tcx.map; + if map.expect_item(map.get_parent(var.node.id)).attrs.iter().all(|a| !a.check_name("must_root")) { + match var.node.kind { + ast::TupleVariantKind(ref vec) => { + for ty in vec.iter() { + lint_unrooted_ty(cx, &*ty.ty, "Type must be rooted, use #[must_root] on the enum definition to propagate") + } + } + _ => () // Struct variants already caught by check_struct_def + } + } + } + + fn check_fn(&mut self, cx: &Context, kind: &syntax::visit::FnKind, decl: &ast::FnDecl, block: &ast::Block, _span: syntax::codemap::Span, _id: ast::NodeId) { + match *kind { + syntax::visit::FkItemFn(i, _, _, _) | + syntax::visit::FkMethod(i, _, _) if i.as_str() == "new" || i.as_str() == "new_inherited" => { + + } + _ => () + } + match block.rules { + ast::DefaultBlock => { + for arg in decl.inputs.iter() { + lint_unrooted_ty(cx, &*arg.ty, "Type must be rooted, use #[must_root] on the struct definition to propagate") + } + } + _ => () // fn is `unsafe` + } + } +} + #[plugin_registrar] pub fn plugin_registrar(reg: &mut Registry) { - reg.register_lint_pass(box Pass as LintPassObject); + reg.register_lint_pass(box TransmutePass as LintPassObject); + reg.register_lint_pass(box UnrootedPass as LintPassObject); } #[macro_export] diff --git a/components/script/dom/attr.rs b/components/script/dom/attr.rs index 4da59b96b55..a931ba4e5b3 100644 --- a/components/script/dom/attr.rs +++ b/components/script/dom/attr.rs @@ -71,6 +71,7 @@ impl Str for AttrValue { } #[deriving(Encodable)] +#[must_root] pub struct Attr { reflector_: Reflector, local_name: Atom, diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 1666589940e..4d0f8bdb682 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -2868,7 +2868,10 @@ class CGUnionStruct(CGThing): enumConversions = [ " e%s(ref inner) => inner.to_jsval(cx)," % v["name"] for v in templateVars ] - return ("""pub enum %s { + # XXXManishearth The following should be #[must_root], + # however we currently allow it till #2661 is fixed + return ("""#[allow(unrooted_must_root)] +pub enum %s { %s } diff --git a/components/script/dom/bindings/global.rs b/components/script/dom/bindings/global.rs index 35b94d0e472..e3b3f9cca1e 100644 --- a/components/script/dom/bindings/global.rs +++ b/components/script/dom/bindings/global.rs @@ -34,6 +34,7 @@ pub enum GlobalRoot<'a, 'b> { /// A traced reference to a global object, for use in fields of traced Rust /// structures. #[deriving(Encodable)] +#[must_root] pub enum GlobalField { WindowField(JS), WorkerField(JS), diff --git a/components/script/dom/bindings/js.rs b/components/script/dom/bindings/js.rs index ab8b3e3c7f5..c77ae3cba17 100644 --- a/components/script/dom/bindings/js.rs +++ b/components/script/dom/bindings/js.rs @@ -61,6 +61,7 @@ use std::mem; /// Importantly, it requires explicit rooting in order to interact with the inner value. /// Can be assigned into JS-owned member fields (i.e. `JS` types) safely via the /// `JS::assign` method or `OptionalSettable::assign` (for `Option>` fields). +#[allow(unrooted_must_root)] pub struct Temporary { inner: JS, /// On-stack JS pointer to assuage conservative stack scanner @@ -106,6 +107,7 @@ impl Temporary { } /// A rooted, JS-owned value. Must only be used as a field in other JS-owned types. +#[must_root] pub struct JS { ptr: *const T } diff --git a/components/script/dom/browsercontext.rs b/components/script/dom/browsercontext.rs index a54477a2ff8..b4cbb6be336 100644 --- a/components/script/dom/browsercontext.rs +++ b/components/script/dom/browsercontext.rs @@ -67,6 +67,7 @@ impl BrowserContext { } #[deriving(Encodable)] +#[must_root] pub struct SessionHistoryEntry { document: JS, children: Vec diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index 6b3f898123f..6297a0718d8 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -17,6 +17,7 @@ use geom::size::Size2D; use canvas::canvas_render_task::{CanvasMsg, CanvasRenderTask, ClearRect, Close, FillRect, Recreate, StrokeRect}; #[deriving(Encodable)] +#[must_root] pub struct CanvasRenderingContext2D { reflector_: Reflector, global: GlobalField, diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 8f8f8e5c607..97fb575fc01 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -69,6 +69,7 @@ pub enum IsHTMLDocument { } #[deriving(Encodable)] +#[must_root] pub struct Document { pub node: Node, reflector_: Reflector, diff --git a/components/script/dom/domimplementation.rs b/components/script/dom/domimplementation.rs index 0dbb842ebe4..36d74258ca7 100644 --- a/components/script/dom/domimplementation.rs +++ b/components/script/dom/domimplementation.rs @@ -23,6 +23,7 @@ use dom::text::Text; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct DOMImplementation { document: JS, reflector_: Reflector, diff --git a/components/script/dom/domparser.rs b/components/script/dom/domparser.rs index 65273cab756..d8362fa1e80 100644 --- a/components/script/dom/domparser.rs +++ b/components/script/dom/domparser.rs @@ -14,6 +14,7 @@ use dom::window::Window; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct DOMParser { window: JS, //XXXjdm Document instead? reflector_: Reflector diff --git a/components/script/dom/domrectlist.rs b/components/script/dom/domrectlist.rs index 0c661c4a51d..450e87eda6d 100644 --- a/components/script/dom/domrectlist.rs +++ b/components/script/dom/domrectlist.rs @@ -11,6 +11,7 @@ use dom::domrect::DOMRect; use dom::window::Window; #[deriving(Encodable)] +#[must_root] pub struct DOMRectList { reflector_: Reflector, rects: Vec>, diff --git a/components/script/dom/domtokenlist.rs b/components/script/dom/domtokenlist.rs index 7c1b1fc3365..e57f0310ec5 100644 --- a/components/script/dom/domtokenlist.rs +++ b/components/script/dom/domtokenlist.rs @@ -17,6 +17,7 @@ use servo_util::namespace::Null; use servo_util::str::{DOMString, HTML_SPACE_CHARACTERS}; #[deriving(Encodable)] +#[must_root] pub struct DOMTokenList { reflector_: Reflector, element: JS, diff --git a/components/script/dom/formdata.rs b/components/script/dom/formdata.rs index 0de17b83107..3e39a1009aa 100644 --- a/components/script/dom/formdata.rs +++ b/components/script/dom/formdata.rs @@ -19,12 +19,14 @@ use std::cell::RefCell; use std::collections::hashmap::HashMap; #[deriving(Encodable, Clone)] +#[must_root] pub enum FormDatum { StringData(DOMString), FileData(JS) } #[deriving(Encodable)] +#[must_root] pub struct FormData { data: Traceable>>>, reflector_: Reflector, diff --git a/components/script/dom/htmlcollection.rs b/components/script/dom/htmlcollection.rs index 5bef6c56ff5..bd07b82e53e 100644 --- a/components/script/dom/htmlcollection.rs +++ b/components/script/dom/htmlcollection.rs @@ -30,12 +30,14 @@ impl, E> Encodable for Box { } #[deriving(Encodable)] +#[must_root] pub enum CollectionTypeId { Static(Vec>), Live(JS, Box) } #[deriving(Encodable)] +#[must_root] pub struct HTMLCollection { collection: CollectionTypeId, reflector_: Reflector, diff --git a/components/script/dom/namednodemap.rs b/components/script/dom/namednodemap.rs index d60160133c9..6faf74aa564 100644 --- a/components/script/dom/namednodemap.rs +++ b/components/script/dom/namednodemap.rs @@ -12,6 +12,7 @@ use dom::element::Element; use dom::window::Window; #[deriving(Encodable)] +#[must_root] pub struct NamedNodeMap { reflector_: Reflector, owner: JS, diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index f419798a110..90dd959e10f 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -850,6 +850,7 @@ impl<'a> Iterator> for TreeIterator<'a> { } } +#[must_root] pub struct NodeIterator { pub start_node: JS, pub current_node: Option>, diff --git a/components/script/dom/nodelist.rs b/components/script/dom/nodelist.rs index 424eb09416c..0ebd2e0db25 100644 --- a/components/script/dom/nodelist.rs +++ b/components/script/dom/nodelist.rs @@ -11,18 +11,21 @@ use dom::node::{Node, NodeHelpers}; use dom::window::Window; #[deriving(Encodable)] +#[must_root] pub enum NodeListType { Simple(Vec>), Children(JS) } #[deriving(Encodable)] +#[must_root] pub struct NodeList { list_type: NodeListType, reflector_: Reflector, } impl NodeList { + #[allow(unrooted_must_root)] pub fn new_inherited(list_type: NodeListType) -> NodeList { NodeList { list_type: list_type, @@ -30,6 +33,7 @@ impl NodeList { } } + #[allow(unrooted_must_root)] pub fn new(window: &JSRef, list_type: NodeListType) -> Temporary { reflect_dom_object(box NodeList::new_inherited(list_type), diff --git a/components/script/dom/performance.rs b/components/script/dom/performance.rs index 82b931b0c2e..fc57eaba869 100644 --- a/components/script/dom/performance.rs +++ b/components/script/dom/performance.rs @@ -14,6 +14,7 @@ use time; pub type DOMHighResTimeStamp = f64; #[deriving(Encodable)] +#[must_root] pub struct Performance { reflector_: Reflector, timing: JS, diff --git a/components/script/dom/testbinding.rs b/components/script/dom/testbinding.rs index b5d83fac620..222223d7f44 100644 --- a/components/script/dom/testbinding.rs +++ b/components/script/dom/testbinding.rs @@ -19,6 +19,7 @@ use js::jsapi::JSContext; use js::jsval::{JSVal, NullValue}; #[deriving(Encodable)] +#[must_root] pub struct TestBinding { reflector: Reflector, global: GlobalField, diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs index 3119b4c96f2..a34d47cef9b 100644 --- a/components/script/dom/worker.rs +++ b/components/script/dom/worker.rs @@ -30,6 +30,7 @@ use std::ptr; pub struct TrustedWorkerAddress(pub *const c_void); #[deriving(Encodable)] +#[must_root] pub struct Worker { eventtarget: EventTarget, refcount: Cell, diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index b2bfd64eb4e..0b48355a3d8 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -98,6 +98,7 @@ enum SyncOrAsync<'a, 'b> { #[deriving(Encodable)] +#[must_root] pub struct XMLHttpRequest { eventtarget: XMLHttpRequestEventTarget, ready_state: Traceable>, diff --git a/components/script/page.rs b/components/script/page.rs index cf532783c8b..6e8f414ef8d 100644 --- a/components/script/page.rs +++ b/components/script/page.rs @@ -425,6 +425,7 @@ impl Page { /// Information for one frame in the browsing context. #[deriving(Encodable)] +#[must_root] pub struct Frame { /// The document for this frame. pub document: JS, From bded5c370344c5ed77b706c36e0caf911fbe4e3d Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Tue, 16 Sep 2014 22:35:41 +0530 Subject: [PATCH 2/6] Add unrooted_must_root lint for usages of JS in let/for bindings --- components/layout/lib.rs | 1 + components/macros/lib.rs | 44 +++++++++++++++++++--- components/script/dom/attr.rs | 4 +- components/script/dom/bindings/callback.rs | 1 + components/script/dom/bindings/utils.rs | 2 + components/script/dom/document.rs | 4 +- components/script/dom/element.rs | 1 + components/script/dom/formdata.rs | 3 +- components/script/dom/performance.rs | 4 +- components/script/dom/xmlhttprequest.rs | 5 +-- components/script/lib.rs | 1 + 11 files changed, 55 insertions(+), 15 deletions(-) diff --git a/components/layout/lib.rs b/components/layout/lib.rs index 8cd1b44b4e2..1a50cf6a865 100644 --- a/components/layout/lib.rs +++ b/components/layout/lib.rs @@ -8,6 +8,7 @@ #![feature(globs, macro_rules, phase, thread_local, unsafe_destructor)] #![deny(unused_imports, unused_variable)] +#![allow(unrooted_must_root)] #[phase(plugin, link)] extern crate log; diff --git a/components/macros/lib.rs b/components/macros/lib.rs index 9191af72ce8..5b9aa64a52d 100644 --- a/components/macros/lib.rs +++ b/components/macros/lib.rs @@ -85,7 +85,8 @@ impl LintPass for UnrootedPass { fn check_struct_def(&mut self, cx: &Context, def: &ast::StructDef, _i: ast::Ident, _gen: &ast::Generics, id: ast::NodeId) { if cx.tcx.map.expect_item(id).attrs.iter().all(|a| !a.check_name("must_root")) { for ref field in def.fields.iter() { - lint_unrooted_ty(cx, &*field.node.ty, "Type must be rooted, use #[must_root] on the struct definition to propagate"); + lint_unrooted_ty(cx, &*field.node.ty, + "Type must be rooted, use #[must_root] on the struct definition to propagate"); } } } @@ -96,7 +97,8 @@ impl LintPass for UnrootedPass { match var.node.kind { ast::TupleVariantKind(ref vec) => { for ty in vec.iter() { - lint_unrooted_ty(cx, &*ty.ty, "Type must be rooted, use #[must_root] on the enum definition to propagate") + lint_unrooted_ty(cx, &*ty.ty, + "Type must be rooted, use #[must_root] on the enum definition to propagate") } } _ => () // Struct variants already caught by check_struct_def @@ -104,23 +106,55 @@ impl LintPass for UnrootedPass { } } - fn check_fn(&mut self, cx: &Context, kind: &syntax::visit::FnKind, decl: &ast::FnDecl, block: &ast::Block, _span: syntax::codemap::Span, _id: ast::NodeId) { + fn check_fn(&mut self, cx: &Context, kind: &syntax::visit::FnKind, decl: &ast::FnDecl, + block: &ast::Block, _span: syntax::codemap::Span, _id: ast::NodeId) { match *kind { syntax::visit::FkItemFn(i, _, _, _) | syntax::visit::FkMethod(i, _, _) if i.as_str() == "new" || i.as_str() == "new_inherited" => { - + return; } _ => () } match block.rules { ast::DefaultBlock => { for arg in decl.inputs.iter() { - lint_unrooted_ty(cx, &*arg.ty, "Type must be rooted, use #[must_root] on the struct definition to propagate") + lint_unrooted_ty(cx, &*arg.ty, + "Type must be rooted, use #[must_root] on the struct definition to propagate") } } _ => () // fn is `unsafe` } } + + // Partially copied from rustc::middle::lint::builtin + // Catches `let` statements which store a #[must_root] value + // Expressions which return out of blocks eventually end up in a `let` + // statement or a function return (which will be caught when it is used elsewhere) + fn check_stmt(&mut self, cx: &Context, s: &ast::Stmt) { + // Catch the let binding + let expr = match s.node { + ast::StmtDecl(ref decl, _) => match decl.node { + ast::DeclLocal(ref loc) => match loc.init { + Some(ref e) => &**e, + _ => return + }, + _ => return + }, + _ => return + }; + + let t = expr_ty(cx.tcx, &*expr); + match ty::get(t).sty { + ty::ty_struct(did, _) | + ty::ty_enum(did, _) => { + if ty::has_attr(cx.tcx, did, "must_root") { + cx.span_lint(UNROOTED_MUST_ROOT, expr.span, + format!("Expression of type {} must be rooted", t.repr(cx.tcx)).as_slice()); + } + } + _ => {} + } + } } #[plugin_registrar] diff --git a/components/script/dom/attr.rs b/components/script/dom/attr.rs index a931ba4e5b3..be419eb2a61 100644 --- a/components/script/dom/attr.rs +++ b/components/script/dom/attr.rs @@ -108,8 +108,8 @@ impl Attr { pub fn new(window: &JSRef, local_name: Atom, value: AttrValue, name: Atom, namespace: Namespace, prefix: Option, owner: &JSRef) -> Temporary { - let attr = Attr::new_inherited(local_name, value, name, namespace, prefix, owner); - reflect_dom_object(box attr, &Window(*window), AttrBinding::Wrap) + reflect_dom_object(box Attr::new_inherited(local_name, value, name, namespace, prefix, owner), + &Window(*window), AttrBinding::Wrap) } } diff --git a/components/script/dom/bindings/callback.rs b/components/script/dom/bindings/callback.rs index 266abc3ab10..95b16478b79 100644 --- a/components/script/dom/bindings/callback.rs +++ b/components/script/dom/bindings/callback.rs @@ -139,6 +139,7 @@ pub struct CallSetup { impl CallSetup { /// Performs the setup needed to make a call. + #[allow(unrooted_must_root)] pub fn new(callback: &T, handling: ExceptionHandling) -> CallSetup { let global = global_object_for_js_object(callback.callback()); let global = global.root(); diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs index 08b65dd084d..ae9a19a3a29 100644 --- a/components/script/dom/bindings/utils.rs +++ b/components/script/dom/bindings/utils.rs @@ -668,6 +668,7 @@ pub extern fn outerize_global(_cx: *mut JSContext, obj: JSHandleObject) -> *mut } /// Returns the global object of the realm that the given JS object was created in. +#[allow(unrooted_must_root)] pub fn global_object_for_js_object(obj: *mut JSObject) -> GlobalField { unsafe { let global = GetGlobalForObjectCrossCompartment(obj); @@ -689,6 +690,7 @@ pub fn global_object_for_js_object(obj: *mut JSObject) -> GlobalField { /// Get the `JSContext` for the `JSRuntime` associated with the thread /// this object is on. +#[allow(unrooted_must_root)] fn cx_for_dom_reflector(obj: *mut JSObject) -> *mut JSContext { let global = global_object_for_js_object(obj); let global = global.root(); diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 97fb575fc01..5f2661f9e10 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -310,8 +310,8 @@ impl Document { } pub fn new(window: &JSRef, url: Option, doctype: IsHTMLDocument, content_type: Option) -> Temporary { - let document = Document::new_inherited(window, url, doctype, content_type); - let document = reflect_dom_object(box document, &Window(*window), + let document = reflect_dom_object(box Document::new_inherited(window, url, doctype, content_type), + &Window(*window), DocumentBinding::Wrap).root(); let node: &JSRef = NodeCast::from_ref(&*document); diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 2150e67f0eb..e38b0ee82c2 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -220,6 +220,7 @@ pub trait LayoutElementHelpers { } impl LayoutElementHelpers for JS { + #[allow(unrooted_must_root)] unsafe fn html_element_in_html_document_for_layout(&self) -> bool { if (*self.unsafe_get()).namespace != namespace::HTML { return false diff --git a/components/script/dom/formdata.rs b/components/script/dom/formdata.rs index 3e39a1009aa..1a9f1252f53 100644 --- a/components/script/dom/formdata.rs +++ b/components/script/dom/formdata.rs @@ -55,6 +55,7 @@ impl FormData { } impl<'a> FormDataMethods for JSRef<'a, FormData> { + #[allow(unrooted_must_root)] fn Append(&self, name: DOMString, value: &JSRef, filename: Option) { let file = FileData(JS::from_rooted(&self.get_file_from_blob(value, filename))); self.data.deref().borrow_mut().insert_or_update_with(name.clone(), vec!(file.clone()), @@ -86,7 +87,7 @@ impl<'a> FormDataMethods for JSRef<'a, FormData> { fn Has(&self, name: DOMString) -> bool { self.data.deref().borrow().contains_key_equiv(&name) } - + #[allow(unrooted_must_root)] fn Set(&self, name: DOMString, value: &JSRef, filename: Option) { let file = FileData(JS::from_rooted(&self.get_file_from_blob(value, filename))); self.data.deref().borrow_mut().insert(name, vec!(file)); diff --git a/components/script/dom/performance.rs b/components/script/dom/performance.rs index fc57eaba869..da112ff27fe 100644 --- a/components/script/dom/performance.rs +++ b/components/script/dom/performance.rs @@ -29,8 +29,8 @@ impl Performance { } pub fn new(window: &JSRef) -> Temporary { - let performance = Performance::new_inherited(window); - reflect_dom_object(box performance, &Window(*window), + reflect_dom_object(box Performance::new_inherited(window), + &Window(*window), PerformanceBinding::Wrap) } } diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index 0b48355a3d8..025403e1698 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -133,7 +133,7 @@ pub struct XMLHttpRequest { impl XMLHttpRequest { pub fn new_inherited(global: &GlobalRef) -> XMLHttpRequest { - let xhr = XMLHttpRequest { + XMLHttpRequest { eventtarget: XMLHttpRequestEventTarget::new_inherited(XMLHttpRequestTypeId), ready_state: Traceable::new(Cell::new(Unsent)), timeout: Traceable::new(Cell::new(0u32)), @@ -163,8 +163,7 @@ impl XMLHttpRequest { fetch_time: Traceable::new(Cell::new(0)), timeout_pinned: Traceable::new(Cell::new(false)), terminate_sender: Untraceable::new(RefCell::new(None)), - }; - xhr + } } pub fn new(global: &GlobalRef) -> Temporary { reflect_dom_object(box XMLHttpRequest::new_inherited(global), diff --git a/components/script/lib.rs b/components/script/lib.rs index 275051435bd..939238df1a4 100644 --- a/components/script/lib.rs +++ b/components/script/lib.rs @@ -58,6 +58,7 @@ pub mod dom { /// Generated JS-Rust bindings. pub mod codegen { + #[allow(unrooted_must_root)] pub mod Bindings; pub mod InterfaceTypes; pub mod InheritTypes; From d241826987a1f701452eb95fc50603d5aba8c890 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Tue, 16 Sep 2014 23:31:40 +0530 Subject: [PATCH 3/6] Unwrap pointers and miscellany for unrooted_must_root check --- components/macros/lib.rs | 6 ++++++ components/script/dom/bindings/js.rs | 2 ++ components/script/dom/htmlserializer.rs | 1 + 3 files changed, 9 insertions(+) diff --git a/components/macros/lib.rs b/components/macros/lib.rs index 5b9aa64a52d..c2af641f165 100644 --- a/components/macros/lib.rs +++ b/components/macros/lib.rs @@ -62,6 +62,12 @@ impl LintPass for TransmutePass { } fn lint_unrooted_ty(cx: &Context, ty: &ast::Ty, warning: &str) { + let ty = match ty.node { + ast::TyBox(ref t) | ast::TyUniq(ref t) | + ast::TyVec(ref t) | ast::TyFixedLengthVec(ref t, _) | + ast::TyPtr(ast::MutTy { ty: ref t, ..}) | ast::TyRptr(_, ast::MutTy { ty: ref t, ..}) => &**t, + _ => ty + }; match ty.node { ast::TyPath(_, _, id) => { match cx.tcx.def_map.borrow().get_copy(&id) { diff --git a/components/script/dom/bindings/js.rs b/components/script/dom/bindings/js.rs index c77ae3cba17..7754adce672 100644 --- a/components/script/dom/bindings/js.rs +++ b/components/script/dom/bindings/js.rs @@ -113,6 +113,7 @@ pub struct JS { } impl PartialEq for JS { + #[allow(unrooted_must_root)] fn eq(&self, other: &JS) -> bool { self.ptr == other.ptr } @@ -373,6 +374,7 @@ impl RootCollection { } /// Create a new stack-bounded root that will not outlive this collection + #[allow(unrooted_must_root)] fn new_root<'a, 'b, T: Reflectable>(&'a self, unrooted: &JS) -> Root<'a, 'b, T> { Root::new(self, unrooted) } diff --git a/components/script/dom/htmlserializer.rs b/components/script/dom/htmlserializer.rs index 624ede52bb7..3737b498bb1 100644 --- a/components/script/dom/htmlserializer.rs +++ b/components/script/dom/htmlserializer.rs @@ -21,6 +21,7 @@ use dom::text::Text; use servo_util::atom::Atom; use servo_util::namespace; +#[allow(unrooted_must_root)] pub fn serialize(iterator: &mut NodeIterator) -> String { let mut html = String::new(); let mut open_elements: Vec = vec!(); From f0b8391762f37a6e50dfb7a46b461fc8f9414d57 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 17 Sep 2014 00:33:36 +0530 Subject: [PATCH 4/6] Address review comments --- components/macros/lib.rs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/components/macros/lib.rs b/components/macros/lib.rs index c2af641f165..1ce4832b19a 100644 --- a/components/macros/lib.rs +++ b/components/macros/lib.rs @@ -62,14 +62,11 @@ impl LintPass for TransmutePass { } fn lint_unrooted_ty(cx: &Context, ty: &ast::Ty, warning: &str) { - let ty = match ty.node { - ast::TyBox(ref t) | ast::TyUniq(ref t) | - ast::TyVec(ref t) | ast::TyFixedLengthVec(ref t, _) | - ast::TyPtr(ast::MutTy { ty: ref t, ..}) | ast::TyRptr(_, ast::MutTy { ty: ref t, ..}) => &**t, - _ => ty - }; - match ty.node { - ast::TyPath(_, _, id) => { + match ty.node { + ast::TyBox(ref t) | ast::TyUniq(ref t) | + ast::TyVec(ref t) | ast::TyFixedLengthVec(ref t, _) | + ast::TyPtr(ast::MutTy { ty: ref t, ..}) | ast::TyRptr(_, ast::MutTy { ty: ref t, ..}) => lint_unrooted_ty(cx, &**t, warning), + ast::TyPath(_, _, id) => { match cx.tcx.def_map.borrow().get_copy(&id) { def::DefTy(def_id) => { if ty::has_attr(cx.tcx, def_id, "must_root") { @@ -80,7 +77,7 @@ fn lint_unrooted_ty(cx: &Context, ty: &ast::Ty, warning: &str) { } } _ => (), - } + }; } impl LintPass for UnrootedPass { @@ -125,7 +122,7 @@ impl LintPass for UnrootedPass { ast::DefaultBlock => { for arg in decl.inputs.iter() { lint_unrooted_ty(cx, &*arg.ty, - "Type must be rooted, use #[must_root] on the struct definition to propagate") + "Type must be rooted, use #[must_root] on the fn definition to propagate") } } _ => () // fn is `unsafe` From 30014c3919f5ad30d491074dafbfdaad0fb0de92 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 17 Sep 2014 00:51:20 +0530 Subject: [PATCH 5/6] Make Reflector #[must_root], propagate to non-HTMLElements --- components/script/dom/bindings/trace.rs | 1 + components/script/dom/bindings/utils.rs | 3 ++- components/script/dom/blob.rs | 1 + components/script/dom/characterdata.rs | 1 + components/script/dom/comment.rs | 5 +++-- components/script/dom/console.rs | 1 + components/script/dom/customevent.rs | 1 + components/script/dom/dedicatedworkerglobalscope.rs | 1 + components/script/dom/documentfragment.rs | 5 +++-- components/script/dom/documenttype.rs | 3 ++- components/script/dom/domexception.rs | 1 + components/script/dom/domrect.rs | 5 +++-- components/script/dom/element.rs | 8 ++++++-- components/script/dom/event.rs | 1 + components/script/dom/eventtarget.rs | 1 + components/script/dom/file.rs | 1 + components/script/dom/htmlelement.rs | 1 + components/script/dom/location.rs | 1 + components/script/dom/messageevent.rs | 1 + components/script/dom/mouseevent.rs | 1 + components/script/dom/navigator.rs | 1 + components/script/dom/node.rs | 1 + components/script/dom/nodeiterator.rs | 1 + components/script/dom/nodelist.rs | 2 -- components/script/dom/performancetiming.rs | 2 ++ components/script/dom/processinginstruction.rs | 1 + components/script/dom/progressevent.rs | 1 + components/script/dom/range.rs | 1 + components/script/dom/screen.rs | 1 + components/script/dom/text.rs | 1 + components/script/dom/treewalker.rs | 1 + components/script/dom/uievent.rs | 1 + components/script/dom/urlsearchparams.rs | 1 + components/script/dom/validitystate.rs | 1 + components/script/dom/window.rs | 1 + components/script/dom/workerglobalscope.rs | 1 + components/script/dom/workerlocation.rs | 1 + components/script/dom/workernavigator.rs | 1 + components/script/dom/xmlhttprequesteventtarget.rs | 1 + components/script/dom/xmlhttprequestupload.rs | 1 + 40 files changed, 53 insertions(+), 12 deletions(-) diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index 42d944e9781..b160508a761 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -83,6 +83,7 @@ pub fn trace_jsval(tracer: *mut JSTracer, description: &str, val: JSVal) { } /// Trace the `JSObject` held by `reflector`. +#[allow(unrooted_must_root)] pub fn trace_reflector(tracer: *mut JSTracer, description: &str, reflector: &Reflector) { trace_object(tracer, description, reflector.get_jsobject()) } diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs index ae9a19a3a29..0f6ab2098fe 100644 --- a/components/script/dom/bindings/utils.rs +++ b/components/script/dom/bindings/utils.rs @@ -455,8 +455,9 @@ pub fn reflect_dom_object } /// A struct to store a reference to the reflector of a DOM object. -#[allow(raw_pointer_deriving)] +#[allow(raw_pointer_deriving, unrooted_must_root)] #[deriving(PartialEq)] +#[must_root] pub struct Reflector { object: Cell<*mut JSObject>, } diff --git a/components/script/dom/blob.rs b/components/script/dom/blob.rs index 1a7d2a21636..0bbdca9f93d 100644 --- a/components/script/dom/blob.rs +++ b/components/script/dom/blob.rs @@ -16,6 +16,7 @@ pub enum BlobType { } #[deriving(Encodable)] +#[must_root] pub struct Blob { reflector_: Reflector, type_: BlobType diff --git a/components/script/dom/characterdata.rs b/components/script/dom/characterdata.rs index ebb17cf6993..371d53884ff 100644 --- a/components/script/dom/characterdata.rs +++ b/components/script/dom/characterdata.rs @@ -18,6 +18,7 @@ use servo_util::str::DOMString; use std::cell::RefCell; #[deriving(Encodable)] +#[must_root] pub struct CharacterData { pub node: Node, pub data: Traceable>, diff --git a/components/script/dom/comment.rs b/components/script/dom/comment.rs index e50b24b2a58..dd070df87ac 100644 --- a/components/script/dom/comment.rs +++ b/components/script/dom/comment.rs @@ -17,6 +17,7 @@ use servo_util::str::DOMString; /// An HTML comment. #[deriving(Encodable)] +#[must_root] pub struct Comment { pub characterdata: CharacterData, } @@ -35,8 +36,8 @@ impl Comment { } pub fn new(text: DOMString, document: &JSRef) -> Temporary { - let node = Comment::new_inherited(text, document); - Node::reflect_node(box node, document, CommentBinding::Wrap) + Node::reflect_node(box Comment::new_inherited(text, document), + document, CommentBinding::Wrap) } pub fn Constructor(global: &GlobalRef, data: DOMString) -> Fallible> { diff --git a/components/script/dom/console.rs b/components/script/dom/console.rs index 3e74617ebcf..d761252eaef 100644 --- a/components/script/dom/console.rs +++ b/components/script/dom/console.rs @@ -10,6 +10,7 @@ use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct Console { pub reflector_: Reflector } diff --git a/components/script/dom/customevent.rs b/components/script/dom/customevent.rs index 159601783ac..5c3db95ff75 100644 --- a/components/script/dom/customevent.rs +++ b/components/script/dom/customevent.rs @@ -19,6 +19,7 @@ use servo_util::str::DOMString; use std::cell::Cell; #[deriving(Encodable)] +#[must_root] pub struct CustomEvent { event: Event, detail: Traceable>>, diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index 15bf075df44..54d7684a0c6 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -37,6 +37,7 @@ use native::task::NativeTaskBuilder; use url::Url; #[deriving(Encodable)] +#[must_root] pub struct DedicatedWorkerGlobalScope { workerglobalscope: WorkerGlobalScope, receiver: Untraceable>, diff --git a/components/script/dom/documentfragment.rs b/components/script/dom/documentfragment.rs index 1f3fcb29424..c8d8b961113 100644 --- a/components/script/dom/documentfragment.rs +++ b/components/script/dom/documentfragment.rs @@ -19,6 +19,7 @@ use dom::nodelist::NodeList; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct DocumentFragment { pub node: Node, } @@ -38,8 +39,8 @@ impl DocumentFragment { } pub fn new(document: &JSRef) -> Temporary { - let node = DocumentFragment::new_inherited(document); - Node::reflect_node(box node, document, DocumentFragmentBinding::Wrap) + Node::reflect_node(box DocumentFragment::new_inherited(document), + document, DocumentFragmentBinding::Wrap) } pub fn Constructor(global: &GlobalRef) -> Fallible> { diff --git a/components/script/dom/documenttype.rs b/components/script/dom/documenttype.rs index 5f101942139..f0d6bba5bac 100644 --- a/components/script/dom/documenttype.rs +++ b/components/script/dom/documenttype.rs @@ -14,6 +14,7 @@ use servo_util::str::DOMString; /// The `DOCTYPE` tag. #[deriving(Encodable)] +#[must_root] pub struct DocumentType { pub node: Node, pub name: DOMString, @@ -40,7 +41,7 @@ impl DocumentType { system_id: system_id.unwrap_or("".to_string()) } } - + #[allow(unrooted_must_root)] pub fn new(name: DOMString, public_id: Option, system_id: Option, diff --git a/components/script/dom/domexception.rs b/components/script/dom/domexception.rs index 7d1ba33ffb8..633eaa452f0 100644 --- a/components/script/dom/domexception.rs +++ b/components/script/dom/domexception.rs @@ -60,6 +60,7 @@ impl DOMErrorName { } #[deriving(Encodable)] +#[must_root] pub struct DOMException { pub code: DOMErrorName, pub reflector_: Reflector diff --git a/components/script/dom/domrect.rs b/components/script/dom/domrect.rs index 2cf75ee4eb9..cc2643ac4b5 100644 --- a/components/script/dom/domrect.rs +++ b/components/script/dom/domrect.rs @@ -11,6 +11,7 @@ use dom::window::Window; use servo_util::geometry::Au; #[deriving(Encodable)] +#[must_root] pub struct DOMRect { reflector_: Reflector, top: f32, @@ -34,8 +35,8 @@ impl DOMRect { pub fn new(window: &JSRef, top: Au, bottom: Au, left: Au, right: Au) -> Temporary { - let rect = DOMRect::new_inherited(top, bottom, left, right); - reflect_dom_object(box rect, &Window(*window), DOMRectBinding::Wrap) + reflect_dom_object(box DOMRect::new_inherited(top, bottom, left, right), + &Window(*window), DOMRectBinding::Wrap) } } diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index e38b0ee82c2..ff7e4e1e925 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -42,6 +42,7 @@ use std::cell::{Cell, RefCell}; use std::mem; #[deriving(Encodable)] +#[must_root] pub struct Element { pub node: Node, pub local_name: Atom, @@ -160,8 +161,8 @@ impl Element { } pub fn new(local_name: DOMString, namespace: Namespace, prefix: Option, document: &JSRef) -> Temporary { - let element = Element::new_inherited(ElementTypeId, local_name, namespace, prefix, document); - Node::reflect_node(box element, document, ElementBinding::Wrap) + Node::reflect_node(box Element::new_inherited(ElementTypeId, local_name, namespace, prefix, document), + document, ElementBinding::Wrap) } } @@ -173,6 +174,7 @@ pub trait RawLayoutElementHelpers { impl RawLayoutElementHelpers for Element { #[inline] + #[allow(unrooted_must_root)] unsafe fn get_attr_val_for_layout(&self, namespace: &Namespace, name: &str) -> Option<&'static str> { // cast to point to T in RefCell directly @@ -188,6 +190,7 @@ impl RawLayoutElementHelpers for Element { } #[inline] + #[allow(unrooted_must_root)] unsafe fn get_attr_atom_for_layout(&self, namespace: &Namespace, name: &str) -> Option { // cast to point to T in RefCell directly @@ -203,6 +206,7 @@ impl RawLayoutElementHelpers for Element { } #[inline] + #[allow(unrooted_must_root)] unsafe fn has_class_for_layout(&self, name: &str) -> bool { let attrs: *const Vec> = mem::transmute(&self.attrs); (*attrs).iter().find(|attr: & &JS| { diff --git a/components/script/dom/event.rs b/components/script/dom/event.rs index 15709ad5bc1..075a660cf45 100644 --- a/components/script/dom/event.rs +++ b/components/script/dom/event.rs @@ -35,6 +35,7 @@ pub enum EventTypeId { } #[deriving(Encodable)] +#[must_root] pub struct Event { pub type_id: EventTypeId, reflector_: Reflector, diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs index 4f2cba18def..689dd3096e2 100644 --- a/components/script/dom/eventtarget.rs +++ b/components/script/dom/eventtarget.rs @@ -62,6 +62,7 @@ pub struct EventListenerEntry { } #[deriving(Encodable)] +#[must_root] pub struct EventTarget { pub type_id: EventTargetTypeId, reflector_: Reflector, diff --git a/components/script/dom/file.rs b/components/script/dom/file.rs index c4c07e03399..cfa6daab91b 100644 --- a/components/script/dom/file.rs +++ b/components/script/dom/file.rs @@ -11,6 +11,7 @@ use dom::blob::{Blob, BlobType, FileTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct File { pub blob: Blob, pub name: DOMString, diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index 076ba5fddce..08ab88463c4 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -22,6 +22,7 @@ use servo_util::namespace; use servo_util::str::DOMString; #[deriving(Encodable)] +#[allow(unrooted_must_root)] pub struct HTMLElement { pub element: Element } diff --git a/components/script/dom/location.rs b/components/script/dom/location.rs index e310c52d49e..0a1f6fd842f 100644 --- a/components/script/dom/location.rs +++ b/components/script/dom/location.rs @@ -15,6 +15,7 @@ use servo_util::str::DOMString; use std::rc::Rc; #[deriving(Encodable)] +#[must_root] pub struct Location { reflector_: Reflector, //XXXjdm cycle: window->Location->window page: Rc, diff --git a/components/script/dom/messageevent.rs b/components/script/dom/messageevent.rs index 13c8cf52dfd..9b6ab748256 100644 --- a/components/script/dom/messageevent.rs +++ b/components/script/dom/messageevent.rs @@ -20,6 +20,7 @@ use js::jsapi::JSContext; use js::jsval::JSVal; #[deriving(Encodable)] +#[must_root] pub struct MessageEvent { event: Event, data: Traceable, diff --git a/components/script/dom/mouseevent.rs b/components/script/dom/mouseevent.rs index aa750b501ba..f214f6de684 100644 --- a/components/script/dom/mouseevent.rs +++ b/components/script/dom/mouseevent.rs @@ -19,6 +19,7 @@ use servo_util::str::DOMString; use std::cell::Cell; #[deriving(Encodable)] +#[must_root] pub struct MouseEvent { pub mouseevent: UIEvent, pub screen_x: Traceable>, diff --git a/components/script/dom/navigator.rs b/components/script/dom/navigator.rs index d1d7596aa6e..12ac99ec2cd 100644 --- a/components/script/dom/navigator.rs +++ b/components/script/dom/navigator.rs @@ -11,6 +11,7 @@ use dom::window::Window; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct Navigator { pub reflector_: Reflector //XXXjdm cycle: window->navigator->window } diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 90dd959e10f..b46adc488fd 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -68,6 +68,7 @@ use serialize::{Encoder, Encodable}; /// An HTML node. #[deriving(Encodable)] +#[must_root] pub struct Node { /// The JavaScript reflector for this node. pub eventtarget: EventTarget, diff --git a/components/script/dom/nodeiterator.rs b/components/script/dom/nodeiterator.rs index f890f71cf4f..5febb54cd5a 100644 --- a/components/script/dom/nodeiterator.rs +++ b/components/script/dom/nodeiterator.rs @@ -9,6 +9,7 @@ use dom::bindings::js::{JSRef, Temporary}; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; #[deriving(Encodable)] +#[must_root] pub struct NodeIterator { pub reflector_: Reflector } diff --git a/components/script/dom/nodelist.rs b/components/script/dom/nodelist.rs index 0ebd2e0db25..322c70c3135 100644 --- a/components/script/dom/nodelist.rs +++ b/components/script/dom/nodelist.rs @@ -25,7 +25,6 @@ pub struct NodeList { } impl NodeList { - #[allow(unrooted_must_root)] pub fn new_inherited(list_type: NodeListType) -> NodeList { NodeList { list_type: list_type, @@ -33,7 +32,6 @@ impl NodeList { } } - #[allow(unrooted_must_root)] pub fn new(window: &JSRef, list_type: NodeListType) -> Temporary { reflect_dom_object(box NodeList::new_inherited(list_type), diff --git a/components/script/dom/performancetiming.rs b/components/script/dom/performancetiming.rs index f4331e06c0b..4e12942010b 100644 --- a/components/script/dom/performancetiming.rs +++ b/components/script/dom/performancetiming.rs @@ -10,6 +10,7 @@ use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::window::Window; #[deriving(Encodable)] +#[must_root] pub struct PerformanceTiming { reflector_: Reflector, navigationStart: u64, @@ -26,6 +27,7 @@ impl PerformanceTiming { } } + #[allow(unrooted_must_root)] pub fn new(window: &JSRef) -> Temporary { let timing = PerformanceTiming::new_inherited(window.navigationStart, window.navigationStartPrecise); diff --git a/components/script/dom/processinginstruction.rs b/components/script/dom/processinginstruction.rs index 40e6ca63e04..26dd207f343 100644 --- a/components/script/dom/processinginstruction.rs +++ b/components/script/dom/processinginstruction.rs @@ -15,6 +15,7 @@ use servo_util::str::DOMString; /// An HTML processing instruction node. #[deriving(Encodable)] +#[must_root] pub struct ProcessingInstruction { pub characterdata: CharacterData, pub target: DOMString, diff --git a/components/script/dom/progressevent.rs b/components/script/dom/progressevent.rs index d001785984f..03230615d3d 100644 --- a/components/script/dom/progressevent.rs +++ b/components/script/dom/progressevent.rs @@ -14,6 +14,7 @@ use dom::event::{Event, ProgressEventTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct ProgressEvent { event: Event, length_computable: bool, diff --git a/components/script/dom/range.rs b/components/script/dom/range.rs index 3ed02410a1e..b1f1ba7bf9c 100644 --- a/components/script/dom/range.rs +++ b/components/script/dom/range.rs @@ -12,6 +12,7 @@ use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::document::Document; #[deriving(Encodable)] +#[must_root] pub struct Range { reflector_: Reflector } diff --git a/components/script/dom/screen.rs b/components/script/dom/screen.rs index 0e184d94ec3..9b2155baadc 100644 --- a/components/script/dom/screen.rs +++ b/components/script/dom/screen.rs @@ -10,6 +10,7 @@ use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::window::Window; #[deriving(Encodable)] +#[must_root] pub struct Screen { reflector_: Reflector, } diff --git a/components/script/dom/text.rs b/components/script/dom/text.rs index 1bbd25cb8ff..a8cbef5b852 100644 --- a/components/script/dom/text.rs +++ b/components/script/dom/text.rs @@ -17,6 +17,7 @@ use servo_util::str::DOMString; /// An HTML text node. #[deriving(Encodable)] +#[must_root] pub struct Text { pub characterdata: CharacterData, } diff --git a/components/script/dom/treewalker.rs b/components/script/dom/treewalker.rs index dc192c359ce..89717cfb64f 100644 --- a/components/script/dom/treewalker.rs +++ b/components/script/dom/treewalker.rs @@ -9,6 +9,7 @@ use dom::bindings::js::{JSRef, Temporary}; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; #[deriving(Encodable)] +#[must_root] pub struct TreeWalker { pub reflector_: Reflector } diff --git a/components/script/dom/uievent.rs b/components/script/dom/uievent.rs index c91f0fdb787..e8e381425bc 100644 --- a/components/script/dom/uievent.rs +++ b/components/script/dom/uievent.rs @@ -18,6 +18,7 @@ use servo_util::str::DOMString; use std::cell::Cell; #[deriving(Encodable)] +#[must_root] pub struct UIEvent { pub event: Event, view: Cell>>, diff --git a/components/script/dom/urlsearchparams.rs b/components/script/dom/urlsearchparams.rs index 63fffe6bbf5..e1d3d3e9902 100644 --- a/components/script/dom/urlsearchparams.rs +++ b/components/script/dom/urlsearchparams.rs @@ -22,6 +22,7 @@ use std::fmt::radix; use std::ascii::OwnedStrAsciiExt; #[deriving(Encodable)] +#[must_root] pub struct URLSearchParams { data: Traceable>>>, reflector_: Reflector, diff --git a/components/script/dom/validitystate.rs b/components/script/dom/validitystate.rs index c2901009c41..382a55fa8c6 100644 --- a/components/script/dom/validitystate.rs +++ b/components/script/dom/validitystate.rs @@ -9,6 +9,7 @@ use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::window::Window; #[deriving(Encodable)] +#[must_root] pub struct ValidityState { reflector_: Reflector, state: u8, diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 23b6c71e029..d9c9cd5c6c6 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -73,6 +73,7 @@ impl TimerHandle { } #[deriving(Encodable)] +#[must_root] pub struct Window { eventtarget: EventTarget, pub script_chan: ScriptChan, diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs index dcf205cf3a9..04cff550a03 100644 --- a/components/script/dom/workerglobalscope.rs +++ b/components/script/dom/workerglobalscope.rs @@ -30,6 +30,7 @@ pub enum WorkerGlobalScopeId { } #[deriving(Encodable)] +#[must_root] pub struct WorkerGlobalScope { pub eventtarget: EventTarget, worker_url: Untraceable, diff --git a/components/script/dom/workerlocation.rs b/components/script/dom/workerlocation.rs index 0d32c211554..8154d4d01b7 100644 --- a/components/script/dom/workerlocation.rs +++ b/components/script/dom/workerlocation.rs @@ -15,6 +15,7 @@ use servo_util::str::DOMString; use url::Url; #[deriving(Encodable)] +#[must_root] pub struct WorkerLocation { reflector_: Reflector, url: Untraceable, diff --git a/components/script/dom/workernavigator.rs b/components/script/dom/workernavigator.rs index e732696617d..4acdaa67ff3 100644 --- a/components/script/dom/workernavigator.rs +++ b/components/script/dom/workernavigator.rs @@ -11,6 +11,7 @@ use dom::workerglobalscope::WorkerGlobalScope; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct WorkerNavigator { reflector_: Reflector, } diff --git a/components/script/dom/xmlhttprequesteventtarget.rs b/components/script/dom/xmlhttprequesteventtarget.rs index 06c42fbdc4e..5b3489edce0 100644 --- a/components/script/dom/xmlhttprequesteventtarget.rs +++ b/components/script/dom/xmlhttprequesteventtarget.rs @@ -12,6 +12,7 @@ use dom::eventtarget::{EventTarget, EventTargetHelpers, XMLHttpRequestTargetType use dom::xmlhttprequest::XMLHttpRequestId; #[deriving(Encodable)] +#[must_root] pub struct XMLHttpRequestEventTarget { pub eventtarget: EventTarget, } diff --git a/components/script/dom/xmlhttprequestupload.rs b/components/script/dom/xmlhttprequestupload.rs index 477d382bffe..57e98ff62f8 100644 --- a/components/script/dom/xmlhttprequestupload.rs +++ b/components/script/dom/xmlhttprequestupload.rs @@ -12,6 +12,7 @@ use dom::xmlhttprequest::{XMLHttpRequestUploadTypeId}; use dom::xmlhttprequesteventtarget::XMLHttpRequestEventTarget; #[deriving(Encodable)] +#[must_root] pub struct XMLHttpRequestUpload { eventtarget: XMLHttpRequestEventTarget } From f5087e149004e0080a61a2a31d76a5c52ee357e1 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 17 Sep 2014 01:00:59 +0530 Subject: [PATCH 6/6] Use #[must_root] for HTMLElements --- components/script/dom/htmlanchorelement.rs | 2 ++ components/script/dom/htmlappletelement.rs | 2 ++ components/script/dom/htmlareaelement.rs | 2 ++ components/script/dom/htmlaudioelement.rs | 2 ++ components/script/dom/htmlbaseelement.rs | 2 ++ components/script/dom/htmlbodyelement.rs | 2 ++ components/script/dom/htmlbrelement.rs | 2 ++ components/script/dom/htmlbuttonelement.rs | 2 ++ components/script/dom/htmlcanvaselement.rs | 2 ++ components/script/dom/htmldataelement.rs | 2 ++ components/script/dom/htmldatalistelement.rs | 2 ++ components/script/dom/htmldirectoryelement.rs | 2 ++ components/script/dom/htmldivelement.rs | 2 ++ components/script/dom/htmldlistelement.rs | 2 ++ components/script/dom/htmlelement.rs | 3 ++- components/script/dom/htmlembedelement.rs | 2 ++ components/script/dom/htmlfieldsetelement.rs | 2 ++ components/script/dom/htmlfontelement.rs | 2 ++ components/script/dom/htmlformelement.rs | 2 ++ components/script/dom/htmlframeelement.rs | 2 ++ components/script/dom/htmlframesetelement.rs | 2 ++ components/script/dom/htmlheadelement.rs | 2 ++ components/script/dom/htmlheadingelement.rs | 2 ++ components/script/dom/htmlhrelement.rs | 2 ++ components/script/dom/htmlhtmlelement.rs | 2 ++ components/script/dom/htmliframeelement.rs | 2 ++ components/script/dom/htmlimageelement.rs | 2 ++ components/script/dom/htmlinputelement.rs | 2 ++ components/script/dom/htmllabelelement.rs | 2 ++ components/script/dom/htmllegendelement.rs | 2 ++ components/script/dom/htmllielement.rs | 2 ++ components/script/dom/htmllinkelement.rs | 2 ++ components/script/dom/htmlmapelement.rs | 2 ++ components/script/dom/htmlmediaelement.rs | 1 + components/script/dom/htmlmetaelement.rs | 2 ++ components/script/dom/htmlmeterelement.rs | 2 ++ components/script/dom/htmlmodelement.rs | 2 ++ components/script/dom/htmlobjectelement.rs | 2 ++ components/script/dom/htmlolistelement.rs | 2 ++ components/script/dom/htmloptgroupelement.rs | 2 ++ components/script/dom/htmloptionelement.rs | 2 ++ components/script/dom/htmloutputelement.rs | 2 ++ components/script/dom/htmlparagraphelement.rs | 2 ++ components/script/dom/htmlparamelement.rs | 2 ++ components/script/dom/htmlpreelement.rs | 2 ++ components/script/dom/htmlprogresselement.rs | 2 ++ components/script/dom/htmlquoteelement.rs | 2 ++ components/script/dom/htmlscriptelement.rs | 2 ++ components/script/dom/htmlselectelement.rs | 2 ++ components/script/dom/htmlsourceelement.rs | 2 ++ components/script/dom/htmlspanelement.rs | 2 ++ components/script/dom/htmlstyleelement.rs | 2 ++ components/script/dom/htmltablecaptionelement.rs | 2 ++ components/script/dom/htmltablecellelement.rs | 1 + components/script/dom/htmltablecolelement.rs | 2 ++ components/script/dom/htmltabledatacellelement.rs | 2 ++ components/script/dom/htmltableelement.rs | 2 ++ components/script/dom/htmltableheadercellelement.rs | 2 ++ components/script/dom/htmltablerowelement.rs | 2 ++ components/script/dom/htmltablesectionelement.rs | 2 ++ components/script/dom/htmltemplateelement.rs | 2 ++ components/script/dom/htmltextareaelement.rs | 2 ++ components/script/dom/htmltimeelement.rs | 2 ++ components/script/dom/htmltitleelement.rs | 2 ++ components/script/dom/htmltrackelement.rs | 2 ++ components/script/dom/htmlulistelement.rs | 2 ++ components/script/dom/htmlunknownelement.rs | 2 ++ components/script/dom/htmlvideoelement.rs | 2 ++ components/script/dom/processinginstruction.rs | 4 ++-- components/script/dom/text.rs | 4 ++-- 70 files changed, 138 insertions(+), 5 deletions(-) diff --git a/components/script/dom/htmlanchorelement.rs b/components/script/dom/htmlanchorelement.rs index 8c23abc940f..0a8efa15890 100644 --- a/components/script/dom/htmlanchorelement.rs +++ b/components/script/dom/htmlanchorelement.rs @@ -24,6 +24,7 @@ use servo_util::namespace::Null; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLAnchorElement { pub htmlelement: HTMLElement } @@ -41,6 +42,7 @@ impl HTMLAnchorElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLAnchorElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLAnchorElementBinding::Wrap) diff --git a/components/script/dom/htmlappletelement.rs b/components/script/dom/htmlappletelement.rs index 97a3757f02e..0e2e3cfcfe4 100644 --- a/components/script/dom/htmlappletelement.rs +++ b/components/script/dom/htmlappletelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLAppletElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLAppletElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLAppletElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLAppletElementBinding::Wrap) diff --git a/components/script/dom/htmlareaelement.rs b/components/script/dom/htmlareaelement.rs index 3de80a21802..c724b640da6 100644 --- a/components/script/dom/htmlareaelement.rs +++ b/components/script/dom/htmlareaelement.rs @@ -18,6 +18,7 @@ use servo_util::atom::Atom; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLAreaElement { pub htmlelement: HTMLElement } @@ -35,6 +36,7 @@ impl HTMLAreaElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLAreaElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLAreaElementBinding::Wrap) diff --git a/components/script/dom/htmlaudioelement.rs b/components/script/dom/htmlaudioelement.rs index 626e2e99619..02b98f9e679 100644 --- a/components/script/dom/htmlaudioelement.rs +++ b/components/script/dom/htmlaudioelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLAudioElement { pub htmlmediaelement: HTMLMediaElement } @@ -31,6 +32,7 @@ impl HTMLAudioElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLAudioElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLAudioElementBinding::Wrap) diff --git a/components/script/dom/htmlbaseelement.rs b/components/script/dom/htmlbaseelement.rs index fbd3d5cdfca..9d390765c42 100644 --- a/components/script/dom/htmlbaseelement.rs +++ b/components/script/dom/htmlbaseelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLBaseElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLBaseElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLBaseElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLBaseElementBinding::Wrap) diff --git a/components/script/dom/htmlbodyelement.rs b/components/script/dom/htmlbodyelement.rs index b7bb35e618a..298cb133c87 100644 --- a/components/script/dom/htmlbodyelement.rs +++ b/components/script/dom/htmlbodyelement.rs @@ -21,6 +21,7 @@ use servo_util::atom::Atom; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLBodyElement { pub htmlelement: HTMLElement } @@ -38,6 +39,7 @@ impl HTMLBodyElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLBodyElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLBodyElementBinding::Wrap) diff --git a/components/script/dom/htmlbrelement.rs b/components/script/dom/htmlbrelement.rs index 70c415ba24a..4e08ef492d0 100644 --- a/components/script/dom/htmlbrelement.rs +++ b/components/script/dom/htmlbrelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLBRElement { pub htmlelement: HTMLElement, } @@ -31,6 +32,7 @@ impl HTMLBRElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLBRElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLBRElementBinding::Wrap) diff --git a/components/script/dom/htmlbuttonelement.rs b/components/script/dom/htmlbuttonelement.rs index 0c8903603e1..91a8de46617 100644 --- a/components/script/dom/htmlbuttonelement.rs +++ b/components/script/dom/htmlbuttonelement.rs @@ -20,6 +20,7 @@ use servo_util::atom::Atom; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLButtonElement { pub htmlelement: HTMLElement } @@ -37,6 +38,7 @@ impl HTMLButtonElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLButtonElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLButtonElementBinding::Wrap) diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs index 28902265610..60bec7f4662 100644 --- a/components/script/dom/htmlcanvaselement.rs +++ b/components/script/dom/htmlcanvaselement.rs @@ -29,6 +29,7 @@ static DefaultWidth: u32 = 300; static DefaultHeight: u32 = 150; #[deriving(Encodable)] +#[must_root] pub struct HTMLCanvasElement { pub htmlelement: HTMLElement, context: Traceable>>>, @@ -52,6 +53,7 @@ impl HTMLCanvasElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLCanvasElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLCanvasElementBinding::Wrap) diff --git a/components/script/dom/htmldataelement.rs b/components/script/dom/htmldataelement.rs index cf35507a824..941ea6a2d29 100644 --- a/components/script/dom/htmldataelement.rs +++ b/components/script/dom/htmldataelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLDataElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLDataElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLDataElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLDataElementBinding::Wrap) diff --git a/components/script/dom/htmldatalistelement.rs b/components/script/dom/htmldatalistelement.rs index f7ff70e9858..f63180007bc 100644 --- a/components/script/dom/htmldatalistelement.rs +++ b/components/script/dom/htmldatalistelement.rs @@ -17,6 +17,7 @@ use dom::node::{Node, ElementNodeTypeId, window_from_node}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLDataListElement { pub htmlelement: HTMLElement } @@ -34,6 +35,7 @@ impl HTMLDataListElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLDataListElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLDataListElementBinding::Wrap) diff --git a/components/script/dom/htmldirectoryelement.rs b/components/script/dom/htmldirectoryelement.rs index 2539a389e19..17e1401b7e8 100644 --- a/components/script/dom/htmldirectoryelement.rs +++ b/components/script/dom/htmldirectoryelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLDirectoryElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLDirectoryElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLDirectoryElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLDirectoryElementBinding::Wrap) diff --git a/components/script/dom/htmldivelement.rs b/components/script/dom/htmldivelement.rs index 01319b56f98..e121c8d98cb 100644 --- a/components/script/dom/htmldivelement.rs +++ b/components/script/dom/htmldivelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLDivElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLDivElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLDivElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLDivElementBinding::Wrap) diff --git a/components/script/dom/htmldlistelement.rs b/components/script/dom/htmldlistelement.rs index 0af66bca2c5..745ce780c3e 100644 --- a/components/script/dom/htmldlistelement.rs +++ b/components/script/dom/htmldlistelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLDListElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLDListElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLDListElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLDListElementBinding::Wrap) diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index 08ab88463c4..c9c5b5d4ba8 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -22,7 +22,7 @@ use servo_util::namespace; use servo_util::str::DOMString; #[deriving(Encodable)] -#[allow(unrooted_must_root)] +#[must_root] pub struct HTMLElement { pub element: Element } @@ -44,6 +44,7 @@ impl HTMLElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLElement::new_inherited(HTMLElementTypeId, localName, document); Node::reflect_node(box element, document, HTMLElementBinding::Wrap) diff --git a/components/script/dom/htmlembedelement.rs b/components/script/dom/htmlembedelement.rs index 142e29ab9ef..64314247096 100644 --- a/components/script/dom/htmlembedelement.rs +++ b/components/script/dom/htmlembedelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLEmbedElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLEmbedElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLEmbedElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLEmbedElementBinding::Wrap) diff --git a/components/script/dom/htmlfieldsetelement.rs b/components/script/dom/htmlfieldsetelement.rs index 3bb30fbf7a7..30b8aebf0d3 100644 --- a/components/script/dom/htmlfieldsetelement.rs +++ b/components/script/dom/htmlfieldsetelement.rs @@ -22,6 +22,7 @@ use servo_util::atom::Atom; use servo_util::str::{DOMString, StaticStringVec}; #[deriving(Encodable)] +#[must_root] pub struct HTMLFieldSetElement { pub htmlelement: HTMLElement } @@ -39,6 +40,7 @@ impl HTMLFieldSetElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLFieldSetElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLFieldSetElementBinding::Wrap) diff --git a/components/script/dom/htmlfontelement.rs b/components/script/dom/htmlfontelement.rs index a26d83fb7d2..b80fa5494d0 100644 --- a/components/script/dom/htmlfontelement.rs +++ b/components/script/dom/htmlfontelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLFontElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLFontElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLFontElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLFontElementBinding::Wrap) diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs index e31179ed424..5b9c492c7fe 100644 --- a/components/script/dom/htmlformelement.rs +++ b/components/script/dom/htmlformelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLFormElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLFormElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLFormElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLFormElementBinding::Wrap) diff --git a/components/script/dom/htmlframeelement.rs b/components/script/dom/htmlframeelement.rs index dd362a3947a..2b280272119 100644 --- a/components/script/dom/htmlframeelement.rs +++ b/components/script/dom/htmlframeelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLFrameElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLFrameElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLFrameElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLFrameElementBinding::Wrap) diff --git a/components/script/dom/htmlframesetelement.rs b/components/script/dom/htmlframesetelement.rs index ad6168a0613..c1f09c20639 100644 --- a/components/script/dom/htmlframesetelement.rs +++ b/components/script/dom/htmlframesetelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLFrameSetElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLFrameSetElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLFrameSetElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLFrameSetElementBinding::Wrap) diff --git a/components/script/dom/htmlheadelement.rs b/components/script/dom/htmlheadelement.rs index f3738058179..5c2e619935c 100644 --- a/components/script/dom/htmlheadelement.rs +++ b/components/script/dom/htmlheadelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLHeadElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLHeadElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLHeadElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLHeadElementBinding::Wrap) diff --git a/components/script/dom/htmlheadingelement.rs b/components/script/dom/htmlheadingelement.rs index b869e9764e1..d26cf2252bd 100644 --- a/components/script/dom/htmlheadingelement.rs +++ b/components/script/dom/htmlheadingelement.rs @@ -24,6 +24,7 @@ pub enum HeadingLevel { } #[deriving(Encodable)] +#[must_root] pub struct HTMLHeadingElement { pub htmlelement: HTMLElement, pub level: HeadingLevel, @@ -43,6 +44,7 @@ impl HTMLHeadingElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef, level: HeadingLevel) -> Temporary { let element = HTMLHeadingElement::new_inherited(localName, document, level); Node::reflect_node(box element, document, HTMLHeadingElementBinding::Wrap) diff --git a/components/script/dom/htmlhrelement.rs b/components/script/dom/htmlhrelement.rs index 18a92df2679..de417712964 100644 --- a/components/script/dom/htmlhrelement.rs +++ b/components/script/dom/htmlhrelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLHRElement { pub htmlelement: HTMLElement, } @@ -31,6 +32,7 @@ impl HTMLHRElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLHRElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLHRElementBinding::Wrap) diff --git a/components/script/dom/htmlhtmlelement.rs b/components/script/dom/htmlhtmlelement.rs index 117cdf78257..a45da2beaff 100644 --- a/components/script/dom/htmlhtmlelement.rs +++ b/components/script/dom/htmlhtmlelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLHtmlElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLHtmlElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLHtmlElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLHtmlElementBinding::Wrap) diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs index 6422e5a8f10..a731d0820b6 100644 --- a/components/script/dom/htmliframeelement.rs +++ b/components/script/dom/htmliframeelement.rs @@ -42,6 +42,7 @@ enum SandboxAllowance { } #[deriving(Encodable)] +#[must_root] pub struct HTMLIFrameElement { pub htmlelement: HTMLElement, pub size: Traceable>>, @@ -117,6 +118,7 @@ impl HTMLIFrameElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLIFrameElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLIFrameElementBinding::Wrap) diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 33d7b7dfd31..903e52bb309 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -26,6 +26,7 @@ use url::{Url, UrlParser}; use std::cell::RefCell; #[deriving(Encodable)] +#[must_root] pub struct HTMLImageElement { pub htmlelement: HTMLElement, image: Untraceable>>, @@ -78,6 +79,7 @@ impl HTMLImageElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLImageElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLImageElementBinding::Wrap) diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index 38d63acc7da..d45bf53fada 100644 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -19,6 +19,7 @@ use servo_util::atom::Atom; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLInputElement { pub htmlelement: HTMLElement, } @@ -36,6 +37,7 @@ impl HTMLInputElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLInputElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLInputElementBinding::Wrap) diff --git a/components/script/dom/htmllabelelement.rs b/components/script/dom/htmllabelelement.rs index 54349aa5bf5..d45ca193e32 100644 --- a/components/script/dom/htmllabelelement.rs +++ b/components/script/dom/htmllabelelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLLabelElement { pub htmlelement: HTMLElement, } @@ -31,6 +32,7 @@ impl HTMLLabelElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLLabelElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLLabelElementBinding::Wrap) diff --git a/components/script/dom/htmllegendelement.rs b/components/script/dom/htmllegendelement.rs index 168f94bc27e..6668dfbbff7 100644 --- a/components/script/dom/htmllegendelement.rs +++ b/components/script/dom/htmllegendelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLLegendElement { pub htmlelement: HTMLElement, } @@ -31,6 +32,7 @@ impl HTMLLegendElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLLegendElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLLegendElementBinding::Wrap) diff --git a/components/script/dom/htmllielement.rs b/components/script/dom/htmllielement.rs index 5d15d405d94..950fc2b339b 100644 --- a/components/script/dom/htmllielement.rs +++ b/components/script/dom/htmllielement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLLIElement { pub htmlelement: HTMLElement, } @@ -31,6 +32,7 @@ impl HTMLLIElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLLIElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLLIElementBinding::Wrap) diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs index fae89c1c520..d8389033bd1 100644 --- a/components/script/dom/htmllinkelement.rs +++ b/components/script/dom/htmllinkelement.rs @@ -18,6 +18,7 @@ use servo_util::atom::Atom; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLLinkElement { pub htmlelement: HTMLElement, } @@ -35,6 +36,7 @@ impl HTMLLinkElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLLinkElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLLinkElementBinding::Wrap) diff --git a/components/script/dom/htmlmapelement.rs b/components/script/dom/htmlmapelement.rs index 21e9a04364f..3f2dfa381ee 100644 --- a/components/script/dom/htmlmapelement.rs +++ b/components/script/dom/htmlmapelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLMapElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLMapElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLMapElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLMapElementBinding::Wrap) diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index b9e1ad7782d..37aa5400429 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -13,6 +13,7 @@ use dom::node::ElementNodeTypeId; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLMediaElement { pub htmlelement: HTMLElement, } diff --git a/components/script/dom/htmlmetaelement.rs b/components/script/dom/htmlmetaelement.rs index 224d400a216..a8923db5cfc 100644 --- a/components/script/dom/htmlmetaelement.rs +++ b/components/script/dom/htmlmetaelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLMetaElement { pub htmlelement: HTMLElement, } @@ -31,6 +32,7 @@ impl HTMLMetaElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLMetaElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLMetaElementBinding::Wrap) diff --git a/components/script/dom/htmlmeterelement.rs b/components/script/dom/htmlmeterelement.rs index a0eeff8cb92..08495590d70 100644 --- a/components/script/dom/htmlmeterelement.rs +++ b/components/script/dom/htmlmeterelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLMeterElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLMeterElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLMeterElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLMeterElementBinding::Wrap) diff --git a/components/script/dom/htmlmodelement.rs b/components/script/dom/htmlmodelement.rs index 6ea001f5185..8b2b837524c 100644 --- a/components/script/dom/htmlmodelement.rs +++ b/components/script/dom/htmlmodelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLModElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLModElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLModElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLModElementBinding::Wrap) diff --git a/components/script/dom/htmlobjectelement.rs b/components/script/dom/htmlobjectelement.rs index 94c87719563..a702916d40a 100644 --- a/components/script/dom/htmlobjectelement.rs +++ b/components/script/dom/htmlobjectelement.rs @@ -27,6 +27,7 @@ use servo_util::str::DOMString; use url::Url; #[deriving(Encodable)] +#[must_root] pub struct HTMLObjectElement { pub htmlelement: HTMLElement, } @@ -44,6 +45,7 @@ impl HTMLObjectElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLObjectElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLObjectElementBinding::Wrap) diff --git a/components/script/dom/htmlolistelement.rs b/components/script/dom/htmlolistelement.rs index 11637fe3bd5..adb3441dd9a 100644 --- a/components/script/dom/htmlolistelement.rs +++ b/components/script/dom/htmlolistelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLOListElement { pub htmlelement: HTMLElement, } @@ -31,6 +32,7 @@ impl HTMLOListElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLOListElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLOListElementBinding::Wrap) diff --git a/components/script/dom/htmloptgroupelement.rs b/components/script/dom/htmloptgroupelement.rs index 6e90cb45fe5..ed9c61c760d 100644 --- a/components/script/dom/htmloptgroupelement.rs +++ b/components/script/dom/htmloptgroupelement.rs @@ -19,6 +19,7 @@ use servo_util::atom::Atom; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLOptGroupElement { pub htmlelement: HTMLElement } @@ -36,6 +37,7 @@ impl HTMLOptGroupElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLOptGroupElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLOptGroupElementBinding::Wrap) diff --git a/components/script/dom/htmloptionelement.rs b/components/script/dom/htmloptionelement.rs index d066784b285..22548b0aacc 100644 --- a/components/script/dom/htmloptionelement.rs +++ b/components/script/dom/htmloptionelement.rs @@ -19,6 +19,7 @@ use servo_util::atom::Atom; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLOptionElement { pub htmlelement: HTMLElement } @@ -36,6 +37,7 @@ impl HTMLOptionElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLOptionElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLOptionElementBinding::Wrap) diff --git a/components/script/dom/htmloutputelement.rs b/components/script/dom/htmloutputelement.rs index 19926cfe4fc..437ea192478 100644 --- a/components/script/dom/htmloutputelement.rs +++ b/components/script/dom/htmloutputelement.rs @@ -16,6 +16,7 @@ use dom::validitystate::ValidityState; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLOutputElement { pub htmlelement: HTMLElement } @@ -33,6 +34,7 @@ impl HTMLOutputElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLOutputElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLOutputElementBinding::Wrap) diff --git a/components/script/dom/htmlparagraphelement.rs b/components/script/dom/htmlparagraphelement.rs index fe4dd4317cf..9e51043e318 100644 --- a/components/script/dom/htmlparagraphelement.rs +++ b/components/script/dom/htmlparagraphelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLParagraphElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLParagraphElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLParagraphElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLParagraphElementBinding::Wrap) diff --git a/components/script/dom/htmlparamelement.rs b/components/script/dom/htmlparamelement.rs index 0f181bd1b32..fc44938f99d 100644 --- a/components/script/dom/htmlparamelement.rs +++ b/components/script/dom/htmlparamelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLParamElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLParamElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLParamElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLParamElementBinding::Wrap) diff --git a/components/script/dom/htmlpreelement.rs b/components/script/dom/htmlpreelement.rs index 25f9c75bc15..18f80da3808 100644 --- a/components/script/dom/htmlpreelement.rs +++ b/components/script/dom/htmlpreelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLPreElement { pub htmlelement: HTMLElement, } @@ -31,6 +32,7 @@ impl HTMLPreElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLPreElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLPreElementBinding::Wrap) diff --git a/components/script/dom/htmlprogresselement.rs b/components/script/dom/htmlprogresselement.rs index 74dcab1730f..b2e0d289efd 100644 --- a/components/script/dom/htmlprogresselement.rs +++ b/components/script/dom/htmlprogresselement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLProgressElement { pub htmlelement: HTMLElement, } @@ -31,6 +32,7 @@ impl HTMLProgressElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLProgressElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLProgressElementBinding::Wrap) diff --git a/components/script/dom/htmlquoteelement.rs b/components/script/dom/htmlquoteelement.rs index 488a82c394d..da8a7b72829 100644 --- a/components/script/dom/htmlquoteelement.rs +++ b/components/script/dom/htmlquoteelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLQuoteElement { pub htmlelement: HTMLElement, } @@ -31,6 +32,7 @@ impl HTMLQuoteElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLQuoteElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLQuoteElementBinding::Wrap) diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 3c189791b94..29cb155a984 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -20,6 +20,7 @@ use servo_util::namespace::Null; use servo_util::str::{DOMString, HTML_SPACE_CHARACTERS, StaticStringVec}; #[deriving(Encodable)] +#[must_root] pub struct HTMLScriptElement { pub htmlelement: HTMLElement, } @@ -37,6 +38,7 @@ impl HTMLScriptElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLScriptElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLScriptElementBinding::Wrap) diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index b8b5303cffb..66ca407966d 100644 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -22,6 +22,7 @@ use servo_util::atom::Atom; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLSelectElement { pub htmlelement: HTMLElement } @@ -39,6 +40,7 @@ impl HTMLSelectElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLSelectElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLSelectElementBinding::Wrap) diff --git a/components/script/dom/htmlsourceelement.rs b/components/script/dom/htmlsourceelement.rs index cb27b8c75d2..8936d9834f5 100644 --- a/components/script/dom/htmlsourceelement.rs +++ b/components/script/dom/htmlsourceelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLSourceElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLSourceElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLSourceElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLSourceElementBinding::Wrap) diff --git a/components/script/dom/htmlspanelement.rs b/components/script/dom/htmlspanelement.rs index 9b98b8fa28d..dc755096bb7 100644 --- a/components/script/dom/htmlspanelement.rs +++ b/components/script/dom/htmlspanelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLSpanElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLSpanElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLSpanElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLSpanElementBinding::Wrap) diff --git a/components/script/dom/htmlstyleelement.rs b/components/script/dom/htmlstyleelement.rs index d32219ea8f9..30aa81f15f1 100644 --- a/components/script/dom/htmlstyleelement.rs +++ b/components/script/dom/htmlstyleelement.rs @@ -18,6 +18,7 @@ use layout_interface::{AddStylesheetMsg, LayoutChan}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLStyleElement { pub htmlelement: HTMLElement, } @@ -35,6 +36,7 @@ impl HTMLStyleElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLStyleElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLStyleElementBinding::Wrap) diff --git a/components/script/dom/htmltablecaptionelement.rs b/components/script/dom/htmltablecaptionelement.rs index 92c45b49400..3797896de92 100644 --- a/components/script/dom/htmltablecaptionelement.rs +++ b/components/script/dom/htmltablecaptionelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLTableCaptionElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLTableCaptionElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLTableCaptionElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLTableCaptionElementBinding::Wrap) diff --git a/components/script/dom/htmltablecellelement.rs b/components/script/dom/htmltablecellelement.rs index 116768e23af..269f09fda57 100644 --- a/components/script/dom/htmltablecellelement.rs +++ b/components/script/dom/htmltablecellelement.rs @@ -13,6 +13,7 @@ use dom::node::ElementNodeTypeId; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLTableCellElement { pub htmlelement: HTMLElement, } diff --git a/components/script/dom/htmltablecolelement.rs b/components/script/dom/htmltablecolelement.rs index 48d6164e500..3ddc5fe50f5 100644 --- a/components/script/dom/htmltablecolelement.rs +++ b/components/script/dom/htmltablecolelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLTableColElement { pub htmlelement: HTMLElement, } @@ -31,6 +32,7 @@ impl HTMLTableColElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLTableColElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLTableColElementBinding::Wrap) diff --git a/components/script/dom/htmltabledatacellelement.rs b/components/script/dom/htmltabledatacellelement.rs index 07027b5d294..9ab9ad21693 100644 --- a/components/script/dom/htmltabledatacellelement.rs +++ b/components/script/dom/htmltabledatacellelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLTableDataCellElement { pub htmltablecellelement: HTMLTableCellElement, } @@ -31,6 +32,7 @@ impl HTMLTableDataCellElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLTableDataCellElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLTableDataCellElementBinding::Wrap) diff --git a/components/script/dom/htmltableelement.rs b/components/script/dom/htmltableelement.rs index f33b03fb778..9d1200f6e48 100644 --- a/components/script/dom/htmltableelement.rs +++ b/components/script/dom/htmltableelement.rs @@ -18,6 +18,7 @@ use dom::node::{Node, NodeHelpers, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLTableElement { pub htmlelement: HTMLElement, } @@ -35,6 +36,7 @@ impl HTMLTableElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLTableElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLTableElementBinding::Wrap) diff --git a/components/script/dom/htmltableheadercellelement.rs b/components/script/dom/htmltableheadercellelement.rs index 2ad288951da..8dd16bd2da2 100644 --- a/components/script/dom/htmltableheadercellelement.rs +++ b/components/script/dom/htmltableheadercellelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLTableHeaderCellElement { pub htmltablecellelement: HTMLTableCellElement, } @@ -31,6 +32,7 @@ impl HTMLTableHeaderCellElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLTableHeaderCellElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLTableHeaderCellElementBinding::Wrap) diff --git a/components/script/dom/htmltablerowelement.rs b/components/script/dom/htmltablerowelement.rs index de8978c75cd..c93d4a30413 100644 --- a/components/script/dom/htmltablerowelement.rs +++ b/components/script/dom/htmltablerowelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLTableRowElement { pub htmlelement: HTMLElement, } @@ -31,6 +32,7 @@ impl HTMLTableRowElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLTableRowElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLTableRowElementBinding::Wrap) diff --git a/components/script/dom/htmltablesectionelement.rs b/components/script/dom/htmltablesectionelement.rs index 1dc372862fc..51bc49ed1ea 100644 --- a/components/script/dom/htmltablesectionelement.rs +++ b/components/script/dom/htmltablesectionelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLTableSectionElement { pub htmlelement: HTMLElement, } @@ -31,6 +32,7 @@ impl HTMLTableSectionElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLTableSectionElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLTableSectionElementBinding::Wrap) diff --git a/components/script/dom/htmltemplateelement.rs b/components/script/dom/htmltemplateelement.rs index 12be7665169..ded7b61e096 100644 --- a/components/script/dom/htmltemplateelement.rs +++ b/components/script/dom/htmltemplateelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLTemplateElement { pub htmlelement: HTMLElement, } @@ -31,6 +32,7 @@ impl HTMLTemplateElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLTemplateElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLTemplateElementBinding::Wrap) diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index 5385fefab7e..7d16a6638f8 100644 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -19,6 +19,7 @@ use servo_util::atom::Atom; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLTextAreaElement { pub htmlelement: HTMLElement, } @@ -36,6 +37,7 @@ impl HTMLTextAreaElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLTextAreaElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLTextAreaElementBinding::Wrap) diff --git a/components/script/dom/htmltimeelement.rs b/components/script/dom/htmltimeelement.rs index 8eeb695d4c6..7847ba3c17e 100644 --- a/components/script/dom/htmltimeelement.rs +++ b/components/script/dom/htmltimeelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLTimeElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLTimeElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLTimeElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLTimeElementBinding::Wrap) diff --git a/components/script/dom/htmltitleelement.rs b/components/script/dom/htmltitleelement.rs index 550a531aa76..41ee2fb362c 100644 --- a/components/script/dom/htmltitleelement.rs +++ b/components/script/dom/htmltitleelement.rs @@ -17,6 +17,7 @@ use dom::text::Text; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLTitleElement { pub htmlelement: HTMLElement, } @@ -34,6 +35,7 @@ impl HTMLTitleElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLTitleElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLTitleElementBinding::Wrap) diff --git a/components/script/dom/htmltrackelement.rs b/components/script/dom/htmltrackelement.rs index 5d22571db67..f0902e8d9de 100644 --- a/components/script/dom/htmltrackelement.rs +++ b/components/script/dom/htmltrackelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLTrackElement { pub htmlelement: HTMLElement, } @@ -31,6 +32,7 @@ impl HTMLTrackElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLTrackElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLTrackElementBinding::Wrap) diff --git a/components/script/dom/htmlulistelement.rs b/components/script/dom/htmlulistelement.rs index 228152cc663..6b20824522e 100644 --- a/components/script/dom/htmlulistelement.rs +++ b/components/script/dom/htmlulistelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLUListElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLUListElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLUListElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLUListElementBinding::Wrap) diff --git a/components/script/dom/htmlunknownelement.rs b/components/script/dom/htmlunknownelement.rs index 2956b0c459a..f087e3c2cbf 100644 --- a/components/script/dom/htmlunknownelement.rs +++ b/components/script/dom/htmlunknownelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLUnknownElement { pub htmlelement: HTMLElement } @@ -31,6 +32,7 @@ impl HTMLUnknownElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLUnknownElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLUnknownElementBinding::Wrap) diff --git a/components/script/dom/htmlvideoelement.rs b/components/script/dom/htmlvideoelement.rs index 365b9a38f20..bd4ca20a6f7 100644 --- a/components/script/dom/htmlvideoelement.rs +++ b/components/script/dom/htmlvideoelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, ElementNodeTypeId}; use servo_util::str::DOMString; #[deriving(Encodable)] +#[must_root] pub struct HTMLVideoElement { pub htmlmediaelement: HTMLMediaElement } @@ -31,6 +32,7 @@ impl HTMLVideoElement { } } + #[allow(unrooted_must_root)] pub fn new(localName: DOMString, document: &JSRef) -> Temporary { let element = HTMLVideoElement::new_inherited(localName, document); Node::reflect_node(box element, document, HTMLVideoElementBinding::Wrap) diff --git a/components/script/dom/processinginstruction.rs b/components/script/dom/processinginstruction.rs index 26dd207f343..14e6c8b4f2e 100644 --- a/components/script/dom/processinginstruction.rs +++ b/components/script/dom/processinginstruction.rs @@ -36,8 +36,8 @@ impl ProcessingInstruction { } pub fn new(target: DOMString, data: DOMString, document: &JSRef) -> Temporary { - let node = ProcessingInstruction::new_inherited(target, data, document); - Node::reflect_node(box node, document, ProcessingInstructionBinding::Wrap) + Node::reflect_node(box ProcessingInstruction::new_inherited(target, data, document), + document, ProcessingInstructionBinding::Wrap) } } diff --git a/components/script/dom/text.rs b/components/script/dom/text.rs index a8cbef5b852..6f5e97dec74 100644 --- a/components/script/dom/text.rs +++ b/components/script/dom/text.rs @@ -36,8 +36,8 @@ impl Text { } pub fn new(text: DOMString, document: &JSRef) -> Temporary { - let node = Text::new_inherited(text, document); - Node::reflect_node(box node, document, TextBinding::Wrap) + Node::reflect_node(box Text::new_inherited(text, document), + document, TextBinding::Wrap) } pub fn Constructor(global: &GlobalRef, text: DOMString) -> Fallible> {