aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bindings/codegen
diff options
context:
space:
mode:
authoryvt <i@yvt.jp>2021-07-17 12:04:31 +0900
committeryvt <i@yvt.jp>2021-07-17 15:26:15 +0900
commitbdd20f0139e39992aecd251285c9702823f2dc03 (patch)
tree64795c93d9d338749abeb6867a5011b32a139460 /components/script/dom/bindings/codegen
parent722a239715665dc2eeb498595fc09b363528988b (diff)
downloadservo-bdd20f0139e39992aecd251285c9702823f2dc03.tar.gz
servo-bdd20f0139e39992aecd251285c9702823f2dc03.zip
feat(script): enable `js::ProxyOptions::setLazyProto` for maybe-cross-origin objects
Setting the lazy proto option allows proxy handlers to provide dynamic prototype objects. This is necessary for the customization of `ProxyTraps::{get,set}PrototypeOf` to actually take effect.
Diffstat (limited to 'components/script/dom/bindings/codegen')
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py16
1 files changed, 14 insertions, 2 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py
index 81fbc693378..eb94029ccdd 100644
--- a/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/components/script/dom/bindings/codegen/CodegenRust.py
@@ -2874,6 +2874,13 @@ class CGWrapMethod(CGAbstractMethod):
def definition_body(self):
unforgeable = CopyUnforgeablePropertiesToInstance(self.descriptor)
if self.descriptor.proxy:
+ if self.descriptor.isMaybeCrossOriginObject():
+ proto = "ptr::null_mut()"
+ lazyProto = "true" # Our proxy handler will manage the prototype
+ else:
+ proto = "proto.get()"
+ lazyProto = "false"
+
create = """
let handler: *const libc::c_void =
RegisterBindings::proxy_handlers::%(concreteType)s
@@ -2882,8 +2889,9 @@ rooted!(in(*cx) let obj = NewProxyObject(
*cx,
handler,
Handle::from_raw(UndefinedHandleValue),
- proto.get(),
+ %(proto)s,
ptr::null(),
+ %(lazyProto)s,
));
assert!(!obj.is_null());
SetProxyReservedSlot(
@@ -2892,7 +2900,11 @@ SetProxyReservedSlot(
&PrivateValue(raw.as_ptr() as *const %(concreteType)s as *const libc::c_void),
);
"""
+ create = create % {"concreteType": self.descriptor.concreteType,
+ "proto": proto,
+ "lazyProto": lazyProto}
else:
+ lazyProto = None
create = """
rooted!(in(*cx) let obj = JS_NewObjectWithGivenProto(
*cx,
@@ -2906,7 +2918,7 @@ JS_SetReservedSlot(
&PrivateValue(raw.as_ptr() as *const %(concreteType)s as *const libc::c_void),
);
"""
- create = create % {"concreteType": self.descriptor.concreteType}
+ create = create % {"concreteType": self.descriptor.concreteType}
if self.descriptor.weakReferenceable:
create += """
let val = PrivateValue(ptr::null());