diff options
author | marmeladema <xademax@gmail.com> | 2019-07-22 22:14:11 +0100 |
---|---|---|
committer | marmeladema <xademax@gmail.com> | 2019-07-24 09:53:10 +0100 |
commit | 88cacfb0098e20be70c27bfde6b74cd3290f1fe4 (patch) | |
tree | 95d7cd9ffad7eaff05114946a1e12f8e49d55fab | |
parent | 2c5d0a6ebc39ad263e2bbe623e357a11b4cec5aa (diff) | |
download | servo-88cacfb0098e20be70c27bfde6b74cd3290f1fe4.tar.gz servo-88cacfb0098e20be70c27bfde6b74cd3290f1fe4.zip |
Modify *::get_cx methods to return a safe JSContext instead of a raw one
43 files changed, 306 insertions, 321 deletions
diff --git a/components/script/body.rs b/components/script/body.rs index 1e18bc565a6..728315bf1fa 100644 --- a/components/script/body.rs +++ b/components/script/body.rs @@ -13,8 +13,8 @@ use crate::dom::blob::{Blob, BlobImpl}; use crate::dom::formdata::FormData; use crate::dom::globalscope::GlobalScope; use crate::dom::promise::Promise; +use crate::script_runtime::JSContext; use js::jsapi::Heap; -use js::jsapi::JSContext; use js::jsapi::JSObject; use js::jsapi::JS_ClearPendingException; use js::jsapi::Value as JSValue; @@ -122,7 +122,7 @@ fn run_package_data_algorithm<T: BodyOperations + DomObject>( BodyType::Json => run_json_data_algorithm(cx, bytes), BodyType::Blob => run_blob_data_algorithm(&global, bytes, mime), BodyType::FormData => run_form_data_algorithm(&global, bytes, mime), - BodyType::ArrayBuffer => unsafe { run_array_buffer_data_algorithm(cx, bytes) }, + BodyType::ArrayBuffer => run_array_buffer_data_algorithm(cx, bytes), } } @@ -133,20 +133,20 @@ fn run_text_data_algorithm(bytes: Vec<u8>) -> Fallible<FetchedData> { } #[allow(unsafe_code)] -fn run_json_data_algorithm(cx: *mut JSContext, bytes: Vec<u8>) -> Fallible<FetchedData> { +fn run_json_data_algorithm(cx: JSContext, bytes: Vec<u8>) -> Fallible<FetchedData> { let json_text = String::from_utf8_lossy(&bytes); let json_text: Vec<u16> = json_text.encode_utf16().collect(); - rooted!(in(cx) let mut rval = UndefinedValue()); + rooted!(in(*cx) let mut rval = UndefinedValue()); unsafe { if !JS_ParseJSON( - cx, + *cx, json_text.as_ptr(), json_text.len() as u32, rval.handle_mut(), ) { - rooted!(in(cx) let mut exception = UndefinedValue()); - assert!(JS_GetPendingException(cx, exception.handle_mut())); - JS_ClearPendingException(cx); + rooted!(in(*cx) let mut exception = UndefinedValue()); + assert!(JS_GetPendingException(*cx, exception.handle_mut())); + JS_ClearPendingException(*cx); return Ok(FetchedData::JSException(RootedTraceableBox::from_box( Heap::boxed(exception.get()), ))); @@ -200,13 +200,15 @@ fn run_form_data_algorithm( } #[allow(unsafe_code)] -unsafe fn run_array_buffer_data_algorithm( - cx: *mut JSContext, - bytes: Vec<u8>, -) -> Fallible<FetchedData> { - rooted!(in(cx) let mut array_buffer_ptr = ptr::null_mut::<JSObject>()); - let arraybuffer = - ArrayBuffer::create(cx, CreateWith::Slice(&bytes), array_buffer_ptr.handle_mut()); +fn run_array_buffer_data_algorithm(cx: JSContext, bytes: Vec<u8>) -> Fallible<FetchedData> { + rooted!(in(*cx) let mut array_buffer_ptr = ptr::null_mut::<JSObject>()); + let arraybuffer = unsafe { + ArrayBuffer::create( + *cx, + CreateWith::Slice(&bytes), + array_buffer_ptr.handle_mut(), + ) + }; if arraybuffer.is_err() { return Err(Error::JSFailed); } diff --git a/components/script/compartments.rs b/components/script/compartments.rs index cb8c973e70e..c26e72ccd1a 100644 --- a/components/script/compartments.rs +++ b/components/script/compartments.rs @@ -12,7 +12,7 @@ impl AlreadyInCompartment { #![allow(unsafe_code)] pub fn assert(global: &GlobalScope) -> AlreadyInCompartment { unsafe { - assert!(!GetCurrentRealmOrNull(global.get_cx()).is_null()); + assert!(!GetCurrentRealmOrNull(*global.get_cx()).is_null()); } AlreadyInCompartment(()) } @@ -43,7 +43,7 @@ impl<'a> InCompartment<'a> { pub fn enter_realm(object: &impl DomObject) -> JSAutoRealm { JSAutoRealm::new( - object.global().get_cx(), + *object.global().get_cx(), object.reflector().get_jsobject().get(), ) } diff --git a/components/script/devtools.rs b/components/script/devtools.rs index 5a0e1c9090c..7ae02dd3e1f 100644 --- a/components/script/devtools.rs +++ b/components/script/devtools.rs @@ -36,7 +36,7 @@ pub fn handle_evaluate_js(global: &GlobalScope, eval: String, reply: IpcSender<E let result = unsafe { let cx = global.get_cx(); let _ac = enter_realm(global); - rooted!(in(cx) let mut rval = UndefinedValue()); + rooted!(in(*cx) let mut rval = UndefinedValue()); global.evaluate_js_on_global_with_result(&eval, rval.handle_mut()); if rval.is_undefined() { @@ -45,20 +45,20 @@ pub fn handle_evaluate_js(global: &GlobalScope, eval: String, reply: IpcSender<E EvaluateJSReply::BooleanValue(rval.to_boolean()) } else if rval.is_double() || rval.is_int32() { EvaluateJSReply::NumberValue( - match FromJSValConvertible::from_jsval(cx, rval.handle(), ()) { + match FromJSValConvertible::from_jsval(*cx, rval.handle(), ()) { Ok(ConversionResult::Success(v)) => v, _ => unreachable!(), }, ) } else if rval.is_string() { - EvaluateJSReply::StringValue(String::from(jsstring_to_str(cx, rval.to_string()))) + EvaluateJSReply::StringValue(String::from(jsstring_to_str(*cx, rval.to_string()))) } else if rval.is_null() { EvaluateJSReply::NullValue } else { assert!(rval.is_object()); - rooted!(in(cx) let obj = rval.to_object()); - let class_name = CStr::from_ptr(ObjectClassName(cx, obj.handle())); + rooted!(in(*cx) let obj = rval.to_object()); + let class_name = CStr::from_ptr(ObjectClassName(*cx, obj.handle())); let class_name = str::from_utf8(class_name.to_bytes()).unwrap(); EvaluateJSReply::ActorValue { diff --git a/components/script/dom/audiobuffer.rs b/components/script/dom/audiobuffer.rs index a5b8dfbc8c8..4b113a200fe 100644 --- a/components/script/dom/audiobuffer.rs +++ b/components/script/dom/audiobuffer.rs @@ -173,15 +173,15 @@ impl AudioBuffer { // Step 2. let channel_data = unsafe { - typedarray!(in(cx) let array: Float32Array = channel.get()); + typedarray!(in(*cx) let array: Float32Array = channel.get()); if let Ok(array) = array { let data = array.to_vec(); let mut is_shared = false; - rooted!(in (cx) let view_buffer = - JS_GetArrayBufferViewBuffer(cx, channel.handle(), &mut is_shared)); + rooted!(in (*cx) let view_buffer = + JS_GetArrayBufferViewBuffer(*cx, channel.handle(), &mut is_shared)); // This buffer is always created unshared debug_assert!(!is_shared); - let _ = DetachArrayBuffer(cx, view_buffer.handle()); + let _ = DetachArrayBuffer(*cx, view_buffer.handle()); data } else { return None; @@ -272,7 +272,7 @@ impl AudioBufferMethods for AudioBuffer { // We either copy form js_channels or shared_channels. let js_channel = self.js_channels.borrow()[channel_number].get(); if !js_channel.is_null() { - typedarray!(in(cx) let array: Float32Array = js_channel); + typedarray!(in(*cx) let array: Float32Array = js_channel); if let Ok(array) = array { let data = unsafe { array.as_slice() }; dest.extend_from_slice(&data[offset..offset + bytes_to_copy]); @@ -307,7 +307,7 @@ impl AudioBufferMethods for AudioBuffer { } let cx = self.global().get_cx(); - if unsafe { !self.restore_js_channel_data(cx) } { + if unsafe { !self.restore_js_channel_data(*cx) } { return Err(Error::JSFailed); } @@ -317,7 +317,7 @@ impl AudioBufferMethods for AudioBuffer { return Err(Error::IndexSize); } - typedarray!(in(cx) let js_channel: Float32Array = js_channel); + typedarray!(in(*cx) let js_channel: Float32Array = js_channel); if let Ok(mut js_channel) = js_channel { let bytes_to_copy = min(self.length - start_in_channel, source.len() as u32) as usize; let js_channel_data = unsafe { js_channel.as_mut_slice() }; diff --git a/components/script/dom/bindings/callback.rs b/components/script/dom/bindings/callback.rs index 77f6880e35a..03b8f326f55 100644 --- a/components/script/dom/bindings/callback.rs +++ b/components/script/dom/bindings/callback.rs @@ -255,8 +255,8 @@ impl CallSetup { let ais = callback.incumbent().map(AutoIncumbentScript::new); CallSetup { exception_global: global, - cx: cx, - old_realm: unsafe { EnterRealm(cx, callback.callback()) }, + cx: *cx, + old_realm: unsafe { EnterRealm(*cx, callback.callback()) }, handling: handling, entry_script: Some(aes), incumbent_script: ais, diff --git a/components/script/dom/bindings/htmlconstructor.rs b/components/script/dom/bindings/htmlconstructor.rs index f976a09ee91..6faa4f6211c 100644 --- a/components/script/dom/bindings/htmlconstructor.rs +++ b/components/script/dom/bindings/htmlconstructor.rs @@ -100,7 +100,7 @@ where // Step 2 is checked in the generated caller code // Step 3 - rooted!(in(window.get_cx()) let new_target = call_args.new_target().to_object()); + rooted!(in(*window.get_cx()) let new_target = call_args.new_target().to_object()); let definition = match registry.lookup_definition_by_constructor(new_target.handle()) { Some(definition) => definition, None => { @@ -110,15 +110,15 @@ where }, }; - rooted!(in(window.get_cx()) let callee = UnwrapObjectStatic(call_args.callee())); + rooted!(in(*window.get_cx()) let callee = UnwrapObjectStatic(call_args.callee())); if callee.is_null() { return Err(Error::Security); } { - let _ac = JSAutoRealm::new(window.get_cx(), callee.get()); - rooted!(in(window.get_cx()) let mut constructor = ptr::null_mut::<JSObject>()); - rooted!(in(window.get_cx()) let global_object = CurrentGlobalOrNull(window.get_cx())); + let _ac = JSAutoRealm::new(*window.get_cx(), callee.get()); + rooted!(in(*window.get_cx()) let mut constructor = ptr::null_mut::<JSObject>()); + rooted!(in(*window.get_cx()) let global_object = CurrentGlobalOrNull(*window.get_cx())); if definition.is_autonomous() { // Step 4 @@ -126,7 +126,7 @@ where // Retrieve the constructor object for HTMLElement HTMLElementBinding::GetConstructorObject( - SafeJSContext::from_ptr(window.get_cx()), + window.get_cx(), global_object.handle(), constructor.handle_mut(), ); @@ -134,7 +134,7 @@ where // Step 5 get_constructor_object_from_local_name( definition.local_name.clone(), - window.get_cx(), + *window.get_cx(), global_object.handle(), constructor.handle_mut(), ); diff --git a/components/script/dom/bindings/reflector.rs b/components/script/dom/bindings/reflector.rs index a66ff114226..dc13fca77b0 100644 --- a/components/script/dom/bindings/reflector.rs +++ b/components/script/dom/bindings/reflector.rs @@ -7,7 +7,7 @@ use crate::dom::bindings::conversions::DerivedFrom; use crate::dom::bindings::root::DomRoot; use crate::dom::globalscope::GlobalScope; -use crate::script_runtime::JSContext as SafeJSContext; +use crate::script_runtime::JSContext; use js::jsapi::{Heap, JSObject}; use js::rust::HandleObject; use std::default::Default; @@ -17,20 +17,14 @@ use std::default::Default; pub fn reflect_dom_object<T, U>( obj: Box<T>, global: &U, - wrap_fn: unsafe fn(SafeJSContext, &GlobalScope, Box<T>) -> DomRoot<T>, + wrap_fn: unsafe fn(JSContext, &GlobalScope, Box<T>) -> DomRoot<T>, ) -> DomRoot<T> where T: DomObject, U: DerivedFrom<GlobalScope>, { let global_scope = global.upcast(); - unsafe { - wrap_fn( - SafeJSContext::from_ptr(global_scope.get_cx()), - global_scope, - obj, - ) - } + unsafe { wrap_fn(global_scope.get_cx(), global_scope, obj) } } /// A struct to store a reference to the reflector of a DOM object. diff --git a/components/script/dom/bindings/structuredclone.rs b/components/script/dom/bindings/structuredclone.rs index 167b375dbc7..f35a4af7210 100644 --- a/components/script/dom/bindings/structuredclone.rs +++ b/components/script/dom/bindings/structuredclone.rs @@ -321,7 +321,7 @@ impl StructuredCloneData { WriteBytesToJSStructuredCloneData(data as *const u8, nbytes, scdata); assert!(JS_ReadStructuredClone( - cx, + *cx, scdata, JS_STRUCTURED_CLONE_VERSION, StructuredCloneScope::DifferentProcess, diff --git a/components/script/dom/create.rs b/components/script/dom/create.rs index 5ca05d2f713..18c9504a245 100644 --- a/components/script/dom/create.rs +++ b/components/script/dom/create.rs @@ -157,9 +157,9 @@ fn create_html_element( // Step 6.1.1 unsafe { let _ac = - JSAutoRealm::new(cx, global.reflector().get_jsobject().get()); - throw_dom_exception(cx, &global, error); - report_pending_exception(cx, true); + JSAutoRealm::new(*cx, global.reflector().get_jsobject().get()); + throw_dom_exception(*cx, &global, error); + report_pending_exception(*cx, true); } // Step 6.1.2 diff --git a/components/script/dom/customelementregistry.rs b/components/script/dom/customelementregistry.rs index 6b2f8992c0a..2603768ed83 100644 --- a/components/script/dom/customelementregistry.rs +++ b/components/script/dom/customelementregistry.rs @@ -145,7 +145,7 @@ impl CustomElementRegistry { unsafe { // Step 10.1 if !JS_GetProperty( - global_scope.get_cx(), + *global_scope.get_cx(), constructor, b"prototype\0".as_ptr() as *const _, prototype, @@ -171,10 +171,14 @@ impl CustomElementRegistry { // Step 4 Ok(LifecycleCallbacks { - connected_callback: get_callback(cx, prototype, b"connectedCallback\0")?, - disconnected_callback: get_callback(cx, prototype, b"disconnectedCallback\0")?, - adopted_callback: get_callback(cx, prototype, b"adoptedCallback\0")?, - attribute_changed_callback: get_callback(cx, prototype, b"attributeChangedCallback\0")?, + connected_callback: get_callback(*cx, prototype, b"connectedCallback\0")?, + disconnected_callback: get_callback(*cx, prototype, b"disconnectedCallback\0")?, + adopted_callback: get_callback(*cx, prototype, b"adoptedCallback\0")?, + attribute_changed_callback: get_callback( + *cx, + prototype, + b"attributeChangedCallback\0", + )?, }) } @@ -183,10 +187,10 @@ impl CustomElementRegistry { #[allow(unsafe_code)] fn get_observed_attributes(&self, constructor: HandleObject) -> Fallible<Vec<DOMString>> { let cx = self.window.get_cx(); - rooted!(in(cx) let mut observed_attributes = UndefinedValue()); + rooted!(in(*cx) let mut observed_attributes = UndefinedValue()); if unsafe { !JS_GetProperty( - cx, + *cx, constructor, b"observedAttributes\0".as_ptr() as *const _, observed_attributes.handle_mut(), @@ -201,7 +205,7 @@ impl CustomElementRegistry { let conversion = unsafe { FromJSValConvertible::from_jsval( - cx, + *cx, observed_attributes.handle(), StringificationBehavior::Default, ) @@ -258,12 +262,12 @@ impl CustomElementRegistryMethods for CustomElementRegistry { options: &ElementDefinitionOptions, ) -> ErrorResult { let cx = self.window.get_cx(); - rooted!(in(cx) let constructor = constructor_.callback()); + rooted!(in(*cx) let constructor = constructor_.callback()); let name = LocalName::from(&*name); // Step 1 // We must unwrap the constructor as all wrappers are constructable if they are callable. - rooted!(in(cx) let unwrapped_constructor = unsafe { UnwrapObjectStatic(constructor.get()) }); + rooted!(in(*cx) let unwrapped_constructor = unsafe { UnwrapObjectStatic(constructor.get()) }); if unwrapped_constructor.is_null() { // We do not have permission to access the unwrapped constructor. @@ -326,9 +330,9 @@ impl CustomElementRegistryMethods for CustomElementRegistry { self.element_definition_is_running.set(true); // Steps 10.1 - 10.2 - rooted!(in(cx) let mut prototype = UndefinedValue()); + rooted!(in(*cx) let mut prototype = UndefinedValue()); { - let _ac = JSAutoRealm::new(cx, constructor.get()); + let _ac = JSAutoRealm::new(*cx, constructor.get()); if let Err(error) = self.check_prototype(constructor.handle(), prototype.handle_mut()) { self.element_definition_is_running.set(false); return Err(error); @@ -336,9 +340,9 @@ impl CustomElementRegistryMethods for CustomElementRegistry { }; // Steps 10.3 - 10.4 - rooted!(in(cx) let proto_object = prototype.to_object()); + rooted!(in(*cx) let proto_object = prototype.to_object()); let callbacks = { - let _ac = JSAutoRealm::new(cx, proto_object.get()); + let _ac = JSAutoRealm::new(*cx, proto_object.get()); match unsafe { self.get_callbacks(proto_object.handle()) } { Ok(callbacks) => callbacks, Err(error) => { @@ -350,7 +354,7 @@ impl CustomElementRegistryMethods for CustomElementRegistry { // Step 10.5 - 10.6 let observed_attributes = if callbacks.attribute_changed_callback.is_some() { - let _ac = JSAutoRealm::new(cx, constructor.get()); + let _ac = JSAutoRealm::new(*cx, constructor.get()); match self.get_observed_attributes(constructor.handle()) { Ok(attributes) => attributes, Err(error) => { @@ -523,20 +527,20 @@ impl CustomElementDefinition { let window = document.window(); let cx = window.get_cx(); // Step 2 - rooted!(in(cx) let constructor = ObjectValue(self.constructor.callback())); - rooted!(in(cx) let mut element = ptr::null_mut::<JSObject>()); + rooted!(in(*cx) let constructor = ObjectValue(self.constructor.callback())); + rooted!(in(*cx) let mut element = ptr::null_mut::<JSObject>()); { // Go into the constructor's compartment - let _ac = JSAutoRealm::new(cx, self.constructor.callback()); + let _ac = JSAutoRealm::new(*cx, self.constructor.callback()); let args = HandleValueArray::new(); - if unsafe { !Construct1(cx, constructor.handle(), &args, element.handle_mut()) } { + if unsafe { !Construct1(*cx, constructor.handle(), &args, element.handle_mut()) } { return Err(Error::JSFailed); } } - rooted!(in(cx) let element_val = ObjectValue(element.get())); + rooted!(in(*cx) let element_val = ObjectValue(element.get())); let element: DomRoot<Element> = - match unsafe { DomRoot::from_jsval(cx, element_val.handle(), ()) } { + match unsafe { DomRoot::from_jsval(*cx, element_val.handle(), ()) } { Ok(ConversionResult::Success(element)) => element, Ok(ConversionResult::Failure(..)) => { return Err(Error::Type( @@ -627,8 +631,8 @@ pub fn upgrade_element(definition: Rc<CustomElementDefinition>, element: &Elemen let global = GlobalScope::current().expect("No current global"); let cx = global.get_cx(); unsafe { - throw_dom_exception(cx, &global, error); - report_pending_exception(cx, true); + throw_dom_exception(*cx, &global, error); + report_pending_exception(*cx, true); } return; } @@ -649,20 +653,20 @@ fn run_upgrade_constructor( ) -> ErrorResult { let window = window_from_node(element); let cx = window.get_cx(); - rooted!(in(cx) let constructor_val = ObjectValue(constructor.callback())); - rooted!(in(cx) let mut element_val = UndefinedValue()); + rooted!(in(*cx) let constructor_val = ObjectValue(constructor.callback())); + rooted!(in(*cx) let mut element_val = UndefinedValue()); unsafe { - element.to_jsval(cx, element_val.handle_mut()); + element.to_jsval(*cx, element_val.handle_mut()); } - rooted!(in(cx) let mut construct_result = ptr::null_mut::<JSObject>()); + rooted!(in(*cx) let mut construct_result = ptr::null_mut::<JSObject>()); { // Go into the constructor's compartment - let _ac = JSAutoRealm::new(cx, constructor.callback()); + let _ac = JSAutoRealm::new(*cx, constructor.callback()); let args = HandleValueArray::new(); // Step 7.1 if unsafe { !Construct1( - cx, + *cx, constructor_val.handle(), &args, construct_result.handle_mut(), @@ -672,10 +676,10 @@ fn run_upgrade_constructor( } // Step 7.2 let mut same = false; - rooted!(in(cx) let construct_result_val = ObjectValue(construct_result.get())); + rooted!(in(*cx) let construct_result_val = ObjectValue(construct_result.get())); if unsafe { !SameValue( - cx, + *cx, construct_result_val.handle(), element_val.handle(), &mut same, @@ -863,30 +867,30 @@ impl CustomElementReactionStack { let cx = element.global().get_cx(); let local_name = DOMString::from(&*local_name); - rooted!(in(cx) let mut name_value = UndefinedValue()); + rooted!(in(*cx) let mut name_value = UndefinedValue()); unsafe { - local_name.to_jsval(cx, name_value.handle_mut()); + local_name.to_jsval(*cx, name_value.handle_mut()); } - rooted!(in(cx) let mut old_value = NullValue()); + rooted!(in(*cx) let mut old_value = NullValue()); if let Some(old_val) = old_val { unsafe { - old_val.to_jsval(cx, old_value.handle_mut()); + old_val.to_jsval(*cx, old_value.handle_mut()); } } - rooted!(in(cx) let mut value = NullValue()); + rooted!(in(*cx) let mut value = NullValue()); if let Some(val) = val { unsafe { - val.to_jsval(cx, value.handle_mut()); + val.to_jsval(*cx, value.handle_mut()); } } - rooted!(in(cx) let mut namespace_value = NullValue()); + rooted!(in(*cx) let mut namespace_value = NullValue()); if namespace != ns!() { let namespace = DOMString::from(&*namespace); unsafe { - namespace.to_jsval(cx, namespace_value.handle_mut()); + namespace.to_jsval(*cx, namespace_value.handle_mut()); } } diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index 2c6042333a6..a3adde75498 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -405,7 +405,7 @@ impl DedicatedWorkerGlobalScope { unsafe { // Handle interrupt requests - JS_AddInterruptCallback(scope.get_cx(), Some(interrupt_callback)); + JS_AddInterruptCallback(*scope.get_cx(), Some(interrupt_callback)); } if scope.is_closing() { @@ -466,7 +466,7 @@ impl DedicatedWorkerGlobalScope { let scope = self.upcast::<WorkerGlobalScope>(); let target = self.upcast(); let _ac = enter_realm(self); - rooted!(in(scope.get_cx()) let mut message = UndefinedValue()); + rooted!(in(*scope.get_cx()) let mut message = UndefinedValue()); data.read(scope.upcast(), message.handle_mut()); MessageEvent::dispatch_jsval(target, scope.upcast(), message.handle(), None, None); }, diff --git a/components/script/dom/dissimilaroriginwindow.rs b/components/script/dom/dissimilaroriginwindow.rs index 8724516acec..8f7eda58100 100644 --- a/components/script/dom/dissimilaroriginwindow.rs +++ b/components/script/dom/dissimilaroriginwindow.rs @@ -68,7 +68,7 @@ impl DissimilarOriginWindow { window_proxy: Dom::from_ref(window_proxy), location: Default::default(), }); - unsafe { DissimilarOriginWindowBinding::Wrap(JSContext::from_ptr(cx), win) } + unsafe { DissimilarOriginWindowBinding::Wrap(cx, win) } } pub fn window_proxy(&self) -> DomRoot<WindowProxy> { diff --git a/components/script/dom/documentorshadowroot.rs b/components/script/dom/documentorshadowroot.rs index 9b57dd32bf6..594801584c8 100644 --- a/components/script/dom/documentorshadowroot.rs +++ b/components/script/dom/documentorshadowroot.rs @@ -131,7 +131,7 @@ impl DocumentOrShadowRoot { .first() { Some(address) => { - let js_runtime = unsafe { JS_GetRuntime(self.window.get_cx()) }; + let js_runtime = unsafe { JS_GetRuntime(*self.window.get_cx()) }; let node = unsafe { node::from_untrusted_node_address(js_runtime, *address) }; let parent_node = node.GetParentNode().unwrap(); let element_ref = node @@ -167,7 +167,7 @@ impl DocumentOrShadowRoot { return vec![]; } - let js_runtime = unsafe { JS_GetRuntime(self.window.get_cx()) }; + let js_runtime = unsafe { JS_GetRuntime(*self.window.get_cx()) }; // Step 1 and Step 3 let nodes = self.nodes_from_point(point, NodesFromPointQueryType::All); diff --git a/components/script/dom/eventsource.rs b/components/script/dom/eventsource.rs index 64c88496a46..02283a3c190 100644 --- a/components/script/dom/eventsource.rs +++ b/components/script/dom/eventsource.rs @@ -223,10 +223,10 @@ impl EventSourceContext { // Steps 4-5 let event = { let _ac = enter_realm(&*event_source); - rooted!(in(event_source.global().get_cx()) let mut data = UndefinedValue()); + rooted!(in(*event_source.global().get_cx()) let mut data = UndefinedValue()); unsafe { self.data - .to_jsval(event_source.global().get_cx(), data.handle_mut()) + .to_jsval(*event_source.global().get_cx(), data.handle_mut()) }; MessageEvent::new( &*event_source.global(), diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs index 144f918b8d6..12cf7d0253b 100644 --- a/components/script/dom/eventtarget.rs +++ b/components/script/dom/eventtarget.rs @@ -33,7 +33,6 @@ use crate::dom::globalscope::GlobalScope; use crate::dom::node::document_from_node; use crate::dom::virtualmethods::VirtualMethods; use crate::dom::window::Window; -use crate::script_runtime::JSContext; use dom_struct::dom_struct; use fnv::FnvHasher; use js::jsapi::{JSAutoRealm, JSFunction, JS_GetFunctionObject, SourceText}; @@ -151,7 +150,6 @@ pub enum CompiledEventListener { } impl CompiledEventListener { - #[allow(unsafe_code)] // https://html.spec.whatwg.org/multipage/#the-event-handler-processing-algorithm pub fn call_or_handle_event<T: DomObject>( &self, @@ -169,7 +167,7 @@ impl CompiledEventListener { CommonEventHandler::ErrorEventHandler(ref handler) => { if let Some(event) = event.downcast::<ErrorEvent>() { let cx = object.global().get_cx(); - rooted!(in(cx) let error = unsafe { event.Error(JSContext::from_ptr(cx)) }); + rooted!(in(*cx) let error = event.Error(cx)); let return_value = handler.Call_( object, EventOrString::String(event.Message()), @@ -181,7 +179,7 @@ impl CompiledEventListener { ); // Step 4 if let Ok(return_value) = return_value { - rooted!(in(cx) let return_value = return_value); + rooted!(in(*cx) let return_value = return_value); if return_value.handle().is_boolean() && return_value.handle().to_boolean() == true { @@ -226,7 +224,7 @@ impl CompiledEventListener { CommonEventHandler::EventHandler(ref handler) => { if let Ok(value) = handler.Call_(object, event, exception_handle) { let cx = object.global().get_cx(); - rooted!(in(cx) let value = value); + rooted!(in(*cx) let value = value); let value = value.handle(); //Step 4 @@ -503,16 +501,16 @@ impl EventTarget { }; let cx = window.get_cx(); - let options = CompileOptionsWrapper::new(cx, url_serialized.as_ptr(), handler.line as u32); + let options = CompileOptionsWrapper::new(*cx, url_serialized.as_ptr(), handler.line as u32); // TODO step 1.10.1-3 (document, form owner, element in scope chain) - let scopechain = AutoObjectVectorWrapper::new(cx); + let scopechain = AutoObjectVectorWrapper::new(*cx); let _ac = enter_realm(&*window); - rooted!(in(cx) let mut handler = ptr::null_mut::<JSFunction>()); + rooted!(in(*cx) let mut handler = ptr::null_mut::<JSFunction>()); let rv = unsafe { CompileFunction( - cx, + *cx, scopechain.ptr, options.ptr, name.as_ptr(), @@ -530,9 +528,9 @@ impl EventTarget { if !rv || handler.get().is_null() { // Step 1.8.2 unsafe { - let _ac = JSAutoRealm::new(cx, self.reflector().get_jsobject().get()); + let _ac = JSAutoRealm::new(*cx, self.reflector().get_jsobject().get()); // FIXME(#13152): dispatch error event. - report_pending_exception(cx, false); + report_pending_exception(*cx, false); } // Step 1.8.1 / 1.8.3 return None; @@ -544,16 +542,16 @@ impl EventTarget { // Step 1.14 if is_error { Some(CommonEventHandler::ErrorEventHandler(unsafe { - OnErrorEventHandlerNonNull::new(JSContext::from_ptr(cx), funobj) + OnErrorEventHandlerNonNull::new(cx, funobj) })) } else { if ty == &atom!("beforeunload") { Some(CommonEventHandler::BeforeUnloadEventHandler(unsafe { - OnBeforeUnloadEventHandlerNonNull::new(JSContext::from_ptr(cx), funobj) + OnBeforeUnloadEventHandlerNonNull::new(cx, funobj) })) } else { Some(CommonEventHandler::EventHandler(unsafe { - EventHandlerNonNull::new(JSContext::from_ptr(cx), funobj) + EventHandlerNonNull::new(cx, funobj) })) } } @@ -568,7 +566,7 @@ impl EventTarget { let event_listener = listener.map(|listener| { InlineEventListener::Compiled(CommonEventHandler::EventHandler(unsafe { - EventHandlerNonNull::new(JSContext::from_ptr(cx), listener.callback()) + EventHandlerNonNull::new(cx, listener.callback()) })) }); self.set_inline_event_listener(Atom::from(ty), event_listener); @@ -583,7 +581,7 @@ impl EventTarget { let event_listener = listener.map(|listener| { InlineEventListener::Compiled(CommonEventHandler::ErrorEventHandler(unsafe { - OnErrorEventHandlerNonNull::new(JSContext::from_ptr(cx), listener.callback()) + OnErrorEventHandlerNonNull::new(cx, listener.callback()) })) }); self.set_inline_event_listener(Atom::from(ty), event_listener); @@ -601,7 +599,7 @@ impl EventTarget { let event_listener = listener.map(|listener| { InlineEventListener::Compiled(CommonEventHandler::BeforeUnloadEventHandler(unsafe { - OnBeforeUnloadEventHandlerNonNull::new(JSContext::from_ptr(cx), listener.callback()) + OnBeforeUnloadEventHandlerNonNull::new(cx, listener.callback()) })) }); self.set_inline_event_listener(Atom::from(ty), event_listener); @@ -613,10 +611,7 @@ impl EventTarget { let listener = self.get_inline_event_listener(&Atom::from(ty)); unsafe { listener.map(|listener| { - CallbackContainer::new( - JSContext::from_ptr(cx), - listener.parent().callback_holder().get(), - ) + CallbackContainer::new(cx, listener.parent().callback_holder().get()) }) } } diff --git a/components/script/dom/filereader.rs b/components/script/dom/filereader.rs index 0e158dedbab..fdba0e0aa75 100644 --- a/components/script/dom/filereader.rs +++ b/components/script/dom/filereader.rs @@ -266,7 +266,7 @@ impl FileReader { let _ac = enter_realm(&*fr); FileReader::perform_readasarraybuffer( &fr.result, - fr.global().get_cx(), + *fr.global().get_cx(), data, &blob_contents, ) diff --git a/components/script/dom/gamepad.rs b/components/script/dom/gamepad.rs index 08160bfd3ad..60a73a691fd 100644 --- a/components/script/dom/gamepad.rs +++ b/components/script/dom/gamepad.rs @@ -99,9 +99,9 @@ impl Gamepad { ); let cx = global.get_cx(); - rooted!(in (cx) let mut array = ptr::null_mut::<JSObject>()); + rooted!(in (*cx) let mut array = ptr::null_mut::<JSObject>()); unsafe { - let _ = Float64Array::create(cx, CreateWith::Slice(&state.axes), array.handle_mut()); + let _ = Float64Array::create(*cx, CreateWith::Slice(&state.axes), array.handle_mut()); } gamepad.axes.set(array.get()); @@ -173,7 +173,7 @@ impl Gamepad { self.timestamp.set(state.timestamp); unsafe { let cx = self.global().get_cx(); - typedarray!(in(cx) let axes: Float64Array = self.axes.get()); + typedarray!(in(*cx) let axes: Float64Array = self.axes.get()); if let Ok(mut array) = axes { array.update(&state.axes); } diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs index 385939000bc..ddf7dfc61cc 100644 --- a/components/script/dom/globalscope.rs +++ b/components/script/dom/globalscope.rs @@ -26,7 +26,7 @@ use crate::dom::window::Window; use crate::dom::workerglobalscope::WorkerGlobalScope; use crate::dom::workletglobalscope::WorkletGlobalScope; use crate::microtask::{Microtask, MicrotaskQueue}; -use crate::script_runtime::{CommonScriptMsg, ScriptChan, ScriptPort}; +use crate::script_runtime::{CommonScriptMsg, JSContext as SafeJSContext, ScriptChan, ScriptPort}; use crate::script_thread::{MainThreadScriptChan, ScriptThread}; use crate::task::TaskCanceller; use crate::task_source::dom_manipulation::DOMManipulationTaskSource; @@ -311,8 +311,8 @@ impl GlobalScope { } #[allow(unsafe_code)] - pub fn get_cx(&self) -> *mut JSContext { - Runtime::get() + pub fn get_cx(&self) -> SafeJSContext { + unsafe { SafeJSContext::from_ptr(Runtime::get()) } } pub fn crypto(&self) -> DomRoot<Crypto> { @@ -571,14 +571,14 @@ impl GlobalScope { let globalhandle = self.reflector().get_jsobject(); let filename = CString::new(filename).unwrap(); - let _ac = JSAutoRealm::new(cx, globalhandle.get()); + let _ac = JSAutoRealm::new(*cx, globalhandle.get()); let _aes = AutoEntryScript::new(self); - let options = CompileOptionsWrapper::new(cx, filename.as_ptr(), line_number); + let options = CompileOptionsWrapper::new(*cx, filename.as_ptr(), line_number); debug!("evaluating Dom string"); let result = unsafe { EvaluateUtf8( - cx, + *cx, options.ptr, code.as_ptr() as *const _, code.len() as libc::size_t, @@ -588,7 +588,7 @@ impl GlobalScope { if !result { debug!("error evaluating Dom string"); - unsafe { report_pending_exception(cx, true) }; + unsafe { report_pending_exception(*cx, true) }; } maybe_resume_unwind(); @@ -681,7 +681,7 @@ impl GlobalScope { pub fn perform_a_microtask_checkpoint(&self) { unsafe { self.microtask_queue.checkpoint( - self.get_cx(), + *self.get_cx(), |_| Some(DomRoot::from_ref(self)), vec![DomRoot::from_ref(self)], ); @@ -692,7 +692,7 @@ impl GlobalScope { #[allow(unsafe_code)] pub fn enqueue_microtask(&self, job: Microtask) { unsafe { - self.microtask_queue.enqueue(job, self.get_cx()); + self.microtask_queue.enqueue(job, *self.get_cx()); } } diff --git a/components/script/dom/history.rs b/components/script/dom/history.rs index 4bbcba64bad..583c58a00f1 100644 --- a/components/script/dom/history.rs +++ b/components/script/dom/history.rs @@ -117,7 +117,7 @@ impl History { match serialized_data { Some(serialized_data) => { let global_scope = self.window.upcast::<GlobalScope>(); - rooted!(in(global_scope.get_cx()) let mut state = UndefinedValue()); + rooted!(in(*global_scope.get_cx()) let mut state = UndefinedValue()); StructuredCloneData::Vector(serialized_data) .read(&global_scope, state.handle_mut()); self.state.set(state.get()); diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 4325add0212..1af49a42f79 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -654,7 +654,7 @@ impl HTMLScriptElement { } else { self.line_number as u32 }; - rooted!(in(window.get_cx()) let mut rval = UndefinedValue()); + rooted!(in(*window.get_cx()) let mut rval = UndefinedValue()); let global = window.upcast::<GlobalScope>(); global.evaluate_script_on_global_with_result( &script.text, diff --git a/components/script/dom/imagedata.rs b/components/script/dom/imagedata.rs index 8546f73e5cf..52851fdce36 100644 --- a/components/script/dom/imagedata.rs +++ b/components/script/dom/imagedata.rs @@ -41,7 +41,7 @@ impl ImageData { let len = width * height * 4; unsafe { let cx = global.get_cx(); - rooted!(in (cx) let mut js_object = ptr::null_mut::<JSObject>()); + rooted!(in (*cx) let mut js_object = ptr::null_mut::<JSObject>()); let data = match data { Some(ref mut d) => { d.resize(len as usize, 0); @@ -49,7 +49,7 @@ impl ImageData { }, None => CreateWith::Length(len), }; - Uint8ClampedArray::create(cx, data, js_object.handle_mut()).unwrap(); + Uint8ClampedArray::create(*cx, data, js_object.handle_mut()).unwrap(); Self::new_with_jsobject(global, width, Some(height), Some(js_object.get())) } } @@ -70,7 +70,7 @@ impl ImageData { // checking jsobject type and verifying (height * width * 4 == jsobject.byte_len()) if let Some(jsobject) = opt_jsobject { let cx = global.get_cx(); - typedarray!(in(cx) let array_res: Uint8ClampedArray = jsobject); + typedarray!(in(*cx) let array_res: Uint8ClampedArray = jsobject); let array = array_res.map_err(|_| { Error::Type("Argument to Image data is not an Uint8ClampedArray".to_owned()) })?; @@ -110,8 +110,8 @@ impl ImageData { } else { let len = width * height * 4; let cx = global.get_cx(); - rooted!(in (cx) let mut array = ptr::null_mut::<JSObject>()); - Uint8ClampedArray::create(cx, CreateWith::Length(len), array.handle_mut()).unwrap(); + rooted!(in (*cx) let mut array = ptr::null_mut::<JSObject>()); + Uint8ClampedArray::create(*cx, CreateWith::Length(len), array.handle_mut()).unwrap(); (*imagedata).data.set(array.get()); } diff --git a/components/script/dom/paintworkletglobalscope.rs b/components/script/dom/paintworkletglobalscope.rs index 296ad4998eb..bc04ab63440 100644 --- a/components/script/dom/paintworkletglobalscope.rs +++ b/components/script/dom/paintworkletglobalscope.rs @@ -253,12 +253,12 @@ impl PaintWorkletGlobalScope { ); let cx = self.worklet_global.get_cx(); - let _ac = JSAutoRealm::new(cx, self.worklet_global.reflector().get_jsobject().get()); + let _ac = JSAutoRealm::new(*cx, self.worklet_global.reflector().get_jsobject().get()); // TODO: Steps 1-2.1. // Step 2.2-5.1. - rooted!(in(cx) let mut class_constructor = UndefinedValue()); - rooted!(in(cx) let mut paint_function = UndefinedValue()); + rooted!(in(*cx) let mut class_constructor = UndefinedValue()); + rooted!(in(*cx) let mut paint_function = UndefinedValue()); let rendering_context = match self.paint_definitions.borrow().get(name) { None => { // Step 2.2. @@ -282,21 +282,21 @@ impl PaintWorkletGlobalScope { // prepopulate the paint instance in `RegisterPaint`, to avoid calling it in // the primary worklet thread. // https://github.com/servo/servo/issues/17377 - rooted!(in(cx) let mut paint_instance = UndefinedValue()); + rooted!(in(*cx) let mut paint_instance = UndefinedValue()); match self.paint_class_instances.borrow_mut().entry(name.clone()) { Entry::Occupied(entry) => paint_instance.set(entry.get().get()), Entry::Vacant(entry) => { // Step 5.2-5.3 let args = HandleValueArray::new(); - rooted!(in(cx) let mut result = null_mut::<JSObject>()); + rooted!(in(*cx) let mut result = null_mut::<JSObject>()); unsafe { - Construct1(cx, class_constructor.handle(), &args, result.handle_mut()); + Construct1(*cx, class_constructor.handle(), &args, result.handle_mut()); } paint_instance.set(ObjectValue(result.get())); - if unsafe { JS_IsExceptionPending(cx) } { + if unsafe { JS_IsExceptionPending(*cx) } { debug!("Paint constructor threw an exception {}.", name); unsafe { - JS_ClearPendingException(cx); + JS_ClearPendingException(*cx); } self.paint_definitions .borrow_mut() @@ -333,7 +333,7 @@ impl PaintWorkletGlobalScope { .collect(); let arguments_value_array = unsafe { HandleValueArray::from_rooted_slice(&*arguments_value_vec) }; - rooted!(in(cx) let argument_object = unsafe { JS_NewArrayObject(cx, &arguments_value_array) }); + rooted!(in(*cx) let argument_object = unsafe { JS_NewArrayObject(*cx, &arguments_value_array) }); let args_slice = [ ObjectValue(rendering_context.reflector().get_jsobject().get()), @@ -343,10 +343,10 @@ impl PaintWorkletGlobalScope { ]; let args = unsafe { HandleValueArray::from_rooted_slice(&args_slice) }; - rooted!(in(cx) let mut result = UndefinedValue()); + rooted!(in(*cx) let mut result = UndefinedValue()); unsafe { Call( - cx, + *cx, paint_instance.handle(), paint_function.handle(), &args, @@ -356,10 +356,10 @@ impl PaintWorkletGlobalScope { let missing_image_urls = rendering_context.take_missing_image_urls(); // Step 13. - if unsafe { JS_IsExceptionPending(cx) } { + if unsafe { JS_IsExceptionPending(*cx) } { debug!("Paint function threw an exception {}.", name); unsafe { - JS_ClearPendingException(cx); + JS_ClearPendingException(*cx); } return self.invalid_image(size_in_dpx, missing_image_urls); } @@ -518,8 +518,8 @@ impl PaintWorkletGlobalScopeMethods for PaintWorkletGlobalScope { fn RegisterPaint(&self, name: DOMString, paint_ctor: Rc<VoidFunction>) -> Fallible<()> { let name = Atom::from(name); let cx = self.worklet_global.get_cx(); - rooted!(in(cx) let paint_obj = paint_ctor.callback_holder().get()); - rooted!(in(cx) let paint_val = ObjectValue(paint_obj.get())); + rooted!(in(*cx) let paint_obj = paint_ctor.callback_holder().get()); + rooted!(in(*cx) let paint_val = ObjectValue(paint_obj.get())); debug!("Registering paint image name {}.", name); @@ -535,20 +535,20 @@ impl PaintWorkletGlobalScopeMethods for PaintWorkletGlobalScope { // Step 4-6. let mut property_names: Vec<String> = - unsafe { get_property(cx, paint_obj.handle(), "inputProperties", ()) }? + unsafe { get_property(*cx, paint_obj.handle(), "inputProperties", ()) }? .unwrap_or_default(); let properties = property_names.drain(..).map(Atom::from).collect(); // Step 7-9. let input_arguments: Vec<String> = - unsafe { get_property(cx, paint_obj.handle(), "inputArguments", ()) }? + unsafe { get_property(*cx, paint_obj.handle(), "inputArguments", ()) }? .unwrap_or_default(); // TODO: Steps 10-11. // Steps 12-13. let alpha: bool = - unsafe { get_property(cx, paint_obj.handle(), "alpha", ()) }?.unwrap_or(true); + unsafe { get_property(*cx, paint_obj.handle(), "alpha", ()) }?.unwrap_or(true); // Step 14 if unsafe { !IsConstructor(paint_obj.get()) } { @@ -556,19 +556,24 @@ impl PaintWorkletGlobalScopeMethods for PaintWorkletGlobalScope { } // Steps 15-16 - rooted!(in(cx) let mut prototype = UndefinedValue()); + rooted!(in(*cx) let mut prototype = UndefinedValue()); unsafe { - get_property_jsval(cx, paint_obj.handle(), "prototype", prototype.handle_mut())?; + get_property_jsval(*cx, paint_obj.handle(), "prototype", prototype.handle_mut())?; } if !prototype.is_object() { return Err(Error::Type(String::from("Prototype is not an object."))); } - rooted!(in(cx) let prototype = prototype.to_object()); + rooted!(in(*cx) let prototype = prototype.to_object()); // Steps 17-18 - rooted!(in(cx) let mut paint_function = UndefinedValue()); + rooted!(in(*cx) let mut paint_function = UndefinedValue()); unsafe { - get_property_jsval(cx, prototype.handle(), "paint", paint_function.handle_mut())?; + get_property_jsval( + *cx, + prototype.handle(), + "paint", + paint_function.handle_mut(), + )?; } if !paint_function.is_object() || unsafe { !IsCallable(paint_function.to_object()) } { return Err(Error::Type(String::from("Paint function is not callable."))); diff --git a/components/script/dom/promise.rs b/components/script/dom/promise.rs index fc1e39406f0..4dd6f53e711 100644 --- a/components/script/dom/promise.rs +++ b/components/script/dom/promise.rs @@ -89,17 +89,17 @@ impl Promise { #[allow(unsafe_code)] pub fn new_in_current_compartment(global: &GlobalScope, _comp: InCompartment) -> Rc<Promise> { let cx = global.get_cx(); - rooted!(in(cx) let mut obj = ptr::null_mut::<JSObject>()); + rooted!(in(*cx) let mut obj = ptr::null_mut::<JSObject>()); unsafe { - Promise::create_js_promise(cx, HandleObject::null(), obj.handle_mut()); - Promise::new_with_js_promise(obj.handle(), cx) + Promise::create_js_promise(*cx, HandleObject::null(), obj.handle_mut()); + Promise::new_with_js_promise(obj.handle(), *cx) } } #[allow(unsafe_code)] pub fn duplicate(&self) -> Rc<Promise> { let cx = self.global().get_cx(); - unsafe { Promise::new_with_js_promise(self.reflector().get_jsobject(), cx) } + unsafe { Promise::new_with_js_promise(self.reflector().get_jsobject(), *cx) } } #[allow(unsafe_code, unrooted_must_root)] @@ -166,10 +166,10 @@ impl Promise { { let cx = self.global().get_cx(); let _ac = enter_realm(&*self); - rooted!(in(cx) let mut v = UndefinedValue()); + rooted!(in(*cx) let mut v = UndefinedValue()); unsafe { - val.to_jsval(cx, v.handle_mut()); - self.resolve(cx, v.handle()); + val.to_jsval(*cx, v.handle_mut()); + self.resolve(*cx, v.handle()); } } @@ -187,10 +187,10 @@ impl Promise { { let cx = self.global().get_cx(); let _ac = enter_realm(&*self); - rooted!(in(cx) let mut v = UndefinedValue()); + rooted!(in(*cx) let mut v = UndefinedValue()); unsafe { - val.to_jsval(cx, v.handle_mut()); - self.reject(cx, v.handle()); + val.to_jsval(*cx, v.handle_mut()); + self.reject(*cx, v.handle()); } } @@ -198,10 +198,10 @@ impl Promise { pub fn reject_error(&self, error: Error) { let cx = self.global().get_cx(); let _ac = enter_realm(&*self); - rooted!(in(cx) let mut v = UndefinedValue()); + rooted!(in(*cx) let mut v = UndefinedValue()); unsafe { - error.to_jsval(cx, &self.global(), v.handle_mut()); - self.reject(cx, v.handle()); + error.to_jsval(*cx, &self.global(), v.handle_mut()); + self.reject(*cx, v.handle()); } } @@ -233,19 +233,19 @@ impl Promise { #[allow(unsafe_code)] pub fn append_native_handler(&self, handler: &PromiseNativeHandler) { let cx = self.global().get_cx(); - rooted!(in(cx) let resolve_func = - create_native_handler_function(cx, + rooted!(in(*cx) let resolve_func = + create_native_handler_function(*cx, handler.reflector().get_jsobject(), NativeHandlerTask::Resolve)); - rooted!(in(cx) let reject_func = - create_native_handler_function(cx, + rooted!(in(*cx) let reject_func = + create_native_handler_function(*cx, handler.reflector().get_jsobject(), NativeHandlerTask::Reject)); unsafe { let ok = AddPromiseReactions( - cx, + *cx, self.promise_obj(), resolve_func.handle(), reject_func.handle(), diff --git a/components/script/dom/serviceworkerglobalscope.rs b/components/script/dom/serviceworkerglobalscope.rs index b88d4d054e1..5af7f07ab0f 100644 --- a/components/script/dom/serviceworkerglobalscope.rs +++ b/components/script/dom/serviceworkerglobalscope.rs @@ -337,7 +337,7 @@ impl ServiceWorkerGlobalScope { unsafe { // Handle interrupt requests - JS_AddInterruptCallback(scope.get_cx(), Some(interrupt_callback)); + JS_AddInterruptCallback(*scope.get_cx(), Some(interrupt_callback)); } scope.execute_script(DOMString::from(source)); @@ -413,7 +413,7 @@ impl ServiceWorkerGlobalScope { let scope = self.upcast::<WorkerGlobalScope>(); let target = self.upcast(); let _ac = enter_realm(&*scope); - rooted!(in(scope.get_cx()) let mut message = UndefinedValue()); + rooted!(in(*scope.get_cx()) let mut message = UndefinedValue()); data.read(scope.upcast(), message.handle_mut()); ExtendableMessageEvent::dispatch_jsval(target, scope.upcast(), message.handle()); }, diff --git a/components/script/dom/userscripts.rs b/components/script/dom/userscripts.rs index af7c2b6d3f1..4e9cc59d27f 100644 --- a/components/script/dom/userscripts.rs +++ b/components/script/dom/userscripts.rs @@ -22,7 +22,7 @@ pub fn load_script(head: &HTMLHeadElement) { doc.add_delayed_task(task!(UserScriptExecute: move || { let win = win.root(); let cx = win.get_cx(); - rooted!(in(cx) let mut rval = UndefinedValue()); + rooted!(in(*cx) let mut rval = UndefinedValue()); let path = PathBuf::from(&path_str); let mut files = read_dir(&path) diff --git a/components/script/dom/vreyeparameters.rs b/components/script/dom/vreyeparameters.rs index 0a8260610e1..a7463c34a28 100644 --- a/components/script/dom/vreyeparameters.rs +++ b/components/script/dom/vreyeparameters.rs @@ -45,10 +45,10 @@ impl VREyeParameters { let fov = VRFieldOfView::new(&global, parameters.field_of_view.clone()); let cx = global.get_cx(); - rooted!(in (cx) let mut array = ptr::null_mut::<JSObject>()); + rooted!(in (*cx) let mut array = ptr::null_mut::<JSObject>()); unsafe { let _ = Float32Array::create( - cx, + *cx, CreateWith::Slice(¶meters.offset), array.handle_mut(), ); diff --git a/components/script/dom/vrframedata.rs b/components/script/dom/vrframedata.rs index 9cfcadd96a8..b7b8c743080 100644 --- a/components/script/dom/vrframedata.rs +++ b/components/script/dom/vrframedata.rs @@ -62,7 +62,7 @@ impl VRFrameData { global, VRFrameDataBinding::Wrap, ); - let cx = unsafe { JSContext::from_ptr(global.get_cx()) }; + let cx = global.get_cx(); create_typed_array(cx, &matrix, &root.left_proj); create_typed_array(cx, &matrix, &root.left_view); create_typed_array(cx, &matrix, &root.right_proj); @@ -90,7 +90,7 @@ impl VRFrameData { #[allow(unsafe_code)] pub fn update(&self, data: &WebVRFrameData) { unsafe { - let cx = JSContext::from_ptr(self.global().get_cx()); + let cx = self.global().get_cx(); typedarray!(in(*cx) let left_proj_array: Float32Array = self.left_proj.get()); if let Ok(mut array) = left_proj_array { array.update(&data.left_projection_matrix); diff --git a/components/script/dom/vrpose.rs b/components/script/dom/vrpose.rs index 898691a9679..2303641d6eb 100644 --- a/components/script/dom/vrpose.rs +++ b/components/script/dom/vrpose.rs @@ -7,9 +7,9 @@ use crate::dom::bindings::codegen::Bindings::VRPoseBinding::VRPoseMethods; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::globalscope::GlobalScope; -use crate::script_runtime::JSContext as SafeJSContext; +use crate::script_runtime::JSContext; use dom_struct::dom_struct; -use js::jsapi::{Heap, JSContext, JSObject}; +use js::jsapi::{Heap, JSObject}; use js::typedarray::{CreateWith, Float32Array}; use std::ptr; use std::ptr::NonNull; @@ -33,21 +33,19 @@ pub struct VRPose { } #[allow(unsafe_code)] -unsafe fn update_or_create_typed_array( - cx: *mut JSContext, - src: Option<&[f32]>, - dst: &Heap<*mut JSObject>, -) { +fn update_or_create_typed_array(cx: JSContext, src: Option<&[f32]>, dst: &Heap<*mut JSObject>) { match src { Some(data) => { if dst.get().is_null() { - rooted!(in (cx) let mut array = ptr::null_mut::<JSObject>()); - let _ = Float32Array::create(cx, CreateWith::Slice(data), array.handle_mut()); + rooted!(in (*cx) let mut array = ptr::null_mut::<JSObject>()); + let _ = unsafe { + Float32Array::create(*cx, CreateWith::Slice(data), array.handle_mut()) + }; (*dst).set(array.get()); } else { - typedarray!(in(cx) let array: Float32Array = dst.get()); + typedarray!(in(*cx) let array: Float32Array = dst.get()); if let Ok(mut array) = array { - array.update(data); + unsafe { array.update(data) }; } } }, @@ -96,69 +94,63 @@ impl VRPose { #[allow(unsafe_code)] pub fn update(&self, pose: &webvr::VRPose) { let cx = self.global().get_cx(); - unsafe { - update_or_create_typed_array( - cx, - pose.position.as_ref().map(|v| &v[..]), - &self.position, - ); - update_or_create_typed_array( - cx, - pose.orientation.as_ref().map(|v| &v[..]), - &self.orientation, - ); - update_or_create_typed_array( - cx, - pose.linear_velocity.as_ref().map(|v| &v[..]), - &self.linear_vel, - ); - update_or_create_typed_array( - cx, - pose.angular_velocity.as_ref().map(|v| &v[..]), - &self.angular_vel, - ); - update_or_create_typed_array( - cx, - pose.linear_acceleration.as_ref().map(|v| &v[..]), - &self.linear_acc, - ); - update_or_create_typed_array( - cx, - pose.angular_acceleration.as_ref().map(|v| &v[..]), - &self.angular_acc, - ); - } + update_or_create_typed_array(cx, pose.position.as_ref().map(|v| &v[..]), &self.position); + update_or_create_typed_array( + cx, + pose.orientation.as_ref().map(|v| &v[..]), + &self.orientation, + ); + update_or_create_typed_array( + cx, + pose.linear_velocity.as_ref().map(|v| &v[..]), + &self.linear_vel, + ); + update_or_create_typed_array( + cx, + pose.angular_velocity.as_ref().map(|v| &v[..]), + &self.angular_vel, + ); + update_or_create_typed_array( + cx, + pose.linear_acceleration.as_ref().map(|v| &v[..]), + &self.linear_acc, + ); + update_or_create_typed_array( + cx, + pose.angular_acceleration.as_ref().map(|v| &v[..]), + &self.angular_acc, + ); } } impl VRPoseMethods for VRPose { // https://w3c.github.io/webvr/#dom-vrpose-position - fn GetPosition(&self, _cx: SafeJSContext) -> Option<NonNull<JSObject>> { + fn GetPosition(&self, _cx: JSContext) -> Option<NonNull<JSObject>> { heap_to_option(&self.position) } // https://w3c.github.io/webvr/#dom-vrpose-linearvelocity - fn GetLinearVelocity(&self, _cx: SafeJSContext) -> Option<NonNull<JSObject>> { + fn GetLinearVelocity(&self, _cx: JSContext) -> Option<NonNull<JSObject>> { heap_to_option(&self.linear_vel) } // https://w3c.github.io/webvr/#dom-vrpose-linearacceleration - fn GetLinearAcceleration(&self, _cx: SafeJSContext) -> Option<NonNull<JSObject>> { + fn GetLinearAcceleration(&self, _cx: JSContext) -> Option<NonNull<JSObject>> { heap_to_option(&self.linear_acc) } // https://w3c.github.io/webvr/#dom-vrpose-orientation - fn GetOrientation(&self, _cx: SafeJSContext) -> Option<NonNull<JSObject>> { + fn GetOrientation(&self, _cx: JSContext) -> Option<NonNull<JSObject>> { heap_to_option(&self.orientation) } // https://w3c.github.io/webvr/#dom-vrpose-angularvelocity - fn GetAngularVelocity(&self, _cx: SafeJSContext) -> Option<NonNull<JSObject>> { + fn GetAngularVelocity(&self, _cx: JSContext) -> Option<NonNull<JSObject>> { heap_to_option(&self.angular_vel) } // https://w3c.github.io/webvr/#dom-vrpose-angularacceleration - fn GetAngularAcceleration(&self, _cx: SafeJSContext) -> Option<NonNull<JSObject>> { + fn GetAngularAcceleration(&self, _cx: JSContext) -> Option<NonNull<JSObject>> { heap_to_option(&self.angular_acc) } } diff --git a/components/script/dom/vrstageparameters.rs b/components/script/dom/vrstageparameters.rs index 0b525513f57..747608763e9 100644 --- a/components/script/dom/vrstageparameters.rs +++ b/components/script/dom/vrstageparameters.rs @@ -43,10 +43,10 @@ impl VRStageParameters { global: &GlobalScope, ) -> DomRoot<VRStageParameters> { let cx = global.get_cx(); - rooted!(in (cx) let mut array = ptr::null_mut::<JSObject>()); + rooted!(in (*cx) let mut array = ptr::null_mut::<JSObject>()); unsafe { let _ = Float32Array::create( - cx, + *cx, CreateWith::Slice(¶meters.sitting_to_standing_transform), array.handle_mut(), ); @@ -67,7 +67,7 @@ impl VRStageParameters { pub fn update(&self, parameters: &WebVRStageParameters) { unsafe { let cx = self.global().get_cx(); - typedarray!(in(cx) let array: Float32Array = self.transform.get()); + typedarray!(in(*cx) let array: Float32Array = self.transform.get()); if let Ok(mut array) = array { array.update(¶meters.sitting_to_standing_transform); } diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs index 5f783ab5a30..3051cc0ff33 100644 --- a/components/script/dom/websocket.rs +++ b/components/script/dom/websocket.rs @@ -569,26 +569,26 @@ impl TaskOnce for MessageReceivedTask { // global.get_cx() returns a valid `JSContext` pointer, so this is safe. unsafe { let cx = global.get_cx(); - let _ac = JSAutoRealm::new(cx, ws.reflector().get_jsobject().get()); - rooted!(in(cx) let mut message = UndefinedValue()); + let _ac = JSAutoRealm::new(*cx, ws.reflector().get_jsobject().get()); + rooted!(in(*cx) let mut message = UndefinedValue()); match self.message { - MessageData::Text(text) => text.to_jsval(cx, message.handle_mut()), + MessageData::Text(text) => text.to_jsval(*cx, message.handle_mut()), MessageData::Binary(data) => match ws.binary_type.get() { BinaryType::Blob => { let blob = Blob::new(&global, BlobImpl::new_from_bytes(data), "".to_owned()); - blob.to_jsval(cx, message.handle_mut()); + blob.to_jsval(*cx, message.handle_mut()); }, BinaryType::Arraybuffer => { - rooted!(in(cx) let mut array_buffer = ptr::null_mut::<JSObject>()); + rooted!(in(*cx) let mut array_buffer = ptr::null_mut::<JSObject>()); assert!(ArrayBuffer::create( - cx, + *cx, CreateWith::Slice(&data), array_buffer.handle_mut() ) .is_ok()); - (*array_buffer).to_jsval(cx, message.handle_mut()); + (*array_buffer).to_jsval(*cx, message.handle_mut()); }, }, } diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index c97a3fd08fb..ccbd08e1ef7 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -57,8 +57,7 @@ use crate::fetch; use crate::layout_image::fetch_image_for_layout; use crate::microtask::MicrotaskQueue; use crate::script_runtime::{ - CommonScriptMsg, JSContext as SafeJSContext, Runtime, ScriptChan, ScriptPort, - ScriptThreadEventCategory, + CommonScriptMsg, JSContext, Runtime, ScriptChan, ScriptPort, ScriptThreadEventCategory, }; use crate::script_thread::{ImageCacheMsg, MainThreadScriptChan, MainThreadScriptMsg}; use crate::script_thread::{ScriptThread, SendableMainThreadScriptChan}; @@ -80,7 +79,6 @@ use euclid::{Point2D, Rect, Scale, Size2D, Vector2D}; use ipc_channel::ipc::{channel, IpcSender}; use ipc_channel::router::ROUTER; use js::jsapi::JSAutoRealm; -use js::jsapi::JSContext; use js::jsapi::JSPROP_ENUMERATE; use js::jsapi::{GCReason, JS_GC}; use js::jsval::JSVal; @@ -372,8 +370,9 @@ impl Window { self.globalscope.origin() } - pub fn get_cx(&self) -> *mut JSContext { - self.js_runtime.borrow().as_ref().unwrap().cx() + #[allow(unsafe_code)] + pub fn get_cx(&self) -> JSContext { + unsafe { JSContext::from_ptr(self.js_runtime.borrow().as_ref().unwrap().cx()) } } pub fn main_thread_script_chan(&self) -> &Sender<MainThreadScriptMsg> { @@ -615,13 +614,13 @@ impl WindowMethods for Window { #[allow(unsafe_code)] // https://html.spec.whatwg.org/multipage/#dom-opener - fn Opener(&self, cx: SafeJSContext) -> JSVal { + fn Opener(&self, cx: JSContext) -> JSVal { unsafe { self.window_proxy().opener(*cx) } } #[allow(unsafe_code)] // https://html.spec.whatwg.org/multipage/#dom-opener - fn SetOpener(&self, cx: SafeJSContext, value: HandleValue) { + fn SetOpener(&self, cx: JSContext, value: HandleValue) { // Step 1. if value.is_null() { return self.window_proxy().disown(); @@ -744,7 +743,7 @@ impl WindowMethods for Window { // https://html.spec.whatwg.org/multipage/#dom-windowtimers-settimeout fn SetTimeout( &self, - _cx: SafeJSContext, + _cx: JSContext, callback: Rc<Function>, timeout: i32, args: Vec<HandleValue>, @@ -760,7 +759,7 @@ impl WindowMethods for Window { // https://html.spec.whatwg.org/multipage/#dom-windowtimers-settimeout fn SetTimeout_( &self, - _cx: SafeJSContext, + _cx: JSContext, callback: DOMString, timeout: i32, args: Vec<HandleValue>, @@ -782,7 +781,7 @@ impl WindowMethods for Window { // https://html.spec.whatwg.org/multipage/#dom-windowtimers-setinterval fn SetInterval( &self, - _cx: SafeJSContext, + _cx: JSContext, callback: Rc<Function>, timeout: i32, args: Vec<HandleValue>, @@ -798,7 +797,7 @@ impl WindowMethods for Window { // https://html.spec.whatwg.org/multipage/#dom-windowtimers-setinterval fn SetInterval_( &self, - _cx: SafeJSContext, + _cx: JSContext, callback: DOMString, timeout: i32, args: Vec<HandleValue>, @@ -902,12 +901,7 @@ impl WindowMethods for Window { } // https://html.spec.whatwg.org/multipage/#dom-window-postmessage - fn PostMessage( - &self, - cx: SafeJSContext, - message: HandleValue, - origin: DOMString, - ) -> ErrorResult { + fn PostMessage(&self, cx: JSContext, message: HandleValue, origin: DOMString) -> ErrorResult { let source_global = GlobalScope::incumbent().expect("no incumbent global??"); let source = source_global.as_window(); @@ -948,7 +942,7 @@ impl WindowMethods for Window { #[allow(unsafe_code)] fn Gc(&self) { unsafe { - JS_GC(self.get_cx(), GCReason::API); + JS_GC(*self.get_cx(), GCReason::API); } } @@ -958,7 +952,7 @@ impl WindowMethods for Window { } #[allow(unsafe_code)] - fn WebdriverCallback(&self, cx: SafeJSContext, val: HandleValue) { + fn WebdriverCallback(&self, cx: JSContext, val: HandleValue) { let rv = unsafe { jsval_to_webdriver(*cx, val) }; let opt_chan = self.webdriver_script_chan.borrow_mut().take(); if let Some(chan) = opt_chan { @@ -2177,7 +2171,7 @@ impl Window { player_context, }); - unsafe { WindowBinding::Wrap(SafeJSContext::from_ptr(runtime.cx()), win) } + unsafe { WindowBinding::Wrap(JSContext::from_ptr(runtime.cx()), win) } } pub fn pipeline_id(&self) -> Option<PipelineId> { @@ -2279,8 +2273,8 @@ impl Window { // Steps 7.2.-7.5. let cx = this.get_cx(); let obj = this.reflector().get_jsobject(); - let _ac = JSAutoRealm::new(cx, obj.get()); - rooted!(in(cx) let mut message_clone = UndefinedValue()); + let _ac = JSAutoRealm::new(*cx, obj.get()); + rooted!(in(*cx) let mut message_clone = UndefinedValue()); serialize_with_transfer_result.read( this.upcast(), message_clone.handle_mut(), diff --git a/components/script/dom/windowproxy.rs b/components/script/dom/windowproxy.rs index d527a73c86f..0c7a00978bc 100644 --- a/components/script/dom/windowproxy.rs +++ b/components/script/dom/windowproxy.rs @@ -152,10 +152,10 @@ impl WindowProxy { ((*get_object_class(window_jsobject.get())).flags & JSCLASS_IS_GLOBAL), 0 ); - let _ac = JSAutoRealm::new(cx, window_jsobject.get()); + let _ac = JSAutoRealm::new(*cx, window_jsobject.get()); // Create a new window proxy. - rooted!(in(cx) let js_proxy = NewWindowProxy(cx, window_jsobject, handler)); + rooted!(in(*cx) let js_proxy = NewWindowProxy(*cx, window_jsobject, handler)); assert!(!js_proxy.is_null()); // Create a new browsing context. @@ -178,7 +178,7 @@ impl WindowProxy { ); // Notify the JS engine about the new window proxy binding. - SetWindowProxy(cx, window_jsobject, js_proxy.handle()); + SetWindowProxy(*cx, window_jsobject, js_proxy.handle()); // Set the reflector. debug!( @@ -223,10 +223,10 @@ impl WindowProxy { ((*get_object_class(window_jsobject.get())).flags & JSCLASS_IS_GLOBAL), 0 ); - let _ac = JSAutoRealm::new(cx, window_jsobject.get()); + let _ac = JSAutoRealm::new(*cx, window_jsobject.get()); // Create a new window proxy. - rooted!(in(cx) let js_proxy = NewWindowProxy(cx, window_jsobject, handler)); + rooted!(in(*cx) let js_proxy = NewWindowProxy(*cx, window_jsobject, handler)); assert!(!js_proxy.is_null()); // The window proxy owns the browsing context. @@ -238,7 +238,7 @@ impl WindowProxy { ); // Notify the JS engine about the new window proxy binding. - SetWindowProxy(cx, window_jsobject, js_proxy.handle()); + SetWindowProxy(*cx, window_jsobject, js_proxy.handle()); // Set the reflector. debug!( @@ -576,20 +576,20 @@ impl WindowProxy { // of the old window proxy to the new window proxy, then // making the old window proxy a cross-compartment wrapper // pointing to the new window proxy. - rooted!(in(cx) let new_js_proxy = NewWindowProxy(cx, window_jsobject, handler)); + rooted!(in(*cx) let new_js_proxy = NewWindowProxy(*cx, window_jsobject, handler)); debug!( "Transplanting proxy from {:p} to {:p}.", old_js_proxy.get(), new_js_proxy.get() ); - rooted!(in(cx) let new_js_proxy = JS_TransplantObject(cx, old_js_proxy, new_js_proxy.handle())); + rooted!(in(*cx) let new_js_proxy = JS_TransplantObject(*cx, old_js_proxy, new_js_proxy.handle())); debug!("Transplanted proxy is {:p}.", new_js_proxy.get()); // Transfer ownership of this browsing context from the old window proxy to the new one. SetProxyReservedSlot(new_js_proxy.get(), 0, &PrivateValue(self.as_void_ptr())); // Notify the JS engine about the new window proxy binding. - SetWindowProxy(cx, window_jsobject, new_js_proxy.handle()); + SetWindowProxy(*cx, window_jsobject, new_js_proxy.handle()); // Update the reflector. debug!( diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs index 4b8384e3ed8..1ae17571fbb 100644 --- a/components/script/dom/worker.rs +++ b/components/script/dom/worker.rs @@ -147,7 +147,7 @@ impl Worker { let global = worker.global(); let target = worker.upcast(); let _ac = enter_realm(target); - rooted!(in(global.get_cx()) let mut message = UndefinedValue()); + rooted!(in(*global.get_cx()) let mut message = UndefinedValue()); data.read(&global, message.handle_mut()); MessageEvent::dispatch_jsval(target, &global, message.handle(), None, None); } @@ -186,7 +186,7 @@ impl WorkerMethods for Worker { // Step 3 let cx = self.global().get_cx(); - unsafe { JS_RequestInterruptCallback(cx) }; + unsafe { JS_RequestInterruptCallback(*cx) }; } // https://html.spec.whatwg.org/multipage/#handler-worker-onmessage diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs index bf21b8442c3..2e5a199a08f 100644 --- a/components/script/dom/workerglobalscope.rs +++ b/components/script/dom/workerglobalscope.rs @@ -26,7 +26,7 @@ use crate::dom::window::{base64_atob, base64_btoa}; use crate::dom::workerlocation::WorkerLocation; use crate::dom::workernavigator::WorkerNavigator; use crate::fetch; -use crate::script_runtime::JSContext as SafeJSContext; +use crate::script_runtime::JSContext; use crate::script_runtime::{get_reports, CommonScriptMsg, Runtime, ScriptChan, ScriptPort}; use crate::task::TaskCanceller; use crate::task_source::dom_manipulation::DOMManipulationTaskSource; @@ -40,7 +40,7 @@ use crossbeam_channel::Receiver; use devtools_traits::{DevtoolScriptControlMsg, WorkerId}; use dom_struct::dom_struct; use ipc_channel::ipc::IpcSender; -use js::jsapi::{JSAutoRealm, JSContext}; +use js::jsapi::JSAutoRealm; use js::jsval::UndefinedValue; use js::panic::maybe_resume_unwind; use js::rust::{HandleValue, ParentRuntime}; @@ -165,8 +165,9 @@ impl WorkerGlobalScope { &self.from_devtools_receiver } - pub fn get_cx(&self) -> *mut JSContext { - self.runtime.cx() + #[allow(unsafe_code)] + pub fn get_cx(&self) -> JSContext { + unsafe { JSContext::from_ptr(self.runtime.cx()) } } pub fn is_closing(&self) -> bool { @@ -292,7 +293,7 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope { // https://html.spec.whatwg.org/multipage/#dom-windowtimers-settimeout fn SetTimeout( &self, - _cx: SafeJSContext, + _cx: JSContext, callback: Rc<Function>, timeout: i32, args: Vec<HandleValue>, @@ -308,7 +309,7 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope { // https://html.spec.whatwg.org/multipage/#dom-windowtimers-settimeout fn SetTimeout_( &self, - _cx: SafeJSContext, + _cx: JSContext, callback: DOMString, timeout: i32, args: Vec<HandleValue>, @@ -330,7 +331,7 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope { // https://html.spec.whatwg.org/multipage/#dom-windowtimers-setinterval fn SetInterval( &self, - _cx: SafeJSContext, + _cx: JSContext, callback: Rc<Function>, timeout: i32, args: Vec<HandleValue>, @@ -346,7 +347,7 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope { // https://html.spec.whatwg.org/multipage/#dom-windowtimers-setinterval fn SetInterval_( &self, - _cx: SafeJSContext, + _cx: JSContext, callback: DOMString, timeout: i32, args: Vec<HandleValue>, @@ -477,7 +478,7 @@ impl WorkerGlobalScope { CommonScriptMsg::CollectReports(reports_chan) => { let cx = self.get_cx(); let path_seg = format!("url({})", self.get_url()); - let reports = get_reports(cx, path_seg); + let reports = get_reports(*cx, path_seg); reports_chan.send(reports); }, } diff --git a/components/script/dom/workletglobalscope.rs b/components/script/dom/workletglobalscope.rs index 20f99c76ee2..90fa5bd0115 100644 --- a/components/script/dom/workletglobalscope.rs +++ b/components/script/dom/workletglobalscope.rs @@ -10,13 +10,13 @@ use crate::dom::paintworkletglobalscope::PaintWorkletTask; use crate::dom::testworkletglobalscope::TestWorkletGlobalScope; use crate::dom::testworkletglobalscope::TestWorkletTask; use crate::dom::worklet::WorkletExecutor; +use crate::script_runtime::JSContext; use crate::script_thread::MainThreadScriptMsg; use crossbeam_channel::Sender; use devtools_traits::ScriptToDevtoolsControlMsg; use dom_struct::dom_struct; use ipc_channel::ipc; use ipc_channel::ipc::IpcSender; -use js::jsapi::JSContext; use js::jsval::UndefinedValue; use js::rust::Runtime; use msg::constellation_msg::PipelineId; @@ -83,14 +83,14 @@ impl WorkletGlobalScope { } /// Get the JS context. - pub fn get_cx(&self) -> *mut JSContext { + pub fn get_cx(&self) -> JSContext { self.globalscope.get_cx() } /// Evaluate a JS script in this global. pub fn evaluate_js(&self, script: &str) -> bool { debug!("Evaluating Dom."); - rooted!(in (self.globalscope.get_cx()) let mut rval = UndefinedValue()); + rooted!(in (*self.globalscope.get_cx()) let mut rval = UndefinedValue()); self.globalscope .evaluate_js_on_global_with_result(&*script, rval.handle_mut()) } diff --git a/components/script/dom/xrrigidtransform.rs b/components/script/dom/xrrigidtransform.rs index b9690187494..2b09b89e096 100644 --- a/components/script/dom/xrrigidtransform.rs +++ b/components/script/dom/xrrigidtransform.rs @@ -119,10 +119,9 @@ impl XRRigidTransformMethods for XRRigidTransform { }) } // https://immersive-web.github.io/webxr/#dom-xrrigidtransform-matrix - #[allow(unsafe_code)] fn Matrix(&self, _cx: JSContext) -> NonNull<JSObject> { if self.matrix.get().is_null() { - let cx = unsafe { JSContext::from_ptr(self.global().get_cx()) }; + let cx = self.global().get_cx(); // According to the spec all matrices are column-major, // however euclid uses row vectors so we use .to_row_major_array() let arr = self.transform.to_transform().to_row_major_array(); diff --git a/components/script/dom/xrview.rs b/components/script/dom/xrview.rs index bc51d8f38c8..04a4a2b66c8 100644 --- a/components/script/dom/xrview.rs +++ b/components/script/dom/xrview.rs @@ -40,7 +40,6 @@ impl XRView { } } - #[allow(unsafe_code)] pub fn new<V: Copy>( global: &GlobalScope, session: &XRSession, @@ -65,7 +64,7 @@ impl XRView { // row_major since euclid uses row vectors let proj = view.projection.to_row_major_array(); - let cx = unsafe { JSContext::from_ptr(global.get_cx()) }; + let cx = global.get_cx(); create_typed_array(cx, &proj, &ret.proj); ret } diff --git a/components/script/dom/xrviewerpose.rs b/components/script/dom/xrviewerpose.rs index ce3f94c1817..8ebabc0781f 100644 --- a/components/script/dom/xrviewerpose.rs +++ b/components/script/dom/xrviewerpose.rs @@ -57,10 +57,10 @@ impl XRViewerPose { XRViewerPoseBinding::Wrap, ); + let cx = global.get_cx(); unsafe { - let cx = global.get_cx(); - rooted!(in(cx) let mut jsval = UndefinedValue()); - views.to_jsval(cx, jsval.handle_mut()); + rooted!(in(*cx) let mut jsval = UndefinedValue()); + views.to_jsval(*cx, jsval.handle_mut()); pose.views.set(jsval.get()); } diff --git a/components/script/dom/xrwebgllayer.rs b/components/script/dom/xrwebgllayer.rs index a5f06df0e52..148d773fe6f 100644 --- a/components/script/dom/xrwebgllayer.rs +++ b/components/script/dom/xrwebgllayer.rs @@ -115,7 +115,7 @@ impl XRWebGLLayer { 0, constants::RGBA, constants::UNSIGNED_BYTE, - pixels.root(cx), + pixels.root(*cx), ); // Bind the new texture to the framebuffer diff --git a/components/script/script_runtime.rs b/components/script/script_runtime.rs index 4c7953de443..fb94d30fafd 100644 --- a/components/script/script_runtime.rs +++ b/components/script/script_runtime.rs @@ -245,7 +245,7 @@ unsafe extern "C" fn promise_rejection_tracker( let cx = target.global().get_cx(); let root_promise = trusted_promise.root(); - rooted!(in(cx) let reason = GetPromiseResult(root_promise.reflector().get_jsobject())); + rooted!(in(*cx) let reason = GetPromiseResult(root_promise.reflector().get_jsobject())); let event = PromiseRejectionEvent::new( &target.global(), @@ -270,9 +270,8 @@ unsafe extern "C" fn promise_rejection_tracker( #[allow(unsafe_code, unrooted_must_root)] /// https://html.spec.whatwg.org/multipage/#notify-about-rejected-promises pub fn notify_about_rejected_promises(global: &GlobalScope) { + let cx = global.get_cx(); unsafe { - let cx = global.get_cx(); - // Step 2. if global.get_uncaught_rejections().borrow().len() > 0 { // Step 1. @@ -282,7 +281,7 @@ pub fn notify_about_rejected_promises(global: &GlobalScope) { .iter() .map(|promise| { let promise = - Promise::new_with_js_promise(Handle::from_raw(promise.handle()), cx); + Promise::new_with_js_promise(Handle::from_raw(promise.handle()), *cx); TrustedPromise::new(promise) }) @@ -309,7 +308,7 @@ pub fn notify_about_rejected_promises(global: &GlobalScope) { } // Step 4-2. - rooted!(in(cx) let reason = GetPromiseResult(promise.reflector().get_jsobject())); + rooted!(in(*cx) let reason = GetPromiseResult(promise.reflector().get_jsobject())); let event = PromiseRejectionEvent::new( &target.global(), diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 0ceed35db57..81ef7d9493c 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -70,7 +70,7 @@ use crate::dom::worklet::WorkletThreadPool; use crate::dom::workletglobalscope::WorkletGlobalScopeInit; use crate::fetch::FetchCanceller; use crate::microtask::{Microtask, MicrotaskQueue}; -use crate::script_runtime::{get_reports, new_rt_and_cx, Runtime, ScriptPort}; +use crate::script_runtime::{get_reports, new_rt_and_cx, JSContext, Runtime, ScriptPort}; use crate::script_runtime::{CommonScriptMsg, ScriptChan, ScriptThreadEventCategory}; use crate::serviceworkerjob::{Job, JobQueue}; use crate::task_manager::TaskManager; @@ -102,7 +102,7 @@ use hyper_serde::Serde; use ipc_channel::ipc::{self, IpcSender}; use ipc_channel::router::ROUTER; use js::glue::GetWindowProxyClass; -use js::jsapi::{JSContext, JS_SetWrapObjectCallbacks}; +use js::jsapi::JS_SetWrapObjectCallbacks; use js::jsapi::{JSTracer, SetWindowProxyClass}; use js::jsval::UndefinedValue; use js::rust::ParentRuntime; @@ -915,7 +915,7 @@ impl ScriptThread { let script_thread = &*script_thread; script_thread .microtask_queue - .enqueue(task, script_thread.get_cx()); + .enqueue(task, *script_thread.get_cx()); } } }); @@ -1317,8 +1317,9 @@ impl ScriptThread { } } - pub fn get_cx(&self) -> *mut JSContext { - self.js_runtime.cx() + #[allow(unsafe_code)] + pub fn get_cx(&self) -> JSContext { + unsafe { JSContext::from_ptr(self.js_runtime.cx()) } } /// Starts the script thread. After calling this method, the script thread will loop receiving @@ -2349,7 +2350,7 @@ impl ScriptThread { let path_seg = format!("url({})", urls); let mut reports = vec![]; - reports.extend(get_reports(self.get_cx(), path_seg)); + reports.extend(get_reports(*self.get_cx(), path_seg)); reports_chan.send(reports); } @@ -3540,13 +3541,13 @@ impl ScriptThread { // Script source is ready to be evaluated (11.) let _ac = enter_realm(global_scope); - rooted!(in(global_scope.get_cx()) let mut jsval = UndefinedValue()); + rooted!(in(*global_scope.get_cx()) let mut jsval = UndefinedValue()); global_scope.evaluate_js_on_global_with_result(&script_source, jsval.handle_mut()); load_data.js_eval_result = if jsval.get().is_string() { unsafe { let strval = DOMString::from_jsval( - global_scope.get_cx(), + *global_scope.get_cx(), jsval.handle(), StringificationBehavior::Empty, ); @@ -3776,7 +3777,7 @@ impl ScriptThread { let script_thread = &*root.get().unwrap(); script_thread .microtask_queue - .enqueue(job, script_thread.get_cx()); + .enqueue(job, *script_thread.get_cx()); }); } @@ -3791,7 +3792,7 @@ impl ScriptThread { unsafe { self.microtask_queue.checkpoint( - self.get_cx(), + *self.get_cx(), |id| self.documents.borrow().find_global(id), globals, ) diff --git a/components/script/timers.rs b/components/script/timers.rs index 45c809394a1..5534df60d45 100644 --- a/components/script/timers.rs +++ b/components/script/timers.rs @@ -517,7 +517,7 @@ impl JsTimerTask { InternalTimerCallback::StringTimerCallback(ref code_str) => { let global = this.global(); let cx = global.get_cx(); - rooted!(in(cx) let mut rval = UndefinedValue()); + rooted!(in(*cx) let mut rval = UndefinedValue()); global.evaluate_js_on_global_with_result(code_str, rval.handle_mut()); }, diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index ab08c0efe7d..c8aad9a6b4c 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -145,11 +145,11 @@ pub fn handle_execute_script( Some(window) => { let result = unsafe { let cx = window.get_cx(); - rooted!(in(cx) let mut rval = UndefinedValue()); + rooted!(in(*cx) let mut rval = UndefinedValue()); window .upcast::<GlobalScope>() .evaluate_js_on_global_with_result(&eval, rval.handle_mut()); - jsval_to_webdriver(cx, rval.handle()) + jsval_to_webdriver(*cx, rval.handle()) }; reply.send(result).unwrap(); @@ -171,7 +171,7 @@ pub fn handle_execute_async_script( Some(window) => { let cx = window.get_cx(); window.set_webdriver_script_chan(Some(reply)); - rooted!(in(cx) let mut rval = UndefinedValue()); + rooted!(in(*cx) let mut rval = UndefinedValue()); window .upcast::<GlobalScope>() .evaluate_js_on_global_with_result(&eval, rval.handle_mut()); @@ -725,21 +725,21 @@ pub fn handle_get_property( Some(node) => { let cx = documents.find_document(pipeline).unwrap().window().get_cx(); - rooted!(in(cx) let mut property = UndefinedValue()); + rooted!(in(*cx) let mut property = UndefinedValue()); match unsafe { get_property_jsval( - cx, + *cx, node.reflector().get_jsobject(), &name, property.handle_mut(), ) } { - Ok(_) => match unsafe { jsval_to_webdriver(cx, property.handle()) } { + Ok(_) => match unsafe { jsval_to_webdriver(*cx, property.handle()) } { Ok(property) => Ok(property), Err(_) => Ok(WebDriverJSValue::Undefined), }, Err(error) => { - unsafe { throw_dom_exception(cx, &node.reflector().global(), error) }; + unsafe { throw_dom_exception(*cx, &node.reflector().global(), error) }; Ok(WebDriverJSValue::Undefined) }, } |