Pass InCompartment by value

This commit is contained in:
Aron Zwaan 2019-04-24 22:33:16 +02:00
parent 1b6949d4cf
commit e2e6e2ac94
26 changed files with 52 additions and 50 deletions

View file

@ -54,7 +54,7 @@ pub fn consume_body<T: BodyOperations + DomObject>(object: &T, body_type: BodyTy
let in_compartment_proof = AlreadyInCompartment::assert(&object.global());
let promise = Promise::new_in_current_compartment(
&object.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// Step 1

View file

@ -17,6 +17,7 @@ impl AlreadyInCompartment {
}
}
#[derive(Clone, Copy)]
pub enum InCompartment<'a> {
Already(&'a AlreadyInCompartment),
Entered(&'a JSAutoCompartment),

View file

@ -113,7 +113,7 @@ impl AudioContextMethods for AudioContext {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let promise = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// Step 2.
@ -178,7 +178,7 @@ impl AudioContextMethods for AudioContext {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let promise = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// Step 2.

View file

@ -277,7 +277,7 @@ impl BaseAudioContextMethods for BaseAudioContext {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let promise = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// Step 2.
@ -418,7 +418,7 @@ impl BaseAudioContextMethods for BaseAudioContext {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let promise = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
let global = self.global();
let window = global.as_window();

View file

@ -295,7 +295,7 @@ where
let in_compartment_proof = AlreadyInCompartment::assert(&attribute.global());
let p = Promise::new_in_current_compartment(
&attribute.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
let result_uuid = if let Some(u) = uuid {
@ -539,7 +539,7 @@ impl BluetoothMethods for Bluetooth {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let p = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// Step 1.
if (option.filters.is_some() && option.acceptAllDevices) ||
@ -561,7 +561,7 @@ impl BluetoothMethods for Bluetooth {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let p = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// Step 1. We did not override the method
// Step 2 - 3. in handle_response

View file

@ -282,7 +282,7 @@ impl BluetoothDeviceMethods for BluetoothDevice {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let p = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
let sender = response_async(&p, self);
// TODO: Step 1.

View file

@ -139,7 +139,7 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let p = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// Step 1.
@ -176,7 +176,7 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let p = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// Step 1.
@ -231,7 +231,7 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let p = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// Step 1.
@ -272,7 +272,7 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let p = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
let sender = response_async(&p, self);

View file

@ -98,7 +98,7 @@ impl BluetoothRemoteGATTDescriptorMethods for BluetoothRemoteGATTDescriptor {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let p = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// Step 1.
@ -134,7 +134,7 @@ impl BluetoothRemoteGATTDescriptorMethods for BluetoothRemoteGATTDescriptor {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let p = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// Step 1.

View file

@ -76,7 +76,7 @@ impl BluetoothRemoteGATTServerMethods for BluetoothRemoteGATTServer {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let p = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
let sender = response_async(&p, self);

View file

@ -409,7 +409,7 @@ impl CustomElementRegistryMethods for CustomElementRegistry {
let in_compartment_proof = AlreadyInCompartment::assert(&global_scope);
let promise = Promise::new_in_current_compartment(
&global_scope,
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
promise.reject_native(&DOMException::new(&global_scope, DOMErrorName::SyntaxError));
return promise;
@ -420,7 +420,7 @@ impl CustomElementRegistryMethods for CustomElementRegistry {
let in_compartment_proof = AlreadyInCompartment::assert(&global_scope);
let promise = Promise::new_in_current_compartment(
&global_scope,
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
promise.resolve_native(&UndefinedValue());
return promise;
@ -434,7 +434,7 @@ impl CustomElementRegistryMethods for CustomElementRegistry {
let in_compartment_proof = AlreadyInCompartment::assert(&global_scope);
let promise = Promise::new_in_current_compartment(
&global_scope,
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
map.insert(name, promise.clone());
promise

View file

@ -3135,7 +3135,7 @@ impl Document {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let promise = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
let mut error = false;
@ -3206,7 +3206,7 @@ impl Document {
let in_compartment_proof = AlreadyInCompartment::assert(&global);
let promise = Promise::new_in_current_compartment(
&global,
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// Step 2
if self.fullscreen_element.get().is_none() {

View file

@ -1688,7 +1688,7 @@ impl HTMLMediaElementMethods for HTMLMediaElement {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let promise = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// Step 1.
// FIXME(nox): Reject promise if not allowed to play.

View file

@ -48,7 +48,7 @@ impl MediaDevicesMethods for MediaDevices {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let p = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
let media = ServoMedia::get().unwrap();
let mut tracks = vec![];

View file

@ -48,7 +48,7 @@ impl NavigationPreloadManagerMethods for NavigationPreloadManager {
let in_compartment_proof = AlreadyInCompartment::assert(&*self.global());
let promise = Promise::new_in_current_compartment(
&*self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// 2.
@ -74,7 +74,7 @@ impl NavigationPreloadManagerMethods for NavigationPreloadManager {
let in_compartment_proof = AlreadyInCompartment::assert(&*self.global());
let promise = Promise::new_in_current_compartment(
&*self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// 2.
@ -100,7 +100,7 @@ impl NavigationPreloadManagerMethods for NavigationPreloadManager {
let in_compartment_proof = AlreadyInCompartment::assert(&*self.global());
let promise = Promise::new_in_current_compartment(
&*self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// 2.
@ -126,7 +126,7 @@ impl NavigationPreloadManagerMethods for NavigationPreloadManager {
let in_compartment_proof = AlreadyInCompartment::assert(&*self.global());
let promise = Promise::new_in_current_compartment(
&*self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// 2.
let mut state = NavigationPreloadState::empty();

View file

@ -155,7 +155,7 @@ impl NavigatorMethods for Navigator {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let promise = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
let displays = self.Xr().get_displays();
match displays {

View file

@ -118,7 +118,7 @@ impl OfflineAudioContextMethods for OfflineAudioContext {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let promise = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
if self.rendering_started.get() {
promise.reject_error(Error::InvalidState);

View file

@ -102,7 +102,7 @@ impl Permissions {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
)
},
};

View file

@ -11,7 +11,7 @@
//! native Promise values that refer to the same JS value yet are distinct native objects
//! (ie. address equality for the native objects is meaningless).
use crate::compartments::InCompartment;
use crate::compartments::{AlreadyInCompartment, InCompartment};
use crate::dom::bindings::conversions::root_from_object;
use crate::dom::bindings::error::{Error, Fallible};
use crate::dom::bindings::reflector::{DomObject, MutDomObject, Reflector};
@ -80,12 +80,13 @@ impl Drop for Promise {
}
impl Promise {
pub fn new(global: &GlobalScope, comp: &InCompartment) -> Rc<Promise> {
Promise::new_in_current_compartment(global, comp)
pub fn new(global: &GlobalScope) -> Rc<Promise> {
let comp = AlreadyInCompartment::assert(&global);
Promise::new_in_current_compartment(global, InCompartment::Already(&comp))
}
#[allow(unsafe_code)]
pub fn new_in_current_compartment(global: &GlobalScope, _comp: &InCompartment) -> Rc<Promise> {
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>());
unsafe {

View file

@ -432,7 +432,7 @@ impl RTCPeerConnectionMethods for RTCPeerConnection {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let p = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
if candidate.sdpMid.is_none() && candidate.sdpMLineIndex.is_none() {
p.reject_error(Error::Type(format!(
@ -471,7 +471,7 @@ impl RTCPeerConnectionMethods for RTCPeerConnection {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let p = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
if self.closed.get() {
p.reject_error(Error::InvalidState);
@ -487,7 +487,7 @@ impl RTCPeerConnectionMethods for RTCPeerConnection {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let p = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
if self.closed.get() {
p.reject_error(Error::InvalidState);
@ -514,7 +514,7 @@ impl RTCPeerConnectionMethods for RTCPeerConnection {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let p = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
let this = Trusted::new(self);
let desc: SessionDescription = desc.into();
@ -551,7 +551,7 @@ impl RTCPeerConnectionMethods for RTCPeerConnection {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let p = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
let this = Trusted::new(self);
let desc: SessionDescription = desc.into();

View file

@ -60,7 +60,7 @@ impl ServiceWorkerContainerMethods for ServiceWorkerContainer {
let in_compartment_proof = AlreadyInCompartment::assert(&*self.global());
let promise = Promise::new_in_current_compartment(
&*self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
let USVString(ref script_url) = script_url;
let api_base_url = self.global().api_base_url();

View file

@ -1024,7 +1024,7 @@ impl TestBindingMethods for TestBinding {
let in_compartment_proof = AlreadyInCompartment::assert(&global);
let p = Promise::new_in_current_compartment(
&global,
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
p.append_native_handler(&handler);
return p;
@ -1052,7 +1052,7 @@ impl TestBindingMethods for TestBinding {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
)
}

View file

@ -346,7 +346,7 @@ impl VRDisplayMethods for VRDisplay {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let promise = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// TODO: WebVR spec: this method must be called in response to a user gesture
@ -414,7 +414,7 @@ impl VRDisplayMethods for VRDisplay {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let promise = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// WebVR spec: If the VRDisplay is not presenting the promise MUST be rejected.

View file

@ -117,7 +117,7 @@ impl WorkletMethods for Worklet {
let in_compartment_proof = AlreadyInCompartment::assert(&global);
let promise = Promise::new_in_current_compartment(
&global,
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// Step 3.

View file

@ -89,7 +89,7 @@ impl XRMethods for XR {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let promise = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
if mode == XRSessionMode::Immersive_vr {
promise.resolve_native(&());
@ -106,7 +106,7 @@ impl XRMethods for XR {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let promise = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
if options.mode != XRSessionMode::Immersive_vr {
promise.reject_error(Error::NotSupported);

View file

@ -94,7 +94,7 @@ impl XRSessionMethods for XRSession {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let p = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
self.display.queue_renderstate(init, p.clone());
p
@ -120,7 +120,7 @@ impl XRSessionMethods for XRSession {
let in_compartment_proof = AlreadyInCompartment::assert(&self.global());
let p = Promise::new_in_current_compartment(
&self.global(),
&InCompartment::Already(&in_compartment_proof),
InCompartment::Already(&in_compartment_proof),
);
// https://immersive-web.github.io/webxr/#create-a-reference-space

View file

@ -139,7 +139,7 @@ pub fn Fetch(
// Step 1
let aic = AlreadyInCompartment::assert(global);
let promise = Promise::new_in_current_compartment(global, &InCompartment::Already(&aic));
let promise = Promise::new_in_current_compartment(global, InCompartment::Already(&aic));
let response = Response::new(global);
// Step 2