mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
Pass InCompartment by value
This commit is contained in:
parent
1b6949d4cf
commit
e2e6e2ac94
26 changed files with 52 additions and 50 deletions
|
@ -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
|
||||
|
|
|
@ -17,6 +17,7 @@ impl AlreadyInCompartment {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
pub enum InCompartment<'a> {
|
||||
Already(&'a AlreadyInCompartment),
|
||||
Entered(&'a JSAutoCompartment),
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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![];
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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),
|
||||
)
|
||||
},
|
||||
};
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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),
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue