Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
"use strict";
// We need to request longer timeout because HTTPS-Only Mode sends the
// backround http request with a delay of N milliseconds before the
// actual load gets cancelled.
requestLongerTimeout(2);
const TEST_PATH_HTTP = getRootDirectory(gTestPath).replace(
// This needs to be insecure so it can be upgraded
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
);
const TEST_PATH_HTTPS = getRootDirectory(gTestPath).replace(
);
const HSTS_SITE = TEST_PATH_HTTPS + "file_https_telemetry_hsts.sjs";
const TIMEOUT_PAGE_URI_HTTP =
TEST_PATH_HTTP + "file_errorpage_no_timeout_server.sjs";
const TIMEOUT_PAGE_URI_HTTPS =
TEST_PATH_HTTPS + "file_errorpage_no_timeout_server.sjs";
async function runUpgradeTest(aURI, aDesc, aAssertURLStartsWith) {
await BrowserTestUtils.withNewTab("about:blank", async function (browser) {
const loaded = BrowserTestUtils.browserLoaded(browser, false, null, true);
BrowserTestUtils.startLoadingURIString(browser, aURI);
await loaded;
await SpecialPowers.spawn(
browser,
[aDesc, aAssertURLStartsWith],
async function (aDesc, aAssertURLStartsWith) {
ok(
content.document.location.href.startsWith(aAssertURLStartsWith),
aDesc
);
}
);
await SpecialPowers.removePermission("https-only-load-insecure", aURI);
});
}
async function getPage(wanted) {
await BrowserTestUtils.withNewTab("about:blank", async function (browser) {
info(`wanted: ${wanted}`);
let loaded = BrowserTestUtils.browserLoaded(
browser,
false, // includeSubFrames = false, no need to includeSubFrames
TIMEOUT_PAGE_URI_HTTPS,
true // maybeErrorPage = true, because we need the error page to appear
);
BrowserTestUtils.startLoadingURIString(browser, TIMEOUT_PAGE_URI_HTTP);
await loaded;
await SpecialPowers.spawn(browser, [wanted], async function (wanted) {
const doc = content.document;
let errorPage = doc.body.innerHTML;
ok(
errorPage.includes(wanted),
`Response must contain search string: ${wanted}`
);
});
});
}
add_setup(async function () {
await SpecialPowers.pushPrefEnv({
set: [
// Reduce dom.security.https_only_fire_http_request_background_timer_ms to 1s
["dom.security.https_only_fire_http_request_background_timer_ms", 1000],
// If only the user wants upgrades, we offer fallbacks.
// But even if the user wants upgrades, we shouldn't fallback if HSTS is on.
["dom.security.https_only_mode", true],
["dom.security.https_first", true],
["dom.security.https_first_schemeless", true],
],
});
});
add_task(async function wait_longer_for_hsts_page() {
// Without HSTS we should be timing out and showing the HTTPS-only error page.
await getPage("about-httpsonly-title-site-not-available");
// Set up HSTS by querying a site which returns the header
await BrowserTestUtils.withNewTab("about:blank", async function (browser) {
const loaded = BrowserTestUtils.browserLoaded(browser, false, null, true);
BrowserTestUtils.startLoadingURIString(browser, HSTS_SITE);
await loaded;
});
// With HSTS enabled we should be waiting for the secure site to load.
await getPage("slow");
// Disable HSTS again!
const sss = Cc["@mozilla.org/ssservice;1"].getService(
Ci.nsISiteSecurityService
);
sss.clearAll();
});