DOMException should be constructible
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 6 Aug 2016 05:34:57 +0000 (05:34 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 6 Aug 2016 05:34:57 +0000 (05:34 +0000)
https://bugs.webkit.org/show_bug.cgi?id=160626

Reviewed by Darin Adler.

LayoutTests/imported/w3c:

Import WebIDL tests from W3C web-platform-tests.

* web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants-expected.txt: Added.
* web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html: Added.
* web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-expected.txt: Added.
* web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html: Added.
* web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object-expected.txt: Added.
* web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html: Added.
* web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.js: Added.
* web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js: Added.
* web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/exceptions-expected.txt: Added.
* web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/exceptions.html: Added.
* web-platform-tests/WebIDL/ecmascript-binding/has-instance-expected.txt: Added.
* web-platform-tests/WebIDL/ecmascript-binding/has-instance.html: Added.
* web-platform-tests/WebIDL/ecmascript-binding/interface-object-expected.txt: Added.
* web-platform-tests/WebIDL/ecmascript-binding/interface-object.html: Added.

Source/WebCore:

DOMException should be constructible:
- http://heycam.github.io/webidl/#dfn-DOMException
- http://heycam.github.io/webidl/#es-DOMException-constructor-object

DOMException already has a constructor in Firefox and Chrome so this
aligns our behavior with other browsers.

Test: imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html

* dom/DOMCoreException.cpp:
(WebCore::errorCodeFromName):
(WebCore::DOMCoreException::create):
(WebCore::DOMCoreException::DOMCoreException):
* dom/DOMCoreException.h:
* dom/DOMCoreException.idl:
* dom/ExceptionBase.cpp:
(WebCore::ExceptionBase::ExceptionBase):
* dom/ExceptionBase.h:

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

21 files changed:
LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants-expected.txt [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-expected.txt [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object-expected.txt [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.js [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/exceptions-expected.txt [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/exceptions.html [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/has-instance-expected.txt [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/has-instance.html [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/interface-object-expected.txt [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/interface-object.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/dom/DOMCoreException.cpp
Source/WebCore/dom/DOMCoreException.h
Source/WebCore/dom/DOMCoreException.idl
Source/WebCore/dom/ExceptionBase.cpp
Source/WebCore/dom/ExceptionBase.h

index 33a5784..8be7aac 100644 (file)
@@ -1,5 +1,29 @@
 2016-08-05  Chris Dumez  <cdumez@apple.com>
 
+        DOMException should be constructible
+        https://bugs.webkit.org/show_bug.cgi?id=160626
+
+        Reviewed by Darin Adler.
+
+        Import WebIDL tests from W3C web-platform-tests.
+
+        * web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants-expected.txt: Added.
+        * web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html: Added.
+        * web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-expected.txt: Added.
+        * web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html: Added.
+        * web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object-expected.txt: Added.
+        * web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html: Added.
+        * web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.js: Added.
+        * web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js: Added.
+        * web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/exceptions-expected.txt: Added.
+        * web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/exceptions.html: Added.
+        * web-platform-tests/WebIDL/ecmascript-binding/has-instance-expected.txt: Added.
+        * web-platform-tests/WebIDL/ecmascript-binding/has-instance.html: Added.
+        * web-platform-tests/WebIDL/ecmascript-binding/interface-object-expected.txt: Added.
+        * web-platform-tests/WebIDL/ecmascript-binding/interface-object.html: Added.
+
+2016-08-05  Chris Dumez  <cdumez@apple.com>
+
         Align Range.insertNode() input validation with the specification
         https://bugs.webkit.org/show_bug.cgi?id=160624
 
diff --git a/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants-expected.txt
new file mode 100644 (file)
index 0000000..ba23f26
--- /dev/null
@@ -0,0 +1,53 @@
+
+PASS DOMException constants 
+PASS Constant INDEX_SIZE_ERR on DOMException constructor object 
+PASS Constant INDEX_SIZE_ERR on DOMException prototype object 
+PASS Constant DOMSTRING_SIZE_ERR on DOMException constructor object 
+PASS Constant DOMSTRING_SIZE_ERR on DOMException prototype object 
+PASS Constant HIERARCHY_REQUEST_ERR on DOMException constructor object 
+PASS Constant HIERARCHY_REQUEST_ERR on DOMException prototype object 
+PASS Constant WRONG_DOCUMENT_ERR on DOMException constructor object 
+PASS Constant WRONG_DOCUMENT_ERR on DOMException prototype object 
+PASS Constant INVALID_CHARACTER_ERR on DOMException constructor object 
+PASS Constant INVALID_CHARACTER_ERR on DOMException prototype object 
+PASS Constant NO_DATA_ALLOWED_ERR on DOMException constructor object 
+PASS Constant NO_DATA_ALLOWED_ERR on DOMException prototype object 
+PASS Constant NO_MODIFICATION_ALLOWED_ERR on DOMException constructor object 
+PASS Constant NO_MODIFICATION_ALLOWED_ERR on DOMException prototype object 
+PASS Constant NOT_FOUND_ERR on DOMException constructor object 
+PASS Constant NOT_FOUND_ERR on DOMException prototype object 
+PASS Constant NOT_SUPPORTED_ERR on DOMException constructor object 
+PASS Constant NOT_SUPPORTED_ERR on DOMException prototype object 
+PASS Constant INUSE_ATTRIBUTE_ERR on DOMException constructor object 
+PASS Constant INUSE_ATTRIBUTE_ERR on DOMException prototype object 
+PASS Constant INVALID_STATE_ERR on DOMException constructor object 
+PASS Constant INVALID_STATE_ERR on DOMException prototype object 
+PASS Constant SYNTAX_ERR on DOMException constructor object 
+PASS Constant SYNTAX_ERR on DOMException prototype object 
+PASS Constant INVALID_MODIFICATION_ERR on DOMException constructor object 
+PASS Constant INVALID_MODIFICATION_ERR on DOMException prototype object 
+PASS Constant NAMESPACE_ERR on DOMException constructor object 
+PASS Constant NAMESPACE_ERR on DOMException prototype object 
+PASS Constant INVALID_ACCESS_ERR on DOMException constructor object 
+PASS Constant INVALID_ACCESS_ERR on DOMException prototype object 
+PASS Constant VALIDATION_ERR on DOMException constructor object 
+PASS Constant VALIDATION_ERR on DOMException prototype object 
+PASS Constant TYPE_MISMATCH_ERR on DOMException constructor object 
+PASS Constant TYPE_MISMATCH_ERR on DOMException prototype object 
+PASS Constant SECURITY_ERR on DOMException constructor object 
+PASS Constant SECURITY_ERR on DOMException prototype object 
+PASS Constant NETWORK_ERR on DOMException constructor object 
+PASS Constant NETWORK_ERR on DOMException prototype object 
+PASS Constant ABORT_ERR on DOMException constructor object 
+PASS Constant ABORT_ERR on DOMException prototype object 
+PASS Constant URL_MISMATCH_ERR on DOMException constructor object 
+PASS Constant URL_MISMATCH_ERR on DOMException prototype object 
+PASS Constant QUOTA_EXCEEDED_ERR on DOMException constructor object 
+PASS Constant QUOTA_EXCEEDED_ERR on DOMException prototype object 
+PASS Constant TIMEOUT_ERR on DOMException constructor object 
+PASS Constant TIMEOUT_ERR on DOMException prototype object 
+PASS Constant INVALID_NODE_TYPE_ERR on DOMException constructor object 
+PASS Constant INVALID_NODE_TYPE_ERR on DOMException prototype object 
+PASS Constant DATA_CLONE_ERR on DOMException constructor object 
+PASS Constant DATA_CLONE_ERR on DOMException prototype object 
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html b/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html
new file mode 100644 (file)
index 0000000..450b4b3
--- /dev/null
@@ -0,0 +1,59 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>DOMException constants</title>
+<link rel=help href="https://heycam.github.io/webidl/#es-DOMException-constructor-object">
+<link rel=help href="https://heycam.github.io/webidl/#es-DOMException-prototype-object">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+test(function() {
+  // https://www.w3.org/Bugs/Public/show_bug.cgi?id=27732
+  var constants = [
+    "INDEX_SIZE_ERR",
+    "DOMSTRING_SIZE_ERR",
+    "HIERARCHY_REQUEST_ERR",
+    "WRONG_DOCUMENT_ERR",
+    "INVALID_CHARACTER_ERR",
+    "NO_DATA_ALLOWED_ERR",
+    "NO_MODIFICATION_ALLOWED_ERR",
+    "NOT_FOUND_ERR",
+    "NOT_SUPPORTED_ERR",
+    "INUSE_ATTRIBUTE_ERR",
+    "INVALID_STATE_ERR",
+    "SYNTAX_ERR",
+    "INVALID_MODIFICATION_ERR",
+    "NAMESPACE_ERR",
+    "INVALID_ACCESS_ERR",
+    "VALIDATION_ERR",
+    "TYPE_MISMATCH_ERR",
+    "SECURITY_ERR",
+    "NETWORK_ERR",
+    "ABORT_ERR",
+    "URL_MISMATCH_ERR",
+    "QUOTA_EXCEEDED_ERR",
+    "TIMEOUT_ERR",
+    "INVALID_NODE_TYPE_ERR",
+    "DATA_CLONE_ERR"
+  ]
+  var objects = [
+    [DOMException, "DOMException constructor object"],
+    [DOMException.prototype, "DOMException prototype object"]
+  ]
+  constants.forEach(function(name, i) {
+    objects.forEach(function(o) {
+      var object = o[0], description = o[1];
+      test(function() {
+        assert_equals(object[name], i + 1, name)
+        assert_own_property(object, name)
+        var pd = Object.getOwnPropertyDescriptor(object, name)
+        assert_false("get" in pd, "property has getter")
+        assert_false("set" in pd, "property has setter")
+        assert_false(pd.writable, "not writable")
+        assert_true(pd.enumerable, "enumerable")
+        assert_false(pd.configurable, "not configurable")
+      }, "Constant " + name + " on " + description)
+    })
+  })
+})
+</script>
diff --git a/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-expected.txt
new file mode 100644 (file)
index 0000000..10e433b
--- /dev/null
@@ -0,0 +1,35 @@
+
+PASS new DOMException() 
+FAIL new DOMException(): own-ness assert_false: The name property should be inherited expected false got true
+PASS new DOMException(null) 
+PASS new DOMException(undefined) 
+FAIL new DOMException(undefined): own-ness assert_false: The name property should be inherited expected false got true
+PASS new DOMException("foo") 
+FAIL new DOMException("foo"): own-ness assert_false: The name property should be inherited expected false got true
+PASS new DOMException("bar", undefined) 
+PASS new DOMException("bar", "NotSupportedError") 
+PASS new DOMException("bar", "NotSupportedError"): own-ness 
+PASS new DOMException("bar", "foo") 
+PASS new DOMexception("msg", "IndexSizeError") 
+PASS new DOMexception("msg", "HierarchyRequestError") 
+PASS new DOMexception("msg", "WrongDocumentError") 
+PASS new DOMexception("msg", "InvalidCharacterError") 
+PASS new DOMexception("msg", "NoModificationAllowedError") 
+PASS new DOMexception("msg", "NotFoundError") 
+PASS new DOMexception("msg", "NotSupportedError") 
+PASS new DOMexception("msg", "InUseAttributeError") 
+PASS new DOMexception("msg", "InvalidStateError") 
+PASS new DOMexception("msg", "SyntaxError") 
+PASS new DOMexception("msg", "InvalidModificationError") 
+PASS new DOMexception("msg", "NamespaceError") 
+PASS new DOMexception("msg", "InvalidAccessError") 
+PASS new DOMexception("msg", "SecurityError") 
+PASS new DOMexception("msg", "NetworkError") 
+PASS new DOMexception("msg", "AbortError") 
+PASS new DOMexception("msg", "URLMismatchError") 
+PASS new DOMexception("msg", "QuotaExceededError") 
+PASS new DOMexception("msg", "TimeoutError") 
+PASS new DOMexception("msg", "InvalidNodeTypeError") 
+PASS new DOMexception("msg", "DataCloneError") 
+PASS new DOMException("bar", "UnknownError") 
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html b/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html
new file mode 100644 (file)
index 0000000..0e5ffea
--- /dev/null
@@ -0,0 +1,139 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>DOMException constructor</title>
+<link rel=help href="https://heycam.github.io/webidl/#es-DOMException-constructor-object">
+<link rel=help href="https://people.mozilla.org/~jorendorff/es6-draft.html#sec-error.prototype.message">
+<link rel=help href="https://people.mozilla.org/~jorendorff/es6-draft.html#sec-error.prototype.name">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+test(function() {
+  var ex = new DOMException();
+  assert_equals(ex.name, "Error",
+                "Not passing a name should end up with 'Error' as the name");
+  assert_equals(ex.message, "",
+                "Not passing a message should end up with empty string as the message");
+}, 'new DOMException()');
+
+test(function() {
+  var ex = new DOMException();
+  assert_false(ex.hasOwnProperty("name"),
+               "The name property should be inherited");
+  assert_false(ex.hasOwnProperty("message"),
+               "The message property should be inherited");
+}, 'new DOMException(): own-ness');
+
+test(function() {
+  var ex = new DOMException(null);
+  assert_equals(ex.name, "Error",
+                "Not passing a name should end up with 'Error' as the name");
+  assert_equals(ex.message, "null",
+                "Passing null as message should end up with stringified 'null' as the message");
+}, 'new DOMException(null)');
+
+test(function() {
+  var ex = new DOMException(undefined);
+  assert_equals(ex.name, "Error",
+                "Not passing a name should end up with 'Error' as the name");
+  assert_equals(ex.message, "",
+                "Not passing a message should end up with empty string as the message");
+}, 'new DOMException(undefined)');
+
+test(function() {
+  var ex = new DOMException(undefined);
+  assert_false(ex.hasOwnProperty("name"),
+               "The name property should be inherited");
+  assert_false(ex.hasOwnProperty("message"),
+               "The message property should be inherited");
+}, 'new DOMException(undefined): own-ness');
+
+test(function() {
+  var ex = new DOMException("foo");
+  assert_equals(ex.name, "Error",
+                "Not passing a name should still end up with 'Error' as the name");
+  assert_equals(ex.message, "foo", "Should be using passed-in message");
+}, 'new DOMException("foo")');
+
+test(function() {
+  var ex = new DOMException("foo");
+  assert_false(ex.hasOwnProperty("name"),
+               "The name property should be inherited");
+  assert_true(ex.hasOwnProperty("message"),
+              "The message property should be own");
+}, 'new DOMException("foo"): own-ness');
+
+test(function() {
+  var ex = new DOMException("bar", undefined);
+  assert_equals(ex.name, "Error",
+                "Passing undefined for name should end up with 'Error' as the name");
+  assert_equals(ex.message, "bar", "Should still be using passed-in message");
+}, 'new DOMException("bar", undefined)');
+
+test(function() {
+  var ex = new DOMException("bar", "NotSupportedError");
+  assert_equals(ex.name, "NotSupportedError", "Should be using the passed-in name");
+  assert_equals(ex.message, "bar", "Should still be using passed-in message");
+  assert_equals(ex.code, DOMException.NOT_SUPPORTED_ERR,
+                "Should have the right exception code");
+}, 'new DOMException("bar", "NotSupportedError")');
+
+test(function() {
+  var ex = new DOMException("bar", "NotSupportedError");
+  assert_true(ex.hasOwnProperty("name"),
+              "The name property should be own");
+  assert_true(ex.hasOwnProperty("message"),
+              "The message property should be own");
+}, 'new DOMException("bar", "NotSupportedError"): own-ness');
+
+test(function() {
+  var ex = new DOMException("bar", "foo");
+  assert_equals(ex.name, "foo", "Should be using the passed-in name");
+  assert_equals(ex.message, "bar", "Should still be using passed-in message");
+  assert_equals(ex.code, 0,
+                "Should have 0 for code for a name not in the exception names table");
+}, 'new DOMException("bar", "foo")');
+
+[
+  {name: "IndexSizeError", code: 1},
+  {name: "HierarchyRequestError", code: 3},
+  {name: "WrongDocumentError", code: 4},
+  {name: "InvalidCharacterError", code: 5},
+  {name: "NoModificationAllowedError", code: 7},
+  {name: "NotFoundError", code: 8},
+  {name: "NotSupportedError", code: 9},
+  {name: "InUseAttributeError", code: 10},
+  {name: "InvalidStateError", code: 11},
+  {name: "SyntaxError", code: 12},
+  {name: "InvalidModificationError", code: 13},
+  {name: "NamespaceError", code: 14},
+  {name: "InvalidAccessError", code: 15},
+  {name: "SecurityError", code: 18},
+  {name: "NetworkError", code: 19},
+  {name: "AbortError", code: 20},
+  {name: "URLMismatchError", code: 21},
+  {name: "QuotaExceededError", code: 22},
+  {name: "TimeoutError", code: 23},
+  {name: "InvalidNodeTypeError", code: 24},
+  {name: "DataCloneError", code: 25}
+].forEach(function(test_case) {
+  test(function() {
+    var ex = new DOMException("msg", test_case.name);
+    assert_equals(ex.name, test_case.name,
+                  "Should be using the passed-in name");
+    assert_equals(ex.message, "msg",
+                  "Should be using the passed-in message");
+    assert_equals(ex.code, test_case.code,
+                  "Should have matching legacy code from error names table");
+  },'new DOMexception("msg", "' + test_case.name + '")');
+});
+
+test(function() {
+  var ex = new DOMException("bar", "UnknownError");
+  assert_equals(ex.name, "UnknownError", "Should be using the passed-in name");
+  assert_equals(ex.message, "bar", "Should still be using passed-in message");
+  assert_equals(ex.code, 0,
+                "Should have 0 for code for a name in the exception names table with no legacy code");
+}, 'new DOMException("bar", "UnknownError")');
+
+</script>
diff --git a/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object-expected.txt
new file mode 100644 (file)
index 0000000..8ae1617
--- /dev/null
@@ -0,0 +1,10 @@
+
+FAIL existence and properties of DOMException assert_equals: prototype of self's property "DOMException" is not Error expected function "function Error() {
+    [native code]
+}" but got function "function () {
+    [native code]
+}"
+PASS existence and properties of DOMException.prototype 
+PASS existence of name and code properties on DOMException.prototype 
+PASS existence and properties of exception interface prototype object's "constructor" property 
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html b/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html
new file mode 100644 (file)
index 0000000..ddb40f4
--- /dev/null
@@ -0,0 +1,11 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>DOMException constructor and prototype object</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src=constructor-object.js></script>
+<div id="log"></div>
+<script>
+setup({ explicit_done: true })
+run_test()
+</script>
diff --git a/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.js b/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.js
new file mode 100644 (file)
index 0000000..e539d85
--- /dev/null
@@ -0,0 +1,111 @@
+function run_test() {
+    test(function() {
+        // "There MUST exist a property on the ECMAScript global object whose
+        // name is “DOMException” and value is an object called the
+        // DOMException constructor object, which provides access to legacy
+        // DOMException code constants. The property has the attributes
+        // { [[Writable]]: true, [[Enumerable]]: false,
+        // [[Configurable]]: true }."
+        assert_own_property(self, "DOMException",
+                            "self does not have own property \"DOMException\"");
+        var desc = Object.getOwnPropertyDescriptor(self, "DOMException");
+        assert_false("get" in desc, "self's property \"DOMException\" has getter");
+        assert_false("set" in desc, "self's property \"DOMException\" has setter");
+        assert_true(desc.writable, "self's property \"DOMException\" is not writable");
+        assert_false(desc.enumerable, "self's property \"DOMException\" is enumerable");
+        assert_true(desc.configurable, "self's property \"DOMException\" is not configurable");
+
+        // "The DOMException constructor object MUST be a function object but
+        // with a [[Prototype]] value of %Error% ([ECMA-262], section 6.1.7.4)."
+        assert_equals(Object.getPrototypeOf(self.DOMException), Error,
+                      "prototype of self's property \"DOMException\" is not Error");
+
+        // "Its [[Get]] internal property is set as described in ECMA-262
+        // section 9.1.8."
+        // Not much to test for this.
+        // "Its [[Construct]] internal property is set as described in ECMA-262
+        // section 19.2.2.3."
+        // "Its @@hasInstance property is set as described in ECMA-262 section
+        // 19.2.3.8, unless otherwise specified."
+
+        // String() returns something implementation-dependent, because it
+        // calls Function#toString.
+        assert_class_string(self.DOMException, "Function",
+                            "class string of DOMException");
+
+        // "For every legacy code listed in the error names table, there MUST
+        // be a property on the DOMException constructor object whose name and
+        // value are as indicated in the table. The property has attributes
+        // { [[Writable]]: false, [[Enumerable]]: true,
+        // [[Configurable]]: false }."
+        // See DOMException-constants.html.
+    }, "existence and properties of DOMException");
+
+    test(function() {
+        assert_own_property(self, "DOMException",
+                            "self does not have own property \"DOMException\"");
+
+        // "The DOMException constructor object MUST also have a property named
+        // “prototype” with attributes { [[Writable]]: false,
+        // [[Enumerable]]: false, [[Configurable]]: false } whose value is an
+        // object called the DOMException prototype object. This object also
+        // provides access to the legacy code values."
+        assert_own_property(self.DOMException, "prototype",
+                            'exception "DOMException" does not have own property "prototype"');
+        var desc = Object.getOwnPropertyDescriptor(self.DOMException, "prototype");
+        assert_false("get" in desc, "DOMException.prototype has getter");
+        assert_false("set" in desc, "DOMException.prototype has setter");
+        assert_false(desc.writable, "DOMException.prototype is writable");
+        assert_false(desc.enumerable, "DOMException.prototype is enumerable");
+        assert_false(desc.configurable, "DOMException.prototype is configurable");
+
+        // "The DOMException prototype object MUST have an internal
+        // [[Prototype]] property whose value is %ErrorPrototype% ([ECMA-262],
+        // section 6.1.7.4)."
+        assert_own_property(self, "Error",
+                            'should inherit from Error, but self has no such property');
+        assert_own_property(self.Error, "prototype",
+                            'should inherit from Error, but that object has no "prototype" property');
+        assert_equals(Object.getPrototypeOf(self.DOMException.prototype),
+                      self.Error.prototype,
+                      'prototype of DOMException.prototype is not Error.prototype');
+
+        // "The class string of the DOMException prototype object is
+        // “DOMExceptionPrototype”."
+        assert_class_string(self.DOMException.prototype, "DOMExceptionPrototype",
+                            "class string of DOMException.prototype");
+    }, "existence and properties of DOMException.prototype");
+
+    test(function() {
+        assert_false(self.DOMException.prototype.hasOwnProperty("name"),
+                     "DOMException.prototype should not have an own \"name\" " +
+                     "property.");
+        assert_false(self.DOMException.prototype.hasOwnProperty("code"),
+                     "DOMException.prototype should not have an own \"name\" " +
+                     "property.");
+    }, "existence of name and code properties on DOMException.prototype");
+
+    test(function() {
+        assert_own_property(self, "DOMException",
+                            "self does not have own property \"DOMException\"");
+        assert_own_property(self.DOMException, "prototype",
+                            'interface "DOMException" does not have own property "prototype"');
+
+        // "There MUST be a property named “constructor” on the DOMException
+        // prototype object with attributes { [[Writable]]: true,
+        // [[Enumerable]]: false, [[Configurable]]: true } and whose value is
+        // the DOMException constructor object."
+        assert_own_property(self.DOMException.prototype, "constructor",
+                            "DOMException" + '.prototype does not have own property "constructor"');
+        var desc = Object.getOwnPropertyDescriptor(self.DOMException.prototype, "constructor");
+        assert_false("get" in desc, "DOMException.prototype.constructor has getter");
+        assert_false("set" in desc, "DOMException.prototype.constructor has setter");
+        assert_true(desc.writable, "DOMException.prototype.constructor is not writable");
+        assert_false(desc.enumerable, "DOMException.prototype.constructor is enumerable");
+        assert_true(desc.configurable, "DOMException.prototype.constructor in not configurable");
+        assert_equals(self.DOMException.prototype.constructor, self.DOMException,
+                      "DOMException.prototype.constructor is not the same object as DOMException");
+    }, "existence and properties of exception interface prototype object's \"constructor\" property");
+
+    done();
+}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js b/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js
new file mode 100644 (file)
index 0000000..7514924
--- /dev/null
@@ -0,0 +1,3 @@
+importScripts("/resources/testharness.js")
+importScripts("constructor-object.js")
+run_test();
diff --git a/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/exceptions-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/exceptions-expected.txt
new file mode 100644 (file)
index 0000000..c51b798
--- /dev/null
@@ -0,0 +1,20 @@
+
+PASS Object.getPrototypeOf(exception) === DOMException.prototype 
+PASS exception.hasOwnProperty("name") 
+PASS exception.name === "HierarchyRequestError" 
+FAIL Object.getOwnPropertyDescriptor(exception, "name") assert_true: must be writable expected true got undefined
+FAIL Object.getOwnPropertyDescriptor(exception, "message") assert_true: must be writable expected true got undefined
+PASS typeof exception.message === "string" 
+PASS Object.prototype.toString.call(exception) === "[object DOMException]" 
+PASS exception.code === DOMException.HIERARCHY_REQUEST_ERR 
+FAIL Object.getOwnPropertyDescriptor(exception, "code") assert_true: must be writable expected true got undefined
+PASS In iframe: Object.getPrototypeOf(exception) === DOMException.prototype 
+PASS In iframe: exception.hasOwnProperty("name") 
+PASS In iframe: exception.name === "HierarchyRequestError" 
+FAIL In iframe: Object.getOwnPropertyDescriptor(exception, "name") assert_true: must be writable expected true got undefined
+FAIL In iframe: Object.getOwnPropertyDescriptor(exception, "message") assert_true: must be writable expected true got undefined
+PASS In iframe: typeof exception.message === "string" 
+PASS In iframe: Object.prototype.toString.call(exception) === "[object DOMException]" 
+PASS In iframe: exception.code === DOMException.HIERARCHY_REQUEST_ERR 
+FAIL In iframe: Object.getOwnPropertyDescriptor(exception, "code") assert_true: must be writable expected true got undefined
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/exceptions.html b/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/exceptions.html
new file mode 100644 (file)
index 0000000..bc1d7fe
--- /dev/null
@@ -0,0 +1,136 @@
+<!doctype html>
+<title>DOMException-throwing tests</title>
+<link rel=author title="Aryeh Gregor" href=ayg@aryeh.name>
+<div id=log></div>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+/**
+ * This file just picks one case where browsers are supposed to throw an
+ * exception, and tests the heck out of whether it meets the spec.  In the
+ * future, all these checks should be in assert_throws(), but we don't want
+ * every browser failing every assert_throws() check until they fix every
+ * single bug in their exception-throwing.
+ *
+ * We don't go out of our way to test everything that's already tested by
+ * interfaces.html, like whether all constants are present on the object, but
+ * some things are duplicated.
+ */
+setup({explicit_done: true});
+
+function testException(exception, global, desc) {
+  // https://heycam.github.io/webidl/#es-exception-objects
+  // (as of 2015-01-03): "The value of the internal [[Prototype]] property of a
+  // DOMException object MUST be the DOMException prototype object from the
+  // global environment the exception object is associated with."
+  test(function() {
+    assert_equals(global.Object.getPrototypeOf(exception),
+                  global.DOMException.prototype);
+  }, desc + "Object.getPrototypeOf(exception) === DOMException.prototype");
+
+
+  // https://heycam.github.io/webidl/#es-creating-throwing-exceptions
+  // (as of 2015-01-03): "Call the [[DefineOwnProperty]] internal method of /O/
+  // passing “name”, Property Descriptor { [[Value]]: /N/, [[Writable]]: true,
+  // [[Enumerable]]: true, [[Configurable]]: true }, and false as arguments."
+  test(function() {
+    assert_true(exception.hasOwnProperty("name"));
+  }, desc + "exception.hasOwnProperty(\"name\")");
+
+  test(function() {
+    assert_equals(exception.name, "HierarchyRequestError");
+  }, desc + "exception.name === \"HierarchyRequestError\"");
+
+  test(function() {
+    var desc = global.Object.getOwnPropertyDescriptor(exception, "name");
+    assert_true(desc.writable, "must be writable");
+    assert_true(desc.enumerable, "must be enumerable");
+    assert_true(desc.configurable, "must be configurable");
+  }, desc + "Object.getOwnPropertyDescriptor(exception, \"name\")");
+
+
+  // https://heycam.github.io/webidl/#es-creating-throwing-exceptions
+  // (as of 2015-01-03): "If the optional user agent-defined message /M/ was
+  // specified, then this list has a single element whose value is the result
+  // of converting /M/ to a String value. Otherwise, the list is empty."
+  //
+  // https://heycam.github.io/webidl/#es-DOMException-constructor-object
+  // (as of 2015-01-03): "Call the [[DefineOwnProperty]] internal method of /O/
+  // passing “message”, Property Descriptor { [[Value]]: /S/,
+  // [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }, and
+  // false as arguments."
+  test(function() {
+    if (exception.hasOwnProperty("message")) {
+      var desc = global.Object.getOwnPropertyDescriptor(exception, "message");
+      assert_true(desc.writable, "must be writable");
+      assert_false(desc.enumerable, "must not be enumerable");
+      assert_true(desc.configurable, "must be configurable");
+    }
+  }, desc + "Object.getOwnPropertyDescriptor(exception, \"message\")");
+
+  test(function() {
+    if (exception.hasOwnProperty("message")) {
+      // Can't test anything more specific, since it's implementation-defined :(
+      assert_equals(typeof exception.message, "string");
+    } else {
+      // Error.prototype.message
+      assert_equals(exception.message, "");
+    }
+  }, desc + "typeof exception.message === \"string\"");
+
+
+  // https://heycam.github.io/webidl/#es-exception-objects
+  // (as of 2015-01-03): "The class string of a DOMException object MUST be
+  // “DOMException”."
+  test(function() {
+    assert_equals(global.Object.prototype.toString.call(exception),
+                  "[object DOMException]");
+  }, desc + "Object.prototype.toString.call(exception) === \"[object DOMException]\"");
+
+
+  // https://heycam.github.io/webidl/#es-creating-throwing-exceptions
+  // (as of 2015-01-03): "Call the [[DefineOwnProperty]] internal method of /O/
+  // passing “code”, Property Descriptor { [[Value]]: /code/,
+  // [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }, and
+  // false as arguments."
+  test(function() {
+    assert_equals(exception.code, global.DOMException.HIERARCHY_REQUEST_ERR);
+  }, desc + "exception.code === DOMException.HIERARCHY_REQUEST_ERR");
+
+  test(function() {
+    var desc = global.Object.getOwnPropertyDescriptor(exception, "name");
+    assert_true(desc.writable, "must be writable");
+    assert_true(desc.enumerable, "must be enumerable");
+    assert_true(desc.configurable, "must be configurable");
+  }, desc + "Object.getOwnPropertyDescriptor(exception, \"code\")");
+}
+
+
+// Test in current window
+var exception = null;
+try {
+  // This should throw a HierarchyRequestError in every browser since the
+  // Stone Age, so we're really only testing exception-throwing details.
+  document.documentElement.appendChild(document);
+} catch(e) {
+  exception = e;
+}
+testException(exception, window, "");
+
+// Test in iframe
+var iframe = document.createElement("iframe");
+iframe.src = "about:blank";
+iframe.onload = function() {
+  var exception = null;
+  try {
+    iframe.contentDocument.documentElement.appendChild(iframe.contentDocument);
+  } catch(e) {
+    exception = e;
+  }
+  testException(exception, iframe.contentWindow, "In iframe: ");
+
+  document.body.removeChild(iframe);
+  done();
+};
+document.body.appendChild(iframe);
+</script>
diff --git a/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/has-instance-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/has-instance-expected.txt
new file mode 100644 (file)
index 0000000..04cb8e0
--- /dev/null
@@ -0,0 +1,3 @@
+
+PASS Manually-constructed prototype chains are correctly handled by instanceof 
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/has-instance.html b/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/has-instance.html
new file mode 100644 (file)
index 0000000..986d27c
--- /dev/null
@@ -0,0 +1,13 @@
+<!doctype html>
+<meta charset="utf-8">
+<title></title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+test(function() {
+  var obj = Object.create(Element.prototype);
+  assert_true(obj instanceof Element);
+  assert_true(obj instanceof Node);
+  assert_false(obj instanceof Attr);
+}, "Manually-constructed prototype chains are correctly handled by instanceof");
+</script>
diff --git a/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/interface-object-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/interface-object-expected.txt
new file mode 100644 (file)
index 0000000..661bad7
--- /dev/null
@@ -0,0 +1,6 @@
+
+PASS An interface object deleted after it has been accessed is undefined 
+PASS An interface object deleted before it has been defined is undefined 
+PASS Interface objects deleted multiple times stay deleted 
+PASS Fancy property names don't break the resolve hook on Window 
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/interface-object.html b/LayoutTests/imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/interface-object.html
new file mode 100644 (file)
index 0000000..132c61d
--- /dev/null
@@ -0,0 +1,28 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Interface objects</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+test(function () {
+    assert_equals(typeof window.Blob, "function")
+    delete window.Blob;
+    assert_equals(window.Blob, undefined);
+}, "An interface object deleted after it has been accessed is undefined");
+
+test(function () {
+    delete window.File;
+    assert_equals(window.File, undefined);
+}, "An interface object deleted before it has been defined is undefined");
+
+test(function () {
+    delete window.ImageData;
+    assert_equals(Object.getOwnPropertyDescriptor(window, "ImageData"), undefined);
+    delete window.ImageData;
+    assert_equals(Object.getOwnPropertyDescriptor(window, "ImageData"), undefined);
+}, "Interface objects deleted multiple times stay deleted");
+
+test(function () {
+    assert_equals(window["abc\udc88"], undefined);
+}, "Fancy property names don't break the resolve hook on Window");
+</script>
index f82424a..cf2470c 100644 (file)
@@ -1,5 +1,31 @@
 2016-08-05  Chris Dumez  <cdumez@apple.com>
 
+        DOMException should be constructible
+        https://bugs.webkit.org/show_bug.cgi?id=160626
+
+        Reviewed by Darin Adler.
+
+        DOMException should be constructible:
+        - http://heycam.github.io/webidl/#dfn-DOMException
+        - http://heycam.github.io/webidl/#es-DOMException-constructor-object
+
+        DOMException already has a constructor in Firefox and Chrome so this
+        aligns our behavior with other browsers.
+
+        Test: imported/w3c/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html
+
+        * dom/DOMCoreException.cpp:
+        (WebCore::errorCodeFromName):
+        (WebCore::DOMCoreException::create):
+        (WebCore::DOMCoreException::DOMCoreException):
+        * dom/DOMCoreException.h:
+        * dom/DOMCoreException.idl:
+        * dom/ExceptionBase.cpp:
+        (WebCore::ExceptionBase::ExceptionBase):
+        * dom/ExceptionBase.h:
+
+2016-08-05  Chris Dumez  <cdumez@apple.com>
+
         Align Range.insertNode() input validation with the specification
         https://bugs.webkit.org/show_bug.cgi?id=160624
 
index 58c97f2..efc4cba 100644 (file)
 
 namespace WebCore {
 
+// http://heycam.github.io/webidl/#idl-DOMException-error-names
 static const struct CoreException {
     const char* const name;
     const char* const description;
+    ExceptionCode code;
 } coreExceptions[] = {
-    { "IndexSizeError", "The index is not in the allowed range." },
-    { 0, 0 }, // DOMStringSizeError
-    { "HierarchyRequestError", "The operation would yield an incorrect node tree." },
-    { "WrongDocumentError", "The object is in the wrong document." },
-    { "InvalidCharacterError", "The string contains invalid characters." },
-    { 0, 0 }, // NoDataAllowedError
-    { "NoModificationAllowedError", "The object can not be modified." },
-    { "NotFoundError", "The object can not be found here." },
-    { "NotSupportedError", "The operation is not supported." },
-    { "InUseAttributeError", "The attribute is in use." },
-    { "InvalidStateError", "The object is in an invalid state." },
-    { "SyntaxError", "The string did not match the expected pattern." },
-    { "InvalidModificationError", " The object can not be modified in this way." },
-    { "NamespaceError", "The operation is not allowed by Namespaces in XML." },
-    { "InvalidAccessError", "The object does not support the operation or argument." },
-    { 0, 0 }, // ValidationError
-    { "TypeMismatchError", "The type of an object was incompatible with the expected type of the parameter associated to the object." },
-    { "SecurityError", "The operation is insecure." },
-    { "NetworkError", " A network error occurred." },
-    { "AbortError", "The operation was aborted." },
-    { "URLMismatchError", "The given URL does not match another URL." },
-    { "QuotaExceededError", "The quota has been exceeded." },
-    { "TimeoutError", "The operation timed out." },
-    { "InvalidNodeTypeError", "The supplied node is incorrect or has an incorrect ancestor for this operation." },
-    { "DataCloneError", "The object can not be cloned." },
-    { "EncodingError", "The encoding operation (either encoded or decoding) failed." },
-    { "NotReadableError", "The I/O read operation failed." },
-    { "UnknownError", "The operation failed for an unknown transient reason (e.g. out of memory)." },
-    { "ConstraintError", "A mutation operation in a transaction failed because a constraint was not satisfied." },
-    { "DataError", "Provided data is inadequate." },
-    { "TransactionInactiveError", "A request was placed against a transaction which is currently not active, or which is finished." },
-    { "ReadOnlyError", "The mutating operation was attempted in a \"readonly\" transaction." },
-    { "VersionError", "An attempt was made to open a database using a lower version than the existing version." },
-    { "OperationError", "The operation failed for an operation-specific reason." },
-    { "NotAllowedError", "The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission." }
+    { "IndexSizeError", "The index is not in the allowed range.", 1 },
+    { nullptr, nullptr, 0 }, // DOMStringSizeError
+    { "HierarchyRequestError", "The operation would yield an incorrect node tree.", 3 },
+    { "WrongDocumentError", "The object is in the wrong document.", 4 },
+    { "InvalidCharacterError", "The string contains invalid characters.", 5 },
+    { nullptr, nullptr, 0 }, // NoDataAllowedError
+    { "NoModificationAllowedError", "The object can not be modified.", 7 },
+    { "NotFoundError", "The object can not be found here.", 8 },
+    { "NotSupportedError", "The operation is not supported.", 9 },
+    { "InUseAttributeError", "The attribute is in use.", 10 },
+    { "InvalidStateError", "The object is in an invalid state.", 11 },
+    { "SyntaxError", "The string did not match the expected pattern.", 12 },
+    { "InvalidModificationError", " The object can not be modified in this way.", 13 },
+    { "NamespaceError", "The operation is not allowed by Namespaces in XML.", 14 },
+    { "InvalidAccessError", "The object does not support the operation or argument.", 15 },
+    { nullptr, nullptr, 0 }, // ValidationError
+    { "TypeMismatchError", "The type of an object was incompatible with the expected type of the parameter associated to the object.", 17 },
+    { "SecurityError", "The operation is insecure.", 18 },
+    { "NetworkError", " A network error occurred.", 19 },
+    { "AbortError", "The operation was aborted.", 20 },
+    { "URLMismatchError", "The given URL does not match another URL.", 21 },
+    { "QuotaExceededError", "The quota has been exceeded.", 22 },
+    { "TimeoutError", "The operation timed out.", 23 },
+    { "InvalidNodeTypeError", "The supplied node is incorrect or has an incorrect ancestor for this operation.", 24 },
+    { "DataCloneError", "The object can not be cloned.", 25 },
+    { "EncodingError", "The encoding operation (either encoded or decoding) failed.", 0 },
+    { "NotReadableError", "The I/O read operation failed.", 0 },
+    { "UnknownError", "The operation failed for an unknown transient reason (e.g. out of memory).", 0 },
+    { "ConstraintError", "A mutation operation in a transaction failed because a constraint was not satisfied.", 0 },
+    { "DataError", "Provided data is inadequate.", 0 },
+    { "TransactionInactiveError", "A request was placed against a transaction which is currently not active, or which is finished.", 0 },
+    { "ReadOnlyError", "The mutating operation was attempted in a \"readonly\" transaction.", 0 },
+    { "VersionError", "An attempt was made to open a database using a lower version than the existing version.", 0 },
+    { "OperationError", "The operation failed for an operation-specific reason.", 0 },
+    { "NotAllowedError", "The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.", 0 }
 };
 
+static ExceptionCode errorCodeFromName(const String& name)
+{
+    for (auto& entry : coreExceptions) {
+        if (entry.name == name)
+            return entry.code;
+    }
+    return 0;
+}
+
+Ref<DOMCoreException> DOMCoreException::create(const String& message, const String& name)
+{
+    return adoptRef(*new DOMCoreException(errorCodeFromName(name), message, name));
+}
+
+DOMCoreException::DOMCoreException(ExceptionCode ec, const String& message, const String& name)
+    : ExceptionBase(ec, name, message, ASCIILiteral("DOM"))
+{
+}
+
 bool DOMCoreException::initializeDescription(ExceptionCode ec, ExceptionCodeDescription* description)
 {
     description->typeName = "DOM";
index 3429f3e..4508455 100644 (file)
@@ -39,10 +39,12 @@ public:
     {
         return adoptRef(*new DOMCoreException(description));
     }
+    static Ref<DOMCoreException> create(const String& message, const String& name);
 
     static bool initializeDescription(ExceptionCode, ExceptionCodeDescription*);
 
 protected:
+    DOMCoreException(ExceptionCode, const String& message, const String& name);
     explicit DOMCoreException(const ExceptionCodeDescription& description)
         : ExceptionBase(description)
     {
index 482de3b..5fa04b1 100644 (file)
@@ -27,6 +27,7 @@
  */
 
 [
+    Constructor(optional DOMString message = "", optional DOMString name = "Error"),
     DoNotCheckConstants,
     Exposed=(Window,Worker),
     InterfaceName=DOMException,
index 23ebca6..b6a44d0 100644 (file)
@@ -41,6 +41,14 @@ ExceptionBase::ExceptionBase(const ExceptionCodeDescription& description)
 {
 }
 
+ExceptionBase::ExceptionBase(unsigned short code, const String& name, const String& message, const String& typeName)
+    : m_code(code)
+    , m_name(name)
+    , m_message(message)
+    , m_typeName(typeName)
+{
+}
+
 String ExceptionBase::toString() const
 {
     if (!m_toString.isEmpty())
index afdc937..3cf3c74 100644 (file)
@@ -47,6 +47,7 @@ public:
 
 protected:
     explicit ExceptionBase(const ExceptionCodeDescription&);
+    ExceptionBase(unsigned short code, const String& name, const String& message, const String& typeName);
 
 private:
     unsigned short m_code;