Merge m-c to inbound.
authorRyan VanderMeulen <ryanvm@gmail.com>
Thu, 07 Mar 2013 10:15:44 -0500
changeset 124109 71395a927025084394dafbd2b6d084c32ea76eb4
parent 124108 814a0c94b2157293a978dd976273c28e9fb304b6 (current diff)
parent 123939 ee4879719f7884e7f2e88ad466c5aa5b5c1c2c4c (diff)
child 124110 0e7639e3bdfbe56b5e788f234cafb3c5074954cc
child 124111 b59dda6608abb8150838e1155d9860402905a065
push idunknown
push userunknown
push dateunknown
milestone22.0a1
Merge m-c to inbound.
browser/metro/locales/en-US/chrome/notification.dtd
--- a/browser/devtools/commandline/BuiltinCommands.jsm
+++ b/browser/devtools/commandline/BuiltinCommands.jsm
@@ -1,14 +1,19 @@
 /* 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/. */
 
 const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
 
+const BRAND_SHORT_NAME = Cc["@mozilla.org/intl/stringbundle;1"]
+                           .getService(Ci.nsIStringBundleService)
+                           .createBundle("chrome://branding/locale/brand.properties")
+                           .GetStringFromName("brandShortName");
+
 this.EXPORTED_SYMBOLS = [ "CmdAddonFlags", "CmdCommands" ];
 
 Cu.import("resource:///modules/devtools/gcli.jsm");
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/osfile.jsm")
 
 XPCOMUtils.defineLazyModuleGetter(this, "gDevTools",
@@ -1786,45 +1791,46 @@ XPCOMUtils.defineLazyModuleGetter(this, 
   *        Disables loading content from cache upon restart.
   *
   * Examples :
   * >> restart
   * - restarts browser immediately
   * >> restart --nocache
   * - restarts immediately and starts Firefox without using cache
   */
+
   gcli.addCommand({
     name: "restart",
-    description: gcli.lookup("restartFirefoxDesc"),
+    description: gcli.lookupFormat("restartBrowserDesc", [BRAND_SHORT_NAME]),
     params: [
       {
         name: "nocache",
         type: "boolean",
-        description: gcli.lookup("restartFirefoxNocacheDesc")
+        description: gcli.lookup("restartBrowserNocacheDesc")
       }
     ],
     returnType: "string",
     exec: function Restart(args, context) {
       let canceled = Cc["@mozilla.org/supports-PRBool;1"]
                       .createInstance(Ci.nsISupportsPRBool);
       Services.obs.notifyObservers(canceled, "quit-application-requested", "restart");
       if (canceled.data) {
-        return gcli.lookup("restartFirefoxRequestCancelled");
+        return gcli.lookup("restartBrowserRequestCancelled");
       }
 
       // disable loading content from cache.
       if (args.nocache) {
         Services.appinfo.invalidateCachesOnRestart();
       }
 
       // restart
       Cc['@mozilla.org/toolkit/app-startup;1']
         .getService(Ci.nsIAppStartup)
         .quit(Ci.nsIAppStartup.eAttemptQuit | Ci.nsIAppStartup.eRestart);
-      return gcli.lookup("restartFirefoxRestarting");
+      return gcli.lookupFormat("restartBrowserRestarting", [BRAND_SHORT_NAME]);
     }
   });
 }(this));
 
 /* CmdScreenshot ----------------------------------------------------------- */
 
 (function(module) {
   XPCOMUtils.defineLazyModuleGetter(this, "LayoutHelpers",
@@ -1857,18 +1863,18 @@ XPCOMUtils.defineLazyModuleGetter(this, 
             name: "clipboard",
             type: "boolean",
             description: gcli.lookup("screenshotClipboardDesc"),
             manual: gcli.lookup("screenshotClipboardManual")
           },
           {
             name: "chrome",
             type: "boolean",
-            description: gcli.lookup("screenshotChromeDesc"),
-            manual: gcli.lookup("screenshotChromeManual")
+            description: gcli.lookupFormat("screenshotChromeDesc2", [BRAND_SHORT_NAME]),
+            manual: gcli.lookupFormat("screenshotChromeManual2", [BRAND_SHORT_NAME])
           },
           {
             name: "delay",
             type: { name: "number", min: 0 },
             defaultValue: 0,
             description: gcli.lookup("screenshotDelayDesc"),
             manual: gcli.lookup("screenshotDelayManual")
           },
--- a/browser/devtools/commandline/gcli.jsm
+++ b/browser/devtools/commandline/gcli.jsm
@@ -7012,23 +7012,23 @@ define('gcli/promise', ['require', 'expo
 
   exports.defer = imported.Promise.defer;
   exports.resolve = imported.Promise.resolve;
   exports.reject = imported.Promise.reject;
 
 });
 define("text!gcli/ui/intro.html", [], "\n" +
   "<div>\n" +
-  "  <p>${l10n.introTextOpening}</p>\n" +
+  "  <p>${l10n.introTextOpening2}</p>\n" +
   "\n" +
   "  <p>\n" +
   "    ${l10n.introTextCommands}\n" +
   "    <span class=\"gcli-out-shortcut\" onclick=\"${onclick}\"\n" +
-  "        ondblclick=\"${ondblclick}\" data-command=\"help\">help</span>,\n" +
-  "    ${l10n.introTextKeys} <code>${l10n.introTextF1Escape}</code>.\n" +
+  "        ondblclick=\"${ondblclick}\" data-command=\"help\">help</span>\n" +
+  "    ${l10n.introTextKeys2} <code>${l10n.introTextF1Escape}</code>.\n" +
   "  </p>\n" +
   "\n" +
   "  <button onclick=\"${onGotIt}\" if=\"${showHideButton}\">${l10n.introTextGo}</button>\n" +
   "</div>\n" +
   "");
 
 /*
  * Copyright 2012, Mozilla Foundation and contributors
--- a/browser/devtools/markupview/MarkupView.jsm
+++ b/browser/devtools/markupview/MarkupView.jsm
@@ -144,20 +144,34 @@ MarkupView.prototype = {
       case Ci.nsIDOMKeyEvent.DOM_VK_DELETE:
       case Ci.nsIDOMKeyEvent.DOM_VK_BACK_SPACE:
         this.deleteNode(this._selectedContainer.node);
         break;
       case Ci.nsIDOMKeyEvent.DOM_VK_HOME:
         this.navigate(this._containers.get(this._rootNode.firstChild));
         break;
       case Ci.nsIDOMKeyEvent.DOM_VK_LEFT:
-        this.collapseNode(this._selectedContainer.node);
+        if (this._selectedContainer.expanded) {
+          this.collapseNode(this._selectedContainer.node);
+        } else {
+          let parent = this._selectionWalker().parentNode();
+          if (parent) {
+            this.navigate(parent.container);
+          }
+        }
         break;
       case Ci.nsIDOMKeyEvent.DOM_VK_RIGHT:
-        this.expandNode(this._selectedContainer.node);
+        if (!this._selectedContainer.expanded) {
+          this.expandNode(this._selectedContainer.node);
+        } else {
+          let next = this._selectionWalker().nextNode();
+          if (next) {
+            this.navigate(next.container);
+          }
+        }
         break;
       case Ci.nsIDOMKeyEvent.DOM_VK_UP:
         let prev = this._selectionWalker().previousNode();
         if (prev) {
           this.navigate(prev.container);
         }
         break;
       case Ci.nsIDOMKeyEvent.DOM_VK_DOWN:
--- a/browser/devtools/markupview/test/browser_inspector_markup_navigation.js
+++ b/browser/devtools/markupview/test/browser_inspector_markup_navigation.js
@@ -25,16 +25,24 @@ function test() {
     ["down", "*text*"],
     ["down", "node5"],
     ["down", "node6"],
     ["down", "*comment*"],
     ["down" , "node7"],
     ["right", "node7"],
     ["down", "*text*"],
     ["down", "node8"],
+    ["left", "node7"],
+    ["left", "node7"],
+    ["right", "node7"],
+    ["right", "*text*"],
+    ["right", "*text*"],
+    ["down", "node8"],
+    ["right", "node8"],
+    ["left", "node8"],
     ["down", "node9"],
     ["down", "node10"],
     ["down", "node11"],
     ["down", "node12"],
     ["right", "node12"],
     ["down", "*text*"],
     ["down", "node13"],
     ["down", "node14"],
--- a/browser/devtools/responsivedesign/CmdResize.jsm
+++ b/browser/devtools/responsivedesign/CmdResize.jsm
@@ -1,45 +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/. */
 
 const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
 
+const BRAND_SHORT_NAME = Cc["@mozilla.org/intl/stringbundle;1"].
+                         getService(Ci.nsIStringBundleService).
+                         createBundle("chrome://branding/locale/brand.properties").
+                         GetStringFromName("brandShortName");
+
 this.EXPORTED_SYMBOLS = [ ];
 
 Cu.import("resource:///modules/devtools/gcli.jsm");
 
 /* Responsive Mode commands */
 gcli.addCommand({
   name: 'resize',
   description: gcli.lookup('resizeModeDesc')
 });
 
 gcli.addCommand({
   name: 'resize on',
   description: gcli.lookup('resizeModeOnDesc'),
-  manual: gcli.lookup('resizeModeManual'),
+  manual: gcli.lookupFormat('resizeModeManual2', [BRAND_SHORT_NAME]),
   exec: gcli_cmd_resize
 });
 
 gcli.addCommand({
   name: 'resize off',
   description: gcli.lookup('resizeModeOffDesc'),
-  manual: gcli.lookup('resizeModeManual'),
+  manual: gcli.lookupFormat('resizeModeManual2', [BRAND_SHORT_NAME]),
   exec: gcli_cmd_resize
 });
 
 gcli.addCommand({
   name: 'resize toggle',
   buttonId: "command-button-responsive",
   buttonClass: "command-button",
   tooltipText: gcli.lookup("resizeModeToggleTooltip"),
   description: gcli.lookup('resizeModeToggleDesc'),
-  manual: gcli.lookup('resizeModeManual'),
+  manual: gcli.lookupFormat('resizeModeManual2', [BRAND_SHORT_NAME]),
   state: {
     isChecked: function(aTarget) {
       let browserWindow = aTarget.tab.ownerDocument.defaultView;
       let mgr = browserWindow.ResponsiveUI.ResponsiveUIManager;
       return mgr.isActiveForTab(aTarget.tab);
     },
     onChange: function(aTarget, aChangeHandler) {
       let browserWindow = aTarget.tab.ownerDocument.defaultView;
--- a/browser/devtools/shared/VariablesView.jsm
+++ b/browser/devtools/shared/VariablesView.jsm
@@ -4,17 +4,16 @@
  * 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 Ci = Components.interfaces;
 const Cu = Components.utils;
 
 const DBG_STRINGS_URI = "chrome://browser/locale/devtools/debugger.properties";
-const LAZY_EMPTY_DELAY = 150; // ms
 const LAZY_EXPAND_DELAY = 50; // ms
 const LAZY_APPEND_DELAY = 100; // ms
 const LAZY_APPEND_BATCH = 100; // nodes
 const PAGE_SIZE_SCROLL_HEIGHT_RATIO = 100;
 const PAGE_SIZE_MAX_JUMPS = 30;
 const SEARCH_ACTION_MAX_DELAY = 1000; // ms
 const ELEMENT_INPUT_DEFAULT_WIDTH = 100; // px
 const ELEMENT_INPUT_EXTRA_SPACE = 4; // px
@@ -100,17 +99,17 @@ VariablesView.prototype = {
 
   /**
    * Removes all items from this container.
    *
    * @param number aTimeout [optional]
    *        The number of milliseconds to delay the operation if
    *        lazy emptying of this container is enabled.
    */
-  empty: function VV_empty(aTimeout = LAZY_EMPTY_DELAY) {
+  empty: function VV_empty(aTimeout = this.lazyEmptyDelay) {
     // If there are no items in this container, emptying is useless.
     if (!this._store.size) {
       return;
     }
     // Check if this empty operation may be executed lazily.
     if (this.lazyEmpty && aTimeout > 0) {
       this._emptySoon(aTimeout);
       return;
@@ -165,16 +164,21 @@ VariablesView.prototype = {
       if (!this._store.size) {
         this._appendEmptyNotice();
         this._toggleSearchVisibility(false);
       }
     }.bind(this), aTimeout);
   },
 
   /**
+   * The amount of time (in milliseconds) it takes to empty this view lazily.
+   */
+  lazyEmptyDelay: 150,
+
+  /**
    * Specifies if this view may be emptied lazily.
    * @see VariablesView.prototype.empty
    */
   lazyEmpty: false,
 
   /**
    * Specifies if nodes in this view may be added lazily.
    * @see Scope.prototype._lazyAppend
@@ -2696,17 +2700,17 @@ VariablesView.prototype.commitHierarchy 
     // Dispatch this action after all the nodes have been drawn, so that
     // the transition efects can take place.
     this.window.setTimeout(function(aTarget) {
       aTarget.addEventListener("transitionend", function onEvent() {
         aTarget.removeEventListener("transitionend", onEvent, false);
         aTarget.removeAttribute("changed");
       }, false);
       aTarget.setAttribute("changed", "");
-    }.bind(this, currVariable.target), LAZY_EMPTY_DELAY + 1);
+    }.bind(this, currVariable.target), this.lazyEmptyDelay + 1);
   }
 };
 
 // Some variables are likely to contain a very large number of properties.
 // It would be a bad idea to re-expand them or perform expensive operations.
 VariablesView.prototype.commitHierarchyIgnoredItems = Object.create(null, {
   "window": { value: true },
   "this": { value: true }
--- a/browser/locales/en-US/chrome/browser/devtools/gcli.properties
+++ b/browser/locales/en-US/chrome/browser/devtools/gcli.properties
@@ -332,27 +332,27 @@ introDesc=Show the opening message
 # LOCALIZATION NOTE (introManual): A fuller description of the 'intro'
 # command. Displayed when the user asks for help on what it does.
 introManual=Redisplay the message that is shown to new users until they click the 'Got it!' button
 
 # LOCALIZATION NOTE (introTextOpening): The 'intro text' opens when the user
 # first opens the developer toolbar to explain the command line, and is shown
 # each time it is opened until the user clicks the 'Got it!' button. This
 # string is the opening paragraph of the intro text.
-introTextOpening=The Firefox command line is designed for developers. It focuses on speed of input over JavaScript syntax and a rich display over monospace output.
+introTextOpening2=This command line is designed for developers. It focuses on speed of input over JavaScript syntax and a rich display over monospace output.
 
 # LOCALIZATION NOTE (introTextCommands): For information about the 'intro
 # text' see introTextOpening. The second paragraph is in 2 sections, the first
 # section points the user to the 'help' command.
 introTextCommands=For a list of commands type
 
-# LOCALIZATION NOTE (introTextKeys): For information about the 'intro text'
+# LOCALIZATION NOTE (introTextKeys2): For information about the 'intro text'
 # see introTextOpening. The second section in the second paragraph points the
 # user to the F1/Escape keys which show and hide hints.
-introTextKeys=or to show/hide command hints press
+introTextKeys2=, or to show/hide command hints press
 
 # LOCALIZATION NOTE (introTextF1Escape): For information about the 'intro
 # text' see introTextOpening. This string is used with introTextKeys, and
 # contains the keys that are pressed to open and close hints.
 introTextF1Escape=F1/Escape
 
 # LOCALIZATION NOTE (introTextGo): For information about the 'intro text' see
 # introTextOpening. The text on the button that dismisses the intro text.
--- a/browser/locales/en-US/chrome/browser/devtools/gclicommands.properties
+++ b/browser/locales/en-US/chrome/browser/devtools/gclicommands.properties
@@ -68,22 +68,24 @@ screenshotClipboardDesc=Copy screenshot 
 # LOCALIZATION NOTE (screenshotClipboardManual) A fuller description of the
 # 'clipboard' parameter to the 'screenshot' command, displayed when the user
 # asks for help on what it does.
 screenshotClipboardManual=True if you want to copy the screenshot instead of saving it to a file.
 
 # LOCALIZATION NOTE (screenshotChromeDesc) A very short string to describe
 # the 'chrome' parameter to the 'screenshot' command, which is displayed in
 # a dialog when the user is using this command.
-screenshotChromeDesc=Capture Firefox chrome window? (true/false)
+# The argument (%1$S) is the browser name.
+screenshotChromeDesc2=Capture %1$S chrome window? (true/false)
 
 # LOCALIZATION NOTE (screenshotChromeManual) A fuller description of the
 # 'chrome' parameter to the 'screenshot' command, displayed when the user
 # asks for help on what it does.
-screenshotChromeManual=True if you want to take the screenshot of the Firefox window rather than the web page's content window.
+# The argument (%1$S) is the browser name.
+screenshotChromeManual2=True if you want to take the screenshot of the %1$S window rather than the web page's content window.
 
 # LOCALIZATION NOTE (screenshotGroupOptions) A label for the optional options of
 # the screenshot command.
 screenshotGroupOptions=Options
 
 # LOCALIZATION NOTE (screenshotDelayDesc) A very short string to describe
 # the 'delay' parameter to the 'screenshot' command, which is displayed in
 # a dialog when the user is using this command.
@@ -126,33 +128,35 @@ screenshotSavedToFile=Saved to
 # LOCALIZATION NOTE (screenshotErrorCopying) Text displayed to user upon
 # encountering error while copying the screenshot to clipboard.
 screenshotErrorCopying=Error occurred while copying to clipboard.
 
 # LOCALIZATION NOTE (screenshotCopied) Text displayed to user when the
 # screenshot is successfully copied to the clipboard.
 screenshotCopied=Copied to clipboard.
 
-# LOCALIZATION NOTE (restartFirefoxDesc) A very short description of the
+# LOCALIZATION NOTE (restartBrowserDesc) A very short description of the
 # 'restart' command. This string is designed to be shown in a menu alongside the
 # command name, which is why it should be as short as possible.
-restartFirefoxDesc=Restart Firefox
+# The argument (%1$S) is the browser name.
+restartBrowserDesc=Restart %1$S
 
-# LOCALIZATION NOTE (restartFirefoxNocacheDesc) A very short string to
+# LOCALIZATION NOTE (restartBrowserNocacheDesc) A very short string to
 # describe the 'nocache' parameter to the 'restart' command, which is
 # displayed in a dialog when the user is using this command.
-restartFirefoxNocacheDesc=Disables loading content from cache upon restart
+restartBrowserNocacheDesc=Disables loading content from cache upon restart
 
-# LOCALIZATION NOTE (restartFirefoxRequestCancelled) A string displayed to the
+# LOCALIZATION NOTE (restartBrowserRequestCancelled) A string displayed to the
 # user when a scheduled restart has been aborted by the user.
-restartFirefoxRequestCancelled=Restart request cancelled by user.
+restartBrowserRequestCancelled=Restart request cancelled by user.
 
-# LOCALIZATION NOTE (restartFirefoxRestarting) A string displayed to the
+# LOCALIZATION NOTE (restartBrowserRestarting) A string displayed to the
 # user when a restart has been initiated without a delay.
-restartFirefoxRestarting=Restarting Firefox…
+# The argument (%1$S) is the browser name.
+restartBrowserRestarting=Restarting %1$S…
 
 # LOCALIZATION NOTE (inspectDesc) A very short description of the 'inspect'
 # command. See inspectManual for a fuller description of what it does. This
 # string is designed to be shown in a menu alongside the command name, which
 # is why it should be as short as possible.
 inspectDesc=Inspect a node
 
 # LOCALIZATION NOTE (inspectManual) A fuller description of the 'inspect'
@@ -499,17 +503,18 @@ resizeModeToDesc=Alter page size
 
 # LOCALIZATION NOTE (resizeModeDesc) A very short string to describe the
 # 'resize' command. This string is designed to be shown in a menu
 # alongside the command name, which is why it should be as short as possible.
 resizeModeDesc=Control Responsive Design Mode
 
 # LOCALIZATION NOTE (resizeModeManual) A fuller description of the 'resize'
 # command, displayed when the user asks for help on what it does.
-resizeModeManual=Responsive websites respond to their environment, so they look good on a mobile display, a cinema display and everything in-between. Responsive Design Mode allows you to easily test a variety of page sizes in Firefox without needing to resize your whole browser.
+# The argument (%1$S) is the browser name.
+resizeModeManual2=Responsive websites respond to their environment, so they look good on a mobile display, a cinema display and everything in-between. Responsive Design Mode allows you to easily test a variety of page sizes in %1$S without needing to resize your whole browser.
 
 # LOCALIZATION NOTE (cmdDesc) A very short description of the 'cmd'
 # command. This string is designed to be shown in a menu alongside the command
 # name, which is why it should be as short as possible.
 cmdDesc=Manipulate the commands
 
 # LOCALIZATION NOTE (cmdRefreshDesc) A very short description of the 'cmd refresh'
 # command. This string is designed to be shown in a menu alongside the command
--- a/browser/metro/base/content/browser-ui.js
+++ b/browser/metro/base/content/browser-ui.js
@@ -983,16 +983,17 @@ var ContextUI = {
 
   /*******************************************
    * init
    */
 
   init: function init() {
     Elements.browsers.addEventListener("mousedown", this, true);
     Elements.browsers.addEventListener("touchstart", this, true);
+    Elements.browsers.addEventListener("AlertActive", this, true);
     window.addEventListener("MozEdgeUIGesture", this, true);
     window.addEventListener("keypress", this, true);
     window.addEventListener("KeyboardChanged", this, false);
 
     Elements.tray.addEventListener("transitionend", this, true);
 
     Appbar.init();
   },
@@ -1193,16 +1194,18 @@ var ContextUI = {
       case "MozEdgeUIGesture":
         this._onEdgeUIEvent(aEvent);
         break;
       case "mousedown":
         if (aEvent.button == 0 && this.isVisible)
           this.dismiss();
         break;
       case "touchstart":
+      // ContextUI can hide the notification bar. Workaround until bug 845348 is fixed.
+      case "AlertActive":
         this.dismiss();
         break;
       case "keypress":
         if (String.fromCharCode(aEvent.which) == "z" &&
             aEvent.getModifierState("Win"))
           this.toggle();
         break;
       case "transitionend":
--- a/browser/metro/base/content/browser.js
+++ b/browser/metro/base/content/browser.js
@@ -1255,16 +1255,17 @@ var PopupBlockerObserver = {
         var notificationBox = Browser.getNotificationBox();
         var notification = notificationBox.getNotificationWithValue("popup-blocked");
         if (notification) {
           notification.label = message;
         }
         else {
           var buttons = [
             {
+              isDefault: false,
               label: strings.GetStringFromName("popupButtonAllowOnce"),
               accessKey: null,
               callback: function() { PopupBlockerObserver.showPopupsForSite(); }
             },
             {
               label: strings.GetStringFromName("popupButtonAlwaysAllow2"),
               accessKey: null,
               callback: function() { PopupBlockerObserver.allowPopupsForSite(true); }
--- a/browser/metro/base/content/browser.xul
+++ b/browser/metro/base/content/browser.xul
@@ -145,16 +145,17 @@
     <key id="key_find" key="/" command="cmd_find"/>
     <key id="key_findNext" keycode="VK_F3" command="cmd_findNext"/>
     <key id="key_findNext2" key="g" modifiers="accel" command="cmd_findNext"/>
     <key id="key_findPrevious" keycode="VK_F3" modifiers="shift" command="cmd_findPrevious"/>
     <key id="key_findPrevious2" key="g" modifiers="accel,shift" command="cmd_findPrevious"/>
     <key id="key_quit" key="q" modifiers="accel" command="cmd_quit"/>
     <key id="key_addBoomkark" key="d" modifiers="accel" command="cmd_addBookmark"/>
     <key id="key_console" key="j" modifiers="accel,shift" oncommand="PanelUI.show('console-container')"/>
+    <key id="key_options" key="o" modifiers="accel,shift" oncommand="Elements.prefsFlyout.show()"/>
 
     <!-- manage tabs -->
     <key id="key_newTab" key="t" modifiers="accel" command="cmd_newTab"/>
     <key id="key_newTab2" key="n" modifiers="accel" command="cmd_newTab"/>
     <key id="key_closeTab" key="w" modifiers="accel" command="cmd_closeTab"/>
     <key id="key_closeTab2" keycode="VK_F4" modifiers="accel" command="cmd_closeTab"/>
     <key id="key_undoCloseTab" key="t" modifiers="accel,shift" command="cmd_undoCloseTab"/>
 
--- a/browser/metro/base/content/helperui/OfflineApps.js
+++ b/browser/metro/base/content/helperui/OfflineApps.js
@@ -31,31 +31,31 @@ var OfflineApps = {
 
     let notification = notificationBox.getNotificationWithValue(notificationID);
     let strings = Strings.browser;
     if (notification) {
       notification.documents.push(aRequest);
     } else {
       let buttons = [{
         label: strings.GetStringFromName("offlineApps.allow"),
-        accessKey: null,
+        accessKey: "",
         callback: function() {
           for (let i = 0; i < notification.documents.length; i++)
             OfflineApps.allowSite(notification.documents[i], aTarget);
         }
       },{
         label: strings.GetStringFromName("offlineApps.never"),
-        accessKey: null,
+        accessKey: "",
         callback: function() {
           for (let i = 0; i < notification.documents.length; i++)
             OfflineApps.disallowSite(notification.documents[i]);
         }
       },{
         label: strings.GetStringFromName("offlineApps.notNow"),
-        accessKey: null,
+        accessKey: "",
         callback: function() { /* noop */ }
       }];
 
       const priority = notificationBox.PRIORITY_INFO_LOW;
       let message = strings.formatStringFromName("offlineApps.available2", [host], 1);
       notification = notificationBox.appendNotification(message, notificationID, "", priority, buttons);
       notification.documents = [aRequest];
     }
--- a/browser/metro/base/content/prompt/alert.xul
+++ b/browser/metro/base/content/prompt/alert.xul
@@ -29,12 +29,12 @@
       <scrollbox orient="vertical" class="prompt-message" flex="1">
         <description id="prompt-alert-message"/>
       </scrollbox>
   
       <checkbox id="prompt-alert-checkbox" collapsed="true" pack="start" flex="1" />
     </vbox>
   
     <hbox class="prompt-buttons">
-      <button id="prompt-button-ok" class="prompt-button" label="&ok.label;" command="cmd_ok"/>
+      <button id="prompt-button-ok" class="prompt-button button-default" label="&ok.label;" command="cmd_ok"/>
     </hbox>
   </vbox>
 </dialog>
--- a/browser/metro/base/content/prompt/confirm.xul
+++ b/browser/metro/base/content/prompt/confirm.xul
@@ -29,13 +29,13 @@
       <scrollbox orient="vertical" class="prompt-message" flex="1">
         <description id="prompt-confirm-message"/>
       </scrollbox>
   
       <checkbox id="prompt-confirm-checkbox" collapsed="true" pack="start" flex="1"/>
     </vbox>
   
     <hbox id="prompt-confirm-buttons-box" class="prompt-buttons">
-      <button class="prompt-button" label="&ok.label;" command="cmd_ok"/>
+      <button class="prompt-button button-default" label="&ok.label;" command="cmd_ok"/>
       <button class="prompt-button" label="&cancel.label;" command="cmd_cancel"/>
     </hbox>
   </vbox>
 </dialog>
--- a/browser/metro/base/content/prompt/masterPassword.xul
+++ b/browser/metro/base/content/prompt/masterPassword.xul
@@ -33,13 +33,13 @@
       <label control="masterpassword-newpassword1" value="&setPassword.newPassword.label;"/>
       <textbox id="masterpassword-newpassword1" type="password" oninput="MasterPasswordUI.checkPassword();" flex="1"/>
       <label control="masterpassword-newpassword2" value="&setPassword.reenterPassword.label;"/>
       <textbox id="masterpassword-newpassword2" type="password" oninput="MasterPasswordUI.checkPassword();" flex="1"/>
       <separator/>
     </scrollbox>
   
     <hbox class="prompt-buttons">
-      <button class="prompt-button" label="&ok.label;" command="cmd_ok"/>
+      <button class="prompt-button button-default" label="&ok.label;" command="cmd_ok"/>
       <button class="prompt-button" label="&cancel.label;" command="cmd_cancel"/>
     </hbox>
   </vbox>
 </dialog>
--- a/browser/metro/base/content/prompt/promptPassword.xul
+++ b/browser/metro/base/content/prompt/promptPassword.xul
@@ -51,13 +51,13 @@
           </row>
         </rows>
       </grid>
     
       <checkbox id="prompt-password-checkbox" collapsed="true" pack="start" flex="1"/>
     </vbox>
   
     <hbox class="prompt-buttons">
-      <button class="prompt-button" label="&ok.label;" command="cmd_ok"/>
+      <button class="prompt-button button-default" label="&ok.label;" command="cmd_ok"/>
       <button class="prompt-button" label="&cancel.label;" command="cmd_cancel"/>
   </hbox>
   </vbox>
 </dialog>
--- a/browser/metro/base/content/prompt/removeMasterPassword.xul
+++ b/browser/metro/base/content/prompt/removeMasterPassword.xul
@@ -31,13 +31,13 @@
   
     <scrollbox orient="vertical" class="prompt-message" flex="1">
       <label control="masterpassword-oldpassword" value="&setPassword.oldPassword.label;"/>
       <textbox id="masterpassword-oldpassword" type="password" oninput="MasterPasswordUI.checkOldPassword();" flex="1"/>
       <separator/>
     </scrollbox>
   
     <hbox class="prompt-buttons">
-      <button class="prompt-button" label="&ok.label;" disabled="true" command="cmd_ok"/>
+      <button class="prompt-button button-default" label="&ok.label;" disabled="true" command="cmd_ok"/>
       <button class="prompt-button" label="&cancel.label;" command="cmd_cancel"/>
     </hbox>
   </vbox>
 </dialog>
--- a/browser/metro/base/content/prompt/select.xul
+++ b/browser/metro/base/content/prompt/select.xul
@@ -29,13 +29,13 @@
       <scrollbox orient="vertical" class="prompt-message" flex="1">
         <description id="prompt-select-message"/>
       </scrollbox>
   
       <menulist id="prompt-select-list"/>
     </vbox>
   
     <hbox class="prompt-buttons">
-      <button class="prompt-button" label="&ok.label;" command="cmd_ok"/>
+      <button class="prompt-button button-default" label="&ok.label;" command="cmd_ok"/>
       <button class="prompt-button" label="&cancel.label;" command="cmd_cancel"/>
     </hbox>
   </vbox>
 </dialog>
--- a/browser/metro/components/ContentPermissionPrompt.js
+++ b/browser/metro/components/ContentPermissionPrompt.js
@@ -6,41 +6,27 @@ const Ci = Components.interfaces;
 const Cr = Components.results;
 const Cu = Components.utils;
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 
 const kCountBeforeWeRemember = 5;
 
-function setPagePermission(type, principal, allow) {
-  let pm = Services.perms;
-  let contentPrefs = Services.contentPrefs;
-  let contentPrefName = type + ".request.remember";
-
-  if (!contentPrefs.hasPref(principal.URI, contentPrefName))
-      contentPrefs.setPref(principal.URI, contentPrefName, 0);
-
-  let count = contentPrefs.getPref(principal.URI, contentPrefName);
+const kEntities = {
+  "geolocation": "geolocation2",
+  "desktop-notification": "desktopNotification",
+  "indexedDB": "offlineApps",
+  "indexedDBQuota": "indexedDBQuota",
+  "openWebappsManage": "openWebappsManage"
+};
 
-  if (allow == false)
-    count--;
-  else
-    count++;
-
-  contentPrefs.setPref(principal.URI, contentPrefName, count);
-  if (count == kCountBeforeWeRemember)
-    pm.addFromPrincipal(principal, type, Ci.nsIPermissionManager.ALLOW_ACTION);
-  else if (count == -kCountBeforeWeRemember)
-    pm.addFromPrincipal(principal, type, Ci.nsIPermissionManager.DENY_ACTION);
-}
-
-const kEntities = { "geolocation": "geolocation", "desktop-notification": "desktopNotification",
-                    "indexedDB": "offlineApps", "indexedDBQuota": "indexedDBQuota",
-                    "openWebappsManage": "openWebappsManage" };
+const kIcons = {
+  geolocation: "chrome://browser/skin/images/infobar-geolocation.png"
+};
 
 function ContentPermissionPrompt() {}
 
 ContentPermissionPrompt.prototype = {
   classID: Components.ID("{C6E8C44D-9F39-4AF7-BCC0-76E38A8310F5}"),
 
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentPermissionPrompt]),
 
@@ -91,39 +77,47 @@ ContentPermissionPrompt.prototype = {
     let notificationBox = this.getNotificationBoxForRequest(request);
     let browserBundle = Services.strings.createBundle("chrome://browser/locale/browser.properties");
     
     let notification = notificationBox.getNotificationWithValue(request.type);
     if (notification)
       return;
 
     let entityName = kEntities[request.type];
+    let icon = kIcons[request.type] || "";
 
     let buttons = [{
       label: browserBundle.GetStringFromName(entityName + ".allow"),
-      accessKey: null,
+      accessKey: "",
       callback: function(notification) {
-        setPagePermission(request.type, request.principal, true);
         request.allow();
       }
     },
     {
-      label: browserBundle.GetStringFromName(entityName + ".dontAllow"),
-      accessKey: null,
+      label: browserBundle.GetStringFromName("contentPermissions.alwaysForSite"),
+      accessKey: "",
       callback: function(notification) {
-        setPagePermission(request.type, request.principal, false);
+        Services.perms.addFromPrincipal(request.principal, request.type, Ci.nsIPermissionManager.ALLOW_ACTION);
+        request.allow();
+      }
+    },
+    {
+      label: browserBundle.GetStringFromName("contentPermissions.neverForSite"),
+      accessKey: "",
+      callback: function(notification) {
+        Services.perms.addFromPrincipal(request.principal, request.type, Ci.nsIPermissionManager.DENY_ACTION);
         request.cancel();
       }
     }];
 
     let message = browserBundle.formatStringFromName(entityName + ".wantsTo",
                                                      [request.principal.URI.host], 1);
     let newBar = notificationBox.appendNotification(message,
                                                     request.type,
-                                                    "", // Notifications in Fennec do not display images.
+                                                    icon,
                                                     notificationBox.PRIORITY_WARNING_MEDIUM,
                                                     buttons);
   }
 };
 
 
 //module initialization
 this.NSGetFactory = XPCOMUtils.generateNSGetFactory([ContentPermissionPrompt]);
--- a/browser/metro/components/LoginManagerPrompter.js
+++ b/browser/metro/components/LoginManagerPrompter.js
@@ -145,17 +145,17 @@ LoginManagerPrompter.prototype = {
      */
     _showLoginNotification : function (aNotifyBox, aName, aText, aButtons) {
         var oldBar = aNotifyBox.getNotificationWithValue(aName);
         const priority = aNotifyBox.PRIORITY_INFO_MEDIUM;
 
         this.log("Adding new " + aName + " notification bar");
         var newBar = aNotifyBox.appendNotification(
                                 aText, aName,
-                                "chrome://mozapps/skin/passwordmgr/key.png",
+                                "chrome://browser/skin/images/infobar-key.png",
                                 priority, aButtons);
 
         // The page we're going to hasn't loaded yet, so we want to persist
         // across the first location change.
         newBar.persistence++;
 
         // Sites like Gmail perform a funky redirect dance before you end up
         // at the post-authentication page. I don't see a good way to
@@ -174,33 +174,28 @@ LoginManagerPrompter.prototype = {
      * _showSaveLoginNotification
      *
      * Displays a notification bar (rather than a popup), to allow the user to
      * save the specified login. This allows the user to see the results of
      * their login, and only save a login which they know worked.
      *
      */
     _showSaveLoginNotification : function (aNotifyBox, aLogin) {
-
         // Ugh. We can't use the strings from the popup window, because they
         // have the access key marked in the string (eg "Mo&zilla"), along
         // with some weird rules for handling access keys that do not occur
         // in the string, for L10N. See commonDialog.js's setLabelForNode().
         var neverButtonText =
-              this._getLocalizedString("notifyBarNeverForSiteButtonText");
+              this._getLocalizedString("notifyBarNotForThisSiteButtonText");
         var neverButtonAccessKey =
-              this._getLocalizedString("notifyBarNeverForSiteButtonAccessKey");
+              this._getLocalizedString("notifyBarNotForThisSiteButtonAccessKey");
         var rememberButtonText =
-              this._getLocalizedString("notifyBarRememberButtonText");
+              this._getLocalizedString("notifyBarRememberPasswordButtonText");
         var rememberButtonAccessKey =
-              this._getLocalizedString("notifyBarRememberButtonAccessKey");
-        var notNowButtonText =
-              this._getLocalizedString("notifyBarNotNowButtonText");
-        var notNowButtonAccessKey =
-              this._getLocalizedString("notifyBarNotNowButtonAccessKey");
+              this._getLocalizedString("notifyBarRememberPasswordButtonAccessKey");
 
         var brandShortName =
               this._brandBundle.GetStringFromName("brandShortName");
         var displayHost = this._getShortDisplayHost(aLogin.hostname);
         var notificationText;
         if (aLogin.username) {
             var displayUser = this._sanitizeUsername(aLogin.username);
             notificationText  = this._getLocalizedString(
@@ -232,24 +227,16 @@ LoginManagerPrompter.prototype = {
             // "Never for this site" button
             {
                 label:     neverButtonText,
                 accessKey: neverButtonAccessKey,
                 popup:     null,
                 callback: function(aNotificationBar, aButton) {
                     pwmgr.setLoginSavingEnabled(aLogin.hostname, false);
                 }
-            },
-
-            // "Not now" button
-            {
-                label:     notNowButtonText,
-                accessKey: notNowButtonAccessKey,
-                popup:     null,
-                callback:  function() { /* NOP */ } 
             }
         ];
 
         this._showLoginNotification(aNotifyBox, "password-save",
              notificationText, buttons);
     },
 
 
--- a/browser/metro/locales/en-US/chrome/browser.properties
+++ b/browser/metro/locales/en-US/chrome/browser.properties
@@ -47,48 +47,47 @@ identity.identified.verifier=Verified by
 identity.identified.verified_by_you=You have added a security exception for this site
 identity.identified.state_and_country=%S, %S
 identity.identified.title_with_country=%S (%S)
 identity.encrypted2=Encrypted
 identity.unencrypted2=Not encrypted
 identity.unknown.tooltip=This website does not supply identity information.
 identity.ownerUnknown2=(unknown)
 
+# ContentPermissionsPrompt
+contentPermissions.alwaysForSite=Always for this Site
+contentPermissions.neverForSite=Never for this Site
+
 # Geolocation UI
-geolocation.allow=Share
-geolocation.dontAllow=Don't share
-geolocation.wantsTo=%S wants your location.
+geolocation2.allow=Share Location
+geolocation2.wantsTo=Share your location with %S?
 
 # Desktop notification UI
 desktopNotification.allow=Allow
-desktopNotification.dontAllow=Don't allow
 desktopNotification.wantsTo=%S wants to use notifications.
 
 # Error Console
 typeError=Error:
 typeWarning=Warning:
 
 # Offline web applications
 offlineApps.available2=%S wants to store data on your device for offline use.
 offlineApps.allow=Allow
 offlineApps.never=Don't Allow
 offlineApps.notNow=Not Now
 
 # New-style ContentPermissionPrompt values
-offlineApps.dontAllow=Don't Allow
 offlineApps.wantsTo=%S wants to store data on your device for offline use.
 
 # IndexedDB Quota increases
 indexedDBQuota.allow=Allow
-indexedDBQuota.dontAllow=Don't Allow
 indexedDBQuota.wantsTo=%S wants to store a lot of data on your device for offline use.
 
 # Open Web Apps management API
 openWebappsManage.allow=Allow
-openWebappsManage.dontAllow=Don't Allow
 openWebappsManage.wantsTo=%S wants to manage applications on your device.
 
 # Bookmark List
 bookmarkList.desktop=Desktop Bookmarks
 
 # Closing Tabs
 tabs.closeWarningTitle=Confirm close
 
deleted file mode 100644
--- a/browser/metro/locales/en-US/chrome/notification.dtd
+++ /dev/null
@@ -1,12 +0,0 @@
-<!-- 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/. -->
-
-
-<!-- 
-     LOCALIZATION NOTE (geolocation.learnMore): Use the
-     unicode ellipsis char, \u2026,
-     or use "..." unless \u2026 doesn't suit traditions in your
-     locale.
--->
-<!ENTITY geolocation.learnMore         "Learn More…">
--- a/browser/metro/locales/en-US/overrides/passwordmgr.properties
+++ b/browser/metro/locales/en-US/overrides/passwordmgr.properties
@@ -6,24 +6,22 @@ rememberValue = Use Password Manager to 
 rememberPassword = Use Password Manager to remember this password.
 savePasswordTitle = Confirm
 # 1st string is product name, 2nd is the username for the login, 3rd is the
 #   login's hostname. Note that long usernames may be truncated.
 saveLoginText = Do you want %1$S to remember the password for "%2$S" on %3$S?
 # 1st string is product name, 2nd is the login's hostname
 saveLoginTextNoUsername = Do you want %1$S to remember this password on %2$S?
 promptNotNowButtonText = Not Now
-notifyBarNotNowButtonText = Not Now
-notifyBarNotNowButtonAccessKey =
 promptNeverForSiteButtonText = Never
-notifyBarNeverForSiteButtonText = Never
-notifyBarNeverForSiteButtonAccessKey =
+notifyBarNotForThisSiteButtonText = Not for this Site
+notifyBarNotForThisSiteButtonAccessKey =
 promptRememberButtonText = Remember
-notifyBarRememberButtonText = Remember
-notifyBarRememberButtonAccessKey =
+notifyBarRememberPasswordButtonText = Remember Password
+notifyBarRememberPasswordButtonAccessKey =
 passwordChangeTitle = Confirm Password Change
 passwordChangeText = Would you like to change the stored password for %S?
 passwordChangeTextNoUser = Would you like to change the stored password for this login?
 notifyBarChangeButtonText = Change
 notifyBarChangeButtonAccessKey =
 notifyBarDontChangeButtonText = Don't Change
 notifyBarDontChangeButtonAccessKey =
 userSelectText = Please confirm which user you are changing the password for
--- a/browser/metro/locales/jar.mn
+++ b/browser/metro/locales/jar.mn
@@ -10,17 +10,16 @@
 @AB_CD@.jar:
 % locale browser @AB_CD@ %locale/browser/
   locale/browser/aboutCertError.dtd       (%chrome/aboutCertError.dtd)
   locale/browser/browser.dtd              (%chrome/browser.dtd)
   locale/browser/browser.properties       (%chrome/browser.properties)
   locale/browser/config.dtd               (%chrome/config.dtd)
   locale/browser/preferences.dtd          (%chrome/preferences.dtd)
   locale/browser/checkbox.dtd             (%chrome/checkbox.dtd)
-  locale/browser/notification.dtd         (%chrome/notification.dtd)
   locale/browser/sync.dtd                 (%chrome/sync.dtd)
   locale/browser/sync.properties          (%chrome/sync.properties)
   locale/browser/prompt.dtd               (%chrome/prompt.dtd)
   locale/browser/phishing.dtd             (%chrome/phishing.dtd)
 
 @AB_CD@.jar:
 % locale browser @AB_CD@ %locale/browser/
   locale/browser/bookmarks.json           (bookmarks.json)
new file mode 100644
index 0000000000000000000000000000000000000000..8ac6da55e749c22fce54ee6b59439f9d326eab3e
GIT binary patch
literal 3112
zc$@(!4A=9CP)<h;3K|Lk000e1NJLTq004LZ001Zm1^@s6HR?Vk000Z`Nkl<Zc-rlo
z%a0Vt9mf}BbMVn5H<W9fTbw8&A(uwtYL2l9f+!JKvG5-N2WEEG#LF%_yEC)%+Ie>G
z3z85Cl*k90|G=D_vpJXuDF)jo2QLCmzMtK0)C|=%RkOQuuzdJxYN~#ZPd&P-dRV3g
zgMqiIE4_o#QR!l%6Wv_tt$o%GH@@mb8{Z+y)X|0ww)l*Z>j%DF^7(=tk!D-HwJ$o+
z=Aav^W6*FrKKK&D3-bHO*I)ahw|adLZv1tyy7~9P+Vz`*^&99Ph%$AwZQEdr&p3Rp
zV25k1eyts@Z*^C921G0Dp6VKEJ1zYJ8|e_DOdW05V2cmF#2^+n&Y=E$49J6KH@dCd
zSM>e72I`~+?F6Ds9c|cPI|;r{xUt2AiGhjq5<d76!-sFA!E&?vI}OCcoz8DOt+&HX
z)g6-#xONa*eDEa(v52X<w;lX__?|U8(H(tW(4ZWb0!JOk2VY|BHJ=vH!*D&B*xiX3
z#3H5(pAGC4t&)aT%s}VDK$G){>fYFGhlxQfViKDi<g)lU@#(y}tL^rz1|isuh(WBq
z;$yLFZ^KN^9*UU69>tdh_nNkWf6~cTfBmt(zf1jIikQSE2f4^;vA6MUX+jp%>0mEK
zOk(ebueWx6uzG#_jNKOzn;bU2mntfa&MUQ6?>4Kq*<Jlo-+x8@eu&uQAQw5wZMHS@
zt#ntv(Ios?oelOw#3qM7U;nlSKE6QhtH_Z|vXRfU`kK0EB$NA7>h@FQAQw5wZL~A<
zG4N;9$zVT44s!YM?QF|`;|ZIH$VE;Q-|%3+t;3rq<6D)FQa1^ai=5<E`BbXS%-36e
ztV_^)TD`#}L@si=@Ual04NdOmWJOML!)Kh}a=m?6H<pKVLgjPRO;Y3}w-~-s`Nwg+
zk+0tFUsI=oNs64K`6AtxZww*^+#p_a*iI2;v)%Z9<kp+O3w-I-*PsK{mF_1a-sy7E
zwC@DsBVD%HkUM@#lC5T#kF(~kR%?(Y4RTKkDf<W?d~G&5hws|>_|YU{0t{mC+x>OM
zw;<&yQx~_p_~oUUQGPJM_re61YOSBBb5Hcr|4ikd*(R609{Ef%wuzr*lHqtm3{PQ!
ziMnAvZI^#gM*@@d`qfMFs2oz~B5YHBy(~NZ+I1EN6QAmz^fmCjqYjID7KZE!DW5!b
zDIc3(KIJ!K^P?V?gfDTL)fvdlZ(1%7IezU)4)(5oK2zPa!=<BuZQ`dG_+?Hq46wk&
z_Y@zi_>NX@U=UkqZ<tSYVbX5#i-!4#m1PfuiI1DM+KuW)8|rhXU|7)kR!@_~);r`w
z9c{A74f`q93^B9v!IJPzEmc<z)>eA=wRaCx{;g%;3pjG1b3NxX-VUa-eYyo~(muo>
zR)!Be$6$d8wlrU(9lqb!Ae*GEJ2LU9KD7Cm_^8kF5yOR-_*%XDz12-k$_=AB(RQD6
z8U4-c0>|&o&+REwr#7Pxv51+K4;GkUBf(KYvvuB6`2Yb%O)`5ugTW`?nPd;!f-MIO
zV)+~<*kV2g^nq6OaVf}>{326M)rTIoku3)du%!94C2n7U`erfUyqRF1ImxtR=U|(Q
zZL{-9Fu^vpxZJ!1Y^k<Vcf9Qul7l{d2~hpCgH6FD2P`m&?P9`LX|!)?We20Qte%;2
zt3GtFiCl8PlICmm;>odyEmcoGKE{bteO@>80kYWSh(WAT`Cx*NbKqvZ)z_ECX@a<j
z%R+p1q|Xb^nQ6(`CLiZZ87wftmhde%I#&c9xJb5<fq`u+luT{J4?W^vN%OV)Yh2Jq
ziLE-Gz(y{k-+5bGQ@+G-$psT^Q(BGxR;LHWO5^8-z_zWlklrfz?1bxx^6=K=^;#vC
zH(`P;;gim3<p!>*)Z39OpKL>)*kU=K=4&ga>YYS>o__T)=P@36d^#R^V1kVs*(2Qy
z2gP#T_uoI+G74F%iaOe4<NeMome*l|E#~7)IjJ);@KL$eibnCtCiIQF(v99q^D*!q
z;yB=@&Y0&M#v+d`KE8QiV}iG;&F)~KTt7rWUzK>0d#f)6r%r9&lZ#-13AUJzZS;iV
z2A<-)jI#LD7LF4WmNefOgU=Sq#gTE(S;irc4YuPfBG{&Mo&Y(xR;rCP!AsjuaRkH*
zqHdh07r_D(Y%w2~h7*b#_^MoQMOl1m3&)8GOPY^(zETX{>lyc)WgPO@U^`9@*rwFU
zM=Fr$u=hkPRST?SZCOCPAnItFU#d=zF~P6H1Y5$_X!lR*$q9V4SZPF~_+%6M#udw3
zX+Gkq-dXG(HRI%(CmGun&m1tprpr>3ivknjb;+7rTrSW_&M^jy&w8teUZ}%HwqBDA
z3rw&je9}2V2d>iD6}j@sHuQ-NOPa44FCc?#3qR*E9(lt;wF)NK*ynFn>P+zR?_CpK
zEmjJZdW)y(x%hsqRGpTLZSrxRWU-uv3ATh!N5Kc`VBn&KQY|tu@U%+CHu;3E@x^i_
z%|{H?j}i-tbCI#mW%N65Yr~fqF1cWWjVJL^d1rE*e(0E8C>P4L6}A|jhV4(jtA5(S
zrr?qT7MR3#G2ts#>bG15U&lsd%B}j)!6tIa0ZW<>f2YZ9wDHMh?1*_54YJteh~YBH
zoZaxrsq$<6a>UE`=PFx&s{HU;sZgpm2UV>kI>jg7RX^=vYn@~mV1Y^Hqba@z>ez89
z$kP1ca%9S>`q0BRvgLpQmNXwbfa<fv)5H;jeJ-QVdD^jau+7D`)|@cG$98*AEAl?T
zDrf#<!(Zl?3X7FGtB}FaC);LY@ZtQ@bmoGP4>oBZVi3!+{U3t`CfHJZoGI_CV}VI?
z#Y$x0qmyBlkJ=&=AF;B0#BgDlPuu=|b^^7V6kn*!XRiG7@sVLV){H*HB4$=TSYU!J
zPEwu~G-tzR<^<0z=8EMSiP82zsBYA`ieCZS#7{BsyPRbY11vD{J;ld4c_(Y&Wz!qt
zBSx6CTl}J7K4N9r!(ifLabyiRi-$Lk#6IPh*AFdBh;fo=lTFU>_A*1vtbDK}e94)4
zL^Hmn)%;ZD%)foUGFQy0g9D_p^Q8&flwaoLk{bqCV4`k_@0qsIv+8_c($$4>FUg~F
zNS%wYP5Je*?8ps+iBI)g@tK}h)*S?&eCi%B$}gYto3Z&(4@<)Ld~nsVT6_js|77Qb
ztHqq;{cekoblGO3+#karmPTAR%*T^(x4zO1vNU_G)RRKWKEh{qq13b4DEFr}K6U`h
zWbw-$<6DsOlns+)^UF&!qx@h<^QA9EhqZzqaVDw!N9rah^8bn4Fu)SmoA{XIIdw9a
zoS59@xsiP3+N1c=W>j*{S0sa-)ej$hN5zLB%{K(O^p4IW&Y^Erp4gwwl8c<=RyqAX
zp2hcAdQTk+CLwZ>(}j;k5KqEHMNV=L^O>HcraHn?@}+LO`~HXT<RBM0m3zftW9BPW
zztQKJ{hnNMkjsZJe*K!L$Z6s;4EW+9okh2ICVBb4`u@xPnp|R&gIwe!x53WF_qDd9
zcdLzdupc5eImY2*z~e1-UqudbW$|Ub+PtPq$4ABT_LK5Iec$u{d`3*geoPMK`WHDZ
z_BOun=8EM7bu`#Z5mT|Z#^uw1f3)+C-ICh-B4U%n#%Fo8S$tJ1qPbA2a&WUkK33hX
zw`^h%i<rbF2e~XhE_}TAeX4Wvj5;0cM#Lc2Uhyd&uR41^xx^&)C_V?!;ye1q=b?hJ
zB|g<5zNxz3NC$j6jE{Ubh(Ro3s_vA7uMgj|s|%$&`n;gmh2v7-Dtz!I#$NNyD;7^0
zuQ1EI6fuZ3@5tu{dA0Z>Z2=9vhiz$9a{(J@3%jS)Q&Zb1=}qad^eUoE9c|cPix0lU
zAQmxQa*xkfd7!Q9mY&8BG->Dc<HSj=`V)vUb+loF?Iie=bBoCl0~6&XeDEcP51;Rk
z6-N~Kss`piN;L2hKKK&DBj@*$Z%(;bOkCc!C%oE>Cw)hhsiO@WZ0E-08xwTlpmbEa
zq$l*Iwzkjo6nw31;|Zcn9c|cPi_aLje&E|B-~R#F$|CV}g-zc80000<MNUMnLSTZQ
CtVw17
new file mode 100644
index 0000000000000000000000000000000000000000..6e229eac1ccced40cc72b642c837188c8165d29c
GIT binary patch
literal 1144
zc$@)v1c&>HP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000C(Nkl<Zc-pm>
z%XZUd6orjDfv)5!FfYJEB#)4^uhT#*-z3YjtefR~5@<W%Ez(iR1JL3bglXt%GEw*U
zcUc%O#n`NPa2Chs?6dd&FH%q`%d(Ba3)4Ntksl9(FdbjU!|BIlH2aqzr$!G9*iCsi
z5w3KjK^zZfH-pJVHk!T8Cg;Cq(~I8}zZ2xtOb-lLW|;k60|-A>RFmQCb~t+_0VB9k
zfMteRaaeF|WuO!EpZ1c`pIS}6+KFPUd^mk&Vti)m1o?6uY`!aSz$MPY-6#@&uJioB
z3LqdxXRot#e4eR3*J@6+y$9*!oRyj&SM88q*dPBTEHn8$TyVm@)_~hfDk8XMfYq`Z
zRuJ^ZbM<~w{IJ04;^hM5OB`je%rHBa5xC%l8;v3Z3_j5<emj_&A#<VnqqD3Vrf<~S
zUv(Z0CKxn9zS4(}r{)X}xZs3a8dqo)7>KO}cqF%ays}O&aoT=dE;_p~ov_U&$cr$V
zeI&7#xZunerJA*D0N_(?&)rZC0Rqx_T|hv;D1--Vg8V)l9B{!277esiuPhsg`*O)G
z=0f@LVD5CIbuSaPSa)M&f_xnoE;!*v11)JL#(?dG`#P7Kftp+z&QrCYX+B_}a||~c
zXrYNVjUzoGrq~~wOZQ&2@(v7?;YI^3G|?_OUKqu4ma3tDDOMTSMZmqRg*LbUG8s<I
z#f#+1>4t~9G5|LkXrYO=-h9cY{|(IKYMKSfP;a%AqsYVdf^1tcW|leNgc}XC&_o*p
zxBOTaUeMp#05jj>MZ2Vz%`NA#CID`2fSGUcqOEs8^oesJLOs)dlp?5RoJZ63w>H4c
zG6$S+qp{FKyVU9gmz)g+0FAbPu&YZb?n5-tLKE#$-SMJ@GcHQa_ICCd!Yz$_r_nB1
zE%%5m!ci|C$W`xe)gJss1Si~RpoJ#drE1gNw>!ZNj%d1SsCN9&2H=Dn4YZ{B8SRC;
zgiAuR8}_+$^J=5Lw|+$(NKBBg!@>n8+-RVMCOrc<Z8#Ne&m92V$ti$y)$jdtEIe2f
z<oDs=fD2BrXrQI~Gx}eEb;oLVLjWeo<=lB$cglqZTtCN>7hyE}=(N#pI4iu;sx2^I
zz%~0xt<|}5{V3~di#&zn1-cLIH|p&dJm(@zh@$rde0y5J3=X*9gc}X@eq1$R;ziA_
z)NSt?AVb_#9IG~0?^sdJ4YYkQCde0cFkqQs77j3Q!i~n-|CYb7TF+~C=fh%{VA$3<
zt3H?eQ*Ggae&>C1YV@?iclymt-iHfLxHtMRIk8$5ZT-~>5jn@g&0nokqo*9>(O1Ud
zf^(}+vy*D`@rl*6>UQT25{Mz(EJ7p9EF5rs_s8ik)#fv8U0iFqpPTJ2#H^HU%>~J+
z(E}swKblFH-Rk3Xy^+SA;#eyR^$h=EHQj3o-4W!}=z#&dDer#(04ZuQHE=8d0000<
KMNUMnLSTaL^d`^%
new file mode 100644
index 0000000000000000000000000000000000000000..721cca40370a2786e5f5992e70e08eb8af88775e
GIT binary patch
literal 1001
zc$@+00~Y*=P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000B9Nkl<Zc-p;I
z%T7~K6xD%IA|{S>ib+Wrh=yp42@Z&lFd;ZF8WW8q`UC37nTdb`ZEt(u?^jEqfHQwU
zXFd`KPDBkdK%*kjCJLmXa$LLC@aP45FU7%1@44N3t#$U^=d?Q*V|9U~J2Bv{W@nz8
zUT)6va?7SW{0ZyFcz+u>5R_LB;Re}o70b_++-#l^oa`ubG5|jRu1#-v9<g_Topmz+
zvV*GSKXZrkEIay;dBbC~n(dRwIp7%34Rf4<N;oiL!xYxzc)w@M21L!?3-MQ8ZmcYx
z&6f=<L!c)p7NYm4N);2?dKi#UUWiYSfif~9;|#qo;k%0)<XolMfDwl08<7nNsue?7
zmmo+6*1*q=GYnr5F<l#&h}-@ML#t*GvpcGR1O^K`o(KfB#c;BVh&vOIyHB?>a~Mj7
z=blIg6w{kTznPB;Yy=O3388sjG1~*GkR}6?Zcl_32Vo<K%e(ad0T)%$EWd!9<LfxO
zXb!QF_n{4>WusYlGBoiuAYZ-@RMY#4yw+75M~OqVyoJyPQj#8{WSsrlfRjQ)rx@;M
z<Th70T2MtYwiw00HI$Fa8wzyvWZjuTeiP7%Q-B$8!nJ@CwQjgB+8}c>BcVZqr<m?L
zz$XJ}#c1u~g4!l(R?z|pN*WC?PWdK){xfi1uh~FSP!GYtEG`)$+7ieBj^Yn+?hknc
zjkw`tXcrN&vik(D^oP2N<7xS_tlK3rV7l4JDED5{UxTlKcxx1wE{LjC(vb`UkwH68
z%lb#~#cKXF97;)Df?^gmBu5b?)0B(q(a^mFUsKJ0NCr8v6MZkLrb|RMpdw~COoE`K
zSq$bGC#qB6x(V!Bud#`^(1CKz<IECiAQTAUWGq4G7ffR9GF~?3u}g>vw}30akpTY9
z4GbiO_LQXkBmocy0wtxL%_8<Na498fC9D_ld^*g@suoZ1CqPty0EAWykQstpDJ}Y0
zKy2Hpyz@W@Jx4b1AdzlM3d(m9s0gkR=4E|4!OKrj))$C98AKS_!2Ni-738y`YLZwL
z==~5UrYN?a_#-})YDuJ}F9L~c76ey7YZB)Kg&|I<yMg|pR4kqnKM0CJy{$q;ynwi~
zKy$qfpzr)!^p=FGASgOZ^73T=AoqxZw*$E8!~%97Aa0b)-Z#jdqQGr8uo`JeW0;9)
zlzgghAlbIP1~{QaEf4^{0{mF8-hpIe2%_i)utVI_!Xof(Fv(BjGI`TGka+q(#0kFv
Xk1AUFa&B)B00000NkvXXu0mjfPYt{@
--- a/browser/metro/theme/jar.mn
+++ b/browser/metro/theme/jar.mn
@@ -33,16 +33,19 @@ chrome.jar:
   skin/images/tab-crop.png                  (images/tab-crop.png)
   skin/images/tab-overlay.png               (images/tab-overlay.png)
   skin/images/tab-selection-left.png        (images/tab-selection-left.png)
   skin/images/tab-selection-right.png       (images/tab-selection-right.png)
   skin/images/identity-icons-generic.png    (images/identity-icons-generic.png)
   skin/images/identity-icons-https-ev.png   (images/identity-icons-https-ev.png)
   skin/images/identity-icons-https-mixed.png  (images/identity-icons-https-mixed.png)
   skin/images/identity-icons-https.png      (images/identity-icons-https.png)
+  skin/images/infobar-close.png             (images/infobar-close.png)
+  skin/images/infobar-geolocation.png       (images/infobar-geolocation.png)
+  skin/images/infobar-key.png               (images/infobar-key.png)
   skin/images/firefox-watermark.png         (images/firefox-watermark.png)
   skin/images/flyout-back-button.png        (images/flyout-back-button.png)
   skin/images/about-footer.png              (images/about-footer.png)
   skin/images/button-bg.png                 (images/button-bg.png)
   skin/images/arrowleft-16.png              (images/arrowleft-16.png)
   skin/images/arrowright-16.png             (images/arrowright-16.png)
   skin/images/arrowup-16.png                (images/arrowup-16.png)
   skin/images/arrowdown-16.png              (images/arrowdown-16.png)
--- a/browser/metro/theme/platform.css
+++ b/browser/metro/theme/platform.css
@@ -11,17 +11,16 @@
 
 /* Typography & General Styling -------------------------------------------- */
 
 :root {
   font-family: "Segoe UI", sans-serif !important;
   font-size: @font_normal@;
 }
 
-button,
 textbox,
 menulist {
   -moz-appearance: none;
   min-width: @field_sizing@; /* button size */
   min-height: @field_sizing@; /* button size */
   margin: @metro_spacing_small@;
   padding: @metro_spacing_xsmall@ @metro_spacing_small@;
 
@@ -29,30 +28,91 @@ menulist {
   font-weight: normal !important;
 
   color: @field_foreground_color@;
   background: @field_background_color@;
   border: @metro_border_thick@ solid @field_foreground_color@ !important;
   border-radius: 0;
 }
 
-button[disabled="true"],
 textbox[disabled="true"],
 menulist[disabled="true"] {
   border-color: @field_disabled_foreground_color@ !important;
   color: @field_disabled_foreground_color@;
 }
 
-button:not([disabled]):hover:active,
-button:not([disabled])[checked="true"],
 menulist:not([disabled]):hover:active {
   color: @field_background_color@;
   background: @field_foreground_color@;
 }
 
+
+/* Button ------------------------------------------------------------------ */
+
+button {
+  -moz-appearance: none;
+  border: 1px solid;
+  font-size: @metro_font_normal@;
+  font-weight: normal;
+  margin: @metro_spacing_small@;
+  min-width: @field_sizing@;
+  min-height: 32px;
+  padding: 3px 16px;
+}
+
+/* Non-default button colors */
+
+button {
+  background: linear-gradient(to bottom, hsl(210, 5%, 89%), hsl(210, 5%, 87%));
+  border-color: hsl(220, 5%, 86%);
+  color: hsl(0, 0%, 10%);
+}
+
+button:not([disabled]):hover {
+  background: linear-gradient(to bottom, hsl(210, 5%, 75%), hsl(210, 5%, 73%));
+  border-color: hsl(210, 5%, 71%);
+  color: hsl(0, 0%, 10%);
+}
+
+/* Default button colors */
+
+.button-default,
+.notification-button-default {
+  background: linear-gradient(to bottom, hsl(35, 100%, 50%), hsl(30, 100%, 50%));
+  border-color: hsl(30, 100%, 48%);
+  color: white;
+}
+
+.button-default:not([disabled]):hover,
+.notification-button-default:not([disabled]):hover {
+  background: linear-gradient(to bottom, hsl(25, 100%, 47%), hsl(25, 100%, 45%));
+  border-color: hsl(25, 100%, 43%);
+  color: white;
+}
+
+/* Pushed button colors (both default and non-default */
+
+/* Note: these need enough specificity to override all the :hover rules above. */
+button:not([disabled]):hover:active,
+button:not([disabled])[checked="true"],
+.button-default:not([disabled])[checked="true"],
+.notification-button-default:not([disabled])[checked="true"] {
+  background: linear-gradient(to bottom, hsl(210, 5%, 28%), hsl(210, 5%, 25%));
+  border-color: hsl(216, 4%, 27%);
+  color: white;
+}
+
+/* Disabled button colors (both default and non-default */
+
+button[disabled] {
+  background: linear-gradient(to bottom, hsl(210, 3%, 93%), hsl(210, 3%, 92%));
+  border-color: hsl(210, 3%, 91%);
+  color: hsl(0, 0%, 60%);
+}
+
 /* Textbox ----------------------------------------------------------------- */
 
 textbox[isempty="true"] {
   color: @field_mid_foreground_color@;
 }
 
 .link {
   color: blue;
@@ -313,16 +373,72 @@ richlistitem[selected="true"] .show-on-s
 richlistitem .hide-on-select {
   visibility: visible;
 }
 
 richlistitem[typeName="message"] {
   border-bottom: 0;
 }
 
+/* Notification box ("info app bar") ---------------------------------------- */
+
+notification {
+  background: hsl(0, 0%, 98%);
+  border-bottom: 1px solid hsla(0, 0%, 0%, .07);
+  box-shadow: 0 0 10px hsla(0, 0%, 0%, .1);
+  min-height: 64px;
+}
+
+.notification-inner {
+  border-style: none;
+}
+
+.notification-button {
+  -moz-margin-start: 0;
+  -moz-margin-end: 20px;
+}
+
+.messageImage {
+  width: 32px;
+  height: 32px;
+  -moz-margin-start: 40px;
+  -moz-margin-end: 16px;
+}
+
+/* If there is no image set, collapse the image but keep the starting margin */
+.messageImage:not([src]) {
+  width: 0;
+  -moz-margin-end: 0;
+}
+
+.messageText {
+  margin: 0;
+}
+
+.messageCloseButton {
+  list-style-image: url("chrome://browser/skin/images/infobar-close.png");
+  padding: 0;
+  -moz-margin-start: 0;
+  -moz-margin-end: 40px;
+  -moz-image-region: rect(0, 40px, 40px, 0);
+}
+
+.messageCloseButton > .toolbarbutton-icon {
+  margin: 0;
+}
+
+.messageCloseButton:hover {
+  -moz-image-region: rect(0, 80px, 40px, 40px);
+}
+
+.messageCloseButton:hover:active {
+  -moz-image-region: rect(0, 120px, 40px, 80px);
+}
+
+
 /* Rich Grid ---------------------------------------------------------------- */
 
 richgrid {
   display: -moz-box;
   -moz-box-sizing: border-box;
 }
 
 richgrid .meta-grid {
--- a/browser/themes/linux/devtools/inspector.css
+++ b/browser/themes/linux/devtools/inspector.css
@@ -62,17 +62,16 @@
   background-color: transparent;
   border-style: solid;
   border-width: 1px 13px 2px 13px;
   color: hsl(210,30%,85%);
   width: 85px; /* Can't use max-width. See bug 723132 */
   /* The content of the button can be larger than the button */
   overflow: hidden;
   min-height: 25px;
-
   margin: 0 -11px 0 0;
   padding: 0 9px;
 }
 
 .inspector-breadcrumbs-button:-moz-focusring > label {
   border-bottom: 1px dotted hsla(210,30%,85%,0.4);
 }
 
@@ -95,127 +94,127 @@
 
 .inspector-breadcrumbs-pseudo-classes {
   color: hsl(20, 100%, 85%);
 }
 
 /* Highlighter toolbar - breadcrumbs - LTR */
 
 .inspector-breadcrumbs-button {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:not([checked]):hover:active {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle-pressed.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button[checked] {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle-selected.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle-selected.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button[checked]:hover:active {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle-selected-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle-selected-pressed.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type:not([checked]):hover:active {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start-pressed.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type[checked] {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start-selected.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start-selected.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type[checked]:hover:active {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start-selected-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start-selected-pressed.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:last-of-type {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end.png") 1 13 2 13 fill stretch;
 }
 
 #inspector-breadcrumbs[overflows] > .inspector-breadcrumbs-button:-moz-locale-dir(ltr):first-of-type {
   border-left-width: 0;
 }
 
 #inspector-breadcrumbs[overflows] > .inspector-breadcrumbs-button:-moz-locale-dir(ltr):last-of-type {
   border-right-width: 0;
 }
 
 .inspector-breadcrumbs-button:last-of-type:not([checked]):hover:active {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end-pressed.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:last-of-type[checked] {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end-selected.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end-selected.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:last-of-type[checked]:hover:active {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end-selected-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end-selected-pressed.png") 1 13 2 13 fill stretch;
 }
 
 /* Highlighter toolbar - breadcrumbs - RTL */
 
 .inspector-breadcrumbs-button:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:not([checked]):hover:active:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle-pressed.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button[checked]:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle-selected.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle-selected.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button[checked]:hover:active:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle-selected-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle-selected-pressed.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type:not([checked]):hover:active:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start-pressed.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type[checked]:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start-selected.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start-selected.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type[checked]:hover:active:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start-selected-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start-selected-pressed.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:last-of-type:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end.png") 1 13 2 13 fill stretch;
 }
 
 #inspector-breadcrumbs[overflows] > .inspector-breadcrumbs-button:-moz-locale-dir(rtl):first-of-type {
   border-right-width: 0;
 }
 
 #inspector-breadcrumbs[overflows] > .inspector-breadcrumbs-button:last-of-type:-moz-locale-dir(rtl) {
   border-left-width: 0;
 }
 
 .inspector-breadcrumbs-button:last-of-type:not([checked]):hover:active:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end-pressed.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:last-of-type[checked]:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end-selected.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end-selected.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:last-of-type[checked]:hover:active:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end-selected-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end-selected-pressed.png") 1 13 2 13 fill stretch;
 }
 
 #inspector-searchbox {
   transition-property: max-width, -moz-padding-end, -moz-padding-start;
   transition-duration: 250ms;
   transition-timing-function: ease;
 }
 
--- a/browser/themes/osx/devtools/inspector.css
+++ b/browser/themes/osx/devtools/inspector.css
@@ -77,17 +77,16 @@
   -moz-appearance: none;
   border-style: solid;
   border-width: 1px 13px 2px 13px;
   color: hsl(210,30%,85%);
   width: 85px; /* Can't use max-width. See bug 723132 */
   /* The content of the button can be larger than the button */
   overflow: hidden;
   min-height: 25px;
-
   margin: 0 -11px 0 0;
   padding: 0 9px;
 }
 
 .inspector-breadcrumbs-button:-moz-focusring > label {
   border-bottom: 1px dotted hsla(210,30%,85%,0.4);
 }
 
@@ -110,127 +109,127 @@
 
 .inspector-breadcrumbs-pseudo-classes {
   color: hsl(20, 100%, 85%);
 }
 
 /* Highlighter toolbar - breadcrumbs - LTR */
 
 .inspector-breadcrumbs-button {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:not([checked]):hover:active {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle-pressed.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button[checked] {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle-selected.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle-selected.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button[checked]:hover:active {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle-selected-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle-selected-pressed.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type:not([checked]):hover:active {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start-pressed.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type[checked] {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start-selected.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start-selected.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type[checked]:hover:active {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start-selected-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start-selected-pressed.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:last-of-type {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end.png") 1 13 2 13 fill stretch;
 }
 
 #inspector-breadcrumbs[overflows] > .inspector-breadcrumbs-button:-moz-locale-dir(ltr):first-of-type {
   border-left-width: 0;
 }
 
 #inspector-breadcrumbs[overflows] > .inspector-breadcrumbs-button:-moz-locale-dir(ltr):last-of-type {
   border-right-width: 0;
 }
 
 .inspector-breadcrumbs-button:last-of-type:not([checked]):hover:active {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end-pressed.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:last-of-type[checked] {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end-selected.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end-selected.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:last-of-type[checked]:hover:active {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end-selected-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end-selected-pressed.png") 1 13 2 13 fill stretch;
 }
 
 /* Highlighter toolbar - breadcrumbs - RTL */
 
 .inspector-breadcrumbs-button:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:not([checked]):hover:active:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle-pressed.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button[checked]:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle-selected.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle-selected.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button[checked]:hover:active:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle-selected-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle-selected-pressed.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type:not([checked]):hover:active:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start-pressed.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type[checked]:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start-selected.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start-selected.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type[checked]:hover:active:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start-selected-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start-selected-pressed.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:last-of-type:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end.png") 1 13 2 13 fill stretch;
 }
 
 #inspector-breadcrumbs[overflows] > .inspector-breadcrumbs-button:-moz-locale-dir(rtl):first-of-type {
   border-right-width: 0;
 }
 
 #inspector-breadcrumbs[overflows] > .inspector-breadcrumbs-button:last-of-type:-moz-locale-dir(rtl) {
   border-left-width: 0;
 }
 
 .inspector-breadcrumbs-button:last-of-type:not([checked]):hover:active:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end-pressed.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:last-of-type[checked]:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end-selected.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end-selected.png") 1 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:last-of-type[checked]:hover:active:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end-selected-pressed.png") 1 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end-selected-pressed.png") 1 13 2 13 fill stretch;
 }
 
 #inspector-searchbox {
   transition-property: max-width, -moz-padding-end, -moz-padding-start;
   transition-duration: 250ms;
   transition-timing-function: ease;
 }
 
--- a/browser/themes/windows/devtools/inspector.css
+++ b/browser/themes/windows/devtools/inspector.css
@@ -99,127 +99,127 @@
 
 .inspector-breadcrumbs-pseudo-classes {
   color: hsl(20, 100%, 85%);
 }
 
 /* Highlighter toolbar - breadcrumbs - LTR */
 
 .inspector-breadcrumbs-button {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle.png") 2 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:not([checked]):hover:active {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle-pressed.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle-pressed.png") 2 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button[checked] {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle-selected.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle-selected.png") 2 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button[checked]:hover:active {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle-selected-pressed.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-middle-selected-pressed.png") 2 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start.png") 2 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type:not([checked]):hover:active {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start-pressed.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start-pressed.png") 2 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type[checked] {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start-selected.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start-selected.png") 2 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type[checked]:hover:active {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start-selected-pressed.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-start-selected-pressed.png") 2 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:last-of-type {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end.png") 2 13 2 13 fill stretch;
 }
 
 #inspector-breadcrumbs[overflows] > .inspector-breadcrumbs-button:-moz-locale-dir(ltr):first-of-type {
   border-left-width: 0;
 }
 
 #inspector-breadcrumbs[overflows] > .inspector-breadcrumbs-button:-moz-locale-dir(ltr):last-of-type {
   border-right-width: 0;
 }
 
 .inspector-breadcrumbs-button:last-of-type:not([checked]):hover:active {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end-pressed.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end-pressed.png") 2 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:last-of-type[checked] {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end-selected.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end-selected.png") 2 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:last-of-type[checked]:hover:active {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end-selected-pressed.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/ltr-end-selected-pressed.png") 2 13 2 13 fill stretch;
 }
 
 /* Highlighter toolbar - breadcrumbs - RTL */
 
 .inspector-breadcrumbs-button:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle.png") 2 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:not([checked]):hover:active:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle-pressed.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle-pressed.png") 2 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button[checked]:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle-selected.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle-selected.png") 2 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button[checked]:hover:active:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle-selected-pressed.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-middle-selected-pressed.png") 2 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start.png") 2 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type:not([checked]):hover:active:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start-pressed.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start-pressed.png") 2 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type[checked]:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start-selected.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start-selected.png") 2 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:first-of-type[checked]:hover:active:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start-selected-pressed.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-start-selected-pressed.png") 2 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:last-of-type:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end.png") 2 13 2 13 fill stretch;
 }
 
 #inspector-breadcrumbs[overflows] > .inspector-breadcrumbs-button:-moz-locale-dir(rtl):first-of-type {
   border-right-width: 0;
 }
 
 #inspector-breadcrumbs[overflows] > .inspector-breadcrumbs-button:last-of-type:-moz-locale-dir(rtl) {
   border-left-width: 0;
 }
 
 .inspector-breadcrumbs-button:last-of-type:not([checked]):hover:active:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end-pressed.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end-pressed.png") 2 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:last-of-type[checked]:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end-selected.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end-selected.png") 2 13 2 13 fill stretch;
 }
 
 .inspector-breadcrumbs-button:last-of-type[checked]:hover:active:-moz-locale-dir(rtl) {
-  -moz-border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end-selected-pressed.png") 2 13 2 13 fill stretch;
+  border-image: url("chrome://browser/skin/devtools/breadcrumbs/rtl-end-selected-pressed.png") 2 13 2 13 fill stretch;
 }
 
 #inspector-searchbox {
   transition-property: max-width, -moz-padding-end, -moz-padding-start;
   transition-duration: 250ms;
   transition-timing-function: ease;
 }
 
--- a/build/mach_bootstrap.py
+++ b/build/mach_bootstrap.py
@@ -33,16 +33,17 @@ MACH_MODULES = [
     'layout/tools/reftest/mach_commands.py',
     'python/mach/mach/commands/commandinfo.py',
     'python/mozboot/mozboot/mach_commands.py',
     'python/mozbuild/mozbuild/config.py',
     'python/mozbuild/mozbuild/mach_commands.py',
     'python/mozbuild/mozbuild/frontend/mach_commands.py',
     'testing/mochitest/mach_commands.py',
     'testing/xpcshell/mach_commands.py',
+    'tools/mach_commands.py',
 ]
 
 def bootstrap(topsrcdir):
     # Ensure we are running Python 2.7+. We put this check here so we generate a
     # user-friendly error message rather than a cryptic stack trace on module
     # import.
     if sys.version_info[0] != 2 or sys.version_info[1] < 7:
         print('Python 2.7 or above (but not Python 3) is required to run mach.')
new file mode 100644
--- /dev/null
+++ b/tools/mach_commands.py
@@ -0,0 +1,56 @@
+# 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/.
+
+from __future__ import unicode_literals
+
+from mach.decorators import (
+    CommandArgument,
+    CommandProvider,
+    Command,
+)
+
+
+@CommandProvider
+class SearchProvider(object):
+    @Command('mxr', help='Search for something in MXR.')
+    @CommandArgument('term', nargs='+', help='Term(s) to search for.')
+    def mxr(self, term):
+        import webbrowser
+        term = ' '.join(term)
+        uri = 'https://mxr.mozilla.org/mozilla-central/search?string=%s' % term
+        webbrowser.open_new_tab(uri)
+
+    @Command('dxr', help='Search for something in DXR.')
+    @CommandArgument('term', nargs='+', help='Term(s) to search for.')
+    def dxr(self, term):
+        import webbrowser
+        term = ' '.join(term)
+        uri = 'http://dxr.mozilla.org/search?tree=mozilla-central&q=%s' % term
+        webbrowser.open_new_tab(uri)
+
+    @Command('mdn', help='Search for something on MDN.')
+    @CommandArgument('term', nargs='+', help='Term(s) to search for.')
+    def mdn(self, term):
+        import webbrowser
+        term = ' '.join(term)
+        uri = 'https://developer.mozilla.org/search?q=%s' % term
+        webbrowser.open_new_tab(uri)
+
+    @Command('google', help='Search for something on Google.')
+    @CommandArgument('term', nargs='+', help='Term(s) to search for.')
+    def google(self, term):
+        import webbrowser
+        term = ' '.join(term)
+        uri = 'https://www.google.com/search?q=%s' % term
+        webbrowser.open_new_tab(uri)
+
+    @Command('search', help='Search for something on the Internets. '
+        'This will open 3 new browser tabs and search for the term on Google, '
+        'MDN, and MXR.')
+    @CommandArgument('term', nargs='+', help='Term(s) to search for.')
+    def search(self, term):
+        self.google(term)
+        self.mdn(term)
+        self.mxr(term)
+