diff options
author | Bruno de Oliveira Abinader <bruno.d@partner.samsung.com> | 2014-12-26 14:49:52 -0400 |
---|---|---|
committer | Bruno de Oliveira Abinader <bruno.d@partner.samsung.com> | 2014-12-29 12:58:48 -0400 |
commit | ab618dd9c74e9c9383af8df970ae715445099bfd (patch) | |
tree | 13832408b6153b7e952329652c6da9b4f1e3928d | |
parent | 366ea4fe79cd838ae66acc74d9fdc7dcb36bddae (diff) | |
download | servo-ab618dd9c74e9c9383af8df970ae715445099bfd.tar.gz servo-ab618dd9c74e9c9383af8df970ae715445099bfd.zip |
Add support for named deleter
Closes #4469.
3 files changed, 43 insertions, 30 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index c707622c6dc..a0ea1a0e3f0 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -2089,13 +2089,18 @@ class CGDefineProxyHandler(CGAbstractMethod): customDefineProperty = 'defineProperty_' if self.descriptor.operations['IndexedSetter'] or self.descriptor.operations['NamedSetter']: customDefineProperty = 'defineProperty' + + customDelete = 'delete_' + if self.descriptor.operations['NamedDeleter']: + customDelete = 'delete' + body = """\ let traps = ProxyTraps { getPropertyDescriptor: Some(getPropertyDescriptor), getOwnPropertyDescriptor: Some(getOwnPropertyDescriptor), defineProperty: Some(%s), getOwnPropertyNames: Some(getOwnPropertyNames_), - delete_: Some(delete_), + delete_: Some(%s), enumerate: Some(enumerate_), has: None, @@ -2123,7 +2128,7 @@ let traps = ProxyTraps { }; CreateProxyHandler(&traps, &Class as *const _ as *const _) -""" % (customDefineProperty, FINALIZE_HOOK_NAME, +""" % (customDefineProperty, customDelete, FINALIZE_HOOK_NAME, TRACE_HOOK_NAME) return CGGeneric(body) @@ -3580,6 +3585,14 @@ class CGProxyNamedSetter(CGProxySpecialOperation): def __init__(self, descriptor): CGProxySpecialOperation.__init__(self, descriptor, 'NamedSetter') +class CGProxyNamedDeleter(CGProxySpecialOperation): + """ + Class to generate a call to a named deleter. + """ + def __init__(self, descriptor): + CGProxySpecialOperation.__init__(self, descriptor, 'NamedDeleter') + + class CGProxyUnwrap(CGAbstractMethod): def __init__(self, descriptor): args = [Argument('*mut JSObject', 'obj')] @@ -3748,6 +3761,28 @@ class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod): def definition_body(self): return CGGeneric(self.getBody()) +class CGDOMJSProxyHandler_delete(CGAbstractExternMethod): + def __init__(self, descriptor): + args = [Argument('*mut JSContext', 'cx'), Argument('*mut JSObject', 'proxy'), + Argument('jsid', 'id'), + Argument('*mut bool', 'bp')] + CGAbstractExternMethod.__init__(self, descriptor, "delete", "bool", args) + self.descriptor = descriptor + + def getBody(self): + set = "" + if self.descriptor.operations['NamedDeleter']: + set += ("let name = jsid_to_str(cx, id);\n" + + "let this = UnwrapProxy(proxy);\n" + + "let this = JS::from_raw(this);\n" + + "let this = this.root();\n" + + "%s") % (CGProxyNamedDeleter(self.descriptor).define()) + set += "return proxyhandler::delete_(%s);" % ", ".join(a.name for a in self.args) + return set + + def definition_body(self): + return CGGeneric(self.getBody()) + class CGDOMJSProxyHandler_hasOwn(CGAbstractExternMethod): def __init__(self, descriptor): args = [Argument('*mut JSContext', 'cx'), Argument('*mut JSObject', 'proxy'), @@ -4164,6 +4199,12 @@ class CGDescriptor(CGThing): if descriptor.operations['IndexedSetter'] or descriptor.operations['NamedSetter']: cgThings.append(CGDOMJSProxyHandler_defineProperty(descriptor)) + # We want to prevent indexed deleters from compiling at all. + assert not descriptor.operations['IndexedDeleter'] + + if descriptor.operations['NamedDeleter']: + cgThings.append(CGDOMJSProxyHandler_delete(descriptor)) + #cgThings.append(CGDOMJSProxyHandler(descriptor)) #cgThings.append(CGIsMethod(descriptor)) pass diff --git a/tests/wpt/metadata/html/dom/elements/global-attributes/dataset-delete.html.ini b/tests/wpt/metadata/html/dom/elements/global-attributes/dataset-delete.html.ini deleted file mode 100644 index 5718c7b3ebb..00000000000 --- a/tests/wpt/metadata/html/dom/elements/global-attributes/dataset-delete.html.ini +++ /dev/null @@ -1,23 +0,0 @@ -[dataset-delete.html] - type: testharness - [Deleting element.dataset[\'foo\'\] should also remove an attribute with name \'data-foo\' should it exist.] - expected: FAIL - - [Deleting element.dataset[\'fooBar\'\] should also remove an attribute with name \'data-foo-bar\' should it exist.] - expected: FAIL - - [Deleting element.dataset[\'-\'\] should also remove an attribute with name \'data--\' should it exist.] - expected: FAIL - - [Deleting element.dataset[\'Foo\'\] should also remove an attribute with name \'data--foo\' should it exist.] - expected: FAIL - - [Deleting element.dataset[\'-Foo\'\] should also remove an attribute with name \'data---foo\' should it exist.] - expected: FAIL - - [Deleting element.dataset[\'\'\] should also remove an attribute with name \'data-\' should it exist.] - expected: FAIL - - [Deleting element.dataset[\'\xc3\xa0\'\] should also remove an attribute with name \'data-\xc3\xa0\' should it exist.] - expected: FAIL - diff --git a/tests/wpt/metadata/webstorage/storage_session_removeitem_js.html.ini b/tests/wpt/metadata/webstorage/storage_session_removeitem_js.html.ini deleted file mode 100644 index 8567a6f56bb..00000000000 --- a/tests/wpt/metadata/webstorage/storage_session_removeitem_js.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[storage_session_removeitem_js.html] - type: testharness - [Web Storage 1] - expected: FAIL - |