diff options
author | yvt <i@yvt.jp> | 2021-07-17 12:04:31 +0900 |
---|---|---|
committer | yvt <i@yvt.jp> | 2021-07-17 15:26:15 +0900 |
commit | bdd20f0139e39992aecd251285c9702823f2dc03 (patch) | |
tree | 64795c93d9d338749abeb6867a5011b32a139460 /components/script/dom/bindings/codegen | |
parent | 722a239715665dc2eeb498595fc09b363528988b (diff) | |
download | servo-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.py | 16 |
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()); |