Files
sousa-gecko/browser/base/content/test/about/browser_aboutNetError_fileNotFound.js
T
Jack Brown 73bb510dbd Bug 2018850 - Show accurate messaging on file:// not-found error pages - r=niklas,fluent-reviewers,flod
Replace the generic network-error copy on the fileNotFound error card
with file-specific strings. The intro now shows the actual file path
instead of "local file", and the "What can you do?" section gives
file-oriented advice rather than website-oriented advice.

Differential Revision: https://phabricator.services.mozilla.com/D284735
2026-03-26 02:27:39 +00:00

153 lines
5.0 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
add_task(async function test_fileNotFound_intro_shows_path() {
await setSecurityCertErrorsFeltPrivacyToTrue();
const isWindows = Services.appinfo.OS === "WINNT";
const [url, expectedPath] = isWindows
? [
"file:///C:/this/path/does/not/exist.html",
"C:/this/path/does/not/exist.html",
]
: [
"file:///this/path/does/not/exist.html",
"/this/path/does/not/exist.html",
];
const tab = await openErrorPage(url);
const browser = tab.linkedBrowser;
await SpecialPowers.spawn(browser, [expectedPath], async path => {
await ContentTaskUtils.waitForCondition(
() => content.document.querySelector("net-error-card"),
"net-error-card should render"
);
const netErrorCard =
content.document.querySelector("net-error-card").wrappedJSObject;
Assert.ok(netErrorCard.errorIntro, "NetErrorCard has errorIntro.");
Assert.equal(
netErrorCard.errorIntro.dataset.l10nId,
"neterror-file-not-found-intro",
"Intro uses the file-not-found l10n id."
);
Assert.equal(
JSON.parse(netErrorCard.errorIntro.dataset.l10nArgs).path,
path,
"Intro l10n args contain the correct file path."
);
Assert.ok(netErrorCard.errorTitle, "NetErrorCard has errorTitle.");
Assert.equal(
netErrorCard.errorTitle.dataset.l10nId,
"fileNotFound-title",
"Title uses the fileNotFound l10n id."
);
Assert.ok(netErrorCard.whatCanYouDo, "NetErrorCard has whatCanYouDo.");
Assert.equal(
netErrorCard.whatCanYouDo.dataset.l10nId,
"neterror-file-not-found-what-can-you-do",
"What can you do section uses the file-not-found l10n id."
);
Assert.ok(!netErrorCard.tryAgainButton, "Try Again button is absent.");
});
BrowserTestUtils.removeTab(tab);
});
add_task(async function test_fileNotFound_url_encoded_path() {
await setSecurityCertErrorsFeltPrivacyToTrue();
const isWindows = Services.appinfo.OS === "WINNT";
const [url, expectedPath] = isWindows
? [
"file:///C:/path%20with%20spaces/missing%20file.html",
"C:/path with spaces/missing file.html",
]
: [
"file:///path%20with%20spaces/missing%20file.html",
"/path with spaces/missing file.html",
];
const tab = await openErrorPage(url);
const browser = tab.linkedBrowser;
await SpecialPowers.spawn(browser, [expectedPath], async path => {
await ContentTaskUtils.waitForCondition(
() => content.document.querySelector("net-error-card"),
"net-error-card should render"
);
const netErrorCard =
content.document.querySelector("net-error-card").wrappedJSObject;
Assert.equal(
netErrorCard.errorIntro.dataset.l10nId,
"neterror-file-not-found-intro",
"Intro uses the file-not-found l10n id for encoded path."
);
Assert.equal(
JSON.parse(netErrorCard.errorIntro.dataset.l10nArgs).path,
path,
"URL-encoded path is decoded in the l10n args."
);
});
BrowserTestUtils.removeTab(tab);
});
add_task(async function test_fileNotFound_windows_path_normalization() {
await setSecurityCertErrorsFeltPrivacyToTrue();
const tab = await openErrorPage("file:///C:/Users/test/nonexistent.html");
const browser = tab.linkedBrowser;
await SpecialPowers.spawn(browser, [], async () => {
await ContentTaskUtils.waitForCondition(
() => content.document.querySelector("net-error-card"),
"net-error-card should render"
);
const netErrorCard =
content.document.querySelector("net-error-card").wrappedJSObject;
Assert.equal(
netErrorCard.errorIntro.dataset.l10nId,
"neterror-file-not-found-intro",
"Intro uses the file-not-found l10n id for Windows path."
);
Assert.equal(
JSON.parse(netErrorCard.errorIntro.dataset.l10nArgs).path,
"C:/Users/test/nonexistent.html",
"Leading slash is stripped from Windows drive-letter paths."
);
});
BrowserTestUtils.removeTab(tab);
});
add_task(async function test_fileNotFound_query_and_fragment_stripped() {
await setSecurityCertErrorsFeltPrivacyToTrue();
const isWindows = Services.appinfo.OS === "WINNT";
const [url, expectedPath] = isWindows
? [
"file:///C:/path/to/file.html?v=2&lang=en#section",
"C:/path/to/file.html",
]
: ["file:///path/to/file.html?v=2&lang=en#section", "/path/to/file.html"];
const tab = await openErrorPage(url);
const browser = tab.linkedBrowser;
await SpecialPowers.spawn(browser, [expectedPath], async path => {
await ContentTaskUtils.waitForCondition(
() => content.document.querySelector("net-error-card"),
"net-error-card should render"
);
const netErrorCard =
content.document.querySelector("net-error-card").wrappedJSObject;
Assert.equal(
JSON.parse(netErrorCard.errorIntro.dataset.l10nArgs).path,
path,
"Query string and fragment are stripped from the displayed path."
);
});
BrowserTestUtils.removeTab(tab);
});