Bug 1422973 - add test for merging Cookie header in onBeforeSendHeaders, r=mixedpuppy
MozReview-Commit-ID: K9FvzlqhxEQ
--- a/toolkit/components/extensions/test/mochitest/mochitest-common.ini
+++ b/toolkit/components/extensions/test/mochitest/mochitest-common.ini
@@ -81,16 +81,17 @@ skip-if = (os == 'linux' && debug) || (t
[test_ext_contentscript_devtools_metadata.html]
[test_ext_contentscript_exporthelpers.html]
[test_ext_contentscript_incognito.html]
skip-if = os == 'android' # Android does not support multiple windows.
[test_ext_contentscript_css.html]
[test_ext_contentscript_about_blank.html]
skip-if = os == 'android' # bug 1369440
[test_ext_webrequestblocking_set_cookie.html]
+[test_ext_webrequestblocking_merge_request_headers.html]
[test_ext_contentscript_permission.html]
[test_ext_contentscript_teardown.html]
[test_ext_exclude_include_globs.html]
[test_ext_external_messaging.html]
[test_ext_generate.html]
[test_ext_geolocation.html]
skip-if = os == 'android' # Android support Bug 1336194
[test_ext_identity.html]
new file mode 100644
--- /dev/null
+++ b/toolkit/components/extensions/test/mochitest/test_ext_webrequestblocking_merge_request_headers.html
@@ -0,0 +1,116 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Testing modifying headers in webRequest.onBeforeSendHeaders</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
+ <script type="text/javascript" src="head.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<script type="text/javascript">
+"use strict";
+
+add_task(async function test_merge_cookie_header_on_onBeforeSendHeaders() {
+ SimpleTest.waitForExplicitFinish();
+
+ async function background() {
+ /**
+ * Opens up a new tab, loading the given file.
+ *
+ * @param {string} filename
+ * The name of a html file in the
+ * "toolkit/components/extensions/test/mochitest" directory.
+ *
+ * @returns {object}
+ * An object with windowId and tabId properties, describing the tab
+ * that was opened.
+ */
+ async function openWindowAndTab(filename) {
+ const fileUrl = `http://mochi.test:8888/tests/toolkit/components/extensions/test/mochitest/${filename}?nocache=${Math.random()}`;
+ const tabReadyPromise = new Promise(resolve => {
+ browser.webNavigation.onDOMContentLoaded.addListener(function listener({tabId}) {
+ browser.webNavigation.onDOMContentLoaded.removeListener(listener);
+ resolve(tabId);
+ }, {
+ url: [{
+ urlPrefix: fileUrl,
+ }],
+ });
+ });
+ const {id: windowId} = await browser.windows.create({url: fileUrl});
+ const tabId = await tabReadyPromise;
+ return {windowId, tabId};
+ }
+
+ const filter = {
+ urls: ["<all_urls>"],
+ types: ["main_frame", "sub_frame"],
+ };
+ const extraInfoSpec = ["blocking", "requestHeaders"];
+
+ const listener = details => {
+ details.requestHeaders.push({
+ name: "Cookie",
+ value: "firstcookie=firstvalue",
+ });
+ details.requestHeaders.push({
+ name: "Cookie",
+ value: "secondcookie=secondvalue",
+ });
+
+ return {
+ requestHeaders: details.requestHeaders,
+ };
+ };
+
+ browser.webRequest.onBeforeSendHeaders.addListener(listener, filter, extraInfoSpec);
+
+ const tabInfo = await openWindowAndTab("return_headers.sjs");
+ const tabContent = await browser.tabs.executeScript(tabInfo.tabId, {
+ code: "document.getElementsByTagName('pre')[0].innerText",
+ });
+
+ // We expect back to values in the cookie header, either
+ // "firstcookie=firstvalue; secondname=secondvalue" or the same cookies, but order reversed.
+ const parsedHeaders = JSON.parse(tabContent[0].trim());
+ await browser.windows.remove(tabInfo.windowId);
+
+ // Create a mapping of cookie names to values.
+ const foundCookies = parsedHeaders.cookie
+ .trim()
+ .split("; ")
+ .reduce((prev, next) => {
+ const [cookieName, cookieValue] = next.trim().split("=");
+ prev[cookieName] = cookieValue;
+ return prev;
+ }, {});
+
+ browser.test.assertEq("firstvalue", foundCookies.firstcookie, "Should have sent firstcookie=firstvalue");
+ browser.test.assertEq("secondvalue", foundCookies.secondname, "Should have sent secondname=secondvalue");
+
+ browser.test.sendMessage("complete");
+ }
+
+ const extension = ExtensionTestUtils.loadExtension({
+ manifest: {
+ permissions: [
+ "tabs",
+ "webNavigation",
+ "webRequest",
+ "webRequestBlocking",
+ "<all_urls>",
+ ],
+ },
+ background,
+ });
+
+ await extension.startup();
+ await extension.awaitMessage("complete");
+ await extension.unload();
+});
+</script>
+</body>
+</html>
--- a/toolkit/components/extensions/test/mochitest/test_ext_webrequestblocking_set_cookie.html
+++ b/toolkit/components/extensions/test/mochitest/test_ext_webrequestblocking_set_cookie.html
@@ -137,18 +137,16 @@ add_task(async function test_modifying_c
// sets a cookie (thirdcookie=thirdvalue), to make sure modifications from
// multiple onHeadersReceived listeners are merged correctly.
const thirdOnHeadersRecievedListener = details => {
details.responseHeaders.push({
name: "Set-Cookie",
value: "thirdcookie=thirdvalue",
});
- browser.test.log(JSON.stringify(details.responseHeaders));
-
return {
responseHeaders: details.responseHeaders,
};
};
browser.webRequest.onHeadersReceived.addListener(thirdOnHeadersRecievedListener, filter, headersReceivedInfoSpec);
await testCookiesWithFile("file_webrequestblocking_set_cookie.html", ["ext", "req", "third"]);
browser.webRequest.onHeadersReceived.removeListener(onHeadersReceived);
browser.webRequest.onHeadersReceived.removeListener(thirdOnHeadersRecievedListener);