Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
/* Any copyright is dedicated to the Public Domain.
"use strict";
const PREF_SERVICES_SETTINGS_CLOCK_SKEW_SECONDS =
"services.settings.clock_skew_seconds";
const PREF_SERVICES_SETTINGS_LAST_FETCHED =
"services.settings.last_update_seconds";
// Security CertError Felt Privacy set to false
add_task(async function checkWrongSystemTimeWarning_feltPrivacyToFalse() {
await setSecurityCertErrorsFeltPrivacyToFalse();
async function setUpPage() {
let browser;
let certErrorLoaded;
await BrowserTestUtils.openNewForegroundTab(
gBrowser,
() => {
);
browser = gBrowser.selectedBrowser;
certErrorLoaded = BrowserTestUtils.waitForErrorPage(browser);
},
false
);
info("Loading and waiting for the cert error");
await certErrorLoaded;
return SpecialPowers.spawn(browser, [], async function () {
let doc = content.document;
let div = doc.getElementById("errorShortDesc");
let learnMoreLink = doc.getElementById("learnMoreLink");
await ContentTaskUtils.waitForCondition(
() => div.textContent.includes("update your computer clock"),
"Correct error message found"
);
return {
divDisplay: content.getComputedStyle(div).display,
text: div.textContent,
learnMoreLink: learnMoreLink.href,
};
});
}
// Pretend that we recently updated our kinto clock skew pref
Services.prefs.setIntPref(
PREF_SERVICES_SETTINGS_LAST_FETCHED,
Math.floor(Date.now() / 1000)
);
// For this test, we want to trick Firefox into believing that
// the local system time (as returned by Date.now()) is wrong.
// Because we don't want to actually change the local system time,
// we will do the following:
// Take the validity date of our test page (expired.example.com).
let expiredDate = new Date("2010/01/05 12:00");
let localDate = Date.now();
// Compute the difference between the server date and the correct
// local system date.
let skew = Math.floor((localDate - expiredDate) / 1000);
// Make it seem like our reference server agrees that the certificate
// date is correct by recording the difference as clock skew.
Services.prefs.setIntPref(PREF_SERVICES_SETTINGS_CLOCK_SKEW_SECONDS, skew);
let localDateFmt = new Intl.DateTimeFormat("en-US", {
dateStyle: "medium",
}).format(localDate);
info("Loading a bad cert page with a skewed clock");
let message = await setUpPage();
isnot(
message.divDisplay,
"none",
"Wrong time message information is visible"
);
ok(
message.text.includes("update your computer clock"),
"Correct error message found"
);
ok(
message.text.includes("expired.example.com"),
"URL found in error message"
);
ok(message.text.includes(localDateFmt), "Correct local date displayed");
ok(
message.learnMoreLink.includes("time-errors"),
"time-errors in the Learn More URL"
);
BrowserTestUtils.removeTab(gBrowser.selectedTab);
Services.prefs.clearUserPref(PREF_SERVICES_SETTINGS_LAST_FETCHED);
Services.prefs.clearUserPref(PREF_SERVICES_SETTINGS_CLOCK_SKEW_SECONDS);
});
add_task(async function checkCertError_feltPrivacyToFalse() {
await setSecurityCertErrorsFeltPrivacyToFalse();
async function setUpPage() {
);
let browser = gBrowser.selectedBrowser;
let certErrorLoaded = BrowserTestUtils.waitForErrorPage(browser);
info("Loading and waiting for the cert error");
await certErrorLoaded;
return SpecialPowers.spawn(browser, [], async function () {
let doc = content.document;
let el = doc.getElementById("errorWhatToDoText");
await ContentTaskUtils.waitForCondition(() => el.textContent);
return el.textContent;
});
}
// The particular error message will be displayed only when clock_skew_seconds is
// less or equal to a day and the difference between date.now() and last_fetched is less than
// or equal to 5 days. Setting the prefs accordingly.
Services.prefs.setIntPref(
PREF_SERVICES_SETTINGS_LAST_FETCHED,
Math.floor(Date.now() / 1000)
);
let skew = 60 * 60 * 24;
Services.prefs.setIntPref(PREF_SERVICES_SETTINGS_CLOCK_SKEW_SECONDS, skew);
info("Loading a bad cert page");
let message = await setUpPage();
ok(
message.includes(
"The issue is most likely with the website, and there is nothing you can do" +
" to resolve it. You can notify the website’s administrator about the problem."
),
"Correct error message found"
);
BrowserTestUtils.removeTab(gBrowser.selectedTab);
Services.prefs.clearUserPref(PREF_SERVICES_SETTINGS_LAST_FETCHED);
Services.prefs.clearUserPref(PREF_SERVICES_SETTINGS_CLOCK_SKEW_SECONDS);
});
// Security CertError Felt Privacy set to true
add_task(async function checkWrongSystemTimeWarning_feltPrivacyToTrue() {
await setSecurityCertErrorsFeltPrivacyToTrue();
async function setUpPage() {
let browser;
let certErrorLoaded;
await BrowserTestUtils.openNewForegroundTab(
gBrowser,
() => {
);
browser = gBrowser.selectedBrowser;
certErrorLoaded = BrowserTestUtils.waitForErrorPage(browser);
},
false
);
info("Loading and waiting for the cert error");
await certErrorLoaded;
return SpecialPowers.spawn(browser, [], async function () {
const netErrorCard =
content.document.querySelector("net-error-card").wrappedJSObject;
await netErrorCard.getUpdateComplete();
Assert.ok(netErrorCard.errorTitle, "The error page title should exist.");
const shortDesc = netErrorCard.errorIntro;
const advancedButton = netErrorCard.advancedButton;
Assert.ok(advancedButton, "The advanced button should exist.");
Assert.equal(
advancedButton.dataset.l10nId,
"fp-certerror-advanced-button",
"Button should have the 'advanced' l10n ID."
);
// Perform user button click interaction
EventUtils.synthesizeMouseAtCenter(advancedButton, {}, content);
// Wait for the exception button to be enabled
// This ensures that the advanced section is fully loaded
await ContentTaskUtils.waitForCondition(
() =>
netErrorCard.exceptionButton &&
!netErrorCard.exceptionButton.disabled,
"Wait for the exception button to be created."
);
const whatCanYouDo = netErrorCard.whatCanYouDo;
Assert.equal(
whatCanYouDo.dataset.l10nId,
"fp-certerror-expired-what-can-you-do-body",
"What can you do section should have fp-certerror-expired-what-can-you-do-body l10n ID."
);
const whatCanYouDoArgs = JSON.parse(whatCanYouDo.dataset.l10nArgs);
Assert.ok(
whatCanYouDoArgs.date,
"What can you do section should have timestamp."
);
return {
divDisplay: content.getComputedStyle(shortDesc).display,
text: shortDesc.textContent,
learnMoreLink: netErrorCard.learnMoreLink.href,
whatCanYouDoText: whatCanYouDo.textContent,
};
});
}
// Pretend that we recently updated our kinto clock skew pref
SpecialPowers.pushPrefEnv({
set: [[PREF_SERVICES_SETTINGS_LAST_FETCHED, Math.floor(Date.now() / 1000)]],
});
// For this test, we want to trick Firefox into believing that
// the local system time (as returned by Date.now()) is wrong.
// Because we don't want to actually change the local system time,
// we will do the following:
// Take the validity date of our test page (expired.example.com).
let expiredDate = new Date("2010/01/05 12:00");
let localDate = Date.now();
// Compute the difference between the server date and the correct
// local system date.
let skew = Math.floor((localDate - expiredDate) / 1000);
// Make it seem like our reference server agrees that the certificate
// date is correct by recording the difference as clock skew.
SpecialPowers.pushPrefEnv({
set: [[PREF_SERVICES_SETTINGS_CLOCK_SKEW_SECONDS, skew]],
});
let localDateFmt = new Intl.DateTimeFormat("en-US", {
year: "numeric",
month: "numeric",
day: "numeric",
}).format(localDate);
info("Loading a bad cert page with a skewed clock");
let contentData = await setUpPage();
Assert.notEqual(
contentData.divDisplay,
"none",
"Wrong time message information is visible"
);
Assert.ok(
contentData.text.includes("expired.example.com"),
"URL found in error message"
);
Assert.ok(
contentData.whatCanYouDoText.includes(localDateFmt),
"Correct local date displayed"
);
Assert.ok(
contentData.learnMoreLink.includes("time-errors"),
"time-errors in the Learn More URL"
);
BrowserTestUtils.removeTab(gBrowser.selectedTab);
});
add_task(async function checkCertError_feltPrivacyToTrue() {
await setSecurityCertErrorsFeltPrivacyToTrue();
async function setUpPage() {
);
let browser = gBrowser.selectedBrowser;
let certErrorLoaded = BrowserTestUtils.waitForErrorPage(browser);
info("Loading and waiting for the cert error");
await certErrorLoaded;
return SpecialPowers.spawn(browser, [], async function () {
const netErrorCard =
content.document.querySelector("net-error-card").wrappedJSObject;
await netErrorCard.getUpdateComplete();
// Get the advanced container
// Perform user button click interaction
EventUtils.synthesizeMouseAtCenter(
netErrorCard.advancedButton,
{},
content
);
await ContentTaskUtils.waitForCondition(
() =>
netErrorCard.exceptionButton &&
!netErrorCard.exceptionButton.disabled,
"Wait for the exception button to be created."
);
const whatCanYouDo = netErrorCard.whatCanYouDo;
await ContentTaskUtils.waitForCondition(() => whatCanYouDo.textContent);
Assert.equal(
whatCanYouDo.dataset.l10nId,
"fp-certerror-expired-what-can-you-do-body",
"Should have the fp-certerror-expired-what-can-you-do-body l10n ID."
);
return whatCanYouDo.textContent;
});
}
// The particular error message will be displayed only when clock_skew_seconds is
// less or equal to a day and the difference between date.now() and last_fetched is less than
// or equal to 5 days. Setting the prefs accordingly.
let skew = 60 * 60 * 24;
SpecialPowers.pushPrefEnv({
set: [
[PREF_SERVICES_SETTINGS_LAST_FETCHED, Math.floor(Date.now() / 1000)],
[PREF_SERVICES_SETTINGS_CLOCK_SKEW_SECONDS, skew],
],
});
info("Loading a bad cert page");
let message = await setUpPage();
let localDate = Date.now();
let localDateFmt = new Intl.DateTimeFormat("en-US", {
year: "numeric",
month: "numeric",
day: "numeric",
}).format(localDate);
Assert.ok(message.includes(localDateFmt), "Message has local date displayed");
BrowserTestUtils.removeTab(gBrowser.selectedTab);
});