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 id24406
push userryanvm@gmail.com
push dateThu, 07 Mar 2013 17:19:02 +0000
treeherdermozilla-central@71395a927025 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone22.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..8ac6da55e749c22fce54ee6b59439f9d326eab3e
GIT binary patch
literal 3112
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
CtVw17
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..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)
+