lib: fix DOMException subclass support · nodejs/node@0748160
1+'use strict';
2+3+require('../common');
4+const assert = require('assert');
5+6+class MyDOMException extends DOMException {
7+ownProp;
8+ #reason;
9+10+constructor() {
11+super('my message', 'NotFoundError');
12+this.ownProp = 'bar';
13+this.#reason = 'hello';
14+}
15+16+get reason() {
17+return this.#reason;
18+}
19+}
20+21+const myException = new MyDOMException();
22+// Verifies the prototype chain
23+assert(myException instanceof MyDOMException);
24+assert(myException instanceof DOMException);
25+assert(myException instanceof Error);
26+// Verifies [[ErrorData]]
27+assert(Error.isError(myException));
28+29+// Verifies subclass properties
30+assert(Object.hasOwn(myException, 'ownProp'));
31+assert(!Object.hasOwn(myException, 'reason'));
32+assert.strictEqual(myException.reason, 'hello');
33+34+// Verifies error properties
35+assert.strictEqual(myException.name, 'NotFoundError');
36+assert.strictEqual(myException.code, 8);
37+assert.strictEqual(myException.message, 'my message');
38+assert.strictEqual(typeof myException.stack, 'string');
39+40+// Verify structuredClone only copies known error properties.
41+const cloned = structuredClone(myException);
42+assert(!(cloned instanceof MyDOMException));
43+assert(cloned instanceof DOMException);
44+assert(cloned instanceof Error);
45+assert(Error.isError(cloned));
46+47+// Verify custom properties
48+assert(!Object.hasOwn(cloned, 'ownProp'));
49+assert.strictEqual(cloned.reason, undefined);
50+51+// Verify cloned error properties
52+assert.strictEqual(cloned.name, 'NotFoundError');
53+assert.strictEqual(cloned.code, 8);
54+assert.strictEqual(cloned.message, 'my message');
55+assert.strictEqual(cloned.stack, myException.stack);