diff options
author | Josh Matthews <josh@joshmatthews.net> | 2023-05-28 22:43:55 -0400 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2023-05-28 23:23:12 -0400 |
commit | dbff26bce05d404027ef5bbfd85fb5995e4726bc (patch) | |
tree | 6ebb631eef396c2f387fe8269b0d59bde0dccae2 /components/script/dom | |
parent | d9600ff50f3c1bdd8c44e2dfc15a18416d80cb82 (diff) | |
download | servo-dbff26bce05d404027ef5bbfd85fb5995e4726bc.tar.gz servo-dbff26bce05d404027ef5bbfd85fb5995e4726bc.zip |
Support arbitrary protos when wrapping DOM objects with constructors.
Diffstat (limited to 'components/script/dom')
195 files changed, 2026 insertions, 584 deletions
diff --git a/components/script/dom/analysernode.rs b/components/script/dom/analysernode.rs index d09dd61d9f3..ac703adcea7 100644 --- a/components/script/dom/analysernode.rs +++ b/components/script/dom/analysernode.rs @@ -14,14 +14,14 @@ use crate::dom::bindings::codegen::Bindings::AudioNodeBinding::{ use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::num::Finite; use crate::dom::bindings::refcounted::Trusted; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::window::Window; use crate::task_source::TaskSource; use dom_struct::dom_struct; use ipc_channel::ipc::{self, IpcReceiver}; use ipc_channel::router::ROUTER; -use js::rust::CustomAutoRooterGuard; +use js::rust::{CustomAutoRooterGuard, HandleObject}; use js::typedarray::{Float32Array, Uint8Array}; use servo_media::audio::analyser_node::AnalysisEngine; use servo_media::audio::block::Block; @@ -89,14 +89,23 @@ impl AnalyserNode { )) } - #[allow(unrooted_must_root)] pub fn new( window: &Window, context: &BaseAudioContext, options: &AnalyserOptions, ) -> Fallible<DomRoot<AnalyserNode>> { + Self::new_with_proto(window, None, context, options) + } + + #[allow(unrooted_must_root)] + pub fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + context: &BaseAudioContext, + options: &AnalyserOptions, + ) -> Fallible<DomRoot<AnalyserNode>> { let (node, recv) = AnalyserNode::new_inherited(window, context, options)?; - let object = reflect_dom_object(Box::new(node), window); + let object = reflect_dom_object2(Box::new(node), window, proto); let (source, canceller) = window .task_manager() .dom_manipulation_task_source_with_canceller(); @@ -122,10 +131,11 @@ impl AnalyserNode { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, context: &BaseAudioContext, options: &AnalyserOptions, ) -> Fallible<DomRoot<AnalyserNode>> { - AnalyserNode::new(window, context, options) + AnalyserNode::new_with_proto(window, proto, context, options) } pub fn push_block(&self, block: Block) { diff --git a/components/script/dom/animationevent.rs b/components/script/dom/animationevent.rs index 191b460228d..1a5179c7ebe 100644 --- a/components/script/dom/animationevent.rs +++ b/components/script/dom/animationevent.rs @@ -8,12 +8,13 @@ use crate::dom::bindings::codegen::Bindings::AnimationEventBinding::{ use crate::dom::bindings::codegen::Bindings::EventBinding::EventMethods; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::num::Finite; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::event::Event; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; #[dom_struct] @@ -35,7 +36,11 @@ impl AnimationEvent { } pub fn new(window: &Window, type_: Atom, init: &AnimationEventInit) -> DomRoot<AnimationEvent> { - let ev = reflect_dom_object(Box::new(AnimationEvent::new_inherited(init)), window); + Self::new_with_proto(window, None, type_, init) + } + + fn new_with_proto(window: &Window, proto: Option<HandleObject>, type_: Atom, init: &AnimationEventInit) -> DomRoot<AnimationEvent> { + let ev = reflect_dom_object2(Box::new(AnimationEvent::new_inherited(init)), window, proto); { let event = ev.upcast::<Event>(); event.init_event(type_, init.parent.bubbles, init.parent.cancelable); @@ -46,10 +51,11 @@ impl AnimationEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &AnimationEventInit, ) -> DomRoot<AnimationEvent> { - AnimationEvent::new(window, Atom::from(type_), init) + AnimationEvent::new_with_proto(window, proto, Atom::from(type_), init) } } diff --git a/components/script/dom/audiobuffer.rs b/components/script/dom/audiobuffer.rs index 268424d1c4b..9d1e011066a 100644 --- a/components/script/dom/audiobuffer.rs +++ b/components/script/dom/audiobuffer.rs @@ -9,7 +9,7 @@ use crate::dom::bindings::codegen::Bindings::AudioBufferBinding::{ }; use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::num::Finite; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::globalscope::GlobalScope; use crate::dom::window::Window; @@ -20,6 +20,7 @@ use js::jsapi::JS_GetArrayBufferViewBuffer; use js::jsapi::{Heap, JSObject}; use js::rust::wrappers::DetachArrayBuffer; use js::rust::CustomAutoRooterGuard; +use js::rust::HandleObject; use js::typedarray::{CreateWith, Float32Array}; use servo_media::audio::buffer_source_node::AudioBuffer as ServoMediaAudioBuffer; use std::cmp::min; @@ -76,7 +77,6 @@ impl AudioBuffer { } } - #[allow(unrooted_must_root)] pub fn new( global: &Window, number_of_channels: u32, @@ -84,8 +84,20 @@ impl AudioBuffer { sample_rate: f32, initial_data: Option<&[Vec<f32>]>, ) -> DomRoot<AudioBuffer> { + Self::new_with_proto(global, None, number_of_channels, length, sample_rate, initial_data) + } + + #[allow(unrooted_must_root)] + fn new_with_proto( + global: &Window, + proto: Option<HandleObject>, + number_of_channels: u32, + length: u32, + sample_rate: f32, + initial_data: Option<&[Vec<f32>]>, + ) -> DomRoot<AudioBuffer> { let buffer = AudioBuffer::new_inherited(number_of_channels, length, sample_rate); - let buffer = reflect_dom_object(Box::new(buffer), global); + let buffer = reflect_dom_object2(Box::new(buffer), global, proto); buffer.set_initial_data(initial_data); buffer } @@ -94,6 +106,7 @@ impl AudioBuffer { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, options: &AudioBufferOptions, ) -> Fallible<DomRoot<AudioBuffer>> { if options.length <= 0 || @@ -104,8 +117,9 @@ impl AudioBuffer { { return Err(Error::NotSupported); } - Ok(AudioBuffer::new( + Ok(AudioBuffer::new_with_proto( window, + proto, options.numberOfChannels, options.length, *options.sampleRate, diff --git a/components/script/dom/audiobuffersourcenode.rs b/components/script/dom/audiobuffersourcenode.rs index 683f32f4ec0..affbe4797fe 100644 --- a/components/script/dom/audiobuffersourcenode.rs +++ b/components/script/dom/audiobuffersourcenode.rs @@ -13,10 +13,11 @@ use crate::dom::bindings::codegen::Bindings::AudioScheduledSourceNodeBinding::Au use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::num::Finite; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom}; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_media::audio::buffer_source_node::AudioBufferSourceNodeMessage; use servo_media::audio::buffer_source_node::AudioBufferSourceNodeOptions; use servo_media::audio::node::{AudioNodeInit, AudioNodeMessage}; @@ -92,23 +93,33 @@ impl AudioBufferSourceNode { Ok(node) } - #[allow(unrooted_must_root)] pub fn new( window: &Window, context: &BaseAudioContext, options: &AudioBufferSourceOptions, ) -> Fallible<DomRoot<AudioBufferSourceNode>> { + Self::new_with_proto(window, None, context, options) + } + + #[allow(unrooted_must_root)] + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + context: &BaseAudioContext, + options: &AudioBufferSourceOptions, + ) -> Fallible<DomRoot<AudioBufferSourceNode>> { let node = AudioBufferSourceNode::new_inherited(window, context, options)?; - Ok(reflect_dom_object(Box::new(node), window)) + Ok(reflect_dom_object2(Box::new(node), window, proto)) } #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, context: &BaseAudioContext, options: &AudioBufferSourceOptions, ) -> Fallible<DomRoot<AudioBufferSourceNode>> { - AudioBufferSourceNode::new(window, context, options) + AudioBufferSourceNode::new_with_proto(window, proto, context, options) } } diff --git a/components/script/dom/audiocontext.rs b/components/script/dom/audiocontext.rs index 4f0d10285fa..1dac9a00cf6 100644 --- a/components/script/dom/audiocontext.rs +++ b/components/script/dom/audiocontext.rs @@ -17,7 +17,7 @@ use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::num::Finite; use crate::dom::bindings::refcounted::{Trusted, TrustedPromise}; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::DomRoot; use crate::dom::htmlmediaelement::HTMLMediaElement; use crate::dom::mediaelementaudiosourcenode::MediaElementAudioSourceNode; @@ -31,6 +31,7 @@ use crate::dom::window::Window; use crate::realms::InRealm; use crate::task_source::TaskSource; use dom_struct::dom_struct; +use js::rust::HandleObject; use msg::constellation_msg::PipelineId; use servo_media::audio::context::{LatencyCategory, ProcessingState, RealTimeAudioContextOptions}; use std::rc::Rc; @@ -79,10 +80,10 @@ impl AudioContext { } #[allow(unrooted_must_root)] - pub fn new(window: &Window, options: &AudioContextOptions) -> DomRoot<AudioContext> { + fn new(window: &Window, proto: Option<HandleObject>, options: &AudioContextOptions) -> DomRoot<AudioContext> { let pipeline_id = window.pipeline_id(); let context = AudioContext::new_inherited(options, pipeline_id); - let context = reflect_dom_object(Box::new(context), window); + let context = reflect_dom_object2(Box::new(context), window, proto); context.resume(); context } @@ -91,9 +92,10 @@ impl AudioContext { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, options: &AudioContextOptions, ) -> Fallible<DomRoot<AudioContext>> { - Ok(AudioContext::new(window, options)) + Ok(AudioContext::new(window, proto, options)) } fn resume(&self) { diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 5ed330083b9..b0f89c6a1d3 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -6147,9 +6147,7 @@ let global = DomRoot::downcast::<dom::types::%s>(global).unwrap(); else: name = self.constructor.identifier.name nativeName = MakeNativeName(self.descriptor.binaryNameFor(name)) - args = ["&global"] - if self.descriptor.interface.identifier.name == "EventTarget": - args += ["desired_proto.handle()"] + args = ["&global", "Some(desired_proto.handle())"] constructorCall = CGMethodCall(args, nativeName, True, self.descriptor, self.constructor) return CGList([preamble, constructorCall]) diff --git a/components/script/dom/bindings/htmlconstructor.rs b/components/script/dom/bindings/htmlconstructor.rs index 76d717ff4b7..5d74f153c8b 100644 --- a/components/script/dom/bindings/htmlconstructor.rs +++ b/components/script/dom/bindings/htmlconstructor.rs @@ -225,10 +225,12 @@ unsafe fn html_constructor( None => { // Step 8.1 let name = QualName::new(None, ns!(html), definition.local_name.clone()); + // Any prototype used to create these elements will be overwritten before returning + // from this function, so we don't bother overwriting the defaults here. let element = if definition.is_autonomous() { - DomRoot::upcast(HTMLElement::new(name.local, None, &*document)) + DomRoot::upcast(HTMLElement::new(name.local, None, &*document, None)) } else { - create_native_html_element(name, None, &*document, ElementCreator::ScriptCreated) + create_native_html_element(name, None, &*document, ElementCreator::ScriptCreated, None) }; // Step 8.2 is performed in the generated caller code. diff --git a/components/script/dom/bindings/reflector.rs b/components/script/dom/bindings/reflector.rs index 32c3d7645e1..418cad032e3 100644 --- a/components/script/dom/bindings/reflector.rs +++ b/components/script/dom/bindings/reflector.rs @@ -26,13 +26,13 @@ where unsafe { T::WRAP(GlobalScope::get_cx(), global_scope, None, obj) } } -pub fn reflect_dom_object2<T, U>(obj: Box<T>, global: &U, proto: HandleObject) -> DomRoot<T> +pub fn reflect_dom_object2<T, U>(obj: Box<T>, global: &U, proto: Option<HandleObject>) -> DomRoot<T> where T: DomObject + DomObjectWrap, U: DerivedFrom<GlobalScope>, { let global_scope = global.upcast(); - unsafe { T::WRAP(GlobalScope::get_cx(), global_scope, Some(proto), obj) } + unsafe { T::WRAP(GlobalScope::get_cx(), global_scope, proto, obj) } } /// A struct to store a reference to the reflector of a DOM object. diff --git a/components/script/dom/biquadfilternode.rs b/components/script/dom/biquadfilternode.rs index 540f094bfe5..6359383d2ac 100644 --- a/components/script/dom/biquadfilternode.rs +++ b/components/script/dom/biquadfilternode.rs @@ -13,10 +13,11 @@ use crate::dom::bindings::codegen::Bindings::BiquadFilterNodeBinding::BiquadFilt use crate::dom::bindings::codegen::Bindings::BiquadFilterNodeBinding::BiquadFilterOptions; use crate::dom::bindings::codegen::Bindings::BiquadFilterNodeBinding::BiquadFilterType; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_media::audio::biquad_filter_node::BiquadFilterNodeMessage; use servo_media::audio::biquad_filter_node::{BiquadFilterNodeOptions, FilterType}; use servo_media::audio::node::{AudioNodeInit, AudioNodeMessage}; @@ -104,23 +105,33 @@ impl BiquadFilterNode { }) } - #[allow(unrooted_must_root)] pub fn new( window: &Window, context: &BaseAudioContext, options: &BiquadFilterOptions, ) -> Fallible<DomRoot<BiquadFilterNode>> { + Self::new_with_proto(window, None, context, options) + } + + #[allow(unrooted_must_root)] + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + context: &BaseAudioContext, + options: &BiquadFilterOptions, + ) -> Fallible<DomRoot<BiquadFilterNode>> { let node = BiquadFilterNode::new_inherited(window, context, options)?; - Ok(reflect_dom_object(Box::new(node), window)) + Ok(reflect_dom_object2(Box::new(node), window, proto)) } #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, context: &BaseAudioContext, options: &BiquadFilterOptions, ) -> Fallible<DomRoot<BiquadFilterNode>> { - BiquadFilterNode::new(window, context, options) + BiquadFilterNode::new_with_proto(window, proto, context, options) } } diff --git a/components/script/dom/blob.rs b/components/script/dom/blob.rs index 4cc0149d008..fe0bd2647a4 100644 --- a/components/script/dom/blob.rs +++ b/components/script/dom/blob.rs @@ -7,7 +7,7 @@ use crate::dom::bindings::codegen::Bindings::BlobBinding; use crate::dom::bindings::codegen::Bindings::BlobBinding::BlobMethods; use crate::dom::bindings::codegen::UnionTypes::ArrayBufferOrArrayBufferViewOrBlobOrString; use crate::dom::bindings::error::{Error, Fallible}; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::serializable::{Serializable, StorageKey}; use crate::dom::bindings::str::DOMString; @@ -20,6 +20,7 @@ use crate::script_runtime::JSContext; use dom_struct::dom_struct; use encoding_rs::UTF_8; use js::jsapi::JSObject; +use js::rust::HandleObject; use msg::constellation_msg::{BlobId, BlobIndex, PipelineNamespaceId}; use net_traits::filemanager_thread::RelativePos; use script_traits::serializable::BlobImpl; @@ -38,7 +39,11 @@ pub struct Blob { impl Blob { pub fn new(global: &GlobalScope, blob_impl: BlobImpl) -> DomRoot<Blob> { - let dom_blob = reflect_dom_object(Box::new(Blob::new_inherited(&blob_impl)), global); + Self::new_with_proto(global, None, blob_impl) + } + + fn new_with_proto(global: &GlobalScope, proto: Option<HandleObject>, blob_impl: BlobImpl) -> DomRoot<Blob> { + let dom_blob = reflect_dom_object2(Box::new(Blob::new_inherited(&blob_impl)), global, proto); global.track_blob(&dom_blob, blob_impl); dom_blob } @@ -55,6 +60,7 @@ impl Blob { #[allow(non_snake_case)] pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, blobParts: Option<Vec<ArrayBufferOrArrayBufferViewOrBlobOrString>>, blobPropertyBag: &BlobBinding::BlobPropertyBag, ) -> Fallible<DomRoot<Blob>> { @@ -69,7 +75,7 @@ impl Blob { let type_string = normalize_type_string(&blobPropertyBag.type_.to_string()); let blob_impl = BlobImpl::new_from_bytes(bytes, type_string); - Ok(Blob::new(global, blob_impl)) + Ok(Blob::new_with_proto(global, proto, blob_impl)) } /// Get a slice to inner data, this might incur synchronous read and caching diff --git a/components/script/dom/bluetoothadvertisingevent.rs b/components/script/dom/bluetoothadvertisingevent.rs index 7d31fad2dc7..0110b898222 100644 --- a/components/script/dom/bluetoothadvertisingevent.rs +++ b/components/script/dom/bluetoothadvertisingevent.rs @@ -7,7 +7,7 @@ use crate::dom::bindings::codegen::Bindings::BluetoothAdvertisingEventBinding::B use crate::dom::bindings::codegen::Bindings::EventBinding::EventBinding::EventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::bluetoothdevice::BluetoothDevice; @@ -15,6 +15,7 @@ use crate::dom::event::{Event, EventBubbles, EventCancelable}; use crate::dom::globalscope::GlobalScope; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; // https://webbluetoothcg.github.io/web-bluetooth/#bluetoothadvertisingevent @@ -47,8 +48,9 @@ impl BluetoothAdvertisingEvent { } } - pub fn new( + fn new( global: &GlobalScope, + proto: Option<HandleObject>, type_: Atom, bubbles: EventBubbles, cancelable: EventCancelable, @@ -58,11 +60,12 @@ impl BluetoothAdvertisingEvent { txPower: Option<i8>, rssi: Option<i8>, ) -> DomRoot<BluetoothAdvertisingEvent> { - let ev = reflect_dom_object( + let ev = reflect_dom_object2( Box::new(BluetoothAdvertisingEvent::new_inherited( device, name, appearance, txPower, rssi, )), global, + proto, ); { let event = ev.upcast::<Event>(); @@ -74,6 +77,7 @@ impl BluetoothAdvertisingEvent { // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothadvertisingevent-bluetoothadvertisingevent pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &BluetoothAdvertisingEventInit, ) -> Fallible<DomRoot<BluetoothAdvertisingEvent>> { @@ -86,6 +90,7 @@ impl BluetoothAdvertisingEvent { let cancelable = EventCancelable::from(init.parent.cancelable); Ok(BluetoothAdvertisingEvent::new( global, + proto, Atom::from(type_), bubbles, cancelable, diff --git a/components/script/dom/broadcastchannel.rs b/components/script/dom/broadcastchannel.rs index 701f71b27cd..57aa572e652 100644 --- a/components/script/dom/broadcastchannel.rs +++ b/components/script/dom/broadcastchannel.rs @@ -4,7 +4,7 @@ use crate::dom::bindings::codegen::Bindings::BroadcastChannelBinding::BroadcastChannelMethods; use crate::dom::bindings::error::{Error, ErrorResult}; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::bindings::structuredclone; @@ -12,7 +12,7 @@ use crate::dom::eventtarget::EventTarget; use crate::dom::globalscope::GlobalScope; use crate::script_runtime::JSContext as SafeJSContext; use dom_struct::dom_struct; -use js::rust::HandleValue; +use js::rust::{HandleValue, HandleObject}; use script_traits::BroadcastMsg; use std::cell::Cell; use uuid::Uuid; @@ -28,12 +28,12 @@ pub struct BroadcastChannel { impl BroadcastChannel { /// <https://html.spec.whatwg.org/multipage/#broadcastchannel> #[allow(non_snake_case)] - pub fn Constructor(global: &GlobalScope, name: DOMString) -> DomRoot<BroadcastChannel> { - BroadcastChannel::new(global, name) + pub fn Constructor(global: &GlobalScope, proto: Option<HandleObject>, name: DOMString) -> DomRoot<BroadcastChannel> { + BroadcastChannel::new(global, proto, name) } - pub fn new(global: &GlobalScope, name: DOMString) -> DomRoot<BroadcastChannel> { - let channel = reflect_dom_object(Box::new(BroadcastChannel::new_inherited(name)), global); + fn new(global: &GlobalScope, proto: Option<HandleObject>, name: DOMString) -> DomRoot<BroadcastChannel> { + let channel = reflect_dom_object2(Box::new(BroadcastChannel::new_inherited(name)), global, proto); global.track_broadcast_channel(&*channel); channel } diff --git a/components/script/dom/channelmergernode.rs b/components/script/dom/channelmergernode.rs index 7e8bccd885e..e57543019f6 100644 --- a/components/script/dom/channelmergernode.rs +++ b/components/script/dom/channelmergernode.rs @@ -9,10 +9,11 @@ use crate::dom::bindings::codegen::Bindings::AudioNodeBinding::{ }; use crate::dom::bindings::codegen::Bindings::ChannelMergerNodeBinding::ChannelMergerOptions; use crate::dom::bindings::error::{Error, Fallible}; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_media::audio::channel_node::ChannelNodeOptions; use servo_media::audio::node::AudioNodeInit; @@ -52,23 +53,33 @@ impl ChannelMergerNode { Ok(ChannelMergerNode { node }) } - #[allow(unrooted_must_root)] pub fn new( window: &Window, context: &BaseAudioContext, options: &ChannelMergerOptions, ) -> Fallible<DomRoot<ChannelMergerNode>> { + Self::new_with_proto(window, None, context, options) + } + + #[allow(unrooted_must_root)] + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + context: &BaseAudioContext, + options: &ChannelMergerOptions, + ) -> Fallible<DomRoot<ChannelMergerNode>> { let node = ChannelMergerNode::new_inherited(window, context, options)?; - Ok(reflect_dom_object(Box::new(node), window)) + Ok(reflect_dom_object2(Box::new(node), window, proto)) } #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, context: &BaseAudioContext, options: &ChannelMergerOptions, ) -> Fallible<DomRoot<ChannelMergerNode>> { - ChannelMergerNode::new(window, context, options) + ChannelMergerNode::new_with_proto(window, proto, context, options) } } diff --git a/components/script/dom/channelsplitternode.rs b/components/script/dom/channelsplitternode.rs index 3efd3b2465c..ca9477be9fa 100644 --- a/components/script/dom/channelsplitternode.rs +++ b/components/script/dom/channelsplitternode.rs @@ -9,10 +9,11 @@ use crate::dom::bindings::codegen::Bindings::AudioNodeBinding::{ }; use crate::dom::bindings::codegen::Bindings::ChannelSplitterNodeBinding::ChannelSplitterOptions; use crate::dom::bindings::error::{Error, Fallible}; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_media::audio::node::AudioNodeInit; #[dom_struct] @@ -54,22 +55,32 @@ impl ChannelSplitterNode { Ok(ChannelSplitterNode { node }) } - #[allow(unrooted_must_root)] pub fn new( window: &Window, context: &BaseAudioContext, options: &ChannelSplitterOptions, ) -> Fallible<DomRoot<ChannelSplitterNode>> { + Self::new_with_proto(window, None, context, options) + } + + #[allow(unrooted_must_root)] + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + context: &BaseAudioContext, + options: &ChannelSplitterOptions, + ) -> Fallible<DomRoot<ChannelSplitterNode>> { let node = ChannelSplitterNode::new_inherited(window, context, options)?; - Ok(reflect_dom_object(Box::new(node), window)) + Ok(reflect_dom_object2(Box::new(node), window, proto)) } #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, context: &BaseAudioContext, options: &ChannelSplitterOptions, ) -> Fallible<DomRoot<ChannelSplitterNode>> { - ChannelSplitterNode::new(window, context, options) + ChannelSplitterNode::new_with_proto(window, proto, context, options) } } diff --git a/components/script/dom/characterdata.rs b/components/script/dom/characterdata.rs index f8c5acb5a8f..cbaa847e8ee 100644 --- a/components/script/dom/characterdata.rs +++ b/components/script/dom/characterdata.rs @@ -43,7 +43,7 @@ impl CharacterData { pub fn clone_with_data(&self, data: DOMString, document: &Document) -> DomRoot<Node> { match self.upcast::<Node>().type_id() { NodeTypeId::CharacterData(CharacterDataTypeId::Comment) => { - DomRoot::upcast(Comment::new(data, &document)) + DomRoot::upcast(Comment::new(data, &document, None)) }, NodeTypeId::CharacterData(CharacterDataTypeId::ProcessingInstruction) => { let pi = self.downcast::<ProcessingInstruction>().unwrap(); diff --git a/components/script/dom/closeevent.rs b/components/script/dom/closeevent.rs index abc579d8df9..81bf60c99af 100644 --- a/components/script/dom/closeevent.rs +++ b/components/script/dom/closeevent.rs @@ -7,12 +7,13 @@ use crate::dom::bindings::codegen::Bindings::CloseEventBinding::CloseEventMethod use crate::dom::bindings::codegen::Bindings::EventBinding::EventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::event::{Event, EventBubbles, EventCancelable}; use crate::dom::globalscope::GlobalScope; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; #[dom_struct] @@ -43,8 +44,30 @@ impl CloseEvent { code: u16, reason: DOMString, ) -> DomRoot<CloseEvent> { + Self::new_with_proto( + global, + None, + type_, + bubbles, + cancelable, + wasClean, + code, + reason, + ) + } + + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + type_: Atom, + bubbles: EventBubbles, + cancelable: EventCancelable, + wasClean: bool, + code: u16, + reason: DOMString, + ) -> DomRoot<CloseEvent> { let event = Box::new(CloseEvent::new_inherited(wasClean, code, reason)); - let ev = reflect_dom_object(event, global); + let ev = reflect_dom_object2(event, global, proto); { let event = ev.upcast::<Event>(); event.init_event(type_, bool::from(bubbles), bool::from(cancelable)); @@ -54,13 +77,15 @@ impl CloseEvent { pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, type_: DOMString, init: &CloseEventBinding::CloseEventInit, ) -> Fallible<DomRoot<CloseEvent>> { let bubbles = EventBubbles::from(init.parent.bubbles); let cancelable = EventCancelable::from(init.parent.cancelable); - Ok(CloseEvent::new( + Ok(CloseEvent::new_with_proto( global, + proto, Atom::from(type_), bubbles, cancelable, diff --git a/components/script/dom/comment.rs b/components/script/dom/comment.rs index d87f4d77094..96df242a5df 100644 --- a/components/script/dom/comment.rs +++ b/components/script/dom/comment.rs @@ -11,6 +11,7 @@ use crate::dom::document::Document; use crate::dom::node::Node; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; /// An HTML comment. #[dom_struct] @@ -25,13 +26,13 @@ impl Comment { } } - pub fn new(text: DOMString, document: &Document) -> DomRoot<Comment> { - Node::reflect_node(Box::new(Comment::new_inherited(text, document)), document) + pub fn new(text: DOMString, document: &Document, proto: Option<HandleObject>) -> DomRoot<Comment> { + Node::reflect_node_with_proto(Box::new(Comment::new_inherited(text, document)), document, proto) } #[allow(non_snake_case)] - pub fn Constructor(window: &Window, data: DOMString) -> Fallible<DomRoot<Comment>> { + pub fn Constructor(window: &Window, proto: Option<HandleObject>, data: DOMString) -> Fallible<DomRoot<Comment>> { let document = window.Document(); - Ok(Comment::new(data, &document)) + Ok(Comment::new(data, &document, proto)) } } diff --git a/components/script/dom/compositionevent.rs b/components/script/dom/compositionevent.rs index 1cdc1cd8dcc..58c31c6e215 100644 --- a/components/script/dom/compositionevent.rs +++ b/components/script/dom/compositionevent.rs @@ -7,12 +7,13 @@ use crate::dom::bindings::codegen::Bindings::CompositionEventBinding::{ }; use crate::dom::bindings::codegen::Bindings::UIEventBinding::UIEventBinding::UIEventMethods; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::{reflect_dom_object, reflect_dom_object2}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::uievent::UIEvent; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; #[dom_struct] pub struct CompositionEvent { @@ -41,12 +42,35 @@ impl CompositionEvent { detail: i32, data: DOMString, ) -> DomRoot<CompositionEvent> { - let ev = reflect_dom_object( + Self::new_with_proto( + window, + None, + type_, + can_bubble, + cancelable, + view, + detail, + data, + ) + } + + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + type_: DOMString, + can_bubble: bool, + cancelable: bool, + view: Option<&Window>, + detail: i32, + data: DOMString, + ) -> DomRoot<CompositionEvent> { + let ev = reflect_dom_object2( Box::new(CompositionEvent { uievent: UIEvent::new_inherited(), data: data, }), window, + proto, ); ev.uievent .InitUIEvent(type_, can_bubble, cancelable, view, detail); @@ -56,11 +80,13 @@ impl CompositionEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &CompositionEventBinding::CompositionEventInit, ) -> Fallible<DomRoot<CompositionEvent>> { - let event = CompositionEvent::new( + let event = CompositionEvent::new_with_proto( window, + proto, type_, init.parent.parent.bubbles, init.parent.parent.cancelable, diff --git a/components/script/dom/constantsourcenode.rs b/components/script/dom/constantsourcenode.rs index 90851da88c2..be1125bb283 100644 --- a/components/script/dom/constantsourcenode.rs +++ b/components/script/dom/constantsourcenode.rs @@ -9,10 +9,11 @@ use crate::dom::bindings::codegen::Bindings::AudioParamBinding::AutomationRate; use crate::dom::bindings::codegen::Bindings::ConstantSourceNodeBinding::ConstantSourceNodeMethods; use crate::dom::bindings::codegen::Bindings::ConstantSourceNodeBinding::ConstantSourceOptions; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_media::audio::constant_source_node::ConstantSourceNodeOptions as ServoMediaConstantSourceOptions; use servo_media::audio::node::AudioNodeInit; use servo_media::audio::param::ParamType; @@ -57,23 +58,33 @@ impl ConstantSourceNode { }) } - #[allow(unrooted_must_root)] pub fn new( window: &Window, context: &BaseAudioContext, options: &ConstantSourceOptions, ) -> Fallible<DomRoot<ConstantSourceNode>> { + Self::new_with_proto(window, None, context, options) + } + + #[allow(unrooted_must_root)] + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + context: &BaseAudioContext, + options: &ConstantSourceOptions, + ) -> Fallible<DomRoot<ConstantSourceNode>> { let node = ConstantSourceNode::new_inherited(window, context, options)?; - Ok(reflect_dom_object(Box::new(node), window)) + Ok(reflect_dom_object2(Box::new(node), window, proto)) } #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, context: &BaseAudioContext, options: &ConstantSourceOptions, ) -> Fallible<DomRoot<ConstantSourceNode>> { - ConstantSourceNode::new(window, context, options) + ConstantSourceNode::new_with_proto(window, proto, context, options) } } diff --git a/components/script/dom/create.rs b/components/script/dom/create.rs index 1a4815d1179..087148cb037 100644 --- a/components/script/dom/create.rs +++ b/components/script/dom/create.rs @@ -85,28 +85,30 @@ use crate::dom::svgsvgelement::SVGSVGElement; use crate::realms::{enter_realm, InRealm}; use crate::script_thread::ScriptThread; use html5ever::{LocalName, Prefix, QualName}; +use js::rust::HandleObject; use servo_config::pref; fn create_svg_element( name: QualName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<Element> { assert_eq!(name.ns, ns!(svg)); macro_rules! make( ($ctor:ident) => ({ - let obj = $ctor::new(name.local, prefix, document); + let obj = $ctor::new(name.local, prefix, document, proto); DomRoot::upcast(obj) }); ($ctor:ident, $($arg:expr),+) => ({ - let obj = $ctor::new(name.local, prefix, document, $($arg),+); + let obj = $ctor::new(name.local, prefix, document, proto, $($arg),+); DomRoot::upcast(obj) }) ); if !pref!(dom.svg.enabled) { - return Element::new(name.local, name.ns, prefix, document); + return Element::new(name.local, name.ns, prefix, document, proto); } match name.local { @@ -124,6 +126,7 @@ fn create_html_element( document: &Document, creator: ElementCreator, mode: CustomElementCreationMode, + proto: Option<HandleObject>, ) -> DomRoot<Element> { assert_eq!(name.ns, ns!(html)); @@ -138,6 +141,7 @@ fn create_html_element( name.local.clone(), prefix.clone(), document, + proto, )); result.set_custom_element_state(CustomElementState::Undefined); ScriptThread::enqueue_upgrade_reaction(&*result, definition); @@ -145,6 +149,7 @@ fn create_html_element( }, CustomElementCreationMode::Synchronous => { let local_name = name.local.clone(); + //TODO(jdm) Pass proto to create_element? return match definition.create_element(document, prefix.clone()) { Ok(element) => { element.set_custom_element_definition(definition.clone()); @@ -165,7 +170,7 @@ fn create_html_element( // Step 6.1.2 let element = DomRoot::upcast::<Element>(HTMLUnknownElement::new( - local_name, prefix, document, + local_name, prefix, document, proto, )); element.set_custom_element_state(CustomElementState::Failed); element @@ -175,7 +180,7 @@ fn create_html_element( } } else { // Steps 5.1-5.2 - let element = create_native_html_element(name, prefix, document, creator); + let element = create_native_html_element(name, prefix, document, creator, proto); element.set_is(definition.name.clone()); element.set_custom_element_state(CustomElementState::Undefined); match mode { @@ -191,7 +196,7 @@ fn create_html_element( } // Steps 7.1-7.3 - let result = create_native_html_element(name.clone(), prefix, document, creator); + let result = create_native_html_element(name.clone(), prefix, document, creator, proto); match is { Some(is) => { result.set_is(is); @@ -215,16 +220,17 @@ pub fn create_native_html_element( prefix: Option<Prefix>, document: &Document, creator: ElementCreator, + proto: Option<HandleObject>, ) -> DomRoot<Element> { assert_eq!(name.ns, ns!(html)); macro_rules! make( ($ctor:ident) => ({ - let obj = $ctor::new(name.local, prefix, document); + let obj = $ctor::new(name.local, prefix, document, proto); DomRoot::upcast(obj) }); ($ctor:ident, $($arg:expr),+) => ({ - let obj = $ctor::new(name.local, prefix, document, $($arg),+); + let obj = $ctor::new(name.local, prefix, document, proto, $($arg),+); DomRoot::upcast(obj) }) ); @@ -386,11 +392,12 @@ pub fn create_element( document: &Document, creator: ElementCreator, mode: CustomElementCreationMode, + proto: Option<HandleObject>, ) -> DomRoot<Element> { let prefix = name.prefix.clone(); match name.ns { - ns!(html) => create_html_element(name, prefix, is, document, creator, mode), - ns!(svg) => create_svg_element(name, prefix, document), - _ => Element::new(name.local, name.ns, prefix, document), + ns!(html) => create_html_element(name, prefix, is, document, creator, mode, proto), + ns!(svg) => create_svg_element(name, prefix, document, proto), + _ => Element::new(name.local, name.ns, prefix, document, proto), } } diff --git a/components/script/dom/customevent.rs b/components/script/dom/customevent.rs index 7dadacee375..c3f6afd26a8 100644 --- a/components/script/dom/customevent.rs +++ b/components/script/dom/customevent.rs @@ -7,7 +7,7 @@ use crate::dom::bindings::codegen::Bindings::CustomEventBinding::CustomEventMeth use crate::dom::bindings::codegen::Bindings::EventBinding::EventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::bindings::trace::RootedTraceableBox; @@ -17,6 +17,7 @@ use crate::script_runtime::JSContext; use dom_struct::dom_struct; use js::jsapi::Heap; use js::jsval::JSVal; +use js::rust::HandleObject; use js::rust::HandleValue; use servo_atoms::Atom; @@ -37,16 +38,22 @@ impl CustomEvent { } pub fn new_uninitialized(global: &GlobalScope) -> DomRoot<CustomEvent> { - reflect_dom_object(Box::new(CustomEvent::new_inherited()), global) + Self::new_uninitialized_with_proto(global, None) } - pub fn new( + + fn new_uninitialized_with_proto(global: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<CustomEvent> { + reflect_dom_object2(Box::new(CustomEvent::new_inherited()), global, proto) + } + + fn new( global: &GlobalScope, + proto: Option<HandleObject>, type_: Atom, bubbles: bool, cancelable: bool, detail: HandleValue, ) -> DomRoot<CustomEvent> { - let ev = CustomEvent::new_uninitialized(global); + let ev = CustomEvent::new_uninitialized_with_proto(global, proto); ev.init_custom_event(type_, bubbles, cancelable, detail); ev } @@ -54,11 +61,13 @@ impl CustomEvent { #[allow(unsafe_code, non_snake_case)] pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, type_: DOMString, init: RootedTraceableBox<CustomEventBinding::CustomEventInit>, ) -> Fallible<DomRoot<CustomEvent>> { Ok(CustomEvent::new( global, + proto, Atom::from(type_), init.parent.bubbles, init.parent.cancelable, diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index cb2d43dd62c..4e8d1283c4d 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -31,7 +31,7 @@ use crate::dom::bindings::error::{Error, ErrorResult, Fallible}; use crate::dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId}; use crate::dom::bindings::num::Finite; use crate::dom::bindings::refcounted::{Trusted, TrustedPromise}; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::{Dom, DomRoot, DomSlice, LayoutDom, MutNullableDom}; use crate::dom::bindings::str::{DOMString, USVString}; use crate::dom::bindings::xmlname::XMLName::InvalidXMLName; @@ -123,6 +123,7 @@ use html5ever::{LocalName, Namespace, QualName}; use hyper_serde::Serde; use ipc_channel::ipc::{self, IpcSender}; use js::jsapi::JSObject; +use js::rust::HandleObject; use keyboard_types::{Code, Key, KeyState}; use metrics::{ InteractiveFlag, InteractiveMetrics, InteractiveWindow, ProfilerMetadataFactory, @@ -3248,11 +3249,12 @@ impl Document { // https://dom.spec.whatwg.org/#dom-document-document #[allow(non_snake_case)] - pub fn Constructor(window: &Window) -> Fallible<DomRoot<Document>> { + pub fn Constructor(window: &Window, proto: Option<HandleObject>) -> Fallible<DomRoot<Document>> { let doc = window.Document(); let docloader = DocumentLoader::new(&*doc.loader()); - Ok(Document::new( + Ok(Document::new_with_proto( window, + proto, HasBrowsingContext::No, None, doc.origin().clone(), @@ -3283,7 +3285,41 @@ impl Document { referrer_policy: Option<ReferrerPolicy>, canceller: FetchCanceller, ) -> DomRoot<Document> { - let document = reflect_dom_object( + Self::new_with_proto( + window, + None, + has_browsing_context, + url, + origin, + doctype, + content_type, + last_modified, + activity, + source, + doc_loader, + referrer, + referrer_policy, + canceller, + ) + } + + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + has_browsing_context: HasBrowsingContext, + url: Option<ServoUrl>, + origin: MutableOrigin, + doctype: IsHTMLDocument, + content_type: Option<Mime>, + last_modified: Option<String>, + activity: DocumentActivity, + source: DocumentSource, + doc_loader: DocumentLoader, + referrer: Option<String>, + referrer_policy: Option<ReferrerPolicy>, + canceller: FetchCanceller, + ) -> DomRoot<Document> { + let document = reflect_dom_object2( Box::new(Document::new_inherited( window, has_browsing_context, @@ -3300,6 +3336,7 @@ impl Document { canceller, )), window, + proto, ); { let node = document.upcast::<Node>(); @@ -4143,6 +4180,7 @@ impl DocumentMethods for Document { self, ElementCreator::ScriptCreated, CustomElementCreationMode::Synchronous, + None, )) } @@ -4167,6 +4205,7 @@ impl DocumentMethods for Document { self, ElementCreator::ScriptCreated, CustomElementCreationMode::Synchronous, + None, )) } @@ -4241,7 +4280,7 @@ impl DocumentMethods for Document { // https://dom.spec.whatwg.org/#dom-document-createcomment fn CreateComment(&self, data: DOMString) -> DomRoot<Comment> { - Comment::new(data, self) + Comment::new(data, self, None) } // https://dom.spec.whatwg.org/#dom-document-createprocessinginstruction @@ -4361,7 +4400,7 @@ impl DocumentMethods for Document { // https://dom.spec.whatwg.org/#dom-document-createrange fn CreateRange(&self) -> DomRoot<Range> { - Range::new_with_doc(self) + Range::new_with_doc(self, None) } // https://dom.spec.whatwg.org/#dom-document-createnodeiteratorroot-whattoshow-filter @@ -4434,6 +4473,7 @@ impl DocumentMethods for Document { self, ElementCreator::ScriptCreated, CustomElementCreationMode::Synchronous, + None, ); let parent = root.upcast::<Node>(); let child = elem.upcast::<Node>(); @@ -4458,6 +4498,7 @@ impl DocumentMethods for Document { self, ElementCreator::ScriptCreated, CustomElementCreationMode::Synchronous, + None, ); head.upcast::<Node>().AppendChild(elem.upcast()).unwrap() }, diff --git a/components/script/dom/documentfragment.rs b/components/script/dom/documentfragment.rs index ac87a9a786e..716f3dabcb5 100644 --- a/components/script/dom/documentfragment.rs +++ b/components/script/dom/documentfragment.rs @@ -17,6 +17,7 @@ use crate::dom::node::{window_from_node, Node}; use crate::dom::nodelist::NodeList; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; use std::collections::HashMap; @@ -38,17 +39,22 @@ impl DocumentFragment { } pub fn new(document: &Document) -> DomRoot<DocumentFragment> { - Node::reflect_node( + Self::new_with_proto(document, None) + } + + fn new_with_proto(document: &Document, proto: Option<HandleObject>) -> DomRoot<DocumentFragment> { + Node::reflect_node_with_proto( Box::new(DocumentFragment::new_inherited(document)), document, + proto, ) } #[allow(non_snake_case)] - pub fn Constructor(window: &Window) -> Fallible<DomRoot<DocumentFragment>> { + pub fn Constructor(window: &Window, proto: Option<HandleObject>) -> Fallible<DomRoot<DocumentFragment>> { let document = window.Document(); - Ok(DocumentFragment::new(&document)) + Ok(DocumentFragment::new_with_proto(&document, proto)) } pub fn id_map(&self) -> &DomRefCell<HashMap<Atom, Vec<Dom<Element>>>> { diff --git a/components/script/dom/domexception.rs b/components/script/dom/domexception.rs index c2533cd7932..6252837b66c 100644 --- a/components/script/dom/domexception.rs +++ b/components/script/dom/domexception.rs @@ -5,11 +5,12 @@ use crate::dom::bindings::codegen::Bindings::DOMExceptionBinding::DOMExceptionConstants; use crate::dom::bindings::codegen::Bindings::DOMExceptionBinding::DOMExceptionMethods; use crate::dom::bindings::error::Error; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object, reflect_dom_object2, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::globalscope::GlobalScope; use dom_struct::dom_struct; +use js::rust::HandleObject; #[repr(u16)] #[derive(Clone, Copy, Debug, Eq, JSTraceable, MallocSizeOf, Ord, PartialEq, PartialOrd)] @@ -139,12 +140,14 @@ impl DOMException { #[allow(non_snake_case)] pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, message: DOMString, name: DOMString, ) -> Result<DomRoot<DOMException>, Error> { - Ok(reflect_dom_object( + Ok(reflect_dom_object2( Box::new(DOMException::new_inherited(message, name)), global, + proto, )) } diff --git a/components/script/dom/domimplementation.rs b/components/script/dom/domimplementation.rs index d5a3f07bde2..31d1d116959 100644 --- a/components/script/dom/domimplementation.rs +++ b/components/script/dom/domimplementation.rs @@ -168,13 +168,13 @@ impl DOMImplementationMethods for DOMImplementation { // Step 4. let doc_node = doc.upcast::<Node>(); let doc_html = - DomRoot::upcast::<Node>(HTMLHtmlElement::new(local_name!("html"), None, &doc)); + DomRoot::upcast::<Node>(HTMLHtmlElement::new(local_name!("html"), None, &doc, None)); doc_node.AppendChild(&doc_html).expect("Appending failed"); { // Step 5. let doc_head = - DomRoot::upcast::<Node>(HTMLHeadElement::new(local_name!("head"), None, &doc)); + DomRoot::upcast::<Node>(HTMLHeadElement::new(local_name!("head"), None, &doc, None)); doc_html.AppendChild(&doc_head).unwrap(); // Step 6. @@ -184,6 +184,7 @@ impl DOMImplementationMethods for DOMImplementation { local_name!("title"), None, &doc, + None, )); doc_head.AppendChild(&doc_title).unwrap(); @@ -194,7 +195,7 @@ impl DOMImplementationMethods for DOMImplementation { } // Step 7. - let doc_body = HTMLBodyElement::new(local_name!("body"), None, &doc); + let doc_body = HTMLBodyElement::new(local_name!("body"), None, &doc, None); doc_html.AppendChild(doc_body.upcast()).unwrap(); } diff --git a/components/script/dom/dommatrix.rs b/components/script/dom/dommatrix.rs index c5520c7d6a7..2cbc9aa011c 100644 --- a/components/script/dom/dommatrix.rs +++ b/components/script/dom/dommatrix.rs @@ -8,7 +8,7 @@ use crate::dom::bindings::codegen::UnionTypes::StringOrUnrestrictedDoubleSequenc use crate::dom::bindings::error; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::dommatrixreadonly::{ dommatrixinit_to_matrix, entries_to_matrix, transform_to_matrix, DOMMatrixReadOnly, @@ -17,7 +17,7 @@ use crate::dom::globalscope::GlobalScope; use crate::dom::window::Window; use dom_struct::dom_struct; use euclid::default::Transform3D; -use js::rust::CustomAutoRooterGuard; +use js::rust::{CustomAutoRooterGuard, HandleObject}; use js::typedarray::{Float32Array, Float64Array}; #[dom_struct] @@ -27,10 +27,14 @@ pub struct DOMMatrix { #[allow(non_snake_case)] impl DOMMatrix { - #[allow(unrooted_must_root)] pub fn new(global: &GlobalScope, is2D: bool, matrix: Transform3D<f64>) -> DomRoot<Self> { + Self::new_with_proto(global, None, is2D, matrix) + } + + #[allow(unrooted_must_root)] + fn new_with_proto(global: &GlobalScope, proto: Option<HandleObject>, is2D: bool, matrix: Transform3D<f64>) -> DomRoot<Self> { let dommatrix = Self::new_inherited(is2D, matrix); - reflect_dom_object(Box::new(dommatrix), global) + reflect_dom_object2(Box::new(dommatrix), global, proto) } pub fn new_inherited(is2D: bool, matrix: Transform3D<f64>) -> Self { @@ -42,10 +46,11 @@ impl DOMMatrix { // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-dommatrixreadonly pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, init: Option<StringOrUnrestrictedDoubleSequence>, ) -> Fallible<DomRoot<Self>> { if init.is_none() { - return Ok(Self::new(global, true, Transform3D::identity())); + return Ok(Self::new_with_proto(global, proto, true, Transform3D::identity())); } match init.unwrap() { StringOrUnrestrictedDoubleSequence::String(ref s) => { @@ -58,11 +63,11 @@ impl DOMMatrix { return Ok(Self::new(global, true, Transform3D::identity())); } transform_to_matrix(s.to_string()) - .map(|(is2D, matrix)| Self::new(global, is2D, matrix)) + .map(|(is2D, matrix)| Self::new_with_proto(global, proto, is2D, matrix)) }, StringOrUnrestrictedDoubleSequence::UnrestrictedDoubleSequence(ref entries) => { entries_to_matrix(&entries[..]) - .map(|(is2D, matrix)| Self::new(global, is2D, matrix)) + .map(|(is2D, matrix)| Self::new_with_proto(global, proto, is2D, matrix)) }, } } @@ -84,6 +89,7 @@ impl DOMMatrix { let vec: Vec<f64> = array.to_vec().iter().map(|&x| x as f64).collect(); DOMMatrix::Constructor( global, + None, Some(StringOrUnrestrictedDoubleSequence::UnrestrictedDoubleSequence(vec)), ) } @@ -96,6 +102,7 @@ impl DOMMatrix { let vec: Vec<f64> = array.to_vec(); DOMMatrix::Constructor( global, + None, Some(StringOrUnrestrictedDoubleSequence::UnrestrictedDoubleSequence(vec)), ) } diff --git a/components/script/dom/dommatrixreadonly.rs b/components/script/dom/dommatrixreadonly.rs index 84ef18fd8fc..dd78a3935ae 100644 --- a/components/script/dom/dommatrixreadonly.rs +++ b/components/script/dom/dommatrixreadonly.rs @@ -10,7 +10,7 @@ use crate::dom::bindings::codegen::UnionTypes::StringOrUnrestrictedDoubleSequenc use crate::dom::bindings::error; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::dommatrix::DOMMatrix; use crate::dom::dompoint::DOMPoint; @@ -21,7 +21,7 @@ use cssparser::{Parser, ParserInput}; use dom_struct::dom_struct; use euclid::{default::Transform3D, Angle}; use js::jsapi::JSObject; -use js::rust::CustomAutoRooterGuard; +use js::rust::{CustomAutoRooterGuard, HandleObject}; use js::typedarray::CreateWith; use js::typedarray::{Float32Array, Float64Array}; use std::cell::Cell; @@ -40,10 +40,14 @@ pub struct DOMMatrixReadOnly { #[allow(non_snake_case)] impl DOMMatrixReadOnly { - #[allow(unrooted_must_root)] pub fn new(global: &GlobalScope, is2D: bool, matrix: Transform3D<f64>) -> DomRoot<Self> { + Self::new_with_proto(global, None, is2D, matrix) + } + + #[allow(unrooted_must_root)] + fn new_with_proto(global: &GlobalScope, proto: Option<HandleObject>, is2D: bool, matrix: Transform3D<f64>) -> DomRoot<Self> { let dommatrix = Self::new_inherited(is2D, matrix); - reflect_dom_object(Box::new(dommatrix), global) + reflect_dom_object2(Box::new(dommatrix), global, proto) } pub fn new_inherited(is2D: bool, matrix: Transform3D<f64>) -> Self { @@ -57,10 +61,11 @@ impl DOMMatrixReadOnly { // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-dommatrixreadonly pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, init: Option<StringOrUnrestrictedDoubleSequence>, ) -> Fallible<DomRoot<Self>> { if init.is_none() { - return Ok(Self::new(global, true, Transform3D::identity())); + return Ok(Self::new_with_proto(global, proto, true, Transform3D::identity())); } match init.unwrap() { StringOrUnrestrictedDoubleSequence::String(ref s) => { @@ -73,11 +78,11 @@ impl DOMMatrixReadOnly { return Ok(Self::new(global, true, Transform3D::identity())); } transform_to_matrix(s.to_string()) - .map(|(is2D, matrix)| Self::new(global, is2D, matrix)) + .map(|(is2D, matrix)| Self::new_with_proto(global, proto, is2D, matrix)) }, StringOrUnrestrictedDoubleSequence::UnrestrictedDoubleSequence(ref entries) => { entries_to_matrix(&entries[..]) - .map(|(is2D, matrix)| Self::new(global, is2D, matrix)) + .map(|(is2D, matrix)| Self::new_with_proto(global, proto, is2D, matrix)) }, } } @@ -392,6 +397,7 @@ impl DOMMatrixReadOnly { let vec: Vec<f64> = array.to_vec().iter().map(|&x| x as f64).collect(); DOMMatrixReadOnly::Constructor( global, + None, Some(StringOrUnrestrictedDoubleSequence::UnrestrictedDoubleSequence(vec)), ) } @@ -405,6 +411,7 @@ impl DOMMatrixReadOnly { let vec: Vec<f64> = array.to_vec(); DOMMatrixReadOnly::Constructor( global, + None, Some(StringOrUnrestrictedDoubleSequence::UnrestrictedDoubleSequence(vec)), ) } diff --git a/components/script/dom/domparser.rs b/components/script/dom/domparser.rs index 876d87eef25..6e08fb10c4f 100644 --- a/components/script/dom/domparser.rs +++ b/components/script/dom/domparser.rs @@ -12,7 +12,7 @@ use crate::dom::bindings::codegen::Bindings::DOMParserBinding::SupportedType::Te use crate::dom::bindings::codegen::Bindings::DocumentBinding::DocumentReadyState; use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::document::DocumentSource; @@ -20,6 +20,7 @@ use crate::dom::document::{Document, HasBrowsingContext, IsHTMLDocument}; use crate::dom::servoparser::ServoParser; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use script_traits::DocumentActivity; #[dom_struct] @@ -36,13 +37,13 @@ impl DOMParser { } } - pub fn new(window: &Window) -> DomRoot<DOMParser> { - reflect_dom_object(Box::new(DOMParser::new_inherited(window)), window) + fn new(window: &Window, proto: Option<HandleObject>) -> DomRoot<DOMParser> { + reflect_dom_object2(Box::new(DOMParser::new_inherited(window)), window, proto) } #[allow(non_snake_case)] - pub fn Constructor(window: &Window) -> Fallible<DomRoot<DOMParser>> { - Ok(DOMParser::new(window)) + pub fn Constructor(window: &Window, proto: Option<HandleObject>) -> Fallible<DomRoot<DOMParser>> { + Ok(DOMParser::new(window, proto)) } } diff --git a/components/script/dom/dompoint.rs b/components/script/dom/dompoint.rs index fe523b8e766..2e580d57457 100644 --- a/components/script/dom/dompoint.rs +++ b/components/script/dom/dompoint.rs @@ -5,11 +5,12 @@ use crate::dom::bindings::codegen::Bindings::DOMPointBinding::{DOMPointInit, DOMPointMethods}; use crate::dom::bindings::codegen::Bindings::DOMPointReadOnlyBinding::DOMPointReadOnlyMethods; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::dompointreadonly::{DOMPointReadOnly, DOMPointWriteMethods}; use crate::dom::globalscope::GlobalScope; use dom_struct::dom_struct; +use js::rust::HandleObject; // http://dev.w3.org/fxtf/geometry/Overview.html#dompoint #[dom_struct] @@ -26,17 +27,22 @@ impl DOMPoint { } pub fn new(global: &GlobalScope, x: f64, y: f64, z: f64, w: f64) -> DomRoot<DOMPoint> { - reflect_dom_object(Box::new(DOMPoint::new_inherited(x, y, z, w)), global) + Self::new_with_proto(global, None, x, y, z, w) + } + + fn new_with_proto(global: &GlobalScope, proto: Option<HandleObject>, x: f64, y: f64, z: f64, w: f64) -> DomRoot<DOMPoint> { + reflect_dom_object2(Box::new(DOMPoint::new_inherited(x, y, z, w)), global, proto) } pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, x: f64, y: f64, z: f64, w: f64, ) -> Fallible<DomRoot<DOMPoint>> { - Ok(DOMPoint::new(global, x, y, z, w)) + Ok(DOMPoint::new_with_proto(global, proto, x, y, z, w)) } // https://drafts.fxtf.org/geometry/#dom-dompoint-frompoint diff --git a/components/script/dom/dompointreadonly.rs b/components/script/dom/dompointreadonly.rs index 9d093db2b81..453642c0a00 100644 --- a/components/script/dom/dompointreadonly.rs +++ b/components/script/dom/dompointreadonly.rs @@ -5,10 +5,11 @@ use crate::dom::bindings::codegen::Bindings::DOMPointBinding::DOMPointInit; use crate::dom::bindings::codegen::Bindings::DOMPointReadOnlyBinding::DOMPointReadOnlyMethods; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::globalscope::GlobalScope; use dom_struct::dom_struct; +use js::rust::HandleObject; use std::cell::Cell; // http://dev.w3.org/fxtf/geometry/Overview.html#dompointreadonly @@ -34,20 +35,26 @@ impl DOMPointReadOnly { } pub fn new(global: &GlobalScope, x: f64, y: f64, z: f64, w: f64) -> DomRoot<DOMPointReadOnly> { - reflect_dom_object( + Self::new_with_proto(global, None, x, y, z, w) + } + + fn new_with_proto(global: &GlobalScope, proto: Option<HandleObject>, x: f64, y: f64, z: f64, w: f64) -> DomRoot<DOMPointReadOnly> { + reflect_dom_object2( Box::new(DOMPointReadOnly::new_inherited(x, y, z, w)), global, + proto, ) } pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, x: f64, y: f64, z: f64, w: f64, ) -> Fallible<DomRoot<DOMPointReadOnly>> { - Ok(DOMPointReadOnly::new(global, x, y, z, w)) + Ok(DOMPointReadOnly::new_with_proto(global, proto, x, y, z, w)) } // https://drafts.fxtf.org/geometry/#dom-dompointreadonly-frompoint diff --git a/components/script/dom/domquad.rs b/components/script/dom/domquad.rs index e6decd7e1b2..775dbf7321f 100644 --- a/components/script/dom/domquad.rs +++ b/components/script/dom/domquad.rs @@ -6,12 +6,13 @@ use crate::dom::bindings::codegen::Bindings::DOMPointBinding::{DOMPointInit, DOM use crate::dom::bindings::codegen::Bindings::DOMQuadBinding::{DOMQuadInit, DOMQuadMethods}; use crate::dom::bindings::codegen::Bindings::DOMRectReadOnlyBinding::DOMRectInit; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::dompoint::DOMPoint; use crate::dom::domrect::DOMRect; use crate::dom::globalscope::GlobalScope; use dom_struct::dom_struct; +use js::rust::HandleObject; // https://drafts.fxtf.org/geometry/#DOMQuad #[dom_struct] @@ -42,18 +43,31 @@ impl DOMQuad { p3: &DOMPoint, p4: &DOMPoint, ) -> DomRoot<DOMQuad> { - reflect_dom_object(Box::new(DOMQuad::new_inherited(p1, p2, p3, p4)), global) + Self::new_with_proto(global, None, p1, p2, p3, p4) + } + + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + p1: &DOMPoint, + p2: &DOMPoint, + p3: &DOMPoint, + p4: &DOMPoint, + ) -> DomRoot<DOMQuad> { + reflect_dom_object2(Box::new(DOMQuad::new_inherited(p1, p2, p3, p4)), global, proto) } pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, p1: &DOMPointInit, p2: &DOMPointInit, p3: &DOMPointInit, p4: &DOMPointInit, ) -> Fallible<DomRoot<DOMQuad>> { - Ok(DOMQuad::new( + Ok(DOMQuad::new_with_proto( global, + proto, &*DOMPoint::new_from_init(global, p1), &*DOMPoint::new_from_init(global, p2), &*DOMPoint::new_from_init(global, p3), diff --git a/components/script/dom/domrect.rs b/components/script/dom/domrect.rs index d925176f96d..8ab7daa2b57 100644 --- a/components/script/dom/domrect.rs +++ b/components/script/dom/domrect.rs @@ -5,11 +5,12 @@ use crate::dom::bindings::codegen::Bindings::DOMRectBinding::DOMRectMethods; use crate::dom::bindings::codegen::Bindings::DOMRectReadOnlyBinding::DOMRectReadOnlyMethods; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::domrectreadonly::DOMRectReadOnly; use crate::dom::globalscope::GlobalScope; use dom_struct::dom_struct; +use js::rust::HandleObject; #[dom_struct] pub struct DOMRect { @@ -24,21 +25,27 @@ impl DOMRect { } pub fn new(global: &GlobalScope, x: f64, y: f64, width: f64, height: f64) -> DomRoot<DOMRect> { - reflect_dom_object( + Self::new_with_proto(global, None, x, y, width, height) + } + + fn new_with_proto(global: &GlobalScope, proto: Option<HandleObject>, x: f64, y: f64, width: f64, height: f64) -> DomRoot<DOMRect> { + reflect_dom_object2( Box::new(DOMRect::new_inherited(x, y, width, height)), global, + proto, ) } #[allow(non_snake_case)] pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, x: f64, y: f64, width: f64, height: f64, ) -> Fallible<DomRoot<DOMRect>> { - Ok(DOMRect::new(global, x, y, width, height)) + Ok(DOMRect::new_with_proto(global, proto, x, y, width, height)) } } diff --git a/components/script/dom/domrectreadonly.rs b/components/script/dom/domrectreadonly.rs index 49eed59ac58..80bb793857d 100644 --- a/components/script/dom/domrectreadonly.rs +++ b/components/script/dom/domrectreadonly.rs @@ -4,10 +4,11 @@ use crate::dom::bindings::codegen::Bindings::DOMRectReadOnlyBinding::DOMRectReadOnlyMethods; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::globalscope::GlobalScope; use dom_struct::dom_struct; +use js::rust::HandleObject; use std::cell::Cell; #[dom_struct] @@ -30,28 +31,31 @@ impl DOMRectReadOnly { } } - pub fn new( + fn new( global: &GlobalScope, + proto: Option<HandleObject>, x: f64, y: f64, width: f64, height: f64, ) -> DomRoot<DOMRectReadOnly> { - reflect_dom_object( + reflect_dom_object2( Box::new(DOMRectReadOnly::new_inherited(x, y, width, height)), global, + proto, ) } #[allow(non_snake_case)] pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, x: f64, y: f64, width: f64, height: f64, ) -> Fallible<DomRoot<DOMRectReadOnly>> { - Ok(DOMRectReadOnly::new(global, x, y, width, height)) + Ok(DOMRectReadOnly::new(global, proto, x, y, width, height)) } pub fn set_x(&self, value: f64) { diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 1ceec50281d..dc4b4096469 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -95,6 +95,7 @@ use html5ever::serialize::TraversalScope::{ChildrenOnly, IncludeNode}; use html5ever::{LocalName, Namespace, Prefix, QualName}; use js::jsapi::Heap; use js::jsval::JSVal; +use js::rust::HandleObject; use msg::constellation_msg::InputMethodType; use net_traits::request::CorsSettings; use net_traits::ReferrerPolicy; @@ -241,8 +242,9 @@ impl Element { document: &Document, creator: ElementCreator, mode: CustomElementCreationMode, + proto: Option<HandleObject>, ) -> DomRoot<Element> { - create_element(name, is, document, creator, mode) + create_element(name, is, document, creator, mode, proto) } pub fn new_inherited( @@ -290,12 +292,14 @@ impl Element { namespace: Namespace, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<Element> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(Element::new_inherited( local_name, namespace, prefix, document, )), document, + proto, ) } @@ -1817,7 +1821,7 @@ impl Element { { DomRoot::from_ref(elem) }, - _ => DomRoot::upcast(HTMLBodyElement::new(local_name!("body"), None, owner_doc)), + _ => DomRoot::upcast(HTMLBodyElement::new(local_name!("body"), None, owner_doc, None)), } } @@ -2588,6 +2592,7 @@ impl ElementMethods for Element { &context_document, ElementCreator::ScriptCreated, CustomElementCreationMode::Synchronous, + None, ); DomRoot::upcast(body_elem) }, diff --git a/components/script/dom/errorevent.rs b/components/script/dom/errorevent.rs index 129f96dc910..cee89cae434 100644 --- a/components/script/dom/errorevent.rs +++ b/components/script/dom/errorevent.rs @@ -8,7 +8,7 @@ use crate::dom::bindings::codegen::Bindings::ErrorEventBinding::ErrorEventMethod use crate::dom::bindings::codegen::Bindings::EventBinding::EventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::bindings::trace::RootedTraceableBox; @@ -18,7 +18,7 @@ use crate::script_runtime::JSContext; use dom_struct::dom_struct; use js::jsapi::Heap; use js::jsval::JSVal; -use js::rust::HandleValue; +use js::rust::{HandleObject, HandleValue}; use servo_atoms::Atom; use std::cell::Cell; @@ -45,8 +45,8 @@ impl ErrorEvent { } } - pub fn new_uninitialized(global: &GlobalScope) -> DomRoot<ErrorEvent> { - reflect_dom_object(Box::new(ErrorEvent::new_inherited()), global) + fn new_uninitialized(global: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<ErrorEvent> { + reflect_dom_object2(Box::new(ErrorEvent::new_inherited()), global, proto) } pub fn new( @@ -60,7 +60,33 @@ impl ErrorEvent { colno: u32, error: HandleValue, ) -> DomRoot<ErrorEvent> { - let ev = ErrorEvent::new_uninitialized(global); + Self::new_with_proto( + global, + None, + type_, + bubbles, + cancelable, + message, + filename, + lineno, + colno, + error, + ) + } + + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + type_: Atom, + bubbles: EventBubbles, + cancelable: EventCancelable, + message: DOMString, + filename: DOMString, + lineno: u32, + colno: u32, + error: HandleValue, + ) -> DomRoot<ErrorEvent> { + let ev = ErrorEvent::new_uninitialized(global, proto); { let event = ev.upcast::<Event>(); event.init_event(type_, bool::from(bubbles), bool::from(cancelable)); @@ -76,6 +102,7 @@ impl ErrorEvent { #[allow(non_snake_case)] pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, type_: DOMString, init: RootedTraceableBox<ErrorEventBinding::ErrorEventInit>, ) -> Fallible<DomRoot<ErrorEvent>> { @@ -97,8 +124,9 @@ impl ErrorEvent { let cancelable = EventCancelable::from(init.parent.cancelable); - let event = ErrorEvent::new( + let event = ErrorEvent::new_with_proto( global, + proto, Atom::from(type_), bubbles, cancelable, diff --git a/components/script/dom/event.rs b/components/script/dom/event.rs index 8093bd852a9..205bf58e37e 100644 --- a/components/script/dom/event.rs +++ b/components/script/dom/event.rs @@ -12,7 +12,7 @@ use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::refcounted::Trusted; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject, Reflector}; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::str::DOMString; use crate::dom::document::Document; @@ -28,6 +28,7 @@ use crate::dom::window::Window; use crate::task::TaskOnce; use devtools_traits::{TimelineMarker, TimelineMarkerType}; use dom_struct::dom_struct; +use js::rust::HandleObject; use metrics::ToMs; use servo_atoms::Atom; use std::cell::Cell; @@ -72,7 +73,11 @@ impl Event { } pub fn new_uninitialized(global: &GlobalScope) -> DomRoot<Event> { - reflect_dom_object(Box::new(Event::new_inherited()), global) + Self::new_uninitialized_with_proto(global, None) + } + + pub fn new_uninitialized_with_proto(global: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<Event> { + reflect_dom_object2(Box::new(Event::new_inherited()), global, proto) } pub fn new( @@ -81,7 +86,17 @@ impl Event { bubbles: EventBubbles, cancelable: EventCancelable, ) -> DomRoot<Event> { - let event = Event::new_uninitialized(global); + Self::new_with_proto(global, None, type_, bubbles, cancelable) + } + + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + type_: Atom, + bubbles: EventBubbles, + cancelable: EventCancelable, + ) -> DomRoot<Event> { + let event = Event::new_uninitialized_with_proto(global, proto); event.init_event(type_, bool::from(bubbles), bool::from(cancelable)); event } @@ -89,12 +104,13 @@ impl Event { #[allow(non_snake_case)] pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, type_: DOMString, init: &EventBinding::EventInit, ) -> Fallible<DomRoot<Event>> { let bubbles = EventBubbles::from(init.bubbles); let cancelable = EventCancelable::from(init.cancelable); - Ok(Event::new(global, Atom::from(type_), bubbles, cancelable)) + Ok(Event::new_with_proto(global, proto, Atom::from(type_), bubbles, cancelable)) } pub fn init_event(&self, type_: Atom, bubbles: bool, cancelable: bool) { diff --git a/components/script/dom/eventsource.rs b/components/script/dom/eventsource.rs index 9be9962378e..7897c5b79fd 100644 --- a/components/script/dom/eventsource.rs +++ b/components/script/dom/eventsource.rs @@ -9,7 +9,7 @@ use crate::dom::bindings::codegen::Bindings::EventSourceBinding::{ use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::refcounted::Trusted; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::event::Event; @@ -30,6 +30,7 @@ use ipc_channel::ipc; use ipc_channel::router::ROUTER; use js::conversions::ToJSValConvertible; use js::jsval::UndefinedValue; +use js::rust::HandleObject; use mime::{self, Mime}; use net_traits::request::{CacheMode, CorsSettings, Destination, RequestBuilder}; use net_traits::{CoreResourceMsg, FetchChannels, FetchMetadata, FilteredMetadata}; @@ -459,10 +460,11 @@ impl EventSource { } } - fn new(global: &GlobalScope, url: ServoUrl, with_credentials: bool) -> DomRoot<EventSource> { - reflect_dom_object( + fn new(global: &GlobalScope, proto: Option<HandleObject>, url: ServoUrl, with_credentials: bool) -> DomRoot<EventSource> { + reflect_dom_object2( Box::new(EventSource::new_inherited(url, with_credentials)), global, + proto, ) } @@ -501,6 +503,7 @@ impl EventSource { #[allow(non_snake_case)] pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, url: DOMString, event_source_init: &EventSourceInit, ) -> Fallible<DomRoot<EventSource>> { @@ -515,6 +518,7 @@ impl EventSource { // Step 1, 5 let ev = EventSource::new( global, + proto, url_record.clone(), event_source_init.withCredentials, ); diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs index dd0079c47dd..861e113f6ed 100644 --- a/components/script/dom/eventtarget.rs +++ b/components/script/dom/eventtarget.rs @@ -21,7 +21,7 @@ use crate::dom::bindings::codegen::UnionTypes::EventListenerOptionsOrBoolean; use crate::dom::bindings::codegen::UnionTypes::EventOrString; use crate::dom::bindings::error::{report_pending_exception, Error, Fallible}; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::{reflect_dom_object, reflect_dom_object2, DomObject, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::element::Element; @@ -355,13 +355,13 @@ impl EventTarget { } } - fn new(global: &GlobalScope) -> DomRoot<EventTarget> { - reflect_dom_object(Box::new(EventTarget::new_inherited()), global) + fn new(global: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<EventTarget> { + reflect_dom_object2(Box::new(EventTarget::new_inherited()), global, proto) } #[allow(non_snake_case)] - pub fn Constructor(global: &GlobalScope, proto: HandleObject) -> Fallible<DomRoot<EventTarget>> { - Ok(reflect_dom_object2(Box::new(EventTarget::new_inherited()), global, proto)) + pub fn Constructor(global: &GlobalScope, proto: Option<HandleObject>) -> Fallible<DomRoot<EventTarget>> { + Ok(EventTarget::new(global, proto)) } pub fn has_listeners_for(&self, type_: &Atom) -> bool { diff --git a/components/script/dom/extendableevent.rs b/components/script/dom/extendableevent.rs index deb2dce4dfa..a19190ebd03 100644 --- a/components/script/dom/extendableevent.rs +++ b/components/script/dom/extendableevent.rs @@ -6,14 +6,14 @@ use crate::dom::bindings::codegen::Bindings::EventBinding::{self, EventMethods}; use crate::dom::bindings::codegen::Bindings::ExtendableEventBinding; use crate::dom::bindings::error::{Error, ErrorResult, Fallible}; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::event::Event; use crate::dom::serviceworkerglobalscope::ServiceWorkerGlobalScope; use crate::script_runtime::JSContext; use dom_struct::dom_struct; -use js::rust::HandleValue; +use js::rust::{HandleObject, HandleValue}; use servo_atoms::Atom; // https://w3c.github.io/ServiceWorker/#extendable-event @@ -31,13 +31,24 @@ impl ExtendableEvent { extensions_allowed: true, } } + pub fn new( worker: &ServiceWorkerGlobalScope, type_: Atom, bubbles: bool, cancelable: bool, ) -> DomRoot<ExtendableEvent> { - let ev = reflect_dom_object(Box::new(ExtendableEvent::new_inherited()), worker); + Self::new_with_proto(worker, None, type_, bubbles, cancelable) + } + + fn new_with_proto( + worker: &ServiceWorkerGlobalScope, + proto: Option<HandleObject>, + type_: Atom, + bubbles: bool, + cancelable: bool, + ) -> DomRoot<ExtendableEvent> { + let ev = reflect_dom_object2(Box::new(ExtendableEvent::new_inherited()), worker, proto); { let event = ev.upcast::<Event>(); event.init_event(type_, bubbles, cancelable); @@ -47,11 +58,13 @@ impl ExtendableEvent { pub fn Constructor( worker: &ServiceWorkerGlobalScope, + proto: Option<HandleObject>, type_: DOMString, init: &ExtendableEventBinding::ExtendableEventInit, ) -> Fallible<DomRoot<ExtendableEvent>> { - Ok(ExtendableEvent::new( + Ok(ExtendableEvent::new_with_proto( worker, + proto, Atom::from(type_), init.parent.bubbles, init.parent.cancelable, diff --git a/components/script/dom/extendablemessageevent.rs b/components/script/dom/extendablemessageevent.rs index 19bca33c6ca..2d22e00be94 100644 --- a/components/script/dom/extendablemessageevent.rs +++ b/components/script/dom/extendablemessageevent.rs @@ -7,7 +7,7 @@ use crate::dom::bindings::codegen::Bindings::ExtendableMessageEventBinding; use crate::dom::bindings::codegen::Bindings::ExtendableMessageEventBinding::ExtendableMessageEventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::bindings::trace::RootedTraceableBox; @@ -22,7 +22,7 @@ use crate::script_runtime::JSContext; use dom_struct::dom_struct; use js::jsapi::Heap; use js::jsval::JSVal; -use js::rust::HandleValue; +use js::rust::{HandleObject, HandleValue}; use servo_atoms::Atom; #[dom_struct] @@ -73,12 +73,36 @@ impl ExtendableMessageEvent { lastEventId: DOMString, ports: Vec<DomRoot<MessagePort>>, ) -> DomRoot<ExtendableMessageEvent> { + Self::new_with_proto( + global, + None, + type_, + bubbles, + cancelable, + data, + origin, + lastEventId, + ports, + ) + } + + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + type_: Atom, + bubbles: bool, + cancelable: bool, + data: HandleValue, + origin: DOMString, + lastEventId: DOMString, + ports: Vec<DomRoot<MessagePort>>, + ) -> DomRoot<ExtendableMessageEvent> { let ev = Box::new(ExtendableMessageEvent::new_inherited( origin, lastEventId, ports, )); - let ev = reflect_dom_object(ev, global); + let ev = reflect_dom_object2(ev, global, proto); { let event = ev.upcast::<Event>(); event.init_event(type_, bubbles, cancelable); @@ -90,12 +114,14 @@ impl ExtendableMessageEvent { pub fn Constructor( worker: &ServiceWorkerGlobalScope, + proto: Option<HandleObject>, type_: DOMString, init: RootedTraceableBox<ExtendableMessageEventBinding::ExtendableMessageEventInit>, ) -> Fallible<DomRoot<ExtendableMessageEvent>> { let global = worker.upcast::<GlobalScope>(); - let ev = ExtendableMessageEvent::new( + let ev = ExtendableMessageEvent::new_with_proto( global, + proto, Atom::from(type_), init.parent.parent.bubbles, init.parent.parent.cancelable, diff --git a/components/script/dom/file.rs b/components/script/dom/file.rs index cbbc16bd264..946677d5b35 100644 --- a/components/script/dom/file.rs +++ b/components/script/dom/file.rs @@ -7,13 +7,14 @@ use crate::dom::bindings::codegen::Bindings::FileBinding::FileMethods; use crate::dom::bindings::codegen::UnionTypes::ArrayBufferOrArrayBufferViewOrBlobOrString; use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::blob::{blob_parts_to_bytes, normalize_type_string, Blob}; use crate::dom::globalscope::GlobalScope; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use net_traits::filemanager_thread::SelectedFile; use script_traits::serializable::BlobImpl; @@ -41,16 +42,27 @@ impl File { } } - #[allow(unrooted_must_root)] pub fn new( global: &GlobalScope, blob_impl: BlobImpl, name: DOMString, modified: Option<i64>, ) -> DomRoot<File> { - let file = reflect_dom_object( + Self::new_with_proto(global, None, blob_impl, name, modified) + } + + #[allow(unrooted_must_root)] + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + blob_impl: BlobImpl, + name: DOMString, + modified: Option<i64>, + ) -> DomRoot<File> { + let file = reflect_dom_object2( Box::new(File::new_inherited(&blob_impl, name, modified)), global, + proto, ); global.track_file(&file, blob_impl); file @@ -82,6 +94,7 @@ impl File { #[allow(non_snake_case)] pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, fileBits: Vec<ArrayBufferOrArrayBufferViewOrBlobOrString>, filename: DOMString, filePropertyBag: &FileBinding::FilePropertyBag, @@ -98,8 +111,9 @@ impl File { // see https://github.com/w3c/FileAPI/issues/41 let replaced_filename = DOMString::from_string(filename.replace("/", ":")); let type_string = normalize_type_string(&blobPropertyBag.type_.to_string()); - Ok(File::new( + Ok(File::new_with_proto( global, + proto, BlobImpl::new_from_bytes(bytes, type_string), replaced_filename, modified, diff --git a/components/script/dom/filereader.rs b/components/script/dom/filereader.rs index 2e56f48079c..bc5024cb1fa 100644 --- a/components/script/dom/filereader.rs +++ b/components/script/dom/filereader.rs @@ -11,7 +11,7 @@ use crate::dom::bindings::codegen::UnionTypes::StringOrObject; use crate::dom::bindings::error::{Error, ErrorResult, Fallible}; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::refcounted::Trusted; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::str::DOMString; use crate::dom::bindings::trace::RootedTraceableBox; @@ -31,6 +31,7 @@ use encoding_rs::{Encoding, UTF_8}; use js::jsapi::Heap; use js::jsapi::JSObject; use js::jsval::{self, JSVal}; +use js::rust::HandleObject; use js::typedarray::{ArrayBuffer, CreateWith}; use mime::{self, Mime}; use servo_atoms::Atom; @@ -151,13 +152,13 @@ impl FileReader { } } - pub fn new(global: &GlobalScope) -> DomRoot<FileReader> { - reflect_dom_object(Box::new(FileReader::new_inherited()), global) + fn new(global: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<FileReader> { + reflect_dom_object2(Box::new(FileReader::new_inherited()), global, proto) } #[allow(non_snake_case)] - pub fn Constructor(global: &GlobalScope) -> Fallible<DomRoot<FileReader>> { - Ok(FileReader::new(global)) + pub fn Constructor(global: &GlobalScope, proto: Option<HandleObject>) -> Fallible<DomRoot<FileReader>> { + Ok(FileReader::new(global, proto)) } //https://w3c.github.io/FileAPI/#dfn-error-steps diff --git a/components/script/dom/filereadersync.rs b/components/script/dom/filereadersync.rs index 044cb48c27d..0f74ed504bd 100644 --- a/components/script/dom/filereadersync.rs +++ b/components/script/dom/filereadersync.rs @@ -5,7 +5,7 @@ use crate::dom::bindings::codegen::Bindings::BlobBinding::BlobMethods; use crate::dom::bindings::codegen::Bindings::FileReaderSyncBinding::FileReaderSyncMethods; use crate::dom::bindings::error::{Error, Fallible}; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::blob::Blob; @@ -14,6 +14,7 @@ use crate::dom::globalscope::GlobalScope; use crate::script_runtime::JSContext; use dom_struct::dom_struct; use js::jsapi::JSObject; +use js::rust::HandleObject; use js::typedarray::{ArrayBuffer, CreateWith}; use std::ptr; use std::ptr::NonNull; @@ -30,13 +31,13 @@ impl FileReaderSync { } } - pub fn new(global: &GlobalScope) -> DomRoot<FileReaderSync> { - reflect_dom_object(Box::new(FileReaderSync::new_inherited()), global) + fn new(global: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<FileReaderSync> { + reflect_dom_object2(Box::new(FileReaderSync::new_inherited()), global, proto) } #[allow(non_snake_case)] - pub fn Constructor(global: &GlobalScope) -> Fallible<DomRoot<FileReaderSync>> { - Ok(FileReaderSync::new(global)) + pub fn Constructor(global: &GlobalScope, proto: Option<HandleObject>) -> Fallible<DomRoot<FileReaderSync>> { + Ok(FileReaderSync::new(global, proto)) } fn get_blob_bytes(blob: &Blob) -> Result<Vec<u8>, Error> { diff --git a/components/script/dom/focusevent.rs b/components/script/dom/focusevent.rs index 2d983bcc881..76d546a541e 100644 --- a/components/script/dom/focusevent.rs +++ b/components/script/dom/focusevent.rs @@ -7,7 +7,7 @@ use crate::dom::bindings::codegen::Bindings::FocusEventBinding::FocusEventMethod use crate::dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::str::DOMString; use crate::dom::event::{EventBubbles, EventCancelable}; @@ -15,6 +15,7 @@ use crate::dom::eventtarget::EventTarget; use crate::dom::uievent::UIEvent; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use std::default::Default; #[dom_struct] @@ -32,7 +33,11 @@ impl FocusEvent { } pub fn new_uninitialized(window: &Window) -> DomRoot<FocusEvent> { - reflect_dom_object(Box::new(FocusEvent::new_inherited()), window) + Self::new_uninitialized_with_proto(window, None) + } + + pub fn new_uninitialized_with_proto(window: &Window, proto: Option<HandleObject>) -> DomRoot<FocusEvent> { + reflect_dom_object2(Box::new(FocusEvent::new_inherited()), window, proto) } pub fn new( @@ -44,7 +49,29 @@ impl FocusEvent { detail: i32, related_target: Option<&EventTarget>, ) -> DomRoot<FocusEvent> { - let ev = FocusEvent::new_uninitialized(window); + Self::new_with_proto( + window, + None, + type_, + can_bubble, + cancelable, + view, + detail, + related_target, + ) + } + + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + type_: DOMString, + can_bubble: EventBubbles, + cancelable: EventCancelable, + view: Option<&Window>, + detail: i32, + related_target: Option<&EventTarget>, + ) -> DomRoot<FocusEvent> { + let ev = FocusEvent::new_uninitialized_with_proto(window, proto); ev.upcast::<UIEvent>().InitUIEvent( type_, bool::from(can_bubble), @@ -59,13 +86,15 @@ impl FocusEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &FocusEventBinding::FocusEventInit, ) -> Fallible<DomRoot<FocusEvent>> { let bubbles = EventBubbles::from(init.parent.parent.bubbles); let cancelable = EventCancelable::from(init.parent.parent.cancelable); - let event = FocusEvent::new( + let event = FocusEvent::new_with_proto( window, + proto, type_, bubbles, cancelable, diff --git a/components/script/dom/formdata.rs b/components/script/dom/formdata.rs index 3a8f3ce4b5b..3d1d28a0ddc 100644 --- a/components/script/dom/formdata.rs +++ b/components/script/dom/formdata.rs @@ -8,7 +8,7 @@ use crate::dom::bindings::codegen::UnionTypes::FileOrUSVString; use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::iterable::Iterable; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::{DOMString, USVString}; use crate::dom::blob::Blob; @@ -17,6 +17,7 @@ use crate::dom::globalscope::GlobalScope; use crate::dom::htmlformelement::{FormDatum, FormDatumValue, HTMLFormElement}; use dom_struct::dom_struct; use html5ever::LocalName; +use js::rust::HandleObject; use script_traits::serializable::BlobImpl; #[dom_struct] @@ -42,23 +43,28 @@ impl FormData { } pub fn new(form_datums: Option<Vec<FormDatum>>, global: &GlobalScope) -> DomRoot<FormData> { - reflect_dom_object(Box::new(FormData::new_inherited(form_datums)), global) + Self::new_with_proto(form_datums, global, None) + } + + fn new_with_proto(form_datums: Option<Vec<FormDatum>>, global: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<FormData> { + reflect_dom_object2(Box::new(FormData::new_inherited(form_datums)), global, proto) } // https://xhr.spec.whatwg.org/#dom-formdata #[allow(non_snake_case)] pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, form: Option<&HTMLFormElement>, ) -> Fallible<DomRoot<FormData>> { if let Some(opt_form) = form { return match opt_form.get_form_dataset(None, None) { - Some(form_datums) => Ok(FormData::new(Some(form_datums), global)), + Some(form_datums) => Ok(FormData::new_with_proto(Some(form_datums), global, proto)), None => Err(Error::InvalidState), }; } - Ok(FormData::new(None, global)) + Ok(FormData::new_with_proto(None, global, proto)) } } diff --git a/components/script/dom/formdataevent.rs b/components/script/dom/formdataevent.rs index 263d176f66f..00b6c0718b3 100644 --- a/components/script/dom/formdataevent.rs +++ b/components/script/dom/formdataevent.rs @@ -7,7 +7,7 @@ use crate::dom::bindings::codegen::Bindings::FormDataEventBinding; use crate::dom::bindings::codegen::Bindings::FormDataEventBinding::FormDataEventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::event::Event; @@ -16,6 +16,7 @@ use crate::dom::formdata::FormData; use crate::dom::globalscope::GlobalScope; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; #[dom_struct] @@ -32,12 +33,31 @@ impl FormDataEvent { cancelable: EventCancelable, form_data: &FormData, ) -> DomRoot<FormDataEvent> { - let ev = reflect_dom_object( + Self::new_with_proto( + global, + None, + type_, + can_bubble, + cancelable, + form_data, + ) + } + + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + type_: Atom, + can_bubble: EventBubbles, + cancelable: EventCancelable, + form_data: &FormData, + ) -> DomRoot<FormDataEvent> { + let ev = reflect_dom_object2( Box::new(FormDataEvent { event: Event::new_inherited(), form_data: Dom::from_ref(form_data), }), global, + proto, ); { @@ -50,14 +70,16 @@ impl FormDataEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &FormDataEventBinding::FormDataEventInit, ) -> Fallible<DomRoot<FormDataEvent>> { let bubbles = EventBubbles::from(init.parent.bubbles); let cancelable = EventCancelable::from(init.parent.cancelable); - let event = FormDataEvent::new( + let event = FormDataEvent::new_with_proto( &window.global(), + proto, Atom::from(type_), bubbles, cancelable, diff --git a/components/script/dom/gainnode.rs b/components/script/dom/gainnode.rs index 86a957734dd..9b3910cf31a 100644 --- a/components/script/dom/gainnode.rs +++ b/components/script/dom/gainnode.rs @@ -11,10 +11,11 @@ use crate::dom::bindings::codegen::Bindings::AudioNodeBinding::{ use crate::dom::bindings::codegen::Bindings::AudioParamBinding::AutomationRate; use crate::dom::bindings::codegen::Bindings::GainNodeBinding::{GainNodeMethods, GainOptions}; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_media::audio::gain_node::GainNodeOptions; use servo_media::audio::node::AudioNodeInit; use servo_media::audio::param::ParamType; @@ -60,23 +61,33 @@ impl GainNode { }) } - #[allow(unrooted_must_root)] pub fn new( window: &Window, context: &BaseAudioContext, options: &GainOptions, ) -> Fallible<DomRoot<GainNode>> { + Self::new_with_proto(window, None, context, options) + } + + #[allow(unrooted_must_root)] + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + context: &BaseAudioContext, + options: &GainOptions, + ) -> Fallible<DomRoot<GainNode>> { let node = GainNode::new_inherited(window, context, options)?; - Ok(reflect_dom_object(Box::new(node), window)) + Ok(reflect_dom_object2(Box::new(node), window, proto)) } #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, context: &BaseAudioContext, options: &GainOptions, ) -> Fallible<DomRoot<GainNode>> { - GainNode::new(window, context, options) + GainNode::new_with_proto(window, proto, context, options) } } diff --git a/components/script/dom/gamepadevent.rs b/components/script/dom/gamepadevent.rs index a6a3ad9e57c..effacc6eeb2 100644 --- a/components/script/dom/gamepadevent.rs +++ b/components/script/dom/gamepadevent.rs @@ -7,7 +7,7 @@ use crate::dom::bindings::codegen::Bindings::GamepadEventBinding; use crate::dom::bindings::codegen::Bindings::GamepadEventBinding::GamepadEventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::event::Event; @@ -15,6 +15,7 @@ use crate::dom::gamepad::Gamepad; use crate::dom::globalscope::GlobalScope; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; #[dom_struct] @@ -43,7 +44,18 @@ impl GamepadEvent { cancelable: bool, gamepad: &Gamepad, ) -> DomRoot<GamepadEvent> { - let ev = reflect_dom_object(Box::new(GamepadEvent::new_inherited(&gamepad)), global); + Self::new_with_proto(global, None, type_, bubbles, cancelable, gamepad) + } + + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + type_: Atom, + bubbles: bool, + cancelable: bool, + gamepad: &Gamepad, + ) -> DomRoot<GamepadEvent> { + let ev = reflect_dom_object2(Box::new(GamepadEvent::new_inherited(&gamepad)), global, proto); { let event = ev.upcast::<Event>(); event.init_event(type_, bubbles, cancelable); @@ -68,11 +80,13 @@ impl GamepadEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &GamepadEventBinding::GamepadEventInit, ) -> Fallible<DomRoot<GamepadEvent>> { - Ok(GamepadEvent::new( + Ok(GamepadEvent::new_with_proto( &window.global(), + proto, Atom::from(type_), init.parent.bubbles, init.parent.cancelable, diff --git a/components/script/dom/gpuoutofmemoryerror.rs b/components/script/dom/gpuoutofmemoryerror.rs index fb0b2e11d86..0689e8df3bb 100644 --- a/components/script/dom/gpuoutofmemoryerror.rs +++ b/components/script/dom/gpuoutofmemoryerror.rs @@ -2,10 +2,11 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::globalscope::GlobalScope; use dom_struct::dom_struct; +use js::rust::HandleObject; #[dom_struct] pub struct GPUOutOfMemoryError { @@ -20,12 +21,16 @@ impl GPUOutOfMemoryError { } pub fn new(global: &GlobalScope) -> DomRoot<Self> { - reflect_dom_object(Box::new(GPUOutOfMemoryError::new_inherited()), global) + Self::new_with_proto(global, None) + } + + fn new_with_proto(global: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<Self> { + reflect_dom_object2(Box::new(GPUOutOfMemoryError::new_inherited()), global, proto) } /// https://gpuweb.github.io/gpuweb/#dom-gpuoutofmemoryerror-gpuoutofmemoryerror #[allow(non_snake_case)] - pub fn Constructor(global: &GlobalScope) -> DomRoot<Self> { - GPUOutOfMemoryError::new(global) + pub fn Constructor(global: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<Self> { + GPUOutOfMemoryError::new_with_proto(global, proto) } } diff --git a/components/script/dom/gpuuncapturederrorevent.rs b/components/script/dom/gpuuncapturederrorevent.rs index 30c9692a27d..bdf62162dfe 100644 --- a/components/script/dom/gpuuncapturederrorevent.rs +++ b/components/script/dom/gpuuncapturederrorevent.rs @@ -7,12 +7,13 @@ use crate::dom::bindings::codegen::Bindings::GPUUncapturedErrorEventBinding::{ GPUUncapturedErrorEventInit, GPUUncapturedErrorEventMethods, }; use crate::dom::bindings::codegen::Bindings::GPUValidationErrorBinding::GPUError; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::event::Event; use crate::dom::globalscope::GlobalScope; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; #[dom_struct] @@ -35,9 +36,19 @@ impl GPUUncapturedErrorEvent { type_: DOMString, init: &GPUUncapturedErrorEventInit, ) -> DomRoot<Self> { - let ev = reflect_dom_object( + Self::new_with_proto(global, None, type_, init) + } + + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + type_: DOMString, + init: &GPUUncapturedErrorEventInit, + ) -> DomRoot<Self> { + let ev = reflect_dom_object2( Box::new(GPUUncapturedErrorEvent::new_inherited(init)), global, + proto, ); ev.event.init_event( Atom::from(type_), @@ -51,10 +62,11 @@ impl GPUUncapturedErrorEvent { #[allow(non_snake_case)] pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, type_: DOMString, init: &GPUUncapturedErrorEventInit, ) -> DomRoot<Self> { - GPUUncapturedErrorEvent::new(global, type_, init) + GPUUncapturedErrorEvent::new_with_proto(global, proto, type_, init) } } diff --git a/components/script/dom/gpuvalidationerror.rs b/components/script/dom/gpuvalidationerror.rs index 4b0b6ec1627..e1456b510a6 100644 --- a/components/script/dom/gpuvalidationerror.rs +++ b/components/script/dom/gpuvalidationerror.rs @@ -3,11 +3,12 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::dom::bindings::codegen::Bindings::GPUValidationErrorBinding::GPUValidationErrorMethods; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::globalscope::GlobalScope; use dom_struct::dom_struct; +use js::rust::HandleObject; #[dom_struct] pub struct GPUValidationError { @@ -24,13 +25,17 @@ impl GPUValidationError { } pub fn new(global: &GlobalScope, message: DOMString) -> DomRoot<Self> { - reflect_dom_object(Box::new(GPUValidationError::new_inherited(message)), global) + Self::new_with_proto(global, None, message) + } + + fn new_with_proto(global: &GlobalScope, proto: Option<HandleObject>, message: DOMString) -> DomRoot<Self> { + reflect_dom_object2(Box::new(GPUValidationError::new_inherited(message)), global, proto) } /// https://gpuweb.github.io/gpuweb/#dom-gpuvalidationerror-gpuvalidationerror #[allow(non_snake_case)] - pub fn Constructor(global: &GlobalScope, message: DOMString) -> DomRoot<Self> { - GPUValidationError::new(global, message) + pub fn Constructor(global: &GlobalScope, proto: Option<HandleObject>, message: DOMString) -> DomRoot<Self> { + GPUValidationError::new_with_proto(global, proto, message) } } diff --git a/components/script/dom/hashchangeevent.rs b/components/script/dom/hashchangeevent.rs index 046500b9b6d..8dbb2fd704a 100644 --- a/components/script/dom/hashchangeevent.rs +++ b/components/script/dom/hashchangeevent.rs @@ -7,12 +7,13 @@ use crate::dom::bindings::codegen::Bindings::HashChangeEventBinding; use crate::dom::bindings::codegen::Bindings::HashChangeEventBinding::HashChangeEventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::{DOMString, USVString}; use crate::dom::event::Event; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; // https://html.spec.whatwg.org/multipage/#hashchangeevent @@ -33,9 +34,14 @@ impl HashChangeEvent { } pub fn new_uninitialized(window: &Window) -> DomRoot<HashChangeEvent> { - reflect_dom_object( + Self::new_uninitialized_with_proto(window, None) + } + + fn new_uninitialized_with_proto(window: &Window, proto: Option<HandleObject>) -> DomRoot<HashChangeEvent> { + reflect_dom_object2( Box::new(HashChangeEvent::new_inherited(String::new(), String::new())), window, + proto, ) } @@ -47,9 +53,22 @@ impl HashChangeEvent { old_url: String, new_url: String, ) -> DomRoot<HashChangeEvent> { - let ev = reflect_dom_object( + Self::new_with_proto(window, None, type_, bubbles, cancelable, old_url, new_url) + } + + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + type_: Atom, + bubbles: bool, + cancelable: bool, + old_url: String, + new_url: String, + ) -> DomRoot<HashChangeEvent> { + let ev = reflect_dom_object2( Box::new(HashChangeEvent::new_inherited(old_url, new_url)), window, + proto, ); { let event = ev.upcast::<Event>(); @@ -61,11 +80,13 @@ impl HashChangeEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &HashChangeEventBinding::HashChangeEventInit, ) -> Fallible<DomRoot<HashChangeEvent>> { - Ok(HashChangeEvent::new( + Ok(HashChangeEvent::new_with_proto( window, + proto, Atom::from(type_), init.parent.bubbles, init.parent.cancelable, diff --git a/components/script/dom/headers.rs b/components/script/dom/headers.rs index 6d466ea0c61..8cae2df36a1 100644 --- a/components/script/dom/headers.rs +++ b/components/script/dom/headers.rs @@ -6,13 +6,14 @@ use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::HeadersBinding::{HeadersInit, HeadersMethods}; use crate::dom::bindings::error::{Error, ErrorResult, Fallible}; use crate::dom::bindings::iterable::Iterable; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::{is_token, ByteString}; use crate::dom::globalscope::GlobalScope; use data_url::mime::Mime as DataUrlMime; use dom_struct::dom_struct; use http::header::{HeaderMap as HyperHeaders, HeaderName, HeaderValue}; +use js::rust::HandleObject; use net_traits::{ fetch::headers::get_value_from_header_list, request::is_cors_safelisted_request_header, }; @@ -47,16 +48,21 @@ impl Headers { } pub fn new(global: &GlobalScope) -> DomRoot<Headers> { - reflect_dom_object(Box::new(Headers::new_inherited()), global) + Self::new_with_proto(global, None) + } + + fn new_with_proto(global: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<Headers> { + reflect_dom_object2(Box::new(Headers::new_inherited()), global, proto) } // https://fetch.spec.whatwg.org/#dom-headers #[allow(non_snake_case)] pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, init: Option<HeadersInit>, ) -> Fallible<DomRoot<Headers>> { - let dom_headers_new = Headers::new(global); + let dom_headers_new = Headers::new_with_proto(global, proto); dom_headers_new.fill(init)?; Ok(dom_headers_new) } diff --git a/components/script/dom/htmlanchorelement.rs b/components/script/dom/htmlanchorelement.rs index bd9a526cd16..e36119dd790 100644 --- a/components/script/dom/htmlanchorelement.rs +++ b/components/script/dom/htmlanchorelement.rs @@ -29,6 +29,7 @@ use crate::dom::virtualmethods::VirtualMethods; use crate::task_source::TaskSource; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use net_traits::request::Referrer; use num_traits::ToPrimitive; use script_traits::{HistoryEntryReplacement, LoadData, LoadOrigin}; @@ -62,12 +63,14 @@ impl HTMLAnchorElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLAnchorElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLAnchorElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } diff --git a/components/script/dom/htmlareaelement.rs b/components/script/dom/htmlareaelement.rs index ef85bb8791e..0df17d1b857 100644 --- a/components/script/dom/htmlareaelement.rs +++ b/components/script/dom/htmlareaelement.rs @@ -19,6 +19,7 @@ use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use euclid::default::Point2D; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use servo_atoms::Atom; use std::default::Default; use std::f32; @@ -253,10 +254,12 @@ impl HTMLAreaElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLAreaElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLAreaElement::new_inherited(local_name, prefix, document)), document, + proto, ) } diff --git a/components/script/dom/htmlaudioelement.rs b/components/script/dom/htmlaudioelement.rs index db8f1877a6d..661f882944a 100644 --- a/components/script/dom/htmlaudioelement.rs +++ b/components/script/dom/htmlaudioelement.rs @@ -15,6 +15,7 @@ use crate::dom::node::Node; use crate::dom::window::Window; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix, QualName}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLAudioElement { @@ -37,24 +38,27 @@ impl HTMLAudioElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLAudioElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLAudioElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } // https://html.spec.whatwg.org/multipage/#dom-audio #[allow(non_snake_case)] - pub fn Audio(window: &Window, src: Option<DOMString>) -> Fallible<DomRoot<HTMLAudioElement>> { + pub fn Audio(window: &Window, proto: Option<HandleObject>, src: Option<DOMString>) -> Fallible<DomRoot<HTMLAudioElement>> { let element = Element::create( QualName::new(None, ns!(html), local_name!("audio")), None, &window.Document(), ElementCreator::ScriptCreated, CustomElementCreationMode::Synchronous, + proto, ); let audio = DomRoot::downcast::<HTMLAudioElement>(element).unwrap(); diff --git a/components/script/dom/htmlbaseelement.rs b/components/script/dom/htmlbaseelement.rs index e6568716e1f..29fd459458a 100644 --- a/components/script/dom/htmlbaseelement.rs +++ b/components/script/dom/htmlbaseelement.rs @@ -14,6 +14,7 @@ use crate::dom::node::{document_from_node, BindContext, Node, UnbindContext}; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use servo_url::ServoUrl; #[dom_struct] @@ -37,10 +38,12 @@ impl HTMLBaseElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLBaseElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLBaseElement::new_inherited(local_name, prefix, document)), document, + proto, ) } diff --git a/components/script/dom/htmlbodyelement.rs b/components/script/dom/htmlbodyelement.rs index 775af6a686c..d3408db6386 100644 --- a/components/script/dom/htmlbodyelement.rs +++ b/components/script/dom/htmlbodyelement.rs @@ -18,6 +18,7 @@ use cssparser::RGBA; use dom_struct::dom_struct; use embedder_traits::EmbedderMsg; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use servo_url::ServoUrl; use style::attr::AttrValue; @@ -46,10 +47,12 @@ impl HTMLBodyElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLBodyElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLBodyElement::new_inherited(local_name, prefix, document)), document, + proto, ) } diff --git a/components/script/dom/htmlbrelement.rs b/components/script/dom/htmlbrelement.rs index d087dfffb02..a1388218ecb 100644 --- a/components/script/dom/htmlbrelement.rs +++ b/components/script/dom/htmlbrelement.rs @@ -8,6 +8,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLBRElement { @@ -30,10 +31,12 @@ impl HTMLBRElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject> ) -> DomRoot<HTMLBRElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLBRElement::new_inherited(local_name, prefix, document)), document, + proto, ) } } diff --git a/components/script/dom/htmlbuttonelement.rs b/components/script/dom/htmlbuttonelement.rs index 9e9898f328c..6b22c542681 100755 --- a/components/script/dom/htmlbuttonelement.rs +++ b/components/script/dom/htmlbuttonelement.rs @@ -24,6 +24,7 @@ use crate::dom::validitystate::ValidityState; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use std::cell::Cell; use std::default::Default; use style::element_state::ElementState; @@ -69,12 +70,14 @@ impl HTMLButtonElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLButtonElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLButtonElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs index 33f0c6c6a34..d12a7847d02 100644 --- a/components/script/dom/htmlcanvaselement.rs +++ b/components/script/dom/htmlcanvaselement.rs @@ -41,7 +41,7 @@ use image::codecs::png::PngEncoder; use image::{ColorType, ImageEncoder}; use ipc_channel::ipc::{self as ipcchan, IpcSharedMemory}; use js::error::throw_type_error; -use js::rust::HandleValue; +use js::rust::{HandleObject, HandleValue}; use profile_traits::ipc; use script_layout_interface::{HTMLCanvasData, HTMLCanvasDataSource}; use script_traits::ScriptMsg; @@ -84,12 +84,14 @@ impl HTMLCanvasElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLCanvasElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLCanvasElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } diff --git a/components/script/dom/htmldataelement.rs b/components/script/dom/htmldataelement.rs index 93594ec8816..70fdb2f95fd 100644 --- a/components/script/dom/htmldataelement.rs +++ b/components/script/dom/htmldataelement.rs @@ -10,6 +10,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLDataElement { @@ -32,10 +33,12 @@ impl HTMLDataElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLDataElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLDataElement::new_inherited(local_name, prefix, document)), document, + proto, ) } } diff --git a/components/script/dom/htmldatalistelement.rs b/components/script/dom/htmldatalistelement.rs index 6bddb2800e4..9323a627c15 100644 --- a/components/script/dom/htmldatalistelement.rs +++ b/components/script/dom/htmldatalistelement.rs @@ -13,6 +13,7 @@ use crate::dom::htmloptionelement::HTMLOptionElement; use crate::dom::node::{window_from_node, Node}; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLDataListElement { @@ -35,12 +36,14 @@ impl HTMLDataListElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLDataListElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLDataListElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmldetailselement.rs b/components/script/dom/htmldetailselement.rs index 5ec9ab68604..6996164fe00 100644 --- a/components/script/dom/htmldetailselement.rs +++ b/components/script/dom/htmldetailselement.rs @@ -16,6 +16,7 @@ use crate::dom::virtualmethods::VirtualMethods; use crate::task_source::TaskSource; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use std::cell::Cell; #[dom_struct] @@ -41,12 +42,14 @@ impl HTMLDetailsElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLDetailsElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLDetailsElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } diff --git a/components/script/dom/htmldialogelement.rs b/components/script/dom/htmldialogelement.rs index 135f7afe035..b907e3d3912 100644 --- a/components/script/dom/htmldialogelement.rs +++ b/components/script/dom/htmldialogelement.rs @@ -14,6 +14,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::{window_from_node, Node}; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLDialogElement { @@ -38,12 +39,14 @@ impl HTMLDialogElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLDialogElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLDialogElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmldirectoryelement.rs b/components/script/dom/htmldirectoryelement.rs index ce2472be3d3..697607e8336 100644 --- a/components/script/dom/htmldirectoryelement.rs +++ b/components/script/dom/htmldirectoryelement.rs @@ -8,6 +8,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLDirectoryElement { @@ -30,12 +31,14 @@ impl HTMLDirectoryElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLDirectoryElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLDirectoryElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmldivelement.rs b/components/script/dom/htmldivelement.rs index 0bd558210a0..284e1af3690 100644 --- a/components/script/dom/htmldivelement.rs +++ b/components/script/dom/htmldivelement.rs @@ -10,6 +10,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLDivElement { @@ -32,10 +33,12 @@ impl HTMLDivElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLDivElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLDivElement::new_inherited(local_name, prefix, document)), document, + proto, ) } } diff --git a/components/script/dom/htmldlistelement.rs b/components/script/dom/htmldlistelement.rs index 356c30c8c94..1477c95668c 100644 --- a/components/script/dom/htmldlistelement.rs +++ b/components/script/dom/htmldlistelement.rs @@ -8,6 +8,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLDListElement { @@ -30,12 +31,14 @@ impl HTMLDListElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLDListElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLDListElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index 0b1cb499fe2..c2c2bb29a7f 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -36,6 +36,7 @@ use crate::dom::text::Text; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use script_layout_interface::message::QueryMsg; use std::collections::HashSet; use std::default::Default; @@ -83,10 +84,12 @@ impl HTMLElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLElement::new_inherited(local_name, prefix, document)), document, + proto, ) } @@ -487,7 +490,7 @@ impl HTMLElementMethods for HTMLElement { text = String::new(); } - let br = HTMLBRElement::new(local_name!("br"), None, &document); + let br = HTMLBRElement::new(local_name!("br"), None, &document, None); fragment.upcast::<Node>().AppendChild(&br.upcast()).unwrap(); }, _ => { diff --git a/components/script/dom/htmlembedelement.rs b/components/script/dom/htmlembedelement.rs index e21b8f5ce35..ac7097e0331 100644 --- a/components/script/dom/htmlembedelement.rs +++ b/components/script/dom/htmlembedelement.rs @@ -8,6 +8,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLEmbedElement { @@ -30,12 +31,14 @@ impl HTMLEmbedElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLEmbedElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLEmbedElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmlfieldsetelement.rs b/components/script/dom/htmlfieldsetelement.rs index cefee026751..f6629b5860b 100644 --- a/components/script/dom/htmlfieldsetelement.rs +++ b/components/script/dom/htmlfieldsetelement.rs @@ -19,6 +19,7 @@ use crate::dom::validitystate::ValidityState; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use std::default::Default; use style::element_state::ElementState; @@ -52,12 +53,14 @@ impl HTMLFieldSetElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLFieldSetElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLFieldSetElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmlfontelement.rs b/components/script/dom/htmlfontelement.rs index f9b1575577e..8ec432cf504 100644 --- a/components/script/dom/htmlfontelement.rs +++ b/components/script/dom/htmlfontelement.rs @@ -15,6 +15,7 @@ use crate::dom::virtualmethods::VirtualMethods; use cssparser::RGBA; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use servo_atoms::Atom; use style::attr::AttrValue; use style::str::{read_numbers, HTML_SPACE_CHARACTERS}; @@ -40,10 +41,12 @@ impl HTMLFontElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLFontElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLFontElement::new_inherited(local_name, prefix, document)), document, + proto, ) } } diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs index 404f3f4b648..5d8d83d6783 100644 --- a/components/script/dom/htmlformelement.rs +++ b/components/script/dom/htmlformelement.rs @@ -62,6 +62,7 @@ use encoding_rs::{Encoding, UTF_8}; use headers::{ContentType, HeaderMapExt}; use html5ever::{LocalName, Prefix}; use http::Method; +use js::rust::HandleObject; use mime::{self, Mime}; use net_traits::http_percent_encode; use net_traits::request::Referrer; @@ -120,10 +121,12 @@ impl HTMLFormElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLFormElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLFormElement::new_inherited(local_name, prefix, document)), document, + proto, ) } diff --git a/components/script/dom/htmlframeelement.rs b/components/script/dom/htmlframeelement.rs index fa3ad51393e..4128a50841c 100644 --- a/components/script/dom/htmlframeelement.rs +++ b/components/script/dom/htmlframeelement.rs @@ -8,6 +8,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLFrameElement { @@ -30,12 +31,14 @@ impl HTMLFrameElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLFrameElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLFrameElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmlframesetelement.rs b/components/script/dom/htmlframesetelement.rs index dc071b47074..0b7f209c677 100644 --- a/components/script/dom/htmlframesetelement.rs +++ b/components/script/dom/htmlframesetelement.rs @@ -11,6 +11,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::{document_from_node, Node}; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLFrameSetElement { @@ -33,12 +34,14 @@ impl HTMLFrameSetElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLFrameSetElement> { - let n = Node::reflect_node( + let n = Node::reflect_node_with_proto( Box::new(HTMLFrameSetElement::new_inherited( local_name, prefix, document, )), document, + proto, ); n.upcast::<Node>().set_weird_parser_insertion_mode(); n diff --git a/components/script/dom/htmlheadelement.rs b/components/script/dom/htmlheadelement.rs index 1bd6e5e1148..81c0f4bd777 100644 --- a/components/script/dom/htmlheadelement.rs +++ b/components/script/dom/htmlheadelement.rs @@ -14,6 +14,7 @@ use crate::dom::userscripts::load_script; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLHeadElement { @@ -36,10 +37,12 @@ impl HTMLHeadElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLHeadElement> { - let n = Node::reflect_node( + let n = Node::reflect_node_with_proto( Box::new(HTMLHeadElement::new_inherited(local_name, prefix, document)), document, + proto, ); n.upcast::<Node>().set_weird_parser_insertion_mode(); diff --git a/components/script/dom/htmlheadingelement.rs b/components/script/dom/htmlheadingelement.rs index 659cf14f4d2..f990883498e 100644 --- a/components/script/dom/htmlheadingelement.rs +++ b/components/script/dom/htmlheadingelement.rs @@ -8,6 +8,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[derive(JSTraceable, MallocSizeOf)] pub enum HeadingLevel { @@ -43,13 +44,15 @@ impl HTMLHeadingElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, level: HeadingLevel, ) -> DomRoot<HTMLHeadingElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLHeadingElement::new_inherited( local_name, prefix, document, level, )), document, + proto, ) } } diff --git a/components/script/dom/htmlhrelement.rs b/components/script/dom/htmlhrelement.rs index 69fa8887bb1..d553e8f3261 100644 --- a/components/script/dom/htmlhrelement.rs +++ b/components/script/dom/htmlhrelement.rs @@ -14,6 +14,7 @@ use crate::dom::virtualmethods::VirtualMethods; use cssparser::RGBA; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use style::attr::{AttrValue, LengthOrPercentageOrAuto}; #[dom_struct] @@ -37,10 +38,12 @@ impl HTMLHRElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLHRElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLHRElement::new_inherited(local_name, prefix, document)), document, + proto, ) } } diff --git a/components/script/dom/htmlhtmlelement.rs b/components/script/dom/htmlhtmlelement.rs index da77d3464d9..171a071ee8d 100644 --- a/components/script/dom/htmlhtmlelement.rs +++ b/components/script/dom/htmlhtmlelement.rs @@ -9,6 +9,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLHtmlElement { @@ -32,10 +33,12 @@ impl HTMLHtmlElement { localName: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLHtmlElement> { - let n = Node::reflect_node( + let n = Node::reflect_node_with_proto( Box::new(HTMLHtmlElement::new_inherited(localName, prefix, document)), document, + proto, ); n.upcast::<Node>().set_weird_parser_insertion_mode(); diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs index 1fe04c04518..e0fe53317ce 100644 --- a/components/script/dom/htmliframeelement.rs +++ b/components/script/dom/htmliframeelement.rs @@ -28,6 +28,7 @@ use crate::script_thread::ScriptThread; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; use ipc_channel::ipc; +use js::rust::HandleObject; use msg::constellation_msg::{BrowsingContextId, PipelineId, TopLevelBrowsingContextId}; use profile_traits::ipc as ProfiledIpc; use script_layout_interface::message::ReflowGoal; @@ -441,12 +442,14 @@ impl HTMLIFrameElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLIFrameElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLIFrameElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 1c898d1dc98..1598dbd7e2d 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -58,6 +58,7 @@ use ipc_channel::ipc; use ipc_channel::ipc::IpcSender; use ipc_channel::router::ROUTER; use js::jsapi::JSAutoRealm; +use js::rust::HandleObject; use mime::{self, Mime}; use msg::constellation_msg::PipelineId; use net_traits::image::base::{Image, ImageMetadata}; @@ -1246,17 +1247,20 @@ impl HTMLImageElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLImageElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLImageElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } pub fn Image( window: &Window, + proto: Option<HandleObject>, width: Option<u32>, height: Option<u32>, ) -> Fallible<DomRoot<HTMLImageElement>> { @@ -1266,6 +1270,7 @@ impl HTMLImageElement { &window.Document(), ElementCreator::ScriptCreated, CustomElementCreationMode::Synchronous, + proto, ); let image = DomRoot::downcast::<HTMLImageElement>(element).unwrap(); diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index e81e07e9643..046f90dbad8 100755 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -330,12 +330,14 @@ impl HTMLInputElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLInputElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLInputElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } diff --git a/components/script/dom/htmllabelelement.rs b/components/script/dom/htmllabelelement.rs index 970f4a97b7a..e42bc8b508d 100644 --- a/components/script/dom/htmllabelelement.rs +++ b/components/script/dom/htmllabelelement.rs @@ -22,6 +22,7 @@ use crate::dom::node::{Node, ShadowIncluding}; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use style::attr::AttrValue; #[dom_struct] @@ -45,12 +46,14 @@ impl HTMLLabelElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLLabelElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLLabelElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmllegendelement.rs b/components/script/dom/htmllegendelement.rs index bfb0f0701c8..32fa5e88808 100644 --- a/components/script/dom/htmllegendelement.rs +++ b/components/script/dom/htmllegendelement.rs @@ -15,6 +15,7 @@ use crate::dom::node::{BindContext, Node, UnbindContext}; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLLegendElement { @@ -39,12 +40,14 @@ impl HTMLLegendElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLLegendElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLLegendElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmllielement.rs b/components/script/dom/htmllielement.rs index 2697f6643e8..e2e2248272d 100644 --- a/components/script/dom/htmllielement.rs +++ b/components/script/dom/htmllielement.rs @@ -12,6 +12,7 @@ use crate::dom::node::Node; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use style::attr::AttrValue; #[dom_struct] @@ -35,10 +36,12 @@ impl HTMLLIElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLLIElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLLIElement::new_inherited(local_name, prefix, document)), document, + proto, ) } } diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs index 30a45471203..5b8ed9e2250 100644 --- a/components/script/dom/htmllinkelement.rs +++ b/components/script/dom/htmllinkelement.rs @@ -29,6 +29,7 @@ use cssparser::{Parser as CssParser, ParserInput}; use dom_struct::dom_struct; use embedder_traits::EmbedderMsg; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use net_traits::ReferrerPolicy; use servo_arc::Arc; use servo_atoms::Atom; @@ -94,13 +95,15 @@ impl HTMLLinkElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, creator: ElementCreator, ) -> DomRoot<HTMLLinkElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLLinkElement::new_inherited( local_name, prefix, document, creator, )), document, + proto, ) } diff --git a/components/script/dom/htmlmapelement.rs b/components/script/dom/htmlmapelement.rs index d3024bb6e95..3e1b19be48a 100644 --- a/components/script/dom/htmlmapelement.rs +++ b/components/script/dom/htmlmapelement.rs @@ -10,6 +10,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::{Node, ShadowIncluding}; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLMapElement { @@ -32,10 +33,12 @@ impl HTMLMapElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLMapElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLMapElement::new_inherited(local_name, prefix, document)), document, + proto, ) } diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 5eb9f709838..2d404cf2d49 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -1865,6 +1865,7 @@ impl HTMLMediaElement { local_name!("script"), None, &document, + None, ElementCreator::ScriptCreated, ); let mut media_controls_script = resources::read_string(EmbedderResource::MediaControlsJS); @@ -1892,6 +1893,7 @@ impl HTMLMediaElement { local_name!("script"), None, &document, + None, ElementCreator::ScriptCreated, ); style diff --git a/components/script/dom/htmlmenuelement.rs b/components/script/dom/htmlmenuelement.rs index 43e0ff07ed9..9698a058fb1 100644 --- a/components/script/dom/htmlmenuelement.rs +++ b/components/script/dom/htmlmenuelement.rs @@ -9,6 +9,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLMenuElement { @@ -31,10 +32,12 @@ impl HTMLMenuElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLMenuElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLMenuElement::new_inherited(local_name, prefix, document)), document, + proto, ) } } diff --git a/components/script/dom/htmlmetaelement.rs b/components/script/dom/htmlmetaelement.rs index 168c29cdb0b..a6be8e1747b 100644 --- a/components/script/dom/htmlmetaelement.rs +++ b/components/script/dom/htmlmetaelement.rs @@ -21,6 +21,7 @@ use crate::dom::node::{ use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use servo_arc::Arc; use servo_config::pref; use std::sync::atomic::AtomicBool; @@ -54,10 +55,12 @@ impl HTMLMetaElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLMetaElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLMetaElement::new_inherited(local_name, prefix, document)), document, + proto, ) } diff --git a/components/script/dom/htmlmeterelement.rs b/components/script/dom/htmlmeterelement.rs index 01f3b0dc94c..42fb531614c 100644 --- a/components/script/dom/htmlmeterelement.rs +++ b/components/script/dom/htmlmeterelement.rs @@ -11,6 +11,7 @@ use crate::dom::node::Node; use crate::dom::nodelist::NodeList; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLMeterElement { @@ -35,12 +36,14 @@ impl HTMLMeterElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLMeterElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLMeterElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmlmodelement.rs b/components/script/dom/htmlmodelement.rs index d54156bbbc8..f271c0e25d1 100644 --- a/components/script/dom/htmlmodelement.rs +++ b/components/script/dom/htmlmodelement.rs @@ -8,6 +8,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLModElement { @@ -30,10 +31,12 @@ impl HTMLModElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLModElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLModElement::new_inherited(local_name, prefix, document)), document, + proto, ) } } diff --git a/components/script/dom/htmlobjectelement.rs b/components/script/dom/htmlobjectelement.rs index 928c593cec6..a6f78b6ec70 100755 --- a/components/script/dom/htmlobjectelement.rs +++ b/components/script/dom/htmlobjectelement.rs @@ -18,6 +18,7 @@ use crate::dom::validitystate::ValidityState; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use net_traits::image::base::Image; use servo_arc::Arc; use std::default::Default; @@ -50,12 +51,14 @@ impl HTMLObjectElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLObjectElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLObjectElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmlolistelement.rs b/components/script/dom/htmlolistelement.rs index 456625d6447..05f8bb69bba 100644 --- a/components/script/dom/htmlolistelement.rs +++ b/components/script/dom/htmlolistelement.rs @@ -8,6 +8,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLOListElement { @@ -30,12 +31,14 @@ impl HTMLOListElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLOListElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLOListElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmloptgroupelement.rs b/components/script/dom/htmloptgroupelement.rs index 4ee3263c9ac..03e379055f6 100644 --- a/components/script/dom/htmloptgroupelement.rs +++ b/components/script/dom/htmloptgroupelement.rs @@ -14,6 +14,7 @@ use crate::dom::node::Node; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use style::element_state::ElementState; #[dom_struct] @@ -42,12 +43,14 @@ impl HTMLOptGroupElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLOptGroupElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLOptGroupElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmloptionelement.rs b/components/script/dom/htmloptionelement.rs index 0ba7eadcf11..8e22d8edbaf 100644 --- a/components/script/dom/htmloptionelement.rs +++ b/components/script/dom/htmloptionelement.rs @@ -26,6 +26,7 @@ use crate::dom::virtualmethods::VirtualMethods; use crate::dom::window::Window; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix, QualName}; +use js::rust::HandleObject; use std::cell::Cell; use std::convert::TryInto; use style::element_state::ElementState; @@ -65,12 +66,14 @@ impl HTMLOptionElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLOptionElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLOptionElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } @@ -78,6 +81,7 @@ impl HTMLOptionElement { #[allow(non_snake_case)] pub fn Option( window: &Window, + proto: Option<HandleObject>, text: DOMString, value: Option<DOMString>, default_selected: bool, @@ -89,6 +93,7 @@ impl HTMLOptionElement { &window.Document(), ElementCreator::ScriptCreated, CustomElementCreationMode::Synchronous, + proto, ); let option = DomRoot::downcast::<HTMLOptionElement>(element).unwrap(); diff --git a/components/script/dom/htmloptionscollection.rs b/components/script/dom/htmloptionscollection.rs index 2a79c83d55e..a4b47a2b49b 100644 --- a/components/script/dom/htmloptionscollection.rs +++ b/components/script/dom/htmloptionscollection.rs @@ -54,7 +54,7 @@ impl HTMLOptionsCollection { let document = document_from_node(&*root); for _ in 0..count { - let element = HTMLOptionElement::new(local_name!("option"), None, &document); + let element = HTMLOptionElement::new(local_name!("option"), None, &document, None); let node = element.upcast::<Node>(); root.AppendChild(node)?; } diff --git a/components/script/dom/htmloutputelement.rs b/components/script/dom/htmloutputelement.rs index e20dbcc29b2..533fc953d5c 100644 --- a/components/script/dom/htmloutputelement.rs +++ b/components/script/dom/htmloutputelement.rs @@ -19,6 +19,7 @@ use crate::dom::validitystate::ValidityState; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLOutputElement { @@ -49,12 +50,14 @@ impl HTMLOutputElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLOutputElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLOutputElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } diff --git a/components/script/dom/htmlparagraphelement.rs b/components/script/dom/htmlparagraphelement.rs index 101f7058138..82defe4113b 100644 --- a/components/script/dom/htmlparagraphelement.rs +++ b/components/script/dom/htmlparagraphelement.rs @@ -8,6 +8,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLParagraphElement { @@ -30,12 +31,14 @@ impl HTMLParagraphElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLParagraphElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLParagraphElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmlparamelement.rs b/components/script/dom/htmlparamelement.rs index fd1a139a84d..a2b30e7ecd1 100644 --- a/components/script/dom/htmlparamelement.rs +++ b/components/script/dom/htmlparamelement.rs @@ -8,6 +8,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLParamElement { @@ -30,12 +31,14 @@ impl HTMLParamElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLParamElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLParamElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmlpictureelement.rs b/components/script/dom/htmlpictureelement.rs index 726f7afd5f8..62de53ef704 100644 --- a/components/script/dom/htmlpictureelement.rs +++ b/components/script/dom/htmlpictureelement.rs @@ -8,6 +8,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLPictureElement { @@ -30,12 +31,14 @@ impl HTMLPictureElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLPictureElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLPictureElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmlpreelement.rs b/components/script/dom/htmlpreelement.rs index 36e2706e168..0243be8d4ae 100644 --- a/components/script/dom/htmlpreelement.rs +++ b/components/script/dom/htmlpreelement.rs @@ -8,6 +8,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLPreElement { @@ -30,10 +31,12 @@ impl HTMLPreElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLPreElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLPreElement::new_inherited(local_name, prefix, document)), document, + proto, ) } } diff --git a/components/script/dom/htmlprogresselement.rs b/components/script/dom/htmlprogresselement.rs index 718d1999256..917ed3f592e 100644 --- a/components/script/dom/htmlprogresselement.rs +++ b/components/script/dom/htmlprogresselement.rs @@ -13,6 +13,7 @@ use crate::dom::node::Node; use crate::dom::nodelist::NodeList; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLProgressElement { @@ -37,12 +38,14 @@ impl HTMLProgressElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLProgressElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLProgressElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmlquoteelement.rs b/components/script/dom/htmlquoteelement.rs index 4ad38f78338..f6f42dc4231 100644 --- a/components/script/dom/htmlquoteelement.rs +++ b/components/script/dom/htmlquoteelement.rs @@ -8,6 +8,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLQuoteElement { @@ -30,12 +31,14 @@ impl HTMLQuoteElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLQuoteElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLQuoteElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 1a0afeb1c84..9fe67db44a0 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -46,6 +46,7 @@ use js::jsapi::{CanCompileOffThread, CompileToStencilOffThread1, OffThreadToken} use js::jsval::UndefinedValue; use js::rust::{ transform_str_to_source_text, CompileOptionsWrapper, FinishOffThreadStencil, Stencil, + HandleObject, }; use msg::constellation_msg::PipelineId; use net_traits::request::{ @@ -194,13 +195,15 @@ impl HTMLScriptElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, creator: ElementCreator, ) -> DomRoot<HTMLScriptElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLScriptElement::new_inherited( local_name, prefix, document, creator, )), document, + proto, ) } diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 9d36413e4b5..00bd8b76f91 100755 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -31,6 +31,7 @@ use crate::dom::validitystate::{ValidationFlags, ValidityState}; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use std::default::Default; use std::iter; use style::attr::AttrValue; @@ -92,12 +93,14 @@ impl HTMLSelectElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLSelectElement> { - let n = Node::reflect_node( + let n = Node::reflect_node_with_proto( Box::new(HTMLSelectElement::new_inherited( local_name, prefix, document, )), document, + proto, ); n.upcast::<Node>().set_weird_parser_insertion_mode(); diff --git a/components/script/dom/htmlsourceelement.rs b/components/script/dom/htmlsourceelement.rs index 5b581e466b5..e8b542c7a4c 100644 --- a/components/script/dom/htmlsourceelement.rs +++ b/components/script/dom/htmlsourceelement.rs @@ -18,6 +18,7 @@ use crate::dom::node::{BindContext, Node, UnbindContext}; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLSourceElement { @@ -40,12 +41,14 @@ impl HTMLSourceElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLSourceElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLSourceElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } diff --git a/components/script/dom/htmlspanelement.rs b/components/script/dom/htmlspanelement.rs index e8a374f5f9b..ac9a711d716 100644 --- a/components/script/dom/htmlspanelement.rs +++ b/components/script/dom/htmlspanelement.rs @@ -8,6 +8,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLSpanElement { @@ -30,10 +31,12 @@ impl HTMLSpanElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLSpanElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLSpanElement::new_inherited(local_name, prefix, document)), document, + proto, ) } } diff --git a/components/script/dom/htmlstyleelement.rs b/components/script/dom/htmlstyleelement.rs index 83d35fc78c8..6dd0ee24ab4 100644 --- a/components/script/dom/htmlstyleelement.rs +++ b/components/script/dom/htmlstyleelement.rs @@ -21,6 +21,7 @@ use crate::stylesheet_loader::{StylesheetLoader, StylesheetOwner}; use cssparser::{Parser as CssParser, ParserInput}; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use net_traits::ReferrerPolicy; use servo_arc::Arc; use std::cell::Cell; @@ -67,13 +68,15 @@ impl HTMLStyleElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, creator: ElementCreator, ) -> DomRoot<HTMLStyleElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLStyleElement::new_inherited( local_name, prefix, document, creator, )), document, + proto, ) } diff --git a/components/script/dom/htmltablecaptionelement.rs b/components/script/dom/htmltablecaptionelement.rs index b89b647691e..c7c91ae359e 100644 --- a/components/script/dom/htmltablecaptionelement.rs +++ b/components/script/dom/htmltablecaptionelement.rs @@ -9,6 +9,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLTableCaptionElement { @@ -31,12 +32,14 @@ impl HTMLTableCaptionElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLTableCaptionElement> { - let n = Node::reflect_node( + let n = Node::reflect_node_with_proto( Box::new(HTMLTableCaptionElement::new_inherited( local_name, prefix, document, )), document, + proto, ); n.upcast::<Node>().set_weird_parser_insertion_mode(); diff --git a/components/script/dom/htmltablecellelement.rs b/components/script/dom/htmltablecellelement.rs index 75a2140a090..68daaa76614 100644 --- a/components/script/dom/htmltablecellelement.rs +++ b/components/script/dom/htmltablecellelement.rs @@ -17,6 +17,7 @@ use crate::dom::virtualmethods::VirtualMethods; use cssparser::RGBA; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use style::attr::{AttrValue, LengthOrPercentageOrAuto}; use style::context::QuirksMode; @@ -44,12 +45,14 @@ impl HTMLTableCellElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLTableCellElement> { - let n = Node::reflect_node( + let n = Node::reflect_node_with_proto( Box::new(HTMLTableCellElement::new_inherited( local_name, prefix, document, )), document, + proto, ); n.upcast::<Node>().set_weird_parser_insertion_mode(); diff --git a/components/script/dom/htmltablecolelement.rs b/components/script/dom/htmltablecolelement.rs index 86382e1c2cb..2700defb19a 100644 --- a/components/script/dom/htmltablecolelement.rs +++ b/components/script/dom/htmltablecolelement.rs @@ -9,6 +9,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLTableColElement { @@ -31,12 +32,14 @@ impl HTMLTableColElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLTableColElement> { - let n = Node::reflect_node( + let n = Node::reflect_node_with_proto( Box::new(HTMLTableColElement::new_inherited( local_name, prefix, document, )), document, + proto, ); n.upcast::<Node>().set_weird_parser_insertion_mode(); diff --git a/components/script/dom/htmltableelement.rs b/components/script/dom/htmltableelement.rs index 2fa44f3ad37..d807d14890c 100644 --- a/components/script/dom/htmltableelement.rs +++ b/components/script/dom/htmltableelement.rs @@ -23,6 +23,7 @@ use crate::dom::virtualmethods::VirtualMethods; use cssparser::RGBA; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use std::cell::Cell; use style::attr::{parse_unsigned_integer, AttrValue, LengthOrPercentageOrAuto}; @@ -69,12 +70,14 @@ impl HTMLTableElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLTableElement> { - let n = Node::reflect_node( + let n = Node::reflect_node_with_proto( Box::new(HTMLTableElement::new_inherited( local_name, prefix, document, )), document, + proto, ); n.upcast::<Node>().set_weird_parser_insertion_mode(); @@ -135,7 +138,7 @@ impl HTMLTableElement { return section; } - let section = HTMLTableSectionElement::new(atom.clone(), None, &document_from_node(self)); + let section = HTMLTableSectionElement::new(atom.clone(), None, &document_from_node(self), None); match atom { &local_name!("thead") => self.SetTHead(Some(§ion)), &local_name!("tfoot") => self.SetTFoot(Some(§ion)), @@ -205,6 +208,7 @@ impl HTMLTableElementMethods for HTMLTableElement { local_name!("caption"), None, &document_from_node(self), + None, ); self.SetCaption(Some(&caption)); caption @@ -296,7 +300,7 @@ impl HTMLTableElementMethods for HTMLTableElement { // https://html.spec.whatwg.org/multipage/#dom-table-createtbody fn CreateTBody(&self) -> DomRoot<HTMLTableSectionElement> { let tbody = - HTMLTableSectionElement::new(local_name!("tbody"), None, &document_from_node(self)); + HTMLTableSectionElement::new(local_name!("tbody"), None, &document_from_node(self), None); let node = self.upcast::<Node>(); let last_tbody = node .rev_children() @@ -318,7 +322,7 @@ impl HTMLTableElementMethods for HTMLTableElement { return Err(Error::IndexSize); } - let new_row = HTMLTableRowElement::new(local_name!("tr"), None, &document_from_node(self)); + let new_row = HTMLTableRowElement::new(local_name!("tr"), None, &document_from_node(self), None); let node = self.upcast::<Node>(); if number_of_row_elements == 0 { diff --git a/components/script/dom/htmltablerowelement.rs b/components/script/dom/htmltablerowelement.rs index 5da05be4019..6e8eb34899e 100644 --- a/components/script/dom/htmltablerowelement.rs +++ b/components/script/dom/htmltablerowelement.rs @@ -22,6 +22,7 @@ use crate::dom::virtualmethods::VirtualMethods; use cssparser::RGBA; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use style::attr::AttrValue; #[derive(JSTraceable)] @@ -56,12 +57,14 @@ impl HTMLTableRowElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLTableRowElement> { - let n = Node::reflect_node( + let n = Node::reflect_node_with_proto( Box::new(HTMLTableRowElement::new_inherited( local_name, prefix, document, )), document, + proto, ); n.upcast::<Node>().set_weird_parser_insertion_mode(); @@ -100,7 +103,7 @@ impl HTMLTableRowElementMethods for HTMLTableRowElement { node.insert_cell_or_row( index, || self.Cells(), - || HTMLTableCellElement::new(local_name!("td"), None, &node.owner_doc()), + || HTMLTableCellElement::new(local_name!("td"), None, &node.owner_doc(), None), ) } diff --git a/components/script/dom/htmltablesectionelement.rs b/components/script/dom/htmltablesectionelement.rs index 5787546f2be..03cddf7bdd4 100644 --- a/components/script/dom/htmltablesectionelement.rs +++ b/components/script/dom/htmltablesectionelement.rs @@ -18,6 +18,7 @@ use crate::dom::virtualmethods::VirtualMethods; use cssparser::RGBA; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use style::attr::AttrValue; #[dom_struct] @@ -41,12 +42,14 @@ impl HTMLTableSectionElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLTableSectionElement> { - let n = Node::reflect_node( + let n = Node::reflect_node_with_proto( Box::new(HTMLTableSectionElement::new_inherited( local_name, prefix, document, )), document, + proto, ); n.upcast::<Node>().set_weird_parser_insertion_mode(); @@ -75,7 +78,7 @@ impl HTMLTableSectionElementMethods for HTMLTableSectionElement { node.insert_cell_or_row( index, || self.Rows(), - || HTMLTableRowElement::new(local_name!("tr"), None, &node.owner_doc()), + || HTMLTableRowElement::new(local_name!("tr"), None, &node.owner_doc(), None), ) } diff --git a/components/script/dom/htmltemplateelement.rs b/components/script/dom/htmltemplateelement.rs index 673f6e0c98a..1a542171ef0 100644 --- a/components/script/dom/htmltemplateelement.rs +++ b/components/script/dom/htmltemplateelement.rs @@ -14,6 +14,7 @@ use crate::dom::node::{document_from_node, CloneChildrenFlag, Node}; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLTemplateElement { @@ -40,12 +41,14 @@ impl HTMLTemplateElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLTemplateElement> { - let n = Node::reflect_node( + let n = Node::reflect_node_with_proto( Box::new(HTMLTemplateElement::new_inherited( local_name, prefix, document, )), document, + proto, ); n.upcast::<Node>().set_weird_parser_insertion_mode(); diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index aee9c1eadff..f3656664239 100755 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -37,6 +37,7 @@ use crate::textinput::{ }; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use script_traits::ScriptToConstellationChan; use std::cell::Cell; use std::default::Default; @@ -174,12 +175,14 @@ impl HTMLTextAreaElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLTextAreaElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLTextAreaElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } diff --git a/components/script/dom/htmltimeelement.rs b/components/script/dom/htmltimeelement.rs index 2b0974dd76c..712983f8460 100644 --- a/components/script/dom/htmltimeelement.rs +++ b/components/script/dom/htmltimeelement.rs @@ -10,6 +10,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLTimeElement { @@ -32,10 +33,12 @@ impl HTMLTimeElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLTimeElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLTimeElement::new_inherited(local_name, prefix, document)), document, + proto, ) } } diff --git a/components/script/dom/htmltitleelement.rs b/components/script/dom/htmltitleelement.rs index 7fce947e626..464bbaab2e0 100644 --- a/components/script/dom/htmltitleelement.rs +++ b/components/script/dom/htmltitleelement.rs @@ -13,6 +13,7 @@ use crate::dom::node::{BindContext, ChildrenMutation, Node}; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLTitleElement { @@ -35,12 +36,14 @@ impl HTMLTitleElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLTitleElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLTitleElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmltrackelement.rs b/components/script/dom/htmltrackelement.rs index c068bd88295..05ceed14f1e 100644 --- a/components/script/dom/htmltrackelement.rs +++ b/components/script/dom/htmltrackelement.rs @@ -15,6 +15,7 @@ use crate::dom::node::Node; use crate::dom::texttrack::TextTrack; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[derive(Clone, Copy, JSTraceable, MallocSizeOf, PartialEq)] #[repr(u16)] @@ -51,6 +52,7 @@ impl HTMLTrackElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLTrackElement> { let track = TextTrack::new( &document.window(), @@ -61,11 +63,12 @@ impl HTMLTrackElement { Default::default(), None, ); - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLTrackElement::new_inherited( local_name, prefix, document, &track, )), document, + proto, ) } } diff --git a/components/script/dom/htmlulistelement.rs b/components/script/dom/htmlulistelement.rs index aab11124365..73704e70418 100644 --- a/components/script/dom/htmlulistelement.rs +++ b/components/script/dom/htmlulistelement.rs @@ -8,6 +8,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLUListElement { @@ -30,12 +31,14 @@ impl HTMLUListElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLUListElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLUListElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmlunknownelement.rs b/components/script/dom/htmlunknownelement.rs index 27fa932e936..c59b4d81e8c 100644 --- a/components/script/dom/htmlunknownelement.rs +++ b/components/script/dom/htmlunknownelement.rs @@ -8,6 +8,7 @@ use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; #[dom_struct] pub struct HTMLUnknownElement { @@ -30,12 +31,14 @@ impl HTMLUnknownElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLUnknownElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLUnknownElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } } diff --git a/components/script/dom/htmlvideoelement.rs b/components/script/dom/htmlvideoelement.rs index eb1b35ee07a..4a288607be7 100644 --- a/components/script/dom/htmlvideoelement.rs +++ b/components/script/dom/htmlvideoelement.rs @@ -26,6 +26,7 @@ use euclid::default::Size2D; use html5ever::{LocalName, Prefix}; use ipc_channel::ipc; use ipc_channel::router::ROUTER; +use js::rust::HandleObject; use net_traits::image_cache::{ ImageCache, ImageCacheResult, ImageOrMetadataAvailable, ImageResponse, PendingImageId, UsePlaceholder, @@ -84,12 +85,14 @@ impl HTMLVideoElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<HTMLVideoElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(HTMLVideoElement::new_inherited( local_name, prefix, document, )), document, + proto, ) } diff --git a/components/script/dom/imagedata.rs b/components/script/dom/imagedata.rs index 43df0951492..42638f40351 100644 --- a/components/script/dom/imagedata.rs +++ b/components/script/dom/imagedata.rs @@ -4,7 +4,7 @@ use crate::dom::bindings::codegen::Bindings::ImageDataBinding::ImageDataMethods; use crate::dom::bindings::error::{Error, Fallible}; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::globalscope::GlobalScope; use crate::script_runtime::JSContext; @@ -12,7 +12,7 @@ use dom_struct::dom_struct; use euclid::default::{Rect, Size2D}; use ipc_channel::ipc::IpcSharedMemory; use js::jsapi::{Heap, JSObject}; -use js::rust::Runtime; +use js::rust::{HandleObject, Runtime}; use js::typedarray::{CreateWith, Uint8ClampedArray}; use std::borrow::Cow; use std::default::Default; @@ -45,9 +45,9 @@ impl ImageData { d.resize(len as usize, 0); let data = CreateWith::Slice(&d[..]); Uint8ClampedArray::create(*cx, data, js_object.handle_mut()).unwrap(); - Self::new_with_jsobject(global, width, Some(height), js_object.get()) + Self::new_with_jsobject(global, None, width, Some(height), js_object.get()) } else { - Self::new_without_jsobject(global, width, height) + Self::new_without_jsobject(global, None, width, height) } } } @@ -55,6 +55,7 @@ impl ImageData { #[allow(unsafe_code)] unsafe fn new_with_jsobject( global: &GlobalScope, + proto: Option<HandleObject>, width: u32, opt_height: Option<u32>, jsobject: *mut JSObject, @@ -90,12 +91,13 @@ impl ImageData { (*imagedata).data.set(jsobject); - Ok(reflect_dom_object(imagedata, global)) + Ok(reflect_dom_object2(imagedata, global, proto)) } #[allow(unsafe_code)] unsafe fn new_without_jsobject( global: &GlobalScope, + proto: Option<HandleObject>, width: u32, height: u32, ) -> Fallible<DomRoot<ImageData>> { @@ -117,12 +119,12 @@ impl ImageData { .unwrap(); (*imagedata).data.set(array.get()); - Ok(reflect_dom_object(imagedata, global)) + Ok(reflect_dom_object2(imagedata, global, proto)) } // https://html.spec.whatwg.org/multipage/#pixel-manipulation:dom-imagedata-3 #[allow(unsafe_code, non_snake_case)] - pub fn Constructor(global: &GlobalScope, width: u32, height: u32) -> Fallible<DomRoot<Self>> { - unsafe { Self::new_without_jsobject(global, width, height) } + pub fn Constructor(global: &GlobalScope, proto: Option<HandleObject>, width: u32, height: u32) -> Fallible<DomRoot<Self>> { + unsafe { Self::new_without_jsobject(global, proto, width, height) } } // https://html.spec.whatwg.org/multipage/#pixel-manipulation:dom-imagedata-4 @@ -130,11 +132,12 @@ impl ImageData { pub unsafe fn Constructor_( cx: JSContext, global: &GlobalScope, + proto: Option<HandleObject>, jsobject: *mut JSObject, width: u32, opt_height: Option<u32>, ) -> Fallible<DomRoot<Self>> { - Self::new_with_jsobject(global, width, opt_height, jsobject) + Self::new_with_jsobject(global, proto, width, opt_height, jsobject) } /// Nothing must change the array on the JS side while the slice is live. diff --git a/components/script/dom/inputevent.rs b/components/script/dom/inputevent.rs index 33a4ed3bbdb..2c1ee15cbae 100644 --- a/components/script/dom/inputevent.rs +++ b/components/script/dom/inputevent.rs @@ -5,12 +5,13 @@ use crate::dom::bindings::codegen::Bindings::InputEventBinding::{self, InputEventMethods}; use crate::dom::bindings::codegen::Bindings::UIEventBinding::UIEventBinding::UIEventMethods; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::uievent::UIEvent; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; #[dom_struct] pub struct InputEvent { @@ -20,8 +21,9 @@ pub struct InputEvent { } impl InputEvent { - pub fn new( + fn new( window: &Window, + proto: Option<HandleObject>, type_: DOMString, can_bubble: bool, cancelable: bool, @@ -30,13 +32,14 @@ impl InputEvent { data: Option<DOMString>, is_composing: bool, ) -> DomRoot<InputEvent> { - let ev = reflect_dom_object( + let ev = reflect_dom_object2( Box::new(InputEvent { uievent: UIEvent::new_inherited(), data: data, is_composing: is_composing, }), window, + proto, ); ev.uievent .InitUIEvent(type_, can_bubble, cancelable, view, detail); @@ -46,11 +49,13 @@ impl InputEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &InputEventBinding::InputEventInit, ) -> Fallible<DomRoot<InputEvent>> { let event = InputEvent::new( window, + proto, type_, init.parent.parent.bubbles, init.parent.parent.cancelable, diff --git a/components/script/dom/keyboardevent.rs b/components/script/dom/keyboardevent.rs index 12668a6c214..a3dd23bfb21 100644 --- a/components/script/dom/keyboardevent.rs +++ b/components/script/dom/keyboardevent.rs @@ -8,7 +8,7 @@ use crate::dom::bindings::codegen::Bindings::KeyboardEventBinding::KeyboardEvent use crate::dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::event::Event; @@ -16,6 +16,7 @@ use crate::dom::uievent::UIEvent; use crate::dom::window::Window; use dom_struct::dom_struct; use keyboard_types::{Key, Modifiers}; +use js::rust::HandleObject; use std::cell::Cell; unsafe_no_jsmanaged_fields!(Key); @@ -52,7 +53,11 @@ impl KeyboardEvent { } pub fn new_uninitialized(window: &Window) -> DomRoot<KeyboardEvent> { - reflect_dom_object(Box::new(KeyboardEvent::new_inherited()), window) + Self::new_uninitialized_with_proto(window, None) + } + + fn new_uninitialized_with_proto(window: &Window, proto: Option<HandleObject>) -> DomRoot<KeyboardEvent> { + reflect_dom_object2(Box::new(KeyboardEvent::new_inherited()), window, proto) } pub fn new( @@ -61,6 +66,42 @@ impl KeyboardEvent { can_bubble: bool, cancelable: bool, view: Option<&Window>, + detail: i32, + key: Key, + code: DOMString, + location: u32, + repeat: bool, + is_composing: bool, + modifiers: Modifiers, + char_code: u32, + key_code: u32, + ) -> DomRoot<KeyboardEvent> { + Self::new_with_proto( + window, + None, + type_, + can_bubble, + cancelable, + view, + detail, + key, + code, + location, + repeat, + is_composing, + modifiers, + char_code, + key_code, + ) + } + + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + type_: DOMString, + can_bubble: bool, + cancelable: bool, + view: Option<&Window>, _detail: i32, key: Key, code: DOMString, @@ -71,7 +112,7 @@ impl KeyboardEvent { char_code: u32, key_code: u32, ) -> DomRoot<KeyboardEvent> { - let ev = KeyboardEvent::new_uninitialized(window); + let ev = KeyboardEvent::new_uninitialized_with_proto(window, proto); ev.InitKeyboardEvent( type_, can_bubble, @@ -95,6 +136,7 @@ impl KeyboardEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &KeyboardEventBinding::KeyboardEventInit, ) -> Fallible<DomRoot<KeyboardEvent>> { @@ -103,8 +145,9 @@ impl KeyboardEvent { modifiers.set(Modifiers::ALT, init.parent.altKey); modifiers.set(Modifiers::SHIFT, init.parent.shiftKey); modifiers.set(Modifiers::META, init.parent.metaKey); - let event = KeyboardEvent::new( + let event = KeyboardEvent::new_with_proto( window, + proto, type_, init.parent.parent.parent.bubbles, init.parent.parent.parent.cancelable, diff --git a/components/script/dom/mediaelementaudiosourcenode.rs b/components/script/dom/mediaelementaudiosourcenode.rs index 29737fc3bc0..98f43a063be 100644 --- a/components/script/dom/mediaelementaudiosourcenode.rs +++ b/components/script/dom/mediaelementaudiosourcenode.rs @@ -7,11 +7,12 @@ use crate::dom::audionode::AudioNode; use crate::dom::bindings::codegen::Bindings::MediaElementAudioSourceNodeBinding::MediaElementAudioSourceNodeMethods; use crate::dom::bindings::codegen::Bindings::MediaElementAudioSourceNodeBinding::MediaElementAudioSourceOptions; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::htmlmediaelement::HTMLMediaElement; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_media::audio::media_element_source_node::MediaElementSourceNodeMessage; use servo_media::audio::node::{AudioNodeInit, AudioNodeMessage}; use std::sync::mpsc; @@ -48,23 +49,33 @@ impl MediaElementAudioSourceNode { }) } - #[allow(unrooted_must_root)] pub fn new( window: &Window, context: &AudioContext, media_element: &HTMLMediaElement, ) -> Fallible<DomRoot<MediaElementAudioSourceNode>> { + Self::new_with_proto(window, None, context, media_element) + } + + #[allow(unrooted_must_root)] + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + context: &AudioContext, + media_element: &HTMLMediaElement, + ) -> Fallible<DomRoot<MediaElementAudioSourceNode>> { let node = MediaElementAudioSourceNode::new_inherited(context, media_element)?; - Ok(reflect_dom_object(Box::new(node), window)) + Ok(reflect_dom_object2(Box::new(node), window, proto)) } #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, context: &AudioContext, options: &MediaElementAudioSourceOptions, ) -> Fallible<DomRoot<MediaElementAudioSourceNode>> { - MediaElementAudioSourceNode::new(window, context, &*options.mediaElement) + MediaElementAudioSourceNode::new_with_proto(window, proto, context, &*options.mediaElement) } } diff --git a/components/script/dom/mediametadata.rs b/components/script/dom/mediametadata.rs index 3abe0a1a20c..24f9a31120c 100644 --- a/components/script/dom/mediametadata.rs +++ b/components/script/dom/mediametadata.rs @@ -6,12 +6,13 @@ use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::MediaMetadataBinding::MediaMetadataInit; use crate::dom::bindings::codegen::Bindings::MediaMetadataBinding::MediaMetadataMethods; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, Reflector}; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::str::DOMString; use crate::dom::mediasession::MediaSession; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; #[dom_struct] pub struct MediaMetadata { @@ -34,16 +35,21 @@ impl MediaMetadata { } pub fn new(global: &Window, init: &MediaMetadataInit) -> DomRoot<MediaMetadata> { - reflect_dom_object(Box::new(MediaMetadata::new_inherited(init)), global) + Self::new_with_proto(global, None, init) + } + + fn new_with_proto(global: &Window, proto: Option<HandleObject>, init: &MediaMetadataInit) -> DomRoot<MediaMetadata> { + reflect_dom_object2(Box::new(MediaMetadata::new_inherited(init)), global, proto) } /// https://w3c.github.io/mediasession/#dom-mediametadata-mediametadata #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, init: &MediaMetadataInit, ) -> Fallible<DomRoot<MediaMetadata>> { - Ok(MediaMetadata::new(window, init)) + Ok(MediaMetadata::new_with_proto(window, proto, init)) } fn queue_update_metadata_algorithm(&self) { diff --git a/components/script/dom/mediaquerylistevent.rs b/components/script/dom/mediaquerylistevent.rs index c34c3d5116f..fdeedc93052 100644 --- a/components/script/dom/mediaquerylistevent.rs +++ b/components/script/dom/mediaquerylistevent.rs @@ -7,13 +7,14 @@ use crate::dom::bindings::codegen::Bindings::MediaQueryListEventBinding::MediaQu use crate::dom::bindings::codegen::Bindings::MediaQueryListEventBinding::MediaQueryListEventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::event::Event; use crate::dom::globalscope::GlobalScope; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; use std::cell::Cell; @@ -26,8 +27,9 @@ pub struct MediaQueryListEvent { } impl MediaQueryListEvent { - pub fn new_initialized( + fn new_initialized( global: &GlobalScope, + proto: Option<HandleObject>, media: DOMString, matches: bool, ) -> DomRoot<MediaQueryListEvent> { @@ -36,7 +38,7 @@ impl MediaQueryListEvent { media: media, matches: Cell::new(matches), }); - reflect_dom_object(ev, global) + reflect_dom_object2(ev, global, proto) } pub fn new( @@ -47,7 +49,19 @@ impl MediaQueryListEvent { media: DOMString, matches: bool, ) -> DomRoot<MediaQueryListEvent> { - let ev = MediaQueryListEvent::new_initialized(global, media, matches); + Self::new_with_proto(global, None, type_, bubbles, cancelable, media, matches) + } + + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + type_: Atom, + bubbles: bool, + cancelable: bool, + media: DOMString, + matches: bool, + ) -> DomRoot<MediaQueryListEvent> { + let ev = MediaQueryListEvent::new_initialized(global, proto, media, matches); { let event = ev.upcast::<Event>(); event.init_event(type_, bubbles, cancelable); @@ -58,12 +72,14 @@ impl MediaQueryListEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &MediaQueryListEventInit, ) -> Fallible<DomRoot<MediaQueryListEvent>> { let global = window.upcast::<GlobalScope>(); - Ok(MediaQueryListEvent::new( + Ok(MediaQueryListEvent::new_with_proto( global, + proto, Atom::from(type_), init.parent.bubbles, init.parent.cancelable, diff --git a/components/script/dom/mediastream.rs b/components/script/dom/mediastream.rs index ff2c8f3a990..812552d3793 100644 --- a/components/script/dom/mediastream.rs +++ b/components/script/dom/mediastream.rs @@ -5,7 +5,7 @@ use crate::dom::bindings::cell::{DomRefCell, Ref}; use crate::dom::bindings::codegen::Bindings::MediaStreamBinding::MediaStreamMethods; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::eventtarget::EventTarget; @@ -13,6 +13,7 @@ use crate::dom::globalscope::GlobalScope; use crate::dom::mediastreamtrack::MediaStreamTrack; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_media::streams::registry::MediaStreamId; use servo_media::streams::MediaStreamType; @@ -32,7 +33,11 @@ impl MediaStream { } pub fn new(global: &GlobalScope) -> DomRoot<MediaStream> { - reflect_dom_object(Box::new(MediaStream::new_inherited()), global) + Self::new_with_proto(global, None) + } + + fn new_with_proto(global: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<MediaStream> { + reflect_dom_object2(Box::new(MediaStream::new_inherited()), global, proto) } pub fn new_single( @@ -46,19 +51,20 @@ impl MediaStream { this } - pub fn Constructor(global: &Window) -> Fallible<DomRoot<MediaStream>> { - Ok(MediaStream::new(&global.global())) + pub fn Constructor(global: &Window, proto: Option<HandleObject>) -> Fallible<DomRoot<MediaStream>> { + Ok(MediaStream::new_with_proto(&global.global(), proto)) } - pub fn Constructor_(_: &Window, stream: &MediaStream) -> Fallible<DomRoot<MediaStream>> { - Ok(stream.Clone()) + pub fn Constructor_(_: &Window, proto: Option<HandleObject>, stream: &MediaStream) -> Fallible<DomRoot<MediaStream>> { + Ok(stream.clone_with_proto(proto)) } pub fn Constructor__( global: &Window, + proto: Option<HandleObject>, tracks: Vec<DomRoot<MediaStreamTrack>>, ) -> Fallible<DomRoot<MediaStream>> { - let new = MediaStream::new(&global.global()); + let new = MediaStream::new_with_proto(&global.global(), proto); for track in tracks { // this is quadratic, but shouldn't matter much // if this becomes a problem we can use a hash map @@ -132,7 +138,13 @@ impl MediaStreamMethods for MediaStream { /// https://w3c.github.io/mediacapture-main/#dom-mediastream-clone fn Clone(&self) -> DomRoot<MediaStream> { - let new = MediaStream::new(&self.global()); + self.clone_with_proto(None) + } +} + +impl MediaStream { + fn clone_with_proto(&self, proto: Option<HandleObject>) -> DomRoot<MediaStream> { + let new = MediaStream::new_with_proto(&self.global(), proto); for track in &*self.tracks.borrow() { new.add_track(&track) } diff --git a/components/script/dom/mediastreamaudiodestinationnode.rs b/components/script/dom/mediastreamaudiodestinationnode.rs index d402f07b590..b42fb9d89f8 100644 --- a/components/script/dom/mediastreamaudiodestinationnode.rs +++ b/components/script/dom/mediastreamaudiodestinationnode.rs @@ -11,11 +11,12 @@ use crate::dom::bindings::codegen::Bindings::AudioNodeBinding::{ use crate::dom::bindings::codegen::Bindings::MediaStreamAudioDestinationNodeBinding::MediaStreamAudioDestinationNodeMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::mediastream::MediaStream; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_media::audio::node::AudioNodeInit; use servo_media::streams::MediaStreamType; use servo_media::ServoMedia; @@ -53,23 +54,33 @@ impl MediaStreamAudioDestinationNode { }) } - #[allow(unrooted_must_root)] pub fn new( window: &Window, context: &AudioContext, options: &AudioNodeOptions, ) -> Fallible<DomRoot<MediaStreamAudioDestinationNode>> { + Self::new_with_proto(window, None, context, options) + } + + #[allow(unrooted_must_root)] + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + context: &AudioContext, + options: &AudioNodeOptions, + ) -> Fallible<DomRoot<MediaStreamAudioDestinationNode>> { let node = MediaStreamAudioDestinationNode::new_inherited(context, options)?; - Ok(reflect_dom_object(Box::new(node), window)) + Ok(reflect_dom_object2(Box::new(node), window, proto)) } #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, context: &AudioContext, options: &AudioNodeOptions, ) -> Fallible<DomRoot<MediaStreamAudioDestinationNode>> { - MediaStreamAudioDestinationNode::new(window, context, options) + MediaStreamAudioDestinationNode::new_with_proto(window, proto, context, options) } } diff --git a/components/script/dom/mediastreamaudiosourcenode.rs b/components/script/dom/mediastreamaudiosourcenode.rs index f6925af75c3..4137b0c2896 100644 --- a/components/script/dom/mediastreamaudiosourcenode.rs +++ b/components/script/dom/mediastreamaudiosourcenode.rs @@ -9,11 +9,12 @@ use crate::dom::bindings::codegen::Bindings::MediaStreamAudioSourceNodeBinding:: }; use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::mediastream::MediaStream; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_media::audio::node::AudioNodeInit; use servo_media::streams::MediaStreamType; @@ -48,23 +49,33 @@ impl MediaStreamAudioSourceNode { }) } - #[allow(unrooted_must_root)] pub fn new( window: &Window, context: &AudioContext, stream: &MediaStream, ) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> { + Self::new_with_proto(window, None, context, stream) + } + + #[allow(unrooted_must_root)] + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + context: &AudioContext, + stream: &MediaStream, + ) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> { let node = MediaStreamAudioSourceNode::new_inherited(context, stream)?; - Ok(reflect_dom_object(Box::new(node), window)) + Ok(reflect_dom_object2(Box::new(node), window, proto)) } #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, context: &AudioContext, options: &MediaStreamAudioSourceOptions, ) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> { - MediaStreamAudioSourceNode::new(window, context, &options.mediaStream) + MediaStreamAudioSourceNode::new_with_proto(window, proto, context, &options.mediaStream) } } diff --git a/components/script/dom/mediastreamtrackaudiosourcenode.rs b/components/script/dom/mediastreamtrackaudiosourcenode.rs index 6399ee5f6a4..387ad20d741 100644 --- a/components/script/dom/mediastreamtrackaudiosourcenode.rs +++ b/components/script/dom/mediastreamtrackaudiosourcenode.rs @@ -7,11 +7,12 @@ use crate::dom::audionode::AudioNode; use crate::dom::bindings::codegen::Bindings::MediaStreamTrackAudioSourceNodeBinding::MediaStreamTrackAudioSourceOptions; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::mediastreamtrack::MediaStreamTrack; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_media::audio::node::AudioNodeInit; #[dom_struct] @@ -39,22 +40,32 @@ impl MediaStreamTrackAudioSourceNode { }) } - #[allow(unrooted_must_root)] pub fn new( window: &Window, context: &AudioContext, track: &MediaStreamTrack, ) -> Fallible<DomRoot<MediaStreamTrackAudioSourceNode>> { + Self::new_with_proto(window, None, context, track) + } + + #[allow(unrooted_must_root)] + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + context: &AudioContext, + track: &MediaStreamTrack, + ) -> Fallible<DomRoot<MediaStreamTrackAudioSourceNode>> { let node = MediaStreamTrackAudioSourceNode::new_inherited(context, track)?; - Ok(reflect_dom_object(Box::new(node), window)) + Ok(reflect_dom_object2(Box::new(node), window, proto)) } #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, context: &AudioContext, options: &MediaStreamTrackAudioSourceOptions, ) -> Fallible<DomRoot<MediaStreamTrackAudioSourceNode>> { - MediaStreamTrackAudioSourceNode::new(window, context, &options.mediaStreamTrack) + MediaStreamTrackAudioSourceNode::new_with_proto(window, proto, context, &options.mediaStreamTrack) } } diff --git a/components/script/dom/messagechannel.rs b/components/script/dom/messagechannel.rs index 3075dac3088..f3df61924a5 100644 --- a/components/script/dom/messagechannel.rs +++ b/components/script/dom/messagechannel.rs @@ -3,11 +3,12 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use crate::dom::bindings::codegen::Bindings::MessageChannelBinding::MessageChannelMethods; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::globalscope::GlobalScope; use crate::dom::messageport::MessagePort; use dom_struct::dom_struct; +use js::rust::HandleObject; #[dom_struct] pub struct MessageChannel { @@ -19,12 +20,12 @@ pub struct MessageChannel { impl MessageChannel { /// <https://html.spec.whatwg.org/multipage/#dom-messagechannel> #[allow(non_snake_case)] - pub fn Constructor(global: &GlobalScope) -> DomRoot<MessageChannel> { - MessageChannel::new(global) + pub fn Constructor(global: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<MessageChannel> { + MessageChannel::new(global, proto) } /// <https://html.spec.whatwg.org/multipage/#dom-messagechannel> - pub fn new(incumbent: &GlobalScope) -> DomRoot<MessageChannel> { + fn new(incumbent: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<MessageChannel> { // Step 1 let port1 = MessagePort::new(&incumbent); @@ -41,9 +42,10 @@ impl MessageChannel { ); // Steps 4-6 - reflect_dom_object( + reflect_dom_object2( Box::new(MessageChannel::new_inherited(&*port1, &*port2)), incumbent, + proto, ) } diff --git a/components/script/dom/messageevent.rs b/components/script/dom/messageevent.rs index c00e2bc5dec..9c2428912f8 100644 --- a/components/script/dom/messageevent.rs +++ b/components/script/dom/messageevent.rs @@ -9,7 +9,7 @@ use crate::dom::bindings::codegen::Bindings::MessageEventBinding::MessageEventMe use crate::dom::bindings::codegen::UnionTypes::WindowProxyOrMessagePortOrServiceWorker; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::bindings::trace::RootedTraceableBox; @@ -24,7 +24,7 @@ use crate::script_runtime::JSContext; use dom_struct::dom_struct; use js::jsapi::Heap; use js::jsval::JSVal; -use js::rust::HandleValue; +use js::rust::{HandleObject, HandleValue}; use servo_atoms::Atom; #[unrooted_must_root_lint::must_root] @@ -91,8 +91,13 @@ impl MessageEvent { } pub fn new_uninitialized(global: &GlobalScope) -> DomRoot<MessageEvent> { + Self::new_uninitialized_with_proto(global, None) + } + + fn new_uninitialized_with_proto(global: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<MessageEvent> { MessageEvent::new_initialized( global, + proto, HandleValue::undefined(), DOMString::new(), None, @@ -101,8 +106,9 @@ impl MessageEvent { ) } - pub fn new_initialized( + fn new_initialized( global: &GlobalScope, + proto: Option<HandleObject>, data: HandleValue, origin: DOMString, source: Option<&WindowProxyOrMessagePortOrServiceWorker>, @@ -115,7 +121,7 @@ impl MessageEvent { lastEventId, ports, )); - let ev = reflect_dom_object(ev, global); + let ev = reflect_dom_object2(ev, global, proto); ev.data.set(data.get()); ev @@ -132,7 +138,33 @@ impl MessageEvent { lastEventId: DOMString, ports: Vec<DomRoot<MessagePort>>, ) -> DomRoot<MessageEvent> { - let ev = MessageEvent::new_initialized(global, data, origin, source, lastEventId, ports); + Self::new_with_proto( + global, + None, + type_, + bubbles, + cancelable, + data, + origin, + source, + lastEventId, + ports, + ) + } + + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + type_: Atom, + bubbles: bool, + cancelable: bool, + data: HandleValue, + origin: DOMString, + source: Option<&WindowProxyOrMessagePortOrServiceWorker>, + lastEventId: DOMString, + ports: Vec<DomRoot<MessagePort>>, + ) -> DomRoot<MessageEvent> { + let ev = MessageEvent::new_initialized(global, proto, data, origin, source, lastEventId, ports); { let event = ev.upcast::<Event>(); event.init_event(type_, bubbles, cancelable); @@ -142,11 +174,13 @@ impl MessageEvent { pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, type_: DOMString, init: RootedTraceableBox<MessageEventBinding::MessageEventInit>, ) -> Fallible<DomRoot<MessageEvent>> { - let ev = MessageEvent::new( + let ev = MessageEvent::new_with_proto( global, + proto, Atom::from(type_), init.parent.bubbles, init.parent.cancelable, diff --git a/components/script/dom/mouseevent.rs b/components/script/dom/mouseevent.rs index d5fbe6b15e8..97399e5ea07 100644 --- a/components/script/dom/mouseevent.rs +++ b/components/script/dom/mouseevent.rs @@ -8,7 +8,7 @@ use crate::dom::bindings::codegen::Bindings::MouseEventBinding::MouseEventMethod use crate::dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::str::DOMString; use crate::dom::event::{Event, EventBubbles, EventCancelable}; @@ -18,6 +18,7 @@ use crate::dom::uievent::UIEvent; use crate::dom::window::Window; use dom_struct::dom_struct; use euclid::default::Point2D; +use js::rust::HandleObject; use servo_config::pref; use std::cell::Cell; use std::default::Default; @@ -71,7 +72,11 @@ impl MouseEvent { } pub fn new_uninitialized(window: &Window) -> DomRoot<MouseEvent> { - reflect_dom_object(Box::new(MouseEvent::new_inherited()), window) + Self::new_uninitialized_with_proto(window, None) + } + + fn new_uninitialized_with_proto(window: &Window, proto: Option<HandleObject>) -> DomRoot<MouseEvent> { + reflect_dom_object2(Box::new(MouseEvent::new_inherited()), window, proto) } pub fn new( @@ -94,7 +99,51 @@ impl MouseEvent { related_target: Option<&EventTarget>, point_in_target: Option<Point2D<f32>>, ) -> DomRoot<MouseEvent> { - let ev = MouseEvent::new_uninitialized(window); + Self::new_with_proto( + window, + None, + type_, + can_bubble, + cancelable, + view, + detail, + screen_x, + screen_y, + client_x, + client_y, + ctrl_key, + alt_key, + shift_key, + meta_key, + button, + buttons, + related_target, + point_in_target, + ) + } + + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + type_: DOMString, + can_bubble: EventBubbles, + cancelable: EventCancelable, + view: Option<&Window>, + detail: i32, + screen_x: i32, + screen_y: i32, + client_x: i32, + client_y: i32, + ctrl_key: bool, + alt_key: bool, + shift_key: bool, + meta_key: bool, + button: i16, + buttons: u16, + related_target: Option<&EventTarget>, + point_in_target: Option<Point2D<f32>>, + ) -> DomRoot<MouseEvent> { + let ev = MouseEvent::new_uninitialized_with_proto(window, proto); ev.InitMouseEvent( type_, bool::from(can_bubble), @@ -123,13 +172,15 @@ impl MouseEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &MouseEventBinding::MouseEventInit, ) -> Fallible<DomRoot<MouseEvent>> { let bubbles = EventBubbles::from(init.parent.parent.parent.bubbles); let cancelable = EventCancelable::from(init.parent.parent.parent.cancelable); - let event = MouseEvent::new( + let event = MouseEvent::new_with_proto( window, + proto, type_, bubbles, cancelable, diff --git a/components/script/dom/mutationobserver.rs b/components/script/dom/mutationobserver.rs index e4141af14a6..c822fd9a290 100644 --- a/components/script/dom/mutationobserver.rs +++ b/components/script/dom/mutationobserver.rs @@ -8,7 +8,7 @@ use crate::dom::bindings::codegen::Bindings::MutationObserverBinding::MutationCa use crate::dom::bindings::codegen::Bindings::MutationObserverBinding::MutationObserverBinding::MutationObserverMethods; use crate::dom::bindings::codegen::Bindings::MutationObserverBinding::MutationObserverInit; use crate::dom::bindings::error::{Error, Fallible}; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::mutationrecord::MutationRecord; @@ -18,6 +18,7 @@ use crate::microtask::Microtask; use crate::script_thread::ScriptThread; use dom_struct::dom_struct; use html5ever::{LocalName, Namespace}; +use js::rust::HandleObject; use std::rc::Rc; #[dom_struct] @@ -64,9 +65,9 @@ pub struct ObserverOptions { } impl MutationObserver { - fn new(global: &Window, callback: Rc<MutationCallback>) -> DomRoot<MutationObserver> { + fn new_with_proto(global: &Window, proto: Option<HandleObject>, callback: Rc<MutationCallback>) -> DomRoot<MutationObserver> { let boxed_observer = Box::new(MutationObserver::new_inherited(callback)); - reflect_dom_object(boxed_observer, global) + reflect_dom_object2(boxed_observer, global, proto) } fn new_inherited(callback: Rc<MutationCallback>) -> MutationObserver { @@ -81,10 +82,11 @@ impl MutationObserver { #[allow(non_snake_case)] pub fn Constructor( global: &Window, + proto: Option<HandleObject>, callback: Rc<MutationCallback>, ) -> Fallible<DomRoot<MutationObserver>> { global.set_exists_mut_observer(); - let observer = MutationObserver::new(global, callback); + let observer = MutationObserver::new_with_proto(global, proto, callback); ScriptThread::add_mutation_observer(&*observer); Ok(observer) } diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index a7186806785..4908fc65e9b 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -26,7 +26,7 @@ use crate::dom::bindings::error::{Error, ErrorResult, Fallible}; use crate::dom::bindings::inheritance::{Castable, CharacterDataTypeId, ElementTypeId}; use crate::dom::bindings::inheritance::{EventTargetTypeId, HTMLElementTypeId, NodeTypeId}; use crate::dom::bindings::inheritance::{SVGElementTypeId, SVGGraphicsElementTypeId, TextTypeId}; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, DomObjectWrap}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject, DomObjectWrap}; use crate::dom::bindings::root::{Dom, DomRoot, DomSlice, LayoutDom, MutNullableDom}; use crate::dom::bindings::str::{DOMString, USVString}; use crate::dom::bindings::xmlname::namespace_from_domstring; @@ -70,6 +70,7 @@ use dom_struct::dom_struct; use euclid::default::{Point2D, Rect, Size2D, Vector2D}; use html5ever::{Namespace, Prefix, QualName}; use js::jsapi::JSObject; +use js::rust::HandleObject; use libc::{self, c_void, uintptr_t}; use malloc_size_of::{MallocSizeOf, MallocSizeOfOps}; use msg::constellation_msg::{BrowsingContextId, PipelineId}; @@ -1756,8 +1757,15 @@ impl Node { where N: DerivedFrom<Node> + DomObject + DomObjectWrap, { + Self::reflect_node_with_proto(node, document, None) + } + + pub fn reflect_node_with_proto<N>(node: Box<N>, document: &Document, proto: Option<HandleObject>) -> DomRoot<N> + where + N: DerivedFrom<Node> + DomObject + DomObjectWrap, + { let window = document.window(); - reflect_dom_object(node, window) + reflect_dom_object2(node, window, proto) } pub fn new_inherited(doc: &Document) -> Node { @@ -2290,6 +2298,7 @@ impl Node { &document, ElementCreator::ScriptCreated, CustomElementCreationMode::Asynchronous, + None, ); DomRoot::upcast::<Node>(element) }, diff --git a/components/script/dom/offlineaudiocompletionevent.rs b/components/script/dom/offlineaudiocompletionevent.rs index 5162f4e9671..ae77c5e96d3 100644 --- a/components/script/dom/offlineaudiocompletionevent.rs +++ b/components/script/dom/offlineaudiocompletionevent.rs @@ -8,12 +8,13 @@ use crate::dom::bindings::codegen::Bindings::OfflineAudioCompletionEventBinding: use crate::dom::bindings::codegen::Bindings::OfflineAudioCompletionEventBinding::OfflineAudioCompletionEventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::event::{Event, EventBubbles, EventCancelable}; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; #[dom_struct] @@ -37,8 +38,19 @@ impl OfflineAudioCompletionEvent { cancelable: EventCancelable, rendered_buffer: &AudioBuffer, ) -> DomRoot<OfflineAudioCompletionEvent> { + Self::new_with_proto(window, None, type_, bubbles, cancelable, rendered_buffer) + } + + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + type_: Atom, + bubbles: EventBubbles, + cancelable: EventCancelable, + rendered_buffer: &AudioBuffer, + ) -> DomRoot<OfflineAudioCompletionEvent> { let event = Box::new(OfflineAudioCompletionEvent::new_inherited(rendered_buffer)); - let ev = reflect_dom_object(event, window); + let ev = reflect_dom_object2(event, window, proto); { let event = ev.upcast::<Event>(); event.init_event(type_, bool::from(bubbles), bool::from(cancelable)); @@ -49,13 +61,15 @@ impl OfflineAudioCompletionEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &OfflineAudioCompletionEventInit, ) -> Fallible<DomRoot<OfflineAudioCompletionEvent>> { let bubbles = EventBubbles::from(init.parent.bubbles); let cancelable = EventCancelable::from(init.parent.cancelable); - Ok(OfflineAudioCompletionEvent::new( + Ok(OfflineAudioCompletionEvent::new_with_proto( window, + proto, Atom::from(type_), bubbles, cancelable, diff --git a/components/script/dom/offlineaudiocontext.rs b/components/script/dom/offlineaudiocontext.rs index 798abe76f7d..243020f213e 100644 --- a/components/script/dom/offlineaudiocontext.rs +++ b/components/script/dom/offlineaudiocontext.rs @@ -13,7 +13,7 @@ use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::num::Finite; use crate::dom::bindings::refcounted::Trusted; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::DomRoot; use crate::dom::event::{Event, EventBubbles, EventCancelable}; use crate::dom::offlineaudiocompletionevent::OfflineAudioCompletionEvent; @@ -22,6 +22,7 @@ use crate::dom::window::Window; use crate::realms::InRealm; use crate::task_source::TaskSource; use dom_struct::dom_struct; +use js::rust::HandleObject; use msg::constellation_msg::PipelineId; use servo_media::audio::context::OfflineAudioContextOptions as ServoMediaOfflineAudioContextOptions; use std::cell::Cell; @@ -70,6 +71,7 @@ impl OfflineAudioContext { #[allow(unrooted_must_root)] fn new( window: &Window, + proto: Option<HandleObject>, channel_count: u32, length: u32, sample_rate: f32, @@ -85,15 +87,17 @@ impl OfflineAudioContext { let pipeline_id = window.pipeline_id(); let context = OfflineAudioContext::new_inherited(channel_count, length, sample_rate, pipeline_id); - Ok(reflect_dom_object(Box::new(context), window)) + Ok(reflect_dom_object2(Box::new(context), window, proto)) } pub fn Constructor( window: &Window, + proto: Option<HandleObject>, options: &OfflineAudioContextOptions, ) -> Fallible<DomRoot<OfflineAudioContext>> { OfflineAudioContext::new( window, + proto, options.numberOfChannels, options.length, *options.sampleRate, @@ -102,11 +106,12 @@ impl OfflineAudioContext { pub fn Constructor_( window: &Window, + proto: Option<HandleObject>, number_of_channels: u32, length: u32, sample_rate: Finite<f32>, ) -> Fallible<DomRoot<OfflineAudioContext>> { - OfflineAudioContext::new(window, number_of_channels, length, *sample_rate) + OfflineAudioContext::new(window, proto, number_of_channels, length, *sample_rate) } } diff --git a/components/script/dom/offscreencanvas.rs b/components/script/dom/offscreencanvas.rs index b381c245cfa..c607099e04c 100644 --- a/components/script/dom/offscreencanvas.rs +++ b/components/script/dom/offscreencanvas.rs @@ -7,7 +7,7 @@ use crate::dom::bindings::codegen::Bindings::OffscreenCanvasBinding::{ OffscreenCanvasMethods, OffscreenRenderingContext, }; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; @@ -20,7 +20,7 @@ use canvas_traits::canvas::{CanvasMsg, FromScriptMsg}; use dom_struct::dom_struct; use euclid::default::Size2D; use ipc_channel::ipc::IpcSharedMemory; -use js::rust::HandleValue; +use js::rust::{HandleObject, HandleValue}; use profile_traits::ipc; use std::cell::Cell; @@ -56,25 +56,28 @@ impl OffscreenCanvas { } } - pub fn new( + fn new( global: &GlobalScope, + proto: Option<HandleObject>, width: u64, height: u64, placeholder: Option<&HTMLCanvasElement>, ) -> DomRoot<OffscreenCanvas> { - reflect_dom_object( + reflect_dom_object2( Box::new(OffscreenCanvas::new_inherited(width, height, placeholder)), global, + proto, ) } #[allow(non_snake_case)] pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, width: u64, height: u64, ) -> Fallible<DomRoot<OffscreenCanvas>> { - let offscreencanvas = OffscreenCanvas::new(global, width, height, None); + let offscreencanvas = OffscreenCanvas::new(global, proto, width, height, None); Ok(offscreencanvas) } diff --git a/components/script/dom/oscillatornode.rs b/components/script/dom/oscillatornode.rs index 948603ca6e2..febc8f95d01 100644 --- a/components/script/dom/oscillatornode.rs +++ b/components/script/dom/oscillatornode.rs @@ -14,10 +14,11 @@ use crate::dom::bindings::codegen::Bindings::OscillatorNodeBinding::{ OscillatorOptions, OscillatorType, }; use crate::dom::bindings::error::{Error, ErrorResult, Fallible}; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_media::audio::node::{AudioNodeInit, AudioNodeMessage}; use servo_media::audio::oscillator_node::OscillatorNodeMessage; use servo_media::audio::oscillator_node::OscillatorNodeOptions as ServoMediaOscillatorOptions; @@ -81,23 +82,33 @@ impl OscillatorNode { }) } - #[allow(unrooted_must_root)] pub fn new( window: &Window, context: &BaseAudioContext, options: &OscillatorOptions, ) -> Fallible<DomRoot<OscillatorNode>> { + Self::new_with_proto(window, None, context, options) + } + + #[allow(unrooted_must_root)] + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + context: &BaseAudioContext, + options: &OscillatorOptions, + ) -> Fallible<DomRoot<OscillatorNode>> { let node = OscillatorNode::new_inherited(window, context, options)?; - Ok(reflect_dom_object(Box::new(node), window)) + Ok(reflect_dom_object2(Box::new(node), window, proto)) } #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, context: &BaseAudioContext, options: &OscillatorOptions, ) -> Fallible<DomRoot<OscillatorNode>> { - OscillatorNode::new(window, context, options) + OscillatorNode::new_with_proto(window, proto, context, options) } } diff --git a/components/script/dom/pagetransitionevent.rs b/components/script/dom/pagetransitionevent.rs index 5d11fb62540..8a9ec07978f 100644 --- a/components/script/dom/pagetransitionevent.rs +++ b/components/script/dom/pagetransitionevent.rs @@ -7,12 +7,13 @@ use crate::dom::bindings::codegen::Bindings::PageTransitionEventBinding; use crate::dom::bindings::codegen::Bindings::PageTransitionEventBinding::PageTransitionEventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::event::Event; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; use std::cell::Cell; @@ -31,8 +32,8 @@ impl PageTransitionEvent { } } - pub fn new_uninitialized(window: &Window) -> DomRoot<PageTransitionEvent> { - reflect_dom_object(Box::new(PageTransitionEvent::new_inherited()), window) + fn new_uninitialized(window: &Window, proto: Option<HandleObject>) -> DomRoot<PageTransitionEvent> { + reflect_dom_object2(Box::new(PageTransitionEvent::new_inherited()), window, proto) } pub fn new( @@ -42,7 +43,18 @@ impl PageTransitionEvent { cancelable: bool, persisted: bool, ) -> DomRoot<PageTransitionEvent> { - let ev = PageTransitionEvent::new_uninitialized(window); + Self::new_with_proto(window, None, type_, bubbles, cancelable, persisted) + } + + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + type_: Atom, + bubbles: bool, + cancelable: bool, + persisted: bool, + ) -> DomRoot<PageTransitionEvent> { + let ev = PageTransitionEvent::new_uninitialized(window, proto); ev.persisted.set(persisted); { let event = ev.upcast::<Event>(); @@ -54,11 +66,13 @@ impl PageTransitionEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &PageTransitionEventBinding::PageTransitionEventInit, ) -> Fallible<DomRoot<PageTransitionEvent>> { - Ok(PageTransitionEvent::new( + Ok(PageTransitionEvent::new_with_proto( window, + proto, Atom::from(type_), init.parent.bubbles, init.parent.cancelable, diff --git a/components/script/dom/pannernode.rs b/components/script/dom/pannernode.rs index 98b9226287b..22d411878d9 100644 --- a/components/script/dom/pannernode.rs +++ b/components/script/dom/pannernode.rs @@ -20,10 +20,11 @@ use crate::dom::bindings::codegen::Bindings::PannerNodeBinding::{ use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::num::Finite; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_media::audio::node::{AudioNodeInit, AudioNodeMessage}; use servo_media::audio::panner_node::PannerNodeMessage; use servo_media::audio::panner_node::{DistanceModel, PannerNodeOptions, PanningModel}; @@ -170,23 +171,33 @@ impl PannerNode { }) } - #[allow(unrooted_must_root)] pub fn new( window: &Window, context: &BaseAudioContext, options: &PannerOptions, ) -> Fallible<DomRoot<PannerNode>> { + Self::new_with_proto(window, None, context, options) + } + + #[allow(unrooted_must_root)] + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + context: &BaseAudioContext, + options: &PannerOptions, + ) -> Fallible<DomRoot<PannerNode>> { let node = PannerNode::new_inherited(window, context, options)?; - Ok(reflect_dom_object(Box::new(node), window)) + Ok(reflect_dom_object2(Box::new(node), window, proto)) } #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, context: &BaseAudioContext, options: &PannerOptions, ) -> Fallible<DomRoot<PannerNode>> { - PannerNode::new(window, context, options) + PannerNode::new_with_proto(window, proto, context, options) } } diff --git a/components/script/dom/performanceobserver.rs b/components/script/dom/performanceobserver.rs index 8d689a35785..c3349dd3d87 100644 --- a/components/script/dom/performanceobserver.rs +++ b/components/script/dom/performanceobserver.rs @@ -9,7 +9,7 @@ use crate::dom::bindings::codegen::Bindings::PerformanceObserverBinding::Perform use crate::dom::bindings::codegen::Bindings::PerformanceObserverBinding::PerformanceObserverInit; use crate::dom::bindings::codegen::Bindings::PerformanceObserverBinding::PerformanceObserverMethods; use crate::dom::bindings::error::{Error, Fallible}; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::console::Console; @@ -20,6 +20,7 @@ use crate::dom::performanceobserverentrylist::PerformanceObserverEntryList; use crate::script_runtime::JSContext; use dom_struct::dom_struct; use js::jsval::JSVal; +use js::rust::HandleObject; use std::cell::Cell; use std::rc::Rc; @@ -63,22 +64,32 @@ impl PerformanceObserver { } } - #[allow(unrooted_must_root)] pub fn new( global: &GlobalScope, callback: Rc<PerformanceObserverCallback>, entries: DOMPerformanceEntryList, ) -> DomRoot<PerformanceObserver> { + Self::new_with_proto(global, None, callback, entries) + } + + #[allow(unrooted_must_root)] + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + callback: Rc<PerformanceObserverCallback>, + entries: DOMPerformanceEntryList, + ) -> DomRoot<PerformanceObserver> { let observer = PerformanceObserver::new_inherited(callback, DomRefCell::new(entries)); - reflect_dom_object(Box::new(observer), global) + reflect_dom_object2(Box::new(observer), global, proto) } #[allow(non_snake_case)] pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, callback: Rc<PerformanceObserverCallback>, ) -> Fallible<DomRoot<PerformanceObserver>> { - Ok(PerformanceObserver::new(global, callback, Vec::new())) + Ok(PerformanceObserver::new_with_proto(global, proto, callback, Vec::new())) } /// Buffer a new performance entry. diff --git a/components/script/dom/popstateevent.rs b/components/script/dom/popstateevent.rs index 851064df389..b6095389791 100644 --- a/components/script/dom/popstateevent.rs +++ b/components/script/dom/popstateevent.rs @@ -7,7 +7,7 @@ use crate::dom::bindings::codegen::Bindings::PopStateEventBinding; use crate::dom::bindings::codegen::Bindings::PopStateEventBinding::PopStateEventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::bindings::trace::RootedTraceableBox; @@ -18,7 +18,7 @@ use crate::script_runtime::JSContext; use dom_struct::dom_struct; use js::jsapi::Heap; use js::jsval::JSVal; -use js::rust::HandleValue; +use js::rust::{HandleObject, HandleValue}; use servo_atoms::Atom; // https://html.spec.whatwg.org/multipage/#the-popstateevent-interface @@ -37,18 +37,19 @@ impl PopStateEvent { } } - pub fn new_uninitialized(window: &Window) -> DomRoot<PopStateEvent> { - reflect_dom_object(Box::new(PopStateEvent::new_inherited()), window) + fn new_uninitialized(window: &Window, proto: Option<HandleObject>) -> DomRoot<PopStateEvent> { + reflect_dom_object2(Box::new(PopStateEvent::new_inherited()), window, proto) } - pub fn new( + fn new( window: &Window, + proto: Option<HandleObject>, type_: Atom, bubbles: bool, cancelable: bool, state: HandleValue, ) -> DomRoot<PopStateEvent> { - let ev = PopStateEvent::new_uninitialized(window); + let ev = PopStateEvent::new_uninitialized(window, proto); ev.state.set(state.get()); { let event = ev.upcast::<Event>(); @@ -60,11 +61,13 @@ impl PopStateEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: RootedTraceableBox<PopStateEventBinding::PopStateEventInit>, ) -> Fallible<DomRoot<PopStateEvent>> { Ok(PopStateEvent::new( window, + proto, Atom::from(type_), init.parent.bubbles, init.parent.cancelable, @@ -73,7 +76,7 @@ impl PopStateEvent { } pub fn dispatch_jsval(target: &EventTarget, window: &Window, state: HandleValue) { - let event = PopStateEvent::new(window, atom!("popstate"), false, false, state); + let event = PopStateEvent::new(window, None, atom!("popstate"), false, false, state); event.upcast::<Event>().fire(target); } } diff --git a/components/script/dom/progressevent.rs b/components/script/dom/progressevent.rs index 32e6917a15d..e70d3e1db07 100644 --- a/components/script/dom/progressevent.rs +++ b/components/script/dom/progressevent.rs @@ -7,12 +7,13 @@ use crate::dom::bindings::codegen::Bindings::ProgressEventBinding; use crate::dom::bindings::codegen::Bindings::ProgressEventBinding::ProgressEventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::event::{Event, EventBubbles, EventCancelable}; use crate::dom::globalscope::GlobalScope; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; #[dom_struct] @@ -32,6 +33,7 @@ impl ProgressEvent { total: total, } } + pub fn new( global: &GlobalScope, type_: Atom, @@ -41,13 +43,36 @@ impl ProgressEvent { loaded: u64, total: u64, ) -> DomRoot<ProgressEvent> { - let ev = reflect_dom_object( + Self::new_with_proto( + global, + None, + type_, + can_bubble, + cancelable, + length_computable, + loaded, + total, + ) + } + + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + type_: Atom, + can_bubble: EventBubbles, + cancelable: EventCancelable, + length_computable: bool, + loaded: u64, + total: u64, + ) -> DomRoot<ProgressEvent> { + let ev = reflect_dom_object2( Box::new(ProgressEvent::new_inherited( length_computable, loaded, total, )), global, + proto, ); { let event = ev.upcast::<Event>(); @@ -59,13 +84,15 @@ impl ProgressEvent { #[allow(non_snake_case)] pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, type_: DOMString, init: &ProgressEventBinding::ProgressEventInit, ) -> Fallible<DomRoot<ProgressEvent>> { let bubbles = EventBubbles::from(init.parent.bubbles); let cancelable = EventCancelable::from(init.parent.cancelable); - let ev = ProgressEvent::new( + let ev = ProgressEvent::new_with_proto( global, + proto, Atom::from(type_), bubbles, cancelable, diff --git a/components/script/dom/promiserejectionevent.rs b/components/script/dom/promiserejectionevent.rs index 92d67725ca0..c136cf8d46a 100644 --- a/components/script/dom/promiserejectionevent.rs +++ b/components/script/dom/promiserejectionevent.rs @@ -7,7 +7,7 @@ use crate::dom::bindings::codegen::Bindings::PromiseRejectionEventBinding; use crate::dom::bindings::codegen::Bindings::PromiseRejectionEventBinding::PromiseRejectionEventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::bindings::trace::RootedTraceableBox; @@ -18,7 +18,7 @@ use crate::script_runtime::JSContext; use dom_struct::dom_struct; use js::jsapi::Heap; use js::jsval::JSVal; -use js::rust::HandleValue; +use js::rust::{HandleObject, HandleValue}; use servo_atoms::Atom; use std::rc::Rc; @@ -41,7 +41,6 @@ impl PromiseRejectionEvent { } } - #[allow(unrooted_must_root)] pub fn new( global: &GlobalScope, type_: Atom, @@ -50,9 +49,23 @@ impl PromiseRejectionEvent { promise: Rc<Promise>, reason: HandleValue, ) -> DomRoot<Self> { - let ev = reflect_dom_object( + Self::new_with_proto(global, None, type_, bubbles, cancelable, promise, reason) + } + + #[allow(unrooted_must_root)] + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + type_: Atom, + bubbles: EventBubbles, + cancelable: EventCancelable, + promise: Rc<Promise>, + reason: HandleValue, + ) -> DomRoot<Self> { + let ev = reflect_dom_object2( Box::new(PromiseRejectionEvent::new_inherited(promise)), global, + proto, ); { @@ -67,6 +80,7 @@ impl PromiseRejectionEvent { #[allow(unrooted_must_root, non_snake_case)] pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, type_: DOMString, init: RootedTraceableBox<PromiseRejectionEventBinding::PromiseRejectionEventInit>, ) -> Fallible<DomRoot<Self>> { @@ -75,8 +89,9 @@ impl PromiseRejectionEvent { let bubbles = EventBubbles::from(init.parent.bubbles); let cancelable = EventCancelable::from(init.parent.cancelable); - let event = PromiseRejectionEvent::new( + let event = PromiseRejectionEvent::new_with_proto( global, + proto, Atom::from(type_), bubbles, cancelable, diff --git a/components/script/dom/range.rs b/components/script/dom/range.rs index b48e186bc3f..e5d731702ad 100644 --- a/components/script/dom/range.rs +++ b/components/script/dom/range.rs @@ -14,7 +14,7 @@ use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use crate::dom::bindings::error::{Error, ErrorResult, Fallible}; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::inheritance::{CharacterDataTypeId, NodeTypeId}; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot, MutDom}; use crate::dom::bindings::str::DOMString; use crate::dom::bindings::trace::JSTraceable; @@ -30,6 +30,7 @@ use crate::dom::text::Text; use crate::dom::window::Window; use dom_struct::dom_struct; use js::jsapi::JSTracer; +use js::rust::HandleObject; use malloc_size_of::{MallocSizeOf, MallocSizeOfOps}; use std::cell::{Cell, UnsafeCell}; use std::cmp::{Ord, Ordering, PartialEq, PartialOrd}; @@ -66,9 +67,9 @@ impl Range { } } - pub fn new_with_doc(document: &Document) -> DomRoot<Range> { + pub fn new_with_doc(document: &Document, proto: Option<HandleObject>) -> DomRoot<Range> { let root = document.upcast(); - Range::new(document, root, 0, root, 0) + Range::new_with_proto(document, proto, root, 0, root, 0) } pub fn new( @@ -78,7 +79,25 @@ impl Range { end_container: &Node, end_offset: u32, ) -> DomRoot<Range> { - let range = reflect_dom_object( + Self::new_with_proto( + document, + None, + start_container, + start_offset, + end_container, + end_offset, + ) + } + + fn new_with_proto( + document: &Document, + proto: Option<HandleObject>, + start_container: &Node, + start_offset: u32, + end_container: &Node, + end_offset: u32, + ) -> DomRoot<Range> { + let range = reflect_dom_object2( Box::new(Range::new_inherited( start_container, start_offset, @@ -86,6 +105,7 @@ impl Range { end_offset, )), document.window(), + proto, ); start_container.ranges().push(WeakRef::new(&range)); if start_container != end_container { @@ -96,9 +116,9 @@ impl Range { // https://dom.spec.whatwg.org/#dom-range #[allow(non_snake_case)] - pub fn Constructor(window: &Window) -> Fallible<DomRoot<Range>> { + pub fn Constructor(window: &Window, proto: Option<HandleObject>) -> Fallible<DomRoot<Range>> { let document = window.Document(); - Ok(Range::new_with_doc(&document)) + Ok(Range::new_with_doc(&document, proto)) } // https://dom.spec.whatwg.org/#contained diff --git a/components/script/dom/request.rs b/components/script/dom/request.rs index 7bd89875b6f..1ddf1c7742a 100644 --- a/components/script/dom/request.rs +++ b/components/script/dom/request.rs @@ -16,7 +16,7 @@ use crate::dom::bindings::codegen::Bindings::RequestBinding::RequestMethods; use crate::dom::bindings::codegen::Bindings::RequestBinding::RequestMode; use crate::dom::bindings::codegen::Bindings::RequestBinding::RequestRedirect; use crate::dom::bindings::error::{Error, Fallible}; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject, Reflector}; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::str::{ByteString, DOMString, USVString}; use crate::dom::bindings::trace::RootedTraceableBox; @@ -30,6 +30,7 @@ use http::header::{HeaderName, HeaderValue}; use http::method::InvalidMethod; use http::Method as HttpMethod; use js::jsapi::JSObject; +use js::rust::HandleObject; use net_traits::request::CacheMode as NetTraitsRequestCache; use net_traits::request::CredentialsMode as NetTraitsRequestCredentials; use net_traits::request::Destination as NetTraitsRequestDestination; @@ -62,14 +63,15 @@ impl Request { } } - pub fn new(global: &GlobalScope, url: ServoUrl) -> DomRoot<Request> { - reflect_dom_object(Box::new(Request::new_inherited(global, url)), global) + fn new(global: &GlobalScope, proto: Option<HandleObject>, url: ServoUrl) -> DomRoot<Request> { + reflect_dom_object2(Box::new(Request::new_inherited(global, url)), global, proto) } // https://fetch.spec.whatwg.org/#dom-request #[allow(non_snake_case)] pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, mut input: RequestInfo, init: RootedTraceableBox<RequestInit>, ) -> Fallible<DomRoot<Request>> { @@ -289,7 +291,7 @@ impl Request { // Step 27 TODO: "If init["priority"] exists..." // Step 28 - let r = Request::from_net_request(global, request); + let r = Request::from_net_request(global, proto, request); // Step 29 TODO: "Set this's signal to new AbortSignal object..." // Step 30 TODO: "If signal is not null..." @@ -438,8 +440,8 @@ impl Request { } impl Request { - fn from_net_request(global: &GlobalScope, net_request: NetTraitsRequest) -> DomRoot<Request> { - let r = Request::new(global, net_request.current_url()); + fn from_net_request(global: &GlobalScope, proto: Option<HandleObject>, net_request: NetTraitsRequest) -> DomRoot<Request> { + let r = Request::new(global, proto, net_request.current_url()); *r.request.borrow_mut() = net_request; r } @@ -448,7 +450,7 @@ impl Request { let req = r.request.borrow(); let url = req.url(); let headers_guard = r.Headers().get_guard(); - let r_clone = Request::new(&r.global(), url); + let r_clone = Request::new(&r.global(), None, url); r_clone.request.borrow_mut().pipeline_id = req.pipeline_id; { let mut borrowed_r_request = r_clone.request.borrow_mut(); diff --git a/components/script/dom/response.rs b/components/script/dom/response.rs index d7e4486afd5..b42f3cc014f 100644 --- a/components/script/dom/response.rs +++ b/components/script/dom/response.rs @@ -12,7 +12,7 @@ use crate::dom::bindings::codegen::Bindings::ResponseBinding::{ }; use crate::dom::bindings::codegen::Bindings::XMLHttpRequestBinding::BodyInit; use crate::dom::bindings::error::{Error, Fallible}; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject, Reflector}; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::str::{ByteString, USVString}; use crate::dom::globalscope::GlobalScope; @@ -27,6 +27,7 @@ use http::header::HeaderMap as HyperHeaders; use http::StatusCode; use hyper_serde::Serde; use js::jsapi::JSObject; +use js::rust::HandleObject; use servo_url::ServoUrl; use std::ptr::NonNull; use std::rc::Rc; @@ -74,12 +75,17 @@ impl Response { // https://fetch.spec.whatwg.org/#dom-response pub fn new(global: &GlobalScope) -> DomRoot<Response> { - reflect_dom_object(Box::new(Response::new_inherited(global)), global) + Self::new_with_proto(global, None) + } + + fn new_with_proto(global: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<Response> { + reflect_dom_object2(Box::new(Response::new_inherited(global)), global, proto) } // https://fetch.spec.whatwg.org/#initialize-a-response pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, body: Option<BodyInit>, init: &ResponseBinding::ResponseInit, ) -> Fallible<DomRoot<Response>> { @@ -99,7 +105,7 @@ impl Response { )); } - let r = Response::new(global); + let r = Response::new_with_proto(global, proto); // Step 3 *r.status.borrow_mut() = Some(StatusCode::from_u16(init.status).unwrap()); diff --git a/components/script/dom/rtcdatachannelevent.rs b/components/script/dom/rtcdatachannelevent.rs index 95935f68107..c8e5ab8c457 100644 --- a/components/script/dom/rtcdatachannelevent.rs +++ b/components/script/dom/rtcdatachannelevent.rs @@ -6,7 +6,7 @@ use crate::dom::bindings::codegen::Bindings::EventBinding::EventMethods; use crate::dom::bindings::codegen::Bindings::RTCDataChannelEventBinding::RTCDataChannelEventInit; use crate::dom::bindings::codegen::Bindings::RTCDataChannelEventBinding::RTCDataChannelEventMethods; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::event::Event; @@ -14,6 +14,7 @@ use crate::dom::globalscope::GlobalScope; use crate::dom::rtcdatachannel::RTCDataChannel; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; #[dom_struct] @@ -37,9 +38,21 @@ impl RTCDataChannelEvent { cancelable: bool, channel: &RTCDataChannel, ) -> DomRoot<RTCDataChannelEvent> { - let event = reflect_dom_object( + Self::new_with_proto(global, None, type_, bubbles, cancelable, channel) + } + + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + type_: Atom, + bubbles: bool, + cancelable: bool, + channel: &RTCDataChannel, + ) -> DomRoot<RTCDataChannelEvent> { + let event = reflect_dom_object2( Box::new(RTCDataChannelEvent::new_inherited(&channel)), global, + proto, ); { let event = event.upcast::<Event>(); @@ -51,11 +64,13 @@ impl RTCDataChannelEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &RTCDataChannelEventInit, ) -> DomRoot<RTCDataChannelEvent> { - RTCDataChannelEvent::new( + RTCDataChannelEvent::new_with_proto( &window.global(), + proto, Atom::from(type_), init.parent.bubbles, init.parent.cancelable, diff --git a/components/script/dom/rtcerror.rs b/components/script/dom/rtcerror.rs index 615cd267c9f..de9a6e8645b 100644 --- a/components/script/dom/rtcerror.rs +++ b/components/script/dom/rtcerror.rs @@ -5,13 +5,14 @@ use crate::dom::bindings::codegen::Bindings::RTCErrorBinding::RTCErrorDetailType; use crate::dom::bindings::codegen::Bindings::RTCErrorBinding::RTCErrorInit; use crate::dom::bindings::codegen::Bindings::RTCErrorBinding::RTCErrorMethods; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::domexception::{DOMErrorName, DOMException}; use crate::dom::globalscope::GlobalScope; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; #[dom_struct] pub struct RTCError { @@ -41,19 +42,25 @@ impl RTCError { } pub fn new(global: &GlobalScope, init: &RTCErrorInit, message: DOMString) -> DomRoot<RTCError> { - reflect_dom_object( + Self::new_with_proto(global, None, init, message) + } + + fn new_with_proto(global: &GlobalScope, proto: Option<HandleObject>, init: &RTCErrorInit, message: DOMString) -> DomRoot<RTCError> { + reflect_dom_object2( Box::new(RTCError::new_inherited(global, init, message)), global, + proto, ) } #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, init: &RTCErrorInit, message: DOMString, ) -> DomRoot<RTCError> { - RTCError::new(&window.global(), init, message) + RTCError::new_with_proto(&window.global(), proto, init, message) } } diff --git a/components/script/dom/rtcerrorevent.rs b/components/script/dom/rtcerrorevent.rs index 2d40844423a..48f4224df95 100644 --- a/components/script/dom/rtcerrorevent.rs +++ b/components/script/dom/rtcerrorevent.rs @@ -6,7 +6,7 @@ use crate::dom::bindings::codegen::Bindings::EventBinding::EventMethods; use crate::dom::bindings::codegen::Bindings::RTCErrorEventBinding::RTCErrorEventInit; use crate::dom::bindings::codegen::Bindings::RTCErrorEventBinding::RTCErrorEventMethods; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::event::Event; @@ -14,6 +14,7 @@ use crate::dom::globalscope::GlobalScope; use crate::dom::rtcerror::RTCError; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; #[dom_struct] @@ -37,7 +38,18 @@ impl RTCErrorEvent { cancelable: bool, error: &RTCError, ) -> DomRoot<RTCErrorEvent> { - let event = reflect_dom_object(Box::new(RTCErrorEvent::new_inherited(&error)), global); + Self::new_with_proto(global, None, type_, bubbles, cancelable, error) + } + + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + type_: Atom, + bubbles: bool, + cancelable: bool, + error: &RTCError, + ) -> DomRoot<RTCErrorEvent> { + let event = reflect_dom_object2(Box::new(RTCErrorEvent::new_inherited(&error)), global, proto); { let event = event.upcast::<Event>(); event.init_event(type_, bubbles, cancelable); @@ -48,11 +60,13 @@ impl RTCErrorEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &RTCErrorEventInit, ) -> DomRoot<RTCErrorEvent> { - RTCErrorEvent::new( + RTCErrorEvent::new_with_proto( &window.global(), + proto, Atom::from(type_), init.parent.bubbles, init.parent.cancelable, diff --git a/components/script/dom/rtcicecandidate.rs b/components/script/dom/rtcicecandidate.rs index 371f3d7693a..fc60867d5e2 100644 --- a/components/script/dom/rtcicecandidate.rs +++ b/components/script/dom/rtcicecandidate.rs @@ -5,13 +5,14 @@ use crate::dom::bindings::codegen::Bindings::RTCIceCandidateBinding::RTCIceCandidateInit; use crate::dom::bindings::codegen::Bindings::RTCIceCandidateBinding::RTCIceCandidateMethods; use crate::dom::bindings::error::{Error, Fallible}; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::reflector::{DomObject, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::globalscope::GlobalScope; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; #[dom_struct] pub struct RTCIceCandidate { @@ -45,7 +46,18 @@ impl RTCIceCandidate { sdp_m_line_index: Option<u16>, username_fragment: Option<DOMString>, ) -> DomRoot<RTCIceCandidate> { - reflect_dom_object( + Self::new_with_proto(global, None, candidate, sdp_m_id, sdp_m_line_index, username_fragment) + } + + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + candidate: DOMString, + sdp_m_id: Option<DOMString>, + sdp_m_line_index: Option<u16>, + username_fragment: Option<DOMString>, + ) -> DomRoot<RTCIceCandidate> { + reflect_dom_object2( Box::new(RTCIceCandidate::new_inherited( candidate, sdp_m_id, @@ -53,12 +65,14 @@ impl RTCIceCandidate { username_fragment, )), global, + proto, ) } #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, config: &RTCIceCandidateInit, ) -> Fallible<DomRoot<RTCIceCandidate>> { if config.sdpMid.is_none() && config.sdpMLineIndex.is_none() { @@ -66,8 +80,9 @@ impl RTCIceCandidate { "one of sdpMid and sdpMLineIndex must be set" ))); } - Ok(RTCIceCandidate::new( + Ok(RTCIceCandidate::new_with_proto( &window.global(), + proto, config.candidate.clone(), config.sdpMid.clone(), config.sdpMLineIndex, diff --git a/components/script/dom/rtcpeerconnection.rs b/components/script/dom/rtcpeerconnection.rs index 2342dd6730e..aad751dbfe2 100644 --- a/components/script/dom/rtcpeerconnection.rs +++ b/components/script/dom/rtcpeerconnection.rs @@ -18,7 +18,7 @@ use crate::dom::bindings::error::Error; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::refcounted::{Trusted, TrustedPromise}; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom}; use crate::dom::bindings::str::USVString; @@ -41,7 +41,7 @@ use crate::task::TaskCanceller; use crate::task_source::networking::NetworkingTaskSource; use crate::task_source::TaskSource; use dom_struct::dom_struct; - +use js::rust::HandleObject; use servo_media::streams::registry::MediaStreamId; use servo_media::streams::MediaStreamType; use servo_media::webrtc::{ @@ -193,8 +193,8 @@ impl RTCPeerConnection { } } - pub fn new(global: &GlobalScope, config: &RTCConfiguration) -> DomRoot<RTCPeerConnection> { - let this = reflect_dom_object(Box::new(RTCPeerConnection::new_inherited()), global); + fn new(global: &GlobalScope, proto: Option<HandleObject>, config: &RTCConfiguration) -> DomRoot<RTCPeerConnection> { + let this = reflect_dom_object2(Box::new(RTCPeerConnection::new_inherited()), global, proto); let signaller = this.make_signaller(); *this.controller.borrow_mut() = Some(ServoMedia::get().unwrap().create_webrtc(signaller)); if let Some(ref servers) = config.iceServers { @@ -223,9 +223,10 @@ impl RTCPeerConnection { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, config: &RTCConfiguration, ) -> Fallible<DomRoot<RTCPeerConnection>> { - Ok(RTCPeerConnection::new(&window.global(), config)) + Ok(RTCPeerConnection::new(&window.global(), proto, config)) } pub fn get_webrtc_controller(&self) -> &DomRefCell<Option<WebRtcController>> { @@ -638,7 +639,7 @@ impl RTCPeerConnectionMethods for RTCPeerConnection { // dance between pending/current local/remote descriptions let this = this.root(); let desc = desc.into(); - let desc = RTCSessionDescription::Constructor(&this.global().as_window(), &desc).unwrap(); + let desc = RTCSessionDescription::Constructor(&this.global().as_window(), None, &desc).unwrap(); this.local_description.set(Some(&desc)); trusted_promise.root().resolve_native(&()) }), @@ -671,7 +672,7 @@ impl RTCPeerConnectionMethods for RTCPeerConnection { // dance between pending/current local/remote descriptions let this = this.root(); let desc = desc.into(); - let desc = RTCSessionDescription::Constructor(&this.global().as_window(), &desc).unwrap(); + let desc = RTCSessionDescription::Constructor(&this.global().as_window(), None, &desc).unwrap(); this.remote_description.set(Some(&desc)); trusted_promise.root().resolve_native(&()) }), diff --git a/components/script/dom/rtcpeerconnectioniceevent.rs b/components/script/dom/rtcpeerconnectioniceevent.rs index e88222e34ad..8fbe1564960 100644 --- a/components/script/dom/rtcpeerconnectioniceevent.rs +++ b/components/script/dom/rtcpeerconnectioniceevent.rs @@ -7,7 +7,7 @@ use crate::dom::bindings::codegen::Bindings::RTCPeerConnectionIceEventBinding::R use crate::dom::bindings::codegen::Bindings::RTCPeerConnectionIceEventBinding::RTCPeerConnectionIceEventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; @@ -16,6 +16,7 @@ use crate::dom::globalscope::GlobalScope; use crate::dom::rtcicecandidate::RTCIceCandidate; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; #[dom_struct] @@ -44,9 +45,21 @@ impl RTCPeerConnectionIceEvent { url: Option<DOMString>, trusted: bool, ) -> DomRoot<RTCPeerConnectionIceEvent> { - let e = reflect_dom_object( + Self::new_with_proto(global, None, ty, candidate, url, trusted) + } + + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + ty: Atom, + candidate: Option<&RTCIceCandidate>, + url: Option<DOMString>, + trusted: bool, + ) -> DomRoot<RTCPeerConnectionIceEvent> { + let e = reflect_dom_object2( Box::new(RTCPeerConnectionIceEvent::new_inherited(candidate, url)), global, + proto, ); let evt = e.upcast::<Event>(); evt.init_event(ty, false, false); // XXXManishearth bubbles/cancelable? @@ -57,11 +70,13 @@ impl RTCPeerConnectionIceEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, ty: DOMString, init: &RTCPeerConnectionIceEventInit, ) -> Fallible<DomRoot<RTCPeerConnectionIceEvent>> { - Ok(RTCPeerConnectionIceEvent::new( + Ok(RTCPeerConnectionIceEvent::new_with_proto( &window.global(), + proto, ty.into(), init.candidate .as_ref() diff --git a/components/script/dom/rtcsessiondescription.rs b/components/script/dom/rtcsessiondescription.rs index 2ff7157e5d4..83a5e9d998c 100644 --- a/components/script/dom/rtcsessiondescription.rs +++ b/components/script/dom/rtcsessiondescription.rs @@ -7,13 +7,14 @@ use crate::dom::bindings::codegen::Bindings::RTCSessionDescriptionBinding::{ RTCSdpType, RTCSessionDescriptionInit, }; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::reflector::{DomObject, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::globalscope::GlobalScope; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; #[dom_struct] pub struct RTCSessionDescription { @@ -31,24 +32,28 @@ impl RTCSessionDescription { } } - pub fn new( + fn new( global: &GlobalScope, + proto: Option<HandleObject>, ty: RTCSdpType, sdp: DOMString, ) -> DomRoot<RTCSessionDescription> { - reflect_dom_object( + reflect_dom_object2( Box::new(RTCSessionDescription::new_inherited(ty, sdp)), global, + proto, ) } #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, config: &RTCSessionDescriptionInit, ) -> Fallible<DomRoot<RTCSessionDescription>> { Ok(RTCSessionDescription::new( &window.global(), + proto, config.type_, config.sdp.clone(), )) diff --git a/components/script/dom/rtctrackevent.rs b/components/script/dom/rtctrackevent.rs index 0cf8605170b..77dae80a4ca 100644 --- a/components/script/dom/rtctrackevent.rs +++ b/components/script/dom/rtctrackevent.rs @@ -6,7 +6,7 @@ use crate::dom::bindings::codegen::Bindings::EventBinding::EventBinding::EventMe use crate::dom::bindings::codegen::Bindings::RTCTrackEventBinding::{self, RTCTrackEventMethods}; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::event::Event; @@ -14,6 +14,7 @@ use crate::dom::globalscope::GlobalScope; use crate::dom::mediastreamtrack::MediaStreamTrack; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; #[dom_struct] @@ -38,7 +39,18 @@ impl RTCTrackEvent { cancelable: bool, track: &MediaStreamTrack, ) -> DomRoot<RTCTrackEvent> { - let trackevent = reflect_dom_object(Box::new(RTCTrackEvent::new_inherited(&track)), global); + Self::new_with_proto(global, None, type_, bubbles, cancelable, track) + } + + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + type_: Atom, + bubbles: bool, + cancelable: bool, + track: &MediaStreamTrack, + ) -> DomRoot<RTCTrackEvent> { + let trackevent = reflect_dom_object2(Box::new(RTCTrackEvent::new_inherited(&track)), global, proto); { let event = trackevent.upcast::<Event>(); event.init_event(type_, bubbles, cancelable); @@ -49,11 +61,13 @@ impl RTCTrackEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &RTCTrackEventBinding::RTCTrackEventInit, ) -> Fallible<DomRoot<RTCTrackEvent>> { - Ok(RTCTrackEvent::new( + Ok(RTCTrackEvent::new_with_proto( &window.global(), + proto, Atom::from(type_), init.parent.bubbles, init.parent.cancelable, diff --git a/components/script/dom/servoparser/async_html.rs b/components/script/dom/servoparser/async_html.rs index 538007d9057..4a2e34316eb 100644 --- a/components/script/dom/servoparser/async_html.rs +++ b/components/script/dom/servoparser/async_html.rs @@ -420,7 +420,7 @@ impl Tokenizer { self.insert_node(node, Dom::from_ref(element.upcast())); }, ParseOperation::CreateComment { text, node } => { - let comment = Comment::new(DOMString::from(text), document); + let comment = Comment::new(DOMString::from(text), document, None); self.insert_node(node, Dom::from_ref(&comment.upcast())); }, ParseOperation::AppendBeforeSibling { sibling, node } => { diff --git a/components/script/dom/servoparser/mod.rs b/components/script/dom/servoparser/mod.rs index c4b52a038ea..6bfed4d8dea 100644 --- a/components/script/dom/servoparser/mod.rs +++ b/components/script/dom/servoparser/mod.rs @@ -857,7 +857,7 @@ impl FetchResponseListener for ParserContext { let doc = &parser.document; let doc_body = DomRoot::upcast::<Node>(doc.GetBody().unwrap()); - let img = HTMLImageElement::new(local_name!("img"), None, doc); + let img = HTMLImageElement::new(local_name!("img"), None, doc, None); img.SetSrc(USVString(self.url.to_string())); doc_body .AppendChild(&DomRoot::upcast::<Node>(img)) @@ -1119,7 +1119,7 @@ impl TreeSink for Sink { } fn create_comment(&mut self, text: StrTendril) -> Dom<Node> { - let comment = Comment::new(DOMString::from(String::from(text)), &*self.document); + let comment = Comment::new(DOMString::from(String::from(text)), &*self.document, None); Dom::from_ref(comment.upcast()) } @@ -1329,7 +1329,7 @@ fn create_element_for_token( CustomElementCreationMode::Asynchronous }; - let element = Element::create(name, is, document, creator, creation_mode); + let element = Element::create(name, is, document, creator, creation_mode, None); // https://html.spec.whatwg.org/multipage#the-input-element:value-sanitization-algorithm-3 // says to invoke sanitization "when an input element is first created"; diff --git a/components/script/dom/stereopannernode.rs b/components/script/dom/stereopannernode.rs index cc71c69593b..318308f6abf 100644 --- a/components/script/dom/stereopannernode.rs +++ b/components/script/dom/stereopannernode.rs @@ -12,10 +12,11 @@ use crate::dom::bindings::codegen::Bindings::AudioParamBinding::AutomationRate; use crate::dom::bindings::codegen::Bindings::StereoPannerNodeBinding::StereoPannerNodeMethods; use crate::dom::bindings::codegen::Bindings::StereoPannerNodeBinding::StereoPannerOptions; use crate::dom::bindings::error::{Error, Fallible}; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_media::audio::node::AudioNodeInit; use servo_media::audio::param::ParamType; use servo_media::audio::stereo_panner::StereoPannerOptions as ServoMediaStereoPannerOptions; @@ -69,23 +70,33 @@ impl StereoPannerNode { }) } - #[allow(unrooted_must_root)] pub fn new( window: &Window, context: &BaseAudioContext, options: &StereoPannerOptions, ) -> Fallible<DomRoot<StereoPannerNode>> { + Self::new_with_proto(window, None, context, options) + } + + #[allow(unrooted_must_root)] + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + context: &BaseAudioContext, + options: &StereoPannerOptions, + ) -> Fallible<DomRoot<StereoPannerNode>> { let node = StereoPannerNode::new_inherited(window, context, options)?; - Ok(reflect_dom_object(Box::new(node), window)) + Ok(reflect_dom_object2(Box::new(node), window, proto)) } #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, context: &BaseAudioContext, options: &StereoPannerOptions, ) -> Fallible<DomRoot<StereoPannerNode>> { - StereoPannerNode::new(window, context, options) + StereoPannerNode::new_with_proto(window, proto, context, options) } } diff --git a/components/script/dom/storageevent.rs b/components/script/dom/storageevent.rs index a50c1267585..b1da211f1c1 100644 --- a/components/script/dom/storageevent.rs +++ b/components/script/dom/storageevent.rs @@ -8,13 +8,14 @@ use crate::dom::bindings::codegen::Bindings::StorageEventBinding; use crate::dom::bindings::codegen::Bindings::StorageEventBinding::StorageEventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::str::{DOMString, USVString}; use crate::dom::event::{Event, EventBubbles, EventCancelable}; use crate::dom::storage::Storage; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; #[dom_struct] @@ -47,9 +48,14 @@ impl StorageEvent { } pub fn new_uninitialized(window: &Window, url: DOMString) -> DomRoot<StorageEvent> { - reflect_dom_object( + Self::new_uninitialized_with_proto(window, None, url) + } + + fn new_uninitialized_with_proto(window: &Window, proto: Option<HandleObject>, url: DOMString) -> DomRoot<StorageEvent> { + reflect_dom_object2( Box::new(StorageEvent::new_inherited(None, None, None, url, None)), window, + proto, ) } @@ -64,7 +70,33 @@ impl StorageEvent { url: DOMString, storageArea: Option<&Storage>, ) -> DomRoot<StorageEvent> { - let ev = reflect_dom_object( + Self::new_with_proto( + global, + None, + type_, + bubbles, + cancelable, + key, + oldValue, + newValue, + url, + storageArea, + ) + } + + fn new_with_proto( + global: &Window, + proto: Option<HandleObject>, + type_: Atom, + bubbles: EventBubbles, + cancelable: EventCancelable, + key: Option<DOMString>, + oldValue: Option<DOMString>, + newValue: Option<DOMString>, + url: DOMString, + storageArea: Option<&Storage>, + ) -> DomRoot<StorageEvent> { + let ev = reflect_dom_object2( Box::new(StorageEvent::new_inherited( key, oldValue, @@ -73,6 +105,7 @@ impl StorageEvent { storageArea, )), global, + proto, ); { let event = ev.upcast::<Event>(); @@ -83,6 +116,7 @@ impl StorageEvent { pub fn Constructor( global: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &StorageEventBinding::StorageEventInit, ) -> Fallible<DomRoot<StorageEvent>> { @@ -93,8 +127,9 @@ impl StorageEvent { let storageArea = init.storageArea.as_deref(); let bubbles = EventBubbles::from(init.parent.bubbles); let cancelable = EventCancelable::from(init.parent.cancelable); - let event = StorageEvent::new( + let event = StorageEvent::new_with_proto( global, + proto, Atom::from(type_), bubbles, cancelable, diff --git a/components/script/dom/submitevent.rs b/components/script/dom/submitevent.rs index c9965b762b1..cf62813a4dc 100644 --- a/components/script/dom/submitevent.rs +++ b/components/script/dom/submitevent.rs @@ -6,7 +6,7 @@ use crate::dom::bindings::codegen::Bindings::EventBinding::EventMethods; use crate::dom::bindings::codegen::Bindings::SubmitEventBinding; use crate::dom::bindings::codegen::Bindings::SubmitEventBinding::SubmitEventMethods; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::event::Event; @@ -14,6 +14,7 @@ use crate::dom::globalscope::GlobalScope; use crate::dom::htmlelement::HTMLElement; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; #[dom_struct] @@ -38,7 +39,18 @@ impl SubmitEvent { cancelable: bool, submitter: Option<DomRoot<HTMLElement>>, ) -> DomRoot<SubmitEvent> { - let ev = reflect_dom_object(Box::new(SubmitEvent::new_inherited(submitter)), global); + Self::new_with_proto(global, None, type_, bubbles, cancelable, submitter) + } + + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + type_: Atom, + bubbles: bool, + cancelable: bool, + submitter: Option<DomRoot<HTMLElement>>, + ) -> DomRoot<SubmitEvent> { + let ev = reflect_dom_object2(Box::new(SubmitEvent::new_inherited(submitter)), global, proto); { let event = ev.upcast::<Event>(); event.init_event(type_, bubbles, cancelable); @@ -49,11 +61,13 @@ impl SubmitEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &SubmitEventBinding::SubmitEventInit, ) -> DomRoot<SubmitEvent> { - SubmitEvent::new( + SubmitEvent::new_with_proto( &window.global(), + proto, Atom::from(type_), init.parent.bubbles, init.parent.cancelable, diff --git a/components/script/dom/svgelement.rs b/components/script/dom/svgelement.rs index 92c56c95c5d..3f88ab608c0 100644 --- a/components/script/dom/svgelement.rs +++ b/components/script/dom/svgelement.rs @@ -13,6 +13,7 @@ use crate::dom::node::Node; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use style::element_state::ElementState; #[dom_struct] @@ -46,10 +47,12 @@ impl SVGElement { tag_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<SVGElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(SVGElement::new_inherited(tag_name, prefix, document)), document, + proto, ) } } diff --git a/components/script/dom/svgsvgelement.rs b/components/script/dom/svgsvgelement.rs index 583bdb0eb44..df3d1e5cd3a 100644 --- a/components/script/dom/svgsvgelement.rs +++ b/components/script/dom/svgsvgelement.rs @@ -13,6 +13,7 @@ use crate::dom::svggraphicselement::SVGGraphicsElement; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use js::rust::HandleObject; use script_layout_interface::SVGSVGData; use style::attr::AttrValue; @@ -40,10 +41,12 @@ impl SVGSVGElement { local_name: LocalName, prefix: Option<Prefix>, document: &Document, + proto: Option<HandleObject>, ) -> DomRoot<SVGSVGElement> { - Node::reflect_node( + Node::reflect_node_with_proto( Box::new(SVGSVGElement::new_inherited(local_name, prefix, document)), document, + proto, ) } } diff --git a/components/script/dom/testbinding.rs b/components/script/dom/testbinding.rs index b8d2fefc951..9788b3fa85f 100644 --- a/components/script/dom/testbinding.rs +++ b/components/script/dom/testbinding.rs @@ -40,7 +40,7 @@ use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::num::Finite; use crate::dom::bindings::record::Record; use crate::dom::bindings::refcounted::TrustedPromise; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::{ByteString, DOMString, USVString}; use crate::dom::bindings::trace::RootedTraceableBox; @@ -84,22 +84,22 @@ impl TestBinding { } } - pub fn new(global: &GlobalScope) -> DomRoot<TestBinding> { - reflect_dom_object(Box::new(TestBinding::new_inherited()), global) + fn new(global: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<TestBinding> { + reflect_dom_object2(Box::new(TestBinding::new_inherited()), global, proto) } - pub fn Constructor(global: &GlobalScope) -> Fallible<DomRoot<TestBinding>> { - Ok(TestBinding::new(global)) + pub fn Constructor(global: &GlobalScope, proto: Option<HandleObject>) -> Fallible<DomRoot<TestBinding>> { + Ok(TestBinding::new(global, proto)) } #[allow(unused_variables)] - pub fn Constructor_(global: &GlobalScope, nums: Vec<f64>) -> Fallible<DomRoot<TestBinding>> { - Ok(TestBinding::new(global)) + pub fn Constructor_(global: &GlobalScope, proto: Option<HandleObject>, nums: Vec<f64>) -> Fallible<DomRoot<TestBinding>> { + Ok(TestBinding::new(global, proto)) } #[allow(unused_variables)] - pub fn Constructor__(global: &GlobalScope, num: f64) -> Fallible<DomRoot<TestBinding>> { - Ok(TestBinding::new(global)) + pub fn Constructor__(global: &GlobalScope, proto: Option<HandleObject>, num: f64) -> Fallible<DomRoot<TestBinding>> { + Ok(TestBinding::new(global, proto)) } } diff --git a/components/script/dom/testbindingiterable.rs b/components/script/dom/testbindingiterable.rs index 5befaaa2c59..1ed0434c70b 100644 --- a/components/script/dom/testbindingiterable.rs +++ b/components/script/dom/testbindingiterable.rs @@ -7,11 +7,12 @@ use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::TestBindingIterableBinding::TestBindingIterableMethods; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::globalscope::GlobalScope; use dom_struct::dom_struct; +use js::rust::HandleObject; #[dom_struct] pub struct TestBindingIterable { @@ -20,19 +21,20 @@ pub struct TestBindingIterable { } impl TestBindingIterable { - fn new(global: &GlobalScope) -> DomRoot<TestBindingIterable> { - reflect_dom_object( + fn new(global: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<TestBindingIterable> { + reflect_dom_object2( Box::new(TestBindingIterable { reflector: Reflector::new(), vals: DomRefCell::new(vec![]), }), global, + proto, ) } #[allow(non_snake_case)] - pub fn Constructor(global: &GlobalScope) -> Fallible<DomRoot<TestBindingIterable>> { - Ok(TestBindingIterable::new(global)) + pub fn Constructor(global: &GlobalScope, proto: Option<HandleObject>) -> Fallible<DomRoot<TestBindingIterable>> { + Ok(TestBindingIterable::new(global, proto)) } } diff --git a/components/script/dom/testbindingpairiterable.rs b/components/script/dom/testbindingpairiterable.rs index e8775af5ce7..ec593b27616 100644 --- a/components/script/dom/testbindingpairiterable.rs +++ b/components/script/dom/testbindingpairiterable.rs @@ -8,11 +8,12 @@ use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::TestBindingPairIterableBinding::TestBindingPairIterableMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::iterable::Iterable; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::globalscope::GlobalScope; use dom_struct::dom_struct; +use js::rust::HandleObject; #[dom_struct] pub struct TestBindingPairIterable { @@ -47,19 +48,20 @@ impl Iterable for TestBindingPairIterable { } impl TestBindingPairIterable { - fn new(global: &GlobalScope) -> DomRoot<TestBindingPairIterable> { - reflect_dom_object( + fn new(global: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<TestBindingPairIterable> { + reflect_dom_object2( Box::new(TestBindingPairIterable { reflector: Reflector::new(), map: DomRefCell::new(vec![]), }), global, + proto, ) } #[allow(non_snake_case)] - pub fn Constructor(global: &GlobalScope) -> Fallible<DomRoot<TestBindingPairIterable>> { - Ok(TestBindingPairIterable::new(global)) + pub fn Constructor(global: &GlobalScope, proto: Option<HandleObject>) -> Fallible<DomRoot<TestBindingPairIterable>> { + Ok(TestBindingPairIterable::new(global, proto)) } } diff --git a/components/script/dom/testworklet.rs b/components/script/dom/testworklet.rs index 16e49b55493..1fdbbab07c1 100644 --- a/components/script/dom/testworklet.rs +++ b/components/script/dom/testworklet.rs @@ -7,7 +7,7 @@ use crate::dom::bindings::codegen::Bindings::TestWorkletBinding::TestWorkletMeth use crate::dom::bindings::codegen::Bindings::WorkletBinding::WorkletBinding::WorkletMethods; use crate::dom::bindings::codegen::Bindings::WorkletBinding::WorkletOptions; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::reflector::Reflector; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; @@ -19,6 +19,7 @@ use crate::dom::workletglobalscope::WorkletGlobalScopeType; use crate::realms::InRealm; use crate::script_thread::ScriptThread; use dom_struct::dom_struct; +use js::rust::HandleObject; use std::rc::Rc; #[dom_struct] @@ -35,14 +36,14 @@ impl TestWorklet { } } - fn new(window: &Window) -> DomRoot<TestWorklet> { + fn new(window: &Window, proto: Option<HandleObject>) -> DomRoot<TestWorklet> { let worklet = Worklet::new(window, WorkletGlobalScopeType::Test); - reflect_dom_object(Box::new(TestWorklet::new_inherited(&*worklet)), window) + reflect_dom_object2(Box::new(TestWorklet::new_inherited(&*worklet)), window, proto) } #[allow(non_snake_case)] - pub fn Constructor(window: &Window) -> Fallible<DomRoot<TestWorklet>> { - Ok(TestWorklet::new(window)) + pub fn Constructor(window: &Window, proto: Option<HandleObject>) -> Fallible<DomRoot<TestWorklet>> { + Ok(TestWorklet::new(window, proto)) } } diff --git a/components/script/dom/text.rs b/components/script/dom/text.rs index 64fae977556..137b347bba9 100644 --- a/components/script/dom/text.rs +++ b/components/script/dom/text.rs @@ -16,6 +16,7 @@ use crate::dom::document::Document; use crate::dom::node::Node; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; /// An HTML text node. #[dom_struct] @@ -31,13 +32,17 @@ impl Text { } pub fn new(text: DOMString, document: &Document) -> DomRoot<Text> { - Node::reflect_node(Box::new(Text::new_inherited(text, document)), document) + Self::new_with_proto(text, document, None) + } + + fn new_with_proto(text: DOMString, document: &Document, proto: Option<HandleObject>) -> DomRoot<Text> { + Node::reflect_node_with_proto(Box::new(Text::new_inherited(text, document)), document, proto) } #[allow(non_snake_case)] - pub fn Constructor(window: &Window, text: DOMString) -> Fallible<DomRoot<Text>> { + pub fn Constructor(window: &Window, proto: Option<HandleObject>, text: DOMString) -> Fallible<DomRoot<Text>> { let document = window.Document(); - Ok(Text::new(text, &document)) + Ok(Text::new_with_proto(text, &document, proto)) } } diff --git a/components/script/dom/textdecoder.rs b/components/script/dom/textdecoder.rs index 7d664242467..b81fd538c6b 100644 --- a/components/script/dom/textdecoder.rs +++ b/components/script/dom/textdecoder.rs @@ -8,12 +8,13 @@ use crate::dom::bindings::codegen::Bindings::TextDecoderBinding::{ }; use crate::dom::bindings::codegen::UnionTypes::ArrayBufferViewOrArrayBuffer; use crate::dom::bindings::error::{Error, Fallible}; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::{DOMString, USVString}; use crate::dom::globalscope::GlobalScope; use dom_struct::dom_struct; use encoding_rs::{Decoder, DecoderResult, Encoding}; +use js::rust::HandleObject; use std::borrow::ToOwned; use std::cell::{Cell, RefCell}; @@ -54,21 +55,24 @@ impl TextDecoder { )) } - pub fn new( + fn new( global: &GlobalScope, + proto: Option<HandleObject>, encoding: &'static Encoding, fatal: bool, ignoreBOM: bool, ) -> DomRoot<TextDecoder> { - reflect_dom_object( + reflect_dom_object2( Box::new(TextDecoder::new_inherited(encoding, fatal, ignoreBOM)), global, + proto, ) } /// <https://encoding.spec.whatwg.org/#dom-textdecoder> pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, label: DOMString, options: &TextDecoderBinding::TextDecoderOptions, ) -> Fallible<DomRoot<TextDecoder>> { @@ -78,6 +82,7 @@ impl TextDecoder { }; Ok(TextDecoder::new( global, + proto, encoding, options.fatal, options.ignoreBOM, diff --git a/components/script/dom/textencoder.rs b/components/script/dom/textencoder.rs index 4df1143531f..caf0cdb3699 100644 --- a/components/script/dom/textencoder.rs +++ b/components/script/dom/textencoder.rs @@ -4,13 +4,14 @@ use crate::dom::bindings::codegen::Bindings::TextEncoderBinding::TextEncoderMethods; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::{DOMString, USVString}; use crate::dom::globalscope::GlobalScope; use crate::script_runtime::JSContext; use dom_struct::dom_struct; use js::jsapi::JSObject; +use js::rust::HandleObject; use js::typedarray::{CreateWith, Uint8Array}; use std::ptr; use std::ptr::NonNull; @@ -27,14 +28,14 @@ impl TextEncoder { } } - pub fn new(global: &GlobalScope) -> DomRoot<TextEncoder> { - reflect_dom_object(Box::new(TextEncoder::new_inherited()), global) + fn new(global: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<TextEncoder> { + reflect_dom_object2(Box::new(TextEncoder::new_inherited()), global, proto) } // https://encoding.spec.whatwg.org/#dom-textencoder #[allow(non_snake_case)] - pub fn Constructor(global: &GlobalScope) -> Fallible<DomRoot<TextEncoder>> { - Ok(TextEncoder::new(global)) + pub fn Constructor(global: &GlobalScope, proto: Option<HandleObject>) -> Fallible<DomRoot<TextEncoder>> { + Ok(TextEncoder::new(global, proto)) } } diff --git a/components/script/dom/trackevent.rs b/components/script/dom/trackevent.rs index 34148f26527..7959574938e 100644 --- a/components/script/dom/trackevent.rs +++ b/components/script/dom/trackevent.rs @@ -9,7 +9,7 @@ use crate::dom::bindings::codegen::Bindings::TrackEventBinding::TrackEventMethod use crate::dom::bindings::codegen::UnionTypes::VideoTrackOrAudioTrackOrTextTrack; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::event::Event; @@ -18,6 +18,7 @@ use crate::dom::texttrack::TextTrack; use crate::dom::videotrack::VideoTrack; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; #[unrooted_must_root_lint::must_root] @@ -64,7 +65,18 @@ impl TrackEvent { cancelable: bool, track: &Option<VideoTrackOrAudioTrackOrTextTrack>, ) -> DomRoot<TrackEvent> { - let te = reflect_dom_object(Box::new(TrackEvent::new_inherited(&track)), global); + Self::new_with_proto(global, None, type_, bubbles, cancelable, track) + } + + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + type_: Atom, + bubbles: bool, + cancelable: bool, + track: &Option<VideoTrackOrAudioTrackOrTextTrack>, + ) -> DomRoot<TrackEvent> { + let te = reflect_dom_object2(Box::new(TrackEvent::new_inherited(&track)), global, proto); { let event = te.upcast::<Event>(); event.init_event(type_, bubbles, cancelable); @@ -74,11 +86,13 @@ impl TrackEvent { pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &TrackEventBinding::TrackEventInit, ) -> Fallible<DomRoot<TrackEvent>> { - Ok(TrackEvent::new( + Ok(TrackEvent::new_with_proto( &window.global(), + proto, Atom::from(type_), init.parent.bubbles, init.parent.cancelable, diff --git a/components/script/dom/transitionevent.rs b/components/script/dom/transitionevent.rs index 2305a9489ff..9e2132b407a 100644 --- a/components/script/dom/transitionevent.rs +++ b/components/script/dom/transitionevent.rs @@ -9,12 +9,13 @@ use crate::dom::bindings::codegen::Bindings::TransitionEventBinding::{ use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::num::Finite; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::event::Event; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; #[dom_struct] @@ -40,7 +41,16 @@ impl TransitionEvent { type_: Atom, init: &TransitionEventInit, ) -> DomRoot<TransitionEvent> { - let ev = reflect_dom_object(Box::new(TransitionEvent::new_inherited(init)), window); + Self::new_with_proto(window, None, type_, init) + } + + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + type_: Atom, + init: &TransitionEventInit, + ) -> DomRoot<TransitionEvent> { + let ev = reflect_dom_object2(Box::new(TransitionEvent::new_inherited(init)), window, proto); { let event = ev.upcast::<Event>(); event.init_event(type_, init.parent.bubbles, init.parent.cancelable); @@ -51,10 +61,11 @@ impl TransitionEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &TransitionEventInit, ) -> Fallible<DomRoot<TransitionEvent>> { - Ok(TransitionEvent::new(window, Atom::from(type_), init)) + Ok(TransitionEvent::new_with_proto(window, proto, Atom::from(type_), init)) } } diff --git a/components/script/dom/uievent.rs b/components/script/dom/uievent.rs index c54265f4fb5..33916963a1d 100644 --- a/components/script/dom/uievent.rs +++ b/components/script/dom/uievent.rs @@ -7,12 +7,13 @@ use crate::dom::bindings::codegen::Bindings::UIEventBinding; use crate::dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::str::DOMString; use crate::dom::event::{Event, EventBubbles, EventCancelable}; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; use std::cell::Cell; use std::default::Default; @@ -35,7 +36,11 @@ impl UIEvent { } pub fn new_uninitialized(window: &Window) -> DomRoot<UIEvent> { - reflect_dom_object(Box::new(UIEvent::new_inherited()), window) + Self::new_uninitialized_with_proto(window, None) + } + + fn new_uninitialized_with_proto(window: &Window, proto: Option<HandleObject>) -> DomRoot<UIEvent> { + reflect_dom_object2(Box::new(UIEvent::new_inherited()), window, proto) } pub fn new( @@ -46,7 +51,19 @@ impl UIEvent { view: Option<&Window>, detail: i32, ) -> DomRoot<UIEvent> { - let ev = UIEvent::new_uninitialized(window); + Self::new_with_proto(window, None, type_, can_bubble, cancelable, view, detail) + } + + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + type_: DOMString, + can_bubble: EventBubbles, + cancelable: EventCancelable, + view: Option<&Window>, + detail: i32, + ) -> DomRoot<UIEvent> { + let ev = UIEvent::new_uninitialized_with_proto(window, proto); ev.InitUIEvent( type_, bool::from(can_bubble), @@ -60,13 +77,15 @@ impl UIEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &UIEventBinding::UIEventInit, ) -> Fallible<DomRoot<UIEvent>> { let bubbles = EventBubbles::from(init.parent.bubbles); let cancelable = EventCancelable::from(init.parent.cancelable); - let event = UIEvent::new( + let event = UIEvent::new_with_proto( window, + proto, type_, bubbles, cancelable, diff --git a/components/script/dom/url.rs b/components/script/dom/url.rs index ecc7fb38591..74056c9f02e 100644 --- a/components/script/dom/url.rs +++ b/components/script/dom/url.rs @@ -5,7 +5,7 @@ use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::URLBinding::URLMethods; use crate::dom::bindings::error::{Error, ErrorResult, Fallible}; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject, Reflector}; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::str::{DOMString, USVString}; use crate::dom::blob::Blob; @@ -13,6 +13,7 @@ use crate::dom::globalscope::GlobalScope; use crate::dom::urlhelper::UrlHelper; use crate::dom::urlsearchparams::URLSearchParams; use dom_struct::dom_struct; +use js::rust::HandleObject; use net_traits::blob_url_store::{get_blob_origin, parse_blob_url}; use net_traits::filemanager_thread::FileManagerThreadMsg; use net_traits::{CoreResourceMsg, IpcSend}; @@ -42,8 +43,8 @@ impl URL { } } - pub fn new(global: &GlobalScope, url: ServoUrl) -> DomRoot<URL> { - reflect_dom_object(Box::new(URL::new_inherited(url)), global) + fn new(global: &GlobalScope, proto: Option<HandleObject>, url: ServoUrl) -> DomRoot<URL> { + reflect_dom_object2(Box::new(URL::new_inherited(url)), global, proto) } pub fn query_pairs(&self) -> Vec<(String, String)> { @@ -74,6 +75,7 @@ impl URL { // https://url.spec.whatwg.org/#constructors pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, url: USVString, base: Option<USVString>, ) -> Fallible<DomRoot<URL>> { @@ -108,7 +110,7 @@ impl URL { // Step 7. Set this’s query object’s URL object to this. // Step 4. Set this’s URL to parsedURL. - Ok(URL::new(global, parsed_url)) + Ok(URL::new(global, proto, parsed_url)) } // https://url.spec.whatwg.org/#dom-url-canparse diff --git a/components/script/dom/urlsearchparams.rs b/components/script/dom/urlsearchparams.rs index 4b7e2880ef1..e4f2df9c91d 100644 --- a/components/script/dom/urlsearchparams.rs +++ b/components/script/dom/urlsearchparams.rs @@ -7,13 +7,14 @@ use crate::dom::bindings::codegen::Bindings::URLSearchParamsBinding::URLSearchPa use crate::dom::bindings::codegen::UnionTypes::USVStringSequenceSequenceOrUSVStringUSVStringRecordOrUSVString; use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::iterable::Iterable; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::{DOMString, USVString}; use crate::dom::bindings::weakref::MutableWeakRef; use crate::dom::globalscope::GlobalScope; use crate::dom::url::URL; use dom_struct::dom_struct; +use js::rust::HandleObject; use url::form_urlencoded; // https://url.spec.whatwg.org/#interface-urlsearchparams @@ -36,17 +37,22 @@ impl URLSearchParams { } pub fn new(global: &GlobalScope, url: Option<&URL>) -> DomRoot<URLSearchParams> { - reflect_dom_object(Box::new(URLSearchParams::new_inherited(url)), global) + Self::new_with_proto(global, None, url) + } + + pub fn new_with_proto(global: &GlobalScope, proto: Option<HandleObject>, url: Option<&URL>) -> DomRoot<URLSearchParams> { + reflect_dom_object2(Box::new(URLSearchParams::new_inherited(url)), global, proto) } // https://url.spec.whatwg.org/#dom-urlsearchparams-urlsearchparams #[allow(non_snake_case)] pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, init: USVStringSequenceSequenceOrUSVStringUSVStringRecordOrUSVString, ) -> Fallible<DomRoot<URLSearchParams>> { // Step 1. - let query = URLSearchParams::new(global, None); + let query = URLSearchParams::new_with_proto(global, proto, None); match init { USVStringSequenceSequenceOrUSVStringUSVStringRecordOrUSVString::USVStringSequenceSequence(init) => { // Step 2. diff --git a/components/script/dom/vttcue.rs b/components/script/dom/vttcue.rs index 28c9cd22e33..695ddce5262 100644 --- a/components/script/dom/vttcue.rs +++ b/components/script/dom/vttcue.rs @@ -9,7 +9,7 @@ use crate::dom::bindings::codegen::Bindings::VTTCueBinding::{ }; use crate::dom::bindings::error::{Error, ErrorResult}; use crate::dom::bindings::num::Finite; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::documentfragment::DocumentFragment; @@ -18,6 +18,7 @@ use crate::dom::texttrackcue::TextTrackCue; use crate::dom::vttregion::VTTRegion; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use std::cell::Cell; #[dom_struct] @@ -57,26 +58,29 @@ impl VTTCue { } } - pub fn new( + fn new( global: &GlobalScope, + proto: Option<HandleObject>, start_time: f64, end_time: f64, text: DOMString, ) -> DomRoot<Self> { - reflect_dom_object( + reflect_dom_object2( Box::new(Self::new_inherited(start_time, end_time, text)), global, + proto, ) } #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, start_time: Finite<f64>, end_time: Finite<f64>, text: DOMString, ) -> DomRoot<Self> { - VTTCue::new(&window.global(), *start_time, *end_time, text) + VTTCue::new(&window.global(), proto, *start_time, *end_time, text) } } diff --git a/components/script/dom/vttregion.rs b/components/script/dom/vttregion.rs index 987af730f14..f061416d3de 100644 --- a/components/script/dom/vttregion.rs +++ b/components/script/dom/vttregion.rs @@ -6,12 +6,13 @@ use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::VTTRegionBinding::{ScrollSetting, VTTRegionMethods}; use crate::dom::bindings::error::{Error, ErrorResult, Fallible}; use crate::dom::bindings::num::Finite; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::globalscope::GlobalScope; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use std::cell::Cell; #[dom_struct] @@ -28,7 +29,7 @@ pub struct VTTRegion { } impl VTTRegion { - pub fn new_inherited() -> Self { + fn new_inherited() -> Self { VTTRegion { reflector_: Reflector::new(), id: DomRefCell::new(DOMString::default()), @@ -42,13 +43,13 @@ impl VTTRegion { } } - pub fn new(global: &GlobalScope) -> DomRoot<Self> { - reflect_dom_object(Box::new(Self::new_inherited()), global) + fn new(global: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<Self> { + reflect_dom_object2(Box::new(Self::new_inherited()), global, proto) } #[allow(non_snake_case)] - pub fn Constructor(window: &Window) -> Fallible<DomRoot<Self>> { - Ok(VTTRegion::new(&window.global())) + pub fn Constructor(window: &Window, proto: Option<HandleObject>) -> Fallible<DomRoot<Self>> { + Ok(VTTRegion::new(&window.global(), proto)) } } diff --git a/components/script/dom/webglcontextevent.rs b/components/script/dom/webglcontextevent.rs index 95e83cbf3a5..3d4c43e357e 100644 --- a/components/script/dom/webglcontextevent.rs +++ b/components/script/dom/webglcontextevent.rs @@ -7,12 +7,13 @@ use crate::dom::bindings::codegen::Bindings::WebGLContextEventBinding::WebGLCont use crate::dom::bindings::codegen::Bindings::WebGLContextEventBinding::WebGLContextEventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::event::{Event, EventBubbles, EventCancelable}; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; #[dom_struct] @@ -34,7 +35,7 @@ impl WebGLContextEventMethods for WebGLContextEvent { } impl WebGLContextEvent { - pub fn new_inherited(status_message: DOMString) -> WebGLContextEvent { + fn new_inherited(status_message: DOMString) -> WebGLContextEvent { WebGLContextEvent { event: Event::new_inherited(), status_message: status_message, @@ -48,9 +49,21 @@ impl WebGLContextEvent { cancelable: EventCancelable, status_message: DOMString, ) -> DomRoot<WebGLContextEvent> { - let event = reflect_dom_object( + Self::new_with_proto(window, None, type_, bubbles, cancelable, status_message) + } + + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + type_: Atom, + bubbles: EventBubbles, + cancelable: EventCancelable, + status_message: DOMString, + ) -> DomRoot<WebGLContextEvent> { + let event = reflect_dom_object2( Box::new(WebGLContextEvent::new_inherited(status_message)), window, + proto, ); { @@ -64,6 +77,7 @@ impl WebGLContextEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &WebGLContextEventInit, ) -> Fallible<DomRoot<WebGLContextEvent>> { @@ -76,8 +90,9 @@ impl WebGLContextEvent { let cancelable = EventCancelable::from(init.parent.cancelable); - Ok(WebGLContextEvent::new( + Ok(WebGLContextEvent::new_with_proto( window, + proto, Atom::from(type_), bubbles, cancelable, diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs index 59b87d08987..212e88af8d0 100644 --- a/components/script/dom/websocket.rs +++ b/components/script/dom/websocket.rs @@ -10,7 +10,7 @@ use crate::dom::bindings::conversions::ToJSValConvertible; use crate::dom::bindings::error::{Error, ErrorResult, Fallible}; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::refcounted::Trusted; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::{is_token, DOMString, USVString}; use crate::dom::blob::Blob; @@ -29,7 +29,7 @@ use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; use ipc_channel::router::ROUTER; use js::jsapi::{JSAutoRealm, JSObject}; use js::jsval::UndefinedValue; -use js::rust::CustomAutoRooterGuard; +use js::rust::{CustomAutoRooterGuard, HandleObject}; use js::typedarray::{ArrayBuffer, ArrayBufferView, CreateWith}; use net_traits::request::{Referrer, RequestBuilder, RequestMode}; use net_traits::MessageData; @@ -127,16 +127,18 @@ impl WebSocket { fn new( global: &GlobalScope, + proto: Option<HandleObject>, url: ServoUrl, sender: IpcSender<WebSocketDomAction>, ) -> DomRoot<WebSocket> { - reflect_dom_object(Box::new(WebSocket::new_inherited(url, sender)), global) + reflect_dom_object2(Box::new(WebSocket::new_inherited(url, sender)), global, proto) } /// <https://html.spec.whatwg.org/multipage/#dom-websocket> #[allow(non_snake_case)] pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, url: DOMString, protocols: Option<StringOrStringSequence>, ) -> Fallible<DomRoot<WebSocket>> { @@ -190,7 +192,7 @@ impl WebSocket { ProfiledIpc::IpcReceiver<WebSocketNetworkEvent>, ) = ProfiledIpc::channel(global.time_profiler_chan().clone()).unwrap(); - let ws = WebSocket::new(global, url_record.clone(), dom_action_sender); + let ws = WebSocket::new(global, proto, url_record.clone(), dom_action_sender); let address = Trusted::new(&*ws); // Step 8. diff --git a/components/script/dom/wheelevent.rs b/components/script/dom/wheelevent.rs index d7e33b84633..cc7847b1dcd 100644 --- a/components/script/dom/wheelevent.rs +++ b/components/script/dom/wheelevent.rs @@ -8,13 +8,14 @@ use crate::dom::bindings::codegen::Bindings::WheelEventBinding::WheelEventMethod use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::num::Finite; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::event::{Event, EventBubbles, EventCancelable}; use crate::dom::mouseevent::MouseEvent; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use std::cell::Cell; #[dom_struct] @@ -37,8 +38,8 @@ impl WheelEvent { } } - pub fn new_unintialized(window: &Window) -> DomRoot<WheelEvent> { - reflect_dom_object(Box::new(WheelEvent::new_inherited()), window) + fn new_unintialized(window: &Window, proto: Option<HandleObject>) -> DomRoot<WheelEvent> { + reflect_dom_object2(Box::new(WheelEvent::new_inherited()), window, proto) } pub fn new( @@ -53,7 +54,35 @@ impl WheelEvent { delta_z: Finite<f64>, delta_mode: u32, ) -> DomRoot<WheelEvent> { - let ev = WheelEvent::new_unintialized(window); + Self::new_with_proto( + window, + None, + type_, + can_bubble, + cancelable, + view, + detail, + delta_x, + delta_y, + delta_z, + delta_mode, + ) + } + + fn new_with_proto( + window: &Window, + proto: Option<HandleObject>, + type_: DOMString, + can_bubble: EventBubbles, + cancelable: EventCancelable, + view: Option<&Window>, + detail: i32, + delta_x: Finite<f64>, + delta_y: Finite<f64>, + delta_z: Finite<f64>, + delta_mode: u32, + ) -> DomRoot<WheelEvent> { + let ev = WheelEvent::new_unintialized(window, proto); ev.InitWheelEvent( type_, bool::from(can_bubble), @@ -72,11 +101,13 @@ impl WheelEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &WheelEventBinding::WheelEventInit, ) -> Fallible<DomRoot<WheelEvent>> { - let event = WheelEvent::new( + let event = WheelEvent::new_with_proto( window, + proto, type_, EventBubbles::from(init.parent.parent.parent.parent.bubbles), EventCancelable::from(init.parent.parent.parent.parent.cancelable), diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs index b9370f02914..5bd0acf701c 100644 --- a/components/script/dom/worker.rs +++ b/components/script/dom/worker.rs @@ -9,7 +9,7 @@ use crate::dom::bindings::codegen::Bindings::WorkerBinding::{WorkerMethods, Work use crate::dom::bindings::error::{Error, ErrorResult, Fallible}; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::refcounted::Trusted; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::USVString; use crate::dom::bindings::structuredclone; @@ -31,7 +31,7 @@ use dom_struct::dom_struct; use ipc_channel::ipc; use js::jsapi::{Heap, JSObject, JS_RequestInterruptCallback}; use js::jsval::UndefinedValue; -use js::rust::{CustomAutoRooter, CustomAutoRooterGuard, HandleValue}; +use js::rust::{CustomAutoRooter, CustomAutoRooterGuard, HandleObject, HandleValue}; use script_traits::{StructuredSerializedData, WorkerScriptLoadOrigin}; use std::cell::Cell; use std::sync::atomic::{AtomicBool, Ordering}; @@ -63,18 +63,20 @@ impl Worker { } } - pub fn new( + fn new( global: &GlobalScope, + proto: Option<HandleObject>, sender: Sender<DedicatedWorkerScriptMsg>, closing: Arc<AtomicBool>, ) -> DomRoot<Worker> { - reflect_dom_object(Box::new(Worker::new_inherited(sender, closing)), global) + reflect_dom_object2(Box::new(Worker::new_inherited(sender, closing)), global, proto) } // https://html.spec.whatwg.org/multipage/#dom-worker #[allow(unsafe_code, non_snake_case)] pub fn Constructor( global: &GlobalScope, + proto: Option<HandleObject>, script_url: USVString, worker_options: &WorkerOptions, ) -> Fallible<DomRoot<Worker>> { @@ -86,7 +88,7 @@ impl Worker { let (sender, receiver) = unbounded(); let closing = Arc::new(AtomicBool::new(false)); - let worker = Worker::new(global, sender.clone(), closing.clone()); + let worker = Worker::new(global, proto, sender.clone(), closing.clone()); let worker_ref = Trusted::new(&*worker); let worker_load_origin = WorkerScriptLoadOrigin { diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index 1c6db3a5953..04c875aadd1 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -13,7 +13,7 @@ use crate::dom::bindings::conversions::ToJSValConvertible; use crate::dom::bindings::error::{Error, ErrorResult, Fallible}; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::refcounted::Trusted; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom}; use crate::dom::bindings::str::{is_token, ByteString, DOMString, USVString}; use crate::dom::blob::{normalize_type_string, Blob}; @@ -52,6 +52,7 @@ use ipc_channel::router::ROUTER; use js::jsapi::JS_ClearPendingException; use js::jsapi::{Heap, JSObject}; use js::jsval::{JSVal, NullValue, UndefinedValue}; +use js::rust::HandleObject; use js::rust::wrappers::JS_ParseJSON; use js::typedarray::{ArrayBuffer, CreateWith}; use mime::{self, Mime, Name}; @@ -213,14 +214,15 @@ impl XMLHttpRequest { canceller: DomRefCell::new(Default::default()), } } - pub fn new(global: &GlobalScope) -> DomRoot<XMLHttpRequest> { - reflect_dom_object(Box::new(XMLHttpRequest::new_inherited(global)), global) + + fn new(global: &GlobalScope, proto: Option<HandleObject>) -> DomRoot<XMLHttpRequest> { + reflect_dom_object2(Box::new(XMLHttpRequest::new_inherited(global)), global, proto) } // https://xhr.spec.whatwg.org/#constructors #[allow(non_snake_case)] - pub fn Constructor(global: &GlobalScope) -> Fallible<DomRoot<XMLHttpRequest>> { - Ok(XMLHttpRequest::new(global)) + pub fn Constructor(global: &GlobalScope, proto: Option<HandleObject>) -> Fallible<DomRoot<XMLHttpRequest>> { + Ok(XMLHttpRequest::new(global, proto)) } fn sync_in_window(&self) -> bool { diff --git a/components/script/dom/xmlserializer.rs b/components/script/dom/xmlserializer.rs index 2b65d061fa6..e7f74697657 100644 --- a/components/script/dom/xmlserializer.rs +++ b/components/script/dom/xmlserializer.rs @@ -4,12 +4,13 @@ use crate::dom::bindings::codegen::Bindings::XMLSerializerBinding::XMLSerializerMethods; use crate::dom::bindings::error::{Error, Fallible}; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::node::Node; use crate::dom::window::Window; use dom_struct::dom_struct; +use js::rust::HandleObject; use xml5ever::serialize::{serialize, SerializeOpts, TraversalScope}; #[dom_struct] @@ -26,13 +27,13 @@ impl XMLSerializer { } } - pub fn new(window: &Window) -> DomRoot<XMLSerializer> { - reflect_dom_object(Box::new(XMLSerializer::new_inherited(window)), window) + pub fn new(window: &Window, proto: Option<HandleObject>) -> DomRoot<XMLSerializer> { + reflect_dom_object2(Box::new(XMLSerializer::new_inherited(window)), window, proto) } #[allow(non_snake_case)] - pub fn Constructor(window: &Window) -> Fallible<DomRoot<XMLSerializer>> { - Ok(XMLSerializer::new(window)) + pub fn Constructor(window: &Window, proto: Option<HandleObject>) -> Fallible<DomRoot<XMLSerializer>> { + Ok(XMLSerializer::new(window, proto)) } } diff --git a/components/script/dom/xrinputsourceevent.rs b/components/script/dom/xrinputsourceevent.rs index 47ed6d90626..cdbc63b6454 100644 --- a/components/script/dom/xrinputsourceevent.rs +++ b/components/script/dom/xrinputsourceevent.rs @@ -8,7 +8,7 @@ use crate::dom::bindings::codegen::Bindings::XRInputSourceEventBinding::{ }; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::event::Event; @@ -17,6 +17,7 @@ use crate::dom::window::Window; use crate::dom::xrframe::XRFrame; use crate::dom::xrinputsource::XRInputSource; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; #[dom_struct] @@ -44,9 +45,22 @@ impl XRInputSourceEvent { frame: &XRFrame, source: &XRInputSource, ) -> DomRoot<XRInputSourceEvent> { - let trackevent = reflect_dom_object( + Self::new_with_proto(global, None, type_, bubbles, cancelable, frame, source) + } + + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + type_: Atom, + bubbles: bool, + cancelable: bool, + frame: &XRFrame, + source: &XRInputSource, + ) -> DomRoot<XRInputSourceEvent> { + let trackevent = reflect_dom_object2( Box::new(XRInputSourceEvent::new_inherited(frame, source)), global, + proto, ); { let event = trackevent.upcast::<Event>(); @@ -58,11 +72,13 @@ impl XRInputSourceEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &XRInputSourceEventBinding::XRInputSourceEventInit, ) -> Fallible<DomRoot<XRInputSourceEvent>> { - Ok(XRInputSourceEvent::new( + Ok(XRInputSourceEvent::new_with_proto( &window.global(), + proto, Atom::from(type_), init.parent.bubbles, init.parent.cancelable, diff --git a/components/script/dom/xrinputsourceschangeevent.rs b/components/script/dom/xrinputsourceschangeevent.rs index 99e5da7ead7..09cbcdc2fc1 100644 --- a/components/script/dom/xrinputsourceschangeevent.rs +++ b/components/script/dom/xrinputsourceschangeevent.rs @@ -7,7 +7,7 @@ use crate::dom::bindings::codegen::Bindings::XRInputSourcesChangeEventBinding::{ self, XRInputSourcesChangeEventMethods, }; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::event::Event; @@ -21,6 +21,7 @@ use dom_struct::dom_struct; use js::conversions::ToJSValConvertible; use js::jsapi::Heap; use js::jsval::{JSVal, UndefinedValue}; +use js::rust::HandleObject; use servo_atoms::Atom; #[dom_struct] @@ -44,7 +45,6 @@ impl XRInputSourcesChangeEvent { } } - #[allow(unsafe_code)] pub fn new( global: &GlobalScope, type_: Atom, @@ -54,9 +54,33 @@ impl XRInputSourcesChangeEvent { added: &[DomRoot<XRInputSource>], removed: &[DomRoot<XRInputSource>], ) -> DomRoot<XRInputSourcesChangeEvent> { - let changeevent = reflect_dom_object( + Self::new_with_proto( + global, + None, + type_, + bubbles, + cancelable, + session, + added, + removed, + ) + } + + #[allow(unsafe_code)] + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + type_: Atom, + bubbles: bool, + cancelable: bool, + session: &XRSession, + added: &[DomRoot<XRInputSource>], + removed: &[DomRoot<XRInputSource>], + ) -> DomRoot<XRInputSourcesChangeEvent> { + let changeevent = reflect_dom_object2( Box::new(XRInputSourcesChangeEvent::new_inherited(session)), global, + proto, ); { let event = changeevent.upcast::<Event>(); @@ -79,11 +103,13 @@ impl XRInputSourcesChangeEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &XRInputSourcesChangeEventBinding::XRInputSourcesChangeEventInit, ) -> DomRoot<XRInputSourcesChangeEvent> { - XRInputSourcesChangeEvent::new( + XRInputSourcesChangeEvent::new_with_proto( &window.global(), + proto, Atom::from(type_), init.parent.bubbles, init.parent.cancelable, diff --git a/components/script/dom/xrlayerevent.rs b/components/script/dom/xrlayerevent.rs index d3485fa1c51..dc8cfe3662d 100644 --- a/components/script/dom/xrlayerevent.rs +++ b/components/script/dom/xrlayerevent.rs @@ -5,7 +5,7 @@ use crate::dom::bindings::codegen::Bindings::EventBinding::EventBinding::EventMethods; use crate::dom::bindings::codegen::Bindings::XRLayerEventBinding::XRLayerEventInit; use crate::dom::bindings::codegen::Bindings::XRLayerEventBinding::XRLayerEventMethods; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::root::Dom; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; @@ -13,6 +13,7 @@ use crate::dom::event::Event; use crate::dom::window::Window; use crate::dom::xrlayer::XRLayer; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; // https://w3c.github.io/uievents/#interface-uievent @@ -30,17 +31,18 @@ impl XRLayerEvent { } } - pub fn new(window: &Window, layer: &XRLayer) -> DomRoot<XRLayerEvent> { - reflect_dom_object(Box::new(XRLayerEvent::new_inherited(layer)), window) + fn new(window: &Window, proto: Option<HandleObject>, layer: &XRLayer) -> DomRoot<XRLayerEvent> { + reflect_dom_object2(Box::new(XRLayerEvent::new_inherited(layer)), window, proto) } #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &XRLayerEventInit, ) -> DomRoot<XRLayerEvent> { - let event = XRLayerEvent::new(window, &init.layer); + let event = XRLayerEvent::new(window, proto, &init.layer); let type_ = Atom::from(type_); let bubbles = init.parent.bubbles; let cancelable = init.parent.cancelable; diff --git a/components/script/dom/xrmediabinding.rs b/components/script/dom/xrmediabinding.rs index 5e1dfd3abeb..c3c4c3a5fc7 100644 --- a/components/script/dom/xrmediabinding.rs +++ b/components/script/dom/xrmediabinding.rs @@ -6,7 +6,7 @@ use crate::dom::bindings::codegen::Bindings::XRMediaBindingBinding::XRMediaBindi use crate::dom::bindings::codegen::Bindings::XRMediaBindingBinding::XRMediaLayerInit; use crate::dom::bindings::error::Error; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::reflector::Reflector; use crate::dom::bindings::root::Dom; use crate::dom::bindings::root::DomRoot; @@ -17,6 +17,7 @@ use crate::dom::xrequirectlayer::XREquirectLayer; use crate::dom::xrquadlayer::XRQuadLayer; use crate::dom::xrsession::XRSession; use dom_struct::dom_struct; +use js::rust::HandleObject; #[dom_struct] pub struct XRMediaBinding { @@ -32,12 +33,12 @@ impl XRMediaBinding { } } - pub fn new(global: &Window, session: &XRSession) -> DomRoot<XRMediaBinding> { - reflect_dom_object(Box::new(XRMediaBinding::new_inherited(session)), global) + fn new(global: &Window, proto: Option<HandleObject>, session: &XRSession) -> DomRoot<XRMediaBinding> { + reflect_dom_object2(Box::new(XRMediaBinding::new_inherited(session)), global, proto) } #[allow(non_snake_case)] - pub fn Constructor(global: &Window, session: &XRSession) -> Fallible<DomRoot<XRMediaBinding>> { + pub fn Constructor(global: &Window, proto: Option<HandleObject>, session: &XRSession) -> Fallible<DomRoot<XRMediaBinding>> { // Step 1. if session.is_ended() { return Err(Error::InvalidState); @@ -49,7 +50,7 @@ impl XRMediaBinding { } // Steps 3-5. - Ok(XRMediaBinding::new(global, session)) + Ok(XRMediaBinding::new(global, proto, session)) } } diff --git a/components/script/dom/xrray.rs b/components/script/dom/xrray.rs index 781ff6a396b..029929ae37d 100644 --- a/components/script/dom/xrray.rs +++ b/components/script/dom/xrray.rs @@ -5,7 +5,7 @@ use crate::dom::bindings::codegen::Bindings::DOMPointBinding::DOMPointInit; use crate::dom::bindings::codegen::Bindings::XRRayBinding::{XRRayDirectionInit, XRRayMethods}; use crate::dom::bindings::error::{Error, Fallible}; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::utils::create_typed_array; use crate::dom::dompointreadonly::DOMPointReadOnly; @@ -16,6 +16,7 @@ use crate::script_runtime::JSContext; use dom_struct::dom_struct; use euclid::{Angle, RigidTransform3D, Rotation3D, Vector3D}; use js::jsapi::{Heap, JSObject}; +use js::rust::HandleObject; use std::ptr::NonNull; use webxr_api::{ApiSpace, Ray}; @@ -37,14 +38,15 @@ impl XRRay { } } - pub fn new(global: &GlobalScope, ray: Ray<ApiSpace>) -> DomRoot<XRRay> { - reflect_dom_object(Box::new(XRRay::new_inherited(ray)), global) + fn new(global: &GlobalScope, proto: Option<HandleObject>, ray: Ray<ApiSpace>) -> DomRoot<XRRay> { + reflect_dom_object2(Box::new(XRRay::new_inherited(ray)), global, proto) } #[allow(non_snake_case)] /// https://immersive-web.github.io/hit-test/#dom-xrray-xrray pub fn Constructor( window: &Window, + proto: Option<HandleObject>, origin: &DOMPointInit, direction: &XRRayDirectionInit, ) -> Fallible<DomRoot<Self>> { @@ -68,19 +70,19 @@ impl XRRay { ) .normalize(); - Ok(Self::new(&window.global(), Ray { origin, direction })) + Ok(Self::new(&window.global(), proto, Ray { origin, direction })) } #[allow(non_snake_case)] /// https://immersive-web.github.io/hit-test/#dom-xrray-xrray-transform - pub fn Constructor_(window: &Window, transform: &XRRigidTransform) -> Fallible<DomRoot<Self>> { + pub fn Constructor_(window: &Window, proto: Option<HandleObject>, transform: &XRRigidTransform) -> Fallible<DomRoot<Self>> { let transform = transform.transform(); let origin = transform.translation; let direction = transform .rotation .transform_vector3d(Vector3D::new(0., 0., -1.)); - Ok(Self::new(&window.global(), Ray { origin, direction })) + Ok(Self::new(&window.global(), proto, Ray { origin, direction })) } pub fn ray(&self) -> Ray<ApiSpace> { diff --git a/components/script/dom/xrrigidtransform.rs b/components/script/dom/xrrigidtransform.rs index 00909e1fe1c..4cbbee32386 100644 --- a/components/script/dom/xrrigidtransform.rs +++ b/components/script/dom/xrrigidtransform.rs @@ -7,7 +7,7 @@ use crate::dom::bindings::codegen::Bindings::XRRigidTransformBinding::XRRigidTra use crate::dom::bindings::error::Error; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::reflector::DomObject; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::reflector::{reflect_dom_object2, Reflector}; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::utils::create_typed_array; use crate::dom::dompointreadonly::DOMPointReadOnly; @@ -18,6 +18,7 @@ use crate::script_runtime::JSContext; use dom_struct::dom_struct; use euclid::{RigidTransform3D, Rotation3D, Vector3D}; use js::jsapi::{Heap, JSObject}; +use js::rust::HandleObject; use std::ptr::NonNull; #[dom_struct] @@ -45,7 +46,11 @@ impl XRRigidTransform { } pub fn new(global: &GlobalScope, transform: ApiRigidTransform) -> DomRoot<XRRigidTransform> { - reflect_dom_object(Box::new(XRRigidTransform::new_inherited(transform)), global) + Self::new_with_proto(global, None, transform) + } + + fn new_with_proto(global: &GlobalScope, proto: Option<HandleObject>, transform: ApiRigidTransform) -> DomRoot<XRRigidTransform> { + reflect_dom_object2(Box::new(XRRigidTransform::new_inherited(transform)), global, proto) } pub fn identity(window: &GlobalScope) -> DomRoot<XRRigidTransform> { @@ -57,6 +62,7 @@ impl XRRigidTransform { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, position: &DOMPointInit, orientation: &DOMPointInit, ) -> Fallible<DomRoot<Self>> { @@ -81,7 +87,7 @@ impl XRRigidTransform { return Err(Error::InvalidState); } let transform = RigidTransform3D::new(rotate, translate); - Ok(XRRigidTransform::new(&window.global(), transform)) + Ok(XRRigidTransform::new_with_proto(&window.global(), proto, transform)) } } diff --git a/components/script/dom/xrsessionevent.rs b/components/script/dom/xrsessionevent.rs index 95005d4e397..4fcfbfff3e2 100644 --- a/components/script/dom/xrsessionevent.rs +++ b/components/script/dom/xrsessionevent.rs @@ -6,7 +6,7 @@ use crate::dom::bindings::codegen::Bindings::EventBinding::EventBinding::EventMe use crate::dom::bindings::codegen::Bindings::XRSessionEventBinding::{self, XRSessionEventMethods}; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::event::Event; @@ -14,6 +14,7 @@ use crate::dom::globalscope::GlobalScope; use crate::dom::window::Window; use crate::dom::xrsession::XRSession; use dom_struct::dom_struct; +use js::rust::HandleObject; use servo_atoms::Atom; #[dom_struct] @@ -38,8 +39,19 @@ impl XRSessionEvent { cancelable: bool, session: &XRSession, ) -> DomRoot<XRSessionEvent> { + Self::new_with_proto(global, None, type_, bubbles, cancelable, session) + } + + fn new_with_proto( + global: &GlobalScope, + proto: Option<HandleObject>, + type_: Atom, + bubbles: bool, + cancelable: bool, + session: &XRSession, + ) -> DomRoot<XRSessionEvent> { let trackevent = - reflect_dom_object(Box::new(XRSessionEvent::new_inherited(&session)), global); + reflect_dom_object2(Box::new(XRSessionEvent::new_inherited(&session)), global, proto); { let event = trackevent.upcast::<Event>(); event.init_event(type_, bubbles, cancelable); @@ -50,11 +62,13 @@ impl XRSessionEvent { #[allow(non_snake_case)] pub fn Constructor( window: &Window, + proto: Option<HandleObject>, type_: DOMString, init: &XRSessionEventBinding::XRSessionEventInit, ) -> Fallible<DomRoot<XRSessionEvent>> { - Ok(XRSessionEvent::new( + Ok(XRSessionEvent::new_with_proto( &window.global(), + proto, Atom::from(type_), init.parent.bubbles, init.parent.cancelable, diff --git a/components/script/dom/xrwebglbinding.rs b/components/script/dom/xrwebglbinding.rs index 64ea31e0bce..fb64c92d7e6 100644 --- a/components/script/dom/xrwebglbinding.rs +++ b/components/script/dom/xrwebglbinding.rs @@ -13,7 +13,7 @@ use crate::dom::bindings::codegen::Bindings::XRWebGLBindingBinding::XRWebGLBindi use crate::dom::bindings::codegen::UnionTypes::WebGLRenderingContextOrWebGL2RenderingContext; use crate::dom::bindings::error::Error; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::reflect_dom_object2; use crate::dom::bindings::reflector::Reflector; use crate::dom::bindings::root::Dom; use crate::dom::bindings::root::DomRoot; @@ -30,6 +30,7 @@ use crate::dom::xrsession::XRSession; use crate::dom::xrview::XRView; use crate::dom::xrwebglsubimage::XRWebGLSubImage; use dom_struct::dom_struct; +use js::rust::HandleObject; #[dom_struct] pub struct XRWebGLBinding { @@ -47,20 +48,23 @@ impl XRWebGLBinding { } } - pub fn new( + fn new( global: &Window, + proto: Option<HandleObject>, session: &XRSession, context: &WebGLRenderingContext, ) -> DomRoot<XRWebGLBinding> { - reflect_dom_object( + reflect_dom_object2( Box::new(XRWebGLBinding::new_inherited(session, context)), global, + proto, ) } #[allow(non_snake_case)] pub fn Constructor( global: &Window, + proto: Option<HandleObject>, session: &XRSession, context: WebGLRenderingContextOrWebGL2RenderingContext, ) -> DomRoot<XRWebGLBinding> { @@ -70,7 +74,7 @@ impl XRWebGLBinding { ctx.base_context() }, }; - XRWebGLBinding::new(global, session, &context) + XRWebGLBinding::new(global, proto, session, &context) } } diff --git a/components/script/dom/xrwebgllayer.rs b/components/script/dom/xrwebgllayer.rs index dd1e4eff57f..bbf6e76e5db 100644 --- a/components/script/dom/xrwebgllayer.rs +++ b/components/script/dom/xrwebgllayer.rs @@ -10,7 +10,7 @@ use crate::dom::bindings::codegen::Bindings::XRWebGLLayerBinding::XRWebGLRenderi use crate::dom::bindings::error::Error; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object2, DomObject}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::globalscope::GlobalScope; use crate::dom::webglframebuffer::WebGLFramebuffer; @@ -28,6 +28,7 @@ use canvas_traits::webgl::WebGLContextId; use canvas_traits::webgl::WebGLTextureId; use dom_struct::dom_struct; use euclid::{Rect, Size2D}; +use js::rust::HandleObject; use std::convert::TryInto; use webxr_api::ContextId as WebXRContextId; use webxr_api::LayerId; @@ -78,15 +79,16 @@ impl XRWebGLLayer { } } - pub fn new( + fn new( global: &GlobalScope, + proto: Option<HandleObject>, session: &XRSession, context: &WebGLRenderingContext, init: &XRWebGLLayerInit, framebuffer: Option<&WebGLFramebuffer>, layer_id: Option<LayerId>, ) -> DomRoot<XRWebGLLayer> { - reflect_dom_object( + reflect_dom_object2( Box::new(XRWebGLLayer::new_inherited( session, context, @@ -95,6 +97,7 @@ impl XRWebGLLayer { layer_id, )), global, + proto, ) } @@ -102,6 +105,7 @@ impl XRWebGLLayer { #[allow(non_snake_case)] pub fn Constructor( global: &Window, + proto: Option<HandleObject>, session: &XRSession, context: XRWebGLRenderingContext, init: &XRWebGLLayerInit, @@ -147,6 +151,7 @@ impl XRWebGLLayer { // Step 10. "Return layer." Ok(XRWebGLLayer::new( &global.global(), + proto, session, &context, init, |