// META: global=window,worker // META: script=../resources/rs-utils.js 'use strict'; // Prior to whatwg/stream#870 it was possible to construct a ReadableStreamBYOBRequest directly. This made it possible // to construct requests that were out-of-sync with the state of the ReadableStream. They could then be used to call // internal operations, resulting in asserts or bad behaviour. This file contains regression tests for the change. function getRealByteStreamController() { let controller; new ReadableStream({ start(c) { controller = c; }, type: 'bytes' }); return controller; } // Create an object pretending to have prototype |prototype|, of type |type|. |type| is one of "undefined", "null", // "fake", or "real". "real" will call the realObjectCreator function to get a real instance of the object. function createDummyObject(prototype, type, realObjectCreator) { switch (type) { case 'undefined': return undefined; case 'null': return null; case 'fake': return Object.create(prototype); case 'real': return realObjectCreator(); } throw new Error('not reached'); } const dummyTypes = ['undefined', 'null', 'fake', 'real']; for (const controllerType of dummyTypes) { const controller = createDummyObject(ReadableByteStreamController.prototype, controllerType, getRealByteStreamController); for (const viewType of dummyTypes) { const view = createDummyObject(Uint8Array.prototype, viewType, () => new Uint8Array(16)); test(() => { assert_throws_js(TypeError, () => new ReadableStreamBYOBRequest(controller, view), 'constructor should throw'); }, `ReadableStreamBYOBRequest constructor should throw when passed a ${controllerType} ` + `ReadableByteStreamController and a ${viewType} view`); } }