Reland "[COEPForSharedWorker] Add reporter to shared worker host."

This is a reland of 0d08f846ca52f20d37d398ae4f73f40a48e5ebb4

Original change's description:
> [COEPForSharedWorker] Add reporter to shared worker host.
>
> Add reporter to shared worker, which doesn't change the
> behaviour as COEP is not currently handed to the
> URLLoaderFactory.
>
> Bug: 1060832
> Change-Id: I4a4b55acd2bcdebef3ab20d741acdc1d188ac719
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2944788
> Commit-Queue: Yifan Luo <lyf@chromium.org>
> Reviewed-by: Camille Lamy <clamy@chromium.org>
> Reviewed-by: Yutaka Hirano <yhirano@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#903576}

Bug: 1060832
Change-Id: Ibbc9635a174de3a6059779dcf4e497c91a589924
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3043581
Reviewed-by: Yifan Luo <lyf@chromium.org>
Reviewed-by: Yutaka Hirano <yhirano@chromium.org>
Reviewed-by: Camille Lamy <clamy@chromium.org>
Commit-Queue: Yifan Luo <lyf@chromium.org>
Cr-Commit-Position: refs/heads/master@{#903879}
diff --git a/html/cross-origin-embedder-policy/reporting-to-endpoint.https.html b/html/cross-origin-embedder-policy/reporting-to-endpoint.https.html
index ad1f18c..56dccfe 100644
--- a/html/cross-origin-embedder-policy/reporting-to-endpoint.https.html
+++ b/html/cross-origin-embedder-policy/reporting-to-endpoint.https.html
@@ -24,6 +24,9 @@
 const FRAME_URL = `resources/reporting-empty-frame.html` +
   `?pipe=header(cross-origin-embedder-policy,require-corp;report-to="endpoint")` +
   `|header(cross-origin-embedder-policy-report-only,require-corp;report-to="report-only-endpoint")`;
+const WORKER_URL = `resources/shared-worker.js` +
+  '?pipe=header(cross-origin-embedder-policy,require-corp;report-to="endpoint")' +
+  `|header(cross-origin-embedder-policy-report-only,require-corp;report-to="report-only-endpoint")`;
 
 function wait(ms) {
   return new Promise(resolve => step_timeout(resolve, ms));
@@ -58,7 +61,7 @@
     }
     await wait(retryDelay);
   }
-  assert_unreached(`A report whose blockedURL is ${blockedUrl} and url is ${contextUrl} is not found.`);
+  assert_unreached(`A report whose blockedURL is ${blockedUrl.split("?")[0]} and url is ${contextUrl} is not found.`);
 }
 
 async function checkNavigationReportExistence(endpoint, blockedUrl, contextUrl, disposition) {
@@ -80,7 +83,7 @@
     }
     await wait(retryDelay);
   }
-  assert_unreached(`A report whose blockedURL is ${blockedUrl} and url is ${contextUrl} is not found.`);
+  assert_unreached(`A report whose blockedURL is ${blockedUrl.split("?")[0]} and url is ${contextUrl} is not found.`);
 }
 
 promise_test(async t => {
@@ -177,4 +180,27 @@
 
 }, 'Two COEP headers, split inside report-to value');
 
+// Shared worker do not support observer currently, so add test for endpoint
+// here.
+promise_test(async (t) => {
+  const iframe = document.createElement('iframe');
+  t.add_cleanup(() => iframe.remove());
+
+  iframe.src = FRAME_URL;
+  const targetUrl = `${REMOTE_ORIGIN}/common/blank.html?${token()}`;
+  document.body.appendChild(iframe);
+
+  const worker = new iframe.contentWindow.SharedWorker(WORKER_URL);
+  worker.port.start();
+  const script =
+    `fetch('${targetUrl}', {mode: 'no-cors', cache: 'no-store'}).catch(e => {});`;
+  worker.addEventListener('error', t.unreached_func('Worker.onerror'));
+  worker.port.postMessage(script);
+
+  await checkCorpReportExistence(
+      'endpoint', targetUrl, WORKER_URL, 'iframe', 'enforce');
+  await checkCorpReportExistence(
+      'report-only-endpoint', targetUrl, WORKER_URL, 'iframe', 'reporting');
+}, 'Shared worker fetch');
+
 </script>
diff --git a/html/cross-origin-embedder-policy/resources/shared-worker.js b/html/cross-origin-embedder-policy/resources/shared-worker.js
new file mode 100644
index 0000000..c5f2c3c
--- /dev/null
+++ b/html/cross-origin-embedder-policy/resources/shared-worker.js
@@ -0,0 +1,7 @@
+onconnect = (event) => {
+  const port = event.ports[0];
+  port.onmessage = (event) => {
+    eval(event.data);
+  };
+  port.postMessage('ready');
+};