diff options
author | Gregory Terzian <2792687+gterzian@users.noreply.github.com> | 2024-01-04 17:47:41 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-04 09:47:41 +0000 |
commit | 90a9300f698aa266db47b336f3fcd7d6680b4d65 (patch) | |
tree | 64f7f0b210d9eacc136f87af25ad6559100498e5 /components/script/dom/serviceworkerglobalscope.rs | |
parent | 2f6f03a3b5ab49368e27988960c78d8f7d5f1190 (diff) | |
download | servo-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.rs | 12 |
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>()); |