[seamonkey/el6] update to Mozilla ESR 24.2.0 (patches derived from thunderbird-24.x sources)

Dmitry Butskoy buc at fedoraproject.org
Wed Dec 18 22:33:33 UTC 2013


commit bde197aa9a8821d9a2d562e9b986ef9b18b21845
Author: Dmitry Butskoy <Dmitry at Butskoy.name>
Date:   Thu Dec 19 02:32:53 2013 +0400

    update to Mozilla ESR 24.2.0 (patches derived from thunderbird-24.x sources)

 seamonkey-2.21-esr1.0-1.1.patch |   32 +-
 seamonkey-2.21-esr1.1-2.0.patch | 3495 +++++++++++++++++++++++++++++++++++++++
 seamonkey.spec                  |   23 +-
 3 files changed, 3528 insertions(+), 22 deletions(-)
---
diff --git a/seamonkey-2.21-esr1.0-1.1.patch b/seamonkey-2.21-esr1.0-1.1.patch
index 79edf5d..68dafc5 100644
--- a/seamonkey-2.21-esr1.0-1.1.patch
+++ b/seamonkey-2.21-esr1.0-1.1.patch
@@ -5704,6 +5704,22 @@ diff -Nrbu seamonkey-2.21-esr1.0/comm-release/mozilla/js/src/config/milestone.tx
  
 -24.1.0
 +24.1.1
+diff -Nrbu seamonkey-2.21-esr1.0/comm-release/mozilla/js/src/configure.in seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/configure.in
+--- seamonkey-2.21-esr1.0/comm-release/mozilla/js/src/configure.in	2013-09-16 22:26:39.000000000 +0400
++++ seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/configure.in	2013-11-29 03:13:30.465604069 +0400
+@@ -222,10 +222,12 @@
+ dnl ==============================================================
+ MOZILLA_VERSION=`$PERL $srcdir/config/milestone.pl -topsrcdir $srcdir`
+ MOZILLA_UAVERSION=`$PERL $srcdir/config/milestone.pl -topsrcdir $srcdir -uaversion`
++MOZILLA_SYMBOLVERSION=`$PERL $srcdir/config/milestone.pl -topsrcdir $srcdir -symbolversion`
+ 
+ AC_DEFINE_UNQUOTED(MOZILLA_VERSION,"$MOZILLA_VERSION")
+ AC_DEFINE_UNQUOTED(MOZILLA_VERSION_U,$MOZILLA_VERSION)
+ AC_DEFINE_UNQUOTED(MOZILLA_UAVERSION,"$MOZILLA_UAVERSION")
++AC_SUBST(MOZILLA_SYMBOLVERSION)
+ 
+ # Separate version into components for use in shared object naming etc
+ changequote(,)
 diff -Nrbu seamonkey-2.21-esr1.0/comm-release/mozilla/js/src/configure seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/configure
 --- seamonkey-2.21-esr1.0/comm-release/mozilla/js/src/configure	2013-09-16 22:27:16.000000000 +0400
 +++ seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/configure	2013-11-29 03:13:30.467604076 +0400
@@ -10063,22 +10079,6 @@ diff -Nrbu seamonkey-2.21-esr1.0/comm-release/mozilla/js/src/configure seamonkey
      (''' JS_SHELL_NAME ''', r''' $JS_SHELL_NAME ''')
      (''' JS_CONFIG_NAME ''', r''' $JS_CONFIG_NAME ''')
      (''' MOZJS_MAJOR_VERSION ''', r''' $MOZJS_MAJOR_VERSION ''')
-diff -Nrbu seamonkey-2.21-esr1.0/comm-release/mozilla/js/src/configure.in seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/configure.in
---- seamonkey-2.21-esr1.0/comm-release/mozilla/js/src/configure.in	2013-09-16 22:26:39.000000000 +0400
-+++ seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/configure.in	2013-11-29 03:13:30.468604069 +0400
-@@ -222,10 +222,12 @@
- dnl ==============================================================
- MOZILLA_VERSION=`$PERL $srcdir/config/milestone.pl -topsrcdir $srcdir`
- MOZILLA_UAVERSION=`$PERL $srcdir/config/milestone.pl -topsrcdir $srcdir -uaversion`
-+MOZILLA_SYMBOLVERSION=`$PERL $srcdir/config/milestone.pl -topsrcdir $srcdir -symbolversion`
- 
- AC_DEFINE_UNQUOTED(MOZILLA_VERSION,"$MOZILLA_VERSION")
- AC_DEFINE_UNQUOTED(MOZILLA_VERSION_U,$MOZILLA_VERSION)
- AC_DEFINE_UNQUOTED(MOZILLA_UAVERSION,"$MOZILLA_UAVERSION")
-+AC_SUBST(MOZILLA_SYMBOLVERSION)
- 
- # Separate version into components for use in shared object naming etc
- changequote(,)
 diff -Nrbu seamonkey-2.21-esr1.0/comm-release/mozilla/nsprpub/TAG-INFO seamonkey-2.21-esr1.1/comm-release/mozilla/nsprpub/TAG-INFO
 --- seamonkey-2.21-esr1.0/comm-release/mozilla/nsprpub/TAG-INFO	2013-09-16 22:26:54.000000000 +0400
 +++ seamonkey-2.21-esr1.1/comm-release/mozilla/nsprpub/TAG-INFO	2013-11-29 03:13:30.468604069 +0400
diff --git a/seamonkey-2.21-esr1.1-2.0.patch b/seamonkey-2.21-esr1.1-2.0.patch
new file mode 100644
index 0000000..d1211e6
--- /dev/null
+++ b/seamonkey-2.21-esr1.1-2.0.patch
@@ -0,0 +1,3495 @@
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/build/win32/mozconfig.vs2010-win64 seamonkey-2.21-esr2.0/comm-release/build/win32/mozconfig.vs2010-win64
+--- seamonkey-2.21-esr1.1/comm-release/build/win32/mozconfig.vs2010-win64	2013-09-16 22:20:08.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/build/win32/mozconfig.vs2010-win64	2013-12-18 21:15:57.755207895 +0400
+@@ -1,18 +1,26 @@
++
++if [ -d "/c/PROGRA~2/MICROS~2.0" ]; then
++  # /c/Program Files (x86)/Microsoft Visual Studio 10.0
++  _VSPATH="/c/PROGRA~2/MICROS~2.0"
++else
++  _VSPATH="/c/tools/msvs10"
++fi
++
+ ## SDK redist ##
+-export WIN32_REDIST_DIR=/c/tools/msvs10/VC/redist/x86/Microsoft.VC100.CRT
++export WIN32_REDIST_DIR=${_VSPATH}/VC/redist/x86/Microsoft.VC100.CRT
+ 
+ ## moz tools location for 64-bit builders ##
+ export MOZ_TOOLS=C:/mozilla-build/moztools
+ 
+ ## includes: win8 sdk includes, winrt headers for metro, msvc 10 std library, directx sdk for d3d9 ##
+-export INCLUDE=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/shared:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/um:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt/wrl:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt/wrl/wrappers:/c/tools/msvs10/vc/include:/c/tools/msvs10/vc/atlmfc/include:/c/tools/sdks/dx10/include
++export INCLUDE=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/shared:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/um:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt/wrl:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt/wrl/wrappers:${_VSPATH}/vc/include:${_VSPATH}/vc/atlmfc/include:/c/tools/sdks/dx10/include
+ 
+ ## libs: win8 sdk x86 (32-bit) libs, msvc 10 (32-bit) std library, msvc 10 atl libs, directx sdk (32-bit) for d3d9  ##
+-export LIBPATH=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/Lib/win8/um/x86:/c/tools/msvs10/vc/lib:/c/tools/msvs10/vc/atlmfc/lib:/c/tools/sdks/dx10/lib
+-export LIB=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/Lib/win8/um/x86:/c/tools/msvs10/vc/lib:/c/tools/msvs10/vc/atlmfc/lib:/c/tools/sdks/dx10/lib
++export LIBPATH=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/Lib/win8/um/x86:${_VSPATH}/vc/lib:${_VSPATH}/vc/atlmfc/lib:/c/tools/sdks/dx10/lib
++export LIB=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/Lib/win8/um/x86:${_VSPATH}/vc/lib:${_VSPATH}/vc/atlmfc/lib:/c/tools/sdks/dx10/lib
+ 
+ ## paths: win8 sdk x86 (32-bit) tools, msvc 10 (32-bit) build toolchain, moz tools  ##
+-export PATH="/c/Program Files (x86)/Windows Kits/8.0/bin/x86:/c/tools/msvs10/Common7/IDE:/c/tools/msvs10/VC/BIN:/c/tools/msvs10/Common7/Tools:/c/tools/msvs10/VC/VCPackages:/c/mozilla-build/moztools:${PATH}"
++export PATH="/c/Program Files (x86)/Windows Kits/8.0/bin/x86:${_VSPATH}/Common7/IDE:${_VSPATH}/VC/BIN:${_VSPATH}/Common7/Tools:${_VSPATH}/VC/VCPackages:/c/mozilla-build/moztools:${PATH}"
+ 
+ . $topsrcdir/build/mozconfig.vs2010-common
+ 
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/build/win64/mozconfig.vs2010 seamonkey-2.21-esr2.0/comm-release/build/win64/mozconfig.vs2010
+--- seamonkey-2.21-esr1.1/comm-release/build/win64/mozconfig.vs2010	2013-09-16 22:20:08.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/build/win64/mozconfig.vs2010	2013-12-18 21:15:57.797206849 +0400
+@@ -1,19 +1,32 @@
++
++if [ -d "/c/PROGRA~2/MICROS~2.0" ]; then
++  # /c/Program Files (x86)/Microsoft Visual Studio 10.0
++  _VSPATH="/c/PROGRA~2/MICROS~2.0"
++else
++  _VSPATH="/c/tools/msvs10"
++fi
++
+ ## SDK redist ##
+-export WIN32_REDIST_DIR=/c/tools/msvs10/VC/redist/x64/Microsoft.VC100.CRT
++export WIN32_REDIST_DIR=${_VSPATH}/VC/redist/x64/Microsoft.VC100.CRT
+ 
+ ## includes: win8 sdk includes, winrt headers for metro, msvc 10 std library, directx sdk for d3d9 ##
+-export INCLUDE=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/shared:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/um:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt/wrl:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt/wrl/wrappers:/c/tools/msvs10/vc/include:/c/tools/msvs10/vc/atlmfc/include:/c/tools/sdks/dx10/include
++export INCLUDE=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/shared:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/um:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt/wrl:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt/wrl/wrappers:${_VSPATH}/vc/include:${_VSPATH}/vc/atlmfc/include:/c/tools/sdks/dx10/include
+ 
+ ## libs: win8 sdk x64 (64-bit) libs, msvc 10 (64-bit) std library, msvc 10 atl libs, directx sdk (64-bit) for d3d9  ##
+-export LIBPATH=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/Lib/win8/um/x64:/c/tools/msvs10/vc/lib/amd64:/c/tools/msvs10/vc/atlmfc/lib/amd64:/c/tools/sdks/dx10/lib/x64
+-export LIB=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/Lib/win8/um/x64:/c/tools/msvs10/vc/lib/amd64:/c/tools/msvs10/vc/atlmfc/lib/amd64:/c/tools/sdks/dx10/lib/x64
++export LIBPATH=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/Lib/win8/um/x64:${_VSPATH}/vc/lib/amd64:${_VSPATH}/vc/atlmfc/lib/amd64:/c/tools/sdks/dx10/lib/x64
++export LIB=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/Lib/win8/um/x64:${_VSPATH}/vc/lib/amd64:${_VSPATH}/vc/atlmfc/lib/amd64:/c/tools/sdks/dx10/lib/x64
+ 
+ ## paths: win8 sdk x64 (64-bit) tools, msvc 10 (64-bit) build toolchain, moz tools  ##
+-export PATH="/c/Program Files (x86)/Windows Kits/8.0/bin/x64:/c/tools/msvs10/Common7/IDE:/c/tools/msvs10/VC/BIN/amd64:/c/tools/msvs10/VC/BIN/x86_amd64:/c/tools/msvs10/VC/BIN:/c/tools/msvs10/Common7/Tools:/c/tools/msvs10/VC/VCPackages:${PATH}"
++export PATH="/c/Program Files (x86)/Windows Kits/8.0/bin/x64:${_VSPATH}/Common7/IDE:${_VSPATH}/VC/BIN/amd64:${_VSPATH}/VC/BIN/x86_amd64:${_VSPATH}/VC/BIN:${_VSPATH}/Common7/Tools:${_VSPATH}/VC/VCPackages:${PATH}"
+ 
+ # Use 32bit linker for PGO crash bug.
+ # https://connect.microsoft.com/VisualStudio/feedback/details/686117/
+-export LD=c:/tools/msvs10/VC/BIN/x86_amd64/link.exe
++if [ -f /c/PROGRA~2/MICROS~2.0/VC/BIN/x86_amd64/link.exe ]; then
++  # /c/Program Files (x86)/Microsoft Visual Studio 10.0
++  export LD=c:/PROGRA~2/MICROS~2.0/VC/BIN/x86_amd64/link.exe
++else
++  export LD=c:/tools/msvs10/VC/BIN/x86_amd64/link.exe
++fi
+ 
+ . $topsrcdir/build/mozconfig.vs2010-common
+ 
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/calendar/providers/caldav/calDavCalendar.js seamonkey-2.21-esr2.0/comm-release/calendar/providers/caldav/calDavCalendar.js
+--- seamonkey-2.21-esr1.1/comm-release/calendar/providers/caldav/calDavCalendar.js	2013-12-18 21:26:17.957879699 +0400
++++ seamonkey-2.21-esr2.0/comm-release/calendar/providers/caldav/calDavCalendar.js	2013-12-18 21:15:57.798206829 +0400
+@@ -1229,6 +1229,7 @@
+                                                this,
+                                                this.makeUri(),
+                                                null,
++                                               false,
+                                                aListener,
+                                                aChangeLogListener);
+         multiget.doMultiGet();
+@@ -2180,7 +2181,7 @@
+                 thisCalendar.completeCheckServerInfo(aChangeLogListener);
+             }
+         };
+-        this.sendHttpRequest(this.makeUri(), queryXml, MIME_TEXT_XML, null, (channel) => {
++        this.sendHttpRequest(requestUri, queryXml, MIME_TEXT_XML, null, (channel) => {
+             if (queryDepth == 0) {
+                 // Set header, doing this for Depth: 1 is not needed since thats the
+                 // default.
+@@ -2749,11 +2750,11 @@
+                 }
+             };
+ 
++            let uploadData = serializer.serializeToString();
++            let requestUri = this.makeUri(null, this.outboxUrl);
+             if (this.verboseLogging()) {
+                 cal.LOG("CalDAV: send(" + requestUri.spec + "): " + uploadData);
+             }
+-            let uploadData = serializer.serializeToString();
+-            let requestUri = this.makeUri(null, this.outboxUrl);
+             this.sendHttpRequest(requestUri, uploadData, MIME_TEXT_CALENDAR, null, (channel) => {
+                 channel.requestMethod = "POST";
+                 channel.setRequestHeader("Originator", this.calendarUserAddress, false);
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/calendar/providers/caldav/calDavRequestHandlers.js seamonkey-2.21-esr2.0/comm-release/calendar/providers/caldav/calDavRequestHandlers.js
+--- seamonkey-2.21-esr1.1/comm-release/calendar/providers/caldav/calDavRequestHandlers.js	2013-12-18 21:26:17.958879683 +0400
++++ seamonkey-2.21-esr2.0/comm-release/calendar/providers/caldav/calDavRequestHandlers.js	2013-12-18 21:15:57.798206833 +0400
+@@ -4,6 +4,7 @@
+ 
+ Components.utils.import("resource://calendar/modules/calUtils.jsm");
+ Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
++Components.utils.import("resource://gre/modules/Timer.jsm");
+ 
+ /**
+  * This is a handler for the etag request in calDavCalendar.js' getUpdatedItem.
+@@ -161,6 +162,7 @@
+                                        this.calendar,
+                                        this.baseUri,
+                                        null,
++                                       false,
+                                        null,
+                                        this.changeLogListener)
+             multiget.doMultiGet();
+@@ -313,6 +315,7 @@
+     unhandledErrors : 0,
+     itemsReported: null,
+     itemsNeedFetching: null,
++    additionalSyncNeeded: false,
+ 
+     QueryInterface: XPCOMUtils.generateQI([
+         Components.interfaces.nsISAXContentHandler,
+@@ -497,6 +500,7 @@
+                                                    this.calendar,
+                                                    this.baseUri,
+                                                    this.newSyncToken,
++                                                   this.additionalSyncNeeded,
+                                                    null,
+                                                    this.changeLogListener)
+             multiget.doMultiGet();
+@@ -587,16 +591,27 @@
+                         // Etag mismatch, getting new/updated item.
+                         this.itemsNeedFetching.push(r.href);
+                     }
+-                // If the response element is still not handled, log an error
+-                // only if the content-type is text/calendar or the
+-                // response status is different than 404 not found.
+-                // We don't care about response elements
+-                // on non-calendar resources or whose status is not indicating
+-                // a deleted resource.
++                } else if (r.status &&
++                            r.status.indexOf(" 507") > -1) {
++                    // webdav-sync says that if a 507 is encountered and the
++                    // url matches the request, the current token should be
++                    // saved and another request should be made. We don't
++                    // actually compare the URL, its too easy to get this
++                    // wrong.
++
++                    // The 507 doesn't mean the data received is invalid, so
++                    // continue processing.
++                    this.additionalSyncNeeded = true;
+                 } else if ((r.getcontenttype &&
+                             r.getcontenttype.substr(0,13) == "text/calendar") ||
+                            (r.status &&
+                             r.status.indexOf(" 404") == -1)) {
++                    // If the response element is still not handled, log an
++                    // error only if the content-type is text/calendar or the
++                    // response status is different than 404 not found.  We
++                    // don't care about response elements on non-calendar
++                    // resources or whose status is not indicating a deleted
++                    // resource.
+                     cal.WARN("CalDAV: Unexpected response, status: " + r.status + ", href: " + r.href);
+                     this.unhandledErrors++;
+                 } else {
+@@ -631,12 +646,15 @@
+  *                              array of un-encoded paths.
+  * @param aCalendar             The (unwrapped) calendar this request belongs to
+  * @param aBaseUri              The URI requested (i.e inbox or collection)
++ * @param aAdditionalSyncNeeded (optional) If true, the passed sync token is not the
++ *                                latest, another webdav sync run should be
++ *                                done after completion.
+  * @param aNewSyncToken         (optional) new Sync token to set if operation successful
+  * @param aListener             (optional) The listener to notify
+  * @param aChangeLogListener    (optional) for cached calendars, the listener to
+  *                                notify.
+  */
+-function multigetSyncHandler(aItemsNeedFetching, aCalendar, aBaseUri, aNewSyncToken, aListener, aChangeLogListener) {
++function multigetSyncHandler(aItemsNeedFetching, aCalendar, aBaseUri, aNewSyncToken, aAdditionalSyncNeeded, aListener, aChangeLogListener) {
+     this.calendar = aCalendar;
+     this.baseUri = aBaseUri;
+     this.listener = aListener;
+@@ -648,6 +666,7 @@
+     this._reader.errorHandler = this;
+     this._reader.parseAsync(null);
+     this.itemsNeedFetching = aItemsNeedFetching;
++    this.additionalSyncNeeded = aAdditionalSyncNeeded;
+ }
+ multigetSyncHandler.prototype = {
+     currentResponse: null,
+@@ -660,6 +679,7 @@
+     logXML: null,
+     unhandledErrors : 0,
+     itemsNeedFetching: null,
++    additionalSyncNeeded: false,
+ 
+     QueryInterface: XPCOMUtils.generateQI([
+         Components.interfaces.nsISAXContentHandler,
+@@ -754,9 +774,18 @@
+               cal.LOG("CalDAV: New webdav-sync Token: " + this.calendar.mWebdavSyncToken);
+             }
+ 
++            if (this.additionalSyncNeeded) {
++                setTimeout(() => {
++                    let wds = new webDavSyncHandler(this.calendar,
++                                                    this.baseUri,
++                                                    this.changeLogListener);
++                    wds.doWebDAVSync();
++                }, 0);
++            } else {
+             this.calendar.finalizeUpdatedItems(this.changeLogListener,
+                                                this.baseUri);
+         }
++        }
+         if (!this._reader) {
+             // No reader means there was a request error. The error is already
+             // notified in onStartRequest, so no need to do it here.
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/calendar/sunbird/config/version.txt seamonkey-2.21-esr2.0/comm-release/calendar/sunbird/config/version.txt
+--- seamonkey-2.21-esr1.1/comm-release/calendar/sunbird/config/version.txt	2013-12-18 21:26:17.958879683 +0400
++++ seamonkey-2.21-esr2.0/comm-release/calendar/sunbird/config/version.txt	2013-12-18 21:15:57.798206833 +0400
+@@ -1 +1 @@
+-2.6.2
++2.6.4
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mail/app/profile/all-thunderbird.js seamonkey-2.21-esr2.0/comm-release/mail/app/profile/all-thunderbird.js
+--- seamonkey-2.21-esr1.1/comm-release/mail/app/profile/all-thunderbird.js	2013-09-16 22:20:08.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mail/app/profile/all-thunderbird.js	2013-12-18 21:15:57.799206816 +0400
+@@ -77,10 +77,10 @@
+ // If these conditions aren't met it will be treated the same as when there is
+ // no update available. This validation will not be performed when using the
+ // |app.update.url.override| preference for update checking.
+-pref("app.update.certs.1.issuerName", "OU=Equifax Secure Certificate Authority,O=Equifax,C=US");
++pref("app.update.certs.1.issuerName", "CN=Thawte SSL CA,O=\"Thawte, Inc.\",C=US");
+ pref("app.update.certs.1.commonName", "aus3.mozilla.org");
+ 
+-pref("app.update.certs.2.issuerName", "CN=Thawte SSL CA,O=\"Thawte, Inc.\",C=US");
++pref("app.update.certs.2.issuerName", "CN=DigiCert Secure Server CA,O=DigiCert Inc,C=US");
+ pref("app.update.certs.2.commonName", "aus3.mozilla.org");
+ 
+ // Whether or not app updates are enabled
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mail/base/content/mailWindowOverlay.xul seamonkey-2.21-esr2.0/comm-release/mail/base/content/mailWindowOverlay.xul
+--- seamonkey-2.21-esr1.1/comm-release/mail/base/content/mailWindowOverlay.xul	2013-09-16 22:20:08.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mail/base/content/mailWindowOverlay.xul	2013-12-18 21:15:57.800206796 +0400
+@@ -1126,9 +1126,11 @@
+                         label="&printCmd.label;"
+                         key="key_print"
+                         command="cmd_print"/>
++#ifndef XP_MACOSX
+               <menuitem id="appmenu_printPreview"
+                         label="&printPreviewCmd.label;"
+                         command="cmd_printpreview"/>
++#endif
+               <menuitem id="appmenu_printSetup"
+                         label="&printSetupCmd.label;"
+                         command="cmd_printSetup"/>
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mail/base/content/nsContextMenu.js seamonkey-2.21-esr2.0/comm-release/mail/base/content/nsContextMenu.js
+--- seamonkey-2.21-esr1.1/comm-release/mail/base/content/nsContextMenu.js	2013-09-16 22:20:08.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mail/base/content/nsContextMenu.js	2013-12-18 21:15:57.800206796 +0400
+@@ -376,7 +376,8 @@
+       "mailContext-sep-reply", "paneContext-afterMove",
+       "mailContext-sep-afterTagAddNew", "mailContext-sep-afterTagRemoveAll",
+       "mailContext-sep-afterMarkAllRead", "mailContext-sep-afterMarkFlagged",
+-      "mailContext-sep-afterMarkMenu", "mailContext-sep-edit",
++      "mailContext-sep-afterMarkMenu", "mailContext-afterWatchThread",
++      "mailContext-sep-edit",
+       "mailContext-sep-copy", "mailContext-sep-reportPhishing",
+       "mailContext-sep-undo", "mailContext-sep-clipboard",
+       "mailContext-spell-suggestions-separator", "mailContext-spell-separator",
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mail/base/content/specialTabs.js seamonkey-2.21-esr2.0/comm-release/mail/base/content/specialTabs.js
+--- seamonkey-2.21-esr1.1/comm-release/mail/base/content/specialTabs.js	2013-09-16 22:20:08.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mail/base/content/specialTabs.js	2013-12-18 21:15:57.802206742 +0400
+@@ -502,7 +502,7 @@
+       // Only show what's new tab if this is actually an upgraded version,
+       // not just a new installation/profile (and don't show if the major version
+       // hasn't changed).
+-      if (fromVer && ((fromVer[0] != toVer[0]) || (fromVer[1] != toVer[1]))) {
++      if (fromVer && (fromVer[0] != toVer[0])) {
+           // showWhatsNewPage checks the details of the update manager before
+           // showing the page.
+           this.showWhatsNewPage();
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mail/components/compose/content/MsgComposeCommands.js seamonkey-2.21-esr2.0/comm-release/mail/components/compose/content/MsgComposeCommands.js
+--- seamonkey-2.21-esr1.1/comm-release/mail/components/compose/content/MsgComposeCommands.js	2013-12-18 21:26:17.961879632 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mail/components/compose/content/MsgComposeCommands.js	2013-12-18 21:15:57.802206742 +0400
+@@ -3197,10 +3197,19 @@
+   updateSendCommands(true);
+ }
+ 
+-function onRecipientsInput()
++/**
++ * Called if the list of recipients changed in any way.
++ *
++ * @param aAutomatic  Set to true if the change of recipients was invoked
++ *                    programatically and should not be considered a change
++ *                    of message content.
++ */
++function onRecipientsChanged(aAutomatic)
+ {
++  if (!aAutomatic) {
+   gContentChanged = true;
+   setupAutocomplete();
++  }
+   updateSendCommands(true);
+ }
+ 
+@@ -4698,7 +4707,6 @@
+ function AddRecipient(recipientType, address)
+ {
+   awAddRecipient(recipientType, address);
+-  onRecipientsInput();
+ }
+ 
+ function loadHTMLMsgPrefs()
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mail/components/compose/content/addressingWidgetOverlay.js seamonkey-2.21-esr2.0/comm-release/mail/components/compose/content/addressingWidgetOverlay.js
+--- seamonkey-2.21-esr1.1/comm-release/mail/components/compose/content/addressingWidgetOverlay.js	2013-09-16 22:20:08.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mail/components/compose/content/addressingWidgetOverlay.js	2013-12-18 21:15:57.803206714 +0400
+@@ -256,6 +256,8 @@
+     awSetInputAndPopupId(inputElem, popupElem, rowNumber);
+ 
+   _awSetAutoComplete(popupElem, inputElem);
++
++  onRecipientsChanged(true);
+ }
+ 
+ function _awSetInputAndPopup(inputValue, popupValue, parentNode, templateNode)
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mail/components/compose/content/messengercompose.xul seamonkey-2.21-esr2.0/comm-release/mail/components/compose/content/messengercompose.xul
+--- seamonkey-2.21-esr1.1/comm-release/mail/components/compose/content/messengercompose.xul	2013-09-16 22:20:08.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mail/components/compose/content/messengercompose.xul	2013-12-18 21:15:57.803206714 +0400
+@@ -844,8 +844,8 @@
+                          minresultsforpopup="3" ignoreblurwhilesearching="true"
+                          ontextentered="awRecipientTextCommand(eventParam, this)"
+                          onerrorcommand="awRecipientErrorCommand(eventParam, this)"
+-                         onchange="onRecipientsInput();"
+-                         oninput="onRecipientsInput();"
++                         onchange="onRecipientsChanged();"
++                         oninput="onRecipientsChanged();"
+                          onkeypress="awRecipientKeyPress(event, this)"
+                          onkeydown="awRecipientKeyDown(event, this)"
+                          disableonsend="true">
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mail/config/version.txt seamonkey-2.21-esr2.0/comm-release/mail/config/version.txt
+--- seamonkey-2.21-esr1.1/comm-release/mail/config/version.txt	2013-12-18 21:26:22.749799618 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mail/config/version.txt	2013-12-18 21:15:57.803206714 +0400
+@@ -1 +1 @@
+-24.1.1
++24.2.0
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mail/test/mozmill/composition/test-send-button.js seamonkey-2.21-esr2.0/comm-release/mail/test/mozmill/composition/test-send-button.js
+--- seamonkey-2.21-esr1.1/comm-release/mail/test/mozmill/composition/test-send-button.js	2013-12-18 21:26:17.962879615 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mail/test/mozmill/composition/test-send-button.js	2013-12-18 21:15:57.803206714 +0400
+@@ -86,22 +86,58 @@
+ function test_send_enabled_prefilled_address() {
+   // Set the prefs to prefill a default CC address when Compose is opened.
+   let identity = account.defaultIdentity;
+-  let identityBranch = Services.prefs.getBranch("mail.identity." + identity.key + ".");
+-  identityBranch.setBoolPref("doCc", true);
+-  identityBranch.setCharPref("doCcList", "Auto recipient");
++  identity.doCc = true;
++  identity.doCcList = "Auto at recipient.invalid";
++
+   // In that case the recipient is input, enabled Send.
+   let cwc = open_compose_new_mail(); // compose controller
+   check_send_commands_state(cwc, true);
+ 
+   // Press backspace to remove the recipient. No other valid one is there,
+-  // disable Send.
++  // Send should become disabled.
+   cwc.e("addressCol2#1").select();
+   cwc.keypress(null, "VK_BACK_SPACE", {});
+   check_send_commands_state(cwc, false);
+ 
+   close_compose_window(cwc);
+-  identityBranch.clearUserPref("doCc");
+-  identityBranch.clearUserPref("doCcList");
++  identity.doCcList = "";
++  identity.doCc = false;
++}
++
++/**
++ * Bug 933101
++ * Similar to test_send_enabled_prefilled_address but switched between an identity
++ * that has a CC list and one that doesn't directly in the compose window.
++ */
++function test_send_enabled_prefilled_address_from_identity() {
++  // The first identity will have an automatic CC enabled.
++  let identityWithCC = account.defaultIdentity;
++  identityWithCC.doCc = true;
++  identityWithCC.doCcList = "Auto at recipient.invalid";
++
++  // CC is prefilled, Send enabled.
++  let cwc = open_compose_new_mail();
++  check_send_commands_state(cwc, true);
++
++  let identityPicker = cwc.e("msgIdentity");
++  assert_equals(identityPicker.selectedIndex, 0);
++
++  // Switch to the second identity that has no CC. Send should be disabled.
++  assert_true(account.identities.length >= 2);
++  let identityWithoutCC = account.identities.queryElementAt(1, Ci.nsIMsgIdentity);
++  assert_false(identityWithoutCC.doCc);
++  cwc.click_menus_in_sequence(cwc.e("msgIdentityPopup"),
++                              [ { value: identityWithoutCC.key } ]);
++  check_send_commands_state(cwc, false);
++
++  // Check the first identity again.
++  cwc.click_menus_in_sequence(cwc.e("msgIdentityPopup"),
++                              [ { value: identityWithCC.key } ]);
++  check_send_commands_state(cwc, true);
++
++  close_compose_window(cwc);
++  identityWithCC.doCcList = "";
++  identityWithCC.doCc = false;
+ }
+ 
+ /**
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mail/themes/linux/mail/messageQuotes.css seamonkey-2.21-esr2.0/comm-release/mail/themes/linux/mail/messageQuotes.css
+--- seamonkey-2.21-esr1.1/comm-release/mail/themes/linux/mail/messageQuotes.css	2013-12-18 21:26:17.963879598 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mail/themes/linux/mail/messageQuotes.css	2013-12-18 21:24:29.460616236 +0400
+@@ -15,7 +15,8 @@
+ /* ::::: signature ::::: */
+ 
+ @media not print {
+-  .moz-txt-sig,
++  div.moz-text-flowed > div.moz-txt-sig,
++  div.moz-text-plain > pre > div.moz-txt-sig,
+   pre.moz-signature {
+   opacity: 0.6;
+   }
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mail/themes/osx/mail/messageBody.css seamonkey-2.21-esr2.0/comm-release/mail/themes/osx/mail/messageBody.css
+--- seamonkey-2.21-esr1.1/comm-release/mail/themes/osx/mail/messageBody.css	2013-12-18 21:26:17.963879598 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mail/themes/osx/mail/messageBody.css	2013-12-18 21:23:26.963541029 +0400
+@@ -77,7 +77,8 @@
+ /* ::::: signature ::::: */
+ 
+ @media not print {
+-  .moz-txt-sig,
++  div.moz-text-flowed > div.moz-txt-sig,
++  div.moz-text-plain > pre > div.moz-txt-sig,
+   pre.moz-signature {
+   opacity: 0.6;
+   }
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mail/themes/windows/mail/mailWindow1-aero.css seamonkey-2.21-esr2.0/comm-release/mail/themes/windows/mail/mailWindow1-aero.css
+--- seamonkey-2.21-esr1.1/comm-release/mail/themes/windows/mail/mailWindow1-aero.css	2013-09-16 22:20:09.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mail/themes/windows/mail/mailWindow1-aero.css	2013-12-18 21:15:58.834180034 +0400
+@@ -194,11 +194,6 @@
+   -moz-padding-end: 5px;
+ }
+ 
+-#editContactPanel:-moz-system-metric(windows-default-theme) {
+-  -moz-appearance: tooltip;
+-  color: InfoText;
+-}
+-
+ .treecol-image image {
+   -moz-padding-start: 1px;
+   -moz-padding-end: 2px;
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mail/themes/windows/mail/messageQuotes.css seamonkey-2.21-esr2.0/comm-release/mail/themes/windows/mail/messageQuotes.css
+--- seamonkey-2.21-esr1.1/comm-release/mail/themes/windows/mail/messageQuotes.css	2013-12-18 21:26:17.963879598 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mail/themes/windows/mail/messageQuotes.css	2013-12-18 21:23:45.601271842 +0400
+@@ -15,7 +15,8 @@
+ /* ::::: signature ::::: */
+ 
+ @media not print {
+-  .moz-txt-sig,
++  div.moz-text-flowed > div.moz-txt-sig,
++  div.moz-text-plain > pre > div.moz-txt-sig,
+   pre.moz-signature {
+   opacity: 0.6;
+   }
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mailnews/base/prefs/content/AccountManager.js seamonkey-2.21-esr2.0/comm-release/mailnews/base/prefs/content/AccountManager.js
+--- seamonkey-2.21-esr1.1/comm-release/mailnews/base/prefs/content/AccountManager.js	2013-09-16 22:20:09.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mailnews/base/prefs/content/AccountManager.js	2013-12-18 21:15:58.835180008 +0400
+@@ -585,8 +585,12 @@
+   for (let i = 0; i < pageElements.length; i++) {
+     if (pageElements[i].id) {
+       if (pageElements[i].id == "server.localPath") {
+-        if (!checkDirectoryIsUsable(getFormElementValue(pageElements[i])))
+-          return false;
++        if (!checkDirectoryIsUsable(getFormElementValue(pageElements[i]))) {
++//          return false; // Temporarily disable this. Just show warning but do not block. See bug 921371.
++          Components.utils.reportError("Local directory '" +
++            getFormElementValue(pageElements[i]).path + "' of account " +
++            currentAccount.key + " is not safe to use. Consider changing it.");
++        }
+         break;
+       }
+     }
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mailnews/compose/public/nsIMsgSend.idl seamonkey-2.21-esr2.0/comm-release/mailnews/compose/public/nsIMsgSend.idl
+--- seamonkey-2.21-esr1.1/comm-release/mailnews/compose/public/nsIMsgSend.idl	2013-09-16 22:20:09.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mailnews/compose/public/nsIMsgSend.idl	2013-12-18 21:15:58.836179983 +0400
+@@ -150,7 +150,7 @@
+ %}
+ 
+ [ptr] native nsMsgAttachedFile(nsMsgAttachedFile);
+-[ptr] native nsMsgAttachmentHandlerArray(nsTArray<nsRefPtr<nsMsgAttachmentHandler>>);
++[ptr] native nsMsgAttachmentHandlerArray(nsTArray<nsRefPtr<nsMsgAttachmentHandler> >);
+ 
+ [scriptable, uuid(648f8e40-3977-4dd8-88f1-b932bc654aef)]
+ interface nsIMsgSend : nsISupports
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mailnews/compose/src/nsMsgAttachmentHandler.cpp seamonkey-2.21-esr2.0/comm-release/mailnews/compose/src/nsMsgAttachmentHandler.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mailnews/compose/src/nsMsgAttachmentHandler.cpp	2013-09-16 22:20:09.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mailnews/compose/src/nsMsgAttachmentHandler.cpp	2013-12-18 21:15:58.836179983 +0400
+@@ -1153,7 +1153,7 @@
+      */
+     uint32_t i;
+     nsMsgAttachmentHandler *next = 0;
+-    nsTArray<nsRefPtr<nsMsgAttachmentHandler>> *attachments;
++    nsTArray<nsRefPtr<nsMsgAttachmentHandler> > *attachments;
+ 
+     m_mime_delivery_state->GetAttachmentHandlers(&attachments);
+ 
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mailnews/compose/src/nsMsgSend.cpp seamonkey-2.21-esr2.0/comm-release/mailnews/compose/src/nsMsgSend.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mailnews/compose/src/nsMsgSend.cpp	2013-12-18 21:26:17.965879565 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mailnews/compose/src/nsMsgSend.cpp	2013-12-18 21:15:58.837179958 +0400
+@@ -4890,7 +4890,7 @@
+   return NS_OK;
+ }
+ 
+-NS_IMETHODIMP nsMsgComposeAndSend::GetAttachmentHandlers(nsTArray<nsRefPtr<nsMsgAttachmentHandler>> **_retval)
++NS_IMETHODIMP nsMsgComposeAndSend::GetAttachmentHandlers(nsTArray<nsRefPtr<nsMsgAttachmentHandler> > **_retval)
+ {
+   NS_ENSURE_ARG(_retval);
+   *_retval = &m_attachments;
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/browser/app/blocklist.xml seamonkey-2.21-esr2.0/comm-release/mozilla/browser/app/blocklist.xml
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/browser/app/blocklist.xml	2013-12-18 21:26:17.967879533 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/browser/app/blocklist.xml	2013-12-18 21:15:58.838179932 +0400
+@@ -1,5 +1,5 @@
+ <?xml version="1.0"?>
+-<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist" lastupdate="1382113575000">
++<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist" lastupdate="1385765544000">
+   <emItems>
+       <emItem  blockID="i454" id="sqlmoz at facebook.com">
+                         <versionRange  minVersion="0" maxVersion="*" severity="3">
+@@ -37,6 +37,14 @@
+                         <versionRange  minVersion="2.4.6.4" maxVersion="2.4.6.4" severity="1">
+                     </versionRange>
+                   </emItem>
++      <emItem  blockID="i484" id="plugin at getwebcake.com">
++                        <versionRange  minVersion="0" maxVersion="*" severity="1">
++                    </versionRange>
++                  </emItem>
++      <emItem  blockID="i433" id="{c95a4e8e-816d-4655-8c79-d736da1adb6d}">
++                        <versionRange  minVersion="0" maxVersion="*" severity="1">
++                    </versionRange>
++                  </emItem>
+       <emItem  blockID="i65" id="activity at facebook.com">
+                         <versionRange  minVersion="0" maxVersion="*">
+                     </versionRange>
+@@ -45,6 +53,10 @@
+                         <versionRange  minVersion="0" maxVersion="*">
+                     </versionRange>
+                   </emItem>
++      <emItem  blockID="i224" id="{336D0C35-8A85-403a-B9D2-65C292C39087}">
++                        <versionRange  minVersion="0" maxVersion="*" severity="1">
++                    </versionRange>
++                  </emItem>
+       <emItem  blockID="i105" id="{95ff02bc-ffc6-45f0-a5c8-619b8226a9de}">
+                         <versionRange  minVersion="0" maxVersion="*">
+                     </versionRange>
+@@ -57,12 +69,12 @@
+                         <versionRange  minVersion="0" maxVersion="*" severity="1">
+                     </versionRange>
+                   </emItem>
+-      <emItem  blockID="i348" id="{13c9f1f9-2322-4d5c-81df-6d4bf8476ba4}">
+-                        <versionRange  minVersion="0" maxVersion="*" severity="1">
++      <emItem  blockID="i488" id="jid1-4P0kohSJxU1qGg at jetpack">
++                        <versionRange  minVersion="1.2.50" maxVersion="1.2.50" severity="1">
+                     </versionRange>
+                   </emItem>
+-      <emItem  blockID="i440" id="{2d069a16-fca1-4e81-81ea-5d5086dcbd0c}">
+-                        <versionRange  minVersion="0" maxVersion="*" severity="1">
++      <emItem  blockID="i486" id="xz123 at ya456.com">
++                        <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+                   </emItem>
+       <emItem  blockID="i392" id="{EEE6C361-6118-11DC-9C72-001320C79847}">
+@@ -90,14 +102,18 @@
+                         <versionRange  minVersion="3.4.1" maxVersion="3.4.1.194" severity="1">
+                     </versionRange>
+                   </emItem>
+-      <emItem  blockID="i433" id="{c95a4e8e-816d-4655-8c79-d736da1adb6d}">
+-                        <versionRange  minVersion="0" maxVersion="*" severity="1">
++      <emItem  blockID="i100" id="{394DCBA4-1F92-4f8e-8EC9-8D2CB90CB69B}">
++                        <versionRange  minVersion="2.5.0" maxVersion="2.5.0" severity="1">
+                     </versionRange>
+                   </emItem>
+       <emItem  blockID="i40" id="{28387537-e3f9-4ed7-860c-11e69af4a8a0}">
+                         <versionRange  minVersion="0.1" maxVersion="4.3.1.00" severity="1">
+                     </versionRange>
+                   </emItem>
++      <emItem  blockID="i20" id="{AB2CE124-6272-4b12-94A9-7303C7397BD1}">
++                        <versionRange  minVersion="0.1" maxVersion="5.2.0.7164" severity="1">
++                    </versionRange>
++                  </emItem>
+       <emItem  blockID="i430" id="1chtw at facebook.com">
+                         <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+@@ -121,6 +137,10 @@
+                         <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+                   </emItem>
++      <emItem  blockID="i478" id="{7e8a1050-cf67-4575-92df-dcc60e7d952d}">
++                        <versionRange  minVersion="0" maxVersion="*" severity="1">
++                    </versionRange>
++                  </emItem>
+       <emItem  blockID="i84" id="pink at rosaplugin.info">
+                         <versionRange  minVersion="0" maxVersion="*">
+                     </versionRange>
+@@ -133,6 +153,10 @@
+                         <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+                   </emItem>
++      <emItem  blockID="i467" id="plugin at analytic-s.com">
++                        <versionRange  minVersion="0" maxVersion="*" severity="1">
++                    </versionRange>
++                  </emItem>
+       <emItem  blockID="i360" id="ytd at mybrowserbar.com">
+                         <versionRange  minVersion="0" maxVersion="*" severity="1">
+                     </versionRange>
+@@ -153,7 +177,9 @@
+                         <versionRange  minVersion="0" maxVersion="*" severity="1">
+                     </versionRange>
+                   </emItem>
+-      <emItem  blockID="i443" id="{B40794A0-7477-4335-95C5-8CB9BBC5C4A5}">
++      <emItem  blockID="i481" id="{B40794A0-7477-4335-95C5-8CB9BBC5C4A5}">
++                        <versionRange  minVersion="0" maxVersion="*" severity="3">
++                    </versionRange>
+                         <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+                                 <versionRange  minVersion="0" maxVersion="*" severity="3">
+@@ -170,6 +196,10 @@
+                         <versionRange  minVersion="0" maxVersion="*">
+                     </versionRange>
+                   </emItem>
++      <emItem  blockID="i472" id="linksicle at linksicle.com">
++                        <versionRange  minVersion="0" maxVersion="*" severity="3">
++                    </versionRange>
++                  </emItem>
+       <emItem  blockID="i99" id="pfzPXmnzQRXX6 at 2iABkVe.com">
+                         <versionRange  minVersion="0" maxVersion="*">
+                     </versionRange>
+@@ -194,16 +224,12 @@
+                         <versionRange  minVersion="0" maxVersion="*" severity="1">
+                     </versionRange>
+                   </emItem>
+-      <emItem  blockID="i38" id="{B7082FAA-CB62-4872-9106-E42DD88EDE45}">
+-                        <versionRange  minVersion="0.1" maxVersion="3.3.0.*">
+-                      <targetApplication  id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
+-                              <versionRange  minVersion="3.7a1" maxVersion="*" />
+-                          </targetApplication>
++      <emItem  blockID="i447" id="{B18B1E5C-4D81-11E1-9C00-AFEB4824019B}">
++                        <versionRange  minVersion="0" maxVersion="*" severity="1">
+                     </versionRange>
+-                                <versionRange  minVersion="3.3.1" maxVersion="*">
+-                      <targetApplication  id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
+-                              <versionRange  minVersion="5.0a1" maxVersion="*" />
+-                          </targetApplication>
++                  </emItem>
++      <emItem  blockID="i466" id="afext at anchorfree.com">
++                        <versionRange  minVersion="0" maxVersion="*" severity="1">
+                     </versionRange>
+                   </emItem>
+       <emItem  blockID="i98" id="youtubeeing at youtuberie.com">
+@@ -230,6 +256,10 @@
+                         <versionRange  minVersion="0" maxVersion="*" severity="1">
+                     </versionRange>
+                   </emItem>
++      <emItem  blockID="i487" id="{df6bb2ec-333b-4267-8c4f-3f27dc8c6e07}">
++                        <versionRange  minVersion="0" maxVersion="*" severity="3">
++                    </versionRange>
++                  </emItem>
+       <emItem  blockID="i142" id="{a3a5c777-f583-4fef-9380-ab4add1bc2a8}">
+                         <versionRange  minVersion="2.0.3" maxVersion="2.0.3">
+                     </versionRange>
+@@ -255,10 +285,18 @@
+                         <versionRange  minVersion=" " maxVersion="6.*">
+                     </versionRange>
+                   </emItem>
++      <emItem  blockID="i358" id="lfind at nijadsoft.net">
++                        <versionRange  minVersion="0" maxVersion="*" severity="1">
++                    </versionRange>
++                  </emItem>
+       <emItem  blockID="i228" id="crossriderapp5060 at crossrider.com">
+                         <versionRange  minVersion="0" maxVersion="*" severity="1">
+                     </versionRange>
+                   </emItem>
++      <emItem  blockID="i465" id="trtv3 at trtv.com">
++                        <versionRange  minVersion="0" maxVersion="*" severity="1">
++                    </versionRange>
++                  </emItem>
+       <emItem  blockID="i4" id="{4B3803EA-5230-4DC3-A7FC-33638F3D3542}">
+                         <versionRange  minVersion="1.2" maxVersion="1.2">
+                       <targetApplication  id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
+@@ -277,8 +315,8 @@
+                         <versionRange  minVersion="0" maxVersion="*">
+                     </versionRange>
+                   </emItem>
+-      <emItem  blockID="i100" id="{394DCBA4-1F92-4f8e-8EC9-8D2CB90CB69B}">
+-                        <versionRange  minVersion="2.5.0" maxVersion="2.5.0" severity="1">
++      <emItem  blockID="i348" id="{13c9f1f9-2322-4d5c-81df-6d4bf8476ba4}">
++                        <versionRange  minVersion="0" maxVersion="*" severity="1">
+                     </versionRange>
+                   </emItem>
+       <emItem  blockID="i338" id="{1FD91A9C-410C-4090-BBCC-55D3450EF433}">
+@@ -309,12 +347,16 @@
+                         <versionRange  minVersion="0" maxVersion="1.0" severity="1">
+                     </versionRange>
+                   </emItem>
++      <emItem  blockID="i468" id="05dd836e-2cbd-4204-9ff3-2f8a8665967d at a8876730-fb0c-4057-a2fc-f9c09d438e81.com">
++                        <versionRange  minVersion="0" maxVersion="*" severity="3">
++                    </versionRange>
++                  </emItem>
+       <emItem  blockID="i398" id="{377e5d4d-77e5-476a-8716-7e70a9272da0}">
+                         <versionRange  minVersion="0" maxVersion="*" severity="1">
+                     </versionRange>
+                   </emItem>
+-      <emItem  blockID="i447" id="{B18B1E5C-4D81-11E1-9C00-AFEB4824019B}">
+-                        <versionRange  minVersion="0" maxVersion="*" severity="1">
++      <emItem  blockID="i479" id="mbrsepone at facebook.com">
++                        <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+                   </emItem>
+       <emItem  blockID="i256" id="/^[0-9a-f]+@[0-9a-f]+\.info/">
+@@ -325,6 +367,10 @@
+                         <versionRange  minVersion="0" maxVersion="*" severity="1">
+                     </versionRange>
+                   </emItem>
++      <emItem  blockID="i440" id="{2d069a16-fca1-4e81-81ea-5d5086dcbd0c}">
++                        <versionRange  minVersion="0" maxVersion="*" severity="1">
++                    </versionRange>
++                  </emItem>
+       <emItem  blockID="i396" id="/@(ft|putlocker|clickmovie|m2k|sharerepo|smarter-?)downloader\.com$/">
+                         <versionRange  minVersion="0" maxVersion="*" severity="1">
+                     </versionRange>
+@@ -339,6 +385,10 @@
+                   </emItem>
+       <emItem  blockID="i44" id="sigma at labs.mozilla">
+                         </emItem>
++      <emItem  blockID="i482" id="brasilescapeeight at facebook.com">
++                        <versionRange  minVersion="0" maxVersion="*" severity="3">
++                    </versionRange>
++                  </emItem>
+       <emItem  blockID="i246" id="support at vide1flash2.com">
+                         <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+@@ -365,18 +415,30 @@
+                         <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+                   </emItem>
++      <emItem  blockID="i477" id="mbrnovone at facebook.com">
++                        <versionRange  minVersion="0" maxVersion="*" severity="3">
++                    </versionRange>
++                  </emItem>
+       <emItem  blockID="i446" id="{E90FA778-C2B7-41D0-9FA9-3FEC1CA54D66}">
+                         <versionRange  minVersion="0" maxVersion="*" severity="1">
+                     </versionRange>
+                   </emItem>
+       <emItem  blockID="i7" id="{2224e955-00e9-4613-a844-ce69fccaae91}">
+                         </emItem>
++      <emItem  blockID="i485" id="/^brasilescape.*\@facebook\.com$//">
++                        <versionRange  minVersion="0" maxVersion="*" severity="3">
++                    </versionRange>
++                  </emItem>
+       <emItem  blockID="i52" id="ff-ext at youtube">
+                         <versionRange  minVersion="0" maxVersion="*">
+                     </versionRange>
+                   </emItem>
+-      <emItem  blockID="i224" id="{336D0C35-8A85-403a-B9D2-65C292C39087}">
+-                        <versionRange  minVersion="0" maxVersion="*" severity="1">
++      <emItem  blockID="i471" id="firefox at luckyleap.net">
++                        <versionRange  minVersion="0" maxVersion="*" severity="3">
++                    </versionRange>
++                  </emItem>
++      <emItem  blockID="i483" id="brasilescapefive at facebook.com">
++                        <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+                   </emItem>
+       <emItem  blockID="i43" id="supportaccessplugin at gmail.com">
+@@ -397,6 +459,10 @@
+                         <versionRange  minVersion="0" maxVersion="*">
+                     </versionRange>
+                   </emItem>
++      <emItem  blockID="i474" id="{906000a4-88d9-4d52-b209-7a772970d91f}">
++                        <versionRange  minVersion="0" maxVersion="*" severity="3">
++                    </versionRange>
++                  </emItem>
+       <emItem  blockID="i453" id="/^brasilescape.*\@facebook\.com$/">
+                         <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+@@ -465,13 +531,15 @@
+                         <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+                   </emItem>
+-      <emItem  blockID="i196" id="info at wxdownloadmanager.com">
+-                        <versionRange  minVersion="0" maxVersion="*" severity="3">
++      <emItem  blockID="i91" id="crossriderapp4926 at crossrider.com">
++                        <versionRange  minVersion="0" maxVersion="0.81.43" severity="1">
+                     </versionRange>
+                   </emItem>
+-      <emItem  blockID="i435" id="pluggets at gmail.com">
++      <emItem  blockID="i480" id="pluggets at gmail.com">
+                         <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
++                                <versionRange  minVersion="0" maxVersion="*" severity="1">
++                    </versionRange>
+                   </emItem>
+       <emItem  blockID="i67" id="youtube2 at youtube2.com">
+                         <versionRange  minVersion="0" maxVersion="*">
+@@ -481,6 +549,18 @@
+                         <versionRange  minVersion="0" maxVersion="*" severity="1">
+                     </versionRange>
+                   </emItem>
++      <emItem  blockID="i38" id="{B7082FAA-CB62-4872-9106-E42DD88EDE45}">
++                        <versionRange  minVersion="0.1" maxVersion="3.3.0.*">
++                      <targetApplication  id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
++                              <versionRange  minVersion="3.7a1" maxVersion="*" />
++                          </targetApplication>
++                    </versionRange>
++                                <versionRange  minVersion="3.3.1" maxVersion="*">
++                      <targetApplication  id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
++                              <versionRange  minVersion="5.0a1" maxVersion="*" />
++                          </targetApplication>
++                    </versionRange>
++                  </emItem>
+       <emItem  blockID="i6" id="{3f963a5b-e555-4543-90e2-c3908898db71}">
+                         <versionRange  minVersion=" " maxVersion="8.5">
+                     </versionRange>
+@@ -510,8 +590,8 @@
+                         <versionRange  severity="3">
+                     </versionRange>
+                   </emItem>
+-      <emItem  blockID="i20" id="{AB2CE124-6272-4b12-94A9-7303C7397BD1}">
+-                        <versionRange  minVersion="0.1" maxVersion="5.2.0.7164" severity="1">
++      <emItem  blockID="i491" id="{515b2424-5911-40bd-8a2c-bdb20286d8f5}">
++                        <versionRange  minVersion="0" maxVersion="*" severity="1">
+                     </versionRange>
+                   </emItem>
+       <emItem  blockID="i444" id="fplayer at adobe.flash">
+@@ -543,8 +623,8 @@
+                         <versionRange  minVersion="0" maxVersion="*">
+                     </versionRange>
+                   </emItem>
+-      <emItem  blockID="i320" id="torntv at torntv.com">
+-                        <versionRange  minVersion="0" maxVersion="*" severity="1">
++      <emItem  blockID="i476" id="mbroctone at facebook.com">
++                        <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+                   </emItem>
+       <emItem  blockID="i3" id="langpack-vi-VN at firefox.mozilla.org">
+@@ -555,8 +635,8 @@
+                         <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+                   </emItem>
+-      <emItem  blockID="i358" id="lfind at nijadsoft.net">
+-                        <versionRange  minVersion="0" maxVersion="*" severity="1">
++      <emItem  blockID="i470" id="extension at FastFreeConverter.com">
++                        <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+                   </emItem>
+       <emItem  blockID="i162" id="{EB7508CA-C7B2-46E0-8C04-3E94A035BD49}">
+@@ -590,6 +670,10 @@
+                         <versionRange  minVersion="0" maxVersion="*" severity="1">
+                     </versionRange>
+                   </emItem>
++      <emItem  blockID="i490" id="now.msn.com at services.mozilla.org">
++                        <versionRange  minVersion="0" maxVersion="*" severity="3">
++                    </versionRange>
++                  </emItem>
+       <emItem  blockID="i312" id="extension21804 at extension21804.com">
+                         <versionRange  minVersion="0" maxVersion="*" severity="1">
+                     </versionRange>
+@@ -610,14 +694,16 @@
+                         <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+                   </emItem>
+-      <emItem  blockID="i61" id="youtube at youtube3.com">
+-                        <versionRange  minVersion="0" maxVersion="*">
++      <emItem  blockID="i320" id="torntv at torntv.com">
++                        <versionRange  minVersion="0" maxVersion="*" severity="1">
+                     </versionRange>
+-                                <versionRange  minVersion="0" maxVersion="*">
++                  </emItem>
++      <emItem  blockID="i196" id="info at wxdownloadmanager.com">
++                        <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+                   </emItem>
+-      <emItem  blockID="i91" id="crossriderapp4926 at crossrider.com">
+-                        <versionRange  minVersion="0" maxVersion="0.81.43" severity="1">
++      <emItem  blockID="i469" id="OKitSpace at OKitSpace.es">
++                        <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+                   </emItem>
+       <emItem  blockID="i167" id="{b64982b1-d112-42b5-b1e4-d3867c4533f8}">
+@@ -648,6 +734,12 @@
+                         <versionRange  minVersion="0" maxVersion="*" severity="1">
+                     </versionRange>
+                   </emItem>
++      <emItem  blockID="i61" id="youtube at youtube3.com">
++                        <versionRange  minVersion="0" maxVersion="*">
++                    </versionRange>
++                                <versionRange  minVersion="0" maxVersion="*">
++                    </versionRange>
++                  </emItem>
+       <emItem  blockID="i372" id="5nc3QHFgcb at r06Ws9gvNNVRfH.com">
+                         <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+@@ -660,6 +752,10 @@
+                         <versionRange  minVersion="0" maxVersion="*" severity="1">
+                     </versionRange>
+                   </emItem>
++      <emItem  blockID="i473" id="{81b13b5d-fba1-49fd-9a6b-189483ac548a}">
++                        <versionRange  minVersion="0" maxVersion="*" severity="3">
++                    </versionRange>
++                  </emItem>
+       <emItem  blockID="i437" id="{4933189D-C7F7-4C6E-834B-A29F087BFD23}">
+                         <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+@@ -691,6 +787,10 @@
+                         <versionRange  minVersion="0" maxVersion="*">
+                     </versionRange>
+                   </emItem>
++      <emItem  blockID="i489" id="astrovia at facebook.com">
++                        <versionRange  minVersion="0" maxVersion="*" severity="3">
++                    </versionRange>
++                  </emItem>
+       <emItem  blockID="i68" id="flashupdate at adobe.com">
+                         <versionRange  minVersion="0" maxVersion="*">
+                     </versionRange>
+@@ -750,16 +850,16 @@
+                         <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+                   </emItem>
+-      <emItem  blockID="i21" id="support at update-firefox.com">
+-                        </emItem>
+-      <emItem  blockID="i322" id="jid0-Y6TVIzs0r7r4xkOogmJPNAGFGBw at jetpack">
++      <emItem  blockID="i374" id="update at firefox.com">
+                         <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+                   </emItem>
+-      <emItem  blockID="i374" id="update at firefox.com">
++      <emItem  blockID="i322" id="jid0-Y6TVIzs0r7r4xkOogmJPNAGFGBw at jetpack">
+                         <versionRange  minVersion="0" maxVersion="*" severity="3">
+                     </versionRange>
+                   </emItem>
++      <emItem  blockID="i21" id="support at update-firefox.com">
++                        </emItem>
+     </emItems>
+ 
+   <pluginItems>
+@@ -1191,27 +1291,6 @@
+                           </targetApplication>
+                   </versionRange>
+                   </pluginItem>
+-      <pluginItem  blockID="p462">
+-                  <match name="filename" exp="JavaAppletPlugin\.plugin" />                                    <versionRange  minVersion="Java 7 Update 45" maxVersion="Java 7 Update 45" severity="0" vulnerabilitystatus="2">
+-                                <targetApplication  id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
+-                              <versionRange  minVersion="24.0" maxVersion="*" />
+-                          </targetApplication>
+-                  </versionRange>
+-                  </pluginItem>
+-      <pluginItem  blockID="p463">
+-      <match name="name" exp="Java\(TM\) Platform SE 7 U45(\s[^\d\._U]|$)" />            <match name="filename" exp="npjp2\.dll" />                                    <versionRange  severity="0" vulnerabilitystatus="2">
+-                                <targetApplication  id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
+-                              <versionRange  minVersion="24.0" maxVersion="*" />
+-                          </targetApplication>
+-                  </versionRange>
+-                  </pluginItem>
+-      <pluginItem  blockID="p464">
+-      <match name="name" exp="Java(\(TM\))? Plug-in 10\.45(\.[0-9]+)?([^\d\._]|$)" />            <match name="filename" exp="libnpjp2\.so" />                                    <versionRange  severity="0" vulnerabilitystatus="2">
+-                                <targetApplication  id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
+-                              <versionRange  minVersion="24.0" maxVersion="*" />
+-                          </targetApplication>
+-                  </versionRange>
+-                  </pluginItem>
+     </pluginItems>
+ 
+   <gfxItems>
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/browser/app/profile/firefox.js seamonkey-2.21-esr2.0/comm-release/mozilla/browser/app/profile/firefox.js
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/browser/app/profile/firefox.js	2013-12-18 21:26:17.967879533 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/browser/app/profile/firefox.js	2013-12-18 21:15:58.838179932 +0400
+@@ -121,10 +121,10 @@
+ // when the |app.update.cert.checkAttributes| preference is set to false. Also,
+ // the |app.update.url.override| preference should ONLY be used for testing.
+ // IMPORTANT! metro.js should also be updated for updates to certs.X.issuerName
+-pref("app.update.certs.1.issuerName", "OU=Equifax Secure Certificate Authority,O=Equifax,C=US");
++pref("app.update.certs.1.issuerName", "CN=Thawte SSL CA,O=\"Thawte, Inc.\",C=US");
+ pref("app.update.certs.1.commonName", "aus3.mozilla.org");
+ 
+-pref("app.update.certs.2.issuerName", "CN=Thawte SSL CA,O=\"Thawte, Inc.\",C=US");
++pref("app.update.certs.2.issuerName", "CN=DigiCert Secure Server CA,O=DigiCert Inc,C=US");
+ pref("app.update.certs.2.commonName", "aus3.mozilla.org");
+ 
+ // Whether or not app updates are enabled
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/browser/base/content/test/browser_save_private_link_perwindowpb.js seamonkey-2.21-esr2.0/comm-release/mozilla/browser/base/content/test/browser_save_private_link_perwindowpb.js
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/browser/base/content/test/browser_save_private_link_perwindowpb.js	2013-09-16 22:26:25.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/browser/base/content/test/browser_save_private_link_perwindowpb.js	2013-12-18 21:15:59.538161839 +0400
+@@ -82,8 +82,12 @@
+ 
+   function doTest(aIsPrivateMode, aWindow, aCallback) {
+     aWindow.gBrowser.addEventListener("pageshow", function pageShown(event) {
+-      if (event.target.location == "about:blank")
++      // If data: -url PAC file isn't loaded soon enough, we may get about:privatebrowsing loaded
++      if (event.target.location == "about:blank" ||
++          event.target.location == "about:privatebrowsing") {
++        aWindow.gBrowser.selectedBrowser.loadURI(testURI);
+         return;
++      }
+       aWindow.gBrowser.removeEventListener("pageshow", pageShown);
+ 
+       executeSoon(function () {
+@@ -95,8 +99,6 @@
+                                            aWindow.gBrowser.contentWindow);
+       });
+     });
+-
+-    aWindow.gBrowser.selectedBrowser.loadURI(testURI);
+   }
+ 
+   function testOnWindow(aOptions, aCallback) {
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/browser/components/sessionstore/src/SessionStore.jsm seamonkey-2.21-esr2.0/comm-release/mozilla/browser/components/sessionstore/src/SessionStore.jsm
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/browser/components/sessionstore/src/SessionStore.jsm	2013-09-16 22:26:26.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/browser/components/sessionstore/src/SessionStore.jsm	2013-12-18 21:15:59.844153931 +0400
+@@ -699,7 +699,7 @@
+           // We're starting with a single private window. Save the state we
+           // actually wanted to restore so that we can do it later in case
+           // the user opens another, non-private window.
+-          this._deferredInitialState = this._initialState;
++          this._deferredInitialState = gSessionStartup.state;
+           delete this._initialState;
+ 
+           // Nothing to restore now, notify observers things are complete.
+@@ -3653,16 +3653,6 @@
+       }
+     }
+ 
+-#ifndef XP_MACOSX
+-    // Don't save invalid states.
+-    // Looks like we currently have private windows, only.
+-    if (oState.windows.length == 0) {
+-      TelemetryStopwatch.cancel("FX_SESSION_RESTORE_COLLECT_DATA_MS");
+-      TelemetryStopwatch.cancel("FX_SESSION_RESTORE_COLLECT_DATA_LONGEST_OP_MS");
+-      return;
+-    }
+-#endif
+-
+     for (let i = oState._closedWindows.length - 1; i >= 0; i--) {
+       if (oState._closedWindows[i].isPrivate) {
+         oState._closedWindows.splice(i, 1);
+@@ -3703,6 +3693,12 @@
+     if (this._lastSessionState)
+       oState.lastSessionState = this._lastSessionState;
+ 
++    // Make sure that we keep the previous session if we started with a single
++    // private window and no non-private windows have been opened, yet.
++    if (this._deferredInitialState) {
++      oState.windows = this._deferredInitialState.windows || [];
++    }
++
+     TelemetryStopwatch.finish("FX_SESSION_RESTORE_COLLECT_DATA_MS");
+     TelemetryStopwatch.finish("FX_SESSION_RESTORE_COLLECT_DATA_LONGEST_OP_MS");
+ 
+@@ -4098,6 +4094,14 @@
+    * @returns [defaultState, state]
+    */
+   _prepDataForDeferredRestore: function ssi_prepDataForDeferredRestore(state) {
++    // Make sure that we don't modify the global state as provided by
++    // nsSessionStartup.state. Converting the object to a JSON string and
++    // parsing it again is the easiest way to do that, although not the most
++    // efficient one. Deferred sessions that don't have automatic session
++    // restore enabled tend to be a lot smaller though so that this shouldn't
++    // be a big perf hit.
++    state = JSON.parse(JSON.stringify(state));
++
+     let defaultState = { windows: [], selectedWindow: 1 };
+ 
+     state.selectedWindow = state.selectedWindow || 1;
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/browser/components/sessionstore/test/browser_480148.js seamonkey-2.21-esr2.0/comm-release/mozilla/browser/components/sessionstore/test/browser_480148.js
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/browser/components/sessionstore/test/browser_480148.js	2013-09-16 22:26:26.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/browser/components/sessionstore/test/browser_480148.js	2013-12-18 21:16:00.072148027 +0400
+@@ -5,7 +5,7 @@
+ function test() {
+   /** Test for Bug 484108 **/
+   waitForExplicitFinish();
+-  requestLongerTimeout(4);
++  requestLongerTimeout(5);
+ 
+   // builds the tests state based on a few parameters
+   function buildTestState(num, selected, hidden, pinned) {
+@@ -162,6 +162,11 @@
+       return;
+     }
+ 
++    let wu = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
++                   .getInterface(Components.interfaces.nsIDOMWindowUtils);
++    wu.garbageCollect();
++
++    setTimeout(function() {
+     info ("Starting test " + (++testIndex));
+     let test = tests.shift();
+     let state = buildTestState(test.totalTabs, test.selectedTab,
+@@ -204,6 +209,7 @@
+       win.resizeTo(windowWidth, win.outerHeight);
+       ss.setWindowState(win, JSON.stringify(state), true);
+     });
++    }, 1000);
+   };
+ 
+   runNextTest();
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/browser/components/sessionstore/test/browser_625016.js seamonkey-2.21-esr2.0/comm-release/mozilla/browser/components/sessionstore/test/browser_625016.js
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/browser/components/sessionstore/test/browser_625016.js	2013-09-16 22:26:26.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/browser/components/sessionstore/test/browser_625016.js	2013-12-18 21:16:00.317141716 +0400
+@@ -40,6 +40,16 @@
+ }
+ 
+ function onSaveState() {
++  try {
++    ss.getWindowValue(newWin, "foobar");
++  } catch (e) {
++    // The window is untracked which means that the saveState() call isn't the
++    // one we're waiting for. It's most likely been triggered by an async
++    // collection running in the background.
++    waitForSaveState(onSaveState);
++    return;
++  }
++
+   // Double check that we have no closed windows
+   is(ss.getClosedWindowCount(), 0, "no closed windows on first save");
+ 
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/browser/config/mozconfigs/win32/common-opt seamonkey-2.21-esr2.0/comm-release/mozilla/browser/config/mozconfigs/win32/common-opt
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/browser/config/mozconfigs/win32/common-opt	2013-09-16 22:26:26.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/browser/config/mozconfigs/win32/common-opt	2013-12-18 21:16:00.390139829 +0400
+@@ -5,7 +5,13 @@
+ ac_add_options --enable-update-channel=${MOZ_UPDATE_CHANNEL}
+ ac_add_options --enable-update-packaging
+ ac_add_options --enable-jemalloc
+-ac_add_options --with-google-api-keyfile=/e/builds/gapi.data
++if [ -f /c/builds/gapi.data ]; then
++  _gapi_keyfile=/c/builds/gapi.data
++else
++  _gapi_keyfile=/e/builds/gapi.data
++fi
++ac_add_options --with-google-api-keyfile=${_gapi_keyfile}
++
+ 
+ # Needed to enable breakpad in application.ini
+ export MOZILLA_OFFICIAL=1
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/browser/config/version.txt seamonkey-2.21-esr2.0/comm-release/mozilla/browser/config/version.txt
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/browser/config/version.txt	2013-12-18 21:26:22.749799618 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/browser/config/version.txt	2013-12-18 21:16:00.390139829 +0400
+@@ -1 +1 @@
+-24.1.1
++24.2.0esrpre
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/browser/metro/profile/metro.js seamonkey-2.21-esr2.0/comm-release/mozilla/browser/metro/profile/metro.js
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/browser/metro/profile/metro.js	2013-09-16 22:26:26.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/browser/metro/profile/metro.js	2013-12-18 21:16:00.390139829 +0400
+@@ -491,9 +491,9 @@
+ // when the |app.update.cert.checkAttributes| preference is set to false. Also,
+ // the |app.update.url.override| preference should ONLY be used for testing.
+ // IMPORTANT! firefox.js should also be updated for updates to certs.X.issuerName
+-pref("app.update.certs.1.issuerName", "OU=Equifax Secure Certificate Authority,O=Equifax,C=US");
++pref("app.update.certs.1.issuerName", "CN=Thawte SSL CA,O=\"Thawte, Inc.\",C=US");
+ pref("app.update.certs.1.commonName", "aus3.mozilla.org");
+-pref("app.update.certs.2.issuerName", "CN=Thawte SSL CA,O=\"Thawte, Inc.\",C=US");
++pref("app.update.certs.2.issuerName", "CN=DigiCert Secure Server CA,O=DigiCert Inc,C=US");
+ pref("app.update.certs.2.commonName", "aus3.mozilla.org");
+ 
+ // User-settable override to app.update.url for testing purposes.
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/build/Makefile.in seamonkey-2.21-esr2.0/comm-release/mozilla/build/Makefile.in
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/build/Makefile.in	2013-09-16 22:26:27.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/build/Makefile.in	2013-12-18 21:16:00.390139829 +0400
+@@ -53,6 +53,10 @@
+   -DACCEPTED_MAR_CHANNEL_IDS="$(ACCEPTED_MAR_CHANNEL_IDS)" \
+   $(NULL)
+ 
++ifeq ($(MOZ_BUILD_APP),browser)
++DEFINES += -DMOZ_BUILD_APP_IS_BROWSER
++endif
++
+ ifdef MOZ_APP_PROFILE
+ DEFINES += -DMOZ_APP_PROFILE="$(MOZ_APP_PROFILE)"
+ endif
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/build/application.ini seamonkey-2.21-esr2.0/comm-release/mozilla/build/application.ini
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/build/application.ini	2013-09-16 22:26:27.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/build/application.ini	2013-12-18 21:16:00.390139829 +0400
+@@ -1,8 +1,14 @@
+ #if MOZ_APP_STATIC_INI
++#ifdef MOZ_BUILD_APP_IS_BROWSER
++; This file is not used. If you modify it and want the application to use
++; your modifications, move it under the browser/ subdirectory and start with
++; the "-app /path/to/browser/application.ini" argument.
++#else
+ ; This file is not used. If you modify it and want the application to use
+ ; your modifications, start with the "-app /path/to/application.ini"
+ ; argument.
+ #endif
++#endif
+ #if 0
+ ; This Source Code Form is subject to the terms of the Mozilla Public
+ ; License, v. 2.0. If a copy of the MPL was not distributed with this
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/build/cl.py seamonkey-2.21-esr2.0/comm-release/mozilla/build/cl.py
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/build/cl.py	2013-09-16 22:26:27.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/build/cl.py	2013-12-18 21:16:00.390139829 +0400
+@@ -2,12 +2,46 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
++import ctypes
+ import os, os.path
+ import subprocess
+ import sys
+ 
+ CL_INCLUDES_PREFIX = os.environ.get("CL_INCLUDES_PREFIX", "Note: including file:")
+ 
++GetShortPathName = ctypes.windll.kernel32.GetShortPathNameW
++GetLongPathName = ctypes.windll.kernel32.GetLongPathNameW
++
++
++# cl.exe likes to print inconsistent paths in the showIncludes output
++# (some lowercased, some not, with different directions of slashes),
++# and we need the original file case for make/pymake to be happy.
++# As this is slow and needs to be called a lot of times, use a cache
++# to speed things up.
++_normcase_cache = {}
++
++def normcase(path):
++    # Get*PathName want paths with backslashes
++    path = path.replace('/', os.sep)
++    dir = os.path.dirname(path)
++    # name is fortunately always going to have the right case,
++    # so we can use a cache for the directory part only.
++    name = os.path.basename(path)
++    if dir in _normcase_cache:
++        result = _normcase_cache[dir]
++    else:
++        path = ctypes.create_unicode_buffer(dir)
++        length = GetShortPathName(path, None, 0)
++        shortpath = ctypes.create_unicode_buffer(length)
++        GetShortPathName(path, shortpath, length)
++        length = GetLongPathName(shortpath, None, 0)
++        if length > len(path):
++            path = ctypes.create_unicode_buffer(length)
++        GetLongPathName(shortpath, path, length)
++        result = _normcase_cache[dir] = path.value
++    return os.path.join(result, name)
++
++
+ def InvokeClWithDependencyGeneration(cmdline):
+     target = ""
+     # Figure out what the target is
+@@ -19,13 +53,17 @@
+     if target == None:
+         print >>sys.stderr, "No target set" and sys.exit(1)
+ 
++    # Assume the source file is the last argument
++    source = cmdline[-1]
++    assert not source.startswith('-')
++
+     # The deps target lives here
+     depstarget = os.path.basename(target) + ".pp"
+ 
+     cmdline += ['-showIncludes']
+     cl = subprocess.Popen(cmdline, stdout=subprocess.PIPE)
+ 
+-    deps = set()
++    deps = set([normcase(source).replace(os.sep, '/')])
+     for line in cl.stdout:
+         # cl -showIncludes prefixes every header with "Note: including file:"
+         # and an indentation corresponding to the depth (which we don't need)
+@@ -34,8 +72,9 @@
+             # We can't handle pathes with spaces properly in mddepend.pl, but
+             # we can assume that anything in a path with spaces is a system
+             # header and throw it away.
+-            if dep.find(' ') == -1:
+-                deps.add(dep)
++            dep = normcase(dep)
++            if ' ' not in dep:
++                deps.add(dep.replace(os.sep, '/'))
+         else:
+             sys.stdout.write(line) # Make sure we preserve the relevant output
+                                    # from cl
+@@ -54,10 +93,13 @@
+                  # cost of masking failure to create the directory.  We'll just
+                  # die on the next line though, so it's not that much of a loss.
+ 
+-    f = open(depstarget, "w")
++    with open(depstarget, "w") as f:
++        f.write("%s: %s" % (target, source))
++        for dep in sorted(deps):
++            f.write(" \\\n%s" % dep)
++        f.write('\n')
+     for dep in sorted(deps):
+-        print >>f, "%s: %s" % (target, dep)
+-        print >>f, "%s:" % dep
++            f.write("%s:\n" % dep)
+ 
+ if __name__ == "__main__":
+     InvokeClWithDependencyGeneration(sys.argv[1:])
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/build/win32/mozconfig.vs2010-win64 seamonkey-2.21-esr2.0/comm-release/mozilla/build/win32/mozconfig.vs2010-win64
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/build/win32/mozconfig.vs2010-win64	2013-09-16 22:26:27.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/build/win32/mozconfig.vs2010-win64	2013-12-18 21:16:00.397139650 +0400
+@@ -1,18 +1,26 @@
++
++if [ -d "/c/PROGRA~2/MICROS~2.0" ]; then
++  # /c/Program Files (x86)/Microsoft Visual Studio 10.0
++  _VSPATH="/c/PROGRA~2/MICROS~2.0"
++else
++  _VSPATH="/c/tools/msvs10"
++fi
++
+ ## SDK redist ##
+-export WIN32_REDIST_DIR=/c/tools/msvs10/VC/redist/x86/Microsoft.VC100.CRT
++export WIN32_REDIST_DIR=${_VSPATH}/VC/redist/x86/Microsoft.VC100.CRT
+ 
+ ## moz tools location for 64-bit builders ##
+ export MOZ_TOOLS=C:/mozilla-build/moztools
+ 
+ ## includes: win8 sdk includes, winrt headers for metro, msvc 10 std library, directx sdk for d3d9 ##
+-export INCLUDE=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/shared:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/um:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt/wrl:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt/wrl/wrappers:/c/tools/msvs10/vc/include:/c/tools/msvs10/vc/atlmfc/include:/c/tools/sdks/dx10/include
++export INCLUDE=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/shared:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/um:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt/wrl:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt/wrl/wrappers:${_VSPATH}/vc/include:${_VSPATH}/vc/atlmfc/include:/c/tools/sdks/dx10/include
+ 
+ ## libs: win8 sdk x86 (32-bit) libs, msvc 10 (32-bit) std library, msvc 10 atl libs, directx sdk (32-bit) for d3d9  ##
+-export LIBPATH=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/Lib/win8/um/x86:/c/tools/msvs10/vc/lib:/c/tools/msvs10/vc/atlmfc/lib:/c/tools/sdks/dx10/lib
+-export LIB=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/Lib/win8/um/x86:/c/tools/msvs10/vc/lib:/c/tools/msvs10/vc/atlmfc/lib:/c/tools/sdks/dx10/lib
++export LIBPATH=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/Lib/win8/um/x86:${_VSPATH}/vc/lib:${_VSPATH}/vc/atlmfc/lib:/c/tools/sdks/dx10/lib
++export LIB=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/Lib/win8/um/x86:${_VSPATH}/vc/lib:${_VSPATH}/vc/atlmfc/lib:/c/tools/sdks/dx10/lib
+ 
+ ## paths: win8 sdk x86 (32-bit) tools, msvc 10 (32-bit) build toolchain, moz tools  ##
+-export PATH="/c/Program Files (x86)/Windows Kits/8.0/bin/x86:/c/tools/msvs10/Common7/IDE:/c/tools/msvs10/VC/BIN:/c/tools/msvs10/Common7/Tools:/c/tools/msvs10/VC/VCPackages:/c/mozilla-build/moztools:${PATH}"
++export PATH="/c/Program Files (x86)/Windows Kits/8.0/bin/x86:${_VSPATH}/Common7/IDE:${_VSPATH}/VC/BIN:${_VSPATH}/Common7/Tools:${_VSPATH}/VC/VCPackages:/c/mozilla-build/moztools:${PATH}"
+ 
+ . $topsrcdir/build/mozconfig.vs2010-common
+ 
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/build/win64/mozconfig.vs2010 seamonkey-2.21-esr2.0/comm-release/mozilla/build/win64/mozconfig.vs2010
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/build/win64/mozconfig.vs2010	2013-09-16 22:26:27.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/build/win64/mozconfig.vs2010	2013-12-18 21:16:00.397139650 +0400
+@@ -1,19 +1,32 @@
++
++if [ -d "/c/PROGRA~2/MICROS~2.0" ]; then
++  # /c/Program Files (x86)/Microsoft Visual Studio 10.0
++  _VSPATH="/c/PROGRA~2/MICROS~2.0"
++else
++  _VSPATH="/c/tools/msvs10"
++fi
++
+ ## SDK redist ##
+-export WIN32_REDIST_DIR=/c/tools/msvs10/VC/redist/x64/Microsoft.VC100.CRT
++export WIN32_REDIST_DIR=${_VSPATH}/VC/redist/x64/Microsoft.VC100.CRT
+ 
+ ## includes: win8 sdk includes, winrt headers for metro, msvc 10 std library, directx sdk for d3d9 ##
+-export INCLUDE=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/shared:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/um:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt/wrl:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt/wrl/wrappers:/c/tools/msvs10/vc/include:/c/tools/msvs10/vc/atlmfc/include:/c/tools/sdks/dx10/include
++export INCLUDE=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/shared:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/um:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt/wrl:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/include/winrt/wrl/wrappers:${_VSPATH}/vc/include:${_VSPATH}/vc/atlmfc/include:/c/tools/sdks/dx10/include
+ 
+ ## libs: win8 sdk x64 (64-bit) libs, msvc 10 (64-bit) std library, msvc 10 atl libs, directx sdk (64-bit) for d3d9  ##
+-export LIBPATH=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/Lib/win8/um/x64:/c/tools/msvs10/vc/lib/amd64:/c/tools/msvs10/vc/atlmfc/lib/amd64:/c/tools/sdks/dx10/lib/x64
+-export LIB=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/Lib/win8/um/x64:/c/tools/msvs10/vc/lib/amd64:/c/tools/msvs10/vc/atlmfc/lib/amd64:/c/tools/sdks/dx10/lib/x64
++export LIBPATH=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/Lib/win8/um/x64:${_VSPATH}/vc/lib/amd64:${_VSPATH}/vc/atlmfc/lib/amd64:/c/tools/sdks/dx10/lib/x64
++export LIB=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.0/Lib/win8/um/x64:${_VSPATH}/vc/lib/amd64:${_VSPATH}/vc/atlmfc/lib/amd64:/c/tools/sdks/dx10/lib/x64
+ 
+ ## paths: win8 sdk x64 (64-bit) tools, msvc 10 (64-bit) build toolchain, moz tools  ##
+-export PATH="/c/Program Files (x86)/Windows Kits/8.0/bin/x64:/c/tools/msvs10/Common7/IDE:/c/tools/msvs10/VC/BIN/amd64:/c/tools/msvs10/VC/BIN/x86_amd64:/c/tools/msvs10/VC/BIN:/c/tools/msvs10/Common7/Tools:/c/tools/msvs10/VC/VCPackages:${PATH}"
++export PATH="/c/Program Files (x86)/Windows Kits/8.0/bin/x64:${_VSPATH}/Common7/IDE:${_VSPATH}/VC/BIN/amd64:${_VSPATH}/VC/BIN/x86_amd64:${_VSPATH}/VC/BIN:${_VSPATH}/Common7/Tools:${_VSPATH}/VC/VCPackages:${PATH}"
+ 
+ # Use 32bit linker for PGO crash bug.
+ # https://connect.microsoft.com/VisualStudio/feedback/details/686117/
+-export LD=c:/tools/msvs10/VC/BIN/x86_amd64/link.exe
++if [ -f /c/PROGRA~2/MICROS~2.0/VC/BIN/x86_amd64/link.exe ]; then
++  # /c/Program Files (x86)/Microsoft Visual Studio 10.0
++  export LD=c:/PROGRA~2/MICROS~2.0/VC/BIN/x86_amd64/link.exe
++else
++  export LD=c:/tools/msvs10/VC/BIN/x86_amd64/link.exe
++fi
+ 
+ . $topsrcdir/build/mozconfig.vs2010-common
+ 
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/config/milestone.txt seamonkey-2.21-esr2.0/comm-release/mozilla/config/milestone.txt
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/config/milestone.txt	2013-12-18 21:26:22.750799602 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/config/milestone.txt	2013-12-18 21:16:00.397139650 +0400
+@@ -10,4 +10,4 @@
+ # hardcoded milestones in the tree from these two files.
+ #--------------------------------------------------------
+ 
+-24.1.1
++24.2.0
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/config/system-headers seamonkey-2.21-esr2.0/comm-release/mozilla/config/system-headers
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/config/system-headers	2013-09-16 22:26:27.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/config/system-headers	2013-12-18 21:16:00.809129013 +0400
+@@ -413,6 +413,19 @@
+ freetype/ftadvanc.h
+ freetype/ftbitmap.h
+ freetype/ftxf86.h
++freetype.h
++ftcache.h
++ftglyph.h
++ftsynth.h
++ftoutln.h
++ttnameid.h
++tttables.h
++t1tables.h
++ftlcdfil.h
++ftsizes.h
++ftadvanc.h
++ftbitmap.h
++ftxf86.h
+ fribidi/fribidi.h
+ FSp_fopen.h
+ fstream
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/configure.in seamonkey-2.21-esr2.0/comm-release/mozilla/configure.in
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/configure.in	2013-12-18 21:26:22.759799445 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/configure.in	2013-12-18 21:16:00.810128859 +0400
+@@ -3939,7 +3939,7 @@
+     _USE_SYSTEM_NSS=1 )
+ 
+ if test -n "$_USE_SYSTEM_NSS"; then
+-    AM_PATH_NSS(3.15, [MOZ_NATIVE_NSS=1], [AC_MSG_ERROR([you don't have NSS installed or your version is too old])])
++    AM_PATH_NSS(3.15.3.1, [MOZ_NATIVE_NSS=1], [AC_MSG_ERROR([you don't have NSS installed or your version is too old])])
+ fi
+ 
+ if test -n "$MOZ_NATIVE_NSS"; then
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/configure seamonkey-2.21-esr2.0/comm-release/mozilla/configure
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/configure	2013-12-18 21:26:22.758799462 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/configure	2013-12-18 21:16:00.813128911 +0400
+@@ -15219,7 +15219,7 @@
+   echo "$ac_t""no" 1>&6
+ fi
+ 
+-	min_nss_version=3.15
++	min_nss_version=3.15.3.1
+ 	echo $ac_n "checking for NSS - version >= $min_nss_version""... $ac_c" 1>&6
+ echo "configure:15225: checking for NSS - version >= $min_nss_version" >&5
+ 
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/content/base/src/Element.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/content/base/src/Element.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/content/base/src/Element.cpp	2013-09-16 22:26:27.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/content/base/src/Element.cpp	2013-12-18 21:16:00.815128859 +0400
+@@ -1230,7 +1230,9 @@
+       nsIDocument::UnlockPointer();
+     }
+     if (GetParent()) {
+-      NS_RELEASE(mParent);
++      nsINode* p = mParent;
++      mParent = nullptr;
++      NS_RELEASE(p);
+     } else {
+       mParent = nullptr;
+     }
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/content/events/src/nsEventListenerManager.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/content/events/src/nsEventListenerManager.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/content/events/src/nsEventListenerManager.cpp	2013-12-18 21:26:17.973879432 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/content/events/src/nsEventListenerManager.cpp	2013-12-18 21:16:00.816128833 +0400
+@@ -888,6 +888,7 @@
+     JS::Rooted<JSObject*> boundHandler(cx);
+     JS::Rooted<JSObject*> scope(cx, listener->GetEventScope());
+     context->BindCompiledEventHandler(mTarget, scope, handler, &boundHandler);
++    aListenerStruct = nullptr;
+     if (!boundHandler) {
+       listener->ForgetHandler();
+     } else if (listener->EventName() == nsGkAtoms::onerror && win) {
+@@ -910,12 +911,12 @@
+ 
+ nsresult
+ nsEventListenerManager::HandleEventSubType(nsListenerStruct* aListenerStruct,
+-                                           const EventListenerHolder& aListener,
+                                            nsIDOMEvent* aDOMEvent,
+                                            EventTarget* aCurrentTarget,
+                                            nsCxPusher* aPusher)
+ {
+   nsresult result = NS_OK;
++  EventListenerHolder listener(aListenerStruct->mListener);  // strong ref
+ 
+   // If this is a script handler and we haven't yet
+   // compiled the event handler itself
+@@ -926,18 +927,19 @@
+                                          jslistener->GetEventContext() !=
+                                            aPusher->GetCurrentScriptContext(),
+                                          nullptr);
++    aListenerStruct = nullptr;
+   }
+ 
+   if (NS_SUCCEEDED(result)) {
+     nsAutoMicroTask mt;
+     // nsIDOMEvent::currentTarget is set in nsEventDispatcher.
+-    if (aListener.HasWebIDLCallback()) {
++    if (listener.HasWebIDLCallback()) {
+       ErrorResult rv;
+-      aListener.GetWebIDLCallback()->
++      listener.GetWebIDLCallback()->
+         HandleEvent(aCurrentTarget, *(aDOMEvent->InternalDOMEvent()), rv);
+       result = rv.ErrorCode();
+     } else {
+-      result = aListener.GetXPCOMCallback()->HandleEvent(aDOMEvent);
++      result = listener.GetXPCOMCallback()->HandleEvent(aDOMEvent);
+     }
+   }
+ 
+@@ -1007,9 +1009,8 @@
+             continue;
+           }
+ 
+-          EventListenerHolder kungFuDeathGrip(ls->mListener);
+-          if (NS_FAILED(HandleEventSubType(ls, ls->mListener, *aDOMEvent,
+-                                           aCurrentTarget, aPusher))) {
++          if (NS_FAILED(HandleEventSubType(ls, *aDOMEvent, aCurrentTarget,
++                                           aPusher))) {
+             aEvent->mFlags.mExceptionHasBeenRisen = true;
+           }
+         }
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/content/events/src/nsEventListenerManager.h seamonkey-2.21-esr2.0/comm-release/mozilla/content/events/src/nsEventListenerManager.h
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/content/events/src/nsEventListenerManager.h	2013-09-16 22:26:28.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/content/events/src/nsEventListenerManager.h	2013-12-18 21:16:00.816128833 +0400
+@@ -414,7 +414,6 @@
+                            nsCxPusher* aPusher);
+ 
+   nsresult HandleEventSubType(nsListenerStruct* aListenerStruct,
+-                              const mozilla::dom::EventListenerHolder& aListener,
+                               nsIDOMEvent* aDOMEvent,
+                               mozilla::dom::EventTarget* aCurrentTarget,
+                               nsCxPusher* aPusher);
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/dom/bindings/BindingUtils.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/dom/bindings/BindingUtils.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/dom/bindings/BindingUtils.cpp	2013-09-16 22:26:30.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/dom/bindings/BindingUtils.cpp	2013-12-18 21:16:00.816128833 +0400
+@@ -1604,20 +1604,9 @@
+   if (ww != aObj) {
+     MOZ_ASSERT(cache->HasSystemOnlyWrapper());
+ 
+-    JS::RootedObject newwrapper(aCx,
+-      xpc::WrapperFactory::WrapSOWObject(aCx, newobj));
+-    if (!newwrapper) {
++    // Oops. We don't support transplanting objects with SOWs anymore.
+       MOZ_CRASH();
+-    }
+-
+-    // Ok, now we do the special object-plus-wrapper transplant.
+-    ww = xpc::TransplantObjectWithWrapper(aCx, aObj, ww, newobj, newwrapper);
+-    if (!ww) {
+-      MOZ_CRASH();
+-    }
+ 
+-    aObj = newobj;
+-    SetSystemOnlyWrapperSlot(aObj, JS::ObjectValue(*ww));
+   } else {
+     aObj = xpc::TransplantObject(aCx, aObj, newobj);
+     if (!aObj) {
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/dom/workers/RuntimeService.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/dom/workers/RuntimeService.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/dom/workers/RuntimeService.cpp	2013-09-16 22:26:33.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/dom/workers/RuntimeService.cpp	2013-12-18 21:16:00.817128807 +0400
+@@ -829,6 +829,9 @@
+   JS_SetGCZeal(workerCx, settings.gcZeal, settings.gcZealFrequency);
+ #endif
+ 
++  JS_SetDestroyZoneCallback(runtime, XPCStringConvert::FreeZoneCache);
++  JS_SetSweepZoneCallback(runtime, XPCStringConvert::ClearZoneCache);
++
+   return workerCx;
+ }
+ 
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/image/test/mochitest/Makefile.in seamonkey-2.21-esr2.0/comm-release/mozilla/image/test/mochitest/Makefile.in
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/image/test/mochitest/Makefile.in	2013-09-16 22:26:35.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/image/test/mochitest/Makefile.in	2013-12-18 21:16:00.817128807 +0400
+@@ -71,6 +71,22 @@
+ 		test_short_gif_header.html \
+                 INT32_MIN.bmp \
+                 test_bug865919.html \
++                test_animation_operators.html \
++                bug900200.png \
++                bug900200-ref.png \
++                clear.gif \
++                clear.png \
++                clear2.gif \
++                clear2-results.gif \
++                green.png \
++                green-background.html \
++                grey.png \
++                keep.gif \
++                keep.png \
++                restore-previous.gif \
++                restore-previous.png \
++                source.png \
++                over.png \
+                 $(NULL)
+ 
+ # Tests disabled due to intermittent orange
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/image/test/mochitest/green-background.html seamonkey-2.21-esr2.0/comm-release/mozilla/image/test/mochitest/green-background.html
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/image/test/mochitest/green-background.html	1970-01-01 03:00:00.000000000 +0300
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/image/test/mochitest/green-background.html	2013-12-18 21:16:00.817128807 +0400
+@@ -0,0 +1,28 @@
++<!DOCTYPE HTML>
++<html>
++<head>
++<title>Background color wrapper for clear image tests</title>
++<style>
++img {
++  background-color: rgb(0, 255, 0);
++}
++</style>
++</head>
++<body>
++<img id="image1">
++<script>
++// Loads an externally specified image and displays it
++// with a green background. Intended for use with tests
++// involving clear images.
++
++// Use as "green-background.html?image.png".
++
++// Get the image URL.
++var imgURL = document.location.search.substr(1);
++
++// Load it.
++var img = document.images[0];
++img.src = imgURL;
++</script>
++</body>
++</html>
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/image/test/mochitest/test_animation_operators.html seamonkey-2.21-esr2.0/comm-release/mozilla/image/test/mochitest/test_animation_operators.html
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/image/test/mochitest/test_animation_operators.html	1970-01-01 03:00:00.000000000 +0300
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/image/test/mochitest/test_animation_operators.html	2013-12-18 21:16:00.817128807 +0400
+@@ -0,0 +1,157 @@
++<!DOCTYPE HTML>
++<html>
++<!--
++https://bugzilla.mozilla.org/show_bug.cgi?id=936720
++-->
++<head>
++  <title>Test for Bug 936720</title>
++  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="application/javascript" src="/tests/SimpleTest/WindowSnapshot.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=936720">Mozilla Bug 936720</a>
++<pre id="test">
++<script type="application/javascript">
++
++/** Test for Bug 936720 **/
++
++// Because there is no event telling us when an animated image finishes
++// animating, tests for the operators used by animated GIFs and PNGs
++// require that we poll until we get the correct result. A fixed timeout
++// can easily result in intermittent failures on tests running in VMs.
++
++// (Note that we do _not_ poll the reference, so it must not be animated.)
++
++var gTests = [
++  // IMPORTANT NOTE: For these tests, the test and reference are not
++  // snapshotted in the same way.  The REFERENCE (second file) is
++  // assumed to be complete when loaded, but we poll the TEST
++  // (first file) until the test passes.
++
++  // Tests of the allowed disposal operators for both GIF and APNG: keep, clear,
++  // and restore previous.
++  "== green-background.html?clear.gif green.png",
++  "== green-background.html?clear.png green.png",
++  "== keep.gif green.png",
++  "== keep.png green.png",
++  "== restore-previous.gif green.png",
++  "== restore-previous.png green.png",
++
++  // Tests of the blending/compositing operators that only APNG supports.
++  "== over.png grey.png",
++  "!= source.png grey.png",
++  "== bug900200.png bug900200-ref.png",
++
++  // Test of subframe updates.
++  "== clear2.gif clear2-results.gif",
++];
++
++// Maintain a reference count of how many things we're waiting for until
++// we can say the tests are done.
++var gDelayCount = 0;
++function AddFinishDependency()
++  { ++gDelayCount; }
++function RemoveFinishDependency()
++  { if (--gDelayCount == 0) SimpleTest.finish(); }
++
++// We record the maximum number of times we had to look at a test before
++// it switched to the passing state (though we assume it's 10 to start
++// rather than 0 so that we have a reasonable default).  Then we make a
++// test "time out" if it takes more than gTimeoutFactor times that
++// amount of time.  This allows us to report a test failure rather than
++// making a test failure just show up as a timeout.
++var gMaxPassingTries = 10;
++var gTimeoutFactor = 10;
++
++function takeSnapshot(iframe_element)
++{
++  return snapshotWindow(iframe_element.contentWindow, false);
++}
++
++function passes(op, shot1, shot2)
++{
++  var [correct, s1, s2] = compareSnapshots(shot1, shot2, op == "==");
++  return correct;
++}
++
++function startTest(i)
++{
++  var testLine = gTests[i];
++  var splitData = testLine.split(" ");
++  var testData =
++    { op: splitData[0], test: splitData[1], reference: splitData[2] };
++  var tries = 0;
++
++  // Maintain state specific to this test in the closure exposed to all
++  // the functions nested inside this one.
++
++  function startIframe(url)
++  {
++    var element = document.createElement("iframe");
++    element.addEventListener("load", handleLoad, false);
++    // Smaller than normal reftests, but enough for these.
++    element.setAttribute("style", "width: 100px; height: 100px");
++    element.setAttribute("frameborder", "0");
++    element.setAttribute("scrolling", "no");
++    element.src = url;
++    document.body.appendChild(element);
++    function handleLoad(event)
++    {
++      iframe.loaded = true;
++      if (iframe == reference) {
++        reference.snapshot = takeSnapshot(element);
++      }
++      var other = (iframe == test) ? reference : test;
++      if (other.loaded) {
++        setTimeout(checkTest, 100);
++      }
++    }
++    function checkTest()
++    {
++      var test_snapshot = takeSnapshot(test.element);
++      if (passes(testData.op, test_snapshot, reference.snapshot)) {
++        if (tries > gMaxPassingTries) {
++          gMaxPassingTries = tries;
++        }
++        report(true);
++      } else {
++        ++tries;
++        if (tries > gMaxPassingTries * gTimeoutFactor) {
++          info("Giving up after " + tries + " tries, " +
++               "maxp=" + gMaxPassingTries +
++               "fact=" + gTimeoutFactor);
++          report(false);
++        } else {
++          // The animation might not have finished.  Try again in 100ms.
++          setTimeout(checkTest, 100);
++        }
++      }
++    }
++    function report(result)
++    {
++      ok(result, "(" + i + ") " +
++                 testData.op + " " + testData.test + " " + testData.reference);
++      RemoveFinishDependency();
++    }
++    var iframe = { element: element, loaded: false };
++
++    return iframe;
++  }
++
++  AddFinishDependency();
++  var test = startIframe(testData.test);
++  var reference = startIframe(testData.reference);
++}
++
++SimpleTest.waitForExplicitFinish();
++
++// Run the tests.
++for (var i = 0; i < gTests.length; ++i) {
++  startTest(i);
++}
++
++</script>
++</pre>
++</body>
++</html>
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/image/test/reftest/animated/delay-test.html seamonkey-2.21-esr2.0/comm-release/mozilla/image/test/reftest/animated/delay-test.html
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/image/test/reftest/animated/delay-test.html	2013-09-16 22:26:35.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/image/test/reftest/animated/delay-test.html	1970-01-01 03:00:00.000000000 +0300
+@@ -1,46 +0,0 @@
+-<!DOCTYPE HTML>
+-<html class="reftest-wait">
+-<head>
+-<title>Delayed image reftest wrapper + background colour</title>
+-<style>
+-img {
+-  background-color: rgb(0, 255, 0);
+-}
+-</style>
+-</head>
+-<body>
+-<img id="image1">
+-<script>
+-// This loads a externally specified image, forces a draw (in case of
+-// decode-on-draw), waits, and then triggers the reftest snapshot.
+-// This allows the animation on the page to complete.
+-//
+-// Use as "delaytest.html?animation.png"
+-//
+-
+-// Get the image URL from our URL
+-var imgURL = document.location.search.substr(1);
+-
+-// Load the image
+-var img = document.images[0];
+-img.src = imgURL;
+-img.onload = forceDecode;
+-
+-function forceDecode() {
+-
+-  // We need to force drawing of the image in an invisible context
+-  var canvas = document.createElement("canvas");
+-  var ctx = canvas.getContext("2d");
+-  ctx.drawImage(img, 0, 0);
+-
+-  // We've force the decode. start the timer to trigger the reftest
+-  startTimer();
+-}
+-
+-function startTimer() {
+-  const delay = 1000;
+-  setTimeout("document.documentElement.className = '';", delay);
+-}
+-</script>
+-</body>
+-</html>
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/image/test/reftest/animated/no-delay-test.html seamonkey-2.21-esr2.0/comm-release/mozilla/image/test/reftest/animated/no-delay-test.html
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/image/test/reftest/animated/no-delay-test.html	2013-09-16 22:26:35.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/image/test/reftest/animated/no-delay-test.html	1970-01-01 03:00:00.000000000 +0300
+@@ -1,40 +0,0 @@
+-<!DOCTYPE HTML>
+-<html class="reftest-wait">
+-<head>
+-<title>Delayed image reftest wrapper + background colour</title>
+-<style>
+-img {
+-  background-color: rgb(0, 255, 0);
+-}
+-</style>
+-</head>
+-<body>
+-<img id="image1">
+-<script>
+-// This loads a externally specified image, forces a draw (in case of
+-// decode-on-draw), and then triggers the reftest snapshot.
+-//
+-// Use as "nodelaytest.html?animation.png"
+-//
+-
+-// Get the image URL from our URL
+-var imgURL = document.location.search.substr(1);
+-
+-// Load the image
+-var img = document.images[0];
+-img.src = imgURL;
+-img.onload = forceDecode;
+-
+-function forceDecode() {
+-
+-  // We need to force drawing of the image in an invisible context
+-  var canvas = document.createElement("canvas");
+-  var ctx = canvas.getContext("2d");
+-  ctx.drawImage(img, 0, 0);
+-
+-  // We've force the decode. trigger the reftest
+-  setTimeout("document.documentElement.className = '';", 0);
+-}
+-</script>
+-</body>
+-</html>
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/image/test/reftest/animated/reftest.list seamonkey-2.21-esr2.0/comm-release/mozilla/image/test/reftest/animated/reftest.list
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/image/test/reftest/animated/reftest.list	2013-09-16 22:26:35.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/image/test/reftest/animated/reftest.list	1970-01-01 03:00:00.000000000 +0300
+@@ -1,16 +0,0 @@
+-# Tests of the allowed disposal operators for both GIF and APNG: keep, clear,
+-# and restore previous.
+-== delay-test.html?clear.gif no-delay-test.html?green.png
+-== delay-test.html?clear.png no-delay-test.html?green.png
+-== delay-test.html?keep.gif no-delay-test.html?green.png
+-== delay-test.html?keep.png no-delay-test.html?green.png
+-== delay-test.html?restore-previous.gif no-delay-test.html?green.png
+-== delay-test.html?restore-previous.png no-delay-test.html?green.png
+-
+-# Test of the blending/compositing operator that only APNG supports.
+-== delay-test.html?over.png no-delay-test.html?grey.png
+-!= delay-test.html?source.png no-delay-test.html?grey.png
+-== delay-test.html?bug900200.png no-delay-test.html?bug900200-ref.png
+-
+-# Test of subframe updates
+-== delay-test.html?clear2.gif no-delay-test.html?clear2-results.gif
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/image/test/reftest/reftest.list seamonkey-2.21-esr2.0/comm-release/mozilla/image/test/reftest/reftest.list
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/image/test/reftest/reftest.list	2013-09-16 22:26:36.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/image/test/reftest/reftest.list	2013-12-18 21:16:00.818128781 +0400
+@@ -48,6 +48,3 @@
+ 
+ # WBMP tests
+ #skip-if(!B2G) include wbmp/reftest.list # bug 852053
+-
+-# Animated image disposal and blending operator tests
+-include animated/reftest.list
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/public/GCAPI.h seamonkey-2.21-esr2.0/comm-release/mozilla/js/public/GCAPI.h
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/public/GCAPI.h	2013-09-16 22:26:39.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/public/GCAPI.h	2013-12-18 21:16:00.818128781 +0400
+@@ -8,6 +8,7 @@
+ #define js_GCAPI_h
+ 
+ #include "HeapAPI.h"
++#include "jsfriendapi.h"
+ 
+ namespace JS {
+ 
+@@ -289,6 +290,31 @@
+         ExposeGCThingToActiveJS(v.toGCThing(), v.gcKind());
+ }
+ 
++/*
++ * If a GC is currently marking, mark the object black.
++ */
++static JS_ALWAYS_INLINE void
++MarkGCThingAsLive(JSRuntime *rt_, void *thing, JSGCTraceKind kind)
++{
++    shadow::Runtime *rt = reinterpret_cast<JS::shadow::Runtime*>(rt_);
++
++#ifdef JSGC_GENERATIONAL
++    /*
++     * Any object in the nursery will not be freed during any GC running at that time.
++     */
++    if (js::gc::IsInsideNursery(rt, thing))
++        return;
++#endif
++    if (IsIncrementalBarrierNeededOnGCThing(rt, thing, kind))
++        IncrementalReferenceBarrier(thing, kind);
++}
++
++static JS_ALWAYS_INLINE void
++MarkStringAsLive(JSContext *cx, JSString *string)
++{
++    MarkGCThingAsLive(js::GetRuntime(cx), string, JSTRACE_STRING);
++}
++
+ } /* namespace JS */
+ 
+ #endif /* js_GCAPI_h */
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/build/cl.py seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/build/cl.py
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/build/cl.py	2013-09-16 22:26:39.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/build/cl.py	2013-12-18 21:16:00.818128781 +0400
+@@ -2,12 +2,46 @@
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ 
++import ctypes
+ import os, os.path
+ import subprocess
+ import sys
+ 
+ CL_INCLUDES_PREFIX = os.environ.get("CL_INCLUDES_PREFIX", "Note: including file:")
+ 
++GetShortPathName = ctypes.windll.kernel32.GetShortPathNameW
++GetLongPathName = ctypes.windll.kernel32.GetLongPathNameW
++
++
++# cl.exe likes to print inconsistent paths in the showIncludes output
++# (some lowercased, some not, with different directions of slashes),
++# and we need the original file case for make/pymake to be happy.
++# As this is slow and needs to be called a lot of times, use a cache
++# to speed things up.
++_normcase_cache = {}
++
++def normcase(path):
++    # Get*PathName want paths with backslashes
++    path = path.replace('/', os.sep)
++    dir = os.path.dirname(path)
++    # name is fortunately always going to have the right case,
++    # so we can use a cache for the directory part only.
++    name = os.path.basename(path)
++    if dir in _normcase_cache:
++        result = _normcase_cache[dir]
++    else:
++        path = ctypes.create_unicode_buffer(dir)
++        length = GetShortPathName(path, None, 0)
++        shortpath = ctypes.create_unicode_buffer(length)
++        GetShortPathName(path, shortpath, length)
++        length = GetLongPathName(shortpath, None, 0)
++        if length > len(path):
++            path = ctypes.create_unicode_buffer(length)
++        GetLongPathName(shortpath, path, length)
++        result = _normcase_cache[dir] = path.value
++    return os.path.join(result, name)
++
++
+ def InvokeClWithDependencyGeneration(cmdline):
+     target = ""
+     # Figure out what the target is
+@@ -19,13 +53,17 @@
+     if target == None:
+         print >>sys.stderr, "No target set" and sys.exit(1)
+ 
++    # Assume the source file is the last argument
++    source = cmdline[-1]
++    assert not source.startswith('-')
++
+     # The deps target lives here
+     depstarget = os.path.basename(target) + ".pp"
+ 
+     cmdline += ['-showIncludes']
+     cl = subprocess.Popen(cmdline, stdout=subprocess.PIPE)
+ 
+-    deps = set()
++    deps = set([normcase(source).replace(os.sep, '/')])
+     for line in cl.stdout:
+         # cl -showIncludes prefixes every header with "Note: including file:"
+         # and an indentation corresponding to the depth (which we don't need)
+@@ -34,8 +72,9 @@
+             # We can't handle pathes with spaces properly in mddepend.pl, but
+             # we can assume that anything in a path with spaces is a system
+             # header and throw it away.
+-            if dep.find(' ') == -1:
+-                deps.add(dep)
++            dep = normcase(dep)
++            if ' ' not in dep:
++                deps.add(dep.replace(os.sep, '/'))
+         else:
+             sys.stdout.write(line) # Make sure we preserve the relevant output
+                                    # from cl
+@@ -54,10 +93,13 @@
+                  # cost of masking failure to create the directory.  We'll just
+                  # die on the next line though, so it's not that much of a loss.
+ 
+-    f = open(depstarget, "w")
++    with open(depstarget, "w") as f:
++        f.write("%s: %s" % (target, source))
++        for dep in sorted(deps):
++            f.write(" \\\n%s" % dep)
++        f.write('\n')
+     for dep in sorted(deps):
+-        print >>f, "%s: %s" % (target, dep)
+-        print >>f, "%s:" % dep
++            f.write("%s:\n" % dep)
+ 
+ if __name__ == "__main__":
+     InvokeClWithDependencyGeneration(sys.argv[1:])
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/config/milestone.txt seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/config/milestone.txt
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/config/milestone.txt	2013-12-18 21:26:22.760799428 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/config/milestone.txt	2013-12-18 21:16:00.819128755 +0400
+@@ -10,4 +10,4 @@
+ # hardcoded milestones in the tree from these two files.
+ #--------------------------------------------------------
+ 
+-24.1.1
++24.2.0
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/config/system-headers seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/config/system-headers
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/config/system-headers	2013-09-16 22:26:39.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/config/system-headers	2013-12-18 21:16:00.819128755 +0400
+@@ -413,6 +413,19 @@
+ freetype/ftadvanc.h
+ freetype/ftbitmap.h
+ freetype/ftxf86.h
++freetype.h
++ftcache.h
++ftglyph.h
++ftsynth.h
++ftoutln.h
++ttnameid.h
++tttables.h
++t1tables.h
++ftlcdfil.h
++ftsizes.h
++ftadvanc.h
++ftbitmap.h
++ftxf86.h
+ fribidi/fribidi.h
+ FSp_fopen.h
+ fstream
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/ctypes/CTypes.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/ctypes/CTypes.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/ctypes/CTypes.cpp	2013-09-16 22:26:39.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/ctypes/CTypes.cpp	2013-12-18 21:16:00.820128729 +0400
+@@ -4767,13 +4767,14 @@
+   // to get GC safety for free, since if anything in this function fails we
+   // do not want to mutate 'typeObj'.)
+   AutoPtr<FieldInfoHash> fields(cx->new_<FieldInfoHash>());
+-  Array<jsval, 16> fieldRootsArray;
+-  if (!fields || !fields->init(len) || !fieldRootsArray.appendN(JSVAL_VOID, len)) {
++  if (!fields || !fields->init(len)) {
+     JS_ReportOutOfMemory(cx);
+     return JS_FALSE;
+   }
+-  js::AutoArrayRooter fieldRoots(cx, fieldRootsArray.length(),
+-    fieldRootsArray.begin());
++
++  JS::AutoValueVector fieldRoots(cx);
++  if (!fieldRoots.resize(len))
++    return false;
+ 
+   // Process the field types.
+   size_t structSize, structAlign;
+@@ -4793,7 +4794,7 @@
+       Rooted<JSStableString*> name(cx, flat->ensureStable(cx));
+       if (!name)
+         return JS_FALSE;
+-      fieldRootsArray[i] = OBJECT_TO_JSVAL(fieldType);
++      fieldRoots[i] = OBJECT_TO_JSVAL(fieldType);
+ 
+       // Make sure each field name is unique
+       FieldInfoHash::AddPtr entryPtr = fields->lookupForAdd(name);
+@@ -5093,10 +5094,9 @@
+   size_t len = fields->count();
+ 
+   // Prepare a new array for the 'fields' property of the StructType.
+-  Array<jsval, 16> fieldsVec;
+-  if (!fieldsVec.appendN(JSVAL_VOID, len))
++  JS::AutoValueVector fieldsVec(cx);
++  if (!fieldsVec.resize(len))
+     return NULL;
+-  js::AutoArrayRooter root(cx, fieldsVec.length(), fieldsVec.begin());
+ 
+   for (FieldInfoHash::Range r = fields->all(); !r.empty(); r.popFront()) {
+     const FieldInfoHash::Entry& entry = r.front();
+@@ -5557,7 +5557,7 @@
+     return JS_FALSE;
+   }
+ 
+-  Array<jsval, 16> argTypes;
++  JS::AutoValueVector argTypes(cx);
+   RootedObject arrayObj(cx, NULL);
+ 
+   if (args.length() == 3) {
+@@ -5572,15 +5572,12 @@
+     uint32_t len;
+     ASSERT_OK(JS_GetArrayLength(cx, arrayObj, &len));
+ 
+-    if (!argTypes.appendN(JSVAL_VOID, len)) {
+-      JS_ReportOutOfMemory(cx);
++    if (!argTypes.resize(len))
+       return JS_FALSE;
+     }
+-  }
+ 
+   // Pull out the argument types from the array, if any.
+   JS_ASSERT(!argTypes.length() || arrayObj);
+-  js::AutoArrayRooter items(cx, argTypes.length(), argTypes.begin());
+   for (uint32_t i = 0; i < argTypes.length(); ++i) {
+     if (!JS_GetElement(cx, arrayObj, i, &argTypes[i]))
+       return JS_FALSE;
+@@ -5904,7 +5901,7 @@
+   size_t len = fninfo->mArgTypes.length();
+ 
+   // Prepare a new array.
+-  Array<jsval, 16> vec;
++  JS::AutoValueVector vec(cx);
+   if (!vec.resize(len))
+     return JS_FALSE;
+ 
+@@ -6159,13 +6156,10 @@
+   }
+ 
+   // Set up an array for converted arguments.
+-  Array<jsval, 16> argv;
+-  if (!argv.appendN(JSVAL_VOID, cif->nargs)) {
+-    JS_ReportOutOfMemory(cx);
++  JS::AutoValueVector argv(cx);
++  if (!argv.resize(cif->nargs))
+     return;
+-  }
+ 
+-  js::AutoArrayRooter roots(cx, argv.length(), argv.begin());
+   for (uint32_t i = 0; i < cif->nargs; ++i) {
+     // Convert each argument, and have any CData objects created depend on
+     // the existing buffers.
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/ctypes/CTypes.h seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/ctypes/CTypes.h
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/ctypes/CTypes.h	2013-09-16 22:26:39.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/ctypes/CTypes.h	2013-12-18 21:16:00.820128729 +0400
+@@ -6,6 +6,9 @@
+ #ifndef ctypes_CTypes_h
+ #define ctypes_CTypes_h
+ 
++#include "mozilla/Assertions.h"
++#include "mozilla/TypeTraits.h"
++
+ #include "jscntxt.h"
+ #include "jsapi.h"
+ #include "prlink.h"
+@@ -57,6 +60,8 @@
+ template<class T, size_t N = 0>
+ class Array : public Vector<T, N, SystemAllocPolicy>
+ {
++  MOZ_STATIC_ASSERT((!mozilla::IsSame<T, JS::Value>::value),
++                    "use JS::AutoValueVector instead");
+ };
+ 
+ // String and AutoString classes, based on Vector.
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/gc/Memory.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/gc/Memory.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/gc/Memory.cpp	2013-09-16 22:26:39.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/gc/Memory.cpp	2013-12-18 21:16:00.820128729 +0400
+@@ -144,7 +144,7 @@
+ }
+ 
+ static void *
+-gc::MapAlignedPagesRecursively(JSRuntime *rt, size_t size, size_t alignment, int& recursions)
++MapAlignedPagesRecursively(JSRuntime *rt, size_t size, size_t alignment, int& recursions)
+ {
+     if (++recursions >= OS2_MAX_RECURSIONS)
+         return NULL;
+@@ -310,6 +310,40 @@
+     rt->gcSystemPageSize = rt->gcSystemAllocGranularity = size_t(sysconf(_SC_PAGESIZE));
+ }
+ 
++static inline void *
++MapMemory(size_t length, int prot, int flags, int fd, off_t offset)
++{
++#if defined(__ia64__)
++    /*
++     * The JS engine assumes that all allocated pointers have their high 17 bits clear,
++     * which ia64's mmap doesn't support directly. However, we can emulate it by passing
++     * mmap an "addr" parameter with those bits clear. The mmap will return that address,
++     * or the nearest available memory above that address, providing a near-guarantee
++     * that those bits are clear. If they are not, we return NULL below to indicate
++     * out-of-memory.
++     *
++     * The addr is chosen as 0x0000070000000000, which still allows about 120TB of virtual
++     * address space.
++     *
++     * See Bug 589735 for more information.
++     */
++    void *region = mmap((void*)0x0000070000000000, length, prot, flags, fd, offset);
++    if (region == MAP_FAILED)
++        return MAP_FAILED;
++    /* 
++     * If the allocated memory doesn't have its upper 17 bits clear, consider it
++     * as out of memory.
++     */
++    if ((uintptr_t(region) + (length - 1)) & 0xffff800000000000) {
++        JS_ALWAYS_TRUE(0 == munmap(region, length));
++        return MAP_FAILED;
++    }
++    return region;
++#else
++    return mmap(NULL, length, prot, flags, fd, offset);
++#endif
++}
++
+ void *
+ gc::MapAlignedPages(JSRuntime *rt, size_t size, size_t alignment)
+ {
+@@ -323,12 +357,15 @@
+ 
+     /* Special case: If we want page alignment, no further work is needed. */
+     if (alignment == rt->gcSystemAllocGranularity) {
+-        return mmap(NULL, size, prot, flags, -1, 0);
++        void *region = MapMemory(size, prot, flags, -1, 0);
++        if (region == MAP_FAILED)
++            return NULL;
++        return region;
+     }
+ 
+     /* Overallocate and unmap the region's edges. */
+     size_t reqSize = Min(size + 2 * alignment, 2 * size);
+-    void *region = mmap(NULL, reqSize, prot, flags, -1, 0);
++    void *region = MapMemory(reqSize, prot, flags, -1, 0);
+     if (region == MAP_FAILED)
+         return NULL;
+ 
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/gc/Zone.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/gc/Zone.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/gc/Zone.cpp	2013-09-16 22:26:39.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/gc/Zone.cpp	2013-12-18 21:16:00.820128729 +0400
+@@ -37,6 +37,7 @@
+     maybeAlive(true),
+     gcMallocBytes(0),
+     gcGrayRoots(),
++    data(nullptr),
+     types(this)
+ {
+     /* Ensure that there are no vtables to mess us up here. */
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/gc/Zone.h seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/gc/Zone.h
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/gc/Zone.h	2013-09-16 22:26:39.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/gc/Zone.h	2013-12-18 21:16:00.820128729 +0400
+@@ -251,6 +251,9 @@
+     /* This compartment's gray roots. */
+     js::Vector<js::GrayRoot, 0, js::SystemAllocPolicy> gcGrayRoots;
+ 
++    /* Per-zone data for use by an embedder. */
++    void *data;
++
+     Zone(JSRuntime *rt);
+     ~Zone();
+     bool init(JSContext *cx);
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jit/BaselineIC.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jit/BaselineIC.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jit/BaselineIC.cpp	2013-09-16 22:26:40.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jit/BaselineIC.cpp	2013-12-18 21:16:00.821128703 +0400
+@@ -450,7 +450,10 @@
+         // We are removing edges from monitored stubs to gcthings (IonCode).
+         // Perform one final trace of all monitor stubs for incremental GC,
+         // as it must know about those edges.
+-        this->trace(zone->barrierTracer());
++        if (hasFallbackStub_) {
++            for (ICStub *s = firstMonitorStub_; !s->isTypeMonitor_Fallback(); s = s->next())
++                s->trace(zone->barrierTracer());
++        }
+     }
+ 
+     firstMonitorStub_ = this;
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jit/BaselineJIT.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jit/BaselineJIT.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jit/BaselineJIT.cpp	2013-09-16 22:26:40.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jit/BaselineJIT.cpp	2013-12-18 21:16:00.822128677 +0400
+@@ -383,6 +383,16 @@
+     }
+ }
+ 
++/* static */
++void
++BaselineScript::writeBarrierPre(Zone *zone, BaselineScript *script)
++{
++#ifdef JSGC_INCREMENTAL
++    if (zone->needsBarrier())
++        script->trace(zone->barrierTracer());
++#endif
++}
++
+ void
+ BaselineScript::Trace(JSTracer *trc, BaselineScript *script)
+ {
+@@ -829,8 +839,9 @@
+         return;
+     }
+ 
+-    BaselineScript::Destroy(fop, script->baselineScript());
++    BaselineScript *baseline = script->baselineScript();
+     script->setBaselineScript(NULL);
++    BaselineScript::Destroy(fop, baseline);
+ }
+ 
+ void
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jit/BaselineJIT.h seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jit/BaselineJIT.h
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jit/BaselineJIT.h	2013-09-16 22:26:40.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jit/BaselineJIT.h	2013-12-18 21:16:00.822128677 +0400
+@@ -254,6 +254,8 @@
+     static size_t offsetOfFlags() {
+         return offsetof(BaselineScript, flags_);
+     }
++
++    static void writeBarrierPre(Zone *zone, BaselineScript *script);
+ };
+ 
+ inline bool
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jit/CodeGenerator.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jit/CodeGenerator.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jit/CodeGenerator.cpp	2013-09-16 22:26:40.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jit/CodeGenerator.cpp	2013-12-18 21:16:00.822128677 +0400
+@@ -24,6 +24,8 @@
+ #include "vm/ForkJoin.h"
+ #include "ParallelArrayAnalysis.h"
+ 
++#include "jsscriptinlines.h"
++
+ #include "vm/Interpreter-inl.h"
+ #include "vm/StringObject-inl.h"
+ 
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jit/Ion.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jit/Ion.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jit/Ion.cpp	2013-09-16 22:26:40.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jit/Ion.cpp	2013-12-18 21:16:00.823128652 +0400
+@@ -44,6 +44,7 @@
+ #include "jscompartmentinlines.h"
+ #include "jsgcinlines.h"
+ #include "jsinferinlines.h"
++#include "jsscriptinlines.h"
+ 
+ #include "gc/Barrier-inl.h"
+ #include "vm/Stack-inl.h"
+@@ -688,6 +689,15 @@
+         gc::MarkScriptUnbarriered(trc, &callTargetList()[i], "callTarget");
+ }
+ 
++/* static */ void
++IonScript::writeBarrierPre(Zone *zone, IonScript *ionScript)
++{
++#ifdef JSGC_INCREMENTAL
++    if (zone->needsBarrier())
++        ionScript->trace(zone->barrierTracer());
++#endif
++}
++
+ void
+ IonScript::copySnapshots(const SnapshotWriter *writer)
+ {
+@@ -2165,18 +2175,9 @@
+         JSScript *script = co.script;
+         IonScript *ionScript = GetIonScript(script, executionMode);
+ 
+-        Zone *zone = script->zone();
+-        if (zone->needsBarrier()) {
+-            // We're about to remove edges from the JSScript to gcthings
+-            // embedded in the IonScript. Perform one final trace of the
+-            // IonScript for the incremental GC, as it must know about
+-            // those edges.
+-            IonScript::Trace(zone->barrierTracer(), ionScript);
+-        }
+-
++        SetIonScript(script, executionMode, NULL);
+         ionScript->detachDependentAsmJSModules(fop);
+         ionScript->decref(fop);
+-        SetIonScript(script, executionMode, NULL);
+         co.invalidate();
+ 
+         // Wait for the scripts to get warm again before doing another
+@@ -2234,6 +2235,13 @@
+ static void
+ FinishInvalidationOf(FreeOp *fop, JSScript *script, IonScript *ionScript, bool parallel)
+ {
++    // In all cases, NULL out script->ion or script->parallelIon to avoid
++    // re-entry.
++    if (parallel)
++        script->setParallelIonScript(NULL);
++    else
++        script->setIonScript(NULL);
++
+     // If this script has Ion code on the stack, invalidation() will return
+     // true. In this case we have to wait until destroying it.
+     if (!ionScript->invalidated()) {
+@@ -2242,13 +2250,6 @@
+ 
+         jit::IonScript::Destroy(fop, ionScript);
+     }
+-
+-    // In all cases, NULL out script->ion or script->parallelIon to avoid
+-    // re-entry.
+-    if (parallel)
+-        script->setParallelIonScript(NULL);
+-    else
+-        script->setIonScript(NULL);
+ }
+ 
+ void
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jit/IonCaches.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jit/IonCaches.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jit/IonCaches.cpp	2013-09-16 22:26:40.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jit/IonCaches.cpp	2013-12-18 21:16:00.823128652 +0400
+@@ -2478,6 +2478,39 @@
+     return linkAndAttachStub(cx, masm, attacher, ion, "ArgsObj element (normal)");
+ }
+ 
++static bool
++ShouldAttachGetElemTypedArray(JSObject *obj, const Value &idval,
++                              TypedOrValueRegister output)
++{
++    if (!obj->isTypedArray())
++        return false;
++
++    if (!idval.isInt32() && !idval.isString())
++        return false;
++
++    // Don't emit a stub if the access is out of bounds. We make to make
++    // certain that we monitor the type coming out of the typed array when
++    // we generate the stub. Out of bounds accesses will hit the fallback
++    // path.
++    uint32_t index;
++    if (idval.isInt32()) {
++        index = idval.toInt32();
++    } else {
++        index = GetIndexFromString(idval.toString());
++        if (index == UINT32_MAX)
++            return false;
++    }
++    if (index >= TypedArray::length(obj))
++        return false;
++
++    // The output register is not yet specialized as a float register, the only
++    // way to accept float typed arrays for now is to return a Value type.
++    int arrayType = TypedArray::type(obj);
++    bool floatOutput = arrayType == TypedArray::TYPE_FLOAT32 ||
++                       arrayType == TypedArray::TYPE_FLOAT64;
++    return !floatOutput || output.hasValue();
++}
++
+ bool
+ GetElementIC::update(JSContext *cx, size_t cacheIndex, HandleObject obj,
+                      HandleValue idval, MutableHandleValue res)
+@@ -2531,21 +2564,12 @@
+                 return false;
+             attachedStub = true;
+         }
+-        if (!attachedStub && obj->isTypedArray()) {
+-            if ((idval.isInt32()) ||
+-                (idval.isString() && GetIndexFromString(idval.toString()) != UINT32_MAX))
+-            {
+-                int arrayType = TypedArray::type(obj);
+-                bool floatOutput = arrayType == TypedArray::TYPE_FLOAT32 ||
+-                                   arrayType == TypedArray::TYPE_FLOAT64;
+-                if (!floatOutput || cache.output().hasValue()) {
++        if (!attachedStub && ShouldAttachGetElemTypedArray(obj, idval, cache.output())) {
+                     if (!cache.attachTypedArrayElement(cx, ion, obj, idval))
+                         return false;
+                     attachedStub = true;
+                 }
+             }
+-        }
+-    }
+ 
+     if (!GetElementOperation(cx, JSOp(*pc), &lval, idval, res))
+         return false;
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jit/IonCode.h seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jit/IonCode.h
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jit/IonCode.h	2013-12-18 21:26:18.611868784 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jit/IonCode.h	2013-12-18 21:16:00.824128627 +0400
+@@ -512,6 +512,8 @@
+     void resetOsrPcMismatchCounter() {
+         osrPcMismatchCounter_ = 0;
+     }
++
++    static void writeBarrierPre(Zone *zone, IonScript *ionScript);
+ };
+ 
+ // Execution information for a basic block which may persist after the
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jit/x86/Assembler-x86.h seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jit/x86/Assembler-x86.h
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jit/x86/Assembler-x86.h	2013-09-16 22:26:40.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jit/x86/Assembler-x86.h	2013-12-18 21:16:00.824128627 +0400
+@@ -13,8 +13,6 @@
+ #include "jit/IonCode.h"
+ #include "mozilla/Util.h"
+ 
+-#include "jsscriptinlines.h"
+-
+ namespace js {
+ namespace jit {
+ 
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jsapi.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jsapi.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jsapi.cpp	2013-09-16 22:26:40.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jsapi.cpp	2013-12-18 21:16:00.824128627 +0400
+@@ -708,6 +708,8 @@
+     interpreterFrames(NULL),
+     cxCallback(NULL),
+     destroyCompartmentCallback(NULL),
++    destroyZoneCallback(NULL),
++    sweepZoneCallback(NULL),
+     compartmentNameCallback(NULL),
+     activityCallback(NULL),
+     activityCallbackArg(NULL),
+@@ -1392,6 +1394,18 @@
+ }
+ 
+ JS_PUBLIC_API(void)
++JS_SetDestroyZoneCallback(JSRuntime *rt, JSZoneCallback callback)
++{
++    rt->destroyZoneCallback = callback;
++}
++
++JS_PUBLIC_API(void)
++JS_SetSweepZoneCallback(JSRuntime *rt, JSZoneCallback callback)
++{
++    rt->sweepZoneCallback = callback;
++}
++
++JS_PUBLIC_API(void)
+ JS_SetCompartmentNameCallback(JSRuntime *rt, JSCompartmentNameCallback callback)
+ {
+     rt->compartmentNameCallback = callback;
+@@ -1471,6 +1485,18 @@
+     return compartment->data;
+ }
+ 
++JS_PUBLIC_API(void)
++JS_SetZoneUserData(JS::Zone *zone, void *data)
++{
++    zone->data = data;
++}
++
++JS_PUBLIC_API(void *)
++JS_GetZoneUserData(JS::Zone *zone)
++{
++    return zone->data;
++}
++
+ JS_PUBLIC_API(JSBool)
+ JS_WrapObject(JSContext *cx, JSObject **objp)
+ {
+@@ -1604,92 +1630,6 @@
+ }
+ 
+ /*
+- * Some C++ objects (such as the location object and XBL) require both an XPConnect
+- * reflector and a security wrapper for that reflector. We expect that there are
+- * no live references to the reflector, so when we perform the transplant we turn
+- * the security wrapper into a cross-compartment wrapper. Just in case there
+- * happen to be live references to the reflector, we swap it out to limit the harm.
+- */
+-JS_FRIEND_API(JSObject *)
+-js_TransplantObjectWithWrapper(JSContext *cx,
+-                               HandleObject origobj,
+-                               HandleObject origwrapper,
+-                               HandleObject targetobj,
+-                               HandleObject targetwrapper)
+-{
+-    AutoMaybeTouchDeadZones agc(cx);
+-    AutoDisableProxyCheck adpc(cx->runtime());
+-
+-    AssertHeapIsIdle(cx);
+-    JS_ASSERT(!IsCrossCompartmentWrapper(origobj));
+-    JS_ASSERT(!IsCrossCompartmentWrapper(origwrapper));
+-    JS_ASSERT(!IsCrossCompartmentWrapper(targetobj));
+-    JS_ASSERT(!IsCrossCompartmentWrapper(targetwrapper));
+-
+-    RootedObject newWrapper(cx);
+-    JSCompartment *destination = targetobj->compartment();
+-
+-    // |origv| is the map entry we're looking up. The map entries are going to
+-    // be for |origobj|, not |origwrapper|.
+-    Value origv = ObjectValue(*origobj);
+-
+-    // There might already be a wrapper for the original object in the new
+-    // compartment.
+-    if (WrapperMap::Ptr p = destination->lookupWrapper(origv)) {
+-        // There is. Make the existing cross-compartment wrapper a same-
+-        // compartment wrapper.
+-        newWrapper = &p->value.toObject();
+-
+-        // When we remove origv from the wrapper map, its wrapper, newWrapper,
+-        // must immediately cease to be a cross-compartment wrapper. Neuter it.
+-        destination->removeWrapper(p);
+-        NukeCrossCompartmentWrapper(cx, newWrapper);
+-
+-        if (!JSObject::swap(cx, newWrapper, targetwrapper))
+-            MOZ_CRASH();
+-    } else {
+-        // Otherwise, use the passed-in wrapper as the same-compartment wrapper.
+-        newWrapper = targetwrapper;
+-    }
+-
+-    // Now, iterate through other scopes looking for references to the old
+-    // object. Note that the entries in the maps are for |origobj| and not
+-    // |origwrapper|. They need to be updated to point at the new object.
+-    if (!RemapAllWrappersForObject(cx, origobj, targetobj))
+-        MOZ_CRASH();
+-
+-    // Lastly, update things in the original compartment. Our invariants dictate
+-    // that the original compartment can only have one cross-compartment wrapper
+-    // to the new object. So we choose to update |origwrapper|, not |origobj|,
+-    // since there are probably no live direct intra-compartment references to
+-    // |origobj|.
+-    {
+-        AutoCompartment ac(cx, origobj);
+-
+-        // We can't be sure that the reflector is completely dead. This is bad,
+-        // because it is in a weird state. To minimize potential harm we create
+-        // a new unreachable dummy object and swap it with the reflector.
+-        // After the swap we have a possibly-live object that isn't dangerous,
+-        // and a possibly-dangerous object that isn't live.
+-        RootedObject reflectorGuts(cx, NewDeadProxyObject(cx, JS_GetGlobalForObject(cx, origobj)));
+-        if (!reflectorGuts || !JSObject::swap(cx, origobj, reflectorGuts))
+-            MOZ_CRASH();
+-
+-        // Turn origwrapper into a CCW to the new object.
+-        RootedObject wrapperGuts(cx, targetobj);
+-        if (!JS_WrapObject(cx, wrapperGuts.address()))
+-            MOZ_CRASH();
+-        JS_ASSERT(Wrapper::wrappedObject(wrapperGuts) == targetobj);
+-        if (!JSObject::swap(cx, origwrapper, wrapperGuts))
+-            MOZ_CRASH();
+-        origwrapper->compartment()->putWrapper(ObjectValue(*targetobj),
+-                                               ObjectValue(*origwrapper));
+-    }
+-
+-    return newWrapper;
+-}
+-
+-/*
+  * Recompute all cross-compartment wrappers for an object, resetting state.
+  * Gecko uses this to clear Xray wrappers when doing a navigation that reuses
+  * the inner window and global object.
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jsapi.h seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jsapi.h
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jsapi.h	2013-12-18 21:26:18.612868768 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jsapi.h	2013-12-18 21:16:00.825128601 +0400
+@@ -534,7 +534,7 @@
+     MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
+ };
+ 
+-class AutoValueVector : public AutoVectorRooter<Value>
++class MOZ_STACK_CLASS AutoValueVector : public AutoVectorRooter<Value>
+ {
+   public:
+     explicit AutoValueVector(JSContext *cx
+@@ -1092,6 +1092,9 @@
+ (* JSDestroyCompartmentCallback)(JSFreeOp *fop, JSCompartment *compartment);
+ 
+ typedef void
++(* JSZoneCallback)(JS::Zone *zone);
++
++typedef void
+ (* JSCompartmentNameCallback)(JSRuntime *rt, JSCompartment *compartment,
+                               char *buf, size_t bufsize);
+ 
+@@ -1981,6 +1984,12 @@
+ JS_SetDestroyCompartmentCallback(JSRuntime *rt, JSDestroyCompartmentCallback callback);
+ 
+ extern JS_PUBLIC_API(void)
++JS_SetDestroyZoneCallback(JSRuntime *rt, JSZoneCallback callback);
++
++extern JS_PUBLIC_API(void)
++JS_SetSweepZoneCallback(JSRuntime *rt, JSZoneCallback callback);
++
++extern JS_PUBLIC_API(void)
+ JS_SetCompartmentNameCallback(JSRuntime *rt, JSCompartmentNameCallback callback);
+ 
+ extern JS_PUBLIC_API(JSWrapObjectCallback)
+@@ -1995,6 +2004,12 @@
+ extern JS_PUBLIC_API(void *)
+ JS_GetCompartmentPrivate(JSCompartment *compartment);
+ 
++extern JS_PUBLIC_API(void)
++JS_SetZoneUserData(JS::Zone *zone, void *data);
++
++extern JS_PUBLIC_API(void *)
++JS_GetZoneUserData(JS::Zone *zone);
++
+ extern JS_PUBLIC_API(JSBool)
+ JS_WrapObject(JSContext *cx, JSObject **objp);
+ 
+@@ -2007,13 +2022,6 @@
+ extern JS_PUBLIC_API(JSObject *)
+ JS_TransplantObject(JSContext *cx, JS::HandleObject origobj, JS::HandleObject target);
+ 
+-extern JS_FRIEND_API(JSObject *)
+-js_TransplantObjectWithWrapper(JSContext *cx,
+-                               JS::HandleObject origobj,
+-                               JS::HandleObject origwrapper,
+-                               JS::HandleObject targetobj,
+-                               JS::HandleObject targetwrapper);
+-
+ extern JS_PUBLIC_API(JSBool)
+ JS_RefreshCrossCompartmentWrappers(JSContext *cx, JSObject *ob);
+ 
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jscntxt.h seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jscntxt.h
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jscntxt.h	2013-09-16 22:26:40.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jscntxt.h	2013-12-18 21:16:00.825128601 +0400
+@@ -877,6 +877,12 @@
+     /* Compartment destroy callback. */
+     JSDestroyCompartmentCallback destroyCompartmentCallback;
+ 
++    /* Zone destroy callback. */
++    JSZoneCallback destroyZoneCallback;
++
++    /* Zone sweep callback. */
++    JSZoneCallback sweepZoneCallback;
++
+     /* Call this to get the name of a compartment. */
+     JSCompartmentNameCallback compartmentNameCallback;
+ 
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jsgc.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jsgc.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jsgc.cpp	2013-09-16 22:26:40.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jsgc.cpp	2013-12-18 21:16:00.826128575 +0400
+@@ -2529,6 +2529,7 @@
+ {
+     JSRuntime *rt = fop->runtime();
+     JS_ASSERT_IF(lastGC, !rt->hasContexts());
++    JSZoneCallback callback = rt->destroyZoneCallback;
+ 
+     /* Skip the atomsCompartment zone. */
+     Zone **read = rt->zones.begin() + 1;
+@@ -2543,6 +2544,8 @@
+         if (!zone->hold && zone->wasGCStarted()) {
+             if (zone->allocator.arenas.arenaListsAreEmpty() || lastGC) {
+                 zone->allocator.arenas.checkEmptyFreeLists();
++                if (callback)
++                    callback(zone);
+                 SweepCompartments(fop, zone, false, lastGC);
+                 JS_ASSERT(zone->compartments.empty());
+                 fop->delete_(zone);
+@@ -3611,6 +3614,9 @@
+ 
+         if (zone == rt->atomsCompartment->zone())
+             sweepingAtoms = true;
++
++        if (rt->sweepZoneCallback)
++            rt->sweepZoneCallback(zone);
+     }
+ 
+     ValidateIncrementalMarking(rt);
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jsscript.h seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jsscript.h
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jsscript.h	2013-09-16 22:26:41.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jsscript.h	2013-12-18 21:16:00.826128575 +0400
+@@ -685,10 +685,7 @@
+     js::jit::IonScript *const *addressOfIonScript() const {
+         return &ion;
+     }
+-    void setIonScript(js::jit::IonScript *ionScript) {
+-        ion = ionScript;
+-        updateBaselineOrIonRaw();
+-    }
++    inline void setIonScript(js::jit::IonScript *ionScript);
+ 
+     bool hasBaselineScript() const {
+         return baseline && baseline != BASELINE_DISABLED_SCRIPT;
+@@ -700,10 +697,7 @@
+         JS_ASSERT(hasBaselineScript());
+         return baseline;
+     }
+-    void setBaselineScript(js::jit::BaselineScript *baselineScript) {
+-        baseline = baselineScript;
+-        updateBaselineOrIonRaw();
+-    }
++    inline void setBaselineScript(js::jit::BaselineScript *baselineScript);
+ 
+     void updateBaselineOrIonRaw();
+ 
+@@ -726,9 +720,7 @@
+     js::jit::IonScript *maybeParallelIonScript() const {
+         return parallelIon;
+     }
+-    void setParallelIonScript(js::jit::IonScript *ionScript) {
+-        parallelIon = ionScript;
+-    }
++    inline void setParallelIonScript(js::jit::IonScript *ionScript);
+ 
+     static size_t offsetOfBaselineScript() {
+         return offsetof(JSScript, baseline);
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jsscriptinlines.h seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jsscriptinlines.h
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/src/jsscriptinlines.h	2013-09-16 22:26:41.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/src/jsscriptinlines.h	2013-12-18 21:16:00.826128575 +0400
+@@ -14,6 +14,7 @@
+ #include "jsscript.h"
+ 
+ #include "jit/AsmJS.h"
++#include "jit/BaselineJIT.h"
+ #include "vm/GlobalObject.h"
+ #include "vm/RegExpObject.h"
+ #include "vm/Shape.h"
+@@ -211,4 +212,29 @@
+     enclosingScopeOrOriginalFunction_ = fun;
+ }
+ 
++inline void
++JSScript::setIonScript(js::jit::IonScript *ionScript) {
++    if (hasIonScript())
++        js::jit::IonScript::writeBarrierPre(tenuredZone(), ion);
++    ion = ionScript;
++    updateBaselineOrIonRaw();
++}
++
++inline void
++JSScript::setParallelIonScript(js::jit::IonScript *ionScript) {
++    if (hasParallelIonScript())
++        js::jit::IonScript::writeBarrierPre(tenuredZone(), parallelIon);
++    parallelIon = ionScript;
++}
++
++inline void
++JSScript::setBaselineScript(js::jit::BaselineScript *baselineScript) {
++#ifdef JS_ION
++    if (hasBaselineScript())
++        js::jit::BaselineScript::writeBarrierPre(tenuredZone(), baseline);
++#endif
++    baseline = baselineScript;
++    updateBaselineOrIonRaw();
++}
++
+ #endif /* jsscriptinlines_h */
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/xpconnect/src/XPCJSRuntime.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/js/xpconnect/src/XPCJSRuntime.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/xpconnect/src/XPCJSRuntime.cpp	2013-09-16 22:26:43.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/xpconnect/src/XPCJSRuntime.cpp	2013-12-18 21:16:00.827128549 +0400
+@@ -829,8 +829,6 @@
+             // Find dying scopes.
+             XPCWrappedNativeScope::StartFinalizationPhaseOfGC(fop, self);
+ 
+-            XPCStringConvert::ClearCache();
+-
+             self->mDoingFinalization = true;
+             break;
+         }
+@@ -2717,6 +2715,8 @@
+ #endif
+     JS_SetContextCallback(runtime, ContextCallback);
+     JS_SetDestroyCompartmentCallback(runtime, CompartmentDestroyedCallback);
++    JS_SetDestroyZoneCallback(runtime, XPCStringConvert::FreeZoneCache);
++    JS_SetSweepZoneCallback(runtime, XPCStringConvert::ClearZoneCache);
+     JS_SetCompartmentNameCallback(runtime, CompartmentNameCallback);
+     JS_SetGCCallback(runtime, GCCallback);
+     mPrevGCSliceCallback = JS::SetGCSliceCallback(runtime, GCSliceCallback);
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/xpconnect/src/XPCString.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/js/xpconnect/src/XPCString.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/xpconnect/src/XPCString.cpp	2013-09-16 22:26:43.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/xpconnect/src/XPCString.cpp	2013-12-18 21:16:00.827128549 +0400
+@@ -21,24 +21,29 @@
+ #include "xpcprivate.h"
+ #include "nsStringBuffer.h"
+ 
+-// One-slot cache, because it turns out it's common for web pages to
+-// get the same string a few times in a row.  We get about a 40% cache
+-// hit rate on this cache last it was measured.  We'd get about 70%
+-// hit rate with a hashtable with removal on finalization, but that
+-// would take a lot more machinery.
+-nsStringBuffer* XPCStringConvert::sCachedBuffer = nullptr;
+-JSString* XPCStringConvert::sCachedString = nullptr;
+ 
+-// Called from GC finalize callback to make sure we don't hand out a pointer to
+-// a JSString that's about to be finalized by incremental sweeping.
+ // static
+ void
+-XPCStringConvert::ClearCache()
++XPCStringConvert::FreeZoneCache(JS::Zone *zone)
+ {
+-    sCachedBuffer = nullptr;
+-    sCachedString = nullptr;
++    // Put the zone user data into an AutoPtr (which will do the cleanup for us),
++    // and null out the user data (which may already be null).
++    nsAutoPtr<ZoneStringCache> cache(static_cast<ZoneStringCache*>(JS_GetZoneUserData(zone)));
++    JS_SetZoneUserData(zone, nullptr);
+ }
+ 
++// static
++void
++XPCStringConvert::ClearZoneCache(JS::Zone *zone)
++{
++    ZoneStringCache *cache = static_cast<ZoneStringCache*>(JS_GetZoneUserData(zone));
++    if (cache) {
++        cache->mBuffer = nullptr;
++        cache->mString = nullptr;
++    }
++}
++
++// static
+ void
+ XPCStringConvert::FinalizeDOMString(const JSStringFinalizer *fin, jschar *chars)
+ {
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/xpconnect/src/XPCWrappedNative.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/js/xpconnect/src/XPCWrappedNative.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/xpconnect/src/XPCWrappedNative.cpp	2013-09-16 22:26:43.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/xpconnect/src/XPCWrappedNative.cpp	2013-12-18 21:16:00.827128549 +0400
+@@ -1469,18 +1469,10 @@
+         if (ww) {
+             RootedObject newwrapper(cx);
+             MOZ_ASSERT(wrapper->NeedsSOW(), "weird wrapper wrapper");
+-            newwrapper = xpc::WrapperFactory::WrapSOWObject(cx, newobj);
+-            if (!newwrapper)
+-                MOZ_CRASH();
+ 
+-            // Ok, now we do the special object-plus-wrapper transplant.
+-            ww = xpc::TransplantObjectWithWrapper(cx, flat, ww, newobj,
+-                                                  newwrapper);
+-            if (!ww)
++            // Oops. We don't support transplanting objects with SOWs anymore.
+                 MOZ_CRASH();
+ 
+-            flat = newobj;
+-            wrapper->SetWrapper(ww);
+         } else {
+             flat = xpc::TransplantObject(cx, flat, newobj);
+             if (!flat)
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/xpconnect/src/xpcpublic.h seamonkey-2.21-esr2.0/comm-release/mozilla/js/xpconnect/src/xpcpublic.h
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/xpconnect/src/xpcpublic.h	2013-09-16 22:26:43.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/xpconnect/src/xpcpublic.h	2013-12-18 21:16:00.828128523 +0400
+@@ -42,11 +42,6 @@
+ JSObject *
+ TransplantObject(JSContext *cx, JS::HandleObject origobj, JS::HandleObject target);
+ 
+-JSObject *
+-TransplantObjectWithWrapper(JSContext *cx,
+-                            JS::HandleObject origobj, JS::HandleObject origwrapper,
+-                            JS::HandleObject targetobj, JS::HandleObject targetwrapper);
+-
+ // Return a raw XBL scope object corresponding to contentScope, which must
+ // be an object whose global is a DOM window.
+ //
+@@ -192,6 +187,17 @@
+ // readable string conversions, static methods and members only
+ class XPCStringConvert
+ {
++    // One-slot cache, because it turns out it's common for web pages to
++    // get the same string a few times in a row.  We get about a 40% cache
++    // hit rate on this cache last it was measured.  We'd get about 70%
++    // hit rate with a hashtable with removal on finalization, but that
++    // would take a lot more machinery.
++    struct ZoneStringCache
++    {
++        nsStringBuffer* mBuffer;
++        JSString* mString;
++    };
++
+ public:
+ 
+     // If the string shares the readable's buffer, that buffer will
+@@ -205,10 +211,12 @@
+     StringBufferToJSVal(JSContext* cx, nsStringBuffer* buf, uint32_t length,
+                         JS::Value* rval, bool* sharedBuffer)
+     {
+-        if (buf == sCachedBuffer &&
+-            JS::GetGCThingZone(sCachedString) == js::GetContextZone(cx))
+-        {
+-            *rval = JS::StringValue(sCachedString);
++        JS::Zone *zone = js::GetContextZone(cx);
++        ZoneStringCache *cache = static_cast<ZoneStringCache*>(JS_GetZoneUserData(zone));
++        if (cache && buf == cache->mBuffer) {
++            MOZ_ASSERT(JS::GetGCThingZone(cache->mString) == zone);
++            JS::MarkStringAsLive(cx, cache->mString);
++            *rval = JS::StringValue(cache->mString);
+             *sharedBuffer = false;
+             return true;
+         }
+@@ -220,17 +228,20 @@
+             return false;
+         }
+         *rval = JS::StringValue(str);
+-        sCachedString = str;
+-        sCachedBuffer = buf;
++        if (!cache) {
++            cache = new ZoneStringCache();
++            JS_SetZoneUserData(zone, cache);
++        }
++        cache->mBuffer = buf;
++        cache->mString = str;
+         *sharedBuffer = true;
+         return true;
+     }
+ 
+-    static void ClearCache();
++    static void FreeZoneCache(JS::Zone *zone);
++    static void ClearZoneCache(JS::Zone *zone);
+ 
+ private:
+-    static nsStringBuffer* sCachedBuffer;
+-    static JSString* sCachedString;
+     static const JSStringFinalizer sDOMStringFinalizer;
+ 
+     static void FinalizeDOMString(const JSStringFinalizer *fin, jschar *chars);
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/js/xpconnect/wrappers/WrapperFactory.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/js/xpconnect/wrappers/WrapperFactory.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/js/xpconnect/wrappers/WrapperFactory.cpp	2013-09-16 22:26:43.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/js/xpconnect/wrappers/WrapperFactory.cpp	2013-12-18 21:16:00.828128523 +0400
+@@ -685,25 +685,6 @@
+     return newIdentity;
+ }
+ 
+-JSObject *
+-TransplantObjectWithWrapper(JSContext *cx,
+-                            HandleObject origobj, HandleObject origwrapper,
+-                            HandleObject targetobj, HandleObject targetwrapper)
+-{
+-    RootedObject oldWaiver(cx, WrapperFactory::GetXrayWaiver(origobj));
+-    RootedObject newSameCompartmentWrapper(cx,
+-      js_TransplantObjectWithWrapper(cx, origobj, origwrapper, targetobj,
+-                                     targetwrapper));
+-    if (!newSameCompartmentWrapper || !oldWaiver)
+-        return newSameCompartmentWrapper;
+-
+-    RootedObject newIdentity(cx, Wrapper::wrappedObject(newSameCompartmentWrapper));
+-    MOZ_ASSERT(js::IsWrapper(newIdentity));
+-    if (!FixWaiverAfterTransplant(cx, oldWaiver, newIdentity))
+-        return NULL;
+-    return newSameCompartmentWrapper;
+-}
+-
+ nsIGlobalObject *
+ GetNativeForGlobal(JSObject *obj)
+ {
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/layout/base/nsPresShell.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/layout/base/nsPresShell.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/layout/base/nsPresShell.cpp	2013-09-16 22:26:44.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/layout/base/nsPresShell.cpp	2013-12-18 21:16:00.829128497 +0400
+@@ -3432,6 +3432,9 @@
+   if (!targetView)
+     return;
+   targetView->GetViewManager()->DispatchEvent(aEvent, targetView, &status);
++  if (MOZ_UNLIKELY(mIsDestroying)) {
++    return;
++  }
+   if (aFlushOnHoverChange &&
+       hoverGenerationBefore != mFrameConstructor->GetHoverGeneration()) {
+     // Flush so that the resulting reflow happens now so that our caller
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/layout/base/nsPresShell.h seamonkey-2.21-esr2.0/comm-release/mozilla/layout/base/nsPresShell.h
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/layout/base/nsPresShell.h	2013-09-16 22:26:44.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/layout/base/nsPresShell.h	2013-12-18 21:16:00.829128497 +0400
+@@ -634,8 +634,10 @@
+       }
+     }
+     virtual void WillRefresh(mozilla::TimeStamp aTime) MOZ_OVERRIDE {
+-      if (mPresShell)
+-        mPresShell->ProcessSynthMouseMoveEvent(mFromScroll);
++      if (mPresShell) {
++        nsRefPtr<PresShell> shell = mPresShell;
++        shell->ProcessSynthMouseMoveEvent(mFromScroll);
++      }
+     }
+   private:
+     PresShell* mPresShell;
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/moz-css21-table-page-break-inside-avoid-6-ref.html seamonkey-2.21-esr2.0/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/moz-css21-table-page-break-inside-avoid-6-ref.html
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/moz-css21-table-page-break-inside-avoid-6-ref.html	1970-01-01 03:00:00.000000000 +0300
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/moz-css21-table-page-break-inside-avoid-6-ref.html	2013-12-18 21:16:00.829128497 +0400
+@@ -0,0 +1,15 @@
++<!DOCTYPE html>
++<html lang="en-US" class="reftest-print">
++<head>
++  <title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
++  <link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
++  <meta name="flags" content="paged">
++<style type="text/css">
++ at page { size:5in 3in; margin:0.5in; }
++p { height: 1in; width: 1in; margin:0; background-color:blue; }
++</style>
++</head>
++<body>
++<table cellspacing="0" cellpadding="0"><caption><p>1</p></caption><tr><td><p>1</p><p>2</p></td></tr></table>
++</body>
++</html>
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/moz-css21-table-page-break-inside-avoid-6.html seamonkey-2.21-esr2.0/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/moz-css21-table-page-break-inside-avoid-6.html
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/moz-css21-table-page-break-inside-avoid-6.html	1970-01-01 03:00:00.000000000 +0300
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/moz-css21-table-page-break-inside-avoid-6.html	2013-12-18 21:16:00.829128497 +0400
+@@ -0,0 +1,17 @@
++<!DOCTYPE html>
++<html lang="en-US" class="reftest-print">
++<head>
++  <title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
++  <link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
++  <link rel="help" href="http://www.w3.org/TR/CSS21/page.html#propdef-page-break-inside">
++  <meta name="flags" content="paged">
++<style type="text/css">
++ at page { size:5in 3in; margin:0.5in; }
++p { height: 1in; width: 1in; margin:0; background-color:blue; }
++.test { page-break-inside:avoid; }
++</style>
++</head>
++<body>
++<table cellspacing="0" cellpadding="0" class="test"><caption><p>1</p></caption><tr><td><p>1</p><p>2</p></td></tr></table>
++</body>
++</html>
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/moz-css21-table-page-break-inside-avoid-7-ref.html seamonkey-2.21-esr2.0/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/moz-css21-table-page-break-inside-avoid-7-ref.html
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/moz-css21-table-page-break-inside-avoid-7-ref.html	1970-01-01 03:00:00.000000000 +0300
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/moz-css21-table-page-break-inside-avoid-7-ref.html	2013-12-18 21:16:00.829128497 +0400
+@@ -0,0 +1,17 @@
++<!DOCTYPE html>
++<html lang="en-US" class="reftest-print">
++<head>
++  <title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
++  <link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
++  <meta name="flags" content="paged">
++<style type="text/css">
++ at page { size:5in 3in; margin:0.5in; }
++p { height: 1in; width: 1in; margin:0; background-color:blue; }
++div { page-break-after: always; }
++</style>
++</head>
++<body>
++<div>Text</div>
++<table cellspacing="0" cellpadding="0"><caption><p>1</p></caption><tr><td><p>1</p><p>2</p></td></tr></table>
++</body>
++</html>
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/moz-css21-table-page-break-inside-avoid-7.html seamonkey-2.21-esr2.0/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/moz-css21-table-page-break-inside-avoid-7.html
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/moz-css21-table-page-break-inside-avoid-7.html	1970-01-01 03:00:00.000000000 +0300
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/moz-css21-table-page-break-inside-avoid-7.html	2013-12-18 21:16:00.829128497 +0400
+@@ -0,0 +1,18 @@
++<!DOCTYPE html>
++<html lang="en-US" class="reftest-print">
++<head>
++  <title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
++  <link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
++  <link rel="help" href="http://www.w3.org/TR/CSS21/page.html#propdef-page-break-inside">
++  <meta name="flags" content="paged">
++<style type="text/css">
++ at page { size:5in 3in; margin:0.5in; }
++p { height: 1in; width: 1in; margin:0; background-color:blue; }
++.test { page-break-inside:avoid; }
++</style>
++</head>
++<body>
++<div>Text</div>
++<table cellspacing="0" cellpadding="0" class="test"><caption><p>1</p></caption><tr><td><p>1</p><p>2</p></td></tr></table>
++</body>
++</html>
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/moz-css21-table-page-break-inside-avoid-8.html seamonkey-2.21-esr2.0/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/moz-css21-table-page-break-inside-avoid-8.html
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/moz-css21-table-page-break-inside-avoid-8.html	1970-01-01 03:00:00.000000000 +0300
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/moz-css21-table-page-break-inside-avoid-8.html	2013-12-18 21:16:00.830128471 +0400
+@@ -0,0 +1,17 @@
++<!DOCTYPE html>
++<html lang="en-US" class="reftest-print">
++<head>
++  <title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
++  <link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
++  <link rel="help" href="http://www.w3.org/TR/CSS21/page.html#propdef-page-break-inside">
++  <meta name="flags" content="paged">
++<style type="text/css">
++ at page { size:5in 3in; margin:0.5in; }
++p { height: 1in; width: 1in; margin:0; background-color:blue; }
++.test { page-break-inside:avoid; }
++</style>
++</head>
++<body>
++<table cellspacing="0" cellpadding="0"><caption><p>1</p></caption><tbody class="test"><tr><td><p>1</p><p>2</p></td></tr></tbody></table>
++</body>
++</html>
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/reftest.list seamonkey-2.21-esr2.0/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/reftest.list
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/reftest.list	2013-09-16 22:26:48.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/layout/reftests/w3c-css/submitted/css21/pagination/reftest.list	2013-12-18 21:16:00.830128471 +0400
+@@ -16,6 +16,9 @@
+ == moz-css21-table-page-break-inside-avoid-3.html moz-css21-table-page-break-inside-avoid-3-ref.html
+ == moz-css21-table-page-break-inside-avoid-4.html moz-css21-table-page-break-inside-avoid-4-ref.html
+ == moz-css21-table-page-break-inside-avoid-5.html moz-css21-table-page-break-inside-avoid-5-ref.html
++== moz-css21-table-page-break-inside-avoid-6.html moz-css21-table-page-break-inside-avoid-6-ref.html
++== moz-css21-table-page-break-inside-avoid-7.html moz-css21-table-page-break-inside-avoid-7-ref.html
++== moz-css21-table-page-break-inside-avoid-8.html moz-css21-table-page-break-inside-avoid-6-ref.html
+ == moz-css21-float-page-break-inside-avoid-1.html moz-css21-table-page-break-inside-avoid-ref.html
+ == moz-css21-float-page-break-inside-avoid-2.html moz-css21-float-page-break-inside-avoid-2-ref.html
+ == moz-css21-float-page-break-inside-avoid-3.html moz-css21-block-page-break-inside-avoid-ref.html
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/layout/tables/nsTableOuterFrame.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/layout/tables/nsTableOuterFrame.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/layout/tables/nsTableOuterFrame.cpp	2013-09-16 22:26:49.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/layout/tables/nsTableOuterFrame.cpp	2013-12-18 21:16:00.830128471 +0400
+@@ -827,15 +827,12 @@
+                       -1, -1, false);
+   InitChildReflowState(*aPresContext, childRS);
+ 
+-  // see if we need to reset top of page due to a caption
+-  if (mCaptionFrames.NotEmpty()) {
++  // see if we need to reset top-of-page due to a caption
++  if (childRS.mFlags.mIsTopOfPage &&
++      mCaptionFrames.FirstChild() == aChildFrame) {
+     uint8_t captionSide = GetCaptionSide();
+-    if (((captionSide == NS_STYLE_CAPTION_SIDE_BOTTOM ||
+-          captionSide == NS_STYLE_CAPTION_SIDE_BOTTOM_OUTSIDE) &&
+-         mCaptionFrames.FirstChild() == aChildFrame) || 
+-        ((captionSide == NS_STYLE_CAPTION_SIDE_TOP ||
+-          captionSide == NS_STYLE_CAPTION_SIDE_TOP_OUTSIDE) &&
+-         InnerTableFrame() == aChildFrame)) {
++    if (captionSide == NS_STYLE_CAPTION_SIDE_BOTTOM ||
++        captionSide == NS_STYLE_CAPTION_SIDE_BOTTOM_OUTSIDE) {
+       childRS.mFlags.mIsTopOfPage = false;
+     }
+   }
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/media/libjpeg/jdmarker.c seamonkey-2.21-esr2.0/comm-release/mozilla/media/libjpeg/jdmarker.c
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/media/libjpeg/jdmarker.c	2013-09-16 22:26:49.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/media/libjpeg/jdmarker.c	2013-12-18 21:16:00.833128393 +0400
+@@ -304,7 +304,7 @@
+ /* Process a SOS marker */
+ {
+   INT32 length;
+-  int i, ci, n, c, cc;
++  int i, ci, n, c, cc, pi;
+   jpeg_component_info * compptr;
+   INPUT_VARS(cinfo);
+ 
+@@ -348,6 +348,13 @@
+     
+     TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc,
+ 	     compptr->dc_tbl_no, compptr->ac_tbl_no);
++
++    /* This CSi (cc) should differ from the previous CSi */
++    for (pi = 0; pi < i; pi++) {
++      if (cinfo->cur_comp_info[pi] == compptr) {
++        ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
++      }
++    }
+   }
+ 
+   /* Collect the additional scan parameters Ss, Se, Ah/Al. */
+@@ -465,6 +472,8 @@
+     for (i = 0; i < count; i++)
+       INPUT_BYTE(cinfo, huffval[i], return FALSE);
+ 
++    MEMZERO(&huffval[count], (256 - count) * SIZEOF(UINT8));
++
+     length -= count;
+ 
+     if (index & 0x10) {		/* AC table definition */
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/netwerk/test/unit/xpcshell.ini seamonkey-2.21-esr2.0/comm-release/mozilla/netwerk/test/unit/xpcshell.ini
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/netwerk/test/unit/xpcshell.ini	2013-09-16 22:26:54.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/netwerk/test/unit/xpcshell.ini	2013-12-18 21:16:00.833128393 +0400
+@@ -105,6 +105,7 @@
+ [test_fallback_response-error_passing.js]
+ [test_file_partial_inputstream.js]
+ [test_file_protocol.js]
++skip-if = os == 'win'
+ [test_filestreams.js]
+ [test_freshconnection.js]
+ [test_gre_resources.js]
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/parser/html/nsHtml5TreeOperation.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/parser/html/nsHtml5TreeOperation.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/parser/html/nsHtml5TreeOperation.cpp	2013-09-16 22:26:55.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/parser/html/nsHtml5TreeOperation.cpp	2013-12-18 21:16:00.834128368 +0400
+@@ -240,7 +240,7 @@
+     case eTreeOpDetach: {
+       nsIContent* node = *(mOne.node);
+       aBuilder->FlushPendingAppendNotifications();
+-      nsCOMPtr<nsIContent> parent = node->GetParent();
++      nsCOMPtr<nsINode> parent = node->GetParentNode();
+       if (parent) {
+         nsHtml5OtherDocUpdate update(parent->OwnerDoc(),
+                                      aBuilder->GetDocument());
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/security/manager/ssl/src/CertVerifier.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/security/manager/ssl/src/CertVerifier.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/security/manager/ssl/src/CertVerifier.cpp	2013-09-16 22:26:55.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/security/manager/ssl/src/CertVerifier.cpp	2013-12-18 21:16:00.834128368 +0400
+@@ -157,6 +157,12 @@
+       if (!trustAnchors) {
+         return SECFailure;
+       }
++      // pkix ignores an empty trustanchors list and
++      // decides then to use the whole set of trust in the DB
++      // so we set the evPolicy to unkown in this case
++      if (CERT_LIST_EMPTY(trustAnchors)) {
++        evPolicy = SEC_OID_UNKNOWN;
++      }
+     } else {
+       // Do not setup EV verification params
+       evPolicy = SEC_OID_UNKNOWN;
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/security/manager/ssl/src/nsIdentityChecking.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/security/manager/ssl/src/nsIdentityChecking.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/security/manager/ssl/src/nsIdentityChecking.cpp	2013-09-16 22:26:55.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/security/manager/ssl/src/nsIdentityChecking.cpp	2013-12-18 21:16:00.834128368 +0400
+@@ -14,6 +14,7 @@
+ #include "nsILineInputStream.h"
+ #include "nsPromiseFlatString.h"
+ #include "nsTArray.h"
++#include "nsNSSCertTrust.h"
+ 
+ #include "cert.h"
+ #include "base64.h"
+@@ -687,6 +688,19 @@
+   return SECOID_AddEntry(&od);
+ }
+ 
++static void
++addToCertListIfTrusted(CERTCertList* certList, CERTCertificate *cert) {
++  CERTCertTrust nssTrust;
++  if (CERT_GetCertTrust(cert, &nssTrust) != SECSuccess) {
++    return;
++  }
++  unsigned int flags = SEC_GET_TRUST_FLAGS(&nssTrust, trustSSL);
++
++  if (flags & CERTDB_TRUSTED_CA) {
++    CERT_AddCertToListTail(certList, CERT_DupCertificate(cert));
++  }
++}
++
+ #ifdef PSM_ENABLE_TEST_EV_ROOTS
+ class nsMyTrustedEVInfoClass : public nsMyTrustedEVInfo
+ {
+@@ -958,8 +972,9 @@
+     nsMyTrustedEVInfoClass *ev = testEVInfos->ElementAt(i);
+     if (!ev)
+       continue;
+-    if (policyOIDTag == ev->oid_tag)
+-      CERT_AddCertToListTail(certList, CERT_DupCertificate(ev->cert));
++    if (policyOIDTag == ev->oid_tag) {
++      addToCertListIfTrusted(certList, ev->cert);
++    }
+   }
+ 
+   return false;
+@@ -1029,8 +1044,9 @@
+     nsMyTrustedEVInfo &entry = myTrustedEVInfos[iEV];
+     if (!entry.oid_name) // invalid or placeholder list entry
+       continue;
+-    if (entry.oid_tag == oid_tag)
+-      CERT_AddCertToListTail(certList, CERT_DupCertificate(entry.cert));
++    if (entry.oid_tag == oid_tag) {
++      addToCertListIfTrusted(certList, entry.cert);
++    }
+   }
+ 
+ #ifdef PSM_ENABLE_TEST_EV_ROOTS
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/security/nss/TAG-INFO seamonkey-2.21-esr2.0/comm-release/mozilla/security/nss/TAG-INFO
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/security/nss/TAG-INFO	2013-12-18 21:26:22.768799294 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/security/nss/TAG-INFO	2013-12-18 21:16:00.834128368 +0400
+@@ -1 +1 @@
+-NSS_3_15_3_RTM
++NSS_3_15_3_1_RTM
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/security/nss/coreconf/coreconf.dep seamonkey-2.21-esr2.0/comm-release/mozilla/security/nss/coreconf/coreconf.dep
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/security/nss/coreconf/coreconf.dep	2013-12-18 21:26:22.768799294 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/security/nss/coreconf/coreconf.dep	2013-12-18 21:16:00.834128368 +0400
+@@ -10,4 +10,3 @@
+  */
+ 
+ #error "Do not include this header file."
+-
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/security/nss/lib/ckfw/builtins/certdata.txt seamonkey-2.21-esr2.0/comm-release/mozilla/security/nss/lib/ckfw/builtins/certdata.txt
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/security/nss/lib/ckfw/builtins/certdata.txt	2013-09-16 22:26:57.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/security/nss/lib/ckfw/builtins/certdata.txt	2013-12-18 21:16:00.837128291 +0400
+@@ -12376,6 +12376,34 @@
+ CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
+ CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
+ 
++# Distrust "Distrusted AC DG Tresor SSL"
++# Issuer: CN=AC DGTPE Signature Authentification,O=DGTPE,C=FR
++# Serial Number: 204199 (0x31da7)
++# Subject: CN=AC DG Tr..sor SSL,O=DG Tr..sor,C=FR
++# Not Valid Before: Thu Jul 18 10:05:28 2013
++# Not Valid After : Fri Jul 18 10:05:28 2014
++# Fingerprint (MD5): 3A:EA:9E:FC:00:0C:E2:06:6C:E0:AC:39:C1:31:DE:C8
++# Fingerprint (SHA1): 5C:E3:39:46:5F:41:A1:E4:23:14:9F:65:54:40:95:40:4D:E6:EB:E2
++CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
++CKA_TOKEN CK_BBOOL CK_TRUE
++CKA_PRIVATE CK_BBOOL CK_FALSE
++CKA_MODIFIABLE CK_BBOOL CK_FALSE
++CKA_LABEL UTF8 "Distrusted AC DG Tresor SSL"
++CKA_ISSUER MULTILINE_OCTAL
++\060\113\061\013\060\011\006\003\125\004\006\023\002\106\122\061
++\016\060\014\006\003\125\004\012\023\005\104\107\124\120\105\061
++\054\060\052\006\003\125\004\003\023\043\101\103\040\104\107\124
++\120\105\040\123\151\147\156\141\164\165\162\145\040\101\165\164
++\150\145\156\164\151\146\151\143\141\164\151\157\156
++END
++CKA_SERIAL_NUMBER MULTILINE_OCTAL
++\002\003\003\035\247
++END
++CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_NOT_TRUSTED
++CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_NOT_TRUSTED
++CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_NOT_TRUSTED
++CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
++
+ #
+ # Certificate "Security Communication EV RootCA1"
+ #
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/security/nss/lib/ckfw/builtins/nssckbi.h seamonkey-2.21-esr2.0/comm-release/mozilla/security/nss/lib/ckfw/builtins/nssckbi.h
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/security/nss/lib/ckfw/builtins/nssckbi.h	2013-09-16 22:26:57.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/security/nss/lib/ckfw/builtins/nssckbi.h	2013-12-18 21:16:00.939125659 +0400
+@@ -45,8 +45,8 @@
+  * of the comment in the CK_VERSION type definition.
+  */
+ #define NSS_BUILTINS_LIBRARY_VERSION_MAJOR 1
+-#define NSS_BUILTINS_LIBRARY_VERSION_MINOR 94
+-#define NSS_BUILTINS_LIBRARY_VERSION "1.94"
++#define NSS_BUILTINS_LIBRARY_VERSION_MINOR 95
++#define NSS_BUILTINS_LIBRARY_VERSION "1.95"
+ 
+ /* These version numbers detail the semantic changes to the ckfw engine. */
+ #define NSS_BUILTINS_HARDWARE_VERSION_MAJOR 1
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/security/nss/lib/nss/nss.h seamonkey-2.21-esr2.0/comm-release/mozilla/security/nss/lib/nss/nss.h
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/security/nss/lib/nss/nss.h	2013-12-18 21:26:22.768799294 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/security/nss/lib/nss/nss.h	2013-12-18 21:16:00.939125659 +0400
+@@ -33,11 +33,11 @@
+  * The format of the version string should be
+  *     "<major version>.<minor version>[.<patch level>[.<build number>]][ <ECC>][ <Beta>]"
+  */
+-#define NSS_VERSION  "3.15.3" _NSS_ECC_STRING _NSS_CUSTOMIZED
++#define NSS_VERSION  "3.15.3.1" _NSS_ECC_STRING _NSS_CUSTOMIZED
+ #define NSS_VMAJOR   3
+ #define NSS_VMINOR   15
+ #define NSS_VPATCH   3
+-#define NSS_VBUILD   0
++#define NSS_VBUILD   1
+ #define NSS_BETA     PR_FALSE
+ 
+ #ifndef RC_INVOKED
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/security/nss/lib/softoken/softkver.h seamonkey-2.21-esr2.0/comm-release/mozilla/security/nss/lib/softoken/softkver.h
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/security/nss/lib/softoken/softkver.h	2013-12-18 21:26:22.768799294 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/security/nss/lib/softoken/softkver.h	2013-12-18 21:16:00.939125659 +0400
+@@ -25,11 +25,11 @@
+  * The format of the version string should be
+  *     "<major version>.<minor version>[.<patch level>[.<build number>]][ <ECC>][ <Beta>]"
+  */
+-#define SOFTOKEN_VERSION  "3.15.3" SOFTOKEN_ECC_STRING
++#define SOFTOKEN_VERSION  "3.15.3.1" SOFTOKEN_ECC_STRING
+ #define SOFTOKEN_VMAJOR   3
+ #define SOFTOKEN_VMINOR   15
+ #define SOFTOKEN_VPATCH   3
+-#define SOFTOKEN_VBUILD   0
++#define SOFTOKEN_VBUILD   1
+ #define SOFTOKEN_BETA     PR_FALSE
+ 
+ #endif /* _SOFTKVER_H_ */
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/security/nss/lib/util/nssutil.h seamonkey-2.21-esr2.0/comm-release/mozilla/security/nss/lib/util/nssutil.h
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/security/nss/lib/util/nssutil.h	2013-12-18 21:26:22.824798356 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/security/nss/lib/util/nssutil.h	2013-12-18 21:16:00.940125633 +0400
+@@ -19,11 +19,11 @@
+  * The format of the version string should be
+  *     "<major version>.<minor version>[.<patch level>[.<build number>]][ <Beta>]"
+  */
+-#define NSSUTIL_VERSION  "3.15.3"
++#define NSSUTIL_VERSION  "3.15.3.1"
+ #define NSSUTIL_VMAJOR   3
+ #define NSSUTIL_VMINOR   15
+ #define NSSUTIL_VPATCH   3
+-#define NSSUTIL_VBUILD   0
++#define NSSUTIL_VBUILD   1
+ #define NSSUTIL_BETA     PR_FALSE
+ 
+ SEC_BEGIN_PROTOS
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/toolkit/components/places/PlacesDBUtils.jsm seamonkey-2.21-esr2.0/comm-release/mozilla/toolkit/components/places/PlacesDBUtils.jsm
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/toolkit/components/places/PlacesDBUtils.jsm	2013-09-16 22:26:58.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/toolkit/components/places/PlacesDBUtils.jsm	2013-12-18 21:16:00.940125633 +0400
+@@ -970,9 +970,11 @@
+         if ("callback" in aProbe) {
+           value = aProbe.callback(value);
+         }
++        if (isFinite(value)) {
+         probeValues[aProbe.histogram] = value;
+         Services.telemetry.getHistogramById(aProbe.histogram)
+                           .add(value);
++        }
+       } catch (ex) {
+         Components.utils.reportError(ex);
+       }
+diff -Nrbu seamonkey-2.21-esr1.1/comm-release/mozilla/uriloader/prefetch/nsPrefetchService.cpp seamonkey-2.21-esr2.0/comm-release/mozilla/uriloader/prefetch/nsPrefetchService.cpp
+--- seamonkey-2.21-esr1.1/comm-release/mozilla/uriloader/prefetch/nsPrefetchService.cpp	2013-09-16 22:27:02.000000000 +0400
++++ seamonkey-2.21-esr2.0/comm-release/mozilla/uriloader/prefetch/nsPrefetchService.cpp	2013-12-18 21:16:00.940125633 +0400
+@@ -470,7 +470,8 @@
+         //
+         // if opening the channel fails, then just skip to the next uri
+         //
+-        rv = mCurrentNode->OpenChannel();
++        nsRefPtr<nsPrefetchNode> node = mCurrentNode;
++        rv = node->OpenChannel();
+     }
+     while (NS_FAILED(rv));
+ }
diff --git a/seamonkey.spec b/seamonkey.spec
index 207e9b0..8dadf90 100644
--- a/seamonkey.spec
+++ b/seamonkey.spec
@@ -8,7 +8,7 @@
 %define default_bookmarks_file %{_datadir}/bookmarks/default-bookmarks.html
 %define cairo_version 0.5
 
-%global minimum_build_nspr_version 4.9.6
+%global minimum_build_nspr_version 4.10.2
 %global minimum_build_nss_version 3.15.0
 %global minimum_build_vpx_version 1.0.0
 
@@ -25,7 +25,7 @@
 Name:           seamonkey
 Summary:        Web browser, e-mail, news, IRC client, HTML editor
 Version:        2.21
-Release:        2.esr1%{?dist}
+Release:        3.esr2%{?dist}
 URL:            http://www.mozilla.org/projects/seamonkey/
 License:        MPLv2.0
 Group:          Applications/Internet
@@ -52,7 +52,6 @@ Source20:       seamonkey-epel-default-prefs.js
 Source100:      find-external-requires
 %{?bundled_python:Source200: http://www.python.org/ftp/python/2.7.5/Python-2.7.5.tar.xz}
 
-Patch0:		seamonkey-2.21-esr1.0.patch
 Patch1:         xulrunner-24.0-gcc47.patch
 Patch2:		xulrunner-24.0-jemalloc-ppc.patch
 Patch5:         seamonkey-8.0-enable-addons.patch
@@ -61,6 +60,12 @@ Patch20:	seamonkey-2.21-c++0x.patch
 Patch22:	seamonkey-2.14-installdir.patch
 Patch23:	seamonkey-2.19-elfhack.patch
 
+# ESR patches. Derived from the thunderbird ESR sources
+# from ftp://ftp.mozilla.org/pub/mozilla.org/thunderburd/releases/24.*/
+Patch2410:	seamonkey-2.21-esr1.0.patch
+Patch2411:	seamonkey-2.21-esr1.0-1.1.patch
+Patch2420:	seamonkey-2.21-esr1.1-2.0.patch
+
 Buildroot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 %if %{with system_nspr}
 BuildRequires:  nspr-devel >= %{minimum_build_nspr_version}
@@ -140,7 +145,9 @@ application formerly known as Mozilla Application Suite.
 cd %{sources_subdir}
 
 #  estended support release patches
-%patch0 -p2 -b .esr1
+%patch2410 -p2 
+%patch2411 -p2 
+%patch2420 -p2 
 
 pushd mozilla
 %patch1 -p2 -b .gcc47
@@ -150,7 +157,7 @@ popd
 %patch5 -p2 -b .addons
 %patch10 -p2 -b .idl-parser-cachepath
 
-%patch20 -p2 -b .c++0x
+#%patch20 -p2 -b .c++0x
 %patch22 -p2 -b .installdir
 %patch23 -p2 -b .elfhack
 
@@ -494,8 +501,12 @@ fi
 
 
 %changelog
+* Wed Dec 18 2013 Dmitry Butskoy <Dmitry at Butskoy.name> 2.21-3.esr2
+- apply Extended Support Release patches, derived from the thunderbird
+  esr24.2.0 tree
+
 * Fri Nov 29 2013 Dmitry Butskoy <Dmitry at Butskoy.name> 2.21-2.esr1
-- apply extended support release patch, derived from the thunderbird
+- apply Extended Support Release patch, derived from the thunderbird
   esr24.1.0 tree
 - fix for BEAST issue in startup script (as in #1005611 for Firefox)
 


More information about the scm-commits mailing list