blob: 180d338659021fed3d29e08ccea415cc5852fed2 [file] [log] [blame]
// META: global=worker
// These tests verify that stream creation is not affected by changes to
// Object.prototype.
const creationCases = {
fetch: async () => fetch(location.href),
request: () => new Request(location.href, {method: 'POST', body: 'hi'}),
response: () => new Response('bye'),
consumeEmptyResponse: () => new Response().text(),
consumeNonEmptyResponse: () => new Response(new Uint8Array([64])).text(),
consumeEmptyRequest: () => new Request(location.href).text(),
consumeNonEmptyRequest: () => new Request(location.href,
{method: 'POST', body: 'yes'}).arrayBuffer(),
};
for (creationCase of Object.keys(creationCases)) {
for (accessorName of ['start', 'type', 'size', 'highWaterMark']) {
promise_test(async t => {
Object.defineProperty(Object.prototype, accessorName, {
get() { throw Error(`Object.prototype.${accessorName} was accessed`); },
configurable: true
});
t.add_cleanup(() => {
delete Object.prototype[accessorName];
return Promise.resolve();
});
await creationCases[creationCase]();
}, `throwing Object.prototype.${accessorName} accessor should not affect ` +
`stream creation by '${creationCase}'`);
promise_test(async t => {
// -1 is a convenient value which is invalid, and should cause the
// constructor to throw, for all four fields.
Object.prototype[accessorName] = -1;
t.add_cleanup(() => {
delete Object.prototype[accessorName];
return Promise.resolve();
});
await creationCases[creationCase]();
}, `Object.prototype.${accessorName} accessor returning invalid value ` +
`should not affect stream creation by '${creationCase}'`);
}
promise_test(async t => {
Object.prototype.start = controller => controller.error(new Error('start'));
t.add_cleanup(() => {
delete Object.prototype.start;
return Promise.resolve();
});
await creationCases[creationCase]();
}, `Object.prototype.start function which errors the stream should not ` +
`affect stream creation by '${creationCase}'`);
}