From 99550dc4ad6b1ee446597949bceaf71521d8ffac Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Sun, 13 Apr 2025 09:44:39 -0400 Subject: [PATCH] LibWeb: Import ReadableStreamPipeTo observability tests --- .../streams/piping/then-interception.any.txt | 7 ++ .../streams/piping/then-interception.any.html | 16 +++++ .../streams/piping/then-interception.any.js | 68 +++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 Tests/LibWeb/Text/expected/wpt-import/streams/piping/then-interception.any.txt create mode 100644 Tests/LibWeb/Text/input/wpt-import/streams/piping/then-interception.any.html create mode 100644 Tests/LibWeb/Text/input/wpt-import/streams/piping/then-interception.any.js diff --git a/Tests/LibWeb/Text/expected/wpt-import/streams/piping/then-interception.any.txt b/Tests/LibWeb/Text/expected/wpt-import/streams/piping/then-interception.any.txt new file mode 100644 index 00000000000..1419b8486e2 --- /dev/null +++ b/Tests/LibWeb/Text/expected/wpt-import/streams/piping/then-interception.any.txt @@ -0,0 +1,7 @@ +Harness status: OK + +Found 2 tests + +2 Fail +Fail piping should not be observable +Fail tee should not be observable \ No newline at end of file diff --git a/Tests/LibWeb/Text/input/wpt-import/streams/piping/then-interception.any.html b/Tests/LibWeb/Text/input/wpt-import/streams/piping/then-interception.any.html new file mode 100644 index 00000000000..94c6f0b53ac --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/streams/piping/then-interception.any.html @@ -0,0 +1,16 @@ + + + + + + + + +
+ diff --git a/Tests/LibWeb/Text/input/wpt-import/streams/piping/then-interception.any.js b/Tests/LibWeb/Text/input/wpt-import/streams/piping/then-interception.any.js new file mode 100644 index 00000000000..fc48c368311 --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/streams/piping/then-interception.any.js @@ -0,0 +1,68 @@ +// META: global=window,worker,shadowrealm +// META: script=../resources/test-utils.js +// META: script=../resources/recording-streams.js +'use strict'; + +function interceptThen() { + const intercepted = []; + let callCount = 0; + Object.prototype.then = function(resolver) { + if (!this.done) { + intercepted.push(this.value); + } + const retval = Object.create(null); + retval.done = ++callCount === 3; + retval.value = callCount; + resolver(retval); + if (retval.done) { + delete Object.prototype.then; + } + } + return intercepted; +} + +promise_test(async t => { + const rs = new ReadableStream({ + start(controller) { + controller.enqueue('a'); + controller.close(); + } + }); + const ws = recordingWritableStream(); + + const intercepted = interceptThen(); + t.add_cleanup(() => { + delete Object.prototype.then; + }); + + await rs.pipeTo(ws); + delete Object.prototype.then; + + + assert_array_equals(intercepted, [], 'nothing should have been intercepted'); + assert_array_equals(ws.events, ['write', 'a', 'close'], 'written chunk should be "a"'); +}, 'piping should not be observable'); + +promise_test(async t => { + const rs = new ReadableStream({ + start(controller) { + controller.enqueue('a'); + controller.close(); + } + }); + const ws = recordingWritableStream(); + + const [ branch1, branch2 ] = rs.tee(); + + const intercepted = interceptThen(); + t.add_cleanup(() => { + delete Object.prototype.then; + }); + + await branch1.pipeTo(ws); + delete Object.prototype.then; + branch2.cancel(); + + assert_array_equals(intercepted, [], 'nothing should have been intercepted'); + assert_array_equals(ws.events, ['write', 'a', 'close'], 'written chunk should be "a"'); +}, 'tee should not be observable');