Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
/* Any copyright is dedicated to the Public Domain.
"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 @microsoft/sdl/no-insecure-url
);
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();
});
});