mirror of
https://github.com/servo/servo.git
synced 2025-08-18 11:55:39 +01:00
Update web-platform-tests to revision 8a2ceb5f18911302b7a5c1cd2791f4ab50ad4326
This commit is contained in:
parent
462c272380
commit
1f531f66ea
5377 changed files with 174916 additions and 84369 deletions
|
@ -0,0 +1,11 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>brand-checks.js dedicated worker wrapper file</title>
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
fetch_tests_from_worker(new Worker('brand-checks.js'));
|
||||
</script>
|
|
@ -0,0 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>brand-checks.js browser context wrapper file</title>
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<script src="../resources/test-utils.js"></script>
|
||||
|
||||
<script src="brand-checks.js"></script>
|
|
@ -0,0 +1,194 @@
|
|||
'use strict';
|
||||
|
||||
if (self.importScripts) {
|
||||
self.importScripts('../resources/test-utils.js');
|
||||
self.importScripts('/resources/testharness.js');
|
||||
}
|
||||
|
||||
let ReadableStreamBYOBReader;
|
||||
let ReadableByteStreamController;
|
||||
|
||||
test(() => {
|
||||
|
||||
// It's not exposed globally, but we test a few of its properties here.
|
||||
ReadableStreamBYOBReader = realRSBYOBReader().constructor;
|
||||
|
||||
assert_equals(ReadableStreamBYOBReader.name, 'ReadableStreamBYOBReader', 'ReadableStreamBYOBReader should be set');
|
||||
|
||||
}, 'Can get the ReadableStreamBYOBReader constructor indirectly');
|
||||
|
||||
test(() => {
|
||||
|
||||
// It's not exposed globally, but we test a few of its properties here.
|
||||
ReadableByteStreamController = realRBSController().constructor;
|
||||
|
||||
assert_equals(ReadableByteStreamController.name, 'ReadableByteStreamController',
|
||||
'ReadableByteStreamController should be set');
|
||||
|
||||
}, 'Can get the ReadableByteStreamController constructor indirectly');
|
||||
|
||||
function fakeRS() {
|
||||
return Object.setPrototypeOf({
|
||||
cancel() { return Promise.resolve(); },
|
||||
getReader() { return realRSBYOBReader(); },
|
||||
pipeThrough(obj) { return obj.readable; },
|
||||
pipeTo() { return Promise.resolve(); },
|
||||
tee() { return [realRS(), realRS()]; }
|
||||
}, ReadableStream.prototype);
|
||||
}
|
||||
|
||||
function realRS() {
|
||||
return new ReadableStream();
|
||||
}
|
||||
|
||||
function fakeRSBYOBReader() {
|
||||
return Object.setPrototypeOf({
|
||||
get closed() { return Promise.resolve(); },
|
||||
cancel() { return Promise.resolve(); },
|
||||
read() { return Promise.resolve({ value: undefined, done: true }); },
|
||||
releaseLock() { return; }
|
||||
}, ReadableStreamBYOBReader.prototype);
|
||||
}
|
||||
|
||||
function realRSBYOBReader() {
|
||||
return new ReadableStream({ type: 'bytes' }).getReader({ mode: 'byob' });
|
||||
}
|
||||
|
||||
function fakeRBSController() {
|
||||
return Object.setPrototypeOf({
|
||||
close() { },
|
||||
enqueue() { },
|
||||
error() { }
|
||||
}, ReadableByteStreamController.prototype);
|
||||
}
|
||||
|
||||
function realRBSController() {
|
||||
let controller;
|
||||
new ReadableStream({
|
||||
start(c) {
|
||||
controller = c;
|
||||
},
|
||||
type: 'bytes'
|
||||
});
|
||||
return controller;
|
||||
}
|
||||
|
||||
test(() => {
|
||||
|
||||
assert_throws(new TypeError(), () => new ReadableStreamBYOBReader(fakeRS()), 'constructor should throw');
|
||||
|
||||
}, 'ReadableStreamBYOBReader enforces a brand check on its argument');
|
||||
|
||||
promise_test(t => {
|
||||
|
||||
return getterRejectsForAll(t, ReadableStreamBYOBReader.prototype, 'closed',
|
||||
[fakeRSBYOBReader(), realRS(), realRBSController(), undefined, null]);
|
||||
|
||||
}, 'ReadableStreamBYOBReader.prototype.closed enforces a brand check');
|
||||
|
||||
promise_test(t => {
|
||||
|
||||
return methodRejectsForAll(t, ReadableStreamBYOBReader.prototype, 'cancel',
|
||||
[fakeRSBYOBReader(), realRS(), realRBSController(), undefined, null]);
|
||||
|
||||
}, 'ReadableStreamBYOBReader.prototype.cancel enforces a brand check');
|
||||
|
||||
promise_test(t => {
|
||||
|
||||
return methodRejectsForAll(t, ReadableStreamBYOBReader.prototype, 'read',
|
||||
[fakeRSBYOBReader(), realRS(), realRBSController(), undefined, null], [new Uint8Array(1)]);
|
||||
|
||||
}, 'ReadableStreamBYOBReader.prototype.read enforces a brand check');
|
||||
|
||||
test(() => {
|
||||
|
||||
methodThrowsForAll(ReadableStreamBYOBReader.prototype, 'releaseLock',
|
||||
[fakeRSBYOBReader(), realRS(), realRBSController(), undefined, null]);
|
||||
|
||||
}, 'ReadableStreamBYOBReader.prototype.releaseLock enforces a brand check');
|
||||
|
||||
test(() => {
|
||||
|
||||
assert_throws(new TypeError(), () => new ReadableByteStreamController(fakeRS()),
|
||||
'Constructing a ReadableByteStreamController should throw');
|
||||
|
||||
}, 'ReadableByteStreamController enforces a brand check on its arguments');
|
||||
|
||||
test(() => {
|
||||
|
||||
assert_throws(new TypeError(), () => new ReadableByteStreamController(realRS()),
|
||||
'Constructing a ReadableByteStreamController should throw');
|
||||
|
||||
}, 'ReadableByteStreamController can\'t be given a fully-constructed ReadableStream');
|
||||
|
||||
test(() => {
|
||||
|
||||
getterThrowsForAll(ReadableByteStreamController.prototype, 'byobRequest',
|
||||
[fakeRBSController(), realRS(), realRSBYOBReader(), undefined, null]);
|
||||
|
||||
}, 'ReadableByteStreamController.prototype.byobRequest enforces a brand check');
|
||||
|
||||
test(() => {
|
||||
|
||||
methodThrowsForAll(ReadableByteStreamController.prototype, 'close',
|
||||
[fakeRBSController(), realRS(), realRSBYOBReader(), undefined, null]);
|
||||
|
||||
}, 'ReadableByteStreamController.prototype.close enforces a brand check');
|
||||
|
||||
test(() => {
|
||||
|
||||
methodThrowsForAll(ReadableByteStreamController.prototype, 'enqueue',
|
||||
[fakeRBSController(), realRS(), realRSBYOBReader(), undefined, null], [new Uint8Array(1)]);
|
||||
|
||||
}, 'ReadableByteStreamController.prototype.enqueue enforces a brand check');
|
||||
|
||||
test(() => {
|
||||
|
||||
methodThrowsForAll(ReadableByteStreamController.prototype, 'error',
|
||||
[fakeRBSController(), realRS(), realRSBYOBReader(), undefined, null]);
|
||||
|
||||
}, 'ReadableByteStreamController.prototype.error enforces a brand check');
|
||||
|
||||
// ReadableStreamBYOBRequest can only be accessed asynchronously, so cram everything into one test.
|
||||
promise_test(t => {
|
||||
|
||||
let ReadableStreamBYOBRequest;
|
||||
const rs = new ReadableStream({
|
||||
pull(controller) {
|
||||
return t.step(() => {
|
||||
const byobRequest = controller.byobRequest;
|
||||
ReadableStreamBYOBRequest = byobRequest.constructor;
|
||||
brandChecks();
|
||||
byobRequest.respond(1);
|
||||
});
|
||||
},
|
||||
type: 'bytes'
|
||||
});
|
||||
const reader = rs.getReader({ mode: 'byob' });
|
||||
return reader.read(new Uint8Array(1));
|
||||
|
||||
function fakeRSBYOBRequest() {
|
||||
return Object.setPrototypeOf({
|
||||
get view() {},
|
||||
respond() {},
|
||||
respondWithNewView() {}
|
||||
}, ReadableStreamBYOBRequest.prototype);
|
||||
}
|
||||
|
||||
function brandChecks() {
|
||||
for (const badController of [fakeRBSController(), realRS(), realRSBYOBReader(), undefined, null]) {
|
||||
assert_throws(new TypeError(), () => new ReadableStreamBYOBRequest(badController, new Uint8Array(1)),
|
||||
'ReadableStreamBYOBRequest constructor must throw for an invalid controller argument');
|
||||
}
|
||||
getterThrowsForAll(ReadableStreamBYOBRequest.prototype, 'view',
|
||||
[fakeRSBYOBRequest(), realRS(), realRSBYOBReader(), realRBSController(), undefined, null]);
|
||||
methodThrowsForAll(ReadableStreamBYOBRequest.prototype, 'respond',
|
||||
[fakeRSBYOBRequest(), realRS(), realRSBYOBReader(), realRBSController(), undefined, null], [1]);
|
||||
methodThrowsForAll(ReadableStreamBYOBRequest.prototype, 'respondWithNewView',
|
||||
[fakeRSBYOBRequest(), realRS(), realRSBYOBReader(), realRBSController(), undefined, null],
|
||||
[new Uint8Array(1)]);
|
||||
}
|
||||
|
||||
}, 'ReadableStreamBYOBRequest enforces brand checks');
|
||||
|
||||
done();
|
|
@ -0,0 +1,12 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>brand-checks.js service worker wrapper file</title>
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
service_worker_test('brand-checks.js', 'Service worker test setup');
|
||||
</script>
|
|
@ -0,0 +1,11 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>brand-checks.js shared worker wrapper file</title>
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
fetch_tests_from_worker(new SharedWorker('brand-checks.js'));
|
||||
</script>
|
|
@ -0,0 +1,11 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>detached-buffers.js dedicated worker wrapper file</title>
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
fetch_tests_from_worker(new Worker('detached-buffers.js'));
|
||||
</script>
|
|
@ -0,0 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>detached-buffers.js browser context wrapper file</title>
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
|
||||
|
||||
<script src="detached-buffers.js"></script>
|
|
@ -0,0 +1,156 @@
|
|||
'use strict';
|
||||
|
||||
if (self.importScripts) {
|
||||
self.importScripts('/resources/testharness.js');
|
||||
}
|
||||
|
||||
promise_test(() => {
|
||||
const stream = new ReadableStream({
|
||||
start(c) {
|
||||
c.close();
|
||||
},
|
||||
type: 'bytes'
|
||||
});
|
||||
|
||||
const reader = stream.getReader({ mode: 'byob' });
|
||||
const view = new Uint8Array([1, 2, 3]);
|
||||
return reader.read(view).then(({ value, done }) => {
|
||||
// Sanity checks
|
||||
assert_true(value instanceof Uint8Array, 'The value read must be a Uint8Array');
|
||||
assert_not_equals(value, view, 'The value read must not be the *same* Uint8Array');
|
||||
assert_array_equals(value, [], 'The value read must be an empty Uint8Array, since the stream is closed');
|
||||
assert_true(done, 'done must be true, since the stream is closed');
|
||||
|
||||
// The important assertions
|
||||
assert_not_equals(value.buffer, view.buffer, 'a different ArrayBuffer must underlie the value');
|
||||
assert_equals(view.buffer.byteLength, 0, 'the original buffer must be detached');
|
||||
});
|
||||
}, 'ReadableStream with byte source: read()ing from a closed stream still transfers the buffer');
|
||||
|
||||
promise_test(() => {
|
||||
const stream = new ReadableStream({
|
||||
start(c) {
|
||||
c.enqueue(new Uint8Array([1, 2, 3]));
|
||||
},
|
||||
type: 'bytes'
|
||||
});
|
||||
|
||||
const reader = stream.getReader({ mode: 'byob' });
|
||||
const view = new Uint8Array([4, 5, 6]);
|
||||
return reader.read(view).then(({ value, done }) => {
|
||||
// Sanity checks
|
||||
assert_true(value instanceof Uint8Array, 'The value read must be a Uint8Array');
|
||||
assert_not_equals(value, view, 'The value read must not be the *same* Uint8Array');
|
||||
assert_array_equals(value, [1, 2, 3], 'The value read must be the enqueued Uint8Array, not the original values');
|
||||
assert_false(done, 'done must be false, since the stream is not closed');
|
||||
|
||||
// The important assertions
|
||||
assert_not_equals(value.buffer, view.buffer, 'a different ArrayBuffer must underlie the value');
|
||||
assert_equals(view.buffer.byteLength, 0, 'the original buffer must be detached');
|
||||
});
|
||||
}, 'ReadableStream with byte source: read()ing from a stream with queued chunks still transfers the buffer');
|
||||
|
||||
test(() => {
|
||||
const stream = new ReadableStream({
|
||||
start(c) {
|
||||
const view = new Uint8Array([1, 2, 3]);
|
||||
c.enqueue(view);
|
||||
assert_throws(new TypeError(), () => c.enqueue(view), 'enqueuing an already-detached buffer must throw');
|
||||
},
|
||||
type: 'bytes'
|
||||
});
|
||||
}, 'ReadableStream with byte source: enqueuing an already-detached buffer throws');
|
||||
|
||||
promise_test(t => {
|
||||
const stream = new ReadableStream({
|
||||
start(c) {
|
||||
c.enqueue(new Uint8Array([1, 2, 3]));
|
||||
},
|
||||
type: 'bytes'
|
||||
});
|
||||
const reader = stream.getReader({ mode: 'byob' });
|
||||
|
||||
const view = new Uint8Array([4, 5, 6]);
|
||||
return reader.read(view).then(() => {
|
||||
// view is now detached
|
||||
return promise_rejects(t, new TypeError(), reader.read(view),
|
||||
'read(view) must reject when given an already-detached buffer');
|
||||
});
|
||||
}, 'ReadableStream with byte source: reading into an already-detached buffer rejects');
|
||||
|
||||
async_test(t => {
|
||||
const stream = new ReadableStream({
|
||||
pull: t.step_func_done(c => {
|
||||
// Detach it by reading into it
|
||||
reader.read(c.byobRequest.view);
|
||||
|
||||
assert_throws(new TypeError(), () => c.byobRequest.respond(1),
|
||||
'respond() must throw if the corresponding view has become detached');
|
||||
}),
|
||||
type: 'bytes'
|
||||
});
|
||||
const reader = stream.getReader({ mode: 'byob' });
|
||||
|
||||
reader.read(new Uint8Array([4, 5, 6]));
|
||||
}, 'ReadableStream with byte source: respond() throws if the BYOB request\'s buffer has been detached (in the ' +
|
||||
'readable state)');
|
||||
|
||||
async_test(t => {
|
||||
const stream = new ReadableStream({
|
||||
pull: t.step_func_done(c => {
|
||||
// Detach it by reading into it
|
||||
reader.read(c.byobRequest.view);
|
||||
|
||||
c.close();
|
||||
|
||||
assert_throws(new TypeError(), () => c.byobRequest.respond(0),
|
||||
'respond() must throw if the corresponding view has become detached');
|
||||
}),
|
||||
type: 'bytes'
|
||||
});
|
||||
const reader = stream.getReader({ mode: 'byob' });
|
||||
|
||||
reader.read(new Uint8Array([4, 5, 6]));
|
||||
}, 'ReadableStream with byte source: respond() throws if the BYOB request\'s buffer has been detached (in the ' +
|
||||
'closed state)');
|
||||
|
||||
async_test(t => {
|
||||
const stream = new ReadableStream({
|
||||
pull: t.step_func_done(c => {
|
||||
// Detach it by reading into it
|
||||
const view = new Uint8Array([1, 2, 3]);
|
||||
reader.read(view);
|
||||
|
||||
assert_throws(new TypeError(), () => c.byobRequest.respondWithNewView(view),
|
||||
'respondWithNewView() must throw if passed a detached view');
|
||||
}),
|
||||
type: 'bytes'
|
||||
});
|
||||
const reader = stream.getReader({ mode: 'byob' });
|
||||
|
||||
reader.read(new Uint8Array([4, 5, 6]));
|
||||
}, 'ReadableStream with byte source: respondWithNewView() throws if the supplied view\'s buffer has been detached ' +
|
||||
'(in the readable state)');
|
||||
|
||||
async_test(t => {
|
||||
const stream = new ReadableStream({
|
||||
pull: t.step_func_done(c => {
|
||||
// Detach it by reading into it
|
||||
const view = new Uint8Array([1, 2, 3]);
|
||||
reader.read(view);
|
||||
|
||||
c.close();
|
||||
|
||||
const zeroLengthView = new Uint8Array(view.buffer, 0, 0);
|
||||
assert_throws(new TypeError(), () => c.byobRequest.respondWithNewView(zeroLengthView),
|
||||
'respondWithNewView() must throw if passed a (zero-length) view whose buffer has been detached');
|
||||
}),
|
||||
type: 'bytes'
|
||||
});
|
||||
const reader = stream.getReader({ mode: 'byob' });
|
||||
|
||||
reader.read(new Uint8Array([4, 5, 6]));
|
||||
}, 'ReadableStream with byte source: respondWithNewView() throws if the supplied view\'s buffer has been detached ' +
|
||||
'(in the closed state)');
|
||||
|
||||
done();
|
|
@ -0,0 +1,12 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>detached-buffers.js service worker wrapper file</title>
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
service_worker_test('detached-buffers.js', 'Service worker test setup');
|
||||
</script>
|
|
@ -0,0 +1,11 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>detached-buffers.js shared worker wrapper file</title>
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
fetch_tests_from_worker(new SharedWorker('detached-buffers.js'));
|
||||
</script>
|
|
@ -1906,7 +1906,7 @@ promise_test(() => {
|
|||
start(c) {
|
||||
controller = c;
|
||||
},
|
||||
type: "bytes"
|
||||
type: 'bytes'
|
||||
});
|
||||
|
||||
const readPromise = rs.getReader().read();
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>properties.js dedicated worker wrapper file</title>
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
fetch_tests_from_worker(new Worker('properties.js'));
|
||||
</script>
|
|
@ -0,0 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>properties.js browser context wrapper file</title>
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<script src="../resources/rs-utils.js"></script>
|
||||
|
||||
<script src="properties.js"></script>
|
|
@ -0,0 +1,147 @@
|
|||
'use strict';
|
||||
|
||||
if (self.importScripts) {
|
||||
self.importScripts('../resources/rs-utils.js');
|
||||
self.importScripts('/resources/testharness.js');
|
||||
}
|
||||
|
||||
let ReadableStreamBYOBReader;
|
||||
|
||||
test(() => {
|
||||
|
||||
// It's not exposed globally, but we test a few of its properties here.
|
||||
ReadableStreamBYOBReader = (new ReadableStream({ type: 'bytes' }))
|
||||
.getReader({ mode: 'byob' }).constructor;
|
||||
|
||||
}, 'Can get the ReadableStreamBYOBReader constructor indirectly');
|
||||
|
||||
test(() => {
|
||||
|
||||
assert_throws(new TypeError(), () => new ReadableStreamBYOBReader('potato'));
|
||||
assert_throws(new TypeError(), () => new ReadableStreamBYOBReader({}));
|
||||
assert_throws(new TypeError(), () => new ReadableStreamBYOBReader());
|
||||
|
||||
}, 'ReadableStreamBYOBReader constructor should get a ReadableStream object as argument');
|
||||
|
||||
test(() => {
|
||||
|
||||
const methods = ['cancel', 'constructor', 'read', 'releaseLock'];
|
||||
const properties = methods.concat(['closed']).sort();
|
||||
|
||||
const rsReader = new ReadableStreamBYOBReader(new ReadableStream({ type: 'bytes' }));
|
||||
const proto = Object.getPrototypeOf(rsReader);
|
||||
|
||||
assert_array_equals(Object.getOwnPropertyNames(proto).sort(), properties);
|
||||
|
||||
for (const m of methods) {
|
||||
const propDesc = Object.getOwnPropertyDescriptor(proto, m);
|
||||
assert_equals(propDesc.enumerable, false, 'method should be non-enumerable');
|
||||
assert_equals(propDesc.configurable, true, 'method should be configurable');
|
||||
assert_equals(propDesc.writable, true, 'method should be writable');
|
||||
assert_equals(typeof rsReader[m], 'function', 'should have be a method');
|
||||
const expectedName = m === 'constructor' ? 'ReadableStreamBYOBReader' : m;
|
||||
assert_equals(rsReader[m].name, expectedName, 'method should have the correct name');
|
||||
}
|
||||
|
||||
const closedPropDesc = Object.getOwnPropertyDescriptor(proto, 'closed');
|
||||
assert_equals(closedPropDesc.enumerable, false, 'closed should be non-enumerable');
|
||||
assert_equals(closedPropDesc.configurable, true, 'closed should be configurable');
|
||||
assert_not_equals(closedPropDesc.get, undefined, 'closed should have a getter');
|
||||
assert_equals(closedPropDesc.set, undefined, 'closed should not have a setter');
|
||||
|
||||
assert_equals(rsReader.cancel.length, 1, 'cancel has 1 parameter');
|
||||
assert_not_equals(rsReader.closed, undefined, 'has a non-undefined closed property');
|
||||
assert_equals(typeof rsReader.closed.then, 'function', 'closed property is thenable');
|
||||
assert_equals(rsReader.constructor.length, 1, 'constructor has 1 parameter');
|
||||
assert_equals(rsReader.read.length, 1, 'read has 1 parameter');
|
||||
assert_equals(rsReader.releaseLock.length, 0, 'releaseLock has no parameters');
|
||||
|
||||
}, 'ReadableStreamBYOBReader instances should have the correct list of properties');
|
||||
|
||||
promise_test(t => {
|
||||
|
||||
const rs = new ReadableStream({
|
||||
pull(controller) {
|
||||
return t.step(() => {
|
||||
const byobRequest = controller.byobRequest;
|
||||
|
||||
const methods = ['constructor', 'respond', 'respondWithNewView'];
|
||||
const properties = methods.concat(['view']).sort();
|
||||
|
||||
const proto = Object.getPrototypeOf(byobRequest);
|
||||
|
||||
assert_array_equals(Object.getOwnPropertyNames(proto).sort(), properties);
|
||||
|
||||
for (const m of methods) {
|
||||
const propDesc = Object.getOwnPropertyDescriptor(proto, m);
|
||||
assert_equals(propDesc.enumerable, false, 'method should be non-enumerable');
|
||||
assert_equals(propDesc.configurable, true, 'method should be configurable');
|
||||
assert_equals(propDesc.writable, true, 'method should be writable');
|
||||
assert_equals(typeof byobRequest[m], 'function', 'should have a method');
|
||||
const expectedName = m === 'constructor' ? 'ReadableStreamBYOBRequest' : m;
|
||||
assert_equals(byobRequest[m].name, expectedName, 'method should have the correct name');
|
||||
}
|
||||
|
||||
const viewPropDesc = Object.getOwnPropertyDescriptor(proto, 'view');
|
||||
assert_equals(viewPropDesc.enumerable, false, 'view should be non-enumerable');
|
||||
assert_equals(viewPropDesc.configurable, true, 'view should be configurable');
|
||||
assert_not_equals(viewPropDesc.get, undefined, 'view should have a getter');
|
||||
assert_equals(viewPropDesc.set, undefined, 'view should not have a setter');
|
||||
assert_not_equals(byobRequest.view, undefined, 'has a non-undefined view property');
|
||||
assert_equals(byobRequest.constructor.length, 2, 'constructor has 1 parameter');
|
||||
assert_equals(byobRequest.respond.length, 1, 'respond has 1 parameter');
|
||||
assert_equals(byobRequest.respondWithNewView.length, 1, 'releaseLock has 1 parameter');
|
||||
|
||||
byobRequest.respond(1);
|
||||
|
||||
});
|
||||
},
|
||||
type: 'bytes' });
|
||||
const reader = rs.getReader({ mode: 'byob' });
|
||||
return reader.read(new Uint8Array(1));
|
||||
|
||||
}, 'ReadableStreamBYOBRequest instances should have the correct list of properties');
|
||||
|
||||
test(() => {
|
||||
|
||||
const methods = ['close', 'constructor', 'enqueue', 'error'];
|
||||
const accessors = ['byobRequest', 'desiredSize'];
|
||||
const properties = methods.concat(accessors).sort();
|
||||
|
||||
let controller;
|
||||
new ReadableStream({
|
||||
start(c) {
|
||||
controller = c;
|
||||
},
|
||||
type: 'bytes'
|
||||
});
|
||||
const proto = Object.getPrototypeOf(controller);
|
||||
|
||||
assert_array_equals(Object.getOwnPropertyNames(proto).sort(), properties);
|
||||
|
||||
for (const m of methods) {
|
||||
const propDesc = Object.getOwnPropertyDescriptor(proto, m);
|
||||
assert_equals(propDesc.enumerable, false, 'method should be non-enumerable');
|
||||
assert_equals(propDesc.configurable, true, 'method should be configurable');
|
||||
assert_equals(propDesc.writable, true, 'method should be writable');
|
||||
assert_equals(typeof controller[m], 'function', 'should have be a method');
|
||||
const expectedName = m === 'constructor' ? 'ReadableByteStreamController' : m;
|
||||
assert_equals(controller[m].name, expectedName, 'method should have the correct name');
|
||||
}
|
||||
|
||||
for (const a of accessors) {
|
||||
const propDesc = Object.getOwnPropertyDescriptor(proto, a);
|
||||
assert_equals(propDesc.enumerable, false, `${a} should be non-enumerable`);
|
||||
assert_equals(propDesc.configurable, true, `${a} should be configurable`);
|
||||
assert_not_equals(propDesc.get, undefined, `${a} should have a getter`);
|
||||
assert_equals(propDesc.set, undefined, `${a} should not have a setter`);
|
||||
}
|
||||
|
||||
assert_equals(controller.close.length, 0, 'cancel has no parameters');
|
||||
assert_equals(controller.constructor.length, 3, 'constructor has 3 parameters');
|
||||
assert_equals(controller.enqueue.length, 1, 'enqueue has 1 parameter');
|
||||
assert_equals(controller.error.length, 1, 'releaseLock has 1 parameter');
|
||||
|
||||
}, 'ReadableByteStreamController instances should have the correct list of properties');
|
||||
|
||||
done();
|
|
@ -0,0 +1,12 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>properties.js service worker wrapper file</title>
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
service_worker_test('properties.js', 'Service worker test setup');
|
||||
</script>
|
|
@ -0,0 +1,11 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>properties.js shared worker wrapper file</title>
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
fetch_tests_from_worker(new SharedWorker('properties.js'));
|
||||
</script>
|
Loading…
Add table
Add a link
Reference in a new issue