Merge mozilla-central and mozilla-inbound
authorEd Morley <bmo@edmorley.co.uk>
Wed, 26 Oct 2011 01:04:58 +0100
changeset 79212 cc66accc81813cd35c5da8f7d50b559c4185ecc2
parent 79211 08a63bc26c755fa740ab19c9d12b4b603a1e1508 (current diff)
parent 79190 08cb321ba6bf3fde3f5287a995dcd70e72184b15 (diff)
child 79213 e2f76393d2d014e65c83ff7b7535fc9f717be43c
child 79215 926699a40a9b17767447d481291037fe91330da3
child 79351 480ca9260f4b294f22563c9b9729f41589b3b157
push id21377
push userbmo@edmorley.co.uk
push dateWed, 26 Oct 2011 00:52:20 +0000
treeherdermozilla-central@cc66accc8181 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone10.0a1
first release with
nightly linux32
cc66accc8181 / 10.0a1 / 20111026031017 / files
nightly linux64
cc66accc8181 / 10.0a1 / 20111026031017 / files
nightly mac
cc66accc8181 / 10.0a1 / 20111026031017 / files
nightly win32
cc66accc8181 / 10.0a1 / 20111026031017 / files
nightly win64
cc66accc8181 / 10.0a1 / 20111026031017 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-central and mozilla-inbound
layout/base/nsPresShell.cpp
--- a/.hgtags
+++ b/.hgtags
@@ -64,8 +64,9 @@ a71bd564ebf5bf4f93d13e84114f759c263130b0
 a95d426422816513477e5863add1b00ac7041dcb AURORA_BASE_20110412
 138f593553b66c9f815e8f57870c19d6347f7702 UPDATE_PACKAGING_R14
 9eae975b3d6fb7748fe5a3c0113d449b1c7cc0b2 AURORA_BASE_20110524
 138f593553b66c9f815e8f57870c19d6347f7702 UPDATE_PACKAGING_R14
 462c726144bc1fb45b61e774f64ac5d61b4e047c UPDATE_PACKAGING_R14
 5eb553dd2ceae5f88d80f27afc5ef3935c5d43b0 AURORA_BASE_20110705
 41b84b87c816403e1b74963d8094cff0406c989e AURORA_BASE_20110816
 c0983049bcaa9551e5f276d5a77ce154c151e0b0 AURORA_BASE_20110927
+462c726144bc1fb45b61e774f64ac5d61b4e047c UPDATE_PACKAGING_R15
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -4154,17 +4154,17 @@ var XULBrowserWindow = {
   status: "",
   defaultStatus: "",
   jsStatus: "",
   jsDefaultStatus: "",
   overLink: "",
   startTime: 0,
   statusText: "",
   isBusy: false,
-  inContentWhitelist: ["about:addons", "about:permissions"],
+  inContentWhitelist: ["about:addons", "about:permissions", "about:sync-progress"],
 
   QueryInterface: function (aIID) {
     if (aIID.equals(Ci.nsIWebProgressListener) ||
         aIID.equals(Ci.nsIWebProgressListener2) ||
         aIID.equals(Ci.nsISupportsWeakReference) ||
         aIID.equals(Ci.nsIXULBrowserWindow) ||
         aIID.equals(Ci.nsISupports))
       return this;
new file mode 100644
--- /dev/null
+++ b/browser/base/content/syncProgress.js
@@ -0,0 +1,72 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License
+ * Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Firefox Sync.
+ *
+ * The Initial Developer of the Original Code is the Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2011
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *   Allison Naaktgeboren <ally@mozilla.com> (original author)
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://services-sync/main.js");
+
+let gProgressBar;
+let gCounter = 0;
+
+function onLoad(event) {
+  Services.obs.addObserver(increaseProgressBar, "weave:engine:sync:finish", false);
+  Services.obs.addObserver(increaseProgressBar, "weave:engine:sync:error", false);
+  gProgressBar = document.getElementById('uploadProgressBar');
+
+  if (Services.prefs.getPrefType("services.sync.firstSync") != Ci.nsIPrefBranch.PREF_INVALID) {
+    gProgressBar.max = Weave.Engines.getEnabled().length;
+    gProgressBar.style.display = "inline";
+  }
+  else {
+    gProgressBar.style.display = "none";
+  }
+}
+
+function onUnload(event) {
+  Services.obs.removeObserver(increaseProgressBar, "weave:engine:sync:finish");
+  Services.obs.removeObserver(increaseProgressBar, "weave:engine:sync:error");
+}
+
+function increaseProgressBar(){
+  gCounter += 1;
+  gProgressBar.setAttribute("value", gCounter);
+}
+
+function closeTab() {
+  window.close();
+}
new file mode 100644
--- /dev/null
+++ b/browser/base/content/syncProgress.xhtml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License
+# Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS"
+# basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is Firefox Sync.
+#
+# The Initial Developer of the Original Code is the Mozilla Foundation.
+# Portions created by the Initial Developer are Copyright (C) 2011
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Allison Naaktgeboren <ally@mozilla.com> (original author)
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+<!DOCTYPE html [
+  <!ENTITY % htmlDTD
+    PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "DTD/xhtml1-strict.dtd">
+  %htmlDTD;
+  <!ENTITY % syncProgressDTD
+    SYSTEM "chrome://browser/locale/syncProgress.dtd">
+    %syncProgressDTD;
+  <!ENTITY % syncSetupDTD
+    SYSTEM "chrome://browser/locale/syncSetup.dtd">
+    %syncSetupDTD;
+]>
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>&syncProgress.pageTitle;</title>
+
+    <link rel="stylesheet" type="text/css" media="all"
+          href="chrome://browser/skin/syncProgress.css"/>
+
+    <link rel="icon" type="image/png" id="favicon"
+          href="chrome://browser/skin/sync-16.png"/>
+
+    <script type="text/javascript;version=1.8"
+            src="chrome://browser/content/syncProgress.js"/>
+  </head>
+  <body onload="onLoad(event)" onunload="onUnload(event)">
+    <title>&setup.successPage.title;</title>
+    <div id="floatingBox" class="main-content">
+      <div id="title">
+        <h1>&setup.successPage.title;</h1>
+      </div>
+      <div id="successLogo">
+        <img id="brandSyncLogo" src="chrome://browser/skin/sync-128.png" alt="&syncProgress.logoAltText;" />
+      </div>
+      <div id="loadingText">
+        <p id="blurb">&syncProgress.textBlurb; </p>
+      </div>
+      <div id="progressBar">
+        <progress id="uploadProgressBar" value="0"/>
+      </div>
+      <div id="bottomRow">
+        <button id="closeButton" onclick="closeTab()">&syncProgress.closeButton; </button>
+      </div>
+    </div>
+  </body>
+</html>
--- a/browser/base/content/syncSetup.js
+++ b/browser/base/content/syncSetup.js
@@ -19,16 +19,17 @@
  * the Initial Developer. All Rights Reserved.
  *
  * Contributor(s):
  *   Edward Lee <edilee@mozilla.com>
  *   Mike Connor <mconnor@mozilla.com>
  *   Philipp von Weitershausen <philipp@weitershausen.de>
  *   Paul O’Shannessy <paul@oshannessy.com>
  *   Richard Newman <rnewman@mozilla.com>
+ *   Allison Naaktgeboren <ally@mozilla.com>
  *
  * Alternatively, the contents of this file may be used under the terms of
  * either the GNU General Public License Version 2 or later (the "GPL"), or
  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  * in which case the provisions of the GPL or the LGPL are applicable instead
  * of those above. If you wish to allow use of your version of this file only
  * under the terms of either the GPL or the LGPL, and not to allow others to
  * use your version of this file under the terms of the MPL, indicate your
@@ -48,17 +49,16 @@ const Cu = Components.utils;
 
 const PAIR_PAGE                     = 0;
 const INTRO_PAGE                    = 1;
 const NEW_ACCOUNT_START_PAGE        = 2;
 const EXISTING_ACCOUNT_CONNECT_PAGE = 3;
 const EXISTING_ACCOUNT_LOGIN_PAGE   = 4;
 const OPTIONS_PAGE                  = 5;
 const OPTIONS_CONFIRM_PAGE          = 6;
-const SETUP_SUCCESS_PAGE            = 7;
 
 // Broader than we'd like, but after this changed from api-secure.recaptcha.net
 // we had no choice. At least we only do this for the duration of setup.
 // See discussion in Bugs 508112 and 653307.
 const RECAPTCHA_DOMAIN = "https://www.google.com";
 
 const PIN_PART_LENGTH = 4;
 
@@ -406,42 +406,31 @@ var gSyncSetup = {
         this.wizard.getButton("extra1").hidden = false;
         this.wizard.getButton("next").hidden = false;
         this.wizard.getButton("back").hidden = false;
         this.onServerCommand();
         this.wizard.canRewind = true;
         this.checkFields();
         break;
       case EXISTING_ACCOUNT_CONNECT_PAGE:
+        Weave.Svc.Prefs.set("firstSync", "existingAccount");
         this.wizard.getButton("next").hidden = false;
         this.wizard.getButton("back").hidden = false;
         this.wizard.getButton("extra1").hidden = false;
         this.wizard.canAdvance = false;
         this.wizard.canRewind = true;
         this.startEasySetup();
         break;
       case EXISTING_ACCOUNT_LOGIN_PAGE:
         this.wizard.getButton("next").hidden = false;
         this.wizard.getButton("back").hidden = false;
         this.wizard.getButton("extra1").hidden = false;
         this.wizard.canRewind = true;
         this.checkFields();
         break;
-      case SETUP_SUCCESS_PAGE:
-        this.wizard.canRewind = false;
-        this.wizard.canAdvance = true;
-        this.wizard.getButton("back").hidden = true;
-        this.wizard.getButton("next").hidden = true;
-        this.wizard.getButton("cancel").hidden = true;
-        this.wizard.getButton("finish").hidden = false;
-        this._handleSuccess();
-        if (this.wizardType == "pair") {
-          this.completePairing();
-        }
-        break;
       case OPTIONS_PAGE:
         this.wizard.canRewind = false;
         this.wizard.canAdvance = true;
         if (!this._resettingSync) {
           this.wizard.getButton("next").label =
             this._stringBundle.GetStringFromName("button.syncOptionsDone.label");
           this.wizard.getButton("next").removeAttribute("accesskey");
         }
@@ -468,17 +457,17 @@ var gSyncSetup = {
 
   onWizardAdvance: function () {
     // Check pageIndex so we don't prompt before the Sync setup wizard appears.
     // This is a fallback in case the Master Password gets locked mid-wizard.
     if ((this.wizard.pageIndex >= 0) &&
         !Weave.Utils.ensureMPUnlocked()) {
       return false;
     }
-      
+
     switch (this.wizard.pageIndex) {
       case PAIR_PAGE:
         this.startPairing();
         return false;
       case NEW_ACCOUNT_START_PAGE:
         // If the user selects Next (e.g. by hitting enter) when we haven't
         // executed the delayed checks yet, execute them immediately.
         if (this._checkAccountTimer) {
@@ -514,43 +503,44 @@ var gSyncSetup = {
         let error = Weave.Service.createAccount(email, password,
                                                 challenge, response);
 
         if (error == null) {
           Weave.Service.account = email;
           Weave.Service.password = password;
           Weave.Service.passphrase = Weave.Utils.generatePassphrase();
           this._handleNoScript(false);
-          this.wizard.pageIndex = SETUP_SUCCESS_PAGE;
+          Weave.Svc.Prefs.set("firstSync", "newAccount");
+          this.wizardFinish();
           return false;
         }
 
         image.setAttribute("status", "error");
         label.value = Weave.Utils.getErrorString(error);
         return false;
       case EXISTING_ACCOUNT_LOGIN_PAGE:
         Weave.Service.account = Weave.Utils.normalizeAccount(
           document.getElementById("existingAccountName").value);
         Weave.Service.password = document.getElementById("existingPassword").value;
         let pp = document.getElementById("existingPassphrase").value;
         Weave.Service.passphrase = Weave.Utils.normalizePassphrase(pp);
-        if (Weave.Service.login())
-          this.wizard.pageIndex = SETUP_SUCCESS_PAGE;
+        if (Weave.Service.login()) {
+          this.wizardFinish();
+        }
         return false;
       case OPTIONS_PAGE:
         let desc = document.getElementById("mergeChoiceRadio").selectedIndex;
         // No confirmation needed on new account setup or merge option
         // with existing account.
         if (this._settingUpNew || (!this._resettingSync && desc == 0))
           return this.returnFromOptions();
         return this._handleChoice();
       case OPTIONS_CONFIRM_PAGE:
         if (this._resettingSync) {
-          this.onWizardFinish();
-          window.close();
+          this.wizardFinish();
           return false;
         }
         return this.returnFromOptions();
     }
     return true;
   },
 
   onWizardBack: function () {
@@ -575,50 +565,49 @@ var gSyncSetup = {
       case OPTIONS_CONFIRM_PAGE:
         // Backing up from the confirmation page = resetting first sync to merge.
         document.getElementById("mergeChoiceRadio").selectedIndex = 0;
         return this.returnFromOptions();
     }
     return true;
   },
 
-  onWizardFinish: function () {
+  wizardFinish: function () {
     this.setupInitialSync();
 
+    if (this.wizardType == "pair") {
+      this.completePairing();
+    }
+
     if (!this._resettingSync) {
       function isChecked(element) {
         return document.getElementById(element).hasAttribute("checked");
       }
 
       let prefs = ["engine.bookmarks", "engine.passwords", "engine.history", "engine.tabs", "engine.prefs"];
       for (let i = 0;i < prefs.length;i++) {
         Weave.Svc.Prefs.set(prefs[i], isChecked(prefs[i]));
       }
       this._handleNoScript(false);
       if (Weave.Svc.Prefs.get("firstSync", "") == "notReady")
         Weave.Svc.Prefs.reset("firstSync");
 
       Weave.Service.persistLogin();
       Weave.Svc.Obs.notify("weave:service:setup-complete");
-      if (this._settingUpNew)
-        gSyncUtils.openFirstClientFirstrun();
-      else
-        gSyncUtils.openAddedClientFirstrun();
+
+      gSyncUtils.openFirstSyncProgressPage();
     }
     Weave.Utils.nextTick(Weave.Service.sync, Weave.Service);
+    window.close();
   },
 
   onWizardCancel: function () {
     if (this._resettingSync)
       return;
 
-    if (this.wizard.pageIndex == SETUP_SUCCESS_PAGE) {
-      this.onWizardFinish();
-      return;
-    }
     this.abortEasySetup();
     this._handleNoScript(false);
     Weave.Service.startOver();
   },
 
   onSyncOptions: function () {
     this._beforeOptionsPage = this.wizard.pageIndex;
     this.wizard.pageIndex = OPTIONS_PAGE;
@@ -709,17 +698,17 @@ var gSyncSetup = {
 
       onPairingStart: function onPairingStart() {},
 
       onComplete: function onComplete(credentials) {
         Weave.Service.account = credentials.account;
         Weave.Service.password = credentials.password;
         Weave.Service.passphrase = credentials.synckey;
         Weave.Service.serverURL = credentials.serverURL;
-        self.wizard.pageIndex = SETUP_SUCCESS_PAGE;
+        gSyncSetup.wizardFinish();
       },
 
       onAbort: function onAbort(error) {
         delete self._jpakeclient;
 
         // Ignore if wizard is aborted.
         if (error == JPAKE_ERROR_USERABORT)
           return;
@@ -901,35 +890,16 @@ var gSyncSetup = {
     if (valid)
       element.value = Weave.Service.serverURL;
     else
       Weave.Svc.Prefs.reset("serverURL");
 
     return valid;
   },
 
-  _handleSuccess: function() {
-    let self = this;
-    function fill(id, string)
-      document.getElementById(id).firstChild.nodeValue =
-        string ? self._stringBundle.GetStringFromName(string) : "";
-
-    fill("firstSyncAction", "");
-    fill("firstSyncActionWarning", "");
-    if (this._settingUpNew) {
-      fill("firstSyncAction", "newAccount.action.label");
-      fill("firstSyncActionChange", "newAccount.change.label");
-      return;
-    }
-    fill("firstSyncActionChange", "existingAccount.change.label");
-    let action = document.getElementById("mergeChoiceRadio").selectedItem.id;
-    let id = action == "resetClient" ? "firstSyncAction" : "firstSyncActionWarning";
-    fill(id, action + ".change.label");
-  },
-
   _handleChoice: function () {
     let desc = document.getElementById("mergeChoiceRadio").selectedIndex;
     document.getElementById("chosenActionDeck").selectedIndex = desc;
     switch (desc) {
       case 1:
         if (this._case1Setup)
           break;
 
--- a/browser/base/content/syncSetup.xul
+++ b/browser/base/content/syncSetup.xul
@@ -20,16 +20,17 @@
 # Portions created by the Initial Developer are Copyright (C) 2009
 # the Initial Developer. All Rights Reserved.
 #
 # Contributor(s):
 #   Edward Lee <edilee@mozilla.com>
 #   Mike Connor <mconnor@mozilla.com>
 #   Paul O’Shannessy <paul@oshannessy.com>
 #   Philipp von Weitershausen <philipp@weitershausen.de>
+#   Allison Naaktgeboren <ally@mozilla.com>
 #
 # Alternatively, the contents of this file may be used under the terms of
 # either the GNU General Public License Version 2 or later (the "GPL"), or
 # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 # in which case the provisions of the GPL or the LGPL are applicable instead
 # of those above. If you wish to allow use of your version of this file only
 # under the terms of either the GPL or the LGPL, and not to allow others to
 # use your version of this file under the terms of the MPL, indicate your
@@ -55,17 +56,16 @@
 <wizard id="wizard"
         title="&accountSetupTitle.label;"
         windowtype="Weave:AccountSetup"
         persist="screenX screenY"
         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
         xmlns:html="http://www.w3.org/1999/xhtml"
         onwizardnext="return gSyncSetup.onWizardAdvance()"
         onwizardback="return gSyncSetup.onWizardBack()"
-        onwizardfinish="gSyncSetup.onWizardFinish()"
         onwizardcancel="gSyncSetup.onWizardCancel()"
         onload="gSyncSetup.init()">
 
   <script type="application/javascript"
           src="chrome://browser/content/syncSetup.js"/>
   <script type="application/javascript"
           src="chrome://browser/content/syncUtils.js"/>
   <script type="application/javascript"
@@ -506,29 +506,16 @@
             &confirm.server2.label;
           </description>
           <separator class="thin"/>
           <vbox id="clientList">
           </vbox>
         </vbox>
       </deck>
   </wizardpage>
-
-  <wizardpage label="&setup.successPage.title;" 
-              id="successfulSetup"
-              onextra1="gSyncSetup.onSyncOptions()"
-              onpageshow="gSyncSetup.onPageShow()">
-    <vbox align="center">
-      <image id="successPageIcon"/>
-    </vbox>
-    <separator/>
-    <description class="normal">
-      <html:span id="firstSyncAction">replace me</html:span>
-      <html:strong id="firstSyncActionWarning">replace me</html:strong>
-      <html:span id="firstSyncActionChange">replace me</html:span>
-    </description>
-    <description>
-      &continueUsing.label;
-    </description>
-    <separator flex="1"/>
+# In terms of the wizard flow shown to the user, the 'syncOptionsConfirm'
+# page above is not the last wizard page. To prevent the wizard binding from
+# assuming that it is, we're inserting this dummy page here. This also means
+# that the wizard needs to always be closed manually via wizardFinish().
+  <wizardpage>
   </wizardpage>
 </wizard>
 
--- a/browser/base/content/syncUtils.js
+++ b/browser/base/content/syncUtils.js
@@ -104,27 +104,18 @@ let gSyncUtils = {
   openToS: function () {
     this._openLink(Weave.Svc.Prefs.get("termsURL"));
   },
 
   openPrivacyPolicy: function () {
     this._openLink(Weave.Svc.Prefs.get("privacyURL"));
   },
 
-  // xxxmpc - fix domain before 1.3 final (bug 583652)
-  _baseURL: "http://www.mozilla.com/firefox/sync/",
-
-  openFirstClientFirstrun: function () {
-    let url = this._baseURL + "firstrun.html";
-    this._openLink(url);
-  },
-
-  openAddedClientFirstrun: function () {
-    let url = this._baseURL + "secondrun.html";
-    this._openLink(url);
+  openFirstSyncProgressPage: function () {
+    this._openLink("about:sync-progress");
   },
 
   /**
    * Prepare an invisible iframe with the passphrase backup document.
    * Used by both the print and saving methods.
    *
    * @param elid : ID of the form element containing the passphrase.
    * @param callback : Function called once the iframe has loaded.
--- a/browser/base/content/test/Makefile.in
+++ b/browser/base/content/test/Makefile.in
@@ -240,16 +240,17 @@ include $(topsrcdir)/config/rules.mk
                  browser_addon_bar_close_button.js \
                  browser_addon_bar_shortcut.js \
                  browser_addon_bar_aomlistener.js \
                  test_bug628179.html \
                  browser_wyciwyg_urlbarCopying.js \
                  test_wyciwyg_copying.html \
                  authenticate.sjs \
                  browser_minimize.js \
+								 browser_aboutSyncProgress.js \
                  browser_middleMouse_inherit.js \
                  $(NULL)
 
 ifneq (cocoa,$(MOZ_WIDGET_TOOLKIT))
 _BROWSER_FILES += \
 		browser_bug462289.js \
 		$(NULL)
 else
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/browser_aboutSyncProgress.js
@@ -0,0 +1,101 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://services-sync/main.js");
+
+let gTests = [ {
+  desc: "Makes sure the progress bar appears if firstSync pref is set",
+  setup: function () {
+    Services.prefs.setCharPref("services.sync.firstSync", "newAccount");
+  },
+  run: function () {
+    let doc = gBrowser.selectedTab.linkedBrowser.contentDocument;
+    let progressBar = doc.getElementById("uploadProgressBar");
+
+    isnot(progressBar.style.display, "none", "progress bar should be visible");
+    executeSoon(runNextTest);
+  }
+},
+
+{
+  desc: "Makes sure the progress bar is hidden if firstSync pref is not set",
+  setup: function () {
+    Services.prefs.clearUserPref("services.sync.firstSync");
+    is(Services.prefs.getPrefType("services.sync.firstSync"),
+       Ci.nsIPrefBranch.PREF_INVALID, "pref DNE" );
+  },
+  run: function () {
+    let doc = gBrowser.selectedTab.linkedBrowser.contentDocument;
+    let progressBar = doc.getElementById("uploadProgressBar");
+
+    is(progressBar.style.display, "none",
+       "progress bar should not be visible");
+    executeSoon(runNextTest);
+  }
+},
+{
+  desc: "Makes sure the observer updates are reflected in the progress bar",
+  setup: function () {
+  },
+  run: function () {
+     let doc = gBrowser.selectedTab.linkedBrowser.contentDocument;
+     let progressBar = doc.getElementById("uploadProgressBar");
+
+     Services.obs.notifyObservers(null, "weave:engine:sync:finish", null);
+     Services.obs.notifyObservers(null, "weave:engine:sync:error", null);
+
+     let received = progressBar.getAttribute("value");
+
+     is(received, 2, "progress bar received correct notifications");
+     executeSoon(runNextTest);
+  }
+},
+{
+  desc: "Close button should close tab",
+  setup: function (){
+  },
+  run: function () {
+    function onTabClosed() {
+      ok(true, "received TabClose notification");
+      gBrowser.tabContainer.removeEventListener("TabClose", onTabClosed, false);
+      executeSoon(runNextTest);
+    }
+    let doc = gBrowser.selectedTab.linkedBrowser.contentDocument;
+    let button = doc.getElementById('closeButton');
+    let window = doc.defaultView;
+    gBrowser.tabContainer.addEventListener("TabClose", onTabClosed, false);
+    EventUtils.sendMouseEvent({type: "click"}, button, window);
+  }
+},
+];
+
+function test () {
+  waitForExplicitFinish();
+  executeSoon(runNextTest);
+}
+
+function runNextTest()
+{
+  while (gBrowser.tabs.length > 1) {
+    gBrowser.removeCurrentTab();
+  }
+
+  if (gTests.length) {
+    let test = gTests.shift();
+    info(test.desc);
+    test.setup();
+    let tab = gBrowser.selectedTab = gBrowser.addTab("about:sync-progress");
+    tab.linkedBrowser.addEventListener("load", function (event) {
+      tab.linkedBrowser.removeEventListener("load", arguments.callee, true);
+      // Some part of the page is populated on load, so enqueue on it.
+      executeSoon(test.run);
+    }, true);
+  }
+  else {
+    finish();
+  }
+}
+
--- a/browser/base/jar.mn
+++ b/browser/base/jar.mn
@@ -66,16 +66,18 @@ browser.jar:
         content/browser/syncSetup.js                  (content/syncSetup.js)
 *       content/browser/syncGenericChange.xul         (content/syncGenericChange.xul)
         content/browser/syncGenericChange.js          (content/syncGenericChange.js)
 *       content/browser/syncKey.xhtml                 (content/syncKey.xhtml)
 *       content/browser/syncNotification.xml          (content/syncNotification.xml)
 *       content/browser/syncQuota.xul                 (content/syncQuota.xul)
         content/browser/syncQuota.js                  (content/syncQuota.js)
         content/browser/syncUtils.js                  (content/syncUtils.js)
+        content/browser/syncProgress.js               (content/syncProgress.js)
+*       content/browser/syncProgress.xhtml            (content/syncProgress.xhtml)
 #endif
 # XXX: We should exclude this one as well (bug 71895)
 *       content/browser/hiddenWindow.xul              (content/hiddenWindow.xul)
 #ifdef XP_MACOSX
 *       content/browser/macBrowserOverlay.xul         (content/macBrowserOverlay.xul)
 *       content/browser/downloadManagerOverlay.xul    (content/downloadManagerOverlay.xul)
 *       content/browser/jsConsoleOverlay.xul          (content/jsConsoleOverlay.xul)
 *       content/browser/softwareUpdateOverlay.xul  (content/softwareUpdateOverlay.xul)
--- a/browser/components/about/AboutRedirector.cpp
+++ b/browser/components/about/AboutRedirector.cpp
@@ -92,16 +92,18 @@ static RedirEntry kRedirMap[] = {
     nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
     nsIAboutModule::ALLOW_SCRIPT },
   { "robots", "chrome://browser/content/aboutRobots.xhtml",
     nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
     nsIAboutModule::ALLOW_SCRIPT },
   { "sessionrestore", "chrome://browser/content/aboutSessionRestore.xhtml",
     nsIAboutModule::ALLOW_SCRIPT },
 #ifdef MOZ_SERVICES_SYNC
+  { "sync-progress", "chrome://browser/content/syncProgress.xhtml",
+    nsIAboutModule::ALLOW_SCRIPT },
   { "sync-tabs", "chrome://browser/content/aboutSyncTabs.xul",
     nsIAboutModule::ALLOW_SCRIPT },
 #endif
   { "home", "chrome://browser/content/aboutHome.xhtml",
     nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
     nsIAboutModule::ALLOW_SCRIPT },
   { "permissions", "chrome://browser/content/preferences/aboutPermissions.xul",
     nsIAboutModule::ALLOW_SCRIPT },
--- a/browser/components/build/nsModule.cpp
+++ b/browser/components/build/nsModule.cpp
@@ -151,16 +151,17 @@ static const mozilla::Module::ContractID
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "certerror", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "feeds", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "privatebrowsing", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "rights", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "robots", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "sessionrestore", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
 #ifdef MOZ_SERVICES_SYNC
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "sync-tabs", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
+    { NS_ABOUT_MODULE_CONTRACTID_PREFIX "sync-progress", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
 #endif
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "home", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "permissions", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_PROFILEMIGRATOR_CONTRACTID, &kNS_FIREFOX_PROFILEMIGRATOR_CID },
 #if defined(XP_WIN) && !defined(__MINGW32__)
     { NS_BROWSERPROFILEMIGRATOR_CONTRACTID_PREFIX "ie", &kNS_WINIEPROFILEMIGRATOR_CID },
 #elif defined(XP_MACOSX)
     { NS_SHELLSERVICE_CONTRACTID, &kNS_SHELLSERVICE_CID },
new file mode 100644
--- /dev/null
+++ b/browser/locales/en-US/chrome/browser/syncProgress.dtd
@@ -0,0 +1,11 @@
+<!ENTITY % brandDTD
+    SYSTEM "chrome://branding/locale/brand.dtd">
+    %brandDTD;
+
+<!-- These strings are used in the sync progress upload page -->
+<!ENTITY syncProgress.pageTitle    "Your First Sync">
+<!ENTITY syncProgress.textBlurb    "Your data is now being encrypted and uploaded in the background. You can close this tab and continue using &brandShortName;.">
+<!ENTITY syncProgress.closeButton  "Close">
+<!ENTITY syncProgress.logoAltText  "&brandShortName; logo">
+<!ENTITY syncProgress.diffText     "&brandShortName; will now automatically sync in the background.  You can close this tab and continue using &brandShortName;.">
+
--- a/browser/locales/jar.mn
+++ b/browser/locales/jar.mn
@@ -4,16 +4,17 @@
 % locale browser @AB_CD@ %locale/browser/
     locale/browser/aboutCertError.dtd              (%chrome/browser/aboutCertError.dtd)
     locale/browser/aboutDialog.dtd                 (%chrome/browser/aboutDialog.dtd)
     locale/browser/aboutPrivateBrowsing.dtd        (%chrome/browser/aboutPrivateBrowsing.dtd)
     locale/browser/aboutRobots.dtd                 (%chrome/browser/aboutRobots.dtd)
     locale/browser/aboutHome.dtd                   (%chrome/browser/aboutHome.dtd)
     locale/browser/aboutSessionRestore.dtd         (%chrome/browser/aboutSessionRestore.dtd)
 #ifdef MOZ_SERVICES_SYNC
+    locale/browser/syncProgress.dtd                (%chrome/browser/syncProgress.dtd)
     locale/browser/aboutSyncTabs.dtd               (%chrome/browser/aboutSyncTabs.dtd)
 #endif
 *   locale/browser/browser.dtd                     (%chrome/browser/browser.dtd)
     locale/browser/baseMenuOverlay.dtd             (%chrome/browser/baseMenuOverlay.dtd)
     locale/browser/browser.properties              (%chrome/browser/browser.properties)
     locale/browser/devtools/gcli.properties         (%chrome/browser/devtools/gcli.properties)
     locale/browser/devtools/gclicommands.properties (%chrome/browser/devtools/gclicommands.properties)
     locale/browser/styleinspector.properties       (%chrome/browser/styleinspector.properties)
--- a/browser/themes/gnomestripe/browser/jar.mn
+++ b/browser/themes/gnomestripe/browser/jar.mn
@@ -88,15 +88,17 @@ browser.jar:
   skin/classic/browser/devtools/csshtmltree.css       (devtools/csshtmltree.css)
   skin/classic/browser/devtools/gcli.css              (devtools/gcli.css)
 #ifdef MOZ_SERVICES_SYNC
   skin/classic/browser/sync-16-throbber.png
   skin/classic/browser/sync-16.png
   skin/classic/browser/sync-24-throbber.png
   skin/classic/browser/sync-32.png
   skin/classic/browser/sync-bg.png
+  skin/classic/browser/sync-128.png
   skin/classic/browser/sync-desktopIcon.png
   skin/classic/browser/sync-mobileIcon.png
   skin/classic/browser/sync-notification-24.png
   skin/classic/browser/syncSetup.css
   skin/classic/browser/syncCommon.css
   skin/classic/browser/syncQuota.css
+  skin/classic/browser/syncProgress.css
 #endif
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1ea34818ceb9cf9b4ea607fc62884c575e71b893
GIT binary patch
literal 20229
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%0D*u=8R#wpg@}XS
z>G9Y-FI0^F=Z4Rh=pDt~FN6@FmVGC`3?A$MnfLu&(f4<%&w9{%nZTl&aGOd0H4Aqe
zIBNaKMgcT*nU*q;*7k4upb6jMs#a2z$;n9*gfz+thlId`y9ivxp%g^)xs(3C6~XVk
z&jRQ^1<;3h%mji9egC0^tNI=@!Sh2)gUQKBLx(54rs336`ZwC97UF;-S`ZSZEJ^Fa
z;mzUB-EgaBv)M$oT1B(j^x$TCdfGT`HvvY_eWX!nA^0JL%=&&0aYktN4<5)L9G>7*
zn!rlvJ{O?_<xqW!qYj}w{xwHNMhpqF-EQ~HJfZ`VB#9qvMc269ZlhYQ`a|~%Q4vHR
zni4>?(3xn<aAjMTWqzs`g)`(TI-QQMC776)Fhx-qAw&omf$kWzvQMb|aTJC91fl;V
z1$aDVIFwNPO}RdV0-2ea8AIQba1w1w4L6Yx!%9gt3aJT8g|mu}xB`S#s$}vjm5QI!
zPrfT${T^=Tpf4RRX`<(lWtf<lFmW6kV+>ZTSP=?MJ%N+W4<YC$+EiyA$1)tsLYO`U
z^*)^hNK`l>dP?$;+YCp=Q;h-v=_E-!mqO9N;V23Fe**xr)XG-fW#!%g0000<MNUMn
GLSTYJ`!e_d
new file mode 100644
--- /dev/null
+++ b/browser/themes/gnomestripe/browser/syncProgress.css
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Firefox Sync.
+ *
+ * The Initial Developer of the Original Code is
+ * the Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2011
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *   Allison Naaktgeboren <ally@mozilla.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+@import url(chrome://global/skin/inContentUI.css);
+
+:root {
+  height: 100%;
+  width: 100%;
+  padding: 0;
+}
+
+body {
+  margin: 0;
+  padding: 0 2em;
+}
+
+#floatingBox {
+  margin: 4em auto;
+  max-width: 40em;
+  min-width: 23em;
+  padding: 1em 1.5em;
+  position: relative;
+  text-align: center;
+}
+
+#successLogo {
+  margin: 1em 2em;
+}
+
+#loadingText {
+  margin: 2em 6em;
+}
+
+#progressBar {
+  margin: 2em 10em;
+}
+
+#uploadProgressBar{
+  width: 100%;
+}
+
+#bottomRow {
+  margin-top: 2em;
+  padding: 0;
+  text-align: end;
+}
--- a/browser/themes/pinstripe/browser/jar.mn
+++ b/browser/themes/pinstripe/browser/jar.mn
@@ -126,22 +126,24 @@ browser.jar:
   skin/classic/browser/devtools/search.png                  (devtools/search.png)
   skin/classic/browser/devtools/csshtmltree.css             (devtools/csshtmltree.css)
   skin/classic/browser/devtools/gcli.css                    (devtools/gcli.css)
 #ifdef MOZ_SERVICES_SYNC
   skin/classic/browser/sync-throbber.png
   skin/classic/browser/sync-16.png
   skin/classic/browser/sync-32.png
   skin/classic/browser/sync-bg.png
+  skin/classic/browser/sync-128.png
   skin/classic/browser/sync-desktopIcon.png
   skin/classic/browser/sync-mobileIcon.png
   skin/classic/browser/sync-notification-24.png
   skin/classic/browser/syncSetup.css
   skin/classic/browser/syncCommon.css
   skin/classic/browser/syncQuota.css
+  skin/classic/browser/syncProgress.css
 #endif
   skin/classic/browser/lion/keyhole-circle.png              (keyhole-circle-lion.png)
   skin/classic/browser/lion/Toolbar.png                     (Toolbar-lion.png)
   skin/classic/browser/lion/toolbarbutton-dropmarker.png    (toolbarbutton-dropmarker-lion.png)
   skin/classic/browser/lion/tabbrowser/alltabs-box-bkgnd-icon.png      (tabbrowser/alltabs-box-bkgnd-icon-lion.png)
   skin/classic/browser/lion/tabview/tabview.png                        (tabview/tabview-lion.png)
   skin/classic/browser/lion/places/toolbar.png              (places/toolbar-lion.png)
 
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1ea34818ceb9cf9b4ea607fc62884c575e71b893
GIT binary patch
literal 20229
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%0D*u=8R#wpg@}XS
z>G9Y-FI0^F=Z4Rh=pDt~FN6@FmVGC`3?A$MnfLu&(f4<%&w9{%nZTl&aGOd0H4Aqe
zIBNaKMgcT*nU*q;*7k4upb6jMs#a2z$;n9*gfz+thlId`y9ivxp%g^)xs(3C6~XVk
z&jRQ^1<;3h%mji9egC0^tNI=@!Sh2)gUQKBLx(54rs336`ZwC97UF;-S`ZSZEJ^Fa
z;mzUB-EgaBv)M$oT1B(j^x$TCdfGT`HvvY_eWX!nA^0JL%=&&0aYktN4<5)L9G>7*
zn!rlvJ{O?_<xqW!qYj}w{xwHNMhpqF-EQ~HJfZ`VB#9qvMc269ZlhYQ`a|~%Q4vHR
zni4>?(3xn<aAjMTWqzs`g)`(TI-QQMC776)Fhx-qAw&omf$kWzvQMb|aTJC91fl;V
z1$aDVIFwNPO}RdV0-2ea8AIQba1w1w4L6Yx!%9gt3aJT8g|mu}xB`S#s$}vjm5QI!
zPrfT${T^=Tpf4RRX`<(lWtf<lFmW6kV+>ZTSP=?MJ%N+W4<YC$+EiyA$1)tsLYO`U
z^*)^hNK`l>dP?$;+YCp=Q;h-v=_E-!mqO9N;V23Fe**xr)XG-fW#!%g0000<MNUMn
GLSTYJ`!e_d
new file mode 100644
--- /dev/null
+++ b/browser/themes/pinstripe/browser/syncProgress.css
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Firefox Sync.
+ *
+ * The Initial Developer of the Original Code is
+ * the Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2011
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *   Allison Naaktgeboren <ally@mozilla.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+@import url(chrome://global/skin/inContentUI.css);
+
+:root {
+  height: 100%;
+  width: 100%;
+  padding: 0;
+}
+
+body {
+  margin: 0;
+  padding: 0 2em;
+}
+
+#floatingBox {
+  margin: 4em auto;
+  max-width: 40em;
+  min-width: 23em;
+  padding: 1em 1.5em;
+  position: relative;
+  text-align: center;
+}
+
+#successLogo {
+  margin: 1em 2em;
+}
+
+#loadingText {
+  margin: 2em 6em;
+}
+
+#progressBar {
+  margin: 2em 10em;
+}
+
+#uploadProgressBar{
+  width: 100%;
+}
+
+#bottomRow {
+  margin-top: 2em;
+  padding: 0;
+  text-align: end;
+}
--- a/browser/themes/winstripe/browser/jar.mn
+++ b/browser/themes/winstripe/browser/jar.mn
@@ -109,23 +109,25 @@ browser.jar:
         skin/classic/browser/devtools/arrows.png                    (devtools/arrows.png)
         skin/classic/browser/devtools/search.png                    (devtools/search.png)
         skin/classic/browser/devtools/csshtmltree.css               (devtools/csshtmltree.css)
         skin/classic/browser/devtools/gcli.css                      (devtools/gcli.css)
 #ifdef MOZ_SERVICES_SYNC
         skin/classic/browser/sync-throbber.png
         skin/classic/browser/sync-16.png
         skin/classic/browser/sync-32.png
+        skin/classic/browser/sync-128.png
         skin/classic/browser/sync-bg.png
         skin/classic/browser/sync-desktopIcon.png
         skin/classic/browser/sync-mobileIcon.png
         skin/classic/browser/sync-notification-24.png
         skin/classic/browser/syncSetup.css
         skin/classic/browser/syncCommon.css
         skin/classic/browser/syncQuota.css
+        skin/classic/browser/syncProgress.css
 #endif
 
 #ifdef XP_WIN
 browser.jar:
 % skin browser classic/1.0 %skin/classic/aero/browser/ os=WINNT osversion>=6
         skin/classic/aero/browser/sanitizeDialog.css                       (sanitizeDialog.css)
 *       skin/classic/aero/browser/aboutPrivateBrowsing.css           (aboutPrivateBrowsing.css)
 *       skin/classic/aero/browser/aboutSessionRestore.css            (aboutSessionRestore.css)
@@ -233,17 +235,19 @@ browser.jar:
         skin/classic/aero/browser/devtools/arrows.png                (devtools/arrows.png)
         skin/classic/aero/browser/devtools/search.png                (devtools/search.png)
         skin/classic/aero/browser/devtools/csshtmltree.css           (devtools/csshtmltree.css)
         skin/classic/aero/browser/devtools/gcli.css                  (devtools/gcli.css)
 #ifdef MOZ_SERVICES_SYNC
         skin/classic/aero/browser/sync-throbber.png
         skin/classic/aero/browser/sync-16.png
         skin/classic/aero/browser/sync-32.png
+        skin/classic/aero/browser/sync-128.png
         skin/classic/aero/browser/sync-bg.png
         skin/classic/aero/browser/sync-desktopIcon.png
         skin/classic/aero/browser/sync-mobileIcon.png
         skin/classic/aero/browser/sync-notification-24.png
         skin/classic/aero/browser/syncSetup.css
         skin/classic/aero/browser/syncCommon.css
         skin/classic/aero/browser/syncQuota.css
+        skin/classic/aero/browser/syncProgress.css
 #endif
 #endif
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1ea34818ceb9cf9b4ea607fc62884c575e71b893
GIT binary patch
literal 20229
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%0D*u=8R#wpg@}XS
z>G9Y-FI0^F=Z4Rh=pDt~FN6@FmVGC`3?A$MnfLu&(f4<%&w9{%nZTl&aGOd0H4Aqe
zIBNaKMgcT*nU*q;*7k4upb6jMs#a2z$;n9*gfz+thlId`y9ivxp%g^)xs(3C6~XVk
z&jRQ^1<;3h%mji9egC0^tNI=@!Sh2)gUQKBLx(54rs336`ZwC97UF;-S`ZSZEJ^Fa
z;mzUB-EgaBv)M$oT1B(j^x$TCdfGT`HvvY_eWX!nA^0JL%=&&0aYktN4<5)L9G>7*
zn!rlvJ{O?_<xqW!qYj}w{xwHNMhpqF-EQ~HJfZ`VB#9qvMc269ZlhYQ`a|~%Q4vHR
zni4>?(3xn<aAjMTWqzs`g)`(TI-QQMC776)Fhx-qAw&omf$kWzvQMb|aTJC91fl;V
z1$aDVIFwNPO}RdV0-2ea8AIQba1w1w4L6Yx!%9gt3aJT8g|mu}xB`S#s$}vjm5QI!
zPrfT${T^=Tpf4RRX`<(lWtf<lFmW6kV+>ZTSP=?MJ%N+W4<YC$+EiyA$1)tsLYO`U
z^*)^hNK`l>dP?$;+YCp=Q;h-v=_E-!mqO9N;V23Fe**xr)XG-fW#!%g0000<MNUMn
GLSTYJ`!e_d
new file mode 100644
--- /dev/null
+++ b/browser/themes/winstripe/browser/syncProgress.css
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Firefox Sync.
+ *
+ * The Initial Developer of the Original Code is
+ * the Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2011
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *   Allison Naaktgeboren <ally@mozilla.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+@import url(chrome://global/skin/inContentUI.css);
+
+:root {
+  height: 100%;
+  width: 100%;
+  padding: 0;
+}
+
+body {
+  margin: 0;
+  padding: 0 2em;
+}
+
+#floatingBox {
+  margin: 4em auto;
+  max-width: 40em;
+  min-width: 23em;
+  padding: 1em 1.5em;
+  position: relative;
+  text-align: center;
+}
+
+#successLogo {
+  margin: 1em 2em;
+}
+
+#loadingText {
+  margin: 2em 6em;
+}
+
+#progressBar {
+  margin: 2em 10em;
+}
+
+#uploadProgressBar{
+  width: 100%;
+}
+
+#bottomRow {
+  margin-top: 2em;
+  padding: 0;
+  text-align: end;
+}
--- a/dom/indexedDB/AsyncConnectionHelper.cpp
+++ b/dom/indexedDB/AsyncConnectionHelper.cpp
@@ -555,18 +555,18 @@ NS_IMPL_QUERY_INTERFACE1(TransactionPool
 
 NS_IMETHODIMP
 TransactionPoolEventTarget::Dispatch(nsIRunnable* aRunnable,
                                      PRUint32 aFlags)
 {
   NS_ASSERTION(aRunnable, "Null pointer!");
   NS_ASSERTION(aFlags == NS_DISPATCH_NORMAL, "Unsupported!");
 
-  TransactionThreadPool* pool = TransactionThreadPool::GetOrCreate();
-  NS_ENSURE_TRUE(pool, NS_ERROR_FAILURE);
+  TransactionThreadPool* pool = TransactionThreadPool::Get();
+  NS_ASSERTION(pool, "This should never be null!");
 
   return pool->Dispatch(mTransaction, aRunnable, false, nsnull);
 }
 
 NS_IMETHODIMP
 TransactionPoolEventTarget::IsOnCurrentThread(bool* aResult)
 {
   *aResult = false;
--- a/dom/indexedDB/AsyncConnectionHelper.h
+++ b/dom/indexedDB/AsyncConnectionHelper.h
@@ -120,16 +120,21 @@ public:
   void SetError(nsresult aErrorCode)
   {
     NS_ASSERTION(NS_FAILED(aErrorCode), "Not a failure code!");
     mResultCode = aErrorCode;
   }
 
   static IDBTransaction* GetCurrentTransaction();
 
+  bool HasTransaction()
+  {
+    return mTransaction;
+  }
+
   nsISupports* GetSource()
   {
     return mRequest ? mRequest->Source() : nsnull;
   }
 
   nsresult GetResultCode()
   {
     return mResultCode;
--- a/dom/indexedDB/DatabaseInfo.cpp
+++ b/dom/indexedDB/DatabaseInfo.cpp
@@ -80,17 +80,18 @@ EnumerateObjectStoreNames(const nsAStrin
 }
 
 }
 
 #ifdef NS_BUILD_REFCNT_LOGGING
 DatabaseInfo::DatabaseInfo()
 : id(0),
   nextObjectStoreId(1),
-  nextIndexId(1)
+  nextIndexId(1),
+  runningVersionChange(false)
 {
   MOZ_COUNT_CTOR(DatabaseInfo);
 }
 
 DatabaseInfo::~DatabaseInfo()
 {
   MOZ_COUNT_DTOR(DatabaseInfo);
 }
--- a/dom/indexedDB/DatabaseInfo.h
+++ b/dom/indexedDB/DatabaseInfo.h
@@ -49,17 +49,18 @@ BEGIN_INDEXEDDB_NAMESPACE
 
 struct DatabaseInfo
 {
 #ifdef NS_BUILD_REFCNT_LOGGING
   DatabaseInfo();
   ~DatabaseInfo();
 #else
   DatabaseInfo()
-  : id(0), nextObjectStoreId(1), nextIndexId(1) { }
+  : id(0), nextObjectStoreId(1), nextIndexId(1), runningVersionChange(false)
+  { }
 #endif
 
   static bool Get(PRUint32 aId,
                   DatabaseInfo** aInfo);
 
   static bool Put(DatabaseInfo* aInfo);
 
   static void Remove(PRUint32 aId);
@@ -68,16 +69,17 @@ struct DatabaseInfo
   bool ContainsStoreName(const nsAString& aName);
 
   nsString name;
   PRUint64 version;
   PRUint32 id;
   nsString filePath;
   PRInt64 nextObjectStoreId;
   PRInt64 nextIndexId;
+  bool runningVersionChange;
 
   nsAutoRefCnt referenceCount;
 };
 
 struct IndexInfo
 {
 #ifdef NS_BUILD_REFCNT_LOGGING
   IndexInfo();
--- a/dom/indexedDB/IDBDatabase.cpp
+++ b/dom/indexedDB/IDBDatabase.cpp
@@ -424,16 +424,44 @@ IDBDatabase::CloseInternal()
 bool
 IDBDatabase::IsClosed()
 {
   NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
   return mClosed;
 }
 
 void
+IDBDatabase::EnterSetVersionTransaction()
+{
+  DatabaseInfo* dbInfo;
+  if (!DatabaseInfo::Get(mDatabaseId, &dbInfo)) {
+    NS_ERROR("This should never fail!");
+  }
+
+  NS_ASSERTION(!dbInfo->runningVersionChange, "How did that happen?");
+  dbInfo->runningVersionChange = true;
+}
+
+void
+IDBDatabase::ExitSetVersionTransaction()
+{
+  DatabaseInfo* dbInfo;
+  if (!DatabaseInfo::Get(mDatabaseId, &dbInfo)) {
+    NS_ERROR("This should never fail!");
+  }
+
+  NS_ASSERTION(dbInfo->runningVersionChange, "How did that happen?");
+  dbInfo->runningVersionChange = false;
+
+  IndexedDatabaseManager* manager = IndexedDatabaseManager::Get();
+  NS_ASSERTION(manager, "We should always have a manager here");
+  manager->UnblockSetVersionRunnable(this);
+}
+
+void
 IDBDatabase::OnUnlink()
 {
   NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
   NS_ASSERTION(!mOwner, "Should have been cleared already!");
 
   // We've been unlinked, at the very least we should be able to prevent further
   // transactions from starting and unblock any other SetVersion callers.
   Close();
@@ -705,16 +733,20 @@ IDBDatabase::Transaction(nsIVariant* aSt
   nsresult rv = aStoreNames->GetDataType(&type);
   NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
 
   DatabaseInfo* info;
   if (!DatabaseInfo::Get(mDatabaseId, &info)) {
     NS_ERROR("This should never fail!");
   }
 
+  if (info->runningVersionChange) {
+    return NS_ERROR_DOM_INDEXEDDB_NOT_ALLOWED_ERR;
+  }
+
   nsTArray<nsString> storesToOpen;
 
   switch (type) {
     case nsIDataType::VTYPE_VOID:
     case nsIDataType::VTYPE_EMPTY:
     case nsIDataType::VTYPE_EMPTY_ARRAY: {
       // Empty, request all object stores
       if (!info->GetObjectStoreNames(storesToOpen)) {
--- a/dom/indexedDB/IDBDatabase.h
+++ b/dom/indexedDB/IDBDatabase.h
@@ -130,16 +130,19 @@ public:
   // transactions for this database will be allowed to run.
   bool IsInvalidated();
 
   void CloseInternal();
 
   // Whether or not the database has had Close called on it.
   bool IsClosed();
 
+  void EnterSetVersionTransaction();
+  void ExitSetVersionTransaction();
+
 private:
   IDBDatabase();
   ~IDBDatabase();
 
   void OnUnlink();
 
   PRUint32 mDatabaseId;
   nsString mName;
--- a/dom/indexedDB/IndexedDatabaseManager.cpp
+++ b/dom/indexedDB/IndexedDatabaseManager.cpp
@@ -688,47 +688,64 @@ IndexedDatabaseManager::OnDatabaseClosed
       // for other databases the mDatabases array may be empty.
       if (!runnable->mDatabases.IsEmpty() &&
           !runnable->mDatabases.RemoveElement(aDatabase)) {
         NS_ERROR("Didn't have this database in our list!");
       }
 
       // Now run the helper if there are no more live databases.
       if (runnable->mHelper && runnable->mDatabases.IsEmpty()) {
-        // Don't hold the callback alive longer than necessary.
-        nsRefPtr<AsyncConnectionHelper> helper;
-        helper.swap(runnable->mHelper);
+        // At this point, all databases are closed, so no new transactions can
+        // be started.  There may, however, still be outstanding transactions
+        // that have not completed.  We need to wait for those before we
+        // dispatch the helper.
 
-        if (NS_FAILED(helper->DispatchToTransactionPool())) {
-          NS_WARNING("Failed to dispatch to thread pool!");
-        }
+        TransactionThreadPool* pool = TransactionThreadPool::GetOrCreate();
 
-        // Now wait for the transaction to complete. Completing the transaction
-        // will be our cue to remove the SetVersionRunnable from our list and
-        // therefore allow other SetVersion requests to begin.
-        TransactionThreadPool* pool = TransactionThreadPool::Get();
-        NS_ASSERTION(pool, "This should never be null!");
+        nsRefPtr<WaitForTransactionsToFinishRunnable> waitRunnable =
+          new WaitForTransactionsToFinishRunnable(runnable);
 
         // All other databases should be closed, so we only need to wait on this
         // one.
         nsAutoTArray<nsRefPtr<IDBDatabase>, 1> array;
         if (!array.AppendElement(aDatabase)) {
           NS_ERROR("This should never fail!");
         }
 
-        // Use the SetVersionRunnable as the callback.
-        if (!pool->WaitForAllDatabasesToComplete(array, runnable)) {
+        // Use the WaitForTransactionsToFinishRunnable as the callback.
+        if (!pool->WaitForAllDatabasesToComplete(array, waitRunnable)) {
           NS_WARNING("Failed to wait for transaction to complete!");
         }
       }
       break;
     }
   }
 }
 
+void
+IndexedDatabaseManager::UnblockSetVersionRunnable(IDBDatabase* aDatabase)
+{
+  NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
+  NS_ASSERTION(aDatabase, "Null pointer!");
+
+  // Check through the list of SetVersionRunnables to find the one we're seeking.
+  for (PRUint32 index = 0; index < mSetVersionRunnables.Length(); index++) {
+    nsRefPtr<SetVersionRunnable>& runnable = mSetVersionRunnables[index];
+
+    if (runnable->mRequestingDatabase->Id() == aDatabase->Id()) {
+      NS_ASSERTION(!runnable->mHelper,
+                 "Why are we unblocking a runnable if the helper didn't run?");
+      NS_DispatchToCurrentThread(runnable);
+      return;
+    }
+  }
+
+  NS_NOTREACHED("How did we get here!");
+}
+
 // static
 bool
 IndexedDatabaseManager::SetCurrentDatabase(IDBDatabase* aDatabase)
 {
   NS_ASSERTION(gCurrentDatabaseIndex != BAD_TLS_INDEX,
                "This should have been set already!");
 
 #ifdef DEBUG
@@ -1278,8 +1295,44 @@ IndexedDatabaseManager::SetVersionRunnab
   NS_ASSERTION(mgr, "This should never be null!");
 
   // Let the IndexedDatabaseManager know that the SetVersion transaction has
   // completed.
   mgr->OnSetVersionRunnableComplete(this);
 
   return NS_OK;
 }
+
+NS_IMPL_THREADSAFE_ISUPPORTS1(IndexedDatabaseManager::WaitForTransactionsToFinishRunnable,
+                              nsIRunnable)
+
+NS_IMETHODIMP
+IndexedDatabaseManager::WaitForTransactionsToFinishRunnable::Run()
+{
+  NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
+
+  // Don't hold the callback alive longer than necessary.
+  nsRefPtr<AsyncConnectionHelper> helper;
+  helper.swap(mRunnable->mHelper);
+
+  nsRefPtr<SetVersionRunnable> runnable;
+  runnable.swap(mRunnable);
+
+  // If the helper has a transaction, dispatch it to the transaction
+  // threadpool.
+  if (helper->HasTransaction()) {
+    if (NS_FAILED(helper->DispatchToTransactionPool())) {
+      NS_WARNING("Failed to dispatch to thread pool!");
+    }
+  }
+  // Otherwise, dispatch it to the IO thread.
+  else {
+    IndexedDatabaseManager* manager = IndexedDatabaseManager::Get();
+    NS_ASSERTION(manager, "We should definitely have a manager here");
+
+    helper->Dispatch(manager->IOThread());
+  }
+
+  // The helper is responsible for calling
+  // IndexedDatabaseManager::UnblockSetVersionRunnable.
+
+  return NS_OK;
+}
--- a/dom/indexedDB/IndexedDatabaseManager.h
+++ b/dom/indexedDB/IndexedDatabaseManager.h
@@ -199,16 +199,18 @@ private:
     nsCOMPtr<nsIIndexedDatabaseUsageCallback> mCallback;
     PRUint64 mUsage;
     PRInt32 mCanceled;
   };
 
   // Called when AsyncUsageRunnable has finished its Run() method.
   inline void OnUsageCheckComplete(AsyncUsageRunnable* aRunnable);
 
+  void UnblockSetVersionRunnable(IDBDatabase* aDatabase);
+
   // Responsible for waiting until all databases have been closed before running
   // the version change transaction. Created when
   // IndexedDatabaseManager::SetDatabaseVersion is called. Runs only once on the
   // main thread when the version change transaction has completed.
   class SetVersionRunnable : public nsIRunnable
   {
   public:
     NS_DECL_ISUPPORTS
@@ -222,16 +224,36 @@ private:
     nsTArray<nsRefPtr<IDBDatabase> > mDatabases;
     nsRefPtr<AsyncConnectionHelper> mHelper;
     nsTArray<nsCOMPtr<nsIRunnable> > mDelayedRunnables;
   };
 
   // Called when SetVersionRunnable has finished its Run() method.
   inline void OnSetVersionRunnableComplete(SetVersionRunnable* aRunnable);
 
+
+  // A callback runnable used by the TransactionPool when it's safe to proceed
+  // with a SetVersion/DeleteDatabase/etc.
+  class WaitForTransactionsToFinishRunnable : public nsIRunnable
+  {
+  public:
+    WaitForTransactionsToFinishRunnable(SetVersionRunnable* aRunnable)
+    : mRunnable(aRunnable)
+    {
+      NS_ASSERTION(mRunnable, "Why don't we have a runnable?");
+      NS_ASSERTION(mRunnable->mDatabases.IsEmpty(), "We're here too early!");
+    }
+
+    NS_DECL_ISUPPORTS
+    NS_DECL_NSIRUNNABLE
+
+  private:
+    nsRefPtr<SetVersionRunnable> mRunnable;
+  };
+
   // Maintains a list of live databases per origin.
   nsClassHashtable<nsCStringHashKey, nsTArray<IDBDatabase*> > mLiveDatabases;
 
   // Maintains a list of origins that are currently being cleared.
   nsAutoTArray<nsRefPtr<OriginClearRunnable>, 1> mOriginClearRunnables;
 
   // Maintains a list of origins that we're currently enumerating to gather
   // usage statistics.
--- a/dom/indexedDB/OpenDatabaseHelper.cpp
+++ b/dom/indexedDB/OpenDatabaseHelper.cpp
@@ -490,20 +490,23 @@ public:
     mRequestedVersion(aRequestedVersion),
     mCurrentVersion(aCurrentVersion)
   {
     mTransaction->SetTransactionListener(this);
   }
 
   NS_DECL_ISUPPORTS_INHERITED
 
-  nsresult DoDatabaseWork(mozIStorageConnection* aConnection);
   nsresult GetSuccessResult(JSContext* aCx,
                             jsval* aVal);
 
+protected:
+  nsresult DoDatabaseWork(mozIStorageConnection* aConnection);
+  nsresult Init();
+
   // SetVersionHelper never fires an error event at the request.  It hands that
   // responsibility back to the OpenDatabaseHelper
   void OnError() { }
 
   // Need an upgradeneeded event here.
   already_AddRefed<nsDOMEvent> CreateSuccessEvent();
 
   nsresult NotifyTransactionComplete(IDBTransaction* aTransaction);
@@ -549,16 +552,18 @@ OpenDatabaseHelper::DoDatabaseWork()
     bool correctThread;
     NS_ASSERTION(NS_SUCCEEDED(IndexedDatabaseManager::Get()->IOThread()->
                               IsOnCurrentThread(&correctThread)) &&
                  correctThread,
                  "Running on the wrong thread!");
   }
 #endif
 
+  mState = eFiringEvents; // In case we fail somewhere along the line.
+
   if (IndexedDatabaseManager::IsShuttingDown()) {
     return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR;
   }
 
   nsCOMPtr<nsIFile> dbFile;
   nsresult rv = GetDatabaseFile(mASCIIOrigin, mName, getter_AddRefs(dbFile));
   NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
 
@@ -641,19 +646,20 @@ OpenDatabaseHelper::DoDatabaseWork()
     mLastObjectStoreId = NS_MAX(objectStoreInfo->id, mLastObjectStoreId);
   }
 
   // See if we need to do a VERSION_CHANGE transaction
   if (mCurrentVersion > mRequestedVersion) {
     return NS_ERROR_DOM_INDEXEDDB_VERSION_ERR;
   }
 
-  mState = mCurrentVersion != mRequestedVersion ?
-           eSetVersionPending :
-           eFiringEvents;
+  if (mCurrentVersion != mRequestedVersion) {
+    mState = eSetVersionPending;
+  }
+
   return NS_OK;
 }
 
 nsresult
 OpenDatabaseHelper::StartSetVersion()
 {
   NS_ASSERTION(mState == eSetVersionPending, "Why are we here?");
 
@@ -679,16 +685,17 @@ OpenDatabaseHelper::StartSetVersion()
 
   rv = mgr->SetDatabaseVersion(mDatabase, mOpenDBRequest, mCurrentVersion,
                                mRequestedVersion, helper);
   NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
 
   // The SetVersionHelper is responsible for dispatching us back to the
   // main thread again and changing the state to eSetVersionCompleted.
   mState = eSetVersionPending;
+
   return NS_OK;
 }
 
 NS_IMETHODIMP
 OpenDatabaseHelper::Run()
 {
   NS_ASSERTION(mState != eCreated, "Dispatch was not called?!?");
 
@@ -706,16 +713,22 @@ OpenDatabaseHelper::Run()
     }
 
     // We've done whatever work we need to do on the DB thread, and any
     // SetVersion stuff is done by now.
     NS_ASSERTION(mState == eFiringEvents ||
                  mState == eSetVersionCompleted, "Why are we here?");
 
     if (mState == eSetVersionCompleted) {
+      // Allow transaction creation/other version change transactions to proceed
+      // before we fire events.  Other version changes will be postd to the end
+      // of the event loop, and will be behind whatever the page does in
+      // its error/success event handlers.
+      mDatabase->ExitSetVersionTransaction();
+
       mState = eFiringEvents;
     } else {
       // Notify the request that we're done, but only if we didn't just finish
       // a SetVersionHelper.  In the SetVersionHelper case, that helper tells
       // the request that it is done, and we avoid calling NotifyHandlerCompleted
       // twice.
 
       nsresult rv = mOpenDBRequest->NotifyHelperCompleted(this);
@@ -861,16 +874,25 @@ OpenDatabaseHelper::NotifySetVersionFini
 
   mState = eSetVersionCompleted;
   
   // Dispatch ourself back to the main thread
   return NS_DispatchToCurrentThread(this);
 }
 
 void
+OpenDatabaseHelper::BlockDatabase()
+{
+  NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
+  NS_ASSERTION(mDatabase, "This is going bad fast.");
+
+  mDatabase->EnterSetVersionTransaction();
+}
+
+void
 OpenDatabaseHelper::DispatchSuccessEvent()
 {
   NS_ASSERTION(mDatabase, "Doesn't seem very successful to me.");
 
   nsRefPtr<nsDOMEvent> event =
     CreateGenericEvent(NS_LITERAL_STRING(SUCCESS_EVT_STR));
   if (!event) {
     NS_ERROR("Failed to create event!");
@@ -912,16 +934,25 @@ OpenDatabaseHelper::ReleaseMainThreadObj
   mDatabase = nsnull;
 
   HelperBase::ReleaseMainThreadObjects();
 }
 
 NS_IMPL_ISUPPORTS_INHERITED0(SetVersionHelper, AsyncConnectionHelper);
 
 nsresult
+SetVersionHelper::Init()
+{
+  // Block transaction creation until we are done.
+  mOpenHelper->BlockDatabase();
+
+  return NS_OK;
+}
+
+nsresult
 SetVersionHelper::DoDatabaseWork(mozIStorageConnection* aConnection)
 {
   NS_ASSERTION(aConnection, "Passing a null connection!");
 
   nsCOMPtr<mozIStorageStatement> stmt;
   nsresult rv = aConnection->CreateStatement(NS_LITERAL_CSTRING(
     "UPDATE database "
     "SET version = :version"
--- a/dom/indexedDB/OpenDatabaseHelper.h
+++ b/dom/indexedDB/OpenDatabaseHelper.h
@@ -77,16 +77,17 @@ public:
   }
 
   nsresult GetResultCode()
   {
     return mResultCode;
   }
 
   nsresult NotifySetVersionFinished();
+  void BlockDatabase();
 
 protected:
   // Methods only called on the main thread
   nsresult EnsureSuccessResult();
   nsresult StartSetVersion();
   nsresult GetSuccessResult(JSContext* aCx,
                           jsval* aVal);
   void DispatchSuccessEvent();
--- a/dom/indexedDB/TransactionThreadPool.cpp
+++ b/dom/indexedDB/TransactionThreadPool.cpp
@@ -233,17 +233,16 @@ TransactionThreadPool::FinishTransaction
 
   nsTArray<TransactionInfo>& transactionsInProgress =
     dbTransactionInfo->transactions;
 
   PRUint32 transactionCount = transactionsInProgress.Length();
 
 #ifdef DEBUG
   if (aTransaction->mMode == IDBTransaction::VERSION_CHANGE) {
-    NS_ASSERTION(dbTransactionInfo->locked, "Should be locked!");
     NS_ASSERTION(transactionCount == 1,
                  "More transactions running than should be!");
   }
 #endif
 
   if (transactionCount == 1) {
 #ifdef DEBUG
     {
@@ -339,35 +338,27 @@ TransactionThreadPool::TransactionCanRun
   }
 
   nsTArray<TransactionInfo>& transactionsInProgress =
     dbTransactionInfo->transactions;
 
   PRUint32 transactionCount = transactionsInProgress.Length();
   NS_ASSERTION(transactionCount, "Should never be 0!");
 
-  if (mode == IDBTransaction::VERSION_CHANGE) {
-    dbTransactionInfo->lockPending = true;
-  }
-
   for (PRUint32 index = 0; index < transactionCount; index++) {
     // See if this transaction is in out list of current transactions.
     const TransactionInfo& info = transactionsInProgress[index];
     if (info.transaction == aTransaction) {
       *aCanRun = true;
       *aExistingQueue = info.queue;
       return NS_OK;
     }
   }
 
-  if (dbTransactionInfo->locked || dbTransactionInfo->lockPending) {
-    *aCanRun = false;
-    *aExistingQueue = nsnull;
-    return NS_OK;
-  }
+  NS_ASSERTION(mode != IDBTransaction::VERSION_CHANGE, "How did we get here?");
 
   bool writeOverlap;
   nsresult rv =
     CheckOverlapAndMergeObjectStores(dbTransactionInfo->storesWriting,
                                      objectStoreNames,
                                      mode == nsIIDBTransaction::READ_WRITE,
                                      &writeOverlap);
   NS_ENSURE_SUCCESS(rv, rv);
@@ -443,21 +434,16 @@ TransactionThreadPool::Dispatch(IDBTrans
   nsAutoPtr<DatabaseTransactionInfo> autoDBTransactionInfo;
 
   if (!mTransactionsInProgress.Get(databaseId, &dbTransactionInfo)) {
     // Make a new struct for this transaction.
     autoDBTransactionInfo = new DatabaseTransactionInfo();
     dbTransactionInfo = autoDBTransactionInfo;
   }
 
-  if (aTransaction->mMode == IDBTransaction::VERSION_CHANGE) {
-    NS_ASSERTION(!dbTransactionInfo->locked, "Already locked?!");
-    dbTransactionInfo->locked = true;
-  }
-
   const nsTArray<nsString>& objectStoreNames = aTransaction->mObjectStoreNames;
 
   nsTArray<nsString>& storesInUse =
     aTransaction->mMode == nsIIDBTransaction::READ_WRITE ?
     dbTransactionInfo->storesWriting :
     dbTransactionInfo->storesReading;
 
   if (!storesInUse.AppendElements(objectStoreNames)) {
--- a/dom/indexedDB/TransactionThreadPool.h
+++ b/dom/indexedDB/TransactionThreadPool.h
@@ -118,22 +118,16 @@ protected:
   {
     nsRefPtr<IDBTransaction> transaction;
     nsRefPtr<TransactionQueue> queue;
     nsTArray<nsString> objectStoreNames;
   };
 
   struct DatabaseTransactionInfo
   {
-    DatabaseTransactionInfo()
-    : locked(false), lockPending(false)
-    { }
-
-    bool locked;
-    bool lockPending;
     nsTArray<TransactionInfo> transactions;
     nsTArray<nsString> storesReading;
     nsTArray<nsString> storesWriting;
   };
 
   struct QueuedDispatchInfo
   {
     QueuedDispatchInfo()
--- a/dom/indexedDB/test/Makefile.in
+++ b/dom/indexedDB/test/Makefile.in
@@ -93,16 +93,17 @@ TEST_FILES = \
   test_success_events_after_abort.html \
   test_third_party.html \
   test_transaction_abort.html \
   test_transaction_lifetimes.html \
   test_transaction_lifetimes_nested.html \
   test_setVersion.html \
   test_setVersion_abort.html \
   test_setVersion_events.html \
+  test_setVersion_exclusion.html \
   test_writer_starvation.html \
   third_party_iframe1.html \
   third_party_iframe2.html \
   $(NULL)
 
 ifeq (browser,$(MOZ_BUILD_APP))
 BROWSER_TEST_FILES = \
   browser_forgetThisSite.js \
--- a/dom/indexedDB/test/browser_quotaPrompt.html
+++ b/dom/indexedDB/test/browser_quotaPrompt.html
@@ -64,16 +64,19 @@
         let event = yield;
 
         db = event.target.result;
 
         db.onversionchange = function () { db.close(); };
 
         db.createObjectStore("foo", { autoIncrement: true });
 
+        request.onsuccess = grabEventAndContinueHandler;
+        yield;
+
         setTimeout(testFinishedCallback, 0, "ready");
         yield;
       }
     </script>
 
     <script type="text/javascript;version=1.7" src="browserHelpers.js"></script>
 
   </head>
--- a/dom/indexedDB/test/event_propagation_iframe.html
+++ b/dom/indexedDB/test/event_propagation_iframe.html
@@ -99,17 +99,17 @@
       request.onerror = errorHandler;
       request.onupgradeneeded = grabEventAndContinueHandler;
       let event = yield;
 
       let db = event.target.result;
       db.onerror = errorEventCounter;
       db.addEventListener("error", errorEventCounter, true);
 
-      event.target.transaction.oncomplete = grabEventAndContinueHandler;
+      event.target.onsuccess = grabEventAndContinueHandler;
 
       db.createObjectStore("foo", { autoIncrement: true });
       yield;
 
       let transaction = db.transaction("foo", IDBTransaction.READ_WRITE);
       transaction.addEventListener("error", errorEventCounter, false);
       transaction.addEventListener("error", errorEventCounter, true);
 
--- a/dom/indexedDB/test/leaving_page_iframe.html
+++ b/dom/indexedDB/test/leaving_page_iframe.html
@@ -7,17 +7,17 @@ function startDBWork() {
   mozIndexedDB.open(parent.location, 1).onupgradeneeded = function(e) {
     db = e.target.result;
     var trans = e.target.transaction;
     if (db.objectStoreNames.contains("mystore")) {
       db.deleteObjectStore("mystore");
     }
     var store = db.createObjectStore("mystore");
     store.add({ hello: "world" }, 42);
-    trans.oncomplete = madeMod;
+    e.target.onsuccess = madeMod;
   };
 }
 
 function madeMod() {
   var trans = db.transaction(["mystore"], IDBTransaction.READ_WRITE);
   var store = trans.
               objectStore("mystore");
   trans.oncomplete = function() {
--- a/dom/indexedDB/test/test_autoIncrement_indexes.html
+++ b/dom/indexedDB/test/test_autoIncrement_indexes.html
@@ -28,16 +28,19 @@
 
       let data = { first: "foo", second: "foo", third: "foo" };
 
       objectStore.add(data).onsuccess = grabEventAndContinueHandler;
       event = yield;
 
       let key = event.target.result;
       ok(key, "Added entry");
+      request.onsuccess = grabEventAndContinueHandler;
+
+      event = yield;
 
       let objectStore = db.transaction("foo").objectStore("foo");
       let first = objectStore.index("first");
       let second = objectStore.index("second");
       let third = objectStore.index("third");
 
       first.get("foo").onsuccess = grabEventAndContinueHandler;
       event = yield;
--- a/dom/indexedDB/test/test_clear.html
+++ b/dom/indexedDB/test/test_clear.html
@@ -20,17 +20,17 @@
 
       let request = mozIndexedDB.open(name, 1, description);
       request.onerror = errorHandler;
       request.onupgradeneeded = grabEventAndContinueHandler;
       let event = yield;
 
       let db = request.result;
 
-      event.target.transaction.oncomplete = continueToNextStep;
+      event.target.onsuccess = continueToNextStep;
 
       let objectStore = db.createObjectStore("foo", { autoIncrement: true });
 
       let firstKey;
       for (let i = 0; i < entryCount; i++) {
         request = objectStore.add({});
         request.onerror = errorHandler;
         if (!i) {
--- a/dom/indexedDB/test/test_create_index_with_integer_keys.html
+++ b/dom/indexedDB/test/test_create_index_with_integer_keys.html
@@ -18,33 +18,33 @@
       let request = mozIndexedDB.open(window.location.pathname, 1);
       request.onerror = errorHandler;
       request.onupgradeneeded = grabEventAndContinueHandler;
       let event = yield;
 
       let db = event.target.result;
       db.onerror = errorHandler;
 
-      event.target.transaction.oncomplete = continueToNextStep;
+      event.target.onsuccess = continueToNextStep;
 
       // Make object store, add data.
       let objectStore = db.createObjectStore("foo", { keyPath: "id" });
       objectStore.add(data);
       yield;
       db.close();
 
       let request = mozIndexedDB.open(window.location.pathname, 2);
       request.onerror = errorHandler;
       request.onupgradeneeded = grabEventAndContinueHandler;
       let event = yield;
 
       let db2 = event.target.result;
       db2.onerror = errorHandler;
 
-      event.target.transaction.oncomplete = continueToNextStep;
+      event.target.onsuccess = continueToNextStep;
 
       // Create index.
       event.target.transaction.objectStore("foo").createIndex("foo", "num");
       yield;
 
       // Make sure our object made it into the index.
       let seenCount = 0;
 
--- a/dom/indexedDB/test/test_cursor_mutation.html
+++ b/dom/indexedDB/test/test_cursor_mutation.html
@@ -30,17 +30,17 @@
       const objectStoreDataNameSort = [ 1, 4, 5, 2, 3 ];
 
       let request = mozIndexedDB.open(window.location.pathname, 1);
       request.onerror = errorHandler;
       request.onupgradeneeded = grabEventAndContinueHandler;
       let event = yield;
 
       let db = event.target.result;
-      event.target.transaction.oncomplete = continueToNextStep;
+      event.target.onsuccess = continueToNextStep;
 
       let objectStore = db.createObjectStore("foo", { keyPath: "ss" });
       objectStore.createIndex("name", "name", { unique: true });
 
       for (let i = 0; i < objectStoreData.length - 1; i++) {
         objectStore.add(objectStoreData[i]);
       }
       yield;
--- a/dom/indexedDB/test/test_getAll.html
+++ b/dom/indexedDB/test/test_getAll.html
@@ -21,16 +21,17 @@
       request.onerror = errorHandler;
       request.onupgradeneeded = grabEventAndContinueHandler;
       let event = yield;
 
       let db = event.target.result;
 
       let objectStore = db.createObjectStore("foo", { autoIncrement: true });
 
+      request.onsuccess = grabEventAndContinueHandler;
       request = objectStore.getAll();
       request.onerror = errorHandler;
       request.onsuccess = grabEventAndContinueHandler;
       event = yield;
 
       is(event.target.result instanceof Array, true, "Got an array object");
       is(event.target.result.length, 0, "No elements");
 
@@ -41,16 +42,17 @@
         request.onerror = errorHandler;
         request.onsuccess = function(event) {
           if (++addedCount == values.length) {
             SimpleTest.executeSoon(function() { testGenerator.next(); });
           }
         }
       }
       yield;
+      yield;
 
       request = db.transaction("foo").objectStore("foo").getAll();
       request.onerror = errorHandler;
       request.onsuccess = grabEventAndContinueHandler;
       event = yield;
 
       is(event.target.result instanceof Array, true, "Got an array object");
       is(event.target.result.length, values.length, "Same length");
--- a/dom/indexedDB/test/test_index_getAll.html
+++ b/dom/indexedDB/test/test_index_getAll.html
@@ -55,16 +55,17 @@
         { key: "237-23-7736", value: { name: "Joe", height: 65, weight: 150 } },
         { key: "237-23-7737", value: { name: "Pat", height: 65 } },
         { key: "237-23-7734", value: { name: "Ron", height: 73, weight: 180 } }
       ];
 
       let request = mozIndexedDB.open(name, 1, description);
       request.onerror = errorHandler;
       request.onupgradeneeded = grabEventAndContinueHandler;
+      request.onsuccess = grabEventAndContinueHandler;
       let event = yield;
 
       let db = event.target.result;
 
       let objectStore = db.createObjectStore(objectStoreName);
 
       // First, add all our data to the object store.
       let addedData = 0;
@@ -73,27 +74,26 @@
                                   objectStoreData[i].key);
         request.onerror = errorHandler;
         request.onsuccess = function(event) {
           if (++addedData == objectStoreData.length) {
             testGenerator.send(event);
           }
         }
       }
-      event = yield;
+      yield;
       ok(true, "1");
 
       // Now create the indexes.
       for (let i in indexData) {
         objectStore.createIndex(indexData[i].name, indexData[i].keyPath,
                                 indexData[i].options);
       }
 
       is(objectStore.indexNames.length, indexData.length, "Good index count");
-      continueToNextStep();
       yield;
 
       ok(true, "2");
       objectStore = db.transaction(objectStoreName)
                       .objectStore(objectStoreName);
 
       request = objectStore.index("height").getAllKeys(65);
       request.onerror = errorHandler;
--- a/dom/indexedDB/test/test_index_getAllObjects.html
+++ b/dom/indexedDB/test/test_index_getAllObjects.html
@@ -55,16 +55,17 @@
         { key: "237-23-7736", value: { name: "Joe", height: 65, weight: 150 } },
         { key: "237-23-7737", value: { name: "Pat", height: 65 } },
         { key: "237-23-7734", value: { name: "Ron", height: 73, weight: 180 } }
       ];
 
       let request = mozIndexedDB.open(name, 1, description);
       request.onerror = errorHandler;
       request.onupgradeneeded = grabEventAndContinueHandler;
+      request.onsuccess = grabEventAndContinueHandler;
       let event = yield;
 
       let db = event.target.result;
 
       let objectStore = db.createObjectStore(objectStoreName, {});
 
       // First, add all our data to the object store.
       let addedData = 0;
@@ -82,17 +83,16 @@
 
       // Now create the indexes.
       for (let i in indexData) {
         objectStore.createIndex(indexData[i].name, indexData[i].keyPath,
                                 indexData[i].options);
       }
 
       is(objectStore.indexNames.length, indexData.length, "Good index count");
-      continueToNextStep();
       yield;
 
       objectStore = db.transaction(objectStoreName)
                       .objectStore(objectStoreName);
 
       request = objectStore.index("height").getAll(65);
       request.onerror = errorHandler;
       request.onsuccess = grabEventAndContinueHandler;
--- a/dom/indexedDB/test/test_index_object_cursors.html
+++ b/dom/indexedDB/test/test_index_object_cursors.html
@@ -32,17 +32,17 @@
       let request = mozIndexedDB.open(window.location.pathname, 1);
       request.onerror = errorHandler;
       request.onupgradeneeded = grabEventAndContinueHandler;
       let event = yield;
 
       let db = event.target.result;
       db.onerror = errorHandler;
 
-      event.target.transaction.oncomplete = continueToNextStep;
+      event.target.onsuccess = continueToNextStep;
 
       for (let objectStoreIndex in objectStoreData) {
         const objectStoreInfo = objectStoreData[objectStoreIndex];
         let objectStore = db.createObjectStore(objectStoreInfo.name,
                                                objectStoreInfo.options);
         for (let indexIndex in indexData) {
           const indexInfo = indexData[indexIndex];
           let index = objectStore.createIndex(indexInfo.name,
--- a/dom/indexedDB/test/test_indexes.html
+++ b/dom/indexedDB/test/test_indexes.html
@@ -66,16 +66,17 @@
         { key: "237-23-7736", value: { name: "Joe", height: 65, weight: 150 } },
         { key: "237-23-7737", value: { name: "Pat", height: 65 } },
         { key: "237-23-7734", value: { name: "Ron", height: 73, weight: 180 } }
       ];
 
       let request = mozIndexedDB.open(name, 1, description);
       request.onerror = errorHandler;
       request.onupgradeneeded = grabEventAndContinueHandler;
+      request.onsuccess = grabEventAndContinueHandler;
       let event = yield;
 
       let db = event.target.result;
 
       let objectStore = db.createObjectStore(objectStoreName, { keyPath: "" });
 
       // First, add all our data to the object store.
       let addedData = 0;
@@ -92,17 +93,16 @@
       event = yield;
 
       // Now create the indexes.
       for (let i in indexData) {
         objectStore.createIndex(indexData[i].name, indexData[i].keyPath,
                                 indexData[i].options);
       }
       is(objectStore.indexNames.length, indexData.length, "Good index count");
-      continueToNextStep();
       yield;
 
       objectStore = db.transaction(objectStoreName)
                       .objectStore(objectStoreName);
 
       // Check global properties to make sure they are correct.
       is(objectStore.indexNames.length, indexData.length, "Good index count");
       for (let i in indexData) {
--- a/dom/indexedDB/test/test_indexes_bad_values.html
+++ b/dom/indexedDB/test/test_indexes_bad_values.html
@@ -46,16 +46,17 @@
         { key: "237-23-7735", value: { name: "Sue", height: 58, weight: 130 } },
         { key: "237-23-7736", value: { name: "Joe", height: 65, weight: 150 } },
         { key: "237-23-7734", value: { name: "Ron", height: 73, weight: 180 } }
       ];
 
       let request = mozIndexedDB.open(name, 1, description);
       request.onerror = errorHandler;
       request.onupgradeneeded = grabEventAndContinueHandler;
+      request.onsuccess = grabEventAndContinueHandler;
       let event = yield;
 
       let db = event.target.result;
 
       let objectStore = db.createObjectStore(objectStoreName, { } );
 
       let addedData = 0;
       for (let i in objectStoreData) {
@@ -82,16 +83,17 @@
         request.onerror = errorHandler;
         request.onsuccess = function(event) {
           if (++addedData == badObjectStoreData.length) {
             SimpleTest.executeSoon(function() { testGenerator.next() });
           }
         }
       }
       yield;
+      yield;
 
       objectStore = db.transaction(objectStoreName)
                       .objectStore(objectStoreName);
 
       let keyIndex = 0;
 
       request = objectStore.index("weight").openKeyCursor();
       request.onerror = errorHandler;
--- a/dom/indexedDB/test/test_object_identity.html
+++ b/dom/indexedDB/test/test_object_identity.html
@@ -23,17 +23,17 @@
       let objectStore1 = db.createObjectStore("foo");
       let objectStore2 = transaction.objectStore("foo");
       ok(objectStore1 === objectStore2, "Got same objectStores");
 
       let index1 = objectStore1.createIndex("bar", "key");
       let index2 = objectStore2.index("bar");
       ok(index1 === index2, "Got same indexes");
 
-      transaction.oncomplete = continueToNextStep;
+      request.onsuccess = continueToNextStep;
       yield;
 
       transaction = db.transaction("foo");
 
       let objectStore3 = transaction.objectStore("foo");
       let objectStore4 = transaction.objectStore("foo");
       ok(objectStore3 === objectStore4, "Got same objectStores");
 
--- a/dom/indexedDB/test/test_odd_result_order.html
+++ b/dom/indexedDB/test/test_odd_result_order.html
@@ -24,17 +24,17 @@
       ok(db instanceof IDBDatabase, "Got a real database");
 
       db.onerror = errorHandler;
 
       let objectStore = db.createObjectStore("foo", { keyPath: "key",
                                                       autoIncrement: true });
       let index = objectStore.createIndex("foo", "index");
 
-      event.target.transaction.oncomplete = continueToNextStep;
+      event.target.onsuccess = continueToNextStep;
       yield;
 
       objectStore = db.transaction("foo", IDBTransaction.READ_WRITE)
                       .objectStore("foo");
       request = objectStore.add(data);
       request.onsuccess = grabEventAndContinueHandler;
       event = yield;
 
--- a/dom/indexedDB/test/test_open_objectStore.html
+++ b/dom/indexedDB/test/test_open_objectStore.html
@@ -15,28 +15,28 @@
       const nsIIDBObjectStore = Components.interfaces.nsIIDBObjectStore;
       const name = window.location.pathname;
       const description = "My Test Database";
       const objectStoreName = "Objects";
 
       let request = mozIndexedDB.open(name, 1, description);
       request.onerror = errorHandler;
       request.onupgradeneeded = grabEventAndContinueHandler;
+      request.onsuccess = grabEventAndContinueHandler;
       let event = yield;
 
       let db = event.target.result;
       is(db.objectStoreNames.length, 0, "Bad objectStores list");
 
       let objectStore = db.createObjectStore(objectStoreName,
                                              { keyPath: "foo" });
 
       is(db.objectStoreNames.length, 1, "Bad objectStores list");
       is(db.objectStoreNames.item(0), objectStoreName, "Bad name");
 
-      continueToNextStep();
       yield;
 
       objectStore = db.transaction(objectStoreName).objectStore(objectStoreName);
 
       is(objectStore.name, objectStoreName, "Bad name");
       is(objectStore.keyPath, "foo", "Bad keyPath");
       if(objectStore.indexNames.length, 0, "Bad indexNames");
 
--- a/dom/indexedDB/test/test_overlapping_transactions.html
+++ b/dom/indexedDB/test/test_overlapping_transactions.html
@@ -21,17 +21,17 @@
       let request = mozIndexedDB.open(name, 1, description);
       request.onerror = errorHandler;
       request.onupgradeneeded = grabEventAndContinueHandler;
       let event = yield;
 
       let db = event.target.result;
       is(db.objectStoreNames.length, 0, "Correct objectStoreNames list");
 
-      event.target.transaction.oncomplete = grabEventAndContinueHandler;
+      event.target.onsuccess = grabEventAndContinueHandler;
       for (let i in objectStores) {
         db.createObjectStore(objectStores[i], { autoIncrement: true });
       }
       let event = yield;
 
       is(db.objectStoreNames.length, objectStores.length,
          "Correct objectStoreNames list");
 
--- a/dom/indexedDB/test/test_readonly_transactions.html
+++ b/dom/indexedDB/test/test_readonly_transactions.html
@@ -17,23 +17,26 @@
 
       const name = window.location.pathname;
       const description = "My Test Database";
       const osName = "foo";
 
       let request = mozIndexedDB.open(name, 1, description);
       request.onerror = errorHandler;
       request.onupgradeneeded = grabEventAndContinueHandler;
+      request.onsuccess = grabEventAndContinueHandler;
       let event = yield;
 
       let db = event.target.result;
       is(db.objectStoreNames.length, 0, "Correct objectStoreNames list");
 
       db.createObjectStore(osName, { autoIncrement: "true" });
 
+      yield;
+
       let key1, key2;
 
       request = db.transaction([osName], READ_WRITE)
                   .objectStore(osName)
                   .add({});
       request.onerror = errorHandler;
       request.onsuccess = function(event) {
         is(event.target.transaction.mode, READ_WRITE, "Correct mode");
new file mode 100644
--- /dev/null
+++ b/dom/indexedDB/test/test_setVersion_exclusion.html
@@ -0,0 +1,90 @@
+<!--
+  Any copyright is dedicated to the Public Domain.
+  http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <title>Indexed Database Property Test</title>
+
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+
+  <script type="text/javascript;version=1.7">
+    function testSteps()
+    {
+      const name = window.location.pathname;
+
+      let request = mozIndexedDB.open(name, 1);
+      request.onerror = errorHandler;
+      request.onupgradeneeded = grabEventAndContinueHandler;
+      request.onsuccess = unexpectedSuccessHandler;
+
+      let request2 = mozIndexedDB.open(name, 2);
+      request2.onerror = errorHandler;
+      request2.onupgradeneeded = unexpectedSuccessHandler;
+
+      let event = yield;
+      is(event.type, "upgradeneeded", "Expect an upgradeneeded event");
+      is(event.target, request, "Event should be fired on the request");
+      ok(event.target.result instanceof IDBDatabase, "Expect a database here");
+
+      let db = event.target.result;
+      is(db.version, 1, "Database has correct version");
+
+      db.onupgradeneeded = function() {
+        ok(false, "our ongoing VERSION_CHANGE transaction should exclude any others!");
+      }
+
+      db.createObjectStore("foo");
+
+      try {
+        db.transaction("foo");
+        ok(false, "Transactions should be disallowed now!");
+      } catch (e) {
+        ok(e instanceof IDBDatabaseException, "Expect an IDBException");
+        is(e.code, IDBDatabaseException.NOT_ALLOWED_ERR, "Expect a NOT_ALLOWED_ERR");
+      }
+
+      request.transaction.oncomplete = grabEventAndContinueHandler;
+
+      yield;
+
+      // The database is still not fully open here.
+      try {
+        db.transaction("foo");
+        ok(false, "Transactions should be disallowed now!");
+      } catch (e) {
+        ok(e instanceof IDBDatabaseException, "Expect an IDBException");
+        is(e.code, IDBDatabaseException.NOT_ALLOWED_ERR, "Expect a NOT_ALLOWED_ERR");
+      }
+
+      request.onsuccess = grabEventAndContinueHandler;
+
+      yield;
+
+      db.onversionchange = function() {
+        ok(true, "next setVersion was unblocked appropriately");
+        db.close();
+      }
+
+      try {
+        db.transaction("foo");
+        ok(true, "Transactions should be allowed now!");
+      } catch (e) {
+        ok(false, "Transactions should be allowed now!");
+      }
+
+      request2.onupgradeneeded = null;
+
+      finishTest();
+      yield;
+    }
+
+  </script>
+  <script type="text/javascript;version=1.7" src="helpers.js"></script>
+
+</head>
+
+<body onload="runTest();"></body>
+
+</html>
--- a/dom/indexedDB/test/test_success_events_after_abort.html
+++ b/dom/indexedDB/test/test_success_events_after_abort.html
@@ -14,17 +14,17 @@
     {
       let request = mozIndexedDB.open(window.location.pathname, 1);
       request.onerror = errorHandler;
       request.onupgradeneeded = grabEventAndContinueHandler;
       let event = yield;
 
       let db = event.target.result;
 
-      event.target.transaction.oncomplete = continueToNextStep;
+      event.target.onsuccess = continueToNextStep;
 
       let objectStore = db.createObjectStore("foo");
       objectStore.add({}, 1).onerror = errorHandler;
 
       yield;
 
       objectStore = db.transaction("foo").objectStore("foo");
 
--- a/dom/indexedDB/test/test_transaction_abort.html
+++ b/dom/indexedDB/test/test_transaction_abort.html
@@ -24,16 +24,17 @@
 
       const name = window.location.pathname;
       const description = "My Test Database";
 
 
       let request = mozIndexedDB.open(name, 1, description);
       request.onerror = errorHandler;
       request.onupgradeneeded = grabEventAndContinueHandler;
+      request.onsuccess = grabEventAndContinueHandler;
       let event = yield;
 
       let db = event.target.result;
 
       let transaction;
       let objectStore;
 
       transaction = event.target.transaction;
@@ -152,16 +153,18 @@
       try {
         objectStore.deleteIndex("bar");
         ok(false, "Should have thrown");
       }
       catch (e) {
         ok(true, "RemoveIndex threw");
       }
 
+      yield;
+
       request = db.transaction("foo", READ_WRITE).objectStore("foo").add({});
       request.onerror = errorHandler;
       request.onsuccess = grabEventAndContinueHandler;
       event = yield;
 
       event.target.transaction.onabort = function(event) {
         ok(false, "Shouldn't see an abort event!");
       };
--- a/dom/indexedDB/test/test_transaction_lifetimes.html
+++ b/dom/indexedDB/test/test_transaction_lifetimes.html
@@ -15,17 +15,17 @@
       let request = mozIndexedDB.open(window.location.pathname, 1);
       request.onerror = errorHandler;
       request.onupgradeneeded = grabEventAndContinueHandler;
       let event = yield;
 
       let db = event.target.result;
       db.onerror = errorHandler;
 
-      event.target.transaction.oncomplete = continueToNextStep;
+      event.target.onsuccess = continueToNextStep;
 
       db.createObjectStore("foo", { autoIncrement: true });
       yield;
 
       let transaction = db.transaction("foo");
       continueToNextStep();
       yield;
 
--- a/dom/indexedDB/test/test_transaction_lifetimes_nested.html
+++ b/dom/indexedDB/test/test_transaction_lifetimes_nested.html
@@ -15,17 +15,17 @@
       let request = mozIndexedDB.open(window.location.pathname, 1);
       request.onerror = errorHandler;
       request.onupgradeneeded = grabEventAndContinueHandler;
       let event = yield;
 
       let db = event.target.result;
       db.onerror = errorHandler;
 
-      event.target.transaction.oncomplete = continueToNextStep;
+      event.target.onsuccess = continueToNextStep;
       db.createObjectStore("foo");
       yield;
 
       let transaction1 = db.transaction("foo");
       is(transaction1.readyState, IDBTransaction.INITIAL, "Correct readyState");
 
       let transaction2;
 
--- a/dom/indexedDB/test/test_writer_starvation.html
+++ b/dom/indexedDB/test/test_writer_starvation.html
@@ -18,33 +18,33 @@
         Components.interfaces.nsIIDBTransaction.VERSION_CHANGE;
 
       const name = window.location.pathname;
       const description = "My Test Database";
 
       let request = mozIndexedDB.open(name, 1, description);
       request.onerror = errorHandler;
       request.onupgradeneeded = grabEventAndContinueHandler;
+      request.onsuccess = grabEventAndContinueHandler;
       let event = yield;
 
       let db = event.target.result;
 
       is(event.target.transaction.mode, VERSION_CHANGE, "Correct mode");
 
       let objectStore = db.createObjectStore("foo", { autoIncrement: true });
 
       request = objectStore.add({});
       request.onerror = errorHandler;
       request.onsuccess = grabEventAndContinueHandler;
       event = yield;
 
       let key = event.target.result;
       ok(key, "Got a key");
 
-      SimpleTest.executeSoon(function() { testGenerator.next(); });
       yield;
 
       let continueReading = true;
       let readerCount = 0;
       let callbackCount = 0;
       let finalCallbackCount = 0;
 
       // Generate a bunch of reads right away without returning to the event
--- a/layout/base/nsPresShell.cpp
+++ b/layout/base/nsPresShell.cpp
@@ -6038,17 +6038,27 @@ PresShell::HandleEvent(nsIView         *
         nsFocusManager::GetFocusedDescendant(window, false,
                                              getter_AddRefs(focusedWindow));
 
       // otherwise, if there is no focused content or the focused content has
       // no frame, just use the root content. This ensures that key events
       // still get sent to the window properly if nothing is focused or if a
       // frame goes away while it is focused.
       if (!eventTarget || !eventTarget->GetPrimaryFrame()) {
-        eventTarget = mDocument->GetRootElement();
+        nsCOMPtr<nsIDOMHTMLDocument> htmlDoc = do_QueryInterface(mDocument);
+        if (htmlDoc) {
+          nsCOMPtr<nsIDOMHTMLElement> body;
+          htmlDoc->GetBody(getter_AddRefs(body));
+          eventTarget = do_QueryInterface(body);
+          if (!eventTarget) {
+            eventTarget = mDocument->GetRootElement();
+          }
+        } else {
+          eventTarget = mDocument->GetRootElement();
+        }
       }
 
       if (aEvent->message == NS_KEY_DOWN) {
         NS_IF_RELEASE(gKeyDownTarget);
         NS_IF_ADDREF(gKeyDownTarget = eventTarget);
       }
       else if ((aEvent->message == NS_KEY_PRESS || aEvent->message == NS_KEY_UP) &&
                gKeyDownTarget) {
--- a/layout/base/tests/Makefile.in
+++ b/layout/base/tests/Makefile.in
@@ -341,16 +341,17 @@ ifeq (,$(filter windows,$(MOZ_WIDGET_TOO
 		test_bug570378-persian-5f.html \
 		test_bug570378-persian-5g.html \
 		bug570378-persian-5.html \
 		bug570378-persian-5-ref.html \
 		test_bug588174.html \
 		test_bug607529.html \
 		file_bug607529.html \
 		test_bug644768.html \
+		test_bug696020.html \
 		$(NULL)
 endif
 
 _BROWSER_FILES = \
 	browser_bug617076.js \
 	$(NULL)
 
 libs:: $(_TEST_FILES)
new file mode 100644
--- /dev/null
+++ b/layout/base/tests/test_bug696020.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=696020
+-->
+<head>
+  <title>Test for Bug 696020</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=696020">Mozilla Bug 696020</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+  
+</div>
+<pre id="test">
+<script type="application/javascript">
+                                             
+/** Test for Bug 696020 **/
+
+
+function startTest() {
+  var testFrame = document.getElementById("tf").contentWindow;
+  testFrame.focus();
+  var didHandleKeyEvent = false;
+  testFrame.addEventListener("keypress",
+    function(e) {
+      is(e.target, testFrame.document.body,
+         "Body element should be event target for key events!");
+      didHandleKeyEvent = true;
+    });
+  synthesizeKey("A", {}, testFrame);
+  ok(didHandleKeyEvent, "Should have handled a key event!");
+  SimpleTest.finish();
+}
+
+SimpleTest.waitForExplicitFinish();
+SimpleTest.waitForFocus(startTest)
+
+
+</script>
+</pre>
+<iframe id="tf"></iframe>
+</body>
+</html>
--- a/testing/tps/tps/testrunner.py
+++ b/testing/tps/tps/testrunner.py
@@ -98,17 +98,20 @@ class TPSTestRunner(object):
                           'services.sync.firstSync': 'notReady',
                           'services.sync.lastversion': '1.0',
                           'services.sync.log.rootLogger': 'Trace',
                           'services.sync.log.logger.service.main': 'Trace',
                           'services.sync.log.logger.engine.bookmarks': 'Trace',
                           'services.sync.log.appender.console': 'Trace',
                           'services.sync.log.appender.debugLog.enabled': True,
                           'browser.dom.window.dump.enabled': True,
-                          'extensions.checkCompatibility.4.0': False,
+                          # Allow installing extensions dropped into the profile folder
+                          'extensions.autoDisableScopes': 10,
+                          # Don't open a dialog to show available add-on updates
+                          'extensions.update.notifyUser' : False,
                         }
   syncVerRe = re.compile(
       r"Sync version: (?P<syncversion>.*)\n")
   ffVerRe = re.compile(
       r"Firefox version: (?P<ffver>.*)\n")
   ffDateRe = re.compile(
       r"Firefox builddate: (?P<ffdate>.*)\n")
 
--- a/toolkit/content/tests/browser/browser_keyevents_during_autoscrolling.js
+++ b/toolkit/content/tests/browser/browser_keyevents_during_autoscrolling.js
@@ -20,17 +20,17 @@ function test()
     dispatchedKeyEvents = kNoKeyEvents;
     EventUtils.synthesizeKey(key, {}, gBrowser.contentWindow);
     is(dispatchedKeyEvents, expectedKeyEvents,
        "unexpected key events were dispatched or not dispatched: " + key);
   }
 
   function onKey(aEvent)
   {
-    if (aEvent.target != root) {
+    if (aEvent.target != root && aEvent.target != root.ownerDocument.body) {
       ok(false, "unknown target: " + aEvent.target.tagName);
       return;
     }
 
     var keyFlag;
     switch (aEvent.type) {
       case "keydown":
         keyFlag = kKeyDownEvent;
--- a/toolkit/themes/gnomestripe/global/inContentUI.css
+++ b/toolkit/themes/gnomestripe/global/inContentUI.css
@@ -15,46 +15,56 @@
  *
  * The Initial Developer of the Original Code is
  * the Mozilla Foundation.
  * Portions created by the Initial Developer are Copyright (C) 2011
  * the Initial Developer. All Rights Reserved.
  *
  * Contributor(s):
  *   Blair McBride <bmcbride@mozilla.com>
+ *   Philipp von Weitershausen <philipp@weitershausen.de>
  *
  * Alternatively, the contents of this file may be used under the terms of
  * either the GNU General Public License Version 2 or later (the "GPL"), or
  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  * in which case the provisions of the GPL or the LGPL are applicable instead
  * of those above. If you wish to allow use of your version of this file only
  * under the terms of either the GPL or the LGPL, and not to allow others to
  * use your version of this file under the terms of the MPL, indicate your
  * decision by deleting the provisions above and replace them with the notice
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
+/*
+ * The default namespace for this file is XUL. Be sure to prefix rules that
+ * are applicable to both XUL and HTML with '*|'.
+ */
 @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
+@namespace html url("http://www.w3.org/1999/xhtml");
 
 
 /* Page background */
-:root {
+*|*:root {
   -moz-appearance: none;
   padding: 18px;
   background-color: Window;
   background-image: -moz-linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0) 160px),
                     -moz-linear-gradient(-moz-dialog, Window 160px);
   color: WindowText;
 }
 
+html|html {
+  font: message-box;
+}
+
 /* Content */
-.main-content {
+*|*.main-content {
   /* Needed to allow the radius to clip the inner content, see bug 595656 */
   /* Disabled because of bug 623615
   overflow: hidden;
   */
   background-color: -moz-Field;
   color: -moz-FieldText;
   border: 1px solid ThreeDShadow;
   border-radius: 5px;
--- a/toolkit/themes/pinstripe/global/inContentUI.css
+++ b/toolkit/themes/pinstripe/global/inContentUI.css
@@ -15,16 +15,17 @@
  *
  * The Initial Developer of the Original Code is
  * the Mozilla Foundation.
  * Portions created by the Initial Developer are Copyright (C) 2011
  * the Initial Developer. All Rights Reserved.
  *
  * Contributor(s):
  *   Blair McBride <bmcbride@mozilla.com>
+ *   Philipp von Weitershausen <philipp@weitershausen.de>
  *
  * Alternatively, the contents of this file may be used under the terms of
  * either the GNU General Public License Version 2 or later (the "GPL"), or
  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  * in which case the provisions of the GPL or the LGPL are applicable instead
  * of those above. If you wish to allow use of your version of this file only
  * under the terms of either the GPL or the LGPL, and not to allow others to
  * use your version of this file under the terms of the MPL, indicate your
@@ -32,42 +33,50 @@
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
 %include shared.inc
 
+/*
+ * The default namespace for this file is XUL. Be sure to prefix rules that
+ * are applicable to both XUL and HTML with '*|'.
+ */
 @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
 @namespace html url("http://www.w3.org/1999/xhtml");
 
 /* Page background */
-:root {
+*|*:root {
   -moz-appearance: none;
   padding: 18px;
   background-image: /* Texture */
                     url("chrome://global/skin/inContentUI/background-texture.png"),
                     /* Gradient */
                     -moz-linear-gradient(top, #ADB5C2, #BFC6D1);
 }
 
+html|html {
+  font: message-box;
+}
+
 /* Content */
-.main-content {
+*|*.main-content {
   /* Needed to allow the radius to clip the inner content, see bug 595656 */
   /* Disabled because of bug 623615
   overflow: hidden;
   */
   background-image: -moz-linear-gradient(top, rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0.25) 50%, rgba(255, 255, 255, 0.05));
   border: 1px solid rgba(50, 65, 92, 0.4);
   border-radius: 5px;
 }
 
 /* Buttons */
-button,
+*|button,
 menulist,
 colorpicker[type="button"] {
   -moz-appearance: none;
   padding: 1px 4px;
   min-width: 60px;
   border-radius: 3px;
   border: 1px solid rgba(60,73,97,0.5);
   box-shadow: inset 0 1px rgba(255,255,255,0.25), 0 1px rgba(255,255,255,0.25);
@@ -79,23 +88,25 @@ colorpicker[type="button"] {
 }
 
 button:-moz-focusring > .button-box,
 menulist:-moz-focusring:not([open="true"]) > .menulist-label-box,
 colorpicker[type="button"]:-moz-focusring:not([open="true"]) > .colorpicker-button-colorbox {
   outline: 1px dotted #252F3B;
 }
 
+html|button[disabled],
 button[disabled="true"],
 menulist[disabled="true"],
 colorpicker[type="button"][disabled="true"] {
   opacity: 0.8;
   color: #505050;
 }
 
+html|button:not([disabled]):active:hover,
 button:not([disabled="true"]):active:hover,
 menulist[open="true"]:not([disabled="true"]),
 colorpicker[type="button"][open="true"]:not([disabled="true"]) {
   box-shadow: inset 0 1px 3px rgba(0,0,0,.2), 0 1px rgba(255,255,255,0.25);
   background-image: -moz-linear-gradient(rgba(45,54,71,0.3), rgba(45,54,71,0.1));
   border-color: rgba(60,73,97,0.7);
 }
 
--- a/toolkit/themes/winstripe/global/inContentUI.css
+++ b/toolkit/themes/winstripe/global/inContentUI.css
@@ -15,60 +15,70 @@
  *
  * The Initial Developer of the Original Code is
  * the Mozilla Foundation.
  * Portions created by the Initial Developer are Copyright (C) 2011
  * the Initial Developer. All Rights Reserved.
  *
  * Contributor(s):
  *   Blair McBride <bmcbride@mozilla.com>
+ *   Philipp von Weitershausen <philipp@weitershausen.de>
  *
  * Alternatively, the contents of this file may be used under the terms of
  * either the GNU General Public License Version 2 or later (the "GPL"), or
  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  * in which case the provisions of the GPL or the LGPL are applicable instead
  * of those above. If you wish to allow use of your version of this file only
  * under the terms of either the GPL or the LGPL, and not to allow others to
  * use your version of this file under the terms of the MPL, indicate your
  * decision by deleting the provisions above and replace them with the notice
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
+/*
+ * The default namespace for this file is XUL. Be sure to prefix rules that
+ * are applicable to both XUL and HTML with '*|'.
+ */
 @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
+@namespace html url("http://www.w3.org/1999/xhtml");
 
 /* Page background */
-:root {
+*|*:root {
   -moz-appearance: none;
   padding: 18px;
   background-repeat: repeat;
   color: -moz-dialogText;
   background-color: -moz-dialog;
   background-image: /* Fade-out texture at the top, and blend with browser tab */
                     -moz-linear-gradient(rgba(255,255,255,0.5), rgba(255,255,255,0) 30%),
                     /* Texture */
                     url("chrome://global/skin/inContentUI/background-texture.png");
 }
 
+html|html {
+  font: message-box;
+}
+
 %ifdef WINSTRIPE_AERO
 @media all and (-moz-windows-default-theme) {
-  :root {
+  *|*:root {
     color: #000;
     background-color: #CCD9EA;
     background-image: /* Fade-out texture at the top */
                       -moz-linear-gradient(top, rgb(231,237,246), rgba(231,237,246,0) 156px),
                       /* Texture */
                       url("chrome://global/skin/inContentUI/background-texture.png");
   }
 }
 
 @media all and (-moz-windows-compositor) {
-  :root {
+  *|*:root {
     color: #000;
     /* Blame shorlander for this monstrosity. */
     background-image: /* Fade-out texture and light beams at the top */
                       -moz-linear-gradient(top, rgb(231,237,246) 3px, rgba(231,237,246,0) 156px),
                       /* Side gradients */
                       -moz-linear-gradient(left,
                                            rgba(255,255,255,0.2), rgba(255,255,255,0) 40%,
                                            rgba(255,255,255,0) 60%, rgba(255,255,255,0.2)),
@@ -88,33 +98,33 @@
                                            rgba(255,255,255,0) 87%, rgba(255,255,255,0.2) 90%),
                       /* Texture */
                       url("chrome://global/skin/inContentUI/background-texture.png");
   }
 }
 %endif
 
 /* Content */
-.main-content {
+*|*.main-content {
   /* Needed to allow the radius to clip the inner content, see bug 595656 */
   /* Disabled because of bug 623615
   overflow: hidden;
   */
   background-color: rgba(255, 255, 255, 0.35);
   background-image: -moz-linear-gradient(top,
                                          rgba(255, 255, 255, 0),
                                          rgba(255, 255, 255, 0.75));
   border: 1px solid #C3CEDF;
   border-radius: 5px;
 }
 
 %ifdef WINSTRIPE_AERO
 @media all and (-moz-windows-compositor) {
   /* Buttons */
-  button,
+  *|button,
   menulist,
   colorpicker[type="button"] {
     -moz-appearance: none;
     color: black;
     padding: 0 5px;
     background: -moz-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;
@@ -128,27 +138,29 @@
   menulist {
     -moz-padding-end: 0;
   }
 
   colorpicker[type="button"]:-moz-focusring:not([open="true"]) > .colorpicker-button-colorbox {
     outline: 1px dotted ThreeDDarkShadow;
   }
 
+  html|button[disabled],
   button[disabled="true"],
   menulist[disabled="true"],
   colorpicker[type="button"][disabled="true"] {
     -moz-border-top-colors: rgba(31, 64, 100, 0.3) !important;
     -moz-border-right-colors: rgba(31, 64, 100, 0.4) !important;
     -moz-border-bottom-colors: rgba(31, 64, 100, 0.4) !important;
     -moz-border-left-colors: rgba(31, 64, 100, 0.4) !important;
     opacity: 0.8;
     color: #505050;
   }
 
+  html|button:not([disabled]):active:hover,
   button:not([disabled="true"]):active:hover,
   menulist[open="true"]:not([disabled="true"]),
   colorpicker[type="button"][open="true"]:not([disabled="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;
   }
 
--- a/toolkit/xre/nsWindowsDllBlocklist.cpp
+++ b/toolkit/xre/nsWindowsDllBlocklist.cpp
@@ -143,104 +143,28 @@ static DllBlockInfo sWindowsDllBlocklist
 
 // define this for very verbose dll load debug spew
 #undef DEBUG_very_verbose
 
 typedef NTSTATUS (NTAPI *LdrLoadDll_func) (PWCHAR filePath, PULONG flags, PUNICODE_STRING moduleFileName, PHANDLE handle);
 
 static LdrLoadDll_func stub_LdrLoadDll = 0;
 
-namespace {
-
-template <class T>
-struct RVAMap {
-  RVAMap(HANDLE map, unsigned offset) {
-    mMappedView = reinterpret_cast<T*>
-      (::MapViewOfFile(map, FILE_MAP_READ, 0, offset, sizeof(T)));
-  }
-  ~RVAMap() {
-    if (mMappedView) {
-      ::UnmapViewOfFile(mMappedView);
-    }
-  }
-  operator const T*() const { return mMappedView; }
-  const T* operator->() const { return mMappedView; }
-private:
-  const T* mMappedView;
-};
-
-void
-ForceASLR(const wchar_t* path)
-{
-  HANDLE file = ::CreateFileW(path, GENERIC_READ, FILE_SHARE_READ,
-                              NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
-                              NULL);
-  if (file != INVALID_HANDLE_VALUE) {
-    HANDLE map = ::CreateFileMappingW(file, NULL, PAGE_READONLY, 0, 0, NULL);
-    if (map) {
-      RVAMap<IMAGE_DOS_HEADER> peHeader(map, 0);
-      if (peHeader) {
-        RVAMap<IMAGE_NT_HEADERS> ntHeader(map, peHeader->e_lfanew);
-        if (ntHeader) {
-          // If we're dealing with a DLL which has code inside it, but does not have the
-          // ASLR bit set, allocate a page at its base address.
-          if (((ntHeader->OptionalHeader.DllCharacteristics & IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE) == 0) &&
-              (ntHeader->OptionalHeader.SizeOfCode > 0)) {
-            void* page = ::VirtualAlloc((LPVOID)ntHeader->OptionalHeader.ImageBase, 1,
-                                        MEM_RESERVE, PAGE_NOACCESS);
-            // Note that we will leak this page, but it's ok since it's just one page in
-            // the virtual address space, with no physical page backing it.
-
-            // We're done at this point!
-          }
-        }
-      }
-      ::CloseHandle(map);
-    }
-    ::CloseHandle(file);
-  }
-}
- 
-}
-
 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;
 
-  // 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 NULL to SearchPathW.
-  PWCHAR sanitizedFilePath = (intptr_t(filePath) < 1024) ? NULL : filePath;
-
   int len = moduleFileName->Length / 2;
   wchar_t *fname = moduleFileName->Buffer;
 
-  // figure out the length of the string that we need
-  DWORD pathlen = SearchPathW(sanitizedFilePath, fname, L".dll", 0, NULL, NULL);
-  if (pathlen == 0) {
-    // uh, we couldn't find the DLL at all, so...
-    printf_stderr("LdrLoadDll: Blocking load of '%s' (SearchPathW didn't find it?)\n", dllName);
-    return STATUS_DLL_NOT_FOUND;
-  }
-
-  nsAutoArrayPtr<wchar_t> full_fname(new wchar_t[pathlen+1]);
-  if (!full_fname) {
-    // couldn't allocate memory?
-    return STATUS_DLL_NOT_FOUND;
-  }
-
-  // now actually grab it
-  SearchPathW(sanitizedFilePath, fname, L".dll", pathlen+1, full_fname, NULL);
-
   // The filename isn't guaranteed to be null terminated, but in practice
   // it always will be; ensure that this is so, and bail if not.
   // This is done instead of the more robust approach because of bug 527122,
   // where lots of weird things were happening when we tried to make a copy.
   if (moduleFileName->MaximumLength < moduleFileName->Length+2 ||
       fname[len] != 0)
   {
 #ifdef DEBUG
@@ -306,16 +230,39 @@ patched_LdrLoadDll (PWCHAR filePath, PUL
   if (info->name) {
     bool load_ok = false;
 
 #ifdef DEBUG_very_verbose
     printf_stderr("LdrLoadDll: info->name: '%s'\n", info->name);
 #endif
 
     if (info->maxVersion != ALL_VERSIONS) {
+      // 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 NULL to SearchPathW.
+      PWCHAR sanitizedFilePath = (intptr_t(filePath) < 1024) ? NULL : filePath;
+
+      // figure out the length of the string that we need
+      DWORD pathlen = SearchPathW(sanitizedFilePath, fname, L".dll", 0, NULL, NULL);
+      if (pathlen == 0) {
+        // uh, we couldn't find the DLL at all, so...
+        printf_stderr("LdrLoadDll: Blocking load of '%s' (SearchPathW didn't find it?)\n", dllName);
+        return STATUS_DLL_NOT_FOUND;
+      }
+
+      wchar_t *full_fname = (wchar_t*) malloc(sizeof(wchar_t)*(pathlen+1));
+      if (!full_fname) {
+        // couldn't allocate memory?
+        return STATUS_DLL_NOT_FOUND;
+      }
+
+      // now actually grab it
+      SearchPathW(sanitizedFilePath, fname, L".dll", pathlen+1, full_fname, NULL);
+
       DWORD zero;
       DWORD infoSize = GetFileVersionInfoSizeW(full_fname, &zero);
 
       // If we failed to get the version information, we block.
 
       if (infoSize != 0) {
         nsAutoArrayPtr<unsigned char> infoData(new unsigned char[infoSize]);
         VS_FIXEDFILEINFO *vInfo;
@@ -329,33 +276,33 @@ patched_LdrLoadDll (PWCHAR filePath, PUL
             ((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;
         }
       }
+
+      free(full_fname);
     }
 
     if (!load_ok) {
       printf_stderr("LdrLoadDll: Blocking load of '%s' -- see http://www.mozilla.com/en-US/blocklist/\n", dllName);
       return STATUS_DLL_NOT_FOUND;
     }
   }
 
 continue_loading:
 #ifdef DEBUG_very_verbose
   printf_stderr("LdrLoadDll: continuing load... ('%S')\n", moduleFileName->Buffer);
 #endif
 
   NS_SetHasLoadedNewDLLs();
 
-  ForceASLR(full_fname);
-
   return stub_LdrLoadDll(filePath, flags, moduleFileName, handle);
 }
 
 WindowsDllInterceptor NtDllIntercept;
 
 void
 XRE_SetupDllBlocklist()
 {