diff options
Diffstat (limited to 'ext/web')
-rw-r--r-- | ext/web/01_dom_exception.js | 4 | ||||
-rw-r--r-- | ext/web/02_event.js | 16 | ||||
-rw-r--r-- | ext/web/02_structured_clone.js | 12 | ||||
-rw-r--r-- | ext/web/03_abort_signal.js | 15 | ||||
-rw-r--r-- | ext/web/06_streams.js | 235 | ||||
-rw-r--r-- | ext/web/08_text_encoding.js | 42 | ||||
-rw-r--r-- | ext/web/09_file.js | 43 | ||||
-rw-r--r-- | ext/web/10_filereader.js | 28 | ||||
-rw-r--r-- | ext/web/13_message_port.js | 39 | ||||
-rw-r--r-- | ext/web/14_compression.js | 10 |
10 files changed, 278 insertions, 166 deletions
diff --git a/ext/web/01_dom_exception.js b/ext/web/01_dom_exception.js index 44aa72abe..a3beb3064 100644 --- a/ext/web/01_dom_exception.js +++ b/ext/web/01_dom_exception.js @@ -16,6 +16,7 @@ ErrorPrototype, ObjectDefineProperty, ObjectEntries, + ObjectPrototypeIsPrototypeOf, ObjectSetPrototypeOf, SymbolFor, } = window.__bootstrap.primordials; @@ -126,7 +127,7 @@ } [SymbolFor("Deno.customInspect")](inspect) { - if (this instanceof DOMException) { + if (ObjectPrototypeIsPrototypeOf(DOMExceptionPrototype, this)) { return `DOMException: ${this.#message}`; } else { return inspect(consoleInternal.createFilteredInspectProxy({ @@ -145,6 +146,7 @@ ObjectSetPrototypeOf(DOMException.prototype, ErrorPrototype); webidl.configurePrototype(DOMException); + const DOMExceptionPrototype = DOMException.prototype; for ( const [key, value] of ObjectEntries({ diff --git a/ext/web/02_event.js b/ext/web/02_event.js index 7ba5afa27..b32bb01b8 100644 --- a/ext/web/02_event.js +++ b/ext/web/02_event.js @@ -29,6 +29,7 @@ ObjectCreate, ObjectDefineProperty, ObjectGetOwnPropertyDescriptor, + ObjectPrototypeIsPrototypeOf, ReflectDefineProperty, Symbol, SymbolFor, @@ -174,7 +175,7 @@ [SymbolFor("Deno.privateCustomInspect")](inspect) { return inspect(consoleInternal.createFilteredInspectProxy({ object: this, - evaluate: this instanceof Event, + evaluate: ObjectPrototypeIsPrototypeOf(Event.prototype, this), keys: EVENT_PROPS, })); } @@ -1058,7 +1059,7 @@ [SymbolFor("Deno.privateCustomInspect")](inspect) { return inspect(consoleInternal.createFilteredInspectProxy({ object: this, - evaluate: this instanceof ErrorEvent, + evaluate: ObjectPrototypeIsPrototypeOf(ErrorEvent.prototype, this), keys: [ ...EVENT_PROPS, "message", @@ -1119,7 +1120,7 @@ [SymbolFor("Deno.privateCustomInspect")](inspect) { return inspect(consoleInternal.createFilteredInspectProxy({ object: this, - evaluate: this instanceof CloseEvent, + evaluate: ObjectPrototypeIsPrototypeOf(CloseEvent.prototype, this), keys: [ ...EVENT_PROPS, "wasClean", @@ -1151,7 +1152,7 @@ [SymbolFor("Deno.privateCustomInspect")](inspect) { return inspect(consoleInternal.createFilteredInspectProxy({ object: this, - evaluate: this instanceof MessageEvent, + evaluate: ObjectPrototypeIsPrototypeOf(MessageEvent.prototype, this), keys: [ ...EVENT_PROPS, "data", @@ -1184,7 +1185,7 @@ [SymbolFor("Deno.privateCustomInspect")](inspect) { return inspect(consoleInternal.createFilteredInspectProxy({ object: this, - evaluate: this instanceof CustomEvent, + evaluate: ObjectPrototypeIsPrototypeOf(CustomEvent.prototype, this), keys: [ ...EVENT_PROPS, "detail", @@ -1214,7 +1215,7 @@ [SymbolFor("Deno.privateCustomInspect")](inspect) { return inspect(consoleInternal.createFilteredInspectProxy({ object: this, - evaluate: this instanceof ProgressEvent, + evaluate: ObjectPrototypeIsPrototypeOf(ProgressEvent.prototype, this), keys: [ ...EVENT_PROPS, "lengthComputable", @@ -1238,7 +1239,8 @@ if ( isSpecialErrorEventHandler && - evt instanceof ErrorEvent && evt.type === "error" + ObjectPrototypeIsPrototypeOf(ErrorEvent.prototype, evt) && + evt.type === "error" ) { const ret = FunctionPrototypeCall( wrappedHandler.handler, diff --git a/ext/web/02_structured_clone.js b/ext/web/02_structured_clone.js index 005b668af..058390cfe 100644 --- a/ext/web/02_structured_clone.js +++ b/ext/web/02_structured_clone.js @@ -13,10 +13,12 @@ const { DOMException } = window.__bootstrap.domException; const { ArrayBuffer, + ArrayBufferPrototype, ArrayBufferIsView, - DataView, + DataViewPrototype, + ObjectPrototypeIsPrototypeOf, TypedArrayPrototypeSlice, - TypeError, + TypeErrorPrototype, WeakMap, WeakMapPrototypeSet, } = window.__bootstrap.primordials; @@ -42,7 +44,7 @@ function structuredClone(value) { // Performance optimization for buffers, otherwise // `serialize/deserialize` will allocate new buffer. - if (value instanceof ArrayBuffer) { + if (ObjectPrototypeIsPrototypeOf(ArrayBufferPrototype, value)) { const cloned = cloneArrayBuffer( value, 0, @@ -59,7 +61,7 @@ // only DataView has a length in bytes and TypedArrays use a length in // terms of elements, so we adjust for that. let length; - if (value instanceof DataView) { + if (ObjectPrototypeIsPrototypeOf(DataViewPrototype, view)) { length = value.byteLength; } else { length = value.length; @@ -74,7 +76,7 @@ try { return core.deserialize(core.serialize(value)); } catch (e) { - if (e instanceof TypeError) { + if (ObjectPrototypeIsPrototypeOf(TypeErrorPrototype, e)) { throw new DOMException("Uncloneable value", "DataCloneError"); } throw e; diff --git a/ext/web/03_abort_signal.js b/ext/web/03_abort_signal.js index cd9b11d4b..8b089d031 100644 --- a/ext/web/03_abort_signal.js +++ b/ext/web/03_abort_signal.js @@ -77,17 +77,17 @@ } get aborted() { - webidl.assertBranded(this, AbortSignal); + webidl.assertBranded(this, AbortSignalPrototype); return this[abortReason] !== undefined; } get reason() { - webidl.assertBranded(this, AbortSignal); + webidl.assertBranded(this, AbortSignalPrototype); return this[abortReason]; } throwIfAborted() { - webidl.assertBranded(this, AbortSignal); + webidl.assertBranded(this, AbortSignalPrototype); if (this[abortReason] !== undefined) { throw this[abortReason]; } @@ -96,6 +96,7 @@ defineEventHandler(AbortSignal.prototype, "abort"); webidl.configurePrototype(AbortSignal); + const AbortSignalPrototype = AbortSignal.prototype; class AbortController { [signal] = new AbortSignal(illegalConstructorKey); @@ -105,21 +106,22 @@ } get signal() { - webidl.assertBranded(this, AbortController); + webidl.assertBranded(this, AbortControllerPrototype); return this[signal]; } abort(reason) { - webidl.assertBranded(this, AbortController); + webidl.assertBranded(this, AbortControllerPrototype); this[signal][signalAbort](reason); } } webidl.configurePrototype(AbortController); + const AbortControllerPrototype = AbortController.prototype; webidl.converters["AbortSignal"] = webidl.createInterfaceConverter( "AbortSignal", - AbortSignal, + AbortSignal.prototype, ); function newSignal() { @@ -142,6 +144,7 @@ window.AbortSignal = AbortSignal; window.AbortController = AbortController; window.__bootstrap.abortSignal = { + AbortSignalPrototype, add, signalAbort, remove, diff --git a/ext/web/06_streams.js b/ext/web/06_streams.js index d32a72c6e..777ad152b 100644 --- a/ext/web/06_streams.js +++ b/ext/web/06_streams.js @@ -9,21 +9,22 @@ ((window) => { const webidl = window.__bootstrap.webidl; - const { add, remove, signalAbort, newSignal } = + const { add, remove, signalAbort, newSignal, AbortSignalPrototype } = window.__bootstrap.abortSignal; const { ArrayBuffer, + ArrayBufferPrototype, ArrayBufferIsView, ArrayPrototypeMap, ArrayPrototypePush, ArrayPrototypeShift, - BigInt64Array, - BigUint64Array, + BigInt64ArrayPrototype, + BigUint64ArrayPrototype, DataView, Error, - Int8Array, - Int16Array, - Int32Array, + Int8ArrayPrototype, + Int16ArrayPrototype, + Int32ArrayPrototype, NumberIsInteger, NumberIsNaN, MathMin, @@ -31,6 +32,7 @@ ObjectDefineProperties, ObjectDefineProperty, ObjectGetPrototypeOf, + ObjectPrototypeIsPrototypeOf, ObjectSetPrototypeOf, Promise, PromiseAll, @@ -46,9 +48,10 @@ SymbolFor, TypeError, Uint8Array, - Uint16Array, - Uint32Array, - Uint8ClampedArray, + Uint8ArrayPrototype, + Uint16ArrayPrototype, + Uint32ArrayPrototype, + Uint8ClampedArrayPrototype, WeakMap, WeakMapPrototypeGet, WeakMapPrototypeHas, @@ -134,7 +137,7 @@ /** @param {any} e */ function rethrowAssertionErrorRejection(e) { - if (e && e instanceof AssertionError) { + if (e && ObjectPrototypeIsPrototypeOf(AssertionError.prototype, e)) { queueMicrotask(() => { console.error(`Internal Error: ${e.stack}`); }); @@ -214,7 +217,10 @@ */ function canTransferArrayBuffer(O) { assert(typeof O === "object"); - assert(O instanceof ArrayBuffer || O instanceof SharedArrayBuffer); + assert( + ObjectPrototypeIsPrototypeOf(ArrayBufferPrototype, O) || + ObjectPrototypeIsPrototypeOf(SharedArrayBuffer.prototype, O), + ); if (isDetachedBuffer(O)) { return false; } @@ -1364,15 +1370,15 @@ let ctor = DataView; if ( - view instanceof Int8Array || - view instanceof Uint8Array || - view instanceof Uint8ClampedArray || - view instanceof Int16Array || - view instanceof Uint16Array || - view instanceof Int32Array || - view instanceof Uint32Array || - view instanceof BigInt64Array || - view instanceof BigUint64Array + ObjectPrototypeIsPrototypeOf(Int8ArrayPrototype, view) || + ObjectPrototypeIsPrototypeOf(Uint8ArrayPrototype, view) || + ObjectPrototypeIsPrototypeOf(Uint8ClampedArrayPrototype, view) || + ObjectPrototypeIsPrototypeOf(Int16ArrayPrototype, view) || + ObjectPrototypeIsPrototypeOf(Uint16ArrayPrototype, view) || + ObjectPrototypeIsPrototypeOf(Int32ArrayPrototype, view) || + ObjectPrototypeIsPrototypeOf(Uint32ArrayPrototype, view) || + ObjectPrototypeIsPrototypeOf(BigInt64ArrayPrototype, view) || + ObjectPrototypeIsPrototypeOf(BigUint64ArrayPrototype, view) ) { elementSize = view.constructor.BYTES_PER_ELEMENT; ctor = view.constructor; @@ -1983,7 +1989,10 @@ typeof preventClose === "boolean" && typeof preventAbort === "boolean" && typeof preventCancel === "boolean", ); - assert(signal === undefined || signal instanceof AbortSignal); + assert( + signal === undefined || + ObjectPrototypeIsPrototypeOf(AbortSignalPrototype, signal), + ); assert(!isReadableStreamLocked(source)); assert(!isWritableStreamLocked(dest)); // We use acquireReadableStreamDefaultReader even in case of ReadableByteStreamController @@ -2327,7 +2336,12 @@ function readableStreamTee(stream, cloneForBranch2) { assert(isReadableStream(stream)); assert(typeof cloneForBranch2 === "boolean"); - if (stream[_controller] instanceof ReadableByteStreamController) { + if ( + ObjectPrototypeIsPrototypeOf( + ReadableByteStreamControllerPrototype, + stream[_controller], + ) + ) { return readableByteStreamTee(stream); } else { return readableStreamDefaultTee(stream, cloneForBranch2); @@ -2491,7 +2505,12 @@ */ function readableByteStreamTee(stream) { assert(isReadableStream(stream)); - assert(stream[_controller] instanceof ReadableByteStreamController); + assert( + ObjectPrototypeIsPrototypeOf( + ReadableByteStreamControllerPrototype, + stream[_controller], + ), + ); let reader = acquireReadableStreamDefaultReader(stream); let reading = false; let readAgainForBranch1 = false; @@ -2999,7 +3018,12 @@ if (isReadableStreamLocked(stream)) { throw new TypeError("ReadableStream is locked."); } - if (!(stream[_controller] instanceof ReadableByteStreamController)) { + if ( + !(ObjectPrototypeIsPrototypeOf( + ReadableByteStreamControllerPrototype, + stream[_controller], + )) + ) { throw new TypeError("Cannot use a BYOB reader with a non-byte stream"); } readableStreamReaderGenericInitialize(reader, stream); @@ -3032,7 +3056,7 @@ transformAlgorithm, flushAlgorithm, ) { - assert(stream instanceof TransformStream); + assert(ObjectPrototypeIsPrototypeOf(TransformStreamPrototype, stream)); assert(stream[_controller] === undefined); controller[_stream] = stream; stream[_controller] = controller; @@ -4174,13 +4198,13 @@ /** @returns {number} */ get highWaterMark() { - webidl.assertBranded(this, ByteLengthQueuingStrategy); + webidl.assertBranded(this, ByteLengthQueuingStrategyPrototype); return this[_highWaterMark]; } /** @returns {(chunk: ArrayBufferView) => number} */ get size() { - webidl.assertBranded(this, ByteLengthQueuingStrategy); + webidl.assertBranded(this, ByteLengthQueuingStrategyPrototype); initializeByteLengthSizeFunction(this[_globalObject]); return WeakMapPrototypeGet(byteSizeFunctionWeakMap, this[_globalObject]); } @@ -4188,7 +4212,10 @@ [SymbolFor("Deno.customInspect")](inspect) { return inspect(consoleInternal.createFilteredInspectProxy({ object: this, - evaluate: this instanceof ByteLengthQueuingStrategy, + evaluate: ObjectPrototypeIsPrototypeOf( + ByteLengthQueuingStrategyPrototype, + this, + ), keys: [ "highWaterMark", "size", @@ -4198,6 +4225,8 @@ } webidl.configurePrototype(ByteLengthQueuingStrategy); + const ByteLengthQueuingStrategyPrototype = + ByteLengthQueuingStrategy.prototype; /** @type {WeakMap<typeof globalThis, (chunk: ArrayBufferView) => number>} */ const byteSizeFunctionWeakMap = new WeakMap(); @@ -4226,13 +4255,13 @@ /** @returns {number} */ get highWaterMark() { - webidl.assertBranded(this, CountQueuingStrategy); + webidl.assertBranded(this, CountQueuingStrategyPrototype); return this[_highWaterMark]; } /** @returns {(chunk: any) => 1} */ get size() { - webidl.assertBranded(this, CountQueuingStrategy); + webidl.assertBranded(this, CountQueuingStrategyPrototype); initializeCountSizeFunction(this[_globalObject]); return WeakMapPrototypeGet(countSizeFunctionWeakMap, this[_globalObject]); } @@ -4240,7 +4269,10 @@ [SymbolFor("Deno.customInspect")](inspect) { return inspect(consoleInternal.createFilteredInspectProxy({ object: this, - evaluate: this instanceof CountQueuingStrategy, + evaluate: ObjectPrototypeIsPrototypeOf( + CountQueuingStrategyPrototype, + this, + ), keys: [ "highWaterMark", "size", @@ -4250,6 +4282,7 @@ } webidl.configurePrototype(CountQueuingStrategy); + const CountQueuingStrategyPrototype = CountQueuingStrategy.prototype; /** @type {WeakMap<typeof globalThis, () => 1>} */ const countSizeFunctionWeakMap = new WeakMap(); @@ -4333,7 +4366,7 @@ /** @returns {boolean} */ get locked() { - webidl.assertBranded(this, ReadableStream); + webidl.assertBranded(this, ReadableStreamPrototype); return isReadableStreamLocked(this); } @@ -4343,7 +4376,7 @@ */ cancel(reason = undefined) { try { - webidl.assertBranded(this, ReadableStream); + webidl.assertBranded(this, ReadableStreamPrototype); if (reason !== undefined) { reason = webidl.converters.any(reason); } @@ -4363,7 +4396,7 @@ * @returns {ReadableStreamDefaultReader<R> | ReadableStreamBYOBReader} */ getReader(options = {}) { - webidl.assertBranded(this, ReadableStream); + webidl.assertBranded(this, ReadableStreamPrototype); const prefix = "Failed to execute 'getReader' on 'ReadableStream'"; options = webidl.converters.ReadableStreamGetReaderOptions(options, { prefix, @@ -4384,7 +4417,7 @@ * @returns {ReadableStream<T>} */ pipeThrough(transform, options = {}) { - webidl.assertBranded(this, ReadableStream); + webidl.assertBranded(this, ReadableStreamPrototype); const prefix = "Failed to execute 'pipeThrough' on 'ReadableStream'"; webidl.requiredArguments(arguments.length, 1, { prefix }); transform = webidl.converters.ReadableWritablePair(transform, { @@ -4422,7 +4455,7 @@ */ pipeTo(destination, options = {}) { try { - webidl.assertBranded(this, ReadableStream); + webidl.assertBranded(this, ReadableStreamPrototype); const prefix = "Failed to execute 'pipeTo' on 'ReadableStream'"; webidl.requiredArguments(arguments.length, 1, { prefix }); destination = webidl.converters.WritableStream(destination, { @@ -4459,7 +4492,7 @@ /** @returns {[ReadableStream<R>, ReadableStream<R>]} */ tee() { - webidl.assertBranded(this, ReadableStream); + webidl.assertBranded(this, ReadableStreamPrototype); return readableStreamTee(this, false); } @@ -4469,7 +4502,7 @@ * @returns {AsyncIterableIterator<R>} */ values(options = {}) { - webidl.assertBranded(this, ReadableStream); + webidl.assertBranded(this, ReadableStreamPrototype); const prefix = "Failed to execute 'values' on 'ReadableStream'"; options = webidl.converters.ReadableStreamIteratorOptions(options, { prefix, @@ -4498,6 +4531,7 @@ }); webidl.configurePrototype(ReadableStream); + const ReadableStreamPrototype = ReadableStream.prototype; function errorReadableStream(stream, e) { readableStreamDefaultControllerError(stream[_controller], e); @@ -4527,7 +4561,7 @@ /** @returns {Promise<ReadableStreamReadResult<R>>} */ read() { try { - webidl.assertBranded(this, ReadableStreamDefaultReader); + webidl.assertBranded(this, ReadableStreamDefaultReaderPrototype); } catch (err) { return PromiseReject(err); } @@ -4556,7 +4590,7 @@ /** @returns {void} */ releaseLock() { - webidl.assertBranded(this, ReadableStreamDefaultReader); + webidl.assertBranded(this, ReadableStreamDefaultReaderPrototype); if (this[_stream] === undefined) { return; } @@ -4565,7 +4599,7 @@ get closed() { try { - webidl.assertBranded(this, ReadableStreamDefaultReader); + webidl.assertBranded(this, ReadableStreamDefaultReaderPrototype); } catch (err) { return PromiseReject(err); } @@ -4578,7 +4612,7 @@ */ cancel(reason = undefined) { try { - webidl.assertBranded(this, ReadableStreamDefaultReader); + webidl.assertBranded(this, ReadableStreamDefaultReaderPrototype); if (reason !== undefined) { reason = webidl.converters.any(reason); } @@ -4600,6 +4634,8 @@ } webidl.configurePrototype(ReadableStreamDefaultReader); + const ReadableStreamDefaultReaderPrototype = + ReadableStreamDefaultReader.prototype; /** @template R */ class ReadableStreamBYOBReader { @@ -4628,7 +4664,7 @@ */ read(view) { try { - webidl.assertBranded(this, ReadableStreamBYOBReader); + webidl.assertBranded(this, ReadableStreamBYOBReaderPrototype); const prefix = "Failed to execute 'read' on 'ReadableStreamBYOBReader'"; view = webidl.converters.ArrayBufferView(view, { prefix, @@ -4678,7 +4714,7 @@ /** @returns {void} */ releaseLock() { - webidl.assertBranded(this, ReadableStreamBYOBReader); + webidl.assertBranded(this, ReadableStreamBYOBReaderPrototype); if (this[_stream] === undefined) { return; } @@ -4687,7 +4723,7 @@ get closed() { try { - webidl.assertBranded(this, ReadableStreamBYOBReader); + webidl.assertBranded(this, ReadableStreamBYOBReaderPrototype); } catch (err) { return PromiseReject(err); } @@ -4700,7 +4736,7 @@ */ cancel(reason = undefined) { try { - webidl.assertBranded(this, ReadableStreamBYOBReader); + webidl.assertBranded(this, ReadableStreamBYOBReaderPrototype); if (reason !== undefined) { reason = webidl.converters.any(reason); } @@ -4722,6 +4758,7 @@ } webidl.configurePrototype(ReadableStreamBYOBReader); + const ReadableStreamBYOBReaderPrototype = ReadableStreamBYOBReader.prototype; class ReadableStreamBYOBRequest { /** @type {ReadableByteStreamController} */ @@ -4731,7 +4768,7 @@ /** @returns {ArrayBufferView | null} */ get view() { - webidl.assertBranded(this, ReadableStreamBYOBRequest); + webidl.assertBranded(this, ReadableStreamBYOBRequestPrototype); return this[_view]; } @@ -4740,7 +4777,7 @@ } respond(bytesWritten) { - webidl.assertBranded(this, ReadableStreamBYOBRequest); + webidl.assertBranded(this, ReadableStreamBYOBRequestPrototype); const prefix = "Failed to execute 'respond' on 'ReadableStreamBYOBRequest'"; webidl.requiredArguments(arguments.length, 1, { prefix }); @@ -4764,7 +4801,7 @@ } respondWithNewView(view) { - webidl.assertBranded(this, ReadableStreamBYOBRequest); + webidl.assertBranded(this, ReadableStreamBYOBRequestPrototype); const prefix = "Failed to execute 'respondWithNewView' on 'ReadableStreamBYOBRequest'"; webidl.requiredArguments(arguments.length, 1, { prefix }); @@ -4786,6 +4823,8 @@ } webidl.configurePrototype(ReadableStreamBYOBRequest); + const ReadableStreamBYOBRequestPrototype = + ReadableStreamBYOBRequest.prototype; class ReadableByteStreamController { /** @type {number | undefined} */ @@ -4821,19 +4860,19 @@ /** @returns {ReadableStreamBYOBRequest | null} */ get byobRequest() { - webidl.assertBranded(this, ReadableByteStreamController); + webidl.assertBranded(this, ReadableByteStreamControllerPrototype); return readableByteStreamControllerGetBYOBRequest(this); } /** @returns {number | null} */ get desiredSize() { - webidl.assertBranded(this, ReadableByteStreamController); + webidl.assertBranded(this, ReadableByteStreamControllerPrototype); return readableByteStreamControllerGetDesiredSize(this); } /** @returns {void} */ close() { - webidl.assertBranded(this, ReadableByteStreamController); + webidl.assertBranded(this, ReadableByteStreamControllerPrototype); if (this[_closeRequested] === true) { throw new TypeError("Closed already requested."); } @@ -4850,7 +4889,7 @@ * @returns {void} */ enqueue(chunk) { - webidl.assertBranded(this, ReadableByteStreamController); + webidl.assertBranded(this, ReadableByteStreamControllerPrototype); const prefix = "Failed to execute 'enqueue' on 'ReadableByteStreamController'"; webidl.requiredArguments(arguments.length, 1, { prefix }); @@ -4890,7 +4929,7 @@ * @returns {void} */ error(e = undefined) { - webidl.assertBranded(this, ReadableByteStreamController); + webidl.assertBranded(this, ReadableByteStreamControllerPrototype); if (e !== undefined) { e = webidl.converters.any(e); } @@ -4900,7 +4939,10 @@ [SymbolFor("Deno.customInspect")](inspect) { return inspect(consoleInternal.createFilteredInspectProxy({ object: this, - evaluate: this instanceof ReadableByteStreamController, + evaluate: ObjectPrototypeIsPrototypeOf( + ReadableByteStreamControllerPrototype, + this, + ), keys: ["desiredSize"], })); } @@ -4967,6 +5009,8 @@ } webidl.configurePrototype(ReadableByteStreamController); + const ReadableByteStreamControllerPrototype = + ReadableByteStreamController.prototype; /** @template R */ class ReadableStreamDefaultController { @@ -4999,13 +5043,13 @@ /** @returns {number | null} */ get desiredSize() { - webidl.assertBranded(this, ReadableStreamDefaultController); + webidl.assertBranded(this, ReadableStreamDefaultControllerPrototype); return readableStreamDefaultControllerGetDesiredSize(this); } /** @returns {void} */ close() { - webidl.assertBranded(this, ReadableStreamDefaultController); + webidl.assertBranded(this, ReadableStreamDefaultControllerPrototype); if (readableStreamDefaultControllerCanCloseOrEnqueue(this) === false) { throw new TypeError("The stream controller cannot close or enqueue."); } @@ -5017,7 +5061,7 @@ * @returns {void} */ enqueue(chunk = undefined) { - webidl.assertBranded(this, ReadableStreamDefaultController); + webidl.assertBranded(this, ReadableStreamDefaultControllerPrototype); if (chunk !== undefined) { chunk = webidl.converters.any(chunk); } @@ -5032,7 +5076,7 @@ * @returns {void} */ error(e = undefined) { - webidl.assertBranded(this, ReadableStreamDefaultController); + webidl.assertBranded(this, ReadableStreamDefaultControllerPrototype); if (e !== undefined) { e = webidl.converters.any(e); } @@ -5042,7 +5086,10 @@ [SymbolFor("Deno.customInspect")](inspect) { return inspect(consoleInternal.createFilteredInspectProxy({ object: this, - evaluate: this instanceof ReadableStreamDefaultController, + evaluate: ObjectPrototypeIsPrototypeOf( + ReadableStreamDefaultController.prototype, + this, + ), keys: ["desiredSize"], })); } @@ -5085,6 +5132,8 @@ } webidl.configurePrototype(ReadableStreamDefaultController); + const ReadableStreamDefaultControllerPrototype = + ReadableStreamDefaultController.prototype; /** * @template I @@ -5186,13 +5235,13 @@ /** @returns {ReadableStream<O>} */ get readable() { - webidl.assertBranded(this, TransformStream); + webidl.assertBranded(this, TransformStreamPrototype); return this[_readable]; } /** @returns {WritableStream<I>} */ get writable() { - webidl.assertBranded(this, TransformStream); + webidl.assertBranded(this, TransformStreamPrototype); return this[_writable]; } @@ -5204,6 +5253,7 @@ } webidl.configurePrototype(TransformStream); + const TransformStreamPrototype = TransformStream.prototype; /** @template O */ class TransformStreamDefaultController { @@ -5220,7 +5270,7 @@ /** @returns {number | null} */ get desiredSize() { - webidl.assertBranded(this, TransformStreamDefaultController); + webidl.assertBranded(this, TransformStreamDefaultController.prototype); const readableController = this[_stream][_readable][_controller]; return readableStreamDefaultControllerGetDesiredSize( /** @type {ReadableStreamDefaultController<O>} */ readableController, @@ -5232,7 +5282,7 @@ * @returns {void} */ enqueue(chunk = undefined) { - webidl.assertBranded(this, TransformStreamDefaultController); + webidl.assertBranded(this, TransformStreamDefaultController.prototype); if (chunk !== undefined) { chunk = webidl.converters.any(chunk); } @@ -5244,7 +5294,7 @@ * @returns {void} */ error(reason = undefined) { - webidl.assertBranded(this, TransformStreamDefaultController); + webidl.assertBranded(this, TransformStreamDefaultController.prototype); if (reason !== undefined) { reason = webidl.converters.any(reason); } @@ -5253,20 +5303,25 @@ /** @returns {void} */ terminate() { - webidl.assertBranded(this, TransformStreamDefaultController); + webidl.assertBranded(this, TransformStreamDefaultControllerPrototype); transformStreamDefaultControllerTerminate(this); } [SymbolFor("Deno.customInspect")](inspect) { return inspect(consoleInternal.createFilteredInspectProxy({ object: this, - evaluate: this instanceof TransformStreamDefaultController, + evaluate: ObjectPrototypeIsPrototypeOf( + TransformStreamDefaultController.prototype, + this, + ), keys: ["desiredSize"], })); } } webidl.configurePrototype(TransformStreamDefaultController); + const TransformStreamDefaultControllerPrototype = + TransformStreamDefaultController.prototype; /** @template W */ class WritableStream { @@ -5336,7 +5391,7 @@ /** @returns {boolean} */ get locked() { - webidl.assertBranded(this, WritableStream); + webidl.assertBranded(this, WritableStreamPrototype); return isWritableStreamLocked(this); } @@ -5346,7 +5401,7 @@ */ abort(reason = undefined) { try { - webidl.assertBranded(this, WritableStream); + webidl.assertBranded(this, WritableStreamPrototype); } catch (err) { return PromiseReject(err); } @@ -5366,7 +5421,7 @@ /** @returns {Promise<void>} */ close() { try { - webidl.assertBranded(this, WritableStream); + webidl.assertBranded(this, WritableStreamPrototype); } catch (err) { return PromiseReject(err); } @@ -5387,7 +5442,7 @@ /** @returns {WritableStreamDefaultWriter<W>} */ getWriter() { - webidl.assertBranded(this, WritableStream); + webidl.assertBranded(this, WritableStreamPrototype); return acquireWritableStreamDefaultWriter(this); } @@ -5397,6 +5452,7 @@ } webidl.configurePrototype(WritableStream); + const WritableStreamPrototype = WritableStream.prototype; /** @template W */ class WritableStreamDefaultWriter { @@ -5426,7 +5482,7 @@ /** @returns {Promise<void>} */ get closed() { try { - webidl.assertBranded(this, WritableStreamDefaultWriter); + webidl.assertBranded(this, WritableStreamDefaultWriterPrototype); } catch (err) { return PromiseReject(err); } @@ -5435,7 +5491,7 @@ /** @returns {number} */ get desiredSize() { - webidl.assertBranded(this, WritableStreamDefaultWriter); + webidl.assertBranded(this, WritableStreamDefaultWriterPrototype); if (this[_stream] === undefined) { throw new TypeError( "A writable stream is not associated with the writer.", @@ -5447,7 +5503,7 @@ /** @returns {Promise<void>} */ get ready() { try { - webidl.assertBranded(this, WritableStreamDefaultWriter); + webidl.assertBranded(this, WritableStreamDefaultWriterPrototype); } catch (err) { return PromiseReject(err); } @@ -5460,7 +5516,7 @@ */ abort(reason = undefined) { try { - webidl.assertBranded(this, WritableStreamDefaultWriter); + webidl.assertBranded(this, WritableStreamDefaultWriterPrototype); } catch (err) { return PromiseReject(err); } @@ -5478,7 +5534,7 @@ /** @returns {Promise<void>} */ close() { try { - webidl.assertBranded(this, WritableStreamDefaultWriter); + webidl.assertBranded(this, WritableStreamDefaultWriterPrototype); } catch (err) { return PromiseReject(err); } @@ -5498,7 +5554,7 @@ /** @returns {void} */ releaseLock() { - webidl.assertBranded(this, WritableStreamDefaultWriter); + webidl.assertBranded(this, WritableStreamDefaultWriterPrototype); const stream = this[_stream]; if (stream === undefined) { return; @@ -5513,7 +5569,7 @@ */ write(chunk = undefined) { try { - webidl.assertBranded(this, WritableStreamDefaultWriter); + webidl.assertBranded(this, WritableStreamDefaultWriterPrototype); if (chunk !== undefined) { chunk = webidl.converters.any(chunk); } @@ -5531,7 +5587,10 @@ [SymbolFor("Deno.customInspect")](inspect) { return inspect(consoleInternal.createFilteredInspectProxy({ object: this, - evaluate: this instanceof WritableStreamDefaultWriter, + evaluate: ObjectPrototypeIsPrototypeOf( + WritableStreamDefaultWriter.prototype, + this, + ), keys: [ "closed", "desiredSize", @@ -5542,6 +5601,8 @@ } webidl.configurePrototype(WritableStreamDefaultWriter); + const WritableStreamDefaultWriterPrototype = + WritableStreamDefaultWriter.prototype; /** @template W */ class WritableStreamDefaultController { @@ -5567,7 +5628,7 @@ [_signal]; get signal() { - webidl.assertBranded(this, WritableStreamDefaultController); + webidl.assertBranded(this, WritableStreamDefaultControllerPrototype); return this[_signal]; } @@ -5580,7 +5641,7 @@ * @returns {void} */ error(e = undefined) { - webidl.assertBranded(this, WritableStreamDefaultController); + webidl.assertBranded(this, WritableStreamDefaultControllerPrototype); if (e !== undefined) { e = webidl.converters.any(e); } @@ -5594,7 +5655,10 @@ [SymbolFor("Deno.customInspect")](inspect) { return inspect(consoleInternal.createFilteredInspectProxy({ object: this, - evaluate: this instanceof WritableStreamDefaultController, + evaluate: ObjectPrototypeIsPrototypeOf( + WritableStreamDefaultController.prototype, + this, + ), keys: [], })); } @@ -5615,6 +5679,8 @@ } webidl.configurePrototype(WritableStreamDefaultController); + const WritableStreamDefaultControllerPrototype = + WritableStreamDefaultController.prototype; /** * @param {ReadableStream} stream @@ -5624,9 +5690,9 @@ } webidl.converters.ReadableStream = webidl - .createInterfaceConverter("ReadableStream", ReadableStream); + .createInterfaceConverter("ReadableStream", ReadableStream.prototype); webidl.converters.WritableStream = webidl - .createInterfaceConverter("WritableStream", WritableStream); + .createInterfaceConverter("WritableStream", WritableStream.prototype); webidl.converters.ReadableStreamType = webidl.createEnumConverter( "ReadableStreamType", @@ -5787,6 +5853,7 @@ ByteLengthQueuingStrategy, CountQueuingStrategy, ReadableStream, + ReadableStreamPrototype, ReadableStreamDefaultReader, TransformStream, WritableStream, diff --git a/ext/web/08_text_encoding.js b/ext/web/08_text_encoding.js index cf7b7e12f..4f26089b1 100644 --- a/ext/web/08_text_encoding.js +++ b/ext/web/08_text_encoding.js @@ -16,6 +16,7 @@ const webidl = window.__bootstrap.webidl; const { ArrayBufferIsView, + ObjectPrototypeIsPrototypeOf, PromiseReject, PromiseResolve, StringPrototypeCharCodeAt, @@ -59,19 +60,19 @@ /** @returns {string} */ get encoding() { - webidl.assertBranded(this, TextDecoder); + webidl.assertBranded(this, TextDecoderPrototype); return this.#encoding; } /** @returns {boolean} */ get fatal() { - webidl.assertBranded(this, TextDecoder); + webidl.assertBranded(this, TextDecoderPrototype); return this.#fatal; } /** @returns {boolean} */ get ignoreBOM() { - webidl.assertBranded(this, TextDecoder); + webidl.assertBranded(this, TextDecoderPrototype); return this.#ignoreBOM; } @@ -80,7 +81,7 @@ * @param {TextDecodeOptions} options */ decode(input = new Uint8Array(), options = {}) { - webidl.assertBranded(this, TextDecoder); + webidl.assertBranded(this, TextDecoderPrototype); const prefix = "Failed to execute 'decode' on 'TextDecoder'"; if (input !== undefined) { input = webidl.converters.BufferSource(input, { @@ -119,7 +120,12 @@ // If the buffer is detached, just create a new empty Uint8Array. input = new Uint8Array(); } - if (input.buffer instanceof SharedArrayBuffer) { + if ( + ObjectPrototypeIsPrototypeOf( + SharedArrayBuffer.prototype, + input.buffer, + ) + ) { // We clone the data into a non-shared ArrayBuffer so we can pass it // to Rust. // `input` is now a Uint8Array, and calling the TypedArray constructor @@ -140,6 +146,7 @@ } webidl.configurePrototype(TextDecoder); + const TextDecoderPrototype = TextDecoder.prototype; class TextEncoder { constructor() { @@ -148,7 +155,7 @@ /** @returns {string} */ get encoding() { - webidl.assertBranded(this, TextEncoder); + webidl.assertBranded(this, TextEncoderPrototype); return "utf-8"; } @@ -157,7 +164,7 @@ * @returns {Uint8Array} */ encode(input = "") { - webidl.assertBranded(this, TextEncoder); + webidl.assertBranded(this, TextEncoderPrototype); const prefix = "Failed to execute 'encode' on 'TextEncoder'"; // The WebIDL type of `input` is `USVString`, but `core.encode` already // converts lone surrogates to the replacement character. @@ -174,7 +181,7 @@ * @returns {TextEncoderEncodeIntoResult} */ encodeInto(source, destination) { - webidl.assertBranded(this, TextEncoder); + webidl.assertBranded(this, TextEncoderPrototype); const prefix = "Failed to execute 'encodeInto' on 'TextEncoder'"; // The WebIDL type of `source` is `USVString`, but the ops bindings // already convert lone surrogates to the replacement character. @@ -192,6 +199,7 @@ } webidl.configurePrototype(TextEncoder); + const TextEncoderPrototype = TextEncoder.prototype; class TextDecoderStream { /** @type {TextDecoder} */ @@ -248,36 +256,37 @@ /** @returns {string} */ get encoding() { - webidl.assertBranded(this, TextDecoderStream); + webidl.assertBranded(this, TextDecoderStreamPrototype); return this.#decoder.encoding; } /** @returns {boolean} */ get fatal() { - webidl.assertBranded(this, TextDecoderStream); + webidl.assertBranded(this, TextDecoderStreamPrototype); return this.#decoder.fatal; } /** @returns {boolean} */ get ignoreBOM() { - webidl.assertBranded(this, TextDecoderStream); + webidl.assertBranded(this, TextDecoderStreamPrototype); return this.#decoder.ignoreBOM; } /** @returns {ReadableStream<string>} */ get readable() { - webidl.assertBranded(this, TextDecoderStream); + webidl.assertBranded(this, TextDecoderStreamPrototype); return this.#transform.readable; } /** @returns {WritableStream<BufferSource>} */ get writable() { - webidl.assertBranded(this, TextDecoderStream); + webidl.assertBranded(this, TextDecoderStreamPrototype); return this.#transform.writable; } } webidl.configurePrototype(TextDecoderStream); + const TextDecoderStreamPrototype = TextDecoderStream.prototype; class TextEncoderStream { /** @type {string | null} */ @@ -332,24 +341,25 @@ /** @returns {string} */ get encoding() { - webidl.assertBranded(this, TextEncoderStream); + webidl.assertBranded(this, TextEncoderStreamPrototype); return "utf-8"; } /** @returns {ReadableStream<Uint8Array>} */ get readable() { - webidl.assertBranded(this, TextEncoderStream); + webidl.assertBranded(this, TextEncoderStreamPrototype); return this.#transform.readable; } /** @returns {WritableStream<string>} */ get writable() { - webidl.assertBranded(this, TextEncoderStream); + webidl.assertBranded(this, TextEncoderStreamPrototype); return this.#transform.writable; } } webidl.configurePrototype(TextEncoderStream); + const TextEncoderStreamPrototype = TextEncoderStream.prototype; webidl.converters.TextDecoderOptions = webidl.createDictionaryConverter( "TextDecoderOptions", diff --git a/ext/web/09_file.js b/ext/web/09_file.js index 289db22ec..fbc00326e 100644 --- a/ext/web/09_file.js +++ b/ext/web/09_file.js @@ -15,7 +15,7 @@ const core = window.Deno.core; const webidl = window.__bootstrap.webidl; const { - ArrayBuffer, + ArrayBufferPrototype, ArrayBufferPrototypeSlice, ArrayBufferIsView, ArrayPrototypePush, @@ -23,6 +23,7 @@ DatePrototypeGetTime, MathMax, MathMin, + ObjectPrototypeIsPrototypeOf, RegExpPrototypeTest, StringPrototypeCharAt, StringPrototypeToLowerCase, @@ -109,7 +110,7 @@ const processedParts = []; let size = 0; for (const element of parts) { - if (element instanceof ArrayBuffer) { + if (ObjectPrototypeIsPrototypeOf(ArrayBufferPrototype, element)) { const chunk = new Uint8Array(ArrayBufferPrototypeSlice(element, 0)); ArrayPrototypePush(processedParts, BlobReference.fromUint8Array(chunk)); size += element.byteLength; @@ -121,7 +122,7 @@ ); size += element.byteLength; ArrayPrototypePush(processedParts, BlobReference.fromUint8Array(chunk)); - } else if (element instanceof Blob) { + } else if (ObjectPrototypeIsPrototypeOf(BlobPrototype, element)) { ArrayPrototypePush(processedParts, element); size += element.size; } else if (typeof element === "string") { @@ -157,7 +158,7 @@ */ function getParts(blob, bag = []) { for (const part of blob[_parts]) { - if (part instanceof Blob) { + if (ObjectPrototypeIsPrototypeOf(BlobPrototype, part)) { getParts(part, bag); } else { ArrayPrototypePush(bag, part._id); @@ -204,13 +205,13 @@ /** @returns {number} */ get size() { - webidl.assertBranded(this, Blob); + webidl.assertBranded(this, BlobPrototype); return this[_size]; } /** @returns {string} */ get type() { - webidl.assertBranded(this, Blob); + webidl.assertBranded(this, BlobPrototype); return this[_type]; } @@ -221,7 +222,7 @@ * @returns {Blob} */ slice(start = undefined, end = undefined, contentType = undefined) { - webidl.assertBranded(this, Blob); + webidl.assertBranded(this, BlobPrototype); const prefix = "Failed to execute 'slice' on 'Blob'"; if (start !== undefined) { start = webidl.converters["long long"](start, { @@ -316,7 +317,7 @@ * @returns {ReadableStream<Uint8Array>} */ stream() { - webidl.assertBranded(this, Blob); + webidl.assertBranded(this, BlobPrototype); const partIterator = toIterator(this[_parts]); const stream = new ReadableStream({ type: "bytes", @@ -338,7 +339,7 @@ * @returns {Promise<string>} */ async text() { - webidl.assertBranded(this, Blob); + webidl.assertBranded(this, BlobPrototype); const buffer = await this.arrayBuffer(); return core.decode(new Uint8Array(buffer)); } @@ -347,7 +348,7 @@ * @returns {Promise<ArrayBuffer>} */ async arrayBuffer() { - webidl.assertBranded(this, Blob); + webidl.assertBranded(this, BlobPrototype); const stream = this.stream(); const bytes = new Uint8Array(this.size); let offset = 0; @@ -361,7 +362,7 @@ [SymbolFor("Deno.customInspect")](inspect) { return inspect(consoleInternal.createFilteredInspectProxy({ object: this, - evaluate: this instanceof Blob, + evaluate: ObjectPrototypeIsPrototypeOf(BlobPrototype, this), keys: [ "size", "type", @@ -371,15 +372,22 @@ } webidl.configurePrototype(Blob); + const BlobPrototype = Blob.prototype; - webidl.converters["Blob"] = webidl.createInterfaceConverter("Blob", Blob); + webidl.converters["Blob"] = webidl.createInterfaceConverter( + "Blob", + Blob.prototype, + ); webidl.converters["BlobPart"] = (V, opts) => { // Union for ((ArrayBuffer or ArrayBufferView) or Blob or USVString) if (typeof V == "object") { - if (V instanceof Blob) { + if (ObjectPrototypeIsPrototypeOf(BlobPrototype, V)) { return webidl.converters["Blob"](V, opts); } - if (V instanceof ArrayBuffer || V instanceof SharedArrayBuffer) { + if ( + ObjectPrototypeIsPrototypeOf(ArrayBufferPrototype, V) || + ObjectPrototypeIsPrototypeOf(SharedArrayBuffer.prototype, V) + ) { return webidl.converters["ArrayBuffer"](V, opts); } if (ArrayBufferIsView(V)) { @@ -458,18 +466,19 @@ /** @returns {string} */ get name() { - webidl.assertBranded(this, File); + webidl.assertBranded(this, FilePrototype); return this[_Name]; } /** @returns {number} */ get lastModified() { - webidl.assertBranded(this, File); + webidl.assertBranded(this, FilePrototype); return this[_LastModified]; } } webidl.configurePrototype(File); + const FilePrototype = File.prototype; webidl.converters["FilePropertyBag"] = webidl.createDictionaryConverter( "FilePropertyBag", @@ -593,6 +602,8 @@ blobFromObjectUrl, getParts, Blob, + BlobPrototype, File, + FilePrototype, }; })(this); diff --git a/ext/web/10_filereader.js b/ext/web/10_filereader.js index 294d96ebd..039d3395d 100644 --- a/ext/web/10_filereader.js +++ b/ext/web/10_filereader.js @@ -28,12 +28,14 @@ MapPrototypeGet, MapPrototypeSet, ObjectDefineProperty, + ObjectPrototypeIsPrototypeOf, queueMicrotask, StringFromCodePoint, Symbol, TypedArrayPrototypeSet, TypeError, Uint8Array, + Uint8ArrayPrototype, } = window.__bootstrap.primordials; const state = Symbol("[[state]]"); @@ -116,7 +118,10 @@ // 4. If chunkPromise is fulfilled with an object whose done property is false // and whose value property is a Uint8Array object, run these steps: - if (!chunk.done && chunk.value instanceof Uint8Array) { + if ( + !chunk.done && + ObjectPrototypeIsPrototypeOf(Uint8ArrayPrototype, chunk.value) + ) { ArrayPrototypePush(chunks, chunk.value); // TODO(bartlomieju): (only) If roughly 50ms have passed since last progress @@ -260,7 +265,7 @@ } #getEventHandlerFor(name) { - webidl.assertBranded(this, FileReader); + webidl.assertBranded(this, FileReaderPrototype); const maybeMap = this[handlerSymbol]; if (!maybeMap) return null; @@ -269,7 +274,7 @@ } #setEventHandlerFor(name, value) { - webidl.assertBranded(this, FileReader); + webidl.assertBranded(this, FileReaderPrototype); if (!this[handlerSymbol]) { this[handlerSymbol] = new Map(); @@ -292,7 +297,7 @@ /** @returns {number} */ get readyState() { - webidl.assertBranded(this, FileReader); + webidl.assertBranded(this, FileReaderPrototype); switch (this[state]) { case "empty": return FileReader.EMPTY; @@ -306,17 +311,17 @@ } get result() { - webidl.assertBranded(this, FileReader); + webidl.assertBranded(this, FileReaderPrototype); return this[result]; } get error() { - webidl.assertBranded(this, FileReader); + webidl.assertBranded(this, FileReaderPrototype); return this[error]; } abort() { - webidl.assertBranded(this, FileReader); + webidl.assertBranded(this, FileReaderPrototype); // If context object's state is "empty" or if context object's state is "done" set context object's result to null and terminate this algorithm. if ( this[state] === "empty" || @@ -349,7 +354,7 @@ /** @param {Blob} blob */ readAsArrayBuffer(blob) { - webidl.assertBranded(this, FileReader); + webidl.assertBranded(this, FileReaderPrototype); const prefix = "Failed to execute 'readAsArrayBuffer' on 'FileReader'"; webidl.requiredArguments(arguments.length, 1, { prefix }); this.#readOperation(blob, { kind: "ArrayBuffer" }); @@ -357,7 +362,7 @@ /** @param {Blob} blob */ readAsBinaryString(blob) { - webidl.assertBranded(this, FileReader); + webidl.assertBranded(this, FileReaderPrototype); const prefix = "Failed to execute 'readAsBinaryString' on 'FileReader'"; webidl.requiredArguments(arguments.length, 1, { prefix }); // alias for readAsArrayBuffer @@ -366,7 +371,7 @@ /** @param {Blob} blob */ readAsDataURL(blob) { - webidl.assertBranded(this, FileReader); + webidl.assertBranded(this, FileReaderPrototype); const prefix = "Failed to execute 'readAsDataURL' on 'FileReader'"; webidl.requiredArguments(arguments.length, 1, { prefix }); // alias for readAsArrayBuffer @@ -378,7 +383,7 @@ * @param {string} [encoding] */ readAsText(blob, encoding = undefined) { - webidl.assertBranded(this, FileReader); + webidl.assertBranded(this, FileReaderPrototype); const prefix = "Failed to execute 'readAsText' on 'FileReader'"; webidl.requiredArguments(arguments.length, 1, { prefix }); if (encoding !== undefined) { @@ -435,6 +440,7 @@ } webidl.configurePrototype(FileReader); + const FileReaderPrototype = FileReader.prototype; ObjectDefineProperty(FileReader, "EMPTY", { writable: false, diff --git a/ext/web/13_message_port.js b/ext/web/13_message_port.js index ef332dd7a..8242f85f3 100644 --- a/ext/web/13_message_port.js +++ b/ext/web/13_message_port.js @@ -10,19 +10,21 @@ ((window) => { const core = window.Deno.core; - const { Interrupted } = core; + const { InterruptedPrototype } = core; const webidl = window.__bootstrap.webidl; const { setEventTargetData } = window.__bootstrap.eventTarget; const { defineEventHandler } = window.__bootstrap.event; const { DOMException } = window.__bootstrap.domException; const { - ArrayBuffer, + ArrayBufferPrototype, ArrayPrototypeFilter, ArrayPrototypeIncludes, ArrayPrototypePush, + ObjectPrototypeIsPrototypeOf, ObjectSetPrototypeOf, Symbol, SymbolFor, + SymbolIterator, TypeError, WeakSet, WeakSetPrototypeAdd, @@ -45,12 +47,12 @@ } get port1() { - webidl.assertBranded(this, MessageChannel); + webidl.assertBranded(this, MessageChannelPrototype); return this.#port1; } get port2() { - webidl.assertBranded(this, MessageChannel); + webidl.assertBranded(this, MessageChannelPrototype); return this.#port2; } @@ -62,6 +64,7 @@ } webidl.configurePrototype(MessageChannel); + const MessageChannelPrototype = MessageChannel.prototype; const _id = Symbol("id"); const _enabled = Symbol("enabled"); @@ -72,7 +75,7 @@ */ function createMessagePort(id) { const port = core.createHostObject(); - ObjectSetPrototypeOf(port, MessagePort.prototype); + ObjectSetPrototypeOf(port, MessagePortPrototype); port[webidl.brand] = webidl.brand; setEventTargetData(port); port[_id] = id; @@ -95,7 +98,7 @@ * @param {object[] | StructuredSerializeOptions} transferOrOptions */ postMessage(message, transferOrOptions = {}) { - webidl.assertBranded(this, MessagePort); + webidl.assertBranded(this, MessagePortPrototype); const prefix = "Failed to execute 'postMessage' on 'MessagePort'"; webidl.requiredArguments(arguments.length, 1, { prefix }); message = webidl.converters.any(message); @@ -103,7 +106,7 @@ if ( webidl.type(transferOrOptions) === "Object" && transferOrOptions !== undefined && - transferOrOptions[Symbol.iterator] !== undefined + transferOrOptions[SymbolIterator] !== undefined ) { const transfer = webidl.converters["sequence<object>"]( transferOrOptions, @@ -129,7 +132,7 @@ } start() { - webidl.assertBranded(this, MessagePort); + webidl.assertBranded(this, MessagePortPrototype); if (this[_enabled]) return; (async () => { this[_enabled] = true; @@ -142,7 +145,7 @@ this[_id], ); } catch (err) { - if (err instanceof Interrupted) break; + if (ObjectPrototypeIsPrototypeOf(InterruptedPrototype, err)) break; throw err; } if (data === null) break; @@ -160,7 +163,7 @@ data: message, ports: ArrayPrototypeFilter( transferables, - (t) => t instanceof MessagePort, + (t) => ObjectPrototypeIsPrototypeOf(MessagePortPrototype, t), ), }); this.dispatchEvent(event); @@ -170,7 +173,7 @@ } close() { - webidl.assertBranded(this, MessagePort); + webidl.assertBranded(this, MessagePortPrototype); if (this[_id] !== null) { core.close(this[_id]); this[_id] = null; @@ -184,6 +187,7 @@ defineEventHandler(MessagePort.prototype, "messageerror"); webidl.configurePrototype(MessagePort); + const MessagePortPrototype = MessagePort.prototype; /** * @returns {[number, number]} @@ -245,7 +249,7 @@ function serializeJsMessageData(data, transferables) { const transferedArrayBuffers = ArrayPrototypeFilter( transferables, - (a) => a instanceof ArrayBuffer, + (a) => ObjectPrototypeIsPrototypeOf(ArrayBufferPrototype, a), ); for (const arrayBuffer of transferedArrayBuffers) { @@ -266,7 +270,7 @@ serializedData = core.serialize(data, { hostObjects: ArrayPrototypeFilter( transferables, - (a) => a instanceof MessagePort, + (a) => ObjectPrototypeIsPrototypeOf(MessagePortPrototype, a), ), transferedArrayBuffers, }); @@ -279,8 +283,8 @@ let arrayBufferI = 0; for (const transferable of transferables) { - if (transferable instanceof MessagePort) { - webidl.assertBranded(transferable, MessagePort); + if (ObjectPrototypeIsPrototypeOf(MessagePortPrototype, transferable)) { + webidl.assertBranded(transferable, MessagePortPrototype); const id = transferable[_id]; if (id === null) { throw new DOMException( @@ -293,7 +297,9 @@ kind: "messagePort", data: id, }); - } else if (transferable instanceof ArrayBuffer) { + } else if ( + ObjectPrototypeIsPrototypeOf(ArrayBufferPrototype, transferable) + ) { ArrayPrototypePush(serializedTransferables, { kind: "arrayBuffer", data: transferedArrayBuffers[arrayBufferI], @@ -339,6 +345,7 @@ window.__bootstrap.messagePort = { MessageChannel, MessagePort, + MessagePortPrototype, deserializeJsMessageData, serializeJsMessageData, structuredClone, diff --git a/ext/web/14_compression.js b/ext/web/14_compression.js index 1a0f77e66..081495894 100644 --- a/ext/web/14_compression.js +++ b/ext/web/14_compression.js @@ -53,17 +53,18 @@ } get readable() { - webidl.assertBranded(this, CompressionStream); + webidl.assertBranded(this, CompressionStreamPrototype); return this.#transform.readable; } get writable() { - webidl.assertBranded(this, CompressionStream); + webidl.assertBranded(this, CompressionStreamPrototype); return this.#transform.writable; } } webidl.configurePrototype(CompressionStream); + const CompressionStreamPrototype = CompressionStream.prototype; class DecompressionStream { #transform; @@ -98,12 +99,12 @@ } get readable() { - webidl.assertBranded(this, DecompressionStream); + webidl.assertBranded(this, DecompressionStreamPrototype); return this.#transform.readable; } get writable() { - webidl.assertBranded(this, DecompressionStream); + webidl.assertBranded(this, DecompressionStreamPrototype); return this.#transform.writable; } } @@ -115,6 +116,7 @@ } webidl.configurePrototype(DecompressionStream); + const DecompressionStreamPrototype = DecompressionStream.prototype; window.__bootstrap.compression = { CompressionStream, |