| Index: third_party/WebKit/LayoutTests/external/wpt/streams/piping/close-propagation-backward.js
|
| diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/piping/close-propagation-backward.js b/third_party/WebKit/LayoutTests/external/wpt/streams/piping/close-propagation-backward.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..31207e99672ba72ff454bb03b3d7a81b062ec33d
|
| --- /dev/null
|
| +++ b/third_party/WebKit/LayoutTests/external/wpt/streams/piping/close-propagation-backward.js
|
| @@ -0,0 +1,158 @@
|
| +'use strict';
|
| +
|
| +if (self.importScripts) {
|
| + self.importScripts('/resources/testharness.js');
|
| + self.importScripts('../resources/recording-streams.js');
|
| +}
|
| +
|
| +const error1 = new Error('error1!');
|
| +error1.name = 'error1';
|
| +
|
| +promise_test(() => {
|
| +
|
| + const rs = recordingReadableStream();
|
| +
|
| + const ws = recordingWritableStream();
|
| + const writer = ws.getWriter();
|
| + writer.close();
|
| + writer.releaseLock();
|
| +
|
| + return rs.pipeTo(ws).then(
|
| + () => assert_unreached('the promise must not fulfill'),
|
| + err => {
|
| + assert_equals(err.name, 'TypeError', 'the promise must reject with a TypeError');
|
| +
|
| + assert_array_equals(rs.eventsWithoutPulls, ['cancel', err]);
|
| + assert_array_equals(ws.events, ['close']);
|
| +
|
| + return Promise.all([
|
| + rs.getReader().closed,
|
| + ws.getWriter().closed
|
| + ]);
|
| + }
|
| + );
|
| +
|
| +}, 'Closing must be propagated backward: starts closed; preventCancel omitted; fulfilled cancel promise');
|
| +
|
| +promise_test(t => {
|
| +
|
| + // Our recording streams do not deal well with errors generated by the system, so give them some help
|
| + let recordedError;
|
| + const rs = recordingReadableStream({
|
| + cancel(cancelErr) {
|
| + recordedError = cancelErr;
|
| + throw error1;
|
| + }
|
| + });
|
| +
|
| + const ws = recordingWritableStream();
|
| + const writer = ws.getWriter();
|
| + writer.close();
|
| + writer.releaseLock();
|
| +
|
| + return promise_rejects(t, error1, rs.pipeTo(ws), 'pipeTo must reject with the same error').then(() => {
|
| + assert_equals(recordedError.name, 'TypeError', 'the cancel reason must be a TypeError');
|
| +
|
| + assert_array_equals(rs.eventsWithoutPulls, ['cancel', recordedError]);
|
| + assert_array_equals(ws.events, ['close']);
|
| +
|
| + return Promise.all([
|
| + rs.getReader().closed,
|
| + ws.getWriter().closed
|
| + ]);
|
| + });
|
| +
|
| +}, 'Closing must be propagated backward: starts closed; preventCancel omitted; rejected cancel promise');
|
| +
|
| +for (const falsy of [undefined, null, false, +0, -0, NaN, '']) {
|
| + const stringVersion = Object.is(falsy, -0) ? '-0' : String(falsy);
|
| +
|
| + promise_test(() => {
|
| +
|
| + const rs = recordingReadableStream();
|
| +
|
| + const ws = recordingWritableStream();
|
| + const writer = ws.getWriter();
|
| + writer.close();
|
| + writer.releaseLock();
|
| +
|
| + return rs.pipeTo(ws, { preventCancel: falsy }).then(
|
| + () => assert_unreached('the promise must not fulfill'),
|
| + err => {
|
| + assert_equals(err.name, 'TypeError', 'the promise must reject with a TypeError');
|
| +
|
| + assert_array_equals(rs.eventsWithoutPulls, ['cancel', err]);
|
| + assert_array_equals(ws.events, ['close']);
|
| +
|
| + return Promise.all([
|
| + rs.getReader().closed,
|
| + ws.getWriter().closed
|
| + ]);
|
| + }
|
| + );
|
| +
|
| + }, `Closing must be propagated backward: starts closed; preventCancel = ${stringVersion} (falsy); fulfilled cancel ` +
|
| + `promise`);
|
| +}
|
| +
|
| +for (const truthy of [true, 'a', 1, Symbol(), { }]) {
|
| + promise_test(t => {
|
| +
|
| + const rs = recordingReadableStream();
|
| +
|
| + const ws = recordingWritableStream();
|
| + const writer = ws.getWriter();
|
| + writer.close();
|
| + writer.releaseLock();
|
| +
|
| + return promise_rejects(t, new TypeError(), rs.pipeTo(ws, { preventCancel: truthy })).then(() => {
|
| + assert_array_equals(rs.eventsWithoutPulls, []);
|
| + assert_array_equals(ws.events, ['close']);
|
| +
|
| + return ws.getWriter().closed;
|
| + });
|
| +
|
| + }, `Closing must be propagated backward: starts closed; preventCancel = ${String(truthy)} (truthy)`);
|
| +}
|
| +
|
| +promise_test(t => {
|
| +
|
| + const rs = recordingReadableStream();
|
| +
|
| + const ws = recordingWritableStream();
|
| + const writer = ws.getWriter();
|
| + writer.close();
|
| + writer.releaseLock();
|
| +
|
| + return promise_rejects(t, new TypeError(), rs.pipeTo(ws, { preventCancel: true, preventAbort: true }))
|
| + .then(() => {
|
| + assert_array_equals(rs.eventsWithoutPulls, []);
|
| + assert_array_equals(ws.events, ['close']);
|
| +
|
| + return ws.getWriter().closed;
|
| + });
|
| +
|
| +}, 'Closing must be propagated backward: starts closed; preventCancel = true, preventAbort = true');
|
| +
|
| +promise_test(t => {
|
| +
|
| + const rs = recordingReadableStream();
|
| +
|
| + const ws = recordingWritableStream();
|
| + const writer = ws.getWriter();
|
| + writer.close();
|
| + writer.releaseLock();
|
| +
|
| + return promise_rejects(t, new TypeError(),
|
| + rs.pipeTo(ws, { preventCancel: true, preventAbort: true, preventClose: true }))
|
| + .then(() => {
|
| + assert_array_equals(rs.eventsWithoutPulls, []);
|
| + assert_array_equals(ws.events, ['close']);
|
| +
|
| + return ws.getWriter().closed;
|
| + });
|
| +
|
| +}, 'Closing must be propagated backward: starts closed; preventCancel = true, preventAbort = true, preventClose ' +
|
| + '= true');
|
| +
|
| +done();
|
|
|