construct-byob-request.any.js (1889B)
1 // META: global=window,worker,shadowrealm 2 // META: script=../resources/rs-utils.js 3 'use strict'; 4 5 // Prior to whatwg/stream#870 it was possible to construct a ReadableStreamBYOBRequest directly. This made it possible 6 // to construct requests that were out-of-sync with the state of the ReadableStream. They could then be used to call 7 // internal operations, resulting in asserts or bad behaviour. This file contains regression tests for the change. 8 9 function getRealByteStreamController() { 10 let controller; 11 new ReadableStream({ 12 start(c) { 13 controller = c; 14 }, 15 type: 'bytes' 16 }); 17 return controller; 18 } 19 20 // Create an object pretending to have prototype |prototype|, of type |type|. |type| is one of "undefined", "null", 21 // "fake", or "real". "real" will call the realObjectCreator function to get a real instance of the object. 22 function createDummyObject(prototype, type, realObjectCreator) { 23 switch (type) { 24 case 'undefined': 25 return undefined; 26 27 case 'null': 28 return null; 29 30 case 'fake': 31 return Object.create(prototype); 32 33 case 'real': 34 return realObjectCreator(); 35 } 36 37 throw new Error('not reached'); 38 } 39 40 const dummyTypes = ['undefined', 'null', 'fake', 'real']; 41 42 for (const controllerType of dummyTypes) { 43 const controller = createDummyObject(ReadableByteStreamController.prototype, controllerType, 44 getRealByteStreamController); 45 for (const viewType of dummyTypes) { 46 const view = createDummyObject(Uint8Array.prototype, viewType, () => new Uint8Array(16)); 47 test(() => { 48 assert_throws_js(TypeError, () => new ReadableStreamBYOBRequest(controller, view), 49 'constructor should throw'); 50 }, `ReadableStreamBYOBRequest constructor should throw when passed a ${controllerType} ` + 51 `ReadableByteStreamController and a ${viewType} view`); 52 } 53 }