aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/microtask.rs
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2023-02-18 14:07:36 -0500
committerJosh Matthews <josh@joshmatthews.net>2023-05-20 14:30:22 -0400
commit864e072d5cd86c798349a69cbd9a352bd122aa73 (patch)
tree5d72a395d1af0375496b9242c5552835185752ed /components/script/microtask.rs
parent9ea1399c306af8f212e81c3dedd9601aa4fe821f (diff)
downloadservo-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.rs8
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 => {