Index: branches/2019Q1/www/firefox-esr/Makefile =================================================================== --- branches/2019Q1/www/firefox-esr/Makefile (revision 491522) +++ branches/2019Q1/www/firefox-esr/Makefile (revision 491523) @@ -1,65 +1,65 @@ # Created by: Alan Eldridge # $FreeBSD$ PORTNAME= firefox -DISTVERSION= 60.4.0 +DISTVERSION= 60.5.0 PORTREVISION= 1 PORTEPOCH= 1 CATEGORIES= www ipv6 MASTER_SITES= MOZILLA/${PORTNAME}/releases/${DISTVERSION}esr/source \ MOZILLA/${PORTNAME}/candidates/${DISTVERSION}esr-candidates/build2/source PKGNAMESUFFIX= -esr DISTFILES= ${DISTNAME}esr.source${EXTRACT_SUFX} MAINTAINER= gecko@FreeBSD.org COMMENT= Web browser based on the browser portion of Mozilla BUILD_DEPENDS= nspr>=4.19:devel/nspr \ - nss>=3.36.1:security/nss \ + nss>=3.36.7:security/nss \ icu>=59.1,1:devel/icu \ libevent>=2.1.8:devel/libevent \ harfbuzz>=1.7.6:print/harfbuzz \ graphite2>=1.3.11:graphics/graphite2 \ png>=1.6.34:graphics/png \ libvorbis>=1.3.6,3:audio/libvorbis \ libvpx>=1.5.0:multimedia/libvpx \ sqlite3>=3.22.0:databases/sqlite3 \ ${PYTHON_PKGNAMEPREFIX}sqlite3>0:databases/py-sqlite3@${PY_FLAVOR} \ v4l_compat>0:multimedia/v4l_compat \ autoconf-2.13:devel/autoconf213 \ yasm:devel/yasm \ zip:archivers/zip USE_GECKO= gecko CPE_PRODUCT= ${PORTNAME}_esr CONFLICTS_INSTALL= firefox MOZ_PKGCONFIG_FILES= # empty USE_MOZILLA= # empty USES= tar:xz FIREFOX_ICON= ${MOZILLA}.png FIREFOX_ICON_SRC= ${PREFIX}/lib/${MOZILLA}/browser/chrome/icons/default/default48.png FIREFOX_DESKTOP= ${MOZSRC}/taskcluster/docker/${MOZILLA}-snap/${MOZILLA}.desktop MOZ_OPTIONS= --enable-application=browser \ --enable-official-branding .include "${.CURDIR}/../../www/firefox/Makefile.options" post-patch: @${REINPLACE_CMD} -e 's/%u/%U/' -e '/X-MultipleArgs/d' \ -e '/^Icon/s/=.*/=${FIREFOX_ICON:R}/' \ ${FIREFOX_DESKTOP} @${REINPLACE_CMD} -e 's|%%LOCALBASE%%|${LOCALBASE}|g' \ ${WRKSRC}/browser/app/nsBrowserApp.cpp pre-configure: (cd ${WRKSRC} && ${LOCALBASE}/bin/autoconf-2.13) (cd ${WRKSRC}/js/src/ && ${LOCALBASE}/bin/autoconf-2.13) post-install: ${INSTALL_DATA} ${FIREFOX_DESKTOP} ${STAGEDIR}${PREFIX}/share/applications/ ${MKDIR} ${STAGEDIR}${PREFIX}/share/pixmaps ${LN} -sf ${FIREFOX_ICON_SRC} ${STAGEDIR}${PREFIX}/share/pixmaps/${FIREFOX_ICON} .include Index: branches/2019Q1/www/firefox-esr/distinfo =================================================================== --- branches/2019Q1/www/firefox-esr/distinfo (revision 491522) +++ branches/2019Q1/www/firefox-esr/distinfo (revision 491523) @@ -1,3 +1,3 @@ -TIMESTAMP = 1543878683 -SHA256 (firefox-60.4.0esr.source.tar.xz) = 205258548c3f245d42377b338f0db1272df39489d61305c39b83e52750ebff85 -SIZE (firefox-60.4.0esr.source.tar.xz) = 268425148 +TIMESTAMP = 1548351040 +SHA256 (firefox-60.5.0esr.source.tar.xz) = 1a1f69ee87092637f75aef7f3fa588b0eef0b2c8bcc160094a036450c49c4025 +SIZE (firefox-60.5.0esr.source.tar.xz) = 268065616 Index: branches/2019Q1/www/firefox-esr/files/patch-bug1500850 =================================================================== --- branches/2019Q1/www/firefox-esr/files/patch-bug1500850 (revision 491522) +++ branches/2019Q1/www/firefox-esr/files/patch-bug1500850 (nonexistent) @@ -1,26 +0,0 @@ -commit 4425b9140c4c -Author: Martin Stransky -Date: Mon Oct 22 09:14:07 2018 +0000 - - Bug 1500850 - [Wayland] Add missing dbus header dbus-glib-lowlevel.h. r=jhorak, a=RyanVM - - Differential Revision: https://phabricator.services.mozilla.com/D9365 - - --HG-- - extra : source : 5203edd6ea29e4b73681674d2a5268dd6a310102 ---- - widget/xremoteclient/DBusRemoteClient.cpp | 1 + - 1 file changed, 1 insertion(+) - -diff --git widget/xremoteclient/DBusRemoteClient.cpp widget/xremoteclient/DBusRemoteClient.cpp -index ba5bda06201d..b2f03dccc133 100644 ---- widget/xremoteclient/DBusRemoteClient.cpp -+++ widget/xremoteclient/DBusRemoteClient.cpp -@@ -13,6 +13,7 @@ - #include "nsPrintfCString.h" - - #include -+#include - - using mozilla::LogLevel; - static mozilla::LazyLogModule sRemoteLm("DBusRemoteClient"); Property changes on: branches/2019Q1/www/firefox-esr/files/patch-bug1500850 ___________________________________________________________________ Deleted: fbsd:nokeywords ## -1 +0,0 ## -yes \ No newline at end of property Deleted: svn:eol-style ## -1 +0,0 ## -native \ No newline at end of property Deleted: svn:mime-type ## -1 +0,0 ## -text/plain \ No newline at end of property Index: branches/2019Q1/www/firefox-esr/files/patch-bug1375074 =================================================================== --- branches/2019Q1/www/firefox-esr/files/patch-bug1375074 (revision 491522) +++ branches/2019Q1/www/firefox-esr/files/patch-bug1375074 (revision 491523) @@ -1,82 +1,83 @@ commit fc25eb4380d0 Author: Lars T Hansen Date: Wed Feb 28 13:57:52 2018 +0100 Bug 1375074 - Save and restore non-volatile x28 on ARM64 for generated unboxed object constructor. r=sstangl --HG-- extra : rebase_source : 4a2824b23cf7453d07c962123f780c0ff2fd5292 extra : source : dec6ab6522a4eb4b3c2defc5078b38ed904f3383 --- js/src/jit-test/tests/bug1375074.js | 18 ++++++++++++++++++ js/src/vm/UnboxedObject.cpp | 25 ++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git js/src/jit-test/tests/bug1375074.js js/src/jit-test/tests/bug1375074.js new file mode 100644 index 0000000000000..8bf01d96903fc --- /dev/null +++ js/src/jit-test/tests/bug1375074.js @@ -0,0 +1,18 @@ +// This forces the VM to start creating unboxed objects and thus stresses a +// particular path into generated code for a specialized unboxed object +// constructor. + +var K = 2000; // 2000 should be plenty +var s = "["; +var i; +for ( i=0; i < K-1; i++ ) + s = s + `{"i":${i}},`; +s += `{"i":${i}}]`; +var v = JSON.parse(s); + +assertEq(v.length == K, true); + +for ( i=0; i < K; i++) { + assertEq(v[i] instanceof Object, true); + assertEq(v[i].i, i); +} diff --git js/src/vm/UnboxedObject.cpp js/src/vm/UnboxedObject.cpp index c8c178965c488..5badf328ede4f 100644 --- js/src/vm/UnboxedObject.cpp +++ js/src/vm/UnboxedObject.cpp -@@ -95,7 +95,15 @@ UnboxedLayout::makeConstructorCode(JSContext* cx, HandleObjectGroup group) +@@ -86,8 +86,15 @@ static const uintptr_t CLEAR_CONSTRUCTOR_CODE_TOKEN = #endif #ifdef JS_CODEGEN_ARM64 -- // ARM64 communicates stack address via sp, but uses a pseudo-sp for addressing. -+ // ARM64 communicates stack address via sp, but uses a pseudo-sp (PSP) for -+ // addressing. The register we use for PSP may however also be used by -+ // calling code, and it is nonvolatile, so save it. Do this as a special -+ // case first because the generic save/restore code needs the PSP to be -+ // initialized already. -+ MOZ_ASSERT(PseudoStackPointer64.Is(masm.GetStackPointer64())); -+ masm.Str(PseudoStackPointer64, vixl::MemOperand(sp, -16, vixl::PreIndex)); +- // ARM64 communicates stack address via sp, but uses a pseudo-sp for +- // addressing. ++ // ARM64 communicates stack address via sp, but uses a pseudo-sp (PSP) for ++ // addressing. The register we use for PSP may however also be used by ++ // calling code, and it is nonvolatile, so save it. Do this as a special ++ // case first because the generic save/restore code needs the PSP to be ++ // initialized already. ++ MOZ_ASSERT(PseudoStackPointer64.Is(masm.GetStackPointer64())); ++ masm.Str(PseudoStackPointer64, vixl::MemOperand(sp, -16, vixl::PreIndex)); + -+ // Initialize the PSP from the SP. - masm.initStackPtr(); ++ // Initialize the PSP from the SP. + masm.initStackPtr(); #endif -@@ -233,7 +241,22 @@ UnboxedLayout::makeConstructorCode(JSContext* cx, HandleObjectGroup group) - masm.pop(ScratchDoubleReg); - masm.PopRegsInMask(savedNonVolatileRegisters); +@@ -239,7 +246,22 @@ static const uintptr_t CLEAR_CONSTRUCTOR_CODE_TOKEN = + if (ScratchDoubleReg.volatile_()) masm.pop(ScratchDoubleReg); + masm.PopRegsInMask(savedNonVolatileRegisters); +#ifdef JS_CODEGEN_ARM64 -+ // Now restore the value that was in the PSP register on entry, and return. ++ // Now restore the value that was in the PSP register on entry, and return. + -+ // Obtain the correct SP from the PSP. -+ masm.Mov(sp, PseudoStackPointer64); ++ // Obtain the correct SP from the PSP. ++ masm.Mov(sp, PseudoStackPointer64); + -+ // Restore the saved value of the PSP register, this value is whatever the -+ // caller had saved in it, not any actual SP value, and it must not be -+ // overwritten subsequently. -+ masm.Ldr(PseudoStackPointer64, vixl::MemOperand(sp, 16, vixl::PostIndex)); ++ // Restore the saved value of the PSP register, this value is whatever the ++ // caller had saved in it, not any actual SP value, and it must not be ++ // overwritten subsequently. ++ masm.Ldr(PseudoStackPointer64, vixl::MemOperand(sp, 16, vixl::PostIndex)); + -+ // Perform a plain Ret(), as abiret() will move SP <- PSP and that is wrong. -+ masm.Ret(vixl::lr); ++ // Perform a plain Ret(), as abiret() will move SP <- PSP and that is wrong. ++ masm.Ret(vixl::lr); +#else - masm.abiret(); + masm.abiret(); +#endif - masm.bind(&failureStoreOther); + masm.bind(&failureStoreOther); Index: branches/2019Q1/www/firefox-esr/files/patch-bug1411481 =================================================================== --- branches/2019Q1/www/firefox-esr/files/patch-bug1411481 (revision 491522) +++ branches/2019Q1/www/firefox-esr/files/patch-bug1411481 (revision 491523) @@ -1,85 +1,83 @@ commit 57a55d1c2d33 Author: sotaro Date: Wed Mar 21 08:59:38 2018 +0900 Bug 1411481- Enable SkiaGL canvas usage on Mac r=jrmuizel --- dom/canvas/CanvasRenderingContext2D.cpp | 3 ++- gfx/thebes/gfxPlatform.cpp | 3 ++- gfx/thebes/gfxPlatform.h | 2 +- gfx/thebes/gfxWindowsPlatform.cpp | 7 +++++++ gfx/thebes/gfxWindowsPlatform.h | 2 ++ 5 files changed, 14 insertions(+), 3 deletions(-) diff --git dom/canvas/CanvasRenderingContext2D.cpp dom/canvas/CanvasRenderingContext2D.cpp index ef3f868bdbf7..8666564b4d0c 100644 --- dom/canvas/CanvasRenderingContext2D.cpp +++ dom/canvas/CanvasRenderingContext2D.cpp -@@ -1438,7 +1438,8 @@ CanvasRenderingContext2D::AllowOpenGLCanvas() const +@@ -1358,7 +1358,8 @@ bool CanvasRenderingContext2D::AllowOpenGLCanvas() con // HTMLCanvasElement::GetCompositorBackendType would return LAYERS_NONE // as well, so it wouldn't help much. - return (mCompositorBackend == LayersBackend::LAYERS_OPENGL) && + return (mCompositorBackend == LayersBackend::LAYERS_OPENGL || + mCompositorBackend == LayersBackend::LAYERS_WR) && - gfxPlatform::GetPlatform()->AllowOpenGLCanvas(); + gfxPlatform::GetPlatform()->AllowOpenGLCanvas(); } diff --git gfx/thebes/gfxPlatform.cpp gfx/thebes/gfxPlatform.cpp index b9beea68d8c5..82635f9ab3ce 100644 --- gfx/thebes/gfxPlatform.cpp +++ gfx/thebes/gfxPlatform.cpp -@@ -1386,7 +1386,8 @@ bool gfxPlatform::AllowOpenGLCanvas() - // so we let content process always assume correct compositor backend. +@@ -1341,7 +1341,8 @@ bool gfxPlatform::AllowOpenGLCanvas() { // The callers have to do the right thing. - bool correctBackend = !XRE_IsParentProcess() || -- ((mCompositorBackend == LayersBackend::LAYERS_OPENGL) && -+ ((mCompositorBackend == LayersBackend::LAYERS_OPENGL || -+ mCompositorBackend == LayersBackend::LAYERS_WR) && - (GetContentBackendFor(mCompositorBackend) == BackendType::SKIA)); + bool correctBackend = + !XRE_IsParentProcess() || +- ((mCompositorBackend == LayersBackend::LAYERS_OPENGL) && ++ ((mCompositorBackend == LayersBackend::LAYERS_OPENGL || ++ mCompositorBackend == LayersBackend::LAYERS_WR) && + (GetContentBackendFor(mCompositorBackend) == BackendType::SKIA)); if (gfxPrefs::CanvasAzureAccelerated() && correctBackend) { diff --git gfx/thebes/gfxPlatform.h gfx/thebes/gfxPlatform.h index c988eb1168a8..3bbf2b763f26 100644 --- gfx/thebes/gfxPlatform.h +++ gfx/thebes/gfxPlatform.h -@@ -286,7 +286,7 @@ public: - /// asking for it, we will examine the commands in the first few seconds - /// of the canvas usage, and potentially change to accelerated or - /// non-accelerated canvas. -- bool AllowOpenGLCanvas(); -+ virtual bool AllowOpenGLCanvas(); - virtual void InitializeSkiaCacheLimits(); +@@ -265,7 +265,7 @@ class gfxPlatform { + /// asking for it, we will examine the commands in the first few seconds + /// of the canvas usage, and potentially change to accelerated or + /// non-accelerated canvas. +- bool AllowOpenGLCanvas(); ++ virtual bool AllowOpenGLCanvas(); + virtual void InitializeSkiaCacheLimits(); - static bool AsyncPanZoomEnabled(); + static bool AsyncPanZoomEnabled(); diff --git gfx/thebes/gfxWindowsPlatform.cpp gfx/thebes/gfxWindowsPlatform.cpp index 9ba6f40c6cc0..4d65791d075f 100644 --- gfx/thebes/gfxWindowsPlatform.cpp +++ gfx/thebes/gfxWindowsPlatform.cpp -@@ -509,6 +509,13 @@ gfxWindowsPlatform::UpdateRenderMode() +@@ -466,6 +466,11 @@ void gfxWindowsPlatform::UpdateRenderMode() { } } -+bool -+gfxWindowsPlatform::AllowOpenGLCanvas() -+{ ++bool gfxWindowsPlatform::AllowOpenGLCanvas() { + // OpenGL canvas is not supported on windows + return false; +} + - mozilla::gfx::BackendType - gfxWindowsPlatform::GetContentBackendFor(mozilla::layers::LayersBackend aLayers) - { + mozilla::gfx::BackendType gfxWindowsPlatform::GetContentBackendFor( + mozilla::layers::LayersBackend aLayers) { + mozilla::gfx::BackendType defaultBackend = diff --git gfx/thebes/gfxWindowsPlatform.h gfx/thebes/gfxWindowsPlatform.h index 47048de8f5f5..47ec0e9e5547 100644 --- gfx/thebes/gfxWindowsPlatform.h +++ gfx/thebes/gfxWindowsPlatform.h -@@ -174,6 +174,8 @@ public: - void SchedulePaintIfDeviceReset() override; - void CheckForContentOnlyDeviceReset(); +@@ -171,6 +171,8 @@ class gfxWindowsPlatform : public gfxPlatform { + void SchedulePaintIfDeviceReset() override; + void CheckForContentOnlyDeviceReset(); -+ bool AllowOpenGLCanvas() override; ++ bool AllowOpenGLCanvas() override; + - mozilla::gfx::BackendType GetContentBackendFor(mozilla::layers::LayersBackend aLayers) override; + mozilla::gfx::BackendType GetContentBackendFor( + mozilla::layers::LayersBackend aLayers) override; - mozilla::gfx::BackendType GetPreferredCanvasBackend() override; Index: branches/2019Q1/www/firefox-esr/files/patch-bug1438678 =================================================================== --- branches/2019Q1/www/firefox-esr/files/patch-bug1438678 (revision 491522) +++ branches/2019Q1/www/firefox-esr/files/patch-bug1438678 (revision 491523) @@ -1,1000 +1,1000 @@ commit 68124009fc5a Author: Nicholas Nethercote Date: Fri Feb 16 17:54:16 2018 +1100 Bug 1438678 - Pass early prefs via shared memory instead of the command line. r=bobowen,jld,glandium. This patch replaces the large -intPrefs/-boolPrefs/-stringPrefs flags with a short-lived, anonymous, shared memory segment that is used to pass the early prefs. Removing the bloat from the command line is nice, but more important is the fact that this will let us pass more prefs at content process start-up, which will allow us to remove the early/late prefs split (bug 1436911). Although this mechanism is only used for prefs, it's conceivable that it could be used for other data that must be received very early by children, and for which the command line isn't ideal. Notable details: - Much of the patch deals with the various platform-specific ways of passing handles/fds to children. - Linux and Mac: we use a fixed fd (8) in combination with the new GeckoChildProcessHost::AddFdToRemap() function (which ensures the child won't close the fd). - Android: like Linux and Mac, but the handles get passed via "parcels" and we use the new SetPrefsFd() function instead of the fixed fd. - Windows: there is no need to duplicate the handle because Windows handles are system-wide. But we do use the new GeckoChildProcessHost::AddHandleToShare() function to add it to the list of inheritable handles. We also ensure that list is processed on all paths (MOZ_SANDBOX with sandbox, MOZ_SANDBOX without sandbox, non-MOZ_SANDBOX) so that the handles are marked as inheritable. The handle is passed via the -prefsHandle flag. The -prefsLen flag is used on all platforms to indicate the size of the shared memory segment. - The patch also moves the serialization/deserialization of the prefs in/out of the shared memory into libpref, which is a better spot for it. (This means Preferences::MustSendToContentProcesses() can be removed.) MozReview-Commit-ID: 8fREEBiYFvc --HG-- extra : rebase_source : 7e4c8ebdbcd7d74d6bd2ab3c9e75a6a17dbd8dfe --- dom/ipc/ContentParent.cpp | 91 +++++++------- dom/ipc/ContentProcess.cpp | 121 ++++++++++--------- dom/ipc/ContentProcess.h | 5 + ipc/chromium/src/base/process_util_win.cc | 4 + ipc/glue/GeckoChildProcessHost.cpp | 36 +++--- ipc/glue/GeckoChildProcessHost.h | 10 ++ .../org/mozilla/gecko/process/IChildProcess.aidl | 3 +- .../main/java/org/mozilla/gecko/GeckoThread.java | 13 +- .../org/mozilla/gecko/mozglue/GeckoLoader.java | 2 +- .../mozilla/gecko/process/GeckoProcessManager.java | 19 +-- .../gecko/process/GeckoServiceChildProcess.java | 4 +- modules/libpref/Preferences.cpp | 134 +++++++++++++++++++-- modules/libpref/Preferences.h | 17 +-- mozglue/android/APKOpen.cpp | 4 +- toolkit/xre/Bootstrap.cpp | 4 +- toolkit/xre/Bootstrap.h | 2 +- toolkit/xre/nsEmbedFunctions.cpp | 3 +- widget/android/GeneratedJNIWrappers.cpp | 4 +- widget/android/GeneratedJNIWrappers.h | 5 +- xpcom/build/nsXULAppAPI.h | 2 +- 20 files changed, 318 insertions(+), 165 deletions(-) diff --git dom/ipc/ContentParent.cpp dom/ipc/ContentParent.cpp index e27f3eedc1b1..60be7005354b 100644 --- dom/ipc/ContentParent.cpp +++ dom/ipc/ContentParent.cpp @@ -7,6 +7,7 @@ #include "mozilla/DebugOnly.h" #include "base/basictypes.h" +#include "base/shared_memory.h" #include "ContentParent.h" #include "TabParent.h" -@@ -1998,61 +1999,56 @@ ContentParent::LaunchSubprocess(ProcessPriority aInitialPriority /* = PROCESS_PR +@@ -1857,64 +1858,56 @@ bool ContentParent::LaunchSubprocess( extraArgs.push_back(idStr); extraArgs.push_back(IsForBrowser() ? "-isForBrowser" : "-notForBrowser"); - nsAutoCStringN<1024> boolPrefs; - nsAutoCStringN<1024> intPrefs; - nsAutoCStringN<1024> stringPrefs; + // Prefs information is passed via anonymous shared memory to avoid bloating + // the command line. - size_t prefsLen; - ContentPrefs::GetEarlyPrefs(&prefsLen); + // Serialize the early prefs. + nsAutoCStringN<1024> prefs; + Preferences::SerializeEarlyPreferences(prefs); - for (unsigned int i = 0; i < prefsLen; i++) { - const char* prefName = ContentPrefs::GetEarlyPref(i); -- MOZ_ASSERT(i == 0 || strcmp(prefName, ContentPrefs::GetEarlyPref(i - 1)) > 0, -- "Content process preferences should be sorted alphabetically."); +- MOZ_ASSERT( +- i == 0 || strcmp(prefName, ContentPrefs::GetEarlyPref(i - 1)) > 0, +- "Content process preferences should be sorted alphabetically."); - - if (!Preferences::MustSendToContentProcesses(prefName)) { - continue; - } - - switch (Preferences::GetType(prefName)) { -- case nsIPrefBranch::PREF_INT: -- intPrefs.Append(nsPrintfCString("%u:%d|", i, Preferences::GetInt(prefName))); -- break; -- case nsIPrefBranch::PREF_BOOL: -- boolPrefs.Append(nsPrintfCString("%u:%d|", i, Preferences::GetBool(prefName))); -- break; -- case nsIPrefBranch::PREF_STRING: { -- nsAutoCString value; -- Preferences::GetCString(prefName, value); -- stringPrefs.Append(nsPrintfCString("%u:%d;%s|", i, value.Length(), value.get())); -- } -- break; -- case nsIPrefBranch::PREF_INVALID: -- break; -- default: -- printf("preference type: %x\n", Preferences::GetType(prefName)); -- MOZ_CRASH(); +- case nsIPrefBranch::PREF_INT: +- intPrefs.Append( +- nsPrintfCString("%u:%d|", i, Preferences::GetInt(prefName))); +- break; +- case nsIPrefBranch::PREF_BOOL: +- boolPrefs.Append( +- nsPrintfCString("%u:%d|", i, Preferences::GetBool(prefName))); +- break; +- case nsIPrefBranch::PREF_STRING: { +- nsAutoCString value; +- Preferences::GetCString(prefName, value); +- stringPrefs.Append( +- nsPrintfCString("%u:%d;%s|", i, value.Length(), value.get())); +- } break; +- case nsIPrefBranch::PREF_INVALID: +- break; +- default: +- printf("preference type: %x\n", Preferences::GetType(prefName)); +- MOZ_CRASH(); - } + // Set up the shared memory. + base::SharedMemory shm; + if (!shm.Create("", /* read_only */ false, /* open_existing */ false, + prefs.Length())) { + NS_ERROR("failed to create shared memory in the parent"); + MarkAsDead(); + return false; -+ } + } + if (!shm.Map(prefs.Length())) { + NS_ERROR("failed to map shared memory in the parent"); + MarkAsDead(); + return false; - } ++ } - nsCString schedulerPrefs = Scheduler::GetPrefs(); + // Copy the serialized prefs into the shared memory. + memcpy(static_cast(shm.memory()), prefs.get(), prefs.Length()); - // Only do these ones if they're non-empty. - if (!intPrefs.IsEmpty()) { - extraArgs.push_back("-intPrefs"); - extraArgs.push_back(intPrefs.get()); - } - if (!boolPrefs.IsEmpty()) { - extraArgs.push_back("-boolPrefs"); - extraArgs.push_back(boolPrefs.get()); - } - if (!stringPrefs.IsEmpty()) { - extraArgs.push_back("-stringPrefs"); - extraArgs.push_back(stringPrefs.get()); - } +#if defined(XP_WIN) + // Record the handle as to-be-shared, and pass it via a command flag. This + // works because Windows handles are system-wide. + HANDLE prefsHandle = shm.handle(); + mSubprocess->AddHandleToShare(prefsHandle); + extraArgs.push_back("-prefsHandle"); + extraArgs.push_back( -+ nsPrintfCString("%zu", reinterpret_cast(prefsHandle)).get()); ++ nsPrintfCString("%zu", reinterpret_cast(prefsHandle)).get()); +#else + // In contrast, Unix fds are per-process. So remap the fd to a fixed one that + // will be used in the child. + // XXX: bug 1440207 is about improving how fixed fds are used. + // + // Note: on Android, AddFdToRemap() sets up the fd to be passed via a Parcel, + // and the fixed fd isn't used. However, we still need to mark it for + // remapping so it doesn't get closed in the child. + mSubprocess->AddFdToRemap(shm.handle().fd, kPrefsFileDescriptor); +#endif -+ + + // Pass the length via a command flag. + extraArgs.push_back("-prefsLen"); + extraArgs.push_back(nsPrintfCString("%zu", uintptr_t(prefs.Length())).get()); - ++ // Scheduler prefs need to be handled differently because the scheduler needs // to start up in the content process before the normal preferences service. + nsCString schedulerPrefs = Scheduler::GetPrefs(); extraArgs.push_back("-schedulerPrefs"); extraArgs.push_back(schedulerPrefs.get()); -@@ -2061,6 +2057,7 @@ ContentParent::LaunchSubprocess(ProcessPriority aInitialPriority /* = PROCESS_PR +@@ -1923,6 +1916,7 @@ bool ContentParent::LaunchSubprocess( } if (!mSubprocess->LaunchAndWaitForProcessHandle(extraArgs)) { + NS_ERROR("failed to launch child in the parent"); MarkAsDead(); return false; } diff --git dom/ipc/ContentProcess.cpp dom/ipc/ContentProcess.cpp index e3c1f16910c6..2441c8cb9224 100644 --- dom/ipc/ContentProcess.cpp +++ dom/ipc/ContentProcess.cpp @@ -8,6 +8,8 @@ #include "ContentProcess.h" #include "ContentPrefs.h" +#include "base/shared_memory.h" +#include "mozilla/Preferences.h" #include "mozilla/Scheduler.h" #if defined(XP_MACOSX) && defined(MOZ_CONTENT_SANDBOX) @@ -15,7 +17,6 @@ #endif #if (defined(XP_WIN) || defined(XP_MACOSX)) && defined(MOZ_CONTENT_SANDBOX) -#include "mozilla/Preferences.h" #include "mozilla/SandboxSettings.h" #include "nsAppDirectoryServiceDefs.h" #include "nsDirectoryService.h" -@@ -81,6 +82,16 @@ SetUpSandboxEnvironment() +@@ -76,14 +77,21 @@ static void SetUpSandboxEnvironment() { } #endif +#ifdef ANDROID +static int gPrefsFd = -1; + -+void -+SetPrefsFd(int aFd) -+{ -+ gPrefsFd = aFd; -+} ++void SetPrefsFd(int aFd) { gPrefsFd = aFd; } +#endif + - bool - ContentProcess::Init(int aArgc, char* aArgv[]) - { -@@ -88,9 +99,10 @@ ContentProcess::Init(int aArgc, char* aArgv[]) + bool ContentProcess::Init(int aArgc, char* aArgv[]) { + // If passed in grab the application path for xpcom init bool foundAppdir = false; bool foundChildID = false; bool foundIsForBrowser = false; - bool foundIntPrefs = false; - bool foundBoolPrefs = false; - bool foundStringPrefs = false; +#ifdef XP_WIN + bool foundPrefsHandle = false; +#endif + bool foundPrefsLen = false; bool foundSchedulerPrefs = false; uint64_t childID; -@@ -103,7 +115,8 @@ ContentProcess::Init(int aArgc, char* aArgv[]) +@@ -96,7 +104,8 @@ bool ContentProcess::Init(int aArgc, char* aArgv[]) { #endif char* schedulerPrefs = nullptr; - InfallibleTArray prefsArray; + base::SharedMemoryHandle prefsHandle = base::SharedMemory::NULLHandle(); + size_t prefsLen = 0; for (int idx = aArgc; idx > 0; idx--) { if (!aArgv[idx]) { continue; -@@ -134,54 +147,24 @@ ContentProcess::Init(int aArgc, char* aArgv[]) +@@ -128,55 +137,24 @@ bool ContentProcess::Init(int aArgc, char* aArgv[]) { } isForBrowser = strcmp(aArgv[idx], "-notForBrowser"); foundIsForBrowser = true; - } else if (!strcmp(aArgv[idx], "-intPrefs")) { -- char* str = aArgv[idx + 1]; ++#ifdef XP_WIN ++ } else if (!strcmp(aArgv[idx], "-prefsHandle")) { + char* str = aArgv[idx + 1]; - while (*str) { - int32_t index = strtol(str, &str, 10); - MOZ_ASSERT(str[0] == ':'); - str++; -- MaybePrefValue value(PrefValue(static_cast(strtol(str, &str, 10)))); +- MaybePrefValue value( +- PrefValue(static_cast(strtol(str, &str, 10)))); - MOZ_ASSERT(str[0] == '|'); - str++; - // XXX: we assume these values as default values, which may not be - // true. We also assume they are unlocked. Fortunately, these prefs - // get reset properly by the first IPC message. - Pref pref(nsCString(ContentPrefs::GetEarlyPref(index)), - /* isLocked */ false, value, MaybePrefValue()); - prefsArray.AppendElement(pref); - } - foundIntPrefs = true; - } else if (!strcmp(aArgv[idx], "-boolPrefs")) { -+#ifdef XP_WIN -+ } else if (!strcmp(aArgv[idx], "-prefsHandle")) { ++ MOZ_ASSERT(str[0] != '\0'); ++ // ContentParent uses %zu to print a word-sized unsigned integer. So even ++ // though strtoull() returns a long long int, it will fit in a uintptr_t. ++ prefsHandle = reinterpret_cast(strtoull(str, &str, 10)); ++ MOZ_ASSERT(str[0] == '\0'); ++ foundPrefsHandle = true; ++#endif ++ } else if (!strcmp(aArgv[idx], "-prefsLen")) { char* str = aArgv[idx + 1]; - while (*str) { - int32_t index = strtol(str, &str, 10); - MOZ_ASSERT(str[0] == ':'); - str++; - MaybePrefValue value(PrefValue(!!strtol(str, &str, 10))); - MOZ_ASSERT(str[0] == '|'); - str++; - Pref pref(nsCString(ContentPrefs::GetEarlyPref(index)), - /* isLocked */ false, value, MaybePrefValue()); - prefsArray.AppendElement(pref); - } - foundBoolPrefs = true; - } else if (!strcmp(aArgv[idx], "-stringPrefs")) { -+ MOZ_ASSERT(str[0] != '\0'); -+ // ContentParent uses %zu to print a word-sized unsigned integer. So even -+ // though strtoull() returns a long long int, it will fit in a uintptr_t. -+ prefsHandle = reinterpret_cast(strtoull(str, &str, 10)); -+ MOZ_ASSERT(str[0] == '\0'); -+ foundPrefsHandle = true; -+#endif -+ } else if (!strcmp(aArgv[idx], "-prefsLen")) { - char* str = aArgv[idx + 1]; +- char* str = aArgv[idx + 1]; - while (*str) { - int32_t index = strtol(str, &str, 10); - MOZ_ASSERT(str[0] == ':'); - str++; - int32_t length = strtol(str, &str, 10); - MOZ_ASSERT(str[0] == ';'); - str++; - MaybePrefValue value(PrefValue(nsCString(str, length))); - Pref pref(nsCString(ContentPrefs::GetEarlyPref(index)), - /* isLocked */ false, value, MaybePrefValue()); - prefsArray.AppendElement(pref); - str += length + 1; - MOZ_ASSERT(*(str - 1) == '|'); - } - foundStringPrefs = true; + MOZ_ASSERT(str[0] != '\0'); + // ContentParent uses %zu to print a word-sized unsigned integer. So even + // though strtoull() returns a long long int, it will fit in a uintptr_t. + prefsLen = strtoull(str, &str, 10); + MOZ_ASSERT(str[0] == '\0'); + foundPrefsLen = true; } else if (!strcmp(aArgv[idx], "-schedulerPrefs")) { schedulerPrefs = aArgv[idx + 1]; foundSchedulerPrefs = true; -@@ -209,21 +192,43 @@ ContentProcess::Init(int aArgc, char* aArgv[]) - bool allFound = foundAppdir - && foundChildID - && foundIsForBrowser -- && foundIntPrefs -- && foundBoolPrefs -- && foundStringPrefs -- && foundSchedulerPrefs; +@@ -201,19 +179,42 @@ bool ContentProcess::Init(int aArgc, char* aArgv[]) { + #endif /* XP_MACOSX && MOZ_CONTENT_SANDBOX */ + + bool allFound = foundAppdir && foundChildID && foundIsForBrowser && +- foundIntPrefs && foundBoolPrefs && foundStringPrefs && +- foundSchedulerPrefs; - -+ && foundPrefsLen -+ && foundSchedulerPrefs ++ foundPrefsLen && foundSchedulerPrefs +#ifdef XP_WIN -+ && foundPrefsHandle ++ && foundPrefsHandle +#endif #if defined(XP_MACOSX) && defined(MOZ_CONTENT_SANDBOX) - allFound &= foundProfile; -+ && foundProfile ++ && foundProfile #endif -+ && true; ++ && true; if (allFound) { break; } } - Preferences::SetEarlyPreferences(&prefsArray); +#ifdef ANDROID + // Android is different; get the FD via gPrefsFd instead of a fixed fd. + MOZ_RELEASE_ASSERT(gPrefsFd != -1); + prefsHandle = base::FileDescriptor(gPrefsFd, /* auto_close */ true); +#elif XP_UNIX + prefsHandle = base::FileDescriptor(kPrefsFileDescriptor, + /* auto_close */ true); +#endif + + // Set up early prefs from the shared memory. + base::SharedMemory shm; + if (!shm.SetHandle(prefsHandle, /* read_only */ true)) { + NS_ERROR("failed to open shared memory in the child"); + return false; + } + if (!shm.Map(prefsLen)) { + NS_ERROR("failed to map shared memory in the child"); + return false; + } + Preferences::DeserializeEarlyPreferences(static_cast(shm.memory()), + prefsLen); + Scheduler::SetPrefs(schedulerPrefs); - mContent.Init(IOThreadChild::message_loop(), - ParentPid(), + mContent.Init(IOThreadChild::message_loop(), ParentPid(), + IOThreadChild::channel(), childID, isForBrowser); diff --git dom/ipc/ContentProcess.h dom/ipc/ContentProcess.h index a3854c761e10..6582c94da496 100644 --- dom/ipc/ContentProcess.h +++ dom/ipc/ContentProcess.h -@@ -49,6 +49,11 @@ private: +@@ -45,6 +45,11 @@ class ContentProcess : public mozilla::ipc::ProcessChi DISALLOW_EVIL_CONSTRUCTORS(ContentProcess); }; +#ifdef ANDROID +// Android doesn't use -prefsHandle, it gets that FD another way. +void SetPrefsFd(int aFd); +#endif + - } // namespace dom - } // namespace mozilla + } // namespace dom + } // namespace mozilla diff --git ipc/chromium/src/base/process_util_win.cc ipc/chromium/src/base/process_util_win.cc index 3ed54cd744ac..46667985cd71 100644 --- ipc/chromium/src/base/process_util_win.cc +++ ipc/chromium/src/base/process_util_win.cc -@@ -354,6 +354,10 @@ bool LaunchApp(const std::wstring& cmdline, +@@ -320,6 +320,11 @@ bool LaunchApp(const std::wstring& cmdline, const Laun LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList = NULL; std::vector handlesToInherit; for (HANDLE h : options.handles_to_inherit) { -+ if (SetHandleInformation(h, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT) == 0) { ++ if (SetHandleInformation(h, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT) == ++ 0) { + MOZ_DIAGNOSTIC_ASSERT(false, "SetHandleInformation failed"); + return false; + } handlesToInherit.push_back(h); } diff --git ipc/glue/GeckoChildProcessHost.cpp ipc/glue/GeckoChildProcessHost.cpp index d18ed9edd4ca..3be1c51d10bb 100644 --- ipc/glue/GeckoChildProcessHost.cpp +++ ipc/glue/GeckoChildProcessHost.cpp -@@ -1030,9 +1030,6 @@ GeckoChildProcessHost::PerformAsyncLaunchInternal(std::vector& aExt +@@ -1018,9 +1018,6 @@ bool GeckoChildProcessHost::PerformAsyncLaunchInternal if (!CrashReporter::IsDummy()) { PROsfd h = PR_FileDesc2NativeHandle(crashAnnotationWritePipe); --# if defined(MOZ_SANDBOX) +-#if defined(MOZ_SANDBOX) - mSandboxBroker.AddHandleToShare(reinterpret_cast(h)); --# endif // defined(MOZ_SANDBOX) +-#endif // defined(MOZ_SANDBOX) mLaunchOptions->handles_to_inherit.push_back(reinterpret_cast(h)); std::string hStr = std::to_string(h); cmdLine.AppendLooseValue(UTF8ToWide(hStr)); -@@ -1043,6 +1040,11 @@ GeckoChildProcessHost::PerformAsyncLaunchInternal(std::vector& aExt +@@ -1031,6 +1028,11 @@ bool GeckoChildProcessHost::PerformAsyncLaunchInternal - # if defined(MOZ_SANDBOX) + #if defined(MOZ_SANDBOX) if (shouldSandboxCurrentProcess) { + // Mark the handles to inherit as inheritable. + for (HANDLE h : mLaunchOptions->handles_to_inherit) { + mSandboxBroker.AddHandleToShare(h); + } + if (mSandboxBroker.LaunchApp(cmdLine.program().c_str(), cmdLine.command_line_string().c_str(), - mLaunchOptions->env_map, -@@ -1180,7 +1182,7 @@ GeckoChildProcessHost::LaunchAndroidService(const char* type, - const base::file_handle_mapping_vector& fds_to_remap, - ProcessHandle* process_handle) - { + mLaunchOptions->env_map, mProcessType, +@@ -1154,7 +1156,7 @@ void GeckoChildProcessHost::LaunchAndroidService( + const char* type, const std::vector& argv, + const base::file_handle_mapping_vector& fds_to_remap, + ProcessHandle* process_handle) { - MOZ_ASSERT((fds_to_remap.size() > 0) && (fds_to_remap.size() <= 3)); + MOZ_RELEASE_ASSERT((2 <= fds_to_remap.size()) && (fds_to_remap.size() <= 4)); JNIEnv* const env = mozilla::jni::GetEnvForThread(); MOZ_ASSERT(env); -@@ -1189,21 +1191,25 @@ GeckoChildProcessHost::LaunchAndroidService(const char* type, +@@ -1164,23 +1166,26 @@ void GeckoChildProcessHost::LaunchAndroidService( for (int ix = 0; ix < argvSize; ix++) { jargs->SetElement(ix, jni::StringParam(argv[ix].c_str(), env)); } - base::file_handle_mapping_vector::const_iterator it = fds_to_remap.begin(); - int32_t ipcFd = it->first; - it++; -- // If the Crash Reporter is disabled, there will not be a second file descriptor. +- // If the Crash Reporter is disabled, there will not be a second file +- // descriptor. + + // XXX: this processing depends entirely on the internals of + // ContentParent::LaunchSubprocess() + // GeckoChildProcessHost::PerformAsyncLaunchInternal(), and the order in + // which they append to fds_to_remap. There must be a better way to do it. + // See bug 1440207. + int32_t prefsFd = fds_to_remap[0].first; + int32_t ipcFd = fds_to_remap[1].first; int32_t crashFd = -1; int32_t crashAnnotationFd = -1; - if (it != fds_to_remap.end() && !CrashReporter::IsDummy()) { - crashFd = it->first; - it++; + if (fds_to_remap.size() == 3) { + crashAnnotationFd = fds_to_remap[2].first; } - if (it != fds_to_remap.end()) { - crashAnnotationFd = it->first; - it++; + if (fds_to_remap.size() == 4) { + crashFd = fds_to_remap[2].first; + crashAnnotationFd = fds_to_remap[3].first; } -- int32_t handle = java::GeckoProcessManager::Start(type, jargs, ipcFd, crashFd, crashAnnotationFd); +- int32_t handle = java::GeckoProcessManager::Start(type, jargs, ipcFd, crashFd, +- crashAnnotationFd); + -+ int32_t handle = java::GeckoProcessManager::Start(type, jargs, prefsFd, ipcFd, crashFd, crashAnnotationFd); ++ int32_t handle = java::GeckoProcessManager::Start(type, jargs, prefsFd, ipcFd, ++ crashFd, crashAnnotationFd); if (process_handle) { *process_handle = handle; diff --git ipc/glue/GeckoChildProcessHost.h ipc/glue/GeckoChildProcessHost.h index 631c42066bc7..0345e221abcc 100644 --- ipc/glue/GeckoChildProcessHost.h +++ ipc/glue/GeckoChildProcessHost.h -@@ -103,6 +103,16 @@ public: - } +@@ -94,6 +94,16 @@ class GeckoChildProcessHost : public ChildProcessHost + task_t GetChildTask() { return mChildTask; } #endif +#ifdef XP_WIN + void AddHandleToShare(HANDLE aHandle) { + mLaunchOptions->handles_to_inherit.push_back(aHandle); + } +#else + void AddFdToRemap(int aSrcFd, int aDstFd) { + mLaunchOptions->fds_to_remap.push_back(std::make_pair(aSrcFd, aDstFd)); + } +#endif + /** * Must run on the IO thread. Cause the OS process to exit and * ensure its OS resources are cleaned up. diff --git mobile/android/geckoview/src/main/aidl/org/mozilla/gecko/process/IChildProcess.aidl mobile/android/geckoview/src/main/aidl/org/mozilla/gecko/process/IChildProcess.aidl index ba26ae1ba06b..a2535f44c72b 100644 --- mobile/android/geckoview/src/main/aidl/org/mozilla/gecko/process/IChildProcess.aidl +++ mobile/android/geckoview/src/main/aidl/org/mozilla/gecko/process/IChildProcess.aidl @@ -12,6 +12,7 @@ import android.os.ParcelFileDescriptor; interface IChildProcess { int getPid(); boolean start(in IProcessManager procMan, in String[] args, in Bundle extras, - in ParcelFileDescriptor ipcPfd, in ParcelFileDescriptor crashReporterPfd, + in ParcelFileDescriptor prefsPfd, in ParcelFileDescriptor ipcPfd, + in ParcelFileDescriptor crashReporterPfd, in ParcelFileDescriptor crashAnnotationPfd); } diff --git mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoThread.java mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoThread.java index dfabfd05daf0..8311920afeec 100644 --- mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoThread.java +++ mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoThread.java @@ -128,6 +128,7 @@ public class GeckoThread extends Thread { public static final int FLAG_PRELOAD_CHILD = 2; // Preload child during main thread start. private static final String EXTRA_ARGS = "args"; + private static final String EXTRA_PREFS_FD = "prefsFd"; private static final String EXTRA_IPC_FD = "ipcFd"; private static final String EXTRA_CRASH_FD = "crashFd"; private static final String EXTRA_CRASH_ANNOTATION_FD = "crashAnnotationFd"; @@ -149,7 +150,8 @@ public class GeckoThread extends Thread { private synchronized boolean init(final GeckoProfile profile, final String[] args, final Bundle extras, final int flags, - final int ipcFd, final int crashFd, + final int prefsFd, final int ipcFd, + final int crashFd, final int crashAnnotationFd) { ThreadUtils.assertOnUiThread(); uiThreadId = android.os.Process.myTid(); @@ -163,6 +165,7 @@ public class GeckoThread extends Thread { mFlags = flags; mExtras = (extras != null) ? new Bundle(extras) : new Bundle(3); + mExtras.putInt(EXTRA_PREFS_FD, prefsFd); mExtras.putInt(EXTRA_IPC_FD, ipcFd); mExtras.putInt(EXTRA_CRASH_FD, crashFd); mExtras.putInt(EXTRA_CRASH_ANNOTATION_FD, crashAnnotationFd); @@ -174,15 +177,16 @@ public class GeckoThread extends Thread { public static boolean initMainProcess(final GeckoProfile profile, final String[] args, final Bundle extras, final int flags) { - return INSTANCE.init(profile, args, extras, flags, + return INSTANCE.init(profile, args, extras, flags, /* fd */ -1, /* fd */ -1, /* fd */ -1, /* fd */ -1); } public static boolean initChildProcess(final String[] args, final Bundle extras, - final int ipcFd, final int crashFd, + final int prefsFd, final int ipcFd, + final int crashFd, final int crashAnnotationFd) { return INSTANCE.init(/* profile */ null, args, extras, /* flags */ 0, - ipcFd, crashFd, crashAnnotationFd); + prefsFd, ipcFd, crashFd, crashAnnotationFd); } private static boolean canUseProfile(final Context context, final GeckoProfile profile, @@ -442,6 +446,7 @@ public class GeckoThread extends Thread { // And go. GeckoLoader.nativeRun(args, + mExtras.getInt(EXTRA_PREFS_FD, -1), mExtras.getInt(EXTRA_IPC_FD, -1), mExtras.getInt(EXTRA_CRASH_FD, -1), mExtras.getInt(EXTRA_CRASH_ANNOTATION_FD, -1)); diff --git mobile/android/geckoview/src/main/java/org/mozilla/gecko/mozglue/GeckoLoader.java mobile/android/geckoview/src/main/java/org/mozilla/gecko/mozglue/GeckoLoader.java index b1830fd86945..ac128b651e7b 100644 --- mobile/android/geckoview/src/main/java/org/mozilla/gecko/mozglue/GeckoLoader.java +++ mobile/android/geckoview/src/main/java/org/mozilla/gecko/mozglue/GeckoLoader.java @@ -463,7 +463,7 @@ public final class GeckoLoader { public static native boolean verifyCRCs(String apkName); // These methods are implemented in mozglue/android/APKOpen.cpp - public static native void nativeRun(String[] args, int ipcFd, int crashFd, int crashAnnotationFd); + public static native void nativeRun(String[] args, int prefsFd, int ipcFd, int crashFd, int crashAnnotationFd); private static native void loadGeckoLibsNative(String apkName); private static native void loadSQLiteLibsNative(String apkName); private static native void loadNSSLibsNative(String apkName); diff --git mobile/android/geckoview/src/main/java/org/mozilla/gecko/process/GeckoProcessManager.java mobile/android/geckoview/src/main/java/org/mozilla/gecko/process/GeckoProcessManager.java index b762e1c9a3eb..dba329ba8f92 100644 --- mobile/android/geckoview/src/main/java/org/mozilla/gecko/process/GeckoProcessManager.java +++ mobile/android/geckoview/src/main/java/org/mozilla/gecko/process/GeckoProcessManager.java @@ -169,14 +169,14 @@ public final class GeckoProcessManager extends IProcessManager.Stub { @WrapForJNI private static int start(final String type, final String[] args, - final int ipcFd, final int crashFd, - final int crashAnnotationFd) { - return INSTANCE.start(type, args, ipcFd, crashFd, crashAnnotationFd, /* retry */ false); + final int prefsFd, final int ipcFd, + final int crashFd, final int crashAnnotationFd) { + return INSTANCE.start(type, args, prefsFd, ipcFd, crashFd, crashAnnotationFd, /* retry */ false); } - private int start(final String type, final String[] args, final int ipcFd, - final int crashFd, final int crashAnnotationFd, - final boolean retry) { + private int start(final String type, final String[] args, final int prefsFd, + final int ipcFd, final int crashFd, + final int crashAnnotationFd, final boolean retry) { final ChildConnection connection = getConnection(type); final IChildProcess child = connection.bind(); if (child == null) { @@ -184,10 +184,12 @@ public final class GeckoProcessManager extends IProcessManager.Stub { } final Bundle extras = GeckoThread.getActiveExtras(); + final ParcelFileDescriptor prefsPfd; final ParcelFileDescriptor ipcPfd; final ParcelFileDescriptor crashPfd; final ParcelFileDescriptor crashAnnotationPfd; try { + prefsPfd = ParcelFileDescriptor.fromFd(prefsFd); ipcPfd = ParcelFileDescriptor.fromFd(ipcFd); crashPfd = (crashFd >= 0) ? ParcelFileDescriptor.fromFd(crashFd) : null; crashAnnotationPfd = (crashAnnotationFd >= 0) ? ParcelFileDescriptor.fromFd(crashAnnotationFd) : null; @@ -198,7 +200,8 @@ public final class GeckoProcessManager extends IProcessManager.Stub { boolean started = false; try { - started = child.start(this, args, extras, ipcPfd, crashPfd, crashAnnotationPfd); + started = child.start(this, args, extras, prefsPfd, ipcPfd, crashPfd, + crashAnnotationPfd); } catch (final RemoteException e) { } @@ -209,7 +212,7 @@ public final class GeckoProcessManager extends IProcessManager.Stub { } Log.w(LOGTAG, "Attempting to kill running child " + type); connection.unbind(); - return start(type, args, ipcFd, crashFd, crashAnnotationFd, /* retry */ true); + return start(type, args, prefsFd, ipcFd, crashFd, crashAnnotationFd, /* retry */ true); } try { diff --git mobile/android/geckoview/src/main/java/org/mozilla/gecko/process/GeckoServiceChildProcess.java mobile/android/geckoview/src/main/java/org/mozilla/gecko/process/GeckoServiceChildProcess.java index f1f6ce109fda..6dc19813fc10 100644 --- mobile/android/geckoview/src/main/java/org/mozilla/gecko/process/GeckoServiceChildProcess.java +++ mobile/android/geckoview/src/main/java/org/mozilla/gecko/process/GeckoServiceChildProcess.java @@ -63,6 +63,7 @@ public class GeckoServiceChildProcess extends Service { public boolean start(final IProcessManager procMan, final String[] args, final Bundle extras, + final ParcelFileDescriptor prefsPfd, final ParcelFileDescriptor ipcPfd, final ParcelFileDescriptor crashReporterPfd, final ParcelFileDescriptor crashAnnotationPfd) { @@ -74,6 +75,7 @@ public class GeckoServiceChildProcess extends Service { sProcessManager = procMan; } + final int prefsFd = prefsPfd.detachFd(); final int ipcFd = ipcPfd.detachFd(); final int crashReporterFd = crashReporterPfd != null ? crashReporterPfd.detachFd() : -1; @@ -83,7 +85,7 @@ public class GeckoServiceChildProcess extends Service { ThreadUtils.postToUiThread(new Runnable() { @Override public void run() { - if (GeckoThread.initChildProcess(args, extras, ipcFd, crashReporterFd, + if (GeckoThread.initChildProcess(args, extras, prefsFd, ipcFd, crashReporterFd, crashAnnotationFd)) { GeckoThread.launch(); } diff --git modules/libpref/Preferences.cpp modules/libpref/Preferences.cpp index 330ed4a09b54..b884591c9271 100644 --- modules/libpref/Preferences.cpp +++ modules/libpref/Preferences.cpp -@@ -2920,7 +2920,7 @@ public: +@@ -2637,7 +2637,7 @@ class AddPreferencesMemoryReporterRunnable : public Ru - } // namespace + } // namespace -// A list of prefs sent early from the parent, via the command line. +// A list of prefs sent early from the parent, via shared memory. static InfallibleTArray* gEarlyDomPrefs; /* static */ already_AddRefed -@@ -3081,11 +3081,130 @@ NS_IMPL_ISUPPORTS(Preferences, +@@ -2782,12 +2782,123 @@ Preferences::~Preferences() { + NS_IMPL_ISUPPORTS(Preferences, nsIPrefService, nsIObserver, nsIPrefBranch, nsISupportsWeakReference) - /* static */ void --Preferences::SetEarlyPreferences(const nsTArray* aDomPrefs) -+Preferences::SerializeEarlyPreferences(nsCString& aStr) -+{ +-/* static */ void Preferences::SetEarlyPreferences( +- const nsTArray* aDomPrefs) { ++/* static */ void Preferences::SerializeEarlyPreferences(nsCString& aStr) { + MOZ_RELEASE_ASSERT(InitStaticMembers()); + + nsAutoCStringN<256> boolPrefs, intPrefs, stringPrefs; + size_t numEarlyPrefs; + dom::ContentPrefs::GetEarlyPrefs(&numEarlyPrefs); + + for (unsigned int i = 0; i < numEarlyPrefs; i++) { + const char* prefName = dom::ContentPrefs::GetEarlyPref(i); + MOZ_ASSERT_IF(i > 0, + strcmp(prefName, dom::ContentPrefs::GetEarlyPref(i - 1)) > 0); + + Pref* pref = pref_HashTableLookup(prefName); + if (!pref || !pref->MustSendToContentProcesses()) { + continue; + } + + switch (pref->Type()) { + case PrefType::Bool: + boolPrefs.Append( -+ nsPrintfCString("%u:%d|", i, Preferences::GetBool(prefName))); ++ nsPrintfCString("%u:%d|", i, Preferences::GetBool(prefName))); + break; + case PrefType::Int: + intPrefs.Append( -+ nsPrintfCString("%u:%d|", i, Preferences::GetInt(prefName))); ++ nsPrintfCString("%u:%d|", i, Preferences::GetInt(prefName))); + break; + case PrefType::String: { + nsAutoCString value; + Preferences::GetCString(prefName, value); + stringPrefs.Append( -+ nsPrintfCString("%u:%d;%s|", i, value.Length(), value.get())); ++ nsPrintfCString("%u:%d;%s|", i, value.Length(), value.get())); + } break; + case PrefType::None: + break; + default: + printf_stderr("preference type: %d\n", int(pref->Type())); + MOZ_CRASH(); + } + } + + aStr.Truncate(); + aStr.Append(boolPrefs); + aStr.Append('\n'); + aStr.Append(intPrefs); + aStr.Append('\n'); + aStr.Append(stringPrefs); + aStr.Append('\n'); + aStr.Append('\0'); +} + -+/* static */ void -+Preferences::DeserializeEarlyPreferences(char* aStr, size_t aStrLen) - { ++/* static */ void Preferences::DeserializeEarlyPreferences(char* aStr, ++ size_t aStrLen) { MOZ_ASSERT(!XRE_IsParentProcess()); - gEarlyDomPrefs = new InfallibleTArray(mozilla::Move(*aDomPrefs)); + MOZ_ASSERT(!gEarlyDomPrefs); + gEarlyDomPrefs = new InfallibleTArray(); -+ + + char* p = aStr; + + // XXX: we assume these pref values are default values, which may not be + // true. We also assume they are unlocked. Fortunately, these prefs get reset + // properly by the first IPC message. + + // Get the bool prefs. + while (*p != '\n') { + int32_t index = strtol(p, &p, 10); + MOZ_ASSERT(p[0] == ':'); + p++; + int v = strtol(p, &p, 10); + MOZ_ASSERT(v == 0 || v == 1); + dom::MaybePrefValue value(dom::PrefValue(!!v)); + MOZ_ASSERT(p[0] == '|'); + p++; + dom::Pref pref(nsCString(dom::ContentPrefs::GetEarlyPref(index)), -+ /* isLocked */ false, -+ value, -+ dom::MaybePrefValue()); ++ /* isLocked */ false, value, dom::MaybePrefValue()); + gEarlyDomPrefs->AppendElement(pref); + } + p++; + + // Get the int prefs. + while (*p != '\n') { + int32_t index = strtol(p, &p, 10); + MOZ_ASSERT(p[0] == ':'); + p++; + dom::MaybePrefValue value( -+ dom::PrefValue(static_cast(strtol(p, &p, 10)))); ++ dom::PrefValue(static_cast(strtol(p, &p, 10)))); + MOZ_ASSERT(p[0] == '|'); + p++; + dom::Pref pref(nsCString(dom::ContentPrefs::GetEarlyPref(index)), -+ /* isLocked */ false, -+ value, -+ dom::MaybePrefValue()); ++ /* isLocked */ false, value, dom::MaybePrefValue()); + gEarlyDomPrefs->AppendElement(pref); + } + p++; + + // Get the string prefs. + while (*p != '\n') { + int32_t index = strtol(p, &p, 10); + MOZ_ASSERT(p[0] == ':'); + p++; + int32_t length = strtol(p, &p, 10); + MOZ_ASSERT(p[0] == ';'); + p++; + dom::MaybePrefValue value(dom::PrefValue(nsCString(p, length))); + dom::Pref pref(nsCString(dom::ContentPrefs::GetEarlyPref(index)), -+ /* isLocked */ false, -+ value, -+ dom::MaybePrefValue()); ++ /* isLocked */ false, value, dom::MaybePrefValue()); + gEarlyDomPrefs->AppendElement(pref); + p += length + 1; + MOZ_ASSERT(*(p - 1) == '|'); + } + p++; + + MOZ_ASSERT(*p == '\0'); + + // We finished parsing on a '\0'. That should be the last char in the shared + // memory. + MOZ_ASSERT(aStr + aStrLen - 1 == p); - ++ #ifdef DEBUG MOZ_ASSERT(gPhase == ContentProcessPhase::eNoPrefsSet); -@@ -4298,15 +4417,6 @@ Preferences::HasUserValue(const char* aPrefName) - return pref && pref->HasUserValue(); - } + gPhase = ContentProcessPhase::eEarlyPrefsSet; +@@ -3894,14 +4005,6 @@ static nsresult pref_ReadPrefFromJar(nsZipArchive* aJa --/* static */ bool --Preferences::MustSendToContentProcesses(const char* aPrefName) --{ + Pref* pref = pref_HashTableLookup(aPrefName); + return pref && pref->HasUserValue(); +-} +- +-/* static */ bool Preferences::MustSendToContentProcesses( +- const char* aPrefName) { - NS_ENSURE_TRUE(InitStaticMembers(), false); - - Pref* pref = pref_HashTableLookup(aPrefName); - return pref && pref->MustSendToContentProcesses(); --} -- - /* static */ int32_t - Preferences::GetType(const char* aPrefName) - { + } + + /* static */ int32_t Preferences::GetType(const char* aPrefName) { diff --git modules/libpref/Preferences.h modules/libpref/Preferences.h index 1cb825ecbfe5..c149db62b525 100644 --- modules/libpref/Preferences.h +++ modules/libpref/Preferences.h @@ -41,6 +41,11 @@ class PrefValue; struct PrefsSizes; +#ifdef XP_UNIX +// XXX: bug 1440207 is about improving how fixed fds such as this are used. +static const int kPrefsFileDescriptor = 8; +#endif + // Keep this in sync with PrefType in parser/src/lib.rs. - enum class PrefValueKind : uint8_t - { -@@ -230,9 +235,6 @@ public: + enum class PrefValueKind : uint8_t { Default, User }; + +@@ -191,9 +196,6 @@ class Preferences final : public nsIPrefService, // Whether the pref has a user value or not. static bool HasUserValue(const char* aPref); - // Must the pref be sent to content processes when they start? - static bool MustSendToContentProcesses(const char* aPref); - // Adds/Removes the observer for the root pref branch. See nsIPrefBranch.idl // for details. static nsresult AddStrongObserver(nsIObserver* aObserver, const char* aPref); -@@ -328,11 +330,12 @@ public: +@@ -277,11 +279,12 @@ class Preferences final : public nsIPrefService, // When a content process is created these methods are used to pass prefs in // bulk from the parent process. "Early" preferences are ones that are needed - // very early on in the content process's lifetime; they are passed via the - // command line. "Late" preferences are the remainder, which are passed via - // IPC message. + // very early on in the content process's lifetime; they are passed via a + // special shared memory segment. "Late" preferences are the remainder, which + // are passed via a standard IPC message. + static void SerializeEarlyPreferences(nsCString& aStr); + static void DeserializeEarlyPreferences(char* aStr, size_t aStrLen); static void GetPreferences(InfallibleTArray* aSettings); - static void SetEarlyPreferences(const nsTArray* aSettings); static void SetLatePreferences(const nsTArray* aSettings); // When a single pref is changed in the parent process, these methods are diff --git mozglue/android/APKOpen.cpp mozglue/android/APKOpen.cpp index 5f1ef55b605e..b57192488725 100644 --- mozglue/android/APKOpen.cpp +++ mozglue/android/APKOpen.cpp -@@ -392,7 +392,7 @@ FreeArgv(char** argv, int argc) - } - +@@ -378,7 +378,8 @@ static void FreeArgv(char** argv, int argc) { extern "C" APKOPEN_EXPORT void MOZ_JNICALL --Java_org_mozilla_gecko_mozglue_GeckoLoader_nativeRun(JNIEnv *jenv, jclass jc, jobjectArray jargs, int ipcFd, int crashFd, int crashAnnotationFd) -+Java_org_mozilla_gecko_mozglue_GeckoLoader_nativeRun(JNIEnv *jenv, jclass jc, jobjectArray jargs, int prefsFd, int ipcFd, int crashFd, int crashAnnotationFd) - { + Java_org_mozilla_gecko_mozglue_GeckoLoader_nativeRun(JNIEnv* jenv, jclass jc, + jobjectArray jargs, +- int ipcFd, int crashFd, ++ int prefsFd, int ipcFd, ++ int crashFd, + int crashAnnotationFd) { int argc = 0; char** argv = CreateArgvFromObjectArray(jenv, jargs, &argc); -@@ -407,7 +407,7 @@ Java_org_mozilla_gecko_mozglue_GeckoLoader_nativeRun(JNIEnv *jenv, jclass jc, jo +@@ -393,7 +394,8 @@ Java_org_mozilla_gecko_mozglue_GeckoLoader_nativeRun(J gBootstrap->GeckoStart(jenv, argv, argc, sAppData); ElfLoader::Singleton.ExpectShutdown(true); } else { - gBootstrap->XRE_SetAndroidChildFds(jenv, ipcFd, crashFd, crashAnnotationFd); -+ gBootstrap->XRE_SetAndroidChildFds(jenv, prefsFd, ipcFd, crashFd, crashAnnotationFd); ++ gBootstrap->XRE_SetAndroidChildFds(jenv, prefsFd, ipcFd, crashFd, ++ crashAnnotationFd); gBootstrap->XRE_SetProcessType(argv[argc - 1]); XREChildData childData; diff --git toolkit/xre/Bootstrap.cpp toolkit/xre/Bootstrap.cpp index 5688519822a9..7e857969a4fb 100644 --- toolkit/xre/Bootstrap.cpp +++ toolkit/xre/Bootstrap.cpp -@@ -78,8 +78,8 @@ public: +@@ -71,9 +71,11 @@ class BootstrapImpl final : public Bootstrap { ::GeckoStart(aEnv, argv, argc, aAppData); } -- virtual void XRE_SetAndroidChildFds(JNIEnv* aEnv, int aIPCFd, int aCrashFd, int aCrashAnnotationFd) override { +- virtual void XRE_SetAndroidChildFds(JNIEnv* aEnv, int aIPCFd, int aCrashFd, ++ virtual void XRE_SetAndroidChildFds(JNIEnv* aEnv, int aPrefsFd, int aIPCFd, ++ int aCrashFd, + int aCrashAnnotationFd) override { - ::XRE_SetAndroidChildFds(aEnv, aIPCFd, aCrashFd, aCrashAnnotationFd); -+ virtual void XRE_SetAndroidChildFds(JNIEnv* aEnv, int aPrefsFd, int aIPCFd, int aCrashFd, int aCrashAnnotationFd) override { -+ ::XRE_SetAndroidChildFds(aEnv, aPrefsFd, aIPCFd, aCrashFd, aCrashAnnotationFd); ++ ::XRE_SetAndroidChildFds(aEnv, aPrefsFd, aIPCFd, aCrashFd, ++ aCrashAnnotationFd); } #endif diff --git toolkit/xre/Bootstrap.h toolkit/xre/Bootstrap.h index 686d0a38e324..77adcef80e1f 100644 --- toolkit/xre/Bootstrap.h +++ toolkit/xre/Bootstrap.h -@@ -113,7 +113,7 @@ public: - #ifdef MOZ_WIDGET_ANDROID - virtual void GeckoStart(JNIEnv* aEnv, char** argv, int argc, const StaticXREAppData& aAppData) = 0; +@@ -112,8 +112,8 @@ class Bootstrap { + virtual void GeckoStart(JNIEnv* aEnv, char** argv, int argc, + const StaticXREAppData& aAppData) = 0; -- virtual void XRE_SetAndroidChildFds(JNIEnv* aEnv, int aIPCFd, int aCrashFd, int aCrashAnnotationFd) = 0; -+ virtual void XRE_SetAndroidChildFds(JNIEnv* aEnv, int aPrefsFd, int aIPCFd, int aCrashFd, int aCrashAnnotationFd) = 0; +- virtual void XRE_SetAndroidChildFds(JNIEnv* aEnv, int aIPCFd, int aCrashFd, +- int aCrashAnnotationFd) = 0; ++ virtual void XRE_SetAndroidChildFds(JNIEnv* aEnv, int aPrefsFd, int aIPCFd, ++ int aCrashFd, int aCrashAnnotationFd) = 0; #endif #ifdef LIBFUZZER diff --git toolkit/xre/nsEmbedFunctions.cpp toolkit/xre/nsEmbedFunctions.cpp index 53bd2bc2eb47..83184e97ba92 100644 --- toolkit/xre/nsEmbedFunctions.cpp +++ toolkit/xre/nsEmbedFunctions.cpp -@@ -243,9 +243,10 @@ GeckoProcessType sChildProcessType = GeckoProcessType_Default; +@@ -226,9 +226,10 @@ GeckoProcessType sChildProcessType = GeckoProcessType_ + } // namespace mozilla #if defined(MOZ_WIDGET_ANDROID) - void --XRE_SetAndroidChildFds (JNIEnv* env, int ipcFd, int crashFd, int crashAnnotationFd) -+XRE_SetAndroidChildFds (JNIEnv* env, int prefsFd, int ipcFd, int crashFd, int crashAnnotationFd) - { +-void XRE_SetAndroidChildFds(JNIEnv* env, int ipcFd, int crashFd, ++void XRE_SetAndroidChildFds(JNIEnv* env, int prefsFd, int ipcFd, int crashFd, + int crashAnnotationFd) { mozilla::jni::SetGeckoThreadEnv(env); + mozilla::dom::SetPrefsFd(prefsFd); IPC::Channel::SetClientChannelFd(ipcFd); CrashReporter::SetNotificationPipeForChild(crashFd); CrashReporter::SetCrashAnnotationPipeForChild(crashAnnotationFd); diff --git widget/android/GeneratedJNIWrappers.cpp widget/android/GeneratedJNIWrappers.cpp index e3f6af0cc575..4165df59f0e8 100644 --- widget/android/GeneratedJNIWrappers.cpp +++ widget/android/GeneratedJNIWrappers.cpp @@ -2355,9 +2355,9 @@ constexpr char GeckoProcessManager::GetEditableParent_t::signature[]; constexpr char GeckoProcessManager::Start_t::name[]; constexpr char GeckoProcessManager::Start_t::signature[]; -auto GeckoProcessManager::Start(mozilla::jni::String::Param a0, mozilla::jni::ObjectArray::Param a1, int32_t a2, int32_t a3, int32_t a4) -> int32_t +auto GeckoProcessManager::Start(mozilla::jni::String::Param a0, mozilla::jni::ObjectArray::Param a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5) -> int32_t { - return mozilla::jni::Method::Call(GeckoProcessManager::Context(), nullptr, a0, a1, a2, a3, a4); + return mozilla::jni::Method::Call(GeckoProcessManager::Context(), nullptr, a0, a1, a2, a3, a4, a5); } const char GeckoServiceChildProcess::name[] = diff --git widget/android/GeneratedJNIWrappers.h widget/android/GeneratedJNIWrappers.h index ece79ac94a71..228affa1e550 100644 --- widget/android/GeneratedJNIWrappers.h +++ widget/android/GeneratedJNIWrappers.h @@ -6696,10 +6696,11 @@ public: mozilla::jni::ObjectArray::Param, int32_t, int32_t, + int32_t, int32_t> Args; static constexpr char name[] = "start"; static constexpr char signature[] = - "(Ljava/lang/String;[Ljava/lang/String;III)I"; + "(Ljava/lang/String;[Ljava/lang/String;IIII)I"; static const bool isStatic = true; static const mozilla::jni::ExceptionMode exceptionMode = mozilla::jni::ExceptionMode::ABORT; @@ -6709,7 +6710,7 @@ public: mozilla::jni::DispatchTarget::CURRENT; }; - static auto Start(mozilla::jni::String::Param, mozilla::jni::ObjectArray::Param, int32_t, int32_t, int32_t) -> int32_t; + static auto Start(mozilla::jni::String::Param, mozilla::jni::ObjectArray::Param, int32_t, int32_t, int32_t, int32_t) -> int32_t; static const mozilla::jni::CallingThread callingThread = mozilla::jni::CallingThread::ANY; diff --git xpcom/build/nsXULAppAPI.h xpcom/build/nsXULAppAPI.h index 94f6daf864c9..d6ac10d51d76 100644 --- xpcom/build/nsXULAppAPI.h +++ xpcom/build/nsXULAppAPI.h -@@ -398,7 +398,7 @@ XRE_API(const char*, +@@ -378,7 +378,8 @@ XRE_API(const char*, XRE_ChildProcessTypeToString, #if defined(MOZ_WIDGET_ANDROID) - XRE_API(void, -- XRE_SetAndroidChildFds, (JNIEnv* env, int ipcFd, int crashFd, int crashAnnotationFd)) -+ XRE_SetAndroidChildFds, (JNIEnv* env, int prefsFd, int ipcFd, int crashFd, int crashAnnotationFd)) - #endif // defined(MOZ_WIDGET_ANDROID) + XRE_API(void, XRE_SetAndroidChildFds, +- (JNIEnv * env, int ipcFd, int crashFd, int crashAnnotationFd)) ++ (JNIEnv * env, int prefsFd, int ipcFd, int crashFd, ++ int crashAnnotationFd)) + #endif // defined(MOZ_WIDGET_ANDROID) - XRE_API(void, + XRE_API(void, XRE_SetProcessType, (const char* aProcessTypeString)) Index: branches/2019Q1/www/firefox-esr/files/patch-bug1442583 =================================================================== --- branches/2019Q1/www/firefox-esr/files/patch-bug1442583 (revision 491522) +++ branches/2019Q1/www/firefox-esr/files/patch-bug1442583 (revision 491523) @@ -1,39 +1,43 @@ commit 7371a080accd Author: Lars T Hansen Date: Mon Mar 5 09:55:28 2018 +0100 Bug 1442583 - Properly initialize ARM64 icache flushing machinery. r=sstangl --HG-- extra : rebase_source : 73b5921da1fa0a19d6072e35d09bd7b528bb6bfc extra : intermediate-source : 19516efbbf6750ba04e11c7099586d5be2fe818f extra : source : 4316cc82d6302edf839a4af6fcb815f0ffa9f65c --- js/src/jit/ProcessExecutableMemory.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git js/src/jit/ProcessExecutableMemory.cpp js/src/jit/ProcessExecutableMemory.cpp index e763a9d68dc17..8a6d50b6a7845 100644 --- js/src/jit/ProcessExecutableMemory.cpp +++ js/src/jit/ProcessExecutableMemory.cpp @@ -20,6 +20,9 @@ #include "jsutil.h" #include "gc/Memory.h" +#ifdef JS_CODEGEN_ARM64 -+# include "jit/arm64/vixl/Cpu-vixl.h" ++#include "jit/arm64/vixl/Cpu-vixl.h" +#endif #include "threading/LockGuard.h" #include "threading/Mutex.h" #include "util/Windows.h" -@@ -621,6 +624,10 @@ js::jit::DeallocateExecutableMemory(void* addr, size_t bytes) - bool - js::jit::InitProcessExecutableMemory() - { +@@ -574,7 +577,13 @@ void js::jit::DeallocateExecutableMemory(void* addr, s + execMemory.deallocate(addr, bytes, /* decommit = */ true); + } + +-bool js::jit::InitProcessExecutableMemory() { return execMemory.init(); } ++bool js::jit::InitProcessExecutableMemory() { +#ifdef JS_CODEGEN_ARM64 -+ // Initialize instruction cache flushing. -+ vixl::CPU::SetUp(); ++ // Initialize instruction cache flushing. ++ vixl::CPU::SetUp(); +#endif - return execMemory.init(); - } ++ return execMemory.init(); ++} + + void js::jit::ReleaseProcessExecutableMemory() { execMemory.release(); } Index: branches/2019Q1/www/firefox-esr/files/patch-bug1447359 =================================================================== --- branches/2019Q1/www/firefox-esr/files/patch-bug1447359 (revision 491522) +++ branches/2019Q1/www/firefox-esr/files/patch-bug1447359 (revision 491523) @@ -1,45 +1,45 @@ commit fef467b5a93d Author: Luke Wagner Date: Thu Mar 22 10:28:13 2018 -0500 Bug 1447359 - Baldr: add AutoForbidPools in a few missing places (r=lth) --HG-- extra : rebase_source : 75f1909deb352391529ce5e58a89e5f9cfeb3662 --- js/src/jit/arm64/MacroAssembler-arm64-inl.h | 1 + js/src/jit/arm64/MacroAssembler-arm64.cpp | 2 ++ 2 files changed, 3 insertions(+) diff --git js/src/jit/arm64/MacroAssembler-arm64-inl.h js/src/jit/arm64/MacroAssembler-arm64-inl.h index 7061cbfd93ebb..190442f7afa0a 100644 --- js/src/jit/arm64/MacroAssembler-arm64-inl.h +++ js/src/jit/arm64/MacroAssembler-arm64-inl.h -@@ -359,6 +359,7 @@ MacroAssembler::sub32FromStackPtrWithPatch(Register dest) - { - vixl::UseScratchRegisterScope temps(this); - const ARMRegister scratch = temps.AcquireX(); -+ AutoForbidPools afp(this, /* max number of instructions in scope = */ 3); - CodeOffset offs = CodeOffset(currentOffset()); - movz(scratch, 0, 0); - movk(scratch, 0, 16); +@@ -268,6 +268,7 @@ void MacroAssembler::add64(Imm64 imm, Register64 dest) + CodeOffset MacroAssembler::sub32FromStackPtrWithPatch(Register dest) { + vixl::UseScratchRegisterScope temps(this); + const ARMRegister scratch = temps.AcquireX(); ++ AutoForbidPools afp(this, /* max number of instructions in scope = */ 3); + CodeOffset offs = CodeOffset(currentOffset()); + movz(scratch, 0, 0); + movk(scratch, 0, 16); diff --git js/src/jit/arm64/MacroAssembler-arm64.cpp js/src/jit/arm64/MacroAssembler-arm64.cpp index 7b599b7e9d610..4e8fdb6a67019 100644 --- js/src/jit/arm64/MacroAssembler-arm64.cpp +++ js/src/jit/arm64/MacroAssembler-arm64.cpp -@@ -707,6 +707,7 @@ MacroAssembler::patchFarJump(CodeOffset farJump, uint32_t targetOffset) - CodeOffset - MacroAssembler::nopPatchableToCall(const wasm::CallSiteDesc& desc) - { -+ AutoForbidPools afp(this, /* max number of instructions in scope = */ 1); - CodeOffset offset(currentOffset()); - Nop(); - append(desc, CodeOffset(currentOffset())); -@@ -1077,6 +1078,7 @@ MacroAssembler::comment(const char* msg) - CodeOffset - MacroAssembler::wasmTrapInstruction() - { -+ AutoForbidPools afp(this, /* max number of instructions in scope = */ 1); - CodeOffset offs(currentOffset()); - Unreachable(); - return offs; +@@ -666,6 +666,7 @@ void MacroAssembler::patchNearJumpToNop(uint8_t* jump) + } + + CodeOffset MacroAssembler::nopPatchableToCall(const wasm::CallSiteDesc& desc) { ++ AutoForbidPools afp(this, /* max number of instructions in scope = */ 1); + CodeOffset offset(currentOffset()); + Nop(); + append(desc, CodeOffset(currentOffset())); +@@ -1002,6 +1003,7 @@ void MacroAssembler::comment(const char* msg) { Assemb + // wasm support + + CodeOffset MacroAssembler::wasmTrapInstruction() { ++ AutoForbidPools afp(this, /* max number of instructions in scope = */ 1); + CodeOffset offs(currentOffset()); + Unreachable(); + return offs; Index: branches/2019Q1/www/firefox-esr/files/patch-bug1451292 =================================================================== --- branches/2019Q1/www/firefox-esr/files/patch-bug1451292 (revision 491522) +++ branches/2019Q1/www/firefox-esr/files/patch-bug1451292 (revision 491523) @@ -1,33 +1,33 @@ commit b3a02fddbce8 Author: Lars T Hansen Date: Wed Apr 4 15:48:48 2018 +0200 Bug 1451292 - Better payload for arm64 breakpoint instruction. r=sstangl At least some non-zero payloads confuse GDB and make it iloop on the breakpoint instruction rather than break to the command line as it should. There seems to be no reason not to use a zero payload. --HG-- extra : rebase_source : 6d6f9aa2911b86b02572f88948d48bc2238c6353 extra : amend_source : 9fed9235d481a9eadafc4a3e0075c9fef8b6050d --- js/src/jit/arm64/MacroAssembler-arm64.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git js/src/jit/arm64/MacroAssembler-arm64.cpp js/src/jit/arm64/MacroAssembler-arm64.cpp index 4ea64b1225d00..a212de0ec2f45 100644 --- js/src/jit/arm64/MacroAssembler-arm64.cpp +++ js/src/jit/arm64/MacroAssembler-arm64.cpp -@@ -237,8 +237,9 @@ MacroAssemblerCompat::profilerEnterFrame(RegisterOrSP framePtr, Register scratch - void - MacroAssemblerCompat::breakpoint() - { -- static int code = 0xA77; -- Brk((code++) & 0xffff); -+ // Note, other payloads are possible, but GDB is known to misinterpret them -+ // sometimes and iloop on the breakpoint instead of stopping properly. -+ Brk(0); +@@ -249,8 +249,9 @@ void MacroAssemblerCompat::profilerEnterFrame(Register + } + + void MacroAssemblerCompat::breakpoint() { +- static int code = 0xA77; +- Brk((code++) & 0xffff); ++ // Note, other payloads are possible, but GDB is known to misinterpret them ++ // sometimes and iloop on the breakpoint instead of stopping properly. ++ Brk(0); } // Either `any` is valid or `sixtyfour` is valid. Return a 32-bit ARMRegister Index: branches/2019Q1/www/firefox-esr/files/patch-bug1456556 =================================================================== --- branches/2019Q1/www/firefox-esr/files/patch-bug1456556 (revision 491522) +++ branches/2019Q1/www/firefox-esr/files/patch-bug1456556 (revision 491523) @@ -1,22 +1,22 @@ commit f6fc0b418aa3 Author: Andrea Marchesini Date: Tue May 1 08:47:13 2018 +0200 Bug 1456556 - FetchConsumer scope-exit RAII must grab 'self' by value, r=erahm --- dom/fetch/FetchConsumer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git dom/fetch/FetchConsumer.cpp dom/fetch/FetchConsumer.cpp index 134bf7f2e703a..3c3687fea1d5a 100644 --- dom/fetch/FetchConsumer.cpp +++ dom/fetch/FetchConsumer.cpp -@@ -582,7 +582,7 @@ FetchBodyConsumer::ContinueConsumeBody(nsresult aStatus, - RefPtr localPromise = mConsumePromise.forget(); +@@ -560,7 +560,7 @@ void FetchBodyConsumer::ContinueConsumeBody(n RefPtr> self = this; -- auto autoReleaseObject = mozilla::MakeScopeExit([&] { -+ auto autoReleaseObject = mozilla::MakeScopeExit([self] { - self->ReleaseObject(); - }); + auto autoReleaseObject = +- mozilla::MakeScopeExit([&] { self->ReleaseObject(); }); ++ mozilla::MakeScopeExit([self] { self->ReleaseObject(); }); + if (aShuttingDown) { + // If shutting down, we don't want to resolve any promise. Index: branches/2019Q1/www/firefox-esr/files/patch-z-bug1436911 =================================================================== --- branches/2019Q1/www/firefox-esr/files/patch-z-bug1436911 (revision 491522) +++ branches/2019Q1/www/firefox-esr/files/patch-z-bug1436911 (revision 491523) @@ -1,1164 +1,1135 @@ commit 6b81d0b99f20 Author: Nicholas Nethercote Date: Thu Mar 8 15:47:24 2018 +1100 Bug 1436911 - Avoid the early/late prefs split. r=glandium All prefs that need to be sent to a new content process are now put into the shared memory segment, and they are identified by the pref name instead of an index into a list. The old IPC used at process startup (in XPCOMInitData) is removed. Benefits: - It removes the need for the early prefs list (dom/ipc/ContentProcesses.{h,cpp}) and the associated checking, which is ugly and often trips people up (e.g. bug 1432979, bug 1439406). - Using prefnames instead of indices fixes some fragility (fixing bug 1419432). - It fixes the problem of early prefs being installed as unlocked default values even if they are locked and/or have user values. MozReview-Commit-ID: FRIzHF8Tjd --- dom/ipc/ContentChild.cpp | 2 - dom/ipc/ContentParent.cpp | 4 +- dom/ipc/ContentPrefs.cpp | 357 ------------------------------ dom/ipc/ContentPrefs.h | 27 --- dom/ipc/ContentProcess.cpp | 5 +- dom/ipc/PContent.ipdl | 7 +- dom/ipc/moz.build | 2 - layout/style/nsCSSProps.h | 2 +- modules/libpref/Preferences.cpp | 470 ++++++++++++++++++++++------------------ modules/libpref/Preferences.h | 15 +- 10 files changed, 278 insertions(+), 613 deletions(-) diff --git dom/ipc/ContentChild.cpp dom/ipc/ContentChild.cpp index f61ab07b81e2..af1ef9cf4c7e 100644 --- dom/ipc/ContentChild.cpp +++ dom/ipc/ContentChild.cpp -@@ -1185,8 +1185,6 @@ void - ContentChild::InitXPCOM(const XPCOMInitData& aXPCOMInit, - const mozilla::dom::ipc::StructuredCloneData& aInitialData) - { +@@ -1094,8 +1094,6 @@ void ContentChild::InitGraphicsDeviceData(const Conten + void ContentChild::InitXPCOM( + const XPCOMInitData& aXPCOMInit, + const mozilla::dom::ipc::StructuredCloneData& aInitialData) { - Preferences::SetLatePreferences(&aXPCOMInit.prefs()); - // Do this as early as possible to get the parent process to initialize the // background thread since we'll likely need database information very soon. BackgroundChild::Startup(); diff --git dom/ipc/ContentParent.cpp dom/ipc/ContentParent.cpp index 208bb47a970b..4ce5c6bf23d5 100644 --- dom/ipc/ContentParent.cpp +++ dom/ipc/ContentParent.cpp @@ -197,7 +197,6 @@ #include "nsLayoutStylesheetCache.h" -#include "ContentPrefs.h" #include "mozilla/Sprintf.h" #ifdef MOZ_WEBRTC -@@ -2009,7 +2008,7 @@ ContentParent::LaunchSubprocess(ProcessPriority aInitialPriority /* = PROCESS_PR +@@ -1863,7 +1862,7 @@ bool ContentParent::LaunchSubprocess( // Serialize the early prefs. nsAutoCStringN<1024> prefs; - Preferences::SerializeEarlyPreferences(prefs); + Preferences::SerializePreferences(prefs); // Set up the shared memory. base::SharedMemory shm; -@@ -2228,7 +2227,6 @@ ContentParent::InitInternal(ProcessPriority aInitialPriority) +@@ -2034,7 +2033,6 @@ void ContentParent::InitInternal(ProcessPriority aInit XPCOMInitData xpcomInit; - Preferences::GetPreferences(&xpcomInit.prefs()); nsCOMPtr io(do_GetIOService()); MOZ_ASSERT(io, "No IO service?"); DebugOnly rv = io->GetOffline(&xpcomInit.isOffline()); diff --git dom/ipc/ContentPrefs.cpp dom/ipc/ContentPrefs.cpp deleted file mode 100644 index 808b797d9bee..000000000000 --- dom/ipc/ContentPrefs.cpp +++ /dev/null -@@ -1,362 +0,0 @@ +@@ -1,360 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "ContentPrefs.h" - -/****************************************************************************** - * - * DO NOT ADD PREFS TO THIS LIST WITHOUT DOM PEER REVIEW - * - * This is the list of preferences that are sent to the content process on - * startup. Only prefs that are required immediately upon startup should be - * listed here. The first IPC message received in the content process will - * contain all the other prefs. Prefs should only be listed here if they must be - * read before the first IPC message is received. - * - ******************************************************************************/ - -const char* mozilla::dom::ContentPrefs::gEarlyPrefs[] = { -- "accessibility.monoaudio.enable", -- "accessibility.mouse_focuses_formcontrol", -- "accessibility.tabfocus_applies_to_xul", -- "app.update.channel", -- "browser.autofocus", -- "browser.dom.window.dump.enabled", -- "browser.sessionhistory.max_entries", -- "browser.sessionhistory.max_total_viewers", +- "accessibility.monoaudio.enable", +- "accessibility.mouse_focuses_formcontrol", +- "accessibility.tabfocus_applies_to_xul", +- "app.update.channel", +- "browser.autofocus", +- "browser.dom.window.dump.enabled", +- "browser.sessionhistory.max_entries", +- "browser.sessionhistory.max_total_viewers", -#if defined(NIGHTLY_BUILD) || defined(DEBUG) -- "browser.startup.record", +- "browser.startup.record", -#endif -#if defined(ANDROID) -- "consoleservice.logcat", +- "consoleservice.logcat", -#endif -- "content.cors.disable", -- "content.cors.no_private_data", -- "content.notify.backoffcount", -- "content.notify.interval", -- "content.notify.ontimer", -- "content.sink.enable_perf_mode", -- "content.sink.event_probe_rate", -- "content.sink.initial_perf_time", -- "content.sink.interactive_deflect_count", -- "content.sink.interactive_parse_time", -- "content.sink.interactive_time", -- "content.sink.pending_event_mode", -- "content.sink.perf_deflect_count", -- "content.sink.perf_parse_time", -- "device.storage.prompt.testing", -- "device.storage.writable.name", -- "devtools.enabled", -- "dom.allow_XUL_XBL_for_file", -- "dom.allow_cut_copy", -- "dom.animations-api.core.enabled", -- "dom.animations-api.element-animate.enabled", -- "dom.animations-api.pending-member.enabled", -- "dom.enable_frame_timing", -- "dom.enable_performance", -- "dom.enable_performance_navigation_timing", -- "dom.enable_resource_timing", -- "dom.event.handling-user-input-time-limit", -- "dom.event.touch.coalescing.enabled", -- "dom.forms.autocomplete.formautofill", -- "dom.forms.inputmode", -- "dom.input.skip_cursor_move_for_same_value_set", -- "dom.ipc.processPriorityManager.backgroundGracePeriodMS", -- "dom.ipc.processPriorityManager.backgroundPerceivableGracePeriodMS", -- "dom.ipc.useNativeEventProcessing.content", -- "dom.max_chrome_script_run_time", -- "dom.max_ext_content_script_run_time", -- "dom.max_script_run_time", -- "dom.mozBrowserFramesEnabled", -- "dom.performance.enable_notify_performance_timing", -- "dom.performance.enable_user_timing_logging", -- "dom.placeholder.show_on_focus", -- "dom.requestIdleCallback.enabled", -- "dom.script_loader.bytecode_cache.enabled", -- "dom.script_loader.bytecode_cache.strategy", -- "dom.storage.testing", -- "dom.url.encode_decode_hash", -- "dom.url.getters_decode_hash", -- "dom.use_watchdog", -- "dom.vibrator.enabled", -- "dom.vibrator.max_vibrate_list_len", -- "dom.vibrator.max_vibrate_ms", -- "dom.webcomponents.customelements.enabled", -- "dom.webcomponents.shadowdom.enabled", -- "focusmanager.testmode", -- "font.size.inflation.disabledInMasterProcess", -- "font.size.inflation.emPerLine", -- "font.size.inflation.forceEnabled", -- "font.size.inflation.lineThreshold", -- "font.size.inflation.mappingIntercept", -- "font.size.inflation.maxRatio", -- "font.size.inflation.minTwips", -- "font.size.systemFontScale", -- "full-screen-api.allow-trusted-requests-only", -- "full-screen-api.enabled", -- "full-screen-api.unprefix.enabled", +- "content.cors.disable", +- "content.cors.no_private_data", +- "content.notify.backoffcount", +- "content.notify.interval", +- "content.notify.ontimer", +- "content.sink.enable_perf_mode", +- "content.sink.event_probe_rate", +- "content.sink.initial_perf_time", +- "content.sink.interactive_deflect_count", +- "content.sink.interactive_parse_time", +- "content.sink.interactive_time", +- "content.sink.pending_event_mode", +- "content.sink.perf_deflect_count", +- "content.sink.perf_parse_time", +- "device.storage.prompt.testing", +- "device.storage.writable.name", +- "devtools.enabled", +- "dom.allow_XUL_XBL_for_file", +- "dom.allow_cut_copy", +- "dom.animations-api.core.enabled", +- "dom.animations-api.element-animate.enabled", +- "dom.animations-api.pending-member.enabled", +- "dom.enable_frame_timing", +- "dom.enable_performance", +- "dom.enable_performance_navigation_timing", +- "dom.enable_resource_timing", +- "dom.event.handling-user-input-time-limit", +- "dom.event.touch.coalescing.enabled", +- "dom.forms.autocomplete.formautofill", +- "dom.forms.inputmode", +- "dom.input.skip_cursor_move_for_same_value_set", +- "dom.ipc.processPriorityManager.backgroundGracePeriodMS", +- "dom.ipc.processPriorityManager.backgroundPerceivableGracePeriodMS", +- "dom.ipc.useNativeEventProcessing.content", +- "dom.max_chrome_script_run_time", +- "dom.max_ext_content_script_run_time", +- "dom.max_script_run_time", +- "dom.mozBrowserFramesEnabled", +- "dom.performance.enable_notify_performance_timing", +- "dom.performance.enable_user_timing_logging", +- "dom.placeholder.show_on_focus", +- "dom.requestIdleCallback.enabled", +- "dom.script_loader.bytecode_cache.enabled", +- "dom.script_loader.bytecode_cache.strategy", +- "dom.storage.testing", +- "dom.url.encode_decode_hash", +- "dom.url.getters_decode_hash", +- "dom.use_watchdog", +- "dom.vibrator.enabled", +- "dom.vibrator.max_vibrate_list_len", +- "dom.vibrator.max_vibrate_ms", +- "dom.webcomponents.customelements.enabled", +- "dom.webcomponents.shadowdom.enabled", +- "focusmanager.testmode", +- "font.size.inflation.disabledInMasterProcess", +- "font.size.inflation.emPerLine", +- "font.size.inflation.forceEnabled", +- "font.size.inflation.lineThreshold", +- "font.size.inflation.mappingIntercept", +- "font.size.inflation.maxRatio", +- "font.size.inflation.minTwips", +- "font.size.systemFontScale", +- "full-screen-api.allow-trusted-requests-only", +- "full-screen-api.enabled", +- "full-screen-api.unprefix.enabled", -#ifdef FUZZING -- "fuzzing.enabled", +- "fuzzing.enabled", -#endif -- "gfx.font_rendering.opentype_svg.enabled", -- "hangmonitor.timeout", -- "html5.flushtimer.initialdelay", -- "html5.flushtimer.subsequentdelay", -- "html5.offmainthread", -- "intl.charset.fallback.tld", -- "intl.charset.fallback.utf8_for_file", -- "intl.ime.hack.on_ime_unaware_apps.fire_key_events_for_composition", -- "javascript.enabled", -- "javascript.options.array_prototype_values", -- "javascript.options.asmjs", -- "javascript.options.asyncstack", -- "javascript.options.baselinejit", -- "javascript.options.baselinejit.threshold", -- "javascript.options.baselinejit.unsafe_eager_compilation", -- "javascript.options.discardSystemSource", -- "javascript.options.dump_stack_on_debuggee_would_run", -- "javascript.options.gczeal", -- "javascript.options.gczeal.frequency", -- "javascript.options.ion", -- "javascript.options.ion.offthread_compilation", -- "javascript.options.ion.threshold", -- "javascript.options.ion.unsafe_eager_compilation", -- "javascript.options.jit.full_debug_checks", -- "javascript.options.native_regexp", -- "javascript.options.parallel_parsing", -- "javascript.options.shared_memory", -- "javascript.options.spectre.index_masking", -- "javascript.options.spectre.jit_to_C++_calls", -- "javascript.options.spectre.object_mitigations.barriers", -- "javascript.options.spectre.object_mitigations.misc", -- "javascript.options.spectre.string_mitigations", -- "javascript.options.spectre.value_masking", -- "javascript.options.streams", -- "javascript.options.strict", -- "javascript.options.strict.debug", -- "javascript.options.throw_on_asmjs_validation_failure", -- "javascript.options.throw_on_debuggee_would_run", -- "javascript.options.wasm", -- "javascript.options.wasm_baselinejit", -- "javascript.options.wasm_ionjit", -- "javascript.options.werror", -- "javascript.use_us_english_locale", -- "jsloader.shareGlobal", -- "layout.css.all-shorthand.enabled", -- "layout.css.background-blend-mode.enabled", -- "layout.css.box-decoration-break.enabled", -- "layout.css.color-adjust.enabled", -- "layout.css.column-span.enabled", -- "layout.css.contain.enabled", -- "layout.css.control-characters.visible", -- "layout.css.emulate-moz-box-with-flex", -- "layout.css.expensive-style-struct-assertions.enabled", -- "layout.css.float-logical-values.enabled", -- "layout.css.font-display.enabled", -- "layout.css.font-variations.enabled", -- "layout.css.frames-timing.enabled", -- "layout.css.getBoxQuads.enabled", -- "layout.css.grid-template-subgrid-value.enabled", -- "layout.css.grid.enabled", -- "layout.css.image-orientation.enabled", -- "layout.css.individual-transform.enabled", -- "layout.css.initial-letter.enabled", -- "layout.css.isolation.enabled", -- "layout.css.mix-blend-mode.enabled", -- "layout.css.moz-document.content.enabled", -- "layout.css.osx-font-smoothing.enabled", -- "layout.css.overflow-clip-box.enabled", -- "layout.css.overscroll-behavior.enabled", -- "layout.css.prefixes.animations", -- "layout.css.prefixes.border-image", -- "layout.css.prefixes.box-sizing", -- "layout.css.prefixes.device-pixel-ratio-webkit", -- "layout.css.prefixes.font-features", -- "layout.css.prefixes.gradients", -- "layout.css.prefixes.transforms", -- "layout.css.prefixes.transitions", -- "layout.css.prefixes.webkit", -- "layout.css.scope-pseudo.enabled", -- "layout.css.scoped-style.enabled", -- "layout.css.scroll-behavior.property-enabled", -- "layout.css.scroll-snap.enabled", +- "gfx.font_rendering.opentype_svg.enabled", +- "hangmonitor.timeout", +- "html5.flushtimer.initialdelay", +- "html5.flushtimer.subsequentdelay", +- "html5.offmainthread", +- "intl.charset.fallback.tld", +- "intl.charset.fallback.utf8_for_file", +- "intl.ime.hack.on_ime_unaware_apps.fire_key_events_for_composition", +- "javascript.enabled", +- "javascript.options.array_prototype_values", +- "javascript.options.asmjs", +- "javascript.options.asyncstack", +- "javascript.options.baselinejit", +- "javascript.options.baselinejit.threshold", +- "javascript.options.baselinejit.unsafe_eager_compilation", +- "javascript.options.discardSystemSource", +- "javascript.options.dump_stack_on_debuggee_would_run", +- "javascript.options.gczeal", +- "javascript.options.gczeal.frequency", +- "javascript.options.ion", +- "javascript.options.ion.offthread_compilation", +- "javascript.options.ion.threshold", +- "javascript.options.ion.unsafe_eager_compilation", +- "javascript.options.jit.full_debug_checks", +- "javascript.options.native_regexp", +- "javascript.options.parallel_parsing", +- "javascript.options.shared_memory", +- "javascript.options.spectre.index_masking", +- "javascript.options.spectre.jit_to_C++_calls", +- "javascript.options.spectre.object_mitigations.barriers", +- "javascript.options.spectre.object_mitigations.misc", +- "javascript.options.spectre.string_mitigations", +- "javascript.options.spectre.value_masking", +- "javascript.options.streams", +- "javascript.options.strict", +- "javascript.options.strict.debug", +- "javascript.options.throw_on_asmjs_validation_failure", +- "javascript.options.throw_on_debuggee_would_run", +- "javascript.options.wasm", +- "javascript.options.wasm_baselinejit", +- "javascript.options.wasm_ionjit", +- "javascript.options.werror", +- "javascript.use_us_english_locale", +- "jsloader.shareGlobal", +- "layout.css.all-shorthand.enabled", +- "layout.css.background-blend-mode.enabled", +- "layout.css.box-decoration-break.enabled", +- "layout.css.color-adjust.enabled", +- "layout.css.column-span.enabled", +- "layout.css.contain.enabled", +- "layout.css.control-characters.visible", +- "layout.css.emulate-moz-box-with-flex", +- "layout.css.expensive-style-struct-assertions.enabled", +- "layout.css.float-logical-values.enabled", +- "layout.css.font-display.enabled", +- "layout.css.font-variations.enabled", +- "layout.css.frames-timing.enabled", +- "layout.css.getBoxQuads.enabled", +- "layout.css.grid-template-subgrid-value.enabled", +- "layout.css.grid.enabled", +- "layout.css.image-orientation.enabled", +- "layout.css.individual-transform.enabled", +- "layout.css.initial-letter.enabled", +- "layout.css.isolation.enabled", +- "layout.css.mix-blend-mode.enabled", +- "layout.css.moz-document.content.enabled", +- "layout.css.osx-font-smoothing.enabled", +- "layout.css.overflow-clip-box.enabled", +- "layout.css.overscroll-behavior.enabled", +- "layout.css.prefixes.animations", +- "layout.css.prefixes.border-image", +- "layout.css.prefixes.box-sizing", +- "layout.css.prefixes.device-pixel-ratio-webkit", +- "layout.css.prefixes.font-features", +- "layout.css.prefixes.gradients", +- "layout.css.prefixes.transforms", +- "layout.css.prefixes.transitions", +- "layout.css.prefixes.webkit", +- "layout.css.scope-pseudo.enabled", +- "layout.css.scoped-style.enabled", +- "layout.css.scroll-behavior.property-enabled", +- "layout.css.scroll-snap.enabled", -#ifdef MOZ_STYLO -- "layout.css.servo.chrome.enabled", -- "layout.css.servo.enabled", +- "layout.css.servo.chrome.enabled", +- "layout.css.servo.enabled", -#endif -- "layout.css.shape-outside.enabled", -- "layout.css.text-align-unsafe-value.enabled", -- "layout.css.text-combine-upright-digits.enabled", -- "layout.css.text-combine-upright.enabled", -- "layout.css.text-justify.enabled", -- "layout.css.touch_action.enabled", -- "layout.css.visited_links_enabled", -- "layout.idle_period.required_quiescent_frames", -- "layout.idle_period.time_limit", -- "layout.interruptible-reflow.enabled", -- "mathml.disabled", -- "media.audio-max-decode-error", -- "media.cache_readahead_limit", -- "media.cache_resume_threshold", -- "media.cache_size", -- "media.clearkey.persistent-license.enabled", -- "media.cubeb.backend", -- "media.cubeb.sandbox", -- "media.cubeb_latency_msg_frames", -- "media.cubeb_latency_playback_ms", -- "media.decoder-doctor.wmf-disabled-is-failure", -- "media.decoder.recycle.enabled", -- "media.decoder.skip-to-next-key-frame.enabled", -- "media.dormant-on-pause-timeout-ms", -- "media.eme.audio.blank", -- "media.eme.chromium-api.video-shmems", -- "media.eme.enabled", -- "media.eme.video.blank", -- "media.ffmpeg.enabled", -- "media.ffmpeg.low-latency.enabled", -- "media.ffvpx.enabled", -- "media.ffvpx.low-latency.enabled", -- "media.flac.enabled", -- "media.forcestereo.enabled", -- "media.gmp.decoder.enabled", -- "media.gmp.insecure.allow", -- "media.gpu-process-decoder", -- "media.hls.enabled", -- "media.libavcodec.allow-obsolete", -- "media.memory_cache_max_size", -- "media.memory_caches_combined_limit_kb", -- "media.memory_caches_combined_limit_pc_sysmem", -- "media.mp4.enabled", -- "media.navigator.mediadatadecoder_enabled", -- "media.ogg.enabled", -- "media.ogg.flac.enabled", -- "media.playback.warnings-as-errors", -- "media.playback.warnings-as-errors.stagefright-vs-rust", -- "media.resampling.enabled", -- "media.resume-bkgnd-video-on-tabhover", -- "media.ruin-av-sync.enabled", -- "media.rust.mp4parser", -- "media.rust.test_mode", -- "media.seamless-looping", -- "media.suspend-bkgnd-video.delay-ms", -- "media.suspend-bkgnd-video.enabled", -- "media.use-blank-decoder", -- "media.video-max-decode-error", -- "media.video_stats.enabled", -- "media.videocontrols.lock-video-orientation", -- "media.volume_scale", -- "media.webspeech.recognition.enable", -- "media.webspeech.recognition.force_enable", -- "media.webspeech.synth.force_global_queue", -- "media.webspeech.test.enable", -- "media.webspeech.test.fake_fsm_events", -- "media.webspeech.test.fake_recognition_service", -- "media.wmf.allow-unsupported-resolutions", -- "media.wmf.enabled", -- "media.wmf.skip-blacklist", -- "media.wmf.vp9.enabled", -- "network.IDN.blacklist_chars", -- "network.IDN.restriction_profile", -- "network.IDN.use_whitelist", -- "network.IDN_show_punycode", -- "network.buffer.cache.count", -- "network.buffer.cache.size", -- "network.captive-portal-service.enabled", -- "network.cookie.cookieBehavior", -- "network.cookie.lifetimePolicy", -- "network.dns.disablePrefetch", -- "network.dns.disablePrefetchFromHTTPS", -- "network.file.disable_unc_paths", -- "network.file.path_blacklist", -- "network.http.tailing.enabled", -- "network.jar.block-remote-files", -- "network.loadinfo.skip_type_assertion", -- "network.notify.changed", -- "network.offline-mirrors-connectivity", -- "network.protocol-handler.external.jar", -- "network.proxy.type", -- "network.security.ports.banned", -- "network.security.ports.banned.override", -- "network.standard-url.enable-rust", -- "network.standard-url.max-length", -- "network.standard-url.punycode-host", -- "network.sts.max_time_for_events_between_two_polls", -- "network.sts.max_time_for_pr_close_during_shutdown", -- "network.tcp.keepalive.enabled", -- "network.tcp.keepalive.idle_time", -- "network.tcp.keepalive.probe_count", -- "network.tcp.keepalive.retry_interval", -- "network.tcp.sendbuffer", -- "nglayout.debug.invalidation", -- "privacy.donottrackheader.enabled", -- "privacy.firstparty.isolate", -- "privacy.firstparty.isolate.restrict_opener_access", -- "privacy.reduceTimerPrecision", -- "privacy.resistFingerprinting", -- "privacy.resistFingerprinting.autoDeclineNoUserInputCanvasPrompts", -- "privacy.resistFingerprinting.reduceTimerPrecision.jitter", -- "privacy.resistFingerprinting.reduceTimerPrecision.microseconds", -- "privacy.resistFingerprinting.target_video_res", -- "privacy.resistFingerprinting.video_dropped_ratio", -- "privacy.resistFingerprinting.video_frames_per_sec", -- "privacy.trackingprotection.lower_network_priority", -- "privacy.window.maxInnerHeight", -- "privacy.window.maxInnerWidth", -- "security.csp.enable", -- "security.data_uri.block_toplevel_data_uri_navigations", -- "security.data_uri.unique_opaque_origin", -- "security.fileuri.strict_origin_policy", -- "security.mixed_content.block_active_content", -- "security.mixed_content.block_display_content", -- "security.mixed_content.block_object_subrequest", -- "security.mixed_content.hsts_priming_cache_timeout", -- "security.mixed_content.send_hsts_priming", -- "security.mixed_content.upgrade_display_content", -- "security.mixed_content.use_hsts", -- "security.sandbox.content.level", -- "security.sandbox.content.tempDirSuffix", -- "security.sandbox.logging.enabled", -- "security.sandbox.mac.track.violations", -- "security.sandbox.windows.log.stackTraceDepth", -- "svg.disabled", -- "svg.display-lists.hit-testing.enabled", -- "svg.display-lists.painting.enabled", -- "svg.new-getBBox.enabled", -- "svg.path-caching.enabled", -- "svg.transform-box.enabled", -- "toolkit.asyncshutdown.crash_timeout", -- "toolkit.asyncshutdown.log", -- "toolkit.osfile.log", -- "toolkit.osfile.log.redirect", -- "toolkit.telemetry.enabled", -- "toolkit.telemetry.idleTimeout", -- "toolkit.telemetry.initDelay", -- "toolkit.telemetry.log.dump", -- "toolkit.telemetry.log.level", -- "toolkit.telemetry.minSubsessionLength", -- "toolkit.telemetry.scheduler.idleTickInterval", -- "toolkit.telemetry.scheduler.tickInterval", -- "toolkit.telemetry.testing.overridePreRelease", -- "toolkit.telemetry.unified", -- "ui.key.menuAccessKeyFocuses", -- "ui.popup.disable_autohide", -- "ui.use_activity_cursor", -- "view_source.editor.external", -- "zoom.maxPercent", -- "zoom.minPercent" --}; +- "layout.css.shape-outside.enabled", +- "layout.css.text-align-unsafe-value.enabled", +- "layout.css.text-combine-upright-digits.enabled", +- "layout.css.text-combine-upright.enabled", +- "layout.css.text-justify.enabled", +- "layout.css.touch_action.enabled", +- "layout.css.visited_links_enabled", +- "layout.idle_period.required_quiescent_frames", +- "layout.idle_period.time_limit", +- "layout.interruptible-reflow.enabled", +- "mathml.disabled", +- "media.audio-max-decode-error", +- "media.cache_readahead_limit", +- "media.cache_resume_threshold", +- "media.cache_size", +- "media.clearkey.persistent-license.enabled", +- "media.cubeb.backend", +- "media.cubeb.sandbox", +- "media.cubeb_latency_msg_frames", +- "media.cubeb_latency_playback_ms", +- "media.decoder-doctor.wmf-disabled-is-failure", +- "media.decoder.recycle.enabled", +- "media.decoder.skip-to-next-key-frame.enabled", +- "media.dormant-on-pause-timeout-ms", +- "media.eme.audio.blank", +- "media.eme.chromium-api.video-shmems", +- "media.eme.enabled", +- "media.eme.video.blank", +- "media.ffmpeg.enabled", +- "media.ffmpeg.low-latency.enabled", +- "media.ffvpx.enabled", +- "media.ffvpx.low-latency.enabled", +- "media.flac.enabled", +- "media.forcestereo.enabled", +- "media.gmp.decoder.enabled", +- "media.gmp.insecure.allow", +- "media.gpu-process-decoder", +- "media.hls.enabled", +- "media.libavcodec.allow-obsolete", +- "media.memory_cache_max_size", +- "media.memory_caches_combined_limit_kb", +- "media.memory_caches_combined_limit_pc_sysmem", +- "media.mp4.enabled", +- "media.navigator.mediadatadecoder_enabled", +- "media.ogg.enabled", +- "media.ogg.flac.enabled", +- "media.playback.warnings-as-errors", +- "media.playback.warnings-as-errors.stagefright-vs-rust", +- "media.resampling.enabled", +- "media.resume-bkgnd-video-on-tabhover", +- "media.ruin-av-sync.enabled", +- "media.rust.mp4parser", +- "media.rust.test_mode", +- "media.seamless-looping", +- "media.suspend-bkgnd-video.delay-ms", +- "media.suspend-bkgnd-video.enabled", +- "media.use-blank-decoder", +- "media.video-max-decode-error", +- "media.video_stats.enabled", +- "media.videocontrols.lock-video-orientation", +- "media.volume_scale", +- "media.webspeech.recognition.enable", +- "media.webspeech.recognition.force_enable", +- "media.webspeech.synth.force_global_queue", +- "media.webspeech.test.enable", +- "media.webspeech.test.fake_fsm_events", +- "media.webspeech.test.fake_recognition_service", +- "media.wmf.allow-unsupported-resolutions", +- "media.wmf.enabled", +- "media.wmf.skip-blacklist", +- "media.wmf.vp9.enabled", +- "network.IDN.blacklist_chars", +- "network.IDN.restriction_profile", +- "network.IDN.use_whitelist", +- "network.IDN_show_punycode", +- "network.buffer.cache.count", +- "network.buffer.cache.size", +- "network.captive-portal-service.enabled", +- "network.cookie.cookieBehavior", +- "network.cookie.lifetimePolicy", +- "network.dns.disablePrefetch", +- "network.dns.disablePrefetchFromHTTPS", +- "network.file.disable_unc_paths", +- "network.file.path_blacklist", +- "network.http.tailing.enabled", +- "network.jar.block-remote-files", +- "network.loadinfo.skip_type_assertion", +- "network.notify.changed", +- "network.offline-mirrors-connectivity", +- "network.protocol-handler.external.jar", +- "network.proxy.type", +- "network.security.ports.banned", +- "network.security.ports.banned.override", +- "network.standard-url.enable-rust", +- "network.standard-url.max-length", +- "network.standard-url.punycode-host", +- "network.sts.max_time_for_events_between_two_polls", +- "network.sts.max_time_for_pr_close_during_shutdown", +- "network.tcp.keepalive.enabled", +- "network.tcp.keepalive.idle_time", +- "network.tcp.keepalive.probe_count", +- "network.tcp.keepalive.retry_interval", +- "network.tcp.sendbuffer", +- "nglayout.debug.invalidation", +- "privacy.donottrackheader.enabled", +- "privacy.firstparty.isolate", +- "privacy.firstparty.isolate.restrict_opener_access", +- "privacy.reduceTimerPrecision", +- "privacy.resistFingerprinting", +- "privacy.resistFingerprinting.autoDeclineNoUserInputCanvasPrompts", +- "privacy.resistFingerprinting.reduceTimerPrecision.jitter", +- "privacy.resistFingerprinting.reduceTimerPrecision.microseconds", +- "privacy.resistFingerprinting.target_video_res", +- "privacy.resistFingerprinting.video_dropped_ratio", +- "privacy.resistFingerprinting.video_frames_per_sec", +- "privacy.spoof_english", +- "privacy.trackingprotection.lower_network_priority", +- "privacy.window.maxInnerHeight", +- "privacy.window.maxInnerWidth", +- "security.csp.enable", +- "security.data_uri.block_toplevel_data_uri_navigations", +- "security.data_uri.unique_opaque_origin", +- "security.fileuri.strict_origin_policy", +- "security.mixed_content.block_active_content", +- "security.mixed_content.block_display_content", +- "security.mixed_content.block_object_subrequest", +- "security.mixed_content.hsts_priming_cache_timeout", +- "security.mixed_content.send_hsts_priming", +- "security.mixed_content.upgrade_display_content", +- "security.mixed_content.use_hsts", +- "security.sandbox.content.level", +- "security.sandbox.content.tempDirSuffix", +- "security.sandbox.logging.enabled", +- "security.sandbox.mac.track.violations", +- "security.sandbox.windows.log.stackTraceDepth", +- "svg.disabled", +- "svg.display-lists.hit-testing.enabled", +- "svg.display-lists.painting.enabled", +- "svg.new-getBBox.enabled", +- "svg.path-caching.enabled", +- "svg.transform-box.enabled", +- "toolkit.asyncshutdown.crash_timeout", +- "toolkit.asyncshutdown.log", +- "toolkit.osfile.log", +- "toolkit.osfile.log.redirect", +- "toolkit.telemetry.enabled", +- "toolkit.telemetry.idleTimeout", +- "toolkit.telemetry.initDelay", +- "toolkit.telemetry.log.dump", +- "toolkit.telemetry.log.level", +- "toolkit.telemetry.minSubsessionLength", +- "toolkit.telemetry.scheduler.idleTickInterval", +- "toolkit.telemetry.scheduler.tickInterval", +- "toolkit.telemetry.testing.overridePreRelease", +- "toolkit.telemetry.unified", +- "ui.key.menuAccessKeyFocuses", +- "ui.popup.disable_autohide", +- "ui.use_activity_cursor", +- "view_source.editor.external", +- "zoom.maxPercent", +- "zoom.minPercent"}; - --const char** mozilla::dom::ContentPrefs::GetEarlyPrefs(size_t* aCount) --{ +-const char** mozilla::dom::ContentPrefs::GetEarlyPrefs(size_t* aCount) { - *aCount = ArrayLength(ContentPrefs::gEarlyPrefs); - return gEarlyPrefs; -} - --const char* mozilla::dom::ContentPrefs::GetEarlyPref(size_t aIndex) --{ +-const char* mozilla::dom::ContentPrefs::GetEarlyPref(size_t aIndex) { - MOZ_ASSERT(aIndex < ArrayLength(ContentPrefs::gEarlyPrefs)); - return gEarlyPrefs[aIndex]; -} diff --git dom/ipc/ContentPrefs.h dom/ipc/ContentPrefs.h deleted file mode 100644 index 72ce8d236c11..000000000000 --- dom/ipc/ContentPrefs.h +++ /dev/null @@ -1,27 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef mozilla_dom_ContentPrefs_h -#define mozilla_dom_ContentPrefs_h - -// See the comment in ContentPrefs.cpp for more information. - -namespace mozilla { -namespace dom { - -class ContentPrefs { --public: +- public: - static const char** GetEarlyPrefs(size_t* aCount); - static const char* GetEarlyPref(size_t aIndex); - --private: +- private: - static const char* gEarlyPrefs[]; -}; - --} --} +-} // namespace dom +-} // namespace mozilla - -#endif diff --git dom/ipc/ContentProcess.cpp dom/ipc/ContentProcess.cpp index 2441c8cb9224..c00283dc5084 100644 --- dom/ipc/ContentProcess.cpp +++ dom/ipc/ContentProcess.cpp @@ -7,7 +7,6 @@ #include "mozilla/ipc/IOThreadChild.h" #include "ContentProcess.h" -#include "ContentPrefs.h" #include "base/shared_memory.h" #include "mozilla/Preferences.h" #include "mozilla/Scheduler.h" -@@ -226,8 +225,8 @@ ContentProcess::Init(int aArgc, char* aArgv[]) +@@ -212,8 +211,8 @@ bool ContentProcess::Init(int aArgc, char* aArgv[]) { NS_ERROR("failed to map shared memory in the child"); return false; } - Preferences::DeserializeEarlyPreferences(static_cast(shm.memory()), - prefsLen); + Preferences::DeserializePreferences(static_cast(shm.memory()), + prefsLen); Scheduler::SetPrefs(schedulerPrefs); - mContent.Init(IOThreadChild::message_loop(), + mContent.Init(IOThreadChild::message_loop(), ParentPid(), diff --git dom/ipc/PContent.ipdl dom/ipc/PContent.ipdl index 5d077976569a..fb967ffc53a9 100644 --- dom/ipc/PContent.ipdl +++ dom/ipc/PContent.ipdl @@ -155,6 +155,12 @@ union MaybePrefValue { null_t; }; +// This serialization form mirrors that used in mozilla::Pref in +// Preferences.cpp. The two should be kept in sync, e.g. if something is added +// to one it should also be added to the other. +// +// Note: there is no need to pass the isSticky attribute because that's an +// immutable attribute obtained from file at startup. struct Pref { nsCString name; bool isLocked; @@ -273,7 +279,6 @@ struct XPCOMInitData ClipboardCapabilities clipboardCaps; DomainPolicyClone domainPolicy; OptionalURIParams userContentSheetURL; - Pref[] prefs; GfxVarUpdate[] gfxNonDefaultVarUpdates; ContentDeviceData contentDeviceData; GfxInfoFeatureStatus[] gfxFeatureStatus; diff --git dom/ipc/moz.build dom/ipc/moz.build index 3c5541c7791b..5e92a0d52b5d 100644 --- dom/ipc/moz.build +++ dom/ipc/moz.build @@ -26,7 +26,6 @@ EXPORTS.mozilla.dom += [ 'ContentBridgeParent.h', 'ContentChild.h', 'ContentParent.h', - 'ContentPrefs.h', 'ContentProcess.h', 'ContentProcessHost.h', 'ContentProcessManager.h', @@ -59,7 +58,6 @@ UNIFIED_SOURCES += [ 'ContentBridgeChild.cpp', 'ContentBridgeParent.cpp', 'ContentParent.cpp', - 'ContentPrefs.cpp', 'ContentProcess.cpp', 'ContentProcessHost.cpp', 'ContentProcessManager.cpp', diff --git layout/style/nsCSSProps.h layout/style/nsCSSProps.h index dce44bf61b35..80288336a08b 100644 --- layout/style/nsCSSProps.h +++ layout/style/nsCSSProps.h -@@ -645,7 +645,7 @@ public: +@@ -640,7 +640,7 @@ class nsCSSProps { // In the child process, assert that we're not trying to parse stylesheets // before we've gotten all our prefs. MOZ_ASSERT_IF(!XRE_IsParentProcess(), - mozilla::Preferences::AreAllPrefsSetInContentProcess()); + mozilla::Preferences::ArePrefsInitedInContentProcess()); return gPropertyEnabled[aProperty]; } diff --git modules/libpref/Preferences.cpp modules/libpref/Preferences.cpp index fe780686f2eb..488095f49236 100644 --- modules/libpref/Preferences.cpp +++ modules/libpref/Preferences.cpp @@ -15,7 +15,6 @@ #include "mozilla/ArenaAllocator.h" #include "mozilla/ArrayUtils.h" #include "mozilla/Attributes.h" -#include "mozilla/dom/ContentPrefs.h" #include "mozilla/dom/PContent.h" #include "mozilla/HashFunctions.h" #include "mozilla/Logging.h" -@@ -131,6 +130,29 @@ enum class PrefType : uint8_t +@@ -129,6 +128,25 @@ enum class PrefType : uint8_t { Bool = 3, }; +// This is used for pref names and string pref values. We encode the string +// length, then a '/', then the string chars. This encoding means there are no +// special chars that are forbidden or require escaping. -+static void -+SerializeAndAppendString(const char* aChars, nsCString& aStr) -+{ ++static void SerializeAndAppendString(const char* aChars, nsCString& aStr) { + aStr.AppendInt(uint32_t(strlen(aChars))); + aStr.Append('/'); + aStr.Append(aChars); +} + -+static char* -+DeserializeString(char* aChars, nsCString& aStr) -+{ ++static char* DeserializeString(char* aChars, nsCString& aStr) { + char* p = aChars; + uint32_t length = strtol(p, &p, 10); + MOZ_ASSERT(p[0] == '/'); -+ p++; // move past the '/' ++ p++; // move past the '/' + aStr.Assign(p, length); -+ p += length; // move past the string itself ++ p += length; // move past the string itself + return p; +} + // Keep this in sync with PrefValue in prefs_parser/src/lib.rs. union PrefValue { const char* mStringVal; -@@ -223,6 +245,64 @@ union PrefValue { +@@ -215,6 +233,61 @@ union PrefValue { MOZ_CRASH(); } } + -+ void SerializeAndAppend(PrefType aType, nsCString& aStr) -+ { ++ void SerializeAndAppend(PrefType aType, nsCString& aStr) { + switch (aType) { + case PrefType::Bool: + aStr.Append(mBoolVal ? 'T' : 'F'); + break; + + case PrefType::Int: + aStr.AppendInt(mIntVal); + break; + + case PrefType::String: { + SerializeAndAppendString(mStringVal, aStr); + break; + } + + case PrefType::None: + default: + MOZ_CRASH(); + } + } + -+ static char* Deserialize(PrefType aType, -+ char* aStr, -+ dom::MaybePrefValue* aDomValue) -+ { ++ static char* Deserialize(PrefType aType, char* aStr, ++ dom::MaybePrefValue* aDomValue) { + char* p = aStr; + + switch (aType) { + case PrefType::Bool: + if (*p == 'T') { + *aDomValue = true; + } else if (*p == 'F') { + *aDomValue = false; + } else { + *aDomValue = false; + NS_ERROR("bad bool pref value"); + } + p++; + return p; + + case PrefType::Int: { + *aDomValue = int32_t(strtol(p, &p, 10)); + return p; + } + + case PrefType::String: { + nsCString str; + p = DeserializeString(p, str); + *aDomValue = str; + return p; + } + + default: + MOZ_CRASH(); + } + } }; #ifdef DEBUG -@@ -694,6 +774,159 @@ public: +@@ -656,6 +729,157 @@ class Pref { return false; } + // Prefs are serialized in a manner that mirrors dom::Pref. The two should be + // kept in sync. E.g. if something is added to one it should also be added to + // the other. (It would be nice to be able to use the code generated from + // IPDL for serializing dom::Pref here instead of writing by hand this + // serialization/deserialization. Unfortunately, that generated code is + // difficult to use directly, outside of the IPDL IPC code.) + // + // The grammar for the serialized prefs has the following form. + // + // = ':' ':' ? ':' ? '\n' + // = 'B' | 'I' | 'S' + // = 'L' | '-' + // = + // = | | + // = 'T' | 'F' + // = an integer literal accepted by strtol() + // = '/' + // = any char sequence of length dictated by the preceding + // . + // + // No whitespace is tolerated between tokens. must match the types of + // the values. + // + // The serialization is text-based, rather than binary, for the following + // reasons. + // + // - The size difference wouldn't be much different between text-based and + // binary. Most of the space is for strings (pref names and string pref + // values), which would be the same in both styles. And other differences + // would be minimal, e.g. small integers are shorter in text but long + // integers are longer in text. + // + // - Likewise, speed differences should be negligible. + // + // - It's much easier to debug a text-based serialization. E.g. you can + // print it and inspect it easily in a debugger. + // + // Examples of unlocked boolean prefs: + // - "B-:8/my.bool1:F:T\n" + // - "B-:8/my.bool2:F:\n" + // - "B-:8/my.bool3::T\n" + // + // Examples of locked integer prefs: + // - "IL:7/my.int1:0:1\n" + // - "IL:7/my.int2:123:\n" + // - "IL:7/my.int3::-99\n" + // + // Examples of unlocked string prefs: + // - "S-:10/my.string1:3/abc:4/wxyz\n" + // - "S-:10/my.string2:5/1.234:\n" + // - "S-:10/my.string3::7/string!\n" + -+ void SerializeAndAppend(nsCString& aStr) -+ { ++ void SerializeAndAppend(nsCString& aStr) { + switch (Type()) { + case PrefType::Bool: + aStr.Append('B'); + break; + + case PrefType::Int: + aStr.Append('I'); + break; + + case PrefType::String: { + aStr.Append('S'); + break; + } + + case PrefType::None: + default: + MOZ_CRASH(); + } + + aStr.Append(mIsLocked ? 'L' : '-'); + aStr.Append(':'); + + SerializeAndAppendString(mName, aStr); + aStr.Append(':'); + + if (mHasDefaultValue) { + mDefaultValue.SerializeAndAppend(Type(), aStr); + } + aStr.Append(':'); + + if (mHasUserValue) { + mUserValue.SerializeAndAppend(Type(), aStr); + } + aStr.Append('\n'); + } + -+ static char* Deserialize(char* aStr, dom::Pref* aDomPref) -+ { ++ static char* Deserialize(char* aStr, dom::Pref* aDomPref) { + char* p = aStr; + + // The type. + PrefType type; + if (*p == 'B') { + type = PrefType::Bool; + } else if (*p == 'I') { + type = PrefType::Int; + } else if (*p == 'S') { + type = PrefType::String; + } else { + NS_ERROR("bad pref type"); + type = PrefType::None; + } -+ p++; // move past the type char ++ p++; // move past the type char + + // Locked? + bool isLocked; + if (*p == 'L') { + isLocked = true; + } else if (*p == '-') { + isLocked = false; + } else { + NS_ERROR("bad pref locked status"); + isLocked = false; + } -+ p++; // move past the isLocked char ++ p++; // move past the isLocked char + + MOZ_ASSERT(*p == ':'); -+ p++; // move past the ':' ++ p++; // move past the ':' + + // The pref name. + nsCString name; + p = DeserializeString(p, name); + + MOZ_ASSERT(*p == ':'); -+ p++; // move past the ':' preceding the default value ++ p++; // move past the ':' preceding the default value + + dom::MaybePrefValue maybeDefaultValue; + if (*p != ':') { + dom::PrefValue defaultValue; + p = PrefValue::Deserialize(type, p, &maybeDefaultValue); + } + + MOZ_ASSERT(*p == ':'); -+ p++; // move past the ':' between the default and user values ++ p++; // move past the ':' between the default and user values + + dom::MaybePrefValue maybeUserValue; + if (*p != '\n') { + dom::PrefValue userValue; + p = PrefValue::Deserialize(type, p, &maybeUserValue); + } + + MOZ_ASSERT(*p == '\n'); -+ p++; // move past the '\n' following the user value ++ p++; // move past the '\n' following the user value + + *aDomPref = dom::Pref(name, isLocked, maybeDefaultValue, maybeUserValue); + + return p; + } + - void AddSizeOfIncludingThis(MallocSizeOf aMallocSizeOf, PrefsSizes& aSizes) - { + void AddSizeOfIncludingThis(MallocSizeOf aMallocSizeOf, PrefsSizes& aSizes) { // Note: mName is allocated in gPrefNameArena, measured elsewhere. -@@ -880,41 +1113,9 @@ pref_savePrefs() + aSizes.mPrefValues += aMallocSizeOf(this); +@@ -817,57 +1041,17 @@ static PrefSaveData pref_savePrefs() { #ifdef DEBUG -// For content processes, what prefs have been initialized? --enum class ContentProcessPhase --{ +-enum class ContentProcessPhase { - eNoPrefsSet, - eEarlyPrefsSet, - eEarlyAndLatePrefsSet, -}; - // Note that this never changes in the parent process, and is only read in // content processes. -static ContentProcessPhase gPhase = ContentProcessPhase::eNoPrefsSet; -- --struct StringComparator --{ ++static bool gContentProcessPrefsAreInited = false; + +-struct StringComparator { - const char* mPrefName; - -- explicit StringComparator(const char* aPrefName) -- : mPrefName(aPrefName) -- { -- } +- explicit StringComparator(const char* aPrefName) : mPrefName(aPrefName) {} - -- int operator()(const char* aPrefName) const -- { +- int operator()(const char* aPrefName) const { - return strcmp(mPrefName, aPrefName); - } -}; - --static bool --IsEarlyPref(const char* aPrefName) --{ +-static bool IsEarlyPref(const char* aPrefName) { - size_t prefsLen; - size_t found; - const char** list = mozilla::dom::ContentPrefs::GetEarlyPrefs(&prefsLen); - return BinarySearchIf(list, 0, prefsLen, StringComparator(aPrefName), &found); -} -+static bool gContentProcessPrefsAreInited = false; +- + #endif // DEBUG - #endif // DEBUG - -@@ -923,23 +1124,7 @@ pref_HashTableLookupInner(const char* aPrefName) - { + static PrefEntry* pref_HashTableLookupInner(const char* aPrefName) { MOZ_ASSERT(NS_IsMainThread() || mozilla::ServoStyleSet::IsInServoTraversal()); -#ifdef DEBUG - if (!XRE_IsParentProcess()) { - if (gPhase == ContentProcessPhase::eNoPrefsSet) { - MOZ_CRASH_UNSAFE_PRINTF("accessing pref %s before early prefs are set", - aPrefName); - } -- ++ MOZ_ASSERT_IF(!XRE_IsParentProcess(), gContentProcessPrefsAreInited); + - if (gPhase == ContentProcessPhase::eEarlyPrefsSet && - !IsEarlyPref(aPrefName)) { - // If you hit this crash, you have an early access of a non-early pref. - // Consider moving the access later or add the pref to the whitelist of - // early prefs in ContentPrefs.cpp and get review from a DOM peer. - MOZ_CRASH_UNSAFE_PRINTF( -- "accessing non-early pref %s before late prefs are set", aPrefName); +- "accessing non-early pref %s before late prefs are set", aPrefName); - } - } -#endif -+ MOZ_ASSERT_IF(!XRE_IsParentProcess(), gContentProcessPrefsAreInited); - +- return static_cast(gHashTable->Search(aPrefName)); } -@@ -2932,8 +3117,8 @@ public: - } // namespace +@@ -2637,8 +2821,8 @@ class AddPreferencesMemoryReporterRunnable : public Ru + } // namespace + -// A list of prefs sent early from the parent, via shared memory. -static InfallibleTArray* gEarlyDomPrefs; +// A list of changed prefs sent from the parent via shared memory. +static InfallibleTArray* gChangedDomPrefs; - static const char kTelemetryPref[] = "toolkit.telemetry.enabled"; - static const char kChannelPref[] = "app.update.channel"; -@@ -3050,12 +3235,12 @@ Preferences::GetInstanceForService() + /* static */ already_AddRefed + Preferences::GetInstanceForService() { +@@ -2668,12 +2852,12 @@ Preferences::GetInstanceForService() { } if (!XRE_IsParentProcess()) { - MOZ_ASSERT(gEarlyDomPrefs); - for (unsigned int i = 0; i < gEarlyDomPrefs->Length(); i++) { - Preferences::SetPreference(gEarlyDomPrefs->ElementAt(i)); + MOZ_ASSERT(gChangedDomPrefs); + for (unsigned int i = 0; i < gChangedDomPrefs->Length(); i++) { + Preferences::SetPreference(gChangedDomPrefs->ElementAt(i)); } - delete gEarlyDomPrefs; - gEarlyDomPrefs = nullptr; + delete gChangedDomPrefs; + gChangedDomPrefs = nullptr; } else { // Check if there is a deployment configuration file. If so, set up the -@@ -3179,149 +3364,44 @@ NS_IMPL_ISUPPORTS(Preferences, +@@ -2782,143 +2966,45 @@ Preferences::~Preferences() { + NS_IMPL_ISUPPORTS(Preferences, nsIPrefService, nsIObserver, nsIPrefBranch, nsISupportsWeakReference) - /* static */ void --Preferences::SerializeEarlyPreferences(nsCString& aStr) -+Preferences::SerializePreferences(nsCString& aStr) - { +-/* static */ void Preferences::SerializeEarlyPreferences(nsCString& aStr) { ++/* static */ void Preferences::SerializePreferences(nsCString& aStr) { MOZ_RELEASE_ASSERT(InitStaticMembers()); - nsAutoCStringN<256> boolPrefs, intPrefs, stringPrefs; - size_t numEarlyPrefs; - dom::ContentPrefs::GetEarlyPrefs(&numEarlyPrefs); -- ++ aStr.Truncate(); + - for (unsigned int i = 0; i < numEarlyPrefs; i++) { - const char* prefName = dom::ContentPrefs::GetEarlyPref(i); - MOZ_ASSERT_IF(i > 0, - strcmp(prefName, dom::ContentPrefs::GetEarlyPref(i - 1)) > 0); - - Pref* pref = pref_HashTableLookup(prefName); - if (!pref || !pref->MustSendToContentProcesses()) { - continue; -- } -+ aStr.Truncate(); - ++ for (auto iter = gHashTable->Iter(); !iter.Done(); iter.Next()) { ++ Pref* pref = static_cast(iter.Get())->mPref; ++ if (pref->MustSendToContentProcesses() && pref->HasAdvisablySizedValues()) { ++ pref->SerializeAndAppend(aStr); + } +- - switch (pref->Type()) { - case PrefType::Bool: - boolPrefs.Append( -- nsPrintfCString("%u:%d|", i, Preferences::GetBool(prefName))); +- nsPrintfCString("%u:%d|", i, Preferences::GetBool(prefName))); - break; - case PrefType::Int: - intPrefs.Append( -- nsPrintfCString("%u:%d|", i, Preferences::GetInt(prefName))); +- nsPrintfCString("%u:%d|", i, Preferences::GetInt(prefName))); - break; - case PrefType::String: { - nsAutoCString value; - Preferences::GetCString(prefName, value); - stringPrefs.Append( -- nsPrintfCString("%u:%d;%s|", i, value.Length(), value.get())); +- nsPrintfCString("%u:%d;%s|", i, value.Length(), value.get())); - } break; - case PrefType::None: - break; - default: - printf_stderr("preference type: %d\n", int(pref->Type())); - MOZ_CRASH(); -+ for (auto iter = gHashTable->Iter(); !iter.Done(); iter.Next()) { -+ Pref* pref = static_cast(iter.Get())->mPref; -+ if (pref->MustSendToContentProcesses() && pref->HasAdvisablySizedValues()) { -+ pref->SerializeAndAppend(aStr); - } +- } } - aStr.Truncate(); - aStr.Append(boolPrefs); - aStr.Append('\n'); - aStr.Append(intPrefs); - aStr.Append('\n'); - aStr.Append(stringPrefs); - aStr.Append('\n'); aStr.Append('\0'); } - /* static */ void --Preferences::DeserializeEarlyPreferences(char* aStr, size_t aStrLen) -+Preferences::DeserializePreferences(char* aStr, size_t aPrefsLen) - { +-/* static */ void Preferences::DeserializeEarlyPreferences(char* aStr, +- size_t aStrLen) { ++/* static */ void Preferences::DeserializePreferences(char* aStr, ++ size_t aPrefsLen) { MOZ_ASSERT(!XRE_IsParentProcess()); - MOZ_ASSERT(!gEarlyDomPrefs); - gEarlyDomPrefs = new InfallibleTArray(); + MOZ_ASSERT(!gChangedDomPrefs); + gChangedDomPrefs = new InfallibleTArray(); char* p = aStr; - - // XXX: we assume these pref values are default values, which may not be - // true. We also assume they are unlocked. Fortunately, these prefs get reset - // properly by the first IPC message. - - // Get the bool prefs. - while (*p != '\n') { - int32_t index = strtol(p, &p, 10); - MOZ_ASSERT(p[0] == ':'); - p++; - int v = strtol(p, &p, 10); - MOZ_ASSERT(v == 0 || v == 1); - dom::MaybePrefValue value(dom::PrefValue(!!v)); - MOZ_ASSERT(p[0] == '|'); - p++; - dom::Pref pref(nsCString(dom::ContentPrefs::GetEarlyPref(index)), -- /* isLocked */ false, -- value, -- dom::MaybePrefValue()); +- /* isLocked */ false, value, dom::MaybePrefValue()); - gEarlyDomPrefs->AppendElement(pref); -- } ++ while (*p != '\0') { ++ dom::Pref pref; ++ p = Pref::Deserialize(p, &pref); ++ gChangedDomPrefs->AppendElement(pref); + } - p++; -- + - // Get the int prefs. - while (*p != '\n') { - int32_t index = strtol(p, &p, 10); - MOZ_ASSERT(p[0] == ':'); - p++; - dom::MaybePrefValue value( -- dom::PrefValue(static_cast(strtol(p, &p, 10)))); +- dom::PrefValue(static_cast(strtol(p, &p, 10)))); - MOZ_ASSERT(p[0] == '|'); - p++; - dom::Pref pref(nsCString(dom::ContentPrefs::GetEarlyPref(index)), -- /* isLocked */ false, -- value, -- dom::MaybePrefValue()); +- /* isLocked */ false, value, dom::MaybePrefValue()); - gEarlyDomPrefs->AppendElement(pref); - } - p++; - - // Get the string prefs. - while (*p != '\n') { - int32_t index = strtol(p, &p, 10); - MOZ_ASSERT(p[0] == ':'); - p++; - int32_t length = strtol(p, &p, 10); - MOZ_ASSERT(p[0] == ';'); - p++; - dom::MaybePrefValue value(dom::PrefValue(nsCString(p, length))); - dom::Pref pref(nsCString(dom::ContentPrefs::GetEarlyPref(index)), -- /* isLocked */ false, -- value, -- dom::MaybePrefValue()); +- /* isLocked */ false, value, dom::MaybePrefValue()); - gEarlyDomPrefs->AppendElement(pref); - p += length + 1; - MOZ_ASSERT(*(p - 1) == '|'); - } - p++; - - MOZ_ASSERT(*p == '\0'); -+ while (*p != '\0') { -+ dom::Pref pref; -+ p = Pref::Deserialize(p, &pref); -+ gChangedDomPrefs->AppendElement(pref); -+ } - +- // We finished parsing on a '\0'. That should be the last char in the shared - // memory. - MOZ_ASSERT(aStr + aStrLen - 1 == p); -- --#ifdef DEBUG -- MOZ_ASSERT(gPhase == ContentProcessPhase::eNoPrefsSet); -- gPhase = ContentProcessPhase::eEarlyPrefsSet; --#endif --} -- --/* static */ void --Preferences::SetLatePreferences(const nsTArray* aDomPrefs) --{ -- MOZ_ASSERT(!XRE_IsParentProcess()); -- -- for (unsigned int i = 0; i < aDomPrefs->Length(); i++) { -- Preferences::SetPreference(aDomPrefs->ElementAt(i)); -- } + // memory. (aPrefsLen includes the '\0'.) + MOZ_ASSERT(p == aStr + aPrefsLen - 1); #ifdef DEBUG -- MOZ_ASSERT(gPhase == ContentProcessPhase::eEarlyPrefsSet); -- gPhase = ContentProcessPhase::eEarlyAndLatePrefsSet; +- MOZ_ASSERT(gPhase == ContentProcessPhase::eNoPrefsSet); +- gPhase = ContentProcessPhase::eEarlyPrefsSet; + MOZ_ASSERT(!gContentProcessPrefsAreInited); + gContentProcessPrefsAreInited = true; #endif } -@@ -3558,36 +3638,12 @@ Preferences::GetPreference(dom::Pref* aDomPref) +-/* static */ void Preferences::SetLatePreferences( +- const nsTArray* aDomPrefs) { +- MOZ_ASSERT(!XRE_IsParentProcess()); +- +- for (unsigned int i = 0; i < aDomPrefs->Length(); i++) { +- Preferences::SetPreference(aDomPrefs->ElementAt(i)); +- } +- +-#ifdef DEBUG +- MOZ_ASSERT(gPhase == ContentProcessPhase::eEarlyPrefsSet); +- gPhase = ContentProcessPhase::eEarlyAndLatePrefsSet; +-#endif +-} +- + /* static */ void Preferences::InitializeUserPrefs() { + MOZ_ASSERT(XRE_IsParentProcess()); + MOZ_ASSERT(!sPreferences->mCurrentFile, "Should only initialize prefs once"); +@@ -3133,32 +3219,10 @@ Preferences::SavePrefFile(nsIFile* aFile) { } } --void --Preferences::GetPreferences(InfallibleTArray* aDomPrefs) --{ +-void Preferences::GetPreferences(InfallibleTArray* aDomPrefs) { - MOZ_ASSERT(XRE_IsParentProcess()); - MOZ_ASSERT(NS_IsMainThread()); - - aDomPrefs->SetCapacity(gHashTable->EntryCount()); - for (auto iter = gHashTable->Iter(); !iter.Done(); iter.Next()) { - Pref* pref = static_cast(iter.Get())->mPref; - - if (!pref->MustSendToContentProcesses()) { - // The pref value hasn't changed since it was initialized at startup. - // Don't bother sending it, because the content process will initialize - // it the same way. - continue; - } - - if (pref->HasAdvisablySizedValues()) { - dom::Pref* setting = aDomPrefs->AppendElement(); - pref->ToDomPref(setting); - } - } -} - #ifdef DEBUG - bool --Preferences::AreAllPrefsSetInContentProcess() -+Preferences::ArePrefsInitedInContentProcess() - { +-bool Preferences::AreAllPrefsSetInContentProcess() { ++bool Preferences::ArePrefsInitedInContentProcess() { MOZ_ASSERT(!XRE_IsParentProcess()); - return gPhase == ContentProcessPhase::eEarlyAndLatePrefsSet; + return gContentProcessPrefsAreInited; } #endif diff --git modules/libpref/Preferences.h modules/libpref/Preferences.h index 0d976483daae..901425b5b663 100644 --- modules/libpref/Preferences.h +++ modules/libpref/Preferences.h -@@ -328,15 +328,10 @@ public: - const char* aPref, +@@ -277,15 +277,10 @@ class Preferences final : public nsIPrefService, + static nsresult AddFloatVarCache(float* aVariable, const char* aPref, float aDefault = 0.0f); - // When a content process is created these methods are used to pass prefs in - // bulk from the parent process. "Early" preferences are ones that are needed - // very early on in the content process's lifetime; they are passed via a - // special shared memory segment. "Late" preferences are the remainder, which - // are passed via a standard IPC message. - static void SerializeEarlyPreferences(nsCString& aStr); - static void DeserializeEarlyPreferences(char* aStr, size_t aStrLen); - static void GetPreferences(InfallibleTArray* aSettings); - static void SetLatePreferences(const nsTArray* aSettings); + // When a content process is created these methods are used to pass changed + // prefs in bulk from the parent process, via shared memory. + static void SerializePreferences(nsCString& aStr); + static void DeserializePreferences(char* aStr, size_t aPrefsLen); // When a single pref is changed in the parent process, these methods are // used to pass the update to content processes. -@@ -344,7 +339,7 @@ public: +@@ -293,7 +288,7 @@ class Preferences final : public nsIPrefService, static void SetPreference(const dom::Pref& aPref); #ifdef DEBUG - static bool AreAllPrefsSetInContentProcess(); + static bool ArePrefsInitedInContentProcess(); #endif static void AddSizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf, Index: branches/2019Q1/www/firefox-esr-i18n/Makefile =================================================================== --- branches/2019Q1/www/firefox-esr-i18n/Makefile (revision 491522) +++ branches/2019Q1/www/firefox-esr-i18n/Makefile (revision 491523) @@ -1,90 +1,91 @@ # Created by: Andrew Pantyukhin # $FreeBSD$ PORTNAME= firefox -PORTVERSION= 60.4.0 +PORTVERSION= 60.5.0 +PORTREVISION= 1 CATEGORIES= www MASTER_SITES= MOZILLA/${PORTNAME:S|-i18n||}/releases/${DISTVERSION}esr/linux-i686/xpi \ MOZILLA/${PORTNAME:S|-i18n||}/candidates/${DISTVERSION}esr-candidates/build2/linux-i686/xpi PKGNAMEPREFIX= PKGNAMESUFFIX= -esr-i18n DISTFILES= ${FIREFOX_I18N_:S/$/.xpi/} DIST_SUBDIR= xpi/${DISTNAME} MAINTAINER= gecko@FreeBSD.org COMMENT= Localized interface for Firefox EXTRACT_DEPENDS= zip:archivers/zip USES= zip:infozip gecko:firefox,build USE_XPI= firefox NO_ARCH= yes USE_SUBMAKE= yes WDIR= langpack-*@firefox.mozilla.org XPI_DISTNAMES= ${FIREFOX_I18N_} PLIST?= ${WRKDIR}/plist PLISTF?= ${WRKDIR}/plist_files .include "${.CURDIR}/Makefile.option" .include .ifndef WITHOUT_SWITCHER RUN_DEPENDS+= xpi-quick-locale-switcher>=0:www/xpi-quick-locale-switcher .endif .include "${.CURDIR}/Makefile.lang" FIREFOX_I18N_?= ${FIREFOX_I18N} .for dist in ${XPI_DISTNAMES} XPI_ID_${dist}= langpack-${dist}@firefox.mozilla.org .endfor pre-everything:: @${ECHO_CMD} @${ECHO_CMD} "Please define FIREFOX_I18N_ALL to install all languages." @${ECHO_CMD} do-extract: @${MKDIR} ${WRKSRC} @for lang in ${FIREFOX_I18N_}; do \ if ! (${UNZIP_CMD} -qo ${_DISTDIR}/$$lang.xpi -d ${WRKSRC}/langpack-$$lang@firefox.mozilla.org);\ then \ exit 1; \ fi; \ cd ${WRKSRC}/langpack-$$lang@firefox.mozilla.org/; \ ${FIND} -H -s * ! -type d | \ ${SED} -e "s|^|lib/xpi/langpack-$$lang@firefox.mozilla.org/|" >> ${PLISTF}; \ done ${CAT} ${PLISTF} | ${SORT} >> ${PLIST} do-install: @${MKDIR} ${STAGEDIR}${XPI_LIBDIR} cd ${WRKSRC}; ${PAX} -rw . ${STAGEDIR}${XPI_LIBDIR} ${CHMOD} -R a+rX,go-w ${STAGEDIR}${XPI_LIBDIR}/${WDIR}/ @for e in ${STAGEDIR}${XPI_LIBDIR}/${WDIR}; do \ for _dir in ${XPI_LINKFARMS} ; do \ ${LN} -sf $${_e##*/} ${STAGEDIR}$$_dir/ ${_Q} ; \ done \ done @${ECHO_CMD} '@exec ${INSTALL} -d ${XPI_SLDIRS_ALL:S,^${PREFIX},%D,}' ${_A} @${ECHO_CMD} '@exec for _dir in ${XPI_LINKFARMS} ; { \ ${LN} -sf ${XPI_LIBDIR}/${WDIR} $$_dir/ ${_Q}; }' ${_A} @${ECHO_CMD} '@unexec for _dir in ${XPI_LINKFARMS} ; { ${RM} $$_dir/${WDIR} ; }' ${_A} post-patch: ${FIND} ${WRKSRC} -name install.rdf -print0 | \ ${XARGS} -0L1 ${REINPLACE_CMD} -i '' -e '/ Index: branches/2019Q1/www/firefox-esr-i18n/distinfo =================================================================== --- branches/2019Q1/www/firefox-esr-i18n/distinfo (revision 491522) +++ branches/2019Q1/www/firefox-esr-i18n/distinfo (revision 491523) @@ -1,197 +1,197 @@ -TIMESTAMP = 1543878683 -SHA256 (xpi/firefox-60.4.0/ach.xpi) = 6c5994f79cd186bd9c12b309f7fe4dcccfea6467cdef752e5808f8b999f4e863 -SIZE (xpi/firefox-60.4.0/ach.xpi) = 496839 -SHA256 (xpi/firefox-60.4.0/af.xpi) = 533f29c135b81f87b4d0e16a1c1024bb88fb765530006346632dfcabae775efd -SIZE (xpi/firefox-60.4.0/af.xpi) = 487313 -SHA256 (xpi/firefox-60.4.0/an.xpi) = 1386a3c3ec49171f0f36cc402e42947da237f685c337c350190de260b65d0c08 -SIZE (xpi/firefox-60.4.0/an.xpi) = 520500 -SHA256 (xpi/firefox-60.4.0/ar.xpi) = 28c1493982afd32ccb1533140fdc2f72cf5202be6917a6ee549d44a93180ce91 -SIZE (xpi/firefox-60.4.0/ar.xpi) = 547812 -SHA256 (xpi/firefox-60.4.0/as.xpi) = 8686a58ecba3b3fc16335ce3178f7958c0d3a2af36a9365ce73ec946af87bfbd -SIZE (xpi/firefox-60.4.0/as.xpi) = 530723 -SHA256 (xpi/firefox-60.4.0/ast.xpi) = b4a37f8336ca24670c83d9efb92ffb4ed263c1a5d3a9bf4219f887eb80ea5d90 -SIZE (xpi/firefox-60.4.0/ast.xpi) = 508654 -SHA256 (xpi/firefox-60.4.0/az.xpi) = 6aec8e5f2ec6e6022a64ffa78d362355fad1b1bc244bd98bdf8ed357e0c27c51 -SIZE (xpi/firefox-60.4.0/az.xpi) = 524747 -SHA256 (xpi/firefox-60.4.0/be.xpi) = 830f80a2d2d82067a44a39b10d13b9ca48c19703ae346f561bf39230fc67c33d -SIZE (xpi/firefox-60.4.0/be.xpi) = 580716 -SHA256 (xpi/firefox-60.4.0/bg.xpi) = aea44af29929a9623c2eec09841c1886d6f5ca28cc5850cbbf4bfc6f9629ae40 -SIZE (xpi/firefox-60.4.0/bg.xpi) = 573847 -SHA256 (xpi/firefox-60.4.0/bn-BD.xpi) = b9a405fb1188b9f9d0e412653ccfb3bf7ac0442a97fecdecf03a62e8cf45f5f6 -SIZE (xpi/firefox-60.4.0/bn-BD.xpi) = 590424 -SHA256 (xpi/firefox-60.4.0/bn-IN.xpi) = cd470e9980bcd4695c144cb6015e3daa35a996743916404574959d9dd441076d -SIZE (xpi/firefox-60.4.0/bn-IN.xpi) = 570865 -SHA256 (xpi/firefox-60.4.0/br.xpi) = 509881c785d1a9f55cf7fa9e30de444ac9af5886748dca4a2cd45df60d9df257 -SIZE (xpi/firefox-60.4.0/br.xpi) = 512028 -SHA256 (xpi/firefox-60.4.0/bs.xpi) = b9c140cc80ea283c014b14261fdb9a9ef3b80a555bf82006d75ac4e1ca267e0a -SIZE (xpi/firefox-60.4.0/bs.xpi) = 514708 -SHA256 (xpi/firefox-60.4.0/ca.xpi) = b93070ce533d706d81aa23d8c86d40f7b4ab12530a61eab1db16f044616156dc -SIZE (xpi/firefox-60.4.0/ca.xpi) = 525255 -SHA256 (xpi/firefox-60.4.0/cak.xpi) = 247ea7d7505d4b628cb61f2e3cc3f117ad6361b4068651e7ef9e1e2d6e2daaa9 -SIZE (xpi/firefox-60.4.0/cak.xpi) = 536300 -SHA256 (xpi/firefox-60.4.0/cs.xpi) = 61a1b2ac458acb878b117c1d6c69a84754d1b6aa0c0cabfb4949dab8c4d72e12 -SIZE (xpi/firefox-60.4.0/cs.xpi) = 531794 -SHA256 (xpi/firefox-60.4.0/cy.xpi) = 973c736b181fe17fa9178a56520ee1fe859bd29fb34ee4d608025e9ad32daa79 -SIZE (xpi/firefox-60.4.0/cy.xpi) = 516632 -SHA256 (xpi/firefox-60.4.0/da.xpi) = 9a4cdbfa1d7a8df5d8d0cf593e702ab9a64a0d7bf8f7e5e5f52c0b926a1a2bb9 -SIZE (xpi/firefox-60.4.0/da.xpi) = 510750 -SHA256 (xpi/firefox-60.4.0/de.xpi) = 4fd7c13c3f7d3b35f4e8e6b78c0ffc346ac997dabdbcdc4ae325b32ba9205f53 -SIZE (xpi/firefox-60.4.0/de.xpi) = 526520 -SHA256 (xpi/firefox-60.4.0/dsb.xpi) = b3146a23988fed470c20a464e24bccaa32436b1c496a7c3cb7b6f88c7c445966 -SIZE (xpi/firefox-60.4.0/dsb.xpi) = 539525 -SHA256 (xpi/firefox-60.4.0/el.xpi) = e4063533df98d216b95513782536c5df4ce61e3c1c04a16d5454767fb091395c -SIZE (xpi/firefox-60.4.0/el.xpi) = 593689 -SHA256 (xpi/firefox-60.4.0/en-GB.xpi) = 63ed16629f8abacc5246760e87878604390f5501bfaf81770cd9d772cf74963a -SIZE (xpi/firefox-60.4.0/en-GB.xpi) = 491695 -SHA256 (xpi/firefox-60.4.0/en-US.xpi) = c253f340f02c8c3a1d0dbf7b68fde4055892e69fc45c0e144ff74fd487dadacd -SIZE (xpi/firefox-60.4.0/en-US.xpi) = 473178 -SHA256 (xpi/firefox-60.4.0/en-ZA.xpi) = 0c1b753e59455191a79d5f11c2dfbec7778dbf39242eb49a668c5eb297fba33a -SIZE (xpi/firefox-60.4.0/en-ZA.xpi) = 474674 -SHA256 (xpi/firefox-60.4.0/eo.xpi) = 449f6581cb43407675aae277b37b974d7785b6526956fb2434cf4bef60d44e60 -SIZE (xpi/firefox-60.4.0/eo.xpi) = 511268 -SHA256 (xpi/firefox-60.4.0/es-AR.xpi) = 014b6a3dd4fba99c19c61ebc9a886147aedd69fbc4d5f5d26970cd14319f9d8b -SIZE (xpi/firefox-60.4.0/es-AR.xpi) = 524653 -SHA256 (xpi/firefox-60.4.0/es-CL.xpi) = 60437b90b11c35ae0071d491a17af9b9708fd570db85a0c1643178ac1d9fa65e -SIZE (xpi/firefox-60.4.0/es-CL.xpi) = 527320 -SHA256 (xpi/firefox-60.4.0/es-ES.xpi) = e99b60f519a100303c7a36af33cf65146043a74f676e9c7996f7e21c211ea01d -SIZE (xpi/firefox-60.4.0/es-ES.xpi) = 459964 -SHA256 (xpi/firefox-60.4.0/es-MX.xpi) = 3d77b4a0d3beabc64208198479192e00e1eeb184def90e9dcc5ab27676b18138 -SIZE (xpi/firefox-60.4.0/es-MX.xpi) = 528665 -SHA256 (xpi/firefox-60.4.0/et.xpi) = 6ce4afd678cd214b76671b2a8aa63d58cbe85d32692c27c221ee13f6bd8095a9 -SIZE (xpi/firefox-60.4.0/et.xpi) = 504965 -SHA256 (xpi/firefox-60.4.0/eu.xpi) = 4adb45e03a94dd409a84ee466127871c338e4c842e46218f48474e7c676be125 -SIZE (xpi/firefox-60.4.0/eu.xpi) = 511708 -SHA256 (xpi/firefox-60.4.0/fa.xpi) = 8869a4c54df2806563e97f60144c78137ab539295870d22ae616b8e6b4508a31 -SIZE (xpi/firefox-60.4.0/fa.xpi) = 566264 -SHA256 (xpi/firefox-60.4.0/ff.xpi) = 31870f3e69c7c4c87b933ccde828da337012a1cd48c90d585ce878fea235557f -SIZE (xpi/firefox-60.4.0/ff.xpi) = 512205 -SHA256 (xpi/firefox-60.4.0/fi.xpi) = ce639812fd26d480cbb132400a114a1dbfd83a9c97da6a68f633dbec638a74da -SIZE (xpi/firefox-60.4.0/fi.xpi) = 506183 -SHA256 (xpi/firefox-60.4.0/fr.xpi) = f7f52f50f36835be12707c4e44e3000b12a9ba7533d110930289499fee1a995f -SIZE (xpi/firefox-60.4.0/fr.xpi) = 536067 -SHA256 (xpi/firefox-60.4.0/fy-NL.xpi) = b0f419ee2bfb6cb0da3ebcf5f43f7d2b4435161b12ffc1d922946353b64ad543 -SIZE (xpi/firefox-60.4.0/fy-NL.xpi) = 524530 -SHA256 (xpi/firefox-60.4.0/ga-IE.xpi) = 27890cb3850aa0dc2795ba474b6671e90386068d602fc7b3b82e325afa05334f -SIZE (xpi/firefox-60.4.0/ga-IE.xpi) = 526983 -SHA256 (xpi/firefox-60.4.0/gd.xpi) = c611343e3305c61c0bb3fbe2b9a54efea092e714930bbe3f40c0bdb1630a9d5a -SIZE (xpi/firefox-60.4.0/gd.xpi) = 520873 -SHA256 (xpi/firefox-60.4.0/gl.xpi) = f9278c95c96c097597a3c226ae3bf516c47be6967f96ee993c47eb382b185a1d -SIZE (xpi/firefox-60.4.0/gl.xpi) = 497370 -SHA256 (xpi/firefox-60.4.0/gn.xpi) = f9a80dd819a039c4923eb6be6b99bad8ddfa3929b8fd0aa033a020c1d271bebd -SIZE (xpi/firefox-60.4.0/gn.xpi) = 533216 -SHA256 (xpi/firefox-60.4.0/gu-IN.xpi) = f0428fe69468ebd2eea170d9d7257f86c348b233dafb5ff351e8e026158ffe54 -SIZE (xpi/firefox-60.4.0/gu-IN.xpi) = 590266 -SHA256 (xpi/firefox-60.4.0/he.xpi) = 1c77961f575e7987507f5ebc7c91b8d104a0dccc893db6bdfc1ad4e03d92f760 -SIZE (xpi/firefox-60.4.0/he.xpi) = 535985 -SHA256 (xpi/firefox-60.4.0/hi-IN.xpi) = af38739494d7348e7e5f53b1c14548110f8f5d1869e4de2f2c559fc458a69218 -SIZE (xpi/firefox-60.4.0/hi-IN.xpi) = 590865 -SHA256 (xpi/firefox-60.4.0/hr.xpi) = 21b05b3332c8c417b21133291b9189c929339bd33ac85c0e133c1762e6899296 -SIZE (xpi/firefox-60.4.0/hr.xpi) = 515957 -SHA256 (xpi/firefox-60.4.0/hsb.xpi) = 7bac818f9228cfc14f2ce2630af40a19ca62a8f698f30bd42dc12274e3dc5428 -SIZE (xpi/firefox-60.4.0/hsb.xpi) = 537060 -SHA256 (xpi/firefox-60.4.0/hu.xpi) = ca76e1ad2f5b0566d1e724173482131d0dbf001e0f7ffd15eff2108e645155c9 -SIZE (xpi/firefox-60.4.0/hu.xpi) = 538411 -SHA256 (xpi/firefox-60.4.0/hy-AM.xpi) = 56fd2362e3472b24fa9f193c1bb518a45fc8f66ec761f1cd0a2d6ab50d7931b9 -SIZE (xpi/firefox-60.4.0/hy-AM.xpi) = 569416 -SHA256 (xpi/firefox-60.4.0/ia.xpi) = 472f3f127a0bd1b40336ab002bf169bc75a91b99f620e102dc5641e804f2759f -SIZE (xpi/firefox-60.4.0/ia.xpi) = 510729 -SHA256 (xpi/firefox-60.4.0/id.xpi) = 6d19a040775eed58b3bdbe6ea4b7d471c2a7501936f5e8e9a860cd50302ef0c6 -SIZE (xpi/firefox-60.4.0/id.xpi) = 502222 -SHA256 (xpi/firefox-60.4.0/is.xpi) = cb3929f9aacfec38027e2d7e9aaeeed3c8480904b39318ceb7d46396292a1150 -SIZE (xpi/firefox-60.4.0/is.xpi) = 513273 -SHA256 (xpi/firefox-60.4.0/it.xpi) = eb437d8fb09550dab8660076185d8c229f5d3e7cde03698896dce7bc983d7671 -SIZE (xpi/firefox-60.4.0/it.xpi) = 399106 -SHA256 (xpi/firefox-60.4.0/ja.xpi) = 4effde2a5c6694281a81a6d47e3a4422655db06329721923e5a13a2e0757ebef -SIZE (xpi/firefox-60.4.0/ja.xpi) = 572011 -SHA256 (xpi/firefox-60.4.0/ka.xpi) = 96591b99c9516c93bde22783bbec58a5cbcffc272e5688229b51a1adc10f82e8 -SIZE (xpi/firefox-60.4.0/ka.xpi) = 556851 -SHA256 (xpi/firefox-60.4.0/kab.xpi) = 8b0ea6983a234e50fa502ed7d8e42201fb8dc186395296a52bbf282c4a66b9b0 -SIZE (xpi/firefox-60.4.0/kab.xpi) = 520400 -SHA256 (xpi/firefox-60.4.0/kk.xpi) = ded846cfe2cb80f129d2874648c3dbc714bfce43ec0e56b54977f0a4b62ecc3a -SIZE (xpi/firefox-60.4.0/kk.xpi) = 582977 -SHA256 (xpi/firefox-60.4.0/km.xpi) = 8205b3a0e405750e6bbef1a4bcd0375374d0651761d28718b8257d9e5065e080 -SIZE (xpi/firefox-60.4.0/km.xpi) = 583111 -SHA256 (xpi/firefox-60.4.0/kn.xpi) = d80186be24ddceee96b87f80138a370e8879b4100954bf18d2e38b7785482a61 -SIZE (xpi/firefox-60.4.0/kn.xpi) = 585871 -SHA256 (xpi/firefox-60.4.0/ko.xpi) = ec0444e78fa7651873ed5576f052117b02baa6e24228bed4baf820307919988f -SIZE (xpi/firefox-60.4.0/ko.xpi) = 547828 -SHA256 (xpi/firefox-60.4.0/lij.xpi) = 089f2bdeeedef607aa6fd3b83a1be73d24a1ecf59d4127689690ef0511b88975 -SIZE (xpi/firefox-60.4.0/lij.xpi) = 513181 -SHA256 (xpi/firefox-60.4.0/lt.xpi) = 52b69dc62f1b0915aabea613a32dc438e9ecdb04cf5bf0a86486ccabb59ae951 -SIZE (xpi/firefox-60.4.0/lt.xpi) = 536463 -SHA256 (xpi/firefox-60.4.0/lv.xpi) = 77d97caaf9ce22a35b43e3723219323002a1cb7d013470cefa99020b6b8fa4e1 -SIZE (xpi/firefox-60.4.0/lv.xpi) = 526417 -SHA256 (xpi/firefox-60.4.0/mai.xpi) = 3a30240c7c2d3d8428a6c2a902ebcc8c427f6348b4f0115b3dc16ebde87b9081 -SIZE (xpi/firefox-60.4.0/mai.xpi) = 549248 -SHA256 (xpi/firefox-60.4.0/mk.xpi) = 400e9920beaf8ba0e7deb085c5a3fcdd01e9331bc17d6f72aa9037051b9a779b -SIZE (xpi/firefox-60.4.0/mk.xpi) = 513808 -SHA256 (xpi/firefox-60.4.0/ml.xpi) = 5fa399baa1ebe7839a100602cfc224e826f5eb19af071a52cd820cc7970ca230 -SIZE (xpi/firefox-60.4.0/ml.xpi) = 598979 -SHA256 (xpi/firefox-60.4.0/mr.xpi) = dd72dd03d4d17d7cf31a1a226b4a0c3409dd009394404b3cb8f54f9b2f942334 -SIZE (xpi/firefox-60.4.0/mr.xpi) = 579111 -SHA256 (xpi/firefox-60.4.0/ms.xpi) = b30f0459ab5450a32d4afce816358506fe2893407f83b1766e397ad523616cc7 -SIZE (xpi/firefox-60.4.0/ms.xpi) = 509556 -SHA256 (xpi/firefox-60.4.0/my.xpi) = 96695c1a83f8be86281594b985f7e9b8b457851f2e96b93627aaf4d4559ea51e -SIZE (xpi/firefox-60.4.0/my.xpi) = 570351 -SHA256 (xpi/firefox-60.4.0/nb-NO.xpi) = e0b532164d0c205ad7f0ecb1c385056d594cd6739881eca9d3a41ad01b12d265 -SIZE (xpi/firefox-60.4.0/nb-NO.xpi) = 509887 -SHA256 (xpi/firefox-60.4.0/ne-NP.xpi) = 2070c51153b071a762ee86b79b08b5cc949c169c15f1b970eb8e10765285122b -SIZE (xpi/firefox-60.4.0/ne-NP.xpi) = 555363 -SHA256 (xpi/firefox-60.4.0/nl.xpi) = ff01bbc0b7f14bdcac59c172772607cbd2e7b39fa6606eb823e5c7b836b8c6be -SIZE (xpi/firefox-60.4.0/nl.xpi) = 517458 -SHA256 (xpi/firefox-60.4.0/nn-NO.xpi) = d4bf54a03f8340cef80ff2bb2f052d64904da6b861bd69da8d13d65eaeef9ecf -SIZE (xpi/firefox-60.4.0/nn-NO.xpi) = 511433 -SHA256 (xpi/firefox-60.4.0/oc.xpi) = 396d39257841d62d0ba0bd0afa52363959221d2cdc75fbaeedcf7f18246cb199 -SIZE (xpi/firefox-60.4.0/oc.xpi) = 526984 -SHA256 (xpi/firefox-60.4.0/or.xpi) = de5a59fc86a8f3bec1889b642eea1bfc0ed71306f6536e43028e75f004842040 -SIZE (xpi/firefox-60.4.0/or.xpi) = 540864 -SHA256 (xpi/firefox-60.4.0/pa-IN.xpi) = 6829648639d2501a9836f09f23e087a7d6011868eea65728a818a35182f67643 -SIZE (xpi/firefox-60.4.0/pa-IN.xpi) = 557874 -SHA256 (xpi/firefox-60.4.0/pl.xpi) = aa76272480d526d462c33809b90d018ad8f2bfa23f62703623c85c18329bab60 -SIZE (xpi/firefox-60.4.0/pl.xpi) = 419029 -SHA256 (xpi/firefox-60.4.0/pt-BR.xpi) = 9876de5ac0d45af3a2f97e7a354215b3bdc766674565ee1a2fabd4d97b3388c5 -SIZE (xpi/firefox-60.4.0/pt-BR.xpi) = 514761 -SHA256 (xpi/firefox-60.4.0/pt-PT.xpi) = 50ab49d5a76a234f65b2577af92a2e0805743212e3995f58d66e61540b4790b7 -SIZE (xpi/firefox-60.4.0/pt-PT.xpi) = 519363 -SHA256 (xpi/firefox-60.4.0/rm.xpi) = 3f09406658fa066aceb85053897fba5c4798bc7e035ee803443bbacb2cc40293 -SIZE (xpi/firefox-60.4.0/rm.xpi) = 506044 -SHA256 (xpi/firefox-60.4.0/ro.xpi) = 1417b4da31080b1d9a1e4fba9d8dbd8127150cac276f1754522ec40a7f2dbfbc -SIZE (xpi/firefox-60.4.0/ro.xpi) = 514056 -SHA256 (xpi/firefox-60.4.0/ru.xpi) = b54cb486377eaaf7a5ff5c01e3ee6eaab55a0c893afd513868dbc29df38a6eb8 -SIZE (xpi/firefox-60.4.0/ru.xpi) = 591396 -SHA256 (xpi/firefox-60.4.0/si.xpi) = 2d30b26181b6cf1f62f21e58c8220cf4f07fdef498c6501f9f62b164af282eee -SIZE (xpi/firefox-60.4.0/si.xpi) = 545576 -SHA256 (xpi/firefox-60.4.0/sk.xpi) = 0a9109c3d40b9dcfadc39399acf805182e8713fcc8f600e472b084289c30277f -SIZE (xpi/firefox-60.4.0/sk.xpi) = 541703 -SHA256 (xpi/firefox-60.4.0/sl.xpi) = 9e892bf500c93a414ce4b9ec92f41241cd7b8fae45379aa5e0bdccb2c931370b -SIZE (xpi/firefox-60.4.0/sl.xpi) = 519373 -SHA256 (xpi/firefox-60.4.0/son.xpi) = ff261bc0ef624014c4d5fd91d45ad7445fdb82517353fbf1a2f5ba749fa3a572 -SIZE (xpi/firefox-60.4.0/son.xpi) = 497700 -SHA256 (xpi/firefox-60.4.0/sq.xpi) = 43fdaebedb1c10d9706340cc4636e732cdd0288eee9a328a322e6b486666fa89 -SIZE (xpi/firefox-60.4.0/sq.xpi) = 521262 -SHA256 (xpi/firefox-60.4.0/sr.xpi) = 9f7226ad8764daf416147b859a54416cb020f324c3f956c78c806e7259ec56f5 -SIZE (xpi/firefox-60.4.0/sr.xpi) = 548773 -SHA256 (xpi/firefox-60.4.0/sv-SE.xpi) = 1800232094c7155114105002dd33c08f2fdcc92e41551ba1d480f4612e7f7077 -SIZE (xpi/firefox-60.4.0/sv-SE.xpi) = 518658 -SHA256 (xpi/firefox-60.4.0/ta.xpi) = 5270288b98966f6b3fa3276b2a02e03ca38dca33bb757190ee2999d5b64d309c -SIZE (xpi/firefox-60.4.0/ta.xpi) = 577921 -SHA256 (xpi/firefox-60.4.0/te.xpi) = 1df0426f98e4096818c2c37dcf7c77d3f5c0f5f0ffe2a1f69820e4ee5ef9dad5 -SIZE (xpi/firefox-60.4.0/te.xpi) = 590964 -SHA256 (xpi/firefox-60.4.0/th.xpi) = 3ae7e912052724a7b9c63a51889a49596cadd8718db53aaad91a41aaf4bdbd7b -SIZE (xpi/firefox-60.4.0/th.xpi) = 562819 -SHA256 (xpi/firefox-60.4.0/tr.xpi) = 2deb102c37e8d5dc006ad1eb551f17fd0363d3930009cd42f2057a9432872663 -SIZE (xpi/firefox-60.4.0/tr.xpi) = 525859 -SHA256 (xpi/firefox-60.4.0/uk.xpi) = ccb412aef1f753adf3d8d0f00064ceb577e1a93ef81219fd80e378edbf116900 -SIZE (xpi/firefox-60.4.0/uk.xpi) = 580919 -SHA256 (xpi/firefox-60.4.0/ur.xpi) = d5baa384cf1ad6c4b8e92f5751aab31ad7a10464936d7b9af347c69e7c1c8924 -SIZE (xpi/firefox-60.4.0/ur.xpi) = 563382 -SHA256 (xpi/firefox-60.4.0/uz.xpi) = c0a2ed70997900393a4db969603a7acf20418a2fd998768ced127bb507a061a0 -SIZE (xpi/firefox-60.4.0/uz.xpi) = 513686 -SHA256 (xpi/firefox-60.4.0/vi.xpi) = ff4c4893b0313e3ea7720c7b4dc485229f0228f6a86f943789bb4f0b371ed788 -SIZE (xpi/firefox-60.4.0/vi.xpi) = 528187 -SHA256 (xpi/firefox-60.4.0/xh.xpi) = bd455ced24f9f38bfbba68a7f0781d78d1e0eb2f2590e6fc666bf4bc3e1db8d9 -SIZE (xpi/firefox-60.4.0/xh.xpi) = 511859 -SHA256 (xpi/firefox-60.4.0/zh-CN.xpi) = 47037f75daba786f81a4789ab84b7c77d9d5fe5f14c1de266715ff12193df3ce -SIZE (xpi/firefox-60.4.0/zh-CN.xpi) = 543585 -SHA256 (xpi/firefox-60.4.0/zh-TW.xpi) = 5bee6ca745bc28ecc64c7d89fc9c4914e8d9fc22b2add02b94a8b856b77a8f19 -SIZE (xpi/firefox-60.4.0/zh-TW.xpi) = 541910 +TIMESTAMP = 1548351040 +SHA256 (xpi/firefox-60.5.0/ach.xpi) = 902e9d95a293a016f9688c8b89c0b48def09b6592bd834bc80cc0e9e47e970e5 +SIZE (xpi/firefox-60.5.0/ach.xpi) = 496841 +SHA256 (xpi/firefox-60.5.0/af.xpi) = f18d098adadea9014e8e493b0488b13c0ce94ce5d9e27c9134cc21ef39f4f884 +SIZE (xpi/firefox-60.5.0/af.xpi) = 487319 +SHA256 (xpi/firefox-60.5.0/an.xpi) = d0f0dd63764e89de9a513c8a2c369474946d64d241913d588da7043aef52d86d +SIZE (xpi/firefox-60.5.0/an.xpi) = 520504 +SHA256 (xpi/firefox-60.5.0/ar.xpi) = a10cfd20b6e4387031a508d7f178766fd1d3f3abcc6f6dea38b507aab25a7076 +SIZE (xpi/firefox-60.5.0/ar.xpi) = 547823 +SHA256 (xpi/firefox-60.5.0/as.xpi) = 591e5e7fb89222a56aeefb20a1d37d9ae6d4d93c585df31b8a78ad3895ac2300 +SIZE (xpi/firefox-60.5.0/as.xpi) = 530728 +SHA256 (xpi/firefox-60.5.0/ast.xpi) = 8ab0231c85aef1abc9a80720d7385e008eec53068f5f9aff3ae2bb07c31a7567 +SIZE (xpi/firefox-60.5.0/ast.xpi) = 508655 +SHA256 (xpi/firefox-60.5.0/az.xpi) = 288fb39810a20ed4524311642dbab181e6ea023c6b2fbc32fb1b24c89cf121d1 +SIZE (xpi/firefox-60.5.0/az.xpi) = 524747 +SHA256 (xpi/firefox-60.5.0/be.xpi) = c7c3ee90df65e77b9a083c7578d9d02271195f24e42f6e1e78ccf4f00ad288e8 +SIZE (xpi/firefox-60.5.0/be.xpi) = 580716 +SHA256 (xpi/firefox-60.5.0/bg.xpi) = 80771ea9cd1b37f98ffec9e273c4531ae7462e46593de99f214fd8d2cd96484a +SIZE (xpi/firefox-60.5.0/bg.xpi) = 573852 +SHA256 (xpi/firefox-60.5.0/bn-BD.xpi) = 30d8876bcc654db989f32b80b17b88a24a85d4d216a37f3c098a32fb4b32fd73 +SIZE (xpi/firefox-60.5.0/bn-BD.xpi) = 590423 +SHA256 (xpi/firefox-60.5.0/bn-IN.xpi) = a4e4a9c46bcd2e0c2346b0e955480d59606794920400becee9fe6a87c64471bc +SIZE (xpi/firefox-60.5.0/bn-IN.xpi) = 570870 +SHA256 (xpi/firefox-60.5.0/br.xpi) = 93a42ac6c6bc03cc42902ae36b9b6a84e7d3110c6f54d4ff6b81ed0a5163756c +SIZE (xpi/firefox-60.5.0/br.xpi) = 512031 +SHA256 (xpi/firefox-60.5.0/bs.xpi) = 06e2d833a8261fac2758247c76058421ea545f5e96124dc14c7c630ec6a45d71 +SIZE (xpi/firefox-60.5.0/bs.xpi) = 514714 +SHA256 (xpi/firefox-60.5.0/ca.xpi) = 675a11181e0d09189458b02391a5ea0b83a6da27e6943135c164fc147a92193c +SIZE (xpi/firefox-60.5.0/ca.xpi) = 525262 +SHA256 (xpi/firefox-60.5.0/cak.xpi) = 5f30f7aa222e5fae70c8494dfbed488d837ed51ef2da20db5a3bccb5453b6142 +SIZE (xpi/firefox-60.5.0/cak.xpi) = 536296 +SHA256 (xpi/firefox-60.5.0/cs.xpi) = 8439b8d0e20912ddf3f94d49615e63b605cdeafba457f3678ef73929eac482da +SIZE (xpi/firefox-60.5.0/cs.xpi) = 531796 +SHA256 (xpi/firefox-60.5.0/cy.xpi) = 06634bab29a524a454e85b77f99a67a2a1651b621fac72454172cd25d26b114a +SIZE (xpi/firefox-60.5.0/cy.xpi) = 516642 +SHA256 (xpi/firefox-60.5.0/da.xpi) = 3b3e29a9d4aad9adb8e756a1310de06ebd7f73a637a0e085fee2cde6cd8eeabe +SIZE (xpi/firefox-60.5.0/da.xpi) = 510754 +SHA256 (xpi/firefox-60.5.0/de.xpi) = 1e8f16ab1ad091448e58d576ed9526d4b9db759b040a999a7e423b604f5d1a9e +SIZE (xpi/firefox-60.5.0/de.xpi) = 526524 +SHA256 (xpi/firefox-60.5.0/dsb.xpi) = 2fb408ceb8f0bfe006b551c3e540f0cbf33a02b6a21681cadd408cfa8c8016f1 +SIZE (xpi/firefox-60.5.0/dsb.xpi) = 539525 +SHA256 (xpi/firefox-60.5.0/el.xpi) = 3ec3b05ff9d604baef5e871d8844d1c0637df73e5e7c4b5182a59aa8b9826008 +SIZE (xpi/firefox-60.5.0/el.xpi) = 593699 +SHA256 (xpi/firefox-60.5.0/en-GB.xpi) = 8df918399929d5d73e924beeb7ac4986d028e2601104b29291c8e984a9bcffd5 +SIZE (xpi/firefox-60.5.0/en-GB.xpi) = 491694 +SHA256 (xpi/firefox-60.5.0/en-US.xpi) = db720f916bc55ec096a403c64c46b577a50c287e5eba9b36a08ebba67e2a54ba +SIZE (xpi/firefox-60.5.0/en-US.xpi) = 473177 +SHA256 (xpi/firefox-60.5.0/en-ZA.xpi) = f29e83cca768a91a0c5b305cad8538c60886dbe23b2ca0f13bf88399fa72bf94 +SIZE (xpi/firefox-60.5.0/en-ZA.xpi) = 474686 +SHA256 (xpi/firefox-60.5.0/eo.xpi) = 588051d0cd2be13dafd9228057b433d24804612933676c3f7175bdb981a0b968 +SIZE (xpi/firefox-60.5.0/eo.xpi) = 511271 +SHA256 (xpi/firefox-60.5.0/es-AR.xpi) = 332a90218d0af056f6c374d2ac440ca7f7a1b63b61c9bce4f2f8246ec09eaf7b +SIZE (xpi/firefox-60.5.0/es-AR.xpi) = 524654 +SHA256 (xpi/firefox-60.5.0/es-CL.xpi) = 3a5f273074342e4bd9320e11c592f65a3d0442fa6e7ba860d8d94f2cba8acde2 +SIZE (xpi/firefox-60.5.0/es-CL.xpi) = 527329 +SHA256 (xpi/firefox-60.5.0/es-ES.xpi) = 15a0e24ae0dc2812c4697213ca6024f55f81a665ca5db57bfc7e5709c50cec67 +SIZE (xpi/firefox-60.5.0/es-ES.xpi) = 459968 +SHA256 (xpi/firefox-60.5.0/es-MX.xpi) = 0d69e17e57881f44a8e95ce896b3bfed792eb0b61192fe781466939d84ec11bf +SIZE (xpi/firefox-60.5.0/es-MX.xpi) = 528670 +SHA256 (xpi/firefox-60.5.0/et.xpi) = 0490770f68e5a34810ddb8b9be00d994844b247ef8fc707edda236b3f14d1895 +SIZE (xpi/firefox-60.5.0/et.xpi) = 504972 +SHA256 (xpi/firefox-60.5.0/eu.xpi) = 2b6e8b7f355e8d11e84c8ef93a17706003a3076c0b67d356afc5cae4889f6eef +SIZE (xpi/firefox-60.5.0/eu.xpi) = 511713 +SHA256 (xpi/firefox-60.5.0/fa.xpi) = a2734194d4103a41676260e6b4c68c6221859ec25a9d808f72cee2229c411c87 +SIZE (xpi/firefox-60.5.0/fa.xpi) = 566263 +SHA256 (xpi/firefox-60.5.0/ff.xpi) = 0432b0ec0303caab4838a2361dc1df0151e9e06db049287cc43f6d11354469d0 +SIZE (xpi/firefox-60.5.0/ff.xpi) = 512210 +SHA256 (xpi/firefox-60.5.0/fi.xpi) = 94d4ae4614a0913828ec4652f8329bd95dabf441ec869f599dd8ceb297205037 +SIZE (xpi/firefox-60.5.0/fi.xpi) = 506177 +SHA256 (xpi/firefox-60.5.0/fr.xpi) = 2502ccfab3282b487b5bc3fd6bf6712e6b4c719a0f7b82ade2fb4daf1f01a071 +SIZE (xpi/firefox-60.5.0/fr.xpi) = 536081 +SHA256 (xpi/firefox-60.5.0/fy-NL.xpi) = e425b5b4187c62d61fee56a449611a7deb1e507fc78dfbe55badd962a22d4259 +SIZE (xpi/firefox-60.5.0/fy-NL.xpi) = 524529 +SHA256 (xpi/firefox-60.5.0/ga-IE.xpi) = d613f8fc40cd9c4f8b86871eb2287b2bbb5a730a3d7919844759e5a118703bf7 +SIZE (xpi/firefox-60.5.0/ga-IE.xpi) = 526991 +SHA256 (xpi/firefox-60.5.0/gd.xpi) = e1c0bf304005c1420127e33a0b59841492688a22a9eb4afe905a0bfbc3b89b79 +SIZE (xpi/firefox-60.5.0/gd.xpi) = 520877 +SHA256 (xpi/firefox-60.5.0/gl.xpi) = 1d8bcec3b6b464601df8e7b547c97dc80e2b98e3e7a475eef5ee437490245f18 +SIZE (xpi/firefox-60.5.0/gl.xpi) = 497371 +SHA256 (xpi/firefox-60.5.0/gn.xpi) = 1dc03bd3ca677c5d938074f657b43ae263c37d8a652ccf8ffb3f8fffd91693bd +SIZE (xpi/firefox-60.5.0/gn.xpi) = 533215 +SHA256 (xpi/firefox-60.5.0/gu-IN.xpi) = b05f2525c91571057cdb8a92b3ca1953a829c3e72b7f4e4103c3c2e3cba9b2f3 +SIZE (xpi/firefox-60.5.0/gu-IN.xpi) = 590271 +SHA256 (xpi/firefox-60.5.0/he.xpi) = 810fadb78526516a9d2485c7e4fedc5be9e56c2f31cf3b96bc9d8e17f3ed5bdb +SIZE (xpi/firefox-60.5.0/he.xpi) = 535983 +SHA256 (xpi/firefox-60.5.0/hi-IN.xpi) = 67a1d5286e11e2bc49a7696c4443c2e96196425e467c393d72f7be8fa51f8286 +SIZE (xpi/firefox-60.5.0/hi-IN.xpi) = 590858 +SHA256 (xpi/firefox-60.5.0/hr.xpi) = b33cd0ab6d1bcd2970fe79b4f5926243d37ee351ddaad43c78612c5745b08c2d +SIZE (xpi/firefox-60.5.0/hr.xpi) = 515957 +SHA256 (xpi/firefox-60.5.0/hsb.xpi) = b4740896365efd609275bc01efce4d2837af2875636b3a1c1a2324d12c5a9dad +SIZE (xpi/firefox-60.5.0/hsb.xpi) = 537071 +SHA256 (xpi/firefox-60.5.0/hu.xpi) = 2f009d77b10246fb5269cbfd9e9d429b5f1a250328951c34575533c6cffecba8 +SIZE (xpi/firefox-60.5.0/hu.xpi) = 538420 +SHA256 (xpi/firefox-60.5.0/hy-AM.xpi) = 9e9ded7194f4be5c613300ae6616c505549d6ffa04c6a692c24e3f400ebbc798 +SIZE (xpi/firefox-60.5.0/hy-AM.xpi) = 569422 +SHA256 (xpi/firefox-60.5.0/ia.xpi) = 527f6232ac3d9c9e489adf106f018e011b3b3de701b1e3dc9b9ac30281e734e6 +SIZE (xpi/firefox-60.5.0/ia.xpi) = 510740 +SHA256 (xpi/firefox-60.5.0/id.xpi) = 50c675f59a7027b69fd520d686e30231ab60b69ecd3c9028c4a0050c849d24f5 +SIZE (xpi/firefox-60.5.0/id.xpi) = 502224 +SHA256 (xpi/firefox-60.5.0/is.xpi) = 27fe43ef8725bda19be283485eed09c7f3006c8baa60a922c38777c804b3b636 +SIZE (xpi/firefox-60.5.0/is.xpi) = 513272 +SHA256 (xpi/firefox-60.5.0/it.xpi) = 60c52d92522cfa8d556e3f2b515bb82cbfb87a2a5660d79c216cbbe618fc5319 +SIZE (xpi/firefox-60.5.0/it.xpi) = 399110 +SHA256 (xpi/firefox-60.5.0/ja.xpi) = 131c0f1a40ff3f608ecdff6c1fe25794c15011df354fb072ff086d2abde40790 +SIZE (xpi/firefox-60.5.0/ja.xpi) = 572017 +SHA256 (xpi/firefox-60.5.0/ka.xpi) = 7dbfd2e737251cb175be544486076fef17dfcdd926cd6e405276fa4ba51abc6d +SIZE (xpi/firefox-60.5.0/ka.xpi) = 556850 +SHA256 (xpi/firefox-60.5.0/kab.xpi) = c5681e61588a23aad87ba52537531284039b3ea9d835530df97fcf7fa783c805 +SIZE (xpi/firefox-60.5.0/kab.xpi) = 520403 +SHA256 (xpi/firefox-60.5.0/kk.xpi) = 71189e64d455b0ae8d5aada32eeb38e0f521f862cf46ec11d3375a32fe9a9fa9 +SIZE (xpi/firefox-60.5.0/kk.xpi) = 582984 +SHA256 (xpi/firefox-60.5.0/km.xpi) = b53a3ac66057995cdc626201bb770dec80c36d8219f75d7dd20c70915fdc6076 +SIZE (xpi/firefox-60.5.0/km.xpi) = 583120 +SHA256 (xpi/firefox-60.5.0/kn.xpi) = 9978775a22c23b9f3a94ea5f2e6eb9ec9581354025e2d65d4db89a82db8b8c98 +SIZE (xpi/firefox-60.5.0/kn.xpi) = 585876 +SHA256 (xpi/firefox-60.5.0/ko.xpi) = e4951821e403b17c750ee9ab5bd902c17307688f5593c3ed6ce7e1010900ea72 +SIZE (xpi/firefox-60.5.0/ko.xpi) = 547827 +SHA256 (xpi/firefox-60.5.0/lij.xpi) = 8e3e4fc152995752e9a297933c3c736e2406e10e0c3a19945fe35503cad4ff03 +SIZE (xpi/firefox-60.5.0/lij.xpi) = 513183 +SHA256 (xpi/firefox-60.5.0/lt.xpi) = 8a659fc5a4b73ef140e4b19da26b42bf8d4580f2d0678a577a148adcbbc5e549 +SIZE (xpi/firefox-60.5.0/lt.xpi) = 536465 +SHA256 (xpi/firefox-60.5.0/lv.xpi) = c42e08612ea3d98c1b359def320615b3064c717711be1ce0c698419fc9ab4b44 +SIZE (xpi/firefox-60.5.0/lv.xpi) = 526420 +SHA256 (xpi/firefox-60.5.0/mai.xpi) = 44da9c2312d4f11ff32d660014a5e41aef5107e5d69f87662b1f4d0a0aab5eca +SIZE (xpi/firefox-60.5.0/mai.xpi) = 549255 +SHA256 (xpi/firefox-60.5.0/mk.xpi) = 2b0b831f98e43a06c72e099e6dbd4dfddbf58b789da7fc89e05f3d7a13a8ab31 +SIZE (xpi/firefox-60.5.0/mk.xpi) = 513806 +SHA256 (xpi/firefox-60.5.0/ml.xpi) = 1f9a7f961a1bc24d884e1f863016ceedc18facd17560252cfce15a1b04684409 +SIZE (xpi/firefox-60.5.0/ml.xpi) = 598978 +SHA256 (xpi/firefox-60.5.0/mr.xpi) = d942589ee0f43f250cc27643037ebf18b9f4e239b75c5e5295e0cb2db200a2b4 +SIZE (xpi/firefox-60.5.0/mr.xpi) = 579120 +SHA256 (xpi/firefox-60.5.0/ms.xpi) = 7e06de0fdff161468a8ab39b85bbfacc7621adf85ace5f9c72ecf549df53d370 +SIZE (xpi/firefox-60.5.0/ms.xpi) = 509554 +SHA256 (xpi/firefox-60.5.0/my.xpi) = 877e22316e59d8c77a7c40de4aaed5f5343ffb50a5dfa609b4f943b3226a0fdb +SIZE (xpi/firefox-60.5.0/my.xpi) = 570357 +SHA256 (xpi/firefox-60.5.0/nb-NO.xpi) = f627060a3d1e134629baee0b7bbc60b98ba531ade790971ba438c5d1bf8f05ff +SIZE (xpi/firefox-60.5.0/nb-NO.xpi) = 509891 +SHA256 (xpi/firefox-60.5.0/ne-NP.xpi) = 7b69e48d59af3790a1219cb229484a3df7cba4f2cac2ed4525a8623a66bbdb78 +SIZE (xpi/firefox-60.5.0/ne-NP.xpi) = 555369 +SHA256 (xpi/firefox-60.5.0/nl.xpi) = 13bdb8cbe92bd3e0d41e3a66906772509b2079c065b02537049eda9f2cf62271 +SIZE (xpi/firefox-60.5.0/nl.xpi) = 517455 +SHA256 (xpi/firefox-60.5.0/nn-NO.xpi) = 0fb6f7ae980bcc0ded0356515e3c63e2e220e06f025d4fde242192b3db6d63e6 +SIZE (xpi/firefox-60.5.0/nn-NO.xpi) = 511434 +SHA256 (xpi/firefox-60.5.0/oc.xpi) = a7b180564aec93f29a719ea8c32d331ac71b0f95f838cd551ad3ef9dfd4e93e9 +SIZE (xpi/firefox-60.5.0/oc.xpi) = 526991 +SHA256 (xpi/firefox-60.5.0/or.xpi) = 39d9532f7c54187d6095dcce2866d231833964c40771f1b577daf6db5ea673a1 +SIZE (xpi/firefox-60.5.0/or.xpi) = 540875 +SHA256 (xpi/firefox-60.5.0/pa-IN.xpi) = 3f2bc1e613fb0324a8e862a9b533e1950e1714da1869f5907eca1b85da29a322 +SIZE (xpi/firefox-60.5.0/pa-IN.xpi) = 557878 +SHA256 (xpi/firefox-60.5.0/pl.xpi) = 95d1b481e12995b343a0d16a5a1ef51051000763366ca7f645749a26fa2c4fcc +SIZE (xpi/firefox-60.5.0/pl.xpi) = 419026 +SHA256 (xpi/firefox-60.5.0/pt-BR.xpi) = de4386e4f6d24202183a3d4011034254898bfa262a301fd3794bec5ab801a4fa +SIZE (xpi/firefox-60.5.0/pt-BR.xpi) = 514760 +SHA256 (xpi/firefox-60.5.0/pt-PT.xpi) = 054ff93b1ac3ce4d850c82f43d8fbe78ac10cad6cce9b35533f84f2360abe85f +SIZE (xpi/firefox-60.5.0/pt-PT.xpi) = 519358 +SHA256 (xpi/firefox-60.5.0/rm.xpi) = 5bfc67dc8efed4ac4ce02360bc47c175537f8f13810f9c31469ec828bc7b9baf +SIZE (xpi/firefox-60.5.0/rm.xpi) = 506037 +SHA256 (xpi/firefox-60.5.0/ro.xpi) = 709cda5e8cd314a6f6bfe5dca0314eec1e789f509643aba3056173abb7b658f5 +SIZE (xpi/firefox-60.5.0/ro.xpi) = 514052 +SHA256 (xpi/firefox-60.5.0/ru.xpi) = 5a6ae6e866dbe6e5095b9063ef9a2a06c3242f48b4c4b3ef8031b6bc017de360 +SIZE (xpi/firefox-60.5.0/ru.xpi) = 591402 +SHA256 (xpi/firefox-60.5.0/si.xpi) = c4daa23116ece805db5e9ba14dfecf566a9e32119dbaa97de7de17a631cd7cba +SIZE (xpi/firefox-60.5.0/si.xpi) = 545576 +SHA256 (xpi/firefox-60.5.0/sk.xpi) = 1e30ff3bb6067baf090752beead57369fc29f48184c040c37a638565da37b135 +SIZE (xpi/firefox-60.5.0/sk.xpi) = 541705 +SHA256 (xpi/firefox-60.5.0/sl.xpi) = 9df81a2451b291f2562bf12101a34e92480f48ee0a3001d8e0c03fbc199043fb +SIZE (xpi/firefox-60.5.0/sl.xpi) = 519375 +SHA256 (xpi/firefox-60.5.0/son.xpi) = 17c8df028b8ea031a2c324df793990075527332c9e97850461c8039d4de69f02 +SIZE (xpi/firefox-60.5.0/son.xpi) = 497693 +SHA256 (xpi/firefox-60.5.0/sq.xpi) = 08bd7af9da28b6889c75a87a3ed84b895768ec6612d0a35b102c05e7a001cb34 +SIZE (xpi/firefox-60.5.0/sq.xpi) = 521271 +SHA256 (xpi/firefox-60.5.0/sr.xpi) = 725ed184e9485fb67357da18fc25d14b9926380ad051cb41ee2029f77b7804a8 +SIZE (xpi/firefox-60.5.0/sr.xpi) = 548776 +SHA256 (xpi/firefox-60.5.0/sv-SE.xpi) = 60b59c2fddc9fd0e53e60181e9b5777d0eb4eee29471d383d7185e8e9ae8e5f7 +SIZE (xpi/firefox-60.5.0/sv-SE.xpi) = 518664 +SHA256 (xpi/firefox-60.5.0/ta.xpi) = 49fb8712b8d34ed30f3a499fa217ce9890072d67e3380b9157cfaeb078dd8fe9 +SIZE (xpi/firefox-60.5.0/ta.xpi) = 577921 +SHA256 (xpi/firefox-60.5.0/te.xpi) = 78d3868d484bd56f8c02055bdd632149b491595e1964643132595f519d055c00 +SIZE (xpi/firefox-60.5.0/te.xpi) = 590962 +SHA256 (xpi/firefox-60.5.0/th.xpi) = 65b7195626d9aa64eed5af5aa837d42ec4712e7e18de2c940c018bdb78c18930 +SIZE (xpi/firefox-60.5.0/th.xpi) = 562823 +SHA256 (xpi/firefox-60.5.0/tr.xpi) = 5bbdab6771771b2d1e1eb49f3827db9b3f7cf7139f8433db3befa89d3b42c14b +SIZE (xpi/firefox-60.5.0/tr.xpi) = 525862 +SHA256 (xpi/firefox-60.5.0/uk.xpi) = a05914a868fb8b3a8516c07e79af2c5d1ac2c3c903640fae1d0f557b57219db3 +SIZE (xpi/firefox-60.5.0/uk.xpi) = 580926 +SHA256 (xpi/firefox-60.5.0/ur.xpi) = fe75fd1b6f0bf3d3648cc9a5070510126a2b85294f1afd9260e7f5b5387f0ef7 +SIZE (xpi/firefox-60.5.0/ur.xpi) = 563375 +SHA256 (xpi/firefox-60.5.0/uz.xpi) = d4052d0ac608d8599ac1f6612ce9c64b6ea61cbd298c2de65d6d98bd5020ce30 +SIZE (xpi/firefox-60.5.0/uz.xpi) = 513691 +SHA256 (xpi/firefox-60.5.0/vi.xpi) = e3a910a16a9b452559bba0f4a23e5bf30981299e21256a61e34b706e37b602ee +SIZE (xpi/firefox-60.5.0/vi.xpi) = 528193 +SHA256 (xpi/firefox-60.5.0/xh.xpi) = d88293a405aa67049138d6a3c9e331e6fc63258a232445c15ab4d8cbe99b5f9e +SIZE (xpi/firefox-60.5.0/xh.xpi) = 511860 +SHA256 (xpi/firefox-60.5.0/zh-CN.xpi) = 67518a93c6cd5d4cf6994f9daf9df11db9b5f90d7146b75dca221c7c17ac98af +SIZE (xpi/firefox-60.5.0/zh-CN.xpi) = 543587 +SHA256 (xpi/firefox-60.5.0/zh-TW.xpi) = cd0c42fd40a4c798e94fb9d072d8fa8b67d34a5411d5d485ed8ae616d1194273 +SIZE (xpi/firefox-60.5.0/zh-TW.xpi) = 541914 Index: branches/2019Q1 =================================================================== --- branches/2019Q1 (revision 491522) +++ branches/2019Q1 (revision 491523) Property changes on: branches/2019Q1 ___________________________________________________________________ Modified: svn:mergeinfo ## -0,0 +0,1 ## Merged /head:r490962,491213