Bug 1368527 test using hsts to see flow draft
authorShane Caraveo <scaraveo@mozilla.com>
Thu, 27 Jul 2017 14:55:19 -0700
changeset 617075 9c8ead58eaf1a3b52753b2c89ba99ee506817f4d
parent 617074 775d00252f0a28fc9fe5c19aa6de9f7624c7709d
child 639692 d911107318ec956b7c3392c0353df14a38be7ea0
push id70917
push usermixedpuppy@gmail.com
push dateThu, 27 Jul 2017 21:55:40 +0000
bugs1368527
milestone56.0a1
Bug 1368527 test using hsts to see flow MozReview-Commit-ID: EJVkU4ORGis
toolkit/components/extensions/test/mochitest/hsts.sjs
toolkit/components/extensions/test/mochitest/mochitest-common.ini
toolkit/components/extensions/test/mochitest/test_ext_webrequest_hsts.html
new file mode 100644
--- /dev/null
+++ b/toolkit/components/extensions/test/mochitest/hsts.sjs
@@ -0,0 +1,8 @@
+function handleRequest(request, response) {
+  let page = "<!DOCTYPE html><html><body><p>HSTS page</p></body></html>";
+  response.setStatusLine(request.httpVersion, "200", "OK");
+  response.setHeader("Strict-Transport-Security", "max-age=60");
+  response.setHeader("Content-Type", "text/html", false);
+  response.setHeader("Content-Length", page.length + "", false);
+  response.write(page);
+}
--- a/toolkit/components/extensions/test/mochitest/mochitest-common.ini
+++ b/toolkit/components/extensions/test/mochitest/mochitest-common.ini
@@ -42,16 +42,17 @@ support-files =
   file_simple_xhr_frame2.html
   redirection.sjs
   file_privilege_escalation.html
   file_ext_test_api_injection.js
   file_permission_xhr.html
   file_teardown_test.js
   return_headers.sjs
   webrequest_worker.js
+  hsts.sjs
   !/toolkit/components/passwordmgr/test/authenticate.sjs
   !/dom/tests/mochitest/geolocation/network_geolocation.sjs
 
 [test_ext_clipboard.html]
 # skip-if = # disabled test case with_permission_allow_copy, see inline comment.
 [test_ext_inIncognitoContext_window.html]
 skip-if = os == 'android' # Android does not support multiple windows.
 [test_ext_geturl.html]
@@ -110,16 +111,17 @@ skip-if = os == 'android' # Bug 1258975 
 # (it has only been enabled for apps and privileged code). See Bug 1119462 for additional info.
 skip-if = os == 'android'
 [test_ext_unload_frame.html]
 [test_ext_listener_proxies.html]
 [test_ext_web_accessible_resources.html]
 [test_ext_webrequest_auth.html]
 skip-if = os == 'android'
 [test_ext_webrequest_background_events.html]
+[test_ext_webrequest_hsts.html]
 [test_ext_webrequest_basic.html]
 [test_ext_webrequest_filter.html]
 [test_ext_webrequest_frameId.html]
 [test_ext_webrequest_suspend.html]
 [test_ext_webrequest_upload.html]
 skip-if = os == 'android' # Currently fails in emulator tests
 [test_ext_webrequest_permission.html]
 [test_ext_webrequest_websocket.html]
new file mode 100644
--- /dev/null
+++ b/toolkit/components/extensions/test/mochitest/test_ext_webrequest_hsts.html
@@ -0,0 +1,92 @@
+<!DOCTYPE HTML>
+
+<html>
+<head>
+<meta charset="utf-8">
+  <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>
+  <script type="text/javascript" src="head_webrequest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+<script>
+"use strict";
+
+function getExtension(background) {
+  let manifest = {
+    "permissions": [
+      "webRequest",
+      "webRequestBlocking",
+      "<all_urls>",
+    ],
+  };
+  return ExtensionTestUtils.loadExtension({
+    manifest,
+    background,
+  });
+}
+
+add_task(async function test_test() {
+  ok(true, "this test has run");
+});
+
+// This test makes a request against a server that redirects with a 302.
+add_task(async function test_hsts_request() {
+  const testPath = "example.org/tests/toolkit/components/extensions/test/mochitest";
+
+  let extension = getExtension(async function() {
+    let urls = ["*://example.org/tests/*"];
+    browser.webRequest.onBeforeRequest.addListener(details => {
+      browser.test.log(`onBeforeRequest ${JSON.stringify(details)}`);
+    }, {urls}, ["blocking"]);
+    browser.webRequest.onBeforeSendHeaders.addListener(details => {
+      browser.test.log(`onBeforeSendHeaders ${JSON.stringify(details)}`);
+    }, {urls}, ["blocking", "requestHeaders"]);
+    browser.webRequest.onSendHeaders.addListener(details => {
+      browser.test.log(`onSendHeaders ${JSON.stringify(details)}`);
+    }, {urls}, ["requestHeaders"]);
+    browser.webRequest.onHeadersReceived.addListener(details => {
+      browser.test.log(`onHeadersReceived ${JSON.stringify(details)}`);
+    }, {urls}, ["blocking", "responseHeaders"]);
+    browser.webRequest.onBeforeRedirect.addListener(details => {
+      browser.test.log(`onBeforeRedirect ${JSON.stringify(details)}`);
+    }, {urls});
+    browser.webRequest.onResponseStarted.addListener(details => {
+      browser.test.log(`onResponseStarted ${JSON.stringify(details)}`);
+    }, {urls});
+    browser.webRequest.onCompleted.addListener(details => {
+      browser.test.log(`onCompleted ${JSON.stringify(details)}`);
+    }, {urls});
+    browser.webRequest.onErrorOccurred.addListener(details => {
+      browser.test.log(`onErrorOccurred ${JSON.stringify(details)}`);
+    }, {urls});
+
+    async function onUpdated(tabId, tabInfo, tab) {
+      if (tabInfo.status !== "complete") {
+        return;
+      }
+      browser.test.log(`tab created ${tabId} ${JSON.stringify(tabInfo)} ${tab.url}`);
+      browser.tabs.remove(tabId);
+      browser.tabs.onUpdated.removeListener(onUpdated);
+      browser.test.sendMessage("tabs-done");
+    }
+    browser.test.onMessage.addListener(url => {
+      browser.tabs.onUpdated.addListener(onUpdated);
+      browser.tabs.create({url});
+    });
+  });
+  await extension.startup();
+  extension.sendMessage(`https://${testPath}/redirection.sjs`);
+  await extension.awaitMessage("tabs-done");
+  extension.sendMessage(`https://${testPath}/hsts.sjs`);
+  await extension.awaitMessage("tabs-done");
+  extension.sendMessage(`http://${testPath}/hsts.sjs`);
+  await extension.awaitMessage("tabs-done");
+  await extension.unload();
+});
+</script>
+</head>
+<body>
+
+</body>
+</html>