From 96372097657685b5655bba95ce5a329364a9301b Mon Sep 17 00:00:00 2001 From: Yacine Hmito Date: Sat, 9 Jan 2021 07:27:46 +0100 Subject: [PATCH] fix(web): implement DOMException#code (#9015) Co-authored-by: Luca Casonato --- cli/tests/unit/dom_exception_test.ts | 9 +++++ cli/tests/wpt.jsonc | 9 +---- op_crates/web/00_dom_exception.js | 55 +++++++++++++++++++++++----- 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 a93cbfebe5..4c9e96de6e 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 3099d3b48e..d43aa9ce6a 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 6d72779b0b..5fb1304524 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 code() { + return this.#code; + } } - get name() { - return this.#name; - } -} + 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 491a0ee842..f6c2e240f0 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 {