mirror of
https://github.com/nodejs/node.git
synced 2025-05-21 10:42:18 +00:00

Store all primordials as properties of the primordials object. Static functions are prefixed by the constructor's name and prototype methods are prefixed by the constructor's name followed by "Prototype". For example: primordials.Object.keys becomes primordials.ObjectKeys. PR-URL: https://github.com/nodejs/node/pull/30610 Refs: https://github.com/nodejs/node/issues/29766 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
121 lines
3.5 KiB
JavaScript
121 lines
3.5 KiB
JavaScript
'use strict';
|
|
|
|
const {
|
|
ObjectDefineProperties,
|
|
ObjectDefineProperty,
|
|
SafeWeakMap,
|
|
SafeMap,
|
|
SymbolToStringTag,
|
|
} = primordials;
|
|
|
|
class ERR_INVALID_THIS extends TypeError {
|
|
constructor(type) {
|
|
super('Value of "this" must be of ' + type);
|
|
}
|
|
|
|
get code() { return 'ERR_INVALID_THIS'; }
|
|
}
|
|
|
|
let internalsMap;
|
|
let nameToCodeMap;
|
|
let isInitialized = false;
|
|
|
|
// We need to instantiate the maps lazily because they render
|
|
// the snapshot non-rehashable.
|
|
// https://bugs.chromium.org/p/v8/issues/detail?id=6593
|
|
function ensureInitialized() {
|
|
if (isInitialized) {
|
|
return;
|
|
}
|
|
internalsMap = new SafeWeakMap();
|
|
nameToCodeMap = new SafeMap();
|
|
forEachCode((name, codeName, value) => {
|
|
nameToCodeMap.set(name, value);
|
|
});
|
|
isInitialized = true;
|
|
}
|
|
|
|
class DOMException extends Error {
|
|
constructor(message = '', name = 'Error') {
|
|
ensureInitialized();
|
|
super();
|
|
internalsMap.set(this, {
|
|
message: `${message}`,
|
|
name: `${name}`
|
|
});
|
|
}
|
|
|
|
get name() {
|
|
ensureInitialized();
|
|
const internals = internalsMap.get(this);
|
|
if (internals === undefined) {
|
|
throw new ERR_INVALID_THIS('DOMException');
|
|
}
|
|
return internals.name;
|
|
}
|
|
|
|
get message() {
|
|
ensureInitialized();
|
|
const internals = internalsMap.get(this);
|
|
if (internals === undefined) {
|
|
throw new ERR_INVALID_THIS('DOMException');
|
|
}
|
|
return internals.message;
|
|
}
|
|
|
|
get code() {
|
|
ensureInitialized();
|
|
const internals = internalsMap.get(this);
|
|
if (internals === undefined) {
|
|
throw new ERR_INVALID_THIS('DOMException');
|
|
}
|
|
const code = nameToCodeMap.get(internals.name);
|
|
return code === undefined ? 0 : code;
|
|
}
|
|
}
|
|
|
|
ObjectDefineProperties(DOMException.prototype, {
|
|
[SymbolToStringTag]: { configurable: true, value: 'DOMException' },
|
|
name: { enumerable: true, configurable: true },
|
|
message: { enumerable: true, configurable: true },
|
|
code: { enumerable: true, configurable: true }
|
|
});
|
|
|
|
function forEachCode(fn) {
|
|
fn('IndexSizeError', 'INDEX_SIZE_ERR', 1);
|
|
fn('DOMStringSizeError', 'DOMSTRING_SIZE_ERR', 2);
|
|
fn('HierarchyRequestError', 'HIERARCHY_REQUEST_ERR', 3);
|
|
fn('WrongDocumentError', 'WRONG_DOCUMENT_ERR', 4);
|
|
fn('InvalidCharacterError', 'INVALID_CHARACTER_ERR', 5);
|
|
fn('NoDataAllowedError', 'NO_DATA_ALLOWED_ERR', 6);
|
|
fn('NoModificationAllowedError', 'NO_MODIFICATION_ALLOWED_ERR', 7);
|
|
fn('NotFoundError', 'NOT_FOUND_ERR', 8);
|
|
fn('NotSupportedError', 'NOT_SUPPORTED_ERR', 9);
|
|
fn('InUseAttributeError', 'INUSE_ATTRIBUTE_ERR', 10);
|
|
fn('InvalidStateError', 'INVALID_STATE_ERR', 11);
|
|
fn('SyntaxError', 'SYNTAX_ERR', 12);
|
|
fn('InvalidModificationError', 'INVALID_MODIFICATION_ERR', 13);
|
|
fn('NamespaceError', 'NAMESPACE_ERR', 14);
|
|
fn('InvalidAccessError', 'INVALID_ACCESS_ERR', 15);
|
|
fn('ValidationError', 'VALIDATION_ERR', 16);
|
|
fn('TypeMismatchError', 'TYPE_MISMATCH_ERR', 17);
|
|
fn('SecurityError', 'SECURITY_ERR', 18);
|
|
fn('NetworkError', 'NETWORK_ERR', 19);
|
|
fn('AbortError', 'ABORT_ERR', 20);
|
|
fn('URLMismatchError', 'URL_MISMATCH_ERR', 21);
|
|
fn('QuotaExceededError', 'QUOTA_EXCEEDED_ERR', 22);
|
|
fn('TimeoutError', 'TIMEOUT_ERR', 23);
|
|
fn('InvalidNodeTypeError', 'INVALID_NODE_TYPE_ERR', 24);
|
|
fn('DataCloneError', 'DATA_CLONE_ERR', 25);
|
|
// There are some more error names, but since they don't have codes assigned,
|
|
// we don't need to care about them.
|
|
}
|
|
|
|
forEachCode((name, codeName, value) => {
|
|
const desc = { enumerable: true, value };
|
|
ObjectDefineProperty(DOMException, codeName, desc);
|
|
ObjectDefineProperty(DOMException.prototype, codeName, desc);
|
|
});
|
|
|
|
exports.DOMException = DOMException;
|