mirror of
https://github.com/servo/servo.git
synced 2025-07-24 15:50:21 +01:00
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:
parent
981616f918
commit
4a6d2f8ff0
8 changed files with 41 additions and 30 deletions
16
Cargo.lock
generated
16
Cargo.lock
generated
|
@ -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]]
|
||||||
|
|
|
@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()) };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue