diff options
author | Josh Matthews <josh@joshmatthews.net> | 2023-02-18 14:07:36 -0500 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2023-05-20 14:30:22 -0400 |
commit | 864e072d5cd86c798349a69cbd9a352bd122aa73 (patch) | |
tree | 5d72a395d1af0375496b9242c5552835185752ed | |
parent | 9ea1399c306af8f212e81c3dedd9601aa4fe821f (diff) | |
download | servo-864e072d5cd86c798349a69cbd9a352bd122aa73.tar.gz servo-864e072d5cd86c798349a69cbd9a352bd122aa73.zip |
Enter realms more consistently during the script event loop.
-rw-r--r-- | components/script/dom/abstractworkerglobalscope.rs | 2 | ||||
-rw-r--r-- | components/script/dom/htmlimageelement.rs | 9 | ||||
-rw-r--r-- | components/script/dom/htmlmediaelement.rs | 11 | ||||
-rw-r--r-- | components/script/dom/servoparser/mod.rs | 3 | ||||
-rw-r--r-- | components/script/microtask.rs | 8 | ||||
-rw-r--r-- | components/script/script_thread.rs | 24 |
6 files changed, 52 insertions, 5 deletions
diff --git a/components/script/dom/abstractworkerglobalscope.rs b/components/script/dom/abstractworkerglobalscope.rs index ca994c1c694..a1cab9aca2d 100644 --- a/components/script/dom/abstractworkerglobalscope.rs +++ b/components/script/dom/abstractworkerglobalscope.rs @@ -9,6 +9,7 @@ use crate::dom::dedicatedworkerglobalscope::{AutoWorkerReset, DedicatedWorkerScr use crate::dom::globalscope::GlobalScope; use crate::dom::worker::TrustedWorkerAddress; use crate::dom::workerglobalscope::WorkerGlobalScope; +use crate::realms::enter_realm; use crate::script_runtime::{CommonScriptMsg, ScriptChan, ScriptPort}; use crate::task_queue::{QueuedTaskConversion, TaskQueue}; use crossbeam_channel::{Receiver, Sender}; @@ -140,6 +141,7 @@ pub fn run_worker_event_loop<T, WorkerMsg, Event>( } // Step 3 for event in sequential { + let _realm = enter_realm(&*worker_scope); if !worker_scope.handle_event(event) { // Shutdown return; diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 893080edd07..1c898d1dc98 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -46,6 +46,7 @@ use crate::fetch::create_a_potential_cors_request; use crate::image_listener::{generate_cache_listener_for_element, ImageCacheListener}; use crate::microtask::{Microtask, MicrotaskRunnable}; use crate::network_listener::{self, NetworkListener, PreInvoke, ResourceTimingListener}; +use crate::realms::enter_realm; use crate::script_thread::ScriptThread; use crate::task_source::TaskSource; use app_units::{Au, AU_PER_PX}; @@ -56,6 +57,7 @@ use html5ever::{LocalName, Prefix, QualName}; use ipc_channel::ipc; use ipc_channel::ipc::IpcSender; use ipc_channel::router::ROUTER; +use js::jsapi::JSAutoRealm; use mime::{self, Mime}; use msg::constellation_msg::PipelineId; use net_traits::image::base::{Image, ImageMetadata}; @@ -1353,6 +1355,13 @@ impl MicrotaskRunnable for ImageElementMicrotask { }, } } + + fn enter_realm(&self) -> JSAutoRealm { + match self { + &ImageElementMicrotask::StableStateUpdateImageDataTask { ref elem, .. } | + &ImageElementMicrotask::EnvironmentChangesTask { ref elem, .. } => enter_realm(&**elem), + } + } } pub trait LayoutHTMLImageElementHelpers { diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 515ead5c228..5eb9f709838 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -62,7 +62,7 @@ use crate::dom::virtualmethods::VirtualMethods; use crate::fetch::{create_a_potential_cors_request, FetchCanceller}; use crate::microtask::{Microtask, MicrotaskRunnable}; use crate::network_listener::{self, NetworkListener, PreInvoke, ResourceTimingListener}; -use crate::realms::InRealm; +use crate::realms::{enter_realm, InRealm}; use crate::script_thread::ScriptThread; use crate::task_source::TaskSource; use dom_struct::dom_struct; @@ -74,6 +74,7 @@ use html5ever::{LocalName, Prefix}; use http::header::{self, HeaderMap, HeaderValue}; use ipc_channel::ipc; use ipc_channel::router::ROUTER; +use js::jsapi::JSAutoRealm; use media::{glplayer_channel, GLPlayerMsg, GLPlayerMsgForward, WindowGLContext}; use net_traits::image::base::Image; use net_traits::request::Destination; @@ -2506,6 +2507,14 @@ impl MicrotaskRunnable for MediaElementMicrotask { }, } } + + fn enter_realm(&self) -> JSAutoRealm { + match self { + &MediaElementMicrotask::ResourceSelectionTask { ref elem, .. } | + &MediaElementMicrotask::PauseIfNotInDocumentTask { ref elem } | + &MediaElementMicrotask::SeekedTask { ref elem, .. } => enter_realm(&**elem), + } + } } enum Resource { diff --git a/components/script/dom/servoparser/mod.rs b/components/script/dom/servoparser/mod.rs index 9967da64556..6b5df0e9768 100644 --- a/components/script/dom/servoparser/mod.rs +++ b/components/script/dom/servoparser/mod.rs @@ -34,6 +34,7 @@ use crate::dom::processinginstruction::ProcessingInstruction; use crate::dom::text::Text; use crate::dom::virtualmethods::vtable_for; use crate::network_listener::PreInvoke; +use crate::realms::enter_realm; use crate::script_thread::ScriptThread; use content_security_policy::{self as csp, CspList}; use dom_struct::dom_struct; @@ -828,6 +829,8 @@ impl FetchResponseListener for ParserContext { return; } + let _realm = enter_realm(&*parser.document); + parser.document.set_csp_list(csp_list); self.parser = Some(Trusted::new(&*parser)); self.submit_resource_timing(); diff --git a/components/script/microtask.rs b/components/script/microtask.rs index b97368fcad5..10322bb2fef 100644 --- a/components/script/microtask.rs +++ b/components/script/microtask.rs @@ -15,9 +15,10 @@ use crate::dom::globalscope::GlobalScope; use crate::dom::htmlimageelement::ImageElementMicrotask; use crate::dom::htmlmediaelement::MediaElementMicrotask; use crate::dom::mutationobserver::MutationObserver; +use crate::realms::enter_realm; use crate::script_runtime::{notify_about_rejected_promises, JSContext}; use crate::script_thread::ScriptThread; -use js::jsapi::{JobQueueIsEmpty, JobQueueMayNotBeEmpty}; +use js::jsapi::{JSAutoRealm, JobQueueIsEmpty, JobQueueMayNotBeEmpty}; use msg::constellation_msg::PipelineId; use std::cell::Cell; use std::mem; @@ -44,6 +45,7 @@ pub enum Microtask { pub trait MicrotaskRunnable { fn handler(&self) {} + fn enter_realm(&self) -> JSAutoRealm; } /// A promise callback scheduled to run during the next microtask checkpoint (#4283). @@ -108,19 +110,23 @@ impl MicrotaskQueue { if let Some(target) = target_provider(job.pipeline) { let was_interacting = ScriptThread::is_user_interacting(); ScriptThread::set_user_interacting(job.is_user_interacting); + let _realm = enter_realm(&*target); let _ = job.callback.Call_(&*target, ExceptionHandling::Report); ScriptThread::set_user_interacting(was_interacting); } }, Microtask::User(ref job) => { if let Some(target) = target_provider(job.pipeline) { + let _realm = enter_realm(&*target); let _ = job.callback.Call_(&*target, ExceptionHandling::Report); } }, Microtask::MediaElement(ref task) => { + let _realm = task.enter_realm(); task.handler(); }, Microtask::ImageElement(ref task) => { + let _realm = task.enter_realm(); task.handler(); }, Microtask::CustomElementReaction => { diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index cc2ec2b8e4a..fad1c7f7877 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -1592,6 +1592,11 @@ impl ScriptThread { let category = self.categorize_msg(&msg); let pipeline_id = self.message_to_pipeline(&msg); + let _realm = pipeline_id.and_then(|id| { + let global = self.documents.borrow().find_global(id); + global.map(|global| enter_realm(&*global)) + }); + if self.closing.load(Ordering::SeqCst) { // If we've received the closed signal from the BHM, only handle exit messages. match msg { @@ -1656,6 +1661,8 @@ impl ScriptThread { } let window = document.window(); + let _realm = enter_realm(&*document); + window .upcast::<GlobalScope>() .perform_a_dom_garbage_collection_checkpoint(); @@ -1684,6 +1691,7 @@ impl ScriptThread { } for (_, document) in self.documents.borrow().iter() { + let _realm = enter_realm(&*document); document.animations().send_pending_events(document.window()); } } @@ -1786,7 +1794,7 @@ impl ScriptThread { DispatchStorageEvent(id, ..) => Some(id), ReportCSSError(id, ..) => Some(id), Reload(id, ..) => Some(id), - PaintMetric(..) => None, + PaintMetric(id, ..) => Some(id), ExitFullScreen(id, ..) => Some(id), MediaSessionAction(..) => None, SetWebGPUPort(..) => None, @@ -2070,7 +2078,13 @@ impl ScriptThread { fn handle_msg_from_script(&self, msg: MainThreadScriptMsg) { match msg { - MainThreadScriptMsg::Common(CommonScriptMsg::Task(_, task, _, _)) => task.run_box(), + MainThreadScriptMsg::Common(CommonScriptMsg::Task(_, task, pipeline_id, _)) => { + let _realm = pipeline_id.and_then(|id| { + let global = self.documents.borrow().find_global(id); + global.map(|global| enter_realm(&*global)) + }); + task.run_box() + }, MainThreadScriptMsg::Common(CommonScriptMsg::CollectReports(chan)) => { self.collect_reports(chan) }, @@ -3277,6 +3291,8 @@ impl ScriptThread { incomplete.inherited_secure_context, ); + let _realm = enter_realm(&*window); + // Initialize the browsing context for the window. let window_proxy = self.local_window_proxy( &window, @@ -3460,6 +3476,8 @@ impl ScriptThread { ); } + let _realm = enter_realm(&*window); + // Assuming all CompositionEvent are generated by user interactions. ScriptThread::set_user_interacting(true); match event { @@ -3978,7 +3996,7 @@ impl ScriptThread { .documents .borrow() .iter() - .map(|(_id, document)| document.global()) + .map(|(_id, document)| DomRoot::from_ref(document.window().upcast())) .collect(); self.microtask_queue.checkpoint( |