diff options
author | Luca Casonato <lucacasonato@yahoo.com> | 2021-02-13 15:58:12 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-13 15:58:12 +0100 |
commit | af460fc464562566dc1534c0f61f53c2976b9bd7 (patch) | |
tree | 74ac43e5574711f71d5ee90bbc020740e41bdf69 /op_crates/web/01_dom_exception.js | |
parent | d2d7dc8d675d70f0061bdaf99ae4a08d84156aa9 (diff) |
fix: webidl utils and align `Event` to spec (#9470)
Diffstat (limited to 'op_crates/web/01_dom_exception.js')
-rw-r--r-- | op_crates/web/01_dom_exception.js | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/op_crates/web/01_dom_exception.js b/op_crates/web/01_dom_exception.js new file mode 100644 index 000000000..14f4ca8e9 --- /dev/null +++ b/op_crates/web/01_dom_exception.js @@ -0,0 +1,147 @@ +// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. + +// @ts-check +/// <reference path="../../core/lib.deno_core.d.ts" /> +/// <reference path="../web/internal.d.ts" /> +/// <reference path="../web/lib.deno_web.d.ts" /> + +"use strict"; + +((window) => { + const webidl = window.__bootstrap.webidl; + + const { defineProperty } = Object; + // Defined in WebIDL 4.3. + // https://heycam.github.io/webidl/#idl-DOMException + const INDEX_SIZE_ERR = 1; + const DOMSTRING_SIZE_ERR = 2; + const HIERARCHY_REQUEST_ERR = 3; + const WRONG_DOCUMENT_ERR = 4; + const INVALID_CHARACTER_ERR = 5; + const NO_DATA_ALLOWED_ERR = 6; + const NO_MODIFICATION_ALLOWED_ERR = 7; + const NOT_FOUND_ERR = 8; + const NOT_SUPPORTED_ERR = 9; + const INUSE_ATTRIBUTE_ERR = 10; + const INVALID_STATE_ERR = 11; + const SYNTAX_ERR = 12; + const INVALID_MODIFICATION_ERR = 13; + const NAMESPACE_ERR = 14; + const INVALID_ACCESS_ERR = 15; + const VALIDATION_ERR = 16; + const TYPE_MISMATCH_ERR = 17; + const SECURITY_ERR = 18; + const NETWORK_ERR = 19; + const ABORT_ERR = 20; + const URL_MISMATCH_ERR = 21; + const QUOTA_EXCEEDED_ERR = 22; + const TIMEOUT_ERR = 23; + const INVALID_NODE_TYPE_ERR = 24; + const DATA_CLONE_ERR = 25; + + // Defined in WebIDL 2.8.1. + // https://heycam.github.io/webidl/#dfn-error-names-table + /** @type {Record<string, number>} */ + const nameToCodeMapping = { + IndexSizeError: INDEX_SIZE_ERR, + HierarchyRequestError: HIERARCHY_REQUEST_ERR, + WrongDocumentError: WRONG_DOCUMENT_ERR, + InvalidCharacterError: INVALID_CHARACTER_ERR, + NoModificationAllowedError: NO_MODIFICATION_ALLOWED_ERR, + NotFoundError: NOT_FOUND_ERR, + NotSupportedError: NOT_SUPPORTED_ERR, + InUseAttributeError: INUSE_ATTRIBUTE_ERR, + InvalidStateError: INVALID_STATE_ERR, + SyntaxError: SYNTAX_ERR, + InvalidModificationError: INVALID_MODIFICATION_ERR, + NamespaceError: NAMESPACE_ERR, + InvalidAccessError: INVALID_ACCESS_ERR, + TypeMismatchError: TYPE_MISMATCH_ERR, + SecurityError: SECURITY_ERR, + NetworkError: NETWORK_ERR, + AbortError: ABORT_ERR, + URLMismatchError: URL_MISMATCH_ERR, + QuotaExceededError: QUOTA_EXCEEDED_ERR, + TimeoutError: TIMEOUT_ERR, + InvalidNodeTypeError: INVALID_NODE_TYPE_ERR, + DataCloneError: DATA_CLONE_ERR, + }; + + // Defined in WebIDL 4.3. + // https://heycam.github.io/webidl/#idl-DOMException + class DOMException extends Error { + #message = ""; + #name = ""; + #code = 0; + + constructor(message = "", name = "Error") { + super(); + this.#message = webidl.converters.DOMString(message, { + prefix: "Failed to construct 'DOMException'", + context: "Argument 1", + }); + this.#name = webidl.converters.DOMString(name, { + prefix: "Failed to construct 'DOMException'", + context: "Argument 2", + }); + this.#code = nameToCodeMapping[this.#name] ?? 0; + } + + get message() { + return this.#message; + } + + get name() { + return this.#name; + } + + get code() { + return this.#code; + } + + get [Symbol.toStringTag]() { + return "DOMException"; + } + } + + defineProperty(DOMException.prototype, "message", { enumerable: true }); + defineProperty(DOMException.prototype, "name", { enumerable: true }); + defineProperty(DOMException.prototype, "code", { enumerable: true }); + + for ( + const [key, value] of Object.entries({ + 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, + }) + ) { + const desc = { value, enumerable: true }; + defineProperty(DOMException, key, desc); + defineProperty(DOMException.prototype, key, desc); + } + + window.DOMException = DOMException; + defineProperty(window, "DOMException", { enumerable: false }); +})(this); |