domexception
Advanced tools
Comparing version 1.0.1 to 2.0.0
@@ -6,3 +6,3 @@ "use strict"; | ||
exports.implementation = class DOMExceptionImpl { | ||
constructor([message, name]) { | ||
constructor(globalObject, [message, name]) { | ||
this.name = name; | ||
@@ -9,0 +9,0 @@ this.message = message; |
@@ -7,299 +7,16 @@ "use strict"; | ||
const impl = utils.implSymbol; | ||
const ctorRegistry = utils.ctorRegistrySymbol; | ||
function DOMException() { | ||
const args = []; | ||
for (let i = 0; i < arguments.length && i < 2; ++i) { | ||
args[i] = arguments[i]; | ||
} | ||
if (args[0] !== undefined) { | ||
args[0] = conversions["DOMString"](args[0], { context: "Failed to construct 'DOMException': parameter 1" }); | ||
} else { | ||
args[0] = ""; | ||
} | ||
if (args[1] !== undefined) { | ||
args[1] = conversions["DOMString"](args[1], { context: "Failed to construct 'DOMException': parameter 2" }); | ||
} else { | ||
args[1] = "Error"; | ||
} | ||
iface.setup(this, args); | ||
} | ||
Object.defineProperty(DOMException, "prototype", { | ||
value: DOMException.prototype, | ||
writable: false, | ||
enumerable: false, | ||
configurable: false | ||
}); | ||
Object.defineProperty(DOMException.prototype, "name", { | ||
get() { | ||
return this[impl]["name"]; | ||
}, | ||
enumerable: true, | ||
configurable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "message", { | ||
get() { | ||
return this[impl]["message"]; | ||
}, | ||
enumerable: true, | ||
configurable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "code", { | ||
get() { | ||
return this[impl]["code"]; | ||
}, | ||
enumerable: true, | ||
configurable: true | ||
}); | ||
Object.defineProperty(DOMException, "INDEX_SIZE_ERR", { | ||
value: 1, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "INDEX_SIZE_ERR", { | ||
value: 1, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "DOMSTRING_SIZE_ERR", { | ||
value: 2, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "DOMSTRING_SIZE_ERR", { | ||
value: 2, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "HIERARCHY_REQUEST_ERR", { | ||
value: 3, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "HIERARCHY_REQUEST_ERR", { | ||
value: 3, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "WRONG_DOCUMENT_ERR", { | ||
value: 4, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "WRONG_DOCUMENT_ERR", { | ||
value: 4, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "INVALID_CHARACTER_ERR", { | ||
value: 5, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "INVALID_CHARACTER_ERR", { | ||
value: 5, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "NO_DATA_ALLOWED_ERR", { | ||
value: 6, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "NO_DATA_ALLOWED_ERR", { | ||
value: 6, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "NO_MODIFICATION_ALLOWED_ERR", { | ||
value: 7, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "NO_MODIFICATION_ALLOWED_ERR", { | ||
value: 7, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "NOT_FOUND_ERR", { | ||
value: 8, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "NOT_FOUND_ERR", { | ||
value: 8, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "NOT_SUPPORTED_ERR", { | ||
value: 9, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "NOT_SUPPORTED_ERR", { | ||
value: 9, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "INUSE_ATTRIBUTE_ERR", { | ||
value: 10, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "INUSE_ATTRIBUTE_ERR", { | ||
value: 10, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "INVALID_STATE_ERR", { | ||
value: 11, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "INVALID_STATE_ERR", { | ||
value: 11, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "SYNTAX_ERR", { | ||
value: 12, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "SYNTAX_ERR", { | ||
value: 12, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "INVALID_MODIFICATION_ERR", { | ||
value: 13, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "INVALID_MODIFICATION_ERR", { | ||
value: 13, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "NAMESPACE_ERR", { | ||
value: 14, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "NAMESPACE_ERR", { | ||
value: 14, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "INVALID_ACCESS_ERR", { | ||
value: 15, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "INVALID_ACCESS_ERR", { | ||
value: 15, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "VALIDATION_ERR", { | ||
value: 16, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "VALIDATION_ERR", { | ||
value: 16, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "TYPE_MISMATCH_ERR", { | ||
value: 17, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "TYPE_MISMATCH_ERR", { | ||
value: 17, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "SECURITY_ERR", { | ||
value: 18, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "SECURITY_ERR", { | ||
value: 18, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "NETWORK_ERR", { | ||
value: 19, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "NETWORK_ERR", { | ||
value: 19, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "ABORT_ERR", { | ||
value: 20, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "ABORT_ERR", { | ||
value: 20, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "URL_MISMATCH_ERR", { | ||
value: 21, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "URL_MISMATCH_ERR", { | ||
value: 21, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "QUOTA_EXCEEDED_ERR", { | ||
value: 22, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "QUOTA_EXCEEDED_ERR", { | ||
value: 22, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "TIMEOUT_ERR", { | ||
value: 23, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "TIMEOUT_ERR", { | ||
value: 23, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "INVALID_NODE_TYPE_ERR", { | ||
value: 24, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "INVALID_NODE_TYPE_ERR", { | ||
value: 24, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException, "DATA_CLONE_ERR", { | ||
value: 25, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, "DATA_CLONE_ERR", { | ||
value: 25, | ||
enumerable: true | ||
}); | ||
Object.defineProperty(DOMException.prototype, Symbol.toStringTag, { | ||
value: "DOMException", | ||
writable: false, | ||
enumerable: false, | ||
configurable: true | ||
}); | ||
const iface = { | ||
mixedInto: [], | ||
// When an interface-module that implements this interface as a mixin is loaded, it will append its own `.is()` | ||
// method into this array. It allows objects that directly implements *those* interfaces to be recognized as | ||
// implementing this mixin interface. | ||
_mixedIntoPredicates: [], | ||
is(obj) { | ||
if (obj) { | ||
if (obj[impl] instanceof Impl.implementation) { | ||
if (utils.hasOwn(obj, impl) && obj[impl] instanceof Impl.implementation) { | ||
return true; | ||
} | ||
for (let i = 0; i < module.exports.mixedInto.length; ++i) { | ||
if (obj instanceof module.exports.mixedInto[i]) { | ||
for (const isMixedInto of module.exports._mixedIntoPredicates) { | ||
if (isMixedInto(obj)) { | ||
return true; | ||
@@ -318,4 +35,4 @@ } | ||
const wrapper = utils.wrapperForImpl(obj); | ||
for (let i = 0; i < module.exports.mixedInto.length; ++i) { | ||
if (wrapper instanceof module.exports.mixedInto[i]) { | ||
for (const isMixedInto of module.exports._mixedIntoPredicates) { | ||
if (isMixedInto(wrapper)) { | ||
return true; | ||
@@ -334,25 +51,30 @@ } | ||
create(constructorArgs, privateData) { | ||
let obj = Object.create(DOMException.prototype); | ||
this.setup(obj, constructorArgs, privateData); | ||
create(globalObject, constructorArgs, privateData) { | ||
if (globalObject[ctorRegistry] === undefined) { | ||
throw new Error("Internal error: invalid global object"); | ||
} | ||
const ctor = globalObject[ctorRegistry]["DOMException"]; | ||
if (ctor === undefined) { | ||
throw new Error("Internal error: constructor DOMException is not installed on the passed global object"); | ||
} | ||
let obj = Object.create(ctor.prototype); | ||
obj = iface.setup(obj, globalObject, constructorArgs, privateData); | ||
return obj; | ||
}, | ||
createImpl(constructorArgs, privateData) { | ||
let obj = Object.create(DOMException.prototype); | ||
this.setup(obj, constructorArgs, privateData); | ||
createImpl(globalObject, constructorArgs, privateData) { | ||
const obj = iface.create(globalObject, constructorArgs, privateData); | ||
return utils.implForWrapper(obj); | ||
}, | ||
_internalSetup(obj) {}, | ||
setup(obj, constructorArgs, privateData) { | ||
if (!privateData) privateData = {}; | ||
setup(obj, globalObject, constructorArgs = [], privateData = {}) { | ||
privateData.wrapper = obj; | ||
this._internalSetup(obj); | ||
iface._internalSetup(obj); | ||
Object.defineProperty(obj, impl, { | ||
value: new Impl.implementation(constructorArgs, privateData), | ||
writable: false, | ||
enumerable: false, | ||
value: new Impl.implementation(globalObject, constructorArgs, privateData), | ||
configurable: true | ||
}); | ||
obj[impl][utils.wrapperSymbol] = obj; | ||
@@ -362,7 +84,122 @@ if (Impl.init) { | ||
} | ||
return obj; | ||
}, | ||
interface: DOMException, | ||
expose: { | ||
Window: { DOMException }, | ||
Worker: { DOMException } | ||
install(globalObject) { | ||
class DOMException { | ||
constructor() { | ||
const args = []; | ||
{ | ||
let curArg = arguments[0]; | ||
if (curArg !== undefined) { | ||
curArg = conversions["DOMString"](curArg, { context: "Failed to construct 'DOMException': parameter 1" }); | ||
} else { | ||
curArg = ""; | ||
} | ||
args.push(curArg); | ||
} | ||
{ | ||
let curArg = arguments[1]; | ||
if (curArg !== undefined) { | ||
curArg = conversions["DOMString"](curArg, { context: "Failed to construct 'DOMException': parameter 2" }); | ||
} else { | ||
curArg = "Error"; | ||
} | ||
args.push(curArg); | ||
} | ||
return iface.setup(Object.create(new.target.prototype), globalObject, args); | ||
} | ||
get name() { | ||
if (!this || !module.exports.is(this)) { | ||
throw new TypeError("Illegal invocation"); | ||
} | ||
return this[impl]["name"]; | ||
} | ||
get message() { | ||
if (!this || !module.exports.is(this)) { | ||
throw new TypeError("Illegal invocation"); | ||
} | ||
return this[impl]["message"]; | ||
} | ||
get code() { | ||
if (!this || !module.exports.is(this)) { | ||
throw new TypeError("Illegal invocation"); | ||
} | ||
return this[impl]["code"]; | ||
} | ||
} | ||
Object.defineProperties(DOMException.prototype, { | ||
name: { enumerable: true }, | ||
message: { enumerable: true }, | ||
code: { enumerable: true }, | ||
[Symbol.toStringTag]: { value: "DOMException", configurable: true }, | ||
INDEX_SIZE_ERR: { value: 1, enumerable: true }, | ||
DOMSTRING_SIZE_ERR: { value: 2, enumerable: true }, | ||
HIERARCHY_REQUEST_ERR: { value: 3, enumerable: true }, | ||
WRONG_DOCUMENT_ERR: { value: 4, enumerable: true }, | ||
INVALID_CHARACTER_ERR: { value: 5, enumerable: true }, | ||
NO_DATA_ALLOWED_ERR: { value: 6, enumerable: true }, | ||
NO_MODIFICATION_ALLOWED_ERR: { value: 7, enumerable: true }, | ||
NOT_FOUND_ERR: { value: 8, enumerable: true }, | ||
NOT_SUPPORTED_ERR: { value: 9, enumerable: true }, | ||
INUSE_ATTRIBUTE_ERR: { value: 10, enumerable: true }, | ||
INVALID_STATE_ERR: { value: 11, enumerable: true }, | ||
SYNTAX_ERR: { value: 12, enumerable: true }, | ||
INVALID_MODIFICATION_ERR: { value: 13, enumerable: true }, | ||
NAMESPACE_ERR: { value: 14, enumerable: true }, | ||
INVALID_ACCESS_ERR: { value: 15, enumerable: true }, | ||
VALIDATION_ERR: { value: 16, enumerable: true }, | ||
TYPE_MISMATCH_ERR: { value: 17, enumerable: true }, | ||
SECURITY_ERR: { value: 18, enumerable: true }, | ||
NETWORK_ERR: { value: 19, enumerable: true }, | ||
ABORT_ERR: { value: 20, enumerable: true }, | ||
URL_MISMATCH_ERR: { value: 21, enumerable: true }, | ||
QUOTA_EXCEEDED_ERR: { value: 22, enumerable: true }, | ||
TIMEOUT_ERR: { value: 23, enumerable: true }, | ||
INVALID_NODE_TYPE_ERR: { value: 24, enumerable: true }, | ||
DATA_CLONE_ERR: { value: 25, enumerable: true } | ||
}); | ||
Object.defineProperties(DOMException, { | ||
INDEX_SIZE_ERR: { value: 1, enumerable: true }, | ||
DOMSTRING_SIZE_ERR: { value: 2, enumerable: true }, | ||
HIERARCHY_REQUEST_ERR: { value: 3, enumerable: true }, | ||
WRONG_DOCUMENT_ERR: { value: 4, enumerable: true }, | ||
INVALID_CHARACTER_ERR: { value: 5, enumerable: true }, | ||
NO_DATA_ALLOWED_ERR: { value: 6, enumerable: true }, | ||
NO_MODIFICATION_ALLOWED_ERR: { value: 7, enumerable: true }, | ||
NOT_FOUND_ERR: { value: 8, enumerable: true }, | ||
NOT_SUPPORTED_ERR: { value: 9, enumerable: true }, | ||
INUSE_ATTRIBUTE_ERR: { value: 10, enumerable: true }, | ||
INVALID_STATE_ERR: { value: 11, enumerable: true }, | ||
SYNTAX_ERR: { value: 12, enumerable: true }, | ||
INVALID_MODIFICATION_ERR: { value: 13, enumerable: true }, | ||
NAMESPACE_ERR: { value: 14, enumerable: true }, | ||
INVALID_ACCESS_ERR: { value: 15, enumerable: true }, | ||
VALIDATION_ERR: { value: 16, enumerable: true }, | ||
TYPE_MISMATCH_ERR: { value: 17, enumerable: true }, | ||
SECURITY_ERR: { value: 18, enumerable: true }, | ||
NETWORK_ERR: { value: 19, enumerable: true }, | ||
ABORT_ERR: { value: 20, enumerable: true }, | ||
URL_MISMATCH_ERR: { value: 21, enumerable: true }, | ||
QUOTA_EXCEEDED_ERR: { value: 22, enumerable: true }, | ||
TIMEOUT_ERR: { value: 23, enumerable: true }, | ||
INVALID_NODE_TYPE_ERR: { value: 24, enumerable: true }, | ||
DATA_CLONE_ERR: { value: 25, enumerable: true } | ||
}); | ||
if (globalObject[ctorRegistry] === undefined) { | ||
globalObject[ctorRegistry] = Object.create(null); | ||
} | ||
globalObject[ctorRegistry]["DOMException"] = DOMException; | ||
Object.defineProperty(globalObject, "DOMException", { | ||
configurable: true, | ||
writable: true, | ||
value: DOMException | ||
}); | ||
} | ||
@@ -372,2 +209,2 @@ }; // iface | ||
const Impl = require(".//DOMException-impl.js"); | ||
const Impl = require("./DOMException-impl.js"); |
@@ -8,31 +8,10 @@ "use strict"; | ||
function getReferenceToBytes(bufferSource) { | ||
// Node.js' Buffer does not allow subclassing for now, so we can get away with a prototype object check for perf. | ||
if (Object.getPrototypeOf(bufferSource) === Buffer.prototype) { | ||
return bufferSource; | ||
} | ||
if (bufferSource instanceof ArrayBuffer) { | ||
return Buffer.from(bufferSource); | ||
} | ||
return Buffer.from(bufferSource.buffer, bufferSource.byteOffset, bufferSource.byteLength); | ||
function hasOwn(obj, prop) { | ||
return Object.prototype.hasOwnProperty.call(obj, prop); | ||
} | ||
function getCopyToBytes(bufferSource) { | ||
return Buffer.from(getReferenceToBytes(bufferSource)); | ||
} | ||
function mixin(target, source) { | ||
const keys = Object.getOwnPropertyNames(source); | ||
for (let i = 0; i < keys.length; ++i) { | ||
if (keys[i] in target) { | ||
continue; | ||
} | ||
Object.defineProperty(target, keys[i], Object.getOwnPropertyDescriptor(source, keys[i])); | ||
} | ||
} | ||
const wrapperSymbol = Symbol("wrapper"); | ||
const implSymbol = Symbol("impl"); | ||
const sameObjectCaches = Symbol("SameObject caches"); | ||
const ctorRegistrySymbol = Symbol.for("[webidl2js] constructor registry"); | ||
@@ -73,10 +52,36 @@ function getSameObject(wrapper, prop, creator) { | ||
function isArrayIndexPropName(P) { | ||
if (typeof P !== "string") { | ||
return false; | ||
} | ||
const i = P >>> 0; | ||
if (i === Math.pow(2, 32) - 1) { | ||
return false; | ||
} | ||
const s = `${i}`; | ||
if (P !== s) { | ||
return false; | ||
} | ||
return true; | ||
} | ||
const supportsPropertyIndex = Symbol("supports property index"); | ||
const supportedPropertyIndices = Symbol("supported property indices"); | ||
const supportsPropertyName = Symbol("supports property name"); | ||
const supportedPropertyNames = Symbol("supported property names"); | ||
const indexedGet = Symbol("indexed property get"); | ||
const indexedSetNew = Symbol("indexed property set new"); | ||
const indexedSetExisting = Symbol("indexed property set existing"); | ||
const namedGet = Symbol("named property get"); | ||
const namedSetNew = Symbol("named property set new"); | ||
const namedSetExisting = Symbol("named property set existing"); | ||
const namedDelete = Symbol("named property delete"); | ||
module.exports = exports = { | ||
isObject, | ||
getReferenceToBytes, | ||
getCopyToBytes, | ||
mixin, | ||
hasOwn, | ||
wrapperSymbol, | ||
implSymbol, | ||
getSameObject, | ||
ctorRegistrySymbol, | ||
wrapperForImpl, | ||
@@ -87,3 +92,15 @@ implForWrapper, | ||
iterInternalSymbol, | ||
IteratorPrototype | ||
IteratorPrototype, | ||
isArrayIndexPropName, | ||
supportsPropertyIndex, | ||
supportedPropertyIndices, | ||
supportsPropertyName, | ||
supportedPropertyNames, | ||
indexedGet, | ||
indexedSetNew, | ||
indexedSetExisting, | ||
namedGet, | ||
namedSetNew, | ||
namedSetExisting, | ||
namedDelete | ||
}; |
@@ -12,13 +12,16 @@ { | ||
], | ||
"version": "1.0.1", | ||
"version": "2.0.0", | ||
"author": "Domenic Denicola <d@domenic.me> (https://domenic.me/)", | ||
"license": "MIT", | ||
"repository": "jsdom/domexception", | ||
"main": "lib/public-api.js", | ||
"main": "index.js", | ||
"files": [ | ||
"index.js", | ||
"webidl2js-wrapper.js", | ||
"lib/" | ||
], | ||
"scripts": { | ||
"prepublish": "node scripts/generate.js", | ||
"pretest": "npm run prepublish", | ||
"prepare": "node scripts/generate.js", | ||
"init-wpt": "node scripts/get-latest-platform-tests.js", | ||
"pretest": "npm run prepare && npm run init-wpt", | ||
"test": "mocha", | ||
@@ -31,8 +34,11 @@ "lint": "eslint lib" | ||
"devDependencies": { | ||
"eslint": "^4.3.0", | ||
"eslint": "^6.7.2", | ||
"mkdirp": "^0.5.1", | ||
"mocha": "^3.5.0", | ||
"request": "^2.81.0", | ||
"webidl2js": "^7.2.0" | ||
"mocha": "^6.2.2", | ||
"request": "^2.88.0", | ||
"webidl2js": "^11.0.0" | ||
}, | ||
"engines": { | ||
"node": ">=8" | ||
} | ||
} |
@@ -20,1 +20,13 @@ # DOMException | ||
``` | ||
## APIs | ||
This package exposes two flavors of the `DOMException` interface depending on the imported module. | ||
### `domexception` module | ||
This module default-exports the `DOMException` interface constructor. | ||
### `domexception/webidl2js-wrapper` module | ||
This module exports the `DOMException` [interface wrapper API](https://github.com/jsdom/webidl2js#for-interfaces) generated by [webidl2js](https://github.com/jsdom/webidl2js). |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
15290
9
32
339
1