summaryrefslogtreecommitdiffstats
path: root/browser/base/content/test/captivePortal/browser_captivePortal_certErrorUI.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/base/content/test/captivePortal/browser_captivePortal_certErrorUI.js')
-rw-r--r--browser/base/content/test/captivePortal/browser_captivePortal_certErrorUI.js221
1 files changed, 221 insertions, 0 deletions
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!");
+});