Prerender: Attempt to deflake the local-storage web test

Searching this issue around, I think the root case can be:
localStorage is racy when there are multiple instances. (See the issue
for more information)
This CL adds an event listener to storage, to ensure the main test
has the local storage synced before checking the value.

Bug: 1191846
Change-Id: I800a119dc82f51172a580ff3522f2e0da0cc7608
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4025049
Quick-Run: Lingqi Chi <lingqi@chromium.org>
Commit-Queue: Lingqi Chi <lingqi@chromium.org>
Reviewed-by: Hiroki Nakagawa <nhiroki@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1070958}
diff --git a/speculation-rules/prerender/local-storage.html b/speculation-rules/prerender/local-storage.html
index 367d6ca..cd14685 100644
--- a/speculation-rules/prerender/local-storage.html
+++ b/speculation-rules/prerender/local-storage.html
@@ -14,6 +14,19 @@
 promise_test(async t => {
   const uid1 = token();
   const uid2 = token();
+
+  // A promise to wait until a prerendered page writes data with the "prerender"
+  // key in the local storage.
+  const write_promise = new Promise((resolve, reject) => {
+    window.addEventListener("storage", event => {
+      if (event.key !== 'prerender') {
+        reject("wrong key");
+      } else {
+        resolve();
+      }
+    }, { once: true });
+  });
+
   window.localStorage.setItem('initial', uid1);
   const {exec} = await create_prerendered_page(t);
   const result = await exec(uid2 => {
@@ -25,8 +38,10 @@
   assert_equals(
     result, uid1,
       'prerendering page should be able to read from local storage');
+
+  await write_promise;
   assert_equals(
-      window.localStorage.getItem('prerender'), uid2,
+    window.localStorage.getItem('prerender'), uid2,
       'prerendering page should be able to write to local storage');
 }, 'prerendering page should be able to access local storage');