Bug 1314674 - Maintain badge style in new windows and customize r?mixedpuppy draft
authorMark Striemer <mstriemer@mozilla.com>
Wed, 20 Sep 2017 17:27:48 -0500
changeset 669296 7fd91e5a224d669da68b10ff2b762436b3592b3a
parent 669263 fcb74900dd41c4c9b573bd7264accb047ed0f5b1
child 732924 074c30e73429b5327c6aae3cdf927a2aa49a34c2
push id81293
push userbmo:mstriemer@mozilla.com
push dateFri, 22 Sep 2017 21:51:10 +0000
reviewersmixedpuppy
bugs1314674
milestone58.0a1
Bug 1314674 - Maintain badge style in new windows and customize r?mixedpuppy MozReview-Commit-ID: 8f99d6Uqtx1
browser/components/extensions/ext-browserAction.js
browser/components/extensions/test/browser/browser_ext_browserAction_context.js
toolkit/content/widgets/toolbarbutton.xml
--- a/browser/components/extensions/ext-browserAction.js
+++ b/browser/components/extensions/ext-browserAction.js
@@ -437,24 +437,22 @@ this.browserAction = class extends Exten
       }
 
       if (tabData.enabled) {
         node.removeAttribute("disabled");
       } else {
         node.setAttribute("disabled", "true");
       }
 
-      let badgeNode = node.ownerDocument.getAnonymousElementByAttribute(node,
-                                          "class", "toolbarbutton-badge");
-      if (badgeNode) {
-        let color = tabData.badgeBackgroundColor;
-        if (color) {
-          color = `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3] / 255})`;
-        }
-        badgeNode.style.backgroundColor = color || "";
+      let color = tabData.badgeBackgroundColor;
+      if (color) {
+        color = `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3] / 255})`;
+        node.setAttribute("badgeStyle", `background-color: ${color};`);
+      } else {
+        node.removeAttribute("badgeStyle");
       }
 
       let {style, legacy} = this.iconData.get(tabData.icon);
       const LEGACY_CLASS = "toolbarbutton-legacy-addon";
       if (legacy) {
         node.classList.add(LEGACY_CLASS);
       } else {
         node.classList.remove(LEGACY_CLASS);
--- a/browser/components/extensions/test/browser/browser_ext_browserAction_context.js
+++ b/browser/components/extensions/test/browser/browser_ext_browserAction_context.js
@@ -402,8 +402,52 @@ add_task(async function testDefaultTitle
 
           await expectDefaults(details[3]);
           expect(details[3]);
         },
       ];
     },
   });
 });
+
+add_task(async function testBadgeColorPersistence() {
+  const extension = ExtensionTestUtils.loadExtension({
+    background() {
+      browser.test.onMessage.addListener((msg, arg) => {
+        browser.browserAction[msg](arg);
+      });
+    },
+    manifest: {
+      browser_action: {},
+    },
+  });
+  await extension.startup();
+
+  function getBadgeForWindow(win) {
+    const widget = getBrowserActionWidget(extension).forWindow(win).node;
+    return document.getAnonymousElementByAttribute(widget, "class", "toolbarbutton-badge");
+  }
+
+  let badge = getBadgeForWindow(window);
+  const badgeChanged = new Promise((resolve) => {
+    const observer = new MutationObserver(() => resolve());
+    observer.observe(badge, {attributes: true, attributeFilter: ["style"]});
+  });
+
+  extension.sendMessage("setBadgeText", {text: "hi"});
+  extension.sendMessage("setBadgeBackgroundColor", {color: [0, 255, 0, 255]});
+
+  await badgeChanged;
+
+  is(badge.value, "hi", "badge text is set in first window");
+  is(badge.style.backgroundColor, "rgb(0, 255, 0)", "badge color is set in first window");
+
+  let windowOpenedPromise = BrowserTestUtils.waitForNewWindow();
+  let win = OpenBrowserWindow();
+  await windowOpenedPromise;
+
+  badge = getBadgeForWindow(win);
+  is(badge.value, "hi", "badge text is set in new window");
+  is(badge.style.backgroundColor, "rgb(0, 255, 0)", "badge color is set in new window");
+
+  await BrowserTestUtils.closeWindow(win);
+  await extension.unload();
+});
--- a/toolkit/content/widgets/toolbarbutton.xml
+++ b/toolkit/content/widgets/toolbarbutton.xml
@@ -83,17 +83,17 @@
   </binding>
 
   <binding id="toolbarbutton-badged"
            extends="chrome://global/content/bindings/toolbarbutton.xml#toolbarbutton">
     <content>
       <children includes="observes|template|menupopup|panel|tooltip"/>
       <xul:stack class="toolbarbutton-badge-stack">
         <xul:image class="toolbarbutton-icon" xbl:inherits="validate,src=image,label,consumeanchor"/>
-        <xul:label class="toolbarbutton-badge" xbl:inherits="value=badge" top="0" end="0" crop="none"/>
+        <xul:label class="toolbarbutton-badge" xbl:inherits="value=badge,style=badgeStyle" top="0" end="0" crop="none"/>
       </xul:stack>
       <xul:label class="toolbarbutton-text" crop="right" flex="1"
                  xbl:inherits="value=label,accesskey,crop,wrap"/>
       <xul:label class="toolbarbutton-multiline-text" flex="1"
                  xbl:inherits="xbl:text=label,accesskey,wrap"/>
     </content>
   </binding>