diff --git a/components/script/dom/bindings/callback.rs b/components/script/dom/bindings/callback.rs index c34598a26be..c7a09fcc4d8 100644 --- a/components/script/dom/bindings/callback.rs +++ b/components/script/dom/bindings/callback.rs @@ -8,6 +8,7 @@ use dom::bindings::error::{Error, Fallible, report_pending_exception}; use dom::bindings::global::global_root_from_object; use dom::bindings::reflector::Reflectable; use js::jsapi::GetGlobalForObjectCrossCompartment; +use js::jsapi::JSAutoCompartment; use js::jsapi::JS_GetProperty; use js::jsapi::{Heap, MutableHandleObject, RootedObject}; use js::jsapi::{IsCallable, JSContext, JSObject, JS_WrapObject}; @@ -189,7 +190,8 @@ impl<'a> Drop for CallSetup<'a> { unsafe { JS_LeaveCompartment(self.cx, self.old_compartment); if self.handling == ExceptionHandling::Report { - report_pending_exception(self.cx, *self.exception_compartment); + let _ac = JSAutoCompartment::new(self.cx, *self.exception_compartment); + report_pending_exception(self.cx); } } } diff --git a/components/script/dom/bindings/error.rs b/components/script/dom/bindings/error.rs index ceb7cdd05b3..6c26ae8502c 100644 --- a/components/script/dom/bindings/error.rs +++ b/components/script/dom/bindings/error.rs @@ -13,9 +13,7 @@ use dom::bindings::str::USVString; use dom::domexception::{DOMErrorName, DOMException}; use js::error::{throw_range_error, throw_type_error}; use js::jsapi::HandleObject; -use js::jsapi::JSAutoCompartment; use js::jsapi::JSContext; -use js::jsapi::JSObject; use js::jsapi::JS_ClearPendingException; use js::jsapi::JS_ErrorFromException; use js::jsapi::JS_GetPendingException; @@ -194,9 +192,8 @@ impl ErrorInfo { } /// Report a pending exception, thereby clearing it. -pub unsafe fn report_pending_exception(cx: *mut JSContext, obj: *mut JSObject) { +pub unsafe fn report_pending_exception(cx: *mut JSContext) { if JS_IsExceptionPending(cx) { - let _ac = JSAutoCompartment::new(cx, obj); rooted!(in(cx) let mut value = UndefinedValue()); if !JS_GetPendingException(cx, value.handle_mut()) { JS_ClearPendingException(cx); diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs index 0175023deb1..29a6b4102f8 100644 --- a/components/script/dom/eventtarget.rs +++ b/components/script/dom/eventtarget.rs @@ -426,7 +426,8 @@ impl EventTarget { if !rv || handler.get().is_null() { // Step 1.8.2 unsafe { - report_pending_exception(cx, self.reflector().get_jsobject().get()); + let _ac = JSAutoCompartment::new(cx, self.reflector().get_jsobject().get()); + report_pending_exception(cx); } // Step 1.8.1 / 1.8.3 return None; diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index b75c45e5afa..cd00390a305 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -952,7 +952,7 @@ impl<'a, T: Reflectable> ScriptHelpers for &'a T { code.len() as libc::size_t, rval) { debug!("error evaluating JS string"); - report_pending_exception(cx, globalhandle.get()); + report_pending_exception(cx); } } diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs index 16388d54d73..1b3c48b9c12 100644 --- a/components/script/dom/workerglobalscope.rs +++ b/components/script/dom/workerglobalscope.rs @@ -20,7 +20,7 @@ use dom::window::{base64_atob, base64_btoa}; use dom::workerlocation::WorkerLocation; use dom::workernavigator::WorkerNavigator; use ipc_channel::ipc::IpcSender; -use js::jsapi::{HandleValue, JSContext, JSRuntime}; +use js::jsapi::{HandleValue, JSAutoCompartment, JSContext, JSRuntime}; use js::jsval::UndefinedValue; use js::rust::Runtime; use msg::constellation_msg::{PipelineId, ReferrerPolicy}; @@ -382,8 +382,9 @@ impl WorkerGlobalScope { // https://github.com/servo/servo/issues/6422 println!("evaluate_script failed"); unsafe { - report_pending_exception( - self.runtime.cx(), self.reflector().get_jsobject().get()); + let _ac = JSAutoCompartment::new(self.runtime.cx(), + self.reflector().get_jsobject().get()); + report_pending_exception(self.runtime.cx()); } } }