mirror of
https://github.com/servo/servo.git
synced 2025-08-04 21:20:23 +01:00
Add an inCompartments config for bindings
This commit is contained in:
parent
2181872973
commit
7dbff6efb7
7 changed files with 37 additions and 10 deletions
|
@ -3,7 +3,7 @@
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
use crate::dom::globalscope::GlobalScope;
|
use crate::dom::globalscope::GlobalScope;
|
||||||
use js::jsapi::{GetCurrentRealmOrNull, JSAutoRealm};
|
use js::jsapi::{GetCurrentRealmOrNull, JSAutoRealm, JSContext};
|
||||||
|
|
||||||
pub struct AlreadyInCompartment(());
|
pub struct AlreadyInCompartment(());
|
||||||
|
|
||||||
|
@ -15,6 +15,13 @@ impl AlreadyInCompartment {
|
||||||
}
|
}
|
||||||
AlreadyInCompartment(())
|
AlreadyInCompartment(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn assert_for_cx(cx: *mut JSContext) -> AlreadyInCompartment {
|
||||||
|
unsafe {
|
||||||
|
assert!(!GetCurrentRealmOrNull(cx).is_null());
|
||||||
|
}
|
||||||
|
AlreadyInCompartment(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy)]
|
#[derive(Clone, Copy)]
|
||||||
|
|
|
@ -40,6 +40,14 @@ DOMInterfaces = {
|
||||||
'WindowProxy' : {
|
'WindowProxy' : {
|
||||||
'path': 'crate::dom::windowproxy::WindowProxy',
|
'path': 'crate::dom::windowproxy::WindowProxy',
|
||||||
'register': False,
|
'register': False,
|
||||||
|
},
|
||||||
|
|
||||||
|
'Window': {
|
||||||
|
'inCompartments': ['Fetch'],
|
||||||
|
},
|
||||||
|
|
||||||
|
'WorkerGlobalScope': {
|
||||||
|
'inCompartments': ['Fetch'],
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3316,6 +3316,8 @@ class CGCallGenerator(CGThing):
|
||||||
|
|
||||||
if "cx" not in argsPre and needsCx:
|
if "cx" not in argsPre and needsCx:
|
||||||
args.prepend(CGGeneric("cx"))
|
args.prepend(CGGeneric("cx"))
|
||||||
|
if nativeMethodName in descriptor.inCompartmentMethods:
|
||||||
|
args.append(CGGeneric("InCompartment::in_compartment(&AlreadyInCompartment::assert_for_cx(cx))"));
|
||||||
|
|
||||||
# Build up our actual call
|
# Build up our actual call
|
||||||
self.cgRoot = CGList([], "\n")
|
self.cgRoot = CGList([], "\n")
|
||||||
|
@ -5640,7 +5642,7 @@ class CGInterfaceTrait(CGThing):
|
||||||
name = CGSpecializedMethod.makeNativeName(descriptor, m)
|
name = CGSpecializedMethod.makeNativeName(descriptor, m)
|
||||||
infallible = 'infallible' in descriptor.getExtendedAttributes(m)
|
infallible = 'infallible' in descriptor.getExtendedAttributes(m)
|
||||||
for idx, (rettype, arguments) in enumerate(m.signatures()):
|
for idx, (rettype, arguments) in enumerate(m.signatures()):
|
||||||
arguments = method_arguments(descriptor, rettype, arguments)
|
arguments = method_arguments(descriptor, rettype, arguments, inCompartment=name in descriptor.inCompartmentMethods)
|
||||||
rettype = return_type(descriptor, rettype, infallible)
|
rettype = return_type(descriptor, rettype, infallible)
|
||||||
yield name + ('_' * idx), arguments, rettype
|
yield name + ('_' * idx), arguments, rettype
|
||||||
elif m.isAttr() and not m.isStatic():
|
elif m.isAttr() and not m.isStatic():
|
||||||
|
@ -5671,7 +5673,7 @@ class CGInterfaceTrait(CGThing):
|
||||||
if operation.isGetter():
|
if operation.isGetter():
|
||||||
if not rettype.nullable():
|
if not rettype.nullable():
|
||||||
rettype = IDLNullableType(rettype.location, rettype)
|
rettype = IDLNullableType(rettype.location, rettype)
|
||||||
arguments = method_arguments(descriptor, rettype, arguments)
|
arguments = method_arguments(descriptor, rettype, arguments, inCompartment=name in descriptor.inCompartmentMethods)
|
||||||
|
|
||||||
# If this interface 'supports named properties', then we
|
# If this interface 'supports named properties', then we
|
||||||
# should be able to access 'supported property names'
|
# should be able to access 'supported property names'
|
||||||
|
@ -5681,7 +5683,7 @@ class CGInterfaceTrait(CGThing):
|
||||||
if operation.isNamed():
|
if operation.isNamed():
|
||||||
yield "SupportedPropertyNames", [], "Vec<DOMString>"
|
yield "SupportedPropertyNames", [], "Vec<DOMString>"
|
||||||
else:
|
else:
|
||||||
arguments = method_arguments(descriptor, rettype, arguments)
|
arguments = method_arguments(descriptor, rettype, arguments, inCompartment=name in descriptor.inCompartmentMethods)
|
||||||
rettype = return_type(descriptor, rettype, infallible)
|
rettype = return_type(descriptor, rettype, infallible)
|
||||||
yield name, arguments, rettype
|
yield name, arguments, rettype
|
||||||
|
|
||||||
|
@ -5975,6 +5977,8 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries
|
||||||
'crate::dom::windowproxy::WindowProxy',
|
'crate::dom::windowproxy::WindowProxy',
|
||||||
'crate::dom::globalscope::GlobalScope',
|
'crate::dom::globalscope::GlobalScope',
|
||||||
'crate::mem::malloc_size_of_including_raw_self',
|
'crate::mem::malloc_size_of_including_raw_self',
|
||||||
|
'crate::compartments::InCompartment',
|
||||||
|
'crate::compartments::AlreadyInCompartment',
|
||||||
'libc',
|
'libc',
|
||||||
'servo_config::pref',
|
'servo_config::pref',
|
||||||
'servo_config::prefs',
|
'servo_config::prefs',
|
||||||
|
@ -6676,7 +6680,7 @@ def argument_type(descriptorProvider, ty, optional=False, defaultValue=None, var
|
||||||
return declType.define()
|
return declType.define()
|
||||||
|
|
||||||
|
|
||||||
def method_arguments(descriptorProvider, returnType, arguments, passJSBits=True, trailing=None):
|
def method_arguments(descriptorProvider, returnType, arguments, passJSBits=True, trailing=None, inCompartment=False):
|
||||||
if needCx(returnType, arguments, passJSBits):
|
if needCx(returnType, arguments, passJSBits):
|
||||||
yield "cx", "*mut JSContext"
|
yield "cx", "*mut JSContext"
|
||||||
|
|
||||||
|
@ -6688,6 +6692,9 @@ def method_arguments(descriptorProvider, returnType, arguments, passJSBits=True,
|
||||||
if trailing:
|
if trailing:
|
||||||
yield trailing
|
yield trailing
|
||||||
|
|
||||||
|
if inCompartment:
|
||||||
|
yield "_comp", "InCompartment"
|
||||||
|
|
||||||
|
|
||||||
def return_type(descriptorProvider, rettype, infallible):
|
def return_type(descriptorProvider, rettype, infallible):
|
||||||
result = getRetvalDeclarationForType(rettype, descriptorProvider)
|
result = getRetvalDeclarationForType(rettype, descriptorProvider)
|
||||||
|
|
|
@ -223,6 +223,7 @@ class Descriptor(DescriptorProvider):
|
||||||
self.concreteType = typeName
|
self.concreteType = typeName
|
||||||
self.register = desc.get('register', True)
|
self.register = desc.get('register', True)
|
||||||
self.path = desc.get('path', pathDefault)
|
self.path = desc.get('path', pathDefault)
|
||||||
|
self.inCompartmentMethods = [name for name in desc.get('inCompartments', [])]
|
||||||
self.bindingPath = 'crate::dom::bindings::codegen::Bindings::%s' % ('::'.join([ifaceName + 'Binding'] * 2))
|
self.bindingPath = 'crate::dom::bindings::codegen::Bindings::%s' % ('::'.join([ifaceName + 'Binding'] * 2))
|
||||||
self.outerObjectHook = desc.get('outerObjectHook', 'None')
|
self.outerObjectHook = desc.get('outerObjectHook', 'None')
|
||||||
self.proxy = False
|
self.proxy = False
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
use crate::compartments::InCompartment;
|
||||||
use crate::dom::bindings::cell::DomRefCell;
|
use crate::dom::bindings::cell::DomRefCell;
|
||||||
use crate::dom::bindings::codegen::Bindings::DocumentBinding::{
|
use crate::dom::bindings::codegen::Bindings::DocumentBinding::{
|
||||||
DocumentMethods, DocumentReadyState,
|
DocumentMethods, DocumentReadyState,
|
||||||
|
@ -1144,8 +1145,9 @@ impl WindowMethods for Window {
|
||||||
&self,
|
&self,
|
||||||
input: RequestOrUSVString,
|
input: RequestOrUSVString,
|
||||||
init: RootedTraceableBox<RequestInit>,
|
init: RootedTraceableBox<RequestInit>,
|
||||||
|
comp: InCompartment,
|
||||||
) -> Rc<Promise> {
|
) -> Rc<Promise> {
|
||||||
fetch::Fetch(&self.upcast(), input, init)
|
fetch::Fetch(&self.upcast(), input, init, comp)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn TestRunner(&self) -> DomRoot<TestRunner> {
|
fn TestRunner(&self) -> DomRoot<TestRunner> {
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
use crate::compartments::InCompartment;
|
||||||
use crate::dom::bindings::cell::DomRefCell;
|
use crate::dom::bindings::cell::DomRefCell;
|
||||||
use crate::dom::bindings::codegen::Bindings::FunctionBinding::Function;
|
use crate::dom::bindings::codegen::Bindings::FunctionBinding::Function;
|
||||||
use crate::dom::bindings::codegen::Bindings::RequestBinding::RequestInit;
|
use crate::dom::bindings::codegen::Bindings::RequestBinding::RequestInit;
|
||||||
|
@ -368,8 +369,9 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope {
|
||||||
&self,
|
&self,
|
||||||
input: RequestOrUSVString,
|
input: RequestOrUSVString,
|
||||||
init: RootedTraceableBox<RequestInit>,
|
init: RootedTraceableBox<RequestInit>,
|
||||||
|
comp: InCompartment,
|
||||||
) -> Rc<Promise> {
|
) -> Rc<Promise> {
|
||||||
fetch::Fetch(self.upcast(), input, init)
|
fetch::Fetch(self.upcast(), input, init, comp)
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://w3c.github.io/hr-time/#the-performance-attribute
|
// https://w3c.github.io/hr-time/#the-performance-attribute
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
use crate::compartments::{AlreadyInCompartment, InCompartment};
|
use crate::compartments::InCompartment;
|
||||||
use crate::dom::bindings::codegen::Bindings::RequestBinding::RequestInfo;
|
use crate::dom::bindings::codegen::Bindings::RequestBinding::RequestInfo;
|
||||||
use crate::dom::bindings::codegen::Bindings::RequestBinding::RequestInit;
|
use crate::dom::bindings::codegen::Bindings::RequestBinding::RequestInit;
|
||||||
use crate::dom::bindings::codegen::Bindings::ResponseBinding::ResponseBinding::ResponseMethods;
|
use crate::dom::bindings::codegen::Bindings::ResponseBinding::ResponseBinding::ResponseMethods;
|
||||||
|
@ -134,12 +134,12 @@ pub fn Fetch(
|
||||||
global: &GlobalScope,
|
global: &GlobalScope,
|
||||||
input: RequestInfo,
|
input: RequestInfo,
|
||||||
init: RootedTraceableBox<RequestInit>,
|
init: RootedTraceableBox<RequestInit>,
|
||||||
|
comp: InCompartment,
|
||||||
) -> Rc<Promise> {
|
) -> Rc<Promise> {
|
||||||
let core_resource_thread = global.core_resource_thread();
|
let core_resource_thread = global.core_resource_thread();
|
||||||
|
|
||||||
// Step 1
|
// Step 1
|
||||||
let aic = AlreadyInCompartment::assert(global);
|
let promise = Promise::new_in_current_compartment(global, comp);
|
||||||
let promise = Promise::new_in_current_compartment(global, InCompartment::Already(&aic));
|
|
||||||
let response = Response::new(global);
|
let response = Response::new(global);
|
||||||
|
|
||||||
// Step 2
|
// Step 2
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue