/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ "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); } }