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 /components/script/microtask.rs | |
parent | 9ea1399c306af8f212e81c3dedd9601aa4fe821f (diff) | |
download | servo-864e072d5cd86c798349a69cbd9a352bd122aa73.tar.gz servo-864e072d5cd86c798349a69cbd9a352bd122aa73.zip |
Enter realms more consistently during the script event loop.
Diffstat (limited to 'components/script/microtask.rs')
-rw-r--r-- | components/script/microtask.rs | 8 |
1 files changed, 7 insertions, 1 deletions
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 => { |