Bug 1374477 - Update consumers of Photon page action panel for changed identifiers. r?Gijs draft
authorDrew Willcoxon <adw@mozilla.com>
Sat, 29 Jul 2017 20:25:08 -0700
changeset 618104 ccb3286cc26761bb2128b769f6c665f93239b7b7
parent 618103 73f2a4da0de7939fdbb7220eb0dc4079e616321a
child 618105 de637e1b0dc361c1590cca0a051cf1adcf4784a7
push id71221
push userdwillcoxon@mozilla.com
push dateSun, 30 Jul 2017 03:26:37 +0000
reviewersGijs
bugs1374477
milestone56.0a1
Bug 1374477 - Update consumers of Photon page action panel for changed identifiers. r?Gijs MozReview-Commit-ID: 1skE8YJaqA7
browser/base/content/browser-sync.js
browser/base/content/browser.css
browser/base/content/test/performance/browser_startup_images.js
browser/base/content/test/urlbar/browser_page_action_menu.js
browser/base/content/test/urlbar/browser_page_action_menu_clipboard.js
browser/base/content/test/urlbar/head.js
--- a/browser/base/content/browser-sync.js
+++ b/browser/base/content/browser-sync.js
@@ -346,17 +346,17 @@ var gSync = {
 
   _appendSendTabDeviceList(fragment, createDeviceNodeFn, url, title) {
     const onTargetDeviceCommand = (event) => {
       let clients = event.target.getAttribute("clientId") ?
         [event.target.getAttribute("clientId")] :
         this.remoteClients.map(client => client.id);
 
       clients.forEach(clientId => this.sendTabToDevice(url, clientId, title));
-      gPageActionButton.panel.hidePopup();
+      BrowserPageActions.panelNode.hidePopup();
     }
 
     function addTargetDevice(clientId, name, clientType) {
       const targetDevice = createDeviceNodeFn(clientId, name, clientType);
       targetDevice.addEventListener("command", onTargetDeviceCommand, true);
       targetDevice.classList.add("sync-menuitem", "sendtab-target");
       targetDevice.setAttribute("clientId", clientId);
       targetDevice.setAttribute("clientType", clientType);
@@ -379,35 +379,35 @@ var gSync = {
     }
   },
 
   _appendSendTabSingleDevice(fragment, createDeviceNodeFn) {
     const noDevices = this.fxaStrings.GetStringFromName("sendTabToDevice.singledevice.status");
     const learnMore = this.fxaStrings.GetStringFromName("sendTabToDevice.singledevice");
     this._appendSendTabInfoItems(fragment, createDeviceNodeFn, noDevices, learnMore, () => {
       this.openSendToDevicePromo();
-      gPageActionButton.panel.hidePopup();
+      BrowserPageActions.panelNode.hidePopup();
     });
   },
 
   _appendSendTabVerify(fragment, createDeviceNodeFn) {
     const notVerified = this.fxaStrings.GetStringFromName("sendTabToDevice.verify.status");
     const verifyAccount = this.fxaStrings.GetStringFromName("sendTabToDevice.verify");
     this._appendSendTabInfoItems(fragment, createDeviceNodeFn, notVerified, verifyAccount, () => {
       this.openPrefs("sendtab");
-      gPageActionButton.panel.hidePopup();
+      BrowserPageActions.panelNode.hidePopup();
     });
   },
 
   _appendSendTabUnconfigured(fragment, createDeviceNodeFn) {
     const notConnected = this.fxaStrings.GetStringFromName("sendTabToDevice.unconfigured.status");
     const learnMore = this.fxaStrings.GetStringFromName("sendTabToDevice.unconfigured");
     this._appendSendTabInfoItems(fragment, createDeviceNodeFn, notConnected, learnMore, () => {
       this.openSendToDevicePromo();
-      gPageActionButton.panel.hidePopup();
+      BrowserPageActions.panelNode.hidePopup();
     });
   },
 
   _appendSendTabInfoItems(fragment, createDeviceNodeFn, statusLabel, actionLabel, actionCommand) {
     const status = createDeviceNodeFn(null, statusLabel, null);
     status.setAttribute("label", statusLabel);
     status.setAttribute("disabled", true);
     status.classList.add("sync-menuitem");
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -1489,14 +1489,17 @@ toolbarpaletteitem[place="palette"][hidd
 }
 
 .dragfeedback-tab {
   -moz-appearance: none;
   opacity: 0.65;
   -moz-window-shadow: none;
 }
 
-/* Page action menu */
-#page-action-sendToDeviceView-body:not([state="notready"]) > #page-action-sync-not-ready-button {
+%ifdef MOZ_PHOTON_THEME
+/* Page action panel */
+#pageAction-panel-sendToDevice-subview-body:not([state="notready"]) > #pageAction-panel-sendToDevice-notReady,
+#pageAction-urlbar-sendToDevice-subview-body:not([state="notready"]) > #pageAction-urlbar-sendToDevice-notReady {
   display: none;
 }
+%endif
 
 %include theme-vars.inc.css
--- a/browser/base/content/test/performance/browser_startup_images.js
+++ b/browser/base/content/test/performance/browser_startup_images.js
@@ -25,16 +25,21 @@
  */
 const whitelist = [
   // Photon-only entries
   {
     file: "chrome://browser/skin/stop.svg",
     platforms: ["linux", "win", "macosx"],
     photon: true,
   },
+  {
+    file: "chrome://browser/skin/page-action.svg",
+    platforms: ["linux", "win", "macosx"],
+    photon: true,
+  },
 
   // Non-Photon-only entries
   {
     file: "chrome://browser/skin/toolbarbutton-dropdown-arrow.png",
     platforms: ["linux", "win", "macosx"],
     photon: false,
   },
 
--- a/browser/base/content/test/urlbar/browser_page_action_menu.js
+++ b/browser/base/content/test/urlbar/browser_page_action_menu.js
@@ -18,17 +18,17 @@ const mockRemoteClients = [
 add_task(async function bookmark() {
   // Open a unique page.
   let url = "http://example.com/browser_page_action_menu";
   await BrowserTestUtils.withNewTab(url, async () => {
     // Open the panel.
     await promisePageActionPanelOpen();
 
     // The bookmark button should read "Bookmark This Page" and not be starred.
-    let bookmarkButton = document.getElementById("page-action-bookmark-button");
+    let bookmarkButton = document.getElementById("pageAction-panel-bookmark");
     Assert.equal(bookmarkButton.label, "Bookmark This Page");
     Assert.ok(!bookmarkButton.hasAttribute("starred"));
 
     // Click the button.
     let hiddenPromise = promisePageActionPanelHidden();
     EventUtils.synthesizeMouseAtCenter(bookmarkButton, {});
     await hiddenPromise;
 
@@ -83,45 +83,51 @@ add_task(async function bookmark() {
     // Done.
     hiddenPromise = promisePageActionPanelHidden();
     gPageActionPanel.hidePopup();
     await hiddenPromise;
   });
 });
 
 add_task(async function emailLink() {
-  // Replace the email-link entry point to check whether it's called.
-  let originalFn = MailIntegration.sendLinkForBrowser;
-  let fnCalled = false;
-  MailIntegration.sendLinkForBrowser = () => {
-    fnCalled = true;
-  };
-  registerCleanupFunction(() => {
-    MailIntegration.sendLinkForBrowser = originalFn;
-  });
+  // Open an actionable page so that the main page action button appears.  (It
+  // does not appear on about:blank for example.)
+  let url = "http://example.com/";
+  await BrowserTestUtils.withNewTab(url, async () => {
+    // Replace the email-link entry point to check whether it's called.
+    let originalFn = MailIntegration.sendLinkForBrowser;
+    let fnCalled = false;
+    MailIntegration.sendLinkForBrowser = () => {
+      fnCalled = true;
+    };
+    registerCleanupFunction(() => {
+      MailIntegration.sendLinkForBrowser = originalFn;
+    });
 
-  // Open the panel and click Email Link.
-  await promisePageActionPanelOpen();
-  let emailLinkButton =
-    document.getElementById("page-action-email-link-button");
-  let hiddenPromise = promisePageActionPanelHidden();
-  EventUtils.synthesizeMouseAtCenter(emailLinkButton, {});
-  await hiddenPromise;
+    // Open the panel and click Email Link.
+    await promisePageActionPanelOpen();
+    let emailLinkButton =
+      document.getElementById("pageAction-panel-emailLink");
+    let hiddenPromise = promisePageActionPanelHidden();
+    EventUtils.synthesizeMouseAtCenter(emailLinkButton, {});
+    await hiddenPromise;
 
-  Assert.ok(fnCalled);
+    Assert.ok(fnCalled);
+  });
 });
 
 add_task(async function sendToDevice_nonSendable() {
-  // Open a tab that's not sendable.
-  await BrowserTestUtils.withNewTab("about:blank", async () => {
+  // Open a tab that's not sendable -- but that's also actionable so that the
+  // main page action button appears.
+  await BrowserTestUtils.withNewTab("about:home", async () => {
     await promiseSyncReady();
     // Open the panel.  Send to Device should be disabled.
     await promisePageActionPanelOpen();
     let sendToDeviceButton =
-      document.getElementById("page-action-send-to-device-button");
+      document.getElementById("pageAction-panel-sendToDevice");
     Assert.ok(sendToDeviceButton.disabled);
     let hiddenPromise = promisePageActionPanelHidden();
     gPageActionPanel.hidePopup();
     await hiddenPromise;
   });
 });
 
 add_task(async function sendToDevice_syncNotReady_other_states() {
@@ -137,28 +143,28 @@ add_task(async function sendToDevice_syn
     let cleanUp = () => {
       sandbox.restore();
     };
     registerCleanupFunction(cleanUp);
 
     // Open the panel.
     await promisePageActionPanelOpen();
     let sendToDeviceButton =
-      document.getElementById("page-action-send-to-device-button");
+      document.getElementById("pageAction-panel-sendToDevice");
     Assert.ok(!sendToDeviceButton.disabled);
 
     // Click Send to Device.
     let viewPromise = promisePageActionViewShown();
     EventUtils.synthesizeMouseAtCenter(sendToDeviceButton, {});
     let view = await viewPromise;
-    Assert.equal(view.id, "page-action-sendToDeviceView");
+    Assert.equal(view.id, "pageAction-panel-sendToDevice-subview");
 
     let expectedItems = [
       {
-        id: "page-action-sync-not-ready-button",
+        id: "pageAction-panel-sendToDevice-notReady",
         display: "none",
         disabled: true,
       },
       {
         attrs: {
           label: "Account Not Verified",
         },
         disabled: true
@@ -192,54 +198,54 @@ add_task(async function sendToDevice_syn
     sandbox.stub(gSync, "isSendableURI").returns(true);
 
     sandbox.stub(Weave.Service, "sync").callsFake(() => {
       syncReady.get(() => true);
       lastSync.get(() => Date.now());
       sandbox.stub(gSync, "remoteClients").get(() => mockRemoteClients);
     });
 
-    const setupSendToDeviceView = gPageActionButton.setupSendToDeviceView;
-    sandbox.stub(gPageActionButton, "setupSendToDeviceView").callsFake(() => {
+    let onShowingSubview = BrowserPageActions.sendToDevice.onShowingSubview;
+    sandbox.stub(BrowserPageActions.sendToDevice, "onShowingSubview").callsFake((...args) => {
       this.numCall++ || (this.numCall = 1);
-      setupSendToDeviceView.call(gPageActionButton);
+      onShowingSubview.call(BrowserPageActions.sendToDevice, ...args);
       testSendTabToDeviceMenu(this.numCall);
     });
 
     let cleanUp = () => {
       sandbox.restore();
     };
     registerCleanupFunction(cleanUp);
 
     // Open the panel.
     await promisePageActionPanelOpen();
     let sendToDeviceButton =
-      document.getElementById("page-action-send-to-device-button");
+      document.getElementById("pageAction-panel-sendToDevice");
     Assert.ok(!sendToDeviceButton.disabled);
 
     // Click Send to Device.
     let viewPromise = promisePageActionViewShown();
     EventUtils.synthesizeMouseAtCenter(sendToDeviceButton, {});
     let view = await viewPromise;
-    Assert.equal(view.id, "page-action-sendToDeviceView");
+    Assert.equal(view.id, "pageAction-panel-sendToDevice-subview");
 
     function testSendTabToDeviceMenu(numCall) {
       if (numCall == 1) {
         // "Syncing devices" should be shown.
         checkSendToDeviceItems([
           {
-            id: "page-action-sync-not-ready-button",
+            id: "pageAction-panel-sendToDevice-notReady",
             disabled: true,
           },
         ]);
       } else if (numCall == 2) {
         // The devices should be shown in the subview.
         let expectedItems = [
           {
-            id: "page-action-sync-not-ready-button",
+            id: "pageAction-panel-sendToDevice-notReady",
             display: "none",
             disabled: true,
           },
         ];
         for (let client of mockRemoteClients) {
           expectedItems.push({
             attrs: {
               clientId: client.id,
@@ -273,28 +279,28 @@ add_task(async function sendToDevice_syn
 add_task(async function sendToDevice_notSignedIn() {
   // Open a tab that's sendable.
   await BrowserTestUtils.withNewTab("http://example.com/", async () => {
     await promiseSyncReady();
 
     // Open the panel.
     await promisePageActionPanelOpen();
     let sendToDeviceButton =
-      document.getElementById("page-action-send-to-device-button");
+      document.getElementById("pageAction-panel-sendToDevice");
     Assert.ok(!sendToDeviceButton.disabled);
 
     // Click Send to Device.
     let viewPromise = promisePageActionViewShown();
     EventUtils.synthesizeMouseAtCenter(sendToDeviceButton, {});
     let view = await viewPromise;
-    Assert.equal(view.id, "page-action-sendToDeviceView");
+    Assert.equal(view.id, "pageAction-panel-sendToDevice-subview");
 
     let expectedItems = [
       {
-        id: "page-action-sync-not-ready-button",
+        id: "pageAction-panel-sendToDevice-notReady",
         display: "none",
         disabled: true,
       },
       {
         attrs: {
           label: "Not Connected to Sync",
         },
         disabled: true
@@ -329,28 +335,28 @@ add_task(async function sendToDevice_noD
     let cleanUp = () => {
       sandbox.restore();
     };
     registerCleanupFunction(cleanUp);
 
     // Open the panel.
     await promisePageActionPanelOpen();
     let sendToDeviceButton =
-      document.getElementById("page-action-send-to-device-button");
+      document.getElementById("pageAction-panel-sendToDevice");
     Assert.ok(!sendToDeviceButton.disabled);
 
     // Click Send to Device.
     let viewPromise = promisePageActionViewShown();
     EventUtils.synthesizeMouseAtCenter(sendToDeviceButton, {});
     let view = await viewPromise;
-    Assert.equal(view.id, "page-action-sendToDeviceView");
+    Assert.equal(view.id, "pageAction-panel-sendToDevice-subview");
 
     let expectedItems = [
       {
-        id: "page-action-sync-not-ready-button",
+        id: "pageAction-panel-sendToDevice-notReady",
         display: "none",
         disabled: true,
       },
       {
         attrs: {
           label: "No Devices Connected",
         },
         disabled: true
@@ -389,29 +395,29 @@ add_task(async function sendToDevice_dev
     let cleanUp = () => {
       sandbox.restore();
     };
     registerCleanupFunction(cleanUp);
 
     // Open the panel.
     await promisePageActionPanelOpen();
     let sendToDeviceButton =
-      document.getElementById("page-action-send-to-device-button");
+      document.getElementById("pageAction-panel-sendToDevice");
     Assert.ok(!sendToDeviceButton.disabled);
 
     // Click Send to Device.
     let viewPromise = promisePageActionViewShown();
     EventUtils.synthesizeMouseAtCenter(sendToDeviceButton, {});
     let view = await viewPromise;
-    Assert.equal(view.id, "page-action-sendToDeviceView");
+    Assert.equal(view.id, "pageAction-panel-sendToDevice-subview");
 
     // The devices should be shown in the subview.
     let expectedItems = [
       {
-        id: "page-action-sync-not-ready-button",
+        id: "pageAction-panel-sendToDevice-notReady",
         display: "none",
         disabled: true,
       },
     ];
     for (let client of mockRemoteClients) {
       expectedItems.push({
         attrs: {
           clientId: client.id,
@@ -445,17 +451,18 @@ function promiseSyncReady() {
                   .wrappedJSObject;
   return service.whenLoaded().then(() => {
     UIState.isReady();
     return UIState.refresh();
   });
 }
 
 function checkSendToDeviceItems(expectedItems) {
-  let body = document.getElementById("page-action-sendToDeviceView-body");
+  let body =
+    document.getElementById("pageAction-panel-sendToDevice-subview-body");
   Assert.equal(body.childNodes.length, expectedItems.length);
   for (let i = 0; i < expectedItems.length; i++) {
     let expected = expectedItems[i];
     let actual = body.childNodes[i];
     if (!expected) {
       Assert.equal(actual.localName, "toolbarseparator");
       continue;
     }
--- a/browser/base/content/test/urlbar/browser_page_action_menu_clipboard.js
+++ b/browser/base/content/test/urlbar/browser_page_action_menu_clipboard.js
@@ -2,30 +2,35 @@
 
 const mockRemoteClients = [
   { id: "0", name: "foo", type: "mobile" },
   { id: "1", name: "bar", type: "desktop" },
   { id: "2", name: "baz", type: "mobile" },
 ];
 
 add_task(async function copyURL() {
-  // Open the panel.
-  await promisePageActionPanelOpen();
+  // Open an actionable page so that the main page action button appears.  (It
+  // does not appear on about:blank for example.)
+  let url = "http://example.com/";
+  await BrowserTestUtils.withNewTab(url, async () => {
+    // Open the panel.
+    await promisePageActionPanelOpen();
 
-  // Click Copy URL.
-  let copyURLButton = document.getElementById("page-action-copy-url-button");
-  let hiddenPromise = promisePageActionPanelHidden();
-  EventUtils.synthesizeMouseAtCenter(copyURLButton, {});
-  await hiddenPromise;
+    // Click Copy URL.
+    let copyURLButton = document.getElementById("pageAction-panel-copyURL");
+    let hiddenPromise = promisePageActionPanelHidden();
+    EventUtils.synthesizeMouseAtCenter(copyURLButton, {});
+    await hiddenPromise;
 
-  // Check the clipboard.
-  let transferable = Cc["@mozilla.org/widget/transferable;1"]
-                       .createInstance(Ci.nsITransferable);
-  transferable.init(null);
-  let flavor = "text/unicode";
-  transferable.addDataFlavor(flavor);
-  Services.clipboard.getData(transferable, Services.clipboard.kGlobalClipboard);
-  let strObj = {};
-  transferable.getTransferData(flavor, strObj, {});
-  Assert.ok(!!strObj.value);
-  strObj.value.QueryInterface(Ci.nsISupportsString);
-  Assert.equal(strObj.value.data, gBrowser.selectedBrowser.currentURI.spec);
+    // Check the clipboard.
+    let transferable = Cc["@mozilla.org/widget/transferable;1"]
+                         .createInstance(Ci.nsITransferable);
+    transferable.init(null);
+    let flavor = "text/unicode";
+    transferable.addDataFlavor(flavor);
+    Services.clipboard.getData(transferable, Services.clipboard.kGlobalClipboard);
+    let strObj = {};
+    transferable.getTransferData(flavor, strObj, {});
+    Assert.ok(!!strObj.value);
+    strObj.value.QueryInterface(Ci.nsISupportsString);
+    Assert.equal(strObj.value.data, gBrowser.selectedBrowser.currentURI.spec);
+  });
 });
--- a/browser/base/content/test/urlbar/head.js
+++ b/browser/base/content/test/urlbar/head.js
@@ -195,20 +195,20 @@ function promiseNewSearchEngine(basename
       onError(errCode) {
         Assert.ok(false, "addEngine failed with error code " + errCode);
         reject();
       },
     });
   });
 }
 
-let gPageActionPanel = document.getElementById("page-action-panel");
+let gPageActionPanel = document.getElementById("pageActionPanel");
 
 function promisePageActionPanelOpen() {
-  let button = document.getElementById("urlbar-page-action-button");
+  let button = document.getElementById("pageActionButton");
   let shownPromise = promisePageActionPanelShown();
   EventUtils.synthesizeMouseAtCenter(button, {});
   return shownPromise;
 }
 
 function promisePageActionPanelShown() {
   return promisePageActionPanelEvent("popupshown");
 }