diff --git a/components/script/dom/bindings/callback.rs b/components/script/dom/bindings/callback.rs index e68c1eca11a..d328729a9e3 100644 --- a/components/script/dom/bindings/callback.rs +++ b/components/script/dom/bindings/callback.rs @@ -278,12 +278,12 @@ impl Drop for CallSetup { fn drop(&mut self) { unsafe { LeaveRealm(*self.cx, self.old_realm); - if self.handling == ExceptionHandling::Report { - let ar = enter_realm(&*self.exception_global); - report_pending_exception(*self.cx, true, InRealm::Entered(&ar), CanGc::note()); - } - drop(self.incumbent_script.take()); - drop(self.entry_script.take().unwrap()); } + if self.handling == ExceptionHandling::Report { + let ar = enter_realm(&*self.exception_global); + report_pending_exception(self.cx, true, InRealm::Entered(&ar), CanGc::note()); + } + drop(self.incumbent_script.take()); + drop(self.entry_script.take().unwrap()); } } diff --git a/components/script/dom/bindings/error.rs b/components/script/dom/bindings/error.rs index 576880add91..ac7951e4d4d 100644 --- a/components/script/dom/bindings/error.rs +++ b/components/script/dom/bindings/error.rs @@ -271,31 +271,35 @@ impl ErrorInfo { /// /// The `dispatch_event` argument is temporary and non-standard; passing false /// prevents dispatching the `error` event. -pub(crate) unsafe fn report_pending_exception( - cx: *mut JSContext, +pub(crate) fn report_pending_exception( + cx: SafeJSContext, dispatch_event: bool, realm: InRealm, can_gc: CanGc, ) { - let cx = SafeJSContext::from_ptr(cx); - if !JS_IsExceptionPending(*cx) { - return; + unsafe { + if !JS_IsExceptionPending(*cx) { + return; + } } - rooted!(in(*cx) let mut value = UndefinedValue()); - if !JS_GetPendingException(*cx, value.handle_mut()) { - JS_ClearPendingException(*cx); - error!("Uncaught exception: JS_GetPendingException failed"); - return; - } - JS_ClearPendingException(*cx); + unsafe { + if !JS_GetPendingException(*cx, value.handle_mut()) { + JS_ClearPendingException(*cx); + error!("Uncaught exception: JS_GetPendingException failed"); + return; + } + + JS_ClearPendingException(*cx); + } let error_info = ErrorInfo::from_value(value.handle(), cx); error!( "Error at {}:{}:{} {}", error_info.filename, error_info.lineno, error_info.column, error_info.message ); + #[cfg(feature = "js_backtrace")] { LAST_EXCEPTION_BACKTRACE.with(|backtrace| { diff --git a/components/script/dom/create.rs b/components/script/dom/create.rs index 5a9377985e4..cece344207d 100644 --- a/components/script/dom/create.rs +++ b/components/script/dom/create.rs @@ -187,11 +187,10 @@ fn create_html_element( // Substep 1. Report exception for definition’s constructor’s corresponding // JavaScript object’s associated realm’s global object. - unsafe { - let ar = enter_realm(&*global); - throw_dom_exception(cx, &global, error); - report_pending_exception(*cx, true, InRealm::Entered(&ar), can_gc); - } + + let ar = enter_realm(&*global); + throw_dom_exception(cx, &global, error); + report_pending_exception(cx, true, InRealm::Entered(&ar), can_gc); // Substep 2. Set result to a new element that implements the HTMLUnknownElement interface, // with no attributes, namespace set to the HTML namespace, namespace prefix set to prefix, diff --git a/components/script/dom/customelementregistry.rs b/components/script/dom/customelementregistry.rs index dd6a2844a5f..4349c140234 100644 --- a/components/script/dom/customelementregistry.rs +++ b/components/script/dom/customelementregistry.rs @@ -786,7 +786,6 @@ impl CustomElementDefinition { } /// -#[allow(unsafe_code)] pub(crate) fn upgrade_element( definition: Rc, element: &Element, @@ -848,11 +847,9 @@ pub(crate) fn upgrade_element( // Step 8.exception.3 let global = GlobalScope::current().expect("No current global"); let cx = GlobalScope::get_cx(); - unsafe { - let ar = enter_realm(&*global); - throw_dom_exception(cx, &global, error); - report_pending_exception(*cx, true, InRealm::Entered(&ar), can_gc); - } + let ar = enter_realm(&*global); + throw_dom_exception(cx, &global, error); + report_pending_exception(cx, true, InRealm::Entered(&ar), can_gc); return; } diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs index adf2cc0d118..0d879bca452 100644 --- a/components/script/dom/eventtarget.rs +++ b/components/script/dom/eventtarget.rs @@ -582,11 +582,9 @@ impl EventTarget { }); if handler.get().is_null() { // Step 3.7 - unsafe { - let ar = enter_realm(self); - // FIXME(#13152): dispatch error event. - report_pending_exception(*cx, false, InRealm::Entered(&ar), can_gc); - } + let ar = enter_realm(self); + // FIXME(#13152): dispatch error event. + report_pending_exception(cx, false, InRealm::Entered(&ar), can_gc); return None; } diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs index 16d48a130d7..f9d47f04708 100644 --- a/components/script/dom/globalscope.rs +++ b/components/script/dom/globalscope.rs @@ -2549,7 +2549,7 @@ impl GlobalScope { if compiled_script.is_null() { debug!("error compiling Dom string"); - report_pending_exception(*cx, true, InRealm::Entered(&ar), can_gc); + report_pending_exception(cx, true, InRealm::Entered(&ar), can_gc); return false; } }, @@ -2598,7 +2598,7 @@ impl GlobalScope { if !result { debug!("error evaluating Dom string"); - report_pending_exception(*cx, true, InRealm::Entered(&ar), can_gc); + report_pending_exception(cx, true, InRealm::Entered(&ar), can_gc); } maybe_resume_unwind(); diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs index 1cefa6972a8..d748afdaab4 100644 --- a/components/script/dom/workerglobalscope.rs +++ b/components/script/dom/workerglobalscope.rs @@ -499,7 +499,12 @@ impl WorkerGlobalScope { println!("evaluate_script failed"); unsafe { let ar = enter_realm(self); - report_pending_exception(cx, true, InRealm::Entered(&ar), can_gc); + report_pending_exception( + JSContext::from_ptr(cx), + true, + InRealm::Entered(&ar), + can_gc, + ); } } }, diff --git a/components/script/script_module.rs b/components/script/script_module.rs index bd4872052a3..e6647d3f460 100644 --- a/components/script/script_module.rs +++ b/components/script/script_module.rs @@ -593,20 +593,15 @@ impl ModuleTree { let module_error = self.rethrow_error.borrow(); if let Some(exception) = &*module_error { + let ar = enter_realm(global); unsafe { - let ar = enter_realm(global); JS_SetPendingException( *GlobalScope::get_cx(), exception.handle(), ExceptionStackBehavior::Capture, ); - report_pending_exception( - *GlobalScope::get_cx(), - true, - InRealm::Entered(&ar), - can_gc, - ); } + report_pending_exception(GlobalScope::get_cx(), true, InRealm::Entered(&ar), can_gc); } }