Bug 1258607 - Return promises from some satchel test helpers which use callbacks. r=dolske draft
authorMatthew Noorenberghe <mozilla@noorenberghe.ca>
Tue, 22 Mar 2016 02:01:33 -0400
changeset 343505 f5795e6367be9540d8cda38c0f0b8b9bba794c99
parent 343504 20dd7c6900978b6bc7d5993d1feff237fe81f3d6
child 343506 571443148b1884a396a1e00c7f69b925f2f2c1a5
child 343523 3e257e33b24b6f2d1997cea2f128aa7db9a96be5
push id13643
push usermozilla@noorenberghe.ca
push dateTue, 22 Mar 2016 20:50:36 +0000
reviewersdolske
bugs1258607
milestone48.0a1
Bug 1258607 - Return promises from some satchel test helpers which use callbacks. r=dolske MozReview-Commit-ID: 2glKz8R1XQo
toolkit/components/satchel/test/parent_utils.js
toolkit/components/satchel/test/satchel_common.js
--- a/toolkit/components/satchel/test/parent_utils.js
+++ b/toolkit/components/satchel/test/parent_utils.js
@@ -1,9 +1,9 @@
-var { classes: Cc, interfaces: Ci, utils: Cu } = Components;
+const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
 
 Cu.import("resource://gre/modules/FormHistory.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://testing-common/ContentTaskUtils.jsm");
 
 var gAutocompletePopup = Services.ww.activeWindow.
                                    document.
                                    getElementById("PopupAutoComplete");
--- a/toolkit/components/satchel/test/satchel_common.js
+++ b/toolkit/components/satchel/test/satchel_common.js
@@ -1,19 +1,17 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-var Services = SpecialPowers.Services;
 var gPopupShownListener;
 var gLastAutoCompleteResults;
+var gChromeScript;
 
 /*
- * $_
- *
  * Returns the element with the specified |name| attribute.
  */
 function $_(formNum, name) {
   var form = document.getElementById("form" + formNum);
   if (!form) {
     ok(false, "$_ couldn't find requested form " + formNum);
     return null;
   }
@@ -68,27 +66,33 @@ function getMenuEntries() {
     throw new Error("no autocomplete results");
   }
 
   var results = gLastAutoCompleteResults;
   gLastAutoCompleteResults = null;
   return results;
 }
 
+function checkArrayValues(actualValues, expectedValues, msg) {
+  is(actualValues.length, expectedValues.length, "Checking array values: " + msg);
+  for (var i = 0; i < expectedValues.length; i++)
+    is(actualValues[i], expectedValues[i], msg + " Checking array entry #" + i);
+}
+
 var checkObserver = {
   verifyStack: [],
   callback: null,
 
   init() {
-    script.sendAsyncMessage("addObserver");
-    script.addMessageListener("satchel-storage-changed", this.observe.bind(this));
+    gChromeScript.sendAsyncMessage("addObserver");
+    gChromeScript.addMessageListener("satchel-storage-changed", this.observe.bind(this));
   },
 
   uninit() {
-    script.sendAsyncMessage("removeObserver");
+    gChromeScript.sendAsyncMessage("removeObserver");
   },
 
   waitForChecks: function(callback) {
     if (this.verifyStack.length == 0)
       callback();
     else
       this.callback = callback;
   },
@@ -135,76 +139,118 @@ function getFormSubmitButton(formNum) {
   while (button && button.type != "submit") { button = button.nextSibling; }
   ok(button != null, "getting form submit button");
 
   return button;
 }
 
 // Count the number of entries with the given name and value, and call then(number)
 // when done. If name or value is null, then the value of that field does not matter.
-function countEntries(name, value, then) {
-  script.sendAsyncMessage("countEntries", { name, value });
-  script.addMessageListener("entriesCounted", function counted(data) {
-    script.removeMessageListener("entriesCounted", counted);
-    if (!data.ok) {
-      ok(false, "Error occurred counting form history");
-      SimpleTest.finish();
-      return;
-    }
+function countEntries(name, value, then = null) {
+  return new Promise(resolve => {
+    gChromeScript.sendAsyncMessage("countEntries", { name, value });
+    gChromeScript.addMessageListener("entriesCounted", function counted(data) {
+      gChromeScript.removeMessageListener("entriesCounted", counted);
+      if (!data.ok) {
+        ok(false, "Error occurred counting form history");
+        SimpleTest.finish();
+        return;
+      }
 
-    then(data.count);
+      if (then) {
+        then(data.count);
+      }
+      resolve(data.count);
+    });
   });
 }
 
 // Wrapper around FormHistory.update which handles errors. Calls then() when done.
-function updateFormHistory(changes, then) {
-  script.sendAsyncMessage("updateFormHistory", { changes });
-  script.addMessageListener("formHistoryUpdated", function updated({ ok }) {
-    script.removeMessageListener("formHistoryUpdated", updated);
-    if (!ok) {
-      ok(false, "Error occurred updating form history");
-      SimpleTest.finish();
-      return;
-    }
+function updateFormHistory(changes, then = null) {
+  return new Promise(resolve => {
+    gChromeScript.sendAsyncMessage("updateFormHistory", { changes });
+    gChromeScript.addMessageListener("formHistoryUpdated", function updated({ ok }) {
+      gChromeScript.removeMessageListener("formHistoryUpdated", updated);
+      if (!ok) {
+        ok(false, "Error occurred updating form history");
+        SimpleTest.finish();
+        return;
+      }
 
-    then();
+      if (then) {
+        then();
+      }
+      resolve();
+    });
   });
 }
 
-function notifyMenuChanged(expectedCount, expectedFirstValue, then) {
-  script.sendAsyncMessage("waitForMenuChange",
-                          { expectedCount,
-                            expectedFirstValue });
-  script.addMessageListener("gotMenuChange", function changed({ results }) {
-    script.removeMessageListener("gotMenuChange", changed);
-    gLastAutoCompleteResults = results;
-    then();
+function notifyMenuChanged(expectedCount, expectedFirstValue, then = null) {
+  return new Promise(resolve => {
+    gChromeScript.sendAsyncMessage("waitForMenuChange",
+                            { expectedCount,
+                              expectedFirstValue });
+    gChromeScript.addMessageListener("gotMenuChange", function changed({ results }) {
+      gChromeScript.removeMessageListener("gotMenuChange", changed);
+      gLastAutoCompleteResults = results;
+      if (then) {
+        then(results);
+      }
+      resolve(results);
+    });
   });
 }
 
-function notifySelectedIndex(expectedIndex, then) {
-  script.sendAsyncMessage("waitForSelectedIndex", { expectedIndex });
-  script.addMessageListener("gotSelectedIndex", function changed() {
-    script.removeMessageListener("gotSelectedIndex", changed);
-    then();
+function notifySelectedIndex(expectedIndex, then = null) {
+  return new Promise(resolve => {
+    gChromeScript.sendAsyncMessage("waitForSelectedIndex", { expectedIndex });
+    gChromeScript.addMessageListener("gotSelectedIndex", function changed() {
+      gChromeScript.removeMessageListener("gotSelectedIndex", changed);
+      if (then) {
+        then();
+      }
+      resolve();
+    });
+  });
+}
+
+function getPopupState(then = null) {
+  return new Promise(resolve => {
+    gChromeScript.sendAsyncMessage("getPopupState");
+    gChromeScript.addMessageListener("gotPopupState", function listener(state) {
+      gChromeScript.removeMessageListener("gotPopupState", listener);
+      if (then) {
+        then(state);
+      }
+      resolve(state);
+    });
   });
 }
 
-function getPopupState(then) {
-  script.sendAsyncMessage("getPopupState");
-  script.addMessageListener("gotPopupState", function listener(state) {
-    script.removeMessageListener("gotPopupState", listener);
-    then(state);
+/**
+ * Resolve at the next popupshown event for the autocomplete popup
+ * @return {Promise} with the results
+ */
+function promiseACShown() {
+  return new Promise(resolve => {
+    gChromeScript.addMessageListener("onpopupshown", ({ results }) => {
+      resolve(results);
+    });
   });
 }
 
-var chromeURL = SimpleTest.getTestFileURL("parent_utils.js");
-var script = SpecialPowers.loadChromeScript(chromeURL);
-script.addMessageListener("onpopupshown", ({ results }) => {
-  gLastAutoCompleteResults = results;
-  if (gPopupShownListener)
-    gPopupShownListener();
-});
+function satchelCommonSetup() {
+  var chromeURL = SimpleTest.getTestFileURL("parent_utils.js");
+  gChromeScript = SpecialPowers.loadChromeScript(chromeURL);
+  gChromeScript.addMessageListener("onpopupshown", ({ results }) => {
+    gLastAutoCompleteResults = results;
+    if (gPopupShownListener)
+      gPopupShownListener();
+  });
 
-SimpleTest.registerCleanupFunction(() => {
-  script.sendAsyncMessage("cleanup");
-  script.destroy();
-});
+  SimpleTest.registerCleanupFunction(() => {
+    gChromeScript.sendAsyncMessage("cleanup");
+    gChromeScript.destroy();
+  });
+}
+
+
+satchelCommonSetup();