DOMException should have its properties on the prototype
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 18 Jul 2017 07:33:35 +0000 (07:33 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 18 Jul 2017 07:33:35 +0000 (07:33 +0000)
https://bugs.webkit.org/show_bug.cgi?id=174597

Reviewed by Alex Christensen.

LayoutTests/imported/w3c:

* web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any-expected.txt:
* web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.worker-expected.txt:
* web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any-expected.txt:
* web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.worker-expected.txt:
* web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/exceptions-expected.txt:
Rebaseline now that more checks are passing.

* web-platform-tests/url/urlsearchparams-constructor-expected.txt:
* web-platform-tests/url/urlsearchparams-constructor.html:
Re-sync test from upstream as it would start failing otherwise.

Source/WebCore:

DOMException should have its properties on the prototype, as other interfaces:
- https://heycam.github.io/webidl/#idl-DOMException

No new tests, rebaselined existing tests.

* bindings/scripts/CodeGeneratorJS.pm:
(InterfaceRequiresAttributesOnInstance):

LayoutTests:

Rebaseline inspector tests whose output changed slightly now that the
DOMException have moved to the prototype.

* inspector/debugger/setPauseOnExceptions-all-expected.txt:
* inspector/debugger/setPauseOnExceptions-none-expected.txt:
* inspector/debugger/setPauseOnExceptions-uncaught-expected.txt:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@219607 268f45cc-cd09-0410-ab3c-d52691b4dbfc

16 files changed:
LayoutTests/ChangeLog
LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any-expected.txt
LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.worker-expected.txt
LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any-expected.txt
LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.worker-expected.txt
LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/exceptions-expected.txt
LayoutTests/imported/w3c/web-platform-tests/url/urlsearchparams-constructor-expected.txt
LayoutTests/imported/w3c/web-platform-tests/url/urlsearchparams-constructor.html
LayoutTests/inspector/debugger/setPauseOnExceptions-all-expected.txt
LayoutTests/inspector/debugger/setPauseOnExceptions-none-expected.txt
LayoutTests/inspector/debugger/setPauseOnExceptions-uncaught-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
Source/WebCore/bindings/scripts/test/JS/JSTestException.cpp
Source/WebCore/bindings/scripts/test/JS/JSTestException.h

index fbc6a80..2e75dc1 100644 (file)
@@ -1,3 +1,17 @@
+2017-07-18  Chris Dumez  <cdumez@apple.com>
+
+        DOMException should have its properties on the prototype
+        https://bugs.webkit.org/show_bug.cgi?id=174597
+
+        Reviewed by Alex Christensen.
+
+        Rebaseline inspector tests whose output changed slightly now that the
+        DOMException have moved to the prototype.
+
+        * inspector/debugger/setPauseOnExceptions-all-expected.txt:
+        * inspector/debugger/setPauseOnExceptions-none-expected.txt:
+        * inspector/debugger/setPauseOnExceptions-uncaught-expected.txt:
+
 2017-07-17  Michael Catanzaro  <mcatanzaro@igalia.com>
 
         Unreviewed GTK test gardening
index 1b67c47..916cdfd 100644 (file)
@@ -1,3 +1,21 @@
+2017-07-18  Chris Dumez  <cdumez@apple.com>
+
+        DOMException should have its properties on the prototype
+        https://bugs.webkit.org/show_bug.cgi?id=174597
+
+        Reviewed by Alex Christensen.
+
+        * web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any-expected.txt:
+        * web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.worker-expected.txt:
+        * web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any-expected.txt:
+        * web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.worker-expected.txt:
+        * web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/exceptions-expected.txt:
+        Rebaseline now that more checks are passing.
+
+        * web-platform-tests/url/urlsearchparams-constructor-expected.txt:
+        * web-platform-tests/url/urlsearchparams-constructor.html:
+        Re-sync test from upstream as it would start failing otherwise.
+
 2017-07-17  Chris Dumez  <cdumez@apple.com>
 
         Update WebIDL web-platform-tests from upstream
index 0bc5343..4c7241c 100644 (file)
@@ -1,14 +1,14 @@
 
 PASS new DOMException() 
-FAIL new DOMException(): inherited-ness assert_false: The name property should be inherited expected false got true
+PASS new DOMException(): inherited-ness 
 PASS new DOMException(null) 
 PASS new DOMException(undefined) 
-FAIL new DOMException(undefined): inherited-ness assert_false: The name property should be inherited expected false got true
+PASS new DOMException(undefined): inherited-ness 
 PASS new DOMException("foo") 
-FAIL new DOMException("foo"): inherited-ness assert_false: The name property should be inherited expected false got true
+PASS new DOMException("foo"): inherited-ness 
 PASS new DOMException("bar", undefined) 
 PASS new DOMException("bar", "NotSupportedError") 
-FAIL new DOMException("bar", "NotSupportedError"): inherited-ness assert_false: The name property should be inherited expected false got true
+PASS new DOMException("bar", "NotSupportedError"): inherited-ness 
 PASS new DOMException("bar", "foo") 
 PASS new DOMexception("msg", "IndexSizeError") 
 PASS new DOMexception("msg", "HierarchyRequestError") 
index 0bc5343..4c7241c 100644 (file)
@@ -1,14 +1,14 @@
 
 PASS new DOMException() 
-FAIL new DOMException(): inherited-ness assert_false: The name property should be inherited expected false got true
+PASS new DOMException(): inherited-ness 
 PASS new DOMException(null) 
 PASS new DOMException(undefined) 
-FAIL new DOMException(undefined): inherited-ness assert_false: The name property should be inherited expected false got true
+PASS new DOMException(undefined): inherited-ness 
 PASS new DOMException("foo") 
-FAIL new DOMException("foo"): inherited-ness assert_false: The name property should be inherited expected false got true
+PASS new DOMException("foo"): inherited-ness 
 PASS new DOMException("bar", undefined) 
 PASS new DOMException("bar", "NotSupportedError") 
-FAIL new DOMException("bar", "NotSupportedError"): inherited-ness assert_false: The name property should be inherited expected false got true
+PASS new DOMException("bar", "NotSupportedError"): inherited-ness 
 PASS new DOMException("bar", "foo") 
 PASS new DOMexception("msg", "IndexSizeError") 
 PASS new DOMexception("msg", "HierarchyRequestError") 
index 1d1da15..b280a29 100644 (file)
@@ -2,12 +2,12 @@
 PASS Cannot construct without new 
 PASS inherits from Error: prototype-side 
 PASS does not inherit from Error: class-side 
-FAIL message property descriptor assert_false: property is not own expected false got true
-FAIL message getter performs brand checks (i.e. is not [LenientThis] undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(DOMException.prototype, "message").get')
-FAIL name property descriptor assert_false: property is not own expected false got true
-FAIL name getter performs brand checks (i.e. is not [LenientThis] undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(DOMException.prototype, "name").get')
-FAIL code property descriptor assert_false: property is not own expected false got true
-FAIL code getter performs brand checks (i.e. is not [LenientThis] undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(DOMException.prototype, "code").get')
+PASS message property descriptor 
+PASS message getter performs brand checks (i.e. is not [LenientThis] 
+PASS name property descriptor 
+PASS name getter performs brand checks (i.e. is not [LenientThis] 
+PASS code property descriptor 
+PASS code getter performs brand checks (i.e. is not [LenientThis] 
 PASS code property is not affected by shadowing the name property 
 PASS Object.prototype.toString behavior is like other interfaces 
 FAIL Inherits its toString() from Error.prototype assert_false: toString must not exist on DOMException.prototype expected false got true
index 1d1da15..b280a29 100644 (file)
@@ -2,12 +2,12 @@
 PASS Cannot construct without new 
 PASS inherits from Error: prototype-side 
 PASS does not inherit from Error: class-side 
-FAIL message property descriptor assert_false: property is not own expected false got true
-FAIL message getter performs brand checks (i.e. is not [LenientThis] undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(DOMException.prototype, "message").get')
-FAIL name property descriptor assert_false: property is not own expected false got true
-FAIL name getter performs brand checks (i.e. is not [LenientThis] undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(DOMException.prototype, "name").get')
-FAIL code property descriptor assert_false: property is not own expected false got true
-FAIL code getter performs brand checks (i.e. is not [LenientThis] undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(DOMException.prototype, "code").get')
+PASS message property descriptor 
+PASS message getter performs brand checks (i.e. is not [LenientThis] 
+PASS name property descriptor 
+PASS name getter performs brand checks (i.e. is not [LenientThis] 
+PASS code property descriptor 
+PASS code getter performs brand checks (i.e. is not [LenientThis] 
 PASS code property is not affected by shadowing the name property 
 PASS Object.prototype.toString behavior is like other interfaces 
 FAIL Inherits its toString() from Error.prototype assert_false: toString must not exist on DOMException.prototype expected false got true
index 772aca9..66b2811 100644 (file)
@@ -1,13 +1,13 @@
 
 PASS Object.getPrototypeOf(exception) === DOMException.prototype 
-FAIL exception.hasOwnProperty("name") assert_false: expected false got true
-FAIL exception.hasOwnProperty("message") assert_false: expected false got true
+PASS exception.hasOwnProperty("name") 
+PASS exception.hasOwnProperty("message") 
 PASS exception.name === "HierarchyRequestError" 
 PASS exception.code === DOMException.HIERARCHY_REQUEST_ERR 
 PASS Object.prototype.toString.call(exception) === "[object DOMException]" 
 PASS In iframe: Object.getPrototypeOf(exception) === DOMException.prototype 
-FAIL In iframe: exception.hasOwnProperty("name") assert_false: expected false got true
-FAIL In iframe: exception.hasOwnProperty("message") assert_false: expected false got true
+PASS In iframe: exception.hasOwnProperty("name") 
+PASS In iframe: exception.hasOwnProperty("message") 
 PASS In iframe: exception.name === "HierarchyRequestError" 
 PASS In iframe: exception.code === DOMException.HIERARCHY_REQUEST_ERR 
 PASS In iframe: Object.prototype.toString.call(exception) === "[object DOMException]" 
index 5b8f490..c70d023 100644 (file)
@@ -1,7 +1,7 @@
 
 PASS Basic URLSearchParams construction 
 PASS URLSearchParams constructor, no arguments 
-PASS URLSearchParams constructor, DOMException.prototype as argument 
+PASS URLSearchParams constructor, DOMException as argument 
 PASS URLSearchParams constructor, empty string as argument 
 PASS URLSearchParams constructor, {} as argument 
 PASS URLSearchParams constructor, string. 
index 1e214e0..0637a38 100644 (file)
@@ -23,9 +23,11 @@ test(function() {
 }, "URLSearchParams constructor, no arguments")
 
 test(() => {
-    params = new URLSearchParams(DOMException.prototype);
+    params = new URLSearchParams(DOMException);
     assert_equals(params.toString(), "INDEX_SIZE_ERR=1&DOMSTRING_SIZE_ERR=2&HIERARCHY_REQUEST_ERR=3&WRONG_DOCUMENT_ERR=4&INVALID_CHARACTER_ERR=5&NO_DATA_ALLOWED_ERR=6&NO_MODIFICATION_ALLOWED_ERR=7&NOT_FOUND_ERR=8&NOT_SUPPORTED_ERR=9&INUSE_ATTRIBUTE_ERR=10&INVALID_STATE_ERR=11&SYNTAX_ERR=12&INVALID_MODIFICATION_ERR=13&NAMESPACE_ERR=14&INVALID_ACCESS_ERR=15&VALIDATION_ERR=16&TYPE_MISMATCH_ERR=17&SECURITY_ERR=18&NETWORK_ERR=19&ABORT_ERR=20&URL_MISMATCH_ERR=21&QUOTA_EXCEEDED_ERR=22&TIMEOUT_ERR=23&INVALID_NODE_TYPE_ERR=24&DATA_CLONE_ERR=25")
-}, "URLSearchParams constructor, DOMException.prototype as argument")
+    assert_throws(new TypeError(), () => new URLSearchParams(DOMException.prototype),
+                  "Constructing a URLSearchParams from DOMException.prototype should throw due to branding checks");
+}, "URLSearchParams constructor, DOMException as argument")
 
 test(() => {
     params = new URLSearchParams('');
index aa2d6e2..fbfc62b 100644 (file)
@@ -1,6 +1,6 @@
 CONSOLE MESSAGE: line 1: caught inline: {"line":1,"column":36}
 CONSOLE MESSAGE: line 38: catchNested caught exception: {"line":3,"column":11,"sourceURL":"exception.js"}
-CONSOLE MESSAGE: line 38: catchNested caught exception: {"code":8,"name":"NotFoundError","message":"The object can not be found here.","line":8,"column":30,"sourceURL":"exception.js"}
+CONSOLE MESSAGE: line 38: catchNested caught exception: {"line":8,"column":30,"sourceURL":"exception.js"}
 CONSOLE MESSAGE: line 38: catchNested caught exception: "exception in host function"
 CONSOLE MESSAGE: line 38: catchNested caught exception: "exception string"
 CONSOLE MESSAGE: line 38: catchNested caught exception: {"line":1,"column":61}
index 31ec0ac..9466105 100644 (file)
@@ -1,6 +1,6 @@
 CONSOLE MESSAGE: line 1: caught inline: {"line":1,"column":36}
 CONSOLE MESSAGE: line 38: catchNested caught exception: {"line":3,"column":11,"sourceURL":"exception.js"}
-CONSOLE MESSAGE: line 38: catchNested caught exception: {"code":8,"name":"NotFoundError","message":"The object can not be found here.","line":8,"column":30,"sourceURL":"exception.js"}
+CONSOLE MESSAGE: line 38: catchNested caught exception: {"line":8,"column":30,"sourceURL":"exception.js"}
 CONSOLE MESSAGE: line 38: catchNested caught exception: "exception in host function"
 CONSOLE MESSAGE: line 38: catchNested caught exception: "exception string"
 CONSOLE MESSAGE: line 38: catchNested caught exception: {"line":1,"column":61}
index c9c922c..02fcb60 100644 (file)
@@ -1,6 +1,6 @@
 CONSOLE MESSAGE: line 1: caught inline: {"line":1,"column":36}
 CONSOLE MESSAGE: line 38: catchNested caught exception: {"line":3,"column":11,"sourceURL":"exception.js"}
-CONSOLE MESSAGE: line 38: catchNested caught exception: {"code":8,"name":"NotFoundError","message":"The object can not be found here.","line":8,"column":30,"sourceURL":"exception.js"}
+CONSOLE MESSAGE: line 38: catchNested caught exception: {"line":8,"column":30,"sourceURL":"exception.js"}
 CONSOLE MESSAGE: line 38: catchNested caught exception: "exception in host function"
 CONSOLE MESSAGE: line 38: catchNested caught exception: "exception string"
 CONSOLE MESSAGE: line 38: catchNested caught exception: {"line":1,"column":61}
@@ -13,7 +13,7 @@ CONSOLE MESSAGE: line 18: [object Object]
 CONSOLE MESSAGE: line 18: Error: error message
 CONSOLE MESSAGE: line 1: caught inline: {"line":1,"column":36}
 CONSOLE MESSAGE: line 38: catchNested caught exception: {"line":3,"column":11,"sourceURL":"exception.js"}
-CONSOLE MESSAGE: line 38: catchNested caught exception: {"code":8,"name":"NotFoundError","message":"The object can not be found here.","line":8,"column":30,"sourceURL":"exception.js"}
+CONSOLE MESSAGE: line 38: catchNested caught exception: {"line":8,"column":30,"sourceURL":"exception.js"}
 CONSOLE MESSAGE: line 38: catchNested caught exception: "exception in host function"
 CONSOLE MESSAGE: line 38: catchNested caught exception: "exception string"
 CONSOLE MESSAGE: line 38: catchNested caught exception: {"line":1,"column":61}
index c415aac..de42775 100644 (file)
@@ -1,3 +1,18 @@
+2017-07-18  Chris Dumez  <cdumez@apple.com>
+
+        DOMException should have its properties on the prototype
+        https://bugs.webkit.org/show_bug.cgi?id=174597
+
+        Reviewed by Alex Christensen.
+
+        DOMException should have its properties on the prototype, as other interfaces:
+        - https://heycam.github.io/webidl/#idl-DOMException
+
+        No new tests, rebaselined existing tests.
+
+        * bindings/scripts/CodeGeneratorJS.pm:
+        (InterfaceRequiresAttributesOnInstance):
+
 2017-07-18  Basuke Suzuki  <Basuke.Suzuki@sony.com>
 
         [Curl] Unify ResourceHandleManager into CurlJobManager.
index 0fd49bf..7b30d26 100644 (file)
@@ -1634,29 +1634,12 @@ sub IsGlobalOrPrimaryGlobalInterface
     return $interface->extendedAttributes->{Global} || $interface->extendedAttributes->{PrimaryGlobal};
 }
 
-sub InterfaceRequiresAttributesOnInstance
-{
-    my $interface = shift;
-    my $interfaceName = $interface->type->name;
-
-    # FIXME: All these return 1 if ... should ideally be removed.
-    # Some of them are unavoidable due to DOM weirdness, in which case we should
-    # add an IDL attribute for them.
-
-    # FIXME: We should be able to drop this once <rdar://problem/24466097> is fixed.
-    return 1 if $interface->isException;
-
-    return 1 if IsGlobalOrPrimaryGlobalInterface($interface);
-
-    return 0;
-}
-
 sub AttributeShouldBeOnInstance
 {
     my $interface = shift;
     my $attribute = shift;
 
-    return 1 if InterfaceRequiresAttributesOnInstance($interface);
+    return 1 if IsGlobalOrPrimaryGlobalInterface($interface);
     return 1 if $codeGenerator->IsConstructorType($attribute->type);
 
     # [Unforgeable] attributes should be on the instance.
index 921b68d..7411a61 100644 (file)
@@ -68,20 +68,6 @@ private:
 
 using JSTestExceptionConstructor = JSDOMConstructorNotConstructable<JSTestException>;
 
-/* Hash table */
-
-static const struct CompactHashIndex JSTestExceptionTableIndex[2] = {
-    { -1, -1 },
-    { 0, -1 },
-};
-
-
-static const HashTableValue JSTestExceptionTableValues[] =
-{
-    { "name", ReadOnly | CustomAccessor, NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestExceptionName), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
-};
-
-static const HashTable JSTestExceptionTable = { 1, 1, true, JSTestExceptionTableValues, JSTestExceptionTableIndex };
 template<> JSValue JSTestExceptionConstructor::prototypeForStructure(JSC::VM& vm, const JSDOMGlobalObject& globalObject)
 {
     UNUSED_PARAM(vm);
@@ -102,6 +88,7 @@ template<> const ClassInfo JSTestExceptionConstructor::s_info = { "TestException
 static const HashTableValue JSTestExceptionPrototypeTableValues[] =
 {
     { "constructor", DontEnum, NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestExceptionConstructor), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSTestExceptionConstructor) } },
+    { "name", ReadOnly | CustomAccessor, NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestExceptionName), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
 };
 
 const ClassInfo JSTestExceptionPrototype::s_info = { "TestExceptionPrototype", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(JSTestExceptionPrototype) };
@@ -112,7 +99,7 @@ void JSTestExceptionPrototype::finishCreation(VM& vm)
     reifyStaticProperties(vm, JSTestExceptionPrototypeTableValues, *this);
 }
 
-const ClassInfo JSTestException::s_info = { "TestException", &Base::s_info, &JSTestExceptionTable, nullptr, CREATE_METHOD_TABLE(JSTestException) };
+const ClassInfo JSTestException::s_info = { "TestException", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(JSTestException) };
 
 JSTestException::JSTestException(Structure* structure, JSDOMGlobalObject& globalObject, Ref<TestException>&& impl)
     : JSDOMWrapper<TestException>(structure, globalObject, WTFMove(impl))
index 2b0cc46..e9ed302 100644 (file)
@@ -50,8 +50,6 @@ public:
     }
 
     static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*);
-public:
-    static const unsigned StructureFlags = JSC::HasStaticPropertyTable | Base::StructureFlags;
 protected:
     JSTestException(JSC::Structure*, JSDOMGlobalObject&, Ref<TestException>&&);