gecko-dev/testing/web-platform/tests/fetch/api/basic/stream-safe-creation.any.js
Adam Rice c10cf10f1a Bug 1481720 [wpt PR 12350] - [Fetch] Object.prototype shouldn't interfere with fetch streams, a=testonly
Automatic update from web-platform-testsFetch: Object.prototype shouldn't interfere with fetch streams

Test that setting Object.prototype.start to a function that throws
doesn't interfere with fetch operations that create a stream. Similarly,
verify that setting throwing accessors for 'type', 'size', and
'highWaterMark' doesn't cause problems.

See https://github.com/whatwg/fetch/pull/781 for background.
--

wpt-commits: ba582388f4506ea2c8341dac4d8ce6e5eb39871b
wpt-pr: 12350
2018-09-25 15:45:42 +01:00

54 lines
2.1 KiB
JavaScript

// 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}'`);
}