diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 63a72cbec9e..ea27af3b5b6 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -813,7 +813,7 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, match Promise::new_resolved(&promiseGlobal, cx, valueToResolve.handle()) { Ok(value) => value, Err(error) => { - throw_dom_exception(*cx, &promiseGlobal, error); + throw_dom_exception(cx, &promiseGlobal, error); $*{exceptionCode} } } @@ -3372,7 +3372,7 @@ class CGCallGenerator(CGThing): "let result = match result {\n" " Ok(result) => result,\n" " Err(e) => {\n" - " throw_dom_exception(*cx, %s, e);\n" + " throw_dom_exception(cx, %s, e);\n" " return%s;\n" " },\n" "};" % (glob, errorResult))) @@ -5556,12 +5556,12 @@ let global = DomRoot::downcast::(global).unwrap(); // so we can do the spec's object-identity checks. rooted!(in(*cx) let new_target = UnwrapObjectDynamic(args.new_target().to_object(), *cx, 1)); if new_target.is_null() { - throw_dom_exception(*cx, global.upcast::(), Error::Type("new.target is null".to_owned())); + throw_dom_exception(cx, global.upcast::(), Error::Type("new.target is null".to_owned())); return false; } if args.callee() == new_target.get() { - throw_dom_exception(*cx, global.upcast::(), + throw_dom_exception(cx, global.upcast::(), Error::Type("new.target must not be the active function object".to_owned())); return false; } @@ -5602,7 +5602,7 @@ let result: Result, Error> = html_constructor(&global, &args); let result = match result { Ok(result) => result, Err(e) => { - throw_dom_exception(*cx, global.upcast::(), e); + throw_dom_exception(cx, global.upcast::(), e); return false; }, }; diff --git a/components/script/dom/bindings/error.rs b/components/script/dom/bindings/error.rs index 40d690ff8d0..b0b6ca1f685 100644 --- a/components/script/dom/bindings/error.rs +++ b/components/script/dom/bindings/error.rs @@ -15,6 +15,7 @@ use crate::dom::bindings::conversions::{ use crate::dom::bindings::str::USVString; use crate::dom::domexception::{DOMErrorName, DOMException}; use crate::dom::globalscope::GlobalScope; +use crate::script_runtime::JSContext as SafeJSContext; #[cfg(feature = "js_backtrace")] use backtrace::Backtrace; use js::error::{throw_range_error, throw_type_error}; @@ -104,10 +105,10 @@ pub type Fallible = Result; pub type ErrorResult = Fallible<()>; /// Set a pending exception for the given `result` on `cx`. -pub unsafe fn throw_dom_exception(cx: *mut JSContext, global: &GlobalScope, result: Error) { +pub fn throw_dom_exception(cx: SafeJSContext, global: &GlobalScope, result: Error) { #[cfg(feature = "js_backtrace")] { - capture_stack!(in(cx) let stack); + capture_stack!(in(*cx) let stack); let js_stack = stack.and_then(|s| s.as_string(None)); let rust_stack = Backtrace::new(); LAST_EXCEPTION_BACKTRACE.with(|backtrace| { @@ -139,27 +140,29 @@ pub unsafe fn throw_dom_exception(cx: *mut JSContext, global: &GlobalScope, resu Error::InvalidModification => DOMErrorName::InvalidModificationError, Error::NotReadable => DOMErrorName::NotReadableError, Error::Operation => DOMErrorName::OperationError, - Error::Type(message) => { - assert!(!JS_IsExceptionPending(cx)); - throw_type_error(cx, &message); + Error::Type(message) => unsafe { + assert!(!JS_IsExceptionPending(*cx)); + throw_type_error(*cx, &message); return; }, - Error::Range(message) => { - assert!(!JS_IsExceptionPending(cx)); - throw_range_error(cx, &message); + Error::Range(message) => unsafe { + assert!(!JS_IsExceptionPending(*cx)); + throw_range_error(*cx, &message); return; }, - Error::JSFailed => { - assert!(JS_IsExceptionPending(cx)); + Error::JSFailed => unsafe { + assert!(JS_IsExceptionPending(*cx)); return; }, }; - assert!(!JS_IsExceptionPending(cx)); - let exception = DOMException::new(global, code); - rooted!(in(cx) let mut thrown = UndefinedValue()); - exception.to_jsval(cx, thrown.handle_mut()); - JS_SetPendingException(cx, thrown.handle()); + unsafe { + assert!(!JS_IsExceptionPending(*cx)); + let exception = DOMException::new(global, code); + rooted!(in(*cx) let mut thrown = UndefinedValue()); + exception.to_jsval(*cx, thrown.handle_mut()); + JS_SetPendingException(*cx, thrown.handle()); + } } /// A struct encapsulating information about a runtime script error. @@ -310,7 +313,7 @@ impl Error { Error::JSFailed => (), _ => assert!(!JS_IsExceptionPending(cx)), } - throw_dom_exception(cx, global, self); + throw_dom_exception(SafeJSContext::from_ptr(cx), global, self); assert!(JS_IsExceptionPending(cx)); assert!(JS_GetPendingException(cx, rval)); JS_ClearPendingException(cx); diff --git a/components/script/dom/create.rs b/components/script/dom/create.rs index 18c9504a245..e992a8707dd 100644 --- a/components/script/dom/create.rs +++ b/components/script/dom/create.rs @@ -158,7 +158,7 @@ fn create_html_element( unsafe { let _ac = JSAutoRealm::new(*cx, global.reflector().get_jsobject().get()); - throw_dom_exception(*cx, &global, error); + throw_dom_exception(cx, &global, error); report_pending_exception(*cx, true); } diff --git a/components/script/dom/customelementregistry.rs b/components/script/dom/customelementregistry.rs index 318c9656adc..64117959500 100644 --- a/components/script/dom/customelementregistry.rs +++ b/components/script/dom/customelementregistry.rs @@ -625,7 +625,7 @@ pub fn upgrade_element(definition: Rc, element: &Elemen let global = GlobalScope::current().expect("No current global"); let cx = global.get_cx(); unsafe { - throw_dom_exception(*cx, &global, error); + throw_dom_exception(cx, &global, error); report_pending_exception(*cx, true); } return; diff --git a/components/script/dom/windowproxy.rs b/components/script/dom/windowproxy.rs index dbdd09eabb9..99336ec7f66 100644 --- a/components/script/dom/windowproxy.rs +++ b/components/script/dom/windowproxy.rs @@ -18,6 +18,7 @@ use crate::dom::document::Document; use crate::dom::element::Element; use crate::dom::globalscope::GlobalScope; use crate::dom::window::Window; +use crate::script_runtime::JSContext as SafeJSContext; use crate::script_thread::ScriptThread; use dom_struct::dom_struct; use embedder_traits::EmbedderMsg; @@ -959,7 +960,7 @@ pub fn new_window_proxy_handler() -> WindowProxyHandler { unsafe fn throw_security_error(cx: *mut JSContext) -> bool { if !JS_IsExceptionPending(cx) { let global = GlobalScope::from_context(cx); - throw_dom_exception(cx, &*global, Error::Security); + throw_dom_exception(SafeJSContext::from_ptr(cx), &*global, Error::Security); } false } diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index c8aad9a6b4c..874f707a739 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -739,7 +739,7 @@ pub fn handle_get_property( Err(_) => Ok(WebDriverJSValue::Undefined), }, Err(error) => { - unsafe { throw_dom_exception(*cx, &node.reflector().global(), error) }; + throw_dom_exception(cx, &node.reflector().global(), error); Ok(WebDriverJSValue::Undefined) }, }