tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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:
Mbrowser/base/content/test/about/browser.toml | 2++
Mbrowser/base/content/test/about/browser_aboutCertError_offlineSupport.js | 5++++-
Abrowser/base/content/test/about/browser_aboutCertError_offlineSupport_feltPrivacyV1.js | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mtoolkit/content/net-error-card.mjs | 16++++++++++++++++
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(); }