aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2015-12-25 04:56:45 +0100
committerAnthony Ramine <n.oxyde@gmail.com>2016-02-23 17:23:51 +0100
commit7f36247d031f9533de7e06a9aae3f4931dd59c67 (patch)
tree84e7bc95356af5e7915705feab2947141bfe3d7b
parentcbf514d63fb4f48c62af776b65d21dc0e4ad9bde (diff)
downloadservo-7f36247d031f9533de7e06a9aae3f4931dd59c67.tar.gz
servo-7f36247d031f9533de7e06a9aae3f4931dd59c67.zip
Support [LegacyUnenumerableNamedProperties]
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py82
-rw-r--r--components/script/dom/webidls/HTMLCollection.webidl1
-rw-r--r--components/script/dom/webidls/HTMLFormControlsCollection.webidl1
-rw-r--r--components/script/dom/webidls/NamedNodeMap.webidl1
-rw-r--r--tests/wpt/metadata/dom/nodes/attributes.html.ini12
-rw-r--r--tests/wpt/metadata/html/dom/documents/dom-tree-accessors/document.forms.html.ini5
6 files changed, 75 insertions, 27 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py
index 62145bd60e8..6d626bea0ca 100644
--- a/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/components/script/dom/bindings/codegen/CodegenRust.py
@@ -2602,13 +2602,25 @@ class CGDefineProxyHandler(CGAbstractMethod):
if self.descriptor.operations['NamedDeleter']:
customDelete = 'delete'
- body = """\
+ getOwnEnumerablePropertyKeys = "None"
+ if self.descriptor.interface.getExtendedAttribute("LegacyUnenumerableNamedProperties"):
+ getOwnEnumerablePropertyKeys = "Some(getOwnEnumerablePropertyKeys)"
+
+ args = {
+ "defineProperty": customDefineProperty,
+ "delete": customDelete,
+ "getOwnEnumerablePropertyKeys": getOwnEnumerablePropertyKeys,
+ "trace": TRACE_HOOK_NAME,
+ "finalize": FINALIZE_HOOK_NAME,
+ }
+
+ return CGGeneric("""\
let traps = ProxyTraps {
enter: None,
getOwnPropertyDescriptor: Some(getOwnPropertyDescriptor),
- defineProperty: Some(%s),
+ defineProperty: Some(%(defineProperty)s),
ownPropertyKeys: Some(own_property_keys),
- delete_: Some(%s),
+ delete_: Some(%(delete)s),
enumerate: None,
preventExtensions: Some(proxyhandler::prevent_extensions),
isExtensible: Some(proxyhandler::is_extensible),
@@ -2619,7 +2631,7 @@ let traps = ProxyTraps {
construct: None,
getPropertyDescriptor: Some(get_property_descriptor),
hasOwn: Some(hasOwn),
- getOwnEnumerablePropertyKeys: None,
+ getOwnEnumerablePropertyKeys: %(getOwnEnumerablePropertyKeys)s,
nativeCall: None,
hasInstance: None,
objectClassIs: None,
@@ -2627,16 +2639,15 @@ let traps = ProxyTraps {
fun_toString: None,
boxedValue_unbox: None,
defaultValue: None,
- trace: Some(%s),
- finalize: Some(%s),
+ trace: Some(%(trace)s),
+ finalize: Some(%(finalize)s),
objectMoved: None,
isCallable: None,
isConstructor: None,
};
CreateProxyHandler(&traps, &Class as *const _ as *const _)\
-""" % (customDefineProperty, customDelete, TRACE_HOOK_NAME, FINALIZE_HOOK_NAME)
- return CGGeneric(body)
+""" % args)
class CGDefineDOMInterfaceMethod(CGAbstractMethod):
@@ -4340,9 +4351,15 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod):
namedGetter = self.descriptor.operations['NamedGetter']
if namedGetter:
- attrs = "JSPROP_ENUMERATE"
+ attrs = []
+ if not self.descriptor.interface.getExtendedAttribute("LegacyUnenumerableNamedProperties"):
+ attrs.append("JSPROP_ENUMERATE")
if self.descriptor.operations['NamedSetter'] is None:
- attrs += " | JSPROP_READONLY"
+ attrs.append("JSPROP_READONLY")
+ if attrs:
+ attrs = " | ".join(attrs)
+ else:
+ attrs = "0"
fillDescriptor = ("desc.get().value = result_root.ptr;\n"
"fill_property_descriptor(&mut *desc.ptr, *proxy.ptr, %s);\n"
"return true;" % attrs)
@@ -4518,6 +4535,49 @@ class CGDOMJSProxyHandler_ownPropertyKeys(CGAbstractExternMethod):
return CGGeneric(self.getBody())
+class CGDOMJSProxyHandler_getOwnEnumerablePropertyKeys(CGAbstractExternMethod):
+ def __init__(self, descriptor):
+ assert (descriptor.operations["IndexedGetter"] and
+ descriptor.interface.getExtendedAttribute("LegacyUnenumerableNamedProperties"))
+ args = [Argument('*mut JSContext', 'cx'),
+ Argument('HandleObject', 'proxy'),
+ Argument('*mut AutoIdVector', 'props')]
+ CGAbstractExternMethod.__init__(self, descriptor,
+ "getOwnEnumerablePropertyKeys", "bool", args)
+ self.descriptor = descriptor
+
+ def getBody(self):
+ body = dedent(
+ """
+ let unwrapped_proxy = UnwrapProxy(proxy);
+ """)
+
+ if self.descriptor.operations['IndexedGetter']:
+ body += dedent(
+ """
+ for i in 0..(*unwrapped_proxy).Length() {
+ let rooted_jsid = RootedId::new(cx, int_to_jsid(i as i32));
+ AppendToAutoIdVector(props, rooted_jsid.handle().get());
+ }
+ """)
+
+ body += dedent(
+ """
+ let expando = get_expando_object(proxy);
+ if !expando.is_null() {
+ let rooted_expando = RootedObject::new(cx, expando);
+ GetPropertyKeys(cx, rooted_expando.handle(), JSITER_OWNONLY | JSITER_HIDDEN | JSITER_SYMBOLS, props);
+ }
+
+ return true;
+ """)
+
+ return body
+
+ def definition_body(self):
+ return CGGeneric(self.getBody())
+
+
class CGDOMJSProxyHandler_hasOwn(CGAbstractExternMethod):
def __init__(self, descriptor):
args = [Argument('*mut JSContext', 'cx'), Argument('HandleObject', 'proxy'),
@@ -4967,6 +5027,8 @@ class CGDescriptor(CGThing):
cgThings.append(CGProxyUnwrap(descriptor))
cgThings.append(CGDOMJSProxyHandlerDOMClass(descriptor))
cgThings.append(CGDOMJSProxyHandler_ownPropertyKeys(descriptor))
+ if descriptor.interface.getExtendedAttribute("LegacyUnenumerableNamedProperties"):
+ cgThings.append(CGDOMJSProxyHandler_getOwnEnumerablePropertyKeys(descriptor))
cgThings.append(CGDOMJSProxyHandler_getOwnPropertyDescriptor(descriptor))
cgThings.append(CGDOMJSProxyHandler_className(descriptor))
cgThings.append(CGDOMJSProxyHandler_get(descriptor))
diff --git a/components/script/dom/webidls/HTMLCollection.webidl b/components/script/dom/webidls/HTMLCollection.webidl
index 02bcea6ccae..350a553ff0b 100644
--- a/components/script/dom/webidls/HTMLCollection.webidl
+++ b/components/script/dom/webidls/HTMLCollection.webidl
@@ -5,6 +5,7 @@
// https://dom.spec.whatwg.org/#interface-htmlcollection
+[LegacyUnenumerableNamedProperties]
interface HTMLCollection {
[Pure]
readonly attribute unsigned long length;
diff --git a/components/script/dom/webidls/HTMLFormControlsCollection.webidl b/components/script/dom/webidls/HTMLFormControlsCollection.webidl
index 0e81285575b..c2ff68c72fa 100644
--- a/components/script/dom/webidls/HTMLFormControlsCollection.webidl
+++ b/components/script/dom/webidls/HTMLFormControlsCollection.webidl
@@ -4,6 +4,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// https://html.spec.whatwg.org/multipage/#htmlformcontrolscollection
+[LegacyUnenumerableNamedProperties]
interface HTMLFormControlsCollection : HTMLCollection {
// inherits length and item()
getter (RadioNodeList or Element)? namedItem(DOMString name); // shadows inherited namedItem()
diff --git a/components/script/dom/webidls/NamedNodeMap.webidl b/components/script/dom/webidls/NamedNodeMap.webidl
index 581c8dc7e89..c28d2566a0e 100644
--- a/components/script/dom/webidls/NamedNodeMap.webidl
+++ b/components/script/dom/webidls/NamedNodeMap.webidl
@@ -4,6 +4,7 @@
// https://dom.spec.whatwg.org/#interface-namednodemap
+[LegacyUnenumerableNamedProperties]
interface NamedNodeMap {
[Pure]
readonly attribute unsigned long length;
diff --git a/tests/wpt/metadata/dom/nodes/attributes.html.ini b/tests/wpt/metadata/dom/nodes/attributes.html.ini
index 88db1baa145..c66885207f2 100644
--- a/tests/wpt/metadata/dom/nodes/attributes.html.ini
+++ b/tests/wpt/metadata/dom/nodes/attributes.html.ini
@@ -6,18 +6,6 @@
[getAttributeNames tests]
expected: FAIL
- [Own property correctness with basic attributes]
- expected: FAIL
-
- [Own property correctness with non-namespaced attribute before same-name namespaced one]
- expected: FAIL
-
- [Own property correctness with namespaced attribute before same-name non-namespaced one]
- expected: FAIL
-
- [Own property correctness with two namespaced attributes with the same name-with-prefix]
- expected: FAIL
-
[Own property names should only include all-lowercase qualified names for an HTML element in an HTML document]
expected: FAIL
diff --git a/tests/wpt/metadata/html/dom/documents/dom-tree-accessors/document.forms.html.ini b/tests/wpt/metadata/html/dom/documents/dom-tree-accessors/document.forms.html.ini
deleted file mode 100644
index a1e22155c9c..00000000000
--- a/tests/wpt/metadata/html/dom/documents/dom-tree-accessors/document.forms.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[document.forms.html]
- type: testharness
- [document.forms iteration]
- expected: FAIL
-