Bug 1192940 - Support referrer policy in sendBeacon draft
authorThomas Nguyen <tnguyen@mozilla.com>
Fri, 17 Mar 2017 11:53:16 +0800
changeset 500361 b285d25d1264819541c39ea914eabe3d91227dfc
parent 500240 39607304b774591fa6e32c4b06158d869483c312
child 549619 a82484febec0ade4afdcc22f991088e92a066338
push id49703
push usertnguyen@mozilla.com
push dateFri, 17 Mar 2017 04:01:27 +0000
bugs1192940
milestone55.0a1
Bug 1192940 - Support referrer policy in sendBeacon MozReview-Commit-ID: FEyqInOkiT6
dom/base/Navigator.cpp
testing/web-platform/meta/MANIFEST.json
testing/web-platform/meta/beacon/headers/header-referrer-no-referrer-when-downgrade.https.html.ini
testing/web-platform/meta/beacon/headers/header-referrer-strict-origin-when-cross-origin.https.html.ini
testing/web-platform/meta/beacon/headers/header-referrer-strict-origin.https.html.ini
testing/web-platform/meta/beacon/headers/header-referrer-unsafe-url.https.html.ini
testing/web-platform/mozilla/meta/MANIFEST.json
testing/web-platform/tests/beacon/headers/header-referrer-no-referrer-when-downgrade.https.html
testing/web-platform/tests/beacon/headers/header-referrer-no-referrer.html
testing/web-platform/tests/beacon/headers/header-referrer-origin-when-cross-origin.html
testing/web-platform/tests/beacon/headers/header-referrer-origin.html
testing/web-platform/tests/beacon/headers/header-referrer-same-origin.html
testing/web-platform/tests/beacon/headers/header-referrer-strict-origin-when-cross-origin.https.html
testing/web-platform/tests/beacon/headers/header-referrer-strict-origin.https.html
testing/web-platform/tests/beacon/headers/header-referrer-unsafe-url.https.html
testing/web-platform/tests/beacon/headers/header-referrer.js
testing/web-platform/tests/beacon/resources/inspect-header.py
--- a/dom/base/Navigator.cpp
+++ b/dom/base/Navigator.cpp
@@ -1208,17 +1208,18 @@ Navigator::SendBeaconInternal(const nsAS
   }
 
   nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(channel);
   if (!httpChannel) {
     // Beacon spec only supports HTTP requests at this time
     aRv.Throw(NS_ERROR_DOM_BAD_URI);
     return false;
   }
-  rv = httpChannel->SetReferrer(documentURI);
+  mozilla::net::ReferrerPolicy referrerPolicy = doc->GetReferrerPolicy();
+  rv = httpChannel->SetReferrerWithPolicy(documentURI, referrerPolicy);
   MOZ_ASSERT(NS_SUCCEEDED(rv));
 
   nsCOMPtr<nsIInputStream> in;
   nsAutoCString contentTypeWithCharset;
   nsAutoCString charset;
   uint64_t length = 0;
 
   if (aBody) {
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -17749,16 +17749,26 @@
      {}
     ]
    ],
    "battery-status/support-window-open.html": [
     [
      {}
     ]
    ],
+   "beacon/headers/header-referrer.js": [
+    [
+     {}
+    ]
+   ],
+   "beacon/resources/inspect-header.py": [
+    [
+     {}
+    ]
+   ],
    "bluetooth/bluetooth-helpers.js": [
     [
      {}
     ]
    ],
    "clear-site-data/support/echo-clear-site-data.py": [
     [
      {}
@@ -81794,16 +81804,64 @@
     ]
    ],
    "battery-status/battery-promise.html": [
     [
      "/battery-status/battery-promise.html",
      {}
     ]
    ],
+   "beacon/headers/header-referrer-no-referrer-when-downgrade.https.html": [
+    [
+     "/beacon/headers/header-referrer-no-referrer-when-downgrade.https.html",
+     {}
+    ]
+   ],
+   "beacon/headers/header-referrer-no-referrer.html": [
+    [
+     "/beacon/headers/header-referrer-no-referrer.html",
+     {}
+    ]
+   ],
+   "beacon/headers/header-referrer-origin-when-cross-origin.html": [
+    [
+     "/beacon/headers/header-referrer-origin-when-cross-origin.html",
+     {}
+    ]
+   ],
+   "beacon/headers/header-referrer-origin.html": [
+    [
+     "/beacon/headers/header-referrer-origin.html",
+     {}
+    ]
+   ],
+   "beacon/headers/header-referrer-same-origin.html": [
+    [
+     "/beacon/headers/header-referrer-same-origin.html",
+     {}
+    ]
+   ],
+   "beacon/headers/header-referrer-strict-origin-when-cross-origin.https.html": [
+    [
+     "/beacon/headers/header-referrer-strict-origin-when-cross-origin.https.html",
+     {}
+    ]
+   ],
+   "beacon/headers/header-referrer-strict-origin.https.html": [
+    [
+     "/beacon/headers/header-referrer-strict-origin.https.html",
+     {}
+    ]
+   ],
+   "beacon/headers/header-referrer-unsafe-url.https.html": [
+    [
+     "/beacon/headers/header-referrer-unsafe-url.https.html",
+     {}
+    ]
+   ],
    "clear-site-data/navigation.html": [
     [
      "/clear-site-data/navigation.html",
      {}
     ]
    ],
    "compat/webkit-text-fill-color-currentColor.html": [
     [
@@ -139547,16 +139605,56 @@
   "battery-status/support-iframe.html": [
    "3c203529afca2f6b2a075eb8a42bf2206e4f16af",
    "support"
   ],
   "battery-status/support-window-open.html": [
    "61b61d09a21daee964e0ebd26f7bdfdd1964c8ae",
    "support"
   ],
+  "beacon/headers/header-referrer-no-referrer-when-downgrade.https.html": [
+   "273c7d0110d5efc9fac0029cd257256894d3eb4b",
+   "testharness"
+  ],
+  "beacon/headers/header-referrer-no-referrer.html": [
+   "26a0a9453b36efbadb05c8185efe7f9a0d9d54c9",
+   "testharness"
+  ],
+  "beacon/headers/header-referrer-origin-when-cross-origin.html": [
+   "9633758fe59279cfe93333989d26c017f59ab2ac",
+   "testharness"
+  ],
+  "beacon/headers/header-referrer-origin.html": [
+   "1329850363c327533f50e509c6a48f6e4b1ed4bb",
+   "testharness"
+  ],
+  "beacon/headers/header-referrer-same-origin.html": [
+   "9701f2f0a83c6eeefe781d7de2c0cdbcff38b58e",
+   "testharness"
+  ],
+  "beacon/headers/header-referrer-strict-origin-when-cross-origin.https.html": [
+   "79b4a278f0e35646cfdffeebf8f0523e2772bc9b",
+   "testharness"
+  ],
+  "beacon/headers/header-referrer-strict-origin.https.html": [
+   "295ef746c475fca0ae8b492375a48948b4ea19c3",
+   "testharness"
+  ],
+  "beacon/headers/header-referrer-unsafe-url.https.html": [
+   "a7b6e697be165124ed5d6846335c8d3a38ee98f5",
+   "testharness"
+  ],
+  "beacon/headers/header-referrer.js": [
+   "1836174ce84714c39333a4cf863ec994ed70ff93",
+   "support"
+  ],
+  "beacon/resources/inspect-header.py": [
+   "e70503e7fb71617b9be631d5f2a9e73cacd83e3f",
+   "support"
+  ],
   "bluetooth/bluetooth-helpers.js": [
    "9794b578f1c5c08126fc10653e4beed1f1721d0c",
    "support"
   ],
   "clear-site-data/navigation.html": [
    "daf340429ca71997c7d9c6021354522f0285c4d1",
    "testharness"
   ],
@@ -164827,17 +164925,17 @@
   "geolocation-API/getCurrentPosition_permission_allow.https.html": [
    "695f80f5a06279b3a0bdd137e6a402da66a5eeee",
    "testharness"
   ],
   "geolocation-API/getCurrentPosition_permission_deny-manual.html": [
    "44b2d8846c79ddf7eb8cb3ab76d8899b7e783fad",
    "manual"
   ],
-  "geolocation-API/getCurrentPosition_permission_deny.html": [
+  "geolocation-API/getCurrentPosition_permission_deny.https.html": [
    "28939dd8e719ba66497a814edd1f4500ad348e95",
    "testharness"
   ],
   "geolocation-API/interfaces.html": [
    "c5e300b504b6bf75818fbe79728c87b086ccce3d",
    "testharness"
   ],
   "geolocation-API/support.js": [
@@ -176676,29 +176774,29 @@
    "629f3682421060ea18e9046a637402212be1b1fd",
    "testharness"
   ],
   "html/semantics/forms/textfieldselection/selection-not-application.html": [
    "39ecb031aca3655a06152f94a514981fe59ebbaf",
    "testharness"
   ],
   "html/semantics/forms/textfieldselection/selection-start-end.html": [
-   "1f3184b72aba5631d6db4379dfa98035ee047283",
+   "755fb11ec3d9440d3883ec3e2820a9e77fc144ae",
    "testharness"
   ],
   "html/semantics/forms/textfieldselection/selection.html": [
-   "f7674721b84ec8fca0e5e40258447ce857b87784",
+   "7f3969423e86313ec20846c84f8deecc95048b82",
    "testharness"
   ],
   "html/semantics/forms/textfieldselection/textfieldselection-setRangeText.html": [
    "3bbd350321f5ec9e0a8f3d47da4e11aaa3ad4d68",
    "testharness"
   ],
   "html/semantics/forms/textfieldselection/textfieldselection-setSelectionRange.html": [
-   "462049246a2ef3e66c22017ec6ad362e07b467e6",
+   "ffcef015b49fd156cc529117509f0ae0a38234bd",
    "testharness"
   ],
   "html/semantics/forms/the-button-element/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
   "html/semantics/forms/the-button-element/button-activate-frame.html": [
    "a3dd367a8f7eb9158b1271fcf95bf98b60fe0c9b",
@@ -179456,17 +179554,17 @@
    "0f882828f5cc321992ab9265fe632e55c6d6760b",
    "testharness"
   ],
   "html/webappapis/scripting/events/event-handler-onresize.html": [
    "917a10cd8a60b916eb4e2ad7bb7cb1ae657335a8",
    "testharness"
   ],
   "html/webappapis/scripting/events/event-handler-processing-algorithm.html": [
-   "a7c163d53eb559ea710527cace404ed88e9c4d0a",
+   "9a1fa2065ba742d6ab945065d65bdc0f60783d94",
    "testharness"
   ],
   "html/webappapis/scripting/events/event-handler-spec-example.html": [
    "8d4d0bfdf447591695ac134cd243277ea2326c84",
    "testharness"
   ],
   "html/webappapis/scripting/events/eventhandler-cancellation.html": [
    "491fd73a4ec8812cb8dc1ee01e34a7ff2a07ffb3",
@@ -200136,17 +200234,17 @@
    "0497bf37f0e3b55a6a4745cae2ec700b6f963fd3",
    "testharness"
   ],
   "service-workers/service-worker/performance-timeline.https.html": [
    "23d9e3dc830b83370875387cd5d6e1d5e913452f",
    "testharness"
   ],
   "service-workers/service-worker/postmessage-from-waiting-serviceworker.https.html": [
-   "a3a2734be01c2e410a32daf9342f1e211ce22325",
+   "99519ec3ef70e08fe42fce50bb6e9d643a2daa9f",
    "testharness"
   ],
   "service-workers/service-worker/postmessage-msgport-to-client.https.html": [
    "21ae7fb96321dc75e7063c27b7e6838e6b9ff6c6",
    "testharness"
   ],
   "service-workers/service-worker/postmessage-to-client.https.html": [
    "4f91d302091df45ca72567c2cedc1584ad9045a9",
@@ -200304,17 +200402,17 @@
    "b15855240cf7dbc5df4ee30a544d7ff94935d146",
    "support"
   ],
   "service-workers/service-worker/resources/dummy.txt": [
    "33ab5639bfd8e7b95eb1d8d0b87781d4ffea4d5d",
    "support"
   ],
   "service-workers/service-worker/resources/echo-message-to-source-worker.js": [
-   "449055cd2d8c41f2e3c78a8a748287faee664759",
+   "760b04aa2e36f55cfdbea0871a7424f787734a6e",
    "support"
   ],
   "service-workers/service-worker/resources/empty-but-slow-worker.js": [
    "36ecac2f5ab2d3738ca72a7a7d1c605dbec97ff1",
    "support"
   ],
   "service-workers/service-worker/resources/empty-worker.js": [
    "84b3339c3419e318803e51f46d7252d9e8ac183b",
@@ -219272,17 +219370,17 @@
    "cfaa1c59bdfefe7682fd73152e2d4a706a415aaa",
    "support"
   ],
   "webvtt/webvtt-file-format-parsing/webvtt-file-parsing/support/ids.vtt": [
    "e94efc2cea87f5ebaba3d7a46bdfe1f74cd556ef",
    "support"
   ],
   "webvtt/webvtt-file-format-parsing/webvtt-file-parsing/support/newlines.vtt": [
-   "ba3848383a2197647a9c34c52150991ecb87f22a",
+   "a5bfb88a0066da230fbf05f0cf9d200f73c0bb12",
    "support"
   ],
   "webvtt/webvtt-file-format-parsing/webvtt-file-parsing/support/no-signature.vtt": [
    "71ffec71e6a8923027309dd41c591302ac880550",
    "support"
   ],
   "webvtt/webvtt-file-format-parsing/webvtt-file-parsing/support/nulls.vtt": [
    "140e16000f93f8565c28c2fd12a638afcc6bbf05",
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/beacon/headers/header-referrer-no-referrer-when-downgrade.https.html.ini
@@ -0,0 +1,3 @@
+[header-referrer-no-referrer-when-downgrade.https.html]
+  type: testharness
+  prefs: [security.mixed_content.block_active_content:false, security.mixed_content.block_display_content:false]
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/beacon/headers/header-referrer-strict-origin-when-cross-origin.https.html.ini
@@ -0,0 +1,4 @@
+[header-referrer-strict-origin-when-cross-origin.https.html]
+  type: testharness
+  prefs: [security.mixed_content.block_active_content:false, security.mixed_content.block_display_content:false]
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/beacon/headers/header-referrer-strict-origin.https.html.ini
@@ -0,0 +1,3 @@
+[header-referrer-strict-origin.https.html]
+  type: testharness
+  prefs: [security.mixed_content.block_active_content:false, security.mixed_content.block_display_content:false]
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/beacon/headers/header-referrer-unsafe-url.https.html.ini
@@ -0,0 +1,3 @@
+[header-referrer-unsafe-url.https.html]
+  type: testharness
+  prefs: [security.mixed_content.block_active_content:false, security.mixed_content.block_display_content:false]
--- a/testing/web-platform/mozilla/meta/MANIFEST.json
+++ b/testing/web-platform/mozilla/meta/MANIFEST.json
@@ -895,17 +895,17 @@
    "6cd254447dea53268ce9ec8ce8a075c7803b5393",
    "testharness"
   ],
   "focus/Selection_setBaseAndExtent.html": [
    "cd25aacffbaabbeafa443140f9b08ff75a838116",
    "testharness"
   ],
   "html/semantics/forms/textfieldselection/selection-value-interactions.html": [
-   "6c5e95a8f2f11d106e669eb82b46ffff73d08335",
+   "2083d78d4a6a7b48994f17909790dfeb1ac903ae",
    "testharness"
   ],
   "html/semantics/scripting-1/the-script-element/create-module-script.html": [
    "3214bced5d81e8001a321aea4c80675b6603b11d",
    "testharness"
   ],
   "html/semantics/scripting-1/the-script-element/reload-failed-module-script.html": [
    "5b8cf6809bd8d0797f4172bf9a01f9085c0abbaf",
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/beacon/headers/header-referrer-no-referrer-when-downgrade.https.html
@@ -0,0 +1,21 @@
+<!doctype html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>SendBeacon Referrer Header No Referrer When Downgrade Policy</title>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <meta name='referrer' content='no-referrer-when-downgrade'>
+  </head>
+  <body>
+    <script src="/common/utils.js"></script>
+    <script src="/common/get-host-info.sub.js"></script>
+    <script src="/beacon/headers/header-referrer.js"></script>
+    <script>
+      var testBase = get_host_info().HTTPS_ORIGIN + RESOURCES_DIR;
+      testReferrerHeader(testBase, referrerUrl);
+      testBase = get_host_info().HTTP_ORIGIN + RESOURCES_DIR;
+      testReferrerHeader(testBase, "");
+    </script>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/beacon/headers/header-referrer-no-referrer.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>SendBeacon Referrer Header No Referrer Policy</title>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <meta name='referrer' content='no-referrer'>
+  </head>
+  <body>
+    <script src="/common/utils.js"></script>
+    <script src="/common/get-host-info.sub.js"></script>
+    <script src="header-referrer.js"></script>
+    <script>
+      var testBase = RESOURCES_DIR;
+      testReferrerHeader(testBase, "");
+    </script>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/beacon/headers/header-referrer-origin-when-cross-origin.html
@@ -0,0 +1,21 @@
+<!doctype html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>SendBeacon Referrer Header Origin When Cross Origin Policy</title>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <meta name='referrer' content='origin-when-cross-origin'>
+  </head>
+  <body>
+    <script src="/common/utils.js"></script>
+    <script src="/common/get-host-info.sub.js"></script>
+    <script src="header-referrer.js"></script>
+    <script>
+      var testBase = get_host_info().HTTP_ORIGIN + RESOURCES_DIR;
+      testReferrerHeader(testBase, referrerUrl);
+      testBase = get_host_info().HTTP_REMOTE_ORIGIN + RESOURCES_DIR;
+      testReferrerHeader(testBase, referrerOrigin);
+    </script>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/beacon/headers/header-referrer-origin.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>SendBeacon Referrer Header Origin Policy</title>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <meta name='referrer' content='origin'>
+  </head>
+  <body>
+    <script src="/common/utils.js"></script>
+    <script src="/common/get-host-info.sub.js"></script>
+    <script src="header-referrer.js"></script>
+    <script>
+      var testBase = get_host_info().HTTP_REMOTE_ORIGIN + RESOURCES_DIR;
+      testReferrerHeader(testBase, referrerOrigin);
+    </script>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/beacon/headers/header-referrer-same-origin.html
@@ -0,0 +1,21 @@
+<!doctype html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>SendBeacon Referrer Header Same Origin Policy</title>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <meta name='referrer' content='same-origin'>
+  </head>
+  <body>
+    <script src="/common/utils.js"></script>
+    <script src="/common/get-host-info.sub.js"></script>
+    <script src="header-referrer.js"></script>
+    <script>
+      var testBase = RESOURCES_DIR;
+      testReferrerHeader(testBase, referrerUrl);
+      testBase = get_host_info().HTTP_REMOTE_ORIGIN + RESOURCES_DIR;
+      testReferrerHeader(testBase, "");
+    </script>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/beacon/headers/header-referrer-strict-origin-when-cross-origin.https.html
@@ -0,0 +1,21 @@
+<!doctype html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>SendBeacon Referrer Header Strict Origin Policy</title>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <meta name='referrer' content='strict-origin'>
+  </head>
+  <body>
+    <script src="/common/utils.js"></script>
+    <script src="/common/get-host-info.sub.js"></script>
+    <script src="/beacon/headers/header-referrer.js"></script>
+    <script>
+      var testBase = get_host_info().HTTPS_ORIGIN +  RESOURCES_DIR;
+      testReferrerHeader(testBase, referrerOrigin);
+      testBase = get_host_info().HTTP_ORIGIN + RESOURCES_DIR;
+      testReferrerHeader(testBase, "");
+    </script>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/beacon/headers/header-referrer-strict-origin.https.html
@@ -0,0 +1,21 @@
+<!doctype html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>SendBeacon Referrer Header Strict Origin Policy</title>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <meta name='referrer' content='strict-origin'>
+  </head>
+  <body>
+    <script src="/common/utils.js"></script>
+    <script src="/common/get-host-info.sub.js"></script>
+    <script src="/beacon/headers/header-referrer.js"></script>
+    <script>
+      var testBase = get_host_info().HTTPS_ORIGIN +  RESOURCES_DIR;
+      testReferrerHeader(testBase, referrerOrigin);
+      testBase = get_host_info().HTTP_ORIGIN + RESOURCES_DIR;
+      testReferrerHeader(testBase, "");
+    </script>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/beacon/headers/header-referrer-unsafe-url.https.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>SendBeacon Referrer Header Unsafe Url Policy</title>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <meta name='referrer' content='unsafe-url'>
+  </head>
+  <body>
+    <script src="/common/utils.js"></script>
+    <script src="/common/get-host-info.sub.js"></script>
+    <script src="/beacon/headers/header-referrer.js"></script>
+    <script>
+      var testBase = get_host_info().HTTP_ORIGIN + RESOURCES_DIR;
+      testReferrerHeader(testBase, referrerUrl);
+    </script>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/beacon/headers/header-referrer.js
@@ -0,0 +1,41 @@
+var RESOURCES_DIR = "/beacon/resources/";
+
+var referrerOrigin = self.location.origin + '/';
+var referrerUrl = self.location.href;
+
+function testReferrerHeader(testBase, expectedReferrer) {
+  var id = self.token();
+  var testUrl = testBase + "inspect-header.py?header=referer&cmd=put&id=" + id;
+
+  promise_test(function(test) {
+    assert_true(navigator.sendBeacon(testUrl), "SendBeacon Succeeded");
+    return pollResult(expectedReferrer, id) .then(result => {
+      assert_equals(result, expectedReferrer, "Correct referrer header result");
+    });
+  }, "Successful test ");
+}
+
+// SendBeacon is an asynchronous and non-blocking request to a web server.
+// We may have to create a poll loop to get result from server
+function pollResult(expectedReferrer, id) {
+  var checkUrl = RESOURCES_DIR + "inspect-header.py?header=referer&cmd=get&id=" + id;
+
+  return new Promise(resolve => {
+    function checkResult() {
+      fetch(checkUrl).then(
+        function(response) {
+          assert_equals(response.status, 200, "Inspect header response's status is 200");
+          let result = response.headers.get("x-request-referer");
+
+          if (result != undefined) {
+            resolve(result);
+          } else {
+            step_timeout(checkResult.bind(this), 100);
+          }
+        });
+    }
+
+    checkResult();
+  });
+
+}
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/beacon/resources/inspect-header.py
@@ -0,0 +1,18 @@
+def main(request, response):
+    headers = [("Content-Type", "text/plain")]
+    command = request.GET.first("cmd").lower();
+    test_id = request.GET.first("id")
+    header = request.GET.first("header")
+    if command == "put":
+        request.server.stash.put(test_id, request.headers.get(header, ""))
+
+    elif command == "get":
+        stashed_header = request.server.stash.take(test_id)
+        if stashed_header is not None:
+            headers.append(("x-request-" + header, stashed_header ))
+
+    else:
+        response.set_error(400, "Bad Command")
+        return "ERROR: Bad Command!"
+
+    return headers, ""