Merge m-c to b2g-inbound
authorWes Kocher <wkocher@mozilla.com>
Tue, 22 Oct 2013 11:19:19 -0400
changeset 151580 fb6e7e47499b0b97a7bff221b4becb6648b771ae
parent 151541 c3507f112ba8ac527abd9e6d8851d462cd210c20 (current diff)
parent 151579 177bf37a49f5b55eb00f2ce6d295fdc6b56cdb76 (diff)
child 151581 b90b9e4df250d592b1de43e1abc7cff24d5580a5
child 151592 a7c3da1f3af7b3f478aa6a6cdb4aae93ae22f466
push id1765
push userkwierso@gmail.com
push dateTue, 22 Oct 2013 15:19:31 +0000
treeherderb2g-inbound@fb6e7e47499b [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone27.0a1
Merge m-c to b2g-inbound
mobile/android/services/android-drawable-hdpi-resources.mn
mobile/android/services/android-drawable-ldpi-resources.mn
mobile/android/services/android-drawable-mdpi-resources.mn
mobile/android/services/android-drawable-resources.mn
mobile/android/services/android-layout-resources.mn
mobile/android/services/android-values-resources.mn
mobile/android/services/java-sources.mn
mobile/android/services/java-third-party-sources.mn
mobile/android/services/preprocess-sources.mn
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -670,18 +670,16 @@ pref("pfs.datasource.url", "https://pfs.
 pref("plugins.hide_infobar_for_blocked_plugin", false);
 pref("plugins.hide_infobar_for_outdated_plugin", false);
 
 pref("plugins.update.url", "https://www.mozilla.org/%LOCALE%/plugincheck/");
 pref("plugins.update.notifyUser", false);
 
 pref("plugins.click_to_play", true);
 
-pref("plugins.clickToActivateInfo.url", "https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/clicktoplay");
-
 // let all plugins except Flash default to click-to-play
 pref("plugin.default.state", 1);
 pref("plugin.state.flash", 2);
 
 // display door hanger if flash not installed
 pref("plugins.notifyMissingFlash", true);
 
 #ifdef XP_WIN
--- a/browser/base/content/browser-plugins.js
+++ b/browser/base/content/browser-plugins.js
@@ -700,17 +700,17 @@ var gPluginHandler = {
       // TODO: allow the blocklist to specify a better link, bug 873093
       if (pluginInfo.blocklistState == Ci.nsIBlocklistService.STATE_VULNERABLE_UPDATE_AVAILABLE) {
         url = Services.urlFormatter.formatURLPref("plugins.update.url");
       }
       else if (pluginInfo.blocklistState != Ci.nsIBlocklistService.STATE_NOT_BLOCKED) {
         url = Services.blocklist.getPluginBlocklistURL(pluginInfo.pluginTag);
       }
       else {
-        url = Services.urlFormatter.formatURLPref("plugins.clickToActivateInfo.url");
+        url = Services.urlFormatter.formatURLPref("app.support.baseURL") + "clicktoplay";
       }
       pluginInfo.detailsLink = url;
 
       centerActions.push(pluginInfo);
     }
 
     if (centerActions.length == 0) {
       // TODO: this is a temporary band-aid to avoid broken doorhangers
old mode 100755
new mode 100644
--- a/browser/devtools/inspector/inspector-panel.js
+++ b/browser/devtools/inspector/inspector-panel.js
@@ -21,16 +21,43 @@ loader.lazyGetter(this, "SelectorSearch"
 
 const LAYOUT_CHANGE_TIMER = 250;
 
 /**
  * Represents an open instance of the Inspector for a tab.
  * The inspector controls the highlighter, the breadcrumbs,
  * the markup view, and the sidebar (computed view, rule view
  * and layout view).
+ *
+ * Events:
+ * - ready
+ *      Fired when the inspector panel is opened for the first time and ready to
+ *      use
+ * - new-root
+ *      Fired after a new root (navigation to a new page) event was fired by
+ *      the walker, and taken into account by the inspector (after the markup
+ *      view has been reloaded)
+ * - markuploaded
+ *      Fired when the markup-view frame has loaded
+ * - layout-change
+ *      Fired when the layout of the inspector changes
+ * - breadcrumbs-updated
+ *      Fired when the breadcrumb widget updates to a new node
+ * - layoutview-updated
+ *      Fired when the layoutview (box model) updates to a new node
+ * - markupmutation
+ *      Fired after markup mutations have been processed by the markup-view
+ * - computed-view-refreshed
+ *      Fired when the computed rules view updates to a new node
+ * - computed-view-property-expanded
+ *      Fired when a property is expanded in the computed rules view
+ * - computed-view-property-collapsed
+ *      Fired when a property is collapsed in the computed rules view
+ * - rule-view-refreshed
+ *      Fired when the rule view updates to a new node
  */
 function InspectorPanel(iframeWindow, toolbox) {
   this._toolbox = toolbox;
   this._target = toolbox._target;
   this.panelDoc = iframeWindow.document;
   this.panelWin = iframeWindow;
   this.panelWin.inspector = this;
 
@@ -315,16 +342,17 @@ InspectorPanel.prototype = {
         return;
       }
       this.selection.setNodeFront(defaultNode, "navigateaway");
 
       this._initMarkup();
       this.once("markuploaded", () => {
         this.markup.expandNode(this.selection.nodeFront);
         this.setupSearchBox();
+        this.emit("new-root");
       });
     });
   },
 
   _selectionCssSelector: null,
 
   /**
    * Set the currently selected node unique css selector.
--- a/browser/devtools/inspector/test/browser_inspector_bug_922125_destroy_on_navigate.js
+++ b/browser/devtools/inspector/test/browser_inspector_bug_922125_destroy_on_navigate.js
@@ -5,62 +5,81 @@ let Toolbox = devtools.Toolbox;
 let TargetFactory = devtools.TargetFactory;
 
 function test() {
   waitForExplicitFinish();
 
   const URL_1 = "data:text/html;charset=UTF-8,<div id='one' style='color:red;'>ONE</div>";
   const URL_2 = "data:text/html;charset=UTF-8,<div id='two' style='color:green;'>TWO</div>";
 
-  let inspector;
+  let toolbox, inspector;
 
   // open tab, load URL_1, and wait for load to finish
   let tab = gBrowser.selectedTab = gBrowser.addTab();
   let target = TargetFactory.forTab(gBrowser.selectedTab);
+  let deferred = promise.defer();
   let browser = gBrowser.getBrowserForTab(tab);
 
-  function onPageOneLoad() {
-    browser.removeEventListener("load", onPageOneLoad, true);
+  function onTabLoad() {
+    browser.removeEventListener("load", onTabLoad, true);
+    deferred.resolve(null);
+  }
+  browser.addEventListener("load", onTabLoad, true);
+  browser.loadURI(URL_1);
 
-    gDevTools.showToolbox(target).then(aToolbox => {
-      return aToolbox.selectTool("inspector");
-    }).then(i => {
+  // open devtools panel
+  deferred.promise.then(() => {
+    return gDevTools.showToolbox(target, null, Toolbox.HostType.BOTTOM);
+  }).then(aToolbox => {
+    toolbox = aToolbox;
+  }).then(() => {
+    // select the inspector
+    return toolbox.selectTool("inspector").then(i => {
       inspector = i;
 
       // Verify we are on page one
       let testNode = content.document.querySelector("#one");
       ok(testNode, "We have the test node on page 1");
 
       assertMarkupViewIsLoaded();
+    });
+  }).then(() => {
+    // navigate to URL_2
+    let deferred = promise.defer();
 
-      // Listen to will-navigate to check if the view is empty
-      target.on("will-navigate", () => {
-        info("Navigation to page 2 has started, the inspector should be empty");
-        assertMarkupViewIsEmpty();
-      });
-      inspector.once("markuploaded", () => {
-        info("Navigation to page 2 was done, the inspector should be back up");
+    // Listen to will-navigate to check if the view is empty
+    target.on("will-navigate", () => {
+      info("Navigation to page 2 has started, the inspector should be empty");
+      assertMarkupViewIsEmpty();
+    });
+    inspector.once("new-root", () => {
+      info("Navigation to page 2 was done, the inspector should be back up");
 
-        // Verify we are on page one
-        let testNode = content.document.querySelector("#two");
-        ok(testNode, "We have the test node on page 2");
+      // Verify we are on page one
+      let testNode = content.document.querySelector("#two");
+      ok(testNode, "We have the test node on page 2");
+
+      // On page 2 load, verify we have the right content
+      assertMarkupViewIsLoaded();
 
-        // On page 2 load, verify we have the right content
-        assertMarkupViewIsLoaded();
-        endTests();
+      inspector.selection.setNode(content.document.querySelector("#two"));
+      inspector.once("inspector-updated", () => {
+        deferred.resolve();
       });
+    });
 
-      // Navigate to page 2
+    inspector.selection.setNode(content.document.querySelector("#one"));
+    inspector.once("inspector-updated", () => {
       browser.loadURI(URL_2);
     });
-  }
 
-  // Navigate to page 1
-  browser.addEventListener("load", onPageOneLoad, true);
-  browser.loadURI(URL_1);
+    return deferred.promise;
+  }).then(() => {
+    endTests();
+  });
 
   function assertMarkupViewIsLoaded() {
     let markupViewBox = inspector.panelDoc.getElementById("markup-box");
     is(markupViewBox.childNodes.length, 1, "The markup-view is loaded");
   }
 
   function assertMarkupViewIsEmpty() {
     let markupViewBox = inspector.panelDoc.getElementById("markup-box");
--- a/browser/metro/base/content/bindings/bindings.xml
+++ b/browser/metro/base/content/bindings/bindings.xml
@@ -189,18 +189,24 @@
         <![CDATA[
           let box = this.inputField.parentNode;
           box.showContextMenu(this, event, false);
         ]]>
       </handler>
       <handler event="click" phase="capturing">
         <![CDATA[
         if (event.mozInputSource == Ci.nsIDOMMouseEvent.MOZ_SOURCE_TOUCH) {
-          SelectionHelperUI.attachEditSession(ChromeSelectionHandler,
-                                              event.clientX, event.clientY);
+          if (typeof SelectionHelperUI != 'undefined') {
+            SelectionHelperUI.attachEditSession(ChromeSelectionHandler,
+                                                event.clientX, event.clientY);
+          } else {
+            // If we don't have access to SelectionHelperUI then we are using this
+            // binding for browser content (e.g. about:config)
+            Services.obs.notifyObservers(event, "attach_edit_session_to_content", "");
+          }
         }
       ]]>
       </handler>
     </handlers>
   </binding>
 
   <binding id="search-textbox" extends="chrome://global/content/bindings/textbox.xml#search-textbox">
     <implementation>
@@ -282,16 +288,22 @@
           ContextMenuUI.showContextMenu({ target: aTextbox, json: json });
         ]]></body>
       </method>
     </implementation>
     <handlers>
       <handler event="click" phase="capturing">
         <![CDATA[
           if (event.mozInputSource == Ci.nsIDOMMouseEvent.MOZ_SOURCE_TOUCH) {
-            SelectionHelperUI.attachEditSession(ChromeSelectionHandler,
-                                                event.clientX, event.clientY);
+            if (typeof SelectionHelperUI != 'undefined') {
+              SelectionHelperUI.attachEditSession(ChromeSelectionHandler,
+                                                  event.clientX, event.clientY);
+            } else {
+              // If we don't have access to SelectionHelperUI then we are using this
+              // binding for browser content (e.g. about:config)
+              Services.obs.notifyObservers(event, "attach_edit_session_to_content", "");
+            }
           }
         ]]>
       </handler>
     </handlers>
   </binding>
 </bindings>
--- a/browser/metro/base/content/browser-ui.js
+++ b/browser/metro/base/content/browser-ui.js
@@ -107,16 +107,17 @@ var BrowserUI = {
     // Init core UI modules
     ContextUI.init();
     PanelUI.init();
     FlyoutPanelsUI.init();
     PageThumbs.init();
     NewTabUtils.init();
     SettingsCharm.init();
     NavButtonSlider.init();
+    SelectionHelperUI.init();
 
     // We can delay some initialization until after startup.  We wait until
     // the first page is shown, then dispatch a UIReadyDelayed event.
     messageManager.addMessageListener("pageshow", function onPageShow() {
       if (getBrowser().currentURI.spec == "about:blank")
         return;
 
       messageManager.removeMessageListener("pageshow", onPageShow);
--- a/browser/metro/base/content/config.js
+++ b/browser/metro/base/content/config.js
@@ -2,38 +2,45 @@
  * 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/. */
 
 let Ci = Components.interfaces;
 
 Components.utils.import("resource://gre/modules/Services.jsm");
 
 var ViewConfig = {
+  get _main() {
+    delete this._main;
+    return this._main = document.getElementById("main-container");
+  },
+
   get _container() {
     delete this._container;
     return this._container = document.getElementById("prefs-container");
   },
 
   get _editor() {
     delete this._editor;
     return this._editor = document.getElementById("editor");
   },
 
   init: function init() {
+    this._main.addEventListener("click", this, false);
     window.addEventListener("resize", this, false);
     window.addEventListener("prefchange", this, false);
     window.addEventListener("prefnew", this, false);
 
     this._handleWindowResize();
     this.filter("");
 
     document.getElementById("textbox").focus();
   },
 
   uninit: function uninit() {
+    this._main.removeEventListener("click", this, false);
     window.removeEventListener("resize", this, false);
     window.removeEventListener("prefchange", this, false);
     window.removeEventListener("prefnew", this, false);
   },
 
   filter: function filter(aValue) {
     let row = document.getElementById("editor-row");
 
@@ -163,27 +170,37 @@ var ViewConfig = {
       case "resize":
         this._handleWindowResize();
         break;
 
       case "prefchange":
       case "prefnew":
         this._handlePrefChange(aEvent.detail, aEvent.type == "prefnew");
         break;
+
+      case "click":
+        this._onClick();
+        break;
     }
   },
 
   _handleWindowResize: function _handleWindowResize() {
     let mainBox = document.getElementById("main-container");
     let textbox = document.getElementById("textbox");
     let height = window.innerHeight - textbox.getBoundingClientRect().height;
 
     mainBox.setAttribute("height", height);
   },
 
+  _onClick: function () {
+    // Blur the search box when tapping anywhere else in the content
+    // in order to close the soft keyboard.
+    document.getElementById("textbox").blur();
+  },
+
   _handlePrefChange: function _handlePrefChange(aIndex, aNew) {
     let isEditing = !this._editor.hidden;
     let shouldUpdateEditor = false;
     if (isEditing) {
       let setting = document.getElementById("editor-setting");
       let editorIndex = Utils.getPrefIndex(setting.getAttribute("pref"));
       shouldUpdateEditor = (aIndex == editorIndex);
       if(shouldUpdateEditor || aIndex > editorIndex)
--- a/browser/metro/base/content/contenthandlers/Content.js
+++ b/browser/metro/base/content/contenthandlers/Content.js
@@ -179,16 +179,22 @@ let Content = {
         // the autocomplete.  Perhaps the user used backspace or delete.
         if (!aEvent.target.value)
           this.formAssistant.close();
         else
           this.formAssistant.open(aEvent.target);
         break;
 
       case "click":
+        // Workaround for bug 925457: we sometimes don't recognize the
+        // correct tap target or are unable to identify if it's editable.
+        // Instead always save tap co-ordinates for the keyboard to look for
+        // when it is up.
+        SelectionHandler.onClickCoords(aEvent.clientX, aEvent.clientY);
+
         if (aEvent.eventPhase == aEvent.BUBBLING_PHASE)
           this._onClickBubble(aEvent);
         else
           this._onClickCapture(aEvent);
         break;
 
       case "DOMFormHasPassword":
         LoginManagerContent.onFormPassword(aEvent);
--- a/browser/metro/base/content/contenthandlers/SelectionHandler.js
+++ b/browser/metro/base/content/contenthandlers/SelectionHandler.js
@@ -3,16 +3,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 dump("### SelectionHandler.js loaded\n");
 
 var SelectionHandler = {
   init: function init() {
     this.type = kContentSelector;
     this.snap = true;
+    this.lastYPos = this.lastXPos = null;
     addMessageListener("Browser:SelectionStart", this);
     addMessageListener("Browser:SelectionAttach", this);
     addMessageListener("Browser:SelectionEnd", this);
     addMessageListener("Browser:SelectionMoveStart", this);
     addMessageListener("Browser:SelectionMove", this);
     addMessageListener("Browser:SelectionMoveEnd", this);
     addMessageListener("Browser:SelectionUpdate", this);
     addMessageListener("Browser:SelectionClose", this);
@@ -335,16 +336,21 @@ var SelectionHandler = {
       raiseContent: result,
     });
   },
 
   _onPing: function _onPing(aId) {
     this.sendAsync("Content:SelectionHandlerPong", { id: aId });
   },
 
+  onClickCoords: function (xPos, yPos) {
+    this.lastXPos = xPos;
+    this.lastYPos = yPos;
+  },
+
   /*************************************************
    * Selection helpers
    */
 
   /*
    * _clearSelection
    *
    * Clear existing selection if it exists and reset our internla state.
@@ -407,19 +413,22 @@ var SelectionHandler = {
    * keyboard.
    *
    * @param aNewViewHeight the new content view height
    * @return 0 if no positioning is required or a positive val equal to the
    * distance content should be raised to center the target element.
    */
   _calcNewContentPosition: function _calcNewContentPosition(aNewViewHeight) {
     // We have no target element but the keyboard is up
-    // so lets not cover content
+    // so lets not cover content that is below the keyboard
     if (!this._cache || !this._cache.element) {
-      return Services.metro.keyboardHeight;
+      if (this.lastYPos != null && this.lastYPos > aNewViewHeight) {
+        return Services.metro.keyboardHeight;
+      }
+      return 0;
     }
 
     let position = Util.centerElementInView(aNewViewHeight, this._cache.element);
     if (position !== undefined) {
       return position;
     }
 
     // Special case: we are dealing with an input that is taller than the
@@ -518,17 +527,22 @@ var SelectionHandler = {
         this._onSelectionDebug(json);
         break;
 
       case "Browser:SelectionUpdate":
         this._onSelectionUpdate();
         break;
 
       case "Browser:RepositionInfoRequest":
-        this._repositionInfoRequest(json);
+        // This message is sent simultaneously with a tap event.
+        // Wait a bit to make sure we have the most up-to-date tap co-ordinates
+        // before a call to _calcNewContentPosition() which accesses them.
+        content.setTimeout (function () {
+          SelectionHandler._repositionInfoRequest(json);
+        }, 50);
         break;
 
       case "Browser:SelectionHandlerPing":
         this._onPing(json.id);
         break;
     }
   },
 
--- a/browser/metro/base/content/helperui/SelectionHelperUI.js
+++ b/browser/metro/base/content/helperui/SelectionHelperUI.js
@@ -339,16 +339,31 @@ var SelectionHelperUI = {
       return false;
     if ((this._caretMark && this._caretMark.dragging) ||
         (this._startMark && this._startMark.dragging) ||
         (this._endMark && this._endMark.dragging))
       return true;
     return false;
   },
 
+
+  /*
+   * Observers
+   */
+
+  observe: function (aSubject, aTopic, aData) {
+  switch (aTopic) {
+    case "attach_edit_session_to_content":
+      let event = aSubject;
+      SelectionHelperUI.attachEditSession(Browser.selectedTab.browser,
+                                          event.clientX, event.clientY);
+      break;
+    }
+  },
+
   /*
    * Public apis
    */
 
   /*
    * pingSelectionHandler
    * 
    * Ping the SelectionHandler and wait for the right response. Insures
@@ -490,16 +505,20 @@ var SelectionHelperUI = {
       clearSelection: clearSelection
     });
   },
 
   /*
    * Init and shutdown
    */
 
+  init: function () {
+    Services.obs.addObserver(this, "attach_edit_session_to_content", false);
+  },
+
   _init: function _init(aMsgTarget) {
     // store the target message manager
     this._msgTarget = aMsgTarget;
 
     // Init our list of available monocle ids
     this._setupMonocleIdArray();
 
     // Init selection rect info
--- a/browser/metro/locales/import/Makefile.in
+++ b/browser/metro/locales/import/Makefile.in
@@ -25,19 +25,21 @@ include $(topsrcdir)/config/rules.mk
 libs::
 	$(MAKE) -C $(DEPTH)/browser/locales searchplugins \
 	  DIST_SUBDIR=$(DIST_SUBDIR) XPI_ROOT_APPID="$(XPI_ROOT_APPID)"
 
 #########################################
 # Bookmarks
 
 # Pick up desktop's bookmarks.inc file
+ifdef LOCALE_MERGEDIR
+vpath book%.inc $(LOCALE_MERGEDIR)/browser/profile
+endif
 vpath book%.inc $(LOCALE_SRCDIR)/profile
 ifdef LOCALE_MERGEDIR
-vpath book%.inc $(LOCALE_SRCDIR)/profile
 vpath book%.inc @top_srcdir@/$(relativesrcdir)/en-US/profile
 endif
 
 bookmarks-src = $(srcdir)/../generic/profile/bookmarks.json.in
 
 # The resulting bookmarks.json will get picked up and packaged by the
 # processing of the jar file in the parent directory.
 bookmarks: bookmarks.inc
--- a/browser/themes/linux/preferences/in-content/preferences.css
+++ b/browser/themes/linux/preferences/in-content/preferences.css
@@ -1,155 +1,155 @@
-/* - 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/. */
-
-@import url("chrome://global/skin/inContentUI.css");
-
-@namespace html "http://www.w3.org/1999/xhtml";
-
-#preferences-home {
-  display: block;
-}
-
-#header {
-  margin-bottom: 18px;
-}
-
-.landingButton {
-  -moz-box-align: center;
-  -moz-box-orient: vertical;
-}
-
-.landingButton:hover {
-  cursor: pointer;
-}
-
-.landingButton-label {
-  margin-top: 4px;
-}
-
-.landingButton-icon {
-  display: block;
-  width: 32px;
-  height: 32px;
-  background-image: url("chrome://browser/skin/preferences/Options.png");
-  background-repeat: no-repeat;
-}
-
-.preference-icon {
-  display: block;
-  width: 32px;
-  height: 32px;
-  background-image: url("chrome://browser/skin/preferences/Options.png");
-  background-repeat: no-repeat;
-  margin: 0 20px;
-}
-
-.preference-icon[type="general"],
-.landingButton-icon[type="general"] {
-  background-position: 0 0;
-}
-
-.preference-icon[type="content"],
-.landingButton-icon[type="content"] {
-  background-position: -64px 0;
-}
-
-.preference-icon[type="applications"],
-.landingButton-icon[type="applications"] {
-  background-position: -96px 0;
-}
-
-.preference-icon[type="privacy"],
-.landingButton-icon[type="privacy"] {
-  background-position: -128px 0;
-}
-
-.preference-icon[type="security"],
-.landingButton-icon[type="security"] {
-  background-position: -160px 0;
-}
-
-.preference-icon[type="advanced"],
-.landingButton-icon[type="advanced"] {
-  background-position: -192px 0;
-}
-
-.preference-icon[type="sync"],
-.landingButton-icon[type="sync"] {
-  background-image: url("chrome://browser/skin/preferences/Options-sync.png");
-}
-
-caption {
-  font-size: 20px;
-}
-
-.heading {
-  height: 50px;
-  background-color: rgba(192,199,210,0.7);
-  border-radius: 5px 5px 0 0;
-  margin-bottom: 15px;
-  -moz-box-align: center;
-}
-
-prefpane > .content-box {
-  overflow: auto;
-}
-
-/* Applications Pane Styles */
-
-#applications-content {
-  padding: 15px;
-}
-
-#handlersView {
-  -moz-appearance: none;
-  border: 1px solid ThreeDShadow;
-  overflow-y: auto;
-}
-
-/* XXX This style is for bug 740213 and should be removed once that
-   bug has a solution. */
-description > html|a {
-  cursor: pointer;
-}
-
-/* XXX Styles Below can be removed once bug 660726 lands */
-.nav-button {
-  min-width: 0;
-}
-
-#back-btn:-moz-locale-dir(ltr) {
-  list-style-image: url("moz-icon://stock/gtk-go-back-ltr?size=toolbar");
-}
-
-#forward-btn:-moz-locale-dir(ltr) {
-  list-style-image: url("moz-icon://stock/gtk-go-forward-ltr?size=toolbar");
-}
-
-#back-btn:-moz-locale-dir(rtl) {
-  list-style-image: url("moz-icon://stock/gtk-go-back-rtl?size=toolbar");
-}
-
-#forward-btn:-moz-locale-dir(rtl) {
-  list-style-image: url("moz-icon://stock/gtk-go-forward-rtl?size=toolbar");
-}
-
-#back-btn[disabled="true"]:-moz-locale-dir(ltr) {
-  list-style-image: url("moz-icon://stock/gtk-go-back-ltr?size=toolbar&state=disabled");
-}
-
-#forward-btn[disabled="true"]:-moz-locale-dir(ltr) {
-  list-style-image: url("moz-icon://stock/gtk-go-forward-ltr?size=toolbar&state=disabled");
-}
-
-#back-btn[disabled="true"]:-moz-locale-dir(rtl) {
-  list-style-image: url("moz-icon://stock/gtk-go-back-rtl?size=toolbar&state=disabled");
-}
-
-#forward-btn[disabled="true"]:-moz-locale-dir(rtl) {
-  list-style-image: url("moz-icon://stock/gtk-go-forward-rtl?size=toolbar&state=disabled");
-}
-
-.header-button .toolbarbutton-text {
-  display: none;
-}
+/* - 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/. */
+
+@import url("chrome://global/skin/inContentUI.css");
+
+@namespace html "http://www.w3.org/1999/xhtml";
+
+#preferences-home {
+  display: block;
+}
+
+#header {
+  margin-bottom: 18px;
+}
+
+.landingButton {
+  -moz-box-align: center;
+  -moz-box-orient: vertical;
+}
+
+.landingButton:hover {
+  cursor: pointer;
+}
+
+.landingButton-label {
+  margin-top: 4px;
+}
+
+.landingButton-icon {
+  display: block;
+  width: 32px;
+  height: 32px;
+  background-image: url("chrome://browser/skin/preferences/Options.png");
+  background-repeat: no-repeat;
+}
+
+.preference-icon {
+  display: block;
+  width: 32px;
+  height: 32px;
+  background-image: url("chrome://browser/skin/preferences/Options.png");
+  background-repeat: no-repeat;
+  margin: 0 20px;
+}
+
+.preference-icon[type="general"],
+.landingButton-icon[type="general"] {
+  background-position: 0 0;
+}
+
+.preference-icon[type="content"],
+.landingButton-icon[type="content"] {
+  background-position: -64px 0;
+}
+
+.preference-icon[type="applications"],
+.landingButton-icon[type="applications"] {
+  background-position: -96px 0;
+}
+
+.preference-icon[type="privacy"],
+.landingButton-icon[type="privacy"] {
+  background-position: -128px 0;
+}
+
+.preference-icon[type="security"],
+.landingButton-icon[type="security"] {
+  background-position: -160px 0;
+}
+
+.preference-icon[type="advanced"],
+.landingButton-icon[type="advanced"] {
+  background-position: -192px 0;
+}
+
+.preference-icon[type="sync"],
+.landingButton-icon[type="sync"] {
+  background-image: url("chrome://browser/skin/preferences/Options-sync.png");
+}
+
+caption {
+  font-size: 20px;
+}
+
+.heading {
+  height: 50px;
+  background-color: rgba(192,199,210,0.7);
+  border-radius: 5px 5px 0 0;
+  margin-bottom: 15px;
+  -moz-box-align: center;
+}
+
+prefpane > .content-box {
+  overflow: auto;
+}
+
+/* Applications Pane Styles */
+
+#applications-content {
+  padding: 15px;
+}
+
+#handlersView {
+  -moz-appearance: none;
+  border: 1px solid ThreeDShadow;
+  overflow-y: auto;
+}
+
+/* XXX This style is for bug 740213 and should be removed once that
+   bug has a solution. */
+description > html|a {
+  cursor: pointer;
+}
+
+/* XXX Styles Below can be removed once bug 660726 lands */
+.nav-button {
+  min-width: 0;
+}
+
+#back-btn:-moz-locale-dir(ltr) {
+  list-style-image: url("moz-icon://stock/gtk-go-back-ltr?size=toolbar");
+}
+
+#forward-btn:-moz-locale-dir(ltr) {
+  list-style-image: url("moz-icon://stock/gtk-go-forward-ltr?size=toolbar");
+}
+
+#back-btn:-moz-locale-dir(rtl) {
+  list-style-image: url("moz-icon://stock/gtk-go-back-rtl?size=toolbar");
+}
+
+#forward-btn:-moz-locale-dir(rtl) {
+  list-style-image: url("moz-icon://stock/gtk-go-forward-rtl?size=toolbar");
+}
+
+#back-btn[disabled="true"]:-moz-locale-dir(ltr) {
+  list-style-image: url("moz-icon://stock/gtk-go-back-ltr?size=toolbar&state=disabled");
+}
+
+#forward-btn[disabled="true"]:-moz-locale-dir(ltr) {
+  list-style-image: url("moz-icon://stock/gtk-go-forward-ltr?size=toolbar&state=disabled");
+}
+
+#back-btn[disabled="true"]:-moz-locale-dir(rtl) {
+  list-style-image: url("moz-icon://stock/gtk-go-back-rtl?size=toolbar&state=disabled");
+}
+
+#forward-btn[disabled="true"]:-moz-locale-dir(rtl) {
+  list-style-image: url("moz-icon://stock/gtk-go-forward-rtl?size=toolbar&state=disabled");
+}
+
+.header-button .toolbarbutton-text {
+  display: none;
+}
--- a/browser/themes/osx/preferences/in-content/preferences.css
+++ b/browser/themes/osx/preferences/in-content/preferences.css
@@ -1,166 +1,166 @@
-/* - 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/. */
-
-@import url("chrome://global/skin/inContentUI.css");
-
-@namespace html "http://www.w3.org/1999/xhtml";
-
-#preferences-home {
-  display: block;
-}
-
-#header {
-  margin-bottom: 18px;
-}
-
-.landingButton {
-  -moz-box-align: center;
-  -moz-box-orient: vertical;
-  border: none;
-  background: none;
-  box-shadow: none;
-}
-
-.landingButton:hover {
-  cursor: pointer;
-}
-
-.landingButton-label {
-  margin-top: 4px;
-}
-
-.landingButton-icon {
-  display: block;
-  width: 32px;
-  height: 32px;
-  background-image: url("chrome://browser/skin/preferences/Options.png");
-  background-repeat: no-repeat;
-}
-
-.preference-icon {
-  display: block;
-  width: 32px;
-  height: 32px;
-  background-image: url("chrome://browser/skin/preferences/Options.png");
-  background-repeat: no-repeat;
-  margin: 0 20px;
-}
-
-.preference-icon[type="general"],
-.landingButton-icon[type="general"] {
-  background-position: 0 0;
-}
-
-.preference-icon[type="content"],
-.landingButton-icon[type="content"] {
-  background-position: -64px 0;
-}
-
-.preference-icon[type="applications"],
-.landingButton-icon[type="applications"] {
-  background-position: -96px 0;
-}
-
-.preference-icon[type="privacy"],
-.landingButton-icon[type="privacy"] {
-  background-position: -128px 0;
-}
-
-.preference-icon[type="security"],
-.landingButton-icon[type="security"] {
-  background-position: -160px 0;
-}
-
-.preference-icon[type="advanced"],
-.landingButton-icon[type="advanced"] {
-  background-position: -192px 0;
-}
-
-.preference-icon[type="sync"],
-.landingButton-icon[type="sync"] {
-  background-image: url("chrome://browser/skin/preferences/Options-sync.png");
-}
-
-caption {
-  font-size: 20px;
-}
-
-.heading {
-  height: 50px;
-  background-color: rgba(192,199,210,0.7);
-  border-radius: 5px 5px 0 0;
-  margin-bottom: 15px;
-  -moz-box-align: center;
-}
-
-prefpane > .content-box {
-  overflow: auto;
-}
-
-/* Applications Pane Styles */
-
-#applications-content {
-  padding: 15px;
-}
-
-#handlersView {
-  -moz-appearance: none;
-  border: 1px solid rgba(60,73,97,0.5);
-  overflow-y: auto;
-}
-
-/* XXX This style is for bug 740213 and should be removed once that
-   bug has a solution. */
-description > html|a {
-  cursor: pointer;
-}
-
-/* XXX Styles Below can be removed once bug 660726 lands */
-.nav-button {
-  list-style-image: url(chrome://mozapps/skin/extensions/navigation.png);
-}
-
-#back-btn:-moz-locale-dir(ltr),
-#forward-btn:-moz-locale-dir(rtl) {
-  border-top-right-radius: 0;
-  border-bottom-right-radius: 0;
-  border-right: none;
-  -moz-image-region: rect(0, 20px, 20px, 0);
-  padding-right: 3px;
-}
-
-#back-btn:-moz-locale-dir(rtl),
-#forward-btn:-moz-locale-dir(ltr) {
-  border-top-left-radius: 0;
-  border-bottom-left-radius: 0;
-  -moz-image-region: rect(0, 40px, 20px, 20px);
-  padding-left: 3px;
-}
-
-.header-button {
-  -moz-appearance: none;
-  padding: 0 4px;
-  margin: 0;
-  height: 22px;
-  border: 1px solid rgba(60,73,97,0.5);
-  border-radius: @toolbarbuttonCornerRadius@;
-  box-shadow: inset 0 1px rgba(255,255,255,0.25), 0 1px rgba(255,255,255,0.25);
-  background: linear-gradient(rgba(255,255,255,0.45), rgba(255,255,255,0));
-  background-clip: padding-box;
-}
-
-.header-button .toolbarbutton-text {
-  display: none;
-}
-
-.header-button[disabled="true"] .toolbarbutton-icon {
-  opacity: 0.4;
-}
-
-.header-button:not([disabled="true"]):active:hover,
-.header-button[open="true"] {
-  border-color: rgba(45,54,71,0.7);
-  box-shadow: inset 0 0 4px rgb(45,54,71), 0 1px rgba(255,255,255,0.25);
-  background-image: linear-gradient(rgba(45,54,71,0.6), rgba(45,54,71,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/. */
+
+@import url("chrome://global/skin/inContentUI.css");
+
+@namespace html "http://www.w3.org/1999/xhtml";
+
+#preferences-home {
+  display: block;
+}
+
+#header {
+  margin-bottom: 18px;
+}
+
+.landingButton {
+  -moz-box-align: center;
+  -moz-box-orient: vertical;
+  border: none;
+  background: none;
+  box-shadow: none;
+}
+
+.landingButton:hover {
+  cursor: pointer;
+}
+
+.landingButton-label {
+  margin-top: 4px;
+}
+
+.landingButton-icon {
+  display: block;
+  width: 32px;
+  height: 32px;
+  background-image: url("chrome://browser/skin/preferences/Options.png");
+  background-repeat: no-repeat;
+}
+
+.preference-icon {
+  display: block;
+  width: 32px;
+  height: 32px;
+  background-image: url("chrome://browser/skin/preferences/Options.png");
+  background-repeat: no-repeat;
+  margin: 0 20px;
+}
+
+.preference-icon[type="general"],
+.landingButton-icon[type="general"] {
+  background-position: 0 0;
+}
+
+.preference-icon[type="content"],
+.landingButton-icon[type="content"] {
+  background-position: -64px 0;
+}
+
+.preference-icon[type="applications"],
+.landingButton-icon[type="applications"] {
+  background-position: -96px 0;
+}
+
+.preference-icon[type="privacy"],
+.landingButton-icon[type="privacy"] {
+  background-position: -128px 0;
+}
+
+.preference-icon[type="security"],
+.landingButton-icon[type="security"] {
+  background-position: -160px 0;
+}
+
+.preference-icon[type="advanced"],
+.landingButton-icon[type="advanced"] {
+  background-position: -192px 0;
+}
+
+.preference-icon[type="sync"],
+.landingButton-icon[type="sync"] {
+  background-image: url("chrome://browser/skin/preferences/Options-sync.png");
+}
+
+caption {
+  font-size: 20px;
+}
+
+.heading {
+  height: 50px;
+  background-color: rgba(192,199,210,0.7);
+  border-radius: 5px 5px 0 0;
+  margin-bottom: 15px;
+  -moz-box-align: center;
+}
+
+prefpane > .content-box {
+  overflow: auto;
+}
+
+/* Applications Pane Styles */
+
+#applications-content {
+  padding: 15px;
+}
+
+#handlersView {
+  -moz-appearance: none;
+  border: 1px solid rgba(60,73,97,0.5);
+  overflow-y: auto;
+}
+
+/* XXX This style is for bug 740213 and should be removed once that
+   bug has a solution. */
+description > html|a {
+  cursor: pointer;
+}
+
+/* XXX Styles Below can be removed once bug 660726 lands */
+.nav-button {
+  list-style-image: url(chrome://mozapps/skin/extensions/navigation.png);
+}
+
+#back-btn:-moz-locale-dir(ltr),
+#forward-btn:-moz-locale-dir(rtl) {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+  border-right: none;
+  -moz-image-region: rect(0, 20px, 20px, 0);
+  padding-right: 3px;
+}
+
+#back-btn:-moz-locale-dir(rtl),
+#forward-btn:-moz-locale-dir(ltr) {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+  -moz-image-region: rect(0, 40px, 20px, 20px);
+  padding-left: 3px;
+}
+
+.header-button {
+  -moz-appearance: none;
+  padding: 0 4px;
+  margin: 0;
+  height: 22px;
+  border: 1px solid rgba(60,73,97,0.5);
+  border-radius: @toolbarbuttonCornerRadius@;
+  box-shadow: inset 0 1px rgba(255,255,255,0.25), 0 1px rgba(255,255,255,0.25);
+  background: linear-gradient(rgba(255,255,255,0.45), rgba(255,255,255,0));
+  background-clip: padding-box;
+}
+
+.header-button .toolbarbutton-text {
+  display: none;
+}
+
+.header-button[disabled="true"] .toolbarbutton-icon {
+  opacity: 0.4;
+}
+
+.header-button:not([disabled="true"]):active:hover,
+.header-button[open="true"] {
+  border-color: rgba(45,54,71,0.7);
+  box-shadow: inset 0 0 4px rgb(45,54,71), 0 1px rgba(255,255,255,0.25);
+  background-image: linear-gradient(rgba(45,54,71,0.6), rgba(45,54,71,0));
+}
--- a/browser/themes/windows/preferences/in-content/preferences.css
+++ b/browser/themes/windows/preferences/in-content/preferences.css
@@ -1,177 +1,177 @@
-/* - 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/. */
-
-@import url("chrome://global/skin/inContentUI.css");
-
-@namespace html "http://www.w3.org/1999/xhtml";
-
-#preferences-home {
-  display: block;
-}
-
-#header {
-  margin-bottom: 18px;
-}
-
-.landingButton {
-  -moz-box-align: center;
-  -moz-box-orient: vertical;
-  border: none;
-  background: none;
-  box-shadow: none;
-}
-
-.landingButton:hover {
-  cursor: pointer;
-}
-
-.landingButton-label {
-  margin-top: 4px;
-}
-
-.landingButton-icon {
-  display: block;
-  width: 32px;
-  height: 32px;
-  background-image: url("chrome://browser/skin/preferences/Options.png");
-  background-repeat: no-repeat;
-}
-
-.preference-icon {
-  display: block;
-  width: 32px;
-  height: 32px;
-  background-image: url("chrome://browser/skin/preferences/Options.png");
-  background-repeat: no-repeat;
-  margin: 0 20px;
-}
-
-.preference-icon[type="general"],
-.landingButton-icon[type="general"] {
-  background-position: 0 0;
-}
-
-.preference-icon[type="content"],
-.landingButton-icon[type="content"] {
-  background-position: -64px 0;
-}
-
-.preference-icon[type="applications"],
-.landingButton-icon[type="applications"] {
-  background-position: -96px 0;
-}
-
-.preference-icon[type="privacy"],
-.landingButton-icon[type="privacy"] {
-  background-position: -128px 0;
-}
-
-.preference-icon[type="security"],
-.landingButton-icon[type="security"] {
-  background-position: -160px 0;
-}
-
-.preference-icon[type="advanced"],
-.landingButton-icon[type="advanced"] {
-  background-position: -192px 0;
-}
-
-.preference-icon[type="sync"],
-.landingButton-icon[type="sync"] {
-  background-image: url("chrome://browser/skin/preferences/Options-sync.png");
-}
-
-caption {
-  font-size: 20px;
-}
-
-.heading {
-  height: 50px;
-  background-color: rgba(192,199,210,0.7);
-  border-radius: 5px 5px 0 0;
-  margin-bottom: 15px;
-  -moz-box-align: center;
-}
-
-prefpane > .content-box {
-  overflow: auto;
-}
-
-/* Applications Pane Styles */
-
-#applications-content {
-  padding: 15px;
-}
-
-#handlersView {
-  -moz-appearance: none;
-  border: 1px solid rgba(31,64,100,0.4);
-  overflow-y: auto;
-}
-
-/* XXX This style is for bug 740213 and should be removed once that
-   bug has a solution. */
-description > html|a {
-  cursor: pointer;
-}
-
-/* XXX Styles Below can be removed once bug 660726 lands */
-.nav-button {
-  list-style-image: url(chrome://mozapps/skin/extensions/navigation.png);
-}
-
-#forward-btn {
-  -moz-border-start: none;
-}
-
-#back-btn:-moz-locale-dir(ltr),
-#forward-btn:-moz-locale-dir(rtl) {
-  -moz-image-region: rect(0, 18px, 18px, 0);
-  border-top-right-radius: 0;
-  border-bottom-right-radius: 0;
-}
-
-#back-btn:-moz-locale-dir(rtl),
-#forward-btn:-moz-locale-dir(ltr) {
-  -moz-image-region: rect(0, 36px, 18px, 18px);
-  border-top-left-radius: 0;
-  border-bottom-left-radius: 0;
-}
-
-.header-button[disabled="true"] {
-  opacity: 0.8;
-}
-
-.header-button {
-  -moz-appearance: none;
-  padding: 1px 3px;
-  color: #444;
-  text-shadow: 0 0 3px white;
-  background: linear-gradient(
-                rgba(251,252,253,0.95),
-                rgba(246,247,248,0) 49%,
-                rgba(211,212,213,0.45) 51%,
-                rgba(225,226,229, 0.3));
-  background-clip: padding-box;
-  border-radius: 2.5px;
-  border: 1px solid rgba(31,64,100,0.4);
-  border-top-color: rgba(31,64,100,0.3);
-  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.25) inset,
-              0 0 2px 1px rgba(255, 255, 255, 0.25) inset;
-}
-
-.header-button[disabled="true"] > .toolbarbutton-icon {
-  opacity: 0.4;
-}
-
-.header-button:not([disabled="true"]):active:hover,
-.header-button[open="true"] {
-  background-color: rgba(61, 76, 92, 0.2);
-  border-color: rgba(39, 53, 68, 0.5);
-  box-shadow: 0 0 3px 1px rgba(39, 53, 68, 0.2) inset;
-}
-
-.header-button > .toolbarbutton-text {
-  display: none;
-}
+/* - 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/. */
+
+@import url("chrome://global/skin/inContentUI.css");
+
+@namespace html "http://www.w3.org/1999/xhtml";
+
+#preferences-home {
+  display: block;
+}
+
+#header {
+  margin-bottom: 18px;
+}
+
+.landingButton {
+  -moz-box-align: center;
+  -moz-box-orient: vertical;
+  border: none;
+  background: none;
+  box-shadow: none;
+}
+
+.landingButton:hover {
+  cursor: pointer;
+}
+
+.landingButton-label {
+  margin-top: 4px;
+}
+
+.landingButton-icon {
+  display: block;
+  width: 32px;
+  height: 32px;
+  background-image: url("chrome://browser/skin/preferences/Options.png");
+  background-repeat: no-repeat;
+}
+
+.preference-icon {
+  display: block;
+  width: 32px;
+  height: 32px;
+  background-image: url("chrome://browser/skin/preferences/Options.png");
+  background-repeat: no-repeat;
+  margin: 0 20px;
+}
+
+.preference-icon[type="general"],
+.landingButton-icon[type="general"] {
+  background-position: 0 0;
+}
+
+.preference-icon[type="content"],
+.landingButton-icon[type="content"] {
+  background-position: -64px 0;
+}
+
+.preference-icon[type="applications"],
+.landingButton-icon[type="applications"] {
+  background-position: -96px 0;
+}
+
+.preference-icon[type="privacy"],
+.landingButton-icon[type="privacy"] {
+  background-position: -128px 0;
+}
+
+.preference-icon[type="security"],
+.landingButton-icon[type="security"] {
+  background-position: -160px 0;
+}
+
+.preference-icon[type="advanced"],
+.landingButton-icon[type="advanced"] {
+  background-position: -192px 0;
+}
+
+.preference-icon[type="sync"],
+.landingButton-icon[type="sync"] {
+  background-image: url("chrome://browser/skin/preferences/Options-sync.png");
+}
+
+caption {
+  font-size: 20px;
+}
+
+.heading {
+  height: 50px;
+  background-color: rgba(192,199,210,0.7);
+  border-radius: 5px 5px 0 0;
+  margin-bottom: 15px;
+  -moz-box-align: center;
+}
+
+prefpane > .content-box {
+  overflow: auto;
+}
+
+/* Applications Pane Styles */
+
+#applications-content {
+  padding: 15px;
+}
+
+#handlersView {
+  -moz-appearance: none;
+  border: 1px solid rgba(31,64,100,0.4);
+  overflow-y: auto;
+}
+
+/* XXX This style is for bug 740213 and should be removed once that
+   bug has a solution. */
+description > html|a {
+  cursor: pointer;
+}
+
+/* XXX Styles Below can be removed once bug 660726 lands */
+.nav-button {
+  list-style-image: url(chrome://mozapps/skin/extensions/navigation.png);
+}
+
+#forward-btn {
+  -moz-border-start: none;
+}
+
+#back-btn:-moz-locale-dir(ltr),
+#forward-btn:-moz-locale-dir(rtl) {
+  -moz-image-region: rect(0, 18px, 18px, 0);
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+
+#back-btn:-moz-locale-dir(rtl),
+#forward-btn:-moz-locale-dir(ltr) {
+  -moz-image-region: rect(0, 36px, 18px, 18px);
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+
+.header-button[disabled="true"] {
+  opacity: 0.8;
+}
+
+.header-button {
+  -moz-appearance: none;
+  padding: 1px 3px;
+  color: #444;
+  text-shadow: 0 0 3px white;
+  background: linear-gradient(
+                rgba(251,252,253,0.95),
+                rgba(246,247,248,0) 49%,
+                rgba(211,212,213,0.45) 51%,
+                rgba(225,226,229, 0.3));
+  background-clip: padding-box;
+  border-radius: 2.5px;
+  border: 1px solid rgba(31,64,100,0.4);
+  border-top-color: rgba(31,64,100,0.3);
+  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.25) inset,
+              0 0 2px 1px rgba(255, 255, 255, 0.25) inset;
+}
+
+.header-button[disabled="true"] > .toolbarbutton-icon {
+  opacity: 0.4;
+}
+
+.header-button:not([disabled="true"]):active:hover,
+.header-button[open="true"] {
+  background-color: rgba(61, 76, 92, 0.2);
+  border-color: rgba(39, 53, 68, 0.5);
+  box-shadow: 0 0 3px 1px rgba(39, 53, 68, 0.2) inset;
+}
+
+.header-button > .toolbarbutton-text {
+  display: none;
+}
--- a/content/media/MediaDecoderReader.cpp
+++ b/content/media/MediaDecoderReader.cpp
@@ -597,10 +597,24 @@ nsresult MediaDecoderReader::DecodeToTar
     }
   }
 
   LOG(PR_LOG_DEBUG, ("MediaDecoderReader::DecodeToTarget(%lld) End", aTarget));
 
   return NS_OK;
 }
 
+nsresult
+MediaDecoderReader::GetBuffered(mozilla::dom::TimeRanges* aBuffered,
+                                int64_t aStartTime)
+{
+  MediaResource* stream = mDecoder->GetResource();
+  int64_t durationUs = 0;
+  {
+    ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
+    durationUs = mDecoder->GetMediaDuration();
+  }
+  GetEstimatedBufferedTimeRanges(stream, durationUs, aBuffered);
+  return NS_OK;
+}
+
 } // namespace mozilla
 
--- a/content/media/MediaDecoderReader.h
+++ b/content/media/MediaDecoderReader.h
@@ -520,19 +520,31 @@ protected:
   // Queue of video frames. This queue is threadsafe, and is accessed from
   // the decoder, state machine, and main threads.
   MediaQueue<VideoData> mVideoQueue;
 
 public:
   // Populates aBuffered with the time ranges which are buffered. aStartTime
   // must be the presentation time of the first frame in the media, e.g.
   // the media time corresponding to playback time/position 0. This function
-  // should only be called on the main thread.
+  // is called on the main, decode, and state machine threads.
+  //
+  // This base implementation in MediaDecoderReader estimates the time ranges
+  // buffered by interpolating the cached byte ranges with the duration
+  // of the media. Reader subclasses should override this method if they
+  // can quickly calculate the buffered ranges more accurately.
+  //
+  // The primary advantage of this implementation in the reader base class
+  // is that it's a fast approximation, which does not perform any I/O.
+  //
+  // The OggReader relies on this base implementation not performing I/O,
+  // since in FirefoxOS we can't do I/O on the main thread, where this is
+  // called.
   virtual nsresult GetBuffered(dom::TimeRanges* aBuffered,
-                               int64_t aStartTime) = 0;
+                               int64_t aStartTime);
 
   class VideoQueueMemoryFunctor : public nsDequeFunctor {
   public:
     VideoQueueMemoryFunctor() : mResult(0) {}
 
     virtual void* operator()(void* anObject);
 
     int64_t mResult;
--- a/content/media/apple/AppleMP3Reader.cpp
+++ b/content/media/apple/AppleMP3Reader.cpp
@@ -510,21 +510,9 @@ AppleMP3Reader::Seek(int64_t aTime,
 
   mDecoder->GetResource()->Seek(nsISeekableStream::NS_SEEK_SET, byteOffset);
 
   ResetDecode();
 
   return NS_OK;
 }
 
-
-nsresult
-AppleMP3Reader::GetBuffered(dom::TimeRanges* aBuffered,
-                            int64_t aStartTime)
-{
-  ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
-  GetEstimatedBufferedTimeRanges(mDecoder->GetResource(),
-                                 mDecoder->GetMediaDuration(),
-                                 aBuffered);
-  return NS_OK;
-}
-
 } // namespace mozilla
--- a/content/media/apple/AppleMP3Reader.h
+++ b/content/media/apple/AppleMP3Reader.h
@@ -33,19 +33,16 @@ public:
   virtual nsresult ReadMetadata(MediaInfo* aInfo,
                                 MetadataTags** aTags) MOZ_OVERRIDE;
 
   virtual nsresult Seek(int64_t aTime,
                         int64_t aStartTime,
                         int64_t aEndTime,
                         int64_t aCurrentTime) MOZ_OVERRIDE;
 
-  virtual nsresult GetBuffered(dom::TimeRanges* aBuffered,
-                               int64_t aStartTime) MOZ_OVERRIDE;
-
   void AudioSampleCallback(UInt32 aNumBytes,
                            UInt32 aNumPackets,
                            const void *aData,
                            AudioStreamPacketDescription *aPackets);
 
   void AudioMetadataCallback(AudioFileStreamID aFileStream,
                              AudioFileStreamPropertyID aPropertyID,
                              UInt32 *aFlags);
--- a/content/media/directshow/DirectShowReader.cpp
+++ b/content/media/directshow/DirectShowReader.cpp
@@ -326,30 +326,16 @@ DirectShowReader::Seek(int64_t aTargetUs
   NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
 
   hr = mControl->Run();
   NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
 
   return DecodeToTarget(aTargetUs);
 }
 
-nsresult
-DirectShowReader::GetBuffered(mozilla::dom::TimeRanges* aBuffered,
-                              int64_t aStartTime)
-{
-  MediaResource* stream = mDecoder->GetResource();
-  int64_t durationUs = 0;
-  {
-    ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
-    durationUs = mDecoder->GetMediaDuration();
-  }
-  GetEstimatedBufferedTimeRanges(stream, durationUs, aBuffered);
-  return NS_OK;
-}
-
 void
 DirectShowReader::OnDecodeThreadStart()
 {
   MOZ_ASSERT(mDecoder->OnDecodeThread(), "Should be on decode thread.");
   HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED);
   NS_ENSURE_TRUE_VOID(SUCCEEDED(hr));
 }
 
--- a/content/media/directshow/DirectShowReader.h
+++ b/content/media/directshow/DirectShowReader.h
@@ -60,19 +60,16 @@ public:
   nsresult ReadMetadata(MediaInfo* aInfo,
                         MetadataTags** aTags) MOZ_OVERRIDE;
 
   nsresult Seek(int64_t aTime,
                 int64_t aStartTime,
                 int64_t aEndTime,
                 int64_t aCurrentTime) MOZ_OVERRIDE;
 
-  nsresult GetBuffered(mozilla::dom::TimeRanges* aBuffered,
-                       int64_t aStartTime) MOZ_OVERRIDE;
-
   void OnDecodeThreadStart() MOZ_OVERRIDE;
   void OnDecodeThreadFinish() MOZ_OVERRIDE;
 
   void NotifyDataArrived(const char* aBuffer,
                          uint32_t aLength,
                          int64_t aOffset) MOZ_OVERRIDE;
 
 private:
--- a/content/media/ogg/OggReader.cpp
+++ b/content/media/ogg/OggReader.cpp
@@ -1750,25 +1750,17 @@ nsresult OggReader::SeekBisection(int64_
 nsresult OggReader::GetBuffered(TimeRanges* aBuffered, int64_t aStartTime)
 {
   {
     mozilla::ReentrantMonitorAutoEnter mon(mMonitor);
     if (mIsChained)
       return NS_ERROR_FAILURE;
   }
 #ifdef OGG_ESTIMATE_BUFFERED
-  MediaResource* stream = mDecoder->GetResource();
-  int64_t durationUs = 0;
-  {
-    ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
-    durationUs = mDecoder->GetMediaDuration();
-  }
-  GetEstimatedBufferedTimeRanges(stream, durationUs, aBuffered);
-
-  return NS_OK;
+  return MediaDecoderReader::GetBuffered(aBuffered, aStartTime);
 #else
   // HasAudio and HasVideo are not used here as they take a lock and cause
   // a deadlock. Accessing mInfo doesn't require a lock - it doesn't change
   // after metadata is read.
   if (!mInfo.HasValidMedia()) {
     // No need to search through the file if there are no audio or video tracks
     return NS_OK;
   }
--- a/content/media/plugins/MediaPluginReader.cpp
+++ b/content/media/plugins/MediaPluginReader.cpp
@@ -324,31 +324,16 @@ nsresult MediaPluginReader::Seek(int64_t
   mVideoQueue.Erase();
   mAudioQueue.Erase();
 
   mAudioSeekTimeUs = mVideoSeekTimeUs = aTarget;
 
   return DecodeToTarget(aTarget);
 }
 
-nsresult MediaPluginReader::GetBuffered(mozilla::dom::TimeRanges* aBuffered, int64_t aStartTime)
-{
-  if (!mPlugin)
-    return NS_OK;
-
-  MediaResource* stream = mDecoder->GetResource();
-
-  int64_t durationUs = 0;
-  mPlugin->GetDuration(mPlugin, &durationUs);
-
-  GetEstimatedBufferedTimeRanges(stream, durationUs, aBuffered);
-  
-  return NS_OK;
-}
-
 MediaPluginReader::ImageBufferCallback::ImageBufferCallback(mozilla::layers::ImageContainer *aImageContainer) :
   mImageContainer(aImageContainer)
 {
 }
 
 void *
 MediaPluginReader::ImageBufferCallback::operator()(size_t aWidth, size_t aHeight,
                                                      MPAPI::ColorFormat aColorFormat)
--- a/content/media/plugins/MediaPluginReader.h
+++ b/content/media/plugins/MediaPluginReader.h
@@ -59,17 +59,16 @@ public:
   virtual bool HasVideo()
   {
     return mHasVideo;
   }
 
   virtual nsresult ReadMetadata(MediaInfo* aInfo,
                                 MetadataTags** aTags);
   virtual nsresult Seek(int64_t aTime, int64_t aStartTime, int64_t aEndTime, int64_t aCurrentTime);
-  virtual nsresult GetBuffered(mozilla::dom::TimeRanges* aBuffered, int64_t aStartTime);
   class ImageBufferCallback : public MPAPI::BufferCallback {
     typedef mozilla::layers::Image Image;
   public:
     ImageBufferCallback(mozilla::layers::ImageContainer *aImageContainer);
     void *operator()(size_t aWidth, size_t aHeight,
                      MPAPI::ColorFormat aColorFormat) MOZ_OVERRIDE;
     already_AddRefed<Image> GetImage();
   private:
--- a/content/media/wmf/WMFReader.cpp
+++ b/content/media/wmf/WMFReader.cpp
@@ -1023,22 +1023,9 @@ WMFReader::Seek(int64_t aTargetUs,
   NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
 
   hr = mSourceReader->SetCurrentPosition(GUID_NULL, var);
   NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
 
   return DecodeToTarget(aTargetUs);
 }
 
-nsresult
-WMFReader::GetBuffered(mozilla::dom::TimeRanges* aBuffered, int64_t aStartTime)
-{
-  MediaResource* stream = mDecoder->GetResource();
-  int64_t durationUs = 0;
-  {
-    ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
-    durationUs = mDecoder->GetMediaDuration();
-  }
-  GetEstimatedBufferedTimeRanges(stream, durationUs, aBuffered);
-  return NS_OK;
-}
-
 } // namespace mozilla
--- a/content/media/wmf/WMFReader.h
+++ b/content/media/wmf/WMFReader.h
@@ -43,19 +43,16 @@ public:
   nsresult ReadMetadata(MediaInfo* aInfo,
                         MetadataTags** aTags) MOZ_OVERRIDE;
 
   nsresult Seek(int64_t aTime,
                 int64_t aStartTime,
                 int64_t aEndTime,
                 int64_t aCurrentTime) MOZ_OVERRIDE;
 
-  nsresult GetBuffered(mozilla::dom::TimeRanges* aBuffered,
-                       int64_t aStartTime) MOZ_OVERRIDE;
-
   void OnDecodeThreadStart() MOZ_OVERRIDE;
   void OnDecodeThreadFinish() MOZ_OVERRIDE;
 
 private:
 
   HRESULT ConfigureAudioDecoder();
   HRESULT ConfigureVideoDecoder();
   HRESULT ConfigureVideoFrameGeometry(IMFMediaType* aMediaType);
--- a/dom/src/geolocation/nsGeolocation.cpp
+++ b/dom/src/geolocation/nsGeolocation.cpp
@@ -670,17 +670,18 @@ nsresult nsGeolocationService::Init()
   mProvider = new AndroidLocationProvider();
 #endif
 
 #ifdef MOZ_WIDGET_GONK
   mProvider = do_GetService(GONK_GPS_GEOLOCATION_PROVIDER_CONTRACTID);
 #endif
 
 #ifdef MOZ_WIDGET_COCOA
-  if (Preferences::GetBool("geo.provider.use_corelocation", false)) {
+  if (Preferences::GetBool("geo.provider.use_corelocation", true) &&
+      CoreLocationLocationProvider::IsCoreLocationAvailable()) {
     mProvider = new CoreLocationLocationProvider();
   }
 #endif
 
   // Override platform-specific providers with the default (network)
   // provider while testing. Our tests are currently not meant to exercise
   // the provider, and some tests rely on the network provider being used.
   // "geo.provider.testing" is always set for all plain and browser chrome
--- a/dom/system/mac/CoreLocationLocationProvider.h
+++ b/dom/system/mac/CoreLocationLocationProvider.h
@@ -27,14 +27,16 @@ class CoreLocationLocationProvider
   , public nsIGeolocationUpdate
 {
 public:
   NS_DECL_ISUPPORTS
   NS_DECL_NSIGEOLOCATIONUPDATE
   NS_DECL_NSIGEOLOCATIONPROVIDER
 
   CoreLocationLocationProvider();
+  static bool IsCoreLocationAvailable();
+
 private:
   virtual ~CoreLocationLocationProvider() {};
 
   CoreLocationObjects* mCLObjects;
   nsCOMPtr<nsIGeolocationUpdate> mCallback;
 };
--- a/dom/system/mac/CoreLocationLocationProvider.mm
+++ b/dom/system/mac/CoreLocationLocationProvider.mm
@@ -12,16 +12,22 @@
 #include "CoreLocationLocationProvider.h"
 #include "prtime.h"
 
 #include <CoreLocation/CLError.h>
 #include <CoreLocation/CLLocation.h>
 #include <CoreLocation/CLLocationManager.h>
 #include <CoreLocation/CLLocationManagerDelegate.h>
 
+#include <objc/objc.h>
+#include <objc/objc-runtime.h>
+
+#include "nsObjCExceptions.h"
+#import <CoreWLAN/CoreWLAN.h>
+
 using namespace mozilla;
 
 static const CLLocationAccuracy kHIGH_ACCURACY = kCLLocationAccuracyBest;
 static const CLLocationAccuracy kDEFAULT_ACCURACY = kCLLocationAccuracyNearestTenMeters;
 
 @interface LocationDelegate : NSObject <CLLocationManagerDelegate>
 {
   CoreLocationLocationProvider* mProvider;
@@ -120,16 +126,45 @@ public:
 
 NS_IMPL_ISUPPORTS1(CoreLocationLocationProvider, nsIGeolocationProvider)
 
 CoreLocationLocationProvider::CoreLocationLocationProvider()
   : mCLObjects(nullptr)
 {
 }
 
+bool
+CoreLocationLocationProvider::IsCoreLocationAvailable()
+{
+  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+  @try {
+    NSBundle * bundle = [[[NSBundle alloc] initWithPath:@"/System/Library/Frameworks/CoreWLAN.framework"] autorelease];
+    if (!bundle) {
+      [pool release];
+      return false;
+    }
+
+    Class CWI_class = [bundle classNamed:@"CWInterface"];
+    if (!CWI_class) {
+      [pool release];
+      return false;
+    }
+
+    if ([[[CWI_class interface] interfaceState] intValue] == kCWInterfaceStateRunning) {
+      [pool release];
+      return true;
+    }
+  }
+  @catch(NSException *e) {
+  }
+  [pool release];
+  return false;
+}
+
 NS_IMETHODIMP
 CoreLocationLocationProvider::Startup()
 {
   if (!mCLObjects) {
     nsAutoPtr<CoreLocationObjects> clObjs(new CoreLocationObjects());
 
     nsresult rv = clObjs->Init(this);
     NS_ENSURE_SUCCESS(rv, rv);
--- a/gfx/layers/ipc/ShadowLayers.cpp
+++ b/gfx/layers/ipc/ShadowLayers.cpp
@@ -302,31 +302,49 @@ ShadowLayerForwarder::RepositionChild(Sh
   } else {
     MOZ_LAYERS_LOG(("[LayersForwarder] OpRaiseToTopChild container=%p child=%p",
                    aContainer->AsLayer(), aChild->AsLayer()));
     mTxn->AddEdit(OpRaiseToTopChild(nullptr, Shadow(aContainer),
                                     nullptr, Shadow(aChild)));
   }
 }
 
+
+#ifdef DEBUG
+void
+ShadowLayerForwarder::CheckSurfaceDescriptor(const SurfaceDescriptor* aDescriptor) const
+{
+  if (!aDescriptor) {
+    return;
+  }
+
+  if (aDescriptor->type() == SurfaceDescriptor::TShmem) {
+    const mozilla::ipc::Shmem& shmem = aDescriptor->get_Shmem();
+    shmem.AssertInvariants();
+    MOZ_ASSERT(mShadowManager->IsTrackingSharedMemory(shmem.mSegment));
+  }
+}
+#endif
+
 void
 ShadowLayerForwarder::PaintedTiledLayerBuffer(CompositableClient* aCompositable,
                                               const SurfaceDescriptorTiles& aTileLayerDescriptor)
 {
   mTxn->AddNoSwapPaint(OpPaintTiledLayerBuffer(nullptr, aCompositable->GetIPDLActor(),
                                                aTileLayerDescriptor));
 }
 
 void
 ShadowLayerForwarder::UpdateTexture(CompositableClient* aCompositable,
                                     TextureIdentifier aTextureId,
                                     SurfaceDescriptor* aDescriptor)
 {
   if (aDescriptor->type() != SurfaceDescriptor::T__None &&
       aDescriptor->type() != SurfaceDescriptor::Tnull_t) {
+    CheckSurfaceDescriptor(aDescriptor);
     MOZ_ASSERT(aCompositable);
     MOZ_ASSERT(aCompositable->GetIPDLActor());
     mTxn->AddPaint(OpPaintTexture(nullptr, aCompositable->GetIPDLActor(), 1,
                                   SurfaceDescriptor(*aDescriptor)));
     *aDescriptor = SurfaceDescriptor();
   } else {
     NS_WARNING("Trying to send a null SurfaceDescriptor.");
   }
@@ -334,16 +352,17 @@ ShadowLayerForwarder::UpdateTexture(Comp
 
 void
 ShadowLayerForwarder::UpdateTextureNoSwap(CompositableClient* aCompositable,
                                           TextureIdentifier aTextureId,
                                           SurfaceDescriptor* aDescriptor)
 {
   if (aDescriptor->type() != SurfaceDescriptor::T__None &&
       aDescriptor->type() != SurfaceDescriptor::Tnull_t) {
+    CheckSurfaceDescriptor(aDescriptor);
     MOZ_ASSERT(aCompositable);
     MOZ_ASSERT(aCompositable->GetIPDLActor());
     mTxn->AddNoSwapPaint(OpPaintTexture(nullptr, aCompositable->GetIPDLActor(), 1,
                                         SurfaceDescriptor(*aDescriptor)));
     *aDescriptor = SurfaceDescriptor();
   } else {
     NS_WARNING("Trying to send a null SurfaceDescriptor.");
   }
@@ -364,16 +383,17 @@ ShadowLayerForwarder::UpdateTextureRegio
 void
 ShadowLayerForwarder::UpdateTextureIncremental(CompositableClient* aCompositable,
                                                TextureIdentifier aTextureId,
                                                SurfaceDescriptor& aDescriptor,
                                                const nsIntRegion& aUpdatedRegion,
                                                const nsIntRect& aBufferRect,
                                                const nsIntPoint& aBufferRotation)
 {
+  CheckSurfaceDescriptor(&aDescriptor);
   MOZ_ASSERT(aCompositable);
   MOZ_ASSERT(aCompositable->GetIPDLActor());
   mTxn->AddNoSwapPaint(OpPaintTextureIncremental(nullptr, aCompositable->GetIPDLActor(),
                                                  aTextureId,
                                                  aDescriptor,
                                                  aUpdatedRegion,
                                                  aBufferRect,
                                                  aBufferRotation));
@@ -391,16 +411,19 @@ bool
 ShadowLayerForwarder::AddTexture(CompositableClient* aCompositable,
                                  TextureClient* aTexture)
 {
   SurfaceDescriptor descriptor;
   if (!aTexture->ToSurfaceDescriptor(descriptor)) {
     NS_WARNING("Failed to serialize a TextureClient");
     return false;
   }
+  CheckSurfaceDescriptor(&descriptor);
+  MOZ_ASSERT(aCompositable);
+  MOZ_ASSERT(aCompositable->GetIPDLActor());
   MOZ_ASSERT(aTexture->GetFlags() != 0);
   mTxn->AddEdit(OpAddTexture(nullptr, aCompositable->GetIPDLActor(),
                              aTexture->GetID(),
                              descriptor,
                              aTexture->GetFlags()));
   return true;
 }
 
@@ -847,16 +870,19 @@ ShadowLayerForwarder::Connect(Compositab
 }
 
 void
 ShadowLayerForwarder::CreatedSingleBuffer(CompositableClient* aCompositable,
                                           const SurfaceDescriptor& aDescriptor,
                                           const TextureInfo& aTextureInfo,
                                           const SurfaceDescriptor* aDescriptorOnWhite)
 {
+  CheckSurfaceDescriptor(&aDescriptor);
+  CheckSurfaceDescriptor(aDescriptorOnWhite);
+
   MOZ_ASSERT(aDescriptor.type() != SurfaceDescriptor::T__None &&
              aDescriptor.type() != SurfaceDescriptor::Tnull_t);
   mTxn->AddEdit(OpCreatedTexture(nullptr, aCompositable->GetIPDLActor(),
                                  TextureFront,
                                  aDescriptor,
                                  aTextureInfo));
   if (aDescriptorOnWhite) {
     mTxn->AddEdit(OpCreatedTexture(nullptr, aCompositable->GetIPDLActor(),
@@ -878,16 +904,20 @@ ShadowLayerForwarder::CreatedIncremental
 void
 ShadowLayerForwarder::CreatedDoubleBuffer(CompositableClient* aCompositable,
                                           const SurfaceDescriptor& aFrontDescriptor,
                                           const SurfaceDescriptor& aBackDescriptor,
                                           const TextureInfo& aTextureInfo,
                                           const SurfaceDescriptor* aFrontDescriptorOnWhite,
                                           const SurfaceDescriptor* aBackDescriptorOnWhite)
 {
+  CheckSurfaceDescriptor(&aFrontDescriptor);
+  CheckSurfaceDescriptor(&aBackDescriptor);
+  CheckSurfaceDescriptor(aFrontDescriptorOnWhite);
+  CheckSurfaceDescriptor(aBackDescriptorOnWhite);
   MOZ_ASSERT(aFrontDescriptor.type() != SurfaceDescriptor::T__None &&
              aBackDescriptor.type() != SurfaceDescriptor::T__None &&
              aFrontDescriptor.type() != SurfaceDescriptor::Tnull_t &&
              aBackDescriptor.type() != SurfaceDescriptor::Tnull_t);
   mTxn->AddEdit(OpCreatedTexture(nullptr, aCompositable->GetIPDLActor(),
                                  TextureFront,
                                  aFrontDescriptor,
                                  aTextureInfo));
--- a/gfx/layers/ipc/ShadowLayers.h
+++ b/gfx/layers/ipc/ShadowLayers.h
@@ -408,16 +408,22 @@ public:
   static void PlatformSyncBeforeUpdate();
 
   static already_AddRefed<gfxASurface>
   OpenDescriptor(OpenMode aMode, const SurfaceDescriptor& aSurface);
 
 protected:
   ShadowLayerForwarder();
 
+#ifdef DEBUG
+  void CheckSurfaceDescriptor(const SurfaceDescriptor* aDescriptor) const;
+#else
+  void CheckSurfaceDescriptor(const SurfaceDescriptor* aDescriptor) const {}
+#endif
+
   PLayerTransactionChild* mShadowManager;
 
 #ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
   // from ISurfaceAllocator
   virtual PGrallocBufferChild* AllocGrallocBuffer(const gfxIntSize& aSize,
                                                   uint32_t aFormat,
                                                   uint32_t aUsage,
                                                   MaybeMagicGrallocBufferHandle* aHandle) MOZ_OVERRIDE;
--- a/ipc/glue/Shmem.h
+++ b/ipc/glue/Shmem.h
@@ -49,21 +49,29 @@
  * If parent code wants to give access rights to the Shmem to the
  * child, it does so by sending its |Shmem| to the child, in an IPDL
  * message.  The parent's |Shmem| then "dies", i.e. becomes
  * inaccessible.  This process could be compared to passing a
  * "shmem-access baton" between parent and child.
  */
 
 namespace mozilla {
+namespace layers {
+class ShadowLayerForwarder;
+}
+
 namespace ipc {
 
 class Shmem MOZ_FINAL
 {
   friend struct IPC::ParamTraits<mozilla::ipc::Shmem>;
+#ifdef DEBUG
+  // For ShadowLayerForwarder::CheckSurfaceDescriptor
+  friend class mozilla::layers::ShadowLayerForwarder;
+#endif
 
 public:
   typedef int32_t id_t;
   // Low-level wrapper around platform shmem primitives.
   typedef mozilla::ipc::SharedMemory SharedMemory;
   typedef SharedMemory::SharedMemoryType SharedMemoryType;
   struct IHadBetterBeIPDLCodeCallingThis_OtherwiseIAmADoodyhead {};
 
--- a/js/src/frontend/BytecodeEmitter.cpp
+++ b/js/src/frontend/BytecodeEmitter.cpp
@@ -2618,16 +2618,32 @@ EmitSwitch(ExclusiveContext *cx, Bytecod
     if (pn->pn_right->isKind(PNK_LEXICALSCOPE))
         EMIT_UINT16_IMM_OP(JSOP_LEAVEBLOCK, blockObjCount);
 #endif
 
     return true;
 }
 
 bool
+BytecodeEmitter::isRunOnceLambda()
+{
+    // The run once lambda flags set by the parser are approximate, and we look
+    // at properties of the function itself before deciding to emit a function
+    // as a run once lambda.
+
+    if (!(parent && parent->emittingRunOnceLambda) && !lazyRunOnceLambda)
+        return false;
+
+    FunctionBox *funbox = sc->asFunctionBox();
+    return !funbox->argumentsHasLocalBinding() &&
+           !funbox->isGenerator() &&
+           !funbox->function()->name();
+}
+
+bool
 frontend::EmitFunctionScript(ExclusiveContext *cx, BytecodeEmitter *bce, ParseNode *body)
 {
     /*
      * The decompiler has assumptions about what may occur immediately after
      * script->main (e.g., in the case of destructuring params). Thus, put the
      * following ops into the range [script->code, script->main). Note:
      * execution starts from script->code, so this has no semantic effect.
      */
@@ -2662,21 +2678,17 @@ frontend::EmitFunctionScript(ExclusiveCo
         bce->switchToMain();
     }
 
     /*
      * Emit a prologue for run-once scripts which will deoptimize JIT code if
      * the script ends up running multiple times via foo.caller related
      * shenanigans.
      */
-    bool runOnce =
-        bce->isRunOnceLambda() &&
-        !funbox->argumentsHasLocalBinding() &&
-        !funbox->isGenerator() &&
-        !funbox->function()->name();
+    bool runOnce = bce->isRunOnceLambda();
     if (runOnce) {
         bce->switchToProlog();
         if (Emit1(cx, bce, JSOP_RUNONCE) < 0)
             return false;
         bce->switchToMain();
     }
 
     if (!EmitTree(cx, bce, body))
--- a/js/src/frontend/BytecodeEmitter.h
+++ b/js/src/frontend/BytecodeEmitter.h
@@ -122,19 +122,17 @@ struct BytecodeEmitter
 
     bool            emittingForInit:1;  /* true while emitting init expr of for; exclude 'in' */
 
     bool            emittingRunOnceLambda:1; /* true while emitting a lambda which is only
                                                 expected to run once. */
     bool            lazyRunOnceLambda:1; /* true while lazily emitting a script for
                                           * a lambda which is only expected to run once. */
 
-    bool isRunOnceLambda() {
-        return (parent && parent->emittingRunOnceLambda) || lazyRunOnceLambda;
-    }
+    bool isRunOnceLambda();
 
     bool            insideEval:1;       /* True if compiling an eval-expression or a function
                                            nested inside an eval. */
 
     const bool      hasGlobalScope:1;   /* frontend::CompileScript's scope chain is the
                                            global object */
 
     enum EmitterMode {
--- a/js/src/jit/IonFrames.cpp
+++ b/js/src/jit/IonFrames.cpp
@@ -1244,36 +1244,43 @@ SnapshotIterator::slotReadable(const Slo
           return hasLocation(slot.value());
 #endif
 
       default:
         return true;
     }
 }
 
+typedef union {
+    double d;
+    float f;
+} PunDoubleFloat;
+
 Value
 SnapshotIterator::slotValue(const Slot &slot)
 {
     switch (slot.mode()) {
       case SnapshotReader::DOUBLE_REG:
         return DoubleValue(machine_.read(slot.floatReg()));
 
       case SnapshotReader::FLOAT32_REG:
       {
-        double asDouble = machine_.read(slot.floatReg());
+        PunDoubleFloat pdf;
+        pdf.d = machine_.read(slot.floatReg());
         // The register contains the encoding of a float32. We just read
         // the bits without making any conversion.
-        float asFloat = *(float*) &asDouble;
+        float asFloat = pdf.f;
         return DoubleValue(asFloat);
       }
 
       case SnapshotReader::FLOAT32_STACK:
       {
-        double asDouble = ReadFrameDoubleSlot(fp_, slot.stackSlot());
-        float asFloat = *(float*) &asDouble; // no conversion, see comment above.
+        PunDoubleFloat pdf;
+        pdf.d = ReadFrameDoubleSlot(fp_, slot.stackSlot());
+        float asFloat = pdf.f; // no conversion, see comment above.
         return DoubleValue(asFloat);
       }
 
       case SnapshotReader::TYPED_REG:
         return FromTypedPayload(slot.knownType(), machine_.read(slot.reg()));
 
       case SnapshotReader::TYPED_STACK:
       {
--- a/js/src/vm/SelfHosting.cpp
+++ b/js/src/vm/SelfHosting.cpp
@@ -76,16 +76,22 @@ js::intrinsic_IsCallable(JSContext *cx, 
 
 bool
 js::intrinsic_ThrowError(JSContext *cx, unsigned argc, Value *vp)
 {
     CallArgs args = CallArgsFromVp(argc, vp);
     JS_ASSERT(args.length() >= 1);
     uint32_t errorNumber = args[0].toInt32();
 
+#ifdef DEBUG
+    const JSErrorFormatString *efs =
+        js_GetLocalizedErrorMessage(cx, NULL, NULL, errorNumber);
+    JS_ASSERT(efs->argCount == args.length() - 1);
+#endif
+
     char *errorArgs[3] = {nullptr, nullptr, nullptr};
     for (unsigned i = 1; i < 4 && i < args.length(); i++) {
         RootedValue val(cx, args[i]);
         if (val.isInt32()) {
             JSString *str = ToString<CanGC>(cx, val);
             if (!str)
                 return false;
             errorArgs[i - 1] = JS_EncodeString(cx, str);
--- a/js/src/vm/ThreadPool.h
+++ b/js/src/vm/ThreadPool.h
@@ -10,17 +10,16 @@
 #include <stddef.h>
 #include <stdint.h>
 
 #include "jsalloc.h"
 #include "jspubtd.h"
 #ifdef JS_THREADSAFE
 # include "prcvar.h"
 # include "prlock.h"
-# include "prtypes.h"
 #endif
 
 #include "js/Vector.h"
 
 struct JSRuntime;
 struct JSCompartment;
 
 namespace js {
--- a/layout/svg/nsSVGGlyphFrame.cpp
+++ b/layout/svg/nsSVGGlyphFrame.cpp
@@ -1070,93 +1070,16 @@ nsSVGGlyphFrame::SetupContextPaint(gfxCo
     return false;
   }
 
   aContext->SetPattern(pattern);
   return true;
 }
 
 //----------------------------------------------------------------------
-// SVGTextContextPaint methods:
-
-already_AddRefed<gfxPattern>
-mozilla::SVGTextContextPaint::GetFillPattern(float aOpacity,
-                                            const gfxMatrix& aCTM)
-{
-  return mFillPaint.GetPattern(aOpacity, &nsStyleSVG::mFill, aCTM);
-}
-
-already_AddRefed<gfxPattern>
-mozilla::SVGTextContextPaint::GetStrokePattern(float aOpacity,
-                                              const gfxMatrix& aCTM)
-{
-  return mStrokePaint.GetPattern(aOpacity, &nsStyleSVG::mStroke, aCTM);
-}
-
-already_AddRefed<gfxPattern>
-mozilla::SVGTextContextPaint::Paint::GetPattern(float aOpacity,
-                                               nsStyleSVGPaint nsStyleSVG::*aFillOrStroke,
-                                               const gfxMatrix& aCTM)
-{
-  nsRefPtr<gfxPattern> pattern;
-  if (mPatternCache.Get(aOpacity, getter_AddRefs(pattern))) {
-    // Set the pattern matrix just in case it was messed with by a previous
-    // caller. We should get the same matrix each time a pattern is constructed
-    // so this should be fine.
-    pattern->SetMatrix(aCTM * mPatternMatrix);
-    return pattern.forget();
-  }
-
-  switch (mPaintType) {
-  case eStyleSVGPaintType_None:
-    pattern = new gfxPattern(gfxRGBA(0.0f, 0.0f, 0.0f, 0.0f));
-    mPatternMatrix = gfxMatrix();
-    break;
-  case eStyleSVGPaintType_Color:
-    pattern = new gfxPattern(gfxRGBA(NS_GET_R(mPaintDefinition.mColor) / 255.0,
-                                     NS_GET_G(mPaintDefinition.mColor) / 255.0,
-                                     NS_GET_B(mPaintDefinition.mColor) / 255.0,
-                                     NS_GET_A(mPaintDefinition.mColor) / 255.0 * aOpacity));
-    mPatternMatrix = gfxMatrix();
-    break;
-  case eStyleSVGPaintType_Server:
-    pattern = mPaintDefinition.mPaintServerFrame->GetPaintServerPattern(mFrame,
-                                                                        mContextMatrix,
-                                                                        aFillOrStroke,
-                                                                        aOpacity);
-    {
-      // m maps original-user-space to pattern space
-      gfxMatrix m = pattern->GetMatrix();
-      gfxMatrix deviceToOriginalUserSpace = mContextMatrix;
-      deviceToOriginalUserSpace.Invert();
-      // mPatternMatrix maps device space to pattern space via original user space
-      mPatternMatrix = deviceToOriginalUserSpace * m;
-    }
-    pattern->SetMatrix(aCTM * mPatternMatrix);
-    break;
-  case eStyleSVGPaintType_ContextFill:
-    pattern = mPaintDefinition.mContextPaint->GetFillPattern(aOpacity, aCTM);
-    // Don't cache this. mContextPaint will have cached it anyway. If we
-    // cache it, we'll have to compute mPatternMatrix, which is annoying.
-    return pattern.forget();
-  case eStyleSVGPaintType_ContextStroke:
-    pattern = mPaintDefinition.mContextPaint->GetStrokePattern(aOpacity, aCTM);
-    // Don't cache this. mContextPaint will have cached it anyway. If we
-    // cache it, we'll have to compute mPatternMatrix, which is annoying.
-    return pattern.forget();
-  default:
-    MOZ_ASSERT(false, "invalid paint type");
-    return nullptr;
-  }
-
-  mPatternCache.Put(aOpacity, pattern);
-  return pattern.forget();
-}
-
-//----------------------------------------------------------------------
 // Internal methods
 
 void
 nsSVGGlyphFrame::SetGlyphPosition(gfxPoint *aPosition, bool aForceGlobalTransform)
 {
   float drawScale, metricsScale;
 
   nsSVGTextPathFrame *textPath = FindTextPathParent();
--- a/layout/svg/nsSVGGlyphFrame.h
+++ b/layout/svg/nsSVGGlyphFrame.h
@@ -6,16 +6,17 @@
 #ifndef __NS_SVGGLYPHFRAME_H__
 #define __NS_SVGGLYPHFRAME_H__
 
 #include "mozilla/Attributes.h"
 #include "gfxSVGGlyphs.h"
 #include "nsISVGChildFrame.h"
 #include "nsISVGGlyphFragmentNode.h"
 #include "nsSVGGeometryFrame.h"
+#include "nsSVGTextFrame2.h" // for SVGTextContextPaint
 #include "nsSVGUtils.h"
 #include "nsTextFragment.h"
 #include "nsIContent.h"
 #include "DrawMode.h"
 
 class CharacterIterator;
 class gfxContext;
 class nsDisplaySVGGlyphs;
@@ -23,87 +24,20 @@ class nsRenderingContext;
 class nsSVGGlyphFrame;
 class nsSVGTextFrame;
 class nsSVGTextPathFrame;
 class gfxTextContextPaint;
 
 struct CharacterPosition;
 
 namespace mozilla {
-
 namespace dom {
 class SVGIRect;
 }
-
-// Slightly horrible callback for deferring application of opacity
-struct SVGTextContextPaint : public gfxTextContextPaint {
-  already_AddRefed<gfxPattern> GetFillPattern(float aOpacity,
-                                              const gfxMatrix& aCTM) MOZ_OVERRIDE;
-  already_AddRefed<gfxPattern> GetStrokePattern(float aOpacity,
-                                                const gfxMatrix& aCTM) MOZ_OVERRIDE;
-
-  void SetFillOpacity(float aOpacity) { mFillOpacity = aOpacity; }
-  float GetFillOpacity() MOZ_OVERRIDE { return mFillOpacity; }
-
-  void SetStrokeOpacity(float aOpacity) { mStrokeOpacity = aOpacity; }
-  float GetStrokeOpacity() MOZ_OVERRIDE { return mStrokeOpacity; }
-
-  struct Paint {
-    Paint() : mPaintType(eStyleSVGPaintType_None) {}
-
-    void SetPaintServer(nsIFrame *aFrame, const gfxMatrix& aContextMatrix,
-                        nsSVGPaintServerFrame *aPaintServerFrame) {
-      mPaintType = eStyleSVGPaintType_Server;
-      mPaintDefinition.mPaintServerFrame = aPaintServerFrame;
-      mFrame = aFrame;
-      mContextMatrix = aContextMatrix;
-    }
-
-    void SetColor(const nscolor &aColor) {
-      mPaintType = eStyleSVGPaintType_Color;
-      mPaintDefinition.mColor = aColor;
-    }
-
-    void SetContextPaint(gfxTextContextPaint *aContextPaint,
-                         nsStyleSVGPaintType aPaintType) {
-      NS_ASSERTION(aPaintType == eStyleSVGPaintType_ContextFill ||
-                   aPaintType == eStyleSVGPaintType_ContextStroke,
-                   "Invalid context paint type");
-      mPaintType = aPaintType;
-      mPaintDefinition.mContextPaint = aContextPaint;
-    }
-
-    union {
-      nsSVGPaintServerFrame *mPaintServerFrame;
-      gfxTextContextPaint *mContextPaint;
-      nscolor mColor;
-    } mPaintDefinition;
-
-    nsIFrame *mFrame;
-    // CTM defining the user space for the pattern we will use.
-    gfxMatrix mContextMatrix;
-    nsStyleSVGPaintType mPaintType;
-
-    // Device-space-to-pattern-space
-    gfxMatrix mPatternMatrix;
-    nsRefPtrHashtable<nsFloatHashKey, gfxPattern> mPatternCache;
-
-    already_AddRefed<gfxPattern> GetPattern(float aOpacity,
-                                            nsStyleSVGPaint nsStyleSVG::*aFillOrStroke,
-                                            const gfxMatrix& aCTM);
-  };
-
-  Paint mFillPaint;
-  Paint mStrokePaint;
-
-  float mFillOpacity;
-  float mStrokeOpacity;
-};
-
-} // namespace mozilla
+}
 
 using namespace mozilla;
 
 typedef nsSVGGeometryFrame nsSVGGlyphFrameBase;
 
 class nsSVGGlyphFrame : public nsSVGGlyphFrameBase,
                         public nsISVGGlyphFragmentNode,
                         public nsISVGChildFrame
--- a/layout/svg/nsSVGTextFrame2.cpp
+++ b/layout/svg/nsSVGTextFrame2.cpp
@@ -2964,18 +2964,96 @@ SVGTextDrawPathCallbacks::StrokeGeometry
       mColor == NS_40PERCENT_FOREGROUND_COLOR) {
     // Don't paint the stroke when we are filling with a selection color.
     if (nsSVGUtils::SetupCairoStroke(mFrame, gfx)) {
       gfx->Stroke();
     }
   }
 }
 
+//----------------------------------------------------------------------
+// SVGTextContextPaint methods:
+
+already_AddRefed<gfxPattern>
+SVGTextContextPaint::GetFillPattern(float aOpacity,
+                                    const gfxMatrix& aCTM)
+{
+  return mFillPaint.GetPattern(aOpacity, &nsStyleSVG::mFill, aCTM);
 }
 
+already_AddRefed<gfxPattern>
+SVGTextContextPaint::GetStrokePattern(float aOpacity,
+                                      const gfxMatrix& aCTM)
+{
+  return mStrokePaint.GetPattern(aOpacity, &nsStyleSVG::mStroke, aCTM);
+}
+
+already_AddRefed<gfxPattern>
+SVGTextContextPaint::Paint::GetPattern(float aOpacity,
+                                       nsStyleSVGPaint nsStyleSVG::*aFillOrStroke,
+                                       const gfxMatrix& aCTM)
+{
+  nsRefPtr<gfxPattern> pattern;
+  if (mPatternCache.Get(aOpacity, getter_AddRefs(pattern))) {
+    // Set the pattern matrix just in case it was messed with by a previous
+    // caller. We should get the same matrix each time a pattern is constructed
+    // so this should be fine.
+    pattern->SetMatrix(aCTM * mPatternMatrix);
+    return pattern.forget();
+  }
+
+  switch (mPaintType) {
+  case eStyleSVGPaintType_None:
+    pattern = new gfxPattern(gfxRGBA(0.0f, 0.0f, 0.0f, 0.0f));
+    mPatternMatrix = gfxMatrix();
+    break;
+  case eStyleSVGPaintType_Color:
+    pattern = new gfxPattern(gfxRGBA(NS_GET_R(mPaintDefinition.mColor) / 255.0,
+                                     NS_GET_G(mPaintDefinition.mColor) / 255.0,
+                                     NS_GET_B(mPaintDefinition.mColor) / 255.0,
+                                     NS_GET_A(mPaintDefinition.mColor) / 255.0 * aOpacity));
+    mPatternMatrix = gfxMatrix();
+    break;
+  case eStyleSVGPaintType_Server:
+    pattern = mPaintDefinition.mPaintServerFrame->GetPaintServerPattern(mFrame,
+                                                                        mContextMatrix,
+                                                                        aFillOrStroke,
+                                                                        aOpacity);
+    {
+      // m maps original-user-space to pattern space
+      gfxMatrix m = pattern->GetMatrix();
+      gfxMatrix deviceToOriginalUserSpace = mContextMatrix;
+      deviceToOriginalUserSpace.Invert();
+      // mPatternMatrix maps device space to pattern space via original user space
+      mPatternMatrix = deviceToOriginalUserSpace * m;
+    }
+    pattern->SetMatrix(aCTM * mPatternMatrix);
+    break;
+  case eStyleSVGPaintType_ContextFill:
+    pattern = mPaintDefinition.mContextPaint->GetFillPattern(aOpacity, aCTM);
+    // Don't cache this. mContextPaint will have cached it anyway. If we
+    // cache it, we'll have to compute mPatternMatrix, which is annoying.
+    return pattern.forget();
+  case eStyleSVGPaintType_ContextStroke:
+    pattern = mPaintDefinition.mContextPaint->GetStrokePattern(aOpacity, aCTM);
+    // Don't cache this. mContextPaint will have cached it anyway. If we
+    // cache it, we'll have to compute mPatternMatrix, which is annoying.
+    return pattern.forget();
+  default:
+    MOZ_ASSERT(false, "invalid paint type");
+    return nullptr;
+  }
+
+  mPatternCache.Put(aOpacity, pattern);
+  return pattern.forget();
+}
+
+} // namespace mozilla
+
+
 // ============================================================================
 // nsSVGTextFrame2
 
 // ----------------------------------------------------------------------------
 // Display list item
 
 class nsDisplaySVGText : public nsDisplayItem {
 public:
--- a/layout/svg/nsSVGTextFrame2.h
+++ b/layout/svg/nsSVGTextFrame2.h
@@ -5,18 +5,19 @@
 
 #ifndef NS_SVGTEXTFRAME2_H
 #define NS_SVGTEXTFRAME2_H
 
 #include "mozilla/Attributes.h"
 #include "gfxMatrix.h"
 #include "gfxRect.h"
 #include "gfxSVGGlyphs.h"
+#include "nsIContent.h"
 #include "nsStubMutationObserver.h"
-#include "nsSVGGlyphFrame.h" // for SVGTextContextPaint
+#include "nsSVGPaintServerFrame.h"
 #include "nsSVGTextContainerFrame.h"
 
 class nsDisplaySVGText;
 class nsRenderingContext;
 class nsSVGTextFrame2;
 class nsTextFrame;
 class gfxPath;
 
@@ -130,17 +131,82 @@ public:
   NS_DECL_NSIRUNNABLE
   GlyphMetricsUpdater(nsSVGTextFrame2* aFrame) : mFrame(aFrame) { }
   static void Run(nsSVGTextFrame2* aFrame);
   void Revoke() { mFrame = nullptr; }
 private:
   nsSVGTextFrame2* mFrame;
 };
 
-}
+// Slightly horrible callback for deferring application of opacity
+struct SVGTextContextPaint : public gfxTextContextPaint {
+  already_AddRefed<gfxPattern> GetFillPattern(float aOpacity,
+                                              const gfxMatrix& aCTM) MOZ_OVERRIDE;
+  already_AddRefed<gfxPattern> GetStrokePattern(float aOpacity,
+                                                const gfxMatrix& aCTM) MOZ_OVERRIDE;
+
+  void SetFillOpacity(float aOpacity) { mFillOpacity = aOpacity; }
+  float GetFillOpacity() MOZ_OVERRIDE { return mFillOpacity; }
+
+  void SetStrokeOpacity(float aOpacity) { mStrokeOpacity = aOpacity; }
+  float GetStrokeOpacity() MOZ_OVERRIDE { return mStrokeOpacity; }
+
+  struct Paint {
+    Paint() : mPaintType(eStyleSVGPaintType_None) {}
+
+    void SetPaintServer(nsIFrame *aFrame, const gfxMatrix& aContextMatrix,
+                        nsSVGPaintServerFrame *aPaintServerFrame) {
+      mPaintType = eStyleSVGPaintType_Server;
+      mPaintDefinition.mPaintServerFrame = aPaintServerFrame;
+      mFrame = aFrame;
+      mContextMatrix = aContextMatrix;
+    }
+
+    void SetColor(const nscolor &aColor) {
+      mPaintType = eStyleSVGPaintType_Color;
+      mPaintDefinition.mColor = aColor;
+    }
+
+    void SetContextPaint(gfxTextContextPaint *aContextPaint,
+                         nsStyleSVGPaintType aPaintType) {
+      NS_ASSERTION(aPaintType == eStyleSVGPaintType_ContextFill ||
+                   aPaintType == eStyleSVGPaintType_ContextStroke,
+                   "Invalid context paint type");
+      mPaintType = aPaintType;
+      mPaintDefinition.mContextPaint = aContextPaint;
+    }
+
+    union {
+      nsSVGPaintServerFrame *mPaintServerFrame;
+      gfxTextContextPaint *mContextPaint;
+      nscolor mColor;
+    } mPaintDefinition;
+
+    nsIFrame *mFrame;
+    // CTM defining the user space for the pattern we will use.
+    gfxMatrix mContextMatrix;
+    nsStyleSVGPaintType mPaintType;
+
+    // Device-space-to-pattern-space
+    gfxMatrix mPatternMatrix;
+    nsRefPtrHashtable<nsFloatHashKey, gfxPattern> mPatternCache;
+
+    already_AddRefed<gfxPattern> GetPattern(float aOpacity,
+                                            nsStyleSVGPaint nsStyleSVG::*aFillOrStroke,
+                                            const gfxMatrix& aCTM);
+  };
+
+  Paint mFillPaint;
+  Paint mStrokePaint;
+
+  float mFillOpacity;
+  float mStrokeOpacity;
+};
+
+} // namespace mozilla
 
 /**
  * Frame class for SVG <text> elements, used when the
  * layout.svg.css-text.enabled is true.
  *
  * An nsSVGTextFrame2 manages SVG text layout, painting and interaction for
  * all descendent text content elements.  The frame tree will look like this:
  *
@@ -180,16 +246,18 @@ class nsSVGTextFrame2 : public nsSVGText
   friend class mozilla::GlyphMetricsUpdater;
   friend class mozilla::TextFrameIterator;
   friend class mozilla::TextNodeCorrespondenceRecorder;
   friend struct mozilla::TextRenderedRun;
   friend class mozilla::TextRenderedRunIterator;
   friend class MutationObserver;
   friend class nsDisplaySVGText;
 
+  typedef mozilla::SVGTextContextPaint SVGTextContextPaint;
+
 protected:
   nsSVGTextFrame2(nsStyleContext* aContext)
     : nsSVGTextFrame2Base(aContext),
       mFontSizeScaleFactor(1.0f),
       mLastContextScale(1.0f),
       mLengthAdjustScaleFactor(1.0f)
   {
     AddStateBits(NS_STATE_SVG_POSITIONING_DIRTY);
--- a/media/webrtc/signaling/src/common/browser_logging/CSFLog.cpp
+++ b/media/webrtc/signaling/src/common/browser_logging/CSFLog.cpp
@@ -3,17 +3,16 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include <stdio.h>
 #include <string.h>
 #include <stdarg.h>
 
 #include "CSFLog.h"
 #include "base/basictypes.h"
-#include "prtypes.h"
 
 #include <map>
 #include "cpr_threads.h"
 #include "prrwlock.h"
 #include "prthread.h"
 #include "nsThreadUtils.h"
 #ifndef WIN32
 #include <pthread.h>
--- a/media/webrtc/signaling/src/sipcc/core/common/thread_monitor.c
+++ b/media/webrtc/signaling/src/sipcc/core/common/thread_monitor.c
@@ -1,16 +1,15 @@
 /* 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/. */
 
 #include "cpr_types.h"
 #include "cpr_stdlib.h"
 #include "thread_monitor.h"
-#include "prtypes.h"
 #include "mozilla/Assertions.h"
 
 /*
  * If thread is running, should have a non-zero entry here that is the threadId
  */
 static cprThread_t thread_list[THREADMON_MAX];
 static boolean wait_list[THREADMON_MAX];
 
--- a/mobile/android/components/HelperAppDialog.js
+++ b/mobile/android/components/HelperAppDialog.js
@@ -29,42 +29,102 @@ HelperAppLauncherDialog.prototype = {
     let defaultHandler = new Object();
     let apps = HelperApps.getAppsForUri(aLauncher.source, {
       mimeType: aLauncher.MIMEInfo.MIMEType,
     });
 
     // Add a fake intent for save to disk at the top of the list
     apps.unshift({
       name: bundle.GetStringFromName("helperapps.saveToDisk"),
+      packageName: "org.mozilla.gecko.Download",
       iconUri: "drawable://icon",
       launch: function() {
         // Reset the preferredAction here
         aLauncher.MIMEInfo.preferredAction = Ci.nsIMIMEInfo.saveToDisk;
         aLauncher.saveToDisk(null, false);
         return true;
       }
     });
 
-    let app = apps[0];
-    if (apps.length > 1) {
-      app = HelperApps.prompt(apps, {
-        title: bundle.GetStringFromName("helperapps.pick")
+    // See if the user already marked something as the default for this mimetype,
+    // and if that app is still installed.
+    let preferredApp = this._getPreferredApp(aLauncher);
+    if (preferredApp) {
+      let pref = apps.filter(function(app) {
+        return app.packageName === preferredApp;
       });
+
+      if (pref.length > 0) {
+        pref[0].launch(aLauncher.source);
+        return;
+      }
+    }
+
+    let callback = function(app) {
+      aLauncher.MIMEInfo.preferredAction = Ci.nsIMIMEInfo.useHelperApp;
+      app.launch(aLauncher.source);
+      if (!app.launch(aLauncher.source)) {
+        aLauncher.cancel(Cr.NS_BINDING_ABORTED);
+      }
     }
 
-    if (app) {
-      aLauncher.MIMEInfo.preferredAction = Ci.nsIMIMEInfo.useHelperApp;
-      if (!app.launch(aLauncher.source)) {
-        aLauncher.cancel();
-      }
+    if (apps.length > 1) {
+      HelperApps.prompt(apps, {
+        title: bundle.GetStringFromName("helperapps.pick"),
+        buttons: [
+          bundle.GetStringFromName("helperapps.alwaysUse"),
+          bundle.GetStringFromName("helperapps.useJustOnce")
+        ]
+      }, (data) => {
+        if (data.button < 0)
+          return;
+
+        callback(apps[data.icongrid0]);
+
+        if (data.button == 0)
+          this._setPreferredApp(aLauncher, apps[data.icongrid0]);
+      });
     } else {
-      // Something weird happened. Log an error
-      Services.console.logStringMessage("Unexpected selection from grid: " + app);
+      callback(apps[0]);
     }
+  },
 
+  _getPrefName: function getPrefName(mimetype) {
+    return "browser.download.preferred." + mimetype.replace("\\", ".");
+  },
+
+  _getMimeTypeFromLauncher: function getMimeTypeFromLauncher(launcher) {
+    let mime = launcher.MIMEInfo.MIMEType;
+    if (!mime)
+      mime = ContentAreaUtils.getMIMETypeForURI(launcher.source) || "";
+    return mime;
+  },
+
+  _getPreferredApp: function getPreferredApp(launcher) {
+    let mime = this._getMimeTypeFromLauncher(launcher);
+    if (!mime)
+      return;
+
+    try {
+      return Services.prefs.getCharPref(this._getPrefName(mime));
+    } catch(ex) {
+      Services.console.logStringMessage("Error getting pref for " + mime + " " + ex);
+    }
+    return null;
+  },
+
+  _setPreferredApp: function setPreferredApp(launcher, app) {
+    let mime = this._getMimeTypeFromLauncher(launcher);
+    if (!mime)
+      return;
+
+    if (app)
+      Services.prefs.setCharPref(this._getPrefName(mime), app.packageName);
+    else
+      Services.prefs.clearUserPref(this._getPrefName(mime));
   },
 
   promptForSaveToFile: function hald_promptForSaveToFile(aLauncher, aContext, aDefaultFile, aSuggestedFileExt, aForcePrompt) {
     // Retrieve the user's default download directory
     let dnldMgr = Cc["@mozilla.org/download-manager;1"].getService(Ci.nsIDownloadManager);
     let defaultFolder = dnldMgr.userDownloadsDirectory;
 
     try {
--- a/mobile/android/locales/en-US/chrome/browser.properties
+++ b/mobile/android/locales/en-US/chrome/browser.properties
@@ -260,16 +260,18 @@ helperapps.open=Open
 helperapps.ignore=Ignore
 helperapps.dontAskAgain=Don't ask again for this site
 helperapps.openWithApp2=Open With %S App
 helperapps.openWithList2=Open With an App
 helperapps.always=Always
 helperapps.never=Never
 helperapps.pick=Complete action using
 helperapps.saveToDisk=Download
+helperapps.alwaysUse=Always
+helperapps.useJustOnce=Just once
 
 #Lightweight themes
 # LOCALIZATION NOTE (lwthemeInstallRequest.message): %S will be replaced with
 # the host name of the site.
 lwthemeInstallRequest.message=This site (%S) attempted to install a theme.
 lwthemeInstallRequest.allowButton=Allow
 
 # LOCALIZATION NOTE (getUserMedia.shareCamera.message, getUserMedia.shareMicrophone.message, getUserMedia.shareCameraAndMicrophone.message, getUserMedia.sharingCamera.message, getUserMedia.sharingMicrophone.message, getUserMedia.sharingCameraAndMicrophone.message): %S is the website origin (e.g. www.mozilla.org)
deleted file mode 100644
deleted file mode 100644
deleted file mode 100644
--- a/mobile/android/services/android-drawable-mdpi-resources.mn
+++ /dev/null
@@ -1,2 +0,0 @@
-mobile/android/base/resources/drawable-mdpi/sync_desktop.png
-mobile/android/base/resources/drawable-mdpi/sync_mobile.png
deleted file mode 100644
--- a/mobile/android/services/android-drawable-resources.mn
+++ /dev/null
@@ -1,1 +0,0 @@
-mobile/android/base/resources/drawable/sync_pin_background.xml
deleted file mode 100644
--- a/mobile/android/services/android-layout-resources.mn
+++ /dev/null
@@ -1,11 +0,0 @@
-res/layout/sync_account.xml
-res/layout/sync_list_item.xml
-res/layout/sync_redirect_to_setup.xml
-res/layout/sync_send_tab.xml
-res/layout/sync_setup.xml
-res/layout/sync_setup_failure.xml
-res/layout/sync_setup_jpake_waiting.xml
-res/layout/sync_setup_nointernet.xml
-res/layout/sync_setup_pair.xml
-res/layout/sync_setup_success.xml
-res/layout/sync_setup_webview.xml
deleted file mode 100644
--- a/mobile/android/services/android-values-resources.mn
+++ /dev/null
@@ -1,1 +0,0 @@
-res/values-large-v11/sync_styles.xml 
deleted file mode 100644
--- a/mobile/android/services/java-sources.mn
+++ /dev/null
@@ -1,289 +0,0 @@
-background/announcements/Announcement.java
-background/announcements/AnnouncementPresenter.java
-background/announcements/AnnouncementsBroadcastReceiver.java
-background/announcements/AnnouncementsBroadcastService.java
-background/announcements/AnnouncementsFetchDelegate.java
-background/announcements/AnnouncementsFetcher.java
-background/announcements/AnnouncementsFetchResourceDelegate.java
-background/announcements/AnnouncementsService.java
-background/BackgroundService.java
-background/bagheera/BagheeraClient.java
-background/bagheera/BagheeraRequestDelegate.java
-background/bagheera/BoundedByteArrayEntity.java
-background/bagheera/DeflateHelper.java
-background/common/DateUtils.java
-background/common/log/Logger.java
-background/common/log/writers/AndroidLevelCachingLogWriter.java
-background/common/log/writers/AndroidLogWriter.java
-background/common/log/writers/LevelFilteringLogWriter.java
-background/common/log/writers/LogWriter.java
-background/common/log/writers/PrintLogWriter.java
-background/common/log/writers/SimpleTagLogWriter.java
-background/common/log/writers/StringLogWriter.java
-background/common/log/writers/TagLogWriter.java
-background/common/log/writers/ThreadLocalTagLogWriter.java
-background/datareporting/TelemetryRecorder.java
-background/db/CursorDumper.java
-background/db/Tab.java
-background/healthreport/Environment.java
-background/healthreport/EnvironmentBuilder.java
-background/healthreport/EnvironmentV1.java
-background/healthreport/HealthReportBroadcastReceiver.java
-background/healthreport/HealthReportBroadcastService.java
-background/healthreport/HealthReportDatabases.java
-background/healthreport/HealthReportDatabaseStorage.java
-background/healthreport/HealthReportGenerator.java
-background/healthreport/HealthReportProvider.java
-background/healthreport/HealthReportStorage.java
-background/healthreport/HealthReportUtils.java
-background/healthreport/ProfileInformationCache.java
-background/healthreport/prune/HealthReportPruneService.java
-background/healthreport/prune/PrunePolicy.java
-background/healthreport/prune/PrunePolicyDatabaseStorage.java
-background/healthreport/prune/PrunePolicyStorage.java
-background/healthreport/upload/AndroidSubmissionClient.java
-background/healthreport/upload/HealthReportUploadService.java
-background/healthreport/upload/ObsoleteDocumentTracker.java
-background/healthreport/upload/SubmissionClient.java
-background/healthreport/upload/SubmissionPolicy.java
-sync/AlreadySyncingException.java
-sync/CollectionKeys.java
-sync/CommandProcessor.java
-sync/CommandRunner.java
-sync/config/AccountPickler.java
-sync/config/activities/SelectEnginesActivity.java
-sync/config/ClientRecordTerminator.java
-sync/config/ConfigurationMigrator.java
-sync/CredentialException.java
-sync/CredentialsSource.java
-sync/crypto/CryptoException.java
-sync/crypto/CryptoInfo.java
-sync/crypto/HKDF.java
-sync/crypto/HMACVerificationException.java
-sync/crypto/KeyBundle.java
-sync/crypto/MissingCryptoInputException.java
-sync/crypto/NoKeyBundleException.java
-sync/crypto/PersistedCrypto5Keys.java
-sync/CryptoRecord.java
-sync/DelayedWorkTracker.java
-sync/delegates/ClientsDataDelegate.java
-sync/delegates/FreshStartDelegate.java
-sync/delegates/GlobalSessionCallback.java
-sync/delegates/JSONRecordFetchDelegate.java
-sync/delegates/KeyUploadDelegate.java
-sync/delegates/MetaGlobalDelegate.java
-sync/delegates/WipeServerDelegate.java
-sync/EngineSettings.java
-sync/ExtendedJSONObject.java
-sync/GlobalSession.java
-sync/HTTPFailureException.java
-sync/InfoCollections.java
-sync/InfoCounts.java
-sync/jpake/BigIntegerHelper.java
-sync/jpake/Gx3OrGx4IsZeroOrOneException.java
-sync/jpake/IncorrectZkpException.java
-sync/jpake/JPakeClient.java
-sync/jpake/JPakeCrypto.java
-sync/jpake/JPakeJson.java
-sync/jpake/JPakeNoActivePairingException.java
-sync/jpake/JPakeNumGenerator.java
-sync/jpake/JPakeNumGeneratorRandom.java
-sync/jpake/JPakeParty.java
-sync/jpake/stage/CompleteStage.java
-sync/jpake/stage/ComputeFinalStage.java
-sync/jpake/stage/ComputeKeyVerificationStage.java
-sync/jpake/stage/ComputeStepOneStage.java
-sync/jpake/stage/ComputeStepTwoStage.java
-sync/jpake/stage/DecryptDataStage.java
-sync/jpake/stage/DeleteChannel.java
-sync/jpake/stage/GetChannelStage.java
-sync/jpake/stage/GetRequestStage.java
-sync/jpake/stage/JPakeStage.java
-sync/jpake/stage/PutRequestStage.java
-sync/jpake/stage/VerifyPairingStage.java
-sync/jpake/Zkp.java
-sync/JSONRecordFetcher.java
-sync/KeyBundleProvider.java
-sync/MetaGlobal.java
-sync/MetaGlobalException.java
-sync/MetaGlobalMissingEnginesException.java
-sync/MetaGlobalNotSetException.java
-sync/middleware/Crypto5MiddlewareRepository.java
-sync/middleware/Crypto5MiddlewareRepositorySession.java
-sync/middleware/MiddlewareRepository.java
-sync/middleware/MiddlewareRepositorySession.java
-sync/net/AuthHeaderProvider.java
-sync/net/BaseResource.java
-sync/net/BaseResourceDelegate.java
-sync/net/BasicAuthHeaderProvider.java
-sync/net/BrowserIDAuthHeaderProvider.java
-sync/net/ConnectionMonitorThread.java
-sync/net/HandleProgressException.java
-sync/net/HawkAuthHeaderProvider.java
-sync/net/HMACAuthHeaderProvider.java
-sync/net/HttpResponseObserver.java
-sync/net/Resource.java
-sync/net/ResourceDelegate.java
-sync/net/SyncResponse.java
-sync/net/SyncStorageCollectionRequest.java
-sync/net/SyncStorageCollectionRequestDelegate.java
-sync/net/SyncStorageRecordRequest.java
-sync/net/SyncStorageRequest.java
-sync/net/SyncStorageRequestDelegate.java
-sync/net/SyncStorageRequestIncrementalDelegate.java
-sync/net/SyncStorageResponse.java
-sync/net/TLSSocketFactory.java
-sync/net/WBOCollectionRequestDelegate.java
-sync/net/WBORequestDelegate.java
-sync/NoCollectionKeysSetException.java
-sync/NodeAuthenticationException.java
-sync/NonArrayJSONException.java
-sync/NonObjectJSONException.java
-sync/NullClusterURLException.java
-sync/PersistedMetaGlobal.java
-sync/PrefsSource.java
-sync/receivers/SyncAccountDeletedReceiver.java
-sync/receivers/SyncAccountDeletedService.java
-sync/receivers/UpgradeReceiver.java
-sync/repositories/android/AndroidBrowserBookmarksDataAccessor.java
-sync/repositories/android/AndroidBrowserBookmarksRepository.java
-sync/repositories/android/AndroidBrowserBookmarksRepositorySession.java
-sync/repositories/android/AndroidBrowserHistoryDataAccessor.java
-sync/repositories/android/AndroidBrowserHistoryDataExtender.java
-sync/repositories/android/AndroidBrowserHistoryRepository.java
-sync/repositories/android/AndroidBrowserHistoryRepositorySession.java
-sync/repositories/android/AndroidBrowserRepository.java
-sync/repositories/android/AndroidBrowserRepositoryDataAccessor.java
-sync/repositories/android/AndroidBrowserRepositorySession.java
-sync/repositories/android/BookmarksDeletionManager.java
-sync/repositories/android/BookmarksInsertionManager.java
-sync/repositories/android/BrowserContractHelpers.java
-sync/repositories/android/CachedSQLiteOpenHelper.java
-sync/repositories/android/ClientsDatabase.java
-sync/repositories/android/ClientsDatabaseAccessor.java
-sync/repositories/android/FennecTabsRepository.java
-sync/repositories/android/FormHistoryRepositorySession.java
-sync/repositories/android/PasswordsRepositorySession.java
-sync/repositories/android/RepoUtils.java
-sync/repositories/BookmarkNeedsReparentingException.java
-sync/repositories/BookmarksRepository.java
-sync/repositories/ConstrainedServer11Repository.java
-sync/repositories/delegates/DeferrableRepositorySessionCreationDelegate.java
-sync/repositories/delegates/DeferredRepositorySessionBeginDelegate.java
-sync/repositories/delegates/DeferredRepositorySessionFetchRecordsDelegate.java
-sync/repositories/delegates/DeferredRepositorySessionFinishDelegate.java
-sync/repositories/delegates/DeferredRepositorySessionStoreDelegate.java
-sync/repositories/delegates/RepositorySessionBeginDelegate.java
-sync/repositories/delegates/RepositorySessionCleanDelegate.java
-sync/repositories/delegates/RepositorySessionCreationDelegate.java
-sync/repositories/delegates/RepositorySessionFetchRecordsDelegate.java
-sync/repositories/delegates/RepositorySessionFinishDelegate.java
-sync/repositories/delegates/RepositorySessionGuidsSinceDelegate.java
-sync/repositories/delegates/RepositorySessionStoreDelegate.java
-sync/repositories/delegates/RepositorySessionWipeDelegate.java
-sync/repositories/domain/BookmarkRecord.java
-sync/repositories/domain/BookmarkRecordFactory.java
-sync/repositories/domain/ClientRecord.java
-sync/repositories/domain/ClientRecordFactory.java
-sync/repositories/domain/FormHistoryRecord.java
-sync/repositories/domain/HistoryRecord.java
-sync/repositories/domain/HistoryRecordFactory.java
-sync/repositories/domain/PasswordRecord.java
-sync/repositories/domain/Record.java
-sync/repositories/domain/RecordParseException.java
-sync/repositories/domain/TabsRecord.java
-sync/repositories/domain/VersionConstants.java
-sync/repositories/FetchFailedException.java
-sync/repositories/HashSetStoreTracker.java
-sync/repositories/HistoryRepository.java
-sync/repositories/IdentityRecordFactory.java
-sync/repositories/InactiveSessionException.java
-sync/repositories/InvalidBookmarkTypeException.java
-sync/repositories/InvalidRequestException.java
-sync/repositories/InvalidSessionTransitionException.java
-sync/repositories/MultipleRecordsForGuidException.java
-sync/repositories/NoContentProviderException.java
-sync/repositories/NoGuidForIdException.java
-sync/repositories/NoStoreDelegateException.java
-sync/repositories/NullCursorException.java
-sync/repositories/ParentNotFoundException.java
-sync/repositories/ProfileDatabaseException.java
-sync/repositories/RecordFactory.java
-sync/repositories/RecordFilter.java
-sync/repositories/Repository.java
-sync/repositories/RepositorySession.java
-sync/repositories/RepositorySessionBundle.java
-sync/repositories/Server11Repository.java
-sync/repositories/Server11RepositorySession.java
-sync/repositories/StoreFailedException.java
-sync/repositories/StoreTracker.java
-sync/repositories/StoreTrackingRepositorySession.java
-sync/Server11PreviousPostFailedException.java
-sync/Server11RecordPostFailedException.java
-sync/setup/activities/AccountActivity.java
-sync/setup/activities/ActivityUtils.java
-sync/setup/activities/ClientRecordArrayAdapter.java
-sync/setup/activities/RedirectToSetupActivity.java
-sync/setup/activities/SendTabActivity.java
-sync/setup/activities/SendTabData.java
-sync/setup/activities/SetupFailureActivity.java
-sync/setup/activities/SetupSuccessActivity.java
-sync/setup/activities/SetupSyncActivity.java
-sync/setup/activities/SyncActivity.java
-sync/setup/activities/WebURLFinder.java
-sync/setup/activities/WebViewActivity.java
-sync/setup/auth/AccountAuthenticator.java
-sync/setup/auth/AuthenticateAccountStage.java
-sync/setup/auth/AuthenticationResult.java
-sync/setup/auth/AuthenticatorStage.java
-sync/setup/auth/EnsureUserExistenceStage.java
-sync/setup/auth/FetchUserNodeStage.java
-sync/setup/Constants.java
-sync/setup/InvalidSyncKeyException.java
-sync/setup/SyncAccounts.java
-sync/setup/SyncAuthenticatorService.java
-sync/stage/AbstractNonRepositorySyncStage.java
-sync/stage/AbstractSessionManagingSyncStage.java
-sync/stage/AndroidBrowserBookmarksServerSyncStage.java
-sync/stage/AndroidBrowserHistoryServerSyncStage.java
-sync/stage/CheckPreconditionsStage.java
-sync/stage/CompletedStage.java
-sync/stage/EnsureClusterURLStage.java
-sync/stage/EnsureCrypto5KeysStage.java
-sync/stage/FennecTabsServerSyncStage.java
-sync/stage/FetchInfoCollectionsStage.java
-sync/stage/FetchMetaGlobalStage.java
-sync/stage/FormHistoryServerSyncStage.java
-sync/stage/GlobalSyncStage.java
-sync/stage/NoSuchStageException.java
-sync/stage/NoSyncIDException.java
-sync/stage/PasswordsServerSyncStage.java
-sync/stage/SafeConstrainedServer11Repository.java
-sync/stage/ServerSyncStage.java
-sync/stage/SyncClientsEngineStage.java
-sync/stage/UploadMetaGlobalStage.java
-sync/syncadapter/SyncAdapter.java
-sync/syncadapter/SyncService.java
-sync/SyncConfiguration.java
-sync/SyncConfigurationException.java
-sync/SyncException.java
-sync/synchronizer/ConcurrentRecordConsumer.java
-sync/synchronizer/RecordConsumer.java
-sync/synchronizer/RecordsChannel.java
-sync/synchronizer/RecordsChannelDelegate.java
-sync/synchronizer/RecordsConsumerDelegate.java
-sync/synchronizer/SerialRecordConsumer.java
-sync/synchronizer/ServerLocalSynchronizer.java
-sync/synchronizer/ServerLocalSynchronizerSession.java
-sync/synchronizer/SessionNotBegunException.java
-sync/synchronizer/Synchronizer.java
-sync/synchronizer/SynchronizerDelegate.java
-sync/synchronizer/SynchronizerSession.java
-sync/synchronizer/SynchronizerSessionDelegate.java
-sync/synchronizer/UnbundleError.java
-sync/synchronizer/UnexpectedSessionException.java
-sync/SynchronizerConfiguration.java
-sync/ThreadPool.java
-sync/UnexpectedJSONException.java
-sync/UnknownSynchronizerConfigurationVersionException.java
-sync/Utils.java
deleted file mode 100644
--- a/mobile/android/services/java-third-party-sources.mn
+++ /dev/null
@@ -1,464 +0,0 @@
-ch/boye/httpclientandroidlib/androidextra/HttpClientAndroidLog.java
-ch/boye/httpclientandroidlib/annotation/GuardedBy.java
-ch/boye/httpclientandroidlib/annotation/Immutable.java
-ch/boye/httpclientandroidlib/annotation/NotThreadSafe.java
-ch/boye/httpclientandroidlib/annotation/ThreadSafe.java
-ch/boye/httpclientandroidlib/auth/AUTH.java
-ch/boye/httpclientandroidlib/auth/AuthenticationException.java
-ch/boye/httpclientandroidlib/auth/AuthScheme.java
-ch/boye/httpclientandroidlib/auth/AuthSchemeFactory.java
-ch/boye/httpclientandroidlib/auth/AuthSchemeRegistry.java
-ch/boye/httpclientandroidlib/auth/AuthScope.java
-ch/boye/httpclientandroidlib/auth/AuthState.java
-ch/boye/httpclientandroidlib/auth/BasicUserPrincipal.java
-ch/boye/httpclientandroidlib/auth/ContextAwareAuthScheme.java
-ch/boye/httpclientandroidlib/auth/Credentials.java
-ch/boye/httpclientandroidlib/auth/InvalidCredentialsException.java
-ch/boye/httpclientandroidlib/auth/MalformedChallengeException.java
-ch/boye/httpclientandroidlib/auth/NTCredentials.java
-ch/boye/httpclientandroidlib/auth/NTUserPrincipal.java
-ch/boye/httpclientandroidlib/auth/params/AuthParamBean.java
-ch/boye/httpclientandroidlib/auth/params/AuthParams.java
-ch/boye/httpclientandroidlib/auth/params/AuthPNames.java
-ch/boye/httpclientandroidlib/auth/UsernamePasswordCredentials.java
-ch/boye/httpclientandroidlib/client/AuthCache.java
-ch/boye/httpclientandroidlib/client/AuthenticationHandler.java
-ch/boye/httpclientandroidlib/client/CircularRedirectException.java
-ch/boye/httpclientandroidlib/client/ClientProtocolException.java
-ch/boye/httpclientandroidlib/client/CookieStore.java
-ch/boye/httpclientandroidlib/client/CredentialsProvider.java
-ch/boye/httpclientandroidlib/client/entity/DecompressingEntity.java
-ch/boye/httpclientandroidlib/client/entity/DeflateDecompressingEntity.java
-ch/boye/httpclientandroidlib/client/entity/GzipDecompressingEntity.java
-ch/boye/httpclientandroidlib/client/entity/UrlEncodedFormEntity.java
-ch/boye/httpclientandroidlib/client/HttpClient.java
-ch/boye/httpclientandroidlib/client/HttpRequestRetryHandler.java
-ch/boye/httpclientandroidlib/client/HttpResponseException.java
-ch/boye/httpclientandroidlib/client/methods/AbortableHttpRequest.java
-ch/boye/httpclientandroidlib/client/methods/HttpDelete.java
-ch/boye/httpclientandroidlib/client/methods/HttpEntityEnclosingRequestBase.java
-ch/boye/httpclientandroidlib/client/methods/HttpGet.java
-ch/boye/httpclientandroidlib/client/methods/HttpHead.java
-ch/boye/httpclientandroidlib/client/methods/HttpOptions.java
-ch/boye/httpclientandroidlib/client/methods/HttpPost.java
-ch/boye/httpclientandroidlib/client/methods/HttpPut.java
-ch/boye/httpclientandroidlib/client/methods/HttpRequestBase.java
-ch/boye/httpclientandroidlib/client/methods/HttpTrace.java
-ch/boye/httpclientandroidlib/client/methods/HttpUriRequest.java
-ch/boye/httpclientandroidlib/client/NonRepeatableRequestException.java
-ch/boye/httpclientandroidlib/client/params/AllClientPNames.java
-ch/boye/httpclientandroidlib/client/params/AuthPolicy.java
-ch/boye/httpclientandroidlib/client/params/ClientParamBean.java
-ch/boye/httpclientandroidlib/client/params/ClientPNames.java
-ch/boye/httpclientandroidlib/client/params/CookiePolicy.java
-ch/boye/httpclientandroidlib/client/params/HttpClientParams.java
-ch/boye/httpclientandroidlib/client/protocol/ClientContext.java
-ch/boye/httpclientandroidlib/client/protocol/ClientContextConfigurer.java
-ch/boye/httpclientandroidlib/client/protocol/RequestAcceptEncoding.java
-ch/boye/httpclientandroidlib/client/protocol/RequestAddCookies.java
-ch/boye/httpclientandroidlib/client/protocol/RequestAuthCache.java
-ch/boye/httpclientandroidlib/client/protocol/RequestClientConnControl.java
-ch/boye/httpclientandroidlib/client/protocol/RequestDefaultHeaders.java
-ch/boye/httpclientandroidlib/client/protocol/RequestProxyAuthentication.java
-ch/boye/httpclientandroidlib/client/protocol/RequestTargetAuthentication.java
-ch/boye/httpclientandroidlib/client/protocol/ResponseAuthCache.java
-ch/boye/httpclientandroidlib/client/protocol/ResponseContentEncoding.java
-ch/boye/httpclientandroidlib/client/protocol/ResponseProcessCookies.java
-ch/boye/httpclientandroidlib/client/RedirectException.java
-ch/boye/httpclientandroidlib/client/RedirectHandler.java
-ch/boye/httpclientandroidlib/client/RedirectStrategy.java
-ch/boye/httpclientandroidlib/client/RequestDirector.java
-ch/boye/httpclientandroidlib/client/ResponseHandler.java
-ch/boye/httpclientandroidlib/client/UserTokenHandler.java
-ch/boye/httpclientandroidlib/client/utils/CloneUtils.java
-ch/boye/httpclientandroidlib/client/utils/Idn.java
-ch/boye/httpclientandroidlib/client/utils/JdkIdn.java
-ch/boye/httpclientandroidlib/client/utils/Punycode.java
-ch/boye/httpclientandroidlib/client/utils/Rfc3492Idn.java
-ch/boye/httpclientandroidlib/client/utils/URIUtils.java
-ch/boye/httpclientandroidlib/client/utils/URLEncodedUtils.java
-ch/boye/httpclientandroidlib/conn/BasicEofSensorWatcher.java
-ch/boye/httpclientandroidlib/conn/BasicManagedEntity.java
-ch/boye/httpclientandroidlib/conn/ClientConnectionManager.java
-ch/boye/httpclientandroidlib/conn/ClientConnectionManagerFactory.java
-ch/boye/httpclientandroidlib/conn/ClientConnectionOperator.java
-ch/boye/httpclientandroidlib/conn/ClientConnectionRequest.java
-ch/boye/httpclientandroidlib/conn/ConnectionKeepAliveStrategy.java
-ch/boye/httpclientandroidlib/conn/ConnectionPoolTimeoutException.java
-ch/boye/httpclientandroidlib/conn/ConnectionReleaseTrigger.java
-ch/boye/httpclientandroidlib/conn/ConnectTimeoutException.java
-ch/boye/httpclientandroidlib/conn/EofSensorInputStream.java
-ch/boye/httpclientandroidlib/conn/EofSensorWatcher.java
-ch/boye/httpclientandroidlib/conn/HttpHostConnectException.java
-ch/boye/httpclientandroidlib/conn/HttpRoutedConnection.java
-ch/boye/httpclientandroidlib/conn/ManagedClientConnection.java
-ch/boye/httpclientandroidlib/conn/MultihomePlainSocketFactory.java
-ch/boye/httpclientandroidlib/conn/OperatedClientConnection.java
-ch/boye/httpclientandroidlib/conn/params/ConnConnectionParamBean.java
-ch/boye/httpclientandroidlib/conn/params/ConnConnectionPNames.java
-ch/boye/httpclientandroidlib/conn/params/ConnManagerParamBean.java
-ch/boye/httpclientandroidlib/conn/params/ConnManagerParams.java
-ch/boye/httpclientandroidlib/conn/params/ConnManagerPNames.java
-ch/boye/httpclientandroidlib/conn/params/ConnPerRoute.java
-ch/boye/httpclientandroidlib/conn/params/ConnPerRouteBean.java
-ch/boye/httpclientandroidlib/conn/params/ConnRouteParamBean.java
-ch/boye/httpclientandroidlib/conn/params/ConnRouteParams.java
-ch/boye/httpclientandroidlib/conn/params/ConnRoutePNames.java
-ch/boye/httpclientandroidlib/conn/routing/BasicRouteDirector.java
-ch/boye/httpclientandroidlib/conn/routing/HttpRoute.java
-ch/boye/httpclientandroidlib/conn/routing/HttpRouteDirector.java
-ch/boye/httpclientandroidlib/conn/routing/HttpRoutePlanner.java
-ch/boye/httpclientandroidlib/conn/routing/RouteInfo.java
-ch/boye/httpclientandroidlib/conn/routing/RouteTracker.java
-ch/boye/httpclientandroidlib/conn/scheme/HostNameResolver.java
-ch/boye/httpclientandroidlib/conn/scheme/LayeredSchemeSocketFactory.java
-ch/boye/httpclientandroidlib/conn/scheme/LayeredSchemeSocketFactoryAdaptor.java
-ch/boye/httpclientandroidlib/conn/scheme/LayeredSocketFactory.java
-ch/boye/httpclientandroidlib/conn/scheme/LayeredSocketFactoryAdaptor.java
-ch/boye/httpclientandroidlib/conn/scheme/PlainSocketFactory.java
-ch/boye/httpclientandroidlib/conn/scheme/Scheme.java
-ch/boye/httpclientandroidlib/conn/scheme/SchemeRegistry.java
-ch/boye/httpclientandroidlib/conn/scheme/SchemeSocketFactory.java
-ch/boye/httpclientandroidlib/conn/scheme/SchemeSocketFactoryAdaptor.java
-ch/boye/httpclientandroidlib/conn/scheme/SocketFactory.java
-ch/boye/httpclientandroidlib/conn/scheme/SocketFactoryAdaptor.java
-ch/boye/httpclientandroidlib/conn/ssl/AbstractVerifier.java
-ch/boye/httpclientandroidlib/conn/ssl/AllowAllHostnameVerifier.java
-ch/boye/httpclientandroidlib/conn/ssl/BrowserCompatHostnameVerifier.java
-ch/boye/httpclientandroidlib/conn/ssl/SSLSocketFactory.java
-ch/boye/httpclientandroidlib/conn/ssl/StrictHostnameVerifier.java
-ch/boye/httpclientandroidlib/conn/ssl/TrustManagerDecorator.java
-ch/boye/httpclientandroidlib/conn/ssl/TrustSelfSignedStrategy.java
-ch/boye/httpclientandroidlib/conn/ssl/TrustStrategy.java
-ch/boye/httpclientandroidlib/conn/ssl/X509HostnameVerifier.java
-ch/boye/httpclientandroidlib/conn/util/InetAddressUtils.java
-ch/boye/httpclientandroidlib/ConnectionClosedException.java
-ch/boye/httpclientandroidlib/ConnectionReuseStrategy.java
-ch/boye/httpclientandroidlib/cookie/ClientCookie.java
-ch/boye/httpclientandroidlib/cookie/Cookie.java
-ch/boye/httpclientandroidlib/cookie/CookieAttributeHandler.java
-ch/boye/httpclientandroidlib/cookie/CookieIdentityComparator.java
-ch/boye/httpclientandroidlib/cookie/CookieOrigin.java
-ch/boye/httpclientandroidlib/cookie/CookiePathComparator.java
-ch/boye/httpclientandroidlib/cookie/CookieRestrictionViolationException.java
-ch/boye/httpclientandroidlib/cookie/CookieSpec.java
-ch/boye/httpclientandroidlib/cookie/CookieSpecFactory.java
-ch/boye/httpclientandroidlib/cookie/CookieSpecRegistry.java
-ch/boye/httpclientandroidlib/cookie/MalformedCookieException.java
-ch/boye/httpclientandroidlib/cookie/params/CookieSpecParamBean.java
-ch/boye/httpclientandroidlib/cookie/params/CookieSpecPNames.java
-ch/boye/httpclientandroidlib/cookie/SetCookie.java
-ch/boye/httpclientandroidlib/cookie/SetCookie2.java
-ch/boye/httpclientandroidlib/cookie/SM.java
-ch/boye/httpclientandroidlib/entity/AbstractHttpEntity.java
-ch/boye/httpclientandroidlib/entity/BasicHttpEntity.java
-ch/boye/httpclientandroidlib/entity/BufferedHttpEntity.java
-ch/boye/httpclientandroidlib/entity/ByteArrayEntity.java
-ch/boye/httpclientandroidlib/entity/ContentLengthStrategy.java
-ch/boye/httpclientandroidlib/entity/ContentProducer.java
-ch/boye/httpclientandroidlib/entity/EntityTemplate.java
-ch/boye/httpclientandroidlib/entity/FileEntity.java
-ch/boye/httpclientandroidlib/entity/HttpEntityWrapper.java
-ch/boye/httpclientandroidlib/entity/InputStreamEntity.java
-ch/boye/httpclientandroidlib/entity/SerializableEntity.java
-ch/boye/httpclientandroidlib/entity/StringEntity.java
-ch/boye/httpclientandroidlib/FormattedHeader.java
-ch/boye/httpclientandroidlib/Header.java
-ch/boye/httpclientandroidlib/HeaderElement.java
-ch/boye/httpclientandroidlib/HeaderElementIterator.java
-ch/boye/httpclientandroidlib/HeaderIterator.java
-ch/boye/httpclientandroidlib/HttpClientConnection.java
-ch/boye/httpclientandroidlib/HttpConnection.java
-ch/boye/httpclientandroidlib/HttpConnectionMetrics.java
-ch/boye/httpclientandroidlib/HttpEntity.java
-ch/boye/httpclientandroidlib/HttpEntityEnclosingRequest.java
-ch/boye/httpclientandroidlib/HttpException.java
-ch/boye/httpclientandroidlib/HttpHeaders.java
-ch/boye/httpclientandroidlib/HttpHost.java
-ch/boye/httpclientandroidlib/HttpInetConnection.java
-ch/boye/httpclientandroidlib/HttpMessage.java
-ch/boye/httpclientandroidlib/HttpRequest.java
-ch/boye/httpclientandroidlib/HttpRequestFactory.java
-ch/boye/httpclientandroidlib/HttpRequestInterceptor.java
-ch/boye/httpclientandroidlib/HttpResponse.java
-ch/boye/httpclientandroidlib/HttpResponseFactory.java
-ch/boye/httpclientandroidlib/HttpResponseInterceptor.java
-ch/boye/httpclientandroidlib/HttpServerConnection.java
-ch/boye/httpclientandroidlib/HttpStatus.java
-ch/boye/httpclientandroidlib/HttpVersion.java
-ch/boye/httpclientandroidlib/impl/AbstractHttpClientConnection.java
-ch/boye/httpclientandroidlib/impl/AbstractHttpServerConnection.java
-ch/boye/httpclientandroidlib/impl/auth/AuthSchemeBase.java
-ch/boye/httpclientandroidlib/impl/auth/BasicScheme.java
-ch/boye/httpclientandroidlib/impl/auth/BasicSchemeFactory.java
-ch/boye/httpclientandroidlib/impl/auth/DigestScheme.java
-ch/boye/httpclientandroidlib/impl/auth/DigestSchemeFactory.java
-ch/boye/httpclientandroidlib/impl/auth/NTLMEngine.java
-ch/boye/httpclientandroidlib/impl/auth/NTLMEngineException.java
-ch/boye/httpclientandroidlib/impl/auth/NTLMEngineImpl.java
-ch/boye/httpclientandroidlib/impl/auth/NTLMScheme.java
-ch/boye/httpclientandroidlib/impl/auth/NTLMSchemeFactory.java
-ch/boye/httpclientandroidlib/impl/auth/RFC2617Scheme.java
-ch/boye/httpclientandroidlib/impl/auth/SpnegoTokenGenerator.java
-ch/boye/httpclientandroidlib/impl/auth/UnsupportedDigestAlgorithmException.java
-ch/boye/httpclientandroidlib/impl/client/AbstractAuthenticationHandler.java
-ch/boye/httpclientandroidlib/impl/client/AbstractHttpClient.java
-ch/boye/httpclientandroidlib/impl/client/BasicAuthCache.java
-ch/boye/httpclientandroidlib/impl/client/BasicCookieStore.java
-ch/boye/httpclientandroidlib/impl/client/BasicCredentialsProvider.java
-ch/boye/httpclientandroidlib/impl/client/BasicResponseHandler.java
-ch/boye/httpclientandroidlib/impl/client/ClientParamsStack.java
-ch/boye/httpclientandroidlib/impl/client/ContentEncodingHttpClient.java
-ch/boye/httpclientandroidlib/impl/client/DefaultConnectionKeepAliveStrategy.java
-ch/boye/httpclientandroidlib/impl/client/DefaultHttpClient.java
-ch/boye/httpclientandroidlib/impl/client/DefaultHttpRequestRetryHandler.java
-ch/boye/httpclientandroidlib/impl/client/DefaultProxyAuthenticationHandler.java
-ch/boye/httpclientandroidlib/impl/client/DefaultRedirectHandler.java
-ch/boye/httpclientandroidlib/impl/client/DefaultRedirectStrategy.java
-ch/boye/httpclientandroidlib/impl/client/DefaultRedirectStrategyAdaptor.java
-ch/boye/httpclientandroidlib/impl/client/DefaultRequestDirector.java
-ch/boye/httpclientandroidlib/impl/client/DefaultTargetAuthenticationHandler.java
-ch/boye/httpclientandroidlib/impl/client/DefaultUserTokenHandler.java
-ch/boye/httpclientandroidlib/impl/client/EntityEnclosingRequestWrapper.java
-ch/boye/httpclientandroidlib/impl/client/RedirectLocations.java
-ch/boye/httpclientandroidlib/impl/client/RequestWrapper.java
-ch/boye/httpclientandroidlib/impl/client/RoutedRequest.java
-ch/boye/httpclientandroidlib/impl/client/TunnelRefusedException.java
-ch/boye/httpclientandroidlib/impl/conn/AbstractClientConnAdapter.java
-ch/boye/httpclientandroidlib/impl/conn/AbstractPooledConnAdapter.java
-ch/boye/httpclientandroidlib/impl/conn/AbstractPoolEntry.java
-ch/boye/httpclientandroidlib/impl/conn/ConnectionShutdownException.java
-ch/boye/httpclientandroidlib/impl/conn/DefaultClientConnection.java
-ch/boye/httpclientandroidlib/impl/conn/DefaultClientConnectionOperator.java
-ch/boye/httpclientandroidlib/impl/conn/DefaultHttpRoutePlanner.java
-ch/boye/httpclientandroidlib/impl/conn/DefaultResponseParser.java
-ch/boye/httpclientandroidlib/impl/conn/HttpInetSocketAddress.java
-ch/boye/httpclientandroidlib/impl/conn/IdleConnectionHandler.java
-ch/boye/httpclientandroidlib/impl/conn/LoggingSessionInputBuffer.java
-ch/boye/httpclientandroidlib/impl/conn/LoggingSessionOutputBuffer.java
-ch/boye/httpclientandroidlib/impl/conn/ProxySelectorRoutePlanner.java
-ch/boye/httpclientandroidlib/impl/conn/SchemeRegistryFactory.java
-ch/boye/httpclientandroidlib/impl/conn/SingleClientConnManager.java
-ch/boye/httpclientandroidlib/impl/conn/tsccm/AbstractConnPool.java
-ch/boye/httpclientandroidlib/impl/conn/tsccm/BasicPooledConnAdapter.java
-ch/boye/httpclientandroidlib/impl/conn/tsccm/BasicPoolEntry.java
-ch/boye/httpclientandroidlib/impl/conn/tsccm/BasicPoolEntryRef.java
-ch/boye/httpclientandroidlib/impl/conn/tsccm/ConnPoolByRoute.java
-ch/boye/httpclientandroidlib/impl/conn/tsccm/PoolEntryRequest.java
-ch/boye/httpclientandroidlib/impl/conn/tsccm/RefQueueHandler.java
-ch/boye/httpclientandroidlib/impl/conn/tsccm/RefQueueWorker.java
-ch/boye/httpclientandroidlib/impl/conn/tsccm/RouteSpecificPool.java
-ch/boye/httpclientandroidlib/impl/conn/tsccm/ThreadSafeClientConnManager.java
-ch/boye/httpclientandroidlib/impl/conn/tsccm/WaitingThread.java
-ch/boye/httpclientandroidlib/impl/conn/tsccm/WaitingThreadAborter.java
-ch/boye/httpclientandroidlib/impl/conn/Wire.java
-ch/boye/httpclientandroidlib/impl/cookie/AbstractCookieAttributeHandler.java
-ch/boye/httpclientandroidlib/impl/cookie/AbstractCookieSpec.java
-ch/boye/httpclientandroidlib/impl/cookie/BasicClientCookie.java
-ch/boye/httpclientandroidlib/impl/cookie/BasicClientCookie2.java
-ch/boye/httpclientandroidlib/impl/cookie/BasicCommentHandler.java
-ch/boye/httpclientandroidlib/impl/cookie/BasicDomainHandler.java
-ch/boye/httpclientandroidlib/impl/cookie/BasicExpiresHandler.java
-ch/boye/httpclientandroidlib/impl/cookie/BasicMaxAgeHandler.java
-ch/boye/httpclientandroidlib/impl/cookie/BasicPathHandler.java
-ch/boye/httpclientandroidlib/impl/cookie/BasicSecureHandler.java
-ch/boye/httpclientandroidlib/impl/cookie/BestMatchSpec.java
-ch/boye/httpclientandroidlib/impl/cookie/BestMatchSpecFactory.java
-ch/boye/httpclientandroidlib/impl/cookie/BrowserCompatSpec.java
-ch/boye/httpclientandroidlib/impl/cookie/BrowserCompatSpecFactory.java
-ch/boye/httpclientandroidlib/impl/cookie/CookieSpecBase.java
-ch/boye/httpclientandroidlib/impl/cookie/DateParseException.java
-ch/boye/httpclientandroidlib/impl/cookie/DateUtils.java
-ch/boye/httpclientandroidlib/impl/cookie/IgnoreSpec.java
-ch/boye/httpclientandroidlib/impl/cookie/IgnoreSpecFactory.java
-ch/boye/httpclientandroidlib/impl/cookie/NetscapeDomainHandler.java
-ch/boye/httpclientandroidlib/impl/cookie/NetscapeDraftHeaderParser.java
-ch/boye/httpclientandroidlib/impl/cookie/NetscapeDraftSpec.java
-ch/boye/httpclientandroidlib/impl/cookie/NetscapeDraftSpecFactory.java
-ch/boye/httpclientandroidlib/impl/cookie/PublicSuffixFilter.java
-ch/boye/httpclientandroidlib/impl/cookie/PublicSuffixListParser.java
-ch/boye/httpclientandroidlib/impl/cookie/RFC2109DomainHandler.java
-ch/boye/httpclientandroidlib/impl/cookie/RFC2109Spec.java
-ch/boye/httpclientandroidlib/impl/cookie/RFC2109SpecFactory.java
-ch/boye/httpclientandroidlib/impl/cookie/RFC2109VersionHandler.java
-ch/boye/httpclientandroidlib/impl/cookie/RFC2965CommentUrlAttributeHandler.java
-ch/boye/httpclientandroidlib/impl/cookie/RFC2965DiscardAttributeHandler.java
-ch/boye/httpclientandroidlib/impl/cookie/RFC2965DomainAttributeHandler.java
-ch/boye/httpclientandroidlib/impl/cookie/RFC2965PortAttributeHandler.java
-ch/boye/httpclientandroidlib/impl/cookie/RFC2965Spec.java
-ch/boye/httpclientandroidlib/impl/cookie/RFC2965SpecFactory.java
-ch/boye/httpclientandroidlib/impl/cookie/RFC2965VersionAttributeHandler.java
-ch/boye/httpclientandroidlib/impl/DefaultConnectionReuseStrategy.java
-ch/boye/httpclientandroidlib/impl/DefaultHttpClientConnection.java
-ch/boye/httpclientandroidlib/impl/DefaultHttpRequestFactory.java
-ch/boye/httpclientandroidlib/impl/DefaultHttpResponseFactory.java
-ch/boye/httpclientandroidlib/impl/DefaultHttpServerConnection.java
-ch/boye/httpclientandroidlib/impl/EnglishReasonPhraseCatalog.java
-ch/boye/httpclientandroidlib/impl/entity/EntityDeserializer.java
-ch/boye/httpclientandroidlib/impl/entity/EntitySerializer.java
-ch/boye/httpclientandroidlib/impl/entity/LaxContentLengthStrategy.java
-ch/boye/httpclientandroidlib/impl/entity/StrictContentLengthStrategy.java
-ch/boye/httpclientandroidlib/impl/HttpConnectionMetricsImpl.java
-ch/boye/httpclientandroidlib/impl/io/AbstractMessageParser.java
-ch/boye/httpclientandroidlib/impl/io/AbstractMessageWriter.java
-ch/boye/httpclientandroidlib/impl/io/AbstractSessionInputBuffer.java
-ch/boye/httpclientandroidlib/impl/io/AbstractSessionOutputBuffer.java
-ch/boye/httpclientandroidlib/impl/io/ChunkedInputStream.java
-ch/boye/httpclientandroidlib/impl/io/ChunkedOutputStream.java
-ch/boye/httpclientandroidlib/impl/io/ContentLengthInputStream.java
-ch/boye/httpclientandroidlib/impl/io/ContentLengthOutputStream.java
-ch/boye/httpclientandroidlib/impl/io/HttpRequestParser.java
-ch/boye/httpclientandroidlib/impl/io/HttpRequestWriter.java
-ch/boye/httpclientandroidlib/impl/io/HttpResponseParser.java
-ch/boye/httpclientandroidlib/impl/io/HttpResponseWriter.java
-ch/boye/httpclientandroidlib/impl/io/HttpTransportMetricsImpl.java
-ch/boye/httpclientandroidlib/impl/io/IdentityInputStream.java
-ch/boye/httpclientandroidlib/impl/io/IdentityOutputStream.java
-ch/boye/httpclientandroidlib/impl/io/SocketInputBuffer.java
-ch/boye/httpclientandroidlib/impl/io/SocketOutputBuffer.java
-ch/boye/httpclientandroidlib/impl/NoConnectionReuseStrategy.java
-ch/boye/httpclientandroidlib/impl/SocketHttpClientConnection.java
-ch/boye/httpclientandroidlib/impl/SocketHttpServerConnection.java
-ch/boye/httpclientandroidlib/io/BufferInfo.java
-ch/boye/httpclientandroidlib/io/EofSensor.java
-ch/boye/httpclientandroidlib/io/HttpMessageParser.java
-ch/boye/httpclientandroidlib/io/HttpMessageWriter.java
-ch/boye/httpclientandroidlib/io/HttpTransportMetrics.java
-ch/boye/httpclientandroidlib/io/SessionInputBuffer.java
-ch/boye/httpclientandroidlib/io/SessionOutputBuffer.java
-ch/boye/httpclientandroidlib/MalformedChunkCodingException.java
-ch/boye/httpclientandroidlib/message/AbstractHttpMessage.java
-ch/boye/httpclientandroidlib/message/BasicHeader.java
-ch/boye/httpclientandroidlib/message/BasicHeaderElement.java
-ch/boye/httpclientandroidlib/message/BasicHeaderElementIterator.java
-ch/boye/httpclientandroidlib/message/BasicHeaderIterator.java
-ch/boye/httpclientandroidlib/message/BasicHeaderValueFormatter.java
-ch/boye/httpclientandroidlib/message/BasicHeaderValueParser.java
-ch/boye/httpclientandroidlib/message/BasicHttpEntityEnclosingRequest.java
-ch/boye/httpclientandroidlib/message/BasicHttpRequest.java
-ch/boye/httpclientandroidlib/message/BasicHttpResponse.java
-ch/boye/httpclientandroidlib/message/BasicLineFormatter.java
-ch/boye/httpclientandroidlib/message/BasicLineParser.java
-ch/boye/httpclientandroidlib/message/BasicListHeaderIterator.java
-ch/boye/httpclientandroidlib/message/BasicNameValuePair.java
-ch/boye/httpclientandroidlib/message/BasicRequestLine.java
-ch/boye/httpclientandroidlib/message/BasicStatusLine.java
-ch/boye/httpclientandroidlib/message/BasicTokenIterator.java
-ch/boye/httpclientandroidlib/message/BufferedHeader.java
-ch/boye/httpclientandroidlib/message/HeaderGroup.java
-ch/boye/httpclientandroidlib/message/HeaderValueFormatter.java
-ch/boye/httpclientandroidlib/message/HeaderValueParser.java
-ch/boye/httpclientandroidlib/message/LineFormatter.java
-ch/boye/httpclientandroidlib/message/LineParser.java
-ch/boye/httpclientandroidlib/message/ParserCursor.java
-ch/boye/httpclientandroidlib/MethodNotSupportedException.java
-ch/boye/httpclientandroidlib/NameValuePair.java
-ch/boye/httpclientandroidlib/NoHttpResponseException.java
-ch/boye/httpclientandroidlib/params/AbstractHttpParams.java
-ch/boye/httpclientandroidlib/params/BasicHttpParams.java
-ch/boye/httpclientandroidlib/params/CoreConnectionPNames.java
-ch/boye/httpclientandroidlib/params/CoreProtocolPNames.java
-ch/boye/httpclientandroidlib/params/DefaultedHttpParams.java
-ch/boye/httpclientandroidlib/params/HttpAbstractParamBean.java
-ch/boye/httpclientandroidlib/params/HttpConnectionParamBean.java
-ch/boye/httpclientandroidlib/params/HttpConnectionParams.java
-ch/boye/httpclientandroidlib/params/HttpParams.java
-ch/boye/httpclientandroidlib/params/HttpProtocolParamBean.java
-ch/boye/httpclientandroidlib/params/HttpProtocolParams.java
-ch/boye/httpclientandroidlib/params/SyncBasicHttpParams.java
-ch/boye/httpclientandroidlib/ParseException.java
-ch/boye/httpclientandroidlib/protocol/BasicHttpContext.java
-ch/boye/httpclientandroidlib/protocol/BasicHttpProcessor.java
-ch/boye/httpclientandroidlib/protocol/DefaultedHttpContext.java
-ch/boye/httpclientandroidlib/protocol/ExecutionContext.java
-ch/boye/httpclientandroidlib/protocol/HTTP.java
-ch/boye/httpclientandroidlib/protocol/HttpContext.java
-ch/boye/httpclientandroidlib/protocol/HttpDateGenerator.java
-ch/boye/httpclientandroidlib/protocol/HttpExpectationVerifier.java
-ch/boye/httpclientandroidlib/protocol/HttpProcessor.java
-ch/boye/httpclientandroidlib/protocol/HttpRequestExecutor.java
-ch/boye/httpclientandroidlib/protocol/HttpRequestHandler.java
-ch/boye/httpclientandroidlib/protocol/HttpRequestHandlerRegistry.java
-ch/boye/httpclientandroidlib/protocol/HttpRequestHandlerResolver.java
-ch/boye/httpclientandroidlib/protocol/HttpRequestInterceptorList.java
-ch/boye/httpclientandroidlib/protocol/HttpResponseInterceptorList.java
-ch/boye/httpclientandroidlib/protocol/HttpService.java
-ch/boye/httpclientandroidlib/protocol/ImmutableHttpProcessor.java
-ch/boye/httpclientandroidlib/protocol/RequestConnControl.java
-ch/boye/httpclientandroidlib/protocol/RequestContent.java
-ch/boye/httpclientandroidlib/protocol/RequestDate.java
-ch/boye/httpclientandroidlib/protocol/RequestExpectContinue.java
-ch/boye/httpclientandroidlib/protocol/RequestTargetHost.java
-ch/boye/httpclientandroidlib/protocol/RequestUserAgent.java
-ch/boye/httpclientandroidlib/protocol/ResponseConnControl.java
-ch/boye/httpclientandroidlib/protocol/ResponseContent.java
-ch/boye/httpclientandroidlib/protocol/ResponseDate.java
-ch/boye/httpclientandroidlib/protocol/ResponseServer.java
-ch/boye/httpclientandroidlib/protocol/SyncBasicHttpContext.java
-ch/boye/httpclientandroidlib/protocol/UriPatternMatcher.java
-ch/boye/httpclientandroidlib/ProtocolException.java
-ch/boye/httpclientandroidlib/ProtocolVersion.java
-ch/boye/httpclientandroidlib/ReasonPhraseCatalog.java
-ch/boye/httpclientandroidlib/RequestLine.java
-ch/boye/httpclientandroidlib/StatusLine.java
-ch/boye/httpclientandroidlib/TokenIterator.java
-ch/boye/httpclientandroidlib/TruncatedChunkException.java
-ch/boye/httpclientandroidlib/UnsupportedHttpVersionException.java
-ch/boye/httpclientandroidlib/util/ByteArrayBuffer.java
-ch/boye/httpclientandroidlib/util/CharArrayBuffer.java
-ch/boye/httpclientandroidlib/util/EncodingUtils.java
-ch/boye/httpclientandroidlib/util/EntityUtils.java
-ch/boye/httpclientandroidlib/util/ExceptionUtils.java
-ch/boye/httpclientandroidlib/util/LangUtils.java
-ch/boye/httpclientandroidlib/util/VersionInfo.java
-org/json/simple/ItemList.java
-org/json/simple/JSONArray.java
-org/json/simple/JSONAware.java
-org/json/simple/JSONObject.java
-org/json/simple/JSONStreamAware.java
-org/json/simple/JSONValue.java
-org/json/simple/parser/ContainerFactory.java
-org/json/simple/parser/ContentHandler.java
-org/json/simple/parser/JSONParser.java
-org/json/simple/parser/ParseException.java
-org/json/simple/parser/Yylex.java
-org/json/simple/parser/Yytoken.java
-org/mozilla/apache/commons/codec/binary/Base32.java
-org/mozilla/apache/commons/codec/binary/Base32InputStream.java
-org/mozilla/apache/commons/codec/binary/Base32OutputStream.java
-org/mozilla/apache/commons/codec/binary/Base64.java
-org/mozilla/apache/commons/codec/binary/Base64InputStream.java
-org/mozilla/apache/commons/codec/binary/Base64OutputStream.java
-org/mozilla/apache/commons/codec/binary/BaseNCodec.java
-org/mozilla/apache/commons/codec/binary/BaseNCodecInputStream.java
-org/mozilla/apache/commons/codec/binary/BaseNCodecOutputStream.java
-org/mozilla/apache/commons/codec/binary/BinaryCodec.java
-org/mozilla/apache/commons/codec/binary/Hex.java
-org/mozilla/apache/commons/codec/binary/StringUtils.java
-org/mozilla/apache/commons/codec/BinaryDecoder.java
-org/mozilla/apache/commons/codec/BinaryEncoder.java
-org/mozilla/apache/commons/codec/CharEncoding.java
-org/mozilla/apache/commons/codec/Decoder.java
-org/mozilla/apache/commons/codec/DecoderException.java
-org/mozilla/apache/commons/codec/digest/DigestUtils.java
-org/mozilla/apache/commons/codec/Encoder.java
-org/mozilla/apache/commons/codec/EncoderException.java
-org/mozilla/apache/commons/codec/language/AbstractCaverphone.java
-org/mozilla/apache/commons/codec/language/Caverphone.java
-org/mozilla/apache/commons/codec/language/Caverphone1.java
-org/mozilla/apache/commons/codec/language/Caverphone2.java
-org/mozilla/apache/commons/codec/language/ColognePhonetic.java
-org/mozilla/apache/commons/codec/language/DoubleMetaphone.java
-org/mozilla/apache/commons/codec/language/Metaphone.java
-org/mozilla/apache/commons/codec/language/RefinedSoundex.java
-org/mozilla/apache/commons/codec/language/Soundex.java
-org/mozilla/apache/commons/codec/language/SoundexUtils.java
-org/mozilla/apache/commons/codec/net/BCodec.java
-org/mozilla/apache/commons/codec/net/QCodec.java
-org/mozilla/apache/commons/codec/net/QuotedPrintableCodec.java
-org/mozilla/apache/commons/codec/net/RFC1522Codec.java
-org/mozilla/apache/commons/codec/net/URLCodec.java
-org/mozilla/apache/commons/codec/net/Utils.java
-org/mozilla/apache/commons/codec/StringDecoder.java
-org/mozilla/apache/commons/codec/StringEncoder.java
-org/mozilla/apache/commons/codec/StringEncoderComparator.java
deleted file mode 100644
--- a/mobile/android/services/preprocess-sources.mn
+++ /dev/null
@@ -1,4 +0,0 @@
-background/common/GlobalConstants.java
-sync/SyncConstants.java
-background/announcements/AnnouncementsConstants.java
-background/healthreport/HealthReportConstants.java
--- a/modules/libjar/nsJAR.h
+++ b/modules/libjar/nsJAR.h
@@ -6,17 +6,16 @@
 
 #ifndef nsJAR_h__
 #define nsJAR_h__
 
 #include "nscore.h"
 #include "prio.h"
 #include "plstr.h"
 #include "prlog.h"
-#include "prtypes.h"
 #include "prinrval.h"
 
 #include "mozilla/Mutex.h"
 #include "nsIComponentManager.h"
 #include "nsCOMPtr.h"
 #include "nsString.h"
 #include "nsIFile.h"
 #include "nsStringEnumerator.h"
--- a/modules/libpref/src/prefread.h
+++ b/modules/libpref/src/prefread.h
@@ -1,16 +1,15 @@
 /* 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/. */
 
 #ifndef prefread_h__
 #define prefread_h__
 
-#include "prtypes.h"
 #include "prefapi.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 /**
  * Callback function used to notify consumer of preference name value pairs.
--- a/security/manager/ssl/src/nsCrypto.cpp
+++ b/security/manager/ssl/src/nsCrypto.cpp
@@ -2346,17 +2346,17 @@ nsCrypto::ImportUserCertificates(const n
     }
     // Let's figure out which nickname to give the cert.  If 
     // a certificate with the same subject name already exists,
     // then just use that one, otherwise, get the default nickname.
     if (currCert->nickname) {
       localNick = currCert->nickname;
     }
     else if (!nickname || nickname[0] == '\0') {
-      nsNSSCertificateDB::get_default_nickname(currCert, ctx, localNick);
+      nsNSSCertificateDB::get_default_nickname(currCert, ctx, localNick, locker);
     } else {
       //This is the case where we're getting a brand new
       //cert that doesn't have the same subjectName as a cert
       //that already exists in our db and the CA page has 
       //designated a nickname to use for the newly issued cert.
       localNick = nickname;
     }
     {
@@ -2402,17 +2402,17 @@ nsCrypto::ImportUserCertificates(const n
         rv = NS_ERROR_OUT_OF_MEMORY;
         goto loser;
       }
       for (node = CERT_LIST_HEAD(caPubs), i=0; 
            !CERT_LIST_END(node, caPubs);
            node = CERT_LIST_NEXT(node), i++) {
         derCerts[i] = node->cert->derCert;
       }
-      nsNSSCertificateDB::ImportValidCACerts(numCAs, derCerts, ctx);
+      nsNSSCertificateDB::ImportValidCACerts(numCAs, derCerts, ctx, locker);
       nsMemory::Free(derCerts);
     }
   }
  }
 
   if (aDoForcedBackup) {
     // I can't pop up a file picker from the depths of JavaScript,
     // so I'll just post an event on the UI queue to do the backups
--- a/security/manager/ssl/src/nsNSSCertificateDB.cpp
+++ b/security/manager/ssl/src/nsNSSCertificateDB.cpp
@@ -74,16 +74,19 @@ NS_IMETHODIMP
 nsNSSCertificateDB::FindCertByNickname(nsISupports *aToken,
                                       const nsAString &nickname,
                                       nsIX509Cert **_rvCert)
 {
   NS_ENSURE_ARG_POINTER(_rvCert);
   *_rvCert = nullptr;
 
   nsNSSShutDownPreventionLock locker;
+  if (isAlreadyShutDown()) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
   ScopedCERTCertificate cert;
   char *asciiname = nullptr;
   NS_ConvertUTF16toUTF8 aUtf8Nickname(nickname);
   asciiname = const_cast<char*>(aUtf8Nickname.get());
   PR_LOG(gPIPNSSLog, PR_LOG_DEBUG, ("Getting \"%s\"\n", asciiname));
 #if 0
   // what it should be, but for now...
   if (aToken) {
@@ -112,16 +115,20 @@ nsNSSCertificateDB::FindCertByDBKey(cons
                                    nsIX509Cert **_cert)
 {
   NS_ENSURE_ARG_POINTER(aDBkey);
   NS_ENSURE_ARG(aDBkey[0]);
   NS_ENSURE_ARG_POINTER(_cert);
   *_cert = nullptr;
 
   nsNSSShutDownPreventionLock locker;
+  if (isAlreadyShutDown()) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
+
   SECItem keyItem = {siBuffer, nullptr, 0};
   SECItem *dummy;
   CERTIssuerAndSN issuerSN;
   //unsigned long moduleID,slotID;
 
   dummy = NSSBase64_DecodeBuffer(nullptr, &keyItem, aDBkey,
                                  (uint32_t)strlen(aDBkey)); 
   if (!dummy || keyItem.len < NS_NSS_LONG*4) {
@@ -160,16 +167,20 @@ nsNSSCertificateDB::FindCertByDBKey(cons
 
 NS_IMETHODIMP 
 nsNSSCertificateDB::FindCertNicknames(nsISupports *aToken, 
                                      uint32_t      aType,
                                      uint32_t     *_count,
                                      PRUnichar  ***_certNames)
 {
   nsNSSShutDownPreventionLock locker;
+  if (isAlreadyShutDown()) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
+
   nsresult rv = NS_ERROR_FAILURE;
   /*
    * obtain the cert list from NSS
    */
   ScopedCERTCertList certList;
   PK11CertListType pk11type;
 #if 0
   // this would seem right, but it didn't work...
@@ -181,17 +192,17 @@ nsNSSCertificateDB::FindCertNicknames(ns
     pk11type = PK11CertListUnique;
   certList = PK11_ListCerts(pk11type, nullptr);
   if (!certList)
     goto cleanup;
   /*
    * get list of cert names from list of certs
    * XXX also cull the list (NSS only distinguishes based on user/non-user
    */
-  getCertNames(certList, aType, _count, _certNames);
+  getCertNames(certList, aType, _count, _certNames, locker);
   rv = NS_OK;
   /*
    * finish up
    */
 cleanup:
   return rv;
 }
 
@@ -220,19 +231,19 @@ collect_certs(void *arg, SECItem **certs
     certs++;
   }
 
   return (SECSuccess);
 }
 
 CERTDERCerts*
 nsNSSCertificateDB::getCertsFromPackage(PLArenaPool *arena, uint8_t *data, 
-                                        uint32_t length)
+                                        uint32_t length,
+                                        const nsNSSShutDownPreventionLock &/*proofOfLock*/)
 {
-  nsNSSShutDownPreventionLock locker;
   CERTDERCerts *collectArgs = 
                (CERTDERCerts *)PORT_ArenaZAlloc(arena, sizeof(CERTDERCerts));
   if (!collectArgs)
     return nullptr;
 
   collectArgs->arena = arena;
   SECStatus sec_rv = CERT_DecodeCertPackage(reinterpret_cast<char *>(data), 
                                             length, collect_certs, 
@@ -240,33 +251,32 @@ nsNSSCertificateDB::getCertsFromPackage(
   if (sec_rv != SECSuccess)
     return nullptr;
 
   return collectArgs;
 }
 
 nsresult
 nsNSSCertificateDB::handleCACertDownload(nsIArray *x509Certs,
-                                         nsIInterfaceRequestor *ctx)
+                                         nsIInterfaceRequestor *ctx,
+                                         const nsNSSShutDownPreventionLock &proofOfLock)
 {
   // First thing we have to do is figure out which certificate we're 
   // gonna present to the user.  The CA may have sent down a list of 
   // certs which may or may not be a chained list of certs.  Until
   // the day we can design some solid UI for the general case, we'll
   // code to the > 90% case.  That case is where a CA sends down a
   // list that is a hierarchy whose root is either the first or 
   // the last cert.  What we're gonna do is compare the first 
   // 2 entries, if the second was signed by the first, we assume
   // the root cert is the first cert and display it.  Otherwise,
   // we compare the last 2 entries, if the second to last cert was
   // signed by the last cert, then we assume the last cert is the
   // root and display it.
 
-  nsNSSShutDownPreventionLock locker;
-
   uint32_t numCerts;
 
   x509Certs->GetLength(&numCerts);
   NS_ASSERTION(numCerts > 0, "Didn't get any certs to import.");
   if (numCerts == 0)
     return NS_OK; // Nothing to import, so nothing to do.
 
   nsCOMPtr<nsIX509Cert> certToShow;
@@ -346,22 +356,22 @@ nsNSSCertificateDB::handleCACertDownload
   der.len = 0;
   
   if (!tmpCert) {
     NS_ERROR("Couldn't create cert from DER blob");
     return NS_ERROR_FAILURE;
   }
 
   if (!CERT_IsCACert(tmpCert, nullptr)) {
-    DisplayCertificateAlert(ctx, "NotACACert", certToShow);
+    DisplayCertificateAlert(ctx, "NotACACert", certToShow, proofOfLock);
     return NS_ERROR_FAILURE;
   }
 
   if (tmpCert->isperm) {
-    DisplayCertificateAlert(ctx, "CaCertExists", certToShow);
+    DisplayCertificateAlert(ctx, "CaCertExists", certToShow, proofOfLock);
     return NS_ERROR_FAILURE;
   }
 
   uint32_t trustBits;
   bool allows;
   rv = dialogs->ConfirmDownloadCACert(ctx, certToShow, &trustBits, &allows);
   if (NS_FAILED(rv))
     return rv;
@@ -417,38 +427,42 @@ nsNSSCertificateDB::handleCACertDownload
     if (!tmpCert2) {
       NS_ERROR("Couldn't create temp cert from DER blob");
       continue;  // Let's try to import the rest of 'em
     }
     
     CERT_AddCertToListTail(certList, tmpCert2);
   }
 
-  return ImportValidCACertsInList(certList, ctx);
+  return ImportValidCACertsInList(certList, ctx, proofOfLock);
 }
 
 /*
  *  [noscript] void importCertificates(in charPtr data, in unsigned long length,
  *                                     in unsigned long type, 
  *                                     in nsIInterfaceRequestor ctx);
  */
 NS_IMETHODIMP 
 nsNSSCertificateDB::ImportCertificates(uint8_t * data, uint32_t length, 
                                        uint32_t type, 
                                        nsIInterfaceRequestor *ctx)
 
 {
   nsNSSShutDownPreventionLock locker;
+  if (isAlreadyShutDown()) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
+
   nsresult nsrv;
 
   PLArenaPool *arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
   if (!arena)
     return NS_ERROR_OUT_OF_MEMORY;
 
-  CERTDERCerts *certCollection = getCertsFromPackage(arena, data, length);
+  CERTDERCerts *certCollection = getCertsFromPackage(arena, data, length, locker);
   if (!certCollection) {
     PORT_FreeArena(arena, false);
     return NS_ERROR_FAILURE;
   }
   nsCOMPtr<nsIMutableArray> array =
     do_CreateInstance(NS_ARRAY_CONTRACTID, &nsrv);
   if (NS_FAILED(nsrv)) {
     PORT_FreeArena(arena, false);
@@ -464,17 +478,17 @@ nsNSSCertificateDB::ImportCertificates(u
      nssCert = nsNSSCertificate::ConstructFromDER((char*)currItem->data, currItem->len);
      if (!nssCert)
        return NS_ERROR_FAILURE;
      x509Cert = do_QueryInterface((nsIX509Cert*)nssCert);
      array->AppendElement(x509Cert, false);
   }
   switch (type) {
   case nsIX509Cert::CA_CERT:
-    nsrv = handleCACertDownload(array, ctx);
+    nsrv = handleCACertDownload(array, ctx, locker);
     break;
   default:
     // We only deal with import CA certs in this method currently.
      nsrv = NS_ERROR_FAILURE;
      break;
   }  
   PORT_FreeArena(arena, false);
   return nsrv;
@@ -519,31 +533,35 @@ ImportCertsIntoPermanentStorage(const Sc
  *                                     in nsIInterfaceRequestor ctx);
  */
 NS_IMETHODIMP
 nsNSSCertificateDB::ImportEmailCertificate(uint8_t * data, uint32_t length, 
                                        nsIInterfaceRequestor *ctx)
 
 {
   nsNSSShutDownPreventionLock locker;
+  if (isAlreadyShutDown()) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
+
   SECStatus srv = SECFailure;
   nsresult nsrv = NS_OK;
   CERTCertDBHandle *certdb;
   CERTCertificate **certArray = nullptr;
   ScopedCERTCertList certList;
   CERTCertListNode *node;
   SECItem **rawArray;
   int numcerts;
   int i;
 
   PLArenaPool *arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
   if (!arena)
     return NS_ERROR_OUT_OF_MEMORY;
 
-  CERTDERCerts *certCollection = getCertsFromPackage(arena, data, length);
+  CERTDERCerts *certCollection = getCertsFromPackage(arena, data, length, locker);
   if (!certCollection) {
     PORT_FreeArena(arena, false);
     return NS_ERROR_FAILURE;
   }
 
   RefPtr<CertVerifier> certVerifier(GetDefaultCertVerifier());
   NS_ENSURE_TRUE(certVerifier, NS_ERROR_UNEXPECTED);
 
@@ -604,17 +622,17 @@ nsNSSCertificateDB::ImportEmailCertifica
     SECStatus rv = certVerifier->VerifyCert(node->cert,
                                             certificateUsageEmailRecipient,
                                             now, ctx, 0, &verifyCertChain);
 
     ScopedCERTCertList certChain(verifyCertChain);
 
     if (rv != SECSuccess) {
       nsCOMPtr<nsIX509Cert> certToShow = nsNSSCertificate::Create(node->cert);
-      DisplayCertificateAlert(ctx, "NotImportingUnverifiedCert", certToShow);
+      DisplayCertificateAlert(ctx, "NotImportingUnverifiedCert", certToShow, locker);
       continue;
     }
     rv = ImportCertsIntoPermanentStorage(certChain, certUsageEmailRecipient, false);
     if (rv != SECSuccess) {
       goto loser;
     } 
     CERT_SaveSMimeProfile(node->cert, nullptr, nullptr);
 
@@ -630,30 +648,34 @@ loser:
 }
 
 NS_IMETHODIMP
 nsNSSCertificateDB::ImportServerCertificate(uint8_t * data, uint32_t length, 
                                             nsIInterfaceRequestor *ctx)
 
 {
   nsNSSShutDownPreventionLock locker;
+  if (isAlreadyShutDown()) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
+
   SECStatus srv = SECFailure;
   nsresult nsrv = NS_OK;
   ScopedCERTCertificate cert;
   SECItem **rawCerts = nullptr;
   int numcerts;
   int i;
   nsNSSCertTrust trust;
   char *serverNickname = nullptr;
  
   PLArenaPool *arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
   if (!arena)
     return NS_ERROR_OUT_OF_MEMORY;
 
-  CERTDERCerts *certCollection = getCertsFromPackage(arena, data, length);
+  CERTDERCerts *certCollection = getCertsFromPackage(arena, data, length, locker);
   if (!certCollection) {
     PORT_FreeArena(arena, false);
     return NS_ERROR_FAILURE;
   }
   cert = CERT_NewTempCertificate(CERT_GetDefaultCertDB(), certCollection->rawCerts,
                                  nullptr, false, true);
   if (!cert) {
     nsrv = NS_ERROR_FAILURE;
@@ -689,17 +711,17 @@ nsNSSCertificateDB::ImportServerCertific
 loser:
   PORT_Free(rawCerts);
   if (arena) 
     PORT_FreeArena(arena, true);
   return nsrv;
 }
 
 nsresult
-nsNSSCertificateDB::ImportValidCACerts(int numCACerts, SECItem *CACerts, nsIInterfaceRequestor *ctx)
+nsNSSCertificateDB::ImportValidCACerts(int numCACerts, SECItem *CACerts, nsIInterfaceRequestor *ctx,  const nsNSSShutDownPreventionLock &proofOfLock)
 {
   ScopedCERTCertList certList;
   SECItem **rawArray;
 
   // build a CertList for filtering
   certList = CERT_NewCertList();
   if (!certList) {
     return NS_ERROR_FAILURE;
@@ -733,21 +755,22 @@ nsNSSCertificateDB::ImportValidCACerts(i
     if (cacert)
       cacert = CERT_DupCertificate(cacert);
     if (cacert)
       CERT_AddCertToListTail(certList, cacert);
   }
 
   CERT_DestroyCertArray(certArray, numCACerts);
 
-  return ImportValidCACertsInList(certList, ctx);
+  return ImportValidCACertsInList(certList, ctx, proofOfLock);
 }
 
 nsresult
-nsNSSCertificateDB::ImportValidCACertsInList(CERTCertList *certList, nsIInterfaceRequestor *ctx)
+nsNSSCertificateDB::ImportValidCACertsInList(CERTCertList *certList, nsIInterfaceRequestor *ctx,
+                                             const nsNSSShutDownPreventionLock &proofOfLock)
 {
   RefPtr<CertVerifier> certVerifier(GetDefaultCertVerifier());
   if (!certVerifier)
     return NS_ERROR_UNEXPECTED;
 
   /* filter out the certs we don't want */
   SECStatus srv = CERT_FilterCertListByUsage(certList, certUsageAnyCA, true);
   if (srv != SECSuccess) {
@@ -768,29 +791,30 @@ nsNSSCertificateDB::ImportValidCACertsIn
 
     SECStatus rv = certVerifier->VerifyCert(node->cert, certificateUsageVerifyCA,
                                             PR_Now(), ctx, 0, &verifyCertChain);
 
     ScopedCERTCertList certChain(verifyCertChain);
 
     if (rv != SECSuccess) {
       nsCOMPtr<nsIX509Cert> certToShow = nsNSSCertificate::Create(node->cert);
-      DisplayCertificateAlert(ctx, "NotImportingUnverifiedCert", certToShow);
+      DisplayCertificateAlert(ctx, "NotImportingUnverifiedCert", certToShow, proofOfLock);
       continue;
     }
 
     ImportCertsIntoPermanentStorage(certChain, certUsageAnyCA, true);
   }
   
   return NS_OK;
 }
 
 void nsNSSCertificateDB::DisplayCertificateAlert(nsIInterfaceRequestor *ctx, 
                                                  const char *stringID, 
-                                                 nsIX509Cert *certToShow)
+                                                 nsIX509Cert *certToShow,
+                                                 const nsNSSShutDownPreventionLock &/*proofOfLock*/)
 {
   if (!NS_IsMainThread()) {
     NS_ERROR("nsNSSCertificateDB::DisplayCertificateAlert called off the main thread");
     return;
   }
 
   nsPSMUITracker tracker;
   if (!tracker.isUIForbidden()) {
@@ -822,96 +846,103 @@ NS_IMETHODIMP
 nsNSSCertificateDB::ImportUserCertificate(uint8_t *data, uint32_t length, nsIInterfaceRequestor *ctx)
 {
   if (!NS_IsMainThread()) {
     NS_ERROR("nsNSSCertificateDB::ImportUserCertificate called off the main thread");
     return NS_ERROR_NOT_SAME_THREAD;
   }
   
   nsNSSShutDownPreventionLock locker;
+  if (isAlreadyShutDown()) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
+
   ScopedPK11SlotInfo slot;
   nsAutoCString nickname;
   nsresult rv = NS_ERROR_FAILURE;
   int numCACerts;
   SECItem *CACerts;
   CERTDERCerts * collectArgs;
   PLArenaPool *arena;
   ScopedCERTCertificate cert;
 
   arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
   if (!arena) {
     goto loser;
   }
 
-  collectArgs = getCertsFromPackage(arena, data, length);
+  collectArgs = getCertsFromPackage(arena, data, length, locker);
   if (!collectArgs) {
     goto loser;
   }
 
   cert = CERT_NewTempCertificate(CERT_GetDefaultCertDB(), collectArgs->rawCerts,
                                  nullptr, false, true);
   if (!cert) {
     goto loser;
   }
 
   slot = PK11_KeyForCertExists(cert, nullptr, ctx);
   if (!slot) {
     nsCOMPtr<nsIX509Cert> certToShow = nsNSSCertificate::Create(cert);
-    DisplayCertificateAlert(ctx, "UserCertIgnoredNoPrivateKey", certToShow);
+    DisplayCertificateAlert(ctx, "UserCertIgnoredNoPrivateKey", certToShow, locker);
     goto loser;
   }
   slot = nullptr;
 
   /* pick a nickname for the cert */
   if (cert->nickname) {
 	/* sigh, we need a call to look up other certs with this subject and
 	 * identify nicknames from them. We can no longer walk down internal
 	 * database structures  rjr */
   	nickname = cert->nickname;
   }
   else {
-    get_default_nickname(cert, ctx, nickname);
+    get_default_nickname(cert, ctx, nickname, locker);
   }
 
   /* user wants to import the cert */
   {
     char *cast_const_away = const_cast<char*>(nickname.get());
     slot = PK11_ImportCertForKey(cert, cast_const_away, ctx);
   }
   if (!slot) {
     goto loser;
   }
   slot = nullptr;
 
   {
     nsCOMPtr<nsIX509Cert> certToShow = nsNSSCertificate::Create(cert);
-    DisplayCertificateAlert(ctx, "UserCertImported", certToShow);
+    DisplayCertificateAlert(ctx, "UserCertImported", certToShow, locker);
   }
   rv = NS_OK;
 
   numCACerts = collectArgs->numcerts - 1;
   if (numCACerts) {
     CACerts = collectArgs->rawCerts+1;
-    rv = ImportValidCACerts(numCACerts, CACerts, ctx);
+    rv = ImportValidCACerts(numCACerts, CACerts, ctx, locker);
   }
   
 loser:
   if (arena) {
     PORT_FreeArena(arena, false);
   }
   return rv;
 }
 
 /*
  * void deleteCertificate(in nsIX509Cert aCert);
  */
 NS_IMETHODIMP 
 nsNSSCertificateDB::DeleteCertificate(nsIX509Cert *aCert)
 {
   nsNSSShutDownPreventionLock locker;
+  if (isAlreadyShutDown()) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
   nsCOMPtr<nsIX509Cert2> nssCert = do_QueryInterface(aCert);
   ScopedCERTCertificate cert(nssCert->GetCert());
   if (!cert) return NS_ERROR_FAILURE;
   SECStatus srv = SECSuccess;
 
   uint32_t certType;
   nssCert->GetCertType(&certType);
   if (NS_FAILED(nssCert->MarkForPermDeletion()))
@@ -941,16 +972,19 @@ nsNSSCertificateDB::DeleteCertificate(ns
  *                   in unsigned long trust);
  */
 NS_IMETHODIMP 
 nsNSSCertificateDB::SetCertTrust(nsIX509Cert *cert, 
                                  uint32_t type,
                                  uint32_t trusted)
 {
   nsNSSShutDownPreventionLock locker;
+  if (isAlreadyShutDown()) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
   SECStatus srv;
   nsNSSCertTrust trust;
   nsCOMPtr<nsIX509Cert2> pipCert = do_QueryInterface(cert);
   if (!pipCert)
     return NS_ERROR_FAILURE;
   ScopedCERTCertificate nsscert(pipCert->GetCert());
 
   if (type == nsIX509Cert::CA_CERT) {
@@ -988,16 +1022,19 @@ nsNSSCertificateDB::IsCertTrusted(nsIX50
                                   uint32_t certType,
                                   uint32_t trustType,
                                   bool *_isTrusted)
 {
   NS_ENSURE_ARG_POINTER(_isTrusted);
   *_isTrusted = false;
 
   nsNSSShutDownPreventionLock locker;
+  if (isAlreadyShutDown()) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
   SECStatus srv;
   nsCOMPtr<nsIX509Cert2> pipCert = do_QueryInterface(cert);
   ScopedCERTCertificate nsscert(pipCert->GetCert());
   CERTCertTrust nsstrust;
   srv = CERT_GetCertTrust(nsscert, &nsstrust);
   if (srv != SECSuccess)
     return NS_ERROR_FAILURE;
 
@@ -1037,16 +1074,21 @@ nsNSSCertificateDB::IsCertTrusted(nsIX50
 }
 
 
 NS_IMETHODIMP 
 nsNSSCertificateDB::ImportCertsFromFile(nsISupports *aToken, 
                                         nsIFile *aFile,
                                         uint32_t aType)
 {
+  nsNSSShutDownPreventionLock locker;
+  if (isAlreadyShutDown()) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
+
   NS_ENSURE_ARG(aFile);
   switch (aType) {
     case nsIX509Cert::CA_CERT:
     case nsIX509Cert::EMAIL_CERT:
     case nsIX509Cert::SERVER_CERT:
       // good
       break;
     
@@ -1101,16 +1143,21 @@ nsNSSCertificateDB::ImportCertsFromFile(
   delete [] buf;
   return rv;  
 }
 
 NS_IMETHODIMP 
 nsNSSCertificateDB::ImportPKCS12File(nsISupports *aToken, 
                                      nsIFile *aFile)
 {
+  nsNSSShutDownPreventionLock locker;
+  if (isAlreadyShutDown()) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
+
   NS_ENSURE_ARG(aFile);
   nsPKCS12Blob blob;
   nsCOMPtr<nsIPK11Token> token = do_QueryInterface(aToken);
   if (token) {
     blob.SetToken(token);
   }
   return blob.ImportFromFile(aFile);
 }
@@ -1118,16 +1165,20 @@ nsNSSCertificateDB::ImportPKCS12File(nsI
 NS_IMETHODIMP 
 nsNSSCertificateDB::ExportPKCS12File(nsISupports     *aToken, 
                                      nsIFile          *aFile,
                                      uint32_t          count,
                                      nsIX509Cert     **certs)
                                      //const PRUnichar **aCertNames)
 {
   nsNSSShutDownPreventionLock locker;
+  if (isAlreadyShutDown()) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
+
   NS_ENSURE_ARG(aFile);
   nsPKCS12Blob blob;
   if (count == 0) return NS_OK;
   nsCOMPtr<nsIPK11Token> localRef;
   if (!aToken) {
     ScopedPK11SlotInfo keySlot(PK11_GetInternalKeySlot());
     NS_ASSERTION(keySlot,"Failed to get the internal key slot");
     localRef = new nsPK11Token(keySlot);
@@ -1151,22 +1202,23 @@ nsNSSCertificateDB::ExportPKCS12File(nsI
  * GetSortedNameList
  *
  * Converts a CERTCertList to a list of certificate names
  */
 void
 nsNSSCertificateDB::getCertNames(CERTCertList *certList,
                                  uint32_t      type, 
                                  uint32_t     *_count,
-                                 PRUnichar  ***_certNames)
+                                 PRUnichar  ***_certNames,
+                                 const nsNSSShutDownPreventionLock &/*proofOfLock*/)
 {
-  nsNSSShutDownPreventionLock locker;
   CERTCertListNode *node;
   uint32_t numcerts = 0, i=0;
   PRUnichar **tmpArray = nullptr;
+
   PR_LOG(gPIPNSSLog, PR_LOG_DEBUG, ("List of certs %d:\n", type));
   for (node = CERT_LIST_HEAD(certList);
        !CERT_LIST_END(node, certList);
        node = CERT_LIST_NEXT(node)) {
     if (getCertType(node->cert) == type) {
       numcerts++;
     }
   }
@@ -1213,16 +1265,20 @@ nsNSSCertificateDB::FindEmailEncryptionC
 {
   NS_ENSURE_ARG_POINTER(_retval);
   *_retval = nullptr;
 
   if (aNickname.IsEmpty())
     return NS_OK;
 
   nsNSSShutDownPreventionLock locker;
+  if (isAlreadyShutDown()) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
+
   nsCOMPtr<nsIInterfaceRequestor> ctx = new PipUIContext();
   char *asciiname = nullptr;
   NS_ConvertUTF16toUTF8 aUtf8Nickname(aNickname);
   asciiname = const_cast<char*>(aUtf8Nickname.get());
 
   /* Find a good cert in the user's database */
   ScopedCERTCertificate cert;
   cert = CERT_FindUserCertByUsage(CERT_GetDefaultCertDB(), asciiname, 
@@ -1245,16 +1301,20 @@ nsNSSCertificateDB::FindEmailSigningCert
 {
   NS_ENSURE_ARG_POINTER(_retval);
   *_retval = nullptr;
 
   if (aNickname.IsEmpty())
     return NS_OK;
 
   nsNSSShutDownPreventionLock locker;
+  if (isAlreadyShutDown()) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
+
   ScopedCERTCertificate cert;
   nsCOMPtr<nsIInterfaceRequestor> ctx = new PipUIContext();
   char *asciiname = nullptr;
   NS_ConvertUTF16toUTF8 aUtf8Nickname(aNickname);
   asciiname = const_cast<char*>(aUtf8Nickname.get());
 
   /* Find a good cert in the user's database */
   cert = CERT_FindUserCertByUsage(CERT_GetDefaultCertDB(), asciiname, 
@@ -1270,16 +1330,19 @@ nsNSSCertificateDB::FindEmailSigningCert
   nssCert.forget(_retval);
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsNSSCertificateDB::FindCertByEmailAddress(nsISupports *aToken, const char *aEmailAddress, nsIX509Cert **_retval)
 {
   nsNSSShutDownPreventionLock locker;
+  if (isAlreadyShutDown()) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
   
   RefPtr<CertVerifier> certVerifier(GetDefaultCertVerifier());
   NS_ENSURE_TRUE(certVerifier, NS_ERROR_UNEXPECTED);
 
   ScopedCERTCertList certlist(
       PK11_FindCertsFromEmailAddress(aEmailAddress, nullptr));
   if (!certlist)
     return NS_ERROR_FAILURE;  
@@ -1343,16 +1406,20 @@ nsNSSCertificateDB::ConstructX509FromBas
   uint32_t lengthDER = (len * 3) / 4;
   if (base64[len-1] == '=') {
     lengthDER--;
     if (base64[len-2] == '=')
       lengthDER--;
   }
 
   nsNSSShutDownPreventionLock locker;
+  if (isAlreadyShutDown()) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
+
   SECItem secitem_cert;
   secitem_cert.type = siDERCertBuffer;
   secitem_cert.data = (unsigned char*)certDER;
   secitem_cert.len = lengthDER;
 
   ScopedCERTCertificate cert;
   cert =
     CERT_NewTempCertificate(CERT_GetDefaultCertDB(), &secitem_cert,
@@ -1369,21 +1436,21 @@ nsNSSCertificateDB::ConstructX509FromBas
   }
   nssCert.forget(_retval);
   return NS_OK;
 }
 
 void
 nsNSSCertificateDB::get_default_nickname(CERTCertificate *cert, 
                                          nsIInterfaceRequestor* ctx,
-                                         nsCString &nickname)
+                                         nsCString &nickname,
+                                         const nsNSSShutDownPreventionLock &/*proofOfLock*/)
 {
   nickname.Truncate();
 
-  nsNSSShutDownPreventionLock locker;
   nsresult rv;
   CK_OBJECT_HANDLE keyHandle;
 
   CERTCertDBHandle *defaultcertdb = CERT_GetDefaultCertDB();
   nsCOMPtr<nsINSSComponent> nssComponent(do_GetService(kNSSComponentCID, &rv));
   if (NS_FAILED(rv))
     return;
 
@@ -1486,16 +1553,21 @@ nsNSSCertificateDB::get_default_nickname
   }
 }
 
 NS_IMETHODIMP nsNSSCertificateDB::AddCertFromBase64(const char *aBase64, const char *aTrust, const char *aName)
 {
   NS_ENSURE_ARG_POINTER(aBase64);
   nsCOMPtr <nsIX509Cert> newCert;
 
+  nsNSSShutDownPreventionLock locker;
+  if (isAlreadyShutDown()) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
+
   nsNSSCertTrust trust;
 
   // need to calculate the trust bits from the aTrust string.
   SECStatus stat = CERT_DecodeTrustString(trust.GetTrust(),
     /* this is const, but not declared that way */(char *) aTrust);
   NS_ENSURE_STATE(stat == SECSuccess); // if bad trust passed in, return error.
 
 
@@ -1546,16 +1618,21 @@ nsNSSCertificateDB::AddCert(const nsACSt
   nsresult rv = Base64Encode(aCertDER, base64);
   NS_ENSURE_SUCCESS(rv, rv);
   return AddCertFromBase64(base64.get(), aTrust, aName);
 }
 
 NS_IMETHODIMP 
 nsNSSCertificateDB::GetCerts(nsIX509CertList **_retval)
 {
+  nsNSSShutDownPreventionLock locker;
+  if (isAlreadyShutDown()) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
+
   CERTCertList *certList;
 
   nsCOMPtr<nsIInterfaceRequestor> ctx = new PipUIContext();
   nsCOMPtr<nsIX509CertList> nssCertList;
   certList = PK11_ListCerts(PK11CertListUnique, ctx);
 
   // nsNSSCertList 1) adopts certList, and 2) handles the nullptr case fine.
   // (returns an empty list) 
@@ -1564,16 +1641,21 @@ nsNSSCertificateDB::GetCerts(nsIX509Cert
   *_retval = nssCertList;
   NS_ADDREF(*_retval);
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsNSSCertificateDB::GetRecentBadCerts(bool isPrivate, nsIRecentBadCerts** result)
 {
+  nsNSSShutDownPreventionLock locker;
+  if (isAlreadyShutDown()) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
+
   MutexAutoLock lock(mBadCertsLock);
   if (isPrivate) {
     if (!mPrivateRecentBadCerts) {
       mPrivateRecentBadCerts = new nsRecentBadCerts;
     }
     NS_ADDREF(*result = mPrivateRecentBadCerts);
   } else {
     if (!mPublicRecentBadCerts) {
--- a/security/manager/ssl/src/nsNSSCertificateDB.h
+++ b/security/manager/ssl/src/nsNSSCertificateDB.h
@@ -2,64 +2,78 @@
  * 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/. */
 
 #ifndef __NSNSSCERTIFICATEDB_H__
 #define __NSNSSCERTIFICATEDB_H__
 
 #include "nsIX509CertDB.h"
 #include "nsIX509CertDB2.h"
+#include "nsNSSShutDown.h"
 #include "mozilla/RefPtr.h"
 #include "mozilla/Mutex.h"
 #include "certt.h"
 
 class nsCString;
 class nsIArray;
 class nsRecentBadCerts;
 
-class nsNSSCertificateDB : public nsIX509CertDB, public nsIX509CertDB2
+class nsNSSCertificateDB : public nsIX509CertDB
+                         , public nsIX509CertDB2
+                         , public nsNSSShutDownObject
+
 {
 public:
   NS_DECL_THREADSAFE_ISUPPORTS
   NS_DECL_NSIX509CERTDB
   NS_DECL_NSIX509CERTDB2
 
   nsNSSCertificateDB(); 
   virtual ~nsNSSCertificateDB();
 
   // Use this function to generate a default nickname for a user
   // certificate that is to be imported onto a token.
   static void
   get_default_nickname(CERTCertificate *cert, nsIInterfaceRequestor* ctx,
-                       nsCString &nickname);
+                       nsCString &nickname,
+                       const nsNSSShutDownPreventionLock &proofOfLock);
 
   static nsresult 
-  ImportValidCACerts(int numCACerts, SECItem *CACerts, nsIInterfaceRequestor *ctx);
+  ImportValidCACerts(int numCACerts, SECItem *CACerts, nsIInterfaceRequestor *ctx,
+                     const nsNSSShutDownPreventionLock &proofOfLock);
 
 private:
 
   static nsresult
-  ImportValidCACertsInList(CERTCertList *certList, nsIInterfaceRequestor *ctx);
+  ImportValidCACertsInList(CERTCertList *certList, nsIInterfaceRequestor *ctx,
+                           const nsNSSShutDownPreventionLock &proofOfLock);
 
   static void DisplayCertificateAlert(nsIInterfaceRequestor *ctx, 
-                                      const char *stringID, nsIX509Cert *certToShow);
+                                      const char *stringID, nsIX509Cert *certToShow,
+                                      const nsNSSShutDownPreventionLock &proofOfLock);
 
   void getCertNames(CERTCertList *certList,
                     uint32_t      type, 
                     uint32_t     *_count,
-                    PRUnichar  ***_certNameList);
+                    PRUnichar  ***_certNameList,
+                    const nsNSSShutDownPreventionLock &proofOfLock);
 
   CERTDERCerts *getCertsFromPackage(PLArenaPool *arena, uint8_t *data, 
-                                    uint32_t length);
+                                    uint32_t length,
+                                    const nsNSSShutDownPreventionLock &proofOfLock);
   nsresult handleCACertDownload(nsIArray *x509Certs, 
-                                nsIInterfaceRequestor *ctx);
+                                nsIInterfaceRequestor *ctx,
+                                const nsNSSShutDownPreventionLock &proofOfLock);
 
   mozilla::Mutex mBadCertsLock;
   mozilla::RefPtr<nsRecentBadCerts> mPublicRecentBadCerts;
   mozilla::RefPtr<nsRecentBadCerts> mPrivateRecentBadCerts;
+
+  // We don't own any NSS objects here, so no need to clean up
+  virtual void virtualDestroyNSSReference() { };
 };
 
 #define NS_X509CERTDB_CID { /* fb0bbc5c-452e-4783-b32c-80124693d871 */ \
     0xfb0bbc5c,                                                        \
     0x452e,                                                            \
     0x4783,                                                            \
     {0xb3, 0x2c, 0x80, 0x12, 0x46, 0x93, 0xd8, 0x71}                   \
   }
--- a/testing/marionette/marionette-server.js
+++ b/testing/marionette/marionette-server.js
@@ -2176,17 +2176,17 @@ MarionetteServerConnection.prototype = {
       case "Marionette:register":
         // This code processes the content listener's registration information
         // and either accepts the listener, or ignores it
         let nullPrevious = (this.curBrowser.curFrameId == null);
         let listenerWindow = 
                             Services.wm.getOuterWindowWithId(message.json.value);
 
         //go in here if we're already in a remote frame.
-        if (!listenerWindow || (listenerWindow.location.href != message.json.href) &&
+        if ((!listenerWindow || listenerWindow.location.href != message.json.href) &&
             (this.curBrowser.frameManager.currentRemoteFrame !== null)) {
           // The outerWindowID from an OOP frame will not be meaningful to
           // the parent process here, since each process maintains its own
           // independent window list.  So, it will either be null (!listenerWindow)
           // if we're already in a remote frame,
           // or it will point to some random window, which will hopefully 
           // cause an href mismatch.  Currently this only happens
           // in B2G for OOP frames registered in Marionette:switchToFrame, so
--- a/toolkit/components/jsdownloads/src/DownloadLegacy.js
+++ b/toolkit/components/jsdownloads/src/DownloadLegacy.js
@@ -126,19 +126,19 @@ DownloadLegacyTransfer.prototype = {
   },
 
   onProgressChange: function DLT_onProgressChange(aWebProgress, aRequest,
                                                   aCurSelfProgress,
                                                   aMaxSelfProgress,
                                                   aCurTotalProgress,
                                                   aMaxTotalProgress)
   {
-    return onProgressChange64(aWebProgress, aRequest, aCurSelfProgress,
-                              aMaxSelfProgress, aCurTotalProgress,
-                              aMaxTotalProgress);
+    this.onProgressChange64(aWebProgress, aRequest, aCurSelfProgress,
+                            aMaxSelfProgress, aCurTotalProgress,
+                            aMaxTotalProgress);
   },
 
   onLocationChange: function () { },
 
   onStatusChange: function DLT_onStatusChange(aWebProgress, aRequest, aStatus,
                                               aMessage)
   {
     // The status change may optionally be received in addition to the state
--- a/toolkit/crashreporter/nsExceptionHandler.cpp
+++ b/toolkit/crashreporter/nsExceptionHandler.cpp
@@ -217,16 +217,21 @@ static const int kAvailablePageFileParam
 static const char kAvailablePhysicalMemoryParameter[] = "AvailablePhysicalMemory=";
 static const int kAvailablePhysicalMemoryParameterLen =
   sizeof(kAvailablePhysicalMemoryParameter)-1;
 
 static const char kIsGarbageCollectingParameter[] = "IsGarbageCollecting=";
 static const int kIsGarbageCollectingParameterLen =
   sizeof(kIsGarbageCollectingParameter)-1;
 
+#ifdef XP_WIN
+static const char kBlockedDllsParameter[] = "BlockedDllList=";
+static const int kBlockedDllsParameterLen = sizeof(kBlockedDllsParameter) - 1;
+#endif
+
 // this holds additional data sent via the API
 static Mutex* crashReporterAPILock;
 static Mutex* notesFieldLock;
 static AnnotationTable* crashReporterAPIData_Hash;
 static nsCString* crashReporterAPIData = nullptr;
 static nsCString* notesField = nullptr;
 static bool isGarbageCollecting;
 
@@ -535,16 +540,19 @@ bool MinidumpCallback(
         WriteFile(hFile, "\n", 1, &nBytes, nullptr);
       }
       if (isGarbageCollecting) {
         WriteFile(hFile, kIsGarbageCollectingParameter, kIsGarbageCollectingParameterLen,
                   &nBytes, nullptr);
         WriteFile(hFile, isGarbageCollecting ? "1" : "0", 1, &nBytes, nullptr);
         WriteFile(hFile, "\n", 1, &nBytes, nullptr);
       }
+      WriteFile(hFile, kBlockedDllsParameter, kBlockedDllsParameterLen, &nBytes, nullptr);
+      WriteBlockedDlls(hFile);
+      WriteFile(hFile, "\n", 1, &nBytes, nullptr);
 
       // Try to get some information about memory.
       MEMORYSTATUSEX statex;
       statex.dwLength = sizeof(statex);
       if (GlobalMemoryStatusEx(&statex)) {
         char buffer[128];
         int bufferLen;
 
--- a/toolkit/crashreporter/nsExceptionHandler.h
+++ b/toolkit/crashreporter/nsExceptionHandler.h
@@ -39,16 +39,21 @@ nsresult SetMinidumpPath(const nsAString
 // AnnotateCrashReport and AppendAppNotesToCrashReport may be called from any
 // thread in a chrome process, but may only be called from the main thread in
 // a content process.
 nsresult AnnotateCrashReport(const nsACString& key, const nsACString& data);
 nsresult AppendAppNotesToCrashReport(const nsACString& data);
 
 nsresult SetGarbageCollecting(bool collecting);
 
+#ifdef XP_WIN
+// Implemented by the blocklist, this method writes the blocklist annotation
+void WriteBlockedDlls(HANDLE file);
+#endif
+
 nsresult SetRestartArgs(int argc, char** argv);
 nsresult SetupExtraData(nsIFile* aAppDataDirectory,
                         const nsACString& aBuildID);
 bool GetLastRunCrashID(nsAString& id);
 
 // Registers an additional memory region to be included in the minidump
 nsresult RegisterAppMemory(void* ptr, size_t length);
 nsresult UnregisterAppMemory(void* ptr);
--- a/toolkit/xre/nsWindowsDllBlocklist.cpp
+++ b/toolkit/xre/nsWindowsDllBlocklist.cpp
@@ -15,20 +15,21 @@
 
 #include "nsAutoPtr.h"
 #include "nsThreadUtils.h"
 
 #include "prlog.h"
 
 #include "nsWindowsDllInterceptor.h"
 #include "mozilla/WindowsVersion.h"
+#include "nsWindowsHelpers.h"
 
 using namespace mozilla;
 
-#if defined(MOZ_CRASHREPORTER) && !defined(NO_BLOCKLIST_CRASHREPORTER)
+#ifdef MOZ_CRASHREPORTER
 #include "nsExceptionHandler.h"
 #endif
 
 #define ALL_VERSIONS   ((unsigned long long)-1LL)
 
 // DLLs sometimes ship without a version number, particularly early
 // releases. Blocking "version <= 0" has the effect of blocking unversioned
 // DLLs (since the call to get version info fails), but not blocking
@@ -133,16 +134,20 @@ static DllBlockInfo sWindowsDllBlocklist
 
   // Older belgian ID card software causes Firefox to crash or hang on
   // shutdown, bug 831285 and 918399.
   { "beid35cardlayer.dll", MAKE_VERSION(3, 5, 6, 6968) },
 
   // bug 925459, bitguard crashes
   { "bitguard.dll", MAKE_VERSION(2, 6, 1694, 24) },
 
+  // bug 812683 - crashes in Windows library when Asus Gamer OSD is installed
+  // Software is discontinued/unsupported
+  { "atkdx11disp.dll", ALL_VERSIONS },
+
   { nullptr, 0 }
 };
 
 #ifndef STATUS_DLL_NOT_FOUND
 #define STATUS_DLL_NOT_FOUND ((DWORD)0xC0000135L)
 #endif
 
 // define this for very verbose dll load debug spew
@@ -215,72 +220,152 @@ CheckASLR(const wchar_t* path)
       ::CloseHandle(map);
     }
     ::CloseHandle(file);
   }
 
   return retval;
 }
 
+// This lock protects both the reentrancy sentinel and the crash reporter
+// data structures.
+static CRITICAL_SECTION sLock;
+
 /**
  * Some versions of Windows call LoadLibraryEx to get the version information
  * for a DLL, which causes our patched LdrLoadDll implementation to re-enter
  * itself and cause infinite recursion and a stack-exhaustion crash. We protect
  * against reentrancy by allowing recursive loads of the same DLL.
  *
  * Note that we don't use __declspec(thread) because that doesn't work in DLLs
  * loaded via LoadLibrary and there can be a limited number of TLS slots, so
  * we roll our own.
  */
 class ReentrancySentinel
 {
 public:
   explicit ReentrancySentinel(const char* dllName)
   {
     DWORD currentThreadId = GetCurrentThreadId();
-    EnterCriticalSection(&sLock);
+    AutoCriticalSection lock(&sLock);
     mPreviousDllName = (*sThreadMap)[currentThreadId];
 
     // If there is a DLL currently being loaded and it has the same name
     // as the current attempt, we're re-entering.
     mReentered = mPreviousDllName && !stricmp(mPreviousDllName, dllName);
     (*sThreadMap)[currentThreadId] = dllName;
-    LeaveCriticalSection(&sLock);
   }
     
   ~ReentrancySentinel()
   {
     DWORD currentThreadId = GetCurrentThreadId();
-    EnterCriticalSection(&sLock);
+    AutoCriticalSection lock(&sLock);
     (*sThreadMap)[currentThreadId] = mPreviousDllName;
-    LeaveCriticalSection(&sLock);
   }
 
   bool BailOut() const
   {
     return mReentered;
   };
     
   static void InitializeStatics()
   {
     InitializeCriticalSection(&sLock);
     sThreadMap = new std::map<DWORD, const char*>;
   }
 
 private:
-  static CRITICAL_SECTION sLock;
   static std::map<DWORD, const char*>* sThreadMap;
 
   const char* mPreviousDllName;
   bool mReentered;
 };
 
-CRITICAL_SECTION ReentrancySentinel::sLock;
 std::map<DWORD, const char*>* ReentrancySentinel::sThreadMap;
 
+/**
+ * This is a linked list of DLLs that have been blocked. It doesn't use
+ * mozilla::LinkedList because this is an append-only list and doesn't need
+ * to be doubly linked.
+ */
+class DllBlockSet
+{
+public:
+  static void Add(const char* name, unsigned long long version);
+
+  // Write the list of blocked DLLs to a file HANDLE. This method is run after
+  // a crash occurs and must therefore not use the heap, etc.
+  static void Write(HANDLE file);
+
+private:
+  DllBlockSet(const char* name, unsigned long long version)
+    : mName(name)
+    , mVersion(version)
+    , mNext(nullptr)
+  {
+  }
+
+  const char* mName; // points into the sWindowsDllBlocklist string
+  unsigned long long mVersion;
+  DllBlockSet* mNext;
+
+  static DllBlockSet* gFirst;
+};
+
+DllBlockSet* DllBlockSet::gFirst;
+
+void
+DllBlockSet::Add(const char* name, unsigned long long version)
+{
+  AutoCriticalSection lock(&sLock);
+  for (DllBlockSet* b = gFirst; b; b = b->mNext) {
+    if (0 == strcmp(b->mName, name) && b->mVersion == version) {
+      return;
+    }
+  }
+  // Not already present
+  DllBlockSet* n = new DllBlockSet(name, version);
+  n->mNext = gFirst;
+  gFirst = n;
+}
+
+void
+DllBlockSet::Write(HANDLE file)
+{
+  AutoCriticalSection lock(&sLock);
+  DWORD nBytes;
+
+  // Because this method is called after a crash occurs, and uses heap memory,
+  // protect this entire block with a structured exception handler.
+  __try {
+    for (DllBlockSet* b = gFirst; b; b = b->mNext) {
+      // write name[,v.v.v.v];
+      WriteFile(file, b->mName, strlen(b->mName), &nBytes, nullptr);
+      if (b->mVersion != -1) {
+        WriteFile(file, ",", 1, &nBytes, nullptr);
+        uint16_t parts[4];
+        parts[0] = b->mVersion >> 48;
+        parts[1] = (b->mVersion >> 32) & 0xFFFF;
+        parts[2] = (b->mVersion >> 16) & 0xFFFF;
+        parts[3] = b->mVersion & 0xFFFF;
+        for (int p = 0; p < 4; ++p) {
+          char buf[32];
+          ltoa(parts[p], buf, 10);
+          WriteFile(file, buf, strlen(buf), &nBytes, nullptr);
+          if (p != 3) {
+            WriteFile(file, ".", 1, &nBytes, nullptr);
+          }
+        }
+      }
+      WriteFile(file, ";", 1, &nBytes, nullptr);
+    }
+  }
+  __except (EXCEPTION_EXECUTE_HANDLER) { }
+}
+
 static
 wchar_t* getFullPath (PWCHAR filePath, wchar_t* fname)
 {
   // In Windows 8, the first parameter seems to be used for more than just the
   // path name.  For example, its numerical value can be 1.  Passing a non-valid
   // pointer to SearchPathW will cause a crash, so we need to check to see if we
   // are handed a valid pointer, and otherwise just pass nullptr to SearchPathW.
   PWCHAR sanitizedFilePath = (intptr_t(filePath) < 1024) ? nullptr : filePath;
@@ -299,16 +384,27 @@ wchar_t* getFullPath (PWCHAR filePath, w
   }
 
   // now actually grab it
   SearchPathW(sanitizedFilePath, fname, L".dll", pathlen + 1, full_fname,
               nullptr);
   return full_fname;
 }
 
+// No builtin function to find the last character matching a set
+static wchar_t* lastslash(wchar_t* s, int len)
+{
+  for (wchar_t* c = s + len - 1; c >= s; --c) {
+    if (*c == L'\\' || *c == L'/') {
+      return c;
+    }
+  }
+  return nullptr;
+}
+
 static NTSTATUS NTAPI
 patched_LdrLoadDll (PWCHAR filePath, PULONG flags, PUNICODE_STRING moduleFileName, PHANDLE handle)
 {
   // We have UCS2 (UTF16?), we want ASCII, but we also just want the filename portion
 #define DLLNAME_MAX 128
   char dllName[DLLNAME_MAX+1];
   wchar_t *dll_part;
   DllBlockInfo *info;
@@ -325,17 +421,17 @@ patched_LdrLoadDll (PWCHAR filePath, PUL
       fname[len] != 0)
   {
 #ifdef DEBUG
     printf_stderr("LdrLoadDll: non-null terminated string found!\n");
 #endif
     goto continue_loading;
   }
 
-  dll_part = wcsrchr(fname, L'\\');
+  dll_part = lastslash(fname, len);
   if (dll_part) {
     dll_part = dll_part + 1;
     len -= dll_part - fname;
   } else {
     dll_part = fname;
   }
 
 #ifdef DEBUG_very_verbose
@@ -391,16 +487,18 @@ patched_LdrLoadDll (PWCHAR filePath, PUL
     printf_stderr("LdrLoadDll: info->name: '%s'\n", info->name);
 #endif
 
     if ((info->flags == DllBlockInfo::BLOCK_WIN8PLUS_ONLY) &&
         !IsWin8OrLater()) {
       goto continue_loading;
     }
 
+    unsigned long long fVersion = ALL_VERSIONS;
+
     if (info->maxVersion != ALL_VERSIONS) {
       ReentrancySentinel sentinel(dllName);
       if (sentinel.BailOut()) {
         goto continue_loading;
       }
 
       full_fname = getFullPath(filePath, fname);
       if (!full_fname) {
@@ -417,30 +515,31 @@ patched_LdrLoadDll (PWCHAR filePath, PUL
       if (infoSize != 0) {
         nsAutoArrayPtr<unsigned char> infoData(new unsigned char[infoSize]);
         VS_FIXEDFILEINFO *vInfo;
         UINT vInfoLen;
 
         if (GetFileVersionInfoW(full_fname, 0, infoSize, infoData) &&
             VerQueryValueW(infoData, L"\\", (LPVOID*) &vInfo, &vInfoLen))
         {
-          unsigned long long fVersion =
+          fVersion =
             ((unsigned long long)vInfo->dwFileVersionMS) << 32 |
             ((unsigned long long)vInfo->dwFileVersionLS);
 
           // finally do the version check, and if it's greater than our block
           // version, keep loading
           if (fVersion > info->maxVersion)
             load_ok = true;
         }
       }
     }
 
     if (!load_ok) {
       printf_stderr("LdrLoadDll: Blocking load of '%s' -- see http://www.mozilla.com/en-US/blocklist/\n", dllName);
+      DllBlockSet::Add(info->name, fVersion);
       return STATUS_DLL_NOT_FOUND;
     }
   }
 
 continue_loading:
 #ifdef DEBUG_very_verbose
   printf_stderr("LdrLoadDll: continuing load... ('%S')\n", moduleFileName->Buffer);
 #endif
@@ -476,14 +575,22 @@ XRE_SetupDllBlocklist()
 
   bool ok = NtDllIntercept.AddHook("LdrLoadDll", reinterpret_cast<intptr_t>(patched_LdrLoadDll), (void**) &stub_LdrLoadDll);
 
 #ifdef DEBUG
   if (!ok)
     printf_stderr ("LdrLoadDll hook failed, no dll blocklisting active\n");
 #endif
 
-#if defined(MOZ_CRASHREPORTER) && !defined(NO_BLOCKLIST_CRASHREPORTER)
+#ifdef MOZ_CRASHREPORTER
   if (!ok) {
     CrashReporter::AppendAppNotesToCrashReport(NS_LITERAL_CSTRING("DllBlockList Failed\n"));
   }
 #endif
 }
+
+#ifdef MOZ_CRASHREPORTER
+void
+CrashReporter::WriteBlockedDlls(HANDLE file)
+{
+  DllBlockSet::Write(file);
+}
+#endif
--- a/tools/trace-malloc/bloatblame.cpp
+++ b/tools/trace-malloc/bloatblame.cpp
@@ -17,17 +17,16 @@
 extern int  getopt(int argc, char *const *argv, const char *shortopts);
 extern char *optarg;
 extern int  optind;
 #endif
 #endif
 #include <math.h>
 #include <time.h>
 #include <sys/stat.h>
-#include "prtypes.h"
 #include "prlog.h"
 #include "prprf.h"
 #include "plhash.h"
 #include "pldhash.h"
 #include "nsTraceMalloc.h"
 #include "tmreader.h"
 
 static char   *program;
--- a/tools/trace-malloc/lib/nsDebugHelpWin32.cpp
+++ b/tools/trace-malloc/lib/nsDebugHelpWin32.cpp
@@ -3,17 +3,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/. */
 
 
 #if defined(_WIN32) && (defined(_M_IX86) || defined(_M_X64))
 // This is the .cpp file where the globals live
 #define DHW_IMPLEMENT_GLOBALS
 #include <stdio.h>
-#include "prtypes.h"
 #include "prprf.h"
 #include "prlog.h"
 #include "plstr.h"
 #include "prlock.h"
 #include "nscore.h"
 #include "nsDebugHelpWin32.h"
 #else
 #error "nsDebugHelpWin32.cpp should only be built in Win32 x86/x64 builds"
--- a/tools/trace-malloc/lib/nsTypeInfo.h
+++ b/tools/trace-malloc/lib/nsTypeInfo.h
@@ -2,18 +2,16 @@
  *
  * 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/. */
 
 #ifndef trace_malloc_nsTypeInfo_h_
 #define trace_malloc_nsTypeInfo_h_
 
-#include "prtypes.h"
-
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 extern const char* nsGetTypeName(void* ptr);
 
 extern void RegisterTraceMallocShutdown();
 
--- a/tools/trace-malloc/lib/nsWinTraceMalloc.cpp
+++ b/tools/trace-malloc/lib/nsWinTraceMalloc.cpp
@@ -2,17 +2,16 @@
  *
  * 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/. */
 
 #include <stdio.h>
 #include <stdlib.h>
 
-#include "prtypes.h"
 #include "prinrval.h"
 #include "prlock.h"
 #include "nscore.h"
 
 #include "nsDebugHelpWin32.h"
 #include "nsTraceMallocCallbacks.h"
 
 /***************************************************************************/
--- a/widget/gtk/nsColorPicker.cpp
+++ b/widget/gtk/nsColorPicker.cpp
@@ -66,19 +66,21 @@ NS_IMETHODIMP nsColorPicker::Open(nsICol
     return NS_ERROR_FAILURE;
   }
   mCallback = aColorPickerShownCallback;
 
   nsXPIDLCString title;
   title.Adopt(ToNewUTF8String(mTitle));
   GtkWidget *color_chooser = gtk_color_selection_dialog_new(title);
 
+  GtkWindow *window = GTK_WINDOW(color_chooser);
+  gtk_window_set_modal(window, TRUE);
+
   GtkWindow *parent_window = GTK_WINDOW(mParentWidget->GetNativeData(NS_NATIVE_SHELLWIDGET));
   if (parent_window) {
-    GtkWindow *window = GTK_WINDOW(color_chooser);
     gtk_window_set_transient_for(window, parent_window);
     gtk_window_set_destroy_with_parent(window, TRUE);
   }
 
   gtk_color_selection_set_current_color(
       GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(
         GTK_COLOR_SELECTION_DIALOG(color_chooser))),
       &mDefaultColor);
--- a/xpcom/base/nsWindowsHelpers.h
+++ b/xpcom/base/nsWindowsHelpers.h
@@ -4,16 +4,36 @@
 
 #ifndef nsWindowsHelpers_h
 #define nsWindowsHelpers_h
 
 #include <windows.h>
 #include "nsAutoRef.h"
 #include "nscore.h"
 
+// ----------------------------------------------------------------------------
+// Critical Section helper class
+// ----------------------------------------------------------------------------
+
+class AutoCriticalSection
+{
+public:
+  AutoCriticalSection(LPCRITICAL_SECTION section)
+    : mSection(section)
+  {
+    ::EnterCriticalSection(mSection);
+  }
+  ~AutoCriticalSection()
+  {
+    ::LeaveCriticalSection(mSection);
+  }
+private:
+  LPCRITICAL_SECTION mSection;
+};
+
 template<>
 class nsAutoRefTraits<HKEY>
 {
 public:
   typedef HKEY RawRef;
   static HKEY Void()
   {
     return nullptr;
--- a/xpcom/ds/TimeStamp_windows.cpp
+++ b/xpcom/ds/TimeStamp_windows.cpp
@@ -9,16 +9,17 @@
 
 // XXX Forcing log to be able to catch issues in the field.  Should be removed
 // before this reaches the Release or even Beta channel.
 #define FORCE_PR_LOG
 
 #include "mozilla/MathAlgorithms.h"
 #include "mozilla/Mutex.h"
 #include "mozilla/TimeStamp.h"
+#include "nsWindowsHelpers.h"
 #include <windows.h>
 
 #include "nsCRT.h"
 #include "prlog.h"
 #include "prprf.h"
 #include <stdio.h>
 
 #include <intrin.h>
@@ -180,36 +181,16 @@ static DWORD sLastGTCResult = 0;
 // incremented atomically.
 static DWORD sLastGTCRollover = 0;
 
 namespace mozilla {
 
 typedef ULONGLONG (WINAPI* GetTickCount64_t)();
 static GetTickCount64_t sGetTickCount64 = nullptr;
 
-// ----------------------------------------------------------------------------
-// Critical Section helper class
-// ----------------------------------------------------------------------------
-
-class AutoCriticalSection
-{
-public:
-  AutoCriticalSection(LPCRITICAL_SECTION section)
-    : mSection(section)
-  {
-    ::EnterCriticalSection(mSection);
-  }
-  ~AutoCriticalSection()
-  {
-    ::LeaveCriticalSection(mSection);
-  }
-private:
-  LPCRITICAL_SECTION mSection;
-};
-
 // Function protecting GetTickCount result from rolling over,
 // result is in [ms]
 static ULONGLONG WINAPI
 MozGetTickCount64()
 {
   DWORD GTC = ::GetTickCount();
 
   // Cheaper then CMPXCHG8B