Merge fx-team to m-c.
authorRyan VanderMeulen <ryanvm@gmail.com>
Fri, 25 Apr 2014 16:24:02 -0400
changeset 199816 0e91262606a631fbc4e0ea24c1447c0604787de1
parent 199796 992ddc6bd0a9faa9ea107783abc2ef1596b33050 (current diff)
parent 199815 8364bff2be23003f9293b769d9efaa81427c4d45 (diff)
child 199817 1f67e8c65ce54e60d2c4bc0cb6c6ea1c02329326
child 199822 a9d318e1cc9df09b72a3e2e6dbfde4f65196e3ad
child 199851 d353282fc0a6f001e30003c136ede5525dd03f87
child 199895 ea4e380efa0ad3422e017a0e4c74cc61c9ed5187
push id486
push userasasaki@mozilla.com
push dateMon, 14 Jul 2014 18:39:42 +0000
treeherdermozilla-release@d33428174ff1 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone31.0a1
first release with
nightly linux32
0e91262606a6 / 31.0a1 / 20140426030204 / files
nightly linux64
0e91262606a6 / 31.0a1 / 20140426030204 / files
nightly mac
0e91262606a6 / 31.0a1 / 20140426030204 / files
nightly win32
0e91262606a6 / 31.0a1 / 20140426030204 / files
nightly win64
0e91262606a6 / 31.0a1 / 20140426030204 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge fx-team to m-c.
browser/themes/shared/devtools/images/option-icon.png
mobile/android/base/tests/testFilterOpenTab.java
--- a/addon-sdk/source/test/test-ui-sidebar.js
+++ b/addon-sdk/source/test/test-ui-sidebar.js
@@ -1206,17 +1206,17 @@ exports.testShowToOpenXToClose = functio
 
   let sidebar = Sidebar({
     id: testName,
     title: testName,
     url: url,
     onShow: function() {
       assert.ok(isChecked(menuitem), 'menuitem is checked');
 
-      let closeButton = window.document.querySelector('#sidebar-header > toolbarbutton.tabs-closebutton');
+      let closeButton = window.document.querySelector('#sidebar-header > toolbarbutton.close-icon');
       simulateCommand(closeButton);
     },
     onHide: function() {
       assert.ok(!isChecked(menuitem), 'menuitem is not checked');
 
       sidebar.destroy();
       done();
     }
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -452,23 +452,16 @@ pref("browser.tabs.loadBookmarksInBackgr
 pref("browser.tabs.tabClipWidth", 140);
 pref("browser.tabs.animate", true);
 #ifdef UNIX_BUT_NOT_MAC
 pref("browser.tabs.drawInTitlebar", false);
 #else
 pref("browser.tabs.drawInTitlebar", true);
 #endif
 
-// Where to show tab close buttons:
-// 0  on active tab only
-// 1  on all tabs until tabClipWidth is reached, then active tab only
-// 2  no close buttons at all
-// 3  at the end of the tabstrip
-pref("browser.tabs.closeButtons", 1);
-
 // When tabs opened by links in other tabs via a combination of 
 // browser.link.open_newwindow being set to 3 and target="_blank" etc are
 // closed:
 // true   return to the tab that opened this tab (its owner)
 // false  return to the adjacent tab (old default)
 pref("browser.tabs.selectOwnerOnClose", true);
 
 pref("browser.ctrlTab.previews", false);
@@ -1158,17 +1151,16 @@ pref("services.sync.prefs.sync.browser.l
 pref("services.sync.prefs.sync.browser.offline-apps.notify", true);
 pref("services.sync.prefs.sync.browser.safebrowsing.enabled", true);
 pref("services.sync.prefs.sync.browser.safebrowsing.malware.enabled", true);
 pref("services.sync.prefs.sync.browser.search.selectedEngine", true);
 pref("services.sync.prefs.sync.browser.search.update", true);
 pref("services.sync.prefs.sync.browser.sessionstore.restore_on_demand", true);
 pref("services.sync.prefs.sync.browser.startup.homepage", true);
 pref("services.sync.prefs.sync.browser.startup.page", true);
-pref("services.sync.prefs.sync.browser.tabs.closeButtons", true);
 pref("services.sync.prefs.sync.browser.tabs.loadInBackground", true);
 pref("services.sync.prefs.sync.browser.tabs.warnOnClose", true);
 pref("services.sync.prefs.sync.browser.tabs.warnOnOpen", true);
 pref("services.sync.prefs.sync.browser.urlbar.autocomplete.enabled", true);
 pref("services.sync.prefs.sync.browser.urlbar.default.behavior", true);
 pref("services.sync.prefs.sync.browser.urlbar.maxRichResults", true);
 pref("services.sync.prefs.sync.dom.disable_open_during_load", true);
 pref("services.sync.prefs.sync.dom.disable_window_flip", true);
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -484,20 +484,16 @@ toolbar[mode="full"] #bookmarks-menu-but
 menupopup[emptyplacesresult="true"] > .hide-if-empty-places-result {
   display: none;
 }
 
 menuitem.spell-suggestion {
   font-weight: bold;
 }
 
-#sidebar-header > .tabs-closebutton {
-  -moz-user-focus: normal;
-}
-
 /* apply Fitts' law to the notification bar's close button */
 window[sizemode="maximized"] #content .notification-inner {
   border-right: 0px !important;
 }
 
 /* Hide extension toolbars that neglected to set the proper class */
 window[chromehidden~="location"][chromehidden~="toolbar"] toolbar:not(.chromeclass-menubar),
 window[chromehidden~="toolbar"] toolbar:not(.toolbar-primary):not(.chromeclass-menubar) {
--- a/browser/base/content/browser.xul
+++ b/browser/base/content/browser.xul
@@ -544,17 +544,17 @@
     <toolbar id="TabsToolbar"
              class="toolbar-primary"
              fullscreentoolbar="true"
              customizable="true"
              mode="icons"
              iconsize="small"
              aria-label="&tabsToolbar.label;"
              context="toolbar-context-menu"
-             defaultset="tabbrowser-tabs,new-tab-button,alltabs-button,tabs-closebutton"
+             defaultset="tabbrowser-tabs,new-tab-button,alltabs-button"
              collapsed="true">
 
 #if defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_QT)
       <hbox id="private-browsing-indicator"
             skipintoolbarset="true"/>
 #endif
 
       <tabs id="tabbrowser-tabs"
@@ -595,23 +595,16 @@
                     label="&viewTabGroups.label;"
                     command="Browser:ToggleTabView"
                     cui-areatype="toolbar"
                     observes="tabviewGroupsNumber"/>
           <menuseparator id="alltabs-popup-separator"/>
         </menupopup>
       </toolbarbutton>
 
-      <toolbarbutton id="tabs-closebutton"
-                     class="close-button tabs-closebutton close-icon"
-                     command="cmd_close"
-                     label="&closeTab.label;"
-                     cui-areatype="toolbar"
-                     tooltiptext="&closeTab.label;"/>
-
 #if !defined(MOZ_WIDGET_GTK) && !defined(MOZ_WIDGET_QT)
       <hbox class="private-browsing-indicator" skipintoolbarset="true"/>
 #endif
 #ifdef CAN_DRAW_IN_TITLEBAR
       <hbox class="titlebar-placeholder" type="caption-buttons"
             id="titlebar-placeholder-on-TabsToolbar-for-captions-buttons" persist="width"
 #ifndef XP_MACOSX
             ordinal="1000"
@@ -1049,17 +1042,17 @@
 
   <deck id="content-deck" flex="1">
     <hbox flex="1" id="browser">
       <vbox id="browser-border-start" hidden="true" layer="true"/>
       <vbox id="sidebar-box" hidden="true" class="chromeclass-extrachrome">
         <sidebarheader id="sidebar-header" align="center">
           <label id="sidebar-title" persist="value" flex="1" crop="end" control="sidebar"/>
           <image id="sidebar-throbber"/>
-          <toolbarbutton class="tabs-closebutton close-icon" tooltiptext="&sidebarCloseButton.tooltip;" oncommand="toggleSidebar();"/>
+          <toolbarbutton class="close-icon tabbable" tooltiptext="&sidebarCloseButton.tooltip;" oncommand="toggleSidebar();"/>
         </sidebarheader>
         <browser id="sidebar" flex="1" autoscroll="false" disablehistory="true"
                   style="min-width: 14em; width: 18em; max-width: 36em;"/>
       </vbox>
 
       <splitter id="sidebar-splitter" class="chromeclass-extrachrome sidebar-splitter" hidden="true"/>
       <vbox id="appcontent" flex="1">
         <tabbrowser id="content"
--- a/browser/base/content/tabbrowser.css
+++ b/browser/base/content/tabbrowser.css
@@ -7,22 +7,21 @@
 }
 
 .tabbrowser-arrowscrollbox {
   -moz-binding: url("chrome://browser/content/tabbrowser.xml#tabbrowser-arrowscrollbox");
 }
 
 .tab-close-button {
   -moz-binding: url("chrome://browser/content/tabbrowser.xml#tabbrowser-close-tab-button");
-  display: none;
 }
 
-.tabbrowser-tabs[closebuttons="activetab"] > * > * > * > .tab-close-button:not([pinned])[selected="true"],
-.tabbrowser-tabs[closebuttons="alltabs"] > * > * > * > .tab-close-button:not([pinned]) {
-  display: -moz-box;
+.tab-close-button[pinned],
+.tabbrowser-tabs[closebuttons="activetab"] > * > * > * > .tab-close-button:not([selected="true"]) {
+  display: none;
 }
 
 .tab-label[pinned] {
   width: 0;
   margin-left: 0 !important;
   margin-right: 0 !important;
   padding-left: 0 !important;
   padding-right: 0 !important;
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -1908,17 +1908,17 @@
               }
             }
 
             var closeWindow = false;
             var newTab = false;
             if (this.tabs.length - this._removingTabs.length == 1) {
               closeWindow = aCloseWindowWithLastTab != null ? aCloseWindowWithLastTab :
                             !window.toolbar.visible ||
-                              this.tabContainer._closeWindowWithLastTab;
+                              Services.prefs.getBoolPref("browser.tabs.closeWindowWithLastTab");
 
               // Closing the tab and replacing it with a blank one is notably slower
               // than closing the window right away. If the caller opts in, take
               // the fast path.
               if (closeWindow &&
                   aCloseWindowFastpath &&
                   this._removingTabs.length == 0) {
                 // This call actually closes the window, unless the user
@@ -3367,44 +3367,34 @@
                     style="width: 0;"/>
       </xul:arrowscrollbox>
     </content>
 
     <implementation implements="nsIDOMEventListener">
       <constructor>
         <![CDATA[
           this.mTabClipWidth = Services.prefs.getIntPref("browser.tabs.tabClipWidth");
-          this.mCloseButtons = Services.prefs.getIntPref("browser.tabs.closeButtons");
-          this._closeWindowWithLastTab = Services.prefs.getBoolPref("browser.tabs.closeWindowWithLastTab");
 
           var tab = this.firstChild;
           tab.label = this.tabbrowser.mStringBundle.getString("tabs.emptyTabTitle");
           tab.setAttribute("crop", "end");
           tab.setAttribute("onerror", "this.removeAttribute('image');");
-          this.adjustTabstrip();
-
-          Services.prefs.addObserver("browser.tabs.", this._prefObserver, false);
+
           window.addEventListener("resize", this, false);
           window.addEventListener("load", this, false);
 
           try {
             this._tabAnimationLoggingEnabled = Services.prefs.getBoolPref("browser.tabs.animationLogging.enabled");
           } catch (ex) {
             this._tabAnimationLoggingEnabled = false;
           }
           this._browserNewtabpageEnabled = Services.prefs.getBoolPref("browser.newtabpage.enabled");
         ]]>
       </constructor>
 
-      <destructor>
-        <![CDATA[
-          Services.prefs.removeObserver("browser.tabs.", this._prefObserver);
-        ]]>
-      </destructor>
-
       <field name="tabbrowser" readonly="true">
         document.getElementById(this.getAttribute("tabbrowser"));
       </field>
 
       <field name="tabbox" readonly="true">
         this.tabbrowser.mTabBox;
       </field>
 
@@ -3466,32 +3456,16 @@
           let hoveredTab = this._hoveredTab;
           if (hoveredTab) {
             hoveredTab._mouseleave();
             hoveredTab._mouseenter();
           }
         ]]></body>
       </method>
 
-      <field name="_prefObserver"><![CDATA[({
-        tabContainer: this,
-
-        observe: function (subject, topic, data) {
-          switch (data) {
-            case "browser.tabs.closeButtons":
-              this.tabContainer.mCloseButtons = Services.prefs.getIntPref(data);
-              this.tabContainer.adjustTabstrip();
-              break;
-            case "browser.tabs.closeWindowWithLastTab":
-              this.tabContainer._closeWindowWithLastTab = Services.prefs.getBoolPref(data);
-              this.tabContainer.adjustTabstrip();
-              break;
-          }
-        }
-      });]]></field>
       <field name="_blockDblClick">false</field>
 
       <field name="_tabDropIndicator">
         document.getAnonymousElementByAttribute(this, "anonid", "tab-drop-indicator");
       </field>
 
       <field name="_dragOverDelay">350</field>
       <field name="_dragTime">0</field>
@@ -3558,52 +3532,33 @@
             this.visible = true;
         ]]></body>
       </method>
 
       <method name="adjustTabstrip">
         <body><![CDATA[
           let numTabs = this.childNodes.length -
                         this.tabbrowser._removingTabs.length;
-          // modes for tabstrip
-          // 0 - button on active tab only
-          // 1 - close buttons on all tabs
-          // 2 - no close buttons at all
-          // 3 - close button at the end of the tabstrip
-          switch (this.mCloseButtons) {
-          case 0:
-            this.setAttribute("closebuttons", "activetab");
-            break;
-          case 1:
-            if (numTabs <= 2) {
-              // This is an optimization to avoid layout flushes by calling
-              // getBoundingClientRect() when we just opened a second tab. In
-              // this case it's highly unlikely that the tab width is smaller
-              // than mTabClipWidth and the tab close button obscures too much
-              // of the tab's label. In the edge case of the window being too
-              // narrow (or if tabClipWidth has been set to a way higher value),
-              // we'll correct the 'closebuttons' attribute after the tabopen
-              // animation has finished.
-              this.setAttribute("closebuttons", "alltabs");
-            } else {
-              let tab = this.tabbrowser.visibleTabs[this.tabbrowser._numPinnedTabs];
-              if (tab && tab.getBoundingClientRect().width > this.mTabClipWidth)
-                this.setAttribute("closebuttons", "alltabs");
-              else
-                this.setAttribute("closebuttons", "activetab");
+          if (numTabs > 2) {
+            // This is an optimization to avoid layout flushes by calling
+            // getBoundingClientRect() when we just opened a second tab. In
+            // this case it's highly unlikely that the tab width is smaller
+            // than mTabClipWidth and the tab close button obscures too much
+            // of the tab's label. In the edge case of the window being too
+            // narrow (or if tabClipWidth has been set to a way higher value),
+            // we'll correct the 'closebuttons' attribute after the tabopen
+            // animation has finished.
+
+            let tab = this.tabbrowser.visibleTabs[this.tabbrowser._numPinnedTabs];
+            if (tab && tab.getBoundingClientRect().width <= this.mTabClipWidth) {
+              this.setAttribute("closebuttons", "activetab");
+              return;
             }
-            break;
-          case 2:
-          case 3:
-            this.setAttribute("closebuttons", "never");
-            break;
           }
-          var tabstripClosebutton = document.getElementById("tabs-closebutton");
-          if (tabstripClosebutton && tabstripClosebutton.parentNode == this._container)
-            tabstripClosebutton.collapsed = this.mCloseButtons != 3;
+          this.removeAttribute("closebuttons");
         ]]></body>
       </method>
 
       <method name="_handleTabSelect">
         <parameter name="aSmoothScroll"/>
         <body><![CDATA[
           if (this.getAttribute("overflow") == "true")
             this.mTabstrip.ensureElementIsVisible(this.selectedItem, aSmoothScroll);
@@ -4267,18 +4222,17 @@
         }
       ]]></handler>
 
       <handler event="click"><![CDATA[
         if (event.button != 1)
           return;
 
         if (event.target.localName == "tab") {
-          if (this.childNodes.length > 1 || !this._closeWindowWithLastTab)
-            this.tabbrowser.removeTab(event.target, {animate: true, byMouse: true});
+          this.tabbrowser.removeTab(event.target, {animate: true, byMouse: true});
         } else if (event.originalTarget.localName == "box") {
           BrowserOpenTab();
         } else {
           return;
         }
 
         event.stopPropagation();
       ]]></handler>
--- a/browser/components/customizableui/src/CustomizableUI.jsm
+++ b/browser/components/customizableui/src/CustomizableUI.jsm
@@ -219,17 +219,16 @@ let CustomizableUIInternal = {
 #endif
     this.registerArea(CustomizableUI.AREA_TABSTRIP, {
       legacy: true,
       type: CustomizableUI.TYPE_TOOLBAR,
       defaultPlacements: [
         "tabbrowser-tabs",
         "new-tab-button",
         "alltabs-button",
-        "tabs-closebutton",
       ],
       defaultCollapsed: null,
     }, true);
     this.registerArea(CustomizableUI.AREA_BOOKMARKS, {
       legacy: true,
       type: CustomizableUI.TYPE_TOOLBAR,
       defaultPlacements: [
         "personal-bookmarks",
--- a/browser/components/customizableui/src/CustomizeMode.jsm
+++ b/browser/components/customizableui/src/CustomizeMode.jsm
@@ -174,20 +174,20 @@ CustomizeMode.prototype = {
 
       CustomizableUI.dispatchToolboxEvent("beforecustomization", {}, window);
       CustomizableUI.notifyStartCustomizing(this.window);
 
       // Add a keypress listener to the document so that we can quickly exit
       // customization mode when pressing ESC.
       document.addEventListener("keypress", this);
 
-      // Same goes for the menu button - if we're customizing, a mousedown to the
+      // Same goes for the menu button - if we're customizing, a click on the
       // menu button means a quick exit from customization mode.
       window.PanelUI.hide();
-      window.PanelUI.menuButton.addEventListener("mousedown", this);
+      window.PanelUI.menuButton.addEventListener("command", this);
       window.PanelUI.menuButton.open = true;
       window.PanelUI.beginBatchUpdate();
 
       // The menu panel is lazy, and registers itself when the popup shows. We
       // need to force the menu panel to register itself, or else customization
       // is really not going to work. We pass "true" to ensureRegistered to
       // indicate that we're handling calling startBatchUpdate and
       // endBatchUpdate.
@@ -326,17 +326,17 @@ CustomizeMode.prototype = {
       this.panelUIContents.removeAttribute("showoutline");
     }
 
     this._removeExtraToolbarsIfEmpty();
 
     CustomizableUI.removeListener(this);
 
     this.document.removeEventListener("keypress", this);
-    this.window.PanelUI.menuButton.removeEventListener("mousedown", this);
+    this.window.PanelUI.menuButton.removeEventListener("command", this);
     this.window.PanelUI.menuButton.open = false;
 
     this.window.PanelUI.beginBatchUpdate();
 
     this._removePanelCustomizationPlaceholders();
 
     let window = this.window;
     let document = this.document;
@@ -1176,23 +1176,23 @@ CustomizeMode.prototype = {
         this._onDragDrop(aEvent);
         break;
       case "dragexit":
         this._onDragExit(aEvent);
         break;
       case "dragend":
         this._onDragEnd(aEvent);
         break;
-      case "mousedown":
-        if (aEvent.button == 0 &&
-            (aEvent.originalTarget == this.window.PanelUI.menuButton)) {
+      case "command":
+        if (aEvent.originalTarget == this.window.PanelUI.menuButton) {
           this.exit();
           aEvent.preventDefault();
-          return;
         }
+        break;
+      case "mousedown":
         this._onMouseDown(aEvent);
         break;
       case "mouseup":
         this._onMouseUp(aEvent);
         break;
       case "keypress":
         if (aEvent.keyCode == aEvent.DOM_VK_ESCAPE) {
           this.exit();
--- a/browser/components/customizableui/test/browser.ini
+++ b/browser/components/customizableui/test/browser.ini
@@ -60,16 +60,29 @@ skip-if = e10s # Bug ?????? - test uses 
 [browser_940107_home_button_in_bookmarks_toolbar.js]
 [browser_940307_panel_click_closure_handling.js]
 [browser_940946_removable_from_navbar_customizemode.js]
 [browser_941083_invalidate_wrapper_cache_createWidget.js]
 [browser_942581_unregisterArea_keeps_placements.js]
 [browser_943683_migration_test.js]
 [browser_944887_destroyWidget_should_destroy_in_palette.js]
 [browser_945739_showInPrivateBrowsing_customize_mode.js]
+[browser_947914_button_addons.js]
+[browser_947914_button_copy.js]
+[browser_947914_button_cut.js]
+[browser_947914_button_find.js]
+[browser_947914_button_history.js]
+[browser_947914_button_newPrivateWindow.js]
+[browser_947914_button_newWindow.js]
+[browser_947914_button_paste.js]
+[browser_947914_button_print.js]
+[browser_947914_button_savePage.js]
+[browser_947914_button_zoomIn.js]
+[browser_947914_button_zoomOut.js]
+[browser_947914_button_zoomReset.js]
 [browser_947987_removable_default.js]
 [browser_948985_non_removable_defaultArea.js]
 [browser_952963_areaType_getter_no_area.js]
 [browser_956602_remove_special_widget.js]
 [browser_962884_opt_in_disable_hyphens.js]
 [browser_963639_customizing_attribute_non_customizable_toolbar.js]
 [browser_967000_button_charEncoding.js]
 skip-if = e10s # Bug ?????? - test uses promiseTabLoadEvent() which isn't e10s friendly.
new file mode 100644
--- /dev/null
+++ b/browser/components/customizableui/test/browser_947914_button_addons.js
@@ -0,0 +1,34 @@
+/* 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/. */
+
+"use strict";
+
+add_task(function() {
+  info("Check addons button existence and functionality");
+
+  let initialLocation = gBrowser.currentURI.spec;
+
+  yield PanelUI.show();
+
+  let addonsButton = document.getElementById("add-ons-button");
+  ok(addonsButton, "Add-ons button exists in Panel Menu");
+  addonsButton.click();
+
+  yield waitForCondition(function() gBrowser.currentURI &&
+                                    gBrowser.currentURI.spec == "about:addons");
+
+  let addonsPage = gBrowser.selectedBrowser.contentWindow.document.
+                            getElementById("addons-page");
+  ok(addonsPage, "Add-ons page was opened");
+
+  // close the add-ons tab
+  if(gBrowser.tabs.length > 1) {
+    gBrowser.removeTab(gBrowser.selectedTab);
+  }
+  else {
+    var tabToRemove = gBrowser.selectedTab;
+    gBrowser.addTab(initialLocation);
+    gBrowser.removeTab(tabToRemove);
+  }
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/customizableui/test/browser_947914_button_copy.js
@@ -0,0 +1,51 @@
+/* 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/. */
+
+"use strict";
+
+add_task(function() {
+  info("Check copy button existence and functionality");
+
+  var testText = "copy text test";
+  let initialLocation = gBrowser.currentURI.spec;
+
+  yield PanelUI.show();
+
+  let copyButton = document.getElementById("copy-button");
+  ok(copyButton, "Copy button exists in Panel Menu");
+  is(copyButton.getAttribute("disabled"), "true", "Copy button is initially disabled");
+
+  // copy text from URL bar
+  gURLBar.value = testText;
+  gURLBar.focus();
+  gURLBar.select();
+  yield PanelUI.show();
+
+  ok(!copyButton.hasAttribute("disabled"), "Copy button gets enabled");
+
+  copyButton.click();
+  is(gURLBar.value, testText, "Selected text is unaltered when clicking copy");
+
+  // check that the text was added to the clipboard
+  let clipboard = Services.clipboard;
+  let transferable = Cc["@mozilla.org/widget/transferable;1"].createInstance(Ci.nsITransferable);
+  const globalClipboard = clipboard.kGlobalClipboard;
+
+  transferable.init(null);
+  transferable.addDataFlavor("text/unicode");
+  clipboard.getData(transferable, globalClipboard);
+  let str = {}, strLength = {};
+  transferable.getTransferData("text/unicode", str, strLength);
+  let clipboardValue = "";
+
+  if (str.value) {
+    str.value.QueryInterface(Ci.nsISupportsString);
+    clipboardValue = str.value.data;
+  }
+  is(clipboardValue, testText, "Data was copied to the clipboard.");
+
+  // restore the tab location and clear the clipboard
+  Services.clipboard.emptyClipboard(globalClipboard);
+  gURLBar.value = initialLocation;
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/customizableui/test/browser_947914_button_cut.js
@@ -0,0 +1,50 @@
+/* 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/. */
+
+"use strict";
+
+add_task(function() {
+  info("Check cut button existence and functionality");
+
+  var testText = "cut text test";
+  let initialLocation = gBrowser.currentURI.spec;
+
+  yield PanelUI.show();
+
+  let cutButton = document.getElementById("cut-button");
+  ok(cutButton, "Cut button exists in Panel Menu");
+  ok(cutButton.getAttribute("disabled"), "Cut button is disabled");
+
+  // cut text from URL bar
+  gURLBar.value = testText;
+  gURLBar.focus();
+  gURLBar.select();
+  yield PanelUI.show();
+
+  ok(!cutButton.hasAttribute("disabled"), "Cut button gets enabled");
+  cutButton.click();
+  is(gURLBar.value, "", "Selected text is removed from source when clicking on cut");
+
+  // check that the text was added to the clipboard
+  let clipboard = Services.clipboard;
+  let transferable = Cc["@mozilla.org/widget/transferable;1"].createInstance(Ci.nsITransferable);
+  const globalClipboard = clipboard.kGlobalClipboard;
+
+  transferable.init(null);
+  transferable.addDataFlavor("text/unicode");
+  clipboard.getData(transferable, globalClipboard);
+  let str = {}, strLength = {};
+  transferable.getTransferData("text/unicode", str, strLength);
+  let clipboardValue = "";
+
+  if (str.value) {
+    str.value.QueryInterface(Ci.nsISupportsString);
+    clipboardValue = str.value.data;
+  }
+  is(clipboardValue, testText, "Data was copied to the clipboard.");
+
+  // restore the tab location and clear the clipboard
+  gBrowser.value = initialLocation;
+  Services.clipboard.emptyClipboard(globalClipboard);
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/customizableui/test/browser_947914_button_find.js
@@ -0,0 +1,20 @@
+/* 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/. */
+
+"use strict";
+
+add_task(function() {
+  info("Check find button existence and functionality");
+
+  yield PanelUI.show();
+
+  let findButton = document.getElementById("find-button");
+  ok(findButton, "Find button exists in Panel Menu");
+
+  findButton.click();
+  ok(!gFindBar.hasAttribute("hidden"), "Findbar opened successfully");
+
+  // close find bar
+  gFindBar.close();
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/customizableui/test/browser_947914_button_history.js
@@ -0,0 +1,22 @@
+/* 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/. */
+
+"use strict";
+
+add_task(function() {
+  info("Check history button existence and functionality");
+
+  yield PanelUI.show();
+
+  let historyButton = document.getElementById("history-panelmenu");
+  ok(historyButton, "History button appears in Panel Menu");
+
+  historyButton.click();
+  let historyPanel = document.getElementById("PanelUI-history");
+  ok(historyPanel.getAttribute("current"), "History Panel is in view");
+
+  let panelHiddenPromise = promisePanelHidden(window);
+  PanelUI.hide();
+  yield panelHiddenPromise
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/customizableui/test/browser_947914_button_newPrivateWindow.js
@@ -0,0 +1,45 @@
+/* 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/. */
+
+"use strict";
+
+add_task(function() {
+  info("Check private browsing button existence and functionality");
+  yield PanelUI.show();
+
+  var windowWasHandled = false;
+  let privateWindow = null;
+
+  let observerWindowOpened = {
+    observe: function(aSubject, aTopic, aData) {
+      if (aTopic == "domwindowopened") {
+        privateWindow = aSubject.QueryInterface(Components.interfaces.nsIDOMWindow);
+        privateWindow.addEventListener("load", function newWindowHandler() {
+          privateWindow.removeEventListener("load", newWindowHandler, false);
+          is(privateWindow.location.href, "chrome://browser/content/browser.xul",
+             "A new browser window was opened");
+          ok(PrivateBrowsingUtils.isWindowPrivate(privateWindow), "Window is private");
+          windowWasHandled = true;
+        }, false);
+      }
+    }
+  }
+
+  Services.ww.registerNotification(observerWindowOpened);
+
+  let privateBrowsingButton = document.getElementById("privatebrowsing-button");
+  ok(privateBrowsingButton, "Private browsing button exists in Panel Menu");
+  privateBrowsingButton.click();
+
+  try{
+    yield waitForCondition(() => windowWasHandled);
+    yield promiseWindowClosed(privateWindow);
+  }
+  catch(e) {
+    ok(false, "The new private browser window was not properly handled");
+  }
+  finally {
+    Services.ww.unregisterNotification(observerWindowOpened);
+  }
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/customizableui/test/browser_947914_button_newWindow.js
@@ -0,0 +1,45 @@
+/* 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/. */
+
+"use strict";
+
+add_task(function() {
+  info("Check new window button existence and functionality");
+  yield PanelUI.show();
+
+  var windowWasHandled = false;
+  var newWindow = null;
+
+  let observerWindowOpened = {
+    observe: function(aSubject, aTopic, aData) {
+      if (aTopic == "domwindowopened") {
+        newWindow = aSubject.QueryInterface(Components.interfaces.nsIDOMWindow);
+        newWindow.addEventListener("load", function newWindowHandler() {
+          newWindow.removeEventListener("load", newWindowHandler, false);
+          is(newWindow.location.href, "chrome://browser/content/browser.xul",
+             "A new browser window was opened");
+          ok(!PrivateBrowsingUtils.isWindowPrivate(newWindow), "Window is not private");
+          windowWasHandled = true;
+        }, false);
+      }
+    }
+  }
+
+  Services.ww.registerNotification(observerWindowOpened);
+
+  let newWindowButton = document.getElementById("new-window-button");
+  ok(newWindowButton, "New Window button exists in Panel Menu");
+  newWindowButton.click();
+
+  try{
+    yield waitForCondition(() => windowWasHandled);
+    yield promiseWindowClosed(newWindow);
+  }
+  catch(e) {
+    ok(false, "The new browser window was not properly handled");
+  }
+  finally {
+    Services.ww.unregisterNotification(observerWindowOpened);
+  }
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/customizableui/test/browser_947914_button_paste.js
@@ -0,0 +1,35 @@
+/* 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/. */
+
+"use strict";
+
+add_task(function() {
+  info("Check paste button existence and functionality");
+
+  let initialLocation = gBrowser.currentURI.spec;
+  let clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper);
+  const globalClipboard = Services.clipboard.kGlobalClipboard;
+
+  yield PanelUI.show();
+
+  let pasteButton = document.getElementById("paste-button");
+  ok(pasteButton, "Paste button exists in Panel Menu");
+
+  // add text to clipboard
+  var text = "Sample text for testing";
+  clipboard.copyString(text);
+
+  // test paste button by pasting text to URL bar
+  gURLBar.focus();
+  yield PanelUI.show();
+
+  ok(!pasteButton.hasAttribute("disabled"), "Paste button is enabled");
+  pasteButton.click();
+
+  is(gURLBar.value, text, "Text pasted successfully");
+
+  // clear the clipboard and restore the tab location as it was at the begining of the test
+  Services.clipboard.emptyClipboard(globalClipboard);
+  gURLBar.value = initialLocation;
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/customizableui/test/browser_947914_button_print.js
@@ -0,0 +1,32 @@
+/* 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/. */
+
+"use strict";
+
+const isOSX = (Services.appinfo.OS === "Darwin");
+
+add_task(function() {
+  info("Check print button existence and functionality");
+
+  yield PanelUI.show();
+
+  let printButton = document.getElementById("print-button");
+  ok(printButton, "Print button exists in Panel Menu");
+
+  if(isOSX) {
+    let panelHiddenPromise = promisePanelHidden(window);
+    PanelUI.hide();
+    yield panelHiddenPromise;
+  }
+  else {
+    printButton.click();
+    yield waitForCondition(() => window.gInPrintPreviewMode);
+
+    ok(window.gInPrintPreviewMode, "Entered print preview mode");
+
+    // close print preview
+    PrintUtils.exitPrintPreview();
+    yield waitForCondition(() => !window.gInPrintPreviewMode);
+  }
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/customizableui/test/browser_947914_button_savePage.js
@@ -0,0 +1,18 @@
+/* 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/. */
+
+"use strict";
+
+add_task(function() {
+  info("Check save page button existence");
+
+  yield PanelUI.show();
+
+  let savePageButton = document.getElementById("save-page-button");
+  ok(savePageButton, "Save Page button exists in Panel Menu");
+
+  let panelHiddenPromise = promisePanelHidden(window);
+  PanelUI.hide();
+  yield panelHiddenPromise;
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/customizableui/test/browser_947914_button_zoomIn.js
@@ -0,0 +1,31 @@
+/* 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/. */
+
+"use strict";
+
+add_task(function() {
+  info("Check zoom in button existence and functionality");
+
+  let initialPageZoom = ZoomManager.zoom;
+  is(initialPageZoom, 1, "Initial zoom factor should be 1");
+
+  yield PanelUI.show();
+
+  let zoomInButton = document.getElementById("zoom-in-button");
+  ok(zoomInButton, "Zoom in button exists in Panel Menu");
+
+  zoomInButton.click();
+  let pageZoomLevel = parseInt(ZoomManager.zoom * 100);
+  let zoomResetButton = document.getElementById("zoom-reset-button");
+  let expectedZoomLevel = parseInt(zoomResetButton.getAttribute("label"), 10);
+  ok(pageZoomLevel > 100 && pageZoomLevel == expectedZoomLevel, "Page zoomed in correctly");
+
+  // close the Panel
+  let panelHiddenPromise = promisePanelHidden(window);
+  PanelUI.hide();
+  yield panelHiddenPromise;
+
+  // reset zoom level
+  ZoomManager.zoom = initialPageZoom;
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/customizableui/test/browser_947914_button_zoomOut.js
@@ -0,0 +1,32 @@
+/* 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/. */
+
+"use strict";
+
+add_task(function() {
+  info("Check zoom out button existence and functionality");
+
+  let initialPageZoom = ZoomManager.zoom;
+  is(initialPageZoom, 1, "Initial zoom factor should be 1");
+
+  yield PanelUI.show();
+
+  let zoomOutButton = document.getElementById("zoom-out-button");
+  ok(zoomOutButton, "Zoom out button exists in Panel Menu");
+
+  zoomOutButton.click();
+  let pageZoomLevel = Math.round(ZoomManager.zoom*100);
+
+  let zoomResetButton = document.getElementById("zoom-reset-button");
+  let expectedZoomLevel = parseInt(zoomResetButton.getAttribute("label"), 10);
+  ok(pageZoomLevel < 100 && pageZoomLevel == expectedZoomLevel, "Page zoomed out correctly");
+
+  // close the panel
+  let panelHiddenPromise = promisePanelHidden(window);
+  PanelUI.hide();
+  yield panelHiddenPromise;
+
+  // reset zoom level
+  ZoomManager.zoom = initialPageZoom;
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/customizableui/test/browser_947914_button_zoomReset.js
@@ -0,0 +1,30 @@
+/* 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/. */
+
+"use strict";
+
+add_task(function() {
+  info("Check zoom reset button existence and functionality");
+
+  let initialPageZoom = ZoomManager.zoom;
+  is(initialPageZoom, 1, "Initial zoom factor should be 1");
+  ZoomManager.zoom = 0.5;
+  yield PanelUI.show();
+
+  let zoomResetButton = document.getElementById("zoom-reset-button");
+  ok(zoomResetButton, "Zoom reset button exists in Panel Menu");
+
+  zoomResetButton.click();
+  let pageZoomLevel = parseInt(ZoomManager.zoom * 100);
+  let expectedZoomLevel = parseInt(zoomResetButton.getAttribute("label"), 10);
+  ok(pageZoomLevel == expectedZoomLevel && pageZoomLevel == 100, "Page zoom reset correctly");
+
+  // close the panel
+  let panelHiddenPromise = promisePanelHidden(window);
+  PanelUI.hide();
+  yield panelHiddenPromise;
+
+  //reset the zoom level
+  ZoomManager.zoom = initialPageZoom;
+});
--- a/browser/components/search/test/browser_bing.js
+++ b/browser/components/search/test/browser_bing.js
@@ -98,16 +98,21 @@ function test() {
               value: "MOZSPG",
               purpose: "homepage",
             },
             {
               name: "form",
               value: "MOZLBR",
               purpose:"keyword",
             },
+            {
+              name: "form",
+              value: "MOZTSB",
+              purpose: "newtab",
+            },
           ],
           mozparams: {},
         },
       ],
     },
   };
 
   isSubObjectOf(EXPECTED_ENGINE, engine, "Bing");
--- a/browser/components/search/test/browser_bing_behavior.js
+++ b/browser/components/search/test/browser_bing_behavior.js
@@ -62,17 +62,17 @@ function test() {
         registerCleanupFunction(function () {
           sb.value = "";
         });
         EventUtils.synthesizeKey("VK_RETURN", {});
       }
     },
     {
       name: "new tab search",
-      searchURL: base,
+      searchURL: base + "&form=MOZTSB",
       run: function () {
         function doSearch(doc) {
           // Re-add the listener, and perform a search
           gBrowser.addProgressListener(listener);
           doc.getElementById("newtab-search-text").value = "foo";
           doc.getElementById("newtab-search-submit").click();
         }
 
--- a/browser/components/tabview/test/browser_tabview_bug606905.js
+++ b/browser/components/tabview/test/browser_tabview_bug606905.js
@@ -15,17 +15,17 @@ function test() {
   executeSoon(function() {
     is(gBrowser.tabContainer.getAttribute("closebuttons"), "activetab", "Only show button on selected tab.");
 
     // move a tab to another group and check the closebuttons attribute
     TabView._initFrame(function() {
       TabView.moveTabTo(newTabs[newTabs.length - 1], null);
       ok(gBrowser.visibleTabs[0].getBoundingClientRect().width > gBrowser.tabContainer.mTabClipWidth, 
          "Tab width is bigger than tab clip width");
-      is(gBrowser.tabContainer.getAttribute("closebuttons"), "alltabs", "Show button on all tabs.")
+      is(gBrowser.tabContainer.getAttribute("closebuttons"), "", "Show button on all tabs.")
 
       // clean up and finish
       newTabs.forEach(function(tab) {
         gBrowser.removeTab(tab);
       });
       finish();
     });
   });
--- a/browser/locales/en-US/chrome/browser/browser.dtd
+++ b/browser/locales/en-US/chrome/browser/browser.dtd
@@ -442,17 +442,16 @@ These should match what Safari and other
 <!ENTITY bookmarkPageCmd2.label       "Bookmark This Page">
 <!ENTITY bookmarkPageCmd2.accesskey   "m">
 <!ENTITY bookmarkThisLinkCmd.label      "Bookmark This Link">
 <!ENTITY bookmarkThisLinkCmd.accesskey  "L">
 <!ENTITY bookmarkThisFrameCmd.label      "Bookmark This Frame">
 <!ENTITY bookmarkThisFrameCmd.accesskey  "m">
 <!ENTITY emailPageCmd.label           "Email Link…">
 <!ENTITY emailPageCmd.accesskey       "E">
-<!ENTITY switchToMetroCmd.label       "Relaunch in Windows 8 style &brandShortName;">
 <!ENTITY savePageCmd.label            "Save Page As…">
 <!ENTITY savePageCmd.accesskey        "A">
 <!-- alternate for content area context menu -->
 <!ENTITY savePageCmd.accesskey2       "P">
 <!ENTITY savePageCmd.commandkey       "s">
 <!ENTITY saveFrameCmd.label           "Save Frame As…">
 <!ENTITY saveFrameCmd.accesskey       "F">
 <!ENTITY printFrameCmd.label          "Print Frame…">
@@ -734,52 +733,12 @@ just addresses the organization to follo
 
 <!ENTITY tabCrashed.header "Tab crashed">
 <!ENTITY tabCrashed.message "Well, this is embarrassing. We tried to display this Web page, but it's not responding.">
 <!ENTITY tabCrashed.checkSendReport "Tell &vendorShortName; about this crash so they can fix it.">
 <!ENTITY tabCrashed.tryAgain "Try Again">
 
 <!ENTITY uiTour.infoPanel.close "Close">
 
-<!-- LOCALIZATION NOTE: the following strings are unused in Australis, they're
-     kept here to avoid warnings from l10n tools like compare-locales on
-     l10n-central. They will be definitely removed when Australis is ready
-     for mozilla-aurora. -->
+<!ENTITY appMenuSidebars.label         "Sidebars">
 
-<!ENTITY navbarCmd.accesskey           "N">
-<!ENTITY addonBarCmd.label             "Add-on Bar">
-<!ENTITY addonBarCmd.accesskey         "A">
-<!ENTITY throbberItem.title            "Activity Indicator">
-<!ENTITY appMenuButton.label           "Menu">
-<!ENTITY appMenuButton.tooltip         "Open &brandShortName; menu">
-<!ENTITY feedButton.label              "Subscribe">
-<!ENTITY feedButton.tooltip            "Subscribe to this page…">
-<!ENTITY bookmarksButton.tooltip       "Display your bookmarks">
-<!ENTITY historyButton.tooltip         "Display pages you've viewed recently">
-<!ENTITY viewTabsOnTop.label           "Tabs on Top">
-<!ENTITY viewTabsOnTop.accesskey       "T">
-<!ENTITY appMenuEdit.label             "Edit">
-<!ENTITY appMenuToolbarLayout.label    "Toolbar Layout…">
-<!ENTITY appMenuSidebars.label         "Sidebars">
-<!ENTITY appMenuFind.label             "Find…">
-<!ENTITY appMenuUnsorted.label         "Unsorted Bookmarks">
-<!ENTITY appMenuWebDeveloper.label     "Web Developer">
-<!ENTITY appMenuGettingStarted.label   "Getting Started">
-<!ENTITY appMenuSafeMode.label         "Restart with Add-ons Disabled…">
-<!ENTITY appMenuSafeMode.accesskey     "R">
-<!ENTITY cutButton.tooltip             "Cut">
-<!ENTITY copyButton.tooltip            "Copy">
-<!ENTITY pasteButton.tooltip           "Paste">
-<!ENTITY zoomOutButton.tooltip         "Zoom out">
-<!ENTITY zoomInButton.tooltip          "Zoom in">
-<!ENTITY zoomControls.label            "Zoom Controls">
-<!ENTITY addonBarCloseButton.tooltip   "Close Add-on Bar">
-<!ENTITY toggleAddonBarCmd.key         "/">
-<!ENTITY backForwardItem.title         "Back/Forward">
-<!ENTITY viewBookmarksSidebar.label    "Show in Sidebar">
-<!ENTITY bookmarksItem.title           "Bookmarks">
-<!ENTITY openLocationCmd.label         "Open Location…">
-<!ENTITY openLocationCmd.accesskey     "L">
-<!ENTITY bookmarksMenuButton.tooltip   "Display your bookmarks">
 <!ENTITY switchToMetroCmd2.label       "Relaunch in &brandShortName; for Windows 8 Touch">
-<!ENTITY tabGroupsButton.tooltip       "Group your tabs">
-<!-- end of strings to be removed post-Australis -->
 
--- a/browser/locales/en-US/searchplugins/amazondotcom.xml
+++ b/browser/locales/en-US/searchplugins/amazondotcom.xml
@@ -2,16 +2,18 @@
    - 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/. -->
 
 <SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
 <ShortName>Amazon.com</ShortName>
 <Description>Amazon.com Search</Description>
 <InputEncoding>ISO-8859-1</InputEncoding>
 <Image width="16" height="16">data:image/x-icon;base64,AAABAAIAEBAAAAAAAAC0AQAAJgAAACAgAAAAAAAA6QIAANoBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAF7SURBVDjLlZPLasJAFIaFRF+iVV+h6hO0GF+gVB9AaHwDt64qCG03tQgtdCFIuyhUelmGli66MXThSt24kNiFBUlAYi6ezjnNxSuawB/ITP7v/HNmJgQAEaZzpgHs/gwcTyTEXuXl2U6nA8ViEbK5HKler28CVRAwnB9ptVrAh8MrQuCaZ4iA8fzIqSgCxwzpTIaSuN/RWGwdYLwCUBQFZFkGSZLgqdmEE7YEN8VOAKyaSKUW4nNBAFmnYiKZpDRX1WqwBBzP089n5f/NEQsFL4WqqtsBWJlzDAJr5PwSMM1awEzzdxIbGI3Hvc6jCZeVFgRQRwpY7Qcw3ktgfpR8wLRxCPaot/X4GS95MppfF6DX9n2A3f+kAZycaT8bAZjU6r6B/duD6d3BYg9wQq/tkYzHY1blEiz5lmQyGc95mrO6r2CxgpjCBXgNsJVviolpXJiraeOIjJRE10juUa4sR8V+mO17VvmGqtuOcdNlwut8zTQJcJ0njifyB2bgTdKh6w4BAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACsElEQVRYw71XQWsTURBe2LQgeNKLB+tVemt6txcteNSD/QGC6VEIGDx5s+eKPQqFgJhLNdFLBWMP7cU0oSAWjB70koC9WHbVQ5SO8+XtS14mr7svyaYDH9m87Jv55puZt1nPi4yIzjMeMj7T9OwjI88455nGC1cZX+nsDESumJmPFDwIAqrX6z00Gg1qt9vjkJgFgUeuO16Vy3RjeZkyMzM9+MY1fsM9I9h9zyV7ZAznZrA4FAoFVwJ1z+WuOysrg1lnMolkHJX4k0igzI5sARYWF7vEZEk0rvO6iyUSuJfLJUqM7zYSqRDIra4OOUZPmNZsNrsl8UVTpkJAjh1GzmaSpJ8mAWmYeZB5urHRhW5SNOfUCCDo47W1bvPZsp2qAhipy3Nz1kaLG8dUCEBqM5AvpgElqFar01NgIZsdco7Zb7VasU2YigIYL5tjqCL7Q5YkFQXKlcqQ7DbHthIALk/IWAKor82xPIhshxWABCYioDMz51sexcVi0XoG4DPLIyvJjkTArK3scDQnRvO0MdTrUHGiKZCP4tNgO6BAEI08EQH9Z2Qow0hyPypJGIa9p6JWKCn4SA8jSKmJIDgyRvPJkcRxjfUwNGr/i8+Mo32iHzWiThBD4NM60bet9P77/ubA728RlTjMiwiH6zEEfvIrwdZFtQmMJ7W/ofIDBZD5m3mVZGwJcOP2kmILIlCkE45HoPWurwCSg0+UQRD4ZyXxId+T7gQb9+4q9sioY5ltrOG3L5vqXiiJffDx/aUi83ZJ7jr2ohcEu8Hh6/m+I7OWGiVxbWKHsz+O3vSOakqFQdsFgQeJUiKD7Wv9YKXBgCeSUC3v2kM5EJhlHDh3NcgcPlG1BXZu98sDmTuBa4fsMnz9fniJUaGzs+eMC540XuR0aDO2L8Y3qPyMcdOM+R/8XcqRA3qp9gAAAABJRU5ErkJggg==</Image>
+<Image width="65" height="26">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAAAaCAYAAADovjFxAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjk1RjU4MDYwQkU0RDExRTNBNkI0RTM0MDNENDQ0Q0QxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjk1RjU4MDYxQkU0RDExRTNBNkI0RTM0MDNENDQ0Q0QxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OTVGNTgwNUVCRTREMTFFM0E2QjRFMzQwM0Q0NDRDRDEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6OTVGNTgwNUZCRTREMTFFM0E2QjRFMzQwM0Q0NDRDRDEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4FxGXPAAAGU0lEQVR42uyYe2xU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</Image>
+<Image width="130" height="52">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAAA0CAYAAABGkOCVAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjk1RjU4MDVDQkU0RDExRTNBNkI0RTM0MDNENDQ0Q0QxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjk1RjU4MDVEQkU0RDExRTNBNkI0RTM0MDNENDQ0Q0QxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OTVGNTgwNUFCRTREMTFFM0E2QjRFMzQwM0Q0NDRDRDEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6OTVGNTgwNUJCRTREMTFFM0E2QjRFMzQwM0Q0NDRDRDEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5AOR4OAAAOI0lEQVR42uxcC3BU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</Image>
 <Url type="text/html" method="GET" template="http://www.amazon.com/exec/obidos/external-search/">
   <Param name="field-keywords" value="{searchTerms}"/>
   <Param name="mode" value="blended"/>
   <Param name="tag" value="mozilla-20"/>
   <Param name="sourceid" value="Mozilla-search"/>
 </Url>
 <SearchForm>http://www.amazon.com/</SearchForm>
 </SearchPlugin>
--- a/browser/locales/en-US/searchplugins/bing.xml
+++ b/browser/locales/en-US/searchplugins/bing.xml
@@ -2,23 +2,26 @@
    - 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/. -->
 
 <SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
     <ShortName>Bing</ShortName>
     <Description>Bing. Search by Microsoft.</Description>
     <InputEncoding>UTF-8</InputEncoding>
     <Image width="16" height="16">data:image/x-icon;base64,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</Image>
+    <Image width="65" height="26">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAAAaCAYAAADovjFxAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkVBOTQzNENBQzQxNDExRTM5RURBRUU5NUU4QkU3NjA4IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkVBOTQzNENCQzQxNDExRTM5RURBRUU5NUU4QkU3NjA4Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NzU2RTRERkZDMzc1MTFFMzlFREFFRTk1RThCRTc2MDgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NzU2RTRFMDBDMzc1MTFFMzlFREFFRTk1RThCRTc2MDgiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz76XOiPAAAD1ElEQVR42uyYeUgVQRzH9+nLNE07kMKIiqAkSaUIMgUpyu6eHdBhVBSBZQf1R4XkP0WHFUURWBlRmGGHdkI3nWIXVHZIaNkhFXmWYni+vhPfhWHZfbvvqVjZDz7Mzs6w8+Y3v2ue3eFwPFUU5R64CG6BRqWDiReIBCvBNfAeHAXjOpoSqqV+H7AQbO1oStCTz/+VoCjONlpvDdgPelqc3x8kgMD2UEJbSTRIAkMszhfB+jhIbU8lxIIZrbjeV7b1FudngefgansqoQ5kg3cgDUwBXVthXavutoXZ61x7KuEBOAkGgESap0ijGWAeCPZwXZv0bNf0PZFObuzX7klM2Kjp9wDzQSYVcgWsAqFubD4fjAIloAE0g0sgXDN/Li1xBPt+IAcks3+KViXc6xmYbrDuGBaETVzvFegHloKzVpRQBK4bjHUB48FeUADyQDcX32pmuxPkgkr6vahaJ9P/Q3Vi0mD2fbjRdeAln4VSboIIPkdp1lzA8RjuQ1h2CA9wH4i3mh2SLc4bCQJMYozCDDEbDOVpDwPLOHZGml/KtlpSongOArV0g5lgLFguxRFVxGaP0VrCQByYA7pT+b7ie1aV8ASMBhdM5jWY3D3UgLiLpizLAfCGP3agi2/4s43RvE+jucdKbpfEdjV4reNqVSLQu1Mn3AYOxoTcFgawHIPxbLZhJsHtg0Ga/cJxVdkTdKxLlnxFL1JKvqcn4oQWMai0RAk/DcarpFjjSmpN3E2uOOX6RCuNrpTQWdPvC9ZL5uVqk3YL7mBUJ4SwLTdZx2gNb4P1vA3c1McoRZaBxXwWAWgbM0SShZN+KJ2mnqgm3MtgXE1xL1qpDiowca8IReM/ClNUMH1OpKG3YIML91DlB1jL7FDjYp56Grt1xmbRzfJcmK9VUS0ik+0OnTmbWf3WeEkbPMQSdRqVkGrxtncYDAJ7LMwNlE6mhEXXRLAdnOZYgjTfTxNLbJrvaCVI009nPRDH+0c8mMrALIrAQuFaduZeUUAcAZeliGom92kl7mSKeqbRSSyYMqSxYiqgWHpXw/l1ko+LfoXB98s1dUoTrfMEFREnjQ1nbbHE5nA4vvOCFGlxI2UsntI9MNNARn7V3KNobd/AI535AaSSirAxnjTyd2glmK6g507hDPBCsXf47qN4J5SQyELDihykAir+gT+U/KmQIi9WasKn75qYfjRvkn+bAoINAud5Pqeo+baQ5WYK2KT5EySFwe9vFF+6Win/kxAn35sls3oLzbLrpI0b3PRjsMIk5f3pYmPsSuC1WZVPrH9+hwGb0+lUOrr8EmAAiqTecoRlgJMAAAAASUVORK5CYII=</Image>
+    <Image width="130" height="52">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAAA0CAYAAABGkOCVAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjc1NkU0REZEQzM3NTExRTM5RURBRUU5NUU4QkU3NjA4IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjc1NkU0REZFQzM3NTExRTM5RURBRUU5NUU4QkU3NjA4Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NzU2RTRERkJDMzc1MTFFMzlFREFFRTk1RThCRTc2MDgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NzU2RTRERkNDMzc1MTFFMzlFREFFRTk1RThCRTc2MDgiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5lzzn9AAAIPUlEQVR42uxdCWwV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</Image>
     <Url type="application/x-suggestions+json" template="http://api.bing.com/osjson.aspx">
         <Param name="query" value="{searchTerms}"/>
         <Param name="form" value="OSDJAS"/>
         <Param name="language" value="{moz:locale}"/>
     </Url>
     <Url type="text/html" method="GET" template="http://www.bing.com/search">
         <Param name="q" value="{searchTerms}"/>
         <MozParam name="pc" condition="pref" pref="ms-pc"/>
         <MozParam name="form" condition="purpose" purpose="contextmenu" value="MOZCON"/>
         <MozParam name="form" condition="purpose" purpose="searchbar" value="MOZSBR"/>
         <MozParam name="form" condition="purpose" purpose="homepage" value="MOZSPG"/>
         <MozParam name="form" condition="purpose" purpose="keyword" value="MOZLBR"/>
+        <MozParam name="form" condition="purpose" purpose="newtab" value="MOZTSB"/>
     </Url>
     <SearchForm>http://www.bing.com/search</SearchForm>
 </SearchPlugin>
--- a/browser/modules/BrowserUITelemetry.jsm
+++ b/browser/modules/BrowserUITelemetry.jsm
@@ -57,17 +57,16 @@ XPCOMUtils.defineLazyGetter(this, "DEFAU
     // in the document.
     "toolbar-menubar": [
       "menubar-items",
     ],
     "TabsToolbar": [
       "tabbrowser-tabs",
       "new-tab-button",
       "alltabs-button",
-      "tabs-closebutton",
     ],
     "PersonalToolbar": [
       "personal-bookmarks",
     ],
   };
 
   let showCharacterEncoding = Services.prefs.getComplexValue(
     "browser.menu.showCharacterEncoding",
--- a/browser/themes/linux/browser.css
+++ b/browser/themes/linux/browser.css
@@ -1767,71 +1767,37 @@ richlistitem[type~="action"][actiontype=
 
 /* Tab drag and drop */
 .tab-drop-indicator {
   list-style-image: url(chrome://browser/skin/tabbrowser/tabDragIndicator.png);
   margin-bottom: -9px;
   z-index: 3;
 }
 
-/* In-tab close button */
-.tab-close-button > .toolbarbutton-icon {
-  /* XXX Buttons have padding in widget/ that we don't want here but can't override with good CSS, so we must
-     use evil CSS to give the impression of smaller content */
-  margin: -4px;
-}
-
-/* Tabstrip close button */
-.tabs-closebutton,
-.tab-close-button {
-  -moz-appearance: none;
-  height: 16px;
-  width: 16px;
-}
-
-.tabs-closebutton:not([selected]):not(:hover),
+/* Tab close button */
 .tab-close-button:not([selected]):not(:hover) {
   background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 64, 16, 48);
 }
 
-.tabs-closebutton:not([selected]):not(:hover):-moz-lwtheme-brighttext,
 .tab-close-button:not([selected]):not(:hover):-moz-lwtheme-brighttext {
   background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 80, 16, 64);
 }
 
-.tabs-closebutton:not([selected]):not(:hover):-moz-lwtheme-darktext,
 .tab-close-button:not([selected]):not(:hover):-moz-lwtheme-darktext {
   background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 96, 16, 80);
 }
 
 /* Tabstrip new tab button */
 .tabs-newtab-button,
 #TabsToolbar > #new-tab-button ,
 #TabsToolbar > #wrapper-new-tab-button > #new-tab-button {
   list-style-image: url("moz-icon://stock/gtk-add?size=menu");
   -moz-image-region: auto;
 }
 
-.customization-tipPanel-closeBox > .close-icon {
-  -moz-appearance: none;
-  width: 16px;
-  height: 16px;
-}
-
-/* The :hover:active style from toolkit doesn't seem to work in this panel so just use :active. */
-.customization-tipPanel-closeBox > .close-icon:active {
-  background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 48, 16, 32);
-}
-
-.tabs-closebutton > .toolbarbutton-icon {
-  /* XXX Buttons have padding in widget/ that we don't want here but can't override with good CSS, so we must
-     use evil CSS to give the impression of smaller content */
-  margin: -2px;
-}
-
 /* Tabbrowser arrowscrollbox arrows */
 .tabbrowser-arrowscrollbox > .scrollbutton-up,
 .tabbrowser-arrowscrollbox > .scrollbutton-down {
   -moz-appearance: none;
   margin: 0 0 @tabToolbarNavbarOverlap@;
 }
 
 .tabbrowser-arrowscrollbox > .scrollbutton-up {
@@ -1898,21 +1864,16 @@ richlistitem[type~="action"][actiontype=
 }
 
 .alltabs-item[tabIsVisible] {
   /* box-shadow instead of background-color to work around native styling */
   box-shadow: inset -5px 0 ThreeDShadow;
 }
 
 /* Sidebar */
-#sidebar-header > .tabs-closebutton {
-  margin-bottom: 0px !important;
-  padding: 0px 2px 0px 2px !important;
-}
-
 #sidebar-throbber[loading="true"] {
   list-style-image: url("chrome://global/skin/icons/loading_16.png");
   -moz-margin-end: 4px;
 }
 
 toolbarbutton.chevron {
   list-style-image: url("chrome://global/skin/toolbar/chevron.gif") !important;
 }
@@ -2230,16 +2191,21 @@ chatbox {
 
 #main-window[customize-entered] #TabsToolbar {
   -moz-appearance: none;
   background-clip: padding-box;
   border-right: 3px solid transparent;
   border-left: 3px solid transparent;
 }
 
+/* The :hover:active style from toolkit doesn't seem to work in this panel so just use :active. */
+.customization-tipPanel-closeBox > .close-icon:active {
+  background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 48, 16, 32);
+}
+
 /* End customization mode */
 
 
 #main-window[privatebrowsingmode=temporary] #private-browsing-indicator {
   background: url("chrome://browser/skin/privatebrowsing-mask.png") center no-repeat;
   width: 40px;
 }
 
--- a/browser/themes/linux/devtools/netmonitor.css
+++ b/browser/themes/linux/devtools/netmonitor.css
@@ -4,17 +4,17 @@
 
 %include ../../shared/devtools/netmonitor.inc.css
 
 #headers-summary-resend {
   padding: 4px;
 }
 
 .requests-menu-status-and-method {
-  width: 7em;
+  width: 9em;
 }
 
 .requests-menu-domain {
   width: 16vw;
 }
 
 .requests-menu-size {
   width: 6em;
--- a/browser/themes/linux/jar.mn
+++ b/browser/themes/linux/jar.mn
@@ -223,17 +223,16 @@ browser.jar:
 * skin/classic/browser/devtools/shadereditor.css      (devtools/shadereditor.css)
 * skin/classic/browser/devtools/splitview.css         (../shared/devtools/splitview.css)
   skin/classic/browser/devtools/styleeditor.css       (../shared/devtools/styleeditor.css)
 * skin/classic/browser/devtools/webaudioeditor.css    (devtools/webaudioeditor.css)
   skin/classic/browser/devtools/magnifying-glass.png        (../shared/devtools/images/magnifying-glass.png)
   skin/classic/browser/devtools/magnifying-glass@2x.png     (../shared/devtools/images/magnifying-glass@2x.png)
   skin/classic/browser/devtools/magnifying-glass-light.png  (../shared/devtools/images/magnifying-glass-light.png)
   skin/classic/browser/devtools/magnifying-glass-light@2x.png (../shared/devtools/images/magnifying-glass-light@2x.png)
-  skin/classic/browser/devtools/option-icon.png       (../shared/devtools/images/option-icon.png)
   skin/classic/browser/devtools/itemToggle.png        (../shared/devtools/images/itemToggle.png)
   skin/classic/browser/devtools/itemToggle-light.png  (../shared/devtools/images/itemToggle-light.png)
   skin/classic/browser/devtools/itemArrow-dark-rtl.png (../shared/devtools/images/itemArrow-dark-rtl.png)
   skin/classic/browser/devtools/itemArrow-dark-ltr.png (../shared/devtools/images/itemArrow-dark-ltr.png)
   skin/classic/browser/devtools/itemArrow-rtl.svg      (../shared/devtools/images/itemArrow-rtl.svg)
   skin/classic/browser/devtools/itemArrow-ltr.svg      (../shared/devtools/images/itemArrow-ltr.svg)
   skin/classic/browser/devtools/background-noise-toolbar.png (devtools/background-noise-toolbar.png)
   skin/classic/browser/devtools/noise.png             (devtools/noise.png)
--- a/browser/themes/osx/browser.css
+++ b/browser/themes/osx/browser.css
@@ -2618,20 +2618,16 @@ sidebarheader {
   font-weight: bold;
 }
 
 .sidebar-throbber[loading="true"],
 #sidebar-throbber[loading="true"] {
   list-style-image: url("chrome://global/skin/icons/loading_16.png");
 }
 
-sidebarheader > .tabs-closebutton > .toolbarbutton-text {
-  display: none;
-}
-
 /* ----- CONTENT ----- */
 
 .browserContainer > findbar {
   background: @scopeBarBackground@;
   border-top: @scopeBarSeparatorBorder@;
   color: -moz-DialogText;
   text-shadow: none;
 }
@@ -3174,28 +3170,16 @@ toolbarbutton.chevron > .toolbarbutton-m
   list-style-image: url("chrome://global/skin/icons/loading_16.png") !important;
 }
 
 .alltabs-item[tabIsVisible] {
   /* box-shadow instead of background-color to work around native styling */
   box-shadow: inset -5px 0 ThreeDShadow;
 }
 
-/* Tabstrip close button */
-.tabs-closebutton {
-  -moz-padding-end: 4px;
-  border: none;
-}
-
-@media (min-resolution: 2dppx) {
-  .tabs-closebutton > .toolbarbutton-icon {
-    width: 16px;
-  }
-}
-
 /* Bookmarks toolbar */
 #PlacesToolbarDropIndicator {
   list-style-image: url(chrome://browser/skin/places/toolbarDropMarker.png);
 }
 
 /* Bookmark drag and drop styles */
 
 .bookmark-item[dragover-into="true"] {
--- a/browser/themes/osx/jar.mn
+++ b/browser/themes/osx/jar.mn
@@ -344,17 +344,16 @@ browser.jar:
 * skin/classic/browser/devtools/shadereditor.css            (devtools/shadereditor.css)
 * skin/classic/browser/devtools/splitview.css               (../shared/devtools/splitview.css)
   skin/classic/browser/devtools/styleeditor.css             (../shared/devtools/styleeditor.css)
 * skin/classic/browser/devtools/webaudioeditor.css          (devtools/webaudioeditor.css)
   skin/classic/browser/devtools/magnifying-glass.png        (../shared/devtools/images/magnifying-glass.png)
   skin/classic/browser/devtools/magnifying-glass@2x.png     (../shared/devtools/images/magnifying-glass@2x.png)
   skin/classic/browser/devtools/magnifying-glass-light.png  (../shared/devtools/images/magnifying-glass-light.png)
   skin/classic/browser/devtools/magnifying-glass-light@2x.png (../shared/devtools/images/magnifying-glass-light@2x.png)
-  skin/classic/browser/devtools/option-icon.png             (../shared/devtools/images/option-icon.png)
   skin/classic/browser/devtools/itemToggle.png              (../shared/devtools/images/itemToggle.png)
   skin/classic/browser/devtools/itemToggle-light.png        (../shared/devtools/images/itemToggle-light.png)
   skin/classic/browser/devtools/itemArrow-dark-rtl.png      (../shared/devtools/images/itemArrow-dark-rtl.png)
   skin/classic/browser/devtools/itemArrow-dark-ltr.png      (../shared/devtools/images/itemArrow-dark-ltr.png)
   skin/classic/browser/devtools/itemArrow-rtl.svg           (../shared/devtools/images/itemArrow-rtl.svg)
   skin/classic/browser/devtools/itemArrow-ltr.svg           (../shared/devtools/images/itemArrow-ltr.svg)
   skin/classic/browser/devtools/background-noise-toolbar.png (devtools/background-noise-toolbar.png)
   skin/classic/browser/devtools/noise.png                   (devtools/noise.png)
--- a/browser/themes/shared/customizableui/panelUIOverlay.inc.css
+++ b/browser/themes/shared/customizableui/panelUIOverlay.inc.css
@@ -723,17 +723,17 @@ menuitem.subviewbutton@menuStateHover@,
   background-color: hsla(210,4%,10%,.08);
   border-color: hsla(210,4%,10%,.11);
 }
 
 .toolbaritem-combined-buttons@inAnyPanel@@buttonStateHover@ {
   border-color: hsla(210,4%,10%,.11);
 }
 
-panelview .toolbarbutton-1@buttonStateActive@,
+panelview .toolbarbutton-1:-moz-any(@buttonStateActive@,[checked=true]),
 toolbarbutton.subviewbutton@buttonStateActive@,
 menu.subviewbutton@menuStateActive@,
 menuitem.subviewbutton@menuStateActive@,
 .widget-overflow-list .toolbarbutton-1@buttonStateActive@,
 .toolbaritem-combined-buttons@inAnyPanel@ > toolbarbutton@buttonStateActive@ {
   background-color: hsla(210,4%,10%,.12);
   border-color: hsla(210,4%,10%,.14);
   box-shadow: 0 1px 0 hsla(210,4%,10%,.03) inset;
deleted file mode 100644
index afdc6a209726575db92b96eb5e0529f8b85c5b96..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/themes/shared/devtools/toolbars.inc.css
+++ b/browser/themes/shared/devtools/toolbars.inc.css
@@ -114,24 +114,24 @@
 }
 
 .theme-dark .devtools-toolbarbutton[checked=true]:hover:active {
   background-color: hsla(210,8%,5%,.2) !important;
 }
 
 .devtools-option-toolbarbutton {
   -moz-appearance: none;
-  list-style-image: url("chrome://browser/skin/devtools/option-icon.png");
-  -moz-image-region: rect(0px 16px 16px 0px);
+  list-style-image: url("chrome://browser/skin/devtools/tool-options.svg");
   background: none;
+  opacity: .8;
   border: none;
 }
 
 .devtools-option-toolbarbutton[open=true] {
-  -moz-image-region: rect(0px 32px 16px 16px);
+  opacity: 1;
 }
 
 .devtools-menulist > .menulist-label-box {
   text-align: center;
 }
 
 .devtools-menulist > .menulist-dropmarker {
   -moz-appearance: none;
@@ -787,17 +787,16 @@
   filter: url(filters.svg#invert);
 }
 
 /* Since selected backgrounds are blue, we want to use the normal
  * (light) icons. */
 .theme-light .command-button-invertable[checked=true]:not(:active) > image,
 .theme-light .devtools-tab[icon-invertable][selected] > image,
 .theme-light .devtools-tab[icon-invertable][highlighted] > image,
-.theme-light .devtools-option-toolbarbutton[open] > image,
 .theme-light #resume[checked] > image {
   filter: none !important;
 }
 
 .theme-light .command-button:hover {
   background-color: inherit;
 }
 
--- a/browser/themes/windows/browser.css
+++ b/browser/themes/windows/browser.css
@@ -1761,16 +1761,23 @@ toolbarbutton[type="socialmark"] > .tool
 #sidebar {
   background-color: Window;
 }
 
 #sidebar-title {
   -moz-padding-start: 0px;
 }
 
+#sidebar-header > .close-icon {
+  -moz-appearance: none;
+  padding: 4px 2px;
+  margin: 0;
+  border: none;
+}
+
 .browserContainer > findbar {
   background-color: -moz-dialog;
   color: -moz-DialogText;
   text-shadow: none;
 }
 
 /* Tabstrip */
 
@@ -1992,30 +1999,16 @@ toolbarbutton[type="socialmark"] > .tool
   list-style-image: url("chrome://global/skin/icons/loading_16.png");
 }
 
 .alltabs-item[tabIsVisible] {
   /* box-shadow instead of background-color to work around native styling */
   box-shadow: inset -5px 0 ThreeDShadow;
 }
 
-/* Tabstrip close button */
-.tabs-closebutton {
-  -moz-appearance: none;
-  padding: 4px 2px;
-  margin: 0px;
-  border: none;
-}
-
-.tabs-closebutton > .toolbarbutton-icon {
-  -moz-margin-end: 0px !important;
-  -moz-padding-end: 2px !important;
-  -moz-padding-start: 2px !important;
-}
-
 toolbarbutton.chevron {
   list-style-image: url("chrome://global/skin/toolbar/chevron.gif") !important;
 }
 
 toolbarbutton.chevron:-moz-locale-dir(rtl) > .toolbarbutton-icon {
   transform: scaleX(-1);
 }
 
--- a/browser/themes/windows/jar.mn
+++ b/browser/themes/windows/jar.mn
@@ -260,17 +260,16 @@ browser.jar:
 *       skin/classic/browser/devtools/shadereditor.css              (devtools/shadereditor.css)
 *       skin/classic/browser/devtools/splitview.css                 (../shared/devtools/splitview.css)
         skin/classic/browser/devtools/styleeditor.css               (../shared/devtools/styleeditor.css)
 *       skin/classic/browser/devtools/webaudioeditor.css            (devtools/webaudioeditor.css)
         skin/classic/browser/devtools/magnifying-glass.png          (../shared/devtools/images/magnifying-glass.png)
         skin/classic/browser/devtools/magnifying-glass@2x.png       (../shared/devtools/images/magnifying-glass@2x.png)
         skin/classic/browser/devtools/magnifying-glass-light.png    (../shared/devtools/images/magnifying-glass-light.png)
         skin/classic/browser/devtools/magnifying-glass-light@2x.png  (../shared/devtools/images/magnifying-glass-light@2x.png)
-        skin/classic/browser/devtools/option-icon.png               (../shared/devtools/images/option-icon.png)
         skin/classic/browser/devtools/itemToggle.png                (../shared/devtools/images/itemToggle.png)
         skin/classic/browser/devtools/itemToggle-light.png          (../shared/devtools/images/itemToggle-light.png)
         skin/classic/browser/devtools/itemArrow-dark-rtl.png        (../shared/devtools/images/itemArrow-dark-rtl.png)
         skin/classic/browser/devtools/itemArrow-dark-ltr.png        (../shared/devtools/images/itemArrow-dark-ltr.png)
         skin/classic/browser/devtools/itemArrow-rtl.svg             (../shared/devtools/images/itemArrow-rtl.svg)
         skin/classic/browser/devtools/itemArrow-ltr.svg             (../shared/devtools/images/itemArrow-ltr.svg)
         skin/classic/browser/devtools/background-noise-toolbar.png  (devtools/background-noise-toolbar.png)
         skin/classic/browser/devtools/noise.png                     (devtools/noise.png)
@@ -623,17 +622,16 @@ browser.jar:
 *       skin/classic/aero/browser/devtools/scratchpad.css            (devtools/scratchpad.css)
 *       skin/classic/aero/browser/devtools/shadereditor.css          (devtools/shadereditor.css)
 *       skin/classic/aero/browser/devtools/splitview.css             (../shared/devtools/splitview.css)
         skin/classic/aero/browser/devtools/styleeditor.css           (../shared/devtools/styleeditor.css)
         skin/classic/aero/browser/devtools/magnifying-glass.png      (../shared/devtools/images/magnifying-glass.png)
         skin/classic/aero/browser/devtools/magnifying-glass@2x.png   (../shared/devtools/images/magnifying-glass@2x.png)
         skin/classic/aero/browser/devtools/magnifying-glass-light.png (../shared/devtools/images/magnifying-glass-light.png)
         skin/classic/aero/browser/devtools/magnifying-glass-light@2x.png  (../shared/devtools/images/magnifying-glass-light@2x.png)
-        skin/classic/aero/browser/devtools/option-icon.png           (../shared/devtools/images/option-icon.png)
         skin/classic/aero/browser/devtools/itemToggle.png            (../shared/devtools/images/itemToggle.png)
         skin/classic/aero/browser/devtools/itemToggle-light.png      (../shared/devtools/images/itemToggle-light.png)
         skin/classic/aero/browser/devtools/itemArrow-dark-rtl.png    (../shared/devtools/images/itemArrow-dark-rtl.png)
         skin/classic/aero/browser/devtools/itemArrow-dark-ltr.png    (../shared/devtools/images/itemArrow-dark-ltr.png)
         skin/classic/aero/browser/devtools/itemArrow-rtl.svg         (../shared/devtools/images/itemArrow-rtl.svg)
         skin/classic/aero/browser/devtools/itemArrow-ltr.svg         (../shared/devtools/images/itemArrow-ltr.svg)
         skin/classic/aero/browser/devtools/background-noise-toolbar.png (devtools/background-noise-toolbar.png)
         skin/classic/aero/browser/devtools/noise.png                 (devtools/noise.png)
--- a/mobile/android/base/TabsAccessor.java
+++ b/mobile/android/base/TabsAccessor.java
@@ -16,17 +16,16 @@ import android.content.ContentValues;
 import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
 import android.util.Log;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.regex.Pattern;
 
 public final class TabsAccessor {
     private static final String LOGTAG = "GeckoTabsAccessor";
 
     private static final String[] CLIENTS_AVAILABILITY_PROJECTION = new String[] {
                                                                         BrowserContract.Clients.GUID
                                                                     };
 
@@ -45,17 +44,16 @@ public final class TabsAccessor {
         NAME
     };
 
     private static final String CLIENTS_SELECTION = BrowserContract.Clients.GUID + " IS NOT NULL";
     private static final String TABS_SELECTION = BrowserContract.Tabs.CLIENT_GUID + " IS NOT NULL";
 
     private static final String LOCAL_CLIENT_SELECTION = BrowserContract.Clients.GUID + " IS NULL";
     private static final String LOCAL_TABS_SELECTION = BrowserContract.Tabs.CLIENT_GUID + " IS NULL";
-    private static final Pattern FILTERED_URL_PATTERN = Pattern.compile("^(about|chrome|wyciwyg|file):.*$");
 
     public static class RemoteTab {
         public String title;
         public String url;
         public String guid;
         public String name;
     }
 
@@ -146,19 +144,19 @@ public final class TabsAccessor {
      */
     private static void insertLocalTabs(final ContentResolver cr, final Iterable<Tab> tabs) {
         // Reuse this for serializing individual history URLs as JSON.
         JSONArray history = new JSONArray();
         ArrayList<ContentValues> valuesToInsert = new ArrayList<ContentValues>();
 
         int position = 0;
         for (Tab tab : tabs) {
-            // Skip this tab if it has a null URL or is in private browsing mode, or is a filtered URL.
+            // Skip this tab if it has a null URL or is in private browsing mode
             String url = tab.getURL();
-            if (url == null || tab.isPrivate() || isFilteredURL(url))
+            if (url == null || tab.isPrivate())
                 continue;
 
             ContentValues values = new ContentValues();
             values.put(BrowserContract.Tabs.URL, url);
             values.put(BrowserContract.Tabs.TITLE, tab.getTitle());
             values.put(BrowserContract.Tabs.LAST_USED, tab.getLastUsed());
 
             String favicon = tab.getFaviconURL();
@@ -189,18 +187,9 @@ public final class TabsAccessor {
     }
 
     // Deletes all local tabs and replaces them with a new list of tabs.
     public static synchronized void persistLocalTabs(final ContentResolver cr, final Iterable<Tab> tabs) {
         deleteLocalTabs(cr);
         insertLocalTabs(cr, tabs);
         updateLocalClient(cr);
     }
-
-    /**
-     * Matches the supplied URL string against the set of URLs to filter.
-     *
-     * @return true if the supplied URL should be skipped; false otherwise.
-     */
-    private static boolean isFilteredURL(String url) {
-        return FILTERED_URL_PATTERN.matcher(url).matches();
-    }
 }
--- a/mobile/android/base/db/BrowserContract.java
+++ b/mobile/android/base/db/BrowserContract.java
@@ -342,16 +342,19 @@ public class BrowserContract {
 
         public static final String DATASET_ID = "dataset_id";
         public static final String URL = "url";
         public static final String TITLE = "title";
         public static final String DESCRIPTION = "description";
         public static final String IMAGE_URL = "image_url";
         public static final String CREATED = "created";
         public static final String FILTER = "filter";
+
+        public static final String[] DEFAULT_PROJECTION =
+            new String[] { _ID, DATASET_ID, URL, TITLE, DESCRIPTION, IMAGE_URL, FILTER };
     }
 
     /*
      * Contains names and schema definitions for tables and views
      * no longer being used by current ContentProviders. These values are used
      * to make incremental updates to the schema during a database upgrade. Will be
      * removed with bug 947018.
      */
--- a/mobile/android/base/db/HomeProvider.java
+++ b/mobile/android/base/db/HomeProvider.java
@@ -80,22 +80,27 @@ public class HomeProvider extends SQLite
             throw new IllegalArgumentException("All queries should contain a dataset ID parameter");
         }
 
         selection = DBUtils.concatenateWhere(selection, HomeItems.DATASET_ID + " = ?");
         selectionArgs = DBUtils.appendSelectionArgs(selectionArgs,
                                                     new String[] { datasetId });
 
         // Otherwise, let the SQLiteContentProvider implementation take care of this query for us!
-        final Cursor c = super.query(uri, projection, selection, selectionArgs, sortOrder);
-        if (c != null) {
-            final ContentResolver cr = getContext().getContentResolver();
-            c.setNotificationUri(cr, getDatasetNotificationUri(datasetId));
+        Cursor c = super.query(uri, projection, selection, selectionArgs, sortOrder);
+
+        // SQLiteBridgeContentProvider may return a null Cursor if the database hasn't been created yet.
+        // However, we need a non-null cursor in order to listen for notifications.
+        if (c == null) {
+            c = new MatrixCursor(projection != null ? projection : HomeItems.DEFAULT_PROJECTION);
         }
 
+        final ContentResolver cr = getContext().getContentResolver();
+        c.setNotificationUri(cr, getDatasetNotificationUri(datasetId));
+
         return c;
     }
 
     /**
      * Returns a cursor populated with static fake data.
      */
     private Cursor queryFakeItems(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
         JSONArray items = null;
@@ -105,27 +110,17 @@ public class HomeProvider extends SQLite
         } catch (IOException e) {
             Log.e(LOGTAG, "Error getting fake home items", e);
             return null;
         } catch (JSONException e) {
             Log.e(LOGTAG, "Error parsing fake_home_items.json", e);
             return null;
         }
 
-        final String[] itemsColumns = new String[] {
-            HomeItems._ID,
-            HomeItems.DATASET_ID,
-            HomeItems.URL,
-            HomeItems.TITLE,
-            HomeItems.DESCRIPTION,
-            HomeItems.IMAGE_URL,
-            HomeItems.FILTER
-        };
-
-        final MatrixCursor c = new MatrixCursor(itemsColumns);
+        final MatrixCursor c = new MatrixCursor(HomeItems.DEFAULT_PROJECTION);
         for (int i = 0; i < items.length(); i++) {
             try {
                 final JSONObject item = items.getJSONObject(i);
                 c.addRow(new Object[] {
                     item.getInt("id"),
                     item.getString("dataset_id"),
                     item.getString("url"),
                     item.getString("title"),
--- a/mobile/android/base/home/PanelGridView.java
+++ b/mobile/android/base/home/PanelGridView.java
@@ -14,54 +14,64 @@ import org.mozilla.gecko.home.HomeConfig
 import org.mozilla.gecko.home.HomePager.OnUrlOpenListener;
 import org.mozilla.gecko.home.PanelLayout.DatasetBacked;
 import org.mozilla.gecko.home.PanelLayout.FilterManager;
 import org.mozilla.gecko.home.PanelLayout.OnItemOpenListener;
 import org.mozilla.gecko.home.PanelLayout.PanelView;
 
 import android.content.Context;
 import android.database.Cursor;
+import android.util.Log;
 import android.view.View;
 import android.widget.AdapterView;
 import android.widget.GridView;
 
 public class PanelGridView extends GridView
                            implements DatasetBacked, PanelView {
     private static final String LOGTAG = "GeckoPanelGridView";
 
     private final ViewConfig viewConfig;
     private final PanelViewAdapter adapter;
     private PanelViewItemHandler itemHandler;
+    private OnItemOpenListener itemOpenListener;
 
     public PanelGridView(Context context, ViewConfig viewConfig) {
         super(context, null, R.attr.panelGridViewStyle);
 
         this.viewConfig = viewConfig;
         itemHandler = new PanelViewItemHandler(viewConfig);
 
         adapter = new PanelViewAdapter(context, viewConfig);
         setAdapter(adapter);
 
         setOnItemClickListener(new PanelGridItemClickListener());
     }
 
     @Override
+    public void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        itemHandler.setOnItemOpenListener(itemOpenListener);
+    }
+
+    @Override
     public void onDetachedFromWindow() {
         super.onDetachedFromWindow();
         itemHandler.setOnItemOpenListener(null);
     }
 
     @Override
     public void setDataset(Cursor cursor) {
+        Log.d(LOGTAG, "Setting dataset: " + viewConfig.getDatasetId());
         adapter.swapCursor(cursor);
     }
 
     @Override
     public void setOnItemOpenListener(OnItemOpenListener listener) {
         itemHandler.setOnItemOpenListener(listener);
+        itemOpenListener = listener;
     }
 
     @Override
     public void setFilterManager(FilterManager filterManager) {
         adapter.setFilterManager(filterManager);
         itemHandler.setFilterManager(filterManager);
     }
 
--- a/mobile/android/base/home/PanelListView.java
+++ b/mobile/android/base/home/PanelListView.java
@@ -22,54 +22,62 @@ import android.util.Log;
 import android.view.View;
 import android.widget.AdapterView;
 
 public class PanelListView extends HomeListView
                            implements DatasetBacked, PanelView {
 
     private static final String LOGTAG = "GeckoPanelListView";
 
-    private final PanelViewAdapter mAdapter;
-    private final ViewConfig mViewConfig;
-    private final PanelViewItemHandler mItemHandler;
+    private final ViewConfig viewConfig;
+    private final PanelViewAdapter adapter;
+    private final PanelViewItemHandler itemHandler;
+    private OnItemOpenListener itemOpenListener;
 
     public PanelListView(Context context, ViewConfig viewConfig) {
         super(context);
 
-        mViewConfig = viewConfig;
-        mItemHandler = new PanelViewItemHandler(viewConfig);
+        this.viewConfig = viewConfig;
+        itemHandler = new PanelViewItemHandler(viewConfig);
 
-        mAdapter = new PanelViewAdapter(context, viewConfig);
-        setAdapter(mAdapter);
+        adapter = new PanelViewAdapter(context, viewConfig);
+        setAdapter(adapter);
 
         setOnItemClickListener(new PanelListItemClickListener());
     }
 
+     @Override
+    public void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        itemHandler.setOnItemOpenListener(itemOpenListener);
+    }
+
     @Override
     public void onDetachedFromWindow() {
         super.onDetachedFromWindow();
-        mItemHandler.setOnItemOpenListener(null);
+        itemHandler.setOnItemOpenListener(null);
     }
 
     @Override
     public void setDataset(Cursor cursor) {
-        Log.d(LOGTAG, "Setting dataset: " + mViewConfig.getDatasetId());
-        mAdapter.swapCursor(cursor);
+        Log.d(LOGTAG, "Setting dataset: " + viewConfig.getDatasetId());
+        adapter.swapCursor(cursor);
     }
 
     @Override
     public void setOnItemOpenListener(OnItemOpenListener listener) {
-        mItemHandler.setOnItemOpenListener(listener);
+        itemHandler.setOnItemOpenListener(listener);
+        itemOpenListener = listener;
     }
 
     @Override
     public void setFilterManager(FilterManager filterManager) {
-        mAdapter.setFilterManager(filterManager);
-        mItemHandler.setFilterManager(filterManager);
+        adapter.setFilterManager(filterManager);
+        itemHandler.setFilterManager(filterManager);
     }
 
     private class PanelListItemClickListener implements AdapterView.OnItemClickListener {
         @Override
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-            mItemHandler.openItemAtPosition(mAdapter.getCursor(), position);
+            itemHandler.openItemAtPosition(adapter.getCursor(), position);
         }
     }
 }
--- a/mobile/android/base/tests/robocop.ini
+++ b/mobile/android/base/tests/robocop.ini
@@ -27,17 +27,16 @@ skip-if = android_version == "10"
 # disabled on 2.3; bug 979603
 skip-if = android_version == "10"
 [testBrowserSearchVisibility]
 [testClearPrivateData]
 # disabled on x86 and 2.3; bug 948591
 skip-if = android_version == "10" || processor == "x86"
 [testDistribution]
 [testDoorHanger]
-[testFilterOpenTab]
 # disabled on 2.3; bug 986172
 skip-if = android_version == "10"
 [testFindInPage]
 # disabled on Android 2.3; bug 975155
 skip-if = android_version == "10"
 [testFlingCorrectness]
 # disabled on x86 only; bug 927476
 skip-if = processor == "x86"
deleted file mode 100644
--- a/mobile/android/base/tests/testFilterOpenTab.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package org.mozilla.gecko.tests;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Callable;
-
-import org.mozilla.gecko.PrivateTab;
-import org.mozilla.gecko.Tab;
-import org.mozilla.gecko.TabsAccessor;
-import org.mozilla.gecko.db.BrowserContract;
-import org.mozilla.gecko.db.TabsProvider;
-
-import android.content.ContentProvider;
-import android.content.Context;
-import android.database.Cursor;
-
-/**
- * Tests that local tabs are filtered prior to upload.
- * - create a set of tabs and perists them through TabsAccessor.
- * - verifies that tabs are filtered by querying.
- */
-public class testFilterOpenTab extends ContentProviderTest {
-    private static final String[] TABS_PROJECTION_COLUMNS = new String[] {
-                                                                BrowserContract.Tabs.TITLE,
-                                                                BrowserContract.Tabs.URL,
-                                                                BrowserContract.Clients.GUID,
-                                                                BrowserContract.Clients.NAME
-                                                            };
-
-    private static final String LOCAL_TABS_SELECTION = BrowserContract.Tabs.CLIENT_GUID + " IS NULL";
-
-    /**
-     * Factory function that makes new ContentProvider instances.
-     * <p>
-     * We want a fresh provider each test, so this should be invoked in
-     * <code>setUp</code> before each individual test.
-     */
-    protected static Callable<ContentProvider> sTabProviderCallable = new Callable<ContentProvider>() {
-        @Override
-        public ContentProvider call() {
-            return new TabsProvider();
-        }
-    };
-
-    private Cursor getTabsFromLocalClient() throws Exception {
-        return mProvider.query(BrowserContract.Tabs.CONTENT_URI,
-                               TABS_PROJECTION_COLUMNS,
-                               LOCAL_TABS_SELECTION,
-                               null,
-                               null);
-    }
-
-    private Tab createTab(int id, String url, boolean external, int parentId, String title) {
-        return new Tab((Context) getActivity(), id, url, external, parentId, title);
-    }
-
-    private Tab createPrivateTab(int id, String url, boolean external, int parentId, String title) {
-        return new PrivateTab((Context) getActivity(), id, url, external, parentId, title);
-    }
-
-    @Override
-    public void setUp() throws Exception {
-        super.setUp(sTabProviderCallable, BrowserContract.TABS_AUTHORITY, "tabs.db");
-        mTests.add(new TestInsertLocalTabs());
-    }
-
-    public void testFilterOpenTab() throws Exception {
-        for (int i = 0; i < mTests.size(); i++) {
-            Runnable test = mTests.get(i);
-
-            setTestName(test.getClass().getSimpleName());
-            test.run();
-        }
-    }
-
-    private class TestInsertLocalTabs extends TestCase  {
-        @Override
-        public void test() throws Exception {
-            final String TITLE1 = "Google";
-            final String URL1 = "http://www.google.com/";
-            final String TITLE2 = "Mozilla Start Page";
-            final String URL2 = "about:home";
-            final String TITLE3 = "Chrome Weave URL";
-            final String URL3 = "chrome://weave/";
-            final String TITLE4 = "What You Cache Is What You Get";
-            final String URL4 = "wyciwyg://1/test.com";
-            final String TITLE5 = "Root Folder";
-            final String URL5 = "file:///";
-
-            // Create a list of local tabs.
-            List<Tab> tabs = new ArrayList<Tab>(6);
-            Tab tab1 = createTab(1, URL1, false, 0, TITLE1);
-            Tab tab2 = createTab(2, URL2, false, 0, TITLE2);
-            Tab tab3 = createTab(3, URL3, false, 0, TITLE3);
-            Tab tab4 = createTab(4, URL4, false, 0, TITLE4);
-            Tab tab5 = createTab(5, URL5, false, 0, TITLE5);
-            Tab tab6 = createPrivateTab(6, URL1, false, 0, TITLE1);
-            tabs.add(tab1);
-            tabs.add(tab2);
-            tabs.add(tab3);
-            tabs.add(tab4);
-            tabs.add(tab5);
-            tabs.add(tab6);
-
-            // Persist the created tabs.
-            TabsAccessor.persistLocalTabs(mResolver, tabs);
-
-            // Get the persisted tab and check if urls are filtered.
-            Cursor c = getTabsFromLocalClient();
-            assertCountIsAndClose(c, 1, 1 + " tabs entries found");
-        }
-    }
-
-    /**
-     * Assert that the provided cursor has the expected number of rows,
-     * closing the cursor afterwards.
-     */
-    private void assertCountIsAndClose(Cursor c, int expectedCount, String message) {
-        try {
-            mAsserter.is(c.getCount(), expectedCount, message);
-        } finally {
-            c.close();
-        }
-    }
-}
--- a/toolkit/themes/linux/global/global.css
+++ b/toolkit/themes/linux/global/global.css
@@ -305,16 +305,19 @@ notification > button {
 
 .autoscroller[scrolldir="EW"] {
   background-position: right bottom;
 }
 
 /* :::::: Close button icons ::::: */
 
 .close-icon {
+  -moz-appearance: none;
+  height: 16px;
+  width: 16px;
   background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 16, 16, 0);
   background-position: center center;
   background-repeat: no-repeat;
 }
 
 .close-icon:hover {
   background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 32, 16, 16);
 }
--- a/toolkit/themes/linux/global/notification.css
+++ b/toolkit/themes/linux/global/notification.css
@@ -47,19 +47,16 @@ notification[type="critical"] {
   list-style-image: url("moz-icon://stock/gtk-dialog-warning?size=menu");
 }
 
 .messageImage[type="critical"] {
   list-style-image: url("moz-icon://stock/gtk-dialog-error?size=menu");
 }
 
 .messageCloseButton {
-  -moz-appearance: none;
-  width: 16px;
-  height: 16px;
   padding-left: 11px;
   padding-right: 11px;
 }
 
 /* Popup notification */
 
 .popup-notification-description {
   max-width: 24em;
--- a/uriloader/exthandler/android/nsMIMEInfoAndroid.cpp
+++ b/uriloader/exthandler/android/nsMIMEInfoAndroid.cpp
@@ -12,35 +12,41 @@
 
 using namespace mozilla::widget::android;
 
 NS_IMPL_ISUPPORTS2(nsMIMEInfoAndroid, nsIMIMEInfo, nsIHandlerInfo)
 
 NS_IMETHODIMP
 nsMIMEInfoAndroid::LaunchDefaultWithFile(nsIFile* aFile)
 {
-  LaunchWithFile(aFile);
-  return NS_OK;
+  return LaunchWithFile(aFile);
 }
 
 NS_IMETHODIMP
 nsMIMEInfoAndroid::LoadUriInternal(nsIURI * aURI)
 {
   nsCString uriSpec;
   aURI->GetSpec(uriSpec);
 
   nsCString uriScheme;
   aURI->GetScheme(uriScheme);
 
-  return mozilla::widget::android::GeckoAppShell::OpenUriExternal(NS_ConvertUTF8toUTF16(uriSpec),
-    (mType.Equals(uriScheme) || mType.Equals(uriSpec)) ?
-     EmptyString() : NS_ConvertUTF8toUTF16(mType)) ? NS_OK : NS_ERROR_FAILURE;
+  nsAutoString mimeType;
+  if (mType.Equals(uriScheme) || mType.Equals(uriSpec)) {
+    mimeType = EmptyString();
+  } else {
+    mimeType = NS_ConvertUTF8toUTF16(mType);
+  }
+
+  if (GeckoAppShell::OpenUriExternal(NS_ConvertUTF8toUTF16(uriSpec), mimeType)) {
+    return NS_OK;
+  }
+  return NS_ERROR_FAILURE;
 }
 
-
 bool
 nsMIMEInfoAndroid::GetMimeInfoForMimeType(const nsACString& aMimeType,
                                           nsMIMEInfoAndroid** aMimeInfo)
 {
   nsRefPtr<nsMIMEInfoAndroid> info = new nsMIMEInfoAndroid(aMimeType);
   mozilla::AndroidBridge* bridge = mozilla::AndroidBridge::Bridge();
   // we don't have access to the bridge, so just assume we can handle
   // the mime type for now and let the system deal with it
@@ -53,44 +59,44 @@ nsMIMEInfoAndroid::GetMimeInfoForMimeTyp
 
   if (!IsUTF8(aMimeType, true))
     return false;
 
   NS_ConvertUTF8toUTF16 mimeType(aMimeType);
 
   bridge->GetHandlersForMimeType(mimeType,
                                  info->mHandlerApps, &systemDefault);
-  
+
   if (systemDefault)
     info->mPrefApp = systemDefault;
 
   nsAutoCString fileExt;
   bridge->GetExtensionFromMimeType(aMimeType, fileExt);
   info->SetPrimaryExtension(fileExt);
-  
+
   uint32_t len;
   info->mHandlerApps->GetLength(&len);
   if (len == 1) {
     info.forget(aMimeInfo);
     return false;
   }
-  
+
   info.forget(aMimeInfo);
   return true;
 }
-  
+
 bool
 nsMIMEInfoAndroid::GetMimeInfoForFileExt(const nsACString& aFileExt,
                                          nsMIMEInfoAndroid **aMimeInfo)
 {
   nsCString mimeType;
   if (mozilla::AndroidBridge::Bridge())
     mozilla::AndroidBridge::Bridge()->
       GetMimeTypeFromExtensions(aFileExt, mimeType);
-  
+
   // "*/*" means that the bridge didn't know.
   if (mimeType.Equals(nsDependentCString("*/*"), nsCaseInsensitiveCStringComparator()))
     return false;
 
   bool found = GetMimeInfoForMimeType(mimeType, aMimeInfo);
   (*aMimeInfo)->SetPrimaryExtension(aFileExt);
   return found;
 }
@@ -101,47 +107,47 @@ nsMIMEInfoAndroid::GetMimeInfoForFileExt
 nsresult
 nsMIMEInfoAndroid::GetMimeInfoForURL(const nsACString &aURL,
                                      bool *found,
                                      nsIHandlerInfo **info)
 {
   nsMIMEInfoAndroid *mimeinfo = new nsMIMEInfoAndroid(aURL);
   NS_ADDREF(*info = mimeinfo);
   *found = true;
-  
+
   mozilla::AndroidBridge* bridge = mozilla::AndroidBridge::Bridge();
   if (!bridge) {
     // we don't have access to the bridge, so just assume we can handle
     // the protocol for now and let the system deal with it
     return NS_OK;
   }
 
   nsIHandlerApp* systemDefault = nullptr;
   bridge->GetHandlersForURL(NS_ConvertUTF8toUTF16(aURL),
                             mimeinfo->mHandlerApps, &systemDefault);
-  
+
   if (systemDefault)
     mimeinfo->mPrefApp = systemDefault;
 
 
   nsAutoCString fileExt;
   nsAutoCString mimeType;
   mimeinfo->GetType(mimeType);
   bridge->GetExtensionFromMimeType(mimeType, fileExt);
   mimeinfo->SetPrimaryExtension(fileExt);
-  
+
   uint32_t len;
   mimeinfo->mHandlerApps->GetLength(&len);
   if (len == 1) {
     // Code that calls this requires an object regardless if the OS has
     // something for us, so we return the empty object.
     *found = false;
     return NS_OK;
   }
-  
+
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsMIMEInfoAndroid::GetType(nsACString& aType)
 {
   aType.Assign(mType);
   return NS_OK;
@@ -354,18 +360,17 @@ nsMIMEInfoAndroid::GetPossibleLocalHandl
   return NS_ERROR_NOT_IMPLEMENTED;
 }
 
 NS_IMETHODIMP
 nsMIMEInfoAndroid::LaunchWithFile(nsIFile *aFile)
 {
   nsCOMPtr<nsIURI> uri;
   NS_NewFileURI(getter_AddRefs(uri), aFile);
-  LoadUriInternal(uri);
-  return NS_OK;
+  return LoadUriInternal(uri);
 }
 
 nsMIMEInfoAndroid::nsMIMEInfoAndroid(const nsACString& aMIMEType) :
   mType(aMIMEType), mAlwaysAsk(true),
   mPrefAction(nsIMIMEInfo::useHelperApp)
 {
   mPrefApp = new nsMIMEInfoAndroid::SystemChooser(this);
   nsresult rv;