script: Handle null contexts better during JS runtime shutdown. (#34769)

* script: Handle null contexts better during JS runtime shutdown.

Signed-off-by: Josh Matthews <josh@joshmatthews.net>

* lock file

Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>

---------

Signed-off-by: Josh Matthews <josh@joshmatthews.net>
Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
Co-authored-by: sagudev <16504129+sagudev@users.noreply.github.com>
This commit is contained in:
Josh Matthews 2024-12-26 03:23:27 -05:00 committed by GitHub
parent 981616f918
commit 4a6d2f8ff0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 41 additions and 30 deletions

16
Cargo.lock generated
View file

@ -429,7 +429,7 @@ dependencies = [
"bitflags 2.6.0", "bitflags 2.6.0",
"cexpr", "cexpr",
"clang-sys", "clang-sys",
"itertools 0.10.5", "itertools 0.13.0",
"proc-macro2", "proc-macro2",
"quote", "quote",
"regex", "regex",
@ -957,7 +957,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c"
dependencies = [ dependencies = [
"lazy_static", "lazy_static",
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@ -1862,7 +1862,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
dependencies = [ dependencies = [
"libc", "libc",
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@ -4447,7 +4447,7 @@ dependencies = [
[[package]] [[package]]
name = "mozjs" name = "mozjs"
version = "0.14.1" version = "0.14.1"
source = "git+https://github.com/servo/mozjs#1765a7c7eaf1e4a02fdfff6866c8f427c659dc91" source = "git+https://github.com/servo/mozjs#0081fc4a3f5fc9891d4377844a874651f7c46041"
dependencies = [ dependencies = [
"bindgen", "bindgen",
"cc", "cc",
@ -4460,7 +4460,7 @@ dependencies = [
[[package]] [[package]]
name = "mozjs_sys" name = "mozjs_sys"
version = "0.128.6-1" version = "0.128.6-1"
source = "git+https://github.com/servo/mozjs#1765a7c7eaf1e4a02fdfff6866c8f427c659dc91" source = "git+https://github.com/servo/mozjs#0081fc4a3f5fc9891d4377844a874651f7c46041"
dependencies = [ dependencies = [
"bindgen", "bindgen",
"cc", "cc",
@ -5889,7 +5889,7 @@ dependencies = [
"errno", "errno",
"libc", "libc",
"linux-raw-sys", "linux-raw-sys",
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@ -7153,7 +7153,7 @@ dependencies = [
"fastrand", "fastrand",
"once_cell", "once_cell",
"rustix", "rustix",
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@ -8423,7 +8423,7 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [ dependencies = [
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]

View file

@ -93,8 +93,9 @@ impl Drop for CallbackObject {
#[allow(unsafe_code)] #[allow(unsafe_code)]
fn drop(&mut self) { fn drop(&mut self) {
unsafe { unsafe {
let cx = Runtime::get(); if let Some(cx) = Runtime::get() {
RemoveRawValueRoot(cx, self.permanent_js_root.get_unsafe()); RemoveRawValueRoot(cx.as_ptr(), self.permanent_js_root.get_unsafe());
}
} }
} }
} }

View file

@ -70,7 +70,9 @@ impl Clone for ServoJSPrincipals {
impl Drop for ServoJSPrincipals { impl Drop for ServoJSPrincipals {
#[inline] #[inline]
fn drop(&mut self) { fn drop(&mut self) {
unsafe { JS_DropPrincipals(Runtime::get(), self.as_raw()) }; if let Some(cx) = Runtime::get() {
unsafe { JS_DropPrincipals(cx.as_ptr(), self.as_raw()) };
}
} }
} }

View file

@ -117,9 +117,9 @@ impl AutoIncumbentScript {
pub fn new(global: &GlobalScope) -> Self { pub fn new(global: &GlobalScope) -> Self {
// Step 2-3. // Step 2-3.
unsafe { unsafe {
let cx = Runtime::get(); let cx =
assert!(!cx.is_null()); Runtime::get().expect("Creating a new incumbent script after runtime shutdown");
HideScriptedCaller(cx); HideScriptedCaller(cx.as_ptr());
} }
STACK.with(|stack| { STACK.with(|stack| {
trace!("Prepare to run a callback with {:p}", global); trace!("Prepare to run a callback with {:p}", global);
@ -156,9 +156,9 @@ impl Drop for AutoIncumbentScript {
}); });
unsafe { unsafe {
// Step 1-2. // Step 1-2.
let cx = Runtime::get(); if let Some(cx) = Runtime::get() {
assert!(!cx.is_null()); UnhideScriptedCaller(cx.as_ptr());
UnhideScriptedCaller(cx); }
} }
} }
} }
@ -174,9 +174,12 @@ pub fn incumbent_global() -> Option<DomRoot<GlobalScope>> {
// there's nothing on the JS stack, which will cause us to check the // there's nothing on the JS stack, which will cause us to check the
// incumbent script stack below. // incumbent script stack below.
unsafe { unsafe {
let cx = Runtime::get(); let Some(cx) = Runtime::get() else {
assert!(!cx.is_null()); // It's not meaningful to return a global object if the runtime
let global = GetScriptedCallerGlobal(cx); // no longer exists.
return None;
};
let global = GetScriptedCallerGlobal(cx.as_ptr());
if !global.is_null() { if !global.is_null() {
return Some(GlobalScope::from_object(global)); return Some(GlobalScope::from_object(global));
} }

View file

@ -2253,7 +2253,10 @@ impl GlobalScope {
#[allow(unsafe_code)] #[allow(unsafe_code)]
pub fn get_cx() -> SafeJSContext { pub fn get_cx() -> SafeJSContext {
unsafe { SafeJSContext::from_ptr(Runtime::get()) } let cx = Runtime::get()
.expect("Can't obtain context after runtime shutdown")
.as_ptr();
unsafe { SafeJSContext::from_ptr(cx) }
} }
pub fn crypto(&self) -> DomRoot<Crypto> { pub fn crypto(&self) -> DomRoot<Crypto> {
@ -3058,14 +3061,13 @@ impl GlobalScope {
/// ["current"]: https://html.spec.whatwg.org/multipage/#current /// ["current"]: https://html.spec.whatwg.org/multipage/#current
#[allow(unsafe_code)] #[allow(unsafe_code)]
pub fn current() -> Option<DomRoot<Self>> { pub fn current() -> Option<DomRoot<Self>> {
let cx = Runtime::get()?;
unsafe { unsafe {
let cx = Runtime::get(); let global = CurrentGlobalOrNull(cx.as_ptr());
assert!(!cx.is_null());
let global = CurrentGlobalOrNull(cx);
if global.is_null() { if global.is_null() {
None None
} else { } else {
Some(global_scope_from_global(global, cx)) Some(global_scope_from_global(global, cx.as_ptr()))
} }
} }
} }

View file

@ -78,9 +78,9 @@ impl Drop for Promise {
unsafe { unsafe {
let object = self.permanent_js_root.get().to_object(); let object = self.permanent_js_root.get().to_object();
assert!(!object.is_null()); assert!(!object.is_null());
let cx = Runtime::get(); if let Some(cx) = Runtime::get() {
assert!(!cx.is_null()); RemoveRawValueRoot(cx.as_ptr(), self.permanent_js_root.get_unsafe());
RemoveRawValueRoot(cx, self.permanent_js_root.get_unsafe()); }
} }
} }
} }

View file

@ -621,7 +621,9 @@ impl Runtime {
&*(closure as *mut NetworkingTaskSource); &*(closure as *mut NetworkingTaskSource);
let runnable = Runnable(dispatchable); let runnable = Runnable(dispatchable);
let task = task!(dispatch_to_event_loop_message: move || { let task = task!(dispatch_to_event_loop_message: move || {
runnable.run(RustRuntime::get(), Dispatchable_MaybeShuttingDown::NotShuttingDown); if let Some(cx) = RustRuntime::get() {
runnable.run(cx.as_ptr(), Dispatchable_MaybeShuttingDown::NotShuttingDown);
}
}); });
networking_task_src.queue_unconditionally(task).is_ok() networking_task_src.queue_unconditionally(task).is_ok()
@ -801,6 +803,8 @@ impl Runtime {
impl Drop for Runtime { impl Drop for Runtime {
#[allow(unsafe_code)] #[allow(unsafe_code)]
fn drop(&mut self) { fn drop(&mut self) {
self.microtask_queue.clear();
unsafe { unsafe {
DeleteJobQueue(self.job_queue); DeleteJobQueue(self.job_queue);
} }

View file

@ -1,5 +1,4 @@
[keepalive.any.html] [keepalive.any.html]
expected: CRASH
[keepalive in onunload in nested frame in another window] [keepalive in onunload in nested frame in another window]
expected: FAIL expected: FAIL