Skip to content

Commit

Permalink
[bfcache] Unblock broadcastchannel on dedicated worker
Browse files Browse the repository at this point in the history
Change-Id: Iea7fdd4024f54dd6306334437ba80030feb9a0bb
  • Loading branch information
rubberyuzu authored and chromium-wpt-export-bot committed May 9, 2024
1 parent d32b68c commit 9578402
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<!doctype html>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/utils.js"></script>
<script src="/common/dispatcher/dispatcher.js"></script>
<script src="resources/helper.sub.js"></script>
<script>
promise_test(async t => {
const pageA = new RemoteContext(token());
const pageB = new RemoteContext(token());
const pageA2 = new RemoteContext(token());

const urlA = location.origin + executorPath + pageA.context_id;
const urlB = originCrossSite + executorPath + pageB.context_id;
const urlA2 = location.origin + executorPath + pageA2.context_id;

window.open(urlA, '_blank', 'noopener');
await pageA.execute_script(waitForPageShow);

await pageA.execute_script(() => {
// Register a dedicated worker.
let worker = new Worker('../resources/worker-with-broadcastchannel.js');
worker.postMessage({channelName: 'foo'});
});

window.open(urlA2, '_blank', 'noopener');

await pageA.execute_script(
(url) => {
prepareNavigation(() => {
location.href = url;
});
},
[urlB]
);

await pageB.execute_script(waitForPageShow);

let messageLength = await pageA2.execute_script(() => {
let messages = [];
let channel = new BroadcastChannel('foo');
channel.addEventListener('message', event => {
messages.push(event.data);
});
channel.postMessage('yay');
return messages.length;
});
// Assert that the message has not arrived when PageA is in bfcache.
assert_true(messageLength == 0);

await pageB.execute_script(
() => {
prepareNavigation(() => { history.back(); });
}
);

await pageA.execute_script(waitForPageShow);
await assert_bfcached(pageA);

// I would like to assert that the messages are now received. How????

}, 'PageA should.');
</script>
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<!doctype html>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/utils.js"></script>
<script src="/common/dispatcher/dispatcher.js"></script>
<script src="resources/helper.sub.js"></script>
<script>
promise_test(async t => {
const pageA = new RemoteContext(token());
const pageB = new RemoteContext(token());

const urlA = location.origin + executorPath + pageA.context_id;
const urlB = originCrossSite + executorPath + pageB.context_id;

window.open(urlA, '_blank', 'noopener');
await pageA.execute_script(waitForPageShow);

await pageA.execute_script(() => {
// Create BroadcastChannel in main thread
let channel = new BroadcastChannel('foo');
// Register a dedicated worker.
let worker = new Worker('../resources/worker-with-broadcastchannel.js');
channel.addEventListener('message', event => {
// Received from worker: event.data;
});
worker.postMessage({channelName: 'foo'});
});

await navigateAndThenBack(pageA, pageB, urlB);
await assert_bfcached(pageA);

}, 'PageA should be restored from bfcache, even though the dedicated worker had an open broadcastchannel connection.');
</script>
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
self.addEventListener('message', event => {
const channel = new BroadcastChannel(event.data.channelName); // Access shared channel
channel.addEventListener('message', event => {
channel.postMessage('Message received in worker: ' + event.data);
});
});

0 comments on commit 9578402

Please sign in to comment.