diff --git a/components/script/dom/analysernode.rs b/components/script/dom/analysernode.rs index 18fbfe7d20c..9b8d6457959 100644 --- a/components/script/dom/analysernode.rs +++ b/components/script/dom/analysernode.rs @@ -111,6 +111,7 @@ impl AnalyserNode { let (node, recv) = AnalyserNode::new_inherited(window, context, options)?; let object = reflect_dom_object_with_proto(Box::new(node), window, proto, can_gc); let task_source = window + .as_global_scope() .task_manager() .dom_manipulation_task_source() .to_sendable(); diff --git a/components/script/dom/bindings/reflector.rs b/components/script/dom/bindings/reflector.rs index da2534402b6..3a3743a07c0 100644 --- a/components/script/dom/bindings/reflector.rs +++ b/components/script/dom/bindings/reflector.rs @@ -100,7 +100,9 @@ pub trait DomObject: JSTraceable + 'static { /// Returns the receiver's reflector. fn reflector(&self) -> &Reflector; - /// Returns the global scope of the realm that the DomObject was created in. + /// Returns the [`GlobalScope`] of the realm that the [`DomObject`] was created in. If this + /// object is a `Node`, this will be different from it's owning `Document` if adopted by. For + /// `Node`s it's almost always better to use `NodeTraits::owning_global`. fn global(&self) -> DomRoot where Self: Sized, diff --git a/components/script/dom/bluetoothadvertisingevent.rs b/components/script/dom/bluetoothadvertisingevent.rs index 0fc7a4dbe8b..a8287fef086 100644 --- a/components/script/dom/bluetoothadvertisingevent.rs +++ b/components/script/dom/bluetoothadvertisingevent.rs @@ -91,7 +91,6 @@ impl BluetoothAdvertisingEventMethods for BluetoothAdverti type_: DOMString, init: &BluetoothAdvertisingEventInit, ) -> Fallible> { - let global = window.upcast::(); let name = init.name.clone(); let appearance = init.appearance; let txPower = init.txPower; @@ -99,7 +98,7 @@ impl BluetoothAdvertisingEventMethods for BluetoothAdverti let bubbles = EventBubbles::from(init.parent.bubbles); let cancelable = EventCancelable::from(init.parent.cancelable); Ok(BluetoothAdvertisingEvent::new( - global, + window.as_global_scope(), proto, Atom::from(type_), bubbles, diff --git a/components/script/dom/customelementregistry.rs b/components/script/dom/customelementregistry.rs index bf31cecaea9..0ef3ac99598 100644 --- a/components/script/dom/customelementregistry.rs +++ b/components/script/dom/customelementregistry.rs @@ -571,13 +571,15 @@ impl CustomElementRegistryMethods for CustomElementRegistr /// #[allow(unsafe_code)] fn WhenDefined(&self, name: DOMString, comp: InRealm, can_gc: CanGc) -> Rc { - let global_scope = self.window.upcast::(); let name = LocalName::from(&*name); // Step 1 if !is_valid_custom_element_name(&name) { let promise = Promise::new_in_current_realm(comp, can_gc); - promise.reject_native(&DOMException::new(global_scope, DOMErrorName::SyntaxError)); + promise.reject_native(&DOMException::new( + self.window.as_global_scope(), + DOMErrorName::SyntaxError, + )); return promise; } @@ -733,7 +735,7 @@ impl CustomElementDefinition { // https://html.spec.whatwg.org/multipage/#clean-up-after-running-script if is_execution_stack_empty() { window - .upcast::() + .as_global_scope() .perform_a_microtask_checkpoint(can_gc); } @@ -925,7 +927,7 @@ fn run_upgrade_constructor( // https://html.spec.whatwg.org/multipage/#clean-up-after-running-script if is_execution_stack_empty() { window - .upcast::() + .as_global_scope() .perform_a_microtask_checkpoint(can_gc); } diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 325b5556878..907f8b955aa 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -696,7 +696,7 @@ impl Document { // But it's now Step 4 in https://html.spec.whatwg.org/multipage/#reactivate-a-document // TODO: See #32687 for more information. let document = Trusted::new(self); - self.window() + self.owner_global() .task_manager() .dom_manipulation_task_source() .queue(task!(fire_pageshow_event: move || { @@ -1166,10 +1166,9 @@ impl Document { self.window.pipeline_id(), title.clone(), )); - let global = self.window.upcast::(); - if let Some(chan) = global.devtools_chan() { + if let Some(chan) = self.window.as_global_scope().devtools_chan() { let _ = chan.send(ScriptToDevtoolsControlMsg::TitleChanged( - global.pipeline_id(), + self.window.pipeline_id(), title, )); } @@ -2127,7 +2126,11 @@ impl Document { ) { let callback = NetworkListener { context: std::sync::Arc::new(Mutex::new(listener)), - task_source: self.window().task_manager().networking_task_source().into(), + task_source: self + .owner_global() + .task_manager() + .networking_task_source() + .into(), } .into_callback(); self.loader_mut() @@ -2142,7 +2145,11 @@ impl Document { ) { let callback = NetworkListener { context: std::sync::Arc::new(Mutex::new(listener)), - task_source: self.window().task_manager().networking_task_source().into(), + task_source: self + .owner_global() + .task_manager() + .networking_task_source() + .into(), } .into_callback(); self.loader_mut() @@ -2326,7 +2333,7 @@ impl Document { } } - let global_scope = self.window.upcast::(); + let global_scope = self.window.as_global_scope(); // Step 10, 14 // https://html.spec.whatwg.org/multipage/#unloading-document-cleanup-steps if !self.salvageable.get() { @@ -2370,7 +2377,7 @@ impl Document { // Step 7. debug!("Document loads are complete."); let document = Trusted::new(self); - self.window() + self.owner_global() .task_manager() .dom_manipulation_task_source() .queue(task!(fire_load_event: move || { @@ -2413,7 +2420,7 @@ impl Document { // Step 8. let document = Trusted::new(self); if document.root().browsing_context().is_some() { - self.window() + self.owner_global() .task_manager() .dom_manipulation_task_source() .queue(task!(fire_pageshow_event: move || { @@ -2464,7 +2471,7 @@ impl Document { // TODO: fully implement "completely loaded". let document = Trusted::new(self); if document.root().browsing_context().is_some() { - self.window() + self.owner_global() .task_manager() .dom_manipulation_task_source() .queue(task!(completely_loaded: move || { @@ -2475,7 +2482,7 @@ impl Document { time }) = &*document.declarative_refresh.borrow() { // https://html.spec.whatwg.org/multipage/#shared-declarative-refresh-steps - document.window.upcast::().schedule_callback( + document.window.as_global_scope().schedule_callback( OneshotTimerCallback::RefreshRedirectDue(RefreshRedirectDue { window: DomRoot::from_ref(document.window()), url: url.clone(), @@ -2632,7 +2639,7 @@ impl Document { // Step 4.1. let document = Trusted::new(self); - self.window() + self.owner_global() .task_manager() .dom_manipulation_task_source() .queue( @@ -2672,9 +2679,8 @@ impl Document { *self.asap_scripts_set.borrow_mut() = vec![]; self.asap_in_order_scripts_list.clear(); self.deferred_scripts.clear(); - let global_scope = self.window.upcast::(); let loads_cancelled = self.loader.borrow_mut().cancel_all_loads(); - let event_sources_canceled = global_scope.close_event_sources(); + let event_sources_canceled = self.window.as_global_scope().close_event_sources(); if loads_cancelled || event_sources_canceled { // If any loads were canceled. self.salvageable.set(false); @@ -2684,7 +2690,7 @@ impl Document { // Note: the spec says to discard any tasks queued for fetch. // This cancels all tasks on the networking task source, which might be too broad. // See https://github.com/whatwg/html/issues/3837 - self.window() + self.owner_global() .task_manager() .cancel_pending_tasks_for_source(TaskSourceName::Networking); @@ -3013,12 +3019,13 @@ impl Document { /// pub(crate) fn deliver_resize_loop_error_notification(&self, can_gc: CanGc) { - let global_scope = self.window.upcast::(); let error_info: ErrorInfo = crate::dom::bindings::error::ErrorInfo { message: "ResizeObserver loop completed with undelivered notifications.".to_string(), ..Default::default() }; - global_scope.report_an_error(error_info, HandleValue::null(), can_gc); + self.window + .as_global_scope() + .report_an_error(error_info, HandleValue::null(), can_gc); } pub(crate) fn status_code(&self) -> Option { @@ -4102,7 +4109,7 @@ impl Document { // > 3. Perform a microtask checkpoint. self.window() - .upcast::() + .as_global_scope() .perform_a_microtask_checkpoint(can_gc); // Steps 4 through 7 occur inside `send_pending_events().` @@ -5003,7 +5010,7 @@ impl DocumentMethods for Document { let (tx, rx) = profile_ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); let _ = self .window - .upcast::() + .as_global_scope() .resource_threads() .send(GetCookiesForUrl(url, tx, NonHTTP)); let cookies = rx.recv().unwrap(); @@ -5028,7 +5035,7 @@ impl DocumentMethods for Document { let _ = self .window - .upcast::() + .as_global_scope() .resource_threads() .send(SetCookiesForUrl(self.url(), cookies, NonHTTP)); Ok(()) @@ -5347,11 +5354,7 @@ impl DocumentMethods for Document { // document.close() methods, and that the tokenizer will wait for an explicit call to // document.close() before emitting an end-of-file token). The encoding confidence is // irrelevant. - let resource_threads = self - .window - .upcast::() - .resource_threads() - .clone(); + let resource_threads = self.window.as_global_scope().resource_threads().clone(); *self.loader.borrow_mut() = DocumentLoader::new_with_threads(resource_threads, Some(self.url())); ServoParser::parse_html_script_input(self, self.url()); @@ -5648,11 +5651,7 @@ impl AnimationFrameCallback { match *self { AnimationFrameCallback::DevtoolsFramerateTick { ref actor_name } => { let msg = ScriptToDevtoolsControlMsg::FramerateTick(actor_name.clone(), now); - let devtools_sender = document - .window() - .upcast::() - .devtools_chan() - .unwrap(); + let devtools_sender = document.window().as_global_scope().devtools_chan().unwrap(); devtools_sender.send(msg).unwrap(); }, AnimationFrameCallback::FrameRequestCallback { ref callback } => { diff --git a/components/script/dom/history.rs b/components/script/dom/history.rs index aa45abdaab0..7ca64bde6f5 100644 --- a/components/script/dom/history.rs +++ b/components/script/dom/history.rs @@ -78,7 +78,7 @@ impl History { let msg = ScriptMsg::TraverseHistory(direction); let _ = self .window - .upcast::() + .as_global_scope() .script_to_constellation_chan() .send(msg); Ok(()) @@ -109,7 +109,7 @@ impl History { let (tx, rx) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); let _ = self .window - .upcast::() + .as_global_scope() .resource_threads() .send(CoreResourceMsg::GetHistoryState(state_id, tx)); rx.recv().unwrap() @@ -124,9 +124,10 @@ impl History { ports: None, blobs: None, }; - let global_scope = self.window.upcast::(); rooted!(in(*GlobalScope::get_cx()) let mut state = UndefinedValue()); - if structuredclone::read(global_scope, data, state.handle_mut()).is_err() { + if structuredclone::read(self.window.as_global_scope(), data, state.handle_mut()) + .is_err() + { warn!("Error reading structuredclone data"); } self.state.set(state.get()); @@ -167,7 +168,7 @@ impl History { pub fn remove_states(&self, states: Vec) { let _ = self .window - .upcast::() + .as_global_scope() .resource_threads() .send(CoreResourceMsg::RemoveHistoryStates(states)); } @@ -240,7 +241,7 @@ impl History { let msg = ScriptMsg::PushHistoryState(state_id, new_url.clone()); let _ = self .window - .upcast::() + .as_global_scope() .script_to_constellation_chan() .send(msg); state_id @@ -257,14 +258,14 @@ impl History { let msg = ScriptMsg::ReplaceHistoryState(state_id, new_url.clone()); let _ = self .window - .upcast::() + .as_global_scope() .script_to_constellation_chan() .send(msg); state_id }, }; - let _ = self.window.upcast::().resource_threads().send( + let _ = self.window.as_global_scope().resource_threads().send( CoreResourceMsg::SetHistoryState(state_id, serialized_data.serialized.clone()), ); @@ -275,9 +276,14 @@ impl History { document.set_url(new_url); // Step 11 - let global_scope = self.window.upcast::(); rooted!(in(*cx) let mut state = UndefinedValue()); - if structuredclone::read(global_scope, serialized_data, state.handle_mut()).is_err() { + if structuredclone::read( + self.window.as_global_scope(), + serialized_data, + state.handle_mut(), + ) + .is_err() + { warn!("Error reading structuredclone data"); } @@ -311,7 +317,7 @@ impl HistoryMethods for History { let msg = ScriptMsg::JointSessionHistoryLength(sender); let _ = self .window - .upcast::() + .as_global_scope() .script_to_constellation_chan() .send(msg); Ok(recv.recv().unwrap()) diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs index 93e53cb7545..3db1022507c 100644 --- a/components/script/dom/htmlcanvaselement.rs +++ b/components/script/dom/htmlcanvaselement.rs @@ -42,7 +42,6 @@ use crate::dom::canvasrenderingcontext2d::{ }; use crate::dom::document::Document; use crate::dom::element::{AttributeMutation, Element, LayoutElementHelpers}; -use crate::dom::globalscope::GlobalScope; #[cfg(not(feature = "webgpu"))] use crate::dom::gpucanvascontext::GPUCanvasContext; use crate::dom::htmlelement::HTMLElement; @@ -197,9 +196,10 @@ impl HTMLCanvasElement { _ => None, }; } + let window = self.owner_window(); let size = self.get_size(); - let context = CanvasRenderingContext2D::new(window.upcast::(), self, size); + let context = CanvasRenderingContext2D::new(window.as_global_scope(), self, size); *self.context.borrow_mut() = Some(CanvasContext::Context2d(Dom::from_ref(&*context))); Some(context) } @@ -271,16 +271,15 @@ impl HTMLCanvasElement { }; } let (sender, receiver) = ipcchan::channel().unwrap(); - let _ = self - .global() + let global_scope = self.owner_global(); + let _ = global_scope .script_to_constellation_chan() .send(ScriptMsg::GetWebGPUChan(sender)); receiver .recv() .expect("Failed to get WebGPU channel") .map(|channel| { - let window = self.owner_window(); - let context = GPUCanvasContext::new(window.upcast::(), self, channel); + let context = GPUCanvasContext::new(&global_scope, self, channel); *self.context.borrow_mut() = Some(CanvasContext::WebGPU(Dom::from_ref(&*context))); context }) diff --git a/components/script/dom/htmldetailselement.rs b/components/script/dom/htmldetailselement.rs index 2eeaf905bbb..f951ef39aa0 100644 --- a/components/script/dom/htmldetailselement.rs +++ b/components/script/dom/htmldetailselement.rs @@ -82,16 +82,16 @@ impl VirtualMethods for HTMLDetailsElement { let counter = self.toggle_counter.get() + 1; self.toggle_counter.set(counter); - let window = self.owner_window(); let this = Trusted::new(self); - window.task_manager().dom_manipulation_task_source().queue( - task!(details_notification_task_steps: move || { + self.owner_global() + .task_manager() + .dom_manipulation_task_source() + .queue(task!(details_notification_task_steps: move || { let this = this.root(); if counter == this.toggle_counter.get() { this.upcast::().fire_event(atom!("toggle"), CanGc::note()); } - }), - ); + })); self.upcast::().dirty(NodeDamage::OtherNodeDamage) } } diff --git a/components/script/dom/htmldialogelement.rs b/components/script/dom/htmldialogelement.rs index 644bce31ea5..70a57749add 100644 --- a/components/script/dom/htmldialogelement.rs +++ b/components/script/dom/htmldialogelement.rs @@ -102,7 +102,6 @@ impl HTMLDialogElementMethods for HTMLDialogElement { fn Close(&self, return_value: Option) { let element = self.upcast::(); let target = self.upcast::(); - let win = self.owner_window(); // Step 1 & 2 if element @@ -120,7 +119,8 @@ impl HTMLDialogElementMethods for HTMLDialogElement { // TODO: Step 4 implement pending dialog stack removal // Step 5 - win.task_manager() + self.owner_global() + .task_manager() .dom_manipulation_task_source() .queue_simple_event(target, atom!("close")); } diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs index 6b1be73957f..3cebb05bab3 100644 --- a/components/script/dom/htmlformelement.rs +++ b/components/script/dom/htmlformelement.rs @@ -57,7 +57,6 @@ use crate::dom::eventtarget::EventTarget; use crate::dom::file::File; use crate::dom::formdata::FormData; use crate::dom::formdataevent::FormDataEvent; -use crate::dom::globalscope::GlobalScope; use crate::dom::htmlbuttonelement::HTMLButtonElement; use crate::dom::htmlcollection::CollectionFilter; use crate::dom::htmldatalistelement::HTMLDataListElement; @@ -856,9 +855,9 @@ impl HTMLFormElement { LoadOrigin::Script(doc.origin().immutable().clone()), action_components, None, - target_window.upcast::().get_referrer(), + target_window.as_global_scope().get_referrer(), target_document.get_referrer_policy(), - Some(target_window.upcast::().is_secure_context()), + Some(target_window.as_global_scope().is_secure_context()), ); // Step 22 @@ -1009,12 +1008,11 @@ impl HTMLFormElement { Some(ref link_types) if link_types.Value().contains("noreferrer") => { Referrer::NoReferrer }, - _ => target.upcast::().get_referrer(), + _ => target.as_global_scope().get_referrer(), }; let referrer_policy = target.Document().get_referrer_policy(); - let pipeline_id = target.upcast::().pipeline_id(); - load_data.creator_pipeline_id = Some(pipeline_id); + load_data.creator_pipeline_id = Some(target.pipeline_id()); load_data.referrer = referrer; load_data.referrer_policy = referrer_policy; @@ -1037,6 +1035,7 @@ impl HTMLFormElement { // Step 3. target + .global() .task_manager() .dom_manipulation_task_source() .queue(task) diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs index 5de8470b568..85da4c1f12f 100644 --- a/components/script/dom/htmliframeelement.rs +++ b/components/script/dom/htmliframeelement.rs @@ -185,9 +185,8 @@ impl HTMLIFrameElement { let new_pipeline_id = PipelineId::new(); self.pending_pipeline_id.set(Some(new_pipeline_id)); - let global_scope = window.upcast::(); let load_info = IFrameLoadInfo { - parent_pipeline_id: global_scope.pipeline_id(), + parent_pipeline_id: window.pipeline_id(), browsing_context_id, top_level_browsing_context_id, new_pipeline_id, @@ -214,13 +213,14 @@ impl HTMLIFrameElement { sandbox: sandboxed, window_size, }; - global_scope + window + .as_global_scope() .script_to_constellation_chan() .send(ScriptMsg::ScriptNewIFrame(load_info)) .unwrap(); let new_layout_info = NewLayoutInfo { - parent_info: Some(global_scope.pipeline_id()), + parent_info: Some(window.pipeline_id()), new_pipeline_id, browsing_context_id, top_level_browsing_context_id, @@ -240,7 +240,8 @@ impl HTMLIFrameElement { sandbox: sandboxed, window_size, }; - global_scope + window + .as_global_scope() .script_to_constellation_chan() .send(ScriptMsg::ScriptLoadedURLInIFrame(load_info)) .unwrap(); @@ -258,14 +259,14 @@ impl HTMLIFrameElement { let url = ServoUrl::parse("about:srcdoc").unwrap(); let document = self.owner_document(); let window = self.owner_window(); - let pipeline_id = Some(window.upcast::().pipeline_id()); + let pipeline_id = Some(window.pipeline_id()); let mut load_data = LoadData::new( LoadOrigin::Script(document.origin().immutable().clone()), url, pipeline_id, - window.upcast::().get_referrer(), + window.as_global_scope().get_referrer(), document.get_referrer_policy(), - Some(window.upcast::().is_secure_context()), + Some(window.as_global_scope().is_secure_context()), ); let element = self.upcast::(); load_data.srcdoc = String::from(element.get_string_attribute(&local_name!("srcdoc"))); @@ -344,7 +345,7 @@ impl HTMLIFrameElement { } let creator_pipeline_id = if url.as_str() == "about:blank" { - Some(window.upcast::().pipeline_id()) + Some(window.pipeline_id()) } else { None }; @@ -353,9 +354,9 @@ impl HTMLIFrameElement { LoadOrigin::Script(document.origin().immutable().clone()), url, creator_pipeline_id, - window.upcast::().get_referrer(), + window.as_global_scope().get_referrer(), referrer_policy, - Some(window.upcast::().is_secure_context()), + Some(window.as_global_scope().is_secure_context()), ); let pipeline_id = self.pipeline_id(); @@ -392,14 +393,14 @@ impl HTMLIFrameElement { let url = ServoUrl::parse("about:blank").unwrap(); let document = self.owner_document(); let window = self.owner_window(); - let pipeline_id = Some(window.upcast::().pipeline_id()); + let pipeline_id = Some(window.pipeline_id()); let load_data = LoadData::new( LoadOrigin::Script(document.origin().immutable().clone()), url, pipeline_id, - window.upcast::().get_referrer(), + window.as_global_scope().get_referrer(), document.get_referrer_policy(), - Some(window.upcast::().is_secure_context()), + Some(window.as_global_scope().is_secure_context()), ); let browsing_context_id = BrowsingContextId::new(); let top_level_browsing_context_id = window.window_proxy().top_level_browsing_context_id(); @@ -777,7 +778,7 @@ impl VirtualMethods for HTMLIFrameElement { let msg = ScriptMsg::RemoveIFrame(browsing_context_id, sender); window - .upcast::() + .as_global_scope() .script_to_constellation_chan() .send(msg) .unwrap(); diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 274faf873f0..ac6a7ae5a7d 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -881,8 +881,9 @@ impl HTMLImageElement { /// Step 8-12 of html.spec.whatwg.org/multipage/#update-the-image-data fn update_the_image_data_sync_steps(&self, can_gc: CanGc) { let document = self.owner_document(); - let window = document.window(); - let task_source = window.task_manager().dom_manipulation_task_source(); + let global = self.owner_global(); + let task_manager = global.task_manager(); + let task_source = task_manager.dom_manipulation_task_source(); let this = Trusted::new(self); let (src, pixel_density) = match self.select_image_source() { // Step 8 @@ -1014,8 +1015,10 @@ impl HTMLImageElement { let this = Trusted::new(self); let src = src.0; - window.task_manager().dom_manipulation_task_source().queue( - task!(image_load_event: move || { + self.owner_global() + .task_manager() + .dom_manipulation_task_source() + .queue(task!(image_load_event: move || { let this = this.root(); { let mut current_request = @@ -1025,8 +1028,7 @@ impl HTMLImageElement { } // TODO: restart animation, if set. this.upcast::().fire_event(atom!("load"), CanGc::note()); - }), - ); + })); return; } } @@ -1062,7 +1064,7 @@ impl HTMLImageElement { let trusted_node = Trusted::new(elem); let (responder_sender, responder_receiver) = ipc::channel().unwrap(); let task_source = elem - .owner_window() + .owner_global() .task_manager() .networking_task_source() .to_sendable(); @@ -1240,9 +1242,8 @@ impl HTMLImageElement { selected_pixel_density: f64, ) { let this = Trusted::new(self); - let window = self.owner_window(); let src = src.0; - window.task_manager().dom_manipulation_task_source().queue( + self.owner_global().task_manager().dom_manipulation_task_source().queue( task!(image_load_event: move || { let this = this.root(); let relevant_mutation = this.generation.get() != generation; diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index f410012d660..cdd4dd850bf 100644 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -286,7 +286,7 @@ impl HTMLInputElement { ) -> HTMLInputElement { let chan = document .window() - .upcast::() + .as_global_scope() .script_to_constellation_chan() .clone(); HTMLInputElement { @@ -1843,7 +1843,7 @@ impl HTMLInputElement { fn select_files(&self, opt_test_paths: Option>, can_gc: CanGc) { let window = self.owner_window(); let origin = get_blob_origin(&window.get_url()); - let resource_threads = window.upcast::().resource_threads(); + let resource_threads = window.as_global_scope().resource_threads(); let mut files: Vec> = vec![]; let mut error = None; @@ -2576,7 +2576,7 @@ impl VirtualMethods for HTMLInputElement { self.input_type().is_textual_or_password() { if event.IsTrusted() { - self.owner_window() + self.owner_global() .task_manager() .user_interaction_task_source() .queue_event( diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index a75d2c7b8dc..100ab754f42 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -523,7 +523,7 @@ impl HTMLMediaElement { fn time_marches_on(&self) { // Step 6. if Instant::now() > self.next_timeupdate_event.get() { - self.owner_window() + self.owner_global() .task_manager() .media_element_task_source() .queue_simple_event(self.upcast(), atom!("timeupdate")); @@ -548,7 +548,7 @@ impl HTMLMediaElement { // Step 2.3. let this = Trusted::new(self); let generation_id = self.generation_id.get(); - self.owner_window() + self.owner_global() .task_manager() .media_element_task_source() .queue(task!(internal_pause_steps: move || { @@ -594,7 +594,7 @@ impl HTMLMediaElement { // Step 2. let this = Trusted::new(self); let generation_id = self.generation_id.get(); - self.owner_window() + self.owner_global() .task_manager() .media_element_task_source() .queue(task!(notify_about_playing: move || { @@ -629,8 +629,8 @@ impl HTMLMediaElement { return; } - let owner_window = self.owner_window(); - let task_manager = owner_window.task_manager(); + let owner_global = self.owner_global(); + let task_manager = owner_global.task_manager(); let task_source = task_manager.media_element_task_source(); // Step 1. @@ -780,7 +780,7 @@ impl HTMLMediaElement { self.network_state.set(NetworkState::Loading); // Step 8. - self.owner_window() + self.owner_global() .task_manager() .media_element_task_source() .queue_simple_event(self.upcast(), atom!("loadstart")); @@ -929,19 +929,16 @@ impl HTMLMediaElement { self.network_state.set(NetworkState::Idle); // Step 4.remote.1.2. - let window = self.owner_window(); - window - .task_manager() - .media_element_task_source() - .queue_simple_event(self.upcast(), atom!("suspend")); + let owner_global = self.owner_global(); + let task_manager = owner_global.task_manager(); + let task_source = task_manager.media_element_task_source(); + task_source.queue_simple_event(self.upcast(), atom!("suspend")); // Step 4.remote.1.3. let this = Trusted::new(self); - window.task_manager().media_element_task_source().queue( - task!(set_media_delay_load_event_flag_to_false: move || { - this.root().delay_load_event(false, CanGc::note()); - }), - ); + task_source.queue(task!(set_media_delay_load_event_flag_to_false: move || { + this.root().delay_load_event(false, CanGc::note()); + })); // Steps 4.remote.1.4. // FIXME(nox): Somehow we should wait for the task from previous @@ -997,7 +994,7 @@ impl HTMLMediaElement { let this = Trusted::new(self); let generation_id = self.generation_id.get(); self.take_pending_play_promises(Err(Error::NotSupported)); - self.owner_window() + self.owner_global() .task_manager() .media_element_task_source() .queue(task!(dedicated_media_source_failure_steps: move || { @@ -1043,7 +1040,7 @@ impl HTMLMediaElement { } fn queue_ratechange_event(&self) { - self.owner_window() + self.owner_global() .task_manager() .media_element_task_source() .queue_simple_event(self.upcast(), atom!("ratechange")); @@ -1096,8 +1093,8 @@ impl HTMLMediaElement { self.fulfill_in_flight_play_promises(|| ()); } - let window = self.owner_window(); - let task_manager = window.task_manager(); + let global = self.owner_global(); + let task_manager = global.task_manager(); let task_source = task_manager.media_element_task_source(); // Step 5. @@ -1278,7 +1275,7 @@ impl HTMLMediaElement { // servo-media with gstreamer does not support inaccurate seeking for now. // Step 10. - self.owner_window() + self.owner_global() .task_manager() .media_element_task_source() .queue_simple_event(self.upcast(), atom!("seeking")); @@ -1304,16 +1301,13 @@ impl HTMLMediaElement { self.time_marches_on(); // Step 16. - let window = self.owner_window(); - let task_manager = window.task_manager(); - task_manager - .media_element_task_source() - .queue_simple_event(self.upcast(), atom!("timeupdate")); + let global = self.owner_global(); + let task_manager = global.task_manager(); + let task_source = task_manager.media_element_task_source(); + task_source.queue_simple_event(self.upcast(), atom!("timeupdate")); // Step 17. - task_manager - .media_element_task_source() - .queue_simple_event(self.upcast(), atom!("seeked")); + task_source.queue_simple_event(self.upcast(), atom!("seeked")); } /// @@ -1331,7 +1325,7 @@ impl HTMLMediaElement { self.upcast::().dirty(NodeDamage::OtherNodeDamage); if pref!(media.testing.enabled) { - self.owner_window() + self.owner_global() .task_manager() .media_element_task_source() .queue_simple_event(self.upcast(), atom!("postershown")); @@ -1378,7 +1372,8 @@ impl HTMLMediaElement { *self.player.borrow_mut() = Some(player); let trusted_node = Trusted::new(self); - let task_source = window + let task_source = self + .owner_global() .task_manager() .media_element_task_source() .to_sendable(); @@ -1417,7 +1412,8 @@ impl HTMLMediaElement { if let Some(image_receiver) = image_receiver { let trusted_node = Trusted::new(self); - let task_source = window + let task_source = self + .owner_global() .task_manager() .media_element_task_source() .to_sendable(); @@ -1500,7 +1496,7 @@ impl HTMLMediaElement { // Step 3. let this = Trusted::new(self); - self.owner_window().task_manager().media_element_task_source().queue( + self.owner_global().task_manager().media_element_task_source().queue( task!(reaches_the_end_steps: move || { let this = this.root(); // Step 3.1. @@ -1531,7 +1527,7 @@ impl HTMLMediaElement { PlaybackDirection::Backwards => { if self.playback_position.get() <= self.earliest_possible_position() { - self.owner_window() + self.owner_global() .task_manager() .media_element_task_source() .queue_simple_event(self.upcast(), atom!("ended")); @@ -1718,7 +1714,7 @@ impl HTMLMediaElement { self.duration.set(f64::INFINITY); } if previous_duration != self.duration.get() { - self.owner_window() + self.owner_global() .task_manager() .media_element_task_source() .queue_simple_event(self.upcast(), atom!("durationchange")); @@ -2112,7 +2108,7 @@ impl HTMLMediaElementMethods for HTMLMediaElement { } self.muted.set(value); - self.owner_window() + self.owner_global() .task_manager() .media_element_task_source() .queue_simple_event(self.upcast(), atom!("volumechange")); @@ -2210,8 +2206,8 @@ impl HTMLMediaElementMethods for HTMLMediaElement { let state = self.ready_state.get(); - let owner_window = self.owner_window(); - let task_manager = owner_window.task_manager(); + let global = self.owner_global(); + let task_manager = global.task_manager(); let task_source = task_manager.media_element_task_source(); if self.Paused() { // Step 6.1. @@ -2454,7 +2450,7 @@ impl HTMLMediaElementMethods for HTMLMediaElement { if *value != self.volume.get() { self.volume.set(*value); - self.owner_window() + self.owner_global() .task_manager() .media_element_task_source() .queue_simple_event(self.upcast(), atom!("volumechange")); @@ -2784,7 +2780,7 @@ impl FetchResponseListener for HTMLMediaElementFetchListener { // https://html.spec.whatwg.org/multipage/#concept-media-load-resource step 4, // => "If mode is remote" step 2 if Instant::now() > self.next_progress_event { - elem.owner_window() + elem.owner_global() .task_manager() .media_element_task_source() .queue_simple_event(elem.upcast(), atom!("progress")); diff --git a/components/script/dom/htmlmetaelement.rs b/components/script/dom/htmlmetaelement.rs index fa298907430..12f518def07 100644 --- a/components/script/dom/htmlmetaelement.rs +++ b/components/script/dom/htmlmetaelement.rs @@ -23,7 +23,6 @@ use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::document::{DeclarativeRefresh, Document}; use crate::dom::element::{AttributeMutation, Element}; -use crate::dom::globalscope::GlobalScope; use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlheadelement::HTMLHeadElement; use crate::dom::location::NavigationType; @@ -207,7 +206,7 @@ impl HTMLMetaElement { if document.completely_loaded() { // TODO: handle active sandboxing flag let window = self.owner_window(); - window.upcast::().schedule_callback( + window.as_global_scope().schedule_callback( OneshotTimerCallback::RefreshRedirectDue(RefreshRedirectDue { window: window.clone(), url: url_record, diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index a8d1e976c38..bb9f68ac8d9 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -474,7 +474,7 @@ impl FetchResponseListener for ClassicContext { script_kind: self.kind, final_url, url: self.url.clone(), - task_source: global.task_manager().dom_manipulation_task_source(), + task_source: elem.owner_global().task_manager().dom_manipulation_task_source(), script_text: source_string, fetch_options: self.fetch_options.clone(), }); @@ -997,16 +997,17 @@ impl HTMLScriptElement { self.line_number as u32 }; rooted!(in(*GlobalScope::get_cx()) let mut rval = UndefinedValue()); - let global = window.upcast::(); - global.evaluate_script_on_global_with_result( - &script.code, - script.url.as_str(), - rval.handle_mut(), - line_number, - script.fetch_options.clone(), - script.url.clone(), - can_gc, - ); + window + .as_global_scope() + .evaluate_script_on_global_with_result( + &script.code, + script.url.as_str(), + rval.handle_mut(), + line_number, + script.fetch_options.clone(), + script.url.clone(), + can_gc, + ); } #[allow(unsafe_code)] @@ -1021,7 +1022,7 @@ impl HTMLScriptElement { // Step 4 let window = self.owner_window(); - let global = window.upcast::(); + let global = window.as_global_scope(); let _aes = AutoEntryScript::new(global); let tree = if script.external { @@ -1065,7 +1066,7 @@ impl HTMLScriptElement { } pub fn queue_error_event(&self) { - self.owner_window() + self.owner_global() .task_manager() .dom_manipulation_task_source() .queue_simple_event(self.upcast(), atom!("error")); diff --git a/components/script/dom/htmlstyleelement.rs b/components/script/dom/htmlstyleelement.rs index 247fc77a341..0abfa43a877 100644 --- a/components/script/dom/htmlstyleelement.rs +++ b/components/script/dom/htmlstyleelement.rs @@ -133,7 +133,7 @@ impl HTMLStyleElement { // No subresource loads were triggered, queue load event if self.pending_loads.get() == 0 { - self.owner_window() + self.owner_global() .task_manager() .dom_manipulation_task_source() .queue_simple_event(self.upcast(), atom!("load")); diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index b8275115afd..9ec1fb19936 100644 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -27,7 +27,6 @@ use crate::dom::compositionevent::CompositionEvent; use crate::dom::document::Document; use crate::dom::element::{AttributeMutation, Element, LayoutElementHelpers}; use crate::dom::event::{Event, EventBubbles, EventCancelable}; -use crate::dom::globalscope::GlobalScope; use crate::dom::htmlelement::HTMLElement; use crate::dom::htmlfieldsetelement::HTMLFieldSetElement; use crate::dom::htmlformelement::{FormControl, HTMLFormElement}; @@ -143,7 +142,7 @@ impl HTMLTextAreaElement { ) -> HTMLTextAreaElement { let chan = document .window() - .upcast::() + .as_global_scope() .script_to_constellation_chan() .clone(); HTMLTextAreaElement { @@ -650,7 +649,7 @@ impl VirtualMethods for HTMLTextAreaElement { } } else if event.type_() == atom!("keypress") && !event.DefaultPrevented() { if event.IsTrusted() { - self.owner_window() + self.owner_global() .task_manager() .user_interaction_task_source() .queue_event( diff --git a/components/script/dom/htmlvideoelement.rs b/components/script/dom/htmlvideoelement.rs index 66057d8d1bc..3884436cdaa 100644 --- a/components/script/dom/htmlvideoelement.rs +++ b/components/script/dom/htmlvideoelement.rs @@ -125,7 +125,7 @@ impl HTMLVideoElement { let sent_resize = if self.htmlmediaelement.get_ready_state() == ReadyState::HaveNothing { None } else { - self.owner_window() + self.owner_global() .task_manager() .media_element_task_source() .queue_simple_event(self.upcast(), atom!("resize")); diff --git a/components/script/dom/mediaquerylistevent.rs b/components/script/dom/mediaquerylistevent.rs index d810ea594d0..1de38417b1b 100644 --- a/components/script/dom/mediaquerylistevent.rs +++ b/components/script/dom/mediaquerylistevent.rs @@ -89,9 +89,8 @@ impl MediaQueryListEventMethods for MediaQueryListEvent { type_: DOMString, init: &MediaQueryListEventInit, ) -> Fallible> { - let global = window.upcast::(); Ok(MediaQueryListEvent::new_with_proto( - global, + window.as_global_scope(), proto, Atom::from(type_), init.parent.bubbles, diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 7cb3cacd2ac..9ae38955a57 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -45,6 +45,7 @@ use style::stylesheets::{Stylesheet, UrlExtraData}; use uuid::Uuid; use xml5ever::serialize as xml_serialize; +use super::globalscope::GlobalScope; use crate::document_loader::DocumentLoader; use crate::dom::attr::Attr; use crate::dom::bindings::cell::{DomRefCell, Ref, RefMut}; @@ -3346,6 +3347,10 @@ pub(crate) trait NodeTraits { /// differ from the [`Document`] that the node was created in if it was adopted by a /// different [`Document`] (the owner). fn owner_window(&self) -> DomRoot; + /// Get the [`GlobalScope`] of the [`Document`] that owns this node. Note that this may + /// differ from the [`GlobalScope`] that the node was created in if it was adopted by a + /// different [`Document`] (the owner). + fn owner_global(&self) -> DomRoot; /// If this [`Node`] is contained in a [`ShadowRoot`] return it, otherwise `None`. fn containing_shadow_root(&self) -> Option>; /// Get the stylesheet owner for this node: either the [`Document`] or the [`ShadowRoot`] @@ -3363,6 +3368,10 @@ impl + DomObject> NodeTraits for T { DomRoot::from_ref(self.owner_document().window()) } + fn owner_global(&self) -> DomRoot { + DomRoot::from_ref(self.owner_window().upcast()) + } + fn containing_shadow_root(&self) -> Option> { Node::containing_shadow_root(self.upcast()) } diff --git a/components/script/dom/selection.rs b/components/script/dom/selection.rs index c04bcd021a6..98b6be67059 100644 --- a/components/script/dom/selection.rs +++ b/components/script/dom/selection.rs @@ -17,7 +17,7 @@ use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom}; use crate::dom::bindings::str::DOMString; use crate::dom::document::Document; use crate::dom::eventtarget::EventTarget; -use crate::dom::node::Node; +use crate::dom::node::{Node, NodeTraits}; use crate::dom::range::Range; use crate::script_runtime::CanGc; @@ -89,7 +89,7 @@ impl Selection { } let this = Trusted::new(self); self.document - .window() + .owner_global() .task_manager() .user_interaction_task_source() // w3c/selection-api#117 .queue( diff --git a/components/script/dom/servoparser/mod.rs b/components/script/dom/servoparser/mod.rs index f10a26bd9ad..bc51413f5f3 100644 --- a/components/script/dom/servoparser/mod.rs +++ b/components/script/dom/servoparser/mod.rs @@ -55,7 +55,6 @@ use crate::dom::comment::Comment; use crate::dom::document::{Document, DocumentSource, HasBrowsingContext, IsHTMLDocument}; use crate::dom::documenttype::DocumentType; use crate::dom::element::{CustomElementCreationMode, Element, ElementCreator}; -use crate::dom::globalscope::GlobalScope; use crate::dom::htmlformelement::{FormControlElementHelpers, HTMLFormElement}; use crate::dom::htmlimageelement::HTMLImageElement; use crate::dom::htmlinputelement::HTMLInputElement; @@ -366,7 +365,7 @@ impl ServoParser { let profiler_chan = self .document .window() - .upcast::() + .as_global_scope() .time_profiler_chan() .clone(); let profiler_metadata = TimerMetadata { @@ -564,7 +563,7 @@ impl ServoParser { let profiler_chan = self .document .window() - .upcast::() + .as_global_scope() .time_profiler_chan() .clone(); let profiler_metadata = TimerMetadata { @@ -637,7 +636,7 @@ impl ServoParser { if is_execution_stack_empty() { self.document .window() - .upcast::() + .as_global_scope() .perform_a_microtask_checkpoint(can_gc); } @@ -1401,7 +1400,7 @@ fn create_element_for_token( if is_execution_stack_empty() { document .window() - .upcast::() + .as_global_scope() .perform_a_microtask_checkpoint(can_gc); } // Step 6.3 diff --git a/components/script/dom/textcontrol.rs b/components/script/dom/textcontrol.rs index 6fab849a17c..313832d1471 100644 --- a/components/script/dom/textcontrol.rs +++ b/components/script/dom/textcontrol.rs @@ -301,7 +301,7 @@ impl<'a, E: TextControlElement> TextControlSelection<'a, E> { // Step 6 if textinput.selection_state() != original_selection_state { self.element - .owner_window() + .owner_global() .task_manager() .user_interaction_task_source() .queue_event( diff --git a/components/script/dom/userscripts.rs b/components/script/dom/userscripts.rs index 781616a669c..ff92ed84d15 100644 --- a/components/script/dom/userscripts.rs +++ b/components/script/dom/userscripts.rs @@ -9,10 +9,8 @@ use std::rc::Rc; use js::jsval::UndefinedValue; -use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::refcounted::Trusted; use crate::dom::bindings::str::DOMString; -use crate::dom::globalscope::GlobalScope; use crate::dom::htmlheadelement::HTMLHeadElement; use crate::dom::htmlscriptelement::SourceCode; use crate::dom::node::NodeTraits; @@ -25,9 +23,9 @@ pub fn load_script(head: &HTMLHeadElement) { Some(p) => p, None => return, }; - let win = Trusted::new(doc.window()); + let window = Trusted::new(doc.window()); doc.add_delayed_task(task!(UserScriptExecute: move || { - let win = win.root(); + let win = window.root(); let cx = win.get_cx(); rooted!(in(*cx) let mut rval = UndefinedValue()); @@ -47,14 +45,15 @@ pub fn load_script(head: &HTMLHeadElement) { let script_text = SourceCode::Text( Rc::new(DOMString::from_string(String::from_utf8_lossy(&contents).to_string())) ); - let global = win.upcast::(); - global.evaluate_script_on_global_with_result( + + let global_scope = win.as_global_scope(); + global_scope.evaluate_script_on_global_with_result( &script_text, &file.to_string_lossy(), rval.handle_mut(), 1, - ScriptFetchOptions::default_classic_script(global), - global.api_base_url(), + ScriptFetchOptions::default_classic_script(global_scope), + global_scope.api_base_url(), CanGc::note(), ); } diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 06df94b187d..f1b958ff88d 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -155,7 +155,6 @@ use crate::microtask::MicrotaskQueue; use crate::realms::{enter_realm, InRealm}; use crate::script_runtime::{CanGc, JSContext, Runtime, ScriptChan, ScriptPort}; use crate::script_thread::ScriptThread; -use crate::task_manager::TaskManager; use crate::timers::{IsInterval, TimerCallback}; use crate::unminify::unminified_path; use crate::webdriver_handlers::jsval_to_webdriver; @@ -384,6 +383,10 @@ pub struct Window { } impl Window { + pub(crate) fn as_global_scope(&self) -> &GlobalScope { + self.upcast::() + } + pub fn layout(&self) -> Ref> { self.layout.borrow() } @@ -402,13 +405,14 @@ impl Window { #[allow(unsafe_code)] pub fn clear_js_runtime_for_script_deallocation(&self) { - self.upcast::() + self.as_global_scope() .remove_web_messaging_and_dedicated_workers_infra(); unsafe { *self.js_runtime.borrow_for_script_deallocation() = None; self.window_proxy.set(None); self.current_state.set(WindowState::Zombie); - self.task_manager() + self.as_global_scope() + .task_manager() .cancel_all_tasks_and_ignore_future_tasks(); } } @@ -424,7 +428,8 @@ impl Window { // Step 4 of https://html.spec.whatwg.org/multipage/#discard-a-document // Other steps performed when the `PipelineExit` message // is handled by the ScriptThread. - self.task_manager() + self.as_global_scope() + .task_manager() .cancel_all_tasks_and_ignore_future_tasks(); } @@ -562,10 +567,6 @@ impl Window { pub fn dispatch_event_with_target_override(&self, event: &Event, can_gc: CanGc) -> EventStatus { event.dispatch(self.upcast(), true, can_gc) } - - pub(crate) fn task_manager(&self) -> &TaskManager { - self.upcast::().task_manager() - } } // https://html.spec.whatwg.org/multipage/#atob @@ -819,7 +820,7 @@ impl WindowMethods for Window { window.send_to_constellation(ScriptMsg::DiscardTopLevelBrowsingContext); } }); - self.global() + self.as_global_scope() .task_manager() .dom_manipulation_task_source() .queue(task); @@ -864,7 +865,7 @@ impl WindowMethods for Window { // https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#dfn-GlobalCrypto fn Crypto(&self) -> DomRoot { - self.upcast::().crypto() + self.as_global_scope().crypto() } // https://html.spec.whatwg.org/multipage/#dom-frameelement @@ -908,7 +909,7 @@ impl WindowMethods for Window { StringOrFunction::String(i) => TimerCallback::StringTimerCallback(i), StringOrFunction::Function(i) => TimerCallback::FunctionTimerCallback(i), }; - self.upcast::().set_timeout_or_interval( + self.as_global_scope().set_timeout_or_interval( callback, args, Duration::from_millis(timeout.max(0) as u64), @@ -918,8 +919,7 @@ impl WindowMethods for Window { // https://html.spec.whatwg.org/multipage/#dom-windowtimers-cleartimeout fn ClearTimeout(&self, handle: i32) { - self.upcast::() - .clear_timeout_or_interval(handle); + self.as_global_scope().clear_timeout_or_interval(handle); } // https://html.spec.whatwg.org/multipage/#dom-windowtimers-setinterval @@ -934,7 +934,7 @@ impl WindowMethods for Window { StringOrFunction::String(i) => TimerCallback::StringTimerCallback(i), StringOrFunction::Function(i) => TimerCallback::FunctionTimerCallback(i), }; - self.upcast::().set_timeout_or_interval( + self.as_global_scope().set_timeout_or_interval( callback, args, Duration::from_millis(timeout.max(0) as u64), @@ -949,8 +949,7 @@ impl WindowMethods for Window { // https://html.spec.whatwg.org/multipage/#dom-queuemicrotask fn QueueMicrotask(&self, callback: Rc) { - self.upcast::() - .queue_function_as_microtask(callback); + self.as_global_scope().queue_function_as_microtask(callback); } // https://html.spec.whatwg.org/multipage/#dom-createimagebitmap @@ -961,7 +960,7 @@ impl WindowMethods for Window { can_gc: CanGc, ) -> Rc { let p = self - .upcast::() + .as_global_scope() .create_image_bitmap(image, options, can_gc); p } @@ -1011,10 +1010,8 @@ impl WindowMethods for Window { // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/ // NavigationTiming/Overview.html#sec-window.performance-attribute fn Performance(&self) -> DomRoot { - self.performance.or_init(|| { - let global_scope = self.upcast::(); - Performance::new(global_scope, self.navigation_start.get()) - }) + self.performance + .or_init(|| Performance::new(self.as_global_scope(), self.navigation_start.get())) } // https://html.spec.whatwg.org/multipage/#globaleventhandlers @@ -1415,7 +1412,7 @@ impl WindowMethods for Window { } fn IsSecureContext(&self) -> bool { - self.upcast::().is_secure_context() + self.as_global_scope().is_secure_context() } // https://html.spec.whatwg.org/multipage/#named-access-on-the-window-object @@ -1587,7 +1584,7 @@ impl WindowMethods for Window { options: RootedTraceableBox, retval: MutableHandleValue, ) -> Fallible<()> { - self.upcast::() + self.as_global_scope() .structured_clone(cx, value, options, retval) } } @@ -1652,7 +1649,7 @@ impl Window { } pub fn clear_js_runtime(&self) { - self.upcast::() + self.as_global_scope() .remove_web_messaging_and_dedicated_workers_infra(); // Clean up any active promises @@ -1681,7 +1678,7 @@ impl Window { // If this is the currently active pipeline, // nullify the window_proxy. if let Some(proxy) = self.window_proxy.get() { - let pipeline_id = self.upcast::().pipeline_id(); + let pipeline_id = self.pipeline_id(); if let Some(currently_active) = proxy.currently_active() { if currently_active == pipeline_id { self.window_proxy.set(None); @@ -1692,7 +1689,8 @@ impl Window { if let Some(performance) = self.performance.get() { performance.clear_and_disable_performance_entry_buffer(); } - self.task_manager() + self.as_global_scope() + .task_manager() .cancel_all_tasks_and_ignore_future_tasks(); } @@ -1733,7 +1731,7 @@ impl Window { self.perform_a_scroll( x, y, - self.upcast::().pipeline_id().root_scroll_id(), + self.pipeline_id().root_scroll_id(), behavior, None, can_gc, @@ -1791,10 +1789,9 @@ impl Window { /// layout animation clock. #[allow(unsafe_code)] pub fn advance_animation_clock(&self, delta_ms: i32) { - let pipeline_id = self.upcast::().pipeline_id(); self.Document() .advance_animation_timeline_for_testing(delta_ms as f64 / 1000.); - ScriptThread::handle_tick_all_animations_for_testing(pipeline_id); + ScriptThread::handle_tick_all_animations_for_testing(self.pipeline_id()); } /// Reflows the page unconditionally if possible and not suppressed. This method will wait for @@ -1818,7 +1815,7 @@ impl Window { // layouts (for queries and scrolling) are not blocked, as they do not display // anything and script excpects the layout to be up-to-date after they run. let layout_blocked = self.layout_blocker.get().layout_blocked(); - let pipeline_id = self.upcast::().pipeline_id(); + let pipeline_id = self.pipeline_id(); if reflow_goal == ReflowGoal::UpdateTheRendering && layout_blocked { debug!("Suppressing pre-load-event reflow pipeline {pipeline_id}"); return false; @@ -2339,7 +2336,8 @@ impl Window { CanGc::note()); event.upcast::().fire(this.upcast::(), CanGc::note()); }); - self.task_manager() + self.as_global_scope() + .task_manager() .dom_manipulation_task_source() .queue(task); doc.set_url(load_data.url.clone()); @@ -2347,9 +2345,8 @@ impl Window { } } - let pipeline_id = self.upcast::().pipeline_id(); - // Step 4 and 5 + let pipeline_id = self.pipeline_id(); let window_proxy = self.window_proxy(); if let Some(active) = window_proxy.currently_active() { if pipeline_id == active && doc.is_prompting_or_unloading() { @@ -2476,7 +2473,7 @@ impl Window { pub fn suspend(&self) { // Suspend timer events. - self.upcast::().suspend(); + self.as_global_scope().suspend(); // Set the window proxy to be a cross-origin window. if self.window_proxy().currently_active() == Some(self.global().pipeline_id()) { @@ -2492,7 +2489,7 @@ impl Window { pub fn resume(&self) { // Resume timer events. - self.upcast::().resume(); + self.as_global_scope().resume(); // Set the window proxy to be this object. self.window_proxy().set_currently_active(self); @@ -2620,9 +2617,9 @@ impl Window { pub fn set_throttled(&self, throttled: bool) { self.throttled.set(throttled); if throttled { - self.upcast::().slow_down_timers(); + self.as_global_scope().slow_down_timers(); } else { - self.upcast::().speed_up_timers(); + self.as_global_scope().speed_up_timers(); } } @@ -2647,7 +2644,7 @@ impl Window { } pub fn send_to_constellation(&self, msg: ScriptMsg) { - self.upcast::() + self.as_global_scope() .script_to_constellation_chan() .send(msg) .unwrap(); @@ -2807,8 +2804,8 @@ impl Window { Box::new(self.script_chan.clone()) } - pub fn pipeline_id(&self) -> PipelineId { - self.upcast::().pipeline_id() + pub(crate) fn pipeline_id(&self) -> PipelineId { + self.as_global_scope().pipeline_id() } /// Create a new cached instance of the given value. @@ -2951,7 +2948,8 @@ impl Window { } }); // TODO(#12718): Use the "posted message task source". - self.task_manager() + self.as_global_scope() + .task_manager() .dom_manipulation_task_source() .queue(task); } diff --git a/components/script/dom/windowproxy.rs b/components/script/dom/windowproxy.rs index 02944715696..7637227ac74 100644 --- a/components/script/dom/windowproxy.rs +++ b/components/script/dom/windowproxy.rs @@ -512,12 +512,12 @@ impl WindowProxy { let referrer = if noreferrer { Referrer::NoReferrer } else { - target_window.upcast::().get_referrer() + target_window.as_global_scope().get_referrer() }; // Step 14.5 let referrer_policy = target_document.get_referrer_policy(); - let pipeline_id = target_window.upcast::().pipeline_id(); - let secure = target_window.upcast::().is_secure_context(); + let pipeline_id = target_window.pipeline_id(); + let secure = target_window.as_global_scope().is_secure_context(); let load_data = LoadData::new( LoadOrigin::Script(existing_document.origin().immutable().clone()), url, @@ -675,17 +675,17 @@ impl WindowProxy { } pub fn set_currently_active(&self, window: &Window) { - let globalscope = window.upcast::(); - let dest_pipeline_id = globalscope.pipeline_id(); if let Some(pipeline_id) = self.currently_active() { - if pipeline_id == dest_pipeline_id { + if pipeline_id == window.pipeline_id() { return debug!( "Attempt to set the currently active window to the currently active window." ); } } - self.set_window(globalscope, WindowProxyHandler::proxy_handler()); - self.currently_active.set(Some(globalscope.pipeline_id())); + + let global_scope = window.as_global_scope(); + self.set_window(global_scope, WindowProxyHandler::proxy_handler()); + self.currently_active.set(Some(global_scope.pipeline_id())); } pub fn unset_currently_active(&self) { @@ -867,14 +867,13 @@ unsafe fn GetSubframeWindowProxy( let browsing_context_id = win.window_proxy().browsing_context_id(); let (result_sender, result_receiver) = ipc::channel().unwrap(); - let _ = win - .upcast::() - .script_to_constellation_chan() - .send(ScriptMsg::GetChildBrowsingContextId( + let _ = win.as_global_scope().script_to_constellation_chan().send( + ScriptMsg::GetChildBrowsingContextId( browsing_context_id, index as usize, result_sender, - )); + ), + ); return result_receiver .recv() .ok() diff --git a/components/script/dom/worklet.rs b/components/script/dom/worklet.rs index 63847797e68..b8947fe24ac 100644 --- a/components/script/dom/worklet.rs +++ b/components/script/dom/worklet.rs @@ -145,17 +145,16 @@ impl WorkletMethods for Worklet { // Steps 6-12 in parallel. let pending_tasks_struct = PendingTasksStruct::new(); - let global = self.window.upcast::(); self.droppable_field .thread_pool .get_or_init(ScriptThread::worklet_thread_pool) .fetch_and_invoke_a_worklet_script( - global.pipeline_id(), + self.window.pipeline_id(), self.droppable_field.worklet_id, self.global_type, self.window.origin().immutable().clone(), - global.api_base_url(), + self.window.as_global_scope().api_base_url(), module_url_record, options.credentials, pending_tasks_struct, diff --git a/components/script/image_listener.rs b/components/script/image_listener.rs index 5471452faa3..5b6fb756c6e 100644 --- a/components/script/image_listener.rs +++ b/components/script/image_listener.rs @@ -27,7 +27,7 @@ pub fn generate_cache_listener_for_element< let (responder_sender, responder_receiver) = ipc::channel().unwrap(); let task_source = elem - .owner_window() + .owner_global() .task_manager() .networking_task_source() .to_sendable(); diff --git a/components/script/links.rs b/components/script/links.rs index a7d62b810fc..cff1a1ebaa2 100644 --- a/components/script/links.rs +++ b/components/script/links.rs @@ -20,7 +20,7 @@ use crate::dom::htmlareaelement::HTMLAreaElement; use crate::dom::htmlformelement::HTMLFormElement; use crate::dom::htmllinkelement::HTMLLinkElement; use crate::dom::node::NodeTraits; -use crate::dom::types::{Element, GlobalScope}; +use crate::dom::types::Element; use crate::script_runtime::CanGc; bitflags::bitflags! { @@ -412,12 +412,12 @@ pub fn follow_hyperlink( let referrer = if relations.contains(LinkRelations::NO_REFERRER) { Referrer::NoReferrer } else { - target_window.upcast::().get_referrer() + target_window.as_global_scope().get_referrer() }; // Step 14 - let pipeline_id = target_window.upcast::().pipeline_id(); - let secure = target_window.upcast::().is_secure_context(); + let pipeline_id = target_window.as_global_scope().pipeline_id(); + let secure = target_window.as_global_scope().is_secure_context(); let load_data = LoadData::new( LoadOrigin::Script(document.origin().immutable().clone()), url, @@ -431,7 +431,8 @@ pub fn follow_hyperlink( debug!("following hyperlink to {}", load_data.url); target.root().load_url(history_handling, false, load_data, CanGc::note()); }); - target_window + target_document + .owner_global() .task_manager() .dom_manipulation_task_source() .queue(task); diff --git a/components/script/script_module.rs b/components/script/script_module.rs index 065daefa42b..44a7b6ed7bf 100644 --- a/components/script/script_module.rs +++ b/components/script/script_module.rs @@ -942,7 +942,7 @@ pub(crate) enum ModuleOwner { } impl ModuleOwner { - pub fn global(&self) -> DomRoot { + pub(crate) fn global(&self) -> DomRoot { match &self { ModuleOwner::Worker(worker) => (*worker.root().clone()).global(), ModuleOwner::Window(script) => (*script.root()).global(), diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 00d2ef64f0c..5b0c201764a 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -671,7 +671,7 @@ impl ScriptThread { None => return, Some(window) => window, }; - let global = window.upcast::(); + let global = window.as_global_scope(); let trusted_global = Trusted::new(global); let sender = script_thread .senders @@ -1033,7 +1033,7 @@ impl ScriptThread { let docs = self.documents.borrow(); for (_, document) in docs.iter() { document - .window() + .owner_global() .task_manager() .cancel_all_tasks_and_ignore_future_tasks(); } @@ -1218,8 +1218,7 @@ impl ScriptThread { }, CompositorEvent::GamepadEvent(gamepad_event) => { - let global = window.upcast::(); - global.handle_gamepad_event(gamepad_event); + window.as_global_scope().handle_gamepad_event(gamepad_event); }, } } @@ -1410,7 +1409,7 @@ impl ScriptThread { // rendering update when animations are not running. let _realm = enter_realm(&*document); document - .window() + .owner_global() .task_manager() .rendering_task_source() .queue_unconditionally(task!(update_the_rendering: move || { })); @@ -2098,7 +2097,7 @@ impl ScriptThread { match msg { DevtoolScriptControlMsg::EvaluateJS(id, s, reply) => match documents.find_window(id) { Some(window) => { - let global = window.upcast::(); + let global = window.as_global_scope(); let _aes = AutoEntryScript::new(global); devtools::handle_evaluate_js(global, s, reply, can_gc) }, @@ -3697,11 +3696,8 @@ impl ScriptThread { ) { let window = self.documents.borrow().find_window(pipeline_id); if let Some(window) = window { - let entry = PerformancePaintTiming::new( - window.upcast::(), - metric_type, - metric_value, - ); + let entry = + PerformancePaintTiming::new(window.as_global_scope(), metric_type, metric_value); window .Performance() .queue_entry(entry.upcast::(), can_gc); diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index c1795a51f74..45c1cc153db 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -331,7 +331,7 @@ pub fn handle_execute_script( let result = unsafe { let cx = window.get_cx(); rooted!(in(*cx) let mut rval = UndefinedValue()); - let global = window.upcast::(); + let global = window.as_global_scope(); global.evaluate_js_on_global_with_result( &eval, rval.handle_mut(), @@ -339,7 +339,7 @@ pub fn handle_execute_script( global.api_base_url(), can_gc, ); - jsval_to_webdriver(*cx, window.upcast::(), rval.handle()) + jsval_to_webdriver(*cx, global, rval.handle()) }; reply.send(result).unwrap(); @@ -363,12 +363,13 @@ pub fn handle_execute_async_script( let cx = window.get_cx(); window.set_webdriver_script_chan(Some(reply)); rooted!(in(*cx) let mut rval = UndefinedValue()); - let global = window.upcast::(); - global.evaluate_js_on_global_with_result( + + let global_scope = window.as_global_scope(); + global_scope.evaluate_js_on_global_with_result( &eval, rval.handle_mut(), - ScriptFetchOptions::default_classic_script(global), - global.api_base_url(), + ScriptFetchOptions::default_classic_script(global_scope), + global_scope.api_base_url(), can_gc, ); }, @@ -792,7 +793,7 @@ pub fn handle_get_cookies( let (sender, receiver) = ipc::channel().unwrap(); let _ = document .window() - .upcast::() + .as_global_scope() .resource_threads() .send(GetCookiesDataForUrl(url, sender, NonHTTP)); receiver.recv().unwrap() @@ -819,7 +820,7 @@ pub fn handle_get_cookie( let (sender, receiver) = ipc::channel().unwrap(); let _ = document .window() - .upcast::() + .as_global_scope() .resource_threads() .send(GetCookiesDataForUrl(url, sender, NonHTTP)); let cookies = receiver.recv().unwrap(); @@ -864,7 +865,7 @@ pub fn handle_add_cookie( (false, Some(ref domain)) if url.host_str().map(|x| x == domain).unwrap_or(false) => { let _ = document .window() - .upcast::() + .as_global_scope() .resource_threads() .send(SetCookieForUrl(url, Serde(cookie), method)); Ok(()) @@ -872,7 +873,7 @@ pub fn handle_add_cookie( (false, None) => { let _ = document .window() - .upcast::() + .as_global_scope() .resource_threads() .send(SetCookieForUrl(url, Serde(cookie), method)); Ok(()) @@ -896,7 +897,7 @@ pub fn handle_delete_cookies( let url = document.url(); document .window() - .upcast::() + .as_global_scope() .resource_threads() .send(DeleteCookies(url)) .unwrap();