Support preferred platform for cross app web attribution in browser

The Attribution-Reporting-Info header data is untrusted and needs to be
parsed by DataDecoder. This CL introduces a queue to hold all pending
registration data to ensure the order of registrations in the same
redirect chain.

The Attribution-Reporting-Info header will be parsed first
asynchronously, the preferred platform parsed from the header will be
used to decide which header to parse asynchronously, either the web or
OS header.

This CL also adds a virtual test suite to run devtools-related WPTs with
in browser migration enabled. The fetch requests in those tests are
changed to keepalive so that they're handled in the browser for code
coverage.

Bug: 325103501
Change-Id: If11880d2ae3eb42ed948d7ce3605ccc5f25882f6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5300820
Reviewed-by: Anthony Garant <anthonygarant@chromium.org>
Reviewed-by: Xianzhu Wang <wangxianzhu@chromium.org>
Reviewed-by: Alex Rudenko <alexrudenko@chromium.org>
Commit-Queue: Nan Lin <linnan@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1266210}
diff --git a/attribution-reporting/resources/helpers.js b/attribution-reporting/resources/helpers.js
index 5778159..e5c7499 100644
--- a/attribution-reporting/resources/helpers.js
+++ b/attribution-reporting/resources/helpers.js
@@ -170,6 +170,7 @@
   method = 'img',
   extraQueryParams = {},
   reportingOrigin,
+  extraHeaders = [],
 }) => {
   const searchParams = new URLSearchParams(location.search);
 
@@ -208,6 +209,8 @@
     headers = headers.concat(params.headers);
   }
 
+  headers = headers.concat(extraHeaders);
+
   const url = blankURLWithHeaders(headers, reportingOrigin);
 
   Object.entries(extraQueryParams)