Bug 1368527 test event timing using hsts,r?dragana,kmag
MozReview-Commit-ID: Dbb56Bkicdd
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
@@ -1,14 +1,15 @@
[DEFAULT]
support-files =
chrome_cleanup_script.js
head.js
head_unlimitedStorage.js
head_webrequest.js
+ hsts.sjs
file_mixed.html
file_csp.html
file_csp.html^headers^
file_to_drawWindow.html
file_WebRequest_page3.html
file_WebRequest_permission_original.html
file_WebRequest_permission_redirected.html
file_WebRequest_permission_original.js
@@ -35,16 +36,17 @@ support-files =
file_script_bad.js
file_script_redirect.js
file_script_xhr.js
file_remote_frame.html
file_sample.html
file_simple_xhr.html
file_simple_xhr_frame.html
file_simple_xhr_frame2.html
+ redirect_auto.sjs
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
!/toolkit/components/passwordmgr/test/authenticate.sjs
@@ -110,16 +112,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,112 @@
+<!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": [
+ "tabs",
+ "webRequest",
+ "webRequestBlocking",
+ "<all_urls>",
+ ],
+ };
+ return ExtensionTestUtils.loadExtension({
+ manifest,
+ background,
+ });
+}
+
+// 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 expect;
+ let extension = getExtension(async function() {
+ let urls = ["*://example.org/tests/*"];
+ browser.webRequest.onBeforeRequest.addListener(details => {
+ browser.test.assertEq(expect.shift(), "onBeforeRequest");
+ }, {urls}, ["blocking"]);
+ browser.webRequest.onBeforeSendHeaders.addListener(details => {
+ browser.test.assertEq(expect.shift(), "onBeforeSendHeaders");
+ }, {urls}, ["blocking", "requestHeaders"]);
+ browser.webRequest.onSendHeaders.addListener(details => {
+ browser.test.assertEq(expect.shift(), "onSendHeaders");
+ }, {urls}, ["requestHeaders"]);
+ browser.webRequest.onHeadersReceived.addListener(details => {
+ browser.test.assertEq(expect.shift(), "onHeadersReceived");
+ }, {urls}, ["blocking", "responseHeaders"]);
+ browser.webRequest.onBeforeRedirect.addListener(details => {
+ browser.test.assertEq(expect.shift(), "onBeforeRedirect");
+ }, {urls});
+ browser.webRequest.onResponseStarted.addListener(details => {
+ browser.test.assertEq(expect.shift(), "onResponseStarted");
+ }, {urls});
+ browser.webRequest.onCompleted.addListener(details => {
+ browser.test.assertEq(expect.shift(), "onCompleted");
+ }, {urls});
+ browser.webRequest.onErrorOccurred.addListener(details => {
+ browser.test.notifyFail(`onErrorOccurred ${JSON.stringify(details)}`);
+ }, {urls});
+
+ async function onUpdated(tabId, tabInfo, tab) {
+ if (tabInfo.status !== "complete") {
+ return;
+ }
+ browser.tabs.remove(tabId);
+ browser.tabs.onUpdated.removeListener(onUpdated);
+ browser.test.sendMessage("tabs-done", tab.url);
+ }
+ browser.test.onMessage.addListener((url, expected) => {
+ expect = expected;
+ browser.tabs.onUpdated.addListener(onUpdated);
+ browser.tabs.create({url});
+ });
+ });
+ await extension.startup();
+
+ // simple redirect
+ let sample = "https://example.org/tests/toolkit/components/extensions/test/mochitest/file_sample.html";
+ extension.sendMessage(`https://${testPath}/redirect_auto.sjs?redirect_uri=${sample}`,
+ ["onBeforeRequest", "onBeforeSendHeaders", "onSendHeaders",
+ "onHeadersReceived", "onBeforeRedirect", "onBeforeRequest",
+ "onBeforeSendHeaders", "onSendHeaders", "onHeadersReceived",
+ "onResponseStarted", "onCompleted"]);
+ // redirect_auto adds a query string
+ ok((await extension.awaitMessage("tabs-done")).startsWith(sample), "redirection ok");
+
+ // priming hsts
+ extension.sendMessage(`https://${testPath}/hsts.sjs`,
+ ["onBeforeRequest", "onBeforeSendHeaders", "onSendHeaders",
+ "onHeadersReceived", "onResponseStarted", "onCompleted"]);
+ is(await extension.awaitMessage("tabs-done"),
+ "https://example.org/tests/toolkit/components/extensions/test/mochitest/hsts.sjs",
+ "hsts primed");
+
+ // test upgrade
+ extension.sendMessage(`http://${testPath}/hsts.sjs`,
+ ["onBeforeRequest", "onBeforeRedirect", "onBeforeRequest",
+ "onBeforeSendHeaders", "onSendHeaders", "onHeadersReceived",
+ "onResponseStarted", "onCompleted"]);
+ is(await extension.awaitMessage("tabs-done"),
+ "https://example.org/tests/toolkit/components/extensions/test/mochitest/hsts.sjs",
+ "hsts upgraded");
+
+ await extension.unload();
+});
+</script>
+</head>
+<body>
+
+</body>
+</html>
--- a/toolkit/components/extensions/test/mochitest/test_ext_webrequest_suspend.html
+++ b/toolkit/components/extensions/test/mochitest/test_ext_webrequest_suspend.html
@@ -73,26 +73,26 @@ add_task(async function test_suspend() {
// listener are correctly resumed.
add_task(async function test_error_resume() {
let chromeScript = SpecialPowers.loadChromeScript(() => {
const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
Cu.import("resource://gre/modules/Services.jsm");
let observer = channel => {
if (channel instanceof Ci.nsIHttpChannel && channel.URI.spec === "http://example.com/") {
- Services.obs.removeObserver(observer, "http-on-modify-request");
+ Services.obs.removeObserver(observer, "http-on-before-connect");
// Wait until the next tick to make sure this runs after WebRequest observers.
Promise.resolve().then(() => {
channel.cancel(Cr.NS_BINDING_ABORTED);
});
}
};
- Services.obs.addObserver(observer, "http-on-modify-request");
+ Services.obs.addObserver(observer, "http-on-before-connect");
});
let extension = ExtensionTestUtils.loadExtension({
manifest: {
permissions: [
"webRequest",
"webRequestBlocking",
"http://example.com/",