commit 8af32bf2f7249de7ba4858af5f3912c504804257
parent 376d5c66dc967fc0fbe869d41bb2509543e16e7b
Author: Jack Brown <jbrown@mozilla.com>
Date: Tue, 18 Nov 2025 18:19:23 +0000
Bug 1997449 - Added support page slug to NetErrorCard, added tests for updated network error page. r=niklas
Differential Revision: https://phabricator.services.mozilla.com/D272542
Diffstat:
4 files changed, 107 insertions(+), 1 deletion(-)
diff --git a/browser/base/content/test/about/browser.toml b/browser/base/content/test/about/browser.toml
@@ -30,6 +30,8 @@ support-files = [
["browser_aboutCertError_offlineSupport.js"]
+["browser_aboutCertError_offlineSupport_feltPrivacyV1.js"]
+
["browser_aboutCertError_telemetry.js"]
["browser_aboutDialog_distribution.js"]
diff --git a/browser/base/content/test/about/browser_aboutCertError_offlineSupport.js b/browser/base/content/test/about/browser_aboutCertError_offlineSupport.js
@@ -11,7 +11,10 @@ const OFFLINE_SUPPORT_PAGE =
add_setup(async function () {
await SpecialPowers.pushPrefEnv({
- set: [["test.wait300msAfterTabSwitch", true]],
+ set: [
+ ["test.wait300msAfterTabSwitch", true],
+ ["security.certerrors.felt-privacy-v1", false],
+ ],
});
});
diff --git a/browser/base/content/test/about/browser_aboutCertError_offlineSupport_feltPrivacyV1.js b/browser/base/content/test/about/browser_aboutCertError_offlineSupport_feltPrivacyV1.js
@@ -0,0 +1,85 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const BAD_CERT_PAGE = "https://expired.example.com";
+const DUMMY_SUPPORT_BASE_PATH = "/1/firefox/fxVersion/OSVersion/language/";
+const DUMMY_SUPPORT_URL = BAD_CERT_PAGE + DUMMY_SUPPORT_BASE_PATH;
+const OFFLINE_SUPPORT_PAGE =
+ "chrome://global/content/neterror/supportpages/time-errors.html";
+
+add_setup(async function () {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["test.wait300msAfterTabSwitch", true],
+ ["security.certerrors.felt-privacy-v1", true],
+ ],
+ });
+});
+
+add_task(async function testOfflineSupportPage() {
+ // Cache the original value of app.support.baseURL pref to reset later
+ let originalBaseURL = Services.prefs.getCharPref("app.support.baseURL");
+
+ Services.prefs.setCharPref("app.support.baseURL", DUMMY_SUPPORT_URL);
+ let errorTab = await openErrorPage(BAD_CERT_PAGE);
+
+ let offlineSupportPromise = BrowserTestUtils.waitForNewTab(
+ gBrowser,
+ DUMMY_SUPPORT_URL + "time-errors"
+ );
+ await SpecialPowers.spawn(
+ errorTab.linkedBrowser,
+ [DUMMY_SUPPORT_URL],
+ async expectedURL => {
+ let doc = content.document;
+
+ const netErrorCard = doc.querySelector("net-error-card").wrappedJSObject;
+ await netErrorCard.getUpdateComplete();
+
+ netErrorCard.advancedButton.scrollIntoView();
+ EventUtils.synthesizeMouseAtCenter(
+ netErrorCard.advancedButton,
+ {},
+ content
+ );
+
+ await ContentTaskUtils.waitForCondition(
+ () => ContentTaskUtils.isVisible(netErrorCard.advancedContainer),
+ "Advanced container is visible"
+ );
+ Assert.ok(
+ netErrorCard.advancedShowing,
+ "Advanced showing attribute should be true"
+ );
+ Assert.ok(ContentTaskUtils.isVisible(netErrorCard.advancedContainer));
+
+ let learnMoreLink = netErrorCard.learnMoreLink;
+ Assert.ok(learnMoreLink, '"Learn More" link exists.');
+
+ let supportPageURL = learnMoreLink.getAttribute("href");
+ Assert.equal(
+ supportPageURL,
+ expectedURL + "time-errors",
+ "Correct support page URL has been set"
+ );
+ learnMoreLink.scrollIntoView();
+ Assert.ok(ContentTaskUtils.isVisible(learnMoreLink));
+ await EventUtils.synthesizeMouseAtCenter(learnMoreLink, {}, content);
+ }
+ );
+ let offlineSupportTab = await offlineSupportPromise;
+ await BrowserTestUtils.browserLoaded(
+ gBrowser.selectedBrowser,
+ false,
+ OFFLINE_SUPPORT_PAGE
+ );
+
+ // Reset this pref instead of clearing it to maintain globally set
+ // custom value for testing purposes.
+ Services.prefs.setCharPref("app.support.baseURL", originalBaseURL);
+
+ await BrowserTestUtils.removeTab(offlineSupportTab);
+ await BrowserTestUtils.removeTab(errorTab);
+});
diff --git a/toolkit/content/net-error-card.mjs b/toolkit/content/net-error-card.mjs
@@ -124,6 +124,22 @@ export class NetErrorCard extends MozLitElement {
this.hostname += ":" + port;
}
+ // We show an offline support page in case of a system-wide error,
+ // when a user cannot connect to the internet and access the SUMO website.
+ // For example, clock error, which causes certerrors across the web or
+ // a security software conflict where the user is unable to connect
+ // to the internet.
+ // The URL that prompts us to show an offline support page should have the following
+ // format: "https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/supportPageSlug",
+ // so we can extract the support page slug.
+ let baseURL = RPMGetFormatURLPref("app.support.baseURL");
+ if (document.location.href.startsWith(baseURL)) {
+ let supportPageSlug = document.location.pathname.split("/").pop();
+ RPMSendAsyncMessage("DisplayOfflineSupportPage", {
+ supportPageSlug,
+ });
+ }
+
if (getCSSClass() == "expertBadCert") {
this.toggleAdvancedShowing();
}