mirror of
https://github.com/servo/servo.git
synced 2025-07-31 11:10:22 +01:00
Make generated proxy handlers and DOM object hooks generic (#35292)
* script: Make DOM proxy handlers generic over DOM types. Signed-off-by: Josh Matthews <josh@joshmatthews.net> * script: Make finalize and trace hooks generic over DOM types. Signed-off-by: Josh Matthews <josh@joshmatthews.net> --------- Signed-off-by: Josh Matthews <josh@joshmatthews.net>
This commit is contained in:
parent
1e164738d8
commit
2bd96633d4
7 changed files with 72 additions and 46 deletions
|
@ -319,7 +319,12 @@ impl DedicatedWorkerGlobalScope {
|
||||||
control_receiver,
|
control_receiver,
|
||||||
insecure_requests_policy,
|
insecure_requests_policy,
|
||||||
));
|
));
|
||||||
unsafe { DedicatedWorkerGlobalScopeBinding::Wrap(SafeJSContext::from_ptr(cx), scope) }
|
unsafe {
|
||||||
|
DedicatedWorkerGlobalScopeBinding::Wrap::<crate::DomTypeHolder>(
|
||||||
|
SafeJSContext::from_ptr(cx),
|
||||||
|
scope,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <https://html.spec.whatwg.org/multipage/#run-a-worker>
|
/// <https://html.spec.whatwg.org/multipage/#run-a-worker>
|
||||||
|
|
|
@ -74,7 +74,7 @@ impl DissimilarOriginWindow {
|
||||||
window_proxy: Dom::from_ref(window_proxy),
|
window_proxy: Dom::from_ref(window_proxy),
|
||||||
location: Default::default(),
|
location: Default::default(),
|
||||||
});
|
});
|
||||||
unsafe { DissimilarOriginWindowBinding::Wrap(cx, win) }
|
unsafe { DissimilarOriginWindowBinding::Wrap::<crate::DomTypeHolder>(cx, win) }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn window_proxy(&self) -> DomRoot<WindowProxy> {
|
pub(crate) fn window_proxy(&self) -> DomRoot<WindowProxy> {
|
||||||
|
|
|
@ -120,7 +120,12 @@ impl PaintWorkletGlobalScope {
|
||||||
missing_image_urls: Vec::new(),
|
missing_image_urls: Vec::new(),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
unsafe { PaintWorkletGlobalScopeBinding::Wrap(JSContext::from_ptr(runtime.cx()), global) }
|
unsafe {
|
||||||
|
PaintWorkletGlobalScopeBinding::Wrap::<crate::DomTypeHolder>(
|
||||||
|
JSContext::from_ptr(runtime.cx()),
|
||||||
|
global,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn image_cache(&self) -> Arc<dyn ImageCache> {
|
pub(crate) fn image_cache(&self) -> Arc<dyn ImageCache> {
|
||||||
|
|
|
@ -266,7 +266,12 @@ impl ServiceWorkerGlobalScope {
|
||||||
control_receiver,
|
control_receiver,
|
||||||
closing,
|
closing,
|
||||||
));
|
));
|
||||||
unsafe { ServiceWorkerGlobalScopeBinding::Wrap(SafeJSContext::from_ptr(cx), scope) }
|
unsafe {
|
||||||
|
ServiceWorkerGlobalScopeBinding::Wrap::<crate::DomTypeHolder>(
|
||||||
|
SafeJSContext::from_ptr(cx),
|
||||||
|
scope,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <https://w3c.github.io/ServiceWorker/#run-service-worker-algorithm>
|
/// <https://w3c.github.io/ServiceWorker/#run-service-worker-algorithm>
|
||||||
|
|
|
@ -51,7 +51,12 @@ impl TestWorkletGlobalScope {
|
||||||
),
|
),
|
||||||
lookup_table: Default::default(),
|
lookup_table: Default::default(),
|
||||||
});
|
});
|
||||||
unsafe { TestWorkletGlobalScopeBinding::Wrap(JSContext::from_ptr(runtime.cx()), global) }
|
unsafe {
|
||||||
|
TestWorkletGlobalScopeBinding::Wrap::<crate::DomTypeHolder>(
|
||||||
|
JSContext::from_ptr(runtime.cx()),
|
||||||
|
global,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn perform_a_worklet_task(&self, task: TestWorkletTask) {
|
pub(crate) fn perform_a_worklet_task(&self, task: TestWorkletTask) {
|
||||||
|
|
|
@ -2874,7 +2874,9 @@ impl Window {
|
||||||
theme: Cell::new(PrefersColorScheme::Light),
|
theme: Cell::new(PrefersColorScheme::Light),
|
||||||
});
|
});
|
||||||
|
|
||||||
unsafe { WindowBinding::Wrap(JSContext::from_ptr(runtime.cx()), win) }
|
unsafe {
|
||||||
|
WindowBinding::Wrap::<crate::DomTypeHolder>(JSContext::from_ptr(runtime.cx()), win)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn pipeline_id(&self) -> PipelineId {
|
pub(crate) fn pipeline_id(&self) -> PipelineId {
|
||||||
|
|
|
@ -2352,12 +2352,12 @@ class CGDOMJSClass(CGThing):
|
||||||
args = {
|
args = {
|
||||||
"domClass": DOMClass(self.descriptor),
|
"domClass": DOMClass(self.descriptor),
|
||||||
"enumerateHook": "None",
|
"enumerateHook": "None",
|
||||||
"finalizeHook": FINALIZE_HOOK_NAME,
|
"finalizeHook": f"{FINALIZE_HOOK_NAME}::<D>",
|
||||||
"flags": "JSCLASS_FOREGROUND_FINALIZE",
|
"flags": "JSCLASS_FOREGROUND_FINALIZE",
|
||||||
"name": str_to_cstr_ptr(self.descriptor.interface.identifier.name),
|
"name": str_to_cstr_ptr(self.descriptor.interface.identifier.name),
|
||||||
"resolveHook": "None",
|
"resolveHook": "None",
|
||||||
"slots": "1",
|
"slots": "1",
|
||||||
"traceHook": TRACE_HOOK_NAME,
|
"traceHook": f"{TRACE_HOOK_NAME}::<D>",
|
||||||
}
|
}
|
||||||
if self.descriptor.isGlobal():
|
if self.descriptor.isGlobal():
|
||||||
assert not self.descriptor.weakReferenceable
|
assert not self.descriptor.weakReferenceable
|
||||||
|
@ -2371,7 +2371,7 @@ class CGDOMJSClass(CGThing):
|
||||||
return f"""
|
return f"""
|
||||||
static CLASS_OPS: ThreadUnsafeOnceLock<JSClassOps> = ThreadUnsafeOnceLock::new();
|
static CLASS_OPS: ThreadUnsafeOnceLock<JSClassOps> = ThreadUnsafeOnceLock::new();
|
||||||
|
|
||||||
pub(crate) fn init_class_ops() {{
|
pub(crate) fn init_class_ops<D: DomTypes>() {{
|
||||||
CLASS_OPS.set(JSClassOps {{
|
CLASS_OPS.set(JSClassOps {{
|
||||||
addProperty: None,
|
addProperty: None,
|
||||||
delProperty: None,
|
delProperty: None,
|
||||||
|
@ -2388,8 +2388,8 @@ pub(crate) fn init_class_ops() {{
|
||||||
|
|
||||||
static Class: ThreadUnsafeOnceLock<DOMJSClass> = ThreadUnsafeOnceLock::new();
|
static Class: ThreadUnsafeOnceLock<DOMJSClass> = ThreadUnsafeOnceLock::new();
|
||||||
|
|
||||||
pub(crate) fn init_domjs_class() {{
|
pub(crate) fn init_domjs_class<D: DomTypes>() {{
|
||||||
init_class_ops();
|
init_class_ops::<D>();
|
||||||
Class.set(DOMJSClass {{
|
Class.set(DOMJSClass {{
|
||||||
base: JSClass {{
|
base: JSClass {{
|
||||||
name: {args['name']},
|
name: {args['name']},
|
||||||
|
@ -3024,7 +3024,8 @@ class CGWrapMethod(CGAbstractMethod):
|
||||||
retval = f'DomRoot<{descriptor.concreteType}>'
|
retval = f'DomRoot<{descriptor.concreteType}>'
|
||||||
CGAbstractMethod.__init__(self, descriptor, 'Wrap', retval, args,
|
CGAbstractMethod.__init__(self, descriptor, 'Wrap', retval, args,
|
||||||
pub=True, unsafe=True,
|
pub=True, unsafe=True,
|
||||||
extra_decorators=['#[cfg_attr(crown, allow(crown::unrooted_must_root))]'])
|
extra_decorators=['#[cfg_attr(crown, allow(crown::unrooted_must_root))]'],
|
||||||
|
templateArgs=['D: DomTypes'])
|
||||||
|
|
||||||
def definition_body(self):
|
def definition_body(self):
|
||||||
unforgeable = CopyLegacyUnforgeablePropertiesToInstance(self.descriptor)
|
unforgeable = CopyLegacyUnforgeablePropertiesToInstance(self.descriptor)
|
||||||
|
@ -3117,7 +3118,8 @@ class CGWrapGlobalMethod(CGAbstractMethod):
|
||||||
retval = f'DomRoot<{descriptor.concreteType}>'
|
retval = f'DomRoot<{descriptor.concreteType}>'
|
||||||
CGAbstractMethod.__init__(self, descriptor, 'Wrap', retval, args,
|
CGAbstractMethod.__init__(self, descriptor, 'Wrap', retval, args,
|
||||||
pub=True, unsafe=True,
|
pub=True, unsafe=True,
|
||||||
extra_decorators=['#[cfg_attr(crown, allow(crown::unrooted_must_root))]'])
|
extra_decorators=['#[cfg_attr(crown, allow(crown::unrooted_must_root))]'],
|
||||||
|
templateArgs=['D: DomTypes'])
|
||||||
self.properties = properties
|
self.properties = properties
|
||||||
|
|
||||||
def definition_body(self):
|
def definition_body(self):
|
||||||
|
@ -3139,7 +3141,7 @@ create_global_object(
|
||||||
cx,
|
cx,
|
||||||
&Class.get().base,
|
&Class.get().base,
|
||||||
raw.as_ptr() as *const libc::c_void,
|
raw.as_ptr() as *const libc::c_void,
|
||||||
_trace,
|
{TRACE_HOOK_NAME}::<D>,
|
||||||
obj.handle_mut(),
|
obj.handle_mut(),
|
||||||
origin);
|
origin);
|
||||||
assert!(!obj.is_null());
|
assert!(!obj.is_null());
|
||||||
|
@ -3216,7 +3218,7 @@ impl DomObjectWrap for {name} {{
|
||||||
Option<HandleObject>,
|
Option<HandleObject>,
|
||||||
Box<Self>,
|
Box<Self>,
|
||||||
CanGc,
|
CanGc,
|
||||||
) -> Root<Dom<Self>> = Wrap;
|
) -> Root<Dom<Self>> = Wrap::<crate::DomTypeHolder>;
|
||||||
}}
|
}}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -3240,7 +3242,7 @@ impl DomObjectIteratorWrap for {name} {{
|
||||||
Option<HandleObject>,
|
Option<HandleObject>,
|
||||||
Box<IterableIterator<Self>>,
|
Box<IterableIterator<Self>>,
|
||||||
CanGc,
|
CanGc,
|
||||||
) -> Root<Dom<IterableIterator<Self>>> = Wrap;
|
) -> Root<Dom<IterableIterator<Self>>> = Wrap::<crate::DomTypeHolder>;
|
||||||
}}
|
}}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -3703,11 +3705,11 @@ class CGDefineProxyHandler(CGAbstractMethod):
|
||||||
customDefineProperty = 'proxyhandler::define_property'
|
customDefineProperty = 'proxyhandler::define_property'
|
||||||
if self.descriptor.isMaybeCrossOriginObject() or self.descriptor.operations['IndexedSetter'] or \
|
if self.descriptor.isMaybeCrossOriginObject() or self.descriptor.operations['IndexedSetter'] or \
|
||||||
self.descriptor.operations['NamedSetter']:
|
self.descriptor.operations['NamedSetter']:
|
||||||
customDefineProperty = 'defineProperty'
|
customDefineProperty = 'defineProperty::<D>'
|
||||||
|
|
||||||
customDelete = 'proxyhandler::delete'
|
customDelete = 'proxyhandler::delete'
|
||||||
if self.descriptor.isMaybeCrossOriginObject() or self.descriptor.operations['NamedDeleter']:
|
if self.descriptor.isMaybeCrossOriginObject() or self.descriptor.operations['NamedDeleter']:
|
||||||
customDelete = 'delete'
|
customDelete = 'delete::<D>'
|
||||||
|
|
||||||
customGetPrototypeIfOrdinary = 'Some(proxyhandler::get_prototype_if_ordinary)'
|
customGetPrototypeIfOrdinary = 'Some(proxyhandler::get_prototype_if_ordinary)'
|
||||||
customGetPrototype = 'None'
|
customGetPrototype = 'None'
|
||||||
|
@ -3728,17 +3730,17 @@ class CGDefineProxyHandler(CGAbstractMethod):
|
||||||
assert not self.descriptor.operations['NamedGetter']
|
assert not self.descriptor.operations['NamedGetter']
|
||||||
customSet = 'Some(proxyhandler::maybe_cross_origin_set_rawcx)'
|
customSet = 'Some(proxyhandler::maybe_cross_origin_set_rawcx)'
|
||||||
|
|
||||||
getOwnEnumerablePropertyKeys = "own_property_keys"
|
getOwnEnumerablePropertyKeys = "own_property_keys::<D>"
|
||||||
if self.descriptor.interface.getExtendedAttribute("LegacyUnenumerableNamedProperties") or \
|
if self.descriptor.interface.getExtendedAttribute("LegacyUnenumerableNamedProperties") or \
|
||||||
self.descriptor.isMaybeCrossOriginObject():
|
self.descriptor.isMaybeCrossOriginObject():
|
||||||
getOwnEnumerablePropertyKeys = "getOwnEnumerablePropertyKeys"
|
getOwnEnumerablePropertyKeys = "getOwnEnumerablePropertyKeys::<D>"
|
||||||
|
|
||||||
return CGGeneric(f"""
|
return CGGeneric(f"""
|
||||||
let traps = ProxyTraps {{
|
let traps = ProxyTraps {{
|
||||||
enter: None,
|
enter: None,
|
||||||
getOwnPropertyDescriptor: Some(getOwnPropertyDescriptor),
|
getOwnPropertyDescriptor: Some(getOwnPropertyDescriptor::<D>),
|
||||||
defineProperty: Some({customDefineProperty}),
|
defineProperty: Some({customDefineProperty}),
|
||||||
ownPropertyKeys: Some(own_property_keys),
|
ownPropertyKeys: Some(own_property_keys::<D>),
|
||||||
delete_: Some({customDelete}),
|
delete_: Some({customDelete}),
|
||||||
enumerate: None,
|
enumerate: None,
|
||||||
getPrototypeIfOrdinary: {customGetPrototypeIfOrdinary},
|
getPrototypeIfOrdinary: {customGetPrototypeIfOrdinary},
|
||||||
|
@ -3748,11 +3750,11 @@ let traps = ProxyTraps {{
|
||||||
preventExtensions: Some(proxyhandler::prevent_extensions),
|
preventExtensions: Some(proxyhandler::prevent_extensions),
|
||||||
isExtensible: Some(proxyhandler::is_extensible),
|
isExtensible: Some(proxyhandler::is_extensible),
|
||||||
has: None,
|
has: None,
|
||||||
get: Some(get),
|
get: Some(get::<D>),
|
||||||
set: {customSet},
|
set: {customSet},
|
||||||
call: None,
|
call: None,
|
||||||
construct: None,
|
construct: None,
|
||||||
hasOwn: Some(hasOwn),
|
hasOwn: Some(hasOwn::<D>),
|
||||||
getOwnEnumerablePropertyKeys: Some({getOwnEnumerablePropertyKeys}),
|
getOwnEnumerablePropertyKeys: Some({getOwnEnumerablePropertyKeys}),
|
||||||
nativeCall: None,
|
nativeCall: None,
|
||||||
objectClassIs: None,
|
objectClassIs: None,
|
||||||
|
@ -3760,8 +3762,8 @@ let traps = ProxyTraps {{
|
||||||
fun_toString: None,
|
fun_toString: None,
|
||||||
boxedValue_unbox: None,
|
boxedValue_unbox: None,
|
||||||
defaultValue: None,
|
defaultValue: None,
|
||||||
trace: Some({TRACE_HOOK_NAME}),
|
trace: Some({TRACE_HOOK_NAME}::<D>),
|
||||||
finalize: Some({FINALIZE_HOOK_NAME}),
|
finalize: Some({FINALIZE_HOOK_NAME}::<D>),
|
||||||
objectMoved: None,
|
objectMoved: None,
|
||||||
isCallable: None,
|
isCallable: None,
|
||||||
isConstructor: None,
|
isConstructor: None,
|
||||||
|
@ -5708,7 +5710,7 @@ class CGProxyNamedOperation(CGProxySpecialOperation):
|
||||||
# Our first argument is the id we're getting.
|
# Our first argument is the id we're getting.
|
||||||
argName = self.arguments[0].identifier.name
|
argName = self.arguments[0].identifier.name
|
||||||
return (f'let {argName} = jsid_to_string(*cx, Handle::from_raw(id)).expect("Not a string-convertible JSID?");\n'
|
return (f'let {argName} = jsid_to_string(*cx, Handle::from_raw(id)).expect("Not a string-convertible JSID?");\n'
|
||||||
"let this = UnwrapProxy(proxy);\n"
|
"let this = UnwrapProxy::<D>(proxy);\n"
|
||||||
"let this = &*this;\n"
|
"let this = &*this;\n"
|
||||||
f"{CGProxySpecialOperation.define(self)}")
|
f"{CGProxySpecialOperation.define(self)}")
|
||||||
|
|
||||||
|
@ -5758,7 +5760,7 @@ class CGProxyNamedDeleter(CGProxyNamedOperation):
|
||||||
" return false;\n"
|
" return false;\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
" };\n"
|
" };\n"
|
||||||
" let this = UnwrapProxy(proxy);\n"
|
" let this = UnwrapProxy::<D>(proxy);\n"
|
||||||
" let this = &*this;\n"
|
" let this = &*this;\n"
|
||||||
f" {CGProxySpecialOperation.define(self)}"
|
f" {CGProxySpecialOperation.define(self)}"
|
||||||
"}\n")
|
"}\n")
|
||||||
|
@ -5768,14 +5770,15 @@ class CGProxyUnwrap(CGAbstractMethod):
|
||||||
def __init__(self, descriptor):
|
def __init__(self, descriptor):
|
||||||
args = [Argument('RawHandleObject', 'obj')]
|
args = [Argument('RawHandleObject', 'obj')]
|
||||||
CGAbstractMethod.__init__(self, descriptor, "UnwrapProxy",
|
CGAbstractMethod.__init__(self, descriptor, "UnwrapProxy",
|
||||||
f'*const {descriptor.concreteType}', args,
|
f'*const D::{descriptor.concreteType}', args,
|
||||||
alwaysInline=True, unsafe=True)
|
alwaysInline=True, unsafe=True,
|
||||||
|
templateArgs=['D: DomTypes'])
|
||||||
|
|
||||||
def definition_body(self):
|
def definition_body(self):
|
||||||
return CGGeneric(f"""
|
return CGGeneric(f"""
|
||||||
let mut slot = UndefinedValue();
|
let mut slot = UndefinedValue();
|
||||||
GetProxyReservedSlot(obj.get(), 0, &mut slot);
|
GetProxyReservedSlot(obj.get(), 0, &mut slot);
|
||||||
let box_ = slot.to_private() as *const {self.descriptor.concreteType};
|
let box_ = slot.to_private() as *const D::{self.descriptor.concreteType};
|
||||||
return box_;""")
|
return box_;""")
|
||||||
|
|
||||||
|
|
||||||
|
@ -5786,7 +5789,7 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod):
|
||||||
Argument('RawMutableHandle<PropertyDescriptor>', 'mut desc'),
|
Argument('RawMutableHandle<PropertyDescriptor>', 'mut desc'),
|
||||||
Argument('*mut bool', 'is_none')]
|
Argument('*mut bool', 'is_none')]
|
||||||
CGAbstractExternMethod.__init__(self, descriptor, "getOwnPropertyDescriptor",
|
CGAbstractExternMethod.__init__(self, descriptor, "getOwnPropertyDescriptor",
|
||||||
"bool", args)
|
"bool", args, templateArgs=['D: DomTypes'])
|
||||||
self.descriptor = descriptor
|
self.descriptor = descriptor
|
||||||
|
|
||||||
# https://heycam.github.io/webidl/#LegacyPlatformObjectGetOwnProperty
|
# https://heycam.github.io/webidl/#LegacyPlatformObjectGetOwnProperty
|
||||||
|
@ -5833,7 +5836,7 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod):
|
||||||
'pre': 'rooted!(in(*cx) let mut rval = UndefinedValue());'
|
'pre': 'rooted!(in(*cx) let mut rval = UndefinedValue());'
|
||||||
}
|
}
|
||||||
get += ("if let Some(index) = index {\n"
|
get += ("if let Some(index) = index {\n"
|
||||||
" let this = UnwrapProxy(proxy);\n"
|
" let this = UnwrapProxy::<D>(proxy);\n"
|
||||||
" let this = &*this;\n"
|
" let this = &*this;\n"
|
||||||
f"{CGIndenter(CGProxyIndexedGetter(self.descriptor, templateValues)).define()}\n"
|
f"{CGIndenter(CGProxyIndexedGetter(self.descriptor, templateValues)).define()}\n"
|
||||||
"}\n")
|
"}\n")
|
||||||
|
@ -5911,7 +5914,7 @@ class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod):
|
||||||
Argument('RawHandleId', 'id'),
|
Argument('RawHandleId', 'id'),
|
||||||
Argument('RawHandle<PropertyDescriptor>', 'desc'),
|
Argument('RawHandle<PropertyDescriptor>', 'desc'),
|
||||||
Argument('*mut ObjectOpResult', 'opresult')]
|
Argument('*mut ObjectOpResult', 'opresult')]
|
||||||
CGAbstractExternMethod.__init__(self, descriptor, "defineProperty", "bool", args)
|
CGAbstractExternMethod.__init__(self, descriptor, "defineProperty", "bool", args, templateArgs=['D: DomTypes'])
|
||||||
self.descriptor = descriptor
|
self.descriptor = descriptor
|
||||||
|
|
||||||
def getBody(self):
|
def getBody(self):
|
||||||
|
@ -5932,7 +5935,7 @@ class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod):
|
||||||
if indexedSetter:
|
if indexedSetter:
|
||||||
set += ("let index = get_array_index_from_id(*cx, Handle::from_raw(id));\n"
|
set += ("let index = get_array_index_from_id(*cx, Handle::from_raw(id));\n"
|
||||||
"if let Some(index) = index {\n"
|
"if let Some(index) = index {\n"
|
||||||
" let this = UnwrapProxy(proxy);\n"
|
" let this = UnwrapProxy::<D>(proxy);\n"
|
||||||
" let this = &*this;\n"
|
" let this = &*this;\n"
|
||||||
f"{CGIndenter(CGProxyIndexedSetter(self.descriptor)).define()}"
|
f"{CGIndenter(CGProxyIndexedSetter(self.descriptor)).define()}"
|
||||||
" return (*opresult).succeed();\n"
|
" return (*opresult).succeed();\n"
|
||||||
|
@ -5970,7 +5973,7 @@ class CGDOMJSProxyHandler_delete(CGAbstractExternMethod):
|
||||||
args = [Argument('*mut JSContext', 'cx'), Argument('RawHandleObject', 'proxy'),
|
args = [Argument('*mut JSContext', 'cx'), Argument('RawHandleObject', 'proxy'),
|
||||||
Argument('RawHandleId', 'id'),
|
Argument('RawHandleId', 'id'),
|
||||||
Argument('*mut ObjectOpResult', 'res')]
|
Argument('*mut ObjectOpResult', 'res')]
|
||||||
CGAbstractExternMethod.__init__(self, descriptor, "delete", "bool", args)
|
CGAbstractExternMethod.__init__(self, descriptor, "delete", "bool", args, templateArgs=['D: DomTypes'])
|
||||||
self.descriptor = descriptor
|
self.descriptor = descriptor
|
||||||
|
|
||||||
def getBody(self):
|
def getBody(self):
|
||||||
|
@ -6004,14 +6007,15 @@ class CGDOMJSProxyHandler_ownPropertyKeys(CGAbstractExternMethod):
|
||||||
args = [Argument('*mut JSContext', 'cx'),
|
args = [Argument('*mut JSContext', 'cx'),
|
||||||
Argument('RawHandleObject', 'proxy'),
|
Argument('RawHandleObject', 'proxy'),
|
||||||
Argument('RawMutableHandleIdVector', 'props')]
|
Argument('RawMutableHandleIdVector', 'props')]
|
||||||
CGAbstractExternMethod.__init__(self, descriptor, "own_property_keys", "bool", args)
|
CGAbstractExternMethod.__init__(self, descriptor, "own_property_keys", "bool", args,
|
||||||
|
templateArgs=['D: DomTypes'])
|
||||||
self.descriptor = descriptor
|
self.descriptor = descriptor
|
||||||
|
|
||||||
def getBody(self):
|
def getBody(self):
|
||||||
body = dedent(
|
body = dedent(
|
||||||
"""
|
"""
|
||||||
let cx = SafeJSContext::from_ptr(cx);
|
let cx = SafeJSContext::from_ptr(cx);
|
||||||
let unwrapped_proxy = UnwrapProxy(proxy);
|
let unwrapped_proxy = UnwrapProxy::<D>(proxy);
|
||||||
""")
|
""")
|
||||||
|
|
||||||
if self.descriptor.isMaybeCrossOriginObject():
|
if self.descriptor.isMaybeCrossOriginObject():
|
||||||
|
@ -6077,14 +6081,14 @@ class CGDOMJSProxyHandler_getOwnEnumerablePropertyKeys(CGAbstractExternMethod):
|
||||||
Argument('RawHandleObject', 'proxy'),
|
Argument('RawHandleObject', 'proxy'),
|
||||||
Argument('RawMutableHandleIdVector', 'props')]
|
Argument('RawMutableHandleIdVector', 'props')]
|
||||||
CGAbstractExternMethod.__init__(self, descriptor,
|
CGAbstractExternMethod.__init__(self, descriptor,
|
||||||
"getOwnEnumerablePropertyKeys", "bool", args)
|
"getOwnEnumerablePropertyKeys", "bool", args, templateArgs=['D: DomTypes'])
|
||||||
self.descriptor = descriptor
|
self.descriptor = descriptor
|
||||||
|
|
||||||
def getBody(self):
|
def getBody(self):
|
||||||
body = dedent(
|
body = dedent(
|
||||||
"""
|
"""
|
||||||
let cx = SafeJSContext::from_ptr(cx);
|
let cx = SafeJSContext::from_ptr(cx);
|
||||||
let unwrapped_proxy = UnwrapProxy(proxy);
|
let unwrapped_proxy = UnwrapProxy::<D>(proxy);
|
||||||
""")
|
""")
|
||||||
|
|
||||||
if self.descriptor.isMaybeCrossOriginObject():
|
if self.descriptor.isMaybeCrossOriginObject():
|
||||||
|
@ -6131,7 +6135,7 @@ class CGDOMJSProxyHandler_hasOwn(CGAbstractExternMethod):
|
||||||
def __init__(self, descriptor):
|
def __init__(self, descriptor):
|
||||||
args = [Argument('*mut JSContext', 'cx'), Argument('RawHandleObject', 'proxy'),
|
args = [Argument('*mut JSContext', 'cx'), Argument('RawHandleObject', 'proxy'),
|
||||||
Argument('RawHandleId', 'id'), Argument('*mut bool', 'bp')]
|
Argument('RawHandleId', 'id'), Argument('*mut bool', 'bp')]
|
||||||
CGAbstractExternMethod.__init__(self, descriptor, "hasOwn", "bool", args)
|
CGAbstractExternMethod.__init__(self, descriptor, "hasOwn", "bool", args, templateArgs=['D: DomTypes'])
|
||||||
self.descriptor = descriptor
|
self.descriptor = descriptor
|
||||||
|
|
||||||
def getBody(self):
|
def getBody(self):
|
||||||
|
@ -6154,7 +6158,7 @@ class CGDOMJSProxyHandler_hasOwn(CGAbstractExternMethod):
|
||||||
if indexedGetter:
|
if indexedGetter:
|
||||||
indexed += ("let index = get_array_index_from_id(*cx, Handle::from_raw(id));\n"
|
indexed += ("let index = get_array_index_from_id(*cx, Handle::from_raw(id));\n"
|
||||||
"if let Some(index) = index {\n"
|
"if let Some(index) = index {\n"
|
||||||
" let this = UnwrapProxy(proxy);\n"
|
" let this = UnwrapProxy::<D>(proxy);\n"
|
||||||
" let this = &*this;\n"
|
" let this = &*this;\n"
|
||||||
f"{CGIndenter(CGProxyIndexedGetter(self.descriptor)).define()}\n"
|
f"{CGIndenter(CGProxyIndexedGetter(self.descriptor)).define()}\n"
|
||||||
" *bp = result.is_some();\n"
|
" *bp = result.is_some();\n"
|
||||||
|
@ -6206,7 +6210,7 @@ class CGDOMJSProxyHandler_get(CGAbstractExternMethod):
|
||||||
args = [Argument('*mut JSContext', 'cx'), Argument('RawHandleObject', 'proxy'),
|
args = [Argument('*mut JSContext', 'cx'), Argument('RawHandleObject', 'proxy'),
|
||||||
Argument('RawHandleValue', 'receiver'), Argument('RawHandleId', 'id'),
|
Argument('RawHandleValue', 'receiver'), Argument('RawHandleId', 'id'),
|
||||||
Argument('RawMutableHandleValue', 'vp')]
|
Argument('RawMutableHandleValue', 'vp')]
|
||||||
CGAbstractExternMethod.__init__(self, descriptor, "get", "bool", args)
|
CGAbstractExternMethod.__init__(self, descriptor, "get", "bool", args, templateArgs=['D: DomTypes'])
|
||||||
self.descriptor = descriptor
|
self.descriptor = descriptor
|
||||||
|
|
||||||
# https://heycam.github.io/webidl/#LegacyPlatformObjectGetOwnProperty
|
# https://heycam.github.io/webidl/#LegacyPlatformObjectGetOwnProperty
|
||||||
|
@ -6246,7 +6250,7 @@ if !expando.is_null() {
|
||||||
if indexedGetter:
|
if indexedGetter:
|
||||||
getIndexedOrExpando = ("let index = get_array_index_from_id(*cx, id_lt);\n"
|
getIndexedOrExpando = ("let index = get_array_index_from_id(*cx, id_lt);\n"
|
||||||
"if let Some(index) = index {\n"
|
"if let Some(index) = index {\n"
|
||||||
" let this = UnwrapProxy(proxy);\n"
|
" let this = UnwrapProxy::<D>(proxy);\n"
|
||||||
" let this = &*this;\n"
|
" let this = &*this;\n"
|
||||||
f"{CGIndenter(CGProxyIndexedGetter(self.descriptor, templateValues)).define()}")
|
f"{CGIndenter(CGProxyIndexedGetter(self.descriptor, templateValues)).define()}")
|
||||||
trimmedGetFromExpando = stripTrailingWhitespace(getFromExpando.replace('\n', '\n '))
|
trimmedGetFromExpando = stripTrailingWhitespace(getFromExpando.replace('\n', '\n '))
|
||||||
|
@ -6341,7 +6345,7 @@ class CGAbstractClassHook(CGAbstractExternMethod):
|
||||||
"""
|
"""
|
||||||
def __init__(self, descriptor, name, returnType, args, doesNotPanic=False):
|
def __init__(self, descriptor, name, returnType, args, doesNotPanic=False):
|
||||||
CGAbstractExternMethod.__init__(self, descriptor, name, returnType,
|
CGAbstractExternMethod.__init__(self, descriptor, name, returnType,
|
||||||
args)
|
args, templateArgs=['D: DomTypes'])
|
||||||
|
|
||||||
def definition_body_prologue(self):
|
def definition_body_prologue(self):
|
||||||
return CGGeneric(f"""
|
return CGGeneric(f"""
|
||||||
|
@ -6725,7 +6729,7 @@ class CGInitStatics(CGThing):
|
||||||
else ""
|
else ""
|
||||||
)
|
)
|
||||||
nonproxy = (
|
nonproxy = (
|
||||||
"init_domjs_class();"
|
"init_domjs_class::<D>();"
|
||||||
if not descriptor.proxy
|
if not descriptor.proxy
|
||||||
and descriptor.concrete
|
and descriptor.concrete
|
||||||
else ""
|
else ""
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue