blob: 55ea10ca1568aa177354430ed581c71ef250ee7d [file] [log] [blame]
<!DOCTYPE html>
<script src='../resources/testharness.js'></script>
<script src='../resources/testharnessreport.js'></script>
<script>
test(function() {
const PromiseBackup = Promise;
try {
Promise = function() { assert_unreached("streams should not use this Promise object"); };
new ReadableStream();
new WritableStream();
} finally {
Promise = PromiseBackup;
}
}, 'Streams and promises: replace Promise constructor');
test(function() {
const PromiseResolveBackup = Promise.resolve;
try {
Promise.resolve = function() { assert_unreached("streams should not use this Promise.resolve method"); };
new ReadableStream();
new WritableStream();
} finally {
Promise.resolve = PromiseResolveBackup;
}
}, 'Streams and promises: replace Promise.resolve');
test(function() {
const PromiseRejectBackup = Promise.reject;
function handle() { }
try {
Promise.reject = function() { assert_unreached("streams should not use this Promise.reject method"); };
ReadableStream.prototype.cancel.call({}, "reason").then(handle, handle);
WritableStream.prototype.abort.call({}, "reason").then(handle, handle);
} finally {
Promise.reject = PromiseRejectBackup;
}
}, 'Streams and promises: replace Promise.reject');
test(function() {
function createMangledPromise() {
const promise = Promise.resolve();
Object.setPrototypeOf(promise, { constructor: Promise, then: function() { assert_unreached("streams should not use this promise then method"); } });
return promise;
}
new ReadableStream({ start: function() { return createMangledPromise(); } })
new WritableStream({ start: function() { return createMangledPromise(); } })
}, 'Streams and promises: replace prototype of a promise object');
test(function() {
const PromiseThenBackup = Promise.prototype.then;
try {
Promise.prototype.then = function() { assert_unreached("streams should not use this Promise.prototype.then method"); };
new ReadableStream();
new WritableStream();
} finally {
Promise.prototype.then = PromiseThenBackup;
}
}, 'Streams and promises: replace then method in Promise prototype');
test(function() {
const PromiseCatchBackup = Promise.prototype.catch;
const PromiseThenBackup = Promise.prototype.then;
try {
Promise.prototype.catch = function() { assert_unreached("streams should not use this Promise.prototype.catch method"); };
Promise.prototype.then = function() { assert_unreached("streams should not use this Promise.prototype.catch method"); };
const rs = new ReadableStream();
rs.tee();
} finally {
Promise.prototype.catch = PromiseCatchBackup;
Promise.prototype.then = PromiseThenBackup;
}
}, 'Streams and promises: replace catch method in Promise prototype');
test(function() {
function createMangledPromise() {
const promise = Promise.resolve();
promise.then = function() { assert_unreached("streams should not use this promise then method"); };
return promise;
}
new ReadableStream({ start: function() { return createMangledPromise(); } })
new WritableStream({ start: function() { return createMangledPromise(); } })
}, 'Streams and promises: replace then method in promise object');
test(function() {
const NumberBackup = Number;
const NumberIsNaNBackup = Number.isNaN;
const NumberIsFiniteBackup = Number.isFinite;
try {
Number.isNaN = function() { assert_unreached("streams should not use this Number.isNaN method"); };
Number.isFinite = function() { assert_unreached("streams should not use this Number.isFinite method"); };
Number = null;
new ReadableStream({
start: function(controller) {
controller.enqueue("small potato");
}
}, {
size: function(chunk) { return 2; },
highWaterMark: 1
});
} finally {
Number = NumberBackup;
Number.isNaN = NumberIsNaNBackup;
Number.isFinite = NumberIsFiniteBackup;
}
}, 'Streams should not directly use Number and related methods');
test(function() {
const ReadableStreamGetReaderBackup = ReadableStream.prototype.getReader;
try {
ReadableStream.prototype.getReader = function() { assert_unreached("streams should not use this ReadableStream.getReader method"); };
new ReadableStream().tee();
} finally {
ReadableStream.prototype.getReader = ReadableStreamGetReaderBackup;
}
}, 'Streams should not directly use ReadableStream public APIs');
promise_test(function() {
const ReadableStreamDefaultReader = new ReadableStream().getReader().constructor;
const ReadableStreamDefaultReaderReadBackup = ReadableStreamDefaultReader.prototype.read;
function cleanTest() {
ReadableStreamDefaultReader.prototype.read = ReadableStreamDefaultReaderReadBackup;
}
try {
ReadableStreamDefaultReader.prototype.read = function() { assert_unreached("streams should not use this ReadableStreamDefaultReader.read method"); };
[s1, s2] = new ReadableStream({
start: function(controller) {
controller.close();
}
}).tee();
return s1.getReader().closed.then(cleanTest, cleanTest);
} catch (error) {
cleanTest();
assert_unreached("test should not throw");
}
}, 'Streams should not directly use ReadableStreamDefaultReader read public API');
</script>