aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Beich <jbeich@FreeBSD.org>2018-06-25 22:36:12 +0000
committerJan Beich <jbeich@FreeBSD.org>2018-06-25 22:36:12 +0000
commitbc8335f2ef0cabe0c4e45c88b517039e001bf526 (patch)
treed3a9ca03375b00398a2c1275d592b41af178ab8f
parent28ece62a29ad29fb0384b2b2da7c4a7a74c99de8 (diff)
downloadports-bc8335f2ef0cabe0c4e45c88b517039e001bf526.tar.gz
ports-bc8335f2ef0cabe0c4e45c88b517039e001bf526.zip
MFH: r468159 r472727 r472730 r473076
www/firefox: update to 61.0 - Drop DTRACE option, as it no longer builds https://bugzilla.mozilla.org/show_bug.cgi?id=1448659 https://bugzilla.mozilla.org/show_bug.cgi?id=702179#c33 - Stop using system hunspell per https://bugzilla.mozilla.org/show_bug.cgi?id=1460600 Changes: https://www.mozilla.org/firefox/61.0/releasenotes/ PR: 227850 Security: cd81806c-26e7-4d4a-8425-02724a2f48af Approved by: ports-secteam blanket Differential Revision: https://reviews.freebsd.org/D15227
Notes
Notes: svn path=/branches/2018Q2/; revision=473354
-rw-r--r--Mk/Uses/gecko.mk4
-rw-r--r--Mk/bsd.gecko.mk5
-rw-r--r--www/firefox-i18n/Makefile7
-rw-r--r--www/firefox-i18n/distinfo394
-rw-r--r--www/firefox/Makefile13
-rw-r--r--www/firefox/distinfo6
-rw-r--r--www/firefox/files/patch-addon-search8
-rw-r--r--www/firefox/files/patch-bug102176113
-rw-r--r--www/firefox/files/patch-bug137507482
-rw-r--r--www/firefox/files/patch-bug141148185
-rw-r--r--www/firefox/files/patch-bug14386781000
-rw-r--r--www/firefox/files/patch-bug144258339
-rw-r--r--www/firefox/files/patch-bug144479845
-rw-r--r--www/firefox/files/patch-bug144590775
-rw-r--r--www/firefox/files/patch-bug144735945
-rw-r--r--www/firefox/files/patch-bug145129233
-rw-r--r--www/firefox/files/patch-bug145655622
-rw-r--r--www/firefox/files/patch-bug70217912
-rw-r--r--www/firefox/files/patch-dom_media_flac_FlacDecoder.cpp6
-rw-r--r--www/firefox/files/patch-u2f-hid-rs62290
-rw-r--r--www/firefox/files/patch-z-bug14369111162
-rw-r--r--www/firefox/files/patch-z-bug5174228
22 files changed, 249 insertions, 3105 deletions
diff --git a/Mk/Uses/gecko.mk b/Mk/Uses/gecko.mk
index 9df59c251201..18d167e70a2f 100644
--- a/Mk/Uses/gecko.mk
+++ b/Mk/Uses/gecko.mk
@@ -37,12 +37,12 @@ RUN_DEPENDS+= libxul>=45:www/libxul
.elif ${gecko_ARGS:Mfirefox}
_GECKO_DEFAULT_VERSION= 52
-_GECKO_VERSIONS= 52 60
+_GECKO_VERSIONS= 52 61
_GECKO_TYPE= firefox
# Dependence lines for different Firefox versions
52_DEPENDS= ${LOCALBASE}/lib/firefox/firefox:www/firefox-esr
-60_DEPENDS= ${LOCALBASE}/lib/firefox/firefox:www/firefox
+61_DEPENDS= ${LOCALBASE}/lib/firefox/firefox:www/firefox
.if exists(${LOCALBASE}/bin/firefox)
_GECKO_INSTALLED_VER!= ${LOCALBASE}/bin/firefox --version 2>/dev/null
diff --git a/Mk/bsd.gecko.mk b/Mk/bsd.gecko.mk
index b4c33ff5e8be..6bef0740511c 100644
--- a/Mk/bsd.gecko.mk
+++ b/Mk/bsd.gecko.mk
@@ -111,6 +111,11 @@ BUILD_DEPENDS+= llvm${MESA_LLVM_VER}>0:devel/llvm${MESA_LLVM_VER}
MOZ_EXPORT+= LLVM_CONFIG=llvm-config${MESA_LLVM_VER}
.endif
+.if ${MOZILLA_VER:R:R} >= 61
+BUILD_DEPENDS+= ${LOCALBASE}/bin/python${PYTHON3_DEFAULT}:lang/python${PYTHON3_DEFAULT:S/.//g}
+MOZ_EXPORT+= PYTHON3="${LOCALBASE}/bin/python${PYTHON3_DEFAULT}"
+.endif
+
.if ${OPSYS} == FreeBSD && ${OSREL} == 11.1
LLD_UNSAFE= yes
.endif
diff --git a/www/firefox-i18n/Makefile b/www/firefox-i18n/Makefile
index 290aad183601..69f345f42faa 100644
--- a/www/firefox-i18n/Makefile
+++ b/www/firefox-i18n/Makefile
@@ -2,10 +2,11 @@
# $FreeBSD$
PORTNAME= firefox-i18n
-PORTVERSION= 60.0.2
+PORTVERSION= 61.0
+PORTREVISION= 1
CATEGORIES= www
MASTER_SITES= MOZILLA/${PORTNAME:S|-i18n||}/releases/${DISTVERSION}/linux-i686/xpi \
- MOZILLA/${PORTNAME:S|-i18n||}/candidates/${DISTVERSION}-candidates/build1/linux-i686/xpi
+ MOZILLA/${PORTNAME:S|-i18n||}/candidates/${DISTVERSION}-candidates/build3/linux-i686/xpi
PKGNAMEPREFIX=
DISTFILES= ${FIREFOX_I18N_:S/$/.xpi/}
DIST_SUBDIR= xpi/${DISTNAME}
@@ -15,7 +16,7 @@ COMMENT= Localized interface for Firefox
EXTRACT_DEPENDS= zip:archivers/zip
-USES= zip:infozip gecko:firefox,60,build
+USES= zip:infozip gecko:firefox,61,build
USE_XPI= firefox
NO_ARCH= yes
diff --git a/www/firefox-i18n/distinfo b/www/firefox-i18n/distinfo
index 8967f0de7081..1e4176a97233 100644
--- a/www/firefox-i18n/distinfo
+++ b/www/firefox-i18n/distinfo
@@ -1,197 +1,197 @@
-TIMESTAMP = 1528228087
-SHA256 (xpi/firefox-i18n-60.0.2/ach.xpi) = 3264cdac77964c001d27c1da36d280702c6e28bb9caedf06a7a57d2d034f5097
-SIZE (xpi/firefox-i18n-60.0.2/ach.xpi) = 496058
-SHA256 (xpi/firefox-i18n-60.0.2/af.xpi) = 46c49276255243becdddff6102bea42c4860cc3c008d4b01f8d95b91812cdfca
-SIZE (xpi/firefox-i18n-60.0.2/af.xpi) = 486534
-SHA256 (xpi/firefox-i18n-60.0.2/an.xpi) = 037f8ec9d96f019059d8131eff4ab06fff8ecc657f98ea231b1e5e7bae730880
-SIZE (xpi/firefox-i18n-60.0.2/an.xpi) = 519729
-SHA256 (xpi/firefox-i18n-60.0.2/ar.xpi) = cda7d8d114da54e4ecd6a5781795ab590c3510c59ab74d1c8343a2834489fa73
-SIZE (xpi/firefox-i18n-60.0.2/ar.xpi) = 546953
-SHA256 (xpi/firefox-i18n-60.0.2/as.xpi) = b978d40a6ebe0ec9ae07fe9d0b2a24c181422c1c09939255f7984a4b153b9a26
-SIZE (xpi/firefox-i18n-60.0.2/as.xpi) = 529953
-SHA256 (xpi/firefox-i18n-60.0.2/ast.xpi) = 5be044c2ea120e039e73a33c334314ce488bc12f0d0d5605a86320a023ed3ea3
-SIZE (xpi/firefox-i18n-60.0.2/ast.xpi) = 507870
-SHA256 (xpi/firefox-i18n-60.0.2/az.xpi) = c692cc2f12e4df1b5e45a5070766e8c5cf468aeb3315180228defdc5704e61d1
-SIZE (xpi/firefox-i18n-60.0.2/az.xpi) = 523974
-SHA256 (xpi/firefox-i18n-60.0.2/be.xpi) = cc291a855dcb454f114b40c7673db18dd7c0b2962a3c11ff9c0a986e3231eaa6
-SIZE (xpi/firefox-i18n-60.0.2/be.xpi) = 579945
-SHA256 (xpi/firefox-i18n-60.0.2/bg.xpi) = 62178b8aa781941a3de9d11e597092d479f682b5c6738de010110a3b9a9a42d8
-SIZE (xpi/firefox-i18n-60.0.2/bg.xpi) = 573080
-SHA256 (xpi/firefox-i18n-60.0.2/bn-BD.xpi) = cbd8950fdab635e864c10a5358d0495210effd6160a62b9599b093338dc67a16
-SIZE (xpi/firefox-i18n-60.0.2/bn-BD.xpi) = 589638
-SHA256 (xpi/firefox-i18n-60.0.2/bn-IN.xpi) = 026b702fdec8e922e71e6a9198d42de7a615d47d9ce47d8a58fdc8c0ee4ffe5a
-SIZE (xpi/firefox-i18n-60.0.2/bn-IN.xpi) = 570083
-SHA256 (xpi/firefox-i18n-60.0.2/br.xpi) = acd17442b0918ddadaa324223b70cc240e3e5f9377ee1bf966cecb6f1bd124cf
-SIZE (xpi/firefox-i18n-60.0.2/br.xpi) = 511252
-SHA256 (xpi/firefox-i18n-60.0.2/bs.xpi) = 6fc982720e171f8c4e1b06eed294735a6514e3e54bb9ada39cca697315afb48f
-SIZE (xpi/firefox-i18n-60.0.2/bs.xpi) = 513936
-SHA256 (xpi/firefox-i18n-60.0.2/ca.xpi) = 41f425b998c4f37c2e506d24e06ab692597d5d5f191c1042cef42b53b164377e
-SIZE (xpi/firefox-i18n-60.0.2/ca.xpi) = 524484
-SHA256 (xpi/firefox-i18n-60.0.2/cak.xpi) = e511a882edb4fe78c5759c716cc5313875dde60dcb144cb19f1ff2d3dd97478d
-SIZE (xpi/firefox-i18n-60.0.2/cak.xpi) = 535516
-SHA256 (xpi/firefox-i18n-60.0.2/cs.xpi) = 5bd65f390119dcd6f09be4c71a158187e3d0ce3aa775b17459c4b57b6931877b
-SIZE (xpi/firefox-i18n-60.0.2/cs.xpi) = 531015
-SHA256 (xpi/firefox-i18n-60.0.2/cy.xpi) = e2c989a044c9a4af5ec60676d1e2f652d3bea657d0b51f91fe763458781d6279
-SIZE (xpi/firefox-i18n-60.0.2/cy.xpi) = 515864
-SHA256 (xpi/firefox-i18n-60.0.2/da.xpi) = fe33cf6e6b118cbd56af791fce6b57640af600f3ed483ff71b3dace8c3ec378a
-SIZE (xpi/firefox-i18n-60.0.2/da.xpi) = 509975
-SHA256 (xpi/firefox-i18n-60.0.2/de.xpi) = eda7bc1cd123f24b57ce6d0fcfca3e6c0954c71a32ef610ae62dfe8ae8477140
-SIZE (xpi/firefox-i18n-60.0.2/de.xpi) = 525689
-SHA256 (xpi/firefox-i18n-60.0.2/dsb.xpi) = 73daa18ad8e7a42c781242a506587fed18158f0bf1f9f2e7e9c2c8fa4916b4a3
-SIZE (xpi/firefox-i18n-60.0.2/dsb.xpi) = 538745
-SHA256 (xpi/firefox-i18n-60.0.2/el.xpi) = c447405287531c915afde8ca535b1b812b29a4a15b8aa1bb562b26276801a371
-SIZE (xpi/firefox-i18n-60.0.2/el.xpi) = 592917
-SHA256 (xpi/firefox-i18n-60.0.2/en-GB.xpi) = fe02706b63725e0ef67d23cecae9e0a592c1b0c8bb0050773954f142793ef0d4
-SIZE (xpi/firefox-i18n-60.0.2/en-GB.xpi) = 490903
-SHA256 (xpi/firefox-i18n-60.0.2/en-US.xpi) = 3a012162ccef7068fd5b16117ede3eb8c151e99635e83c031a37f1989565f16b
-SIZE (xpi/firefox-i18n-60.0.2/en-US.xpi) = 472384
-SHA256 (xpi/firefox-i18n-60.0.2/en-ZA.xpi) = 0df9291489150fa400c0927b770f5a94e7d3ad641ea59ac720cbf006f3c58e50
-SIZE (xpi/firefox-i18n-60.0.2/en-ZA.xpi) = 473896
-SHA256 (xpi/firefox-i18n-60.0.2/eo.xpi) = 05cc1895271e735fa0d4e73c0cc792de6d7bea63034777fd7facd3e45d0630da
-SIZE (xpi/firefox-i18n-60.0.2/eo.xpi) = 510494
-SHA256 (xpi/firefox-i18n-60.0.2/es-AR.xpi) = 005ee9da32ea33d4f420ecbcd8add9cf2ab5bf332b0a7699ecab4ee67331a564
-SIZE (xpi/firefox-i18n-60.0.2/es-AR.xpi) = 523819
-SHA256 (xpi/firefox-i18n-60.0.2/es-CL.xpi) = f76adcbda565019c183d8a4ecb38a911a7fca78b7db158a5a1fa5402627e0566
-SIZE (xpi/firefox-i18n-60.0.2/es-CL.xpi) = 526509
-SHA256 (xpi/firefox-i18n-60.0.2/es-ES.xpi) = 76b7ab024878427cf6ea87b9a74632c667b4cdcf03bdc899f95bb802dfc304d6
-SIZE (xpi/firefox-i18n-60.0.2/es-ES.xpi) = 459139
-SHA256 (xpi/firefox-i18n-60.0.2/es-MX.xpi) = 2829924eee326add8b7f9f9dffd6a42f54e26bb573307d7655f74dff3fa4df43
-SIZE (xpi/firefox-i18n-60.0.2/es-MX.xpi) = 527838
-SHA256 (xpi/firefox-i18n-60.0.2/et.xpi) = d9f0ff92b02ae4b6674432c191950fce9d5b85307b3dd4a7b818b6c73a701271
-SIZE (xpi/firefox-i18n-60.0.2/et.xpi) = 504174
-SHA256 (xpi/firefox-i18n-60.0.2/eu.xpi) = a80e87f4151defb992312fcd143890c6b86cf5067222a2742257f12eb81fb067
-SIZE (xpi/firefox-i18n-60.0.2/eu.xpi) = 510932
-SHA256 (xpi/firefox-i18n-60.0.2/fa.xpi) = 0bf0337cbd82f45f141eeae5433b4b77da449e3077fc0b32c9a3dc511da47f93
-SIZE (xpi/firefox-i18n-60.0.2/fa.xpi) = 565489
-SHA256 (xpi/firefox-i18n-60.0.2/ff.xpi) = bcf099ecd8ad1544e7d084417d6c876f6629b2689a194d7b38a0988a528e5d15
-SIZE (xpi/firefox-i18n-60.0.2/ff.xpi) = 511432
-SHA256 (xpi/firefox-i18n-60.0.2/fi.xpi) = 657ad94dfd99269ada99636ebf7a7ee9bb7364bdcabaede2f6305bd793793f92
-SIZE (xpi/firefox-i18n-60.0.2/fi.xpi) = 505404
-SHA256 (xpi/firefox-i18n-60.0.2/fr.xpi) = 6c13eaf3cbd4ef845be167f40509e6bb1b6732a3a8f0b7dac8a4b27bb1fb5244
-SIZE (xpi/firefox-i18n-60.0.2/fr.xpi) = 535238
-SHA256 (xpi/firefox-i18n-60.0.2/fy-NL.xpi) = 2def398c510f0417922c6155a47b532a2604794aff25dfaa1a64927e5112e69c
-SIZE (xpi/firefox-i18n-60.0.2/fy-NL.xpi) = 523736
-SHA256 (xpi/firefox-i18n-60.0.2/ga-IE.xpi) = a07e724a94de27dcd7efad3b518519eb2dc8fce2e6c6ad82c49d7340f1aae654
-SIZE (xpi/firefox-i18n-60.0.2/ga-IE.xpi) = 526199
-SHA256 (xpi/firefox-i18n-60.0.2/gd.xpi) = f9f60f239d7091ac4fe4e8797fe66a2cf8f1998229439b64f02d12189fc56ed8
-SIZE (xpi/firefox-i18n-60.0.2/gd.xpi) = 520093
-SHA256 (xpi/firefox-i18n-60.0.2/gl.xpi) = 8dbe92bf6e56417998bb581600f33abdc9ced8015a2f5b5404ad16331377d469
-SIZE (xpi/firefox-i18n-60.0.2/gl.xpi) = 496593
-SHA256 (xpi/firefox-i18n-60.0.2/gn.xpi) = 2f8f02fbff9dcafe6e97f56e3bb4cd30dab599cfeac5aa08176ddf115e93c230
-SIZE (xpi/firefox-i18n-60.0.2/gn.xpi) = 532439
-SHA256 (xpi/firefox-i18n-60.0.2/gu-IN.xpi) = 0d5ccd4b83d3bc510f48466b647956d356da98b2873bf324e0449f795418b83c
-SIZE (xpi/firefox-i18n-60.0.2/gu-IN.xpi) = 589483
-SHA256 (xpi/firefox-i18n-60.0.2/he.xpi) = ec0799c68a0f054ec30fdf9f7b698517b12d960235dabcbfd6ea828e38647cee
-SIZE (xpi/firefox-i18n-60.0.2/he.xpi) = 535211
-SHA256 (xpi/firefox-i18n-60.0.2/hi-IN.xpi) = 3fd33dabf5a465fba7983553ba89d7189cb156132bd2060932b11f1bc3efbabf
-SIZE (xpi/firefox-i18n-60.0.2/hi-IN.xpi) = 590076
-SHA256 (xpi/firefox-i18n-60.0.2/hr.xpi) = be54a7a81d3d2aecd5bda7266034f2c41dd2271ca41c4a59dfc2d95ef8ef6876
-SIZE (xpi/firefox-i18n-60.0.2/hr.xpi) = 515186
-SHA256 (xpi/firefox-i18n-60.0.2/hsb.xpi) = c552a2302b5832c953db367475d9eb292e75ef3f1319e034ade05e6e5ef1f15b
-SIZE (xpi/firefox-i18n-60.0.2/hsb.xpi) = 536278
-SHA256 (xpi/firefox-i18n-60.0.2/hu.xpi) = 61bb78d4604bb4f4fee525751486e6e5612c285565bb7e42f6e3b388a9dbbe31
-SIZE (xpi/firefox-i18n-60.0.2/hu.xpi) = 537587
-SHA256 (xpi/firefox-i18n-60.0.2/hy-AM.xpi) = 54deba7f2a00e48cadd99208472e467f1f78a678db91ba3fbb8ffe2d925f5dda
-SIZE (xpi/firefox-i18n-60.0.2/hy-AM.xpi) = 568629
-SHA256 (xpi/firefox-i18n-60.0.2/ia.xpi) = c69a5c604f90f239a6c78de43b1f7884a5f553eaa49211f81cf76b1c256638f0
-SIZE (xpi/firefox-i18n-60.0.2/ia.xpi) = 509951
-SHA256 (xpi/firefox-i18n-60.0.2/id.xpi) = f7fb19719341975e08328270ba1f4933d589fb4d2798ef9a00965828aba55227
-SIZE (xpi/firefox-i18n-60.0.2/id.xpi) = 501449
-SHA256 (xpi/firefox-i18n-60.0.2/is.xpi) = 0164a3686761abf0be0a1d8f773762031222e22362152865c4e38ac306b0cdd3
-SIZE (xpi/firefox-i18n-60.0.2/is.xpi) = 512502
-SHA256 (xpi/firefox-i18n-60.0.2/it.xpi) = 02b80d059ae403c04b2e130f521b1d80ea71f505cfe4dbd120ea218a84bedeb0
-SIZE (xpi/firefox-i18n-60.0.2/it.xpi) = 398263
-SHA256 (xpi/firefox-i18n-60.0.2/ja.xpi) = dcb3446a228a3cde462264e0ba39c606aea4dc711919e6c7d5dae252ecdd5a67
-SIZE (xpi/firefox-i18n-60.0.2/ja.xpi) = 571244
-SHA256 (xpi/firefox-i18n-60.0.2/ka.xpi) = fcfe7fc9d2cff0399e369eaf1d8bb5d8adb73773d095858bbefd2758d69f7f27
-SIZE (xpi/firefox-i18n-60.0.2/ka.xpi) = 556072
-SHA256 (xpi/firefox-i18n-60.0.2/kab.xpi) = 049404f2dcb4d32ddcce2b36739b4301b69586906defa775fc6500c8fad678ac
-SIZE (xpi/firefox-i18n-60.0.2/kab.xpi) = 519624
-SHA256 (xpi/firefox-i18n-60.0.2/kk.xpi) = ed233b274feec630f92c432ea9adf7624548c628308724aa4046baa51a9d6004
-SIZE (xpi/firefox-i18n-60.0.2/kk.xpi) = 582205
-SHA256 (xpi/firefox-i18n-60.0.2/km.xpi) = a67c04fb6437227a68ab8083491119fc0931dc8b397d605b92f804f9f2f4c710
-SIZE (xpi/firefox-i18n-60.0.2/km.xpi) = 582332
-SHA256 (xpi/firefox-i18n-60.0.2/kn.xpi) = 3427d552400dde0e3d73019cdf6d3ff7e0235d8ea0e9647b90da923c60365924
-SIZE (xpi/firefox-i18n-60.0.2/kn.xpi) = 585098
-SHA256 (xpi/firefox-i18n-60.0.2/ko.xpi) = 22eed6eba57f8cb38bda67e8a90e7bff5668f2e596869bc5a1c60c24453733d3
-SIZE (xpi/firefox-i18n-60.0.2/ko.xpi) = 547056
-SHA256 (xpi/firefox-i18n-60.0.2/lij.xpi) = d1d4e0d940eb4a19ea6ba8f4dd883c4e365d9f1ac7dfe90160764278fec29119
-SIZE (xpi/firefox-i18n-60.0.2/lij.xpi) = 512397
-SHA256 (xpi/firefox-i18n-60.0.2/lt.xpi) = 5d7a35f2890260978d0d7110e73ae2109bb3703d6cd65d36048e66e77062c7fe
-SIZE (xpi/firefox-i18n-60.0.2/lt.xpi) = 535632
-SHA256 (xpi/firefox-i18n-60.0.2/lv.xpi) = 462e8d28b118e601f8eaadf7ee495fceac969e1110debe2e0b12f4afdc5b1834
-SIZE (xpi/firefox-i18n-60.0.2/lv.xpi) = 525636
-SHA256 (xpi/firefox-i18n-60.0.2/mai.xpi) = 66e8e472fcdd9532a8401a4a9bb7293fcfab4535e6129e62d0aba974753d0c0c
-SIZE (xpi/firefox-i18n-60.0.2/mai.xpi) = 548471
-SHA256 (xpi/firefox-i18n-60.0.2/mk.xpi) = d752302445ac0f14496e4230c1c094d2b78fef42f3272914c3a52b72fb8dc4d3
-SIZE (xpi/firefox-i18n-60.0.2/mk.xpi) = 513025
-SHA256 (xpi/firefox-i18n-60.0.2/ml.xpi) = 0652ddfd12240e1a7a258835b6b72af06856d541c99c6a0d2275dca9157674e5
-SIZE (xpi/firefox-i18n-60.0.2/ml.xpi) = 598198
-SHA256 (xpi/firefox-i18n-60.0.2/mr.xpi) = 2a05310d226bd5be71ede145c898eeb1c2e135aefa0245254201266e0595b969
-SIZE (xpi/firefox-i18n-60.0.2/mr.xpi) = 578337
-SHA256 (xpi/firefox-i18n-60.0.2/ms.xpi) = 877a6de579035a20ff32075e5d4d36079af06c0f307428ecf508c39d2af9aab7
-SIZE (xpi/firefox-i18n-60.0.2/ms.xpi) = 508781
-SHA256 (xpi/firefox-i18n-60.0.2/my.xpi) = 6702089f2b5560f7774f6abd432cbaeb8a3364f4897dde19a158efa647bd7a0d
-SIZE (xpi/firefox-i18n-60.0.2/my.xpi) = 569572
-SHA256 (xpi/firefox-i18n-60.0.2/nb-NO.xpi) = 773f9a9843c79f34bfa459829b8c9cd3546b544dccefde0e7c468098de47f383
-SIZE (xpi/firefox-i18n-60.0.2/nb-NO.xpi) = 509104
-SHA256 (xpi/firefox-i18n-60.0.2/ne-NP.xpi) = d3e33d855d4e0d0d89fda9c4cd6b1322348059e2ec378d522904f40e81a3f763
-SIZE (xpi/firefox-i18n-60.0.2/ne-NP.xpi) = 554577
-SHA256 (xpi/firefox-i18n-60.0.2/nl.xpi) = 4f419acfd5824b75e6be4a8a95645ff6bc8798fe3e54c740f8652ca7836ef539
-SIZE (xpi/firefox-i18n-60.0.2/nl.xpi) = 516653
-SHA256 (xpi/firefox-i18n-60.0.2/nn-NO.xpi) = 29aa2f24e4bdd67c58d17caecd8b2c7d81bb0bbdc682d76487614621561f1085
-SIZE (xpi/firefox-i18n-60.0.2/nn-NO.xpi) = 510621
-SHA256 (xpi/firefox-i18n-60.0.2/oc.xpi) = ec8836cd689ebb864cb994dfaee342dbcf9a5f2423f0f399ffbc1c6a118d2a7d
-SIZE (xpi/firefox-i18n-60.0.2/oc.xpi) = 526207
-SHA256 (xpi/firefox-i18n-60.0.2/or.xpi) = 9da7b23e12d90aeed04e637772a0b8a3f75d7d6dd8d7cfcfc5d60a99f8d2fd19
-SIZE (xpi/firefox-i18n-60.0.2/or.xpi) = 540089
-SHA256 (xpi/firefox-i18n-60.0.2/pa-IN.xpi) = 77432ae4cf8faa53fb3aaa51749547b63205d301cc9b3cbb17cf8837589554da
-SIZE (xpi/firefox-i18n-60.0.2/pa-IN.xpi) = 557086
-SHA256 (xpi/firefox-i18n-60.0.2/pl.xpi) = 6c120bfcc19c4b68b21adffdda876eec2e928509eb0441bc0f6290098e3f333c
-SIZE (xpi/firefox-i18n-60.0.2/pl.xpi) = 418192
-SHA256 (xpi/firefox-i18n-60.0.2/pt-BR.xpi) = aa3613bea650524dbb7f5dd7114759df3581479602a64f57f520e267582d4987
-SIZE (xpi/firefox-i18n-60.0.2/pt-BR.xpi) = 513944
-SHA256 (xpi/firefox-i18n-60.0.2/pt-PT.xpi) = 67f4f4e4b1bf773cbe5712042fe99af140d85da9366126aa39c59798bb1dd0cf
-SIZE (xpi/firefox-i18n-60.0.2/pt-PT.xpi) = 518540
-SHA256 (xpi/firefox-i18n-60.0.2/rm.xpi) = 569994da2a6f808a8d6c533b76487e19088d60085a043afb273c0cdb0f598685
-SIZE (xpi/firefox-i18n-60.0.2/rm.xpi) = 505263
-SHA256 (xpi/firefox-i18n-60.0.2/ro.xpi) = 5a97e49719592a6d5ef0f829947afb54e2e4449a89a354bcb0bced8e6594fde5
-SIZE (xpi/firefox-i18n-60.0.2/ro.xpi) = 513283
-SHA256 (xpi/firefox-i18n-60.0.2/ru.xpi) = 2ea09073bf39fd18f2257176c71044c8fb9eda6c9e7fedab8c23316f5167d9fb
-SIZE (xpi/firefox-i18n-60.0.2/ru.xpi) = 590511
-SHA256 (xpi/firefox-i18n-60.0.2/si.xpi) = 200e788abd768d1ea478a341a2b9ed56b44097b36cde8d9b1818157d30c96cec
-SIZE (xpi/firefox-i18n-60.0.2/si.xpi) = 544795
-SHA256 (xpi/firefox-i18n-60.0.2/sk.xpi) = f396351241475b099f7924ee78bc156be5213323789e88f013608d908b0df8f6
-SIZE (xpi/firefox-i18n-60.0.2/sk.xpi) = 540928
-SHA256 (xpi/firefox-i18n-60.0.2/sl.xpi) = b10e2296960aa0a98aaf6fecfd08ce64e223e8f7aec169b1a94d628b2c8348c1
-SIZE (xpi/firefox-i18n-60.0.2/sl.xpi) = 518573
-SHA256 (xpi/firefox-i18n-60.0.2/son.xpi) = a63256b85d637d60086cfff632957c44c45ba53c843634f252e42601d54e7abd
-SIZE (xpi/firefox-i18n-60.0.2/son.xpi) = 496920
-SHA256 (xpi/firefox-i18n-60.0.2/sq.xpi) = e8b0fe2f702f3c1858adc19521a4a661275df80664303934c79e14839843f067
-SIZE (xpi/firefox-i18n-60.0.2/sq.xpi) = 520487
-SHA256 (xpi/firefox-i18n-60.0.2/sr.xpi) = 6a4e20050e2b4416ebaa35a32fe5e3ed7ac2191bbf0a5cfa7d5e1e046c1c8dfc
-SIZE (xpi/firefox-i18n-60.0.2/sr.xpi) = 547998
-SHA256 (xpi/firefox-i18n-60.0.2/sv-SE.xpi) = 942d86553fe7224497e497464537fecf8de2f5fd9819330821e05b7968a4ebd2
-SIZE (xpi/firefox-i18n-60.0.2/sv-SE.xpi) = 517850
-SHA256 (xpi/firefox-i18n-60.0.2/ta.xpi) = 8c03cea19a64a176f135b6de774740292f93cfdfff262440900b3e8117b789b9
-SIZE (xpi/firefox-i18n-60.0.2/ta.xpi) = 577139
-SHA256 (xpi/firefox-i18n-60.0.2/te.xpi) = ea6dbd7a2f4379f8c980d5bdba84cfd2bcc91b81243e01d2770dd8dc238fca82
-SIZE (xpi/firefox-i18n-60.0.2/te.xpi) = 590179
-SHA256 (xpi/firefox-i18n-60.0.2/th.xpi) = be48a1f68ce337997b6b5cc5f14a44ea53c8a6f9f5fcb9bd4f037e83a5e27f3f
-SIZE (xpi/firefox-i18n-60.0.2/th.xpi) = 562042
-SHA256 (xpi/firefox-i18n-60.0.2/tr.xpi) = 114102a3af7a638d2a988c97c47f95631fe9c795770db1238e8329226e6c5087
-SIZE (xpi/firefox-i18n-60.0.2/tr.xpi) = 525034
-SHA256 (xpi/firefox-i18n-60.0.2/uk.xpi) = c72bd318699dcef64d285a970850f1b2953c263033bec419a89b86d06a000ce0
-SIZE (xpi/firefox-i18n-60.0.2/uk.xpi) = 580148
-SHA256 (xpi/firefox-i18n-60.0.2/ur.xpi) = b336ad7af245f94e221d96648a0eafd186c9b0aafabdca13d9495a5a2f0f7cea
-SIZE (xpi/firefox-i18n-60.0.2/ur.xpi) = 562604
-SHA256 (xpi/firefox-i18n-60.0.2/uz.xpi) = 72c1d09b935e26dd3838c8121527a768cd3518e0010452be062bd7459b84e944
-SIZE (xpi/firefox-i18n-60.0.2/uz.xpi) = 512908
-SHA256 (xpi/firefox-i18n-60.0.2/vi.xpi) = 8598e67bf41d660c443b62b1feccd8fc4904026bd26304278057028028096822
-SIZE (xpi/firefox-i18n-60.0.2/vi.xpi) = 527412
-SHA256 (xpi/firefox-i18n-60.0.2/xh.xpi) = 4fb78a9f7515ab7e3a1d1c7329a53dd91e090312ffbec6c9141454da8e24a000
-SIZE (xpi/firefox-i18n-60.0.2/xh.xpi) = 511086
-SHA256 (xpi/firefox-i18n-60.0.2/zh-CN.xpi) = 8dccc0a7ec90bd42c0beb420d8572fa591afc3deb949fdbb68a610c53949159d
-SIZE (xpi/firefox-i18n-60.0.2/zh-CN.xpi) = 542797
-SHA256 (xpi/firefox-i18n-60.0.2/zh-TW.xpi) = f0d1047fcf359865b99a44f873e210cf5adcde8a9f577cb6e5c517f2bcfa84bb
-SIZE (xpi/firefox-i18n-60.0.2/zh-TW.xpi) = 541123
+TIMESTAMP = 1529611471
+SHA256 (xpi/firefox-i18n-61.0/ach.xpi) = 81376263077a639a0df7dc4f160354043298590782ea7d70c42a789df50f1a32
+SIZE (xpi/firefox-i18n-61.0/ach.xpi) = 468310
+SHA256 (xpi/firefox-i18n-61.0/af.xpi) = 84340ef11e67bae138d932fdcce967affa5966a0c5ab01f2cc03d6f68298f2aa
+SIZE (xpi/firefox-i18n-61.0/af.xpi) = 458272
+SHA256 (xpi/firefox-i18n-61.0/an.xpi) = 7493be648f7def011e18f6c75290c6def9fac3f3ab4950b4b12b588e212f4a77
+SIZE (xpi/firefox-i18n-61.0/an.xpi) = 492775
+SHA256 (xpi/firefox-i18n-61.0/ar.xpi) = ea4596b8811ae7e7f59f501cb3227232812bd53f3def103ad2bf549cb79d2abb
+SIZE (xpi/firefox-i18n-61.0/ar.xpi) = 514910
+SHA256 (xpi/firefox-i18n-61.0/as.xpi) = 4540af01013705c0aea6741a0e213f4874afcb14e34e90a150b19c94e38bfe0a
+SIZE (xpi/firefox-i18n-61.0/as.xpi) = 498320
+SHA256 (xpi/firefox-i18n-61.0/ast.xpi) = 6d18813b2e05fe16f66f9f0c82a8e08a3a6fa2890be393c80c301110dd81d800
+SIZE (xpi/firefox-i18n-61.0/ast.xpi) = 478587
+SHA256 (xpi/firefox-i18n-61.0/az.xpi) = e7c42a5364a722e5f6f2351a038ff8c6d70742da71669019810d5537d36f0e39
+SIZE (xpi/firefox-i18n-61.0/az.xpi) = 494290
+SHA256 (xpi/firefox-i18n-61.0/be.xpi) = 0ebf8acad8a81680c135a3c5e2a323cba2207e13edeff400305e492f2c24fe05
+SIZE (xpi/firefox-i18n-61.0/be.xpi) = 550840
+SHA256 (xpi/firefox-i18n-61.0/bg.xpi) = 4ece264c89c8255c74bf65c6a5d25a44af37609e25cc64217c21179accdeaffc
+SIZE (xpi/firefox-i18n-61.0/bg.xpi) = 541823
+SHA256 (xpi/firefox-i18n-61.0/bn-BD.xpi) = 8357eee0afe8a67521b2273ef931bf216b06aa3b47add5a11534727080b8cbea
+SIZE (xpi/firefox-i18n-61.0/bn-BD.xpi) = 556536
+SHA256 (xpi/firefox-i18n-61.0/bn-IN.xpi) = dce2996cd26162637f4f9a7a8bca61e8d4b8499175231da3580a482c66b91b4c
+SIZE (xpi/firefox-i18n-61.0/bn-IN.xpi) = 535412
+SHA256 (xpi/firefox-i18n-61.0/br.xpi) = 338862ca53012668fd5da30e81ae15f4f9255731110ef3c844154b71e3e8931b
+SIZE (xpi/firefox-i18n-61.0/br.xpi) = 486576
+SHA256 (xpi/firefox-i18n-61.0/bs.xpi) = da9600f62ef968b429a5d437e48f84308ced217516a3b80949e396b09bd155d5
+SIZE (xpi/firefox-i18n-61.0/bs.xpi) = 489134
+SHA256 (xpi/firefox-i18n-61.0/ca.xpi) = 2afdf45e104400f8c154aeaef8b6099f06fa1ee00cd77353422b8782c80493d5
+SIZE (xpi/firefox-i18n-61.0/ca.xpi) = 497520
+SHA256 (xpi/firefox-i18n-61.0/cak.xpi) = 2dae7c9fbff7b95e02246020518f044c97efdb25264523041fc305bc515dd787
+SIZE (xpi/firefox-i18n-61.0/cak.xpi) = 509328
+SHA256 (xpi/firefox-i18n-61.0/cs.xpi) = 859aeb9a8927fb6dbc5a29a91492989bc5a60204fbc3f8f01ad2009f89d636f9
+SIZE (xpi/firefox-i18n-61.0/cs.xpi) = 502598
+SHA256 (xpi/firefox-i18n-61.0/cy.xpi) = 6769521271903468ecd9065b418646c32cb36b617b4f628bcbd6d6e72081b879
+SIZE (xpi/firefox-i18n-61.0/cy.xpi) = 490416
+SHA256 (xpi/firefox-i18n-61.0/da.xpi) = da9c71cc15f0fbbb272500aba824ac485fcde321e969b50e533dd71b2c5f89d6
+SIZE (xpi/firefox-i18n-61.0/da.xpi) = 483618
+SHA256 (xpi/firefox-i18n-61.0/de.xpi) = da95616a965a18506033d090ea51cd5875114523ba66587ea8d9e4ca06182e1a
+SIZE (xpi/firefox-i18n-61.0/de.xpi) = 502283
+SHA256 (xpi/firefox-i18n-61.0/dsb.xpi) = 4522ccd3e85a2a6c8d823ff598c4d2cf1161ad3e51d15fd93b0a5d114eec5b45
+SIZE (xpi/firefox-i18n-61.0/dsb.xpi) = 512451
+SHA256 (xpi/firefox-i18n-61.0/el.xpi) = b87c388daaac4a811a82ff1e1318f4655e9ba80798ba82c00bc5eb813ace1556
+SIZE (xpi/firefox-i18n-61.0/el.xpi) = 559691
+SHA256 (xpi/firefox-i18n-61.0/en-GB.xpi) = c4dde8f507afcbd75466d1d16049227b5b8889e5713607c728f1ba914b0a808e
+SIZE (xpi/firefox-i18n-61.0/en-GB.xpi) = 464875
+SHA256 (xpi/firefox-i18n-61.0/en-US.xpi) = ca833b1e4bf09a9876394daa81a49f3b314accd9a0491266beefed7c61479be7
+SIZE (xpi/firefox-i18n-61.0/en-US.xpi) = 456419
+SHA256 (xpi/firefox-i18n-61.0/en-ZA.xpi) = f703ceee50033cbabaad718fbb0740e569e73f61ddc1df6394a458e084864fb2
+SIZE (xpi/firefox-i18n-61.0/en-ZA.xpi) = 446640
+SHA256 (xpi/firefox-i18n-61.0/eo.xpi) = df73ab6175e45dc0b17b735ce299bcb6702b1b61aa3fdf5f37b59394ef171447
+SIZE (xpi/firefox-i18n-61.0/eo.xpi) = 484754
+SHA256 (xpi/firefox-i18n-61.0/es-AR.xpi) = d1724db8da185cad11a8809f3ef77876818eef8ad3231e84018461ef1b874134
+SIZE (xpi/firefox-i18n-61.0/es-AR.xpi) = 498191
+SHA256 (xpi/firefox-i18n-61.0/es-CL.xpi) = d1cf80c4cf7a1acd1f5cdac6ebb9510e23653370bea12e1db6e5c5e60bb41605
+SIZE (xpi/firefox-i18n-61.0/es-CL.xpi) = 500855
+SHA256 (xpi/firefox-i18n-61.0/es-ES.xpi) = a0ab6bc595321debd89c552873d02ffbe52da1e2e23fb0bf9e7ed6c78bf03054
+SIZE (xpi/firefox-i18n-61.0/es-ES.xpi) = 435902
+SHA256 (xpi/firefox-i18n-61.0/es-MX.xpi) = 22b801bc0b8a9df2da8db24a631927f1a7811c39fa20d2f8411312c3e302e566
+SIZE (xpi/firefox-i18n-61.0/es-MX.xpi) = 500950
+SHA256 (xpi/firefox-i18n-61.0/et.xpi) = e4475907568d860b7a22c9e5bac2cb0b8eccb554969dc0302999b2bd3ccc51ea
+SIZE (xpi/firefox-i18n-61.0/et.xpi) = 477548
+SHA256 (xpi/firefox-i18n-61.0/eu.xpi) = 0c4571b60b88b12f61fdc05f14b6f1b8f45b52287cb9eac8ab963562a7d958ef
+SIZE (xpi/firefox-i18n-61.0/eu.xpi) = 488816
+SHA256 (xpi/firefox-i18n-61.0/fa.xpi) = 01facb4effc8c42f898f0e1f76c2ca73e04b4ec506f6837a4572df0195de54fc
+SIZE (xpi/firefox-i18n-61.0/fa.xpi) = 537569
+SHA256 (xpi/firefox-i18n-61.0/ff.xpi) = cbb3fbd66dd978a48e206b8c346b04ad444f67afb596846295057d21e36282cd
+SIZE (xpi/firefox-i18n-61.0/ff.xpi) = 483849
+SHA256 (xpi/firefox-i18n-61.0/fi.xpi) = 1276c23a9a6f10b7c4aac59c9e491970e195df109a5de36ebc60cf94915e2780
+SIZE (xpi/firefox-i18n-61.0/fi.xpi) = 479928
+SHA256 (xpi/firefox-i18n-61.0/fr.xpi) = db066b4e73c962aaeb3c8756d30e929d333b1aa67c313c9851e09b841895835e
+SIZE (xpi/firefox-i18n-61.0/fr.xpi) = 507141
+SHA256 (xpi/firefox-i18n-61.0/fy-NL.xpi) = 05cd67ee6422fe7ed089541d90f73a3baf88fa8e9653bf2eb1de4f60d3442112
+SIZE (xpi/firefox-i18n-61.0/fy-NL.xpi) = 497986
+SHA256 (xpi/firefox-i18n-61.0/ga-IE.xpi) = 54438b167939fcf94622f98190d13c8a3fd77aec22cbf087223b434452315e7f
+SIZE (xpi/firefox-i18n-61.0/ga-IE.xpi) = 495804
+SHA256 (xpi/firefox-i18n-61.0/gd.xpi) = 392b336d0494d5e364c31e12042eda32627ef40b77930602de4c1d306a1aa0d3
+SIZE (xpi/firefox-i18n-61.0/gd.xpi) = 497600
+SHA256 (xpi/firefox-i18n-61.0/gl.xpi) = ce90b2726134c1f4de19e0238dc23b110ad20065f216a33498f282c94657ec12
+SIZE (xpi/firefox-i18n-61.0/gl.xpi) = 471910
+SHA256 (xpi/firefox-i18n-61.0/gn.xpi) = c21270be60c8300c5975bea228d5941504cc8d81757b5392d11b90c0ca353750
+SIZE (xpi/firefox-i18n-61.0/gn.xpi) = 506405
+SHA256 (xpi/firefox-i18n-61.0/gu-IN.xpi) = ef4d075fc8b462b1fd7a0aee53432614e521421f52cd0e90cbbe88ea8e39421b
+SIZE (xpi/firefox-i18n-61.0/gu-IN.xpi) = 557292
+SHA256 (xpi/firefox-i18n-61.0/he.xpi) = dce20732f2e5dfba243a9bf96c1956c3a0449fd81f4cacc43c350db32fabc96f
+SIZE (xpi/firefox-i18n-61.0/he.xpi) = 505560
+SHA256 (xpi/firefox-i18n-61.0/hi-IN.xpi) = 1b8d7033480b6c2bffec3ce76c073a85142eca8ee6f9ede547207ca33d8f55a9
+SIZE (xpi/firefox-i18n-61.0/hi-IN.xpi) = 559344
+SHA256 (xpi/firefox-i18n-61.0/hr.xpi) = a8a99bd1415e01764e4f317701f4e09377276da6db93e10e6e0ed9fb4885a7b1
+SIZE (xpi/firefox-i18n-61.0/hr.xpi) = 486049
+SHA256 (xpi/firefox-i18n-61.0/hsb.xpi) = ed9b9e3792757ef4ff7422e946bc78e84c9a0f1f8e69db03bb242c8c970de163
+SIZE (xpi/firefox-i18n-61.0/hsb.xpi) = 510213
+SHA256 (xpi/firefox-i18n-61.0/hu.xpi) = fd4018acb9730d98d1f3023539b6d00bde237eb9ea303cb311e88775821c8068
+SIZE (xpi/firefox-i18n-61.0/hu.xpi) = 511142
+SHA256 (xpi/firefox-i18n-61.0/hy-AM.xpi) = 4b4f55569b4f0b521365ed18edff1aa6ca06470c4abe5ef93b33956d1d9748de
+SIZE (xpi/firefox-i18n-61.0/hy-AM.xpi) = 537817
+SHA256 (xpi/firefox-i18n-61.0/ia.xpi) = 16bae2d1c4cba9467a7d1845617f085ab5954db4ac813d18eb480ddcf8305074
+SIZE (xpi/firefox-i18n-61.0/ia.xpi) = 483841
+SHA256 (xpi/firefox-i18n-61.0/id.xpi) = 8cd75a88cb666e0fa816211dfb943b1c3d0bd71f1fae997b6b8e4021f9ebd43b
+SIZE (xpi/firefox-i18n-61.0/id.xpi) = 476114
+SHA256 (xpi/firefox-i18n-61.0/is.xpi) = f2592d68efd9f0ed4b030b326233d777016916be9b9f61f7feaf47f29e58c427
+SIZE (xpi/firefox-i18n-61.0/is.xpi) = 482660
+SHA256 (xpi/firefox-i18n-61.0/it.xpi) = 2439855ef019a354d3dd2506a4b26603b622bc35d4fae982906285f4227cd9b2
+SIZE (xpi/firefox-i18n-61.0/it.xpi) = 372491
+SHA256 (xpi/firefox-i18n-61.0/ja.xpi) = c62496c7da43cfd521cba7a243baba3b8d8e45515cf1729a8c757168ab37ee26
+SIZE (xpi/firefox-i18n-61.0/ja.xpi) = 538255
+SHA256 (xpi/firefox-i18n-61.0/ka.xpi) = 6beeb507141d9d39a947044dcd7d0ee3e7adb9e1d4a556b0477a16bfa8863d54
+SIZE (xpi/firefox-i18n-61.0/ka.xpi) = 525917
+SHA256 (xpi/firefox-i18n-61.0/kab.xpi) = c588f1f693a12e51f47ede13dcdb392d1fa8f64f0644848f06b1fd7c6859b1bd
+SIZE (xpi/firefox-i18n-61.0/kab.xpi) = 495572
+SHA256 (xpi/firefox-i18n-61.0/kk.xpi) = b2baab1a55bc5b3340ae6155deed01448aae08136427fdf210356f27dc42cc97
+SIZE (xpi/firefox-i18n-61.0/kk.xpi) = 553678
+SHA256 (xpi/firefox-i18n-61.0/km.xpi) = fd1a3292d73db55c3f8021188c687a6f0a90fef05305f5ad917b55ff0c189be1
+SIZE (xpi/firefox-i18n-61.0/km.xpi) = 547196
+SHA256 (xpi/firefox-i18n-61.0/kn.xpi) = d8c0e96648022e617dd8cd21a053bfa45c56ec23cc7ab6fbfdbbfb80a5f1dce0
+SIZE (xpi/firefox-i18n-61.0/kn.xpi) = 552584
+SHA256 (xpi/firefox-i18n-61.0/ko.xpi) = cc0b42757564e1b80aa46c296d9ad55aac50a730ec66a76c2b9ca7be9e77b3cf
+SIZE (xpi/firefox-i18n-61.0/ko.xpi) = 519815
+SHA256 (xpi/firefox-i18n-61.0/lij.xpi) = d5b731cf3a145b590d16af59ea08bcc27438adda449df0cf1ac468ea55e1fee3
+SIZE (xpi/firefox-i18n-61.0/lij.xpi) = 486946
+SHA256 (xpi/firefox-i18n-61.0/lt.xpi) = c823dfbed5d34e1e296b698e66843be873f292db54e8748ce28e36d54bceed49
+SIZE (xpi/firefox-i18n-61.0/lt.xpi) = 509389
+SHA256 (xpi/firefox-i18n-61.0/lv.xpi) = e01c5cc2770dfbe0b4b0d35dc8ee2062907a0597a94555a7b93e9164f57b9ed7
+SIZE (xpi/firefox-i18n-61.0/lv.xpi) = 497550
+SHA256 (xpi/firefox-i18n-61.0/mai.xpi) = 74bea0ab796797620a6e121513dc2f32114dd23969d57cf3298f10a3f471a0fa
+SIZE (xpi/firefox-i18n-61.0/mai.xpi) = 518902
+SHA256 (xpi/firefox-i18n-61.0/mk.xpi) = 5b1e3a476a683378e6d1af350761435219398c6c9dc7f0bfc52efb6836e6996d
+SIZE (xpi/firefox-i18n-61.0/mk.xpi) = 480671
+SHA256 (xpi/firefox-i18n-61.0/ml.xpi) = e691c980d0bf89a99e445d7f726e4d5d1242aae16f940405331f8d8d48de42bc
+SIZE (xpi/firefox-i18n-61.0/ml.xpi) = 562458
+SHA256 (xpi/firefox-i18n-61.0/mr.xpi) = 70c37eeddb05e6503fe381118bfb488a1368e18240125e2b947617c8a9d4c108
+SIZE (xpi/firefox-i18n-61.0/mr.xpi) = 547455
+SHA256 (xpi/firefox-i18n-61.0/ms.xpi) = f18d1a9224486c1952119f882460fbf6d32606c69afcac862c9069a4f9fdfc38
+SIZE (xpi/firefox-i18n-61.0/ms.xpi) = 483502
+SHA256 (xpi/firefox-i18n-61.0/my.xpi) = 725958f542984c594e783fd151306e8340fbacfd05a7795ae8ce346704a89829
+SIZE (xpi/firefox-i18n-61.0/my.xpi) = 536699
+SHA256 (xpi/firefox-i18n-61.0/nb-NO.xpi) = 144367fb12f0b92d46854c8b8add994be91069df2f8e05ee1287c1c57f9315be
+SIZE (xpi/firefox-i18n-61.0/nb-NO.xpi) = 483523
+SHA256 (xpi/firefox-i18n-61.0/ne-NP.xpi) = 3fa7706969e2a0ee3a3c6531714a3c085157ca0f1c19964519de4c974add261c
+SIZE (xpi/firefox-i18n-61.0/ne-NP.xpi) = 523520
+SHA256 (xpi/firefox-i18n-61.0/nl.xpi) = f313dd641aab012f93f06278f8da94a70cf42b84e8d2a4ba827d663a960f4126
+SIZE (xpi/firefox-i18n-61.0/nl.xpi) = 489004
+SHA256 (xpi/firefox-i18n-61.0/nn-NO.xpi) = ec35e052f38863addfdca5a4b5a4b25f78f6ac59e9655b03f53b9b9741778a27
+SIZE (xpi/firefox-i18n-61.0/nn-NO.xpi) = 483561
+SHA256 (xpi/firefox-i18n-61.0/oc.xpi) = 659e90d2d1b02a91dab2fd33e531ca35a8ae0d3d37f1e6c53fe7e109f85571a5
+SIZE (xpi/firefox-i18n-61.0/oc.xpi) = 499691
+SHA256 (xpi/firefox-i18n-61.0/or.xpi) = e3c0ce3575adcb20ef60d44abb4051e23d560f2994b0a337a9bec0dbb50b9b45
+SIZE (xpi/firefox-i18n-61.0/or.xpi) = 508181
+SHA256 (xpi/firefox-i18n-61.0/pa-IN.xpi) = 534701f536ce6d665a38152cb9e0209e67383e1cedc71e28e953aa878325b96c
+SIZE (xpi/firefox-i18n-61.0/pa-IN.xpi) = 524500
+SHA256 (xpi/firefox-i18n-61.0/pl.xpi) = e97e4800c799baf4f176807e2892995c7c684672e660c5277158b1467589a9d6
+SIZE (xpi/firefox-i18n-61.0/pl.xpi) = 390903
+SHA256 (xpi/firefox-i18n-61.0/pt-BR.xpi) = 76afbe14524ca84c6af851fe1567434237cde207f4f3ab138e8078677f00ce9c
+SIZE (xpi/firefox-i18n-61.0/pt-BR.xpi) = 485997
+SHA256 (xpi/firefox-i18n-61.0/pt-PT.xpi) = 7402fa24d7cd719e917e5ff07d88ab955c65960e085440b553c45aa178821e86
+SIZE (xpi/firefox-i18n-61.0/pt-PT.xpi) = 492101
+SHA256 (xpi/firefox-i18n-61.0/rm.xpi) = 3fb1389619e3e0efd2882507434c5683f04abd3aaa54d5f8113240aed3de86bf
+SIZE (xpi/firefox-i18n-61.0/rm.xpi) = 483856
+SHA256 (xpi/firefox-i18n-61.0/ro.xpi) = 365dfa4198bbb355706ab405473a350ec971efaed324049f230cdf631c9c9d39
+SIZE (xpi/firefox-i18n-61.0/ro.xpi) = 486748
+SHA256 (xpi/firefox-i18n-61.0/ru.xpi) = 8c2fbba9144750e55791792c8d17d248ade6a3d6a61c727cfe4f4c69c698102b
+SIZE (xpi/firefox-i18n-61.0/ru.xpi) = 561631
+SHA256 (xpi/firefox-i18n-61.0/si.xpi) = 7ba7ee23ee35aabf8068024f7198522ac8bf3780720d63444a9fc3f4919754b9
+SIZE (xpi/firefox-i18n-61.0/si.xpi) = 511499
+SHA256 (xpi/firefox-i18n-61.0/sk.xpi) = 47f6258d2051edfb85e698169ccb646a009eee52c44c7f11240c7f7e68be0c48
+SIZE (xpi/firefox-i18n-61.0/sk.xpi) = 514226
+SHA256 (xpi/firefox-i18n-61.0/sl.xpi) = 2c1cf7d3dd8c8db029d06ec63d3a2d1c58f4747ae2dcdc55d1d44cf2e5f2ebb9
+SIZE (xpi/firefox-i18n-61.0/sl.xpi) = 490324
+SHA256 (xpi/firefox-i18n-61.0/son.xpi) = c9fa033ea4bcd3aca38807dc4f52cef7820ebc1e918b30d195491889eb6a4e6c
+SIZE (xpi/firefox-i18n-61.0/son.xpi) = 468634
+SHA256 (xpi/firefox-i18n-61.0/sq.xpi) = 4ba0eab56da8a68961dfb8d333dc26f6253d8fa9b5ef773f11396a16ba7cad7a
+SIZE (xpi/firefox-i18n-61.0/sq.xpi) = 496569
+SHA256 (xpi/firefox-i18n-61.0/sr.xpi) = 03b2bf62131a59bf6064a9d2190e7d1c14bac55f92e33e48335913acc6cfcd75
+SIZE (xpi/firefox-i18n-61.0/sr.xpi) = 519559
+SHA256 (xpi/firefox-i18n-61.0/sv-SE.xpi) = 6dc7695eed1cdf0e02064560675a30b6e9cca2caad290f7b46d00f3078a99993
+SIZE (xpi/firefox-i18n-61.0/sv-SE.xpi) = 491596
+SHA256 (xpi/firefox-i18n-61.0/ta.xpi) = 72d64bcbc53d2e437c2872f26659c64a82139a7303504b9bdac3ac01ebde1df7
+SIZE (xpi/firefox-i18n-61.0/ta.xpi) = 541866
+SHA256 (xpi/firefox-i18n-61.0/te.xpi) = d1a2e661a450680e56bc07a6dc9bf9502558a66b6689cd0841b8fc8ad37fe457
+SIZE (xpi/firefox-i18n-61.0/te.xpi) = 558635
+SHA256 (xpi/firefox-i18n-61.0/th.xpi) = d219719dd56d23e702bb4e6fc589b50f5f18734722b857ebbd44f49b14f2f99f
+SIZE (xpi/firefox-i18n-61.0/th.xpi) = 531112
+SHA256 (xpi/firefox-i18n-61.0/tr.xpi) = 07a4d63c033e8234e07e29be35ebf3f9ab8ac8e376e7f8882f8e5fd2eb8c9b9d
+SIZE (xpi/firefox-i18n-61.0/tr.xpi) = 498506
+SHA256 (xpi/firefox-i18n-61.0/uk.xpi) = 4b44592b37c40e12dc636af6422d16327697074fcb74cee3e9bd0f631506a3e5
+SIZE (xpi/firefox-i18n-61.0/uk.xpi) = 553596
+SHA256 (xpi/firefox-i18n-61.0/ur.xpi) = 076380f4698146423286e9f2f742fbbaead2a225651335b0b8bb86c31ef135bc
+SIZE (xpi/firefox-i18n-61.0/ur.xpi) = 531611
+SHA256 (xpi/firefox-i18n-61.0/uz.xpi) = fc8da974458213e019261281def322df32f225f4e3099cad5aff38bdc0e77e27
+SIZE (xpi/firefox-i18n-61.0/uz.xpi) = 482058
+SHA256 (xpi/firefox-i18n-61.0/vi.xpi) = b38ee1b09a1f539f9e5eb73ba2a01f99fb98b8896d70295bd90b442a78d8a546
+SIZE (xpi/firefox-i18n-61.0/vi.xpi) = 500409
+SHA256 (xpi/firefox-i18n-61.0/xh.xpi) = e88fea87214959b23a2cb79f2775bb82c8d5d72dd045298ca66b46a698c06e61
+SIZE (xpi/firefox-i18n-61.0/xh.xpi) = 481792
+SHA256 (xpi/firefox-i18n-61.0/zh-CN.xpi) = 3b39e97e9837005e58584101e8048137f2580bd4bcab4688232d75c2f5d9a992
+SIZE (xpi/firefox-i18n-61.0/zh-CN.xpi) = 514392
+SHA256 (xpi/firefox-i18n-61.0/zh-TW.xpi) = 9e3ec5dff511c992c84b6961f77f65428bbe60e6999c4c85aea778eb815984e5
+SIZE (xpi/firefox-i18n-61.0/zh-TW.xpi) = 513542
diff --git a/www/firefox/Makefile b/www/firefox/Makefile
index 93233bc1acaa..c9671c303eb4 100644
--- a/www/firefox/Makefile
+++ b/www/firefox/Makefile
@@ -2,18 +2,19 @@
# $FreeBSD$
PORTNAME= firefox
-DISTVERSION= 60.0.2
+DISTVERSION= 61.0
+PORTREVISION= 1
PORTEPOCH= 1
CATEGORIES= www ipv6
MASTER_SITES= MOZILLA/${PORTNAME}/releases/${DISTVERSION}/source \
- MOZILLA/${PORTNAME}/candidates/${DISTVERSION}-candidates/build1/source
+ MOZILLA/${PORTNAME}/candidates/${DISTVERSION}-candidates/build3/source
DISTFILES= ${DISTNAME}.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.37.3:security/nss \
icu>=59.1,1:devel/icu \
libevent>=2.1.8:devel/libevent \
harfbuzz>=1.7.6:print/harfbuzz \
@@ -21,7 +22,7 @@ BUILD_DEPENDS= nspr>=4.19:devel/nspr \
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 \
+ sqlite3>=3.23.1:databases/sqlite3 \
${PYTHON_PKGNAMEPREFIX}sqlite3>0:databases/py-sqlite3@${PY_FLAVOR} \
v4l_compat>0:multimedia/v4l_compat \
autoconf-2.13:devel/autoconf213 \
@@ -32,7 +33,7 @@ BUILD_DEPENDS= nspr>=4.19:devel/nspr \
USE_GECKO= gecko
CONFLICTS_INSTALL= firefox-esr
MOZ_PKGCONFIG_FILES= # empty
-USE_MOZILLA= -cairo -soundtouch
+USE_MOZILLA= -cairo -hunspell -soundtouch
USE_GL= gl
USES= tar:xz
@@ -43,7 +44,7 @@ FIREFOX_DESKTOP= ${MOZSRC}/taskcluster/docker/${MOZILLA}-snap/${MOZILLA}.desktop
MOZ_OPTIONS= --enable-application=browser \
--enable-official-branding
-OPTIONS_EXCLUDE= BUNDLED_CAIRO
+OPTIONS_EXCLUDE= BUNDLED_CAIRO DTRACE
.include "${.CURDIR}/../../www/firefox/Makefile.options"
diff --git a/www/firefox/distinfo b/www/firefox/distinfo
index 9c34d3790496..b3f9bde54345 100644
--- a/www/firefox/distinfo
+++ b/www/firefox/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1528228087
-SHA256 (firefox-60.0.2.source.tar.xz) = 764566a06b71164e7fd20b2b0e6b08a71b4ccd4d6fd61867eb08011a551f6725
-SIZE (firefox-60.0.2.source.tar.xz) = 271930220
+TIMESTAMP = 1529611471
+SHA256 (firefox-61.0.source.tar.xz) = 3453e8ac7c602390bda0d34a4a636e0d65fd89d9ae69f7aa1740926715c42268
+SIZE (firefox-61.0.source.tar.xz) = 266932956
diff --git a/www/firefox/files/patch-addon-search b/www/firefox/files/patch-addon-search
index 06e95a2e04ce..1894f1aa9029 100644
--- a/www/firefox/files/patch-addon-search
+++ b/www/firefox/files/patch-addon-search
@@ -40,11 +40,11 @@ index f70fd8d7e3bd8..81e8cd7764fdf 100644
if (file.url) {
addon.sourceURI = NetUtil.newURI(file.url);
}
-diff --git toolkit/mozapps/extensions/internal/XPIProvider.jsm toolkit/mozapps/extensions/internal/XPIProvider.jsm
+diff --git toolkit/mozapps/extensions/internal/XPIDatabase.jsm toolkit/mozapps/extensions/internal/XPIDatabase.jsm
index f70fd8d7e3bd8..81e8cd7764fdf 100644
---- toolkit/mozapps/extensions/internal/XPIProvider.jsm
-+++ toolkit/mozapps/extensions/internal/XPIProvider.jsm
-@@ -4974,7 +4974,7 @@ AddonInternal.prototype = {
+--- toolkit/mozapps/extensions/internal/XPIDatabase.jsm
++++ toolkit/mozapps/extensions/internal/XPIDatabase.jsm
+@@ -355,7 +355,7 @@ class AddonInternal {
// Something is causing errors in here
try {
for (let platform of this.targetPlatforms) {
diff --git a/www/firefox/files/patch-bug1021761 b/www/firefox/files/patch-bug1021761
index 245f4fd8695a..ea33870116e5 100644
--- a/www/firefox/files/patch-bug1021761
+++ b/www/firefox/files/patch-bug1021761
@@ -689,7 +689,7 @@ new file mode 100644
index 000000000000..7d96168b9ea6
--- /dev/null
+++ media/libcubeb/src/cubeb_oss.c
-@@ -0,0 +1,454 @@
+@@ -0,0 +1,453 @@
+/*
+ * Copyright © 2014 Mozilla Foundation
+ *
@@ -1126,7 +1126,6 @@ index 000000000000..7d96168b9ea6
+ .get_max_channel_count = oss_get_max_channel_count,
+ .get_min_latency = oss_get_min_latency,
+ .get_preferred_sample_rate = oss_get_preferred_sample_rate,
-+ .get_preferred_channel_layout = NULL,
+ .enumerate_devices = NULL,
+ .device_collection_destroy = NULL,
+ .destroy = oss_destroy,
@@ -1161,10 +1160,10 @@ index e1fea30ca417..a5b1100f1014 100644
if CONFIG['MOZ_PULSEAUDIO'] or CONFIG['MOZ_JACK']:
SOURCES += [
'cubeb_resampler.cpp',
-@@ -88,6 +94,7 @@ if CONFIG['OS_TARGET'] == 'Android':
- FINAL_LIBRARY = 'gkmedias'
+@@ -89,6 +95,7 @@ FINAL_LIBRARY = 'gkmedias'
CFLAGS += CONFIG['MOZ_ALSA_CFLAGS']
+ CFLAGS += CONFIG['MOZ_JACK_CFLAGS']
+CFLAGS += CONFIG['MOZ_OSS_CFLAGS']
CFLAGS += CONFIG['MOZ_PULSEAUDIO_CFLAGS']
@@ -1250,9 +1249,9 @@ index 28e1a9e48d61..edacedcf6e5d 100644
+AC_SUBST_LIST(MOZ_OSS_CFLAGS)
+AC_SUBST_LIST(MOZ_OSS_LIBS)
+
- dnl ==================================
- dnl = Check alsa availability on Linux
- dnl ==================================
+ dnl ========================================================
+ dnl NegotiateAuth
+ dnl ========================================================
diff --git toolkit/library/moz.build toolkit/library/moz.build
index e06592daa265..ce016b96c2bc 100644
--- toolkit/library/moz.build
diff --git a/www/firefox/files/patch-bug1375074 b/www/firefox/files/patch-bug1375074
deleted file mode 100644
index cede1e474e22..000000000000
--- a/www/firefox/files/patch-bug1375074
+++ /dev/null
@@ -1,82 +0,0 @@
-commit fc25eb4380d0
-Author: Lars T Hansen <lhansen@mozilla.com>
-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)
- #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));
-+
-+ // 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);
-
-+#ifdef JS_CODEGEN_ARM64
-+ // 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);
-+
-+ // 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);
-+#else
- masm.abiret();
-+#endif
-
- masm.bind(&failureStoreOther);
-
diff --git a/www/firefox/files/patch-bug1411481 b/www/firefox/files/patch-bug1411481
deleted file mode 100644
index d8e9992e264b..000000000000
--- a/www/firefox/files/patch-bug1411481
+++ /dev/null
@@ -1,85 +0,0 @@
-commit 57a55d1c2d33
-Author: sotaro <sotaro.ikeda.g@gmail.com>
-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
- // 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();
- }
-
-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.
- // 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));
-
- 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();
-
- 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()
- }
- }
-
-+bool
-+gfxWindowsPlatform::AllowOpenGLCanvas()
-+{
-+ // OpenGL canvas is not supported on windows
-+ return false;
-+}
-+
- mozilla::gfx::BackendType
- gfxWindowsPlatform::GetContentBackendFor(mozilla::layers::LayersBackend aLayers)
- {
-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();
-
-+ bool AllowOpenGLCanvas() override;
-+
- mozilla::gfx::BackendType GetContentBackendFor(mozilla::layers::LayersBackend aLayers) override;
-
- mozilla::gfx::BackendType GetPreferredCanvasBackend() override;
diff --git a/www/firefox/files/patch-bug1438678 b/www/firefox/files/patch-bug1438678
deleted file mode 100644
index 47e8dec9ad5b..000000000000
--- a/www/firefox/files/patch-bug1438678
+++ /dev/null
@@ -1,1000 +0,0 @@
-commit 68124009fc5a
-Author: Nicholas Nethercote <nnethercote@mozilla.com>
-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
- 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.");
--
-- 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();
-- }
-+ // 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<char*>(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<uintptr_t>(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
- }
-
- 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()
- }
- #endif
-
-+#ifdef ANDROID
-+static int gPrefsFd = -1;
-+
-+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 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[])
- #endif
-
- char* schedulerPrefs = nullptr;
-- InfallibleTArray<Pref> 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[])
- }
- isForBrowser = strcmp(aArgv[idx], "-notForBrowser");
- foundIsForBrowser = true;
-- } else if (!strcmp(aArgv[idx], "-intPrefs")) {
-- char* str = aArgv[idx + 1];
-- while (*str) {
-- int32_t index = strtol(str, &str, 10);
-- MOZ_ASSERT(str[0] == ':');
-- str++;
-- MaybePrefValue value(PrefValue(static_cast<int32_t>(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")) {
- 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<HANDLE>(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++;
-- 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;
--
-+ && foundPrefsLen
-+ && foundSchedulerPrefs
-+#ifdef XP_WIN
-+ && foundPrefsHandle
-+#endif
- #if defined(XP_MACOSX) && defined(MOZ_CONTENT_SANDBOX)
-- allFound &= foundProfile;
-+ && foundProfile
- #endif
-+ && 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<char*>(shm.memory()),
-+ prefsLen);
-+
- Scheduler::SetPrefs(schedulerPrefs);
- mContent.Init(IOThreadChild::message_loop(),
- ParentPid(),
-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:
- 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
-
-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,
- LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList = NULL;
- std::vector<HANDLE> handlesToInherit;
- for (HANDLE h : options.handles_to_inherit) {
-+ 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<std::string>& aExt
-
- if (!CrashReporter::IsDummy()) {
- PROsfd h = PR_FileDesc2NativeHandle(crashAnnotationWritePipe);
--# if defined(MOZ_SANDBOX)
-- mSandboxBroker.AddHandleToShare(reinterpret_cast<HANDLE>(h));
--# endif // defined(MOZ_SANDBOX)
- mLaunchOptions->handles_to_inherit.push_back(reinterpret_cast<HANDLE>(h));
- std::string hStr = std::to_string(h);
- cmdLine.AppendLooseValue(UTF8ToWide(hStr));
-@@ -1043,6 +1040,11 @@ GeckoChildProcessHost::PerformAsyncLaunchInternal(std::vector<std::string>& aExt
-
- # 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)
- {
-- 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,
- 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.
-+
-+ // 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, 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:
- }
- #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:
-
- } // 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<dom::Pref>* gEarlyDomPrefs;
-
- /* static */ already_AddRefed<Preferences>
-@@ -3081,11 +3081,130 @@ NS_IMPL_ISUPPORTS(Preferences,
- nsISupportsWeakReference)
-
- /* static */ void
--Preferences::SetEarlyPreferences(const nsTArray<dom::Pref>* aDomPrefs)
-+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)));
-+ break;
-+ case PrefType::Int:
-+ intPrefs.Append(
-+ 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()));
-+ } 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)
- {
- MOZ_ASSERT(!XRE_IsParentProcess());
-
-- gEarlyDomPrefs = new InfallibleTArray<dom::Pref>(mozilla::Move(*aDomPrefs));
-+ MOZ_ASSERT(!gEarlyDomPrefs);
-+ gEarlyDomPrefs = new InfallibleTArray<dom::Pref>();
-+
-+ 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());
-+ 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<int32_t>(strtol(p, &p, 10))));
-+ MOZ_ASSERT(p[0] == '|');
-+ p++;
-+ dom::Pref pref(nsCString(dom::ContentPrefs::GetEarlyPref(index)),
-+ /* 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());
-+ 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();
- }
-
--/* 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)
- {
-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:
- // 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:
-
- // 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<dom::Pref>* aSettings);
-- static void SetEarlyPreferences(const nsTArray<dom::Pref>* aSettings);
- static void SetLatePreferences(const nsTArray<dom::Pref>* 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)
- }
-
- 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)
- {
- 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
- 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_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:
- ::GeckoStart(aEnv, argv, argc, aAppData);
- }
-
-- virtual void XRE_SetAndroidChildFds(JNIEnv* aEnv, 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);
- }
- #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;
-
-- 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;
-
- #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)
- {
- 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<Start_t>::Call(GeckoProcessManager::Context(), nullptr, a0, a1, a2, a3, a4);
-+ return mozilla::jni::Method<Start_t>::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*,
-
- #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,
diff --git a/www/firefox/files/patch-bug1442583 b/www/firefox/files/patch-bug1442583
deleted file mode 100644
index ca2aa7057396..000000000000
--- a/www/firefox/files/patch-bug1442583
+++ /dev/null
@@ -1,39 +0,0 @@
-commit 7371a080accd
-Author: Lars T Hansen <lhansen@mozilla.com>
-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"
-+#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()
- {
-+#ifdef JS_CODEGEN_ARM64
-+ // Initialize instruction cache flushing.
-+ vixl::CPU::SetUp();
-+#endif
- return execMemory.init();
- }
-
diff --git a/www/firefox/files/patch-bug1444798 b/www/firefox/files/patch-bug1444798
deleted file mode 100644
index 2268bc9d4484..000000000000
--- a/www/firefox/files/patch-bug1444798
+++ /dev/null
@@ -1,45 +0,0 @@
-commit 7871e211ec43
-Author: sotaro <sotaro.ikeda.g@gmail.com>
-Date: Fri Mar 16 21:03:59 2018 +0900
-
- Bug 1444798 - Fix ExternalImageCallback func types r=jrmuizel
----
- gfx/webrender_bindings/src/bindings.rs | 11 +++++++----
- 1 file changed, 7 insertions(+), 4 deletions(-)
-
-diff --git gfx/webrender_bindings/src/bindings.rs gfx/webrender_bindings/src/bindings.rs
-index 8517d7dd33e5..cf885ee713f3 100644
---- gfx/webrender_bindings/src/bindings.rs
-+++ gfx/webrender_bindings/src/bindings.rs
-@@ -312,8 +312,8 @@ struct WrExternalImage {
- size: usize,
- }
-
--type LockExternalImageCallback = fn(*mut c_void, WrExternalImageId, u8) -> WrExternalImage;
--type UnlockExternalImageCallback = fn(*mut c_void, WrExternalImageId, u8);
-+type LockExternalImageCallback = unsafe extern "C" fn(*mut c_void, WrExternalImageId, u8) -> WrExternalImage;
-+type UnlockExternalImageCallback = unsafe extern "C" fn(*mut c_void, WrExternalImageId, u8);
-
- #[repr(C)]
- pub struct WrExternalImageHandler {
-@@ -327,7 +327,8 @@ impl ExternalImageHandler for WrExternalImageHandler {
- id: ExternalImageId,
- channel_index: u8)
- -> ExternalImage {
-- let image = (self.lock_func)(self.external_image_obj, id.into(), channel_index);
-+
-+ let image = unsafe { (self.lock_func)(self.external_image_obj, id.into(), channel_index) };
- ExternalImage {
- uv: TexelRect::new(image.u0, image.v0, image.u1, image.v1),
- source: match image.image_type {
-@@ -341,7 +342,9 @@ impl ExternalImageHandler for WrExternalImageHandler {
- fn unlock(&mut self,
- id: ExternalImageId,
- channel_index: u8) {
-- (self.unlock_func)(self.external_image_obj, id.into(), channel_index);
-+ unsafe {
-+ (self.unlock_func)(self.external_image_obj, id.into(), channel_index);
-+ }
- }
- }
-
diff --git a/www/firefox/files/patch-bug1445907 b/www/firefox/files/patch-bug1445907
deleted file mode 100644
index 924ac0aa7cd7..000000000000
--- a/www/firefox/files/patch-bug1445907
+++ /dev/null
@@ -1,75 +0,0 @@
-commit 0c6dd4a750db
-Author: Lars T Hansen <lhansen@mozilla.com>
-Date: Mon Mar 19 09:58:06 2018 +0100
-
- Bug 1445907 - Save x28 before clobbering it in the regex compiler. r=sstangl
----
- js/src/irregexp/NativeRegExpMacroAssembler.cpp | 25 ++++++++++++++++++++++++-
- js/src/jit-test/tests/regexp/bug1445907.js | 15 +++++++++++++++
- 2 files changed, 39 insertions(+), 1 deletion(-)
-
-diff --git js/src/irregexp/NativeRegExpMacroAssembler.cpp js/src/irregexp/NativeRegExpMacroAssembler.cpp
-index 28a4c35e75bfe..c08b005cf856b 100644
---- js/src/irregexp/NativeRegExpMacroAssembler.cpp
-+++ js/src/irregexp/NativeRegExpMacroAssembler.cpp
-@@ -123,7 +123,15 @@ NativeRegExpMacroAssembler::GenerateCode(JSContext* cx, bool match_only)
- masm.bind(&entry_label_);
-
- #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));
-+
-+ // Initialize the PSP from the SP.
- masm.initStackPtr();
- #endif
-
-@@ -421,7 +429,22 @@ NativeRegExpMacroAssembler::GenerateCode(JSContext* cx, bool match_only)
- for (GeneralRegisterBackwardIterator iter(savedNonVolatileRegisters); iter.more(); ++iter)
- masm.Pop(*iter);
-
-+#ifdef JS_CODEGEN_ARM64
-+ // 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);
-+
-+ // 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);
-+#else
- masm.abiret();
-+#endif
-
- // Backtrack code (branch target for conditional backtracks).
- if (backtrack_label_.used()) {
-diff --git js/src/jit-test/tests/regexp/bug1445907.js js/src/jit-test/tests/regexp/bug1445907.js
-new file mode 100644
-index 0000000000000..75b23753eaf93
---- /dev/null
-+++ js/src/jit-test/tests/regexp/bug1445907.js
-@@ -0,0 +1,15 @@
-+// On ARM64, we failed to save x28 properly when generating code for the regexp
-+// matcher.
-+//
-+// There's wasm and Debugger code here because the combination forces the use of
-+// x28 and exposes the bug when running on the simulator.
-+
-+if (!wasmIsSupported())
-+ quit();
-+
-+var g = newGlobal('');
-+var dbg = new Debugger(g);
-+g.eval(`var m = new WebAssembly.Instance(new WebAssembly.Module(wasmTextToBinary('(module (func (export "test")))')))`);
-+var re = /./;
-+dbg.onEnterFrame = function(frame) { re.exec("x") };
-+result = g.eval("m.exports.test()");
diff --git a/www/firefox/files/patch-bug1447359 b/www/firefox/files/patch-bug1447359
deleted file mode 100644
index 8116d9aece4f..000000000000
--- a/www/firefox/files/patch-bug1447359
+++ /dev/null
@@ -1,45 +0,0 @@
-commit fef467b5a93d
-Author: Luke Wagner <luke@mozilla.com>
-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);
-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;
diff --git a/www/firefox/files/patch-bug1451292 b/www/firefox/files/patch-bug1451292
deleted file mode 100644
index b318ab619bb0..000000000000
--- a/www/firefox/files/patch-bug1451292
+++ /dev/null
@@ -1,33 +0,0 @@
-commit b3a02fddbce8
-Author: Lars T Hansen <lhansen@mozilla.com>
-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);
- }
-
- // Either `any` is valid or `sixtyfour` is valid. Return a 32-bit ARMRegister
diff --git a/www/firefox/files/patch-bug1456556 b/www/firefox/files/patch-bug1456556
deleted file mode 100644
index 4b2ccb7e1ffc..000000000000
--- a/www/firefox/files/patch-bug1456556
+++ /dev/null
@@ -1,22 +0,0 @@
-commit f6fc0b418aa3
-Author: Andrea Marchesini <amarchesini@mozilla.com>
-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<Derived>::ContinueConsumeBody(nsresult aStatus,
- RefPtr<Promise> localPromise = mConsumePromise.forget();
-
- RefPtr<FetchBodyConsumer<Derived>> self = this;
-- auto autoReleaseObject = mozilla::MakeScopeExit([&] {
-+ auto autoReleaseObject = mozilla::MakeScopeExit([self] {
- self->ReleaseObject();
- });
-
diff --git a/www/firefox/files/patch-bug702179 b/www/firefox/files/patch-bug702179
deleted file mode 100644
index 0c998526736e..000000000000
--- a/www/firefox/files/patch-bug702179
+++ /dev/null
@@ -1,12 +0,0 @@
-Don't build static JS lib to make sure DTrace probes are picked up.
-
---- js/src/build/moz.build.orig 2017-04-16 18:00:50 UTC
-+++ js/src/build/moz.build
-@@ -71,7 +71,3 @@ if CONFIG['OS_ARCH'] == 'SunOS':
- ]
-
- OS_LIBS += CONFIG['REALTIME_LIBS']
--
--NO_EXPAND_LIBS = True
--
--DIST_INSTALL = True
diff --git a/www/firefox/files/patch-dom_media_flac_FlacDecoder.cpp b/www/firefox/files/patch-dom_media_flac_FlacDecoder.cpp
index 1df3736c2211..d797b41ed389 100644
--- a/www/firefox/files/patch-dom_media_flac_FlacDecoder.cpp
+++ b/www/firefox/files/patch-dom_media_flac_FlacDecoder.cpp
@@ -7,7 +7,7 @@ index 53fc3c9937f7..b23771ab80fa 100644
@@ -7,6 +7,7 @@
#include "FlacDecoder.h"
#include "MediaContainerType.h"
- #include "MediaPrefs.h"
+ #include "mozilla/StaticPrefs.h"
+#include "PDMFactory.h"
namespace mozilla {
@@ -15,10 +15,10 @@ index 53fc3c9937f7..b23771ab80fa 100644
@@ -15,6 +16,10 @@ FlacDecoder::IsEnabled()
{
#ifdef MOZ_FFVPX
- return MediaPrefs::FlacEnabled();
+ return StaticPrefs::MediaFlacEnabled();
+#elif defined(MOZ_FFMPEG)
+ RefPtr<PDMFactory> platform = new PDMFactory();
-+ return MediaPrefs::FlacEnabled() && platform->SupportsMimeType(NS_LITERAL_CSTRING("audio/flac"),
++ return StaticPrefs::MediaFlacEnabled() && platform->SupportsMimeType(NS_LITERAL_CSTRING("audio/flac"),
+ /* DecoderDoctorDiagnostics* */ nullptr);
#else
// Until bug 1295886 is fixed.
diff --git a/www/firefox/files/patch-u2f-hid-rs62 b/www/firefox/files/patch-u2f-hid-rs62
index 6b17b8d6450a..14280f4df6bc 100644
--- a/www/firefox/files/patch-u2f-hid-rs62
+++ b/www/firefox/files/patch-u2f-hid-rs62
@@ -4,7 +4,7 @@ diff --git Cargo.lock Cargo.lock
index 4bfba0eb2f52..cd4d80035d81 100644
--- Cargo.lock
+++ Cargo.lock
-@@ -486,6 +486,15 @@ dependencies = [
+@@ -552,6 +552,15 @@ dependencies = [
"unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -13,14 +13,14 @@ index 4bfba0eb2f52..cd4d80035d81 100644
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
-+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "nom 3.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
[[package]]
- name = "dtoa"
- version = "0.4.2"
-@@ -1170,6 +1179,14 @@ name = "nom"
+ name = "diff"
+ version = "0.1.11"
+@@ -1351,6 +1360,14 @@ name = "nom"
version = "1.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -35,23 +35,23 @@ index 4bfba0eb2f52..cd4d80035d81 100644
[[package]]
name = "nserror"
version = "0.1.0"
-@@ -1863,6 +1880,7 @@ dependencies = [
+@@ -2126,6 +2143,7 @@ dependencies = [
"bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
"boxfnonce 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
"core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "devd-rs 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
"libudev 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
-@@ -2220,6 +2238,7 @@ dependencies = [
+ "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
+@@ -2511,6 +2529,7 @@ dependencies = [
"checksum darling_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "167dd3e235c2f1da16a635c282630452cdf49191eb05711de1bcd1d3d5068c00"
"checksum darling_macro 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c53edaba455f6073a10c27c72440860eb3f60444f8c8660a391032eeae744d82"
"checksum debug_unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9a032eac705ca39214d169f83e3d3da290af06d8d1d344d1baad2fd002dca4b3"
+"checksum devd-rs 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7c9ac481c38baf400d3b732e4a06850dfaa491d1b6379a249d9d40d14c2434c"
+ "checksum diff 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "3c2b69f912779fbb121ceb775d74d51e915af17aaebc38d28a592843a2dd0a3a"
+ "checksum docopt 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d8acd393692c503b168471874953a2531df0e9ab77d0b6bbc582395743300a4a"
"checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab"
- "checksum dtoa-short 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "068d4026697c1a18f0b0bb8cfcad1b0c151b90d8edb9bf4c235ad68128920d1d"
- "checksum dwrote 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a207eb7b40e25d1d28dc679f451d321fb6954b73ceaa47986702575865469461"
-@@ -2279,6 +2298,7 @@ dependencies = [
+@@ -2581,6 +2600,7 @@ dependencies = [
"checksum net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "3a80f842784ef6c9a958b68b7516bc7e35883c614004dd94959a4dca1b716c09"
"checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2"
"checksum nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b8c256fd9471521bcb84c3cdba98921497f1a331cbc15b8030fc63b82050ce"
@@ -73,14 +73,6 @@ index a0ab8ce71067..046de1e46f15 100644
[target.'cfg(target_os = "macos")'.dependencies]
core-foundation-sys = "0.5.1"
-@@ -21,6 +24,6 @@ runloop = "0.1.0"
- bitflags = "1.0"
-
- [dev-dependencies]
--rust-crypto = "^0.2"
-+sha2 = "^0.7"
- base64 = "^0.4"
- env_logger = "0.4.1"
diff --git dom/webauthn/u2f-hid-rs/README.md dom/webauthn/u2f-hid-rs/README.md
index 2edf412211b5..a29905832e5e 100644
--- dom/webauthn/u2f-hid-rs/README.md
@@ -94,61 +86,6 @@ index 2edf412211b5..a29905832e5e 100644
* **Supported HID Transports**: USB.
* **Supported Protocols**: [FIDO U2F over USB](https://fidoalliance.org/specs/fido-u2f-v1.1-id-20160915/fido-u2f-raw-message-formats-v1.1-id-20160915.html).
-diff --git dom/webauthn/u2f-hid-rs/examples/main.rs dom/webauthn/u2f-hid-rs/examples/main.rs
-index d0b02e61a05b..8ecf102f2136 100644
---- dom/webauthn/u2f-hid-rs/examples/main.rs
-+++ dom/webauthn/u2f-hid-rs/examples/main.rs
-@@ -3,10 +3,9 @@
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
- extern crate base64;
--extern crate crypto;
-+extern crate sha2;
- extern crate u2fhid;
--use crypto::digest::Digest;
--use crypto::sha2::Sha256;
-+use sha2::{Digest, Sha256};
- use std::io;
- use std::sync::mpsc::channel;
- use u2fhid::{AuthenticatorTransports, KeyHandle, RegisterFlags, SignFlags, U2FManager};
-@@ -17,10 +16,12 @@ extern crate log;
- macro_rules! try_or {
- ($val:expr, $or:expr) => {
- match $val {
-- Ok(v) => { v }
-- Err(e) => { return $or(e); }
-+ Ok(v) => v,
-+ Err(e) => {
-+ return $or(e);
-+ }
- }
-- }
-+ };
- }
-
- fn u2f_get_key_handle_from_register_response(register_response: &Vec<u8>) -> io::Result<Vec<u8>> {
-@@ -46,15 +47,13 @@ fn main() {
- let challenge_str = format!("{}{}",
- r#"{"challenge": "1vQ9mxionq0ngCnjD-wTsv1zUSrGRtFqG2xP09SbZ70","#,
- r#" "version": "U2F_V2", "appId": "http://demo.yubico.com"}"#);
-- let mut challenge = Sha256::new();
-- challenge.input_str(&challenge_str);
-- let mut chall_bytes: Vec<u8> = vec![0; challenge.output_bytes()];
-- challenge.result(&mut chall_bytes);
-+ let mut challenge = Sha256::default();
-+ challenge.input(challenge_str.as_bytes());
-+ let chall_bytes = Vec::from(challenge.result().as_slice());
-
-- let mut application = Sha256::new();
-- application.input_str("http://demo.yubico.com");
-- let mut app_bytes: Vec<u8> = vec![0; application.output_bytes()];
-- application.result(&mut app_bytes);
-+ let mut application = Sha256::default();
-+ application.input("http://demo.yubico.com".as_bytes());
-+ let app_bytes = Vec::from(application.result().as_slice());
-
- let manager = U2FManager::new().unwrap();
- let flags = RegisterFlags::empty();
diff --git dom/webauthn/u2f-hid-rs/src/freebsd/device.rs dom/webauthn/u2f-hid-rs/src/freebsd/device.rs
new file mode 100644
index 000000000000..5b9e7f2a912e
@@ -756,42 +693,6 @@ index 1307497e91ac..e0cdc5080924 100644
#[path = "stub/mod.rs"]
pub mod platform;
-@@ -39,8 +51,8 @@ extern crate bitflags;
-
- mod consts;
- mod statemachine;
--mod u2ftypes;
- mod u2fprotocol;
-+mod u2ftypes;
-
- mod manager;
- pub use manager::U2FManager;
-@@ -88,9 +100,9 @@ pub enum Error {
- NotAllowed = 5,
- }
-
-+#[cfg(fuzzing)]
-+pub use consts::*;
- #[cfg(fuzzing)]
- pub use u2fprotocol::*;
- #[cfg(fuzzing)]
- pub use u2ftypes::*;
--#[cfg(fuzzing)]
--pub use consts::*;
-diff --git dom/webauthn/u2f-hid-rs/src/linux/device.rs dom/webauthn/u2f-hid-rs/src/linux/device.rs
-index 6ed57106920f..35569f88a190 100644
---- dom/webauthn/u2f-hid-rs/src/linux/device.rs
-+++ dom/webauthn/u2f-hid-rs/src/linux/device.rs
-@@ -11,8 +11,8 @@ use std::os::unix::prelude::*;
-
- use consts::CID_BROADCAST;
- use platform::hidraw;
--use util::from_unix_result;
- use u2ftypes::U2FDevice;
-+use util::from_unix_result;
-
- #[derive(Debug)]
- pub struct Device {
diff --git dom/webauthn/u2f-hid-rs/src/linux/hidraw.rs dom/webauthn/u2f-hid-rs/src/linux/hidraw.rs
index 0ce5d379c3f7..182fe0ec5f2e 100644
--- dom/webauthn/u2f-hid-rs/src/linux/hidraw.rs
@@ -821,7 +722,7 @@ index 0ce5d379c3f7..182fe0ec5f2e 100644
const NRBITS: u32 = 8;
const TYPEBITS: u32 = 8;
-@@ -35,28 +29,15 @@ const TYPESHIFT: u32 = NRSHIFT + NRBITS as u32;
+@@ -35,17 +29,6 @@ const TYPESHIFT: u32 = NRSHIFT + NRBITS as u32;
const SIZESHIFT: u32 = TYPESHIFT + TYPEBITS as u32;
const DIRSHIFT: u32 = SIZESHIFT + SIZEBITS as u32;
@@ -839,27 +740,7 @@ index 0ce5d379c3f7..182fe0ec5f2e 100644
// https://github.com/torvalds/linux/blob/master/include/uapi/linux/hid.h
const HID_MAX_DESCRIPTOR_SIZE: usize = 4096;
- macro_rules! ioctl {
-- ($dir:expr, $name:ident, $ioty:expr, $nr:expr; $ty:ty) => (
-+ ($dir:expr, $name:ident, $ioty:expr, $nr:expr; $ty:ty) => {
- pub unsafe fn $name(fd: libc::c_int, val: *mut $ty) -> io::Result<libc::c_int> {
- let size = mem::size_of::<$ty>();
-- let ioc = (($dir as u32) << DIRSHIFT) |
-- (($ioty as u32) << TYPESHIFT) |
-- (($nr as u32) << NRSHIFT) |
-- ((size as u32) << SIZESHIFT);
-+ let ioc = (($dir as u32) << DIRSHIFT) | (($ioty as u32) << TYPESHIFT)
-+ | (($nr as u32) << NRSHIFT) | ((size as u32) << SIZESHIFT);
-
- #[cfg(not(target_env = "musl"))]
- type IocType = libc::c_ulong;
-@@ -65,120 +46,12 @@ macro_rules! ioctl {
-
- from_unix_result(libc::ioctl(fd, ioc as IocType, val))
- }
-- );
-+ };
- }
+@@ -68,115 +51,7 @@ macro_rules! ioctl {
// https://github.com/torvalds/linux/blob/master/include/uapi/linux/hidraw.h
ioctl!(READ, hidiocgrdescsize, b'H', 0x01; ::libc::c_int);
@@ -1013,126 +894,10 @@ index 0ce5d379c3f7..182fe0ec5f2e 100644
+ value.truncate(desc.size as usize);
+ Ok(ReportDescriptor { value })
}
-diff --git dom/webauthn/u2f-hid-rs/src/linux/monitor.rs dom/webauthn/u2f-hid-rs/src/linux/monitor.rs
-index 47c376ba9176..408ea4b7b9ad 100644
---- dom/webauthn/u2f-hid-rs/src/linux/monitor.rs
-+++ dom/webauthn/u2f-hid-rs/src/linux/monitor.rs
-@@ -65,13 +65,11 @@ where
-
- // Start listening for new devices.
- let mut socket = monitor.listen()?;
-- let mut fds = vec![
-- ::libc::pollfd {
-- fd: socket.as_raw_fd(),
-- events: POLLIN,
-- revents: 0,
-- },
-- ];
-+ let mut fds = vec![::libc::pollfd {
-+ fd: socket.as_raw_fd(),
-+ events: POLLIN,
-+ revents: 0,
-+ }];
-
- while alive() {
- // Wait for new events, break on failure.
-diff --git dom/webauthn/u2f-hid-rs/src/macos/iokit.rs dom/webauthn/u2f-hid-rs/src/macos/iokit.rs
-index 7e550af2a445..79e53599004e 100644
---- dom/webauthn/u2f-hid-rs/src/macos/iokit.rs
-+++ dom/webauthn/u2f-hid-rs/src/macos/iokit.rs
-@@ -282,13 +282,13 @@ extern "C" {
-
- #[cfg(test)]
- mod tests {
-+ use super::*;
- use core_foundation_sys::base::*;
- use core_foundation_sys::runloop::*;
- use libc::c_void;
- use std::ptr;
- use std::sync::mpsc::{channel, Sender};
- use std::thread;
-- use super::*;
-
- extern "C" fn observe(_: CFRunLoopObserverRef, _: CFRunLoopActivity, context: *mut c_void) {
- let tx: &Sender<SendableRunLoop> = unsafe { &*(context as *mut _) };
-diff --git dom/webauthn/u2f-hid-rs/src/macos/monitor.rs dom/webauthn/u2f-hid-rs/src/macos/monitor.rs
-index c346fe5eff57..b971ed885d18 100644
---- dom/webauthn/u2f-hid-rs/src/macos/monitor.rs
-+++ dom/webauthn/u2f-hid-rs/src/macos/monitor.rs
-@@ -10,9 +10,9 @@ use core_foundation_sys::runloop::*;
- use libc::c_void;
- use platform::iokit::*;
- use runloop::RunLoop;
--use std::{io, slice};
- use std::collections::HashMap;
- use std::sync::mpsc::{channel, Receiver, Sender};
-+use std::{io, slice};
- use util::io_err;
-
- struct DeviceData {
-diff --git dom/webauthn/u2f-hid-rs/src/manager.rs dom/webauthn/u2f-hid-rs/src/manager.rs
-index c9f92bdbfad5..ca8b80a9584a 100644
---- dom/webauthn/u2f-hid-rs/src/manager.rs
-+++ dom/webauthn/u2f-hid-rs/src/manager.rs
-@@ -7,8 +7,8 @@ use std::sync::mpsc::{channel, RecvTimeoutError, Sender};
- use std::time::Duration;
-
- use consts::PARAMETER_SIZE;
--use statemachine::StateMachine;
- use runloop::RunLoop;
-+use statemachine::StateMachine;
- use util::OnceCallback;
-
- enum QueueAction {
-diff --git dom/webauthn/u2f-hid-rs/src/statemachine.rs dom/webauthn/u2f-hid-rs/src/statemachine.rs
-index 8e4abaa7cf02..55e7d36155a3 100644
---- dom/webauthn/u2f-hid-rs/src/statemachine.rs
-+++ dom/webauthn/u2f-hid-rs/src/statemachine.rs
-@@ -7,8 +7,8 @@ use platform::device::Device;
- use platform::transaction::Transaction;
- use std::thread;
- use std::time::Duration;
--use util::OnceCallback;
- use u2fprotocol::{u2f_init_device, u2f_is_keyhandle_valid, u2f_register, u2f_sign};
-+use util::OnceCallback;
-
- fn is_valid_transport(transports: ::AuthenticatorTransports) -> bool {
- transports.is_empty() || transports.contains(::AuthenticatorTransports::USB)
-diff --git dom/webauthn/u2f-hid-rs/src/u2fprotocol.rs dom/webauthn/u2f-hid-rs/src/u2fprotocol.rs
-index 4d6737b1289e..0b984407d873 100644
---- dom/webauthn/u2f-hid-rs/src/u2fprotocol.rs
-+++ dom/webauthn/u2f-hid-rs/src/u2fprotocol.rs
-@@ -5,9 +5,9 @@
- extern crate std;
-
- use rand::{thread_rng, Rng};
-+use std::ffi::CString;
- use std::io;
- use std::io::{Read, Write};
--use std::ffi::CString;
-
- use consts::*;
- use u2ftypes::*;
diff --git dom/webauthn/u2f-hid-rs/src/util.rs dom/webauthn/u2f-hid-rs/src/util.rs
index 27db864e2fcd..770e166d57d2 100644
--- dom/webauthn/u2f-hid-rs/src/util.rs
+++ dom/webauthn/u2f-hid-rs/src/util.rs
-@@ -12,10 +12,12 @@ use boxfnonce::SendBoxFnOnce;
- macro_rules! try_or {
- ($val:expr, $or:expr) => {
- match $val {
-- Ok(v) => { v }
-- Err(e) => { return $or(e); }
-+ Ok(v) => v,
-+ Err(e) => {
-+ return $or(e);
-+ }
- }
-- }
-+ };
- }
-
- pub trait Signed {
@@ -44,6 +46,16 @@ pub fn from_unix_result<T: Signed>(rv: T) -> io::Result<T> {
}
}
@@ -1150,33 +915,6 @@ index 27db864e2fcd..770e166d57d2 100644
pub fn io_err(msg: &str) -> io::Error {
io::Error::new(io::ErrorKind::Other, msg)
}
-diff --git dom/webauthn/u2f-hid-rs/src/windows/device.rs dom/webauthn/u2f-hid-rs/src/windows/device.rs
-index cbbe2811d672..5579cc052a6f 100644
---- dom/webauthn/u2f-hid-rs/src/windows/device.rs
-+++ dom/webauthn/u2f-hid-rs/src/windows/device.rs
-@@ -7,8 +7,8 @@ use std::io;
- use std::io::{Read, Write};
- use std::os::windows::io::AsRawHandle;
-
--use consts::{FIDO_USAGE_U2FHID, CID_BROADCAST, FIDO_USAGE_PAGE, HID_RPT_SIZE};
- use super::winapi::DeviceCapabilities;
-+use consts::{FIDO_USAGE_U2FHID, CID_BROADCAST, FIDO_USAGE_PAGE, HID_RPT_SIZE};
-
- use u2ftypes::U2FDevice;
-
-diff --git dom/webauthn/u2f-hid-rs/src/windows/winapi.rs dom/webauthn/u2f-hid-rs/src/windows/winapi.rs
-index 18c6898e86ee..bd8a7e58d06a 100644
---- dom/webauthn/u2f-hid-rs/src/windows/winapi.rs
-+++ dom/webauthn/u2f-hid-rs/src/windows/winapi.rs
-@@ -60,7 +60,7 @@ extern "stdcall" {
- macro_rules! offset_of {
- ($ty:ty, $field:ident) => {
- unsafe { &(*(0 as *const $ty)).$field as *const _ as usize }
-- }
-+ };
- }
-
- fn from_wide_ptr(ptr: *const u16, len: usize) -> String {
diff --git third_party/rust/devd-rs/.cargo-checksum.json third_party/rust/devd-rs/.cargo-checksum.json
new file mode 100644
index 000000000000..7f8c6af3141e
diff --git a/www/firefox/files/patch-z-bug1436911 b/www/firefox/files/patch-z-bug1436911
deleted file mode 100644
index 9b338d644358..000000000000
--- a/www/firefox/files/patch-z-bug1436911
+++ /dev/null
@@ -1,1162 +0,0 @@
-commit 6b81d0b99f20
-Author: Nicholas Nethercote <nnethercote@mozilla.com>
-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)
- {
-- 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
-
- // 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)
-
- XPCOMInitData xpcomInit;
-
-- Preferences::GetPreferences(&xpcomInit.prefs());
- nsCOMPtr<nsIIOService> io(do_GetIOService());
- MOZ_ASSERT(io, "No IO service?");
- DebugOnly<nsresult> 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,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",
--#if defined(NIGHTLY_BUILD) || defined(DEBUG)
-- "browser.startup.record",
--#endif
--#if defined(ANDROID)
-- "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",
--#ifdef FUZZING
-- "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",
--#ifdef MOZ_STYLO
-- "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.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"
--};
--
--const char** mozilla::dom::ContentPrefs::GetEarlyPrefs(size_t* aCount)
--{
-- *aCount = ArrayLength(ContentPrefs::gEarlyPrefs);
-- return gEarlyPrefs;
--}
--
--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:
-- static const char** GetEarlyPrefs(size_t* aCount);
-- static const char* GetEarlyPref(size_t aIndex);
--
--private:
-- static const char* gEarlyPrefs[];
--};
--
--}
--}
--
--#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[])
- NS_ERROR("failed to map shared memory in the child");
- return false;
- }
-- Preferences::DeserializeEarlyPreferences(static_cast<char*>(shm.memory()),
-- prefsLen);
-+ Preferences::DeserializePreferences(static_cast<char*>(shm.memory()),
-+ prefsLen);
-
- Scheduler::SetPrefs(schedulerPrefs);
- mContent.Init(IOThreadChild::message_loop(),
-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:
- // 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
- 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)
-+{
-+ aStr.AppendInt(uint32_t(strlen(aChars)));
-+ aStr.Append('/');
-+ aStr.Append(aChars);
-+}
-+
-+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 '/'
-+ aStr.Assign(p, length);
-+ 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 {
- MOZ_CRASH();
- }
- }
-+
-+ 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)
-+ {
-+ 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:
- 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.
-+ //
-+ // <pref> = <type> <locked> ':' <name> ':' <value>? ':' <value>? '\n'
-+ // <type> = 'B' | 'I' | 'S'
-+ // <locked> = 'L' | '-'
-+ // <name> = <string-value>
-+ // <value> = <bool-value> | <int-value> | <string-value>
-+ // <bool-value> = 'T' | 'F'
-+ // <int-value> = an integer literal accepted by strtol()
-+ // <string-value> = <int-value> '/' <chars>
-+ // <chars> = any char sequence of length dictated by the preceding
-+ // <int-value>.
-+ //
-+ // No whitespace is tolerated between tokens. <type> 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)
-+ {
-+ 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)
-+ {
-+ 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
-+
-+ // 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
-+
-+ MOZ_ASSERT(*p == ':');
-+ p++; // move past the ':'
-+
-+ // The pref name.
-+ nsCString name;
-+ p = DeserializeString(p, name);
-+
-+ MOZ_ASSERT(*p == ':');
-+ 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
-+
-+ 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
-+
-+ *aDomPref = dom::Pref(name, isLocked, maybeDefaultValue, maybeUserValue);
-+
-+ return p;
-+ }
-+
- void AddSizeOfIncludingThis(MallocSizeOf aMallocSizeOf, PrefsSizes& aSizes)
- {
- // Note: mName is allocated in gPrefNameArena, measured elsewhere.
-@@ -880,41 +1113,9 @@ pref_savePrefs()
-
- #ifdef DEBUG
-
--// For content processes, what prefs have been initialized?
--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
--{
-- const char* mPrefName;
--
-- explicit StringComparator(const char* aPrefName)
-- : mPrefName(aPrefName)
-- {
-- }
--
-- int operator()(const char* aPrefName) const
-- {
-- return strcmp(mPrefName, 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
-
-@@ -923,23 +1124,7 @@ 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);
-- }
--
-- 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);
-- }
-- }
--#endif
-+ MOZ_ASSERT_IF(!XRE_IsParentProcess(), gContentProcessPrefsAreInited);
-
- return static_cast<PrefEntry*>(gHashTable->Search(aPrefName));
- }
-@@ -2932,8 +3117,8 @@ public:
-
- } // namespace
-
--// A list of prefs sent early from the parent, via shared memory.
--static InfallibleTArray<dom::Pref>* gEarlyDomPrefs;
-+// A list of changed prefs sent from the parent via shared memory.
-+static InfallibleTArray<dom::Pref>* gChangedDomPrefs;
-
- static const char kTelemetryPref[] = "toolkit.telemetry.enabled";
- static const char kChannelPref[] = "app.update.channel";
-@@ -3050,12 +3235,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,
- nsISupportsWeakReference)
-
- /* static */ void
--Preferences::SerializeEarlyPreferences(nsCString& aStr)
-+Preferences::SerializePreferences(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;
-- }
-+ aStr.Truncate();
-
-- switch (pref->Type()) {
-- case PrefType::Bool:
-- boolPrefs.Append(
-- nsPrintfCString("%u:%d|", i, Preferences::GetBool(prefName)));
-- break;
-- case PrefType::Int:
-- intPrefs.Append(
-- 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()));
-- } 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<PrefEntry*>(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)
- {
- MOZ_ASSERT(!XRE_IsParentProcess());
-
-- MOZ_ASSERT(!gEarlyDomPrefs);
-- gEarlyDomPrefs = new InfallibleTArray<dom::Pref>();
-+ MOZ_ASSERT(!gChangedDomPrefs);
-+ gChangedDomPrefs = new InfallibleTArray<dom::Pref>();
-
- 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());
-- 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<int32_t>(strtol(p, &p, 10))));
-- MOZ_ASSERT(p[0] == '|');
-- p++;
-- dom::Pref pref(nsCString(dom::ContentPrefs::GetEarlyPref(index)),
-- /* 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());
-- 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<dom::Pref>* 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(!gContentProcessPrefsAreInited);
-+ gContentProcessPrefsAreInited = true;
- #endif
- }
-
-@@ -3558,36 +3638,12 @@ Preferences::GetPreference(dom::Pref* aDomPref)
- }
- }
-
--void
--Preferences::GetPreferences(InfallibleTArray<dom::Pref>* 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<PrefEntry*>(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()
- {
- 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,
- 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<dom::Pref>* aSettings);
-- static void SetLatePreferences(const nsTArray<dom::Pref>* 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:
- static void SetPreference(const dom::Pref& aPref);
-
- #ifdef DEBUG
-- static bool AreAllPrefsSetInContentProcess();
-+ static bool ArePrefsInitedInContentProcess();
- #endif
-
- static void AddSizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf,
diff --git a/www/firefox/files/patch-z-bug517422 b/www/firefox/files/patch-z-bug517422
index 9b041089be3f..a58e6a1afaaf 100644
--- a/www/firefox/files/patch-z-bug517422
+++ b/www/firefox/files/patch-z-bug517422
@@ -132,10 +132,10 @@ diff --git dom/media/AudioStream.h dom/media/AudioStream.h
index 7dc1f60f95cc..67d402a4117f 100644
--- dom/media/AudioStream.h
+++ dom/media/AudioStream.h
-@@ -15,7 +15,11 @@
- #include "mozilla/TimeStamp.h"
- #include "mozilla/UniquePtr.h"
- #include "CubebUtils.h"
+@@ -16,7 +16,11 @@
+ #include "nsAutoPtr.h"
+ #include "nsCOMPtr.h"
+ #include "nsThreadUtils.h"
+#ifdef MOZ_SYSTEM_SOUNDTOUCH
+#include "soundtouch/SoundTouch.h"
+#else