Bug 1259729 turn on pocket during pocket test, r=Gijs
authorShane Caraveo <scaraveo@mozilla.com>
Fri, 01 Apr 2016 08:39:48 -0700
changeset 291457 8e350c4b966f97902ab2d95cd9d70a88d1e70c68
parent 291401 543ba2e092d2d4de86b1994a646ee75df5519c58
child 291458 6f1d7279737d7e3ad4194947f81aeaad4e2c89a4
push id19656
push usergwagner@mozilla.com
push dateMon, 04 Apr 2016 13:43:23 +0000
treeherderb2g-inbound@e99061fde28a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersGijs
bugs1259729
milestone48.0a1
Bug 1259729 turn on pocket during pocket test, r=Gijs
browser/extensions/pocket/test/browser.ini
browser/extensions/pocket/test/browser_pocket_ui_check.js
browser/extensions/pocket/test/head.js
browser/extensions/pocket/test/test.html
--- a/browser/extensions/pocket/test/browser.ini
+++ b/browser/extensions/pocket/test/browser.ini
@@ -1,1 +1,6 @@
+[DEFAULT]
+support-files =
+  head.js
+  test.html
+
 [browser_pocket_ui_check.js]
--- a/browser/extensions/pocket/test/browser_pocket_ui_check.js
+++ b/browser/extensions/pocket/test/browser_pocket_ui_check.js
@@ -1,21 +1,54 @@
 "use strict";
 
+function checkWindowProperties(expectPresent, l) {
+  for (let name of l) {
+    is(!!window.hasOwnProperty(name), expectPresent, "property " + name + (expectPresent ? " is" : " is not") + " present");
+  }
+}
+function checkElements(expectPresent, l) {
+  for (let id of l) {
+    is(!!document.getElementById(id), expectPresent, "element " + id + (expectPresent ? " is" : " is not") + " present");
+  }
+}
+
 add_task(function*() {
-  let pocketAddon = yield new Promise(resolve => {
-    AddonManager.getAddonByID("firefox@getpocket.com", resolve);
+  let enabledOnStartup = yield promisePocketEnabled();
+  registerCleanupFunction(() => {
+    // Extra insurance that this is disabled again, but it should have been set
+    // in promisePocketReset.
+    Services.prefs.setBoolPref("extensions.pocket.enabled", enabledOnStartup);
   });
-  if (!pocketAddon) {
-    ok(true, "Pocket is not installed");
-    return;
-  }
-  if (!Services.prefs.getBoolPref("extensions.pocket.enabled")) {
-    ok(true, "Pocket add-on is not enabled");
-    return;
-  }
+
+  checkWindowProperties(true, ["Pocket", "pktUI", "pktUIMessaging"]);
+  checkElements(true, ["pocket-button", "panelMenu_pocket", "menu_pocket", "BMB_pocket",
+                       "panelMenu_pocketSeparator", "menu_pocketSeparator",
+                       "BMB_pocketSeparator"]);
+
+  // check context menu exists
+  info("checking content context menu");
+  let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, "https://example.com/browser/browser/extensions/pocket/test/test.html");
 
-  for (let id of ["panelMenu_pocket", "menu_pocket", "BMB_pocket",
-                  "panelMenu_pocketSeparator", "menu_pocketSeparator",
-                  "BMB_pocketSeparator"]) {
-    ok(document.getElementById(id), "Should see element with id " + id);
-  }
+  let contextMenu = document.getElementById("contentAreaContextMenu");
+  let popupShown = BrowserTestUtils.waitForEvent(contextMenu, "popupshown");
+  let popupHidden = BrowserTestUtils.waitForEvent(contextMenu, "popuphidden");
+  yield BrowserTestUtils.synthesizeMouseAtCenter("body", {
+    type: "contextmenu",
+    button: 2
+  }, tab.linkedBrowser);
+  yield popupShown;
+
+  checkElements(true, ["context-pocket", "context-savelinktopocket"]);
+
+  contextMenu.hidePopup();
+  yield popupHidden;
+  yield BrowserTestUtils.removeTab(tab);
+
+  yield promisePocketDisabled();
+
+  checkWindowProperties(false, ["Pocket", "pktUI", "pktUIMessaging"]);
+  checkElements(false, ["pocket-button", "panelMenu_pocket", "menu_pocket", "BMB_pocket",
+                       "panelMenu_pocketSeparator", "menu_pocketSeparator",
+                       "BMB_pocketSeparator", "context-pocket", "context-savelinktopocket"]);
+
+  yield promisePocketReset();
 });
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/test/head.js
@@ -0,0 +1,68 @@
+// Currently Pocket is disabled in tests.  We want these tests to work under
+// either case that Pocket is disabled or enabled on startup of the browser,
+// and that at the end we're reset to the correct state.
+let enabledOnStartup = false;
+
+// PocketEnabled/Disabled promises return true if it was already
+// Enabled/Disabled, and false if it need to Enable/Disable.
+function promisePocketEnabled() {
+  if (Services.prefs.getPrefType("extensions.pocket.enabled") != Services.prefs.PREF_INVALID &&
+      Services.prefs.getBoolPref("extensions.pocket.enabled")) {
+    info( "pocket was already enabled, assuming enabled by default for tests");
+    enabledOnStartup = true;
+    return Promise.resolve(true);
+  }
+  info( "pocket is not enabled");
+  return new Promise((resolve, reject) => {
+    let listener = {
+      onWidgetAfterCreation(widgetid) {
+        if (widgetid == "pocket-button") {
+          info("pocket-button created");
+          CustomizableUI.removeListener(listener);
+          resolve(false);
+        }
+      }
+    }
+    CustomizableUI.addListener(listener);
+    Services.prefs.setBoolPref("extensions.pocket.enabled", true);
+  });
+}
+
+function promisePocketDisabled() {
+  if (Services.prefs.getPrefType("extensions.pocket.enabled") == Services.prefs.PREF_INVALID ||
+      !Services.prefs.getBoolPref("extensions.pocket.enabled")) {
+    info("pocket-button already disabled");
+    return Promise.resolve(true);
+  }
+  return new Promise((resolve, reject) => {
+    let listener = {
+      onWidgetDestroyed: function(widgetid) {
+        if (widgetid == "pocket-button") {
+          CustomizableUI.removeListener(listener);
+          info( "pocket-button destroyed");
+          // wait for a full unload of pocket
+          BrowserTestUtils.waitForCondition(() => {
+            return !window.hasOwnProperty("pktUI");
+          }, "pocket properties removed from window").then(() => {
+            resolve(false);
+          })
+        }
+      }
+    }
+    CustomizableUI.addListener(listener);
+    info("reset pocket enabled pref");
+    // testing/profiles/prefs_general.js uses user_pref to disable pocket, set
+    // back to false.
+    Services.prefs.setBoolPref("extensions.pocket.enabled", false);
+  });
+}
+
+function promisePocketReset() {
+  if (enabledOnStartup) {
+    info("reset is enabling pocket addon");
+    return promisePocketEnabled();
+  } else {
+    info("reset is disabling pocket addon");
+    return promisePocketDisabled();
+  }
+}
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/test/test.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+    <title>Page Title</title>
+    <meta charset="utf-8" />
+</head>
+
+<body>
+</body>
+</html>