86 lines
2.4 KiB
JavaScript
86 lines
2.4 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
https://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
// Test that HTTPS-Only/-First doesn't downgrade the current load on its
|
|
// background timer if the load is blocked by the client certificate dialog (Bug
|
|
// 1968527).
|
|
|
|
function runTest() {
|
|
return BrowserTestUtils.withNewTab("about:blank", async function (browser) {
|
|
const certDialogPromise = new Promise(resolve =>
|
|
Services.obs.addObserver(resolve, "cert-dialog-loaded")
|
|
);
|
|
|
|
BrowserTestUtils.startLoadingURIString(
|
|
browser,
|
|
// eslint-disable-next-line sdl/no-insecure-url
|
|
"http://requireclientcert.example.com"
|
|
);
|
|
|
|
const certDialog = await certDialogPromise;
|
|
|
|
is(certDialog.checkVisibility(), true, "Client cert dialog should be open");
|
|
|
|
is(browser.currentURI.displaySpec, "about:blank", "Page should be loading");
|
|
|
|
await new Promise(resolve => {
|
|
// The expected behavior is to have no downgrade happen and have the load
|
|
// continue indefinetely waiting for user input. There is no event we can
|
|
// listen to to test this, so we will have to do this with a timeout
|
|
// instead.
|
|
// eslint-disable-next-line mozilla/no-arbitrary-setTimeout
|
|
setTimeout(resolve, 500);
|
|
});
|
|
|
|
is(
|
|
certDialog.checkVisibility(),
|
|
true,
|
|
"Client cert dialog should still be open after 500ms"
|
|
);
|
|
|
|
is(
|
|
browser.currentURI.displaySpec,
|
|
"about:blank",
|
|
"Page should still be loading after 500ms"
|
|
);
|
|
});
|
|
}
|
|
|
|
add_setup(async function () {
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [
|
|
["security.default_personal_cert", "Ask Every Time"],
|
|
// (Almost) instantly perform the downgrade
|
|
["dom.security.https_only_fire_http_request_background_timer_ms", 100],
|
|
],
|
|
});
|
|
});
|
|
|
|
describe("Client certificate", function () {
|
|
afterEach(async function () {
|
|
// Forget about requireclientcert.example.com again
|
|
await new Promise(resolve =>
|
|
Services.clearData.deleteDataFromHost(
|
|
"requireclientcert.example.com",
|
|
false,
|
|
Services.clearData.CLEAR_CLIENT_AUTH_REMEMBER_SERVICE,
|
|
resolve
|
|
)
|
|
);
|
|
});
|
|
|
|
it("HTTPS-First", async function () {
|
|
await runTest();
|
|
});
|
|
|
|
it("HTTPS-Only", async function () {
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [["dom.security.https_only_mode", true]],
|
|
});
|
|
|
|
await runTest();
|
|
});
|
|
});
|