servo: Merge #18600 - Improve Promise (from servo:promises); r=<try>

The elephant 🐘 (not PHP's) still remains in the room: `Rc<Promise>` shouldn't require `#⁠[allow(unrooted_must_root)]`.

Source-Repo: https://github.com/servo/servo
Source-Revision: 4af0d9acb3f5724cac9f40a46ee03ab364a053bc

--HG--
extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear
extra : subtree_revision : ca27ceeeebb0b9743e110e94793cae1a6cd85e84
This commit is contained in:
Anthony Ramine 2017-09-22 07:36:38 -05:00
Родитель 36d9b3e3e4
Коммит 656ba29569
22 изменённых файлов: 184 добавлений и 245 удалений

Просмотреть файл

@ -44,8 +44,9 @@ pub fn consume_body<T: BodyOperations + DomObject>(object: &T, body_type: BodyTy
// Step 1
if object.get_body_used() || object.is_locked() {
promise.reject_error(promise.global().get_cx(), Error::Type(
"The response's stream is disturbed or locked".to_string()));
promise.reject_error(Error::Type(
"The response's stream is disturbed or locked".to_string(),
));
return promise;
}
@ -75,17 +76,16 @@ pub fn consume_body_with_promise<T: BodyOperations + DomObject>(object: &T,
body_type,
object.get_mime_type());
let cx = promise.global().get_cx();
match pkg_data_results {
Ok(results) => {
match results {
FetchedData::Text(s) => promise.resolve_native(cx, &USVString(s)),
FetchedData::Json(j) => promise.resolve_native(cx, &j),
FetchedData::BlobData(b) => promise.resolve_native(cx, &b),
FetchedData::FormData(f) => promise.resolve_native(cx, &f),
FetchedData::Text(s) => promise.resolve_native(&USVString(s)),
FetchedData::Json(j) => promise.resolve_native(&j),
FetchedData::BlobData(b) => promise.resolve_native(&b),
FetchedData::FormData(f) => promise.resolve_native(&f),
};
},
Err(err) => promise.reject_error(cx, err),
Err(err) => promise.reject_error(err),
}
}

Просмотреть файл

@ -788,7 +788,7 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None,
if !JS_WrapValue(cx, valueToResolve.handle_mut()) {
$*{exceptionCode}
}
match Promise::Resolve(&promiseGlobal, cx, valueToResolve.handle()) {
match Promise::new_resolved(&promiseGlobal, cx, valueToResolve.handle()) {
Ok(value) => value,
Err(error) => {
throw_dom_exception(cx, &promiseGlobal, error);

Просмотреть файл

@ -29,7 +29,6 @@ use dom::bindings::js::Root;
use dom::bindings::reflector::{DomObject, Reflector};
use dom::bindings::trace::trace_reflector;
use dom::promise::Promise;
use js::jsapi::JSAutoCompartment;
use js::jsapi::JSTracer;
use libc;
use std::cell::RefCell;
@ -126,10 +125,7 @@ impl TrustedPromise {
let this = self;
task!(reject_promise: move || {
debug!("Rejecting promise.");
let this = this.root();
let cx = this.global().get_cx();
let _ac = JSAutoCompartment::new(cx, this.reflector().get_jsobject().get());
this.reject_error(cx, error);
this.root().reject_error(error);
})
}
@ -142,10 +138,7 @@ impl TrustedPromise {
let this = self;
task!(resolve_promise: move || {
debug!("Resolving promise.");
let this = this.root();
let cx = this.global().get_cx();
let _ac = JSAutoCompartment::new(cx, this.reflector().get_jsobject().get());
this.resolve_native(cx, &value);
this.root().resolve_native(&value);
})
}
}

Просмотреть файл

@ -33,7 +33,7 @@ use dom_struct::dom_struct;
use ipc_channel::ipc::{self, IpcSender};
use ipc_channel::router::ROUTER;
use js::conversions::ConversionResult;
use js::jsapi::{JSAutoCompartment, JSContext, JSObject};
use js::jsapi::{JSContext, JSObject};
use js::jsval::{ObjectValue, UndefinedValue};
use std::cell::Ref;
use std::collections::HashMap;
@ -94,23 +94,24 @@ struct BluetoothContext<T: AsyncBluetoothListener + DomObject> {
}
pub trait AsyncBluetoothListener {
fn handle_response(&self, result: BluetoothResponse, cx: *mut JSContext, promise: &Rc<Promise>);
fn handle_response(&self, result: BluetoothResponse, promise: &Rc<Promise>);
}
impl<T: AsyncBluetoothListener + DomObject> BluetoothContext<T> {
impl<T> BluetoothContext<T>
where
T: AsyncBluetoothListener + DomObject,
{
#[allow(unrooted_must_root)]
fn response(&mut self, response: BluetoothResponseResult) {
let promise = self.promise.take().expect("bt promise is missing").root();
let promise_cx = promise.global().get_cx();
// JSAutoCompartment needs to be manually made.
// Otherwise, Servo will crash.
let _ac = JSAutoCompartment::new(promise_cx, promise.reflector().get_jsobject().get());
match response {
Ok(response) => self.receiver.root().handle_response(response, promise_cx, &promise),
Ok(response) => self.receiver.root().handle_response(response, &promise),
// https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetooth-requestdevice
// Step 3 - 4.
Err(error) => promise.reject_error(promise_cx, Error::from(error)),
Err(error) => promise.reject_error(Error::from(error)),
}
}
}
@ -158,7 +159,7 @@ impl Bluetooth {
if let &Some(ref filters) = filters {
// Step 2.1.
if filters.is_empty() {
p.reject_error(p.global().get_cx(), Type(FILTER_EMPTY_ERROR.to_owned()));
p.reject_error(Type(FILTER_EMPTY_ERROR.to_owned()));
return;
}
@ -171,7 +172,7 @@ impl Bluetooth {
// Step 2.4.2.
Ok(f) => uuid_filters.push(f),
Err(e) => {
p.reject_error(p.global().get_cx(), e);
p.reject_error(e);
return;
},
}
@ -186,7 +187,7 @@ impl Bluetooth {
let uuid = match BluetoothUUID::service(opt_service.clone()) {
Ok(u) => u.to_string(),
Err(e) => {
p.reject_error(p.global().get_cx(), e);
p.reject_error(e);
return;
},
};
@ -205,7 +206,7 @@ impl Bluetooth {
// Step 4 - 5.
if let PermissionState::Denied = get_descriptor_permission_state(PermissionName::Bluetooth, None) {
return p.reject_error(p.global().get_cx(), Error::NotFound);
return p.reject_error(Error::NotFound);
}
// Note: Step 3, 6 - 8 are implemented in
@ -266,20 +267,19 @@ pub fn get_gatt_children<T, F> (
where T: AsyncBluetoothListener + DomObject + 'static,
F: FnOnce(StringOrUnsignedLong) -> Fallible<UUID> {
let p = Promise::new(&attribute.global());
let p_cx = p.global().get_cx();
let result_uuid = if let Some(u) = uuid {
// Step 1.
let canonicalized = match uuid_canonicalizer(u) {
Ok(canonicalized_uuid) => canonicalized_uuid.to_string(),
Err(e) => {
p.reject_error(p_cx, e);
p.reject_error(e);
return p;
}
};
// Step 2.
if uuid_is_blocklisted(canonicalized.as_ref(), Blocklist::All) {
p.reject_error(p_cx, Security);
p.reject_error(Security);
return p;
}
Some(canonicalized)
@ -289,7 +289,7 @@ pub fn get_gatt_children<T, F> (
// Step 3 - 4.
if !connected {
p.reject_error(p_cx, Network);
p.reject_error(Network);
return p;
}
@ -479,7 +479,7 @@ impl BluetoothMethods for Bluetooth {
// Step 1.
if (option.filters.is_some() && option.acceptAllDevices) ||
(option.filters.is_none() && !option.acceptAllDevices) {
p.reject_error(p.global().get_cx(), Error::Type(OPTIONS_ERROR.to_owned()));
p.reject_error(Error::Type(OPTIONS_ERROR.to_owned()));
return p;
}
@ -507,14 +507,14 @@ impl BluetoothMethods for Bluetooth {
}
impl AsyncBluetoothListener for Bluetooth {
fn handle_response(&self, response: BluetoothResponse, promise_cx: *mut JSContext, promise: &Rc<Promise>) {
fn handle_response(&self, response: BluetoothResponse, promise: &Rc<Promise>) {
match response {
// https://webbluetoothcg.github.io/web-bluetooth/#request-bluetooth-devices
// Step 11, 13 - 14.
BluetoothResponse::RequestDevice(device) => {
let mut device_instance_map = self.device_instance_map.borrow_mut();
if let Some(existing_device) = device_instance_map.get(&device.id.clone()) {
return promise.resolve_native(promise_cx, &**existing_device);
return promise.resolve_native(&**existing_device);
}
let bt_device = BluetoothDevice::new(&self.global(),
DOMString::from(device.id.clone()),
@ -530,14 +530,14 @@ impl AsyncBluetoothListener for Bluetooth {
);
// https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetooth-requestdevice
// Step 5.
promise.resolve_native(promise_cx, &bt_device);
promise.resolve_native(&bt_device);
},
// https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetooth-getavailability
// Step 2 - 3.
BluetoothResponse::GetAvailability(is_available) => {
promise.resolve_native(promise_cx, &is_available);
promise.resolve_native(&is_available);
}
_ => promise.reject_error(promise_cx, Error::Type("Something went wrong...".to_owned())),
_ => promise.reject_error(Error::Type("Something went wrong...".to_owned())),
}
}
}
@ -562,9 +562,12 @@ impl PermissionAlgorithm for Bluetooth {
}
// https://webbluetoothcg.github.io/web-bluetooth/#query-the-bluetooth-permission
fn permission_query(cx: *mut JSContext, promise: &Rc<Promise>,
descriptor: &BluetoothPermissionDescriptor,
status: &BluetoothPermissionResult) {
fn permission_query(
_cx: *mut JSContext,
promise: &Rc<Promise>,
descriptor: &BluetoothPermissionDescriptor,
status: &BluetoothPermissionResult,
) {
// Step 1: We are not using the `global` variable.
// Step 2.
@ -573,7 +576,7 @@ impl PermissionAlgorithm for Bluetooth {
// Step 3.
if let PermissionState::Denied = status.get_state() {
status.set_devices(Vec::new());
return promise.resolve_native(cx, status);
return promise.resolve_native(status);
}
// Step 4.
@ -604,7 +607,7 @@ impl PermissionAlgorithm for Bluetooth {
for filter in filters {
match canonicalize_filter(&filter) {
Ok(f) => scan_filters.push(f),
Err(error) => return promise.reject_error(cx, error),
Err(error) => return promise.reject_error(error),
}
}
@ -620,7 +623,7 @@ impl PermissionAlgorithm for Bluetooth {
match receiver.recv().unwrap() {
Ok(true) => (),
Ok(false) => continue,
Err(error) => return promise.reject_error(cx, Error::from(error)),
Err(error) => return promise.reject_error(Error::from(error)),
};
}
@ -637,16 +640,19 @@ impl PermissionAlgorithm for Bluetooth {
// https://w3c.github.io/permissions/#dom-permissions-query
// Step 7.
promise.resolve_native(cx, status);
promise.resolve_native(status);
}
// https://webbluetoothcg.github.io/web-bluetooth/#request-the-bluetooth-permission
fn permission_request(cx: *mut JSContext, promise: &Rc<Promise>,
descriptor: &BluetoothPermissionDescriptor,
status: &BluetoothPermissionResult) {
fn permission_request(
_cx: *mut JSContext,
promise: &Rc<Promise>,
descriptor: &BluetoothPermissionDescriptor,
status: &BluetoothPermissionResult,
) {
// Step 1.
if descriptor.filters.is_some() == descriptor.acceptAllDevices {
return promise.reject_error(cx, Error::Type(OPTIONS_ERROR.to_owned()));
return promise.reject_error(Error::Type(OPTIONS_ERROR.to_owned()));
}
// Step 2.

Просмотреть файл

@ -25,7 +25,6 @@ use dom::globalscope::GlobalScope;
use dom::promise::Promise;
use dom_struct::dom_struct;
use ipc_channel::ipc::{self, IpcSender};
use js::jsapi::JSContext;
use std::cell::Cell;
use std::collections::HashMap;
use std::rc::Rc;
@ -266,16 +265,16 @@ impl BluetoothDeviceMethods for BluetoothDevice {
}
impl AsyncBluetoothListener for BluetoothDevice {
fn handle_response(&self, response: BluetoothResponse, promise_cx: *mut JSContext, promise: &Rc<Promise>) {
fn handle_response(&self, response: BluetoothResponse, promise: &Rc<Promise>) {
match response {
// https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothdevice-unwatchadvertisements
BluetoothResponse::WatchAdvertisements(_result) => {
// Step 3.1.
self.watching_advertisements.set(true);
// Step 3.2.
promise.resolve_native(promise_cx, &());
promise.resolve_native(&());
},
_ => promise.reject_error(promise_cx, Error::Type("Something went wrong...".to_owned())),
_ => promise.reject_error(Error::Type("Something went wrong...".to_owned())),
}
}
}

Просмотреть файл

@ -20,7 +20,6 @@ use dom::permissionstatus::PermissionStatus;
use dom::promise::Promise;
use dom_struct::dom_struct;
use ipc_channel::ipc::IpcSender;
use js::jsapi::JSContext;
use std::rc::Rc;
// https://webbluetoothcg.github.io/web-bluetooth/#bluetoothpermissionresult
@ -83,7 +82,7 @@ impl BluetoothPermissionResultMethods for BluetoothPermissionResult {
}
impl AsyncBluetoothListener for BluetoothPermissionResult {
fn handle_response(&self, response: BluetoothResponse, promise_cx: *mut JSContext, promise: &Rc<Promise>) {
fn handle_response(&self, response: BluetoothResponse, promise: &Rc<Promise>) {
match response {
// https://webbluetoothcg.github.io/web-bluetooth/#request-bluetooth-devices
// Step 3, 11, 13 - 14.
@ -98,7 +97,7 @@ impl AsyncBluetoothListener for BluetoothPermissionResult {
// https://w3c.github.io/permissions/#dom-permissions-request
// Step 8.
return promise.resolve_native(promise_cx, self);
return promise.resolve_native(self);
}
let bt_device = BluetoothDevice::new(&self.global(),
DOMString::from(device.id.clone()),
@ -117,9 +116,9 @@ impl AsyncBluetoothListener for BluetoothPermissionResult {
// https://w3c.github.io/permissions/#dom-permissions-request
// Step 8.
promise.resolve_native(promise_cx, self);
promise.resolve_native(self);
},
_ => promise.reject_error(promise_cx, Error::Type("Something went wrong...".to_owned())),
_ => promise.reject_error(Error::Type("Something went wrong...".to_owned())),
}
}
}

Просмотреть файл

@ -26,7 +26,6 @@ use dom::globalscope::GlobalScope;
use dom::promise::Promise;
use dom_struct::dom_struct;
use ipc_channel::ipc::IpcSender;
use js::jsapi::JSContext;
use std::rc::Rc;
// Maximum length of an attribute value.
@ -124,17 +123,16 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris
// https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattcharacteristic-readvalue
fn ReadValue(&self) -> Rc<Promise> {
let p = Promise::new(&self.global());
let p_cx = p.global().get_cx();
// Step 1.
if uuid_is_blocklisted(self.uuid.as_ref(), Blocklist::Reads) {
p.reject_error(p_cx, Security);
p.reject_error(Security);
return p;
}
// Step 2.
if !self.Service().Device().get_gatt().Connected() {
p.reject_error(p_cx, Network);
p.reject_error(Network);
return p;
}
@ -142,7 +140,7 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris
// Step 5.1.
if !self.Properties().Read() {
p.reject_error(p_cx, NotSupported);
p.reject_error(NotSupported);
return p;
}
@ -158,23 +156,22 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris
// https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattcharacteristic-writevalue
fn WriteValue(&self, value: Vec<u8>) -> Rc<Promise> {
let p = Promise::new(&self.global());
let p_cx = p.global().get_cx();
// Step 1.
if uuid_is_blocklisted(self.uuid.as_ref(), Blocklist::Writes) {
p.reject_error(p_cx, Security);
p.reject_error(Security);
return p;
}
// Step 2 - 3.
if value.len() > MAXIMUM_ATTRIBUTE_LENGTH {
p.reject_error(p_cx, InvalidModification);
p.reject_error(InvalidModification);
return p;
}
// Step 4.
if !self.Service().Device().get_gatt().Connected() {
p.reject_error(p_cx, Network);
p.reject_error(Network);
return p;
}
@ -184,7 +181,7 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris
if !(self.Properties().Write() ||
self.Properties().WriteWithoutResponse() ||
self.Properties().AuthenticatedSignedWrites()) {
p.reject_error(p_cx, NotSupported);
p.reject_error(NotSupported);
return p;
}
@ -200,24 +197,23 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris
// https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattcharacteristic-startnotifications
fn StartNotifications(&self) -> Rc<Promise> {
let p = Promise::new(&self.global());
let p_cx = p.global().get_cx();
// Step 1.
if uuid_is_blocklisted(self.uuid.as_ref(), Blocklist::Reads) {
p.reject_error(p_cx, Security);
p.reject_error(Security);
return p;
}
// Step 2.
if !self.Service().Device().get_gatt().Connected() {
p.reject_error(p_cx, Network);
p.reject_error(Network);
return p;
}
// Step 5.
if !(self.Properties().Notify() ||
self.Properties().Indicate()) {
p.reject_error(p_cx, NotSupported);
p.reject_error(NotSupported);
return p;
}
@ -255,14 +251,14 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris
}
impl AsyncBluetoothListener for BluetoothRemoteGATTCharacteristic {
fn handle_response(&self, response: BluetoothResponse, promise_cx: *mut JSContext, promise: &Rc<Promise>) {
fn handle_response(&self, response: BluetoothResponse, promise: &Rc<Promise>) {
let device = self.Service().Device();
match response {
// https://webbluetoothcg.github.io/web-bluetooth/#getgattchildren
// Step 7.
BluetoothResponse::GetDescriptors(descriptors_vec, single) => {
if single {
promise.resolve_native(promise_cx, &device.get_or_create_descriptor(&descriptors_vec[0], &self));
promise.resolve_native(&device.get_or_create_descriptor(&descriptors_vec[0], &self));
return;
}
let mut descriptors = vec!();
@ -270,7 +266,7 @@ impl AsyncBluetoothListener for BluetoothRemoteGATTCharacteristic {
let bt_descriptor = device.get_or_create_descriptor(&descriptor, &self);
descriptors.push(bt_descriptor);
}
promise.resolve_native(promise_cx, &descriptors);
promise.resolve_native(&descriptors);
},
// https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattcharacteristic-readvalue
BluetoothResponse::ReadValue(result) => {
@ -285,7 +281,7 @@ impl AsyncBluetoothListener for BluetoothRemoteGATTCharacteristic {
self.upcast::<EventTarget>().fire_bubbling_event(atom!("characteristicvaluechanged"));
// Step 5.5.4.
promise.resolve_native(promise_cx, &value);
promise.resolve_native(&value);
},
// https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattcharacteristic-writevalue
BluetoothResponse::WriteValue(result) => {
@ -296,7 +292,7 @@ impl AsyncBluetoothListener for BluetoothRemoteGATTCharacteristic {
*self.value.borrow_mut() = Some(ByteString::new(result));
// Step 7.5.3.
promise.resolve_native(promise_cx, &());
promise.resolve_native(&());
},
// https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattcharacteristic-startnotifications
// https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattcharacteristic-stopnotifications
@ -306,9 +302,9 @@ impl AsyncBluetoothListener for BluetoothRemoteGATTCharacteristic {
// (StartNotification) Step 11.
// (StopNotification) Step 5.
promise.resolve_native(promise_cx, self);
promise.resolve_native(self);
},
_ => promise.reject_error(promise_cx, Error::Type("Something went wrong...".to_owned())),
_ => promise.reject_error(Error::Type("Something went wrong...".to_owned())),
}
}
}

Просмотреть файл

@ -21,7 +21,6 @@ use dom::globalscope::GlobalScope;
use dom::promise::Promise;
use dom_struct::dom_struct;
use ipc_channel::ipc::IpcSender;
use js::jsapi::JSContext;
use std::rc::Rc;
// http://webbluetoothcg.github.io/web-bluetooth/#bluetoothremotegattdescriptor
@ -89,17 +88,16 @@ impl BluetoothRemoteGATTDescriptorMethods for BluetoothRemoteGATTDescriptor {
// https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattdescriptor-readvalue
fn ReadValue(&self) -> Rc<Promise> {
let p = Promise::new(&self.global());
let p_cx = p.global().get_cx();
// Step 1.
if uuid_is_blocklisted(self.uuid.as_ref(), Blocklist::Reads) {
p.reject_error(p_cx, Security);
p.reject_error(Security);
return p;
}
// Step 2.
if !self.Characteristic().Service().Device().get_gatt().Connected() {
p.reject_error(p_cx, Network);
p.reject_error(Network);
return p;
}
@ -116,23 +114,22 @@ impl BluetoothRemoteGATTDescriptorMethods for BluetoothRemoteGATTDescriptor {
// https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattdescriptor-writevalue
fn WriteValue(&self, value: Vec<u8>) -> Rc<Promise> {
let p = Promise::new(&self.global());
let p_cx = p.global().get_cx();
// Step 1.
if uuid_is_blocklisted(self.uuid.as_ref(), Blocklist::Writes) {
p.reject_error(p_cx, Security);
p.reject_error(Security);
return p;
}
// Step 2 - 3.
if value.len() > MAXIMUM_ATTRIBUTE_LENGTH {
p.reject_error(p_cx, InvalidModification);
p.reject_error(InvalidModification);
return p;
}
// Step 4.
if !self.Characteristic().Service().Device().get_gatt().Connected() {
p.reject_error(p_cx, Network);
p.reject_error(Network);
return p;
}
@ -147,7 +144,7 @@ impl BluetoothRemoteGATTDescriptorMethods for BluetoothRemoteGATTDescriptor {
}
impl AsyncBluetoothListener for BluetoothRemoteGATTDescriptor {
fn handle_response(&self, response: BluetoothResponse, promise_cx: *mut JSContext, promise: &Rc<Promise>) {
fn handle_response(&self, response: BluetoothResponse, promise: &Rc<Promise>) {
match response {
// https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattdescriptor-readvalue
BluetoothResponse::ReadValue(result) => {
@ -159,7 +156,7 @@ impl AsyncBluetoothListener for BluetoothRemoteGATTDescriptor {
*self.value.borrow_mut() = Some(value.clone());
// Step 5.4.3.
promise.resolve_native(promise_cx, &value);
promise.resolve_native(&value);
},
// https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattdescriptor-writevalue
BluetoothResponse::WriteValue(result) => {
@ -171,9 +168,9 @@ impl AsyncBluetoothListener for BluetoothRemoteGATTDescriptor {
// Step 7.4.3.
// TODO: Resolve promise with undefined instead of a value.
promise.resolve_native(promise_cx, &());
promise.resolve_native(&());
},
_ => promise.reject_error(promise_cx, Error::Type("Something went wrong...".to_owned())),
_ => promise.reject_error(Error::Type("Something went wrong...".to_owned())),
}
}
}

Просмотреть файл

@ -17,7 +17,6 @@ use dom::globalscope::GlobalScope;
use dom::promise::Promise;
use dom_struct::dom_struct;
use ipc_channel::ipc::IpcSender;
use js::jsapi::JSContext;
use std::cell::Cell;
use std::rc::Rc;
@ -120,30 +119,30 @@ impl BluetoothRemoteGATTServerMethods for BluetoothRemoteGATTServer {
}
impl AsyncBluetoothListener for BluetoothRemoteGATTServer {
fn handle_response(&self, response: BluetoothResponse, promise_cx: *mut JSContext, promise: &Rc<Promise>) {
fn handle_response(&self, response: BluetoothResponse, promise: &Rc<Promise>) {
match response {
// https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattserver-connect
BluetoothResponse::GATTServerConnect(connected) => {
// Step 5.2.3
if self.Device().is_represented_device_null() {
if let Err(e) = self.Device().garbage_collect_the_connection() {
return promise.reject_error(promise_cx, Error::from(e));
return promise.reject_error(Error::from(e));
}
return promise.reject_error(promise_cx, Error::Network);
return promise.reject_error(Error::Network);
}
// Step 5.2.4.
self.connected.set(connected);
// Step 5.2.5.
promise.resolve_native(promise_cx, self);
promise.resolve_native(self);
},
// https://webbluetoothcg.github.io/web-bluetooth/#getgattchildren
// Step 7.
BluetoothResponse::GetPrimaryServices(services_vec, single) => {
let device = self.Device();
if single {
promise.resolve_native(promise_cx, &device.get_or_create_service(&services_vec[0], &self));
promise.resolve_native(&device.get_or_create_service(&services_vec[0], &self));
return;
}
let mut services = vec!();
@ -151,9 +150,9 @@ impl AsyncBluetoothListener for BluetoothRemoteGATTServer {
let bt_service = device.get_or_create_service(&service, &self);
services.push(bt_service);
}
promise.resolve_native(promise_cx, &services);
promise.resolve_native(&services);
},
_ => promise.reject_error(promise_cx, Error::Type("Something went wrong...".to_owned())),
_ => promise.reject_error(Error::Type("Something went wrong...".to_owned())),
}
}
}

Просмотреть файл

@ -17,7 +17,6 @@ use dom::eventtarget::EventTarget;
use dom::globalscope::GlobalScope;
use dom::promise::Promise;
use dom_struct::dom_struct;
use js::jsapi::JSContext;
use std::rc::Rc;
// https://webbluetoothcg.github.io/web-bluetooth/#bluetoothremotegattservice
@ -128,15 +127,14 @@ impl BluetoothRemoteGATTServiceMethods for BluetoothRemoteGATTService {
}
impl AsyncBluetoothListener for BluetoothRemoteGATTService {
fn handle_response(&self, response: BluetoothResponse, promise_cx: *mut JSContext, promise: &Rc<Promise>) {
fn handle_response(&self, response: BluetoothResponse, promise: &Rc<Promise>) {
let device = self.Device();
match response {
// https://webbluetoothcg.github.io/web-bluetooth/#getgattchildren
// Step 7.
BluetoothResponse::GetCharacteristics(characteristics_vec, single) => {
if single {
promise.resolve_native(promise_cx,
&device.get_or_create_characteristic(&characteristics_vec[0], &self));
promise.resolve_native(&device.get_or_create_characteristic(&characteristics_vec[0], &self));
return;
}
let mut characteristics = vec!();
@ -144,23 +142,22 @@ impl AsyncBluetoothListener for BluetoothRemoteGATTService {
let bt_characteristic = device.get_or_create_characteristic(&characteristic, &self);
characteristics.push(bt_characteristic);
}
promise.resolve_native(promise_cx, &characteristics);
promise.resolve_native(&characteristics);
},
// https://webbluetoothcg.github.io/web-bluetooth/#getgattchildren
// Step 7.
BluetoothResponse::GetIncludedServices(services_vec, single) => {
if single {
return promise.resolve_native(promise_cx,
&device.get_or_create_service(&services_vec[0], &device.get_gatt()));
return promise.resolve_native(&device.get_or_create_service(&services_vec[0], &device.get_gatt()));
}
let mut services = vec!();
for service in services_vec {
let bt_service = device.get_or_create_service(&service, &device.get_gatt());
services.push(bt_service);
}
promise.resolve_native(promise_cx, &services);
promise.resolve_native(&services);
},
_ => promise.reject_error(promise_cx, Error::Type("Something went wrong...".to_owned())),
_ => promise.reject_error(Error::Type("Something went wrong...".to_owned())),
}
}
}

Просмотреть файл

@ -316,10 +316,7 @@ impl CustomElementRegistryMethods for CustomElementRegistry {
// Step 16, 16.3
if let Some(promise) = self.when_defined.borrow_mut().remove(&name) {
// 16.1
let cx = promise.global().get_cx();
// 16.2
promise.resolve_native(cx, &UndefinedValue());
promise.resolve_native(&UndefinedValue());
}
Ok(())
}
@ -346,14 +343,14 @@ impl CustomElementRegistryMethods for CustomElementRegistry {
// Step 1
if !is_valid_custom_element_name(&name) {
let promise = Promise::new(global_scope);
promise.reject_native(global_scope.get_cx(), &DOMException::new(global_scope, DOMErrorName::SyntaxError));
promise.reject_native(&DOMException::new(global_scope, DOMErrorName::SyntaxError));
return promise
}
// Step 2
if self.definitions.borrow().contains_key(&name) {
let promise = Promise::new(global_scope);
promise.resolve_native(global_scope.get_cx(), &UndefinedValue());
promise.resolve_native(&UndefinedValue());
return promise
}

Просмотреть файл

@ -2671,7 +2671,7 @@ impl Document {
let promise = Promise::new(global.r());
// Step 2
if self.fullscreen_element.get().is_none() {
promise.reject_error(global.get_cx(), Error::Type(String::from("fullscreen is null")));
promise.reject_error(Error::Type(String::from("fullscreen is null")));
return promise
}
// TODO Step 3-6

Просмотреть файл

@ -82,7 +82,7 @@ use html5ever::serialize;
use html5ever::serialize::SerializeOpts;
use html5ever::serialize::TraversalScope;
use html5ever::serialize::TraversalScope::{ChildrenOnly, IncludeNode};
use js::jsapi::{HandleValue, Heap, JSAutoCompartment};
use js::jsapi::Heap;
use js::jsval::JSVal;
use net_traits::request::CorsSettings;
use ref_filter_map::ref_filter_map;
@ -3057,17 +3057,13 @@ impl TaskOnce for ElementPerformFullscreenEnter {
#[allow(unrooted_must_root)]
fn run_once(self) {
let element = self.element.root();
let promise = self.promise.root();
let document = document_from_node(element.r());
// Step 7.1
if self.error || !element.fullscreen_element_ready_check() {
// JSAutoCompartment needs to be manually made.
// Otherwise, Servo will crash.
let promise = self.promise.root();
let promise_cx = promise.global().get_cx();
let _ac = JSAutoCompartment::new(promise_cx, promise.reflector().get_jsobject().get());
document.upcast::<EventTarget>().fire_event(atom!("fullscreenerror"));
promise.reject_error(promise.global().get_cx(), Error::Type(String::from("fullscreen is not connected")));
promise.reject_error(Error::Type(String::from("fullscreen is not connected")));
return
}
@ -3083,12 +3079,7 @@ impl TaskOnce for ElementPerformFullscreenEnter {
document.upcast::<EventTarget>().fire_event(atom!("fullscreenchange"));
// Step 7.7
// JSAutoCompartment needs to be manually made.
// Otherwise, Servo will crash.
let promise = self.promise.root();
let promise_cx = promise.global().get_cx();
let _ac = JSAutoCompartment::new(promise_cx, promise.reflector().get_jsobject().get());
promise.resolve(promise.global().get_cx(), HandleValue::undefined());
promise.resolve_native(&());
}
}
@ -3125,12 +3116,7 @@ impl TaskOnce for ElementPerformFullscreenExit {
document.upcast::<EventTarget>().fire_event(atom!("fullscreenchange"));
// Step 9.10
let promise = self.promise.root();
// JSAutoCompartment needs to be manually made.
// Otherwise, Servo will crash.
let promise_cx = promise.global().get_cx();
let _ac = JSAutoCompartment::new(promise_cx, promise.reflector().get_jsobject().get());
promise.resolve(promise.global().get_cx(), HandleValue::undefined());
self.promise.root().resolve_native(&());
}
}

Просмотреть файл

@ -89,7 +89,7 @@ impl Permissions {
let root_desc = match Permissions::create_descriptor(cx, permissionDesc) {
Ok(descriptor) => descriptor,
Err(error) => {
p.reject_error(cx, error);
p.reject_error(error);
return p;
},
};
@ -103,7 +103,7 @@ impl Permissions {
let bluetooth_desc = match Bluetooth::create_descriptor(cx, permissionDesc) {
Ok(descriptor) => descriptor,
Err(error) => {
p.reject_error(cx, error);
p.reject_error(error);
return p;
},
};
@ -140,14 +140,14 @@ impl Permissions {
// (Request) Step 7. The default algorithm always resolve
// (Request) Step 8.
p.resolve_native(cx, &status);
p.resolve_native(&status);
},
&Operation::Query => {
// (Query) Step 6.
Permissions::permission_query(cx, &p, &root_desc, &status);
// (Query) Step 7.
p.resolve_native(cx, &status);
p.resolve_native(&status);
},
&Operation::Revoke => {

Просмотреть файл

@ -11,8 +11,6 @@
//! 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 dom::bindings::callback::CallbackContainer;
use dom::bindings::codegen::Bindings::PromiseBinding::AnyCallback;
use dom::bindings::conversions::root_from_object;
use dom::bindings::error::{Error, Fallible};
use dom::bindings::reflector::{DomObject, MutDomObject, Reflector};
@ -21,7 +19,7 @@ use dom::globalscope::GlobalScope;
use dom::promisenativehandler::PromiseNativeHandler;
use dom_struct::dom_struct;
use js::conversions::ToJSValConvertible;
use js::jsapi::{CallOriginalPromiseResolve, CallOriginalPromiseReject, CallOriginalPromiseThen};
use js::jsapi::{CallOriginalPromiseResolve, CallOriginalPromiseReject};
use js::jsapi::{JSAutoCompartment, CallArgs, JS_GetFunctionObject, JS_NewFunction};
use js::jsapi::{JSContext, HandleValue, HandleObject, IsPromiseObject, GetFunctionNativeReserved};
use js::jsapi::{JS_ClearPendingException, JSObject, AddRawValueRoot, RemoveRawValueRoot, PromiseState};
@ -114,95 +112,78 @@ impl Promise {
}
#[allow(unrooted_must_root, unsafe_code)]
pub fn Resolve(global: &GlobalScope,
cx: *mut JSContext,
value: HandleValue) -> Fallible<Rc<Promise>> {
pub unsafe fn new_resolved(
global: &GlobalScope,
cx: *mut JSContext,
value: HandleValue,
) -> Fallible<Rc<Promise>> {
let _ac = JSAutoCompartment::new(cx, global.reflector().get_jsobject().get());
rooted!(in(cx) let p = unsafe { CallOriginalPromiseResolve(cx, value) });
rooted!(in(cx) let p = CallOriginalPromiseResolve(cx, value));
assert!(!p.handle().is_null());
Ok(Promise::new_with_js_promise(p.handle(), cx))
}
#[allow(unrooted_must_root, unsafe_code)]
pub unsafe fn new_rejected(
global: &GlobalScope,
cx: *mut JSContext,
value: HandleValue,
) -> Fallible<Rc<Promise>> {
let _ac = JSAutoCompartment::new(cx, global.reflector().get_jsobject().get());
rooted!(in(cx) let p = CallOriginalPromiseReject(cx, value));
assert!(!p.handle().is_null());
Ok(Promise::new_with_js_promise(p.handle(), cx))
}
#[allow(unsafe_code)]
pub fn resolve_native<T>(&self, val: &T) where T: ToJSValConvertible {
let cx = self.global().get_cx();
let _ac = JSAutoCompartment::new(cx, self.reflector().get_jsobject().get());
rooted!(in(cx) let mut v = UndefinedValue());
unsafe {
Ok(Promise::new_with_js_promise(p.handle(), cx))
val.to_jsval(cx, v.handle_mut());
self.resolve(cx, v.handle());
}
}
#[allow(unrooted_must_root, unsafe_code)]
pub fn Reject(global: &GlobalScope,
cx: *mut JSContext,
value: HandleValue) -> Fallible<Rc<Promise>> {
let _ac = JSAutoCompartment::new(cx, global.reflector().get_jsobject().get());
rooted!(in(cx) let p = unsafe { CallOriginalPromiseReject(cx, value) });
assert!(!p.handle().is_null());
unsafe {
Ok(Promise::new_with_js_promise(p.handle(), cx))
pub unsafe fn resolve(&self, cx: *mut JSContext, value: HandleValue) {
if !ResolvePromise(cx, self.promise_obj(), value) {
JS_ClearPendingException(cx);
}
}
#[allow(unsafe_code)]
pub fn resolve_native<T>(&self, cx: *mut JSContext, val: &T) where T: ToJSValConvertible {
pub fn reject_native<T>(&self, val: &T) where T: ToJSValConvertible {
let cx = self.global().get_cx();
let _ac = JSAutoCompartment::new(cx, self.reflector().get_jsobject().get());
rooted!(in(cx) let mut v = UndefinedValue());
unsafe {
val.to_jsval(cx, v.handle_mut());
}
self.resolve(cx, v.handle());
}
#[allow(unrooted_must_root, unsafe_code)]
pub fn resolve(&self, cx: *mut JSContext, value: HandleValue) {
unsafe {
if !ResolvePromise(cx, self.promise_obj(), value) {
JS_ClearPendingException(cx);
}
self.reject(cx, v.handle());
}
}
#[allow(unsafe_code)]
pub fn reject_native<T>(&self, cx: *mut JSContext, val: &T) where T: ToJSValConvertible {
rooted!(in(cx) let mut v = UndefinedValue());
unsafe {
val.to_jsval(cx, v.handle_mut());
}
self.reject(cx, v.handle());
}
#[allow(unsafe_code)]
pub fn reject_error(&self, cx: *mut JSContext, error: Error) {
pub fn reject_error(&self, error: Error) {
let cx = self.global().get_cx();
let _ac = JSAutoCompartment::new(cx, self.reflector().get_jsobject().get());
rooted!(in(cx) let mut v = UndefinedValue());
unsafe {
error.to_jsval(cx, &self.global(), v.handle_mut());
}
self.reject(cx, v.handle());
}
#[allow(unrooted_must_root, unsafe_code)]
pub fn reject(&self,
cx: *mut JSContext,
value: HandleValue) {
unsafe {
if !RejectPromise(cx, self.promise_obj(), value) {
JS_ClearPendingException(cx);
}
self.reject(cx, v.handle());
}
}
#[allow(unrooted_must_root, unsafe_code)]
pub fn then(&self,
cx: *mut JSContext,
_callee: HandleObject,
cb_resolve: AnyCallback,
cb_reject: AnyCallback,
result: MutableHandleObject) {
let promise = self.promise_obj();
rooted!(in(cx) let resolve = cb_resolve.callback());
rooted!(in(cx) let reject = cb_reject.callback());
unsafe {
rooted!(in(cx) let res =
CallOriginalPromiseThen(cx, promise, resolve.handle(), reject.handle()));
result.set(*res);
pub unsafe fn reject(&self, cx: *mut JSContext, value: HandleValue) {
if !RejectPromise(cx, self.promise_obj(), value) {
JS_ClearPendingException(cx);
}
}
#[allow(unsafe_code)]
pub fn is_settled(&self) -> bool {
pub fn is_fulfilled(&self) -> bool {
let state = unsafe { GetPromiseState(self.promise_obj()) };
match state {
PromiseState::Rejected | PromiseState::Fulfilled => true,

Просмотреть файл

@ -58,14 +58,13 @@ impl ServiceWorkerContainerMethods for ServiceWorkerContainer {
options: &RegistrationOptions) -> Rc<Promise> {
// A: Step 1
let promise = Promise::new(&*self.global());
let ctx = (&*self.global()).get_cx();
let USVString(ref script_url) = script_url;
let api_base_url = self.global().api_base_url();
// A: Step 3-5
let script_url = match api_base_url.join(script_url) {
Ok(url) => url,
Err(_) => {
promise.reject_error(ctx, Error::Type("Invalid script URL".to_owned()));
promise.reject_error(Error::Type("Invalid script URL".to_owned()));
return promise;
}
};
@ -73,14 +72,14 @@ impl ServiceWorkerContainerMethods for ServiceWorkerContainer {
match script_url.scheme() {
"https" | "http" => {},
_ => {
promise.reject_error(ctx, Error::Type("Only secure origins are allowed".to_owned()));
promise.reject_error(Error::Type("Only secure origins are allowed".to_owned()));
return promise;
}
}
// B: Step 3
if script_url.path().to_ascii_lowercase().contains("%2f") ||
script_url.path().to_ascii_lowercase().contains("%5c") {
promise.reject_error(ctx, Error::Type("Script URL contains forbidden characters".to_owned()));
promise.reject_error(Error::Type("Script URL contains forbidden characters".to_owned()));
return promise;
}
// B: Step 4-5
@ -90,7 +89,7 @@ impl ServiceWorkerContainerMethods for ServiceWorkerContainer {
match api_base_url.join(inner_scope) {
Ok(url) => url,
Err(_) => {
promise.reject_error(ctx, Error::Type("Invalid scope URL".to_owned()));
promise.reject_error(Error::Type("Invalid scope URL".to_owned()));
return promise;
}
}
@ -101,14 +100,14 @@ impl ServiceWorkerContainerMethods for ServiceWorkerContainer {
match scope.scheme() {
"https" | "http" => {},
_ => {
promise.reject_error(ctx, Error::Type("Only secure origins are allowed".to_owned()));
promise.reject_error(Error::Type("Only secure origins are allowed".to_owned()));
return promise;
}
}
// B: Step 7
if scope.path().to_ascii_lowercase().contains("%2f") ||
scope.path().to_ascii_lowercase().contains("%5c") {
promise.reject_error(ctx, Error::Type("Scope URL contains forbidden characters".to_owned()));
promise.reject_error(Error::Type("Scope URL contains forbidden characters".to_owned()));
return promise;
}

Просмотреть файл

@ -35,7 +35,7 @@ use dom::promise::Promise;
use dom::promisenativehandler::{PromiseNativeHandler, Callback};
use dom::url::URL;
use dom_struct::dom_struct;
use js::jsapi::{HandleObject, HandleValue, Heap, JSContext, JSObject, JSAutoCompartment};
use js::jsapi::{HandleObject, HandleValue, Heap, JSContext, JSObject};
use js::jsapi::{JS_NewPlainObject, JS_NewUint8ClampedArray};
use js::jsval::{JSVal, NullValue};
use script_traits::MsDuration;
@ -675,13 +675,13 @@ impl TestBindingMethods for TestBinding {
#[allow(unrooted_must_root)]
#[allow(unsafe_code)]
unsafe fn ReturnResolvedPromise(&self, cx: *mut JSContext, v: HandleValue) -> Fallible<Rc<Promise>> {
Promise::Resolve(&self.global(), cx, v)
Promise::new_resolved(&self.global(), cx, v)
}
#[allow(unrooted_must_root)]
#[allow(unsafe_code)]
unsafe fn ReturnRejectedPromise(&self, cx: *mut JSContext, v: HandleValue) -> Fallible<Rc<Promise>> {
Promise::Reject(&self.global(), cx, v)
Promise::new_rejected(&self.global(), cx, v)
}
#[allow(unsafe_code)]
@ -695,7 +695,7 @@ impl TestBindingMethods for TestBinding {
}
fn PromiseRejectWithTypeError(&self, p: &Promise, s: USVString) {
p.reject_error(self.global().get_cx(), Error::Type(s.0));
p.reject_error(Error::Type(s.0));
}
#[allow(unrooted_must_root)]
@ -814,9 +814,6 @@ pub struct TestBindingCallback {
impl TestBindingCallback {
#[allow(unrooted_must_root)]
pub fn invoke(self) {
let p = self.promise.root();
let cx = p.global().get_cx();
let _ac = JSAutoCompartment::new(cx, p.reflector().get_jsobject().get());
p.resolve_native(cx, &self.value);
self.promise.root().resolve_native(&self.value);
}
}

Просмотреть файл

@ -73,13 +73,13 @@ impl VRMethods for VR {
}
},
Err(e) => {
promise.reject_native(promise.global().get_cx(), &e);
promise.reject_native(&e);
return promise;
}
}
} else {
// WebVR spec: The Promise MUST be rejected if WebVR is not enabled/supported.
promise.reject_error(promise.global().get_cx(), Error::Security);
promise.reject_error(Error::Security);
return promise;
}
@ -87,7 +87,7 @@ impl VRMethods for VR {
let displays: Vec<Root<VRDisplay>> = self.displays.borrow().iter()
.map(|d| Root::from_ref(&**d))
.collect();
promise.resolve_native(promise.global().get_cx(), &displays);
promise.resolve_native(&displays);
promise
}

Просмотреть файл

@ -284,7 +284,7 @@ impl VRDisplayMethods for VRDisplay {
// WebVR spec: If canPresent is false the promise MUST be rejected
if !self.display.borrow().capabilities.can_present {
let msg = "VRDisplay canPresent is false".to_string();
promise.reject_native(promise.global().get_cx(), &msg);
promise.reject_native(&msg);
return promise;
}
@ -294,7 +294,7 @@ impl VRDisplayMethods for VRDisplay {
// That functionality is not allowed by this revision of the spec.
if layers.len() != 1 {
let msg = "The number of layers must be 1".to_string();
promise.reject_native(promise.global().get_cx(), &msg);
promise.reject_native(&msg);
return promise;
}
@ -311,7 +311,7 @@ impl VRDisplayMethods for VRDisplay {
},
Err(msg) => {
let msg = msg.to_string();
promise.reject_native(promise.global().get_cx(), &msg);
promise.reject_native(&msg);
return promise;
}
};
@ -320,7 +320,7 @@ impl VRDisplayMethods for VRDisplay {
if self.presenting.get() {
*self.layer.borrow_mut() = layer_bounds;
self.layer_ctx.set(Some(&layer_ctx));
promise.resolve_native(promise.global().get_cx(), &());
promise.resolve_native(&());
return promise;
}
@ -335,10 +335,10 @@ impl VRDisplayMethods for VRDisplay {
*self.layer.borrow_mut() = layer_bounds;
self.layer_ctx.set(Some(&layer_ctx));
self.init_present();
promise.resolve_native(promise.global().get_cx(), &());
promise.resolve_native(&());
},
Err(e) => {
promise.reject_native(promise.global().get_cx(), &e);
promise.reject_native(&e);
}
}
@ -353,7 +353,7 @@ impl VRDisplayMethods for VRDisplay {
// WebVR spec: If the VRDisplay is not presenting the promise MUST be rejected.
if !self.presenting.get() {
let msg = "VRDisplay is not presenting".to_string();
promise.reject_native(promise.global().get_cx(), &msg);
promise.reject_native(&msg);
return promise;
}
@ -366,10 +366,10 @@ impl VRDisplayMethods for VRDisplay {
match receiver.recv().unwrap() {
Ok(()) => {
self.stop_present();
promise.resolve_native(promise.global().get_cx(), &());
promise.resolve_native(&());
},
Err(e) => {
promise.reject_native(promise.global().get_cx(), &e);
promise.reject_native(&e);
}
}

Просмотреть файл

@ -123,7 +123,7 @@ impl WorkletMethods for Worklet {
Err(err) => {
// Step 4.
debug!("URL {:?} parse error {:?}.", module_url.0, err);
promise.reject_error(self.window.get_cx(), Error::Syntax);
promise.reject_error(Error::Syntax);
return promise;
}
};

Просмотреть файл

@ -77,7 +77,7 @@ pub fn Fetch(global: &GlobalScope, input: RequestInfo, init: RootedTraceableBox<
// Step 2
let request = match Request::Constructor(global, input, init) {
Err(e) => {
promise.reject_error(promise.global().get_cx(), e);
promise.reject_error(e);
return promise;
},
Ok(r) => r.get_request(),
@ -135,9 +135,7 @@ impl FetchResponseListener for FetchContext {
match fetch_metadata {
// Step 4.1
Err(_) => {
promise.reject_error(
promise.global().get_cx(),
Error::Type("Network error occurred".to_string()));
promise.reject_error(Error::Type("Network error occurred".to_string()));
self.fetch_promise = Some(TrustedPromise::new(promise));
self.response_object.root().set_type(DOMResponseType::Error);
return;
@ -167,9 +165,7 @@ impl FetchResponseListener for FetchContext {
}
}
// Step 4.3
promise.resolve_native(
promise_cx,
&self.response_object.root());
promise.resolve_native(&self.response_object.root());
self.fetch_promise = Some(TrustedPromise::new(promise));
}

Просмотреть файл

@ -13,11 +13,9 @@ use dom::bindings::js::JS;
use dom::bindings::refcounted::{Trusted, TrustedPromise};
use dom::bindings::reflector::DomObject;
use dom::client::Client;
use dom::globalscope::GlobalScope;
use dom::promise::Promise;
use dom::serviceworkerregistration::ServiceWorkerRegistration;
use dom::urlhelper::UrlHelper;
use js::jsapi::JSAutoCompartment;
use script_thread::ScriptThread;
use servo_url::ServoUrl;
use std::cmp::PartialEq;
@ -116,7 +114,7 @@ impl JobQueue {
} else {
// Step 2
let mut last_job = job_queue.pop().unwrap();
if job == last_job && !last_job.promise.is_settled() {
if job == last_job && !last_job.promise.is_fulfilled() {
last_job.append_equivalent_job(job);
job_queue.push(last_job);
debug!("appended equivalent job");
@ -261,11 +259,10 @@ impl JobQueue {
}
}
fn settle_job_promise(global: &GlobalScope, promise: &Promise, settle: SettleType) {
let _ac = JSAutoCompartment::new(global.get_cx(), promise.reflector().get_jsobject().get());
fn settle_job_promise(promise: &Promise, settle: SettleType) {
match settle {
SettleType::Resolve(reg) => promise.resolve_native(global.get_cx(), &*reg.root()),
SettleType::Reject(err) => promise.reject_error(global.get_cx(), err),
SettleType::Resolve(reg) => promise.resolve_native(&*reg.root()),
SettleType::Reject(err) => promise.reject_error(err),
};
}
@ -277,7 +274,7 @@ fn queue_settle_promise_for_job(job: &Job, settle: SettleType, task_source: &DOM
let _ = task_source.queue(
task!(settle_promise_for_job: move || {
let promise = promise.root();
settle_job_promise(&promise.global(), &promise, settle)
settle_job_promise(&promise, settle)
}),
&*global,
);