Merge mozilla-central into Electrolysis.
authorBenjamin Smedberg <benjamin@smedbergs.us>
Tue, 24 Nov 2009 10:06:03 -0500
changeset 36108 133d4a382af1cc2d7ab028fb93b32951dc03853b
parent 36107 0ce2fd2badaa7491f82f1d1757f88bbc00954718 (current diff)
parent 35217 941ad9d7d079246481f365c3cfbfc75a5bbefc94 (diff)
child 36109 4d8cb0be8c0290fa1103dc01320aa3413d373490
push id10694
push userbsmedberg@mozilla.com
push dateMon, 14 Dec 2009 15:23:10 +0000
treeherdermozilla-central@683dfdc4adf0 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone1.9.3a1pre
Merge mozilla-central into Electrolysis.
browser/themes/winstripe/browser/places/importAndBackup-aero.png
browser/themes/winstripe/browser/places/importAndBackup.png
browser/themes/winstripe/browser/places/organize-aero.png
browser/themes/winstripe/browser/places/organize.png
browser/themes/winstripe/browser/places/view-aero.png
browser/themes/winstripe/browser/places/view.png
js/src/lock_SunOS.s
toolkit/content/tests/widgets/audio.oga
toolkit/content/tests/widgets/black.ogv
widget/src/windows/nsWindow.cpp
xpcom/build/nsXPComInit.cpp
xpcom/reflect/xptcall/src/md/win32/xptc_arm_ceppc.asm
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -4321,19 +4321,18 @@ var XULBrowserWindow = {
 var TabsProgressListener = {
   onProgressChange: function (aBrowser, aWebProgress, aRequest,
                               aCurSelfProgress, aMaxSelfProgress,
                               aCurTotalProgress, aMaxTotalProgress) {
   },
 
   onStateChange: function (aBrowser, aWebProgress, aRequest, aStateFlags, aStatus) {
 #ifdef MOZ_CRASHREPORTER
-    if (!aRequest.URI)
-      aRequest.QueryInterface(Ci.nsIChannel);
-    if (aStateFlags & Ci.nsIWebProgressListener.STATE_START &&
+    if (aRequest instanceof Ci.nsIChannel &&
+        aStateFlags & Ci.nsIWebProgressListener.STATE_START &&
         aStateFlags & Ci.nsIWebProgressListener.STATE_IS_DOCUMENT) {
       gCrashReporter.annotateCrashReport("URL", aRequest.URI.spec);
     }
 #endif
   },
 
   onLocationChange: function (aBrowser, aWebProgress, aRequest, aLocationURI) {
     // Filter out any sub-frame loads
@@ -6856,17 +6855,17 @@ let gPrivateBrowsingUI = {
                             getService(Ci.nsIObserverService);
     this._observerService.addObserver(this, "private-browsing", false);
     this._observerService.addObserver(this, "private-browsing-transition-complete", false);
 
     this._privateBrowsingService = Cc["@mozilla.org/privatebrowsing;1"].
                                    getService(Ci.nsIPrivateBrowsingService);
 
     if (this.privateBrowsingEnabled)
-      this.onEnterPrivateBrowsing();
+      this.onEnterPrivateBrowsing(true);
   },
 
   uninit: function PBUI_unint() {
     this._observerService.removeObserver(this, "private-browsing");
     this._observerService.removeObserver(this, "private-browsing-transition-complete");
   },
 
   get _disableUIOnToggle PBUI__disableUIOnTogle() {
@@ -6951,17 +6950,17 @@ let gPrivateBrowsingUI = {
     case 1: // Keep
       result = false;
       break;
     }
 
     return result;
   },
 
-  onEnterPrivateBrowsing: function PBUI_onEnterPrivateBrowsing() {
+  onEnterPrivateBrowsing: function PBUI_onEnterPrivateBrowsing(aOnWindowOpen) {
     if (BrowserSearch.searchBar)
       this._searchBarValue = BrowserSearch.searchBar.textbox.value;
 
     if (gFindBar)
       this._findBarValue = gFindBar.getElement("findbar-textbox").value;
 
     this._setPBMenuTitle("stop");
 
@@ -6988,17 +6987,17 @@ let gPrivateBrowsingUI = {
       docElement.setAttribute("browsingmode", "private");
       gBrowser.updateTitlebar();
     }
 
     setTimeout(function () {
       DownloadMonitorPanel.updateStatus();
     }, 0);
 
-    if (this._disableUIOnToggle)
+    if (!aOnWindowOpen && this._disableUIOnToggle)
       document.getElementById("Tools:PrivateBrowsing")
               .setAttribute("disabled", "true");
   },
 
   onExitPrivateBrowsing: function PBUI_onExitPrivateBrowsing() {
     if (BrowserSearch.searchBar) {
       let searchBox = BrowserSearch.searchBar.textbox;
       searchBox.reset();
--- a/browser/base/content/sanitizeDialog.js
+++ b/browser/base/content/sanitizeDialog.js
@@ -154,17 +154,17 @@ var gSanitizePromptDialog = {
    *                          be changed.
    */
   prepareWarning: function (aDontShowItemList) {
     // If the date and time-aware locale warning string is ever used again,
     // initialize it here.  Currently we use the no-visits warning string,
     // which does not include date and time.  See bug 480169 comment 48.
 
     var warningStringID;
-    if (this.hasCustomizedItemSelection()) {
+    if (this.hasNonSelectedItems()) {
       warningStringID = "sanitizeSelectedWarning";
       if (!aDontShowItemList)
         this.showItemList();
     }
     else {
       warningStringID = "sanitizeEverythingWarning2";
     }
 
@@ -226,21 +226,21 @@ var gSanitizePromptDialog = {
       var p = this.sanitizePreferences.childNodes[i];
       prefs.setBoolPref(p.name, p.value);
     }
   },
 
   /**
    * Check if all of the history items have been selected like the default status.
    */
-  hasCustomizedItemSelection: function () {
+  hasNonSelectedItems: function () {
     let checkboxes = document.querySelectorAll("#itemList > [preference]");
     for (let i = 0; i < checkboxes.length; ++i) {
       let pref = document.getElementById(checkboxes[i].getAttribute("preference"));
-      if (pref.value != pref.defaultValue)
+      if (!pref.value)
         return true;
     }
     return false;
   },
 
   /**
    * Show the history items list.
    */
--- a/browser/base/content/test/browser_bug304198.js
+++ b/browser/base/content/test/browser_bug304198.js
@@ -33,20 +33,16 @@
  * 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 ***** */
 
 function test() {
   waitForExplicitFinish();
 
-  waitForFocus(continue_test);
-}
-
-function continue_test() {
   let charsToDelete, deletedURLTab, fullURLTab, partialURLTab, testPartialURL, testURL;
 
   charsToDelete = 5;
   deletedURLTab = gBrowser.addTab();
   fullURLTab = gBrowser.addTab();
   partialURLTab = gBrowser.addTab();
   testURL = "http://example.org/browser/browser/base/content/test/dummy_page.html";
 
--- a/browser/base/content/test/browser_bug422590.js
+++ b/browser/base/content/test/browser_bug422590.js
@@ -60,19 +60,16 @@ function testCustomize(aWindow, aCallbac
        "file menu is enabled after toolbar customization");
 
     if (aCallback)
       aCallback();
   }
 }
 
 function closeToolbarCustomization(aWindow, aCTWindow) {
-  var osString = Components.classes["@mozilla.org/xre/app-info;1"].
-                 getService(Components.interfaces.nsIXULRuntime).OS;
-
-  // Force the cleanup code to be run now instead of onunload
-  // This also hides the sheet on Mac
+  // Force the cleanup code to be run now instead of onunload.
+  // This also hides the sheet on Mac.
   aCTWindow.finishToolbarCustomization();
 
-  // On windows and linux, need to explicitly close the window
-  if (osString != "Darwin")
+  // On windows and linux, need to explicitly close the window.
+  if (!gCustomizeSheet)
     aCTWindow.close();
 }
--- a/browser/base/content/test/browser_ctrlTab.js
+++ b/browser/base/content/test/browser_ctrlTab.js
@@ -1,18 +1,9 @@
 function test() {
-  waitForExplicitFinish();
-
-  if (Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager).activeWindow !=
-      window) {
-    setTimeout(test, 0);
-    window.focus();
-    return;
-  }
-
   gPrefService.setBoolPref("browser.ctrlTab.previews", true);
 
   gBrowser.addTab();
   gBrowser.addTab();
   gBrowser.addTab();
 
   assertTabs(4);
 
@@ -82,18 +73,16 @@ function test() {
     is(focusedWindow, document.commandDispatcher.focusedWindow,
        "Ctrl+Tab doesn't change focus if one tab is open");
   }
 
   // cleanup
   if (gPrefService.prefHasUserValue("browser.ctrlTab.previews"))
     gPrefService.clearUserPref("browser.ctrlTab.previews");
 
-  finish();
-
   /* private utility functions */
 
   function pressCtrlTab(aShiftKey)
     EventUtils.synthesizeKey("VK_TAB", { ctrlKey: true, shiftKey: !!aShiftKey });
 
   function releaseCtrl()
     EventUtils.synthesizeKey("VK_CONTROL", { type: "keyup" });
 
--- a/browser/base/content/test/browser_sanitizeDialog.js
+++ b/browser/base/content/test/browser_sanitizeDialog.js
@@ -298,59 +298,69 @@ var gAllTests = [
 
   /**
    * These next six tests together ensure that toggling details persists
    * across dialog openings.
    */
   function () {
     let wh = new WindowHelper();
     wh.onload = function () {
-      // Reset the check boxes and select "Everything"
-      this.resetCheckboxes();
+      // Check all items and select "Everything"
+      this.checkAllCheckboxes();
       this.selectDuration(Sanitizer.TIMESPAN_EVERYTHING);
 
       // Hide details
       this.toggleDetails();
       this.checkDetails(false);
       this.acceptDialog();
     };
     wh.open();
   },
   function () {
     let wh = new WindowHelper();
     wh.onload = function () {
-      // Details should remain closed because the items selection is the same
-      // as the default state.
+      // Details should remain closed because all items are checked.
       this.checkDetails(false);
 
-      // Modify the default items state
+      // Uncheck history.
       this.checkPrefCheckbox("history", false);
       this.acceptDialog();
     };
     wh.open();
   },
   function () {
     let wh = new WindowHelper();
     wh.onload = function () {
-      // Details should be open because the items selection is not the same
-      // as the default state.
+      // Details should be open because not all items are checked.
+      this.checkDetails(true);
+
+      // Modify the Site Preferences item state (bug 527820)
+      this.checkAllCheckboxes();
+      this.checkPrefCheckbox("siteSettings", false);
+      this.acceptDialog();
+    };
+    wh.open();
+  },
+  function () {
+    let wh = new WindowHelper();
+    wh.onload = function () {
+      // Details should be open because not all items are checked.
       this.checkDetails(true);
 
       // Hide details
       this.toggleDetails();
       this.checkDetails(false);
       this.cancelDialog();
     };
     wh.open();
   },
   function () {
     let wh = new WindowHelper();
     wh.onload = function () {
-      // Details should be open because the items selection is not the same
-      // as the default state.
+      // Details should be open because not all items are checked.
       this.checkDetails(true);
 
       // Select another duration
       this.selectDuration(Sanitizer.TIMESPAN_HOUR);
       // Hide details
       this.toggleDetails();
       this.checkDetails(false);
       this.acceptDialog();
@@ -464,24 +474,24 @@ WindowHelper.prototype = {
     var cb = this.win.document.querySelectorAll(
                "#itemList > [preference='" + pref + "']");
     is(cb.length, 1, "found checkbox for " + pref + " preference");
     if (cb[0].checked != aCheckState)
       cb[0].click();
   },
 
   /**
-   * Resets the checkboxes to their default state.
+   * Makes sure all the checkboxes are checked.
    */
-  resetCheckboxes: function () {
+  checkAllCheckboxes: function () {
     var cb = this.win.document.querySelectorAll("#itemList > [preference]");
     ok(cb.length > 1, "found checkboxes for preferences");
     for (var i = 0; i < cb.length; ++i) {
       var pref = this.win.document.getElementById(cb[i].getAttribute("preference"));
-      if (pref.value != pref.defaultValue)
+      if (!pref.value)
         cb[i].click();
     }
   },
 
   /**
    * @return The details progressive disclosure button
    */
   getDetailsButton: function () {
--- a/browser/components/migration/src/nsSafariProfileMigrator.cpp
+++ b/browser/components/migration/src/nsSafariProfileMigrator.cpp
@@ -210,45 +210,51 @@ nsSafariProfileMigrator::GetSourceProfil
 
 ///////////////////////////////////////////////////////////////////////////////
 // nsSafariProfileMigrator
 
 CFPropertyListRef CopyPListFromFile(nsILocalFile* aPListFile)
 {
   PRBool exists;
   aPListFile->Exists(&exists);
+  if (!exists)
+    return nsnull;
+
   nsCAutoString filePath;
   aPListFile->GetNativePath(filePath);
-  if (!exists)
-    return nsnull;
 
   nsCOMPtr<nsILocalFileMac> macFile(do_QueryInterface(aPListFile));
   CFURLRef urlRef;
   macFile->GetCFURL(&urlRef);
 
-  CFDataRef resourceData;
-
+  // It is possible for CFURLCreateDataAndPropertiesFromResource to allocate resource
+  // data and then return a failure so be careful to check both and clean up properly.
   SInt32 errorCode;
-  Boolean status = ::CFURLCreateDataAndPropertiesFromResource(kCFAllocatorDefault,
-                                                              urlRef,
-                                                              &resourceData,
-                                                              NULL,
-                                                              NULL,
-                                                              &errorCode);
-  if (!status)
-    return nsnull;
+  CFDataRef resourceData = NULL;
+  Boolean dataSuccess = ::CFURLCreateDataAndPropertiesFromResource(kCFAllocatorDefault,
+                                                                   urlRef,
+                                                                   &resourceData,
+                                                                   NULL,
+                                                                   NULL,
+                                                                   &errorCode);
 
-  CFPropertyListRef result = ::CFPropertyListCreateFromXMLData(kCFAllocatorDefault,
-                                                               resourceData,
-                                                               kCFPropertyListImmutable,
-                                                               NULL);
-  ::CFRelease(resourceData);
+  CFPropertyListRef propertyList = NULL;
+  if (resourceData) {
+    if (dataSuccess) {
+      propertyList = ::CFPropertyListCreateFromXMLData(kCFAllocatorDefault,
+                                                       resourceData,
+                                                       kCFPropertyListImmutable,
+                                                       NULL);
+    }
+    ::CFRelease(resourceData);
+  }
+
   ::CFRelease(urlRef);
 
-  return result;
+  return propertyList;
 }
 
 CFDictionaryRef CopySafariPrefs()
 {
   nsCOMPtr<nsIProperties> fileLocator(do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID));
   nsCOMPtr<nsILocalFile> safariPrefsFile;
   fileLocator->Get(NS_OSX_USER_PREFERENCES_DIR,
                    NS_GET_IID(nsILocalFile),
@@ -1249,22 +1255,24 @@ nsSafariProfileMigrator::CopyOtherData(P
 
 NS_IMETHODIMP
 nsSafariProfileMigrator::GetSourceHomePageURL(nsACString& aResult)
 {
   aResult.Truncate();
 
   // Let's first check if there's a home page key in the com.apple.safari file...
   CFDictionaryRef safariPrefs = CopySafariPrefs();
-  PRBool foundPref = GetDictionaryCStringValue(safariPrefs,
-                                               CFSTR(SAFARI_HOME_PAGE_PREF),
-                                               aResult, kCFStringEncodingUTF8);
-  ::CFRelease(safariPrefs);
-  if (foundPref)
-    return NS_OK;
+  if (safariPrefs) {
+    PRBool foundPref = GetDictionaryCStringValue(safariPrefs,
+                                                 CFSTR(SAFARI_HOME_PAGE_PREF),
+                                                 aResult, kCFStringEncodingUTF8);
+    ::CFRelease(safariPrefs);
+    if (foundPref)
+      return NS_OK;
+  }
 
 #ifdef __LP64__
   return NS_ERROR_FAILURE;
 #else
   // Couldn't find the home page in com.apple.safai, time to check
   // com.apple.internetconfig for this key!
   ICInstance internetConfig;
   OSStatus error = ::ICStart(&internetConfig, 'FRFX');
--- a/browser/components/preferences/advanced.js
+++ b/browser/components/preferences/advanced.js
@@ -398,22 +398,22 @@ var gAdvancedPane = {
    *             iii 0/1/2   t         true   
    * 
    */
 #ifdef MOZ_UPDATER
   updateAppUpdateItems: function () 
   {
     var aus = 
         Components.classes["@mozilla.org/updates/update-service;1"].
-        getService(Components.interfaces.nsIApplicationUpdateService);
+        getService(Components.interfaces.nsIApplicationUpdateService2);
 
     var enabledPref = document.getElementById("app.update.enabled");
     var enableAppUpdate = document.getElementById("enableAppUpdate");
 
-    enableAppUpdate.disabled = !aus.canUpdate || enabledPref.locked;
+    enableAppUpdate.disabled = !aus.canCheckForUpdates || enabledPref.locked;
   },
 
   /**
    * Enables/disables UI for "when updates are found" based on the values,
    * and "locked" states of associated preferences.
    */
   updateAutoItems: function () 
   {
--- a/browser/components/privatebrowsing/test/browser/Makefile.in
+++ b/browser/components/privatebrowsing/test/browser/Makefile.in
@@ -51,16 +51,17 @@ include $(topsrcdir)/config/rules.mk
 		browser_privatebrowsing_crh.js \
 		browser_privatebrowsing_downloadmonitor.js \
 		browser_privatebrowsing_fastswitch.js \
 		browser_privatebrowsing_findbar.js \
 		browser_privatebrowsing_forgetthissite.js \
 		browser_privatebrowsing_geoprompt.js \
 		browser_privatebrowsing_geoprompt_page.html \
 		browser_privatebrowsing_import.js \
+		browser_privatebrowsing_newwindow_stopcmd.js \
 		browser_privatebrowsing_opendir.js \
 		browser_privatebrowsing_openlocation.js \
 		browser_privatebrowsing_pageinfo.js \
 		browser_privatebrowsing_placestitle.js \
 		browser_privatebrowsing_popupmode.js \
 		browser_privatebrowsing_searchbar.js \
 		browser_privatebrowsing_sslsite_transition.js \
 		browser_privatebrowsing_theming.js \
new file mode 100644
--- /dev/null
+++ b/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_newwindow_stopcmd.js
@@ -0,0 +1,63 @@
+/* ***** 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 Private Browsing Tests.
+ *
+ * The Initial Developer of the Original Code is
+ * Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2009
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *   Ehsan Akhgari <ehsan.akhgari@gmail.com> (Original Author)
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either of 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 ***** */
+
+// This test makes sure that the stop private browsing command is enabled in
+// new windows opened from the private browsing mode (bug 529667).
+
+function test() {
+  // initialization
+  let pb = Cc["@mozilla.org/privatebrowsing;1"].
+           getService(Ci.nsIPrivateBrowsingService);
+  waitForExplicitFinish();
+
+  pb.privateBrowsingEnabled = true;
+
+  let win = OpenBrowserWindow();
+  win.addEventListener("load", function() {
+    executeSoon(function() {
+      executeSoon(function() {
+        let cmd = win.document.getElementById("Tools:PrivateBrowsing");
+        ok(!cmd.hasAttribute("disabled"),
+           "The Private Browsing command in a new window should be enabled");
+
+        win.close();
+        pb.privateBrowsingEnabled = false;
+        finish();
+      });
+    });
+  }, false);
+}
--- a/browser/components/sessionstore/test/browser/browser_461634.js
+++ b/browser/components/sessionstore/test/browser/browser_461634.js
@@ -73,17 +73,17 @@ function test() {
       return false;
     }
     catch (ex) {
       return ex.name == "NS_ERROR_ILLEGAL_VALUE";
     }
   }
   
   // open a window and add the above closed tab list
-  let newWin = open(location, "", "chrome,all");
+  let newWin = openDialog(location, "", "chrome,all,dialog=no");
   newWin.addEventListener("load", function(aEvent) {
     gPrefService.setIntPref("browser.sessionstore.max_tabs_undo",
                             test_state.windows[0]._closedTabs.length);
     ss.setWindowState(newWin, JSON.stringify(test_state), true);
     
     let closedTabs = eval("(" + ss.getClosedTabData(newWin) + ")");
     is(closedTabs.length, test_state.windows[0]._closedTabs.length,
        "Closed tab list has the expected length");
--- a/browser/components/sessionstore/test/browser/browser_464199.js
+++ b/browser/components/sessionstore/test/browser/browser_464199.js
@@ -81,17 +81,17 @@ function test() {
                extData: { "setTabValue": "http://example.net:80" } }, title: REMEMBER }
   ] }] };
   let remember_count = 5;
   
   function countByTitle(aClosedTabList, aTitle)
     aClosedTabList.filter(function(aData) aData.title == aTitle).length;
   
   // open a window and add the above closed tab list
-  let newWin = open(location, "", "chrome,all");
+  let newWin = openDialog(location, "", "chrome,all,dialog=no");
   newWin.addEventListener("load", function(aEvent) {
     gPrefService.setIntPref("browser.sessionstore.max_tabs_undo",
                             test_state.windows[0]._closedTabs.length);
     ss.setWindowState(newWin, JSON.stringify(test_state), true);
     
     let closedTabs = eval("(" + ss.getClosedTabData(newWin) + ")");
     is(closedTabs.length, test_state.windows[0]._closedTabs.length,
        "Closed tab list has the expected length");
--- a/browser/components/sessionstore/test/browser/browser_522545.js
+++ b/browser/components/sessionstore/test/browser/browser_522545.js
@@ -50,27 +50,31 @@ function browserWindowsCount() {
 function test() {
   /** Test for Bug 522545 **/
   is(browserWindowsCount(), 1, "Only one browser window should be open initially");
 
   waitForExplicitFinish();
 
   let ss = Cc["@mozilla.org/browser/sessionstore;1"].
            getService(Ci.nsISessionStore);
-  let os = Cc["@mozilla.org/observer-service;1"].
-           getService(Ci.nsIObserverService);
 
   function waitForBrowserState(aState, aSetStateCallback) {
-    let observer = {
-      observe: function(aSubject, aTopic, aData) {
-        os.removeObserver(this, "sessionstore-browser-state-restored");
-        executeSoon(aSetStateCallback);
-      }
-    };
-    os.addObserver(observer, "sessionstore-browser-state-restored", false);
+    var locationChanges = 0;
+    gBrowser.addTabsProgressListener({
+      onLocationChange: function (aBrowser) {
+        if (++locationChanges == aState.windows[0].tabs.length) {
+          gBrowser.removeTabsProgressListener(this);
+          executeSoon(aSetStateCallback);
+        }
+      },
+      onProgressChange: function () {},
+      onSecurityChange: function () {},
+      onStateChange: function () {},
+      onStatusChange: function () {}
+    });
     ss.setBrowserState(JSON.stringify(aState));
   }
 
   // This tests the following use case:
   // User opens a new tab which gets focus. The user types something into the
   // address bar, then crashes or quits.
   function test_newTabFocused() {
     let state = {
@@ -295,21 +299,19 @@ function test() {
   }
 
 
   let tests = [test_newTabFocused, test_newTabNotFocused,
                test_existingSHEnd_noClear, test_existingSHMiddle_noClear,
                test_getBrowserState_lotsOfTabsOpening,
                test_getBrowserState_userTypedValue, test_userTypedClearLoadURI];
   let originalState = ss.getBrowserState();
-  info(JSON.parse(originalState).windows.length);
-  info(originalState);
   function runNextTest() {
     if (tests.length) {
-      tests.shift().call();
+      tests.shift()();
     } else {
       ss.setBrowserState(originalState);
       executeSoon(function () {
         is(browserWindowsCount(), 1, "Only one browser window should be open eventually");
         finish();
       });
     }
   }
--- a/browser/components/sidebar/src/nsSidebar.js
+++ b/browser/components/sidebar/src/nsSidebar.js
@@ -220,17 +220,17 @@ function (aDescriptionURL)
 }
 
 // This function exists to implement window.external.IsSearchProviderInstalled(),
 // for compatibility with other browsers.  It will return an integer value
 // indicating whether the given engine is installed for the current user.
 // However, it is currently stubbed out due to security/privacy concerns
 // stemming from difficulties in determining what domain issued the request.
 // See bug 340604 and
-// http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/issearchproviderinstalled.asp .
+// http://msdn.microsoft.com/en-us/library/aa342526%28VS.85%29.aspx .
 // XXX Implement this!
 nsSidebar.prototype.IsSearchProviderInstalled =
 function (aSearchURL)
 {
   return 0;
 }
 
 nsSidebar.prototype.addMicrosummaryGenerator =
--- a/browser/fuel/test/browser_Browser.js
+++ b/browser/fuel/test/browser_Browser.js
@@ -5,24 +5,17 @@ var gPageB = null;
 var gTabOpenPageA = null;
 var gTabOpenPageB = null;
 var gTabOpenCount = 0;
 var gTabCloseCount = 0;
 var gTabMoveCount = 0;
 var gPageLoadCount = 0;
 
 function test() {
-  waitForExplicitFinish();      
-
-  if (Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager).activeWindow !=
-      window) {
-    setTimeout(test, 0);
-    window.focus();
-    return;
-  }
+  waitForExplicitFinish();
 
   var windows = Application.windows;
   ok(windows, "Check access to browser windows");
   is(windows.length, 1, "There should be one browser window open");
 
   var activeWin = Application.activeWindow;
   activeWin.events.addListener("TabOpen", onTabOpen);
   activeWin.events.addListener("TabClose", onTabClose);
old mode 100755
new mode 100644
index a42d72b3c4da689f8da738173b62e16bb4f78afa..76199d9f3d88e26749cbefd7acb3814bf0d87be1
GIT binary patch
literal 49900
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
F{|B;BPEr5>
old mode 100755
new mode 100644
index 45d45f6dad45450b37c104949a479837e4ff4bd5..f3607750398621f20c586a144f8748d4e22063b1
GIT binary patch
literal 20954
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
old mode 100755
new mode 100644
index 61ac17477a0545cb6ef48c4236e51bc3242f779a..ef903824786d128fe3568240fe8a9bc7bc0e8fd0
GIT binary patch
literal 27056
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
old mode 100755
new mode 100644
index 67690b34775df6adfc2a8c8ba83334dac449e93c..6535fa297d7515abfb74f34aa385f4141ecc2080
GIT binary patch
literal 49053
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
B)eHat
--- a/browser/themes/winstripe/browser/browser.css
+++ b/browser/themes/winstripe/browser/browser.css
@@ -225,17 +225,17 @@ toolbar[mode="icons"] #back-button {
   padding: 0;
   -moz-padding-start: 2px;
   border: none;
 }
 
 toolbar[iconsize="large"][mode="icons"] #back-button {
   -moz-image-region: rect(0px 396px 34px 360px);
 }
-toolbar[iconsize="large"][mode="icons"] #back-button:not([disabled="true"]):hover {
+toolbar[iconsize="large"][mode="icons"] #back-button:hover {
   -moz-image-region: rect(34px 396px 68px 360px);
 }
 toolbar[iconsize="large"][mode="icons"] #back-button[disabled="true"] {
   -moz-image-region: rect(68px 396px 102px 360px);
 }
 toolbar[iconsize="large"][mode="icons"] #back-button:not([disabled="true"]):hover:active {
   -moz-image-region: rect(102px 396px 136px 360px);
 }
@@ -246,17 +246,17 @@ toolbar[mode="icons"] #forward-button {
   -moz-appearance: none;
   padding: 0;
   border: none;
 }
 
 toolbar[iconsize="large"][mode="icons"] #forward-button {
   -moz-image-region: rect(3px 422px 31px 396px);
 }
-toolbar[iconsize="large"][mode="icons"] #forward-button:not([disabled="true"]):hover {
+toolbar[iconsize="large"][mode="icons"] #forward-button:hover {
   -moz-image-region: rect(37px 422px 65px 396px);
 }
 toolbar[iconsize="large"][mode="icons"] #forward-button[disabled="true"] {
   -moz-image-region: rect(71px 422px 99px 396px);
 }
 toolbar[iconsize="large"][mode="icons"] #forward-button:not([disabled="true"]):hover:active {
   -moz-image-region: rect(105px 422px 133px 396px);
 }
@@ -278,17 +278,17 @@ toolbar[mode="icons"] #back-forward-drop
 toolbar[mode="icons"] #back-forward-dropmarker > dropmarker {
   display: none;
 }
 
 toolbar[iconsize="large"][mode="icons"] #back-forward-dropmarker {
   list-style-image: url("chrome://browser/skin/Toolbar.png");
   -moz-image-region: rect(3px 438px 31px 422px);
 }
-toolbar[iconsize="large"][mode="icons"] #back-forward-dropmarker:not([disabled="true"]):hover {
+toolbar[iconsize="large"][mode="icons"] #back-forward-dropmarker:hover {
   -moz-image-region: rect(37px 438px 65px 422px);
 }
 toolbar[iconsize="large"][mode="icons"] #back-forward-dropmarker[disabled="true"] {
   -moz-image-region: rect(71px 438px 99px 422px);
 }
 toolbar[iconsize="large"][mode="icons"] #back-forward-dropmarker:not([disabled="true"]):hover:active {
   -moz-image-region: rect(105px 438px 133px 422px);
 }
@@ -300,270 +300,220 @@ toolbar[iconsize="small"][mode="icons"] 
   -moz-padding-end: 0;
 }
 
 /* unified back button with keyhole icons, small icons mode */
 
 toolbar[iconsize="small"][mode="icons"] #back-button {
   -moz-image-region: rect(0px 264px 24px 240px);
 }
-toolbar[iconsize="small"][mode="icons"] #back-button:not([disabled="true"]):hover {
+toolbar[iconsize="small"][mode="icons"] #back-button:hover {
   -moz-image-region: rect(24px 264px 48px 240px);
 }
 toolbar[iconsize="small"][mode="icons"] #back-button[disabled="true"] {
   -moz-image-region: rect(48px 264px 72px 240px);
 }
 toolbar[iconsize="small"][mode="icons"] #back-button:not([disabled="true"]):hover:active {
   -moz-image-region: rect(72px 264px 96px 240px);
 }
 
 /* unified forward button with keyhole icons, small icons mode */
 
 toolbar[iconsize="small"][mode="icons"] #forward-button {
   -moz-image-region: rect(0px 288px 24px 264px);
 }
-toolbar[iconsize="small"][mode="icons"] #forward-button:not([disabled="true"]):hover {
+toolbar[iconsize="small"][mode="icons"] #forward-button:hover {
   -moz-image-region: rect(24px 288px 48px 264px);
 }
 toolbar[iconsize="small"][mode="icons"] #forward-button[disabled="true"] {
   -moz-image-region: rect(48px 288px 72px 264px);
 }
 toolbar[iconsize="small"][mode="icons"] #forward-button:not([disabled="true"]):hover:active {
   -moz-image-region: rect(72px 288px 96px 264px);
 }
 
 /* dropmarker for unified back and forward buttons with keyhole icons, small icons mode */
 
 toolbar[iconsize="small"][mode="icons"] #back-forward-dropmarker {
   list-style-image: url("chrome://browser/skin/Toolbar-small.png");
   -moz-image-region: rect(0px 301px 24px 288px);
 }
-toolbar[iconsize="small"][mode="icons"] #back-forward-dropmarker:not([disabled="true"]):hover {
+toolbar[iconsize="small"][mode="icons"] #back-forward-dropmarker:hover {
   -moz-image-region: rect(24px 301px 48px 288px);
 }
 toolbar[iconsize="small"][mode="icons"] #back-forward-dropmarker[disabled="true"] {
   -moz-image-region: rect(48px 301px 72px 288px);
 }
 toolbar[iconsize="small"][mode="icons"] #back-forward-dropmarker:not([disabled="true"]):hover:active {
   -moz-image-region: rect(72px 301px 96px 288px);
 }
 
 /* ::::: 24px primary toolbar buttons ::::: */
 
 /* back button */
 
 #back-button {
   -moz-image-region: rect(0px 24px 24px 0px); 
 }
-#back-button:not([disabled="true"]):hover,
-#back-button[buttonover="true"] {
+#back-button:hover {
   -moz-image-region: rect(24px 24px 48px 0px);
 }
 #back-button[disabled="true"] {
   -moz-image-region: rect(48px 24px 72px 0px);
 }
-#back-button:not([disabled="true"]):hover:active {
-  -moz-image-region: rect(96px 24px 120px 0px);
-}
 
 /* forward button */
 
 #forward-button {
   -moz-image-region: rect(0px 48px 24px 24px);
 }
-#forward-button:not([disabled="true"]):hover,
-#forward-button[buttonover="true"] {
+#forward-button:hover {
   -moz-image-region: rect(24px 48px 48px 24px);
 }
 #forward-button[disabled="true"] {
   -moz-image-region: rect(48px 48px 72px 24px);
 }
-#forward-button:not([disabled="true"]):hover:active {
-  -moz-image-region: rect(96px 48px 120px 24px);
-}
 
 /* stop button */
 
 #stop-button {
   -moz-image-region: rect(0px 72px 24px 48px);
 }
-#stop-button:not([disabled="true"]):hover {
+#stop-button:hover {
   -moz-image-region: rect(24px 72px 48px 48px);
 }
 #stop-button[disabled="true"] {
   -moz-image-region: rect(48px 72px 72px 48px);
 }
-#stop-button:not([disabled="true"]):hover:active {
-  -moz-image-region: rect(96px 72px 120px 48px);
-}
 
 /* reload button */
 
 #reload-button {
   -moz-image-region: rect(0px 96px 24px 72px);
 }
-#reload-button:not([disabled="true"]):hover {
+#reload-button:hover {
   -moz-image-region: rect(24px 96px 48px 72px);
 }
 #reload-button[disabled="true"] {
   -moz-image-region: rect(48px 96px 72px 72px);
 }
-#reload-button:not([disabled="true"]):hover:active {
-  -moz-image-region: rect(96px 96px 120px 72px);
-}
 
 /* home button */
 
 #home-button {
   -moz-image-region: rect(0px 120px 24px 96px);
 }
 #home-button:hover {
   -moz-image-region: rect(24px 120px 48px 96px);
 }
-#home-button:hover:active {
-  -moz-image-region: rect(96px 120px 120px 96px);
-}
 
 /* download manager button */
 
 #downloads-button {
   -moz-image-region: rect(0px 144px 24px 120px);
 }
 #downloads-button:hover {
   -moz-image-region: rect(24px 144px 48px 120px);
 }
-#downloads-button:hover:active {
-  -moz-image-region: rect(96px 144px 120px 120px);
-}
 
 /* history sidebar button */
 
 #history-button {
   -moz-image-region: rect(0px 168px 24px 144px);
 }
-#history-button:not([checked="true"]):hover {
-  -moz-image-region: rect(24px 168px 48px 144px);
-}
+#history-button:hover,
 #history-button[checked="true"] {
-  -moz-image-region: rect(72px 168px 96px 144px);
-}
-#history-button:not([checked="true"]):hover:active {
-  -moz-image-region: rect(96px 168px 120px 144px);
+  -moz-image-region: rect(24px 168px 48px 144px);
 }
 
 /* bookmark sidebar button */
 
 #bookmarks-button {
   -moz-image-region: rect(0px 192px 24px 168px);
 }
-#bookmarks-button:not([checked="true"]):hover {
-  -moz-image-region: rect(24px 192px 48px 168px);
-}
+#bookmarks-button:hover,
 #bookmarks-button[checked="true"] {
-  -moz-image-region: rect(72px 192px 96px 168px);
-}
-#bookmarks-button:not([checked="true"]):hover:active {
-  -moz-image-region: rect(96px 192px 120px 168px);
+  -moz-image-region: rect(24px 192px 48px 168px);
 }
 
 /* print button */
 
 #print-button {
   -moz-image-region: rect(0px 216px 24px 192px);
 }
-#print-button:not([disabled="true"]):hover {
+#print-button:hover {
   -moz-image-region: rect(24px 216px 48px 192px);
 }
 #print-button[disabled="true"] {
   -moz-image-region: rect(48px 216px 72px 192px);
 }
-#print-button:not([disabled="true"]):hover:active {
-  -moz-image-region: rect(96px 216px 120px 192px);
-}
 
 /* toolbar new tab button */
 
 #new-tab-button {
   -moz-image-region: rect(0px 240px 24px 216px);
 }
 #new-tab-button:hover {
   -moz-image-region: rect(24px 240px 48px 216px);
 }
-#new-tab-button:hover:active {
-  -moz-image-region: rect(96px 240px 120px 216px);
-}
 
 /* new window button */
 
 #new-window-button {
   -moz-image-region: rect(0px 264px 24px 240px);
 }
 #new-window-button:hover {
   -moz-image-region: rect(24px 264px 48px 240px);
 }
-#new-window-button:hover:active {
-  -moz-image-region: rect(96px 264px 120px 240px);
-}
 
 /* cut button */
 
 #cut-button {
   -moz-image-region: rect(0px 288px 24px 264px);
 }
-#cut-button:not([disabled="true"]):hover {
+#cut-button:hover {
   -moz-image-region: rect(24px 288px 48px 264px);
 }
 #cut-button[disabled="true"] {
   -moz-image-region: rect(48px 288px 72px 264px);
 }
-#cut-button:not([disabled="true"]):hover:active {
-  -moz-image-region: rect(96px 288px 120px 264px);
-}
 
 /* copy button */
 
 #copy-button {
   -moz-image-region: rect(0px 312px 24px 288px);
 }
-#copy-button:not([disabled="true"]):hover {
+#copy-button:hover {
   -moz-image-region: rect(24px 312px 48px 288px);
 }
 #copy-button[disabled="true"] {
   -moz-image-region: rect(48px 312px 72px 288px);
 }
-#copy-button:not([disabled="true"]):hover:active {
-  -moz-image-region: rect(96px 312px 120px 288px);
-}
 
 /* paste button */
 
 #paste-button {
   -moz-image-region: rect(0px 336px 24px 312px);
 }
-#paste-button:not([disabled="true"]):hover {
+#paste-button:hover {
   -moz-image-region: rect(24px 336px 48px 312px);
 }
 #paste-button[disabled="true"] {
   -moz-image-region: rect(48px 336px 72px 312px);
 }
-#paste-button:not([disabled="true"]):hover:active {
-  -moz-image-region: rect(96px 336px 120px 312px);
-}
 
 /* fullscreen button */
 
 #fullscreen-button {
   -moz-image-region: rect(0px 360px 24px 336px);
 }
-#fullscreen-button:hover {
+#fullscreen-button:hover,
+#fullscreen-button[checked="true"] {
   -moz-image-region: rect(24px 360px 48px 336px);
 }
-#fullscreen-button:hover:active {
-  -moz-image-region: rect(96px 360px 120px 336px);
-}
 
 /* ::::: 16px primary toolbar buttons ::::: */
 
 toolbar[iconsize="small"] .toolbarbutton-1 {
   -moz-box-orient: vertical;
   min-width: 0;
   list-style-image: url("chrome://browser/skin/Toolbar-small.png");
 }
@@ -575,244 +525,193 @@ toolbar[iconsize="small"] .toolbarbutton
 /* back button */
 
 toolbar[iconsize="small"] #back-button > .toolbarbutton-icon {
   -moz-padding-end: 1px;
 }
 toolbar[iconsize="small"] #back-button {
   -moz-image-region: rect(0px 16px 16px 0px);
 }
-toolbar[iconsize="small"] #back-button:not([disabled="true"]):hover,
-toolbar[iconsize="small"] #back-button[buttonover="true"] {
+toolbar[iconsize="small"] #back-button:hover {
   -moz-image-region: rect(16px 16px 32px 0px);
 }
 toolbar[iconsize="small"] #back-button[disabled="true"] {
   -moz-image-region: rect(32px 16px 48px 0px);
 }
-toolbar[iconsize="small"] #back-button:not([disabled="true"]):hover:active {
-  -moz-image-region: rect(64px 16px 80px 0px);
-}
 
 .unified-nav-back[_moz-menuactive]:-moz-locale-dir(ltr),
 .unified-nav-forward[_moz-menuactive]:-moz-locale-dir(rtl) {
   list-style-image: url("chrome://browser/skin/menu-back.png") !important;
 }
 
 /* forward button */
 
 toolbar[iconsize="small"] #forward-button > .toolbarbutton-icon {
   -moz-padding-end: 1px;
 }
 toolbar[iconsize="small"] #forward-button {
   -moz-image-region: rect(0px 32px 16px 16px);
 }
-toolbar[iconsize="small"] #forward-button:not([disabled="true"]):hover,
-toolbar[iconsize="small"] #forward-button[buttonover="true"] {
+toolbar[iconsize="small"] #forward-button:hover {
   -moz-image-region: rect(16px 32px 32px 16px);
 }
 toolbar[iconsize="small"] #forward-button[disabled="true"] {
   -moz-image-region: rect(32px 32px 48px 16px);
 }
-toolbar[iconsize="small"] #forward-button:not([disabled="true"]):hover:active {
-  -moz-image-region: rect(64px 32px 80px 16px);
-}
 
 .unified-nav-forward[_moz-menuactive]:-moz-locale-dir(ltr),
 .unified-nav-back[_moz-menuactive]:-moz-locale-dir(rtl) {
   list-style-image: url("chrome://browser/skin/menu-forward.png") !important;
 }
 
 /* stop button */
 
 toolbar[iconsize="small"] #stop-button {
   -moz-image-region: rect(0px 48px 16px 32px);
 }
-toolbar[iconsize="small"] #stop-button:not([disabled="true"]):hover {
+toolbar[iconsize="small"] #stop-button:hover {
   -moz-image-region: rect(16px 48px 32px 32px);
 }
 toolbar[iconsize="small"] #stop-button[disabled="true"] {
   -moz-image-region: rect(32px 48px 48px 32px);
 }
-toolbar[iconsize="small"] #stop-button:not([disabled="true"]):hover:active {
-  -moz-image-region: rect(64px 48px 80px 32px);
-}
 
 /* reload button */
 
 toolbar[iconsize="small"] #reload-button {
   -moz-image-region: rect(0px 64px 16px 48px);
 }
-toolbar[iconsize="small"] #reload-button:not([disabled="true"]):hover {
+toolbar[iconsize="small"] #reload-button:hover {
   -moz-image-region: rect(16px 64px 32px 48px);
 }
 toolbar[iconsize="small"] #reload-button[disabled="true"] {
   -moz-image-region: rect(32px 64px 48px 48px);
 }
-toolbar[iconsize="small"] #reload-button:not([disabled="true"]):hover:active {
-  -moz-image-region: rect(64px 64px 80px 48px);
-}
 
 /* home button */
 
 #home-button.bookmark-item {
   list-style-image: url("chrome://browser/skin/Toolbar-small.png");
 }
-toolbar[iconsize="small"] #home-button ,
+toolbar[iconsize="small"] #home-button,
 #home-button.bookmark-item {
   -moz-image-region: rect(0px 80px 16px 64px);
 }
-toolbar[iconsize="small"] #home-button:hover ,
+toolbar[iconsize="small"] #home-button:hover,
 #home-button.bookmark-item:hover {
   -moz-image-region: rect(16px 80px 32px 64px);
 }
-toolbar[iconsize="small"] #home-button:hover:active ,
-#home-button.bookmark-item:hover:active {
-  -moz-image-region: rect(64px 80px 80px 64px);
-}
 
 /* download manager button */
 
 toolbar[iconsize="small"] #downloads-button {
   -moz-image-region: rect(0px 96px 16px 80px);
 }
 toolbar[iconsize="small"] #downloads-button:hover {
   -moz-image-region: rect(16px 96px 32px 80px);
 }
-toolbar[iconsize="small"] #downloads-button:hover:active {
-  -moz-image-region: rect(64px 96px 80px 80px);
-}
 
 /* history sidebar button */
 
 toolbar[iconsize="small"] #history-button {
   -moz-image-region: rect(0px 112px 16px 96px);
 }
-toolbar[iconsize="small"] #history-button:not([checked="true"]):hover {
-  -moz-image-region: rect(16px 112px 32px 96px);
-}
+toolbar[iconsize="small"] #history-button:hover,
 toolbar[iconsize="small"] #history-button[checked="true"] {
-  -moz-image-region: rect(48px 112px 64px 96px);
-}
-toolbar[iconsize="small"] #history-button:not([checked="true"]):hover:active {
-  -moz-image-region: rect(64px 112px 80px 96px);
+  -moz-image-region: rect(16px 112px 32px 96px);
 }
 
 /* bookmark sidebar button */
 
 toolbar[iconsize="small"] #bookmarks-button {
   -moz-image-region: rect(0px 128px 16px 112px);
 }
-toolbar[iconsize="small"] #bookmarks-button:not([checked="true"]):hover {
-  -moz-image-region: rect(16px 128px 32px 112px);
-}
+toolbar[iconsize="small"] #bookmarks-button:hover,
 toolbar[iconsize="small"] #bookmarks-button[checked="true"] {
-  -moz-image-region: rect(48px 128px 64px 112px);
-}
-toolbar[iconsize="small"] #bookmarks-button:not([checked="true"]):hover:active {
-  -moz-image-region: rect(64px 128px 80px 112px);
+  -moz-image-region: rect(16px 128px 32px 112px);
 }
 
 /* print button */
 
 toolbar[iconsize="small"] #print-button {
   -moz-image-region: rect(0px 144px 16px 128px);
 }
-toolbar[iconsize="small"] #print-button:not([disabled="true"]):hover {
+toolbar[iconsize="small"] #print-button:hover {
   -moz-image-region: rect(16px 144px 32px 128px);
 }
 toolbar[iconsize="small"] #print-button[disabled="true"] {
   -moz-image-region: rect(32px 144px 48px 128px);
 }
-toolbar[iconsize="small"] #print-button:not([disabled="true"]):hover:active {
-  -moz-image-region: rect(64px 144px 80px 128px);
-}
 
 /* toolbar new tab button */
 
 toolbar[iconsize="small"] #new-tab-button {
   -moz-image-region: rect(0px 160px 16px 144px);
 }
 toolbar[iconsize="small"] #new-tab-button:hover {
   -moz-image-region: rect(16px 160px 32px 144px);
 }
-toolbar[iconsize="small"] #new-tab-button:hover:active {
-  -moz-image-region: rect(64px 160px 80px 144px);
-}
 
 /* new window button */
 
 toolbar[iconsize="small"] #new-window-button {
   -moz-image-region: rect(0px 176px 16px 160px);
 }
 toolbar[iconsize="small"] #new-window-button:hover {
   -moz-image-region: rect(16px 176px 32px 160px);
 }
-toolbar[iconsize="small"] #new-window-button:hover:active {
-  -moz-image-region: rect(64px 176px 80px 160px);
-}
 
 /* cut button */
 
 toolbar[iconsize="small"] #cut-button > .toolbarbutton-icon {
   padding-right: 1px;
 }
 toolbar[iconsize="small"] #cut-button {
   -moz-image-region: rect(0px 192px 16px 176px);
 }
-toolbar[iconsize="small"] #cut-button:not([disabled="true"]):hover {
+toolbar[iconsize="small"] #cut-button:hover {
   -moz-image-region: rect(16px 192px 32px 176px);
 }
 toolbar[iconsize="small"] #cut-button[disabled="true"] {
   -moz-image-region: rect(32px 192px 48px 176px);
 }
-toolbar[iconsize="small"] #cut-button:not([disabled="true"]):hover:active {
-  -moz-image-region: rect(64px 192px 80px 176px);
-}
 
 /* copy button */
 
 toolbar[iconsize="small"] #copy-button {
   -moz-image-region: rect(0px 208px 16px 192px);
 }
-toolbar[iconsize="small"] #copy-button:not([disabled="true"]):hover {
+toolbar[iconsize="small"] #copy-button:hover {
   -moz-image-region: rect(16px 208px 32px 192px);
 }
 toolbar[iconsize="small"] #copy-button[disabled="true"] {
   -moz-image-region: rect(32px 208px 48px 192px);
 }
-toolbar[iconsize="small"] #copy-button:not([disabled="true"]):hover:active {
-  -moz-image-region: rect(64px 208px 80px 192px);
-}
 
 /* paste button */
 
 toolbar[iconsize="small"] #paste-button {
   -moz-image-region: rect(0px 224px 16px 208px);
 }
-toolbar[iconsize="small"] #paste-button:not([disabled="true"]):hover {
+toolbar[iconsize="small"] #paste-button:hover {
   -moz-image-region: rect(16px 224px 32px 208px);
 }
 toolbar[iconsize="small"] #paste-button[disabled="true"] {
   -moz-image-region: rect(32px 224px 48px 208px);
 }
-toolbar[iconsize="small"] #paste-button:not([disabled="true"]):hover:active {
-  -moz-image-region: rect(64px 224px 80px 208px);
-}
 
 /* fullscreen button */
 
 toolbar[iconsize="small"] #fullscreen-button {
   -moz-image-region: rect(0px 240px 16px 224px);
 }
-toolbar[iconsize="small"] #fullscreen-button:hover {
+toolbar[iconsize="small"] #fullscreen-button:hover,
+toolbar[iconsize="small"] #fullscreen-button[checked="true"] {
   -moz-image-region: rect(16px 240px 32px 224px);
 }
-toolbar[iconsize="small"] #fullscreen-button:hover:active {
-  -moz-image-region: rect(64px 240px 80px 224px);
-}
 
 /* ::::: fullscreen window controls ::::: */
 
 #minimize-button,
 #restore-button,
 #close-button {
   list-style-image: url("chrome://global/skin/icons/windowControls.png");
   padding: 0;
index 9369e3b0bbd5a402b523e76cf2a1cee4abe3e386..bcca086387878dc9c572a3c037eb1885e4e43796
GIT binary patch
literal 2187
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
N002ovPDHLkV1mDZ8KVFI
--- a/browser/themes/winstripe/browser/jar.mn
+++ b/browser/themes/winstripe/browser/jar.mn
@@ -62,19 +62,16 @@ browser.jar:
         skin/classic/browser/places/libraryNavigation.png            (places/libraryNavigation.png)
         skin/classic/browser/places/libraryToolbar.png               (places/libraryToolbar.png)
         skin/classic/browser/places/starred48.png                    (places/starred48.png)
         skin/classic/browser/places/unstarred48.png                  (places/unstarred48.png)
         skin/classic/browser/places/tag.png                          (places/tag.png)
         skin/classic/browser/places/history.png                      (places/history.png)
         skin/classic/browser/places/allBookmarks.png                 (places/allBookmarks.png)
         skin/classic/browser/places/unsortedBookmarks.png            (places/unsortedBookmarks.png)
-        skin/classic/browser/places/importAndBackup.png              (places/importAndBackup.png)
-        skin/classic/browser/places/organize.png                     (places/organize.png)
-        skin/classic/browser/places/view.png                         (places/view.png)
         skin/classic/browser/places/searching_16.png                 (places/searching_16.png)
         skin/classic/browser/preferences/alwaysAsk.png               (preferences/alwaysAsk.png)
         skin/classic/browser/preferences/application.png             (preferences/application.png)
         skin/classic/browser/preferences/mail.png                    (preferences/mail.png)
         skin/classic/browser/preferences/Options.png                 (preferences/Options.png)
         skin/classic/browser/preferences/saveFile.png                (preferences/saveFile.png)
         skin/classic/browser/preferences/preferences.css             (preferences/preferences.css)
         skin/classic/browser/preferences/applications.css            (preferences/applications.css)
@@ -154,20 +151,17 @@ browser.jar:
         skin/classic/aero/browser/places/libraryNavigation.png       (places/libraryNavigation-aero.png)
         skin/classic/aero/browser/places/libraryToolbar.png          (places/libraryToolbar-aero.png)
         skin/classic/aero/browser/places/starred48.png               (places/starred48-aero.png)
         skin/classic/aero/browser/places/unstarred48.png             (places/unstarred48.png)
         skin/classic/aero/browser/places/tag.png                     (places/tag-aero.png)
         skin/classic/aero/browser/places/history.png                 (places/history-aero.png)
         skin/classic/aero/browser/places/allBookmarks.png            (places/allBookmarks-aero.png)
         skin/classic/aero/browser/places/unsortedBookmarks.png       (places/unsortedBookmarks-aero.png)
-        skin/classic/aero/browser/places/importAndBackup.png         (places/importAndBackup-aero.png)
-        skin/classic/aero/browser/places/view.png                    (places/view-aero.png)
         skin/classic/aero/browser/places/searching_16.png            (places/searching_16-aero.png)
-        skin/classic/aero/browser/places/organize.png                (places/organize-aero.png)
         skin/classic/aero/browser/preferences/alwaysAsk.png          (preferences/alwaysAsk-aero.png)
         skin/classic/aero/browser/preferences/application.png        (preferences/application-aero.png)
         skin/classic/aero/browser/preferences/mail.png               (preferences/mail-aero.png)
         skin/classic/aero/browser/preferences/Options.png            (preferences/Options-aero.png)
         skin/classic/aero/browser/preferences/plugin.png             (preferences/plugin-aero.png)
         skin/classic/aero/browser/preferences/saveFile.png           (preferences/saveFile-aero.png)
         skin/classic/aero/browser/preferences/preferences.css        (preferences/preferences.css)
         skin/classic/aero/browser/preferences/applications.css       (preferences/applications.css)
index b8197d87f232dd9b46786c4de7bdd4d3465568c8..7dd52b5cdece03174c599e9957489b58d07204d9
GIT binary patch
literal 1692
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
index 91aefceef89650b2385c32092ce4ef668aad885c..b424f2eb7a47bcb83bc24a0d431e383deeaacf88
GIT binary patch
literal 1966
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
An*aa+
deleted file mode 100644
index fdda51b2aad6eade24b9d3c4d5ac05d48227b617..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 4b8cd22bf325d9f25af6a7d11b80e587fab3d18e..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
index 63307cc6d1df92a156245a3ad40635f249cf0aa5..2ed627acbf65df90372ff855fb2d4f680893d9b1
GIT binary patch
literal 2217
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
deleted file mode 100644
index 8e7d62ecba0be982e26734af38057fda32079040..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index d9a1a106e2ba924485188bfeb0ba03f79b6cd434..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/themes/winstripe/browser/places/organizer.css
+++ b/browser/themes/winstripe/browser/places/organizer.css
@@ -93,29 +93,48 @@
   -moz-padding-end: 8px;
   background: url(chrome://global/skin/arrow/arrow-dn.gif) right center no-repeat;
 }
 
 #placesMenu > menu > .menubar-text:-moz-locale-dir(rtl) {
   background-position: left center;
 }
 
+/* organize, view and maintenance buttons icons */
+#organizeButton, 
+#viewMenu, 
+#maintenanceButton {
+  list-style-image: url("chrome://browser/skin/places/libraryToolbar.png");
+}
+
 /* organize button */
 #organizeButton {
-  list-style-image: url("chrome://browser/skin/places/organize.png");
+  -moz-image-region: rect(0px, 16px, 16px, 0px);
+}
+#organizeButton:hover,
+#organizeButton[open="true"] {
+  -moz-image-region: rect(16px, 16px, 32px, 0px);
 }
 
 /* view button */
 #viewMenu {
-  list-style-image: url("chrome://browser/skin/places/view.png");
+  -moz-image-region: rect(0px, 32px, 16px, 16px);
+}
+#viewMenu:hover,
+#viewMenu[open="true"] {
+  -moz-image-region: rect(16px, 32px, 32px, 16px);
 }
 
 /* maintenance button */
 #maintenanceButton {
-  list-style-image: url("chrome://browser/skin/places/importAndBackup.png");
+  -moz-image-region: rect(0px, 48px, 16px, 32px);
+}
+#maintenanceButton:hover,
+#maintenanceButton[open="true"] {
+  -moz-image-region: rect(16px, 48px, 32px, 32px);
 }
 
 /* Root View */
 #placesView {
   border-top: 1px solid ThreeDDarkShadow;
 }
 
 /* Place List, Place Content */
deleted file mode 100644
index a9beba9880e4e0c3e8287e12146ae7dbb57e5f5e..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 63982ef413109e2c37990341e43946848b2cc729..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/config/rules.mk
+++ b/config/rules.mk
@@ -357,16 +357,19 @@ else
 CXXFLAGS		+= -EHsc
 endif # _MSC_VER
 endif # GNU_CC
 endif # ENABLE_CXX_EXCEPTIONS
 endif # WINNT
 
 ifeq ($(SOLARIS_SUNPRO_CXX),1)
 CXXFLAGS += -features=extensions -D__FUNCTION__=__func__
+ifeq (86,$(findstring 86,$(OS_TEST)))
+OS_LDFLAGS += -M $(topsrcdir)/config/solaris_ia32.map
+endif # x86
 endif # Solaris Sun Studio C++
 
 ifeq (,$(filter-out WINNT WINCE,$(HOST_OS_ARCH)))
 HOST_PDBFILE=$(basename $(@F)).pdb
 endif
 
 ifndef TARGETS
 TARGETS			= $(LIBRARY) $(SHARED_LIBRARY) $(PROGRAM) $(SIMPLE_PROGRAMS) $(HOST_LIBRARY) $(HOST_PROGRAM) $(HOST_SIMPLE_PROGRAMS) $(JAVA_LIBRARY)
new file mode 100644
--- /dev/null
+++ b/config/solaris_ia32.map
@@ -0,0 +1,1 @@
+hwcap_1 = OVERRIDE;
--- a/config/utils.py
+++ b/config/utils.py
@@ -48,52 +48,67 @@ class LockFile(object):
   '''LockFile is used by the lockFile method to hold the lock.
 
   This object should not be used directly, but only through
   the lockFile method below.
   '''
   def __init__(self, lockfile):
     self.lockfile = lockfile
   def __del__(self):
-    os.remove(self.lockfile)
-
+    while True:
+      try:
+        os.remove(self.lockfile)
+        break
+      except OSError, e:
+        if e.errno == errno.EACCES:
+          # another process probably has the file open, we'll retry.
+          # just a short sleep since we want to drop the lock ASAP
+          # (but we need to let some other process close the file first)
+          time.sleep(0.1)
+        else:
+          # re-raise unknown errors
+          raise
 
 def lockFile(lockfile, max_wait = 600):
   '''Create and hold a lockfile of the given name, with the given timeout.
 
   To release the lock, delete the returned object.
   '''
   while True:
     try:
       fd = os.open(lockfile, os.O_EXCL | os.O_RDWR | os.O_CREAT)
       # we created the lockfile, so we're the owner
       break
     except OSError, e:
-      if e.errno != errno.EEXIST:
+      if e.errno == errno.EEXIST or \
+         (sys.platform == "win32" and e.errno == errno.EACCES):
+        pass
+      else:
         # should not occur
         raise
   
     try:
       # the lock file exists, try to stat it to get its age
       # and read its contents to report the owner PID
       f = open(lockfile, "r")
       s = os.stat(lockfile)
     except EnvironmentError, e:
-      if e.errno != errno.ENOENT:
-        sys.exit("%s exists but stat() failed: %s" %
-                 (lockfile, e.strerror))
-      # we didn't create the lockfile, so it did exist, but it's
-      # gone now. Just try again
-      continue
+      if e.errno == errno.ENOENT or \
+         (sys.platform == "win32" and e.errno == errno.EACCES):
+        # we didn't create the lockfile, so it did exist, but it's
+        # gone now. Just try again
+        continue
+      sys.exit("%s exists but stat() failed: %s" %
+               (lockfile, e.strerror))
   
     # we didn't create the lockfile and it's still there, check
     # its age
     now = int(time.time())
     if now - s[stat.ST_MTIME] > max_wait:
-      pid = f.readline()
+      pid = f.readline().rstrip()
       sys.exit("%s has been locked for more than " \
                "%d seconds (PID %s)" % (lockfile, max_wait,
                                         pid))
   
     # it's not been locked too long, wait a while and retry
     f.close()
     time.sleep(1)
   
--- a/content/base/public/nsIObjectLoadingContent.idl
+++ b/content/base/public/nsIObjectLoadingContent.idl
@@ -34,21 +34,23 @@
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
 #include "nsISupports.idl"
 
 interface nsIObjectFrame;
 interface nsIPluginInstance;
+interface nsIDOMElement;
+interface nsIDOMClientRect;
 
 /**
  * This interface represents a content node that loads objects.
  */
-[scriptable, uuid(90ab443e-3e99-405e-88c9-9c42adaa3217)]
+[scriptable, uuid(8afe3b08-293c-48bd-a997-321745478611)]
 interface nsIObjectLoadingContent : nsISupports
 {
   const unsigned long TYPE_LOADING  = 0;
   const unsigned long TYPE_IMAGE    = 1;
   const unsigned long TYPE_PLUGIN   = 2;
   const unsigned long TYPE_DOCUMENT = 3;
   const unsigned long TYPE_NULL     = 4;
 
@@ -100,9 +102,17 @@ interface nsIObjectLoadingContent : nsIS
   /**
    * Tells the content about an associated object frame.
    * This can be called multiple times for different frames.
    *
    * This is noscript because this is an internal method that will go away, and
    * because nsIObjectFrame is unscriptable.
    */
   [noscript] void hasNewFrame(in nsIObjectFrame aFrame);
+
+  /**
+   * Tells the object to paint directly in this location ignoring any
+   * positioning information that may have been provided otherwise
+   */
+  void setAbsoluteScreenPosition(in nsIDOMElement element,
+                                 in nsIDOMClientRect position,
+                                 in nsIDOMClientRect clip);
 };
--- a/content/base/src/nsDOMFileReader.cpp
+++ b/content/base/src/nsDOMFileReader.cpp
@@ -147,32 +147,33 @@ nsDOMFileReader::Notify(const char *aCha
 {
   CopyASCIItoUTF16(aCharset, mCharset);
   return NS_OK;
 }
 
 //nsDOMFileReader constructors/initializers
 
 nsDOMFileReader::nsDOMFileReader()
-  : mFileData(nsnull), mReadCount(0),
+  : mFileData(nsnull),
     mDataLen(0), mDataFormat(0),
     mReadyState(nsIDOMFileReader::EMPTY),
     mProgressEventWasDelayed(PR_FALSE),
     mTimerIsActive(PR_FALSE),
-    mReadTotal(0), mReadTransferred(0),
-    mReadComplete(PR_TRUE)
+    mReadTotal(0), mReadTransferred(0)
 {
   nsLayoutStatics::AddRef();
 }
 
 nsDOMFileReader::~nsDOMFileReader()
 {
   if (mListenerManager) 
     mListenerManager->Disconnect();
 
+  FreeFileData();
+
   nsLayoutStatics::Release();
 }
 
 nsresult
 nsDOMFileReader::Init()
 {
   // Set the original mScriptContext and mPrincipal, if available.
   // Get JSContext from stack.
@@ -290,35 +291,32 @@ nsDOMFileReader::Abort()
     return NS_OK;
 
   //Clear progress and file data
   mProgressEventWasDelayed = PR_FALSE;
   mTimerIsActive = PR_FALSE;
   if (mProgressNotifier) {
     mProgressNotifier->Cancel();
   }
-  mReadCount = 0;
-  mDataLen = 0;
 
   //Revert status, result and readystate attributes
   SetDOMStringToNull(mResult);
   mReadyState = nsIDOMFileReader::DONE;
   mError = new nsDOMFileError(nsIDOMFileError::ABORT_ERR);
     
   //Non-null channel indicates a read is currently active
   if (mChannel) {
     //Cancel request requires an error status
     mChannel->Cancel(NS_ERROR_FAILURE);
     mChannel = nsnull;
   }
   mFile = nsnull;
 
   //Clean up memory buffer
-  PR_Free(mFileData);
-  mFileData = nsnull;
+  FreeFileData();
 
   //Dispatch the abort event
   DispatchProgressEvent(NS_LITERAL_STRING(ABORT_STR));
   DispatchProgressEvent(NS_LITERAL_STRING(LOADEND_STR));
 
   mReadyState = nsIDOMFileReader::EMPTY;
 
   return NS_OK;
@@ -355,52 +353,73 @@ nsDOMFileReader::StartProgressEventTimer
 // nsIStreamListener
 
 NS_IMETHODIMP
 nsDOMFileReader::OnStartRequest(nsIRequest *request, nsISupports *ctxt)
 {
   return NS_OK;
 }
 
+static
+NS_METHOD
+ReadFuncBinaryString(nsIInputStream* in,
+                     void* closure,
+                     const char* fromRawSegment,
+                     PRUint32 toOffset,
+                     PRUint32 count,
+                     PRUint32 *writeCount)
+{
+  PRUnichar* dest = static_cast<PRUnichar*>(closure) + toOffset;
+  PRUnichar* end = dest + count;
+  const unsigned char* source = (const unsigned char*)fromRawSegment;
+  while (dest != end) {
+    *dest = *source;
+    ++dest;
+    ++source;
+  }
+  *writeCount = count;
+
+  return NS_OK;
+}
+
 NS_IMETHODIMP
 nsDOMFileReader::OnDataAvailable(nsIRequest *aRequest,
                                  nsISupports *aContext,
                                  nsIInputStream *aInputStream,
                                  PRUint32 aOffset,
                                  PRUint32 aCount)
 {
-  //Update memory buffer to reflect the contents of the file
-  mFileData = (char *)PR_Realloc(mFileData, aOffset + aCount);
-  NS_ENSURE_TRUE(mFileData, NS_ERROR_OUT_OF_MEMORY);
-
-  aInputStream->Read(mFileData + aOffset, aCount, &mReadCount);
-  mDataLen += aCount;
-  mReadTransferred = mDataLen;
-
-  //Continuously update our binary string as data comes in
   if (mDataFormat == FILE_AS_BINARY) {
+    //Continuously update our binary string as data comes in
+    NS_ASSERTION(mResult.Length() == aOffset,
+                 "unexpected mResult length");
     PRUint32 oldLen = mResult.Length();
-    PRUint32 newLen = oldLen + aCount;
-    PRUnichar *buf; 
+    PRUnichar *buf = nsnull;
+    mResult.GetMutableData(&buf, oldLen + aCount);
+    NS_ENSURE_TRUE(buf, NS_ERROR_OUT_OF_MEMORY);
 
-    if (mResult.GetMutableData(&buf, newLen) != newLen) {
-      return NS_ERROR_OUT_OF_MEMORY;
-    }
-
-    PRUnichar *bufEnd = buf + newLen;
-    buf += oldLen;
+    PRUint32 bytesRead = 0;
+    aInputStream->ReadSegments(ReadFuncBinaryString, buf + oldLen, aCount,
+                               &bytesRead);
+    NS_ASSERTION(bytesRead == aCount, "failed to read data");
+  }
+  else {
+    //Update memory buffer to reflect the contents of the file
+    mFileData = (char *)PR_Realloc(mFileData, aOffset + aCount);
+    NS_ENSURE_TRUE(mFileData, NS_ERROR_OUT_OF_MEMORY);
 
-    char *source = mFileData + aOffset;
-    while (buf < bufEnd) {
-      *buf = *source;
-      ++buf;
-      ++source;
-    }
+    PRUint32 bytesRead = 0;
+    aInputStream->Read(mFileData + aOffset, aCount, &bytesRead);
+    NS_ASSERTION(bytesRead == aCount, "failed to read data");
+
+    mDataLen += aCount;
   }
 
+  mReadTransferred += aCount;
+
   //Notify the timer is the appropriate timeframe has passed
   if (mTimerIsActive) {
     mProgressEventWasDelayed = PR_TRUE;
   }
   else {
     DispatchProgressEvent(NS_LITERAL_STRING(PROGRESS_STR));
     StartProgressEventTimer();
   }
@@ -425,16 +444,17 @@ nsDOMFileReader::OnStopRequest(nsIReques
     mProgressNotifier->Cancel();
   }
 
   //FileReader must be in DONE stage after a load
   mReadyState = nsIDOMFileReader::DONE;
 
   //Set the status field as appropriate
   if (NS_FAILED(aStatus)) {
+    FreeFileData();
     DispatchError(aStatus);
     return NS_OK;
   }
 
   nsresult rv;
   switch (mDataFormat) {
     case FILE_AS_BINARY:
       break; //Already accumulated mResult
@@ -443,16 +463,18 @@ nsDOMFileReader::OnStopRequest(nsIReques
       break;
     case FILE_AS_DATAURL:
       rv = GetAsDataURL(mFile, mFileData, mDataLen, mResult);
       break;
     default:
      return NS_ERROR_FAILURE;
   }
 
+  FreeFileData();
+
   //Dispatch load event to signify end of a successful load
   DispatchProgressEvent(NS_LITERAL_STRING(LOAD_STR));
   DispatchProgressEvent(NS_LITERAL_STRING(LOADEND_STR));
 
   return rv;
 }
 
 // Helper methods
@@ -461,36 +483,43 @@ nsresult
 nsDOMFileReader::ReadFileContent(nsIDOMFile* aFile,
                                  const nsAString &aCharset,
                                  PRUint32 aDataFormat)
 { 
   NS_ENSURE_TRUE(aFile, NS_ERROR_NULL_POINTER);
 
   //Implicit abort to clear any other activity going on
   Abort();
+  mError = nsnull;
+  SetDOMStringToNull(mResult);
+  mReadTransferred = 0;
+  mReadTotal = 0;
+  mReadyState = nsIDOMFileReader::EMPTY;
+  FreeFileData();
+
   mDataFormat = aDataFormat;
   mCharset = aCharset;
-  mError = nsnull;
 
   //Obtain the nsDOMFile's underlying nsIFile
   nsresult rv;
   nsCOMPtr<nsIDOMFileInternal> domFile(do_QueryInterface(aFile));
   rv = domFile->GetInternalFile(getter_AddRefs(mFile));
   NS_ENSURE_SUCCESS(rv, rv);
 
   //Establish a channel with our file
   nsCOMPtr<nsIURI> uri;
   rv = NS_NewFileURI(getter_AddRefs(uri), mFile);
   NS_ENSURE_SUCCESS(rv, rv);
 
   rv = NS_NewChannel(getter_AddRefs(mChannel), uri);
   NS_ENSURE_SUCCESS(rv, rv);
 
   //Obtain the total size of the file before reading
-  aFile->GetSize(&mReadTotal);
+  mReadTotal = -1;
+  mFile->GetFileSize(&mReadTotal);
 
   rv = mChannel->AsyncOpen(this, nsnull);
   NS_ENSURE_SUCCESS(rv, rv);
 
   //FileReader should be in loading state here
   mReadyState = nsIDOMFileReader::LOADING;
   DispatchProgressEvent(NS_LITERAL_STRING(LOADSTART_STR));
  
@@ -535,18 +564,18 @@ nsDOMFileReader::DispatchProgressEvent(c
 
   privevent->SetTrusted(PR_TRUE);
 
   nsCOMPtr<nsIDOMProgressEvent> progress = do_QueryInterface(event);
 
   if (!progress)
     return;
 
-  progress->InitProgressEvent(aType, PR_FALSE, PR_FALSE, mReadComplete,
-                              mReadTransferred, (mReadTotal == LL_MAXUINT) ? 0 : mReadTotal);
+  progress->InitProgressEvent(aType, PR_FALSE, PR_FALSE, mReadTotal >= 0,
+                              mReadTransferred, PR_MAX(mReadTotal, 0));
 
   this->DispatchDOMEvent(nsnull, event, nsnull, nsnull);
 }
 
 nsresult
 nsDOMFileReader::GetAsText(const nsAString &aCharset,
                            const char *aFileData,
                            PRUint32 aDataLen,
--- a/content/base/src/nsDOMFileReader.h
+++ b/content/base/src/nsDOMFileReader.h
@@ -55,16 +55,17 @@
 #include "nsIDOMFile.h"
 #include "nsIDOMFileReader.h"
 #include "nsIDOMFileList.h"
 #include "nsIDOMFileError.h"
 #include "nsIInputStream.h"
 #include "nsCOMPtr.h"
 #include "nsIStreamLoader.h"
 #include "nsIChannel.h"
+#include "prmem.h"
 
 #include "nsXMLHttpRequest.h"
 
 class nsDOMFileReader : public nsXHREventTarget,
                         public nsIDOMFileReader,
                         public nsIStreamListener,
                         public nsIInterfaceRequestor,
                         public nsSupportsWeakReference,
@@ -114,34 +115,38 @@ protected:
   nsresult GetAsText(const nsAString &aCharset,
                      const char *aFileData, PRUint32 aDataLen, nsAString &aResult);
   nsresult GetAsDataURL(nsIFile *aFile, const char *aFileData, PRUint32 aDataLen, nsAString &aResult); 
   nsresult GuessCharset(const char *aFileData, PRUint32 aDataLen, nsACString &aCharset); 
   nsresult ConvertStream(const char *aFileData, PRUint32 aDataLen, const char *aCharset, nsAString &aResult); 
   void DispatchError(nsresult rv);
   void StartProgressEventTimer();
 
+  void FreeFileData() {
+    PR_Free(mFileData);
+    mFileData = nsnull;
+    mDataLen = 0;
+  }
+
   char *mFileData;
   nsCOMPtr<nsIFile> mFile;
   nsString mCharset;
-  PRUint32 mReadCount;
   PRUint32 mDataLen;
   PRUint32 mDataFormat;
 
   nsString mResult;
   PRUint16 mReadyState;
 
   PRBool mProgressEventWasDelayed;
   PRBool mTimerIsActive;
   nsCOMPtr<nsIDOMFileError> mError;
 
   nsCOMPtr<nsITimer> mProgressNotifier;
   nsCOMPtr<nsIPrincipal> mPrincipal;
   nsCOMPtr<nsIChannel> mChannel;
 
-  PRUint64 mReadTotal;
+  PRInt64 mReadTotal;
   PRUint64 mReadTransferred;
-  PRPackedBool mReadComplete;
 
   nsRefPtr<nsDOMEventListenerWrapper> mOnLoadEndListener;
 };
 
 #endif
--- a/content/base/src/nsImageLoadingContent.cpp
+++ b/content/base/src/nsImageLoadingContent.cpp
@@ -595,16 +595,18 @@ nsImageLoadingContent::LoadImage(const n
 nsresult
 nsImageLoadingContent::LoadImage(nsIURI* aNewURI,
                                  PRBool aForce,
                                  PRBool aNotify,
                                  nsIDocument* aDocument,
                                  nsLoadFlags aLoadFlags)
 {
   if (!mLoadingEnabled) {
+    // XXX Why fire an error here? seems like the callers to SetLoadingEnabled
+    // don't want/need it.
     FireEvent(NS_LITERAL_STRING("error"));
     return NS_OK;
   }
 
   NS_ASSERTION(!aDocument || aDocument == GetOurDocument(),
                "Bogus document passed in");
   // First, get a document (needed for security checks and the like)
   if (!aDocument) {
--- a/content/base/src/nsObjectLoadingContent.cpp
+++ b/content/base/src/nsObjectLoadingContent.cpp
@@ -885,17 +885,16 @@ NS_IMETHODIMP
 nsObjectLoadingContent::GetInterface(const nsIID & aIID, void **aResult)
 {
   if (aIID.Equals(NS_GET_IID(nsIChannelEventSink))) {
     nsIChannelEventSink* sink = this;
     *aResult = sink;
     NS_ADDREF(sink);
     return NS_OK;
   }
-
   return NS_NOINTERFACE;
 }
 
 // nsIChannelEventSink
 NS_IMETHODIMP
 nsObjectLoadingContent::OnChannelRedirect(nsIChannel *aOldChannel,
                                           nsIChannel *aNewChannel,
                                           PRUint32    aFlags)
@@ -1867,8 +1866,22 @@ nsObjectLoadingContent::GetPluginDisable
   }
   nsresult rv = host->IsPluginEnabledForType(aContentType.get());
   if (rv == NS_ERROR_PLUGIN_DISABLED)
     return ePluginDisabled;
   if (rv == NS_ERROR_PLUGIN_BLOCKLISTED)
     return ePluginBlocklisted;
   return ePluginUnsupported;
 }
+
+NS_IMETHODIMP
+nsObjectLoadingContent::SetAbsoluteScreenPosition(nsIDOMElement* element,
+                                                  nsIDOMClientRect* position,
+                                                  nsIDOMClientRect* clip)
+{
+  nsIObjectFrame* frame = GetExistingFrame(eFlushLayout);
+  if (!frame)
+    return NS_ERROR_NOT_AVAILABLE;
+
+  return frame->SetAbsoluteScreenPosition(element, position, clip);
+}
+
+
--- a/content/base/src/nsScriptLoader.cpp
+++ b/content/base/src/nsScriptLoader.cpp
@@ -504,25 +504,16 @@ nsScriptLoader::ProcessScriptElement(nsI
     if (i != nsTArray<PreloadInfo>::NoIndex) {
       request = mPreloads[i].mRequest;
       request->mElement = aElement;
       request->mJSVersion = version;
       request->mDefer = mDeferEnabled && aElement->GetScriptDeferred() &&
         !aElement->GetScriptAsync();
       mPreloads.RemoveElementAt(i);
 
-      if (nsContentUtils::GetBoolPref("content.scriptloader.logloads")) {
-        nsCString spec;
-        request->mURI->GetSpec(spec);
-        printf("Grabbing existing speculative load for %s (%p). async:%d defer:%d\n",
-               spec.get(), request.get(), aElement->GetScriptAsync(),
-               request->mDefer);
-      }
-
-
       rv = CheckContentPolicy(mDocument, aElement, request->mURI, type);
       if (NS_FAILED(rv)) {
         // Note, we're dropping our last ref to request here.
         return rv;
       }
 
       // Can we run the script now?
       // This is true if we're done loading, the script isn't deferred and
@@ -562,40 +553,28 @@ nsScriptLoader::ProcessScriptElement(nsI
   // First check to see if this is an external script
   if (scriptURI) {
     request->mDefer = mDeferEnabled && aElement->GetScriptDeferred() &&
       !aElement->GetScriptAsync();
     request->mURI = scriptURI;
     request->mIsInline = PR_FALSE;
     request->mLoading = PR_TRUE;
 
-    if (nsContentUtils::GetBoolPref("content.scriptloader.logloads")) {
-      nsCString spec;
-      request->mURI->GetSpec(spec);
-      printf("Starting normal load for %s (%p). async:%d defer:%d\n",
-             spec.get(), request.get(), aElement->GetScriptAsync(),
-             request->mDefer);
-    }
-
     rv = StartLoad(request, type);
     if (NS_FAILED(rv)) {
       return rv;
     }
   } else {
     request->mDefer = PR_FALSE;
     request->mLoading = PR_FALSE;
     request->mIsInline = PR_TRUE;
     request->mURI = mDocument->GetDocumentURI();
 
     request->mLineNo = aElement->GetScriptLineNumber();
 
-    if (nsContentUtils::GetBoolPref("content.scriptloader.logloads")) {
-      printf("Creating inline request (%p).\n", request.get());
-    }
-
     // If we've got existing pending requests, add ourselves
     // to this list.
     if (!hadPendingRequests && ReadyToExecuteScripts() &&
         nsContentUtils::IsSafeToRunScript()) {
       return ProcessRequest(request);
     }
   }
 
@@ -625,20 +604,16 @@ nsScriptLoader::ProcessRequest(nsScriptL
 {
   NS_ASSERTION(ReadyToExecuteScripts() && nsContentUtils::IsSafeToRunScript(),
                "Caller forgot to check ReadyToExecuteScripts()");
 
   NS_ENSURE_ARG(aRequest);
   nsAFlatString* script;
   nsAutoString textData;
 
-  if (nsContentUtils::GetBoolPref("content.scriptloader.logloads")) {
-    printf("Running request (%p).\n", aRequest);
-  }
-
   // If there's no script text, we try to get it from the element
   if (aRequest->mIsInline) {
     // XXX This is inefficient - GetText makes multiple
     // copies.
     aRequest->mElement->GetScriptText(textData);
 
     script = &textData;
   }
@@ -979,23 +954,16 @@ nsScriptLoader::OnStreamComplete(nsIStre
                                  nsresult aStatus,
                                  PRUint32 aStringLen,
                                  const PRUint8* aString)
 {
   nsScriptLoadRequest* request = static_cast<nsScriptLoadRequest*>(aContext);
   NS_ASSERTION(request, "null request in stream complete handler");
   NS_ENSURE_TRUE(request, NS_ERROR_FAILURE);
 
-  if (nsContentUtils::GetBoolPref("content.scriptloader.logloads")) {
-    nsCString spec;
-    request->mURI->GetSpec(spec);
-    printf("Finished loading %s (%p). status:%d\n", spec.get(), request,
-           aStatus);
-  }
-
   nsresult rv = PrepareLoadedRequest(request, aLoader, aStatus, aStringLen,
                                      aString);
   if (NS_FAILED(rv)) {
     if (mRequests.RemoveObject(request) ||
         mAsyncRequests.RemoveObject(request)) {
       FireScriptAvailable(rv, request);
     } else {
       mPreloads.RemoveElement(request, PreloadRequestComparator());
@@ -1139,24 +1107,16 @@ nsScriptLoader::PreloadURI(nsIURI *aURI,
     return;
   }
 
   request->mURI = aURI;
   request->mIsInline = PR_FALSE;
   request->mLoading = PR_TRUE;
   request->mDefer = PR_FALSE; // This is computed later when we go to execute the
                               // script.
-
-  if (nsContentUtils::GetBoolPref("content.scriptloader.logloads")) {
-    nsCString spec;
-    request->mURI->GetSpec(spec);
-    printf("Starting speculative load for %s (%p).\n", spec.get(),
-           request.get());
-  }
-
   nsresult rv = StartLoad(request, aType);
   if (NS_FAILED(rv)) {
     return;
   }
 
   PreloadInfo *pi = mPreloads.AppendElement();
   pi->mRequest = request;
   pi->mCharset = aCharset;
--- a/content/base/test/file_bug503481b_inner.html
+++ b/content/base/test/file_bug503481b_inner.html
@@ -1,55 +1,35 @@
 <!DOCTYPE HTML>
 <html>
 <head>
 <!-- Async script that isn't preloaded -->
 <script async src="file_bug503481.sjs?blockOn=R&body=runFirst();"></script>
 <script>
-function enableLogs(b) {
-  netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-  var prefs = Components.classes["@mozilla.org/preferences-service;1"]
-              .getService(Components.interfaces.nsIPrefBranch);
-  prefs.setBoolPref("content.scriptloader.logloads", b);
-}
-enableLogs(true);
 firstRan = false;
 secondRan = false;
 thirdRan = false;
 forthRan = false;
-fifthRan = false;
-sixthRan = false;
 function runFirst() {
   firstRan = true;
 }
 function runThird() {
   parent.is(forthRan, false, "forth should still be blocked");
   unblock("T");
   thirdRan = true;
 }
 function runForth() {
   forthRan = true;
 }
-function runFifth() {
-  parent.is(sixthRan, false, "sixth should be not run before non-async fifth");
-  fifthRan = true;
-}
-function runSixth() {
-  parent.is(fifthRan, true, "fifth should run before async sixth");
-  sixthRan = true;
-}
 
 function done() {
   parent.is(firstRan, true, "first should have run by onload");
   parent.is(secondRan, true, "second should have run by onload");
   parent.is(thirdRan, true, "third should have run by onload");
   parent.is(forthRan, true, "forth should have run by onload");
-  parent.is(fifthRan, true, "fifth should have run by onload");
-  parent.is(sixthRan, true, "sixth should have run by onload");
-  enableLogs(false);
   parent.SimpleTest.finish();
 }
 
 var reqs = [];
 function unblock(s) {
   xhr = new XMLHttpRequest();
   xhr.open("GET", "file_bug503481.sjs?unblock=" + s);
   xhr.send();
@@ -60,34 +40,23 @@ function unblock(s) {
 parent.is(firstRan, false, "First async script shouldn't have run");
 unblock("R");
 </script>
 
 <!-- test that inline async isn't actually async -->
 <script async>
 secondRan = true;
 </script>
-<script async>
+<script>
 parent.is(secondRan, true, "Second script shouldn't be async");
 </script>
 
 <!-- test that setting both defer and async treats the script as async -->
 <script defer async src="file_bug503481.sjs?blockOn=S&body=runThird();"></script>
 <script>
 parent.is(thirdRan, false, "third should not have run yet");
 unblock("S");
 </script>
 <script src="file_bug503481.sjs?blockOn=T&body=runForth();"></script>
 
-<!-- test that preloading an async script works -->
-<script>
-setTimeout(function () { unblock("U"); }, 1000);
-</script>
-<script src="file_bug503481.sjs?blockOn=U&body=runFifth();"></script>
-<script async src="file_bug503481.sjs?blockOn=V&body=runSixth();"></script>
-<script>
-parent.is(fifthRan, true, "fifth should have run by now");
-parent.is(sixthRan, false, "sixth should not have run yet");
-unblock("V");
-</script>
 </head>
 
 <body onload="done()">
--- a/content/base/test/test_fileapi.html
+++ b/content/base/test/test_fileapi.html
@@ -15,289 +15,329 @@ https://bugzilla.mozilla.org/show_bug.cg
 <p id="display">
   <input id="fileList" type="file"></input>
 </p>
 <div id="content" style="display: none">
 </div>
 
 <pre id="test">
 <script class="testbody" type="text/javascript">
-
-var testCounter = 0;
+const minFileSize = 20000;
+var fileNum = 1;
+var testRanCounter = 0;
+var expectedTestCount = 0;
 SimpleTest.waitForExplicitFinish();
 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
 
-// Write a test file > 8192 characters
-
 is(FileReader.EMPTY, 0, "correct EMPTY value");
 is(FileReader.LOADING, 1, "correct LOADING value");
 is(FileReader.DONE, 2, "correct DONE value");
 
-var testData = "asdfblahqwer";
-for (var i = 0; i < 10; i++) {
-  testData = testData + testData;
+// Create strings containing data we'll test with. We'll want long
+// strings to ensure they span multiple buffers while loading
+var testTextData = "asd b\tlah\u1234w\u00a0r";
+while (testTextData.length < minFileSize) {
+  testTextData = testTextData + testTextData;
 }
-var testData2 = testData + "a";
-var testData3 = testData + "as";
-
-//Ensure we have different sizes of data for thoroughly testing data URI retrieval
-is(testData.length % 3, 0, "Need to have data length % 3 == 0");
-is(testData2.length % 3, 1, "Need to have data length % 3 == 1");
-is(testData3.length % 3, 2, "Need to have data lenght % 3 == 2");
-
-//Create UTF data that should be the same for UTF-16
-var utf16Data = "\0a\0s\0d\0f\0b\0l\0a\0h\0q\0w\0e\0r";
-for (var i = 0; i < 10; i++) {
-  utf16Data = utf16Data + utf16Data;
-}
-var utf16File = createFileWithData(utf16Data, "01");
-
-//Create UTF data that should be the same for UTF-32
-var utf32Data = "\0\0\0a\0\0\0s\0\0\0d\0\0\0f\0\0\0b\0\0\0l\0\0\0a\0\0\0h\0\0\0q\0\0\0w\0\0\0e\0\0\0r";
-for (var i = 0; i < 10; i++) {
-  utf32Data = utf32Data + utf32Data;
-}
-var utf32File = createFileWithData(utf32Data, "001");
 
-//Obtain a variety of encodings so we can test async return values
-var file = createFileWithData(testData, "00");
-var domFileData = file.getAsDataURL();
-var domFileBinary = file.getAsBinary();
-
-var domFileBinary2 = utf16File.getAsBinary();
-var domFileBinary3 = utf32File.getAsBinary();
-
-var request1 = new FileReader();
-is(request1.readyState, FileReader.EMPTY, "correct initial readyState");
-request1.onload = handleTextISO1;
-request1.readAsText(file, "iso-8859-1");
-is(request1.readyState, FileReader.LOADING, "correct loading readyState");
-
-var request2 = new FileReader();
-request2.onload = handleTextUTF8;
-request2.readAsText(file);
-
-var request3 = new FileReader();
-request3.onload = handleTextUTF8;
-request3.readAsText(file, "");
-
-var request4 = new FileReader();
-request4.onload = handleTextUTF8;
-request4.readAsText(file, "UTF-8");
+var testASCIIData = "abcdef 123456\n";
+while (testASCIIData.length < minFileSize) {
+  testASCIIData = testASCIIData + testASCIIData;
+}
 
-//Test a variety of encodings, and make sure they work properly
-//Also, test a variety of the same calls with different numbers of arguments
-var request5 = new FileReader();
-request5.onload = handleTextUTF16;
-request5.readAsText(utf16File, "UTF-16");
-
-var request6 = new FileReader();
-request6.onload = handleTextUTF32;
-request6.readAsText(utf32File, "UTF-32");
-
-//Test binary data accessor
-var request7 = new FileReader();
-is(request7.readyState, FileReader.EMPTY, "correct initial readyState");
-request7.onload = handleDataBinary;
-request7.readAsBinaryString(file);
-is(request7.readyState, FileReader.LOADING, "correct loading readyState");
-
-var request71 = new FileReader();
-request71.onload = handleDataBinary16;
-request71.readAsBinaryString(utf16File);
-
-var request72 = new FileReader();
-request72.onload = handleDataBinary32;
-request72.readAsBinaryString(utf32File);
-
-//Test data URI encoding on differing file sizes
-//Testing data URI when length % 3 == 0
-var request8 = new FileReader();
-request8.onload = handleDataURI;
-request8.readAsDataURL(file);
+var testBinaryData = "";
+for (var i = 0; i < 256; i++) {
+  testBinaryData += String.fromCharCode(i);
+}
+while (testBinaryData.length < minFileSize) {
+  testBinaryData = testBinaryData + testBinaryData;
+}
 
-//Testing data URI when length % 3 == 1
-var file2 = createFileWithData(testData2, "02");
-var domFileData1 = file2.getAsDataURL();
 
-var request9 = new FileReader();
-request9.onload = handleDataURI1;
-request9.readAsDataURL(file2);
-
-//Testing data URI when length % 3 == 2
-var file3 = createFileWithData(testData3, "03");
-var domFileData2 = file3.getAsDataURL();
-
-var request10 = new FileReader();
-request10.onload = handleDataURI2;
-request10.readAsDataURL(file3);
-
-//Test asynchronous property of file access
-var globalVar = 0;
-var request105 = new FileReader();
-request105.onload = incGlobalVar;
-request105.readAsText(file, "");
-is(globalVar, 0, "testing to make sure getAsText doesn't block subsequent execution");
-
-//Create second file for testing cancelReads()
-var dirSvc = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties);
-var testFile4 = dirSvc.get("ProfD", Components.interfaces.nsIFile);
-testFile4.append("testfile04");
-var outStream4 = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
-outStream4.init(testFile4, 0x02 | 0x08 | 0x20, 0666, 0);
-outStream4.write(testData, testData.length);
-outStream4.close();
+//Set up files for testing
+var asciiFile = createFileWithData(testASCIIData);
+var binaryFile = createFileWithData(testBinaryData);
 
 var fileList = document.getElementById('fileList');
-fileList.value = testFile4.path;
-var file4 = fileList.files[0];
+fileList.value = "/none/existing/path/fileAPI/testing";
+var nonExistingFile = fileList.files[0];
 
-var request11 = new FileReader();
-request11.onabort = handleCancel;
-request11.readAsText(file4);
-request11.abort();
+// Test that plain reading works and fires events as expected, both
+// for text and binary reading
+var onloadHasRunText = false;
+var onloadStartHasRunText = false;
+r = new FileReader();
+is(r.readyState, FileReader.EMPTY, "correct initial text readyState");
+r.onload = getLoadHandler(testASCIIData, testASCIIData.length, "plain reading");
+r.addEventListener("load", function() { onloadHasRunText = true }, false);
+r.addEventListener("loadstart", function() { onloadStartHasRunText = true }, false);
+r.readAsText(asciiFile);
+is(r.readyState, FileReader.LOADING, "correct loading text readyState");
+is(onloadHasRunText, false, "text loading must be async");
+is(onloadStartHasRunText, true, "text loadstart should fire sync");
+expectedTestCount++;
 
-//Test error handling - Note: currently throws exceptions
-/*testFile4.permissions = 0;
-var request12 = new FileReader();
-request12.onerror = handleSecurityError;
-request12.readAsText(file4, "");
+var onloadHasRunBinary = false;
+var onloadStartHasRunBinary = false;
+r = new FileReader();
+is(r.readyState, FileReader.EMPTY, "correct initial binary readyState");
+r.addEventListener("load", function() { onloadHasRunBinary = true }, false);
+r.addEventListener("loadstart", function() { onloadStartHasRunBinary = true }, false);
+r.readAsBinaryString(binaryFile);
+r.onload = getLoadHandler(testBinaryData, testBinaryData.length, "binary reading");
+is(r.readyState, FileReader.LOADING, "correct loading binary readyState");
+is(onloadHasRunBinary, false, "binary loading must be async");
+is(onloadStartHasRunBinary, true, "binary loadstart should fire sync");
+expectedTestCount++;
 
-testFile4.remove(false);
-var request13 = new FileReader();
-request13.onerror = handleNotFoundError;
-request13.readAsText(file4, "");*/
 
-//Corresponding callback functions
-function incGlobalVar(fileAsText) {
-  globalVar++;
-}
+// Test a variety of encodings, and make sure they work properly
+r = new FileReader();
+r.onload = getLoadHandler(testASCIIData, testASCIIData.length, "no encoding reading");
+r.readAsText(asciiFile, "");
+expectedTestCount++;
+
+r = new FileReader();
+r.onload = getLoadHandler(testASCIIData, testASCIIData.length, "iso8859 reading");
+r.readAsText(asciiFile, "iso-8859-1");
+expectedTestCount++;
 
-function handleCancel(event) {
-  var fileAsText = event.target.result;
-  var error = event.target.error;
-  is(error.code, FileError.ABORT_ERR, "error code set to CANCELED for canceled reads");
-  is(fileAsText, null, "file data should be null on canceled reads");
-  testHasRun();
-}
+r = new FileReader();
+r.onload = getLoadHandler(testTextData,
+                          convertToUTF8(testTextData).length,
+                          "utf8 reading");
+r.readAsText(createFileWithData(convertToUTF8(testTextData)), "utf8");
+expectedTestCount++;
 
-function handleTextISO1(event) {
-  is(event.target.readyState, FileReader.DONE, "correct final readyState");
-  var fileAsText = event.target.result;
-  var error = event.target.error;
-  is(error, null, "error code set to null for successful data accesses");
-  is(testData.length, fileAsText.length, "iso-1 async length should match testdata");
-  is(testData, fileAsText, "iso-1 async string result should match testdata");
-  testHasRun();
-}
+r = new FileReader();
+r.readAsText(createFileWithData(convertToUTF16(testTextData)), "utf-16");
+r.onload = getLoadHandler(testTextData,
+                          convertToUTF16(testTextData).length,
+                          "utf16 reading");
+expectedTestCount++;
+
+r = new FileReader();
+r.onload = getLoadHandler(testTextData,
+                          convertToUTF32(testTextData).length,
+                          "utf32 reading");
+r.readAsText(createFileWithData(convertToUTF32(testTextData)), "UTF-32");
+expectedTestCount++;
+
 
-function handleTextUTF8(event) {
-  var fileAsUTF8 = event.target.result;
-  var error = event.target.error;
-  is(error, null, "error code set to null for successful data accesses");
-  is(testData.length, fileAsUTF8.length, "UTF-8 async length should match testdata");
-  is(testData, fileAsUTF8, "UTF-8 async string result should match testdata");
-  testHasRun();
-}
+// Test reusing a FileReader to read multiple times
+r = new FileReader();
+r.onload = getLoadHandler(testASCIIData,
+                          testASCIIData.length,
+                          "to-be-reused reading text")
+var makeAnotherReadListener = function(event) {
+  r = event.target;
+  r.removeEventListener("load", makeAnotherReadListener, false);
+  r.onload = getLoadHandler(testASCIIData,
+                            testASCIIData.length,
+                            "reused reading text");
+  r.readAsText(asciiFile);
+};
+r.addEventListener("load", makeAnotherReadListener, false);
+r.readAsText(asciiFile);
+expectedTestCount += 2;
 
-function handleTextUTF16(event) {
-  var fileAsUTF16 = event.target.result;
-  var error = event.target.error;
-  is(error, null, "error code set to SUCCESS for successful data accesses");
-  is(testData.length, fileAsUTF16.length, "UTF-16 async length should match testdata");
-  is(testData, fileAsUTF16, "UTF-16 async string result should match testdata");
-  testHasRun();
-}
+r = new FileReader();
+r.onload = getLoadHandler(testBinaryData,
+                          testBinaryData.length,
+                          "to-be-reused reading binary")
+var makeAnotherReadListener2 = function(event) {
+  r = event.target;
+  r.removeEventListener("load", makeAnotherReadListener2, false);
+  r.onload = getLoadHandler(testBinaryData,
+                            testBinaryData.length,
+                            "reused reading binary");
+  r.readAsBinaryString(binaryFile);
+};
+r.addEventListener("load", makeAnotherReadListener2, false);
+r.readAsBinaryString(binaryFile);
+expectedTestCount += 2;
 
-function handleTextUTF32(event) {
-  var fileAsUTF32 = event.target.result;
-  var error = event.target.error;
-  is(error, null, "error code set to SUCCESS for successful data accesses");
-  is(testData.length, fileAsUTF32.length, "UTF-32 async length should match testdata");
-  is(testData, fileAsUTF32, "UTF-32 async string result should match testdata");
-  testHasRun();
-}
+r = new FileReader();
+r.onload = getLoadHandler(convertToDataURL(testBinaryData),
+                          testBinaryData.length,
+                          "to-be-reused reading data url")
+var makeAnotherReadListener3 = function(event) {
+  r = event.target;
+  r.removeEventListener("load", makeAnotherReadListener3, false);
+  r.onload = getLoadHandler(convertToDataURL(testBinaryData),
+                            testBinaryData.length,
+                            "reused reading data url");
+  r.readAsDataURL(binaryFile);
+};
+r.addEventListener("load", makeAnotherReadListener3, false);
+r.readAsDataURL(binaryFile);
+expectedTestCount += 2;
+
 
-//Tests dataURI.length % 3 == 0
-function handleDataURI(event) {
-  var fileAsDataURI = event.target.result;
-  is(domFileData.length, fileAsDataURI.length, "data URI async length should match dom file data");
-  is(domFileData, fileAsDataURI, "data URI async string result should match dom file data");
-  testHasRun();
-}
+//Test data-URI encoding on differing file sizes
+dataurldata = testBinaryData.substr(0, testBinaryData.length -
+                                       testBinaryData.length % 3);
+is(dataurldata.length % 3, 0, "Want to test data with length % 3 == 0");
+r = new FileReader();
+r.onload = getLoadHandler(convertToDataURL(dataurldata),
+                          dataurldata.length,
+                          "dataurl reading, %3 = 0");
+r.readAsDataURL(createFileWithData(dataurldata));
+expectedTestCount++;
 
-//Tests dataURI.length % 3 == 1
-function handleDataURI1(event) {
-  var fileAsDataURI = event.target.result;
-  is(domFileData1.length, fileAsDataURI.length, "data URI async length should match dom file data1");
-  is(domFileData1, fileAsDataURI, "data URI async string result should match dom file data1");
-  testHasRun();
-}
+dataurldata = testBinaryData.substr(0, testBinaryData.length - 2 -
+                                       testBinaryData.length % 3);
+is(dataurldata.length % 3, 1, "Want to test data with length % 3 == 1");
+r = new FileReader();
+r.onload = getLoadHandler(convertToDataURL(dataurldata),
+                          dataurldata.length,
+                          "dataurl reading, %3 = 1");
+r.readAsDataURL(createFileWithData(dataurldata));
+expectedTestCount++;
 
-//Tests dataURI.length % 3 == 2
-function handleDataURI2(event) {
-  var fileAsDataURI = event.target.result;
-  is(domFileData2.length, fileAsDataURI.length, "data URI async length should match dom file data2");
-  is(domFileData2, fileAsDataURI, "data URI async string result should match dom file data2");
-  testHasRun();
-}
+dataurldata = testBinaryData.substr(0, testBinaryData.length - 1 -
+                                       testBinaryData.length % 3);
+is(dataurldata.length % 3, 2, "Want to test data with length % 3 == 2");
+r = new FileReader();
+r.onload = getLoadHandler(convertToDataURL(dataurldata),
+                          dataurldata.length,
+                          "dataurl reading, %3 = 2");
+r.readAsDataURL(createFileWithData(dataurldata));
+expectedTestCount++;
+
 
-function handleDataBinary(event) {
-  is(event.target.readyState, FileReader.DONE, "correct final readyState");
-  var fileAsBinary = event.target.result;
-  is(domFileBinary.length, fileAsBinary.length, "binary data async length should match dom file binary");
-  is(domFileBinary, fileAsBinary, "binary data async string result should match dom file binary");
-  testHasRun();
+// Test abort()
+var abortHasRun = false;
+var loadEndHasRun = false;
+r = new FileReader();
+r.onabort = function (event) {
+  is(abortHasRun, false, "abort should only fire once");
+  is(loadEndHasRun, false, "loadend shouldn't have fired yet");
+  abortHasRun = true;
+  is(event.target.readyState, FileReader.DONE, "should be DONE while firing onabort");
+  is(event.target.error.code, FileError.ABORT_ERR, "error code set to ABORT for aborted reads");
+  is(event.target.result, null, "file data should be null on aborted reads");
 }
-
-function handleDataBinary16(event) {
-  var fileAsBinary = event.target.result;
-  is(domFileBinary2.length, fileAsBinary.length, "binary data async length should match dom file binary16");
-  is(domFileBinary2, fileAsBinary, "binary data async string result should match dom file binary16");
-  testHasRun();
+r.onloadend = function (event) {
+  is(abortHasRun, true, "abort should fire before loadend");
+  is(loadEndHasRun, false, "loadend should only fire once");
+  loadEndHasRun = true;
+  is(event.target.readyState, FileReader.DONE, "should be DONE while firing onabort");
+  is(event.target.error.code, FileError.ABORT_ERR, "error code set to ABORT for aborted reads");
+  is(event.target.result, null, "file data should be null on aborted reads");
 }
+r.onload = function() { ok(false, "load should not fire for aborted reads") };
+r.onerror = function() { ok(false, "error should not fire for aborted reads") };
+r.onprogress = function() { ok(false, "progress should not fire for aborted reads") };
+r.abort();
+is(abortHasRun, false, "abort() is a no-op unless loading");
+r.readAsText(asciiFile);
+r.abort();
+is(abortHasRun, true, "abort should fire sync");
+is(loadEndHasRun, true, "loadend should fire sync");
 
-function handleDataBinary32(event) {
-  var fileAsBinary = event.target.result;
-  is(domFileBinary3.length, fileAsBinary.length, "binary data async length should match dom file binary32");
-  is(domFileBinary3, fileAsBinary, "binary data async string result should match dom file binary32");
-  testHasRun();
+// Test calling readAsX to cause abort()
+var reuseAbortHasRun = false;
+r = new FileReader();
+r.onabort = function (event) {
+  is(reuseAbortHasRun, false, "abort should only fire once");
+  reuseAbortHasRun = true;
+  is(event.target.readyState, FileReader.DONE, "should be DONE while firing onabort");
+  is(event.target.error.code, FileError.ABORT_ERR, "error code set to ABORT for aborted reads");
+  is(event.target.result, null, "file data should be null on aborted reads");
 }
+r.onload = function() { ok(false, "load should not fire for aborted reads") };
+r.abort();
+is(reuseAbortHasRun, false, "abort() is a no-op unless loading");
+r.readAsText(asciiFile);
+r.readAsText(asciiFile);
+is(reuseAbortHasRun, true, "abort should fire sync");
+r.onload = getLoadHandler(testASCIIData, testASCIIData.length, "reuse-as-abort reading");
+expectedTestCount++;
+
 
-function handleSecurityError(event) {
-  var fileAsText = event.target.result;
-  var error = event.target.error;
-  is(error.code, FileError.SECURITY_ERR, "code for file security error should have value 18");
-  is(fileAsText, null, "file content should be null when error is encountered");
-  testHasRun();
+// Test reading from non-existing files
+r = new FileReader();
+var didThrow = false;
+try {
+  r.readAsDataURL(nonExistingFile);
+} catch(ex) {
+  didThrow = true;
 }
+// Once this test passes, we shoud test that onerror gets called and
+// that the FileReader object is in the right state during that call.
+todo(!didThrow, "shouldn't throw when opening non-existing file, should fire error instead");
 
-function handleNotFoundError(event) {
-  var fileAsText = event.target.result;
-  var error = event.target.error;
-  is(error.code, FileError.NOT_FOUND_ERR, "code for file not found error should have value 8");
-  is(fileAsText, null, "file content should be null when error is encountered");
-  testHasRun();
+
+function getLoadHandler(expectedResult, expectedLength, testName) {
+  return function (event) {
+    is(event.target.readyState, FileReader.DONE,
+       "readyState in test " + testName);
+    is(event.target.error, null,
+       "no error in test " + testName);
+    is(event.target.result, expectedResult,
+       "result in test " + testName);
+    is(event.lengthComputable, true,
+       "lengthComputable in test " + testName);
+    is(event.loaded, expectedLength,
+       "lengthComputable in test " + testName);
+    is(event.total, expectedLength,
+       "lengthComputable in test " + testName);
+    testHasRun();
+  }
 }
 
 function testHasRun() {
-  if (++testCounter == 13) SimpleTest.finish();
+ //alert(testRanCounter);
+ ++testRanCounter;
+ if (testRanCounter == expectedTestCount) {
+    is(onloadHasRunText, true, "onload text should have fired by now"); 
+    is(onloadHasRunBinary, true, "onload binary should have fired by now"); 
+    SimpleTest.finish();
+  }
 }
 
-function createFileWithData(fileData, fileNum) {
+function createFileWithData(fileData) {
   var dirSvc = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties);
   var testFile = dirSvc.get("ProfD", Components.interfaces.nsIFile);
-  testFile.append("testfile" + fileNum);
+  testFile.append("fileAPItestfile" + fileNum);
+  fileNum++;
   var outStream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
   outStream.init(testFile, 0x02 | 0x08 | 0x20, // write, create, truncate
                  0666, 0);
   outStream.write(fileData, fileData.length);
   outStream.close();
 
   var fileList = document.getElementById('fileList');
   fileList.value = testFile.path;
 
   return fileList.files[0];
 }
 
+function convertToUTF16(s) {
+  res = "";
+  for (var i = 0; i < s.length; ++i) {
+    c = s.charCodeAt(i);
+    res += String.fromCharCode(c >>> 8, c & 255);
+  }
+  return res;
+}
+
+function convertToUTF32(s) {
+  res = "";
+  for (var i = 0; i < s.length; ++i) {
+    c = s.charCodeAt(i);
+    res += "\0\0" + String.fromCharCode(c >>> 8, c & 255);
+  }
+  return res;
+}
+
+function convertToUTF8(s) {
+  return unescape(encodeURIComponent(s));
+}
+
+function convertToDataURL(s) {
+  return "data:application/octet-stream;base64," + btoa(s);
+}
+
 </script>
 </pre>
 </body> </html>
--- a/content/html/content/src/nsHTMLFormElement.cpp
+++ b/content/html/content/src/nsHTMLFormElement.cpp
@@ -2021,37 +2021,47 @@ nsFormControlList::AddElementToTable(nsG
       NS_ENSURE_TRUE(nodeList, NS_ERROR_FAILURE);
 
       // Upcast, uggly, but it works!
       nsBaseContentList *list = static_cast<nsBaseContentList *>
                                            ((nsIDOMNodeList *)nodeList.get());
 
       NS_ASSERTION(list->Length() > 1,
                    "List should have been converted back to a single element");
-      
+
+      // Fast-path appends; this check is ok even if the child is
+      // already in the list, since if it tests true the child would
+      // have come at the end of the list, and the PositionIsBefore
+      // will test false.
       if(nsContentUtils::PositionIsBefore(list->GetNodeAt(list->Length() - 1), aChild)) {
-          list->AppendElement(aChild);
-          return NS_OK;
+        list->AppendElement(aChild);
+        return NS_OK;
+      }
+
+      // If a control has a name equal to its id, it could be in the
+      // list already.
+      if (list->IndexOf(aChild) != -1) {
+        return NS_OK;
       }
       
       // first is the first possible insertion index, last is the last possible
       // insertion index
       PRUint32 first = 0;
       PRUint32 last = list->Length() - 1;
       PRUint32 mid;
       
-      //Stop when there is only one index in our range
+      // Stop when there is only one index in our range
       while (last != first) {
-          mid = (first + last) / 2;
+        mid = (first + last) / 2;
           
-          if (nsContentUtils::PositionIsBefore(aChild, list->GetNodeAt(mid)))
-            last = mid;
-          else
-            first = mid + 1;
-        }
+        if (nsContentUtils::PositionIsBefore(aChild, list->GetNodeAt(mid)))
+          last = mid;
+        else
+          first = mid + 1;
+      }
 
       list->InsertElementAt(aChild, first);
     }
   }
 
   return NS_OK;
 }
 
--- a/content/html/content/src/nsHTMLImageElement.cpp
+++ b/content/html/content/src/nsHTMLImageElement.cpp
@@ -548,19 +548,24 @@ nsHTMLImageElement::BindToTree(nsIDocume
 {
   nsresult rv = nsGenericHTMLElement::BindToTree(aDocument, aParent,
                                                  aBindingParent,
                                                  aCompileEventHandlers);
   NS_ENSURE_SUCCESS(rv, rv);
 
   if (HasAttr(kNameSpaceID_None, nsGkAtoms::src)) {
     ClearBrokenState();
-    nsContentUtils::AddScriptRunner(
-      new nsRunnableMethod<nsHTMLImageElement>(this,
-                                               &nsHTMLImageElement::MaybeLoadImage));
+    // If loading is temporarily disabled, don't even launch MaybeLoadImage.
+    // Otherwise MaybeLoadImage may run later when someone has reenabled
+    // loading.
+    if (LoadingEnabled()) {
+      nsContentUtils::AddScriptRunner(
+        new nsRunnableMethod<nsHTMLImageElement>(this,
+                                                 &nsHTMLImageElement::MaybeLoadImage));
+    }
   }
 
   return rv;
 }
 
 void
 nsHTMLImageElement::MaybeLoadImage()
 {
--- a/content/html/content/src/nsHTMLInputElement.cpp
+++ b/content/html/content/src/nsHTMLInputElement.cpp
@@ -2706,16 +2706,25 @@ nsHTMLInputElement::SubmitNamesValues(ns
       if (!fileSent) {
         // If we don't submit as a file, at least submit the truncated filename.
         aFormSubmission->AddNameFilePair(this, name, filename,
                                          nsnull, NS_LITERAL_CSTRING("application/octet-stream"),
                                          PR_FALSE);
       }
     }
 
+    if (files.Count() == 0) {
+      // If no file was selected, pretend we had an empty file with an
+      // empty filename.
+      aFormSubmission->AddNameFilePair(this, name, EmptyString(), nsnull,
+                                       NS_LITERAL_CSTRING("application/octet-stream"),
+                                       PR_FALSE);
+
+    }
+
     return NS_OK;
   }
 
   // Submit
   // (for type=image, only submit if value is non-null)
   if (mType != NS_FORM_INPUT_IMAGE || !value.IsEmpty()) {
     rv = aFormSubmission->AddNameValuePair(this, name, value);
   }
--- a/content/html/content/test/Makefile.in
+++ b/content/html/content/test/Makefile.in
@@ -136,12 +136,14 @@ include $(topsrcdir)/config/rules.mk
 		347174transformable.xml \
 		347174transform.xsl \
 		test_bug481335.xhtml \
 		test_bug514856.html \
 		bug514856_iframe.html \
 		test_bug519987.html \
 		test_bug523771.html \
 		form_submit_server.sjs \
+		test_bug529819.html \
+		test_bug529859.html \
 		$(NULL)
 
 libs:: $(_TEST_FILES)
 	$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir)
new file mode 100644
--- /dev/null
+++ b/content/html/content/test/test_bug529819.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=529819
+-->
+<head>
+  <title>Test for Bug 529819</title>
+  <script type="application/javascript" src="/MochiKit/packed.js"></script>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.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=529819">Mozilla Bug 529819</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+<form id="form">
+  <input name="foo" id="foo">
+  <input name="bar" type="radio">
+  <input name="bar" id="bar" type="radio">
+</form>
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 529819 **/
+is($("form").elements["foo"] instanceof HTMLInputElement, true, "Should have an element here");
+is($("form").elements["bar"] instanceof HTMLInputElement, false, "Should have a list here");
+is($("form").elements["bar"].length, 2, "Should have a list with two elements here");
+
+</script>
+</pre>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/content/html/content/test/test_bug529859.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=529859
+-->
+<head>
+  <title>Test for Bug 529859</title>
+  <script type="application/javascript" src="/MochiKit/packed.js"></script>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.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=529859">Mozilla Bug 529859</a>
+<div id="content">
+  <iframe name="target_iframe" id="target_iframe"></iframe>
+  <form action="form_submit_server.sjs" target="target_iframe" id="form"
+        method="POST" enctype="multipart/form-data">
+    <input id="emptyFileInput" name="emptyFileInput" type="file">
+  </form>
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 529859 **/
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+  $("target_iframe").onload = function() {
+    var response = JSON.parse(this.contentDocument.documentElement.textContent);
+    is(response.length, 1, "Unexpected number of inputs");
+    is(response[0].headers["Content-Disposition"],
+       "form-data; name=\"emptyFileInput\"; filename=\"\"",
+       "Incorrect content-disposition");
+    is(response[0].headers["Content-Type"], "application/octet-stream",
+       "Unexpected content-type");
+    SimpleTest.finish();
+  }
+  $("form").submit();
+});
+</script>
+</pre>
+</body>
+</html>
--- a/content/html/document/src/nsImageDocument.cpp
+++ b/content/html/document/src/nsImageDocument.cpp
@@ -68,16 +68,17 @@
 #include "nsIDOMElement.h"
 #include "nsIDOMNSHTMLElement.h"
 #include "nsContentErrors.h"
 #include "nsURILoader.h"
 #include "nsIDocShell.h"
 #include "nsIContentViewer.h"
 #include "nsIMarkupDocumentViewer.h"
 #include "nsIDocShellTreeItem.h"
+#include "nsThreadUtils.h"
 
 #define AUTOMATIC_IMAGE_RESIZING_PREF "browser.enable_automatic_image_resizing"
 #define CLICK_IMAGE_RESIZING_PREF "browser.enable_click_image_resizing"
 //XXX A hack needed for Firefox's site specific zoom.
 #define SITE_SPECIFIC_ZOOM "browser.zoom.siteSpecific"
 
 class nsImageDocument;
 
@@ -122,16 +123,19 @@ public:
   NS_IMETHOD OnStartContainer(imgIRequest* aRequest, imgIContainer* aImage);
 
   // nsIDOMEventListener
   NS_IMETHOD HandleEvent(nsIDOMEvent* aEvent);
 
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsImageDocument, nsMediaDocument)
 
   friend class ImageListener;
+
+  void DefaultCheckOverflowing() { CheckOverflowing(mResizeImageByDefault); }
+
 protected:
   virtual nsresult CreateSyntheticDocument();
 
   nsresult CheckOverflowing(PRBool changeState);
 
   void UpdateTitleAndCharset();
 
   nsresult ScrollImageTo(PRInt32 aX, PRInt32 aY, PRBool restoreImage);
@@ -567,17 +571,19 @@ nsImageDocument::ToggleImageSize()
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsImageDocument::OnStartContainer(imgIRequest* aRequest, imgIContainer* aImage)
 {
   aImage->GetWidth(&mImageWidth);
   aImage->GetHeight(&mImageHeight);
-  CheckOverflowing(mResizeImageByDefault);
+  nsCOMPtr<nsIRunnable> runnable =
+    NS_NEW_RUNNABLE_METHOD(nsImageDocument, this, DefaultCheckOverflowing);
+  nsContentUtils::AddScriptRunner(runnable);
   UpdateTitleAndCharset();
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsImageDocument::HandleEvent(nsIDOMEvent* aEvent)
 {
new file mode 100644
--- /dev/null
+++ b/content/xslt/crashtests/528300.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xml" href="#bug"?>
+<!DOCTYPE doc [
+<!ATTLIST xsl:transform
+  id	ID	#REQUIRED>
+]>
+<doc>
+<xsl:transform
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+  version="2.0"
+  id="bug">
+  <xsl:variable name="v0">
+    <xsl:for-each select="$v0" />
+  </xsl:variable>
+  <xsl:template name="t2" match="/">
+    <xsl:copy-of select="number($v0)" />
+  </xsl:template>
+</xsl:transform>
+
+<e1 />
+
+</doc>
new file mode 100644
--- /dev/null
+++ b/content/xslt/crashtests/528488.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xml" href="#bug"?>
+<!DOCTYPE doc [
+<!ATTLIST xsl:transform
+  id	ID	#REQUIRED>
+]>
+<doc>
+  <xsl:transform 
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:exslstrings="http://exslt.org/strings"
+    version="2.0"
+    id="bug">
+    <xsl:variable name="v0" select="$v0" /> 
+    <xsl:template name="t2" match="/">
+      <xsl:param name="p0" select="exslstrings:tokenize('1234','foobar')" />
+      <xsl:copy-of select="round($v0)" /> 
+    </xsl:template>
+  </xsl:transform>
+</doc>
--- a/content/xslt/crashtests/crashtests.list
+++ b/content/xslt/crashtests/crashtests.list
@@ -1,8 +1,10 @@
 load 91332.xml
 load 111994.xml
 load 182460-table.xhtml
 load 226425.xml
 load 406106-1.html
 load 483444.xml
 load 485217.xml
 load 485286.xml
+load 528300.xml
+load 528488.xml
--- a/content/xslt/src/xpath/txCoreFunctionCall.cpp
+++ b/content/xslt/src/xpath/txCoreFunctionCall.cpp
@@ -382,33 +382,37 @@ txCoreFunctionCall::evaluate(txIEvalCont
             return NS_OK;
         }
         case SUBSTRING:
         {
             nsAutoString src;
             rv = mParams[0]->evaluateToString(aContext, src);
             NS_ENSURE_SUCCESS(rv, rv);
 
-            double start = evaluateToNumber(mParams[1], aContext);
+            double start;
+            rv = evaluateToNumber(mParams[1], aContext, &start);
+            NS_ENSURE_SUCCESS(rv, rv);
 
             // check for NaN or +/-Inf
             if (Double::isNaN(start) ||
                 Double::isInfinite(start) ||
                 start >= src.Length() + 0.5) {
                 aContext->recycler()->getEmptyStringResult(aResult);
 
                 return NS_OK;
             }
 
             start = floor(start + 0.5) - 1;
 
             double end;
             if (mParams.Length() == 3) {
-                end = start + evaluateToNumber(mParams[2],
-                                               aContext);
+                rv = evaluateToNumber(mParams[2], aContext, &end);
+                NS_ENSURE_SUCCESS(rv, rv);
+
+                end += start;
                 if (Double::isNaN(end) || end < 0) {
                     aContext->recycler()->getEmptyStringResult(aResult);
 
                     return NS_OK;
                 }
                 
                 if (end > src.Length())
                     end = src.Length();
@@ -526,54 +530,64 @@ txCoreFunctionCall::evaluate(txIEvalCont
         }
         
         // Number functions
 
         case NUMBER:
         {
             double res;
             if (!mParams.IsEmpty()) {
-                res = evaluateToNumber(mParams[0], aContext);
+                rv = evaluateToNumber(mParams[0], aContext, &res);
+                NS_ENSURE_SUCCESS(rv, rv);
             }
             else {
                 nsAutoString resultStr;
                 txXPathNodeUtils::appendNodeValue(aContext->getContextNode(),
                                                   resultStr);
                 res = Double::toDouble(resultStr);
             }
             return aContext->recycler()->getNumberResult(res, aResult);
         }
         case ROUND:
         {
-            double dbl = evaluateToNumber(mParams[0], aContext);
+            double dbl;
+            rv = evaluateToNumber(mParams[0], aContext, &dbl);
+            NS_ENSURE_SUCCESS(rv, rv);
+
             if (!Double::isNaN(dbl) && !Double::isInfinite(dbl)) {
                 if (Double::isNeg(dbl) && dbl >= -0.5) {
                     dbl *= 0;
                 }
                 else {
                     dbl = floor(dbl + 0.5);
                 }
             }
 
             return aContext->recycler()->getNumberResult(dbl, aResult);
         }
         case FLOOR:
         {
-            double dbl = evaluateToNumber(mParams[0], aContext);
+            double dbl;
+            rv = evaluateToNumber(mParams[0], aContext, &dbl);
+            NS_ENSURE_SUCCESS(rv, rv);
+
             if (!Double::isNaN(dbl) &&
                 !Double::isInfinite(dbl) &&
                 !(dbl == 0 && Double::isNeg(dbl))) {
                 dbl = floor(dbl);
             }
 
             return aContext->recycler()->getNumberResult(dbl, aResult);
         }
         case CEILING:
         {
-            double dbl = evaluateToNumber(mParams[0], aContext);
+            double dbl;
+            rv = evaluateToNumber(mParams[0], aContext, &dbl);
+            NS_ENSURE_SUCCESS(rv, rv);
+
             if (!Double::isNaN(dbl) && !Double::isInfinite(dbl)) {
                 if (Double::isNeg(dbl) && dbl > -1) {
                     dbl *= 0;
                 }
                 else {
                     dbl = ceil(dbl);
                 }
             }
--- a/content/xslt/src/xpath/txExpr.h
+++ b/content/xslt/src/xpath/txExpr.h
@@ -325,17 +325,18 @@ public:
 
 protected:
 
     txOwningArray<Expr> mParams;
 
     /*
      * Evaluates the given Expression and converts its result to a number.
      */
-    static double evaluateToNumber(Expr* aExpr, txIEvalContext* aContext);
+    static nsresult evaluateToNumber(Expr* aExpr, txIEvalContext* aContext,
+                                     double* aResult);
 
     /*
      * Evaluates the given Expression and converts its result to a NodeSet.
      * If the result is not a NodeSet an error is returned.
      */
     static nsresult evaluateToNodeSet(Expr* aExpr, txIEvalContext* aContext,
                                       txNodeSet** aResult);
 
--- a/content/xslt/src/xpath/txFunctionCall.cpp
+++ b/content/xslt/src/xpath/txFunctionCall.cpp
@@ -47,25 +47,29 @@
 
   //------------------/
  //- Public Methods -/
 //------------------/
 
 /*
  * Evaluates the given Expression and converts its result to a number.
  */
-double FunctionCall::evaluateToNumber(Expr* aExpr, txIEvalContext* aContext)
+// static
+nsresult
+FunctionCall::evaluateToNumber(Expr* aExpr, txIEvalContext* aContext,
+                               double* aResult)
 {
     NS_ASSERTION(aExpr, "missing expression");
     nsRefPtr<txAExprResult> exprResult;
     nsresult rv = aExpr->evaluate(aContext, getter_AddRefs(exprResult));
-    if (NS_FAILED(rv))
-        return Double::NaN;
+    NS_ENSURE_SUCCESS(rv, rv);
 
-    return exprResult->numberValue();
+    *aResult = exprResult->numberValue();
+
+    return NS_OK;
 }
 
 /*
  * Evaluates the given Expression and converts its result to a NodeSet.
  * If the result is not a NodeSet NULL is returned.
  */
 nsresult
 FunctionCall::evaluateToNodeSet(Expr* aExpr, txIEvalContext* aContext,
--- a/content/xslt/src/xpath/txXPCOMExtensionFunction.cpp
+++ b/content/xslt/src/xpath/txXPCOMExtensionFunction.cpp
@@ -474,17 +474,21 @@ txXPCOMExtensionFunctionCall::evaluate(t
             {
                 rv = expr->evaluateToBool(aContext, invokeParam.val.b);
                 NS_ENSURE_SUCCESS(rv, rv);
 
                 break;
             }
             case eNUMBER:
             {
-                invokeParam.val.d = evaluateToNumber(expr, aContext);
+                double dbl;
+                rv = evaluateToNumber(mParams[0], aContext, &dbl);
+                NS_ENSURE_SUCCESS(rv, rv);
+
+                invokeParam.val.d = dbl;
                 break;
             }
             case eSTRING:
             {
                 nsString *value = new nsString();
                 if (!value) {
                     return NS_ERROR_OUT_OF_MEMORY;
                 }
--- a/content/xslt/src/xslt/txExecutionState.cpp
+++ b/content/xslt/src/xslt/txExecutionState.cpp
@@ -94,20 +94,23 @@ txExecutionState::txExecutionState(txSty
       mTemplateRulesBufferSize(0),
       mTemplateRuleCount(0),
       mEvalContext(nsnull),
       mInitialEvalContext(nsnull),
       mGlobalParams(nsnull),
       mKeyHash(aStylesheet->getKeyMap()),
       mDisableLoads(aDisableLoads)
 {
+    MOZ_COUNT_CTOR(txExecutionState);
 }
 
 txExecutionState::~txExecutionState()
 {
+    MOZ_COUNT_DTOR(txExecutionState);
+
     delete mResultHandler;
     delete mLocalVariables;
     delete mEvalContext;
 
     PRInt32 i;
     for (i = 0; i < mTemplateRuleCount; ++i) {
         NS_IF_RELEASE(mTemplateRules[i].mModeLocalName);
     }
@@ -266,19 +269,19 @@ txExecutionState::getVariable(PRInt32 aN
     NS_ENSURE_SUCCESS(rv, rv);
 
     // evaluate the global variable
     pushEvalContext(mInitialEvalContext);
     if (var->mExpr) {
         txVariableMap* oldVars = mLocalVariables;
         mLocalVariables = nsnull;
         rv = var->mExpr->evaluate(getEvalContext(), &aResult);
-        NS_ENSURE_SUCCESS(rv, rv);
+        mLocalVariables = oldVars;
 
-        mLocalVariables = oldVars;
+        NS_ENSURE_SUCCESS(rv, rv);
     }
     else {
         nsAutoPtr<txRtfHandler> rtfHandler(new txRtfHandler);
         NS_ENSURE_TRUE(rtfHandler, NS_ERROR_OUT_OF_MEMORY);
 
         rv = pushResultHandler(rtfHandler);
         NS_ENSURE_SUCCESS(rv, rv);
         
--- a/content/xslt/src/xslt/txFormatNumberFunctionCall.cpp
+++ b/content/xslt/src/xslt/txFormatNumberFunctionCall.cpp
@@ -79,20 +79,21 @@ txFormatNumberFunctionCall::evaluate(txI
     *aResult = nsnull;
     if (!requireParams(2, 3, aContext))
         return NS_ERROR_XPATH_BAD_ARGUMENT_COUNT;
 
     // Get number and format
     double value;
     txExpandedName formatName;
 
-    value = evaluateToNumber(mParams[0], aContext);
+    nsresult rv = evaluateToNumber(mParams[0], aContext, &value);
+    NS_ENSURE_SUCCESS(rv, rv);
 
     nsAutoString formatStr;
-    nsresult rv = mParams[1]->evaluateToString(aContext, formatStr);
+    rv = mParams[1]->evaluateToString(aContext, formatStr);
     NS_ENSURE_SUCCESS(rv, rv);
 
     if (mParams.Length() == 3) {
         nsAutoString formatQName;
         rv = mParams[2]->evaluateToString(aContext, formatQName);
         NS_ENSURE_SUCCESS(rv, rv);
 
         rv = formatName.init(formatQName, mMappings, MB_FALSE);
--- a/content/xslt/src/xslt/txVariableMap.h
+++ b/content/xslt/src/xslt/txVariableMap.h
@@ -41,32 +41,41 @@
 
 #include "txError.h"
 #include "txXMLUtils.h"
 #include "txExprResult.h"
 #include "txExpandedNameMap.h"
 
 class txVariableMap {
 public:
+    txVariableMap();
     ~txVariableMap();
     
     nsresult bindVariable(const txExpandedName& aName, txAExprResult* aValue);
 
     void getVariable(const txExpandedName& aName, txAExprResult** aResult);
     
     void removeVariable(const txExpandedName& aName);
 
 private:
     txExpandedNameMap<txAExprResult> mMap;
 };
 
 
 inline
+txVariableMap::txVariableMap()
+{
+    MOZ_COUNT_CTOR(txVariableMap);
+}
+
+inline
 txVariableMap::~txVariableMap()
 {
+    MOZ_COUNT_DTOR(txVariableMap);
+
     txExpandedNameMap<txAExprResult>::iterator iter(mMap);
     while (iter.next()) {
         txAExprResult* res = iter.value();
         NS_RELEASE(res);
     }
 }
 
 inline nsresult
--- a/content/xul/content/src/nsXULElement.cpp
+++ b/content/xul/content/src/nsXULElement.cpp
@@ -575,18 +575,20 @@ nsXULElement::IsFocusable(PRInt32 *aTabI
         // the element becomes focusable.
         PRInt32 tabIndex = 0;
         xulControl->GetTabIndex(&tabIndex);
         shouldFocus = *aTabIndex >= 0 || tabIndex >= 0;
         *aTabIndex = tabIndex;
       }
       else {
         // otherwise, if there is no tabindex attribute, just use the value of
-        // *aTabIndex to indicate focusability
+        // *aTabIndex to indicate focusability. Reset any supplied tabindex to 0.
         shouldFocus = *aTabIndex >= 0;
+        if (shouldFocus)
+          *aTabIndex = 0;
       }
 
       if (shouldFocus && sTabFocusModelAppliesToXUL &&
           !(sTabFocusModel & eTabFocus_formElementsMask)) {
         // By default, the tab focus model doesn't apply to xul element on any system but OS X.
         // on OS X we're following it for UI elements (XUL) as sTabFocusModel is based on
         // "Full Keyboard Access" system setting (see mac/nsILookAndFeel).
         // both textboxes and list elements (i.e. trees and list) should always be focusable
--- a/docshell/test/test_bug529119-1.html
+++ b/docshell/test/test_bug529119-1.html
@@ -12,35 +12,34 @@ SimpleTest.waitForExplicitFinish();
 
 var workingURL = "http://localhost:8888/tests/docshell/test/bug529119-window.html";
 var faultyURL = "http://some-non-existent-domain-27489274c892748217cn2384.com/";
 
 var w = null;
 var phase = 0;
 var gotWrongPageOnTryAgainClick = false;
 
-function pollForPage(expected_title, f, w)
+function pollForPage(f, w)
 {
   // Start with polling after a delay, we might mistakenly take the current page
   // as an expected one.
   window.setTimeout(function() {
-    var iterationsLeft = 20;
+    var iterationsLeft = 200;
     var int = window.setInterval(function() {
       iterationsLeft--;
-      
-      netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+
+      var haveErrorPage = false;
       try {
         var title = w.document.title;
       }
       catch (ex) {
-        alert(ex);
-        return;
+        haveErrorPage = true;
       }
   
-      if (iterationsLeft == 0 || title.match(expected_title)) {
+      if (iterationsLeft == 0 || haveErrorPage) {
         window.clearInterval(int);
         f(iterationsLeft > 0);
       }
     }, 100);
   }, 1000);
 }
 
 function windowLoaded()
@@ -51,25 +50,25 @@ function windowLoaded()
     case 0:
       /* 2. We have succeededfully loaded a page, now go to a faulty URL */
       window.setTimeout(function() {
         w.location.href = faultyURL;
       }, 0);
     
       phase = 1;
 
-      pollForPage("Problem loading page", function(succeeded) {
+      pollForPage(function(succeeded) {
         ok(succeeded, "Waiting for error page succeeded");
         
         netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
         /* 3. now, while we are on the error page, try to reload it, actually 
            click the "Try Again" button */
         w.location.reload();
 
-        pollForPage("Problem loading page", function(succeeded) {
+        pollForPage(function(succeeded) {
           ok(succeeded, "Waiting for error page succeeded");
           
           netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
           /* 4-finish, check we are still on the error page */
           is(w.location.href, faultyURL, "Is on an error page");
           isnot(w.location.href, workingURL, "Is not on the previous page");
           is(gotWrongPageOnTryAgainClick, false, 
             "Must not get www.example.com page on reload of an error page");
--- a/docshell/test/test_bug529119-2.html
+++ b/docshell/test/test_bug529119-2.html
@@ -11,35 +11,34 @@
 SimpleTest.waitForExplicitFinish();
 
 var workingURL = "http://localhost:8888/tests/docshell/test/bug529119-window.html";
 var faultyURL = "http://some-non-existent-domain-27489274c892748217cn2384.com/";
 
 var w = null;
 var phase = 0;
 
-function pollForPage(expected_title, f, w)
+function pollForPage(expectErrorPage, f, w)
 {
   // Start with polling after a delay, we might mistakenly take the current page
   // as an expected one.
   window.setTimeout(function() {
-    var iterationsLeft = 20;
+    var iterationsLeft = 200;
     var int = window.setInterval(function() {
       iterationsLeft--;
       
-      netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+      var haveErrorPage = false;
       try {
         var title = w.document.title;
       }
       catch (ex) {
-        alert(ex);
-        return;
+        haveErrorPage = true;
       }
   
-      if (iterationsLeft == 0 || title.match(expected_title)) {
+      if (iterationsLeft == 0 || expectErrorPage == haveErrorPage) {
         window.clearInterval(int);
         f(iterationsLeft > 0);
       }
     }, 100);
   }, 1000);
 }
 
 function windowLoaded()
@@ -47,29 +46,29 @@ function windowLoaded()
   netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
 
   /* 2. We have successfully loaded a page, now go to a faulty URL */
   // XXX The test fails when we change the location synchronously 
   window.setTimeout(function() {
     w.location.href = faultyURL;
   }, 0);
 
-  pollForPage("Problem loading page", function(succeeded) {
+  pollForPage(true, function(succeeded) {
     ok(succeeded, "Waiting for error page succeeded");
     
     netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
     /* 3. now, while we are on the error page, navigate back */
     try {
       w.back();
     }
     catch(ex) {
       ok(false, "w.back() threw " + ex);
     }
 
-    pollForPage("Test bug 529119, sub-window", function(succeeded) {
+    pollForPage(false, function(succeeded) {
       ok(succeeded, "Waiting for original page succeeded");
       
       netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
       /* 4-finish, check we are back at the original page */
       isnot(w.location.href, faultyURL, "Is on an error page");
       is(w.location.href, workingURL, "Is not on the previous page");
       w.close();
       SimpleTest.finish();
--- a/dom/base/nsFocusManager.cpp
+++ b/dom/base/nsFocusManager.cpp
@@ -75,16 +75,18 @@
 #include "nsWidgetsCID.h"
 #include "nsILookAndFeel.h"
 #include "nsIWidget.h"
 #include "nsIBaseWindow.h"
 #include "nsIViewManager.h"
 #include "nsFrameSelection.h"
 #include "nsXULPopupManager.h"
 #include "nsImageMapUtils.h"
+#include "nsTreeWalker.h"
+#include "nsIDOMNodeFilter.h"
 
 #ifdef MOZ_XUL
 #include "nsIDOMXULTextboxElement.h"
 #include "nsIDOMXULMenuListElement.h"
 #endif
 
 //#define DEBUG_FOCUS 1
 //#define DEBUG_FOCUS_NAVIGATION 1
@@ -2110,16 +2112,18 @@ nsFocusManager::DetermineElementToMoveFo
   PRInt32 tabIndex = forward ? 1 : 0;
   if (startContent) {
     nsIFrame* frame = presShell->GetPrimaryFrameFor(startContent);
     if (startContent->Tag() == nsGkAtoms::area &&
         startContent->IsHTML())
       startContent->IsFocusable(&tabIndex);
     else if (frame)
       frame->IsFocusable(&tabIndex, 0);
+    else
+      startContent->IsFocusable(&tabIndex);
 
     // if the current element isn't tabbable, ignore the tabindex and just
     // look for the next element. The root content won't have a tabindex
     // so just treat this as the beginning of the tab order.
     if (tabIndex < 0) {
       tabIndex = 1;
       if (startContent != rootContent)
         ignoreTabIndex = PR_TRUE;
@@ -2180,17 +2184,17 @@ nsFocusManager::DetermineElementToMoveFo
         }
 
         if (startContent) {
           if (aType == MOVEFOCUS_CARET) {
             GetFocusInSelection(aWindow, startContent,
                                 endSelectionContent, aNextContent);
             return NS_OK;
           }
-          
+
           // when starting from a selection, we always want to find the next or
           // previous element in the document. So the tabindex on elements
           // should be ignored.
           ignoreTabIndex = PR_TRUE;
         }
       }
 
       if (!startContent) {
@@ -2351,52 +2355,73 @@ nsFocusManager::GetNextTabbableContent(n
                                        nsIContent* aStartContent,
                                        PRBool aForward,
                                        PRInt32 aCurrentTabIndex,
                                        PRBool aIgnoreTabIndex,
                                        nsIContent** aResultContent)
 {
   *aResultContent = nsnull;
 
-  if (!aStartContent)
+  nsCOMPtr<nsIContent> startContent = aStartContent;
+  if (!startContent)
     return NS_OK;
 
 #ifdef DEBUG_FOCUS_NAVIGATION
   PRINTTAGF("GetNextTabbable: %s", aStartContent);
   printf(" tabindex: %d\n", aCurrentTabIndex);
 #endif
 
   nsPresContext* presContext = aPresShell->GetPresContext();
 
+  PRBool getNextFrame = PR_TRUE;
+  nsCOMPtr<nsIContent> iterStartContent = aStartContent;
   while (1) {
-    nsIFrame* aStartFrame = aPresShell->GetPrimaryFrameFor(aStartContent);
-    if (!aStartFrame) {
-      // if there is no frame, just get the root frame
-      aStartFrame = aPresShell->GetPrimaryFrameFor(aRootContent);
-      if (!aStartFrame)
+    nsIFrame* startFrame = aPresShell->GetPrimaryFrameFor(iterStartContent);
+    // if there is no frame, look for another content node that has a frame
+    if (!startFrame) {
+      // if the root content doesn't have a frame, just return
+      if (iterStartContent == aRootContent)
         return NS_OK;
-      aStartContent = aRootContent;
+
+      // look for the next or previous content node in tree order
+      nsTreeWalker walker(aRootContent, nsIDOMNodeFilter::SHOW_ALL, nsnull, PR_TRUE);
+      nsCOMPtr<nsIDOMNode> nextNode = do_QueryInterface(iterStartContent);
+      walker.SetCurrentNode(nextNode);
+      if (NS_SUCCEEDED(aForward ? walker.NextNode(getter_AddRefs(nextNode)) :
+                                  walker.PreviousNode(getter_AddRefs(nextNode)))) {
+        iterStartContent = do_QueryInterface(nextNode);
+        // we've already skipped over the initial focused content, so we
+        // don't want to traverse frames.
+        getNextFrame = PR_FALSE;
+        if (iterStartContent)
+          continue;
+      }
+
+      // otherwise, as a last attempt, just look at the root content
+      iterStartContent = aRootContent;
+      continue;
     }
 
     nsCOMPtr<nsIFrameEnumerator> frameTraversal;
     nsresult rv = NS_NewFrameTraversal(getter_AddRefs(frameTraversal),
-                                       presContext, aStartFrame,
+                                       presContext, startFrame,
                                        ePreOrder,
                                        PR_FALSE, // aVisual
                                        PR_FALSE, // aLockInScrollView
                                        PR_TRUE   // aFollowOOFs
                                        );
     NS_ENSURE_SUCCESS(rv, rv);
 
-    if (aStartContent == aRootContent) {
+    if (iterStartContent == aRootContent) {
       if (!aForward)
         frameTraversal->Last();
     }
-    else if (!aStartContent || aStartContent->Tag() != nsGkAtoms::area ||
-             !aStartContent->IsHTML()) {
+    else if (getNextFrame &&
+             (!iterStartContent || iterStartContent->Tag() != nsGkAtoms::area ||
+              !iterStartContent->IsHTML())) {
       // Need to do special check in case we're in an imagemap which has multiple
       // content nodes per frame, so don't skip over the starting frame.
       if (aForward)
         frameTraversal->Next();
       else
         frameTraversal->Prev();
     }
 
@@ -2425,17 +2450,17 @@ nsFocusManager::GetNextTabbableContent(n
       if (tabIndex >= 0) {
         NS_ASSERTION(currentContent, "IsFocusable set a tabindex for a frame with no content");
         if (currentContent->Tag() == nsGkAtoms::img &&
             currentContent->HasAttr(kNameSpaceID_None, nsGkAtoms::usemap)) {
           // This is an image with a map. Image map areas are not traversed by
           // nsIFrameTraversal so look for the next or previous area element.
           nsIContent *areaContent =
             GetNextTabbableMapArea(aForward, aCurrentTabIndex,
-                                   currentContent, aStartContent);
+                                   currentContent, iterStartContent);
           if (areaContent) {
             NS_ADDREF(*aResultContent = areaContent);
             return NS_OK;
           }
         }
         else if (aIgnoreTabIndex || aCurrentTabIndex == tabIndex) {
           // break out if we've wrapped around to the start again.
           if (aOriginalStartContent && currentContent == aOriginalStartContent) {
@@ -2482,17 +2507,17 @@ nsFocusManager::GetNextTabbableContent(n
           // it. Also, if the next content node is the root content, then
           // return it. This latter case would happen only if someone made a
           // popup focusable.
           // Also, when going backwards, check to ensure that the focus
           // wouldn't be redirected. Otherwise, for example, when an input in
           // a textbox is focused, the enclosing textbox would be found and
           // the same inner input would be returned again.
           else if (currentContent == aRootContent ||
-                   (currentContent != aStartContent &&
+                   (currentContent != startContent &&
                     (aForward || !GetRedirectedFocus(currentContent)))) {
             NS_ADDREF(*aResultContent = currentContent);
             return NS_OK;
           }
         }
       }
       else if (aOriginalStartContent && currentContent == aOriginalStartContent) {
         // not focusable, so return if we have wrapped around to the original
@@ -2530,17 +2555,17 @@ nsFocusManager::GetNextTabbableContent(n
         NS_IF_ADDREF(*aResultContent =
                      GetRootForFocus(window, aRootContent->GetCurrentDoc(), PR_FALSE, PR_TRUE));
       }
       break;
     }
 
     // continue looking for next highest priority tabindex
     aCurrentTabIndex = GetNextTabIndex(aRootContent, aCurrentTabIndex, aForward);
-    aStartContent = aRootContent;
+    startContent = iterStartContent = aRootContent;
   }
 
   return NS_OK;
 }
 
 nsIContent*
 nsFocusManager::GetNextTabbableMapArea(PRBool aForward,
                                        PRInt32 aCurrentTabIndex,
--- a/dom/base/nsFocusManager.h
+++ b/dom/base/nsFocusManager.h
@@ -311,16 +311,19 @@ protected:
    * aRootContent is the root node -- nodes above this will not be examined.
    * Typically this will be the root node of a document, but could also be
    * a popup node.
    *
    * aOriginalStartContent is the content which was originally the starting
    * node, in the case of recursive or looping calls.
    *
    * aStartContent is the starting point for this call of this method.
+   * If aStartContent doesn't have visual representation, the next content
+   * object, which does have a primary frame, will be used as a start.
+   * If that content object is focusable, the method may return it.
    *
    * aForward should be true for forward navigation or false for backward
    * navigation.
    *
    * aCurrentTabIndex is the current tabindex.
    *
    * aIgnoreTabIndex to ignore the current tabindex and find the element
    * irrespective or the tab index. This will be true when a selection is
--- a/dom/base/nsGlobalWindow.cpp
+++ b/dom/base/nsGlobalWindow.cpp
@@ -925,16 +925,65 @@ nsGlobalWindow::ClearControllers()
       if (context)
         context->SetCommandContext(nsnull);
     }
 
     mControllers = nsnull;
   }
 }
 
+class ClearScopeEvent : public nsRunnable
+{
+public:
+  ClearScopeEvent(nsGlobalWindow *innerWindow)
+    : mInnerWindow(innerWindow) {
+  }
+
+  NS_IMETHOD Run()
+  {
+    mInnerWindow->ReallyClearScope(this);
+    return NS_OK;
+  }
+
+private:
+  nsRefPtr<nsGlobalWindow> mInnerWindow;
+};
+
+void
+nsGlobalWindow::ReallyClearScope(nsRunnable *aRunnable)
+{
+  NS_ASSERTION(IsInnerWindow(), "Must be an inner window");
+
+  nsIScriptContext *jsscx = GetContextInternal();
+  if (jsscx && jsscx->GetExecutingScript()) {
+    if (!aRunnable) {
+      aRunnable = new ClearScopeEvent(this);
+      if (!aRunnable) {
+        // The only reason that we clear scope here is to try to prevent
+        // leaks. Failing to clear scope might mean that we'll leak more
+        // but if we don't have enough memory to allocate a ClearScopeEvent
+        // we probably don't have to worry about this anyway.
+        return;
+      }
+    }
+
+    NS_DispatchToMainThread(aRunnable);
+    return;
+  }
+
+  PRUint32 lang_id;
+  NS_STID_FOR_ID(lang_id) {
+    // Note that scx comes from the outer window.  If this is an inner
+    // window, it may not be the current inner for its outer.
+    nsIScriptContext *scx = GetScriptContextInternal(lang_id);
+    if (scx)
+      scx->ClearScope(mScriptGlobals[NS_STID_INDEX(lang_id)], PR_TRUE);
+  }
+}
+
 void
 nsGlobalWindow::FreeInnerObjects(PRBool aClearScope)
 {
   NS_ASSERTION(IsInnerWindow(), "Don't free inner objects on an outer window");
 
   // Kill all of the workers for this window.
   nsDOMThreadService* dts = nsDOMThreadService::get();
   if (dts) {
@@ -978,24 +1027,19 @@ nsGlobalWindow::FreeInnerObjects(PRBool 
   mDoc = nsnull;
 
   if (mApplicationCache) {
     static_cast<nsDOMOfflineResourceList*>(mApplicationCache.get())->Disconnect();
     mApplicationCache = nsnull;
   }
 
   if (aClearScope) {
-    PRUint32 lang_id;
-    NS_STID_FOR_ID(lang_id) {
-      // Note that scx comes from the outer window.  If this is an inner
-      // window, it may not be the current inner for its outer.
-      nsIScriptContext *scx = GetScriptContextInternal(lang_id);
-      if (scx)
-        scx->ClearScope(mScriptGlobals[NS_STID_INDEX(lang_id)], PR_TRUE);
-    }
+    // NB: This might not clear our scope, but fire an event to do so
+    // instead.
+    ReallyClearScope(nsnull);
   }
 
   if (mDummyJavaPluginOwner) {
     // Tear down the dummy java plugin.
 
     // XXXjst: On a general note, should windows with java stuff in
     // them ever even make it into the fast-back cache?
 
--- a/dom/base/nsGlobalWindow.h
+++ b/dom/base/nsGlobalWindow.h
@@ -117,16 +117,17 @@ class nsNavigator;
 class nsScreen;
 class nsHistory;
 class nsIDocShellLoadInfo;
 class WindowStateHolder;
 class nsGlobalWindowObserver;
 class nsGlobalWindow;
 class nsDummyJavaPluginOwner;
 class PostMessageEvent;
+class nsRunnable;
 
 class nsDOMOfflineResourceList;
 class nsGeolocation;
 
 extern nsresult
 NS_CreateJSTimeoutHandler(nsGlobalWindow *aWindow,
                           PRBool *aIsInterval,
                           PRInt32 *aInterval,
@@ -233,16 +234,17 @@ class nsGlobalWindow : public nsPIDOMWin
                        public nsIInterfaceRequestor,
                        public PRCListStr
 {
 public:
   // public methods
   nsPIDOMWindow* GetPrivateParent();
   // callback for close event
   void ReallyCloseWindow();
+  void ReallyClearScope(nsRunnable *aRunnable);
 
   // nsISupports
   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
 
   // nsIScriptGlobalObject
   virtual nsIScriptContext *GetContext();
   virtual JSObject *GetGlobalJSObject();
 
--- a/dom/base/nsIScriptContext.h
+++ b/dom/base/nsIScriptContext.h
@@ -51,20 +51,20 @@ class nsIAtom;
 class nsIArray;
 class nsIVariant;
 class nsIObjectInputStream;
 class nsIObjectOutputStream;
 class nsScriptObjectHolder;
 
 typedef void (*nsScriptTerminationFunc)(nsISupports* aRef);
 
-// 87482b5e-e019-4df5-9bc2-b2a51b1f2d28
+// A4FE2B52-62B5-40C3-BF9C-5E0A27B10F90
 #define NS_ISCRIPTCONTEXT_IID \
-{ 0x87482b5e, 0xe019, 0x4df5, \
-  { 0x9b, 0xc2, 0xb2, 0xa5, 0x1b, 0x1f, 0x2d, 0x28 } }
+{ 0xA4FE2B52, 0x62B5, 0x40C3, \
+  { 0xBF, 0x9C, 0x5E, 0x0A, 0x27, 0xB1, 0x0F, 0x90 } }
 
 /* This MUST match JSVERSION_DEFAULT.  This version stuff if we don't
    know what language we have is a little silly... */
 #define SCRIPTVERSION_DEFAULT JSVERSION_DEFAULT
 
 /**
  * It is used by the application to initialize a runtime and run scripts.
  * A script runtime would implement this interface.
@@ -398,16 +398,21 @@ public:
   /** 
    * Called to set/get information if the script context is
    * currently processing a script tag
    */
   virtual PRBool GetProcessingScriptTag() = 0;
   virtual void SetProcessingScriptTag(PRBool aResult) = 0;
 
   /**
+   * Called to find out if this script context might be executing script.
+   */
+  virtual PRBool GetExecutingScript() = 0;
+
+  /**
    * Tell the context whether or not to GC when destroyed.  An optimization
    * used when the window is a [i]frame, so GC will happen anyway.
    */
   virtual void SetGCOnDestruction(PRBool aGCOnDestruction) = 0;
 
   /**
    * Initialize DOM classes on aGlobalObj, always call
    * WillInitializeContext() before calling InitContext(), and always
--- a/dom/base/nsJSEnvironment.cpp
+++ b/dom/base/nsJSEnvironment.cpp
@@ -1307,17 +1307,19 @@ nsJSContext::JSOptionChangedCallback(con
   PRInt32 zeal = nsContentUtils::GetIntPref(js_zeal_option_str, -1);
   if (zeal >= 0)
     ::JS_SetGCZeal(context->mContext, (PRUint8)zeal);
 #endif
 
   return 0;
 }
 
-nsJSContext::nsJSContext(JSRuntime *aRuntime) : mGCOnDestruction(PR_TRUE)
+nsJSContext::nsJSContext(JSRuntime *aRuntime)
+  : mGCOnDestruction(PR_TRUE),
+    mExecuteDepth(0)
 {
 
   ++sContextCount;
 
   mDefaultJSOptions = JSOPTION_PRIVATE_IS_NSISUPPORTS | JSOPTION_ANONFUNFIX;
 
   mContext = ::JS_NewContext(aRuntime, gStackSize);
   if (mContext) {
@@ -1517,25 +1519,29 @@ nsJSContext::EvaluateStringWithValue(con
   // SecurityManager said "ok", but don't compile if aVersion is unknown.
   // Since the caller is responsible for parsing the version strings, we just
   // check it isn't JSVERSION_UNKNOWN.
   if (ok && ((JSVersion)aVersion) != JSVERSION_UNKNOWN) {
 
     JSAutoRequest ar(mContext);
     nsJSVersionSetter setVersion(mContext, aVersion);
 
+    ++mExecuteDepth;
+
     ok = ::JS_EvaluateUCScriptForPrincipals(mContext,
                                             (JSObject *)aScopeObject,
                                             jsprin,
                                             (jschar*)PromiseFlatString(aScript).get(),
                                             aScript.Length(),
                                             aURL,
                                             aLineNo,
                                             &val);
 
+    --mExecuteDepth;
+
     if (!ok) {
       // Tell XPConnect about any pending exceptions. This is needed
       // to avoid dropping JS exceptions in case we got here through
       // nested calls through XPConnect.
 
       ReportPendingException();
     }
   }
@@ -1683,16 +1689,18 @@ nsJSContext::EvaluateString(const nsAStr
   // The result of evaluation, used only if there were no errors.  This need
   // not be a GC root currently, provided we run the GC only from the
   // operation callback or from ScriptEvaluated.
   jsval val = JSVAL_VOID;
   jsval* vp = aRetValue ? &val : NULL;
 
   nsJSContext::TerminationFuncHolder holder(this);
 
+  ++mExecuteDepth;
+
   // SecurityManager said "ok", but don't compile if aVersion is unknown.
   // Since the caller is responsible for parsing the version strings, we just
   // check it isn't JSVERSION_UNKNOWN.
   if (ok && ((JSVersion)aVersion) != JSVERSION_UNKNOWN) {
     JSAutoRequest ar(mContext);
     nsJSVersionSetter setVersion(mContext, aVersion);
 
     ok = ::JS_EvaluateUCScriptForPrincipals(mContext,
@@ -1726,16 +1734,18 @@ nsJSContext::EvaluateString(const nsAStr
       *aIsUndefined = PR_TRUE;
     }
 
     if (aRetValue) {
       aRetValue->Truncate();
     }
   }
 
+  --mExecuteDepth;
+
   // Pop here, after JS_ValueToString and any other possible evaluation.
   if (NS_FAILED(stack->Pop(nsnull)))
     rv = NS_ERROR_FAILURE;
 
   // ScriptEvaluated needs to come after we pop the stack
   ScriptEvaluated(PR_TRUE);
 
   return rv;
@@ -1844,16 +1854,17 @@ nsJSContext::ExecuteScript(void *aScript
   // The result of evaluation, used only if there were no errors.  This need
   // not be a GC root currently, provided we run the GC only from the
   // operation callback or from ScriptEvaluated.
   jsval val;
   JSBool ok;
 
   nsJSContext::TerminationFuncHolder holder(this);
   JSAutoRequest ar(mContext);
+  ++mExecuteDepth;
   ok = ::JS_ExecuteScript(mContext,
                           (JSObject *)aScopeObject,
                           (JSScript*)::JS_GetPrivate(mContext,
                           (JSObject*)aScriptObject),
                           &val);
 
   if (ok) {
     // If all went well, convert val to a string (XXXbe unless undefined?).
@@ -1863,16 +1874,18 @@ nsJSContext::ExecuteScript(void *aScript
       *aIsUndefined = PR_TRUE;
     }
 
     if (aRetValue) {
       aRetValue->Truncate();
     }
   }
 
+  --mExecuteDepth;
+
   // Pop here, after JS_ValueToString and any other possible evaluation.
   if (NS_FAILED(stack->Pop(nsnull)))
     rv = NS_ERROR_FAILURE;
 
   // ScriptEvaluated needs to come after we pop the stack
   ScriptEvaluated(PR_TRUE);
 
   return rv;
@@ -2106,18 +2119,20 @@ nsJSContext::CallEventHandler(nsISupport
       stack->Pop(nsnull);
       return rv;
     }
 
     AutoFreeJSStack stackGuard(mContext, mark); // ensure always freed.
 
     jsval funval = OBJECT_TO_JSVAL(static_cast<JSObject *>(aHandler));
     JSAutoRequest ar(mContext);
+    ++mExecuteDepth;
     PRBool ok = ::JS_CallFunctionValue(mContext, target,
                                        funval, argc, argv, &rval);
+    --mExecuteDepth;
 
     if (!ok) {
       // Tell XPConnect about any pending exceptions. This is needed
       // to avoid dropping JS exceptions in case we got here through
       // nested calls through XPConnect.
 
       ReportPendingException();
 
@@ -3493,16 +3508,22 @@ nsJSContext::GetProcessingScriptTag()
 }
 
 void
 nsJSContext::SetProcessingScriptTag(PRBool aFlag)
 {
   mProcessingScriptTag = aFlag;
 }
 
+PRBool
+nsJSContext::GetExecutingScript()
+{
+  return JS_IsRunning(mContext) || mExecuteDepth > 0;
+}
+
 void
 nsJSContext::SetGCOnDestruction(PRBool aGCOnDestruction)
 {
   mGCOnDestruction = aGCOnDestruction;
 }
 
 NS_IMETHODIMP
 nsJSContext::ScriptExecuted()
--- a/dom/base/nsJSEnvironment.h
+++ b/dom/base/nsJSEnvironment.h
@@ -144,16 +144,18 @@ public:
   virtual PRBool GetScriptsEnabled();
   virtual void SetScriptsEnabled(PRBool aEnabled, PRBool aFireTimeouts);
 
   virtual nsresult SetProperty(void *aTarget, const char *aPropName, nsISupports *aVal);
 
   virtual PRBool GetProcessingScriptTag();
   virtual void SetProcessingScriptTag(PRBool aResult);
 
+  virtual PRBool GetExecutingScript();
+
   virtual void SetGCOnDestruction(PRBool aGCOnDestruction);
 
   virtual nsresult InitClasses(void *aGlobalObj);
   virtual void ClearScope(void* aGlobalObj, PRBool bClearPolluters);
 
   virtual void WillInitializeContext();
   virtual void DidInitializeContext();
   virtual void DidSetDocument(nsISupports *aDocdoc, void *aGlobal) {;}
@@ -287,16 +289,17 @@ protected:
   TerminationFuncClosure* mTerminations;
 
 private:
   PRPackedBool mIsInitialized;
   PRPackedBool mScriptsEnabled;
   PRPackedBool mGCOnDestruction;
   PRPackedBool mProcessingScriptTag;
 
+  PRUint32 mExecuteDepth;
   PRUint32 mDefaultJSOptions;
   PRTime mOperationCallbackTime;
 
   PRTime mModalStateTime;
   PRUint32 mModalStateDepth;
 
   // mGlobalWrapperRef is used only to hold a strong reference to the
   // global object wrapper while the nsJSContext is alive. This cuts
--- a/dom/tests/mochitest/chrome/child_focus_frame.html
+++ b/dom/tests/mochitest/chrome/child_focus_frame.html
@@ -19,16 +19,17 @@
   This is a scrollable area with some sufficiently long text contained within it.
 </div>
 <img id="n13" src="happy.png"/>
 <img id="t23" tabindex="0" src="happy.png"/>
 <a id="t17" tabindex="2" accesskey="f">1</a>
 <a id="t24" tabindex="0" href="#">2</a>
 <a id="t25" href="#">Link 3</a>
 <br>
+<span id="hiddenspan" style="display: none;"></span>
 <input id="t26" tabindex="0" type="checkbox" accesskey="a">
 <input id="o11" tabindex="-1" type="checkbox">
 <div style="display: none;"><input/></div>
 <div id="t27" style="overflow: scroll; max-height: 20px;">
   This is a scrollable area with some sufficiently long text contained within it.
   This is a scrollable area with some sufficiently long text contained within it.
   <button id="inscroll" tabindex="-1">Button 4</button>
 </div>
--- a/dom/tests/mochitest/chrome/window_focus.xul
+++ b/dom/tests/mochitest/chrome/window_focus.xul
@@ -935,16 +935,43 @@ function testMoveFocus()
   synthesizeKey("VK_LEFT", { }, gChildWindow);
   is(fm.focusedElement, null, "move caret away from link");
 
   synthesizeKey("VK_LEFT", { }, gChildWindow);
   is(fm.focusedElement, getById("t24"), "move caret away onto link");
 
   prefs.setBoolPref("accessibility.browsewithcaret", false);
 
+  // cases where focus in on a content node with no frame
+
+  if (!gPartialTabbing) {
+    getById("t24").blur();
+    gEvents = "";
+    gLastFocus = null;
+    gLastFocusWindow = gChildWindow;
+    gLastFocusMethod = fm.FLAG_BYKEY;
+
+    selection.selectAllChildren(getById("hiddenspan"));
+    expectFocusShift(function () synthesizeKey("VK_TAB", { }),
+                     gChildWindow, getById("t26"), true, "tab with selection on hidden content");
+
+    setFocusTo($("o15"), window);
+    $("o15").hidden = true;
+    document.documentElement.getBoundingClientRect(); // flush after hiding
+    expectFocusShift(function () synthesizeKey("VK_TAB", { }),
+                     window, $("o17"), true, "tab with focus on hidden content");
+
+    $("o17").hidden = true;
+    document.documentElement.getBoundingClientRect();
+    expectFocusShift(function () synthesizeKey("VK_TAB", { shiftKey: true }),
+                     window, $("o13"), true, "shift+tab with focus on hidden content");
+  }
+
+  // cases with selection in an <input>
+
   var t19 = getById("t19");
   t19.setSelectionRange(0, 0);
   setFocusTo("t18", gChildWindow);
 
   gLastFocusMethod = fm.FLAG_BYMOVEFOCUS;
   expectFocusShift(function () newFocus = fm.moveFocus(null, null, fm.MOVEFOCUS_FORWARD, 0),
                    gChildWindow, t19, true, "moveFocus to next textbox");
   is(t19.selectionStart, 0, "input focused after moveFocus selectionStart");
--- a/extensions/auth/nsAuthSSPI.cpp
+++ b/extensions/auth/nsAuthSSPI.cpp
@@ -15,16 +15,17 @@
  * The Original Code is the SSPI NegotiateAuth Module
  *
  * The Initial Developer of the Original Code is IBM Corporation.
  * Portions created by the Initial Developer are Copyright (C) 2004
  * the Initial Developer. All Rights Reserved.
  *
  * Contributor(s):
  *   Darin Fisher <darin@meer.net>
+ *   Jim Mathies <jmathies@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
@@ -223,22 +224,18 @@ NS_IMETHODIMP
 nsAuthSSPI::Init(const char *serviceName,
                  PRUint32    serviceFlags,
                  const PRUnichar *domain,
                  const PRUnichar *username,
                  const PRUnichar *password)
 {
     LOG(("  nsAuthSSPI::Init\n"));
 
-    // we don't expect to be passed any user credentials
-    NS_ASSERTION(!domain && !username && !password, "unexpected credentials");
-
-    // if we're configured for SPNEGO (Negotiate) or Kerberos, then it's critical 
-    // that the caller supply a service name to be used.
-    // For NTLM, the service principal name can no longer be null. (Bug 487872)
+    // The caller must supply a service name to be used. (For why we now require
+    // a service name for NTLM, see bug 487872.)
     NS_ENSURE_TRUE(serviceName && *serviceName, NS_ERROR_INVALID_ARG);
 
     nsresult rv;
 
     // XXX lazy initialization like this assumes that we are single threaded
     if (!sspi) {
         rv = InitSSPI();
         if (NS_FAILED(rv))
@@ -261,28 +258,51 @@ nsAuthSSPI::Init(const char *serviceName
         LOG(("%s package not found\n", package));
         return NS_ERROR_UNEXPECTED;
     }
     mMaxTokenLen = pinfo->cbMaxToken;
     (sspi->FreeContextBuffer)(pinfo);
 
     TimeStamp useBefore;
 
+    SEC_WINNT_AUTH_IDENTITY_W ai;
+    SEC_WINNT_AUTH_IDENTITY_W *pai = nsnull;
+    
+    // domain, username, and password will be null if nsHttpNTLMAuth's ChallengeReceived
+    // returns false for identityInvalid. Use default credentials in this case by passing
+    // null for pai.
+    if (username && password) {
+        if (domain) {
+            ai.Domain = const_cast<unsigned short*>(domain);
+            ai.DomainLength = wcslen(domain);
+        }
+        else {
+            ai.Domain = NULL;
+            ai.DomainLength = 0;
+        }
+        ai.User = const_cast<unsigned short*>(username);
+        ai.UserLength = wcslen(username);
+        ai.Password = const_cast<unsigned short*>(password);
+        ai.PasswordLength = wcslen(password);
+        ai.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
+        pai = &ai;
+    }
+
     rc = (sspi->AcquireCredentialsHandleW)(NULL,
                                            package,
                                            SECPKG_CRED_OUTBOUND,
                                            NULL,
-                                           NULL,
+                                           pai,
                                            NULL,
                                            NULL,
                                            &mCred,
                                            &useBefore);
     if (rc != SEC_E_OK)
         return NS_ERROR_UNEXPECTED;
-
+    LOG(("AcquireCredentialsHandle() succeeded.\n"));
     return NS_OK;
 }
 
 NS_IMETHODIMP
 nsAuthSSPI::GetNextToken(const void *inToken,
                          PRUint32    inTokenLen,
                          void      **outToken,
                          PRUint32   *outTokenLen)
@@ -346,16 +366,24 @@ nsAuthSSPI::GetNextToken(const void *inT
                                             SECURITY_NATIVE_DREP,
                                             inToken ? &ibd : NULL,
                                             0,
                                             &mCtxt,
                                             &obd,
                                             &ctxAttr,
                                             &ignored);
     if (rc == SEC_I_CONTINUE_NEEDED || rc == SEC_E_OK) {
+
+#ifdef PR_LOGGING
+        if (rc == SEC_E_OK)
+            LOG(("InitializeSecurityContext: succeeded.\n"));
+        else
+            LOG(("InitializeSecurityContext: continue.\n"));
+#endif
+
         if (!ob.cbBuffer) {
             nsMemory::Free(ob.pvBuffer);
             ob.pvBuffer = NULL;
         }
         *outToken = ob.pvBuffer;
         *outTokenLen = ob.cbBuffer;
 
         if (rc == SEC_E_OK)
--- a/extensions/auth/nsHttpNegotiateAuth.cpp
+++ b/extensions/auth/nsHttpNegotiateAuth.cpp
@@ -252,25 +252,25 @@ nsHttpNegotiateAuth::GenerateCredentials
     PRUint32 inTokenLen, outTokenLen;
 
     if (len > kNegotiateLen) {
         challenge += kNegotiateLen;
         while (*challenge == ' ')
             challenge++;
         len = strlen(challenge);
 
+        // strip off any padding (see bug 230351)
+        while (challenge[len - 1] == '=')
+            len--;
+
         inTokenLen = (len * 3)/4;
         inToken = malloc(inTokenLen);
         if (!inToken)
             return (NS_ERROR_OUT_OF_MEMORY);
 
-        // strip off any padding (see bug 230351)
-        while (challenge[len - 1] == '=')
-            len--;
-
         //
         // Decode the response that followed the "Negotiate" token
         //
         if (PL_Base64Decode(challenge, len, (char *) inToken) == NULL) {
             free(inToken);
             return(NS_ERROR_UNEXPECTED);
         }
     }
--- a/extensions/spellcheck/hunspell/src/csutil.cpp
+++ b/extensions/spellcheck/hunspell/src/csutil.cpp
@@ -5226,71 +5226,84 @@ struct cs_info * get_current_cs(const ch
   nsCOMPtr<nsICaseConversion> caseConv;
 
   nsresult rv;
   nsCOMPtr<nsICharsetConverterManager> ccm = do_GetService(kCharsetConverterManagerCID, &rv);
   if (NS_FAILED(rv))
     return nsnull;
 
   rv = ccm->GetUnicodeEncoder(es, getter_AddRefs(encoder));
-  if (encoder && NS_SUCCEEDED(rv))
-    encoder->SetOutputErrorBehavior(encoder->kOnError_Replace, nsnull, '?');
   if (NS_FAILED(rv))
     return nsnull;
+  encoder->SetOutputErrorBehavior(encoder->kOnError_Signal, nsnull, '?');
   rv = ccm->GetUnicodeDecoder(es, getter_AddRefs(decoder));
+  if (NS_FAILED(rv))
+    return nsnull;
+  decoder->SetInputErrorBehavior(decoder->kOnError_Signal);
 
   caseConv = do_GetService(kUnicharUtilCID, &rv);
   if (NS_FAILED(rv))
     return nsnull;
 
   ccs = (struct cs_info *) malloc(256 * sizeof(cs_info));
 
-  PRInt32 charLength = 256;
-  PRInt32 uniLength = 512;
-  char *source = (char *)malloc(charLength * sizeof(char));
-  PRUnichar *uni = (PRUnichar *)malloc(uniLength * sizeof(PRUnichar));
-  char *lower = (char *)malloc(charLength * sizeof(char));
-  char *upper = (char *)malloc(charLength * sizeof(char));
-
-  // Create a long string of all chars.
-  unsigned int i;
-  for (i = 0x00; i <= 0xff ; ++i) {
-    source[i] = i;
-  }
-
-  // Convert this long string to unicode
-  rv = decoder->Convert(source, &charLength, uni, &uniLength);
+  for (unsigned int i = 0; i <= 0xff; ++i) {
+    PRBool success = PR_FALSE;
+    // We want to find the upper/lowercase equivalents of each byte
+    // in this 1-byte character encoding.  Call our encoding/decoding
+    // APIs separately for each byte since they may reject some of the
+    // bytes, and we want to handle errors separately for each byte.
+    char lower, upper;
+    do {
+      if (i == 0)
+        break;
+      const char source = char(i);
+      PRUnichar uni, uniCased;
+      PRInt32 charLength = 1, uniLength = 1;
 
-  // Do case conversion stuff, and convert back.
-  caseConv->ToUpper(uni, uni, uniLength);
-  encoder->Convert(uni, &uniLength, upper, &charLength);
+      rv = decoder->Convert(&source, &charLength, &uni, &uniLength);
+      // Explicitly check NS_OK because we don't want to allow
+      // NS_OK_UDEC_MOREOUTPUT or NS_OK_UDEC_MOREINPUT.
+      if (rv != NS_OK || charLength != 1 || uniLength != 1)
+        break;
+      rv = caseConv->ToLower(uni, &uniCased);
+      if (NS_FAILED(rv))
+        break;
+      rv = encoder->Convert(&uniCased, &uniLength, &lower, &charLength);
+      // Explicitly check NS_OK because we don't want to allow
+      // NS_OK_UDEC_MOREOUTPUT or NS_OK_UDEC_MOREINPUT.
+      if (rv != NS_OK || charLength != 1 || uniLength != 1)
+        break;
 
-  uniLength = 512;
-  charLength = 256;
-  rv = decoder->Convert(source, &charLength, uni, &uniLength);
-  caseConv->ToLower(uni, uni, uniLength);
-  encoder->Convert(uni, &uniLength, lower, &charLength);
+      rv = caseConv->ToUpper(uni, &uniCased);
+      if (NS_FAILED(rv))
+        break;
+      rv = encoder->Convert(&uniCased, &uniLength, &upper, &charLength);
+      // Explicitly check NS_OK because we don't want to allow
+      // NS_OK_UDEC_MOREOUTPUT or NS_OK_UDEC_MOREINPUT.
+      if (rv != NS_OK || charLength != 1 || uniLength != 1)
+        break;
 
-  // Store
-  for (i = 0x00; i <= 0xff ; ++i) {
-    ccs[i].cupper = upper[i];
-    ccs[i].clower = lower[i];
-    
+      success = PR_TRUE;
+    } while (0);
+
+    if (success) {
+      ccs[i].cupper = upper;
+      ccs[i].clower = lower;
+    } else {
+      ccs[i].cupper = i;
+      ccs[i].clower = i;
+    }
+
     if (ccs[i].clower != (unsigned char)i)
       ccs[i].ccase = true;
     else
       ccs[i].ccase = false;
-      
   }
 
-  free(source);
-  free(uni);
-  free(lower);
-  free(upper);
-
   return ccs;
 }
 #endif
 
 // primitive isalpha() replacement for tokenization
 char * get_casechars(const char * enc) {
     struct cs_info * csconv = get_current_cs(enc);
     char expw[MAXLNLEN];
--- a/gfx/qcms/Makefile.in
+++ b/gfx/qcms/Makefile.in
@@ -16,20 +16,25 @@ EXPORTS      = qcms.h qcmstypes.h
 CSRCS = iccread.c transform.c
 
 ifeq (86,$(findstring 86,$(OS_TEST)))
 	CSRCS += transform-sse2.c transform-sse1.c
 ifdef GNU_CC
 	SSE1_FLAGS=-msse
 	SSE2_FLAGS=-msse2
 else
+ifeq ($(SOLARIS_SUNPRO_CC),1)
+	SSE1_FLAGS=-xarch=sse
+	SSE2_FLAGS=-xarch=sse2
+else
 	SSE1_FLAGS=
 	SSE2_FLAGS=
 endif
 endif
+endif
 
 FORCE_STATIC_LIB = 1
 # This library is used by other shared libs
 FORCE_USE_PIC = 1
 
 include $(topsrcdir)/config/rules.mk
 
 CFLAGS          += -DMOZ_QCMS
--- a/gfx/qcms/transform.c
+++ b/gfx/qcms/transform.c
@@ -20,20 +20,20 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #include <stdlib.h>
 #include <math.h>
 #include <assert.h>
 #include "qcmsint.h"
 
-/* for MSVC, GCC, and Intel compilers */
-#if defined(_M_IX86) || defined(__i386__) || defined(_M_AMD64) || defined(__x86_64__)
+/* for MSVC, GCC, Intel, and Sun compilers */
+#if defined(_M_IX86) || defined(__i386__) || defined(__i386) || defined(_M_AMD64) || defined(__x86_64__) || defined(__x86_64)
 #define X86
-#endif /* _M_IX86 || __i386__ || _M_AMD64 || __x86_64__ */
+#endif /* _M_IX86 || __i386__ || __i386 || _M_AMD64 || __x86_64__ || __x86_64 */
 
 //XXX: could use a bettername
 typedef uint16_t uint16_fract_t;
 
 /* value must be a value between 0 and 1 */
 //XXX: is the above a good restriction to have?
 float lut_interp_linear(double value, uint16_t *table, int length)
 {
@@ -1057,17 +1057,17 @@ static void cpuid(uint32_t fxn, uint32_t
               mov    d_, edx
               xchg   ebx, esi
        }
        *a = a_;
        *b = b_;
        *c = c_;
        *d = d_;
 }
-#elif defined(__GNUC__) && defined(__i386__)
+#elif (defined(__GNUC__) || defined(__SUNPRO_C)) && (defined(__i386__) || defined(__i386))
 #define HAS_CPUID
 /* Get us a CPUID function. We can't use ebx because it's the PIC register on
    some platforms, so we use ESI instead and save ebx to avoid clobbering it. */
 static void cpuid(uint32_t fxn, uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d) {
 
 	uint32_t a_, b_, c_, d_;
        __asm__ __volatile__ ("xchgl %%ebx, %%esi; cpuid; xchgl %%ebx, %%esi;" 
                              : "=a" (a_), "=S" (b_), "=c" (c_), "=d" (d_) : "a" (fxn));
@@ -1083,17 +1083,17 @@ static void cpuid(uint32_t fxn, uint32_t
 /* MMX is always supported per
  *  Gecko v1.9.1 minimum CPU requirements */
 #define SSE1_EDX_MASK (1UL << 25)
 #define SSE2_EDX_MASK (1UL << 26)
 #define SSE3_ECX_MASK (1UL <<  0)
 
 static int sse_version_available(void)
 {
-#if defined(__x86_64__) || defined(_M_AMD64)
+#if defined(__x86_64__) || defined(__x86_64) || defined(_M_AMD64)
 	/* we know at build time that 64-bit CPUs always have SSE2
 	 * this tells the compiler that non-SSE2 branches will never be
 	 * taken (i.e. OK to optimze away the SSE1 and non-SIMD code */
 	return 2;
 #elif defined(HAS_CPUID)
 	static int sse_version = -1;
 	uint32_t a, b, c, d;
 	uint32_t function = 0x00000001;
--- a/intl/uconv/src/nsCharsetConverterManager.cpp
+++ b/intl/uconv/src/nsCharsetConverterManager.cpp
@@ -58,48 +58,36 @@
 
 // just for CONTRACTIDs
 #include "nsCharsetConverterManager.h"
 
 #ifdef MOZ_USE_NATIVE_UCONV
 #include "nsNativeUConvService.h"
 #endif
 
-// Pattern of cached, commonly used, single byte decoder
-#define NS_1BYTE_CODER_PATTERN "ISO-8859"
-#define NS_1BYTE_CODER_PATTERN_LEN 8
-
 // Class nsCharsetConverterManager [implementation]
 
 NS_IMPL_THREADSAFE_ISUPPORTS1(nsCharsetConverterManager,
                               nsICharsetConverterManager)
 
 nsCharsetConverterManager::nsCharsetConverterManager() 
   : mDataBundle(NULL)
   , mTitleBundle(NULL)
-  , mDecoderHashMutex("nsCharsetConverterManager mDecoderHashMutex")
 {
 #ifdef MOZ_USE_NATIVE_UCONV
   mNativeUC = do_GetService(NS_NATIVE_UCONV_SERVICE_CONTRACT_ID);
 #endif
 }
 
 nsCharsetConverterManager::~nsCharsetConverterManager() 
 {
   NS_IF_RELEASE(mDataBundle);
   NS_IF_RELEASE(mTitleBundle);
 }
 
-nsresult nsCharsetConverterManager::Init()
-{
-  if (!mDecoderHash.Init())
-    return NS_ERROR_OUT_OF_MEMORY;
-  return NS_OK;
-}
-
 nsresult nsCharsetConverterManager::RegisterConverterManagerData()
 {
   nsresult rv;
   nsCOMPtr<nsICategoryManager> catman = do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv);
   if (NS_FAILED(rv))
     return rv;
 
   RegisterConverterCategory(catman, NS_TITLE_BUNDLE_CATEGORY,
@@ -260,33 +248,18 @@ nsCharsetConverterManager::GetUnicodeDec
     }
   }
 #endif
   nsresult rv = NS_OK;
 
   NS_NAMED_LITERAL_CSTRING(contractbase, NS_UNICODEDECODER_CONTRACTID_BASE);
   nsDependentCString src(aSrc);
   
-  if (!strncmp(aSrc, NS_1BYTE_CODER_PATTERN, NS_1BYTE_CODER_PATTERN_LEN))
-  {
-    mozilla::MutexAutoLock autoLock(mDecoderHashMutex);
-    // Single byte decoders don't hold state. Optimize by using a service, and
-    // cache it in our hash to avoid repeated trips through the service manager.
-    if (!mDecoderHash.Get(aSrc, getter_AddRefs(decoder))) {
-      decoder = do_GetService(PromiseFlatCString(contractbase + src).get(),
+  decoder = do_CreateInstance(PromiseFlatCString(contractbase + src).get(),
                               &rv);
-      if (NS_SUCCEEDED(rv))
-        mDecoderHash.Put(aSrc, decoder);
-    }
-  }
-  else
-  {
-    decoder = do_CreateInstance(PromiseFlatCString(contractbase + src).get(),
-                                &rv);
-  }
   NS_ENSURE_SUCCESS(rv, NS_ERROR_UCONV_NOCONV);
 
   decoder.forget(aResult);
   return rv;
 }
 
 nsresult 
 nsCharsetConverterManager::GetList(const nsACString& aCategory,
--- a/intl/uconv/src/nsCharsetConverterManager.h
+++ b/intl/uconv/src/nsCharsetConverterManager.h
@@ -52,30 +52,25 @@ class nsCharsetConverterManager : public
   NS_DECL_ISUPPORTS
   NS_DECL_NSICHARSETCONVERTERMANAGER
 
 public:
 
   nsCharsetConverterManager();
   virtual ~nsCharsetConverterManager();
 
-  nsresult Init();
-
 private:
 
   nsIStringBundle * mDataBundle;
   nsIStringBundle * mTitleBundle;
 
 #ifdef MOZ_USE_NATIVE_UCONV
   nsCOMPtr<nsINativeUConvService> mNativeUC;
 #endif
 
-  nsInterfaceHashtable<nsCharPtrHashKey, nsIUnicodeDecoder> mDecoderHash;
-  mozilla::Mutex                                            mDecoderHashMutex;
-
   nsresult LoadExtensibleBundle(const char * aRegistryKey, 
       nsIStringBundle ** aResult);
 
   static nsresult RegisterConverterCategory(nsICategoryManager*,
                                             const char* aCategory,
                                             const char* aURL);
 
   nsresult GetBundleValue(nsIStringBundle * aBundle,
--- a/intl/uconv/src/nsUConvModule.cpp
+++ b/intl/uconv/src/nsUConvModule.cpp
@@ -605,17 +605,17 @@ nsConverterManagerDataRegister(nsICompon
                                 nsIFile* aPath,
                                 const char *aLocation,
                                 const char *aType,
                                 const nsModuleComponentInfo* aInfo)
 {
   return nsCharsetConverterManager::RegisterConverterManagerData();
 }
 
-NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsCharsetConverterManager, Init)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsCharsetConverterManager)
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsTextToSubURI)
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsUTF8ConverterService)
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsCharsetAlias2)
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsConverterInputStream)
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsConverterOutputStream)
 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPlatformCharset, Init)
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsScriptableUnicodeConverter)
 
index 2c8854244be083fab9cd834e784cb22c127d2d55..87dee8a13ada7e5d227deb86d9345c0a5fe5cc45
GIT binary patch
literal 18511
zc%1D#Yg6M$lKXL2f8y%ch~cruje!OlX7+-nVVbyJx`W3}%uP&yER}Ix%aXSw;r47y
z@YgRhE2~s`*yh-{FBj+7Z9uBZ%F6f4b30bKfd9o=^d?cm(Ma`GI?8%ts<XI^WGser
zF$up)d@7!#&Q+F*{r+HAjC3{$`ft3Qh5V-aL2!#OCt+HK34$JFT704fJrRm&ri*Zx
zNPH~SW4b*m)2Kk8DlMcQg^>&ZoDTIIKnWqvvgur_$8jMx&NjvF&d!mz2DCngMNeF&
zky#|f7pW&IC+y(NM;!vRSQMFvV1G}<DlfDemW32y8ovRQCRwaTb5Q`Y1_E59oXE5g
zWg1HjFQfp3Cb`H)^v91^cj8BxN)6ZgQVtUp!L=fp<^YmGO!09(HdMns7g|bjlZ}d5
zsNt^+K!<qQ6CoA6*N&pQJ&|bxWFsuZJS(-xrnqzy5T1)9EUMLgAx`OD7PW-&uvbxO
zl$0@`p;CIEOG9F~ohlM|zP9)>Ye3Q9^6KLA_J_;s?VIzn+sn^a!OiXI_3gHMe13I%
z{d2G-4C9Z*hWTZ)FZ|D!)w~vt*XLIsn(%{v2`*G3k3~%~#Z?x=v)gQnzsqmMF~~td
z;)<~0;oTH4ik03B0<$yNqR;<}=KlfF+!BA2X?cvl_-sEu7LCtOW55;&ZbabUVEtXL
z(nl+^t@R(X88W5JrIj~43mFHSE@W7gTITg_AWrF{JwZfax?TXU`h;36zqQZc554U#
zm+yv58$tJP01v-t`D8T#g&uwjf<gP{%})@VWs@l!t&I+hL5M{npJW2uOdreeQG%cn
z4?rp-zz28*Fh^OE0F@#MilWjW%F-v~TbAa1B!<j!v3n*^uu>VxJO`EOA;+ho2Hn6T
za|yo#bO3^wkmw=#XPN#Az&@uS8f7&0;Ngu>V%DNCNstWHD-aAgU9?}|o)FF|P#nWN
zFDFxj+9ZTKu_i=Jiy$0kWg%uD{9psD?uYu3bT1b(l_X+_<^gm?7@5^`L^^cKQT~Gt
zJi;W;L_U>~8Y!TyIRg*Z667isPhnD$;qhPvWTD_JL)=BzBgolA7HR^JaS>V<B-H8q
z%Qe*9wbSVo)X32Iy-I-_C|<^-tpRj0R5t(v-98wo2@+^7(yS0)Q(!o-o@@@BfQ0l}
zHbc2^GzyUAKoFqP6v%DNT#Y&xa7C5oMVLksj4s>ODUbn-2p&3=L6Idfo~g@po6a<h
zK@`$*GK7U-C`B=!O0s|zhe|#Xi6Fw@Q30L&!yk;XUq@9%9BDm>B}tmQIsky*pA<+)
z7!0+FA0-7lgn*AO?=YsEWGE(OF@_&m_K@&_>^Cgn+;cZQU;P;51o#|OP7)4y3bo40
zyh8|#?vW&bauQ?)g03P93^Bk^JCU|>NWLI6)T#~x>>{nEMr?@*#CUV5i;GKv%!`fT
zxG<hlTv*UftjH0tBlRTOox;jI&8B4%YLSK$BmR!Y=Het>=3YqIV5U`3NR%2-K<TWN
zV>;O?Z&3&`jLyt1G^!M|_@X832B(!K9*@X>Wiy$B&6<P}7<;77RD$(Riy#T-02t*D
z?uVO4#z(}hYgZQ{s+f(FGA{xMnDYX~`^l3Py7U-moFEP$<%ZehUk%yGTI8%^!B7@6
zDUCZVW?5yzNwb&vn1(wsKBnpNoS*54vdH1=*5Cw9SK~QsREhUtuA;olHR9VLzO@eZ
z^vfms(i=6ILR5DCEySPAou?u<@1=Q<J8sc5EcCt%oha)GdrtnoObUh2z;?DFd{Cni
z7;Xr}ko0)xyqF`GG9!*tFp9vRNuTd}mSj1Q5HHez^%ICF?hlQdg*!VlwIb|wBy<d`
z(}y`zV@a^vA9y>1A8MZ<aCVVgBuT!B^gs+jGSOC%2&0;zlsUo1B{K*sJv$Ruo5^>q
zw%TZK;b5Ua%^+NzNraR8-jP_v0i{PLmYI>#IeG`YFdmDV1z{MPm<aTm;%e~#_qzwH
zw=S~be?iPiSO$}@h{mkxIjAg2eDfs#mSknD!9|-J*gytEK~BM`L?K3yiUKh33KJ97
zU<wV0v2Y;}^j0JR0ser84nubLYw-IT+OP_B&+?ujwaMCEpj`=W(P<$nvTf1Lje8W@
z)-Fbnahp9CXu7@atogCP_i$(dj>lgrHW($bb#{5tqj%v@q0;n%O32F;X-Y1(5Lc(y
zKi-(7#Llhj+n>Lj`wzBY1wOmk3~Y1_G)_TL!bJTBT!OPi7)6<mk#H=F#>pcOCg_xN
zn{@#$*2&<nCbB<)m_|>?)IWeLyZ>;0aeDXZ_8wNO<LViUt^qNFObv*#1wKT!EW?Nr
zHI3d1RX(g_Qkc8i(^>fIB0r{(3IjYBXGW2n7JxoMaLypk;NlpF&82k;7z+TXYHxl5
zA+EG|8uM+ycxlTre2En%R`xXAY7KG+Wlw|YFEu-5V>pLKcMOze$_iAxLhRTwJ0>y5
z&Dl>Nr5RDmJC_kcXXaLuhNEfn$t@E}#D#^IqlyJPJws?qe0&B{36zK}7Iih?dmuuN
z3#<beUG(T~fSR}0yk56<!6pivNRy;}{&x_tk$@mi&yA_VOb5I-L4lBCDs?hHF^k`y
zez?b*f_Ty{^es$Lk1|HBb3e7tw1!6~5cF4ojBJmbCOB0gN~91=D5k`%jhri~WE+)w
zdKgy*$(fYEJc7;ZZtro^m^@`F7It0JgwV^ai!1xv^?#gxx;r<2c_syn1ih%)2xCrb
zmhIxIZ7KY~)>sY5VF?Og(5HVZ$%3d8d`FD=2$~mTT4Sb1!){tFBFx%qB%*PdenkdO
zBxvB=C=dzB7&9H?=yI?x22Ruc_%4U=8)D$AA?lTBRz8wjvVg26A~f>1c0*n&%r+q2
zPsk>pu!|}<v6Ol}cblhRQ`Ar;s-W~%rn%93#ma@0ie&^yNN39`gnes}iwET3y4dh2
zhvIurk2g^{fxZ>#oN5vfIIDW~aCP_T(>m{H<<3~dR(TZaxKeDEm6mleB39WJa|im%
z3X5Tt0h44Vcg~5-BvG)!85EAjP4dpnY7oi5X;BI!4UN0!7&cU2_Iqr-X7F~0Nz}Sf
zWy6+*i>=tugp6c{s{)cAQ+5T9yA3#v0MZ1JAF-rClrFS-0$X7ta&vE^qz}`w$k)-r
z$Qh-T&R_qTD}&<uyogoSAOE%a94`k?t+6X0s8Z<$8-jmWBVo-7{Qty%W?~HVo4*Wx
zb#II$7!LZ+qcJ3<Te<rikJHgfVE=xDB|d8r>*Bzj5)`&vY`w8N=;WPW#Sh{;rvog1
z6*dMBvnpS98W~Op+eT#8ByD^L|MWy7!s&?tM`wTf6K||gDFKrnA-O4j_(2$#wOLu-
ze|Sb%<bdDWM~Kri@l&Rg_+Qsf{MXjTGaAV9p7>5jJ-*;(Z8cm@M*>p?)UMn!ht?93
zzrZX30O740yIKFt?uEI^I)wl|k!P5!h}wq^K<FErB76+7ZU7HvSiLj_CC(-w{(6*^
znROpyfdE^d;f_!?SBSDK`6np#ySq2ry&Zn}`-+T_b)B<&Ka6!2;6*9qo&gnjI`8H7
zU$mNlh(5{A?E8JGl44t#=#Vn)8yin{Ch9j;v}rdW*hNKv=7y>mu#_|noU4r5;b!X`
zbaA8sB+`vt!FJcjORBw^UzH0CeS)~qB(uKA6et5*(6rHZWo6K}djWS2JZSh<8z3=7
zj34g1kSWEa!qz~^cUjPdp#{~#Mz;0i`&zWw4>iki#HXF6F6rxuqwOKa7@&-gsE)9<
zwlDYhi5G6d!v+UkrwtBPA6M-ZFWrU*?(KFRxVO9dz-p&>={7v@V883YgZ<S9Ry)N@
zw~dl4EIesBgCLC_wU@?OIZR}IEkEnH2>Q_aT2~ODR~<KKZ)tB3VuMmi8%>$01Em>s
z2J}ASFk1e-R3NUhis=Ac1&1mtoZn%>6k}gRfyiUECm&~J!g&X0ahT~eF{M1Kabd0y
zqv^Dv@N6tiB4`!>w&qs-%^JPnP+cq_n0ePhv5rlP)}mxB0FQ6F1**QGdtI4i>Ei;(
z^r{1Nd&`2A__!u_pHo+7&26omij)jP_!7y<KPCrqq*9ky01(p{aG-je5P=}o&gXE#
zsg<qQHj@aD%b%U(a9+$K1{7Uzs?oFN^bs<ZMCP`KuQc@_?EPWMc^HlPCH2p3-N7pX
zP&DI8o(0wzDHM%ka9w#Y8&hS>RH{J-T50Rj%)$48Ro39e2qtuB`_P8N-1R`Ud}R=v
zCdHVtSXXS}q=>pyK#{zhVylcOS*DbR!Ea#Fwns`r$cK!>R_Rpg5k%df!Q*f`oqHvE
zd%75g(O2@E0IL`?$B1@RLk^sqrFw7`QDhZz!?`Ico8o;6Sxl=U6CkDvr3mXE_U&;c
z?B0$s7rISn9f3mP2_ZsmmV^2GP2Lv*f2@0fqYWvsvke$kcC0d9Ud09_8}9I%)EQ@6
z4Z~uJ0_gnzHxHp3d+;wPVRmF@Rb{|fvXBIk3RzeUyT7@;zB{|M^%h4(v9)Due_iN@
zTsYXqkr^=ZID8Xo9ny$ORRPF6ws=su$YyHt#?@dojt@kk6C{Q<S25RF)x_yiq-8<p
zUTsT9#2L^4L?uNw_4do>VOvze=72rOv5{=58o@&`v9(^)^!}vM@*5;i57Y!6Gxcq<
zKjsb(@2KqTF=s3MqL}y@B-L3a_qmKtS`UFm?S~)}x?^b^&O4rF9RTJs>;N$91TgP>
zs`5B5yvJ{_#h2lPl{TI0QAx%EEPub21(HufAouqG=5bPFqtX4n2kHJk0;5)N&4E_^
z1~TT>{C-j+xfxl}rc4)`S%6s9vIL_@O!>-q9ebH`EuVLq1V`h~R*q`ajNjf{ZTn@g
z`)h3}-cp^^@^jwPM+*kYu>I2+9C)^K(zU@Jf~An=!Sy4M_#27<2_?Q4@8HK@{<7&W
z@c>uYt9mg8qn%FNs~zteJCL<q$a@r8QSs^CG{8-0v`(6}4qi+7A(l*R0tZ}ns*K83
zPv+3)apk9$G#a_}3rCwZ(OpqlXx0)qN~kx!t16=x9yCh}`*m3D`Xa;$w$sM}8x0HD
zIUUzoja`Qx;o$sAmeSY-IGdoFJ3<}$c63kyLq9x(h!8w(5t}{+#t9FjFfZzD4K7%^
zfWT$<ID=ISR=8gNF`Hr6$3>!n9f`wa!y>TFGda-<+W%d|ZL*?^$ZwmwJIc5?3}A0Y
zlVx7<Vir<20H<qY$KZn4_Gi~z6~pv3iJGw_ONFyYQ8pQ(FUEa-XVj}taQ$OcCV~Rl
znH`y^&5Yr2sz0$c(-8deTw@Sw2oq_(r@=isV-!ZF#i8nBb5TVh9FAjx@i=2v1k7Ve
zGk_G^+Z@7#Mu>YfmJn)E!w$ojvrnII?yk>o*4aH`2{M)@AdxOVgn#CAO6>%)_oX&t
zCw9PuXZGInxItub#HJ!mb>%t4k%@^?fo$INmzn88Z%%qJ4>V@Vcq#|nIB&(ng4v>6
zE6vhv`AtS8jj#n{8BPJGznT8lBuv9c6Ca@-IOH&1pbj<<o=rnVwJ^t=?v~*eRY?ty
zdqPfZa9n(I`Jd;uW4Lwp`NKI|{Zn%V+0lHnEgakmXcW@Poa_5?Pqto1M)9NRaL%rJ
zB+?M0=7LV<b!KnfKUajZn{CsBknkej60RC4E?H1dkApV8zKz@Zi+ig~rxA{KZy3t_
zbbWby`u>w84o!YDHJI1+&Ss6)b{xg)pWAL$n<(7c3@tHjEABH`U2mSq9a?qTZ2Qa{
z-K(-%ij6Rm2|{lYhC?0Oi);2uFTl1WT+2aqw4*V|AgkUB`_!F7FH8~=K95Ggd!yR^
z+)GDidt>Y3?rO8U>3w~E+tuf$aT&AX?&kdZ{=@0*>1OMReSjkP>GK)0_)9ek)VQsc
zJVx6Fl$L)q&e$b!C$5m<guKOk%X7*WI|RudeR*MzUCq$;V2`^xC3iTWZH;^kJewF1
zRCYSDhcyG|F5pkw{GsnLEToR1rbV-@z%RWkaNPoNSDKAgG<HKG?0IIkscliJraGRo
zuM%g#FAL98%@hPHe&3NR20+|e4(!vo8p(d>5^Re!$fF11v}p)gUtQmz(PZ-*1${r;
z2TE|M1-p45OvswV7!8j)ltNP1Ja%7Rp^pJfM#{7@47R8zHFT>!zn|PUtbdJiHPdZ0
zxGoP)<Qk;Saca4eM`!$ANazJ`jc70(7Yz@gCC<LG)ge!WUjd+ZGJ%Kyzn-9VrrjvS
z2w7;S$GZ>iRpASSy-o>y>OgR%v#D0-TbaDuMOJ-Nsw!VnX$>MqoJ>PUMxmdU5S{CG
zIg)LS^~C-+AYx2w$XnoaC{~%ccg4eSG-4-N7TqvrWt$-LX{#@_u$HDa?ICFURkK)r
zb76O5fZB~j@3jE5zl5{ph1xjT!yC+K1kaLVZ1NM_MkWz`JHw8vW_S@BCI+m9Ia7YC
zDpg?_)yqgM`&$EqZoCK>h9RV3Hhxurj;(6sesjYWe|XfAD?dFkEDKXiH(-!iS|$n^
zunI%$RGG3aeJ{h6#JqjNi_h_l>cyH4XKVZzzbePynp-&}Q|D<1>m6TdWx(9~!ykW9
z`1c?F_^aOtUo>{!_*CUS|4Wk_2_^)C-Aw=lWPJ%Ne=NTO#ent*(2}qJ9RE)MwZDAQ
ziQo$WsnJWWRt+X~&}g3kc@y?40C|aTzXKyqQdXd~8W7m)f0k=|0|aDeLtcQ<A{y;i
zfc)qr>;$>=YVVqWFuz!U*)l-82TUWE5-+*lYGV7fs}+D2%F#g`P~{I7d_`puMtl1f
z5GN1c5B|Ckr=@@n>wuODz|yN7SwPf)S_Wo?JsS9ccnn|>yhcN?cD4OFAeu8+h}SYe
zd$p^1P2w(S%K#nLG2)nJ0ZvN+y{!SF0fARtZU3+i2oPG#x@CY4c3Xf32e0AU?p_Pf
z-tMaay=wtF*nbV6y|*nuN3SCGph0XDq*nnts0*Z-%XrPz-X7Edm9Lkh{W_pm%hB6+
zEkLi7qn#F@SIW^r3(za&XtxFEm2%V|_Uq-SF4^Vl<*2T-m@>bP{R86K;&1xapso&U
zs9d$oHJZ=TAY#V?dO@VMG(G|vVQO$2K8jmRPmTlk9~XH(INS-^|0#y&!T!!c(Ej@D
z^WM(>ZqWRW=JVeE;bG7<ivN7DbF?3L6S~ibgTWx^oJ)N^+<Rx&R&M(F-R{7L;2;ln
zb`I@}T3_gSFxY)}7<6`$;N8K&QP7?J!lmCH9R*&t^gMXGb2I?bou{#I<O}{Ajig>D
--- a/js/src/Makefile.in
+++ b/js/src/Makefile.in
@@ -467,33 +467,25 @@ endif
 
 ifdef MOZ_MEMORY
 ifeq ($(OS_ARCH),Darwin)
 LDFLAGS += -ljemalloc
 endif
 endif
 
 ifdef SOLARIS_SUNPRO_CXX
-# Sun Studio x86 has an optimization bug with LIR.cpp, use -xO2 instead.
-ifeq (86,$(findstring 86,$(OS_TEST)))
-LIR.o: LIR.cpp Makefile.in
-	$(REPORT_BUILD)
-	@$(MAKE_DEPS_AUTO_CXX)
-	$(CXX) -o $@ -c $(patsubst -xO%,-xO2,$(COMPILE_CFLAGS)) $<
-else
 # Sun Studio SPARC doesn't work well with gcc inline asm, use lock_SunOS_sparc*.il
 jslock.o: jslock.cpp Makefile.in lock_sparcv8plus.il lock_sparcv9.il
 	$(REPORT_BUILD)
 	@$(MAKE_DEPS_AUTO_CXX)
 ifeq (sparcv9,$(findstring sparcv9,$(OS_TEST)))
 	$(CXX) -o $@ -c $(COMPILE_CFLAGS) $(srcdir)/lock_sparcv9.il $<
 else
 	$(CXX) -o $@ -c $(COMPILE_CFLAGS) $(srcdir)/lock_sparcv8plus.il $<
 endif # sparcv9
-endif # x86
 endif # SOLARIS_SUNPRO_CXX
 
 # Allow building jsinterp.c with special optimization flags
 ifdef INTERP_OPTIMIZER
 jsinterp.$(OBJ_SUFFIX): MODULE_OPTIMIZE_FLAGS=$(INTERP_OPTIMIZER)
 endif
 
 ifeq ($(OS_ARCH),IRIX)
--- a/js/src/config/rules.mk
+++ b/js/src/config/rules.mk
@@ -357,16 +357,19 @@ else
 CXXFLAGS		+= -EHsc
 endif # _MSC_VER
 endif # GNU_CC
 endif # ENABLE_CXX_EXCEPTIONS
 endif # WINNT
 
 ifeq ($(SOLARIS_SUNPRO_CXX),1)
 CXXFLAGS += -features=extensions -D__FUNCTION__=__func__
+ifeq (86,$(findstring 86,$(OS_TEST)))
+OS_LDFLAGS += -M $(topsrcdir)/config/solaris_ia32.map
+endif # x86
 endif # Solaris Sun Studio C++
 
 ifeq (,$(filter-out WINNT WINCE,$(HOST_OS_ARCH)))
 HOST_PDBFILE=$(basename $(@F)).pdb
 endif
 
 ifndef TARGETS
 TARGETS			= $(LIBRARY) $(SHARED_LIBRARY) $(PROGRAM) $(SIMPLE_PROGRAMS) $(HOST_LIBRARY) $(HOST_PROGRAM) $(HOST_SIMPLE_PROGRAMS) $(JAVA_LIBRARY)
new file mode 100644
--- /dev/null
+++ b/js/src/config/solaris_ia32.map
@@ -0,0 +1,1 @@
+hwcap_1 = OVERRIDE;
deleted file mode 100644
--- a/js/src/lock_SunOS.s
+++ /dev/null
@@ -1,119 +0,0 @@
-! 
-! ***** 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 Mozilla Communicator client code, released
-! March 31, 1998.
-!
-! The Initial Developer of the Original Code is
-! Netscape Communications Corporation.
-! Portions created by the Initial Developer are Copyright (C) 1998-1999
-! the Initial Developer. All Rights Reserved.
-!
-! Contributor(s):
-!
-! 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 *****
-
-!
-!  atomic compare-and-swap routines for V8 sparc 
-!  and for V8+ (ultrasparc)
-!
-!
-!  standard asm linkage macros; this module must be compiled
-!  with the -P option (use C preprocessor)
-
-#include <sys/asm_linkage.h>
-
-!  ======================================================================
-!
-!  Perform the sequence *a = b atomically with respect to previous value
-!  of a (a0). If *a==a0 then assign *a to b, all in one atomic operation.
-!  Returns 1 if assignment happened, and 0 otherwise.	
-!
-!  usage : old_val = compare_and_swap(address, oldval, newval)
-!
-!  -----------------------
-!  Note on REGISTER USAGE:
-!  as this is a LEAF procedure, a new stack frame is not created;
-!  we use the caller stack frame so what would normally be %i (input)
-!  registers are actually %o (output registers).  Also, we must not
-!  overwrite the contents of %l (local) registers as they are not
-!  assumed to be volatile during calls.
-!
-!  So, the registers used are:
-!     %o0  [input]   - the address of the value to increment
-!     %o1  [input]   - the old value to compare with	
-!     %o2  [input]   - the new value to set for [%o0]
-!     %o3  [local]   - work register
-!  -----------------------
-#ifndef ULTRA_SPARC
-!  v8	
-
-        ENTRY(compare_and_swap)         ! standard assembler/ELF prologue
-
-	stbar
-	mov -1,%o3                      ! busy flag
-	swap [%o0],%o3                  ! get current value
-l1:	cmp %o3,-1                      ! busy?
-	be,a l1                         ! if so, spin
-	swap [%o0],%o3                  ! using branch-delay to swap back value
-	cmp %o1,%o3                     ! compare old with current
-	be,a l2                         ! if equal then swap in new value
-	swap [%o0],%o2                  ! done.
-	swap [%o0],%o3                  ! otherwise, swap back current value
-	retl
-	mov 0,%o0                       ! return false
-l2:	retl
-	mov 1,%o0                       ! return true
-	
-	SET_SIZE(compare_and_swap)      ! standard assembler/ELF epilogue
-
-!
-!  end
-!
-#else /* ULTRA_SPARC */
-!  ======================================================================
-!
-!  v9
-
-        ENTRY(compare_and_swap)         ! standard assembler/ELF prologue
-
-	stbar
-	cas [%o0],%o1,%o2               ! compare *w with old value and set to new if equal
-	cmp %o1,%o2                     ! did we succeed?
-	be,a m1                         ! yes
-	mov 1,%o0                       ! return true (annulled when no jump)
-        mov 0,%o0                       ! return false
-m1:	retl
-	nop
-		
-	SET_SIZE(compare_and_swap)      ! standard assembler/ELF epilogue
-
-!
-!  end
-!
-!  ======================================================================
-!
-#endif
--- a/js/src/tests/browser.js
+++ b/js/src/tests/browser.js
@@ -590,27 +590,25 @@ function jit(on)
   {
     gJit.content = jitoptions.getBoolPref('content');
     gJit.chrome  = jitoptions.getBoolPref('chrome');
   }
 
   if (on)
   {
     jitoptions.setBoolPref('content', true);
-    jitoptions.setBoolPref('chrome', false);
+    jitoptions.setBoolPref('chrome', true);
   }
   else
   {
     jitoptions.setBoolPref('content', false);
     jitoptions.setBoolPref('chrome', false);
   }
 }
 
-var gVersion = 150;
-
 function jsTestDriverBrowserInit()
 {
 
   if (typeof dump != 'function')
   {
     dump = print;
   }
 
@@ -652,51 +650,43 @@ function jsTestDriverBrowserInit()
     catch(ex)
     {
     }
   }
 
   if (!properties.version && navigator.userAgent.indexOf('Gecko/') != -1)
   {
     // If the version is not specified, and the browser is Gecko,
-    // adjust the version to match the suite version.
-    if (properties.test.match(/^js1_6/))
-    {
-      properties.version = '1.6';
-    }
-    else if (properties.test.match(/^js1_7/))
+    // use the default version corresponding to the shell's version(0).
+    // See https://bugzilla.mozilla.org/show_bug.cgi?id=522760#c11
+    // Otherwise adjust the version to match the suite version for 1.7,
+    // and later due to the use of let, yield, etc.
+    //
+    // Note that js1_8, js1_8_1, and js1_8_5 are treated identically in
+    // the browser.
+    if (properties.test.match(/^js1_7/))
     {
       properties.version = '1.7';
     }
     else if (properties.test.match(/^js1_8/))
     {
       properties.version = '1.8';
     }
-    else if (properties.test.match(/^js1_8_1/))
-    {
-      properties.version = '1.8';
-    }
-    else
-    {
-      properties.version = '1.5';
-    }
   }
 
   // default to language=type;text/javascript. required for
   // reftest style manifests.
   if (!properties.language)
   {
     properties.language = 'type';
     properties.mimetype = 'text/javascript';
   }
 
   gTestPath = properties.test;
 
-  gVersion = 10*parseInt(properties.version.replace(/\./g, ''));
-
   if (properties.gczeal)
   {
     gczeal(Number(properties.gczeal));
   }
 
   /*
    * since the default setting of jit changed from false to true
    * in http://hg.mozilla.org/tracemonkey/rev/685e00e68be9
--- a/js/src/tests/e4x/shell.js
+++ b/js/src/tests/e4x/shell.js
@@ -36,22 +36,16 @@
  * 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 ***** */
 
 gTestsuite = 'e4x';
 
-if (typeof version != 'undefined') {
-    // At least in Rhino, if version is set to 150 (which is what is used
-    // in top level shell.js), the implementation assumes E4X is not available.
-    version(160);
-}
-
 /*
  * Report a failure in the 'accepted' manner
  */
 function reportFailure (section, msg)
 {
     msg = inSection(section)+"\n"+msg;
     var lines = msg.split ("\n");
     for (var i=0; i<lines.length; i++)
--- a/js/src/tests/ecma/Expressions/11.4.9.js
+++ b/js/src/tests/ecma/Expressions/11.4.9.js
@@ -51,19 +51,16 @@ gTestfile = '11.4.9.js';
 */
 var SECTION = "11.4.9";
 var VERSION = "ECMA_1";
 startTest();
 var TITLE   = "Logical NOT operator (!)";
 
 writeHeaderToLog( SECTION + " "+ TITLE);
 
-//    version("130")
-
-
 new TestCase( SECTION,   "!(null)",                true,   !(null) );
 new TestCase( SECTION,   "!(var x)",               true,   !(eval("var x")) );
 new TestCase( SECTION,   "!(void 0)",              true,   !(void 0) );
 
 new TestCase( SECTION,   "!(false)",               true,   !(false) );
 new TestCase( SECTION,   "!(true)",                false,  !(true) );
 new TestCase( SECTION,   "!()",                    true,   !(eval()) );
 new TestCase( SECTION,   "!(0)",                   true,   !(0) );
--- a/js/src/tests/ecma_3_1/shell.js
+++ b/js/src/tests/ecma_3_1/shell.js
@@ -33,15 +33,8 @@
  * 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 ***** */
 
 gTestsuite = 'ecma_3_1';
-
-// explicitly turn on js18
-if (typeof version != 'undefined')
-{
-  version(180);
-}
-
--- a/js/src/tests/js1_5/extensions/jstests.list
+++ b/js/src/tests/js1_5/extensions/jstests.list
@@ -56,17 +56,17 @@ script regress-336410-2.js
 script regress-338804-01.js
 script regress-338804-02.js
 script regress-338804-03.js
 script regress-339685.js
 script regress-340199.js
 script regress-341956-01.js
 script regress-341956-02.js
 script regress-341956-03.js
-random-if(xulRuntime.OS=="WINNT"&&!isDebugBuild) skip-if(xulRuntime.OS=="Linux") script regress-342960.js # slow
+skip-if(!xulRuntime.shell&&(xulRuntime.OS=="WINNT"||xulRuntime.OS=="Linux")) script regress-342960.js # bug 528464
 skip script regress-345967.js # slow
 script regress-346494-01.js
 script regress-346494.js
 random script regress-347306-02.js # BigO
 script regress-348986.js
 script regress-349616.js
 script regress-350312-01.js
 script regress-350312-02.js
@@ -139,17 +139,17 @@ script regress-367501-04.js
 skip-if(xulRuntime.OS=="WINNT"&&isDebugBuild) script regress-367589.js # slow 
 script regress-367630.js
 script regress-367923.js
 script regress-368859.js
 script regress-369404.js
 script regress-369696-01.js
 script regress-369696-02.js
 script regress-369696-03.js
-random-if(xulRuntime.OS=="WINNT"&&isDebugBuild) script regress-371636.js # bug 528284
+random-if(xulRuntime.OS=="WINNT") script regress-371636.js # bug 528284
 script regress-372309.js
 script regress-374589.js
 script regress-375183.js
 script regress-375344.js
 script regress-375801.js
 script regress-376052.js
 script regress-379523.js
 script regress-380581.js
--- a/js/src/tests/js1_6/shell.js
+++ b/js/src/tests/js1_6/shell.js
@@ -33,15 +33,8 @@
  * 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 ***** */
 
 gTestsuite = 'js1_6';
-
-// explicitly turn on js16
-if (typeof version != 'undefined')
-{
-  version(160);
-}
-
--- a/js/src/tests/js1_8_1/shell.js
+++ b/js/src/tests/js1_8_1/shell.js
@@ -35,13 +35,14 @@
  * 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 ***** */
 
 gTestsuite = 'js1_8_1';
 
 // explicitly turn on js181
+// XXX: The browser currently only supports up to version 1.8
 if (typeof version != 'undefined')
 {
-  version(180);
+  version(181);
 }
 
--- a/js/src/tests/js1_8_1/trace/jstests.list
+++ b/js/src/tests/js1_8_1/trace/jstests.list
@@ -15,9 +15,9 @@ script regress-462459-07.js
 script regress-462459-08.js
 script regress-462459-09.js
 script regress-462459-10.js
 script regress-462459-11.js
 script regress-462459-12.js
 script regress-469927.js
 script regress-470739.js
 script regress-471635.js
-fails-if(!xulRuntime.shell) script trace-test.js # uncaught exception: [Exception... "Operation is not supported"  code: "9" nsresult: "0x80530009 (NS_ERROR_DOM_NOT_SUPPORTED_ERR)
+script trace-test.js
--- a/js/src/tests/js1_8_1/trace/trace-test.js
+++ b/js/src/tests/js1_8_1/trace/trace-test.js
@@ -4270,28 +4270,38 @@ function testInterpreterReentry() {
 testInterpreterReentry.expected = 1;
 test(testInterpreterReentry);
 
 function testInterpreterReentry2() {
     var a = false;
     var b = {};
     var c = false;
     var d = {};
-    this.__defineGetter__('e', function(){});
-    for (let f in this) print(f);
-    [1 for each (g in this) for each (h in [])]
+    try {
+        this.__defineGetter__('e', function(){});
+        for (let f in this) print(f);
+        [1 for each (g in this) for each (h in [])]
+    }
+    catch(ex) {
+        print('testInterpreterReentry2: ' + ex);
+    }
     return 1;
 }
 testInterpreterReentry2.expected = 1;
 test(testInterpreterReentry2);
 
 function testInterpreterReentry3() {
-    for (let i=0;i<5;++i) this["y" + i] = function(){};
-    this.__defineGetter__('e', function (x2) { yield; });
-    [1 for each (a in this) for (b in {})];
+    try {
+        for (let i=0;i<5;++i) this["y" + i] = function(){};
+        this.__defineGetter__('e', function (x2) { yield; });
+        [1 for each (a in this) for (b in {})];
+    }
+    catch(ex) {
+        print('testInterpreterReentry3: ' + ex);
+    }
     return 1;
 }
 testInterpreterReentry3.expected = 1;
 test(testInterpreterReentry3);
 
 function testInterpreterReentry4() {
     var obj = {a:1, b:1, c:1, d:1, get e() 1000 };
     for (var p in obj)
new file mode 100644
--- /dev/null
+++ b/js/src/tests/js1_8_5/README
@@ -0,0 +1,4 @@
+JavaScript 1.8.5
+
+Use this suite for tests which require EcmaScript 5 along with features such as
+|let|, |yield|
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/js/src/tests/js1_8_5/shell.js
@@ -0,0 +1,15 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+gTestsuite = 'js1_8_5';
+
+// explicitly turn on js185
+// XXX: The browser currently only supports up to version 1.8
+if (typeof version != 'undefined')
+{
+  version(185);
+}
+
new file mode 100644
--- /dev/null
+++ b/js/src/tests/js1_8_5/template.js
@@ -0,0 +1,29 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: 
+ */
+
+var gTestfile = 'template.js';
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 99999;
+var summary = '';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+  enterFunc ('test');
+  printBugNumber(BUGNUMBER);
+  printStatus (summary);
+ 
+  reportCompare(expect, actual, summary);
+
+  exitFunc ('test');
+}
--- a/js/src/tests/shell.js
+++ b/js/src/tests/shell.js
@@ -34,22 +34,21 @@
  * 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 ***** */
 
-// Spidermonkey shell now defaults to 1.8, so set the basic version to
-// 1.5 for backwards compatibility.
-
+// Explicitly set the default version.
+// See https://bugzilla.mozilla.org/show_bug.cgi?id=522760#c11
 if (typeof version != 'undefined')
 {
-  version(150);
+  version(0);
 }
 
 var STATUS = "STATUS: ";
 var VERBOSE = false;
 var SECT_PREFIX = 'Section ';
 var SECT_SUFFIX = ' of test - ';
 var callStack = new Array();
 
@@ -104,48 +103,16 @@ function AddTestCase( description, expec
  *
  */
 function startTest() {
   // print out bugnumber
 
   if ( BUGNUMBER ) {
     print ("BUGNUMBER: " + BUGNUMBER );
   }
-  if ( typeof version != 'function') {
-    return;
-  }
-
-  // JavaScript 1.3 is supposed to be compliant ecma version 1.0
-  if ( VERSION == "ECMA_1" ) {
-    version ( "130" );
-  }
-  else if ( VERSION == "JS_1.8"  || gTestsuite == 'js1_8') {
-    version ( "180" );
-  }
-  else if ( VERSION == "JS_1.7"  || gTestsuite == 'js1_7') {
-    version ( "170" );
-  }
-  else if ( VERSION == "JS_1.6"  || gTestsuite == 'js1_6') {
-    version ( "160" );
-  }
-  else if ( VERSION == "JS_1.5"  || gTestsuite == 'js1_5') {
-    version ( "150" );
-  }
-  else if ( VERSION == "JS_1.4"  || gTestsuite == 'js1_4') {
-    version ( "140" );
-  }
-  else if ( VERSION == "JS_1.3"  || gTestsuite == 'js1_3') {
-    version ( "130" );
-  }
-  else if ( VERSION == "JS_1.2"  || gTestsuite == 'js1_2') {
-    version ( "120" );
-  }
-  else if ( VERSION  == "JS_1.1" || gTestsuite == 'js1_1') {
-    version ( "110" );
-  }
 }
 
 function TestCase(n, d, e, a)
 {
   this.path = (typeof gTestPath == 'undefined') ?
     (gTestsuite + '/' + gTestsubsuite + '/' + gTestfile) :
     gTestPath;
   this.file = gTestfile;
--- a/layout/base/nsDocumentViewer.cpp
+++ b/layout/base/nsDocumentViewer.cpp
@@ -834,16 +834,21 @@ CreatePresContext(nsIDocument* aDocument
 nsresult
 DocumentViewerImpl::InitInternal(nsIWidget* aParentWidget,
                                  nsISupports *aState,
                                  const nsIntRect& aBounds,
                                  PRBool aDoCreation,
                                  PRBool aInPrintPreview,
                                  PRBool aNeedMakeCX /*= PR_TRUE*/)
 {
+  // We don't want any scripts to run here. That can cause flushing,
+  // which can cause reentry into initialization of this document viewer,
+  // which would be disastrous.
+  nsAutoScriptBlocker blockScripts;
+
   mParentWidget = aParentWidget; // not ref counted
   mBounds = aBounds;
 
   nsresult rv = NS_OK;
   NS_ENSURE_TRUE(mDocument, NS_ERROR_NULL_POINTER);
 
   nsIView* containerView = FindContainerView();
 
--- a/layout/base/nsPresArena.cpp
+++ b/layout/base/nsPresArena.cpp
@@ -124,29 +124,29 @@ GetDesiredRegionSize()
 
 #define RESERVE_FAILED 0
 
 #else // Unix
 
 static void *
 ReserveRegion(PRUword region, PRUword size)
 {
-  return mmap((void *)region, size, PROT_NONE, MAP_PRIVATE|MAP_ANON, -1, 0);
+  return mmap((caddr_t)region, size, PROT_NONE, MAP_PRIVATE|MAP_ANON, -1, 0);
 }
 
 static void
 ReleaseRegion(void *region, PRUword size)
 {
-  munmap(region, size);
+  munmap((caddr_t)region, size);
 }
 
 static bool
 ProbeRegion(PRUword region, PRUword size)
 {
-  if (madvise((void *)region, size, MADV_NORMAL)) {
+  if (madvise((caddr_t)region, size, MADV_NORMAL)) {
     return true;
   } else {
     return false;
   }
 }
 
 static PRUword
 GetDesiredRegionSize()
--- a/layout/base/tests/TestPoisonArea.cpp
+++ b/layout/base/tests/TestPoisonArea.cpp
@@ -154,27 +154,31 @@ typedef unsigned int uint32_t;
 
 #define SIZxPTR ((int)(sizeof(uintptr_t)*2))
 
 /* This program assumes that a whole number of return instructions fit into
  * 32 bits, and that 32-bit alignment is sufficient for a branch destination.
  */
 
 #if defined __i386__ || defined __x86_64__ ||   \
+  defined __i386 || defined __x86_64 ||         \
   defined _M_IX86 || defined _M_AMD64
 #define RETURN_INSTR 0xC3C3C3C3  /* ret; ret; ret; ret */
 
 #elif defined __arm__ || defined _M_ARM
 #define RETURN_INSTR 0xE12FFF1E /* bx lr */
 
 // PPC has its own style of CPU-id #defines.  There is no Windows for
 // PPC as far as I know, so no _M_ variant.
 #elif defined _ARCH_PPC || defined _ARCH_PWR || defined _ARCH_PWR2
 #define RETURN_INSTR 0x4E800020 /* blr */
 
+#elif defined __sparc || defined __sparcv9
+#define RETURN_INSTR 0x81c3e008 /* retl */
+
 #else
 #error "Need return instruction for this architecture"
 #endif
 
 // Miscellaneous Windows/Unix portability gumph
 
 #ifdef _WIN32
 // Uses of this function deliberately leak the string.
@@ -252,41 +256,41 @@ MakeRegionExecutable(void *)
 #define LastErrMsg() (strerror(errno))
 
 static unsigned long _pagesize;
 #define PAGESIZE _pagesize
 
 static void *
 ReserveRegion(uintptr_t request, bool accessible)
 {
-  return mmap((void *)request, PAGESIZE,
+  return mmap((caddr_t)request, PAGESIZE,
               accessible ? PROT_READ|PROT_WRITE : PROT_NONE,
               MAP_PRIVATE|MAP_ANON, -1, 0);
 }
 
 static void
 ReleaseRegion(void *page)
 {
-  munmap(page, PAGESIZE);
+  munmap((caddr_t)page, PAGESIZE);
 }
 
 static bool
 ProbeRegion(uintptr_t page)
 {
-  if (madvise((void *)page, PAGESIZE, MADV_NORMAL)) {
+  if (madvise((caddr_t)page, PAGESIZE, MADV_NORMAL)) {
     return true;
   } else {
     return false;
   }
 }
 
 static int
 MakeRegionExecutable(void *page)
 {
-  return mprotect(page, PAGESIZE, PROT_READ|PROT_WRITE|PROT_EXEC);
+  return mprotect((caddr_t)page, PAGESIZE, PROT_READ|PROT_WRITE|PROT_EXEC);
 }
 
 #endif
 
 static uintptr_t
 ReservePoisonArea()
 {
   if (sizeof(uintptr_t) == 8) {
@@ -432,17 +436,17 @@ TestPage(const char *pagelabel, uintptr_
     }
 #else
     pid_t pid = fork();
     if (pid == -1) {
       printf("ERROR | %s %s | fork=%s\n", oplabel, pagelabel,
              LastErrMsg());
       exit(2);
     } else if (pid == 0) {
-      unsigned char scratch;
+      volatile unsigned char scratch;
       switch (test) {
       case 0: scratch = *(volatile unsigned char *)opaddr; break;
       case 1: ((void (*)())opaddr)(); break;
       case 2: *(volatile unsigned char *)opaddr = 0; break;
       default: abort();
       }
       _exit(0);
     } else {
--- a/layout/generic/nsIObjectFrame.h
+++ b/layout/generic/nsIObjectFrame.h
@@ -89,11 +89,19 @@ public:
    * is currently active in this frame.
    */
   virtual void StopPlugin() = 0;
 
   /**
    * Get the native widget for the plugin, if any.
    */
   virtual nsIWidget* GetWidget() = 0;
+
+  /**
+   * Tells the object to paint directly in this location ignoring any
+   * positioning information that may have been provided otherwise.
+   */
+  virtual nsresult SetAbsoluteScreenPosition(class nsIDOMElement* element,
+                                             nsIDOMClientRect* position,
+                                             nsIDOMClientRect* clip) = 0;
 };
 
 #endif /* nsIObjectFrame_h___ */
--- a/layout/generic/nsObjectFrame.cpp
+++ b/layout/generic/nsObjectFrame.cpp
@@ -103,32 +103,35 @@
 #include "nsIPluginWidget.h"
 #include "nsGUIEvent.h"
 #include "nsIRenderingContext.h"
 #include "npapi.h"
 #include "nsTransform2D.h"
 #include "nsIImageLoadingContent.h"
 #include "nsIObjectLoadingContent.h"
 #include "nsPIDOMWindow.h"
+#include "nsIDOMElement.h"
 #include "nsContentUtils.h"
 #include "nsDisplayList.h"
 #include "nsAttrName.h"
 #include "nsDataHashtable.h"
 #include "nsDOMClassInfo.h"
 #include "nsFocusManager.h"
 #include "nsLayoutUtils.h"
 #include "nsFrameManager.h"
 #include "nsComponentManagerUtils.h"
+#include "nsIObserverService.h"
 
 // headers for plugin scriptability
 #include "nsIScriptGlobalObject.h"
 #include "nsIScriptContext.h"
 #include "nsIXPConnect.h"
 #include "nsIXPCScriptable.h"
 #include "nsIClassInfo.h"
+#include "nsIDOMClientRect.h"
 
 #include "nsObjectFrame.h"
 #include "nsIObjectFrame.h"
 #include "nsPluginNativeWindow.h"
 #include "nsIPluginDocument.h"
 
 #include "nsThreadUtils.h"
 
@@ -167,16 +170,26 @@ static NS_DEFINE_CID(kAppShellCID, NS_AP
 /* X headers suck */
 enum { XKeyPress = KeyPress };
 #ifdef KeyPress
 #undef KeyPress
 #endif
 
 #if defined(MOZ_PLATFORM_HILDON) && defined(MOZ_WIDGET_GTK2)
 #define MOZ_COMPOSITED_PLUGINS 1
+
+#include "gfxXlibSurface.h"
+
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#include <X11/extensions/XShm.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+
+
 #endif
 
 #ifdef MOZ_WIDGET_GTK2
 #include <gdk/gdk.h>
 #include <gdk/gdkx.h>
 #include <gtk/gtk.h>
 #endif
 #endif
@@ -326,21 +339,16 @@ public:
   nsresult Init(nsPresContext* aPresContext, nsObjectFrame* aFrame,
                 nsIContent* aContent);
 
   void* GetPluginPort();
   void ReleasePluginPort(void* pluginPort);
 
   void SetPluginHost(nsIPluginHost* aHost);
 
-#ifdef MOZ_PLATFORM_HILDON
-  /* the flash plugin(s) need to have thier visiblity poked */
-  PRBool UpdateVisibility(PRBool aForce = PR_FALSE);
-#endif
-
   nsEventStatus ProcessEvent(const nsGUIEvent & anEvent);
 
 #ifdef XP_MACOSX
   NPDrawingModel GetDrawingModel();
   NPEventModel GetEventModel();
   void* FixUpPluginWindow(PRInt32 inPaintState);
   // Set a flag that (if true) indicates the plugin port info has changed and
   // SetWindow() needs to be called.
@@ -400,16 +408,22 @@ public:
 #endif
   }
 
   PRBool MatchPluginName(const char *aPluginName)
   {
     return strncmp(GetPluginName(), aPluginName, strlen(aPluginName)) == 0;
   }
 
+#ifdef MOZ_PLATFORM_HILDON
+  nsresult SetAbsoluteScreenPosition(nsIDOMElement* element,
+                                     nsIDOMClientRect* position,
+                                     nsIDOMClientRect* clip);
+#endif
+
 private:
   void FixUpURLS(const nsString &name, nsAString &value);
 
   nsPluginNativeWindow       *mPluginWindow;
   nsCOMPtr<nsIPluginInstance> mInstance;
   nsObjectFrame              *mObjectFrame; // owns nsPluginInstanceOwner
   nsCOMPtr<nsIContent>        mContent;
   nsCString                   mDocumentBase;
@@ -493,25 +507,41 @@ private:
     nsIPluginInstance* mInstance;
     const nsIntSize& mPluginSize;
     const nsIntRect& mDirtyRect;
   };
 #endif
 #ifdef MOZ_PLATFORM_HILDON
 
   // On hildon, we attempt to use NPImageExpose which allows us faster
-  // painting.  We hold a memory buffer to avoid reallocations on
-  // every plugin invalidate.
-  unsigned char*  mImageExposeBuffer;
-  gfxIntSize mImageExposeBufferSize;
-
-  nsresult NativeImageDraw(gfxContext *aContext,
-                           NPWindow* mWindow,
-                           const nsIntSize& mPluginSize,
-                           const nsIntRect& mDirtyRect);
+  // painting.
+
+  // used to keep track of how big our buffer is.
+  nsIntSize mPluginSize;
+
+  // the element that was passed into SetAbsoluteScreenPosition().
+  // This will be the element we use to determine which Window we draw into.
+  nsCOMPtr<nsIDOMElement> mBlitParentElement;
+
+  // The absolute position on the screen to draw to.
+  gfxRect mAbsolutePosition;
+
+  // The clip region that we should draw into.
+  gfxRect mAbsolutePositionClip;
+
+  GC mXlibSurfGC;
+  Window mBlitWindow;
+  XImage *mSharedXImage;
+  XShmSegmentInfo mSharedSegmentInfo;
+
+  PRBool SetupXShm();
+  void ReleaseXShm();
+  void NativeImageDraw(NPRect* invalidRect = nsnull);
+  PRBool UpdateVisibility();
+
 #endif
 };
 
   // Mac specific code to fix up port position and clip
 #ifdef XP_MACOSX
 
   enum { ePluginPaintEnable, ePluginPaintDisable };
 
@@ -565,26 +595,33 @@ nsObjectFrame::Init(nsIContent*      aCo
 {
   NS_PRECONDITION(aContent, "How did that happen?");
   mPreventInstantiation =
     (aContent->GetCurrentDoc()->GetDisplayDocument() != nsnull);
 
   PR_LOG(nsObjectFrameLM, PR_LOG_DEBUG,
          ("Initializing nsObjectFrame %p for content %p\n", this, aContent));
 
-  return nsObjectFrameSuper::Init(aContent, aParent, aPrevInFlow);
+  nsresult rv = nsObjectFrameSuper::Init(aContent, aParent, aPrevInFlow);
+
+  if (NS_SUCCEEDED(rv)) {
+    NotifyPluginEventObservers(NS_LITERAL_STRING("init").get());
+  }
+  return rv;
 }
 
 void
 nsObjectFrame::Destroy()
 {
   NS_ASSERTION(!mPreventInstantiation ||
                (mContent && mContent->GetCurrentDoc()->GetDisplayDocument()),
                "about to crash due to bug 136927");
 
+  NotifyPluginEventObservers(NS_LITERAL_STRING("destroy").get());
+
   PresContext()->RootPresContext()->UnregisterPluginForGeometryUpdates(this);
 
   // we need to finish with the plugin before native window is destroyed
   // doing this in the destructor is too late.
   StopPluginInternal(PR_TRUE);
 
   // StopPluginInternal might have disowned the widget; if it has,
   // mWidget will be null.
@@ -926,20 +963,16 @@ nsObjectFrame::FixupWindow(const nsSize&
   if (!mInstanceOwner)
     return;
 
   NPWindow *window;
   mInstanceOwner->GetWindow(window);
 
   NS_ENSURE_TRUE(window, /**/);
 
-#ifdef MOZ_PLATFORM_HILDON
-  mInstanceOwner->UpdateVisibility(PR_TRUE);
-#endif
-
 #ifdef XP_MACOSX
   mInstanceOwner->FixUpPluginWindow(ePluginPaintDisable);
 #endif
 
   PRBool windowless = (window->type == NPWindowTypeDrawable);
 
   nsIntPoint origin = GetWindowOriginInPixels(windowless);
 
@@ -956,16 +989,17 @@ nsObjectFrame::FixupWindow(const nsSize&
   window->clipRect.left = 0;
 #ifdef XP_MACOSX
   window->clipRect.bottom = 0;
   window->clipRect.right = 0;
 #else
   window->clipRect.bottom = presContext->AppUnitsToDevPixels(aSize.height);
   window->clipRect.right = presContext->AppUnitsToDevPixels(aSize.width);
 #endif
+  NotifyPluginEventObservers(NS_LITERAL_STRING("reflow").get());
 }
 
 void
 nsObjectFrame::CallSetWindow()
 {
   NPWindow *win = nsnull;
  
   nsresult rv;
@@ -973,21 +1007,16 @@ nsObjectFrame::CallSetWindow()
   if (!mInstanceOwner ||
       NS_FAILED(rv = mInstanceOwner->GetInstance(*getter_AddRefs(pi))) ||
       !pi ||
       NS_FAILED(rv = mInstanceOwner->GetWindow(win)) || 
       !win)
     return;
 
   nsPluginNativeWindow *window = (nsPluginNativeWindow *)win;
-
-#ifdef MOZ_PLATFORM_HILDON
-  mInstanceOwner->UpdateVisibility(PR_TRUE);
-#endif
-
 #ifdef XP_MACOSX
   mInstanceOwner->FixUpPluginWindow(ePluginPaintDisable);
 #endif
 
   if (IsHidden())
     return;
 
   PRBool windowless = (window->type == NPWindowTypeDrawable);
@@ -1185,16 +1214,40 @@ nsObjectFrame::ComputeWidgetGeometry(con
     nsIntRect pixRect =
       r->ToNearestPixels(appUnitsPerDevPixel) - pluginOrigin;
     if (!pixRect.IsEmpty()) {
       configuration->mClipRegion.AppendElement(pixRect);
     }
   }
 }
 
+nsresult
+nsObjectFrame::SetAbsoluteScreenPosition(nsIDOMElement* element,
+                                         nsIDOMClientRect* position,
+                                         nsIDOMClientRect* clip)
+{
+#ifdef MOZ_PLATFORM_HILDON
+  if (!mInstanceOwner)
+    return NS_ERROR_NOT_AVAILABLE;
+  return mInstanceOwner->SetAbsoluteScreenPosition(element, position, clip);
+#else
+  return NS_ERROR_NOT_IMPLEMENTED;
+#endif
+}
+
+void
+nsObjectFrame::NotifyPluginEventObservers(const PRUnichar *eventType)
+{
+  nsCOMPtr<nsIDOMElement> e = do_QueryInterface(mContent);
+  if (!e)
+    return;
+  nsCOMPtr<nsIObserverService> obsSvc = do_GetService("@mozilla.org/observer-service;1");
+  obsSvc->NotifyObservers(e, "plugin-changed-event", eventType);
+}
+
 void
 nsObjectFrame::DidSetWidgetGeometry()
 {
 #if defined(XP_MACOSX)
   if (mInstanceOwner) {
     mInstanceOwner->FixUpPluginWindow(ePluginPaintEnable);
   }
 #endif
@@ -2358,19 +2411,22 @@ nsPluginInstanceOwner::nsPluginInstanceO
   mDestroyWidget = PR_FALSE;
   mTimerCanceled = PR_TRUE;
 
 #ifdef MOZ_COMPOSITED_PLUGINS
   mLastPoint = nsIntPoint(0,0);
 #endif
 
 #ifdef MOZ_PLATFORM_HILDON
-  mImageExposeBuffer = nsnull;
-  mImageExposeBufferSize = gfxIntSize(0,0);
+  mPluginSize = nsIntSize(0,0);
+  mXlibSurfGC = None;
+  mSharedXImage = nsnull;
+  mSharedSegmentInfo.shmaddr = nsnull;
 #endif
+
 #ifdef XP_MACOSX
 #ifndef NP_NO_QUICKDRAW
   mEventModel = NPEventModelCarbon;
 #else
   mEventModel = NPEventModelCocoa;
 #endif
 #endif
   PR_LOG(nsObjectFrameLM, PR_LOG_DEBUG,
@@ -2423,21 +2479,18 @@ nsPluginInstanceOwner::~nsPluginInstance
     mPluginWindow = nsnull;
   }
 
   if (mInstance) {
     mInstance->InvalidateOwner();
   }
 
 #ifdef MOZ_PLATFORM_HILDON
-  if (mImageExposeBuffer)
-    free(mImageExposeBuffer);
-  mImageExposeBuffer = nsnull;
+  ReleaseXShm();
 #endif
-
 }
 
 /*
  * nsISupports Implementation
  */
 
 NS_IMPL_ADDREF(nsPluginInstanceOwner)
 NS_IMPL_RELEASE(nsPluginInstanceOwner)
@@ -2647,16 +2700,26 @@ NS_IMETHODIMP nsPluginInstanceOwner::Get
   return NS_OK;
 }
 
 NS_IMETHODIMP nsPluginInstanceOwner::InvalidateRect(NPRect *invalidRect)
 {
   if (!mObjectFrame || !invalidRect || !mWidgetVisible)
     return NS_ERROR_FAILURE;
 
+#ifdef MOZ_PLATFORM_HILDON
+  PRBool simpleImageRender = PR_FALSE;
+  mInstance->GetValueFromPlugin(NPPVpluginWindowlessLocalBool,
+                                &simpleImageRender);
+  if (simpleImageRender) {  
+    NativeImageDraw(invalidRect);
+    return NS_OK;
+  }
+#endif
+
 #ifndef XP_MACOSX
   // Windowed plugins should not be calling NPN_InvalidateRect, but
   // Silverlight does and expects it to "work"
   if (mWidget) {
     mWidget->Invalidate(nsIntRect(invalidRect->left, invalidRect->top,
                                   invalidRect->right - invalidRect->left,
                                   invalidRect->bottom - invalidRect->top),
                         PR_FALSE);
@@ -3480,20 +3543,16 @@ nsPluginInstanceOwner::GetEventloopNesti
     currentLevel++;
   }
 
   return currentLevel;
 }
 
 nsresult nsPluginInstanceOwner::ScrollPositionWillChange(nsIScrollableView* aScrollable, nscoord aX, nscoord aY)
 {
-#ifdef MOZ_PLATFORM_HILDON
-  CancelTimer();
-#endif
-
 #if defined(XP_MACOSX) && !defined(NP_NO_CARBON)
   if (GetEventModel() != NPEventModelCarbon)
     return NS_OK;
 
   CancelTimer();
 
   if (mInstance) {
     nsCOMPtr<nsIPluginWidget> pluginWidget = do_QueryInterface(mWidget);
@@ -4730,17 +4789,31 @@ void nsPluginInstanceOwner::Paint(const 
 #if defined(MOZ_X11) || defined(MOZ_DFB)
 void nsPluginInstanceOwner::Paint(gfxContext* aContext,
                                   const gfxRect& aFrameRect,
                                   const gfxRect& aDirtyRect)
 {
   if (!mInstance || !mObjectFrame)
     return;
 
-  // Align to device pixels where sensible
+#ifdef MOZ_PLATFORM_HILDON
+  // through to be able to paint the context passed in.  This allows
+  // us to handle plugins that do not self invalidate (slowly, but
+  // accurately), and it allows us to reduce flicker.
+  PRBool simpleImageRender = PR_FALSE;
+  mInstance->GetValueFromPlugin(NPPVpluginWindowlessLocalBool,
+                                &simpleImageRender);
+  if (simpleImageRender) {
+    gfxMatrix matrix = aContext->CurrentMatrix();
+    if (!matrix.HasNonAxisAlignedTransform())
+      NativeImageDraw();
+    return;
+  } 
+#endif
+
   // to provide crisper and faster drawing.
   gfxRect pluginRect = aFrameRect;
   if (aContext->UserToDevicePixelSnapped(pluginRect)) {
     pluginRect = aContext->DeviceToUser(pluginRect);
   }
 
   // Round out the dirty rect to plugin pixels to ensure the plugin draws
   // enough pixels for interpolation to device pixels.
@@ -4783,25 +4856,16 @@ void nsPluginInstanceOwner::Paint(gfxCon
   mInstance->IsTransparent(&transparent);
   if (!transparent)
     rendererFlags |= Renderer::DRAW_IS_OPAQUE;
 
   // Renderer::Draw() draws a rectangle with top-left at the aContext origin.
   gfxContextAutoSaveRestore autoSR(aContext);
   aContext->Translate(pluginRect.pos);
 
-#ifdef MOZ_PLATFORM_HILDON
-  PRBool simpleImageRender = PR_FALSE;
-  mInstance->GetValueFromPlugin(NPPVpluginWindowlessLocalBool, (void *)&simpleImageRender);
-
-  if (simpleImageRender && NS_SUCCEEDED(NativeImageDraw(aContext, window, pluginSize, pluginDirtyRect)))
-    return;
-
-#endif
-
   Renderer renderer(window, mInstance, pluginSize, pluginDirtyRect);
   renderer.Draw(aContext, window->width, window->height,
                 rendererFlags, nsnull);
 }
 
 #ifdef MOZ_X11
 static int
 DepthOfVisual(const Screen* screen, const Visual* visual)
@@ -4816,16 +4880,138 @@ DepthOfVisual(const Screen* screen, cons
 
   NS_ERROR("Visual not on Screen.");
   return 0;
 }
 #endif
 
 #ifdef MOZ_PLATFORM_HILDON
 
+static GdkWindow* GetClosestWindow(nsIDOMElement *element)
+{
+  nsCOMPtr<nsIDOMDocument> domDocument;
+  element->GetOwnerDocument(getter_AddRefs(domDocument));
+
+  nsCOMPtr<nsIDocument> doc = do_QueryInterface(domDocument);  
+  if (!doc)
+    return nsnull;
+
+  nsIPresShell *presShell = doc->GetPrimaryShell();
+  if (!presShell)
+    return nsnull;
+
+  nsCOMPtr<nsIContent> content = do_QueryInterface(element);
+  nsIFrame* frame = presShell->GetPrimaryFrameFor(content);
+  if (!frame)
+    return nsnull;
+
+  nsIWidget* win = frame->GetWindow();
+  if (!win)
+    return nsnull;
+
+  GdkWindow* w = static_cast<GdkWindow*>(win->GetNativeData(NS_NATIVE_WINDOW));
+  return w;
+}
+
+void
+nsPluginInstanceOwner::ReleaseXShm()
+{
+  if (mXlibSurfGC) {
+    XFreeGC(gdk_x11_get_default_xdisplay(), mXlibSurfGC);
+    mXlibSurfGC = None;
+  }
+ 
+ if (mSharedSegmentInfo.shmaddr) {
+    XShmDetach(gdk_x11_get_default_xdisplay(), &mSharedSegmentInfo);
+    shmdt(mSharedSegmentInfo.shmaddr);
+    mSharedSegmentInfo.shmaddr = nsnull;
+  }
+
+  if (mSharedXImage) {
+    XDestroyImage(mSharedXImage);
+    mSharedXImage = nsnull;
+  }
+}
+
+PRBool
+nsPluginInstanceOwner::SetupXShm()
+{
+  mBlitWindow = GDK_WINDOW_XWINDOW(GetClosestWindow(mBlitParentElement));
+  if (!mBlitWindow)
+    return PR_FALSE;
+
+  ReleaseXShm();
+
+  mXlibSurfGC = XCreateGC(gdk_x11_get_default_xdisplay(),
+                          mBlitWindow,
+                          0,
+                          0);
+  if (!mXlibSurfGC)
+    return PR_FALSE;
+
+  // we use 16 as the default depth because that is the value of the
+  // screen, but not the default X default depth.
+  XVisualInfo vinfo;
+  int foundVisual = XMatchVisualInfo(gdk_x11_get_default_xdisplay(),
+                                     gdk_x11_get_default_screen(),
+                                     16,
+                                     TrueColor,
+                                     &vinfo);
+  if (!foundVisual) 
+    return PR_FALSE;
+
+  memset(&mSharedSegmentInfo, 0, sizeof(XShmSegmentInfo));
+  mSharedXImage = XShmCreateImage(gdk_x11_get_default_xdisplay(),
+                                  vinfo.visual,
+                                  16,
+                                  ZPixmap,
+                                  0,
+                                  &mSharedSegmentInfo,
+                                  mPluginSize.width,
+                                  mPluginSize.height);
+  if (!mSharedXImage)
+    return PR_FALSE;
+
+  NS_ASSERTION(mSharedXImage->height, "do not call shmget with zero");
+  mSharedSegmentInfo.shmid = shmget(IPC_PRIVATE,
+                                    mSharedXImage->bytes_per_line * mSharedXImage->height,
+                                    IPC_CREAT | 0777);
+  if (mSharedSegmentInfo.shmid == -1) {
+    XDestroyImage(mSharedXImage);
+    mSharedXImage = nsnull;
+    return PR_FALSE;
+  }
+
+  mSharedXImage->data = static_cast<char*>(shmat(mSharedSegmentInfo.shmid, 0, 0));
+  if (mSharedXImage->data == (char*) -1) {
+    shmctl(mSharedSegmentInfo.shmid, IPC_RMID, 0);
+    XDestroyImage(mSharedXImage);
+    mSharedXImage = nsnull;
+    return PR_FALSE;
+  }
+    
+  mSharedSegmentInfo.shmaddr = mSharedXImage->data;
+  mSharedSegmentInfo.readOnly = False;
+
+  Status s = XShmAttach(gdk_x11_get_default_xdisplay(), &mSharedSegmentInfo);
+  XSync(gdk_x11_get_default_xdisplay(), False);
+  shmctl(mSharedSegmentInfo.shmid, IPC_RMID, 0);
+  if (!s) {
+    // attach failed, call shmdt and null shmaddr before calling
+    // ReleaseXShm().
+    shmdt(mSharedSegmentInfo.shmaddr);
+    mSharedSegmentInfo.shmaddr = nsnull;
+    ReleaseXShm();
+    return PR_FALSE;
+  }
+
+  return PR_TRUE;
+}
+
+
 // NativeImageDraw
 //
 // This method supports the NPImageExpose API which is specific to the
 // HILDON platform.  Basically what it allows us to do is to pass a
 // memory buffer into a plugin (namely flash), and have flase draw
 // directly into the buffer.
 //
 // It may be faster if the rest of the system used offscreen image
@@ -4834,151 +5020,158 @@ DepthOfVisual(const Screen* screen, cons
 // surface and copy that to the passed gfx context.
 //
 // This is not ideal and it should not be faster than what a
 // windowless plugin can do.  However, in A/B testing of flash on the
 // N900, this approach is considerably faster.
 //
 // Hopefully this API can die off in favor of a more robust plugin API.
 
-nsresult
-nsPluginInstanceOwner::NativeImageDraw(gfxContext *aContext,
-                                       NPWindow* mWindow,
-                                       const nsIntSize& mPluginSize,
-                                       const nsIntRect& mDirtyRect)
+void
+nsPluginInstanceOwner::NativeImageDraw(NPRect* invalidRect)
 {
-  PRBool doupdatewindow = PR_FALSE;
-
-  if (mWindow->x || mWindow->y) {
-    mWindow->x = 0;
-    mWindow->y = 0;
-    doupdatewindow = PR_TRUE;
-  }
-
-  if (nsIntSize(mWindow->width, mWindow->height) != mPluginSize) {
-    mWindow->width = mPluginSize.width;
-    mWindow->height = mPluginSize.height;
-    doupdatewindow = PR_TRUE;
-  }
-
-  // The clip rect is relative to drawable top-left.
-  nsIntRect clipRect;
-  clipRect.x = 0;
-  clipRect.y = 0;
-  clipRect.width  = mWindow->width;
-  clipRect.height = mWindow->height;
-
+  // if we haven't been positioned yet, ignore
+  if (!mBlitParentElement)
+    return;
+
+  // if the clip rect is zero, we have nothing to do.
+  if (NSToIntCeil(mAbsolutePositionClip.Width()) == 0 ||
+      NSToIntCeil(mAbsolutePositionClip.Height()) == 0)
+    return;
+  
+  // The flash plugin on Maemo n900 requires the width/height to be
+  // even.
+  PRInt32 absPosWidth  = NSToIntCeil(mAbsolutePosition.Width()) / 2 * 2;
+  PRInt32 absPosHeight = NSToIntCeil(mAbsolutePosition.Height()) / 2 * 2;
+
+  // if the plugin is hidden, nothing to draw.
+  if (absPosHeight == 0 || absPosWidth == 0)
+    return;
+
+  if (!mSharedXImage ||
+      mPluginSize.width != absPosWidth ||
+      mPluginSize.height != absPosHeight) {
+    
+    mPluginSize = nsIntSize(absPosWidth, absPosHeight);
+
+    if (NS_FAILED(SetupXShm()))
+      return;
+  }  
+  
+  NPWindow* window;
+  GetWindow(window);
+  NS_ASSERTION(window, "Window can not be null");
+
+  // setup window such that it knows about the size and clip.  This
+  // is to work around a flash clipping bug when using the Image
+  // Expose API.
+  
   NPRect newClipRect;
-  newClipRect.left = clipRect.x;
-  newClipRect.top = clipRect.y;
-  newClipRect.right = clipRect.XMost();
-  newClipRect.bottom = clipRect.YMost();
-  if (mWindow->clipRect.left    != newClipRect.left   ||
-      mWindow->clipRect.top     != newClipRect.top    ||
-      mWindow->clipRect.right   != newClipRect.right  ||
-      mWindow->clipRect.bottom  != newClipRect.bottom) {
-    mWindow->clipRect = newClipRect;
-    doupdatewindow = PR_TRUE;
-  }
-
+  newClipRect.left = 0;
+  newClipRect.top = 0;
+  newClipRect.right = window->width;
+  newClipRect.bottom = window->height;
+  
+  window->clipRect = newClipRect; 
+  window->x = 0;
+  window->y = 0;
+    
   NPSetWindowCallbackStruct* ws_info =
-    static_cast<NPSetWindowCallbackStruct*>(mWindow->ws_info);
+    static_cast<NPSetWindowCallbackStruct*>(window->ws_info);
   ws_info->visual = 0;
   ws_info->colormap = 0;
-  if (ws_info->depth != 24) {
-    ws_info->depth = 24;
-    doupdatewindow = PR_TRUE;
-  }
-
-  if (doupdatewindow)
-    mInstance->SetWindow(mWindow);
-
-  nsIntRect dirtyRect = mDirtyRect;
-
-  // Intersect the dirty rect with the clip rect to ensure that it lies within
-  // the drawable.
-  if (!dirtyRect.IntersectRect(mDirtyRect, clipRect))
-    return NS_ERROR_FAILURE;
-
-  XEvent pluginEvent;
+  ws_info->depth = 16;
+  mInstance->SetWindow(window);
+
+  NPEvent pluginEvent;
   NPImageExpose imageExpose;
   XGraphicsExposeEvent& exposeEvent = pluginEvent.xgraphicsexpose;
 
   // set the drawing info
   exposeEvent.type = GraphicsExpose;
   exposeEvent.display = 0;
 
   // Store imageExpose structure pointer as drawable member
   exposeEvent.drawable = (Drawable)&imageExpose;
-  exposeEvent.x = mDirtyRect.x;
-  exposeEvent.y = mDirtyRect.y;
-  exposeEvent.width = mDirtyRect.width;
-  exposeEvent.height = mDirtyRect.height;
   exposeEvent.count = 0;
-
-  // information not set:
   exposeEvent.serial = 0;
   exposeEvent.send_event = False;
   exposeEvent.major_code = 0;
   exposeEvent.minor_code = 0;
 
-  // defaults for NPImageExpose
-  imageExpose.depth = 24;
-  imageExpose.translateX = 1;
-  imageExpose.translateY = 1;
-  imageExpose.scaleX = 1;
-  imageExpose.scaleY = 1;
-
-  // only have the plugin draw what is dirty
-  imageExpose.x = mDirtyRect.x;
-  imageExpose.y = mDirtyRect.y;
-  imageExpose.width = mDirtyRect.width;
-  imageExpose.height = mDirtyRect.height;
-
-  // reallocate buffer if there is a size change or if we haven't allocated one yet.  We probably can do this
-  // somewhere else.
-  if (!mImageExposeBuffer ||
-      (mImageExposeBufferSize.width * mImageExposeBufferSize.height < mWindow->width * mWindow->height)) {
-    if (mImageExposeBuffer)
-      free(mImageExposeBuffer);
-
-    mImageExposeBuffer = (unsigned char*) malloc (mWindow->width * mWindow->height * 4);
-    mImageExposeBufferSize = gfxIntSize(mWindow->width, mWindow->height);
-  }
-
-  NS_ENSURE_TRUE(mImageExposeBuffer, NS_ERROR_OUT_OF_MEMORY);
-
-  // Because we are reusing mImageExposeBuffer, there might be old bytes.  The API NPImageExpose
-  // expects that the buffer be zero'ed out.  
-  memset(mImageExposeBuffer, 0, mImageExposeBufferSize.height * mImageExposeBufferSize.width * 4);
-
-  nsRefPtr<gfxImageSurface> surf = new gfxImageSurface(mImageExposeBuffer,
-                                                       mImageExposeBufferSize,
-                                                       mImageExposeBufferSize.width * 4,
-                                                       gfxASurface::ImageFormatRGB24);
-  NS_ENSURE_TRUE(surf, NS_ERROR_OUT_OF_MEMORY);
-
-  // Setup temporary context scaled size
-  imageExpose.stride = surf->Stride();
-  imageExpose.data = reinterpret_cast<char*>(surf->Data());
-  imageExpose.dataSize.width = surf->Width();
-  imageExpose.dataSize.height = surf->Height(); 
+  exposeEvent.x = 0;
+  exposeEvent.y = 0;
+  exposeEvent.width  = window->width;
+  exposeEvent.height = window->height;
+
+  imageExpose.x = 0;
+  imageExpose.y = 0;
+  imageExpose.width  = window->width;
+  imageExpose.height = window->height;
+
+  imageExpose.depth = 16;
+
+  imageExpose.translateX = 0;
+  imageExpose.translateY = 0;
+
+  if (window->width == 0)
+    return;
+  
+  float scale = mAbsolutePosition.Width() / (float) window->width;
+  
+  imageExpose.scaleX = scale;
+  imageExpose.scaleY = scale;
+
+  imageExpose.stride          = mPluginSize.width * 2;
+  imageExpose.data            = mSharedXImage->data;
+  imageExpose.dataSize.width  = mPluginSize.width;
+  imageExpose.dataSize.height = mPluginSize.height; 
+
+  if (invalidRect)
+    memset(mSharedXImage->data, 0, mPluginSize.width * mPluginSize.height * 2);
 
   PRBool eventHandled = PR_FALSE;
-  // Get Image surface from original context
-  // Draw plugin content to temp surface
   mInstance->HandleEvent(&pluginEvent, &eventHandled);
+
+  if (!eventHandled)
+    return;
+
+  // Setup the clip rectangle
+  XRectangle rect;
+  rect.x = NSToIntFloor(mAbsolutePositionClip.X());
+  rect.y = NSToIntFloor(mAbsolutePositionClip.Y());
+  rect.width = NSToIntCeil(mAbsolutePositionClip.Width());
+  rect.height = NSToIntCeil(mAbsolutePositionClip.Height());
+  
+  PRInt32 absPosX = NSToIntFloor(mAbsolutePosition.X());
+  PRInt32 absPosY = NSToIntFloor(mAbsolutePosition.Y());
   
-  if (eventHandled) {
-    nsRefPtr<gfxPattern> pat = new gfxPattern(surf);
-    aContext->NewPath();
-    aContext->PixelSnappedRectangleAndSetPattern(gfxRect(0, 0, mWindow->width, mWindow->height), pat);
-    aContext->Fill();
-  }
-  return NS_OK;
+  XSetClipRectangles(gdk_x11_get_default_xdisplay(),
+                     mXlibSurfGC,
+                     absPosX,
+                     absPosY, 
+                     &rect, 1,
+                     Unsorted);
+
+  XShmPutImage(gdk_x11_get_default_xdisplay(),
+               mBlitWindow,
+               mXlibSurfGC,
+               mSharedXImage,
+               0,
+               0,
+               absPosX,
+               absPosY,
+               mPluginSize.width,
+               mPluginSize.height,
+               PR_FALSE);
+  
+  XSetClipRectangles(gdk_x11_get_default_xdisplay(), mXlibSurfGC, 0, 0, nsnull, 0, Unsorted);  
+
+  XFlush(gdk_x11_get_default_xdisplay());
+  return;
 }
 #endif
 
 #if defined(MOZ_WIDGET_GTK2)
 nsresult
 nsPluginInstanceOwner::Renderer::NativeDraw(GdkDrawable * drawable, 
                                             short offsetX, short offsetY,
                                             GdkRectangle * clipRects, 
@@ -5144,21 +5337,16 @@ nsPluginInstanceOwner::Renderer::NativeD
   return NS_OK;
 }
 #endif
 
 // Here's how we give idle time to plugins.
 
 NS_IMETHODIMP nsPluginInstanceOwner::Notify(nsITimer* timer)
 {
-#ifdef MOZ_PLATFORM_HILDON
-  if (mInstance)
-    UpdateVisibility();
-#endif
-
 #if defined(XP_MACOSX) && !defined(NP_NO_CARBON)
   if (GetEventModel() != NPEventModelCarbon)
     return NS_OK;
 
   // validate the plugin clipping information by syncing the plugin window info to
   // reflect the current widget location. This makes sure that everything is updated
   // correctly in the event of scrolling in the window.
   if (mInstance) {
@@ -5199,30 +5387,16 @@ void nsPluginInstanceOwner::StartTimer(u
   if (!mPluginTimer) {
     mPluginTimer = do_CreateInstance("@mozilla.org/timer;1");
   }
   if (mPluginTimer) {
     mTimerCanceled = PR_FALSE;
     mPluginTimer->InitWithCallback(this, aDelay, nsITimer::TYPE_REPEATING_SLACK);
   }
 #endif
-
-#ifdef MOZ_PLATFORM_HILDON
-  if (!mTimerCanceled)
-    return;
-
-  // start a periodic timer to provide null events to the plugin instance.
-  if (!mPluginTimer)
-    mPluginTimer = do_CreateInstance("@mozilla.org/timer;1");
-
-  if (mPluginTimer) {
-    mTimerCanceled = PR_FALSE;
-    mPluginTimer->InitWithCallback(this, aDelay, nsITimer::TYPE_ONE_SHOT);
-  }
-#endif
 }
 
 void nsPluginInstanceOwner::CancelTimer()
 {
   if (mPluginTimer) {
     mPluginTimer->Cancel();
   }
   mTimerCanceled = PR_TRUE;
@@ -5418,37 +5592,31 @@ NS_IMETHODIMP nsPluginInstanceOwner::Cre
 }
 
 void nsPluginInstanceOwner::SetPluginHost(nsIPluginHost* aHost)
 {
   mPluginHost = aHost;
 }
 
 #ifdef MOZ_PLATFORM_HILDON
-PRBool nsPluginInstanceOwner::UpdateVisibility(PRBool aForce)
+PRBool nsPluginInstanceOwner::UpdateVisibility()
 {
-  if (!mPluginWindow || !mInstance || !mObjectFrame)
-    return PR_FALSE;
-
-  // first, check our view for CSS visibility style
-  PRBool isVisible =
-    mObjectFrame->GetView()->GetVisibility() == nsViewVisibility_kShow;
-
-  if (aForce || mWidgetVisible != isVisible) {
-    PRBool handled;
-    NPEvent pluginEvent;
-    XVisibilityEvent& visibilityEvent = pluginEvent.xvisibility;
-    visibilityEvent.type = VisibilityNotify;
-    visibilityEvent.display = 0;
-    visibilityEvent.state = isVisible ? VisibilityUnobscured : VisibilityFullyObscured;
-    mInstance->HandleEvent(&pluginEvent, &handled);
-    mWidgetVisible = isVisible;
+  if (!mInstance)
     return PR_TRUE;
-  }
-  return PR_FALSE;
+
+  PRBool handled;
+  NPEvent pluginEvent;
+  XVisibilityEvent& visibilityEvent = pluginEvent.xvisibility;
+  visibilityEvent.type = VisibilityNotify;
+  visibilityEvent.display = 0;
+  visibilityEvent.state = VisibilityUnobscured;
+  mInstance->HandleEvent(&pluginEvent, &handled);
+
+  mWidgetVisible = PR_TRUE;
+  return PR_TRUE;
 }
 #endif
 
   // Mac specific code to fix up the port location and clipping region
 #ifdef XP_MACOSX
 
 void* nsPluginInstanceOwner::FixUpPluginWindow(PRInt32 inPaintState)
 {
@@ -5579,8 +5747,50 @@ void nsPluginInstanceOwner::FixUpURLS(co
     
     nsCOMPtr<nsIURI> baseURI = mContent->GetBaseURI();
     nsAutoString newURL;
     NS_MakeAbsoluteURI(newURL, value, baseURI);
     if (!newURL.IsEmpty())
       value = newURL;
   }
 }
+
+#ifdef MOZ_PLATFORM_HILDON
+nsresult
+nsPluginInstanceOwner::SetAbsoluteScreenPosition(nsIDOMElement* element,
+                                                 nsIDOMClientRect* position,
+                                                 nsIDOMClientRect* clip)
+{
+  if ((mBlitParentElement && (mBlitParentElement != element)) ||
+      !position || !clip)
+    return NS_ERROR_FAILURE;
+  
+  float left, top, width, height;
+  position->GetLeft(&left);
+  position->GetTop(&top);
+  position->GetWidth(&width);
+  position->GetHeight(&height);
+
+  mAbsolutePosition = gfxRect(left, top, width, height);
+  
+  clip->GetLeft(&left);
+  clip->GetTop(&top);
+  clip->GetWidth(&width);
+  clip->GetHeight(&height);
+
+  mAbsolutePositionClip = gfxRect(left,top, width, height);
+
+  mBlitParentElement = element;
+    
+  UpdateVisibility();
+
+  if (!mInstance)
+    return NS_OK;
+
+  PRBool simpleImageRender = PR_FALSE;
+  mInstance->GetValueFromPlugin(NPPVpluginWindowlessLocalBool,
+                                &simpleImageRender);
+  if (mInstance)
+    NativeImageDraw();
+  return NS_OK;
+}
+#endif
+
--- a/layout/generic/nsObjectFrame.h
+++ b/layout/generic/nsObjectFrame.h
@@ -53,16 +53,17 @@
 class nsIAccessible;
 #endif
 
 class nsPluginInstanceOwner;
 class nsIPluginHost;
 class nsIPluginInstance;
 class nsPresContext;
 class nsDisplayPlugin;
+class nsIDOMElement;
 
 #define nsObjectFrameSuper nsFrame
 
 class nsObjectFrame : public nsObjectFrameSuper, public nsIObjectFrame {
 public:
   NS_DECL_FRAMEARENA_HELPERS
 
   friend nsIFrame* NS_NewObjectFrame(nsIPresShell* aPresShell, nsStyleContext* aContext);
@@ -215,16 +216,22 @@ protected:
    * containing the widget, its desired position, size and clip region.
    */
   void ComputeWidgetGeometry(const nsRegion& aRegion,
                              const nsPoint& aPluginOrigin,
                              nsTArray<nsIWidget::Configuration>* aConfigurations);
 
   nsIWidget* GetWidget() { return mWidget; }
 
+  nsresult SetAbsoluteScreenPosition(nsIDOMElement* element,
+                                     nsIDOMClientRect* position,
+                                     nsIDOMClientRect* clip);
+
+  void NotifyPluginEventObservers(const PRUnichar *eventType);
+
   friend class nsPluginInstanceOwner;
   friend class nsDisplayPlugin;
 
 private:
   nsRefPtr<nsPluginInstanceOwner> mInstanceOwner;
   nsIView*                        mInnerView;
   nsCOMPtr<nsIWidget>             mWidget;
   nsIntRect                       mWindowlessRect;
--- a/layout/xul/base/src/nsPopupSetFrame.cpp
+++ b/layout/xul/base/src/nsPopupSetFrame.cpp
@@ -262,21 +262,25 @@ nsPopupSetFrame::RemovePopupFrame(nsIFra
 
   NS_ASSERTION(found, "frame to remove is not in our ::popupList");
   return NS_OK;
 }
 
 nsresult
 nsPopupSetFrame::AddPopupFrameList(nsFrameList& aPopupFrameList)
 {
-  for (nsFrameList::Enumerator e(aPopupFrameList); !e.AtEnd(); e.Next()) {
-    nsresult rv = AddPopupFrame(e.get());
+  while (!aPopupFrameList.IsEmpty()) {
+    nsIFrame* f = aPopupFrameList.FirstChild();
+    // Clears out prev/next sibling points appropriately. Every frame
+    // in our popup list has null next and prev pointers, they're logically
+    // each in their own list.
+    aPopupFrameList.RemoveFrame(f);
+    nsresult rv = AddPopupFrame(f);
     NS_ENSURE_SUCCESS(rv, rv);
   }
-  aPopupFrameList.Clear();
   return NS_OK;
 }
 
 nsresult
 nsPopupSetFrame::AddPopupFrame(nsIFrame* aPopup)
 {
   NS_ASSERTION((aPopup->GetStateBits() & NS_FRAME_OUT_OF_FLOW) &&
                aPopup->GetType() == nsGkAtoms::menuPopupFrame,
--- a/modules/libpr0n/src/imgContainer.cpp
+++ b/modules/libpr0n/src/imgContainer.cpp
@@ -2354,17 +2354,16 @@ NS_IMETHODIMP imgContainer::Draw(gfxCont
   // If a synchronous draw is requested, flush anything that might be sitting around
   if (aFlags & FLAG_SYNC_DECODE) {
     nsresult rv = SyncDecode();
     NS_ENSURE_SUCCESS(rv, rv);
   }
 
   imgFrame *frame = GetCurrentDrawableImgFrame();
   if (!frame) {
-    NS_ABORT_IF_FALSE(!mDecoded, "Decoded but frame not available?");
     return NS_OK; // Getting the frame (above) touches the image and kicks off decoding
   }
 
   nsIntRect framerect = frame->GetRect();
   nsIntMargin padding(framerect.x, framerect.y, 
                       mSize.width - framerect.XMost(),
                       mSize.height - framerect.YMost());
 
--- a/modules/libpr0n/test/crashtests/crashtests.list
+++ b/modules/libpr0n/test/crashtests/crashtests.list
@@ -3,11 +3,10 @@ load 89341-1.gif
 
 # the following tests were inspired by bug 525326
 # they have image sizes of 65535x65535 which is larger than we allow
 load invalid-size.gif
 # this image has a valid size for the first frame, but the second frame is 65535x65535
 load invalid-size-second-frame.gif
 
 # Animated gifs with a very large canvas, but tiny actual content.
-# Disabled temporarily until fatal assertion is removed
-#load delaytest.html?523528-1.gif
-#load delaytest.html?523528-2.gif
+load delaytest.html?523528-1.gif
+load delaytest.html?523528-2.gif
--- a/modules/libpref/src/init/all.js
+++ b/modules/libpref/src/init/all.js
@@ -817,16 +817,25 @@ pref("network.negotiate-auth.using-nativ
 
 #ifdef XP_WIN
 
 // Default to using the SSPI intead of GSSAPI on windows 
 pref("network.auth.use-sspi", true);
 
 #endif
 
+// Controls which NTLM authentication implementation we default to. True forces
+// the use of our generic (internal) NTLM authentication implementation vs. any
+// native implementation provided by the os. This pref is for diagnosing issues
+// with native NTLM. (See bug 520607 for details.) Using generic NTLM authentication
+// can expose the user to reflection attack vulnerabilities. Do not change this
+// unless you know what you're doing!
+// This pref should be removed 6 months after the release of firefox 3.6. 
+pref("network.auth.force-generic-ntlm", false);
+
 // The following prefs are used to enable automatic use of the operating
 // system's NTLM implementation to silently authenticate the user with their
 // Window's domain logon.  The trusted-uris pref follows the format of the
 // trusted-uris pref for negotiate authentication.
 pref("network.automatic-ntlm-auth.allow-proxies", true);
 pref("network.automatic-ntlm-auth.trusted-uris", "");
 
 // This preference controls whether or not the LM hash will be included in
--- a/modules/plugin/sdk/samples/npruntime/plugin.cpp
+++ b/modules/plugin/sdk/samples/npruntime/plugin.cpp
@@ -444,31 +444,41 @@ ScriptablePluginObject::Invoke(NPIdentif
                &v);
     NPN_ReleaseVariantValue(&v);
 
     NPN_ReleaseVariantValue(&divv);
     NPN_ReleaseVariantValue(&bodyv);
 
     NPN_ReleaseVariantValue(&docv);
 
-    STRINGZ_TO_NPVARIANT(strdup("foo return val"), *result);
+    const char* outString = "foo return val";
+    char* npOutString = (char *)NPN_MemAlloc(strlen(outString) + 1);
+    if (!npOutString)
+      return false;
+    strcpy(npOutString, outString);
+    STRINGZ_TO_NPVARIANT(npOutString, *result);
 
     return true;
   }
 
   return false;
 }
 
 bool
 ScriptablePluginObject::InvokeDefault(const NPVariant *args, uint32_t argCount,
                                       NPVariant *result)
 {
   printf ("ScriptablePluginObject default method called!\n");
 
-  STRINGZ_TO_NPVARIANT(strdup("default method return val"), *result);
+  const char* outString = "default method return val";
+  char* npOutString = (char *)NPN_MemAlloc(strlen(outString) + 1);
+  if (!npOutString)
+    return false;
+  strcpy(npOutString, outString);
+  STRINGZ_TO_NPVARIANT(npOutString, *result);
 
   return true;
 }
 
 CPlugin::CPlugin(NPP pNPInstance) :
   m_pNPInstance(pNPInstance),
   m_pNPStream(NULL),
   m_bInitialized(false),
--- a/netwerk/protocol/http/src/nsHttpNTLMAuth.cpp
+++ b/netwerk/protocol/http/src/nsHttpNTLMAuth.cpp
@@ -16,16 +16,17 @@
  *
  * The Initial Developer of the Original Code is
  * Netscape Communications Corporation.
  * Portions created by the Initial Developer are Copyright (C) 2003
  * the Initial Developer. All Rights Reserved.
  *
  * Contributor(s):
  *   Darin Fisher <darin@meer.net>
+ *   Jim Mathies <jmathies@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
@@ -49,16 +50,17 @@
 #include "nsIPrefBranch.h"
 #include "nsIPrefService.h"
 #include "nsIServiceManager.h"
 #include "nsIHttpChannel.h"
 #include "nsIURI.h"
 
 static const char kAllowProxies[] = "network.automatic-ntlm-auth.allow-proxies";
 static const char kTrustedURIs[]  = "network.automatic-ntlm-auth.trusted-uris";
+static const char kForceGeneric[] = "network.auth.force-generic-ntlm";
 
 // XXX MatchesBaseURI and TestPref are duplicated in nsHttpNegotiateAuth.cpp,
 // but since that file lives in a separate library we cannot directly share it.
 // bug 236865 addresses this problem.
 
 static PRBool
 MatchesBaseURI(const nsCSubstring &matchScheme,
                const nsCSubstring &matchHost,
@@ -164,47 +166,58 @@ TestPref(nsIURI *uri, const char *pref)
             break;
         start = end + 1;
     }
     
     nsMemory::Free(hostList);
     return PR_FALSE;
 }
 
+// Check to see if we should use our generic (internal) NTLM auth module.
 static PRBool
-CanUseSysNTLM(nsIHttpChannel *channel, PRBool isProxyAuth)
+ForceGenericNTLM()
 {
-    // check prefs
+    nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
+    if (!prefs)
+        return PR_FALSE;
+    PRBool flag = PR_FALSE;
+
+    if (NS_FAILED(prefs->GetBoolPref(kForceGeneric, &flag)))
+        flag = PR_FALSE;
 
+    LOG(("Force use of generic ntlm auth module: %d\n", flag));
+    return flag;
+}
+
+// Check to see if we should use default credentials for this host or proxy.
+static PRBool
+CanUseDefaultCredentials(nsIHttpChannel *channel, PRBool isProxyAuth)
+{
     nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
     if (!prefs)
         return PR_FALSE;
 
-    PRBool val;
     if (isProxyAuth) {
+        PRBool val;
         if (NS_FAILED(prefs->GetBoolPref(kAllowProxies, &val)))
             val = PR_FALSE;
-        LOG(("sys-ntlm allowed for proxy: %d\n", val));
+        LOG(("Default credentials allowed for proxy: %d\n", val));
         return val;
     }
-    else {
-        nsCOMPtr<nsIURI> uri;
-        channel->GetURI(getter_AddRefs(uri));
-        if (uri && TestPref(uri, kTrustedURIs)) {
-            LOG(("sys-ntlm allowed for host\n"));
-            return PR_TRUE;
-        }
-    }
 
-    return PR_FALSE;
+    nsCOMPtr<nsIURI> uri;
+    channel->GetURI(getter_AddRefs(uri));
+    PRBool isTrustedHost = (uri && TestPref(uri, kTrustedURIs));
+    LOG(("Default credentials allowed for host: %d\n", isTrustedHost));
+    return isTrustedHost;
 }
 
 // Dummy class for session state object.  This class doesn't hold any data.
 // Instead we use its existance as a flag.  See ChallengeReceived.
-class nsNTLMSessionState : public nsISupports 
+class nsNTLMSessionState : public nsISupports
 {
 public:
     NS_DECL_ISUPPORTS
 };
 NS_IMPL_ISUPPORTS0(nsNTLMSessionState)
 
 //-----------------------------------------------------------------------------
 
@@ -216,69 +229,92 @@ nsHttpNTLMAuth::ChallengeReceived(nsIHtt
                                   PRBool          isProxyAuth,
                                   nsISupports   **sessionState,
                                   nsISupports   **continuationState,
                                   PRBool         *identityInvalid)
 {
     LOG(("nsHttpNTLMAuth::ChallengeReceived [ss=%p cs=%p]\n",
          *sessionState, *continuationState));
 
-    // NOTE: we don't define any session state
+    // NOTE: we don't define any session state, but we do use the pointer.
 
     *identityInvalid = PR_FALSE;
-    // start new auth sequence if challenge is exactly "NTLM"
+
+    // Start a new auth sequence if the challenge is exactly "NTLM".
+    // If native NTLM auth apis are available and enabled through prefs,
+    // try to use them.
     if (PL_strcasecmp(challenge, "NTLM") == 0) {
         nsCOMPtr<nsISupports> module;
-        //
-        // our session state is non-null to indicate that we've flagged
-        // this auth domain as not accepting the system's default login.
-        //
-        PRBool trySysNTLM = (*sessionState == nsnull);
 
-        //
-        // we may have access to a built-in SSPI library,
-        // which could be used to authenticate the user without prompting.
-        // 
-        // if the continuationState is null, then we may want to try using
-        // the SSPI NTLM module.  however, we need to take care to only use
-        // that module when speaking to a trusted host.  because the SSPI
-        // may send a weak LMv1 hash of the user's password, we cannot just
-        // send it to any server.
-        //
-        if (trySysNTLM && !*continuationState && CanUseSysNTLM(channel, isProxyAuth)) {
-            module = do_CreateInstance(NS_AUTH_MODULE_CONTRACTID_PREFIX "sys-ntlm");
+        // Check to see if we should default to our generic NTLM auth module
+        // through UseGenericNTLM. (We use native auth by default if the
+        // system provides it.) If *sessionState is non-null, we failed to
+        // instantiate a native NTLM module the last time, so skip trying again.
+        PRBool forceGeneric = ForceGenericNTLM();
+        if (!forceGeneric && !*sessionState) {
+            // Check for approved default credentials hosts and proxies. If 
+            // *continuationState is non-null, the last authentication attempt
+            // failed so skip default credential use.
+            if (!*continuationState && CanUseDefaultCredentials(channel, isProxyAuth)) {
+                // Try logging in with the user's default credentials. If
+                // successful, |identityInvalid| is false, which will trigger
+                // a default credentials attempt once we return.
+                module = do_CreateInstance(NS_AUTH_MODULE_CONTRACTID_PREFIX "sys-ntlm");
+            }
+#ifdef XP_WIN
+            else {
+                // Try to use native NTLM and prompt the user for their domain,
+                // username, and password. (only supported by windows nsAuthSSPI module.)
+                // Note, for servers that use LMv1 a weak hash of the user's password
+                // will be sent. We rely on windows internal apis to decide whether
+                // we should support this older, less secure version of the protocol.
+                module = do_CreateInstance(NS_AUTH_MODULE_CONTRACTID_PREFIX "sys-ntlm");
+                *identityInvalid = PR_TRUE;
+            }
+#endif // XP_WIN
 #ifdef PR_LOGGING
             if (!module)
-                LOG(("failed to load sys-ntlm module\n"));
+                LOG(("Native sys-ntlm auth module not found.\n"));
 #endif
         }
 
-        // it's possible that there is no ntlm-sspi auth module...
+#ifdef XP_WIN
+        // On windows, never fall back unless the user has specifically requested so.
+        if (!forceGeneric && !module)
+            return NS_ERROR_UNEXPECTED;
+#endif
+
+        // If no native support was available. Fall back on our internal NTLM implementation.
         if (!module) {
             if (!*sessionState) {
-                // remember the fact that we cannot use the "sys-ntlm" module,
+                // Remember the fact that we cannot use the "sys-ntlm" module,
                 // so we don't ever bother trying again for this auth domain.
                 *sessionState = new nsNTLMSessionState();
                 if (!*sessionState)
                     return NS_ERROR_OUT_OF_MEMORY;
                 NS_ADDREF(*sessionState);
             }
 
+            // Use our internal NTLM implementation. Note, this is less secure,
+            // see bug 520607 for details.
+            LOG(("Trying to fall back on internal ntlm auth.\n"));
             module = do_CreateInstance(NS_AUTH_MODULE_CONTRACTID_PREFIX "ntlm");
 
-            // prompt user for domain, username, and password...
+            // Prompt user for domain, username, and password.
             *identityInvalid = PR_TRUE;
         }
 
-        // if this fails, then it means that we cannot do NTLM auth.
-        if (!module)
+        // If this fails, then it means that we cannot do NTLM auth.
+        if (!module) {
+            LOG(("No ntlm auth modules available.\n"));
             return NS_ERROR_UNEXPECTED;
+        }
 
-        // non-null continuation state implies that we failed to authenticate.
-        // blow away the old authentication state, and use the new one.
+        // A non-null continuation state implies that we failed to authenticate.
+        // Blow away the old authentication state, and use the new one.
         module.swap(*continuationState);
     }
     return NS_OK;
 }
 
 NS_IMETHODIMP
 nsHttpNTLMAuth::GenerateCredentials(nsIHttpChannel  *httpChannel,
                                     const char      *challenge,
@@ -327,26 +363,26 @@ nsHttpNTLMAuth::GenerateCredentials(nsIH
         // decode challenge; skip past "NTLM " to the start of the base64
         // encoded data.
         int len = strlen(challenge);
         if (len < 6)
             return NS_ERROR_UNEXPECTED; // bogus challenge
         challenge += 5;
         len -= 5;
 
+        // strip off any padding (see bug 230351)
+        while (challenge[len - 1] == '=')
+          len--;
+
         // decode into the input secbuffer
         inBufLen = (len * 3)/4;      // sufficient size (see plbase64.h)
         inBuf = nsMemory::Alloc(inBufLen);
         if (!inBuf)
             return NS_ERROR_OUT_OF_MEMORY;
 
-        // strip off any padding (see bug 230351)
-        while (challenge[len - 1] == '=')
-          len--;
-
         if (PL_Base64Decode(challenge, len, (char *) inBuf) == nsnull) {
             nsMemory::Free(inBuf);
             return NS_ERROR_UNEXPECTED; // improper base64 encoding
         }
     }
 
     rv = module->GetNextToken(inBuf, inBufLen, &outBuf, &outBufLen);
     if (NS_SUCCEEDED(rv)) {
--- a/security/manager/ssl/src/nsNTLMAuthModule.cpp
+++ b/security/manager/ssl/src/nsNTLMAuthModule.cpp
@@ -797,17 +797,16 @@ nsNTLMAuthModule::InitTest()
 
 NS_IMETHODIMP
 nsNTLMAuthModule::Init(const char      *serviceName,
                        PRUint32         serviceFlags,
                        const PRUnichar *domain,
                        const PRUnichar *username,
                        const PRUnichar *password)
 {
-  NS_ASSERTION(serviceName == nsnull, "unexpected service name");
   NS_ASSERTION(serviceFlags == nsIAuthModule::REQ_DEFAULT, "unexpected service flags");
 
   mDomain = domain;
   mUsername = username;
   mPassword = password;
   return NS_OK;
 }
 
new file mode 100644
--- /dev/null
+++ b/storage/test/unit/test_sqlite_secure_delete.js
@@ -0,0 +1,138 @@
+/*-*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *vim: sw=2 ts=2 et lcs=trail\:.,tab\:>~ :
+ * ***** 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 Storage Test Code.
+ *
+ * The Initial Developer of the Original Code is
+ * Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2009
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *   Shawn Wilsher <me@shawnwilsher.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 ***** */
+
+/**
+ * This file tests to make sure that SQLite was compiled with
+ * SQLITE_SECURE_DELETE=1.
+ */
+
+////////////////////////////////////////////////////////////////////////////////
+//// Helper Methods
+
+/**
+ * Reads the contents of a file and returns it as a string.
+ *
+ * @param aFile
+ *        The file to return from.
+ * @return the contents of the file in the form of a string.
+ */
+function getFileContents(aFile)
+{
+  let fstream = Cc["@mozilla.org/network/file-input-stream;1"].
+                createInstance(Ci.nsIFileInputStream);
+  fstream.init(aFile, -1, 0, 0);
+
+  let bstream = Cc["@mozilla.org/binaryinputstream;1"].
+                createInstance(Ci.nsIBinaryInputStream);
+  bstream.setInputStream(fstream);
+  return bstream.readBytes(bstream.available());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//// Tests
+
+function test_delete_removes_data()
+{
+  const TEST_STRING = "SomeRandomStringToFind";
+
+  let file = getTestDB();
+  let db = getService().openDatabase(file);
+
+  // Create the table and insert the data.
+  db.createTable("test", "data TEXT");
+  let stmt = db.createStatement("INSERT INTO test VALUES(:data)");
+  stmt.params.data = TEST_STRING;
+  try {
+    stmt.execute();
+  }
+  finally {
+    stmt.finalize();
+  }
+
+  // Make sure this test is actually testing what it thinks by making sure the
+  // string shows up in the database.  Because the previous statement was
+  // automatically wrapped in a transaction, the contents are already on disk.
+  let contents = getFileContents(file);
+  do_check_neq(-1, contents.indexOf(TEST_STRING));
+
+  // Delete the data, and then close the database.
+  stmt = db.createStatement("DELETE FROM test WHERE data = :data");
+  stmt.params.data = TEST_STRING;
+  try {
+    stmt.execute();
+  }
+  finally {
+    stmt.finalize();
+  }
+  db.close();
+
+  // Check the file to see if the string can be found.
+  contents = getFileContents(file);
+  do_check_eq(-1, contents.indexOf(TEST_STRING));
+
+  run_next_test();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//// Test Runner
+
+var tests =
+[
+  test_delete_removes_data,
+];
+let index = 0;
+
+function run_next_test()
+{
+  if (index < tests.length) {
+    do_test_pending();
+    print("Running the next test: " + tests[index].name);
+    tests[index++]();
+  }
+
+  do_test_finished();
+}
+
+function run_test()
+{
+  cleanup();
+
+  do_test_pending();
+  run_next_test();
+}
--- a/testing/mochitest/browser-test.js
+++ b/testing/mochitest/browser-test.js
@@ -104,16 +104,31 @@ Tester.prototype = {
   },
 
   execTest: function Tester_execTest() {
     if (this.done) {
       this.finish();
       return;
     }
 
+    // Make sure the window is raised before each test.
+    let fm = Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager);
+    if (fm.activeWindow != window) {
+      this.dumper.dump("Waiting for window activation...\n");
+      let self = this;
+      window.addEventListener("activate", function () {
+        window.removeEventListener("activate", arguments.callee, false);
+        setTimeout(function () {
+          self.execTest();
+        }, 0);
+      }, false);
+      window.focus();
+      return;
+    }
+
     // Move to the next test (or first test).
     this.step();
 
     this.dumper.dump("Running " + this.currentTest.path + "...\n");
 
     // Load the tests into a testscope
     this.currentTest.scope = new testScope(this, this.currentTest);
 
--- a/toolkit/components/filepicker/src/nsFilePicker.js.in
+++ b/toolkit/components/filepicker/src/nsFilePicker.js.in
@@ -160,17 +160,17 @@ nsFilePicker.prototype = {
                    bundle.GetStringFromName("htmlFilter"));
     }
     if (filterMask & nsIFilePicker.filterText) {
       this.appendFilter(bundle.GetStringFromName("textTitle"),
                    bundle.GetStringFromName("textFilter"));
     }
     if (filterMask & nsIFilePicker.filterImages) {
       this.appendFilter(bundle.GetStringFromName("imageTitle"),
-                   bundle.GetStringFromName("imageFilter"));
+                   "*.jpg; *.jpeg; *.gif; *.png; *.bmp; *.ico"); // XXX 528755
     }
     if (filterMask & nsIFilePicker.filterXML) {
       this.appendFilter(bundle.GetStringFromName("xmlTitle"),
                    bundle.GetStringFromName("xmlFilter"));
     }
     if (filterMask & nsIFilePicker.filterXUL) {
       this.appendFilter(bundle.GetStringFromName("xulTitle"),
                    bundle.GetStringFromName("xulFilter"));
--- a/toolkit/content/tests/widgets/Makefile.in
+++ b/toolkit/content/tests/widgets/Makefile.in
@@ -122,18 +122,17 @@ include $(topsrcdir)/config/rules.mk
 		videocontrols_direction-2-ref.html \
 		videocontrols_direction-2a.html \
 		videocontrols_direction-2b.html \
 		videocontrols_direction-2c.html \
 		videocontrols_direction-2d.html \
 		videocontrols_direction-2e.html \
 		videocontrols_direction_test.js \
 		use_large_cache.js \
-		audio.oga \
-		black.ogv \
+		audio.wav \
 		video.ogg \
 		videomask.css \
 		$(NULL)
 
 ifneq (cocoa,$(MOZ_WIDGET_TOOLKIT))
 _TEST_FILES += test_menubar.xul \
                window_menubar.xul
 endif
deleted file mode 100644
index 93f42c6a3668e9aff9a37a53a93e6ef72b34032e..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c6fd5cb869351be1b0fd2ccbdac51eb77066f464
GIT binary patch
literal 1422
zc${67YfMvj7{=>|Wo&M7PT5!(>O`4bhinYTG{95}a$SLz0u?B=6k19tZQ;;+OK-G=
zLR;>%+{>LJ_e-HwC|b~NG0|);nmMCU!NoZB>;C7|Wy^jiCpkIi<b9v>KF@nFiShCB
zcTgx?9QHi9jCJHA6biKm9OuSR$himQg(4NQ3W?wyS#7OUDv^lAB9Txa;PZJrF1H4P
zs;jFwY!<7MSy91Yl+yua9_aLP2BV^aS;^v5RaZk?9-l7|i6s(gtxT>^D3k~)l}h=4
zz&%x+TCLG&0rh|e5AdZ{t5MgflnRAhRx6c=|D&V^XhEp?7epN_uM)@u;>xI{B_$L}
zF${%LQc5kOGnkd^Du~M$NowUvwN|G$G`F_3cXXLdW*C#HtE;2Et+m;xZ`9Rm)JnNb
zDi#TNHBc3s<ta)pqtU1UQ2K3gGWimTR8&MH5(_;Li;75>$i<)|?VpY{Jb_p$ldII)
zhDN=yrLCjWWbWzh9~iU@4UdeBj!#;x)+sB@<mBYU#Q50g$ncP5pue}rZ0c-pF&Y{h
zv~^0EM8vPDW-}ROR0^3yEV!7Lo0E;hVzaU`VY0HYSX?$fCpR~bkYDgt22fE-rNIUv
z{s4!Vl`t$8i_PY6I90G)$Q-#`E{_Ln;|l~rp-?0eizQOv9&DcyIHb|mH#9csjbLD4
zUfn>v1r|Pad1iKgVR30`c?Gb%w74)oJ3TcqHZs`P-Pvl;X%rFx#44wf3klhoX-Vj_
zv1g*AzBw5l78)EB6bKU(6dW2B9`SW#RP^bXxO3>ll=KWNKChsNOre!CIS@}ImDgz-
z^v!LZ=AM4b2<SOIJHNQJVq0Ca+Z_&v-M+SF1D!!*>%`dbV1IA7siUo>+0fLeYpB<H
z0I|~P8o>wX4F;ppXfWvY@Ka5l0!)<$u`6g4QhqKLlag>YCi>fxp@GMb9`g0^KCpk^
z2YcW1@_HA>>;1hS?%RLR$M>-Rmm%Si(XsK#7<~RE8WR%9wTAYdp^2F#yL0>J+rQp>
z@aXC8pD$j%dj00jo7b=Ydimn{&XY%f+`oJ0mfPiY*cN6cM=gEkjuv371{f>#EE>qS
z0GU1l2s=n#HHXDy&}k*bq{93>JT4QHo|>GLn1GHyj}RY^MkgdDUPww#O-ug~lL2CY
z#o@BE@%S7Ngxov;fpGC+J`xBdmZdZhN)`v=3cz5IB`~&jbeVhl1}wv)V-r@`(Yg5r
zV5rTuYIj_@y5V$gUUzM6-?-^^{{(QmZ{FB;U30EGY)f;O$A|h%txX!a5UQk+^YIxe
z=(y8S5n(|A{zv?LeLnR*c;I8efrH+k_<ZK;cf>y+FeEG@^1Cy!=Ms|AFxVVIA&Ekz
zGuaSND3z<UIzvml39;EaJ-4{LYQM6+v3U)&-`d{Z-g3EI*RNmO+;loO)~{Z%udUiZ
z<QC@VW~MJ&!PX#4)910@sMpo2RWgZ?2XUC?)M8QrAqSh0mYjGVj^L@N$cXT;kiZiG
z$B!NT;_#tEetw_B`1u_^>VNEbz=`0{uOcE(eIN4!Iw=){BM^&e6;*txvfj{U9vGdP
zTX8sD?pt^6-uwOG<0sE{cAo=wcb+|c{P4m3-+sA$%e}RE)oxpyof;pp^mTUuIZZmP
OTBVTHdVXUPndEONLbqQ4
deleted file mode 100644
index ab146ebe285f56fb04cf1affc3f2fd7dc8bc11b9..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/toolkit/content/tests/widgets/videocontrols_direction-1-ref.html
+++ b/toolkit/content/tests/widgets/videocontrols_direction-1-ref.html
@@ -1,10 +1,10 @@
 <!DOCTYPE HTML>
 <html>
 <head>
 <link rel="stylesheet" type="text/css" href="videomask.css">
 </head>
 <body style="text-align: right;">
-<video controls autobuffer id="av" source="black.ogv"></video>
+<video controls autobuffer id="av" source="audio.wav"></video>
 <div id="mask"></div>
 </body>
 </html>
--- a/toolkit/content/tests/widgets/videocontrols_direction-1a.html
+++ b/toolkit/content/tests/widgets/videocontrols_direction-1a.html
@@ -1,10 +1,10 @@
 <!DOCTYPE HTML>
 <html dir="rtl">
 <head>
 <link rel="stylesheet" type="text/css" href="videomask.css">
 </head>
 <body>
-<video controls autobuffer id="av" source="black.ogv"></video>
+<video controls autobuffer id="av" source="audio.wav"></video>
 <div id="mask"></div>
 </body>
 </html>
--- a/toolkit/content/tests/widgets/videocontrols_direction-1b.html
+++ b/toolkit/content/tests/widgets/videocontrols_direction-1b.html
@@ -1,10 +1,10 @@
 <!DOCTYPE HTML>
 <html style="direction: rtl">
 <head>
 <link rel="stylesheet" type="text/css" href="videomask.css">
 </head>
 <body>
-<video controls autobuffer id="av" source="black.ogv"></video>
+<video controls autobuffer id="av" source="audio.wav"></video>
 <div id="mask"></div>
 </body>
 </html>
--- a/toolkit/content/tests/widgets/videocontrols_direction-1c.html
+++ b/toolkit/content/tests/widgets/videocontrols_direction-1c.html
@@ -1,10 +1,10 @@
 <!DOCTYPE HTML>
 <html>
 <head>
 <link rel="stylesheet" type="text/css" href="videomask.css">
 </head>
 <body style="direction: rtl">
-<video controls autobuffer id="av" source="black.ogv"></video>
+<video controls autobuffer id="av" source="audio.wav"></video>
 <div id="mask"></div>
 </body>
 </html>
--- a/toolkit/content/tests/widgets/videocontrols_direction-1d.html
+++ b/toolkit/content/tests/widgets/videocontrols_direction-1d.html
@@ -1,10 +1,10 @@
 <!DOCTYPE HTML>
 <html>
 <head>
 <link rel="stylesheet" type="text/css" href="videomask.css">
 </head>
 <body style="text-align: right;">
-<video controls autobuffer id="av" source="black.ogv" dir="rtl"></video>
+<video controls autobuffer id="av" source="audio.wav" dir="rtl"></video>
 <div id="mask"></div>
 </body>
 </html>
--- a/toolkit/content/tests/widgets/videocontrols_direction-1e.html
+++ b/toolkit/content/tests/widgets/videocontrols_direction-1e.html
@@ -1,10 +1,10 @@
 <!DOCTYPE HTML>
 <html>
 <head>
 <link rel="stylesheet" type="text/css" href="videomask.css">
 </head>
 <body style="text-align: right;">
-<video controls autobuffer id="av" source="black.ogv" style="direction: rtl;"></video>
+<video controls autobuffer id="av" source="audio.wav" style="direction: rtl;"></video>
 <div id="mask"></div>
 </body>
 </html>
--- a/toolkit/content/tests/widgets/videocontrols_direction-2-ref.html
+++ b/toolkit/content/tests/widgets/videocontrols_direction-2-ref.html
@@ -1,10 +1,10 @@
 <!DOCTYPE HTML>
 <html>
 <head>
 <link rel="stylesheet" type="text/css" href="videomask.css">
 </head>
 <body style="text-align: right;">
-<audio controls autobuffer id="av" source="audio.oga"></audio>
+<audio controls autobuffer id="av" source="audio.wav"></audio>
 <div id="mask"></div>
 </body>
 </html>
--- a/toolkit/content/tests/widgets/videocontrols_direction-2a.html
+++ b/toolkit/content/tests/widgets/videocontrols_direction-2a.html
@@ -1,10 +1,10 @@
 <!DOCTYPE HTML>
 <html dir="rtl">
 <head>
 <link rel="stylesheet" type="text/css" href="videomask.css">
 </head>
 <body>
-<audio controls autobuffer id="av" source="audio.oga"></audio>
+<audio controls autobuffer id="av" source="audio.wav"></audio>
 <div id="mask"></div>
 </body>
 </html>
--- a/toolkit/content/tests/widgets/videocontrols_direction-2b.html
+++ b/toolkit/content/tests/widgets/videocontrols_direction-2b.html
@@ -1,10 +1,10 @@
 <!DOCTYPE HTML>
 <html style="direction: rtl">
 <head>
 <link rel="stylesheet" type="text/css" href="videomask.css">
 </head>
 <body>
-<audio controls autobuffer id="av" source="audio.oga"></audio>
+<audio controls autobuffer id="av" source="audio.wav"></audio>
 <div id="mask"></div>
 </body>
 </html>
--- a/toolkit/content/tests/widgets/videocontrols_direction-2c.html
+++ b/toolkit/content/tests/widgets/videocontrols_direction-2c.html
@@ -1,10 +1,10 @@
 <!DOCTYPE HTML>
 <html>
 <head>
 <link rel="stylesheet" type="text/css" href="videomask.css">
 </head>
 <body style="direction: rtl">
-<audio controls autobuffer id="av" source="audio.oga"></audio>
+<audio controls autobuffer id="av" source="audio.wav"></audio>
 <div id="mask"></div>
 </body>
 </html>
--- a/toolkit/content/tests/widgets/videocontrols_direction-2d.html
+++ b/toolkit/content/tests/widgets/videocontrols_direction-2d.html
@@ -1,10 +1,10 @@
 <!DOCTYPE HTML>
 <html>
 <head>
 <link rel="stylesheet" type="text/css" href="videomask.css">
 </head>
 <body style="text-align: right;">
-<audio controls autobuffer id="av" source="audio.oga" dir="rtl"></audio>
+<audio controls autobuffer id="av" source="audio.wav" dir="rtl"></audio>
 <div id="mask"></div>
 </body>
 </html>
--- a/toolkit/content/tests/widgets/videocontrols_direction-2e.html
+++ b/toolkit/content/tests/widgets/videocontrols_direction-2e.html
@@ -1,10 +1,10 @@
 <!DOCTYPE HTML>
 <html>
 <head>
 <link rel="stylesheet" type="text/css" href="videomask.css">
 </head>
 <body style="text-align: right;">
-<audio controls autobuffer id="av" source="audio.oga" style="direction: rtl;"></audio>
+<audio controls autobuffer id="av" source="audio.wav" style="direction: rtl;"></audio>
 <div id="mask"></div>
 </body>
 </html>
--- a/toolkit/content/tests/widgets/videocontrols_direction_test.js
+++ b/toolkit/content/tests/widgets/videocontrols_direction_test.js
@@ -15,20 +15,19 @@ RemoteCanvas.prototype.load = function(c
   var iframe = document.createElement("iframe");
   iframe.id = this.id + "-iframe";
   iframe.width = RemoteCanvas.CANVAS_WIDTH + "px";
   iframe.height = RemoteCanvas.CANVAS_HEIGHT + "px";
   iframe.src = this.url;
   var me = this;
   iframe.addEventListener("load", function() {
     var m = iframe.contentDocument.getElementById("av");
-    m.addEventListener("suspend", function(aEvent) {
-      if (m.readyState == m.HAVE_ENOUGH_DATA &&
-          aEvent.loaded == aEvent.total) {
-        m.removeEventListener("suspend", arguments.callee, false);
+    m.addEventListener("progress", function(aEvent) {
+      if (aEvent.loaded == aEvent.total) {
+        m.removeEventListener("progress", arguments.callee, false);
         setTimeout(function() {
           me.remotePageLoaded(callback);
         }, 0);
       }
     }, false);
     m.src = m.getAttribute("source");
   }, false);
   window.document.body.appendChild(iframe);
--- a/toolkit/mozapps/downloads/src/DownloadLastDir.jsm
+++ b/toolkit/mozapps/downloads/src/DownloadLastDir.jsm
@@ -29,16 +29,33 @@
  * 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 behavior implemented by gDownloadLastDir is documented here.
+ *
+ * In normal browsing sessions, gDownloadLastDir uses the browser.download.lastDir
+ * preference to store the last used download directory. The first time the user
+ * switches into the private browsing mode, the last download directory is
+ * preserved to the pref value, but if the user switches to another directory
+ * during the private browsing mode, that directory is not stored in the pref,
+ * and will be merely kept in memory.  When leaving the private browsing mode,
+ * this in-memory value will be discarded, and the last download directory
+ * will be reverted to the pref value.
+ *
+ * Both the pref and the in-memory value will be cleared when clearing the
+ * browsing history.  This effectively changes the last download directory
+ * to the default download directory on each platform.
+ */
+
 const LAST_DIR_PREF = "browser.download.lastDir";
 const PBSVC_CID = "@mozilla.org/privatebrowsing;1";
 const nsILocalFile = Components.interfaces.nsILocalFile;
 
 var EXPORTED_SYMBOLS = [ "gDownloadLastDir" ];
 
 let pbSvc = null;
 if (PBSVC_CID in Components.classes) {
--- a/toolkit/mozapps/update/content/updates.js
+++ b/toolkit/mozapps/update/content/updates.js
@@ -218,17 +218,17 @@ var gUpdates = {
   never: function () {
     // If the user clicks "Never", we should not prompt them about updating to
     // this major update version again, unless they manually do
     // "Check for Updates..." which will clear the "never" pref for the version
     // presented and remind them later about this available update.
     //
     // Encode version since it could be a non-ascii string (bug 359093)
     var neverPrefName = PREF_UPDATE_NEVER_BRANCH +
-                       encodeURIComponent(gUpdates.update.version);
+                        encodeURIComponent(gUpdates.update.version);
     gPref.setBoolPref(neverPrefName, true);
     this.wiz.cancel();
   },
 
   later: function () {
     // The user said "Later", so close the wizard
     this.wiz.cancel();
   },
@@ -757,16 +757,23 @@ var gManualUpdatePage = {
   onPageShow: function() {
     var formatter = CoC["@mozilla.org/toolkit/URLFormatterService;1"].
                     getService(CoI.nsIURLFormatter);
     var manualURL = formatter.formatURLPref(PREF_UPDATE_MANUAL_URL);
     var manualUpdateLinkLabel = document.getElementById("manualUpdateLinkLabel");
     manualUpdateLinkLabel.value = manualURL;
     manualUpdateLinkLabel.setAttribute("url", manualURL);
 
+    // Prevent multiple notifications for the same update when the user is
+    // unable to apply updates.
+    // Encode version since it could be a non-ascii string (bug 359093)
+    var neverPrefName = PREF_UPDATE_NEVER_BRANCH +
+                        encodeURIComponent(gUpdates.update.version);
+    gPref.setBoolPref(neverPrefName, true);
+
     gUpdates.setButtons(null, null, "okButton", true);
     gUpdates.wiz.getButton("finish").focus();
   }
 };
 
 /**
  * The "Updates Are Available" page. Provides the user information about the
  * available update.
--- a/toolkit/mozapps/update/src/nsUpdateService.js.in
+++ b/toolkit/mozapps/update/src/nsUpdateService.js.in
@@ -1320,16 +1320,31 @@ UpdateService.prototype = {
 #         never receive the minor update or the minor update they notification.
 #      b) the never decision only applies to major updates. See bug 350636 for
 #         a scenario where this could potentially be an issue.
      */
 
     // Encode version since it could be a non-ascii string (bug 359093)
     var neverPrefName = PREF_UPDATE_NEVER_BRANCH +
                         encodeURIComponent(update.version);
+
+    if (!gCanApplyUpdates) {
+      if (getPref("getBoolPref", neverPrefName, false)) {
+        LOG("Checker:_selectAndInstallUpdate - the user is unable to apply " +
+            "updates. Not prompting because the preference " + neverPrefName + 
+            " is true");
+      }
+      else {
+        LOG("Checker:_selectAndInstallUpdate - the user is unable to apply " +
+            "updates... prompting");
+        this._showPrompt(update);
+      }
+      return;
+    }
+
     if (update.type == "major" &&
         getPref("getBoolPref", neverPrefName, false)) {
       LOG("Checker:_selectAndInstallUpdate - not prompting because this is a " +
           "major update and the preference " + neverPrefName + " is true");
       return;
     }
 
     /**
@@ -1352,23 +1367,16 @@ UpdateService.prototype = {
      */
     if (update.type == "major") {
       LOG("Checker:_selectAndInstallUpdate - prompting because it is a major " +
           "update");
       this._showPrompt(update);
       return;
     }
 
-    if (!gCanApplyUpdates) {
-      LOG("Checker:_selectAndInstallUpdate - prompting because the user is " +
-          "unable to apply updates");
-      this._showPrompt(update);
-      return;
-    }
-
     if (!getPref("getBoolPref", PREF_APP_UPDATE_AUTO, true)) {
       LOG("Checker:_selectAndInstallUpdate - prompting because silent " +
           "install is disabled");
       this._showPrompt(update);
       return;
     }
 
     if (getPref("getIntPref", PREF_APP_UPDATE_MODE, 1) == 0) {
index cec8cf34e0939bd293d866ad7e4885e0d2ddd4a7..1119e394c3d6572a5256c09fe1af635eb8e17cb2
GIT binary patch
literal 2561
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
Xn1KPvlYlpv00000NkvXXu0mjfL0R5H
--- a/toolkit/xre/nsWindowsDllBlocklist.h
+++ b/toolkit/xre/nsWindowsDllBlocklist.h
@@ -37,16 +37,21 @@
  * ***** END LICENSE BLOCK ***** */
 
 #ifndef IN_WINDOWS_DLL_BLOCKLIST
 #error This file should only be included by nsWindowsDllBlocklist.cpp
 #endif
 
 #define ALL_VERSIONS   ((unsigned long long)-1LL)
 
+// Convert the 4 (decimal) components of a DLL version number into a
+// single unsigned long long, as needed by the blocklist
+#define MAKE_VERSION(a,b,c,d)\
+  ((a##ULL << 48) + (b##ULL << 32) + (c##ULL << 16) + d##ULL)
+
 struct DllBlockInfo {
   // The name of the DLL -- in LOWERCASE!  It will be compared to
   // a lowercase version of the DLL name only.
   const char *name;
 
   // If maxVersion is ALL_VERSIONS, we'll block all versions of this
   // dll.  Otherwise, we'll block all versions less than or equal to
   // the given version, as queried by GetFileVersionInfo and
@@ -58,15 +63,21 @@ struct DllBlockInfo {
   unsigned long long maxVersion;
 };
 
 static DllBlockInfo sWindowsDllBlocklist[] = {
   // EXAMPLE:
   // { "uxtheme.dll", ALL_VERSIONS },
   // { "uxtheme.dll", 0x0000123400000000ULL },
   // The DLL name must be in lowercase!
+  
+  // NPFFAddon - Known malware
+  { "npffaddon.dll", ALL_VERSIONS},
+
+  // AVG 8 - Antivirus vendor AVG, old version, plugin already blocklisted
+  {"avgrsstx.dll", MAKE_VERSION(8,5,0,401)},
 
   // leave these two in always for tests
   { "mozdllblockingtest.dll", ALL_VERSIONS },
   { "mozdllblockingtest_versioned.dll", 0x0000000400000000ULL },
 
   { NULL, 0 }
 };
--- a/tools/update-packaging/make_incremental_update.sh
+++ b/tools/update-packaging/make_incremental_update.sh
@@ -43,17 +43,17 @@ check_for_forced_update() {
   return 1;
 }
 
 if [ $# = 0 ]; then
   print_usage
   exit 1
 fi
 
-requested_forced_updates=''
+requested_forced_updates='components/components.list Contents/MacOS/components/components.list'
 
 while getopts "hf:" flag
 do
    case "$flag" in
       h) print_usage; exit 0
       ;;
       f) requested_forced_updates="$requested_forced_updates $OPTARG"
       ;;
@@ -104,37 +104,40 @@ for ((i=0; $i<$num_oldfiles; i=$i+1)); d
 
   # This file is created by Talkback, so we can ignore it
   if [ "$f" = "readme.txt" ]; then
     continue 1
   fi
 
   # If this file exists in the new directory as well, then check if it differs.
   if [ -f "$newdir/$f" ]; then
+
+    if check_for_forced_update "$requested_forced_updates" "$f"; then
+      echo 1>&2 "  FORCING UPDATE for file '$f'..."
+      # The full workdir may not exist yet, so create it if necessary. 
+      mkdir -p `dirname "$workdir/$f"`
+      $BZIP2 -cz9 "$newdir/$f" > "$workdir/$f"
+      make_add_instruction "$f" >> $manifest
+      archivefiles="$archivefiles \"$f\""
+      continue 1
+    fi
+
     if ! diff "$olddir/$f" "$newdir/$f" > /dev/null; then
       # Compute both the compressed binary diff and the compressed file, and
       # compare the sizes.  Then choose the smaller of the two to package.
       echo "  diffing $f"
       dir=$(dirname "$workdir/$f")
       mkdir -p "$dir"
       $MBSDIFF "$olddir/$f" "$newdir/$f" "$workdir/$f.patch"
       $BZIP2 -z9 "$workdir/$f.patch"
       $BZIP2 -cz9 "$newdir/$f" > "$workdir/$f"
       patchfile="$workdir/$f.patch.bz2"
       patchsize=$(get_file_size "$patchfile")
       fullsize=$(get_file_size "$workdir/$f")
 
-      if check_for_forced_update "$requested_forced_updates" "$f"; then
-        echo 1>&2 "  FORCING UPDATE for file '$f'..."
-        make_add_instruction "$f" >> $manifest
-        rm -f "$patchfile"
-        archivefiles="$archivefiles \"$f\""
-        continue 1
-      fi
-
       if [ $patchsize -lt $fullsize -a "$f" != "removed-files" ]; then
         make_patch_instruction "$f" >> $manifest
         mv -f "$patchfile" "$workdir/$f.patch"
         rm -f "$workdir/$f"
         archivefiles="$archivefiles \"$f.patch\""
       else
         make_add_instruction "$f" >> $manifest
         rm -f "$patchfile"
--- a/widget/src/windows/nsWindow.cpp
+++ b/widget/src/windows/nsWindow.cpp
@@ -5177,18 +5177,19 @@ PRBool nsWindow::OnMouseWheel(UINT msg, 
   }
 
   if ((isVertical  && ulScrollLines != WHEEL_PAGESCROLL && !iDeltaPerLine) ||
       (!isVertical && ulScrollChars != WHEEL_PAGESCROLL && !iDeltaPerChar))
     return PR_FALSE; // break
 
   // The mousewheel event will be dispatched to the toplevel
   // window.  We need to give it to the child window
-  if (!HandleScrollingPlugins(msg, wParam, lParam, result))
-    return result; // return immediately if its not our window
+  PRBool quit;
+  if (!HandleScrollingPlugins(msg, wParam, lParam, result, aRetValue, quit))
+    return quit; // return immediately if its not our window
 
   // We should cancel the surplus delta if the current window is not
   // same as previous.
   if (currentWindow != mWnd) {
     currentVDelta = 0;
     currentHDelta = 0;
     currentWindow = mWnd;
   }
@@ -5911,23 +5912,26 @@ void nsWindow::OnSettingsChange(WPARAM w
 {
   if (mWindowType == eWindowType_dialog ||
       mWindowType == eWindowType_toplevel )
     nsWindowGfx::OnSettingsChangeGfx(wParam);
 }
 
 // Scrolling helper function for handling plugins.  
 // Return value indicates whether the calling function should handle this
-// result indicates whether this was handled at all
+// aHandled indicates whether this was handled at all
+// aQuitProcessing tells whether or not to continue processing the message
 PRBool nsWindow::HandleScrollingPlugins(UINT aMsg, WPARAM aWParam,
-                                        LPARAM aLParam, PRBool& aHandled)
+                                        LPARAM aLParam, PRBool& aHandled,
+                                        LRESULT* aRetValue,
+                                        PRBool& aQuitProcessing)
 {
   // The scroll event will be dispatched to the toplevel
   // window.  We need to give it to the child window
-  aHandled = PR_FALSE; // default is to have not handled
+  aQuitProcessing = PR_FALSE; // default is to not stop processing
   POINT point;
   DWORD dwPoints = ::GetMessagePos();
   point.x = GET_X_LPARAM(dwPoints);
   point.y = GET_Y_LPARAM(dwPoints);
 
   static PRBool sMayBeUsingLogitechMouse = PR_FALSE;
   if (aMsg == WM_MOUSEHWHEEL) {
     // Logitech (Logicool) mouse driver (confirmed with 4.82.11 and MX-1100)
@@ -5957,25 +5961,25 @@ PRBool nsWindow::HandleScrollingPlugins(
   HWND destWnd = ::WindowFromPoint(point);
   // Since we receive scroll events for as long as
   // we are focused, it's entirely possible that there
   // is another app's window or no window under the
   // pointer.
 
   if (!destWnd) {
     // No window is under the pointer
-    return PR_FALSE; // break
+    return PR_FALSE; // break, but continue processing
   }
   // We don't care about windows belonging to other processes.
   DWORD processId = 0;
   GetWindowThreadProcessId(destWnd, &processId);
   if (processId != GetCurrentProcessId())
   {
     // Somebody elses window
-    return PR_FALSE; // break
+    return PR_FALSE; // break, but continue processing
   }
   nsWindow* destWindow = GetNSWindowPtr(destWnd);
   if (!destWindow || destWindow->mWindowType == eWindowType_plugin) {
     // Some other app, or a plugin window.
     // Windows directs scrolling messages to the focused window.
     // However, Mozilla does not like plugins having focus, so a
     // Mozilla window (ie, the plugin's parent (us!) has focus.)
     // Therefore, plugins etc _should_ get first grab at the
@@ -6001,48 +6005,48 @@ PRBool nsWindow::HandleScrollingPlugins(
           // it will wind it's way back to us,triggering the destWnd case above
           // either way,when the call returns,we are all done with the message,
           mInScrollProcessing = PR_TRUE;
           if (0 == ::SendMessageW(destWnd, aMsg, aWParam, aLParam))
             aHandled = PR_TRUE;
           destWnd = nsnull;
           mInScrollProcessing = PR_FALSE;
         }
-        return PR_FALSE; // break; // stop parent search
+        return PR_FALSE; // break, but continue processing
       }
       parentWnd = ::GetParent(parentWnd);
     } // while parentWnd
   }
   if (destWnd == nsnull)
     return PR_FALSE;
   if (destWnd != mWnd) {
     if (destWindow) {
-      LRESULT aRetValue;
-      destWindow->ProcessMessage(aMsg, aWParam, aLParam, &aRetValue);
-      aHandled = PR_TRUE;
-      return PR_FALSE; // return result immediately
+      aHandled = destWindow->ProcessMessage(aMsg, aWParam, aLParam, aRetValue);
+      aQuitProcessing = PR_TRUE;
+      return PR_FALSE; // break, and stop processing
     }
   #ifdef DEBUG
     else
       printf("WARNING: couldn't get child window for SCROLL event\n");
   #endif
   }
   return PR_TRUE;  // caller should handle this
 }
 
 PRBool nsWindow::OnScroll(UINT aMsg, WPARAM aWParam, LPARAM aLParam)
 {
   if (aLParam)
   {
     // Scroll message generated by Thinkpad Trackpoint Driver or similar
     // Treat as a mousewheel message and scroll appropriately
-
-    PRBool result;
-    if (!HandleScrollingPlugins(aMsg, aWParam, aLParam, result))
-      return result;  // Return if it's not our message or has been dispatched
+    PRBool quit, result;
+    LRESULT retVal;
+
+    if (!HandleScrollingPlugins(aMsg, aWParam, aLParam, result, &retVal, quit))
+      return quit;  // Return if it's not our message or has been dispatched
 
     nsMouseScrollEvent scrollevent(PR_TRUE, NS_MOUSE_SCROLL, this);
     scrollevent.scrollFlags = (aMsg == WM_VSCROLL) 
                               ? nsMouseScrollEvent::kIsVertical
                               : nsMouseScrollEvent::kIsHorizontal;
     switch (LOWORD(aWParam))
     {
       case SB_PAGEDOWN:
--- a/widget/src/windows/nsWindow.h
+++ b/widget/src/windows/nsWindow.h
@@ -299,17 +299,19 @@ protected:
   LRESULT                 ProcessKeyDownMessage(const MSG &aMsg,
                                                 PRBool *aEventDispatched);
   static PRBool           EventIsInsideWindow(UINT Msg, nsWindow* aWindow);
   // Convert nsEventStatus value to a windows boolean
   static PRBool           ConvertStatus(nsEventStatus aStatus);
   static void             PostSleepWakeNotification(const char* aNotification);
   PRBool                  HandleScrollingPlugins(UINT aMsg, WPARAM aWParam, 
                                                  LPARAM aLParam,
-                                                 PRBool& aResult);
+                                                 PRBool& aResult,
+                                                 LRESULT* aRetValue,
+                                                 PRBool& aQuitProcessing);
 
   /**
    * Event handlers
    */
   virtual void            OnDestroy();
   virtual PRBool          OnMove(PRInt32 aX, PRInt32 aY);
   virtual PRBool          OnResize(nsIntRect &aWindowRect);
   LRESULT                 OnChar(const MSG &aMsg,
--- a/xpcom/build/nsXPCOM.h
+++ b/xpcom/build/nsXPCOM.h
@@ -516,16 +516,23 @@ NS_CycleCollectorForget2(nsPurpleBufferE
  * component must register their contract ID in the category manager,
  *
  * @see NS_XPCOM_STARTUP_CATEGORY
  * @status FROZEN
  */
 #define NS_XPCOM_STARTUP_OBSERVER_ID "xpcom-startup"
 
 /**
+ * At XPCOM shutdown, this topic is notified just before "xpcom-shutdown".
+ * Components should only use this to mark themselves as 'being destroyed'.
+ * Nothing should be dispatched to any event loop.
+ */
+#define NS_XPCOM_WILL_SHUTDOWN_OBSERVER_ID "xpcom-will-shutdown"
+
+/**
  * At XPCOM shutdown, this topic is notified. All components must
  * release any interface references to objects in other modules when
  * this topic is notified.
  *
  * @status FROZEN
  */
 #define NS_XPCOM_SHUTDOWN_OBSERVER_ID "xpcom-shutdown"
 
--- a/xpcom/build/nsXPComInit.cpp
+++ b/xpcom/build/nsXPComInit.cpp
@@ -751,16 +751,20 @@ ShutdownXPCOM(nsIServiceManager* servMgr
         NS_ENSURE_STATE(thread);
 
         nsRefPtr<nsObserverService> observerService;
         CallGetService("@mozilla.org/observer-service;1",
                        (nsObserverService**) getter_AddRefs(observerService));
 
         if (observerService)
         {
+            (void) observerService->
+                NotifyObservers(nsnull, NS_XPCOM_WILL_SHUTDOWN_OBSERVER_ID,
+                                nsnull);
+
             nsCOMPtr<nsIServiceManager> mgr;
             rv = NS_GetServiceManager(getter_AddRefs(mgr));
             if (NS_SUCCEEDED(rv))
             {
                 (void) observerService->
                     NotifyObservers(mgr, NS_XPCOM_SHUTDOWN_OBSERVER_ID,
                                     nsnull);
             }
--- a/xpcom/reflect/xptcall/src/md/win32/Makefile.in
+++ b/xpcom/reflect/xptcall/src/md/win32/Makefile.in
@@ -88,17 +88,17 @@ else #!GNU_CXX
 CPPSRCS		:= xptcinvoke_x86_64.cpp  xptcstubs_x86_64_gnu.cpp
 ASFILES		:= xptcinvoke_asm_x86_64_gnu.s
 endif #!GNU_CXX
 endif
 
 ifeq ($(OS_ARCH),WINCE)
 ifeq ($(TARGET_CPU),arm)
 CPPSRCS 	= xptcinvokece.cpp xptcstubsce.cpp 
-ASFILES		= xptc_arm_ceppc.asm
+ASFILES		= xptcstubs_asm_ce.asm xptcinvoke_asm_ce.asm
 ASFLAGS		+= -I ../../../public
 AS_DASH_C_FLAG = 
 endif
 endif
 
 # we don't want the shared lib, but we want to force the creation of a static lib.
 FORCE_STATIC_LIB = 1
 
new file mode 100644
--- /dev/null
+++ b/xpcom/reflect/xptcall/src/md/win32/xptcinvoke_asm_ce.asm
@@ -0,0 +1,62 @@
+
+    AREA    text,CODE,READONLY
+    ALIGN   4
+
+; ----
+
+; extern "C" nsresult
+; asmXPTC_InvokeByIndex( nsISupports* that,
+;                        PRUint32 methodIndex,
+;                        PRUint32 paramCount,
+;                        nsXPTCVariant* params,
+;                        PRUint32 pfn_CopyToStack,
+;                        PRUint32 pfn_CountWords);  
+
+    EXTERN writeArgs
+
+    GLOBAL asmXPTC_InvokeByIndex
+asmXPTC_InvokeByIndex
+    mov     r12, sp
+    stmdb   sp!, {r4 - r6, r12, lr} ; we're using registers 4, 5 and 6. Save them
+    sub     sp, sp, #16
+    mov     r6, r0          ; store 'that' (the target's this)
+    mov     r5, r1, lsl #2  ; a vtable index = methodIndex * 4
+    mov     r4, sp          ; Back up the initial stack pointer.
+    ; Move the stack pointer to allow for `paramCount` 64-bit values. We'll get
+    ; any unused space back as writeArgs tells us where the SP should end up.
+    sub     sp, sp, r2, lsl #3  ; worst case estimate for stack space
+
+    ; Put the arguments on the stack.
+    ldr     ip, =writeArgs
+    mov     r0, r4
+    mov     r1, r2
+    mov     r2, r3
+
+    blx     ip              ; call writeArgs 
+
+    ; Use the stack pointer returned by writeArgs, but skip the first three
+    ; words as these belong in registers (r1-r3).
+    add     sp, r0, #12
+    
+    
+    mov     r0, r6          ; Restore 'that'.
+    ldr     r1, [r0]        ; get that->vtable offset
+    ldr     ip, [r1, r5]    ; get method adress from vtable
+
+    ; The stack pointer now points to a stack which includes all arguments to
+    ; be passed to the target method. The first three words should be passed in
+    ; r1-r3 (with 'this' in r0). If we have fewer than three argument words, we
+    ; will waste some cycles (and a couple of memory words) by loading them,
+    ; but I suspect that we'll achieve a net gain by avoiding a conditional
+    ; load here.
+    ldr     r1, [sp, #-12]
+    ldr     r2, [sp, #-8]
+    ldr     r3, [sp, #-4]
+    blx     ip              ; call function
+
+    mov     sp, r4          ; Restore the original stack pointer.
+
+    add     sp, sp, #16
+    ldmia   sp!, {r4 - r6, sp, pc} ; Restore registers and return.
+
+    END
--- a/xpcom/reflect/xptcall/src/md/win32/xptcinvokece.cpp
+++ b/xpcom/reflect/xptcall/src/md/win32/xptcinvokece.cpp
@@ -34,114 +34,75 @@
  * ***** END LICENSE BLOCK ***** */
 
 /* Platform specific code to invoke XPCOM methods on native objects */
 
 #include "prlog.h"
 
 #include "xptcprivate.h"
 
-extern "C" nsresult
-asmXPTC_InvokeByIndex( nsISupports* that,
-                       PRUint32 methodIndex,
-  					   PRUint32 paramCount,
-					   nsXPTCVariant* params,
-					   PRUint32 pfn_CopyToStack,
-					   PRUint32 pfn_CountWords);  
-
-// NOTE: This does the actual copying into the stack - based upon the
-// pointer "d" -- which is placed at the lowest location on the block
-// of memory that has been allocated on the stack
-
-extern "C" static void
-invoke_copy_to_stack(PRUint32* d, PRUint32 paramCount, nsXPTCVariant* s)
+extern "C" PRUint32 *
+writeArgs(PRUint32 *d,
+          PRUint32  paramCount,
+          nsXPTCVariant *params)
 {
-  for(; paramCount > 0; paramCount--, d++, s++)
-  {
+  // For each parameter in params, either push it to the stack. The first
+  // three registers want to be in registers, but for the sake of simplicity
+  // we push them onto the stack here and pull them off in assembly before
+  // actually calling the target method.
+  
+  // NOTE: The arguments in 'params' are in reverse order!
+  
+  // NOTE: This only implements the legacy ABI as WinCE does not support
+  // the (more efficient) EABI.
+  
+  // NOTE: We assume that we can extend the stack as far as we like. C(++)
+  // makes the same assumption anyway, so this should be safe.
+  d--;
+  for (nsXPTCVariant * s = &params[paramCount-1]; paramCount != 0; paramCount--, s--, d--) {
+    // IsPtrData is (for some reason) a special case, and doesn't use the
+    // 'type' field.
     if(s->IsPtrData())
-    {
-      *((void**)d) = s->ptr;
-      continue;
-    }
-    // According to the ARM EABI, integral types that are smaller than a word
-    // are to be sign/zero-extended to a full word and treated as 4-byte values.
+        {
+            *((void**)d) = s->ptr;
+            continue;
+        }
+        switch(s->type)
+        {
+        case nsXPTType::T_I8     :  *((PRInt32*)   d) = s->val.i8;     break;
+        case nsXPTType::T_I16    :  *((PRInt32*)   d) = s->val.i16;    break;
+        case nsXPTType::T_I32    :  *((PRInt32*)   d) = s->val.i32;    break;
+        case nsXPTType::T_I64    :  *((PRInt64*) --d) = s->val.i64;    break;
+        case nsXPTType::T_U8     :  *((PRUint32*)  d) = s->val.u8;     break;
+        case nsXPTType::T_U16    :  *((PRUint32*)  d) = s->val.u16;    break;
+        case nsXPTType::T_U32    :  *((PRUint32*)  d) = s->val.u32;    break;
+        case nsXPTType::T_U64    :  *((PRUint64*)--d) = s->val.u64;    break;
+        case nsXPTType::T_FLOAT  :  *((float*)     d) = s->val.f;      break;
+        case nsXPTType::T_DOUBLE :  *((double*)  --d) = s->val.d;      break;
+        case nsXPTType::T_BOOL   :  *((PRInt32*)   d) = s->val.b;      break;
+        case nsXPTType::T_CHAR   :  *((PRInt32*)   d) = s->val.c;      break;
+        case nsXPTType::T_WCHAR  :  *((PRInt32*)   d) = s->val.wc;     break;
+        default:
+            // all the others are plain pointer types
+            *((void**)d) = s->val.p;
+            break;
+        }
 
-    switch(s->type)
-    {
-      case nsXPTType::T_I8     : *((PRInt32*) d) = s->val.i8;          break;
-      case nsXPTType::T_I16    : *((PRInt32*) d) = s->val.i16;         break;
-      case nsXPTType::T_I32    : *((PRInt32*) d) = s->val.i32;         break;
-      case nsXPTType::T_I64    : *((PRInt64*) d) = s->val.i64; d++;    break;
-      case nsXPTType::T_U8     : *((PRUint32*)d) = s->val.u8;          break;
-      case nsXPTType::T_U16    : *((PRUint32*)d) = s->val.u16;         break;
-      case nsXPTType::T_U32    : *((PRUint32*)d) = s->val.u32;         break;
-      case nsXPTType::T_U64    : *((PRUint64*)d) = s->val.u64; d++;    break;
-      case nsXPTType::T_FLOAT  : *((float*)   d) = s->val.f;           break;
-      case nsXPTType::T_DOUBLE : *((double*)  d) = s->val.d;   d++;    break;
-      case nsXPTType::T_BOOL   : *((PRInt32*) d) = s->val.b;           break;
-      case nsXPTType::T_CHAR   : *((PRInt32*) d) = s->val.c;           break;
-      case nsXPTType::T_WCHAR  : *((PRInt32*) d) = s->val.wc;          break;
-      default:
-        // all the others are plain pointer types
-        *((void**)d) = s->val.p;
-        break;
-    }
   }
+  return ++d;
 }
 
-
-extern "C" static uint32
-invoke_count_words(PRUint32 paramCount, nsXPTCVariant* s)
-{
-  uint32 nCnt = 0;
-  
-  for(; paramCount > 0; paramCount--, s++)
-  {
-    if(s->IsPtrData())
-    {
-      nCnt++;
-      continue;
-    }
-    switch(s->type)
-    {
-      case nsXPTType::T_I64    : 
-      case nsXPTType::T_U64    : 
-      case nsXPTType::T_DOUBLE : 
-        nCnt += 2;
-        break;
-        
-      case nsXPTType::T_I8     : 
-      case nsXPTType::T_I16    : 
-      case nsXPTType::T_I32    : 
-      case nsXPTType::T_U8     : 
-      case nsXPTType::T_U16    : 
-      case nsXPTType::T_U32    : 
-      case nsXPTType::T_FLOAT  : 
-      case nsXPTType::T_BOOL   : 
-      case nsXPTType::T_CHAR   : 
-      case nsXPTType::T_WCHAR  : 
-      default:
-        nCnt++;
-        break;
-    }
-  }
-  
-  // 4 Bytes for everything that uses 4 bytes or less, 8 bytes for
-  // everything else.
-  return nCnt;
-}
-
+extern "C" nsresult
+asmXPTC_InvokeByIndex(nsISupports* that,
+		      PRUint32 methodIndex,
+		      PRUint32 paramCount,
+		      nsXPTCVariant* params);  
 
 extern "C" NS_EXPORT  nsresult NS_FROZENCALL
 NS_InvokeByIndex_P(nsISupports* that, PRUint32 methodIndex,
-                 PRUint32 paramCount, nsXPTCVariant* params)
+		   PRUint32 paramCount, nsXPTCVariant* params)
 {
-  return asmXPTC_InvokeByIndex(that,
-                               methodIndex,
-                               paramCount,
-                               params,
-                               (PRUint32) &invoke_copy_to_stack,
-                               (PRUint32) &invoke_count_words);
+  return asmXPTC_InvokeByIndex(that, methodIndex, paramCount, params);
 }
 
 
 int g_xptcinvokece_marker;
 
rename from xpcom/reflect/xptcall/src/md/win32/xptc_arm_ceppc.asm
rename to xpcom/reflect/xptcall/src/md/win32/xptcstubs_asm_ce.asm
--- a/xpcom/reflect/xptcall/src/md/win32/xptc_arm_ceppc.asm
+++ b/xpcom/reflect/xptcall/src/md/win32/xptcstubs_asm_ce.asm
@@ -140,181 +140,16 @@ FuncName    SETS    VBar:CC:"?Stub$Numbe
 	GLOBAL  $FuncName
 	EXPORT  $FuncName
 $FuncName PROC
 	mov	ip, #$Number
 	b	SharedStub
 	MEND
 
 
-; USE THIS FUNCTION POINTER INSIDE THE ROUTING XPTC_InvokeByIndex
-	IMPORT PrepareAndDispatch
-
-
-	MY_NESTED_ARMENTRY asmXPTC_InvokeByIndex
-
-; Function compile flags: /Ods
-; Was In File c:\builds\wince\mozilla\xpcom\reflect\xptcall\src\md\win32\xptcinvokece.cpp
-
-;|asmXPTC_InvokeByIndex| PROC
-;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;	mov       r12, sp
-;;	stmdb     sp!, {r0 - r3}
-;;	stmdb     sp!, {r12, lr}
-;;	sub       sp, sp, #4
-;;
-;;	mov       r0, #0	; return NS_OK;
-;;	str       r0, [sp]
-;;	ldr       r0, [sp]
-;;
-;;	add       sp, sp, #4
-;;	ldmia     sp, {sp, pc}
-;;
-;;	ENTRY_END
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-; 144  : {
-
-	; BKPT
-
-	mov       r12, sp
-	stmdb     sp!, {r0 - r3}
-	stmdb     sp!, {r4, r5, r12, lr}
-	sub       sp, sp, #0x2C
-
-; 145  : 	PRUint32 result;
-; 146  : 	struct my_params_struct my_params;
-; 147  : 	my_params.that = that;
-
-	add       r5, sp, #8    ; r5 = pointer to my_params (also THIS)
-
-	;;ldr       r0, [sp, #0x34]
-	;;str       r0, [sp, #8]
-	;str       r0, [sp, #8]
-	str       r0, [r5, #0x00]
-
-; 148  : 	my_params.Index = methodIndex;   // R5 + 0x4
-
-	;;ldr       r1, [sp, #0x38]
-	;;str       r1, [sp, #0xC]
-	;str       r1, [sp, #0x0C]
-	str       r1, [r5, #0x04]
-
-; 149  : 	my_params.Count = paramCount;	// R5 + 0x8
-
-	;ldr       r0, [sp, #0x3C]
-	;str       r0, [sp, #0x10]
-	;str       r2, [sp, #0x10]
-	str       r2, [r5, #0x08]
-
-; 150  : 	my_params.params = params;	// R5 + 0xC
-
-	;;ldr       r1, [sp, #0x40]
-	;;str       r1, [sp, #0x14]
-	;str       r3, [sp, #0x14]
-	str       r3, [r5, #0x0C]
-
-; 152  : 	my_params.fn_count = (PRUint32) &invoke_count_words;
-;						// R5 + 0x10
-
-	;;ldr       r1, [pc, #0x4C]
-	;;str       r1, [sp, #0x18]
-	ldr       r4, [r12, #0x4]
-	;str       r4, [sp, #0x18]
-	str       r4, [r5, #0x10]
-
-; 151  : 	my_params.fn_copy = (PRUint32) &invoke_copy_to_stack;
-;						// R5 + 0x14
-
-	;;ldr       r0, [pc, #0x58]
-	;;str       r0, [sp, #0x1C]
-	ldr       r4, [r12]
-	;str       r4, [sp, #0x1C]
-	str       r4, [r5, #0x14]
-
-                          ; Prepare to call invoke_count_words
-	;ldr     r0, [