Bug 1101122 - Update about:home search styling. r=felipe a=gavin
authorDave Townsend <dtownsend@oxymoronical.com>
Mon, 24 Nov 2014 08:40:22 -0200
changeset 234097 492f2a661cab3632ef2125977db18f42bced5379
parent 234096 c77db3659462acf822a0b855db8eb1339f3be695
child 234098 4fb9368f8de1a1c1083765ba273587b4c1c82fb5
push id1
push usersledru@mozilla.com
push dateThu, 04 Dec 2014 17:57:20 +0000
reviewersfelipe, gavin
bugs1101122
milestone35.0
Bug 1101122 - Update about:home search styling. r=felipe a=gavin Some changes to the original patch made by Felipe, with r=Mossop. These changes are to toggle the new search styling based on the browser.search.showOneOffButtons pref. a=gavin
browser/base/content/abouthome/aboutHome.css
browser/base/content/abouthome/aboutHome.xhtml
browser/base/content/browser-doctype.inc
browser/base/content/browser.css
browser/base/content/browser.xul
browser/base/content/content.js
browser/base/content/test/general/browser_aboutHome.js
browser/modules/AboutHome.jsm
browser/themes/linux/jar.mn
browser/themes/osx/jar.mn
browser/themes/shared/magnifier.png
browser/themes/shared/magnifier@2x.png
browser/themes/windows/jar.mn
--- a/browser/base/content/abouthome/aboutHome.css
+++ b/browser/base/content/abouthome/aboutHome.css
@@ -71,16 +71,46 @@ a {
 
 #searchEngineLogo {
   display: inline-block;
   height: 28px;
   width: 70px;
   min-width: 70px;
 }
 
+#searchIcon {
+  border: 1px solid transparent;
+  -moz-margin-end: 5px;
+  height: 38px;
+  width: 38px;
+  background-image: url("chrome://browser/skin/magnifier.png");
+  background-size: 26px;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+
+#searchIcon[active],
+#searchIcon:hover {
+  background-color: #e9e9e9;
+  border: 1px solid rgb(226, 227, 229);
+  border-radius: 2.5px;
+}
+
+html[searchUIConfiguration="oldsearchui"] #searchIcon {
+  display: none;
+}
+
+html:not([searchUIConfiguration="oldsearchui"]) #searchText::-moz-placeholder {
+  color: transparent;
+}
+
+html:not([searchUIConfiguration="oldsearchui"]) #searchLogoContainer {
+  display: none;
+}
+
 #searchText {
   -moz-box-flex: 1;
   padding: 6px 8px;
   background: hsla(0,0%,100%,.9) padding-box;
   border: 1px solid;
   border-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.17) hsla(210,54%,20%,.2);
   box-shadow: 0 1px 0 hsla(210,65%,9%,.02) inset,
               0 0 2px hsla(210,65%,9%,.1) inset,
@@ -363,16 +393,20 @@ body[narrow] #restorePreviousSession::be
  * At resolutions above 1dppx, prefer downscaling the 2x Retina graphics
  * rather than upscaling the original-size ones (bug 818940).
  */
 @media not all and (max-resolution: 1dppx) {
   #brandLogo {
     background-image: url("chrome://branding/content/about-logo@2x.png");
   }
 
+  #searchIcon {
+    background-image: url("chrome://browser/skin/magnifier@2x.png");
+  }
+
   #defaultSnippet1,
   #defaultSnippet2,
   #rightsSnippet {
     background-size: 40px;
   }
 
   #defaultSnippet1 {
     background-image: url("chrome://browser/content/abouthome/snippet1@2x.png");
--- a/browser/base/content/abouthome/aboutHome.xhtml
+++ b/browser/base/content/abouthome/aboutHome.xhtml
@@ -36,17 +36,18 @@
 
   <body dir="&locale.dir;">
     <div class="spacer"/>
     <div id="topSection">
       <div id="brandLogo"></div>
 
       <div id="searchContainer">
         <form name="searchForm" id="searchForm" onsubmit="onSearchSubmit(event)">
-          <div id="searchLogoContainer"><img id="searchEngineLogo"/></div>
+          <div id="searchLogoContainer" hidden="true"><img id="searchEngineLogo"/></div>
+          <button id="searchIcon" type="button" />
           <input type="text" name="q" value="" id="searchText" maxlength="256"
                  autofocus="autofocus" dir="auto"/>
           <input id="searchSubmit" type="submit" value="&abouthome.searchEngineButton.label;"/>
         </form>
       </div>
 
       <div id="snippetContainer">
         <div id="defaultSnippets" hidden="true">
--- a/browser/base/content/browser-doctype.inc
+++ b/browser/base/content/browser-doctype.inc
@@ -14,10 +14,12 @@
 <!ENTITY % placesDTD SYSTEM "chrome://browser/locale/places/places.dtd">
 %placesDTD;
 #ifdef MOZ_SAFE_BROWSING
 <!ENTITY % safebrowsingDTD SYSTEM "chrome://browser/locale/safebrowsing/phishing-afterload-warning-message.dtd">
 %safebrowsingDTD;
 #endif
 <!ENTITY % aboutHomeDTD SYSTEM "chrome://browser/locale/aboutHome.dtd">
 %aboutHomeDTD;
+<!ENTITY % searchBarDTD SYSTEM "chrome://browser/locale/searchbar.dtd">
+%searchBarDTD;
 ]>
 
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -1210,16 +1210,39 @@ toolbarpaletteitem[place="palette"][hidd
   animation-name: uitour-zoom;
   animation-duration: 1s;
 }
 #UITourHighlight[active="color"] {
   animation-name: uitour-color;
   animation-duration: 2s;
 }
 
+#abouthome-search-panel .panel-arrowcontent {
+  -moz-padding-start: 0;
+  -moz-padding-end: 0;
+  padding-top: 0;
+  padding-bottom: 0;
+  background: rgb(248, 250, 251);
+  font-size: 110%;
+}
+
+.abouthome-search-panel-item {
+  -moz-box-align: center;
+  padding-top: 4px;
+  padding-bottom: 4px;
+  -moz-padding-start: 24px;
+  -moz-padding-end: 24px;
+}
+
+.abouthome-search-panel-item > label {
+  -moz-padding-start: 0;
+  -moz-margin-start: 0;
+  color: rgb(130, 132, 133);
+}
+
 /* Combined context-menu items */
 #context-navigation > .menuitem-iconic > .menu-iconic-text,
 #context-navigation > .menuitem-iconic > .menu-accel-container {
   display: none;
 }
 
 /* Tracking protection doorhanger */
 .popup-notification-footer[popupid="bad-content"] {
--- a/browser/base/content/browser.xul
+++ b/browser/base/content/browser.xul
@@ -236,16 +236,23 @@
            noautofocus="true"
            noautohide="true"
            flip="none"
            consumeoutsideclicks="false"
            mousethrough="always">
       <box id="UITourHighlight"></box>
     </panel>
 
+    <panel id="abouthome-search-panel" orient="vertical" type="arrow" hidden="true">
+      <hbox id="abouthome-search-panel-manage" class="abouthome-search-panel-item"
+            onclick="openPreferences('paneSearch')">
+        <label>&cmd_engineManager.label;</label>
+      </hbox>
+    </panel>
+
     <panel id="social-share-panel"
            class="social-panel"
            type="arrow"
            orient="horizontal"
            onpopupshowing="SocialShare.onShowing()"
            onpopuphidden="SocialShare.onHidden()"
            hidden="true">
       <vbox class="social-share-toolbar">
--- a/browser/base/content/content.js
+++ b/browser/base/content/content.js
@@ -139,16 +139,19 @@ let AboutHomeListener = {
     }
     switch (aEvent.type) {
       case "AboutHomeLoad":
         this.onPageLoad();
         break;
       case "AboutHomeSearchEvent":
         this.onSearch(aEvent);
         break;
+      case "AboutHomeSearchPanel":
+        this.onOpenSearchPanel(aEvent);
+        break;
       case "click":
         this.onClick(aEvent);
         break;
       case "pagehide":
         this.onPageHide(aEvent);
         break;
     }
   },
@@ -190,24 +193,29 @@ let AboutHomeListener = {
     }
 
     doc.documentElement.setAttribute("hasBrowserHandlers", "true");
     addMessageListener("AboutHome:Update", this);
     addMessageListener("AboutHome:FocusInput", this);
     addEventListener("click", this, true);
     addEventListener("pagehide", this, true);
 
+    if (!Services.prefs.getBoolPref("browser.search.showOneOffButtons")) {
+      doc.documentElement.setAttribute("searchUIConfiguration", "oldsearchui");
+    }
+
     // XXX bug 738646 - when Marketplace is launched, remove this statement and
     // the hidden attribute set on the apps button in aboutHome.xhtml
     if (Services.prefs.getPrefType("browser.aboutHome.apps") == Services.prefs.PREF_BOOL &&
         Services.prefs.getBoolPref("browser.aboutHome.apps"))
       doc.getElementById("apps").removeAttribute("hidden");
 
     sendAsyncMessage("AboutHome:RequestUpdate");
     doc.addEventListener("AboutHomeSearchEvent", this, true, true);
+    doc.addEventListener("AboutHomeSearchPanel", this, true, true);
   },
 
   onClick: function(aEvent) {
     if (!aEvent.isTrusted || // Don't trust synthetic events
         aEvent.button == 2 || aEvent.target.localName != "button") {
       return;
     }
 
@@ -248,16 +256,20 @@ let AboutHomeListener = {
 
       case "sync":
         sendAsyncMessage("AboutHome:Sync");
         break;
 
       case "settings":
         sendAsyncMessage("AboutHome:Settings");
         break;
+
+      case "searchIcon":
+        sendAsyncMessage("AboutHome:OpenSearchPanel", null, { anchor: originalTarget });
+        break;
     }
   },
 
   onPageHide: function(aEvent) {
     if (aEvent.target.defaultView.frameElement) {
       return;
     }
     removeMessageListener("AboutHome:Update", this);
@@ -267,16 +279,20 @@ let AboutHomeListener = {
       aEvent.target.documentElement.removeAttribute("hasBrowserHandlers");
     }
   },
 
   onSearch: function(aEvent) {
     sendAsyncMessage("AboutHome:Search", { searchData: aEvent.detail });
   },
 
+  onOpenSearchPanel: function(aEvent) {
+    sendAsyncMessage("AboutHome:OpenSearchPanel");
+  },
+
   onFocusInput: function () {
     let searchInput = content.document.getElementById("searchText");
     if (searchInput) {
       searchInput.focus();
     }
   },
 };
 AboutHomeListener.init(this);
--- a/browser/base/content/test/general/browser_aboutHome.js
+++ b/browser/base/content/test/general/browser_aboutHome.js
@@ -73,35 +73,16 @@ let gTests = [
     ok(snippetsElt, "Found snippets element");
     is(snippetsElt.getElementsByTagName("span").length, 1,
        "A default snippet is present.");
 
     aSnippetsMap.delete("snippets");
   }
 },
 
-{
-  desc: "Check that search engine logo has alt text",
-  setup: function () { },
-  run: function ()
-  {
-    let doc = gBrowser.selectedTab.linkedBrowser.contentDocument;
-
-    let searchEngineLogoElt = doc.getElementById("searchEngineLogo");
-    ok(searchEngineLogoElt, "Found search engine logo");
-
-    let altText = searchEngineLogoElt.alt;
-    ok(typeof altText == "string" && altText.length > 0,
-       "Search engine logo's alt text is a nonempty string");
-
-    isnot(altText, "undefined",
-          "Search engine logo's alt text shouldn't be the string 'undefined'");
-  }
-},
-
 // Disabled on Linux for intermittent issues with FHR, see Bug 945667.
 {
   desc: "Check that performing a search fires a search event and records to " +
         "Firefox Health Report.",
   setup: function () { },
   run: function* () {
     // Skip this test on Linux.
     if (navigator.platform.indexOf("Linux") == 0) {
@@ -248,62 +229,16 @@ let gTests = [
     ok(snippetsElt, "Found snippets element");
     ok(snippetsElt.getElementsByTagName("a")[0].href != "about:rights", "Snippet link should not point to about:rights.");
 
     Services.prefs.clearUserPref("browser.rights.override");
   }
 },
 
 {
-  desc: "Check that the search UI/ action is updated when the search engine is changed",
-  setup: function() {},
-  run: function()
-  {
-    let currEngine = Services.search.currentEngine;
-    let unusedEngines = [].concat(Services.search.getVisibleEngines()).filter(x => x != currEngine);
-    let searchbar = document.getElementById("searchbar");
-
-    function checkSearchUI(engine) {
-      let doc = gBrowser.selectedTab.linkedBrowser.contentDocument;
-      let searchText = doc.getElementById("searchText");
-      let logoElt = doc.getElementById("searchEngineLogo");
-      let engineName = doc.documentElement.getAttribute("searchEngineName");
-
-      is(engineName, engine.name, "Engine name should've been updated");
-
-      if (!logoElt.parentNode.hidden) {
-        is(logoElt.alt, engineName, "Alt text of logo image should match search engine name")
-      } else {
-        is(searchText.placeholder, engineName, "Placeholder text should match search engine name");
-      }
-    }
-    // Do a sanity check that all attributes are correctly set to begin with
-    checkSearchUI(currEngine);
-
-    let deferred = Promise.defer();
-    promiseBrowserAttributes(gBrowser.selectedTab).then(function() {
-      // Test if the update propagated
-      checkSearchUI(unusedEngines[0]);
-      searchbar.currentEngine = currEngine;
-      deferred.resolve();
-    });
-
-    // The following cleanup function will set currentEngine back to the previous
-    // engine if we fail to do so above.
-    registerCleanupFunction(function() {
-      searchbar.currentEngine = currEngine;
-    });
-    // Set the current search engine to an unused one
-    searchbar.currentEngine = unusedEngines[0];
-    searchbar.select();
-    return deferred.promise;
-  }
-},
-
-{
   desc: "Check POST search engine support",
   setup: function() {},
   run: function()
   {
     let deferred = Promise.defer();
     let currEngine = Services.search.defaultEngine;
     let searchObserver = function search_observer(aSubject, aTopic, aData) {
       let engine = aSubject.QueryInterface(Ci.nsISearchEngine);
@@ -487,16 +422,36 @@ let gTests = [
   run: Task.async(function* () {
     let syncButton = gBrowser.selectedTab.linkedBrowser.contentDocument.getElementById("sync");
     yield EventUtils.synthesizeMouseAtCenter(syncButton, {}, gBrowser.contentWindow);
 
     yield promiseTabLoadEvent(gBrowser.selectedTab, null, "load");
     is(gBrowser.currentURI.spec, "about:accounts?entrypoint=abouthome",
       "Entry point should be `abouthome`.");
   })
+},
+{
+  desc: "Clicking the icon should open the popup",
+  setup: function () {},
+  run: Task.async(function* () {
+    let doc = gBrowser.selectedBrowser.contentDocument;
+    let searchIcon = doc.getElementById("searchIcon");
+    let panel = window.document.getElementById("abouthome-search-panel");
+
+    info("Waiting for popup to open");
+    EventUtils.synthesizeMouseAtCenter(searchIcon, {}, gBrowser.selectedBrowser.contentWindow);
+    yield promiseWaitForEvent(panel, "popupshown");
+    ok("Saw popup open");
+
+    let promise = promisePrefsOpen();
+    let item = window.document.getElementById("abouthome-search-panel-manage");
+    EventUtils.synthesizeMouseAtCenter(item, {});
+
+    yield promise;
+  })
 }
 
 ];
 
 function test()
 {
   waitForExplicitFinish();
   requestLongerTimeout(2);
@@ -662,16 +617,46 @@ function waitForLoad(cb) {
       return;
     info("Page loaded: " + browser.currentURI.spec);
     browser.removeEventListener("load", listener, true);
 
     cb();
   }, true);
 }
 
+function promiseWaitForEvent(node, type, capturing) {
+  return new Promise((resolve) => {
+    node.addEventListener(type, function listener(event) {
+      node.removeEventListener(type, listener, capturing);
+      resolve(event);
+    }, capturing);
+  });
+}
+
+function promisePrefsOpen() {
+  info("Waiting for the preferences window to open...");
+  let deferred = Promise.defer();
+  let winWatcher = Cc["@mozilla.org/embedcomp/window-watcher;1"].
+                   getService(Ci.nsIWindowWatcher);
+  winWatcher.registerNotification(function onWin(subj, topic, data) {
+    if (topic == "domwindowopened" && subj instanceof Ci.nsIDOMWindow) {
+      subj.addEventListener("load", function onLoad() {
+        subj.removeEventListener("load", onLoad);
+        is(subj.document.documentURI, "chrome://browser/content/preferences/preferences.xul", "Should have seen the prefs window");
+        winWatcher.unregisterNotification(onWin);
+        executeSoon(() => {
+          subj.close();
+          deferred.resolve();
+        });
+      });
+    }
+  });
+  return deferred.promise;
+}
+
 function promiseNewEngine(basename) {
   info("Waiting for engine to be added: " + basename);
   let addDeferred = Promise.defer();
   let url = getRootDirectory(gTestPath) + basename;
   Services.search.addEngine(url, Ci.nsISearchEngine.TYPE_MOZSEARCH, "", false, {
     onSuccess: function (engine) {
       info("Search engine added: " + basename);
       registerCleanupFunction(() => {
--- a/browser/modules/AboutHome.jsm
+++ b/browser/modules/AboutHome.jsm
@@ -92,16 +92,17 @@ let AboutHome = {
     "AboutHome:Bookmarks",
     "AboutHome:History",
     "AboutHome:Apps",
     "AboutHome:Addons",
     "AboutHome:Sync",
     "AboutHome:Settings",
     "AboutHome:RequestUpdate",
     "AboutHome:Search",
+    "AboutHome:OpenSearchPanel",
   ],
 
   init: function() {
     let mm = Cc["@mozilla.org/globalmessagemanager;1"].getService(Ci.nsIMessageListenerManager);
 
     for (let msg of this.MESSAGES) {
       mm.addMessageListener(msg, this);
     }
@@ -198,16 +199,28 @@ let AboutHome = {
           window.loadURI(submission.uri.spec, null, submission.postData);
 
           // Used for testing
           let mm = aMessage.target.messageManager;
           mm.sendAsyncMessage("AboutHome:SearchTriggered", aMessage.data.searchData);
         });
 
         break;
+
+      case "AboutHome:OpenSearchPanel":
+        let panel = window.document.getElementById("abouthome-search-panel");
+        let anchor = aMessage.objects.anchor;
+        panel.hidden = false;
+        panel.openPopup(anchor);
+        anchor.setAttribute("active", "true");
+        panel.addEventListener("popuphidden", function onHidden() {
+          panel.removeEventListener("popuphidden", onHidden);
+          anchor.removeAttribute("active");
+        });
+        break;
     }
   },
 
   // Send all the chrome-privileged data needed by about:home. This
   // gets re-sent when the search engine changes.
   sendAboutHomeData: function(target) {
     let wrapper = {};
     Components.utils.import("resource:///modules/sessionstore/SessionStore.jsm",
--- a/browser/themes/linux/jar.mn
+++ b/browser/themes/linux/jar.mn
@@ -34,16 +34,18 @@ browser.jar:
   skin/classic/browser/Geolocation-64.png
   skin/classic/browser/identity.png
   skin/classic/browser/identity-icons-generic.png
   skin/classic/browser/identity-icons-https.png
   skin/classic/browser/identity-icons-https-ev.png
   skin/classic/browser/identity-icons-https-mixed-active.png
   skin/classic/browser/identity-icons-https-mixed-display.png
   skin/classic/browser/Info.png
+  skin/classic/browser/magnifier.png                        (../shared/magnifier.png)
+  skin/classic/browser/magnifier@2x.png                     (../shared/magnifier@2x.png)
   skin/classic/browser/mask.png                             (../shared/mask.png)
   skin/classic/browser/mask@2x.png                          (../shared/mask@2x.png)
   skin/classic/browser/menuPanel.png
   skin/classic/browser/menuPanel-customize.png
   skin/classic/browser/menuPanel-exit.png
   skin/classic/browser/menuPanel-help.png
   skin/classic/browser/menuPanel-small.png
   skin/classic/browser/bad-content-blocked-16.png
--- a/browser/themes/osx/jar.mn
+++ b/browser/themes/osx/jar.mn
@@ -52,16 +52,18 @@ browser.jar:
   skin/classic/browser/KUI-background.png
   skin/classic/browser/subtle-pattern.png
   skin/classic/browser/menu-back.png
   skin/classic/browser/menu-forward.png
   skin/classic/browser/notification-16.png
   skin/classic/browser/notification-16@2x.png
   skin/classic/browser/notification-64.png
   skin/classic/browser/notification-64@2x.png
+  skin/classic/browser/magnifier.png                        (../shared/magnifier.png)
+  skin/classic/browser/magnifier@2x.png                     (../shared/magnifier@2x.png)
   skin/classic/browser/mask.png                             (../shared/mask.png)
   skin/classic/browser/mask@2x.png                          (../shared/mask@2x.png)
   skin/classic/browser/menuPanel.png
   skin/classic/browser/menuPanel@2x.png
   skin/classic/browser/menuPanel-customize.png
   skin/classic/browser/menuPanel-customize@2x.png
   skin/classic/browser/menuPanel-exit.png
   skin/classic/browser/menuPanel-exit@2x.png
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..bcce4ad2b1c9fa5c6e4c85dd2e6461cbba46aef3
GIT binary patch
literal 371
zc$@)q0gV2MP)<h;3K|Lk000e1NJLTq000^Q000^Y1ONa414D#G0003xNkl<ZcmbW$
zze)o^5XbSg2|<EU(87rK24bt2%3$Z8_c2DkBC#>1QV}fG&KF2!Owd9fLNp+!f<;0C
zsZLl1Ovc&byeSUmw;z_d-E+SW5fz$r81g}zJtCZ4@*>L#Lz1x?QX?Bib3Bun^~9`=
zGCatVcMe!*nG#iE>9xpMs3!3_lOs`%E9qDNqDW@B&=C{d_@vK*M*BW^HAkM}%cr{<
zwR{_#Sw}u?YSi)VQUGoG^hKk-Z!ZPVs!x0NP8$KVEjyVr9R^U{r*|4vd^;v*kQu)1
zueT`YbZMN^t(;RKd?T*McAFNGaAx1Vw!|^VY_Y-)bv{X?x~!$T<(ldLsmeet9dJs|
zVk4dcWtzOvC+40q^Eir{X=GQCu4ayuOi+5}_y=>OXAMVM_DJ55jy1^RegG-j88vO|
R3&{Wg002ovPDHLkV1mWvp#J~>
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6aef26a10c78f28a360000c394f462443e142f5f
GIT binary patch
literal 689
zc$@*T0#5yjP)<h;3K|Lk000e1NJLTq001-q001-y1ONa4Z*kLL0007bNkl<ZcmciE
zO-od77=ZEH8BnK1pkKgLP{@@#gFgjIegbu0<jZ*ae+9Yv1V%-RA{Y6xD5zEKjGz}y
zClzW_n_fsQ0-eeVGv>)f!Og?WIrlTe9Iusf-~8~IbB0GM|IkguEGumBl`m|v!c8XW
zLaIq9*AdRMfvZq~h+OSZh6z6568gv(nOdNBp5cr=p}ksYkRmRiT?VRwM%c#%w$D%~
zbh->vqQFJ+3?CM8g_mWi{t&1G|ImIgO(){j!*ve4$sO9PP?lwH`2ia7u~l#SF&P__
z_ZBaaMPh1V-rG25fpXq^a}`OffjOLNi(E4FKTh?KEMlnH`|g-XhSt^iPdX4|z5G_2
z>q$^IPBo3#^FFDLcqr2E4V^(ypN1HVhi2928WPxhwLKFLt%e_*YC(U=#zXqi9uJ15
z)b_i0=(`#n4u&T6cX>Rtr$$GDp-4maqss?F7wkv3qDC(VL$~z9V1K+{1Tqb5+aK>q
zoa%TGbPA^$jfc8$s%t^e9h|B?9un5n@GpAI%zu>B=5r(oioEM#qlr1nE6c%YD91KV
zHAh1t)5txXYLlj9NEpZISfDxKzq#*ioJA~9h9z%tgWj0W=CwDyN2?7Ij<Mq{A282J
zvfhCWa+gxsi+_s^68g*DQ$Mr76nP@xHoG`4Go^nS(v&SbCFlm&trzA0p^Zm4W8Xq3
z!7sxoTZzaA&d^H1PF1=bPEe?bEHnQ1^=z?ILghLcV}>Q(vUAuQo^pdx@AhV<gqpHb
zLQ0g75+$TW2`N!RN|cZiC8R_N=}?P88dQ-JLj5SkAVU2p#ncH>RFOWUPLQG&|1roP
X(~)SO`(MEl00000NkvXXu0mjff=N5(
--- a/browser/themes/windows/jar.mn
+++ b/browser/themes/windows/jar.mn
@@ -39,16 +39,18 @@ browser.jar:
         skin/classic/browser/identity-icons-generic.png
         skin/classic/browser/identity-icons-https.png
         skin/classic/browser/identity-icons-https-ev.png
         skin/classic/browser/identity-icons-https-mixed-active.png
         skin/classic/browser/identity-icons-https-mixed-display.png
         skin/classic/browser/keyhole-forward-mask.svg
         skin/classic/browser/KUI-background.png
         skin/classic/browser/livemark-folder.png
+        skin/classic/browser/magnifier.png                          (../shared/magnifier.png)
+        skin/classic/browser/magnifier@2x.png                       (../shared/magnifier@2x.png)
         skin/classic/browser/mask.png                               (../shared/mask.png)
         skin/classic/browser/mask@2x.png                            (../shared/mask@2x.png)
         skin/classic/browser/menu-back.png
         skin/classic/browser/menu-forward.png
         skin/classic/browser/menuPanel.png
         skin/classic/browser/menuPanel-customize.png
         skin/classic/browser/menuPanel-exit.png
         skin/classic/browser/menuPanel-help.png
@@ -470,16 +472,18 @@ browser.jar:
         skin/classic/aero/browser/identity-icons-generic.png
         skin/classic/aero/browser/identity-icons-https.png
         skin/classic/aero/browser/identity-icons-https-ev.png
         skin/classic/aero/browser/identity-icons-https-mixed-active.png
         skin/classic/aero/browser/identity-icons-https-mixed-display.png
         skin/classic/aero/browser/keyhole-forward-mask.svg
         skin/classic/aero/browser/KUI-background.png
         skin/classic/aero/browser/livemark-folder.png                (livemark-folder-aero.png)
+        skin/classic/aero/browser/magnifier.png                      (../shared/magnifier.png)
+        skin/classic/aero/browser/magnifier@2x.png                   (../shared/magnifier@2x.png)
         skin/classic/aero/browser/mask.png                           (../shared/mask.png)
         skin/classic/aero/browser/mask@2x.png                        (../shared/mask@2x.png)
         skin/classic/aero/browser/menu-back.png                      (menu-back-aero.png)
         skin/classic/aero/browser/menu-forward.png                   (menu-forward-aero.png)
         skin/classic/aero/browser/menuPanel.png
         skin/classic/aero/browser/menuPanel-aero.png
         skin/classic/aero/browser/menuPanel-customize.png
         skin/classic/aero/browser/menuPanel-exit.png