/* 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 @microsoft/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(); }); });