Bug 1532712 - Fix tests to await for gotoPref. r=gijs
authorZibi Braniecki <zbraniecki@mozilla.com>
Wed, 13 Mar 2019 19:43:50 +0000
changeset 522070 adbb2fb5c8ec
parent 522069 10dfa9788b2b
child 522071 7b9be2d40a83
push id10871
push usercbrindusan@mozilla.com
push dateMon, 18 Mar 2019 15:49:32 +0000
treeherdermozilla-beta@018abdd16060 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersgijs
bugs1532712
milestone67.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1532712 - Fix tests to await for gotoPref. r=gijs Differential Revision: https://phabricator.services.mozilla.com//D23377
browser/components/enterprisepolicies/tests/browser/browser_policy_set_homepage.js
browser/components/preferences/in-content/findInPage.js
browser/components/preferences/in-content/preferences.js
browser/components/preferences/in-content/tests/browser_bug1018066_resetScrollPosition.js
browser/components/preferences/in-content/tests/browser_bug731866.js
browser/components/preferences/in-content/tests/browser_bug795764_cachedisabled.js
browser/components/preferences/in-content/tests/browser_healthreport.js
browser/components/preferences/in-content/tests/browser_search_no_results_change_category.js
browser/components/preferences/in-content/tests/browser_telemetry.js
browser/components/preferences/in-content/tests/privacypane_tests_perwindow.js
intl/l10n/DOMLocalization.jsm
--- a/browser/components/enterprisepolicies/tests/browser/browser_policy_set_homepage.js
+++ b/browser/components/enterprisepolicies/tests/browser/browser_policy_set_homepage.js
@@ -40,17 +40,17 @@ async function check_homepage({expectedU
       is(browserRestoreSessionCheckbox.checked, shouldBeChecked,
          "Session restore status checkbox should be: " + (shouldBeChecked ? "checked" : "unchecked"));
     }
 
     if (!expectedURL) {
       // If only StartPage was changed, no need to check these
       return;
     }
-    content.document.getElementById("category-home").click();
+    await content.gotoPref("paneHome");
 
     let homepageTextbox = content.document.getElementById("homePageUrl");
     // Unfortunately this test does not work because the new UI does not fill
     // default values into the URL box at the moment.
     // is(homepageTextbox.value, expectedURL,
     //    "Homepage URL should match expected");
 
     // Wait for rendering to be finished
--- a/browser/components/preferences/in-content/findInPage.js
+++ b/browser/components/preferences/in-content/findInPage.js
@@ -30,19 +30,19 @@ var gSearchResultsPane = {
       // Initialize other panes in an idle callback.
       window.requestIdleCallback(() => this.initializeCategories());
     }
     let helpUrl = Services.urlFormatter.formatURLPref("app.support.baseURL") + "preferences";
     let helpContainer = document.getElementById("need-help");
     helpContainer.querySelector("a").href = helpUrl;
   },
 
-  handleEvent(event) {
+  async handleEvent(event) {
     // Ensure categories are initialized if idle callback didn't run sooo enough.
-    this.initializeCategories();
+    await this.initializeCategories();
     this.searchFunction(event);
   },
 
   /**
    * Check that the text content contains the query string.
    *
    * @param String content
    *    the text content to be searched
@@ -58,24 +58,24 @@ var gSearchResultsPane = {
     return content.toLowerCase().includes(query.toLowerCase());
   },
 
   categoriesInitialized: false,
 
   /**
    * Will attempt to initialize all uninitialized categories
    */
-  initializeCategories() {
+  async initializeCategories() {
     //  Initializing all the JS for all the tabs
     if (!this.categoriesInitialized) {
       this.categoriesInitialized = true;
       // Each element of gCategoryInits is a name
       for (let [/* name */, category] of gCategoryInits) {
         if (!category.inited) {
-          category.init();
+          await category.init();
         }
       }
     }
   },
 
   /**
    * Finds and returns text nodes within node and all descendants
    * Iterates through all the sibilings of the node object and adds the sibilings
@@ -218,20 +218,20 @@ var gSearchResultsPane = {
 
     // Clear telemetry request if user types very frequently.
     if (this.telemetryTimer) {
       clearTimeout(this.telemetryTimer);
     }
 
     let srHeader = document.getElementById("header-searchResults");
     let noResultsEl = document.getElementById("no-results-message");
-    srHeader.hidden = !this.query;
     if (this.query) {
       // Showing the Search Results Tag
-      gotoPref("paneSearchResults");
+      await gotoPref("paneSearchResults");
+      srHeader.hidden = false;
 
       let resultsFound = false;
 
       // Building the range for highlighted areas
       let rootPreferencesChildren = [...document
         .querySelectorAll("#mainPrefPane > *:not([data-hidden-from-search])")];
 
       if (subQuery) {
@@ -302,17 +302,18 @@ var gSearchResultsPane = {
             Services.telemetry.keyedScalarAdd("preferences.search_query", this.query, 1);
           }, 1000);
         }
       }
     } else {
       noResultsEl.hidden = true;
       document.getElementById("sorry-message-query").textContent = "";
       // Going back to General when cleared
-      gotoPref("paneGeneral");
+      await gotoPref("paneGeneral");
+      srHeader.hidden = true;
 
       // Hide some special second level headers in normal view
       for (let element of document.querySelectorAll(".search-header")) {
         element.hidden = true;
       }
     }
 
     window.dispatchEvent(new CustomEvent("PreferencesSearchCompleted", { detail: query }));
--- a/browser/components/preferences/in-content/preferences.js
+++ b/browser/components/preferences/in-content/preferences.js
@@ -64,17 +64,17 @@ function register_module(categoryName, c
       categoryObject.init();
       this.inited = true;
     },
   });
 }
 
 document.addEventListener("DOMContentLoaded", init_all, {once: true});
 
-async function init_all() {
+function init_all() {
   Preferences.forceEnableInstantApply();
 
   gSubDialog.init();
   register_module("paneGeneral", gMainPane);
   register_module("paneHome", gHomePane);
   register_module("paneSearch", gSearchPane);
   register_module("panePrivacy", gPrivacyPane);
   register_module("paneContainers", gContainersPane);
@@ -96,36 +96,37 @@ async function init_all() {
   });
   categories.addEventListener("mousedown", function() {
     this.removeAttribute("keyboard-navigation");
   });
 
   maybeDisplayPoliciesNotice();
 
   window.addEventListener("hashchange", onHashChange);
-  await gotoPref();
 
-  let helpButton = document.getElementById("helpButton");
-  let helpUrl = Services.urlFormatter.formatURLPref("app.support.baseURL") + "preferences";
-  helpButton.setAttribute("href", helpUrl);
+  gotoPref().then(() => {
+    let helpButton = document.getElementById("helpButton");
+    let helpUrl = Services.urlFormatter.formatURLPref("app.support.baseURL") + "preferences";
+    helpButton.setAttribute("href", helpUrl);
 
-  document.getElementById("addonsButton")
-    .addEventListener("click", () => {
-      let mainWindow = window.docShell.rootTreeItem.domWindow;
-      mainWindow.BrowserOpenAddonsMgr();
-      AMTelemetry.recordLinkEvent({
-        object: "aboutPreferences",
-        value: "about:addons",
+    document.getElementById("addonsButton")
+      .addEventListener("click", () => {
+        let mainWindow = window.docShell.rootTreeItem.domWindow;
+        mainWindow.BrowserOpenAddonsMgr();
+        AMTelemetry.recordLinkEvent({
+          object: "aboutPreferences",
+          value: "about:addons",
+        });
       });
-    });
 
-  document.dispatchEvent(new CustomEvent("Initialized", {
-    "bubbles": true,
-    "cancelable": true,
-  }));
+    document.dispatchEvent(new CustomEvent("Initialized", {
+      "bubbles": true,
+      "cancelable": true,
+    }));
+  });
 }
 
 function telemetryBucketForCategory(category) {
   category = category.toLowerCase();
   switch (category) {
     case "containers":
     case "general":
     case "home":
--- a/browser/components/preferences/in-content/tests/browser_bug1018066_resetScrollPosition.js
+++ b/browser/components/preferences/in-content/tests/browser_bug1018066_resetScrollPosition.js
@@ -12,12 +12,13 @@ add_task(async function() {
   originalWindowHeight = window.outerHeight;
   window.resizeTo(window.outerWidth, 300);
   let prefs = await openPreferencesViaOpenPreferencesAPI("paneSearch", {leaveOpen: true});
   is(prefs.selectedPane, "paneSearch", "Search pane was selected");
   let mainContent = gBrowser.contentDocument.querySelector(".main-content");
   mainContent.scrollTop = 50;
   is(mainContent.scrollTop, 50, "main-content should be scrolled 50 pixels");
 
-  gBrowser.contentWindow.gotoPref("paneGeneral");
+  await gBrowser.contentWindow.gotoPref("paneGeneral");
+
   is(mainContent.scrollTop, 0,
      "Switching to a different category should reset the scroll position");
 });
--- a/browser/components/preferences/in-content/tests/browser_bug731866.js
+++ b/browser/components/preferences/in-content/tests/browser_bug731866.js
@@ -30,28 +30,28 @@ function checkElements(expectedPane) {
     if (attributeValue == "pane" + expectedPane) {
       is_element_visible(element, expectedPane + " elements should be visible" + suffix);
     } else {
       is_element_hidden(element, "Elements not in " + expectedPane + " should be hidden" + suffix);
     }
   }
 }
 
-function runTest(win) {
+async function runTest(win) {
   is(gBrowser.currentURI.spec, "about:preferences", "about:preferences loaded");
 
   let tab = win.document;
   gElements = tab.getElementById("mainPrefPane").children;
 
   let panes = [
     "General", "Search",
     "Privacy", "Sync",
   ];
 
   for (let pane of panes) {
-    win.gotoPref("pane" + pane);
+    await win.gotoPref("pane" + pane);
     checkElements(pane);
   }
 
   gBrowser.removeCurrentTab();
   win.close();
   finish();
 }
--- a/browser/components/preferences/in-content/tests/browser_bug795764_cachedisabled.js
+++ b/browser/components/preferences/in-content/tests/browser_bug795764_cachedisabled.js
@@ -12,24 +12,24 @@ function test() {
     Services.perms.removeFromPrincipal(principal, "persistent-storage");
   });
 
   SpecialPowers.pushPrefEnv({set: [
     ["privacy.userContext.ui.enabled", true],
   ]}).then(() => open_preferences(runTest));
 }
 
-function runTest(win) {
+async function runTest(win) {
   is(gBrowser.currentURI.spec, "about:preferences", "about:preferences loaded");
 
   let tab = win.document;
   let elements = tab.getElementById("mainPrefPane").children;
 
   // Test if privacy pane is opened correctly
-  win.gotoPref("panePrivacy");
+  await win.gotoPref("panePrivacy");
   for (let element of elements) {
     let attributeValue = element.getAttribute("data-category");
     if (attributeValue == "panePrivacy") {
       is_element_visible(element, `Privacy element of id=${element.id} should be visible`);
     } else {
       is_element_hidden(element, `Non-Privacy element of id=${element.id} should be hidden`);
     }
   }
--- a/browser/components/preferences/in-content/tests/browser_healthreport.js
+++ b/browser/components/preferences/in-content/tests/browser_healthreport.js
@@ -1,19 +1,19 @@
 /* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 const FHR_UPLOAD_ENABLED = "datareporting.healthreport.uploadEnabled";
 
 function runPaneTest(fn) {
-  open_preferences((win) => {
+  open_preferences(async (win) => {
     let doc = win.document;
-    win.gotoPref("paneAdvanced");
+    await win.gotoPref("paneAdvanced");
     let advancedPrefs = doc.getElementById("advancedPrefs");
     let tab = doc.getElementById("dataChoicesTab");
     advancedPrefs.selectedTab = tab;
     fn(win, doc);
   });
 }
 
 function test() {
--- a/browser/components/preferences/in-content/tests/browser_search_no_results_change_category.js
+++ b/browser/components/preferences/in-content/tests/browser_search_no_results_change_category.js
@@ -14,15 +14,14 @@ add_task(async function() {
   let searchCompletedPromise = BrowserTestUtils.waitForEvent(
       gBrowser.contentWindow, "PreferencesSearchCompleted", evt => evt.detail == query);
   EventUtils.sendString(query);
   await searchCompletedPromise;
 
   let noResultsEl = gBrowser.contentDocument.querySelector("#no-results-message");
   is_element_visible(noResultsEl, "Should be reporting no results for this query");
 
-  let privacyCategory = gBrowser.contentDocument.querySelector("#category-privacy");
-  privacyCategory.click();
+  await gBrowser.contentWindow.gotoPref("panePrivacy");
   is_element_hidden(noResultsEl,
                     "Should not be showing the 'no results' message after selecting a category");
 
   BrowserTestUtils.removeTab(gBrowser.selectedTab);
 });
--- a/browser/components/preferences/in-content/tests/browser_telemetry.js
+++ b/browser/components/preferences/in-content/tests/browser_telemetry.js
@@ -1,19 +1,19 @@
 /* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 const PREF_TELEMETRY_ENABLED = "toolkit.telemetry.enabled";
 
 function runPaneTest(fn) {
-  open_preferences((win) => {
+  open_preferences(async (win) => {
     let doc = win.document;
-    win.gotoPref("paneAdvanced");
+    await win.gotoPref("paneAdvanced");
     let advancedPrefs = doc.getElementById("advancedPrefs");
     let tab = doc.getElementById("dataChoicesTab");
     advancedPrefs.selectedTab = tab;
     fn(win, doc);
   });
 }
 
 function test() {
--- a/browser/components/preferences/in-content/tests/privacypane_tests_perwindow.js
+++ b/browser/components/preferences/in-content/tests/privacypane_tests_perwindow.js
@@ -1,17 +1,17 @@
 // This file gets imported into the same scope as head.js.
 /* import-globals-from head.js */
 
 async function runTestOnPrivacyPrefPane(testFunc) {
   info("runTestOnPrivacyPrefPane entered");
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "about:preferences", true, true);
   let browser = tab.linkedBrowser;
   info("loaded about:preferences");
-  browser.contentWindow.gotoPref("panePrivacy");
+  await browser.contentWindow.gotoPref("panePrivacy");
   info("viewing privacy pane, executing testFunc");
   await testFunc(browser.contentWindow);
   BrowserTestUtils.removeTab(tab);
 }
 
 function controlChanged(element) {
   element.doCommand();
 }
--- a/intl/l10n/DOMLocalization.jsm
+++ b/intl/l10n/DOMLocalization.jsm
@@ -505,16 +505,23 @@ class DOMLocalization extends Localizati
    * Add `newRoot` to the list of roots managed by this `DOMLocalization`.
    *
    * Additionally, if this `DOMLocalization` has an observer, start observing
    * `newRoot` in order to translate mutations in it.
    *
    * @param {Element}      newRoot - Root to observe.
    */
   connectRoot(newRoot) {
+    // Sometimes we connect the root while the document is already in the
+    // process of being closed. Bail out gracefully.
+    // See bug 1532712 for details.
+    if (!newRoot.ownerGlobal) {
+      return;
+    }
+
     for (const root of this.roots) {
       if (root === newRoot ||
           root.contains(newRoot) ||
           newRoot.contains(root)) {
         throw new Error("Cannot add a root that overlaps with existing root.");
       }
     }