--- 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, ""