aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/serviceworkerglobalscope.rs
diff options
context:
space:
mode:
authorGregory Terzian <2792687+gterzian@users.noreply.github.com>2024-01-04 17:47:41 +0800
committerGitHub <noreply@github.com>2024-01-04 09:47:41 +0000
commit90a9300f698aa266db47b336f3fcd7d6680b4d65 (patch)
tree64f7f0b210d9eacc136f87af25ad6559100498e5 /components/script/dom/serviceworkerglobalscope.rs
parent2f6f03a3b5ab49368e27988960c78d8f7d5f1190 (diff)
downloadservo-90a9300f698aa266db47b336f3fcd7d6680b4d65.tar.gz
servo-90a9300f698aa266db47b336f3fcd7d6680b4d65.zip
Script: ensure child JS runtimes are dropped before parent (#30896)
* clear js runtime of dedicated worker that immediately exits * dedicated worker: clear js runtime if loading script fails * when the script thread crashes, deallocate worker runtimes before dropping main runtime * clear runtime if service worker script fails to load * ensure worker enter their realm before executing script
Diffstat (limited to 'components/script/dom/serviceworkerglobalscope.rs')
-rw-r--r--components/script/dom/serviceworkerglobalscope.rs12
1 files changed, 8 insertions, 4 deletions
diff --git a/components/script/dom/serviceworkerglobalscope.rs b/components/script/dom/serviceworkerglobalscope.rs
index cbbb63ea998..2dc5b8fb577 100644
--- a/components/script/dom/serviceworkerglobalscope.rs
+++ b/components/script/dom/serviceworkerglobalscope.rs
@@ -349,6 +349,8 @@ impl ServiceWorkerGlobalScope {
closing,
);
+ let scope = global.upcast::<WorkerGlobalScope>();
+
let referrer = referrer_url
.map(|url| Referrer::ReferrerUrl(url))
.unwrap_or_else(|| global.upcast::<GlobalScope>().get_referrer());
@@ -367,6 +369,7 @@ impl ServiceWorkerGlobalScope {
{
Err(_) => {
println!("error loading script {}", serialized_worker_url);
+ scope.clear_js_runtime(context_for_interrupt);
return;
},
Ok((metadata, bytes)) => {
@@ -374,15 +377,16 @@ impl ServiceWorkerGlobalScope {
},
};
- let scope = global.upcast::<WorkerGlobalScope>();
- let _ac = enter_realm(&*scope);
-
unsafe {
// Handle interrupt requests
JS_AddInterruptCallback(*scope.get_cx(), Some(interrupt_callback));
}
- scope.execute_script(DOMString::from(source));
+ {
+ // TODO: use AutoWorkerReset as in dedicated worker?
+ let _ac = enter_realm(&*scope);
+ scope.execute_script(DOMString::from(source));
+ }
global.dispatch_activate();
let reporter_name = format!("service-worker-reporter-{}", random::<u64>());