blob: 79d19ac4b31002ba8cc565738e411f6b094ea10c [file] [log] [blame]
'use strict';
if (self.importScripts) {
self.importScripts('/resources/testharness.js');
}
function fakeWritableStreamDefaultWriter() {
return {
get closed() { return Promise.resolve(); },
get desiredSize() { return 1; },
get ready() { return Promise.resolve(); },
abort() { return Promise.resolve(); },
close() { return Promise.resolve(); },
write() { return Promise.resolve(); }
};
}
function realReadableStreamDefaultWriter() {
const rs = new ReadableStream();
return rs.getReader();
}
function getterRejects(t, obj, getterName, target) {
const getter = Object.getOwnPropertyDescriptor(obj, getterName).get;
return promise_rejects(t, new TypeError(), getter.call(target),
getterName + ' should reject with a TypeError');
}
function methodRejects(t, obj, methodName, target) {
const method = obj[methodName];
return promise_rejects(t, new TypeError(), method.call(target),
methodName + ' should reject with a TypeError');
}
function getterThrows(obj, getterName, target) {
const getter = Object.getOwnPropertyDescriptor(obj, getterName).get;
assert_throws(new TypeError(), () => getter.call(target), getterName + ' should throw a TypeError');
}
const ws = new WritableStream();
const writer = ws.getWriter();
const WritableStreamDefaultWriter = writer.constructor;
const WriterProto = WritableStreamDefaultWriter.prototype;
test(() => {
getterThrows(WriterProto, 'desiredSize', fakeWritableStreamDefaultWriter());
getterThrows(WriterProto, 'desiredSize', realReadableStreamDefaultWriter());
}, 'WritableStreamDefaultWriter.prototype.desiredSize enforces a brand check');
promise_test(t => {
return Promise.all([getterRejects(t, WriterProto, 'closed', fakeWritableStreamDefaultWriter()),
getterRejects(t, WriterProto, 'closed', realReadableStreamDefaultWriter())]);
}, 'WritableStreamDefaultWriter.prototype.closed enforces a brand check');
promise_test(t => {
return Promise.all([getterRejects(t, WriterProto, 'ready', fakeWritableStreamDefaultWriter()),
getterRejects(t, WriterProto, 'ready', realReadableStreamDefaultWriter())]);
}, 'WritableStreamDefaultWriter.prototype.ready enforces a brand check');
test(t => {
return Promise.all([methodRejects(t, WriterProto, 'abort', fakeWritableStreamDefaultWriter()),
methodRejects(t, WriterProto, 'abort', realReadableStreamDefaultWriter())]);
}, 'WritableStreamDefaultWriter.prototype.abort enforces a brand check');
promise_test(t => {
return Promise.all([methodRejects(t, WriterProto, 'write', fakeWritableStreamDefaultWriter()),
methodRejects(t, WriterProto, 'write', realReadableStreamDefaultWriter())]);
}, 'WritableStreamDefaultWriter.prototype.write enforces a brand check');
promise_test(t => {
return Promise.all([methodRejects(t, WriterProto, 'close', fakeWritableStreamDefaultWriter()),
methodRejects(t, WriterProto, 'close', realReadableStreamDefaultWriter())]);
}, 'WritableStreamDefaultWriter.prototype.close enforces a brand check');
done();