diff --git a/components/plugins/reflector.rs b/components/plugins/reflector.rs index 4e6f69ed2d34..04e22fa826c7 100644 --- a/components/plugins/reflector.rs +++ b/components/plugins/reflector.rs @@ -24,12 +24,17 @@ pub fn expand_reflector(cx: &mut ExtCtxt, span: Span, _: &MetaItem, annotatable: fn reflector<'a>(&'a self) -> &'a ::dom::bindings::reflector::Reflector { &self.$field_name } + } + ); + let impl_item_mut = quote_item!(cx, + impl ::dom::bindings::reflector::MutReflectable for $struct_name { fn init_reflector(&mut self, obj: *mut ::js::jsapi::JSObject) { self.$field_name.set_jsobject(obj); } } ); - impl_item.map(|it| push(Annotatable::Item(it))) + impl_item.map(|it| push(Annotatable::Item(it))); + impl_item_mut.map(|it| push(Annotatable::Item(it))) }, // Or just call it on the first field (supertype). None => { @@ -39,12 +44,17 @@ pub fn expand_reflector(cx: &mut ExtCtxt, span: Span, _: &MetaItem, annotatable: fn reflector<'a>(&'a self) -> &'a ::dom::bindings::reflector::Reflector { self.$field_name.reflector() } + } + ); + let impl_item_mut = quote_item!(cx, + impl ::dom::bindings::reflector::MutReflectable for $struct_name { fn init_reflector(&mut self, obj: *mut ::js::jsapi::JSObject) { self.$field_name.init_reflector(obj); } } ); - impl_item.map(|it| push(Annotatable::Item(it))) + impl_item.map(|it| push(Annotatable::Item(it))); + impl_item_mut.map(|it| push(Annotatable::Item(it))) } }; diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index cb7e796c627d..71331dfe503f 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -5452,6 +5452,7 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries 'dom::bindings::js::OptionalRootedReference', 'dom::bindings::js::Root', 'dom::bindings::js::RootedReference', + 'dom::bindings::reflector::MutReflectable', 'dom::bindings::reflector::Reflectable', 'dom::bindings::utils::DOMClass', 'dom::bindings::utils::DOMJSClass', diff --git a/components/script/dom/bindings/iterable.rs b/components/script/dom/bindings/iterable.rs index a3092ed73b65..84381b52655b 100644 --- a/components/script/dom/bindings/iterable.rs +++ b/components/script/dom/bindings/iterable.rs @@ -12,7 +12,7 @@ use dom::bindings::codegen::Bindings::IterableIteratorBinding::IterableKeyOrValu use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, Root}; -use dom::bindings::reflector::{Reflector, Reflectable, reflect_dom_object}; +use dom::bindings::reflector::{Reflector, Reflectable, MutReflectable, reflect_dom_object}; use dom::bindings::trace::JSTraceable; use js::conversions::ToJSValConvertible; use js::jsapi::{JSContext, JSObject, MutableHandleValue, MutableHandleObject, HandleValue}; @@ -63,6 +63,9 @@ impl Reflectable for IterableIterator(&'a self) -> &'a Reflector { &self.reflector } +} + +impl MutReflectable for IterableIterator { fn init_reflector(&mut self, obj: *mut JSObject) { self.reflector.set_jsobject(obj); } diff --git a/components/script/dom/bindings/reflector.rs b/components/script/dom/bindings/reflector.rs index 04466ea69268..d5280712a03c 100644 --- a/components/script/dom/bindings/reflector.rs +++ b/components/script/dom/bindings/reflector.rs @@ -73,11 +73,15 @@ impl Reflector { pub trait Reflectable { /// Returns the receiver's reflector. fn reflector(&self) -> &Reflector; - /// Initializes the Reflector - fn init_reflector(&mut self, obj: *mut JSObject); /// Returns the global object of the realm that the Reflectable was created in. fn global(&self) -> GlobalRoot where Self: Sized { global_root_from_reflector(self) } } + +/// A trait to initialize the `Reflector` for a DOM object. +pub trait MutReflectable: Reflectable { + /// Initializes the Reflector + fn init_reflector(&mut self, obj: *mut JSObject); +} diff --git a/components/script/dom/browsingcontext.rs b/components/script/dom/browsingcontext.rs index 18fbe914cef9..919b574c27a1 100644 --- a/components/script/dom/browsingcontext.rs +++ b/components/script/dom/browsingcontext.rs @@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods; use dom::bindings::conversions::{ToJSValConvertible, root_from_handleobject}; use dom::bindings::js::{JS, Root, RootedReference}; use dom::bindings::proxyhandler::{fill_property_descriptor, get_property_descriptor}; -use dom::bindings::reflector::{Reflectable, Reflector}; +use dom::bindings::reflector::{Reflectable, MutReflectable, Reflector}; use dom::bindings::str::DOMString; use dom::bindings::trace::JSTraceable; use dom::bindings::utils::WindowProxyHandler;