Remove some usage of unsafe code in Permissions

This commit is contained in:
marmeladema 2019-07-27 16:19:34 +01:00
parent 8968286aa1
commit 4a5f51e079
2 changed files with 30 additions and 37 deletions

View file

@ -30,13 +30,13 @@ use crate::dom::eventtarget::EventTarget;
use crate::dom::globalscope::GlobalScope; use crate::dom::globalscope::GlobalScope;
use crate::dom::permissions::{get_descriptor_permission_state, PermissionAlgorithm}; use crate::dom::permissions::{get_descriptor_permission_state, PermissionAlgorithm};
use crate::dom::promise::Promise; use crate::dom::promise::Promise;
use crate::script_runtime::JSContext as SafeJSContext; use crate::script_runtime::JSContext;
use crate::task::TaskOnce; use crate::task::TaskOnce;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use ipc_channel::ipc::{self, IpcSender}; use ipc_channel::ipc::{self, IpcSender};
use ipc_channel::router::ROUTER; use ipc_channel::router::ROUTER;
use js::conversions::ConversionResult; use js::conversions::ConversionResult;
use js::jsapi::{JSContext, JSObject}; use js::jsapi::JSObject;
use js::jsval::{ObjectValue, UndefinedValue}; use js::jsval::{ObjectValue, UndefinedValue};
use profile_traits::ipc as ProfiledIpc; use profile_traits::ipc as ProfiledIpc;
use std::cell::Ref; use std::cell::Ref;
@ -616,28 +616,24 @@ impl PermissionAlgorithm for Bluetooth {
type Descriptor = BluetoothPermissionDescriptor; type Descriptor = BluetoothPermissionDescriptor;
type Status = BluetoothPermissionResult; type Status = BluetoothPermissionResult;
#[allow(unsafe_code)]
fn create_descriptor( fn create_descriptor(
cx: *mut JSContext, cx: JSContext,
permission_descriptor_obj: *mut JSObject, permission_descriptor_obj: *mut JSObject,
) -> Result<BluetoothPermissionDescriptor, Error> { ) -> Result<BluetoothPermissionDescriptor, Error> {
rooted!(in(cx) let mut property = UndefinedValue()); rooted!(in(*cx) let mut property = UndefinedValue());
property property
.handle_mut() .handle_mut()
.set(ObjectValue(permission_descriptor_obj)); .set(ObjectValue(permission_descriptor_obj));
unsafe { match BluetoothPermissionDescriptor::new(cx, property.handle()) {
match BluetoothPermissionDescriptor::new(SafeJSContext::from_ptr(cx), property.handle()) Ok(ConversionResult::Success(descriptor)) => Ok(descriptor),
{ Ok(ConversionResult::Failure(error)) => Err(Error::Type(error.into_owned())),
Ok(ConversionResult::Success(descriptor)) => Ok(descriptor), Err(_) => Err(Error::Type(String::from(BT_DESC_CONVERSION_ERROR))),
Ok(ConversionResult::Failure(error)) => Err(Error::Type(error.into_owned())),
Err(_) => Err(Error::Type(String::from(BT_DESC_CONVERSION_ERROR))),
}
} }
} }
// https://webbluetoothcg.github.io/web-bluetooth/#query-the-bluetooth-permission // https://webbluetoothcg.github.io/web-bluetooth/#query-the-bluetooth-permission
fn permission_query( fn permission_query(
_cx: *mut JSContext, _cx: JSContext,
promise: &Rc<Promise>, promise: &Rc<Promise>,
descriptor: &BluetoothPermissionDescriptor, descriptor: &BluetoothPermissionDescriptor,
status: &BluetoothPermissionResult, status: &BluetoothPermissionResult,
@ -727,7 +723,7 @@ impl PermissionAlgorithm for Bluetooth {
// https://webbluetoothcg.github.io/web-bluetooth/#request-the-bluetooth-permission // https://webbluetoothcg.github.io/web-bluetooth/#request-the-bluetooth-permission
fn permission_request( fn permission_request(
_cx: *mut JSContext, _cx: JSContext,
promise: &Rc<Promise>, promise: &Rc<Promise>,
descriptor: &BluetoothPermissionDescriptor, descriptor: &BluetoothPermissionDescriptor,
status: &BluetoothPermissionResult, status: &BluetoothPermissionResult,

View file

@ -17,10 +17,10 @@ use crate::dom::bluetoothpermissionresult::BluetoothPermissionResult;
use crate::dom::globalscope::GlobalScope; use crate::dom::globalscope::GlobalScope;
use crate::dom::permissionstatus::PermissionStatus; use crate::dom::permissionstatus::PermissionStatus;
use crate::dom::promise::Promise; use crate::dom::promise::Promise;
use crate::script_runtime::JSContext as SafeJSContext; use crate::script_runtime::JSContext;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use js::conversions::ConversionResult; use js::conversions::ConversionResult;
use js::jsapi::{JSContext, JSObject}; use js::jsapi::JSObject;
use js::jsval::{ObjectValue, UndefinedValue}; use js::jsval::{ObjectValue, UndefinedValue};
use servo_config::pref; use servo_config::pref;
use std::rc::Rc; use std::rc::Rc;
@ -37,17 +37,17 @@ pub trait PermissionAlgorithm {
type Descriptor; type Descriptor;
type Status; type Status;
fn create_descriptor( fn create_descriptor(
cx: *mut JSContext, cx: JSContext,
permission_descriptor_obj: *mut JSObject, permission_descriptor_obj: *mut JSObject,
) -> Result<Self::Descriptor, Error>; ) -> Result<Self::Descriptor, Error>;
fn permission_query( fn permission_query(
cx: *mut JSContext, cx: JSContext,
promise: &Rc<Promise>, promise: &Rc<Promise>,
descriptor: &Self::Descriptor, descriptor: &Self::Descriptor,
status: &Self::Status, status: &Self::Status,
); );
fn permission_request( fn permission_request(
cx: *mut JSContext, cx: JSContext,
promise: &Rc<Promise>, promise: &Rc<Promise>,
descriptor: &Self::Descriptor, descriptor: &Self::Descriptor,
status: &Self::Status, status: &Self::Status,
@ -88,7 +88,7 @@ impl Permissions {
fn manipulate( fn manipulate(
&self, &self,
op: Operation, op: Operation,
cx: *mut JSContext, cx: JSContext,
permissionDesc: *mut JSObject, permissionDesc: *mut JSObject,
promise: Option<Rc<Promise>>, promise: Option<Rc<Promise>>,
) -> Rc<Promise> { ) -> Rc<Promise> {
@ -201,18 +201,18 @@ impl Permissions {
impl PermissionsMethods for Permissions { impl PermissionsMethods for Permissions {
// https://w3c.github.io/permissions/#dom-permissions-query // https://w3c.github.io/permissions/#dom-permissions-query
fn Query(&self, cx: SafeJSContext, permissionDesc: *mut JSObject) -> Rc<Promise> { fn Query(&self, cx: JSContext, permissionDesc: *mut JSObject) -> Rc<Promise> {
self.manipulate(Operation::Query, *cx, permissionDesc, None) self.manipulate(Operation::Query, cx, permissionDesc, None)
} }
// https://w3c.github.io/permissions/#dom-permissions-request // https://w3c.github.io/permissions/#dom-permissions-request
fn Request(&self, cx: SafeJSContext, permissionDesc: *mut JSObject) -> Rc<Promise> { fn Request(&self, cx: JSContext, permissionDesc: *mut JSObject) -> Rc<Promise> {
self.manipulate(Operation::Request, *cx, permissionDesc, None) self.manipulate(Operation::Request, cx, permissionDesc, None)
} }
// https://w3c.github.io/permissions/#dom-permissions-revoke // https://w3c.github.io/permissions/#dom-permissions-revoke
fn Revoke(&self, cx: SafeJSContext, permissionDesc: *mut JSObject) -> Rc<Promise> { fn Revoke(&self, cx: JSContext, permissionDesc: *mut JSObject) -> Rc<Promise> {
self.manipulate(Operation::Revoke, *cx, permissionDesc, None) self.manipulate(Operation::Revoke, cx, permissionDesc, None)
} }
} }
@ -220,27 +220,24 @@ impl PermissionAlgorithm for Permissions {
type Descriptor = PermissionDescriptor; type Descriptor = PermissionDescriptor;
type Status = PermissionStatus; type Status = PermissionStatus;
#[allow(unsafe_code)]
fn create_descriptor( fn create_descriptor(
cx: *mut JSContext, cx: JSContext,
permission_descriptor_obj: *mut JSObject, permission_descriptor_obj: *mut JSObject,
) -> Result<PermissionDescriptor, Error> { ) -> Result<PermissionDescriptor, Error> {
rooted!(in(cx) let mut property = UndefinedValue()); rooted!(in(*cx) let mut property = UndefinedValue());
property property
.handle_mut() .handle_mut()
.set(ObjectValue(permission_descriptor_obj)); .set(ObjectValue(permission_descriptor_obj));
unsafe { match PermissionDescriptor::new(cx, property.handle()) {
match PermissionDescriptor::new(SafeJSContext::from_ptr(cx), property.handle()) { Ok(ConversionResult::Success(descriptor)) => Ok(descriptor),
Ok(ConversionResult::Success(descriptor)) => Ok(descriptor), Ok(ConversionResult::Failure(error)) => Err(Error::Type(error.into_owned())),
Ok(ConversionResult::Failure(error)) => Err(Error::Type(error.into_owned())), Err(_) => Err(Error::JSFailed),
Err(_) => Err(Error::JSFailed),
}
} }
} }
// https://w3c.github.io/permissions/#boolean-permission-query-algorithm // https://w3c.github.io/permissions/#boolean-permission-query-algorithm
fn permission_query( fn permission_query(
_cx: *mut JSContext, _cx: JSContext,
_promise: &Rc<Promise>, _promise: &Rc<Promise>,
_descriptor: &PermissionDescriptor, _descriptor: &PermissionDescriptor,
status: &PermissionStatus, status: &PermissionStatus,
@ -251,7 +248,7 @@ impl PermissionAlgorithm for Permissions {
// https://w3c.github.io/permissions/#boolean-permission-request-algorithm // https://w3c.github.io/permissions/#boolean-permission-request-algorithm
fn permission_request( fn permission_request(
cx: *mut JSContext, cx: JSContext,
promise: &Rc<Promise>, promise: &Rc<Promise>,
descriptor: &PermissionDescriptor, descriptor: &PermissionDescriptor,
status: &PermissionStatus, status: &PermissionStatus,