From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../browser_captivePortal_certErrorUI.js | 221 +++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 browser/base/content/test/captivePortal/browser_captivePortal_certErrorUI.js (limited to 'browser/base/content/test/captivePortal/browser_captivePortal_certErrorUI.js') diff --git a/browser/base/content/test/captivePortal/browser_captivePortal_certErrorUI.js b/browser/base/content/test/captivePortal/browser_captivePortal_certErrorUI.js new file mode 100644 index 0000000000..d23125a627 --- /dev/null +++ b/browser/base/content/test/captivePortal/browser_captivePortal_certErrorUI.js @@ -0,0 +1,221 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +add_setup(async function () { + await SpecialPowers.pushPrefEnv({ + set: [ + ["captivedetect.canonicalURL", CANONICAL_URL], + ["captivedetect.canonicalContent", CANONICAL_CONTENT], + ], + }); +}); + +// This tests the alternate cert error UI when we are behind a captive portal. +add_task(async function checkCaptivePortalCertErrorUI() { + info( + "Checking that the alternate cert error UI is shown when we are behind a captive portal" + ); + + // Open a second window in the background. Later, we'll check that + // when we click the button to open the captive portal tab, the tab + // only opens in the active window and not in the background one. + let secondWindow = await openWindowAndWaitForFocus(); + await SimpleTest.promiseFocus(window); + + await portalDetected(); + + // Check that we didn't open anything in the background window. + ensureNoPortalTab(secondWindow); + + let tab = await openCaptivePortalErrorTab(); + let browser = tab.linkedBrowser; + let portalTabPromise = BrowserTestUtils.waitForNewTab( + gBrowser, + CANONICAL_URL + ); + + await SpecialPowers.spawn(browser, [], async () => { + let doc = content.document; + let loginButton = doc.getElementById("openPortalLoginPageButton"); + await ContentTaskUtils.waitForCondition( + () => ContentTaskUtils.is_visible(loginButton), + "Captive portal error page UI is visible" + ); + + if (!Services.focus.focusedElement == loginButton) { + await ContentTaskUtils.waitForEvent(loginButton, "focus"); + } + + Assert.ok(true, "openPortalLoginPageButton has focus"); + info("Clicking the Open Login Page button"); + await EventUtils.synthesizeMouseAtCenter(loginButton, {}, content); + }); + + let portalTab = await portalTabPromise; + is( + gBrowser.selectedTab, + portalTab, + "Login page should be open in a new foreground tab." + ); + + // Check that we didn't open anything in the background window. + ensureNoPortalTab(secondWindow); + + // Make sure clicking the "Open Login Page" button again focuses the existing portal tab. + await BrowserTestUtils.switchTab(gBrowser, tab); + // Passing an empty function to BrowserTestUtils.switchTab lets us wait for an arbitrary + // tab switch. + portalTabPromise = BrowserTestUtils.switchTab(gBrowser, () => {}); + await SpecialPowers.spawn(browser, [], async () => { + info("Clicking the Open Login Page button."); + let loginButton = content.document.getElementById( + "openPortalLoginPageButton" + ); + await EventUtils.synthesizeMouseAtCenter(loginButton, {}, content); + }); + + info("Opening captive portal login page"); + let portalTab2 = await portalTabPromise; + is(portalTab2, portalTab, "The existing portal tab should be focused."); + + // Check that we didn't open anything in the background window. + ensureNoPortalTab(secondWindow); + + let portalTabClosing = BrowserTestUtils.waitForTabClosing(portalTab); + let errorTabReloaded = BrowserTestUtils.waitForErrorPage(browser); + + Services.obs.notifyObservers(null, "captive-portal-login-success"); + await portalTabClosing; + + info( + "Waiting for error tab to be reloaded after the captive portal was freed." + ); + await errorTabReloaded; + await SpecialPowers.spawn(browser, [], () => { + let doc = content.document; + ok( + !doc.body.classList.contains("captiveportal"), + "Captive portal error page UI is not visible." + ); + }); + + await BrowserTestUtils.removeTab(tab); + await BrowserTestUtils.closeWindow(secondWindow); +}); + +add_task(async function testCaptivePortalAdvancedPanel() { + info( + "Checking that the advanced section of the about:certerror UI is shown when we are behind a captive portal." + ); + await portalDetected(); + let tab = await openCaptivePortalErrorTab(); + let browser = tab.linkedBrowser; + + const waitForLocationChange = (async () => { + await BrowserTestUtils.waitForLocationChange(gBrowser, BAD_CERT_PAGE); + info("(waitForLocationChange resolved)"); + })(); + await SpecialPowers.spawn(browser, [BAD_CERT_PAGE], async expectedURL => { + const doc = content.document; + let advancedButton = doc.getElementById("advancedButton"); + await ContentTaskUtils.waitForCondition( + () => ContentTaskUtils.is_visible(advancedButton), + "Captive portal UI is visible" + ); + + info("Clicking on the advanced button"); + const advPanel = doc.getElementById("badCertAdvancedPanel"); + ok( + !ContentTaskUtils.is_visible(advPanel), + "Advanced panel is not yet visible" + ); + await EventUtils.synthesizeMouseAtCenter(advancedButton, {}, content); + ok(ContentTaskUtils.is_visible(advPanel), "Advanced panel is now visible"); + + let advPanelContent = doc.getElementById("badCertTechnicalInfo"); + ok( + ContentTaskUtils.is_visible(advPanelContent) && + advPanelContent.textContent.includes("expired.example.com"), + "Advanced panel text content is visible" + ); + + let advPanelErrorCode = doc.getElementById("errorCode"); + ok( + advPanelErrorCode.textContent, + "Cert error code is visible in the advanced panel" + ); + + // - + + const advPanelExceptionButton = doc.getElementById("exceptionDialogButton"); + + function isOnCertErrorPage() { + return ContentTaskUtils.is_visible(advPanel); + } + + ok(isOnCertErrorPage(), "On cert error page before adding exception"); + ok( + advPanelExceptionButton.disabled, + "Exception button should start disabled" + ); + await EventUtils.synthesizeMouseAtCenter( + advPanelExceptionButton, + {}, + content + ); // Click + const clickTime = content.performance.now(); + ok( + isOnCertErrorPage(), + "Still on cert error page because clicked too early" + ); + + // Now waitForCondition now that it's possible. + try { + await ContentTaskUtils.waitForCondition( + () => !advPanelExceptionButton.disabled, + "Wait for exception button enabled" + ); + } catch (rejected) { + ok(false, rejected); + return; + } + ok( + !advPanelExceptionButton.disabled, + "Exception button should be enabled after waiting" + ); + const msSinceClick = content.performance.now() - clickTime; + const expr = `${msSinceClick} > 1000`; + /* eslint-disable no-eval */ + ok(eval(expr), `Exception button should stay disabled for ${expr} ms`); + + await EventUtils.synthesizeMouseAtCenter( + advPanelExceptionButton, + {}, + content + ); // Click + info("Clicked"); + }); + await waitForLocationChange; + info("Page reloaded after adding cert exception"); + + // Clear the certificate exception. + let certOverrideService = Cc[ + "@mozilla.org/security/certoverride;1" + ].getService(Ci.nsICertOverrideService); + certOverrideService.clearValidityOverride("expired.example.com", -1, {}); + + info("After clearing cert override, asking for reload..."); + const waitForErrorPage = BrowserTestUtils.waitForErrorPage(browser); + await SpecialPowers.spawn(browser, [], async () => { + info("reload..."); + content.location.reload(); + }); + info("waitForErrorPage..."); + await waitForErrorPage; + + info("removeTab..."); + await BrowserTestUtils.removeTab(tab); + info("Done!"); +}); -- cgit v1.2.3