Bug 1422973 - add test for merging Cookie header in onBeforeSendHeaders, r=mixedpuppy draft 1422973-merging-onBeforeSendHeaders
authorPeter Snyder <psnyde2@uic.edu>
Thu, 07 Dec 2017 23:14:23 -0600
branch1422973-merging-onBeforeSendHeaders
changeset 710293 2c27efe7d226f5a8bf927a47a40fb95dad37bedb
parent 709517 1514dd91f40e7009b736a7d74f209b5217fee3f8
child 743564 e07763863e82180167fe29767dac95be55ddfacd
push id92803
push userbmo:psnyde2@uic.edu
push dateSat, 09 Dec 2017 05:16:34 +0000
reviewersmixedpuppy
bugs1422973
milestone59.0a1
Bug 1422973 - add test for merging Cookie header in onBeforeSendHeaders, r=mixedpuppy MozReview-Commit-ID: K9FvzlqhxEQ
toolkit/components/extensions/test/mochitest/mochitest-common.ini
toolkit/components/extensions/test/mochitest/test_ext_webrequestblocking_merge_request_headers.html
toolkit/components/extensions/test/mochitest/test_ext_webrequestblocking_set_cookie.html
--- 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);