Source code

Revision control

Copy as Markdown

Other Tools

/* Any copyright is dedicated to the Public Domain.
"use strict";
const { Preferences } = ChromeUtils.importESModule(
"resource://gre/modules/Preferences.sys.mjs"
);
// List of default preferences that can be used for tests, chosen because they
// have little or no side-effects when they are modified for a brief time. If
// any of these preferences are removed or their default state changes, just
// update the constant to point to a different preference with the same default.
const PREF_BOOLEAN_DEFAULT_TRUE = "accessibility.typeaheadfind.manual";
const PREF_BOOLEAN_USERVALUE_TRUE = "browser.dom.window.dump.enabled";
const PREF_NUMBER_DEFAULT_ZERO = "accessibility.typeaheadfind.casesensitive";
const PREF_STRING_DEFAULT_EMPTY = "browser.helperApps.neverAsk.openFile";
const PREF_STRING_DEFAULT_NOTEMPTY = "accessibility.typeaheadfind.soundURL";
const PREF_STRING_DEFAULT_NOTEMPTY_VALUE = "beep";
const PREF_STRING_LOCALIZED_MISSING = "intl.menuitems.alwaysappendaccesskeys";
// Other preference names used in tests.
const PREF_NEW = "test.aboutconfig.new";
// These tests can be slow to execute because they show all the preferences
// several times, and each time can require a second on some virtual machines.
requestLongerTimeout(2);
class AboutConfigRowTest {
constructor(element) {
this.element = element;
}
querySelector(selector) {
return this.element.querySelector(selector);
}
get nameCell() {
return this.querySelector("th");
}
get name() {
return this.nameCell.textContent;
}
get valueCell() {
return this.querySelector("td.cell-value");
}
get value() {
return this.valueCell.textContent;
}
/**
* Text input field when the row is in edit mode.
*/
get valueInput() {
return this.valueCell.querySelector("input");
}
/**
* This is normally "edit" or "toggle" based on the preference type, "save"
* when the row is in edit mode, or "add" when the preference does not exist.
*/
get editColumnButton() {
return this.querySelector("td.cell-edit > button");
}
/**
* This can be "reset" or "delete" based on whether a default exists.
*/
get resetColumnButton() {
return this.querySelector("td:last-child > button");
}
hasClass(className) {
return this.element.classList.contains(className);
}
}
class AboutConfigTest {
static withNewTab(testFn, options = {}) {
return BrowserTestUtils.withNewTab(
{
gBrowser,
url: "chrome://global/content/aboutconfig/aboutconfig.html",
},
async browser => {
let scope = new this(browser);
await scope.setupNewTab(options);
await testFn.call(scope);
}
);
}
constructor(browser) {
this.browser = browser;
this.document = browser.contentDocument;
this.window = browser.contentWindow;
}
async setupNewTab(options) {
await this.document.l10n.ready;
if (!options.dontBypassWarning) {
this.bypassWarningButton.click();
this.showAll();
}
}
get showWarningNextTimeInput() {
return this.document.getElementById("showWarningNextTime");
}
get bypassWarningButton() {
return this.document.getElementById("warningButton");
}
get searchInput() {
return this.document.getElementById("about-config-search");
}
get showOnlyModifiedCheckbox() {
return this.document.getElementById("about-config-show-only-modified");
}
get prefsTable() {
return this.document.getElementById("prefs");
}
/**
* Array of AboutConfigRowTest objects, one for each row in the main table.
*/
get rows() {
let elements = this.prefsTable.querySelectorAll("tr:not(.hidden)");
return Array.from(elements, element => new AboutConfigRowTest(element));
}
/**
* Returns the AboutConfigRowTest object for the row in the main table which
* corresponds to the given preference name, or undefined if none is present.
*/
getRow(name) {
return this.rows.find(row => row.name == name);
}
/**
* Shows all preferences using the dedicated button.
*/
showAll() {
this.search("");
this.document.getElementById("show-all").click();
}
/**
* Performs a new search using the dedicated textbox. This also makes sure
* that the list of preferences displayed is up to date.
*/
search(value) {
this.searchInput.value = value;
this.searchInput.focus();
EventUtils.sendKey("return");
}
/**
* Checks whether or not the initial warning page is displayed.
*/
assertWarningPage(expected) {
Assert.equal(!!this.showWarningNextTimeInput, expected);
Assert.equal(!!this.bypassWarningButton, expected);
Assert.equal(!this.searchInput, expected);
Assert.equal(!this.prefsTable, expected);
}
}