[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