aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authoryvt <i@yvt.jp>2021-07-26 01:07:29 +0900
committeryvt <i@yvt.jp>2021-07-26 01:07:29 +0900
commitc28e98ec40e0950e77c60b32af023c6eb7da7366 (patch)
tree6fcc0af229cba18114dd347e19ee5687c0f9ea21 /components
parent66a4ea0727cf1e1cec8c6d49bcea495ff8b0650e (diff)
downloadservo-c28e98ec40e0950e77c60b32af023c6eb7da7366.tar.gz
servo-c28e98ec40e0950e77c60b32af023c6eb7da7366.zip
refactor(script): squash `CGDOMJSProxyHandler_set`
The implementation in `crate::dom::bindings::proxyhandler:: maybe_cross_origin_set_rawcx` is now directly assigned to `ProxyTraps:: set`.
Diffstat (limited to 'components')
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py56
-rw-r--r--components/script/dom/bindings/proxyhandler.rs44
2 files changed, 49 insertions, 51 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py
index 8b94cc1b5d1..1319dbab3a6 100644
--- a/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/components/script/dom/bindings/codegen/CodegenRust.py
@@ -3556,7 +3556,11 @@ class CGDefineProxyHandler(CGAbstractMethod):
customSet = 'None'
if self.descriptor.isMaybeCrossOriginObject():
- customSet = 'Some(set)'
+ # `maybe_cross_origin_set_rawcx` doesn't support legacy platform objects'
+ # `[[Set]]` (https://heycam.github.io/webidl/#legacy-platform-object-set) (yet).
+ assert not self.descriptor.operations['IndexedGetter']
+ assert not self.descriptor.operations['NamedGetter']
+ customSet = 'Some(proxyhandler::maybe_cross_origin_set_rawcx)'
getOwnEnumerablePropertyKeys = "own_property_keys"
if self.descriptor.interface.getExtendedAttribute("LegacyUnenumerableNamedProperties") or \
@@ -5958,55 +5962,6 @@ return true;""" % (maybeCrossOriginGet, getIndexedOrExpando, getNamed)
return CGGeneric(self.getBody())
-class CGDOMJSProxyHandler_set(CGAbstractExternMethod):
- def __init__(self, descriptor):
- args = [Argument('*mut JSContext', 'cx'), Argument('RawHandleObject', 'proxy'),
- Argument('RawHandleId', 'id'), Argument('RawHandleValue', 'v'),
- Argument('RawHandleValue', 'receiver'),
- Argument('*mut ObjectOpResult', 'opresult')]
- CGAbstractExternMethod.__init__(self, descriptor, "set", "bool", args)
- self.descriptor = descriptor
-
- def getBody(self):
- descriptor = self.descriptor
-
- # `CGDOMJSProxyHandler_set` doesn't support legacy platform objects'
- # `[[Set]]` (https://heycam.github.io/webidl/#legacy-platform-object-set) yet.
- #
- assert descriptor.isMaybeCrossOriginObject()
- assert not descriptor.operations['IndexedGetter']
- assert not descriptor.operations['NamedGetter']
-
- maybeCrossOriginSet = dedent(
- """
- if !proxyhandler::is_platform_object_same_origin(cx, proxy) {
- return proxyhandler::cross_origin_set(cx, proxy, id, v, receiver, opresult);
- }
-
- // Safe to enter the Realm of proxy now.
- let _ac = JSAutoRealm::new(*cx, proxy.get());
- """)
-
- return dedent(
- """
- let cx = SafeJSContext::from_ptr(cx);
- %(maybeCrossOriginSet)s
-
- // OrdinarySet
- // <https://tc39.es/ecma262/#sec-ordinaryset>
- rooted!(in(*cx) let mut own_desc = PropertyDescriptor::default());
- if !getOwnPropertyDescriptor(*cx, proxy, id, own_desc.handle_mut().into()) {
- return false;
- }
-
- js::jsapi::SetPropertyIgnoringNamedGetter(
- *cx, proxy, id, v, receiver, own_desc.handle().into(), opresult)
- """) % {"maybeCrossOriginSet": maybeCrossOriginSet}
-
- def definition_body(self):
- return CGGeneric(self.getBody())
-
-
class CGDOMJSProxyHandler_getPrototype(CGAbstractExternMethod):
def __init__(self, descriptor):
args = [Argument('*mut JSContext', 'cx'), Argument('RawHandleObject', 'proxy'),
@@ -6693,7 +6648,6 @@ class CGDescriptor(CGThing):
if descriptor.isMaybeCrossOriginObject():
cgThings.append(CGDOMJSProxyHandler_getPrototype(descriptor))
- cgThings.append(CGDOMJSProxyHandler_set(descriptor))
# cgThings.append(CGDOMJSProxyHandler(descriptor))
# cgThings.append(CGIsMethod(descriptor))
diff --git a/components/script/dom/bindings/proxyhandler.rs b/components/script/dom/bindings/proxyhandler.rs
index fb05f17611e..4a00a71fa04 100644
--- a/components/script/dom/bindings/proxyhandler.rs
+++ b/components/script/dom/bindings/proxyhandler.rs
@@ -310,6 +310,50 @@ pub unsafe fn cross_origin_own_property_keys(
true
}
+/// Implementation of `[[Set]]` for [`Location`].
+///
+/// [`Location`]: https://html.spec.whatwg.org/multipage/#location-set
+pub unsafe extern "C" fn maybe_cross_origin_set_rawcx(
+ cx: *mut JSContext,
+ proxy: RawHandleObject,
+ id: RawHandleId,
+ v: RawHandleValue,
+ receiver: RawHandleValue,
+ result: *mut ObjectOpResult,
+) -> bool {
+ let cx = SafeJSContext::from_ptr(cx);
+
+ if !is_platform_object_same_origin(cx, proxy) {
+ return cross_origin_set(cx, proxy, id, v, receiver, result);
+ }
+
+ // Safe to enter the Realm of proxy now.
+ let _ac = JSAutoRealm::new(*cx, proxy.get());
+
+ // OrdinarySet
+ // <https://tc39.es/ecma262/#sec-ordinaryset>
+ rooted!(in(*cx) let mut own_desc = PropertyDescriptor::default());
+ if !InvokeGetOwnPropertyDescriptor(
+ GetProxyHandler(*proxy),
+ *cx,
+ proxy,
+ id,
+ own_desc.handle_mut().into(),
+ ) {
+ return false;
+ }
+
+ js::jsapi::SetPropertyIgnoringNamedGetter(
+ *cx,
+ proxy,
+ id,
+ v,
+ receiver,
+ own_desc.handle().into(),
+ result,
+ )
+}
+
pub unsafe extern "C" fn maybe_cross_origin_get_prototype_if_ordinary_rawcx(
_: *mut JSContext,
_proxy: RawHandleObject,