aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bindings/codegen/CodegenRust.py
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <emilio@crisal.io>2017-09-18 06:55:08 +0200
committerEmilio Cobos Álvarez <emilio@crisal.io>2017-09-18 09:15:14 +0200
commit90fb2847207678e7feee06eaf17d75ac359d6a07 (patch)
treebfc1da3cf9a176071fbeef30b46da7b1467b73a4 /components/script/dom/bindings/codegen/CodegenRust.py
parent6edefb829c2417b763478cde3fbbc483ed196b04 (diff)
downloadservo-90fb2847207678e7feee06eaf17d75ac359d6a07.tar.gz
servo-90fb2847207678e7feee06eaf17d75ac359d6a07.zip
script: Properly implement LegacyPlatformGetOwnProperty in WebIDL.
We were missing the "ignoreNamedProperties" bit, which my previous patch uncovers.
Diffstat (limited to 'components/script/dom/bindings/codegen/CodegenRust.py')
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py33
1 files changed, 24 insertions, 9 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py
index afb189ec795..174bda2b0ca 100644
--- a/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/components/script/dom/bindings/codegen/CodegenRust.py
@@ -4817,15 +4817,14 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod):
"bool", args)
self.descriptor = descriptor
+ # https://heycam.github.io/webidl/#LegacyPlatformObjectGetOwnProperty
def getBody(self):
indexedGetter = self.descriptor.operations['IndexedGetter']
- indexedSetter = self.descriptor.operations['IndexedSetter']
get = ""
- if indexedGetter or indexedSetter:
+ if indexedGetter:
get = "let index = get_array_index_from_id(cx, id);\n"
- if indexedGetter:
attrs = "JSPROP_ENUMERATE"
if self.descriptor.operations['IndexedSetter'] is None:
attrs += " | JSPROP_READONLY"
@@ -4864,11 +4863,16 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod):
'successCode': fillDescriptor,
'pre': 'rooted!(in(cx) let mut result_root = UndefinedValue());'
}
+
+ # See the similar-looking in CGDOMJSProxyHandler_get for the spec quote.
+ condition = "RUST_JSID_IS_STRING(id) || RUST_JSID_IS_INT(id)"
+ if indexedGetter:
+ condition = "index.is_none() && (%s)" % condition
# Once we start supporting OverrideBuiltins we need to make
# ResolveOwnProperty or EnumerateOwnProperties filter out named
# properties that shadow prototype properties.
namedGet = """
-if RUST_JSID_IS_STRING(id) || RUST_JSID_IS_INT(id) {
+if %s {
let mut has_on_proto = false;
if !has_property_on_prototype(cx, proxy, id, &mut has_on_proto) {
return false;
@@ -4877,7 +4881,7 @@ if RUST_JSID_IS_STRING(id) || RUST_JSID_IS_INT(id) {
%s
}
}
-""" % CGIndenter(CGProxyNamedGetter(self.descriptor, templateValues), 8).define()
+""" % (condition, CGIndenter(CGProxyNamedGetter(self.descriptor, templateValues), 8).define())
else:
namedGet = ""
@@ -5093,9 +5097,12 @@ class CGDOMJSProxyHandler_hasOwn(CGAbstractExternMethod):
indexed = ""
namedGetter = self.descriptor.operations['NamedGetter']
+ condition = "RUST_JSID_IS_STRING(id) || RUST_JSID_IS_INT(id)"
+ if indexedGetter:
+ condition = "index.is_none() && (%s)" % condition
if namedGetter:
named = """\
-if RUST_JSID_IS_STRING(id) || RUST_JSID_IS_INT(id) {
+if %s {
let mut has_on_proto = false;
if !has_property_on_prototype(cx, proxy, id, &mut has_on_proto) {
return false;
@@ -5107,7 +5114,7 @@ if RUST_JSID_IS_STRING(id) || RUST_JSID_IS_INT(id) {
}
}
-""" % CGIndenter(CGProxyNamedGetter(self.descriptor), 8).define()
+""" % (condition, CGIndenter(CGProxyNamedGetter(self.descriptor), 8).define())
else:
named = ""
@@ -5136,6 +5143,7 @@ class CGDOMJSProxyHandler_get(CGAbstractExternMethod):
CGAbstractExternMethod.__init__(self, descriptor, "get", "bool", args)
self.descriptor = descriptor
+ # https://heycam.github.io/webidl/#LegacyPlatformObjectGetOwnProperty
def getBody(self):
getFromExpando = """\
rooted!(in(cx) let mut expando = ptr::null_mut());
@@ -5175,9 +5183,16 @@ if !expando.is_null() {
namedGetter = self.descriptor.operations['NamedGetter']
if namedGetter:
- getNamed = ("if RUST_JSID_IS_STRING(id) || RUST_JSID_IS_INT(id) {\n" +
+ condition = "RUST_JSID_IS_STRING(id) || RUST_JSID_IS_INT(id)"
+ # From step 1:
+ # If O supports indexed properties and P is an array index, then:
+ #
+ # 3. Set ignoreNamedProps to true.
+ if indexedGetter:
+ condition = "index.is_none() && (%s)" % condition
+ getNamed = ("if %s {\n" +
CGIndenter(CGProxyNamedGetter(self.descriptor, templateValues)).define() +
- "}\n")
+ "}\n") % condition
else:
getNamed = ""