summaryrefslogtreecommitdiffstats
path: root/toolkit/components/aboutconfig/test/browser/browser_search.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/aboutconfig/test/browser/browser_search.js')
-rw-r--r--toolkit/components/aboutconfig/test/browser/browser_search.js177
1 files changed, 177 insertions, 0 deletions
diff --git a/toolkit/components/aboutconfig/test/browser/browser_search.js b/toolkit/components/aboutconfig/test/browser/browser_search.js
new file mode 100644
index 0000000000..89a0c0c866
--- /dev/null
+++ b/toolkit/components/aboutconfig/test/browser/browser_search.js
@@ -0,0 +1,177 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+add_setup(async function () {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["test.aboutconfig.a", "test value 1"],
+ ["test.aboutconfig.ab", "test value 2"],
+ ["test.aboutconfig.bc", "test value 3"],
+ ],
+ });
+});
+
+add_task(async function test_search() {
+ await AboutConfigTest.withNewTab(async function () {
+ await this.document.l10n.translateFragment(this.document.documentElement);
+ let prefArray = Services.prefs.getChildList("");
+
+ // The total number of preferences may change at any time because of
+ // operations running in the background, so we only test approximately.
+ // The change in count would be because of one or two added preferences,
+ // but we tolerate a difference of up to 50 preferences just to be safe.
+ // We want thousands of prefs instead of a few dozen that are filtered.
+ Assert.greater(this.rows.length, prefArray.length - 50);
+
+ // Filter a subset of preferences. The "browser.download." branch is
+ // chosen because it is very unlikely that its preferences would be
+ // modified by other code during the execution of this test.
+ this.search("Wser.down ");
+
+ let filteredPrefArray = prefArray.filter(pref =>
+ pref.includes("wser.down")
+ );
+ // Adding +1 to the list since button does not match an exact
+ // preference name then a row is added for the user to add a
+ // new button preference if desired
+ Assert.equal(this.rows.length, filteredPrefArray.length + 1);
+
+ // Show all preferences again after filtering.
+ this.showAll();
+ Assert.equal(this.searchInput.value, "");
+
+ // The total number of preferences may change at any time because of
+ // operations running in the background, so we only test approximately.
+ // The change in count would be because of one or two added preferences,
+ // but we tolerate a difference of up to 50 preferences just to be safe.
+ // We want thousands of prefs instead of a few dozen that are filtered.
+ Assert.greater(this.rows.length, prefArray.length - 50);
+
+ // Check if "Only show modified" feature works.
+ EventUtils.sendMouseEvent({ type: "click" }, this.showOnlyModifiedCheckbox);
+ Assert.ok(this.rows.every(r => r.hasClass("has-user-value")));
+
+ // Uncheck checkbox
+ EventUtils.sendMouseEvent({ type: "click" }, this.showOnlyModifiedCheckbox);
+ Assert.ok(!this.rows.every(r => r.hasClass("has-user-value")));
+
+ // Pressing ESC while showing all preferences returns to the initial page.
+ EventUtils.sendKey("escape");
+ Assert.equal(this.rows.length, 0);
+
+ // Test invalid search returns no preferences.
+ // Expecting 1 row to be returned since it offers the ability to add.
+ this.search("aJunkValueasdf");
+ Assert.equal(this.rows.length, 1);
+ // The has-visible-prefs attribute is used to style the border of the add row.
+ Assert.ok(!this.prefsTable.hasAttribute("has-visible-prefs"));
+ let addRow = this.getRow("aJunkValueasdf");
+ Assert.equal(getComputedStyle(addRow.valueCell)["border-top-width"], "0px");
+
+ // Pressing ESC clears the field and returns to the initial page.
+ EventUtils.sendKey("escape");
+ Assert.equal(this.searchInput.value, "");
+ Assert.equal(this.rows.length, 0);
+
+ // Two preferences match this filter, and one of those matches exactly.
+ this.search("test.aboutconfig.a");
+ Assert.equal(this.rows.length, 2);
+
+ // When searching case insensitively, there is an additional row to add a
+ // new preference with the same name but a different case.
+ this.search("TEST.aboutconfig.a");
+ Assert.equal(this.rows.length, 3);
+ // The has-visible-prefs attribute is used to style the border of the add row.
+ Assert.ok(this.prefsTable.hasAttribute("has-visible-prefs"));
+ addRow = this.getRow("TEST.aboutconfig.a");
+ Assert.equal(getComputedStyle(addRow.valueCell)["border-top-width"], "1px");
+
+ // Entering an empty string returns to the initial page.
+ this.search("");
+ Assert.equal(this.rows.length, 0);
+ Assert.ok(!this.prefsTable.hasAttribute("has-visible-prefs"));
+ });
+});
+
+add_task(async function test_search_wildcard() {
+ await AboutConfigTest.withNewTab(async function () {
+ const extra = 1; // "Add" row
+
+ // A trailing wildcard
+ this.search("test.about*");
+ Assert.equal(this.rows.length, 3 + extra);
+
+ // A wildcard in middle
+ this.search("test.about*a");
+ Assert.equal(this.rows.length, 2 + extra);
+ this.search("test.about*ab");
+ Assert.equal(this.rows.length, 1 + extra);
+ this.search("test.aboutcon*fig");
+ Assert.equal(this.rows.length, 3 + extra);
+
+ // Multiple wildcards in middle
+ this.search("test.about*fig*ab");
+ Assert.equal(this.rows.length, 1 + extra);
+ this.search("test.about*config*ab");
+ Assert.equal(this.rows.length, 1 + extra);
+ });
+});
+
+add_task(async function test_search_delayed() {
+ await AboutConfigTest.withNewTab(async function () {
+ // Start with the initial empty page.
+ this.search("");
+
+ // We need to wait more than the search typing timeout to make sure that
+ // nothing happens when entering a short string.
+ EventUtils.synthesizeKey("t");
+ EventUtils.synthesizeKey("e");
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ await new Promise(resolve => setTimeout(resolve, 500));
+ Assert.equal(this.rows.length, 0);
+
+ // Pressing Enter will force a search to occur anyways.
+ EventUtils.sendKey("return");
+ Assert.greater(this.rows.length, 0);
+
+ // Prepare the table and the search field for the next test.
+ this.search("test.aboutconfig.a");
+ Assert.equal(this.rows.length, 2);
+
+ // The table is updated in a single microtask, so we don't need to wait for
+ // specific mutations, we can just continue when any of the children or
+ // their "hidden" attributes are updated.
+ let prefsTableChanged = new Promise(resolve => {
+ let observer = new MutationObserver(() => {
+ observer.disconnect();
+ resolve();
+ });
+ observer.observe(this.prefsTable, { childList: true });
+ for (let element of this.prefsTable.children) {
+ observer.observe(element, { attributes: true });
+ }
+ });
+
+ // Add a character and test that the table is not updated immediately.
+ EventUtils.synthesizeKey("b");
+ Assert.equal(this.rows.length, 2);
+
+ // The table will eventually be updated after a delay.
+ await prefsTableChanged;
+ Assert.equal(this.rows.length, 1);
+ });
+});
+
+add_task(async function test_search_add_row_color() {
+ await AboutConfigTest.withNewTab(async function () {
+ // When the row is the only one displayed, it doesn't have the "odd" class.
+ this.search("test.aboutconfig.add");
+ Assert.equal(this.rows.length, 1);
+ Assert.ok(!this.getRow("test.aboutconfig.add").hasClass("odd"));
+
+ // When displayed with one other preference, the "odd" class is present.
+ this.search("test.aboutconfig.b");
+ Assert.equal(this.rows.length, 2);
+ Assert.ok(this.getRow("test.aboutconfig.b").hasClass("odd"));
+ });
+});