diff options
-rw-r--r-- | cli/tests/unit/dom_exception_test.ts | 9 | ||||
-rw-r--r-- | cli/tests/wpt.jsonc | 9 | ||||
-rw-r--r-- | op_crates/web/00_dom_exception.js | 55 | ||||
-rw-r--r-- | op_crates/web/lib.deno_web.d.ts | 1 |
4 files changed, 56 insertions, 18 deletions
diff --git a/cli/tests/unit/dom_exception_test.ts b/cli/tests/unit/dom_exception_test.ts index a93cbfebe..4c9e96de6 100644 --- a/cli/tests/unit/dom_exception_test.ts +++ b/cli/tests/unit/dom_exception_test.ts @@ -6,4 +6,13 @@ unitTest(function testDomError() { assert(de); assertEquals(de.message, "foo"); assertEquals(de.name, "bar"); + assertEquals(de.code, 0); +}); + +unitTest(function testKnownDomException() { + const de = new DOMException("foo", "SyntaxError"); + assert(de); + assertEquals(de.message, "foo"); + assertEquals(de.name, "SyntaxError"); + assertEquals(de.code, 12); }); diff --git a/cli/tests/wpt.jsonc b/cli/tests/wpt.jsonc index 3099d3b48..d43aa9ce6 100644 --- a/cli/tests/wpt.jsonc +++ b/cli/tests/wpt.jsonc @@ -170,14 +170,7 @@ ] }, "measure-l3", - { - "name": "structured-serialize-detail", - "expectFail": [ - // TODO(lucacasonato): re-enable when we use real structured clone. - "Mark: Throw an exception when the detail property cannot be structured-serialized.", - "Measure: Throw an exception when the detail property cannot be structured-serialized." - ] - }, + "structured-serialize-detail", "user_timing_exists" ] } diff --git a/op_crates/web/00_dom_exception.js b/op_crates/web/00_dom_exception.js index 6d72779b0..5fb130452 100644 --- a/op_crates/web/00_dom_exception.js +++ b/op_crates/web/00_dom_exception.js @@ -1,15 +1,50 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -// eslint-disable-next-line @typescript-eslint/no-unused-vars -class DOMException extends Error { - #name = ""; +((window) => { + const nameToCodeMapping = Object.create( + null, + { + IndexSizeError: { value: 1 }, + HierarchyRequestError: { value: 3 }, + WrongDocumentError: { value: 4 }, + InvalidCharacterError: { value: 5 }, + NoModificationAllowedError: { value: 7 }, + NotFoundError: { value: 8 }, + NotSupportedError: { value: 9 }, + InvalidStateError: { value: 11 }, + SyntaxError: { value: 12 }, + InvalidModificationError: { value: 13 }, + NamespaceError: { value: 14 }, + InvalidAccessError: { value: 15 }, + TypeMismatchError: { value: 17 }, + SecurityError: { value: 18 }, + NetworkError: { value: 19 }, + AbortError: { value: 20 }, + URLMismatchError: { value: 21 }, + QuotaExceededError: { value: 22 }, + TimeoutError: { value: 23 }, + InvalidNodeTypeError: { value: 24 }, + DataCloneError: { value: 25 }, + }, + ); + class DOMException extends Error { + #name = ""; + #code = 0; - constructor(message = "", name = "Error") { - super(message); - this.#name = name; - } + constructor(message = "", name = "Error") { + super(message); + this.#name = name; + this.#code = nameToCodeMapping[name] ?? 0; + } + + get name() { + return this.#name; + } - get name() { - return this.#name; + get code() { + return this.#code; + } } -} + + window.DOMException = DOMException; +})(this); diff --git a/op_crates/web/lib.deno_web.d.ts b/op_crates/web/lib.deno_web.d.ts index 491a0ee84..f6c2e240f 100644 --- a/op_crates/web/lib.deno_web.d.ts +++ b/op_crates/web/lib.deno_web.d.ts @@ -9,6 +9,7 @@ declare class DOMException extends Error { constructor(message?: string, name?: string); readonly name: string; readonly message: string; + readonly code: number; } interface EventInit { |