1
0
mirror of https://git.FreeBSD.org/ports.git synced 2025-02-01 10:59:55 +00:00

www/firefox: update to 57.0 (marketed as "Firefox Quantum")

Not a MFH candidate due to POLA violation per redesigned UI, broken
legacy addons and auto-reviewed new addons.

Changes:	https://www.mozilla.org/firefox/57.0/releasenotes/
PR:		222693
Tested by:	pi, tobik, TrueOS
This commit is contained in:
Jan Beich 2017-11-14 19:04:44 +00:00
parent 45587e15f8
commit eb864e519d
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=454194
66 changed files with 216 additions and 8319 deletions

View File

@ -37,12 +37,12 @@ RUN_DEPENDS+= libxul>=45:www/libxul
.elif ${gecko_ARGS:Mfirefox}
_GECKO_DEFAULT_VERSION= 52
_GECKO_VERSIONS= 52 56
_GECKO_VERSIONS= 52 57
_GECKO_TYPE= firefox
# Dependence lines for different Firefox versions
52_DEPENDS= ${LOCALBASE}/lib/firefox/firefox:www/firefox-esr
56_DEPENDS= ${LOCALBASE}/lib/firefox/firefox:www/firefox
57_DEPENDS= ${LOCALBASE}/lib/firefox/firefox:www/firefox
.if exists(${LOCALBASE}/bin/firefox)
_GECKO_INSTALLED_VER!= ${LOCALBASE}/bin/firefox --version 2>/dev/null

View File

@ -2,10 +2,10 @@
# $FreeBSD$
PORTNAME= firefox-i18n
PORTVERSION= 56.0.2
PORTVERSION= 57.0
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/build4/linux-i686/xpi
PKGNAMEPREFIX=
DISTFILES= ${FIREFOX_I18N_:S/$/.xpi/}
DIST_SUBDIR= xpi/${DISTNAME}
@ -15,7 +15,7 @@ COMMENT= Localized interface for Firefox
EXTRACT_DEPENDS= zip:archivers/zip
USES= zip:infozip gecko:firefox,56,build
USES= zip:infozip gecko:firefox,57,build
USE_XPI= firefox
NO_ARCH= yes

View File

@ -1,191 +1,191 @@
TIMESTAMP = 1508873487
SHA256 (xpi/firefox-i18n-56.0.2/ach.xpi) = a78c4900c9dac71ea312d5ceda13987f4f8418ab078374c0e292cd30ce79aa23
SIZE (xpi/firefox-i18n-56.0.2/ach.xpi) = 454896
SHA256 (xpi/firefox-i18n-56.0.2/af.xpi) = e0ea5e99eb7cedd0c3893ae4baa3ca2af7f814bc069dcbf921069dcaba762fc6
SIZE (xpi/firefox-i18n-56.0.2/af.xpi) = 456214
SHA256 (xpi/firefox-i18n-56.0.2/an.xpi) = 18e3c4e6f85fb296bd955b110ba2c6a381ba4ba8de3a0e2990bc4618f9438593
SIZE (xpi/firefox-i18n-56.0.2/an.xpi) = 475863
SHA256 (xpi/firefox-i18n-56.0.2/ar.xpi) = c8dcb494321e5ef34092b7555ec67147461b387803df895c30858314f0509acb
SIZE (xpi/firefox-i18n-56.0.2/ar.xpi) = 500711
SHA256 (xpi/firefox-i18n-56.0.2/as.xpi) = e77f99a72083b49e30f453d1f40ac670e42e6a637b8bb4e7c914f74b24e6b582
SIZE (xpi/firefox-i18n-56.0.2/as.xpi) = 508237
SHA256 (xpi/firefox-i18n-56.0.2/ast.xpi) = e4fe6028af88b67dce678e6a1215cda2c2aa0cbe76eb95947c46e08d93bb23bc
SIZE (xpi/firefox-i18n-56.0.2/ast.xpi) = 469157
SHA256 (xpi/firefox-i18n-56.0.2/az.xpi) = 5d9cd26da6e1afe41c9d032054b066a9e0a13f7cfd9701e8126147f405ae6f1a
SIZE (xpi/firefox-i18n-56.0.2/az.xpi) = 484984
SHA256 (xpi/firefox-i18n-56.0.2/be.xpi) = 647318eb3b3060ba2384ecf4b4b96fb70fb54f1428c20f776d8d99f75eed5f49
SIZE (xpi/firefox-i18n-56.0.2/be.xpi) = 531385
SHA256 (xpi/firefox-i18n-56.0.2/bg.xpi) = a844374d3453747f30382acf6019d379596f812f68d49ba7245a18993cea5ffb
SIZE (xpi/firefox-i18n-56.0.2/bg.xpi) = 528789
SHA256 (xpi/firefox-i18n-56.0.2/bn-BD.xpi) = caafe8df84189999ed513e4f88e91f8b8c35e8a1d13fa54bd54f3a0654ec1f02
SIZE (xpi/firefox-i18n-56.0.2/bn-BD.xpi) = 542772
SHA256 (xpi/firefox-i18n-56.0.2/bn-IN.xpi) = 4278938cf3be47f2e7a865a2221c10f383b8c7930f71b2bd0c4ce09c1ff8a3c8
SIZE (xpi/firefox-i18n-56.0.2/bn-IN.xpi) = 534450
SHA256 (xpi/firefox-i18n-56.0.2/br.xpi) = 65e8b0a3e55e99701e0ecfb9cdb0775afc0946f23eab34d4ada4f0d973d2076d
SIZE (xpi/firefox-i18n-56.0.2/br.xpi) = 464256
SHA256 (xpi/firefox-i18n-56.0.2/bs.xpi) = fef54b5ba9231eaedbe216c1f9e7c86d831ed032d1fcd6e5dd15a06619ad69ac
SIZE (xpi/firefox-i18n-56.0.2/bs.xpi) = 472256
SHA256 (xpi/firefox-i18n-56.0.2/ca.xpi) = 11dc866f5f2a16622fa45c36c174150293e123bfd970890e4403ed224d6e4eb6
SIZE (xpi/firefox-i18n-56.0.2/ca.xpi) = 480364
SHA256 (xpi/firefox-i18n-56.0.2/cak.xpi) = 1ed05bcdb3977850ae21847f70122111ff459cc6669130ec9db5ccf11dde117f
SIZE (xpi/firefox-i18n-56.0.2/cak.xpi) = 489507
SHA256 (xpi/firefox-i18n-56.0.2/cs.xpi) = 1191121195a77ec1315ec379b307819f1ce6b15bfa1bb9fc31ec0148cb08bcf5
SIZE (xpi/firefox-i18n-56.0.2/cs.xpi) = 485090
SHA256 (xpi/firefox-i18n-56.0.2/cy.xpi) = a04d0d37f46b89d2aba85eebc1524daba41b3a6db468e61a924e83b2814d8845
SIZE (xpi/firefox-i18n-56.0.2/cy.xpi) = 466288
SHA256 (xpi/firefox-i18n-56.0.2/da.xpi) = 3822d31c6b83317216f5124d603d9a8b8180a06d2407426dd90b71891c155f0c
SIZE (xpi/firefox-i18n-56.0.2/da.xpi) = 460091
SHA256 (xpi/firefox-i18n-56.0.2/de.xpi) = ee02b96baf96be7e69ff12f06576a270e48ca454cc8f93c51070ebdd9c2a03f7
SIZE (xpi/firefox-i18n-56.0.2/de.xpi) = 473856
SHA256 (xpi/firefox-i18n-56.0.2/dsb.xpi) = 227588519f2ae092f6cbf0531287c5c36b7037c3355cc0d9e0e024d4e84472e3
SIZE (xpi/firefox-i18n-56.0.2/dsb.xpi) = 489897
SHA256 (xpi/firefox-i18n-56.0.2/el.xpi) = ace7c78e28297ea4dcc90a2b8c2881afc812a2416ae4cdba499749349bc2d3f3
SIZE (xpi/firefox-i18n-56.0.2/el.xpi) = 554120
SHA256 (xpi/firefox-i18n-56.0.2/en-GB.xpi) = 55fb37a478f2521b1b1543498d373ade08126c3ac71127bfbde504d8a3f95e16
SIZE (xpi/firefox-i18n-56.0.2/en-GB.xpi) = 447375
SHA256 (xpi/firefox-i18n-56.0.2/en-US.xpi) = 618f390c9a36aed65860d6ad20444c9c6224471d0a394de92a21262291327ff2
SIZE (xpi/firefox-i18n-56.0.2/en-US.xpi) = 446951
SHA256 (xpi/firefox-i18n-56.0.2/en-ZA.xpi) = 2fa254426d945152e9eb01cc02a8f86415fa5425aefed9825bd1dea9b6d0b76a
SIZE (xpi/firefox-i18n-56.0.2/en-ZA.xpi) = 445916
SHA256 (xpi/firefox-i18n-56.0.2/eo.xpi) = f1d9e7acc5bb36a2acfb1659ad0857e5d2c9800836d096f41ceb87977a6e7377
SIZE (xpi/firefox-i18n-56.0.2/eo.xpi) = 468952
SHA256 (xpi/firefox-i18n-56.0.2/es-AR.xpi) = 12f34c15fb4cf11e5c007ea19a97f91370a66e192cc3c0aed5405659be36eaa3
SIZE (xpi/firefox-i18n-56.0.2/es-AR.xpi) = 475449
SHA256 (xpi/firefox-i18n-56.0.2/es-CL.xpi) = 5239da279a01681c00ece001d1477abba04b41d50fd442e761140ba93b68870f
SIZE (xpi/firefox-i18n-56.0.2/es-CL.xpi) = 479922
SHA256 (xpi/firefox-i18n-56.0.2/es-ES.xpi) = 98b7422e833226916953ac89201652f406f84c805d293ab949adae475fc03a7c
SIZE (xpi/firefox-i18n-56.0.2/es-ES.xpi) = 365631
SHA256 (xpi/firefox-i18n-56.0.2/es-MX.xpi) = 9516c169b883f8208c996f461221e9bb917e2e56c1f67d01f67026a8f5de3a1b
SIZE (xpi/firefox-i18n-56.0.2/es-MX.xpi) = 482565
SHA256 (xpi/firefox-i18n-56.0.2/et.xpi) = dff5cbe5b933511fc10c1209dde31c45a521c9e687d909f4915eaf3eac8a3ad3
SIZE (xpi/firefox-i18n-56.0.2/et.xpi) = 462104
SHA256 (xpi/firefox-i18n-56.0.2/eu.xpi) = d47fe44fcab9328102334596678fe89289d8de44cd9018e13e1bcc70823ec6ec
SIZE (xpi/firefox-i18n-56.0.2/eu.xpi) = 467884
SHA256 (xpi/firefox-i18n-56.0.2/fa.xpi) = 8f25e71eb0ee9ad9e90d9948012713013ee03b6fe1b3837b1d903c5102be0a93
SIZE (xpi/firefox-i18n-56.0.2/fa.xpi) = 522909
SHA256 (xpi/firefox-i18n-56.0.2/ff.xpi) = b8416ca244cb8c99744dc3c6daa55d893754ed051ea9731f57b49edc2f0e18f1
SIZE (xpi/firefox-i18n-56.0.2/ff.xpi) = 463098
SHA256 (xpi/firefox-i18n-56.0.2/fi.xpi) = 1c6ecc0d72a500f5a77a8fdde5e288ce2c578bc1b1de3d1a062e6d7a71765130
SIZE (xpi/firefox-i18n-56.0.2/fi.xpi) = 461923
SHA256 (xpi/firefox-i18n-56.0.2/fr.xpi) = 3aa8e3e74e35a4e1ca948cb83b42bb9b2c95ec6abdbc8b0872129f6f75d4e2e1
SIZE (xpi/firefox-i18n-56.0.2/fr.xpi) = 484561
SHA256 (xpi/firefox-i18n-56.0.2/fy-NL.xpi) = 21b16ee4d0a232d6860c9fa6db296544e13e9500796451a98adebcdf35f88c66
SIZE (xpi/firefox-i18n-56.0.2/fy-NL.xpi) = 478044
SHA256 (xpi/firefox-i18n-56.0.2/ga-IE.xpi) = 4d780a2c0f362742f069842ae2d7ddf3dd8177e66405c9c570ef52b2e7de1f32
SIZE (xpi/firefox-i18n-56.0.2/ga-IE.xpi) = 489379
SHA256 (xpi/firefox-i18n-56.0.2/gd.xpi) = 9e4e1ffc31853fe3e0d4e9e23cd1ccdf0be1b50182cefc9581b902370a3ae2fc
SIZE (xpi/firefox-i18n-56.0.2/gd.xpi) = 476927
SHA256 (xpi/firefox-i18n-56.0.2/gl.xpi) = 7dc3615f3eca3bc09472207b8d78644923526dd51651a6a04cf8449bf78cca4b
SIZE (xpi/firefox-i18n-56.0.2/gl.xpi) = 466468
SHA256 (xpi/firefox-i18n-56.0.2/gn.xpi) = 32d64cb5ceb3a8b53abafd0699d9697f190e137155484fc06968efe3ab2da294
SIZE (xpi/firefox-i18n-56.0.2/gn.xpi) = 485790
SHA256 (xpi/firefox-i18n-56.0.2/gu-IN.xpi) = 574654d88abc8d620d5d29c09a281738ff463f8a0e09386373005a4c33cd7adf
SIZE (xpi/firefox-i18n-56.0.2/gu-IN.xpi) = 513740
SHA256 (xpi/firefox-i18n-56.0.2/he.xpi) = aa4437d071736c8009ff81f79cf51348fa7ce02d82dd603cc08c00997de79ddc
SIZE (xpi/firefox-i18n-56.0.2/he.xpi) = 488495
SHA256 (xpi/firefox-i18n-56.0.2/hi-IN.xpi) = 9faa3d8242f2e13e82334c91018137a23a88374d6d8bcbdbca0bac69b709487d
SIZE (xpi/firefox-i18n-56.0.2/hi-IN.xpi) = 538303
SHA256 (xpi/firefox-i18n-56.0.2/hr.xpi) = 78ea8859fc47c3fd35055ad7dacd3c89192619f637d1b10a5515db49c1aabd63
SIZE (xpi/firefox-i18n-56.0.2/hr.xpi) = 475058
SHA256 (xpi/firefox-i18n-56.0.2/hsb.xpi) = 7e868a01a8c881319703dd2d40aa7a90a2a6afda350a93cdee785c1cee3e334c
SIZE (xpi/firefox-i18n-56.0.2/hsb.xpi) = 487599
SHA256 (xpi/firefox-i18n-56.0.2/hu.xpi) = ba7c06ffe790cb31450c47ffc73c0ef402e759e8d6798c284ab3004aa9b1a154
SIZE (xpi/firefox-i18n-56.0.2/hu.xpi) = 490102
SHA256 (xpi/firefox-i18n-56.0.2/hy-AM.xpi) = 5a78e97fe3b0a106a9839714e2a811d52501e5c427ba9c943bdcbdd2beb303cb
SIZE (xpi/firefox-i18n-56.0.2/hy-AM.xpi) = 527711
SHA256 (xpi/firefox-i18n-56.0.2/id.xpi) = 916e89bb2bf8fcd0671a1cfe34944643e3f3bb1aeccf6bc7b86329e1f3261cb3
SIZE (xpi/firefox-i18n-56.0.2/id.xpi) = 459066
SHA256 (xpi/firefox-i18n-56.0.2/is.xpi) = f424cf833f52cb6a57933e6173bad7a1df2e01b9233feb0abfab0e9f3fd13a78
SIZE (xpi/firefox-i18n-56.0.2/is.xpi) = 467447
SHA256 (xpi/firefox-i18n-56.0.2/it.xpi) = 49e286eecc3e31a2581f728783f25717b994e466a1329f5121efff04d3400ccd
SIZE (xpi/firefox-i18n-56.0.2/it.xpi) = 358695
SHA256 (xpi/firefox-i18n-56.0.2/ja.xpi) = f981b5dd41b2d2479034720d4d8d4ec98b936e5d4b092e954057a3135b802d93
SIZE (xpi/firefox-i18n-56.0.2/ja.xpi) = 527926
SHA256 (xpi/firefox-i18n-56.0.2/ka.xpi) = c84ec7d427a84290cc760cf35a900a188621c7c8fbc3b48f63d7c000642eb3c1
SIZE (xpi/firefox-i18n-56.0.2/ka.xpi) = 509096
SHA256 (xpi/firefox-i18n-56.0.2/kab.xpi) = e8ffa26d1acef0cfb554eced0b86656c4ac504b5459bb8fd3eb86c5292df7b3e
SIZE (xpi/firefox-i18n-56.0.2/kab.xpi) = 477420
SHA256 (xpi/firefox-i18n-56.0.2/kk.xpi) = 5c918b32273f6a107c6a8d78be58c9e757884dcc28951949db39bba705c95d37
SIZE (xpi/firefox-i18n-56.0.2/kk.xpi) = 534932
SHA256 (xpi/firefox-i18n-56.0.2/km.xpi) = 52c280027d92449fda3cd321a091b2f65f401d417bff7fdce692191b748f99c2
SIZE (xpi/firefox-i18n-56.0.2/km.xpi) = 549344
SHA256 (xpi/firefox-i18n-56.0.2/kn.xpi) = 03120c4eb742e750c46f266fceb69cd1a8b97d3cf5bd0f2a55485d25af502272
SIZE (xpi/firefox-i18n-56.0.2/kn.xpi) = 545517
SHA256 (xpi/firefox-i18n-56.0.2/ko.xpi) = 60171b4d104a456df4a7fc60dc506eaa0ced1a32a216461bbddd2a215200f61b
SIZE (xpi/firefox-i18n-56.0.2/ko.xpi) = 502895
SHA256 (xpi/firefox-i18n-56.0.2/lij.xpi) = b0b07f9e4be734145b6472ef506b4cb99c85eea98ece31dad6efa2003d59f893
SIZE (xpi/firefox-i18n-56.0.2/lij.xpi) = 467275
SHA256 (xpi/firefox-i18n-56.0.2/lt.xpi) = 09302dfb196300ae49c47cf4a9a1ac9ec4df954defa8abd19bdd985852af94b5
SIZE (xpi/firefox-i18n-56.0.2/lt.xpi) = 488753
SHA256 (xpi/firefox-i18n-56.0.2/lv.xpi) = 9f47b7ef87c55320d6d67a15f61a87b0cc9e891a5aeac382badfe3e3b27b51e4
SIZE (xpi/firefox-i18n-56.0.2/lv.xpi) = 481628
SHA256 (xpi/firefox-i18n-56.0.2/mai.xpi) = f16a670648ebdc3b914620d7fbe4f6095952f65c658901ecfcfbbc37645f5fdb
SIZE (xpi/firefox-i18n-56.0.2/mai.xpi) = 524702
SHA256 (xpi/firefox-i18n-56.0.2/mk.xpi) = e537b92b6af439a1c1b9e667939f146b7a2ad17eae3d4f9075d1ad70bb958b0f
SIZE (xpi/firefox-i18n-56.0.2/mk.xpi) = 507818
SHA256 (xpi/firefox-i18n-56.0.2/ml.xpi) = 5714a5481f111e1467a596973c824e9d09cb1e464cc74c332582d5079b495efd
SIZE (xpi/firefox-i18n-56.0.2/ml.xpi) = 547547
SHA256 (xpi/firefox-i18n-56.0.2/mr.xpi) = 2993e10fa67e526691859805b5bf928be5607d59ceedbbb7aa68962688fa6723
SIZE (xpi/firefox-i18n-56.0.2/mr.xpi) = 536673
SHA256 (xpi/firefox-i18n-56.0.2/ms.xpi) = 7b4a6353a3b2e6e2fc923dc43191c0bc463aeacc9d9eaadb032f93f00376b6df
SIZE (xpi/firefox-i18n-56.0.2/ms.xpi) = 466107
SHA256 (xpi/firefox-i18n-56.0.2/my.xpi) = 9ef461ae9ec46bc6198456411232ed37a0ed68f11d4bc587d2b8b4d8247868d5
SIZE (xpi/firefox-i18n-56.0.2/my.xpi) = 536722
SHA256 (xpi/firefox-i18n-56.0.2/nb-NO.xpi) = ee407654fbfad2523ec72fc921b9072772bacc231636b460ac239c406a43132f
SIZE (xpi/firefox-i18n-56.0.2/nb-NO.xpi) = 465575
SHA256 (xpi/firefox-i18n-56.0.2/nl.xpi) = bbba1d13636b0f03868d202893eb995f3112a56ac2453bbdde6b8fb856fe49b1
SIZE (xpi/firefox-i18n-56.0.2/nl.xpi) = 469053
SHA256 (xpi/firefox-i18n-56.0.2/nn-NO.xpi) = 8120d52f0e9a0ecd870a0ea0d3b887df12b129d3bfda7c83f09e4036907d08e6
SIZE (xpi/firefox-i18n-56.0.2/nn-NO.xpi) = 466208
SHA256 (xpi/firefox-i18n-56.0.2/or.xpi) = 325acd5539ec48f65320ff0f5768fbdced82c788750f7c0cd00bf2a264751e32
SIZE (xpi/firefox-i18n-56.0.2/or.xpi) = 518165
SHA256 (xpi/firefox-i18n-56.0.2/pa-IN.xpi) = 2e3bcfc268606f1496226ca549df40e9c6b8b9f972cdd7f84d4d5c4b32173294
SIZE (xpi/firefox-i18n-56.0.2/pa-IN.xpi) = 509046
SHA256 (xpi/firefox-i18n-56.0.2/pl.xpi) = c6123361207e67bfd6f859c65c369fa0b22561fbb46b548d9b322433f209a712
SIZE (xpi/firefox-i18n-56.0.2/pl.xpi) = 377524
SHA256 (xpi/firefox-i18n-56.0.2/pt-BR.xpi) = 3a45de0fd1d0b18123e4f97de1de8f57c043a8c621a02f5267643fc5fb12c8bf
SIZE (xpi/firefox-i18n-56.0.2/pt-BR.xpi) = 470954
SHA256 (xpi/firefox-i18n-56.0.2/pt-PT.xpi) = b8412464435c2e3c79017bc7ecc6b7b7d7715b1b47d0ca5f6e7c320d2c2b87d1
SIZE (xpi/firefox-i18n-56.0.2/pt-PT.xpi) = 472803
SHA256 (xpi/firefox-i18n-56.0.2/rm.xpi) = 2054926b1f43459aa857234466b686553555e2afc2e6072ef3883f28b2ebc676
SIZE (xpi/firefox-i18n-56.0.2/rm.xpi) = 467019
SHA256 (xpi/firefox-i18n-56.0.2/ro.xpi) = d69ce50c34f429d4a6724b4b8d954bb3f78e5a7fb42302c2e9de9e5f870c4e0e
SIZE (xpi/firefox-i18n-56.0.2/ro.xpi) = 470785
SHA256 (xpi/firefox-i18n-56.0.2/ru.xpi) = 2339cce445c2c01de77fd89079c121301dfcc082f9f8e3b0f640d0f42a648cac
SIZE (xpi/firefox-i18n-56.0.2/ru.xpi) = 541437
SHA256 (xpi/firefox-i18n-56.0.2/si.xpi) = 79c3fa18f421923b48505b74e39cd4fab474685584bb5daf71f41ebd8a388402
SIZE (xpi/firefox-i18n-56.0.2/si.xpi) = 515921
SHA256 (xpi/firefox-i18n-56.0.2/sk.xpi) = 0292ae81d9ae0af15489b2b420f3156cb2f7266cd881deaa4c9e164c987271c7
SIZE (xpi/firefox-i18n-56.0.2/sk.xpi) = 495563
SHA256 (xpi/firefox-i18n-56.0.2/sl.xpi) = bea8af482218c1bfde800e3461f64d008b46b1419745127fe838a29724098b5f
SIZE (xpi/firefox-i18n-56.0.2/sl.xpi) = 473806
SHA256 (xpi/firefox-i18n-56.0.2/son.xpi) = 6f93b52c42355adafc0778516defce16af99a17ee41ec0d25003ab39bfc6dda1
SIZE (xpi/firefox-i18n-56.0.2/son.xpi) = 464322
SHA256 (xpi/firefox-i18n-56.0.2/sq.xpi) = 867d12980a8d3ee7ae28faa4f09f63ed405f9ea18b6c0c776da8194ecda937ed
SIZE (xpi/firefox-i18n-56.0.2/sq.xpi) = 479511
SHA256 (xpi/firefox-i18n-56.0.2/sr.xpi) = b300ada0279186be68dbf292d41d446828acc71e3dcca94cf88a2ef34b38abc9
SIZE (xpi/firefox-i18n-56.0.2/sr.xpi) = 504487
SHA256 (xpi/firefox-i18n-56.0.2/sv-SE.xpi) = 0ccdf643e1f62ff1e41ceb3fe9c35191aece0efcbfc6b24293f88f7ef1d55043
SIZE (xpi/firefox-i18n-56.0.2/sv-SE.xpi) = 473949
SHA256 (xpi/firefox-i18n-56.0.2/ta.xpi) = 0186d38239a9db92394562eb70a6960eeeee052abce62bc3672c8644a37cb859
SIZE (xpi/firefox-i18n-56.0.2/ta.xpi) = 530646
SHA256 (xpi/firefox-i18n-56.0.2/te.xpi) = 789359330bdfefb1fc379582b098c040cdb6a46f770e2c80b1695a7eb634db40
SIZE (xpi/firefox-i18n-56.0.2/te.xpi) = 549585
SHA256 (xpi/firefox-i18n-56.0.2/th.xpi) = abeb0f7ff018d44efbcea4cba5c0c62a78f42f6395ea1535f757f2045064c880
SIZE (xpi/firefox-i18n-56.0.2/th.xpi) = 520297
SHA256 (xpi/firefox-i18n-56.0.2/tr.xpi) = b3798722e3a732e422a1fbff8d1c9ca7716b3fe9b2f21cc219432ec998556e26
SIZE (xpi/firefox-i18n-56.0.2/tr.xpi) = 480549
SHA256 (xpi/firefox-i18n-56.0.2/uk.xpi) = 6854f076f5ef93e72a4f38f03a8dadc61e3a2f8afa402783bbd00bcc63b6f14f
SIZE (xpi/firefox-i18n-56.0.2/uk.xpi) = 535436
SHA256 (xpi/firefox-i18n-56.0.2/ur.xpi) = 01a4d64725be568e148d88dab405545f76a24a695d499a236a2be0599489324a
SIZE (xpi/firefox-i18n-56.0.2/ur.xpi) = 527354
SHA256 (xpi/firefox-i18n-56.0.2/uz.xpi) = 79092d2f830adbf05cc884aa014fa9348e3449fa206cf91286d5bfb40ebe729c
SIZE (xpi/firefox-i18n-56.0.2/uz.xpi) = 475101
SHA256 (xpi/firefox-i18n-56.0.2/vi.xpi) = 65633b00c1a124a23bfda2bdb7666ab8e12e113c956930cc975f838e3de04038
SIZE (xpi/firefox-i18n-56.0.2/vi.xpi) = 487150
SHA256 (xpi/firefox-i18n-56.0.2/xh.xpi) = af99554dc838c042310acbb0a7c2623d61ff3b3045667cf301cffeb29821c008
SIZE (xpi/firefox-i18n-56.0.2/xh.xpi) = 477838
SHA256 (xpi/firefox-i18n-56.0.2/zh-CN.xpi) = f2a1bb04222fbca3845b00694342a74c8d54cbf1a64104d96f1856879aed0abf
SIZE (xpi/firefox-i18n-56.0.2/zh-CN.xpi) = 498979
SHA256 (xpi/firefox-i18n-56.0.2/zh-TW.xpi) = 8c547d631522048d060be5305c277024e8038386dcad232ed742b1edf14a9471
SIZE (xpi/firefox-i18n-56.0.2/zh-TW.xpi) = 497765
TIMESTAMP = 1510498738
SHA256 (xpi/firefox-i18n-57.0/ach.xpi) = ff5bbdfcca5270cf978173eb13ce10bfb4b51dbd1faeb9b69c50f689a1eb3dc4
SIZE (xpi/firefox-i18n-57.0/ach.xpi) = 441112
SHA256 (xpi/firefox-i18n-57.0/af.xpi) = 65459a5914dba1de876bee7d867699ff033a9722a957675f973b5cf1213366b9
SIZE (xpi/firefox-i18n-57.0/af.xpi) = 442205
SHA256 (xpi/firefox-i18n-57.0/an.xpi) = d24b77cfdf3d5badd492c04f5984171bedbafcee31fb447930925e2c911e5261
SIZE (xpi/firefox-i18n-57.0/an.xpi) = 462777
SHA256 (xpi/firefox-i18n-57.0/ar.xpi) = 06b0d8f7f34eb661f8f4944c26ddeee81e84bb00dd07dec4f1f06e54f1cdbe6f
SIZE (xpi/firefox-i18n-57.0/ar.xpi) = 488159
SHA256 (xpi/firefox-i18n-57.0/as.xpi) = 8229d02b5f8b88dea2a6e8f83db6c335c951ebf786f4d73fe28dde8457ae4d59
SIZE (xpi/firefox-i18n-57.0/as.xpi) = 491074
SHA256 (xpi/firefox-i18n-57.0/ast.xpi) = 0f46b1d36c23ec86656208241e692f2f4fef6338285dd54621939a53672d497d
SIZE (xpi/firefox-i18n-57.0/ast.xpi) = 455503
SHA256 (xpi/firefox-i18n-57.0/az.xpi) = 68db90d2cc24227407dc20cb8721b5f89ae875fc3e0248981bf5349b2348030d
SIZE (xpi/firefox-i18n-57.0/az.xpi) = 466042
SHA256 (xpi/firefox-i18n-57.0/be.xpi) = 9e9c151874180d2ccf6ac1e7e7a59a5d2e72f9543bb6c128416fad177a2f01cb
SIZE (xpi/firefox-i18n-57.0/be.xpi) = 516091
SHA256 (xpi/firefox-i18n-57.0/bg.xpi) = 10c386468c1d34676a7d4e3992f14d853cd29f61bd1d12b04f3f1b66ebb8993b
SIZE (xpi/firefox-i18n-57.0/bg.xpi) = 510349
SHA256 (xpi/firefox-i18n-57.0/bn-BD.xpi) = 11b541a18a34fee16337dd8648a36e45b6c5371e9c17a845985120e6a7b1997d
SIZE (xpi/firefox-i18n-57.0/bn-BD.xpi) = 527188
SHA256 (xpi/firefox-i18n-57.0/bn-IN.xpi) = f8c912705b760607456a140506f3120e9d7c9f0ee17508d4cbd1eb3e18bc895d
SIZE (xpi/firefox-i18n-57.0/bn-IN.xpi) = 516175
SHA256 (xpi/firefox-i18n-57.0/br.xpi) = 4c76bf9c4b39dac467de391527072ca6d81c83a9ccbead46dbbbb76a8ab7c252
SIZE (xpi/firefox-i18n-57.0/br.xpi) = 451865
SHA256 (xpi/firefox-i18n-57.0/bs.xpi) = 4d3c483b4e3a20a852ddb5fe6a0d1f447366310dee446317017ebdf332e129c1
SIZE (xpi/firefox-i18n-57.0/bs.xpi) = 459649
SHA256 (xpi/firefox-i18n-57.0/ca.xpi) = 21fc2934acb751e89badbf215aad67085c310cbb627e44277d9592aaf213a837
SIZE (xpi/firefox-i18n-57.0/ca.xpi) = 466640
SHA256 (xpi/firefox-i18n-57.0/cak.xpi) = 95c3cff1bd43dc2f14e99a0c10d8f101beb4e940f810279a2912571ddeff6326
SIZE (xpi/firefox-i18n-57.0/cak.xpi) = 475934
SHA256 (xpi/firefox-i18n-57.0/cs.xpi) = c579929028397c8f93ed7193cc4f2a6511a5b503d59d02d6599701d7fab393db
SIZE (xpi/firefox-i18n-57.0/cs.xpi) = 469456
SHA256 (xpi/firefox-i18n-57.0/cy.xpi) = 3442262d271a47173226ae327be47524ab0237b0ebaea73c61c61177463f81fa
SIZE (xpi/firefox-i18n-57.0/cy.xpi) = 455787
SHA256 (xpi/firefox-i18n-57.0/da.xpi) = 538e9cce1e72af3ce6c6bbfe0a310529099dc95100546974e8b0a228860854a3
SIZE (xpi/firefox-i18n-57.0/da.xpi) = 448415
SHA256 (xpi/firefox-i18n-57.0/de.xpi) = bb4c883efe6f393ed47d91712901ca0bff04951db9e83ab5c981811e60512461
SIZE (xpi/firefox-i18n-57.0/de.xpi) = 460812
SHA256 (xpi/firefox-i18n-57.0/dsb.xpi) = 51ef0a8a83770dab060779d6b34478a60d080e743b8c446b791a89236161f29e
SIZE (xpi/firefox-i18n-57.0/dsb.xpi) = 479506
SHA256 (xpi/firefox-i18n-57.0/el.xpi) = 2009672fb40a593061fba725ad6fb5c6b52b330a7724e3e5203c8885df5fce81
SIZE (xpi/firefox-i18n-57.0/el.xpi) = 534482
SHA256 (xpi/firefox-i18n-57.0/en-GB.xpi) = 404f4dd5d724ceacdd49b63f303ceeae4608f8e989992ebca71198251023fc7f
SIZE (xpi/firefox-i18n-57.0/en-GB.xpi) = 435622
SHA256 (xpi/firefox-i18n-57.0/en-US.xpi) = ac8b76c6ad2f10b62c784cb97b30b7c8cf0b466102a3732199a2ce5f355aa0db
SIZE (xpi/firefox-i18n-57.0/en-US.xpi) = 441879
SHA256 (xpi/firefox-i18n-57.0/en-ZA.xpi) = f1d21809cccea7d4bc649b7337ebde96f3b42185d154e603dbae241e5d8876d1
SIZE (xpi/firefox-i18n-57.0/en-ZA.xpi) = 432019
SHA256 (xpi/firefox-i18n-57.0/eo.xpi) = 599314153f217433a53671ac0c118be5a6953094bcd94fe8230f192ca5d8995a
SIZE (xpi/firefox-i18n-57.0/eo.xpi) = 454908
SHA256 (xpi/firefox-i18n-57.0/es-AR.xpi) = 6f6d9805f9bba0fac0afce20bdfb1116c1c441cb5463fc271e8a3cec2cfe2bfe
SIZE (xpi/firefox-i18n-57.0/es-AR.xpi) = 462978
SHA256 (xpi/firefox-i18n-57.0/es-CL.xpi) = 141b2502ed61b7ac439910c252c6de9388ab6a6783fb290e77208367317b4fdc
SIZE (xpi/firefox-i18n-57.0/es-CL.xpi) = 465514
SHA256 (xpi/firefox-i18n-57.0/es-ES.xpi) = 73409303fc344d642f2343fd683694b534291c6ca5a8f8c63ee27b13e2ffe8ab
SIZE (xpi/firefox-i18n-57.0/es-ES.xpi) = 353623
SHA256 (xpi/firefox-i18n-57.0/es-MX.xpi) = dd136cbdbe64a77341d8345c388f6ca63e5acbf65ba2f7ef7d61af52bdbcbf61
SIZE (xpi/firefox-i18n-57.0/es-MX.xpi) = 468760
SHA256 (xpi/firefox-i18n-57.0/et.xpi) = e5683bf2280fd070dad6855af2f60bd433d9200af66ec0976f5045d5d44e8e30
SIZE (xpi/firefox-i18n-57.0/et.xpi) = 447277
SHA256 (xpi/firefox-i18n-57.0/eu.xpi) = 562f0ad72e23e6b37969c6b75fd7343cbceb67cfb3db570525b796c3a214b2b2
SIZE (xpi/firefox-i18n-57.0/eu.xpi) = 454671
SHA256 (xpi/firefox-i18n-57.0/fa.xpi) = 39891a98174cdf50dfea0a69e896049ef8aa66be1c694149eb7da3ff421045a2
SIZE (xpi/firefox-i18n-57.0/fa.xpi) = 510827
SHA256 (xpi/firefox-i18n-57.0/ff.xpi) = 0b9a56e8b6378b13db3011957c9e040c3b2e74afe8de34d0333b9029b15d3f38
SIZE (xpi/firefox-i18n-57.0/ff.xpi) = 454014
SHA256 (xpi/firefox-i18n-57.0/fi.xpi) = b81be3f2dd15873dae20b4eced377e3e8d3b40de59d7735c72444e87dc7f476e
SIZE (xpi/firefox-i18n-57.0/fi.xpi) = 446242
SHA256 (xpi/firefox-i18n-57.0/fr.xpi) = 59578e90b9832f216d01755cd52bc5956fa646bc420131f3b00ce09faa8d6271
SIZE (xpi/firefox-i18n-57.0/fr.xpi) = 472720
SHA256 (xpi/firefox-i18n-57.0/fy-NL.xpi) = 529719f9de24ed1a1573d8a55f91d2cbafdaa37d06c65ced206815622668fe8f
SIZE (xpi/firefox-i18n-57.0/fy-NL.xpi) = 465907
SHA256 (xpi/firefox-i18n-57.0/ga-IE.xpi) = 563933a54d94fa031fb309157d806b50e694ae42e6723d9a5b6e442fd5d53f21
SIZE (xpi/firefox-i18n-57.0/ga-IE.xpi) = 475962
SHA256 (xpi/firefox-i18n-57.0/gd.xpi) = 69089bd588762270bd6592b544ed7886b4d092b915cdabb4ffee6c9c499ed924
SIZE (xpi/firefox-i18n-57.0/gd.xpi) = 465121
SHA256 (xpi/firefox-i18n-57.0/gl.xpi) = ca5195dad2f043d4b530b414061c92f835fe0f9c2f0e8a64de0e3a73079e4e6d
SIZE (xpi/firefox-i18n-57.0/gl.xpi) = 452030
SHA256 (xpi/firefox-i18n-57.0/gn.xpi) = a118e4b81c47da417fe79af3d95788e04aaf42d433e8984d026851c41cd5ee11
SIZE (xpi/firefox-i18n-57.0/gn.xpi) = 471954
SHA256 (xpi/firefox-i18n-57.0/gu-IN.xpi) = 0cf3579447aa63d495d5ee744d7b7dcd16eb6779c8e398f75a3c12841c1f2461
SIZE (xpi/firefox-i18n-57.0/gu-IN.xpi) = 511989
SHA256 (xpi/firefox-i18n-57.0/he.xpi) = a2c770fab1787623f9a62a5579e7e2f5e8561ba38f8223ef11c75227abd5c7f3
SIZE (xpi/firefox-i18n-57.0/he.xpi) = 471920
SHA256 (xpi/firefox-i18n-57.0/hi-IN.xpi) = a07ecdd23d74ea5ae916b4a94ad513696e4000f703ea3e06cdff9c579748e1c2
SIZE (xpi/firefox-i18n-57.0/hi-IN.xpi) = 526109
SHA256 (xpi/firefox-i18n-57.0/hr.xpi) = f88a0964a4e55a4b904e3e466d78f853b58f99007f920277651b4176f48c1cbd
SIZE (xpi/firefox-i18n-57.0/hr.xpi) = 460720
SHA256 (xpi/firefox-i18n-57.0/hsb.xpi) = bbdb24808af0f07be665ffc8cadf687ef30c47075d0b1ef78a58311ddbf99f7f
SIZE (xpi/firefox-i18n-57.0/hsb.xpi) = 476500
SHA256 (xpi/firefox-i18n-57.0/hu.xpi) = 23767b357e4ae9a470605a7bf5e5231301ffe3d65fea8e11c07f82f53e1fd9c2
SIZE (xpi/firefox-i18n-57.0/hu.xpi) = 476603
SHA256 (xpi/firefox-i18n-57.0/hy-AM.xpi) = 8106177a21fbfb382dfe26b6106ba35128a03fc25d06b492f948c7a661303add
SIZE (xpi/firefox-i18n-57.0/hy-AM.xpi) = 510824
SHA256 (xpi/firefox-i18n-57.0/id.xpi) = a3cce07b6c2369bfed1c47af5fd3de8254603efe8b7d3e3929ddba32d824237a
SIZE (xpi/firefox-i18n-57.0/id.xpi) = 444040
SHA256 (xpi/firefox-i18n-57.0/is.xpi) = b608ebb8f34a93968fcef85d1c463e32489e999b92197f9b21b094d76db29767
SIZE (xpi/firefox-i18n-57.0/is.xpi) = 452655
SHA256 (xpi/firefox-i18n-57.0/it.xpi) = b035b10133444b23fbef2c66c8548fdd6703ec304d8a854c5fbec42e79f9778a
SIZE (xpi/firefox-i18n-57.0/it.xpi) = 347170
SHA256 (xpi/firefox-i18n-57.0/ja.xpi) = a7e3af1bbc6bdf3ec139e77e3cc1e39b072dd68b0a434ef96cc288e7424eea8c
SIZE (xpi/firefox-i18n-57.0/ja.xpi) = 508551
SHA256 (xpi/firefox-i18n-57.0/ka.xpi) = 09dd38e2f51b0228dd0302e4afcc6ee6f6f2d89956172c27518cb9c7423e155e
SIZE (xpi/firefox-i18n-57.0/ka.xpi) = 492355
SHA256 (xpi/firefox-i18n-57.0/kab.xpi) = f673912bcc909e9046008803886cf4322653871e7b5b121645566c2b92b5fc39
SIZE (xpi/firefox-i18n-57.0/kab.xpi) = 462530
SHA256 (xpi/firefox-i18n-57.0/kk.xpi) = 4d93c3e6f982f4b10d614f6d237f8fac8887c347f1ce11aa6728d0918d552a87
SIZE (xpi/firefox-i18n-57.0/kk.xpi) = 519248
SHA256 (xpi/firefox-i18n-57.0/km.xpi) = 11cb79e402ba96e678fa27bdbd39bb7ec48533eac89f884334b65ad9335eef54
SIZE (xpi/firefox-i18n-57.0/km.xpi) = 530079
SHA256 (xpi/firefox-i18n-57.0/kn.xpi) = 1230fe7d27fbc3af7196b7258bee255b4d85dd232c117a0a4d515ddef74328c9
SIZE (xpi/firefox-i18n-57.0/kn.xpi) = 531315
SHA256 (xpi/firefox-i18n-57.0/ko.xpi) = 1d992cbc4f30bff88b40d46c55ceef223f7b66ad489e073a859655461edacb28
SIZE (xpi/firefox-i18n-57.0/ko.xpi) = 487304
SHA256 (xpi/firefox-i18n-57.0/lij.xpi) = 4e9e6e0661c4bea860128dd870596154e68c3367624fd6cbc690e2c341157f21
SIZE (xpi/firefox-i18n-57.0/lij.xpi) = 452340
SHA256 (xpi/firefox-i18n-57.0/lt.xpi) = ce3bdff82d4f6baef44d2913e4da76b83e50dd0c9e3102e444425d379e2347f7
SIZE (xpi/firefox-i18n-57.0/lt.xpi) = 474955
SHA256 (xpi/firefox-i18n-57.0/lv.xpi) = 25bb6e484402d0c7909544031c2fe84f04b8cb0d563c902427542ca8b0f0a996
SIZE (xpi/firefox-i18n-57.0/lv.xpi) = 465242
SHA256 (xpi/firefox-i18n-57.0/mai.xpi) = 7f3dafefb77ef7d5e73dd9a762b9d51f05c7c739933561b3a0d53c7798fff9d9
SIZE (xpi/firefox-i18n-57.0/mai.xpi) = 507395
SHA256 (xpi/firefox-i18n-57.0/mk.xpi) = ac348da0f832916715da5111083a4e2b72a7d16b9c96c04a1cc4d5d3e6c862a7
SIZE (xpi/firefox-i18n-57.0/mk.xpi) = 490852
SHA256 (xpi/firefox-i18n-57.0/ml.xpi) = a4be2963a72230143283d674ddcc3c28c5f09636524af145f5f53ecce0322572
SIZE (xpi/firefox-i18n-57.0/ml.xpi) = 528255
SHA256 (xpi/firefox-i18n-57.0/mr.xpi) = 410200d49c82a8ba5a0ecae914e1da3f04798506d9625acbc10c5ed3b99cec9d
SIZE (xpi/firefox-i18n-57.0/mr.xpi) = 521289
SHA256 (xpi/firefox-i18n-57.0/ms.xpi) = c1b61b1325581a5c2d927a675b19e9d2e34c708bbc45ce5f6c03f386de5b33e5
SIZE (xpi/firefox-i18n-57.0/ms.xpi) = 451254
SHA256 (xpi/firefox-i18n-57.0/my.xpi) = 512cb14ae373275c4755c478ac1dce4c51be15cde0b2aaaca5b29c3e45df0a5b
SIZE (xpi/firefox-i18n-57.0/my.xpi) = 517702
SHA256 (xpi/firefox-i18n-57.0/nb-NO.xpi) = a57311847934d5dcff18066ff7bd323f2c2406fa3df4c8e258b8d9d0939b1be8
SIZE (xpi/firefox-i18n-57.0/nb-NO.xpi) = 451556
SHA256 (xpi/firefox-i18n-57.0/nl.xpi) = 303f6a0b8379bbbd6db4ac45e6eb5397d725259ac67eec50a15b32686916d000
SIZE (xpi/firefox-i18n-57.0/nl.xpi) = 458317
SHA256 (xpi/firefox-i18n-57.0/nn-NO.xpi) = eb127fad8c44a4721fc1cf1d901d0c2aff16041b8bc54d2d3951b03bfac94600
SIZE (xpi/firefox-i18n-57.0/nn-NO.xpi) = 452003
SHA256 (xpi/firefox-i18n-57.0/or.xpi) = dc0f59099e8d0592b3e61d8d5c88ae22b9a1067fd89911b7799f8b43d13a2f6b
SIZE (xpi/firefox-i18n-57.0/or.xpi) = 500863
SHA256 (xpi/firefox-i18n-57.0/pa-IN.xpi) = 33348a739ae6b01c3629def78a855ea6ea816e0253b696e58ba9ccbff3fa37d6
SIZE (xpi/firefox-i18n-57.0/pa-IN.xpi) = 495270
SHA256 (xpi/firefox-i18n-57.0/pl.xpi) = fff4c80385e9eec79ec93d4fc35f84301fa28c8a527591196d719f675c9ffe2b
SIZE (xpi/firefox-i18n-57.0/pl.xpi) = 364229
SHA256 (xpi/firefox-i18n-57.0/pt-BR.xpi) = d50347c7a26681e87fe6b5978a8fc05f8d7a885ba440cc51da03b66875fbd76a
SIZE (xpi/firefox-i18n-57.0/pt-BR.xpi) = 457153
SHA256 (xpi/firefox-i18n-57.0/pt-PT.xpi) = b77f50f7b02a78dc24dc32e9bff82b46bf2e37a62f978c1fe5ac172f6bf63f26
SIZE (xpi/firefox-i18n-57.0/pt-PT.xpi) = 459998
SHA256 (xpi/firefox-i18n-57.0/rm.xpi) = 695b5483ecc003296cd25b0b441c73c73c475457466fd7cff3f39a8491a44910
SIZE (xpi/firefox-i18n-57.0/rm.xpi) = 451057
SHA256 (xpi/firefox-i18n-57.0/ro.xpi) = 591ecab4f6e3869da69e612f847a832a802050471655565d29aa8c76febe7b7e
SIZE (xpi/firefox-i18n-57.0/ro.xpi) = 455509
SHA256 (xpi/firefox-i18n-57.0/ru.xpi) = 3b7355af69378f3bf0642d8f93c2c1fb6a9665ddd5a2b6aec4865baa8cd7713f
SIZE (xpi/firefox-i18n-57.0/ru.xpi) = 527005
SHA256 (xpi/firefox-i18n-57.0/si.xpi) = 3392da245426ca4480b478455b61b6d53fe5741e7c0c3772a610e622b0248715
SIZE (xpi/firefox-i18n-57.0/si.xpi) = 498323
SHA256 (xpi/firefox-i18n-57.0/sk.xpi) = 5ac2035fdb85fb5bb789b6f2723e69bd23e6a15f6a4dfb184c08100aafead6ba
SIZE (xpi/firefox-i18n-57.0/sk.xpi) = 480395
SHA256 (xpi/firefox-i18n-57.0/sl.xpi) = 6c55623bb30635ac67abcd3fab3b4cc30de5fefea2ae0bbb99f15be7c7843245
SIZE (xpi/firefox-i18n-57.0/sl.xpi) = 459376
SHA256 (xpi/firefox-i18n-57.0/son.xpi) = ac13a973cacd9e4c84401cd11095c0a0f307d07ebb0719174adcfcf957188316
SIZE (xpi/firefox-i18n-57.0/son.xpi) = 450929
SHA256 (xpi/firefox-i18n-57.0/sq.xpi) = 2b999472e0e6550b63782d15aa713bac47b3ddcf8a212673a30fd6e55090215c
SIZE (xpi/firefox-i18n-57.0/sq.xpi) = 465050
SHA256 (xpi/firefox-i18n-57.0/sr.xpi) = 75849a57f9b44b73445b302279dcb626389670a20dc3a404ad5db774c3ceaa00
SIZE (xpi/firefox-i18n-57.0/sr.xpi) = 487002
SHA256 (xpi/firefox-i18n-57.0/sv-SE.xpi) = 87ec5cbe45db203cfd1fd49ab7d2fb78df72fdcd4867e2dcc16727463100bb06
SIZE (xpi/firefox-i18n-57.0/sv-SE.xpi) = 459664
SHA256 (xpi/firefox-i18n-57.0/ta.xpi) = 74382122b90dbd76d128d5a860d40ddc839f315ee7cecbcdb73c2fbf20169199
SIZE (xpi/firefox-i18n-57.0/ta.xpi) = 513225
SHA256 (xpi/firefox-i18n-57.0/te.xpi) = a40de1d2174392d96bda8cfe65c8e374f4c833add0e1719d6c44616b571e6855
SIZE (xpi/firefox-i18n-57.0/te.xpi) = 530692
SHA256 (xpi/firefox-i18n-57.0/th.xpi) = 9d7cff5544312d33d44a2728f095e095e646ae2cd904e014fe69ca8016440884
SIZE (xpi/firefox-i18n-57.0/th.xpi) = 502450
SHA256 (xpi/firefox-i18n-57.0/tr.xpi) = fa1e8613954cae82fa460eb840af561df5857320a33ec5a1f8b032e3ed558dee
SIZE (xpi/firefox-i18n-57.0/tr.xpi) = 465580
SHA256 (xpi/firefox-i18n-57.0/uk.xpi) = b477818ae7061f7523625380e93fbe9bdfc385279e7e96cb06e98e6ed5915d86
SIZE (xpi/firefox-i18n-57.0/uk.xpi) = 518137
SHA256 (xpi/firefox-i18n-57.0/ur.xpi) = d9b3f9e18241a5abb31906792bae33c6b6b579631678c97236291e388e8bc195
SIZE (xpi/firefox-i18n-57.0/ur.xpi) = 511133
SHA256 (xpi/firefox-i18n-57.0/uz.xpi) = 4d4fe1f56e5c86f779753eed44f1b5d3f1cceb3a6f46950d175ed31c9f7ff39d
SIZE (xpi/firefox-i18n-57.0/uz.xpi) = 461693
SHA256 (xpi/firefox-i18n-57.0/vi.xpi) = ce81dbf85ddd901acb8c9cf7cfd331d2dfe6f4a7f5e4d799d664ff867bd5d40b
SIZE (xpi/firefox-i18n-57.0/vi.xpi) = 471319
SHA256 (xpi/firefox-i18n-57.0/xh.xpi) = be4d359e06a8a10cfda658a6e7c1e13ff857fd767d76882bedfd1aada3a6900c
SIZE (xpi/firefox-i18n-57.0/xh.xpi) = 464460
SHA256 (xpi/firefox-i18n-57.0/zh-CN.xpi) = 040736b596b614e55ac09aefa3e9f04211f16cb257ea0c2d274ca0df99b787b6
SIZE (xpi/firefox-i18n-57.0/zh-CN.xpi) = 483624
SHA256 (xpi/firefox-i18n-57.0/zh-TW.xpi) = fa5cf52246a289bc91d60519697977cbd6f999f5bda7eb715cb8303af543b752
SIZE (xpi/firefox-i18n-57.0/zh-TW.xpi) = 482346

View File

@ -2,27 +2,26 @@
# $FreeBSD$
PORTNAME= firefox
DISTVERSION= 56.0.2
DISTVERSION= 57.0
DISTVERSIONSUFFIX=.source
PORTREVISION= 10
PORTEPOCH= 1
CATEGORIES= www ipv6
MASTER_SITES= MOZILLA/${PORTNAME}/releases/${DISTVERSION}/source \
MOZILLA/${PORTNAME}/candidates/${DISTVERSION}-candidates/build1/source
MOZILLA/${PORTNAME}/candidates/${DISTVERSION}-candidates/build4/source
MAINTAINER= gecko@FreeBSD.org
COMMENT= Web browser based on the browser portion of Mozilla
BUILD_DEPENDS= nspr>=4.16:devel/nspr \
nss>=3.32.1:security/nss \
BUILD_DEPENDS= nspr>=4.17:devel/nspr \
nss>=3.33:security/nss \
icu>=59.1,1:devel/icu \
libevent>=2.1.8:devel/libevent \
harfbuzz>=1.4.7:print/harfbuzz \
harfbuzz>=1.5.1:print/harfbuzz \
graphite2>=1.3.10:graphics/graphite2 \
png>=1.6.31:graphics/png \
libvorbis>=1.3.5,3:audio/libvorbis \
libvpx>=1.5.0:multimedia/libvpx \
sqlite3>=3.19.3:databases/sqlite3 \
sqlite3>=3.20.1:databases/sqlite3 \
${PYTHON_PKGNAMEPREFIX}sqlite3>0:databases/py-sqlite3 \
v4l_compat>0:multimedia/v4l_compat \
autoconf-2.13:devel/autoconf213 \

View File

@ -1,3 +1,3 @@
TIMESTAMP = 1508873487
SHA256 (firefox-56.0.2.source.tar.xz) = 6f7d284c31383a9860d7b52f05f866526d5a7c31e3ef2959d79122ba074f5ca1
SIZE (firefox-56.0.2.source.tar.xz) = 255658916
TIMESTAMP = 1510498738
SHA256 (firefox-57.0.source.tar.xz) = 603af00155be87f2c9c58047dd0072971f1cdab1f632695aae6ad072efefbb8f
SIZE (firefox-57.0.source.tar.xz) = 250728772

View File

@ -1,148 +0,0 @@
commit 99ad73e4743d
Author: Jonathan Kew <jkew@mozilla.com>
Date: Sat Sep 16 11:49:47 2017 +0100
Bug 1399540 - patch 1 - Failure to decode an individual label within the IDN should not block decoding of other valid punycode labels. r=valentin
---
netwerk/dns/nsIDNService.cpp | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)
diff --git netwerk/dns/nsIDNService.cpp netwerk/dns/nsIDNService.cpp
index 9cc8fdcf6fa1..3adcddf654e1 100644
--- netwerk/dns/nsIDNService.cpp
+++ netwerk/dns/nsIDNService.cpp
@@ -300,6 +300,10 @@ nsresult nsIDNService::ACEtoUTF8(const nsACString & input, nsACString & _retval,
// RFC 3490 - 4.2 ToUnicode
// ToUnicode never fails. If any step fails, then the original input
// sequence is returned immediately in that step.
+ //
+ // Note that this refers to the decoding of a single label.
+ // ACEtoUTF8 may be called with a sequence of labels separated by dots;
+ // this test applies individually to each label.
uint32_t len = 0, offset = 0;
nsAutoCString decodedBuf;
@@ -313,13 +317,15 @@ nsresult nsIDNService::ACEtoUTF8(const nsACString & input, nsACString & _retval,
while (start != end) {
len++;
if (*start++ == '.') {
- if (NS_FAILED(decodeACE(Substring(input, offset, len - 1), decodedBuf,
- flag))) {
- _retval.Assign(input);
- return NS_OK;
+ nsDependentCSubstring origLabel(input, offset, len - 1);
+ if (NS_FAILED(decodeACE(origLabel, decodedBuf, flag))) {
+ // If decoding failed, use the original input sequence
+ // for this label.
+ _retval.Append(origLabel);
+ } else {
+ _retval.Append(decodedBuf);
}
- _retval.Append(decodedBuf);
_retval.Append('.');
offset += len;
len = 0;
@@ -327,11 +333,12 @@ nsresult nsIDNService::ACEtoUTF8(const nsACString & input, nsACString & _retval,
}
// decode the last node
if (len) {
- if (NS_FAILED(decodeACE(Substring(input, offset, len), decodedBuf,
- flag)))
- _retval.Assign(input);
- else
+ nsDependentCSubstring origLabel(input, offset, len);
+ if (NS_FAILED(decodeACE(origLabel, decodedBuf, flag))) {
+ _retval.Append(origLabel);
+ } else {
_retval.Append(decodedBuf);
+ }
}
return NS_OK;
commit eddd7a4f4eae
Author: Jonathan Kew <jkew@mozilla.com>
Date: Sat Sep 16 11:49:56 2017 +0100
Bug 1399540 - patch 2 - Handle invalid punycode better in stringPrep to avoid mangling display of fake-punycode labels. r=valentin
---
netwerk/dns/nsIDNService.cpp | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git netwerk/dns/nsIDNService.cpp netwerk/dns/nsIDNService.cpp
index 3adcddf654e1..4c45a2d52e45 100644
--- netwerk/dns/nsIDNService.cpp
+++ netwerk/dns/nsIDNService.cpp
@@ -222,7 +222,15 @@ nsIDNService::IDNA2008StringPrep(const nsAString& input,
}
NS_ENSURE_SUCCESS(rv, rv);
- // Output the result of nameToUnicode even if there were errors
+ // Output the result of nameToUnicode even if there were errors.
+ // But in the case of invalid punycode, the uidna_labelToUnicode result
+ // appears to get an appended U+FFFD REPLACEMENT CHARACTER, which will
+ // confuse our subsequent processing, so we drop that.
+ // (https://bugzilla.mozilla.org/show_bug.cgi?id=1399540#c9)
+ if ((info.errors & UIDNA_ERROR_PUNYCODE) &&
+ outLen > 0 && outputBuffer[outLen - 1] == 0xfffd) {
+ --outLen;
+ }
ICUUtils::AssignUCharArrayToString(outputBuffer, outLen, output);
if (flag == eStringPrepIgnoreErrors) {
commit 2a3883ef55d2
Author: Jonathan Kew <jkew@mozilla.com>
Date: Sat Sep 16 11:50:08 2017 +0100
Bug 1399540 - Add some IDN testcases with mixed punycode and non-punycode labels. r=valentin
---
netwerk/test/unit/test_idn_urls.js | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)
diff --git netwerk/test/unit/test_idn_urls.js netwerk/test/unit/test_idn_urls.js
index 358854093f65..0d8cf3216293 100644
--- netwerk/test/unit/test_idn_urls.js
+++ netwerk/test/unit/test_idn_urls.js
@@ -286,10 +286,17 @@ const testcases = [
// Thai (also tests that node with over 63 UTF-8 octets doesn't fail)
["เครื่องทําน้ําทําน้ําแข็ง",
"xn--22cdjb2fanb9fyepcbbb9dwh4a3igze4fdcd",
- false, true, true]
+ false, true, true],
+
+ // Effect of adding valid or invalid subdomains (bug 1399540)
+ ["䕮䕵䕶䕱.ascii", "xn--google.ascii", false, true, true],
+ ["ascii.䕮䕵䕶䕱", "ascii.xn--google", false, true, true],
+ ["中国123.䕮䕵䕶䕱", "xn--123-u68dy61b.xn--google", false, true, true],
+ ["䕮䕵䕶䕱.中国123", "xn--google.xn--123-u68dy61b", false, true, true],
+ ["xn--accountlogin.䕮䕵䕶䕱", "xn--accountlogin.xn--google", false, true, true],
+ ["䕮䕵䕶䕱.xn--accountlogin", "xn--google.xn--accountlogin", false, true, true],
];
-
const profiles = ["ASCII", "high", "moderate"];
function run_test() {
@@ -311,13 +318,13 @@ function run_test() {
var expectedUnicode = test[2 + i];
var isASCII = {};
- var result;
- try {
- result = idnService.convertToDisplayIDN(URL, isASCII);
- } catch(e) {
- result = ".com";
- }
- if (punycodeURL.substr(0, 4) == "xn--") {
+ var result;
+ try {
+ result = idnService.convertToDisplayIDN(URL, isASCII);
+ } catch(e) {
+ result = ".com";
+ }
+ if (punycodeURL.substr(0, 4) == "xn--" || punycodeURL.indexOf(".xn--") > 0) {
// test convertToDisplayIDN with a Unicode URL and with a
// Punycode URL if we have one
do_check_eq(escape(result),

View File

@ -1,25 +0,0 @@
commit deccfad4c8ba
Author: Matt Woodrow <mwoodrow@mozilla.com>
Date: Thu Oct 12 13:10:27 2017 +1300
Bug 1261175. r=tnikkel, a=ritu
--HG--
extra : source : 8281ed36bd4946af69af747b199814cc1a51fb52
---
view/nsViewManager.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git view/nsViewManager.cpp view/nsViewManager.cpp
index f3540f3478da..230512c0dcc0 100644
--- view/nsViewManager.cpp
+++ view/nsViewManager.cpp
@@ -100,7 +100,7 @@ nsViewManager::~nsViewManager()
gViewManagers = nullptr;
}
- mPresShell = nullptr;
+ MOZ_RELEASE_ASSERT(!mPresShell, "Releasing nsViewManager without having called Destroy on the PresShell!");
}
// We don't hold a reference to the presentation context because it

View File

@ -1,121 +0,0 @@
commit d9ad239a35bf
Author: Blake Kaplan <mrbkap@gmail.com>
Date: Wed Aug 16 16:39:32 2017 -0700
Bug 1325923 - Implement the "cookie averse document" concept. r=Ehsan
See https://html.spec.whatwg.org/multipage/dom.html#resource-metadata-management:cookie-averse-document-object
MozReview-Commit-ID: GndxqhU77cS
---
dom/base/nsIDocument.h | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git dom/base/nsIDocument.h dom/base/nsIDocument.h
index e834f5785cad..921e03e107d1 100644
--- dom/base/nsIDocument.h
+++ dom/base/nsIDocument.h
@@ -2073,6 +2073,34 @@ public:
return mMarkedCCGeneration;
}
+ /**
+ * Returns whether this document is cookie averse. See
+ * https://html.spec.whatwg.org/multipage/dom.html#cookie-averse-document-object
+ */
+ bool IsCookieAverse() const
+ {
+ // If we are a document that "has no browsing context."
+ if (!GetInnerWindow()) {
+ return true;
+ }
+
+ // If we are a document "whose URL's scheme is not a network scheme."
+ // NB: Explicitly allow file: URIs to store cookies.
+ nsCOMPtr<nsIURI> codebaseURI;
+ NodePrincipal()->GetURI(getter_AddRefs(codebaseURI));
+
+ if (!codebaseURI) {
+ return true;
+ }
+
+ nsAutoCString scheme;
+ codebaseURI->GetScheme(scheme);
+ return !scheme.EqualsLiteral("http") &&
+ !scheme.EqualsLiteral("https") &&
+ !scheme.EqualsLiteral("ftp") &&
+ !scheme.EqualsLiteral("file");
+ }
+
bool IsLoadedAsData()
{
return mLoadedAsData;
commit 10775852824c
Author: Blake Kaplan <mrbkap@gmail.com>
Date: Wed Aug 16 16:58:19 2017 -0700
Bug 1325923 - Use this new API. r=Ehsan
MozReview-Commit-ID: 6tuaEqQA551
---
dom/base/nsContentSink.cpp | 6 ++++++
1 file changed, 6 insertions(+)
diff --git dom/base/nsContentSink.cpp dom/base/nsContentSink.cpp
index c52761c8521f..c3e9f43846d4 100644
--- dom/base/nsContentSink.cpp
+++ dom/base/nsContentSink.cpp
@@ -843,6 +843,12 @@ nsContentSink::ProcessMETATag(nsIContent* aContent)
return NS_OK;
}
+ // Don't allow setting cookies in <meta http-equiv> in cookie averse
+ // documents.
+ if (nsGkAtoms::setcookie->Equals(header) && mDocument->IsCookieAverse()) {
+ return NS_OK;
+ }
+
nsAutoString result;
aContent->GetAttr(kNameSpaceID_None, nsGkAtoms::content, result);
if (!result.IsEmpty()) {
commit f48bc2cbf262
Author: Blake Kaplan <mrbkap@gmail.com>
Date: Wed Aug 16 17:22:31 2017 -0700
Bug 1325923 - Use this API where we're supposed to. r=Ehsan
MozReview-Commit-ID: HGU5YtUzv9U
---
dom/html/nsHTMLDocument.cpp | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git dom/html/nsHTMLDocument.cpp dom/html/nsHTMLDocument.cpp
index fa3d614854d9..b146698b6494 100644
--- dom/html/nsHTMLDocument.cpp
+++ dom/html/nsHTMLDocument.cpp
@@ -1347,6 +1347,11 @@ nsHTMLDocument::GetCookie(nsAString& aCookie, ErrorResult& rv)
return;
}
+ // If the document is a cookie-averse Document... return the empty string.
+ if (IsCookieAverse()) {
+ return;
+ }
+
// not having a cookie service isn't an error
nsCOMPtr<nsICookieService> service = do_GetService(NS_COOKIESERVICE_CONTRACTID);
if (service) {
@@ -1400,6 +1405,11 @@ nsHTMLDocument::SetCookie(const nsAString& aCookie, ErrorResult& rv)
return;
}
+ // If the document is a cookie-averse Document... do nothing.
+ if (IsCookieAverse()) {
+ return;
+ }
+
// not having a cookie service isn't an error
nsCOMPtr<nsICookieService> service = do_GetService(NS_COOKIESERVICE_CONTRACTID);
if (service && mDocumentURI) {

View File

@ -1,117 +0,0 @@
commit e215b167b9b9
Author: cku <cku@mozilla.com>
Date: Tue Oct 3 11:29:19 2017 +0800
Bug 1343147 - Do not double applying transform vector of the root frame in a glyph mask into the target context. r=mstange, a=ritu
When we generate the glyph mask for a transformed frame in
GenerateAndPushTextMask, the transform vector had been applied into aContext[1],
so we should find a way to prevent applying the vector again when painting the
glyph mask.
In bug 1299715, I tried to prevent double apply at [2], it caused two problems:
1. We only skip generating nsDisplayTransform, but we may still create a
nsDisplayPerspactive bellow. Since the parent of a nsDisplayPerspective must be
a nsDisplayTransform, which have been ignored, so we hit this assertion.
2. We skip all transform for all frames while painting the glyph mask, which is
not correct. We should only skip double applying transform vector of the root
frame.
This patch fixes both of these issues:
a. We will still create a nsDisplayTransform for the root frame if need. But
the transform matrix we apply into the target context will be an identity
matrix, so we fix #1 above.
b. In #a, we change the transform matrix to an identity matrix only for the root
frame of the glyph mask, so we fix #2.
[1]
https://hg.mozilla.org/mozilla-central/file/59e5ec5729db/layout/painting/nsDisplayList.cpp#l752
[2]
https://hg.mozilla.org/mozilla-central/file/ce2c129f0a87/layout/generic/nsFrame.cpp#l2806
MozReview-Commit-ID: 973lkQQxLB6
--HG--
extra : source : 84451d723686bc47b81c44ed2ddf6c61f3e35915
---
layout/generic/nsFrame.cpp | 13 +++++--------
layout/painting/nsDisplayList.cpp | 9 ++++++++-
2 files changed, 13 insertions(+), 9 deletions(-)
diff --git layout/generic/nsFrame.cpp layout/generic/nsFrame.cpp
index 37f2e2801220..dbfd61b7e142 100644
--- layout/generic/nsFrame.cpp
+++ layout/generic/nsFrame.cpp
@@ -2803,14 +2803,11 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder,
buildingDisplayList.SetReferenceFrameAndCurrentOffset(outerReferenceFrame,
GetOffsetToCrossDoc(outerReferenceFrame));
- if (!aBuilder->IsForGenerateGlyphMask() &&
- !aBuilder->IsForPaintingSelectionBG()) {
- nsDisplayTransform *transformItem =
- new (aBuilder) nsDisplayTransform(aBuilder, this,
- &resultList, dirtyRect, 0,
- allowAsyncAnimation);
- resultList.AppendNewToTop(transformItem);
- }
+ nsDisplayTransform *transformItem =
+ new (aBuilder) nsDisplayTransform(aBuilder, this,
+ &resultList, dirtyRect, 0,
+ allowAsyncAnimation);
+ resultList.AppendNewToTop(transformItem);
if (hasPerspective) {
if (clipCapturedBy == ContainerItemType::ePerspective) {
diff --git layout/painting/nsDisplayList.cpp layout/painting/nsDisplayList.cpp
index 801e1ea2fb4d..6477bda52f01 100644
--- layout/painting/nsDisplayList.cpp
+++ layout/painting/nsDisplayList.cpp
@@ -7976,11 +7976,18 @@ already_AddRefed<Layer> nsDisplayTransform::BuildLayer(nsDisplayListBuilder *aBu
LayerManager *aManager,
const ContainerLayerParameters& aContainerParameters)
{
+ // While generating a glyph mask, the transform vector of the root frame had
+ // been applied into the target context, so stop applying it again here.
+ const bool shouldSkipTransform =
+ (aBuilder->RootReferenceFrame() == mFrame) &&
+ (aBuilder->IsForGenerateGlyphMask() || aBuilder->IsForPaintingSelectionBG());
+
/* For frames without transform, it would not be removed for
* backface hidden here. But, it would be removed by the init
* function of nsDisplayTransform.
*/
- const Matrix4x4& newTransformMatrix = GetTransformForRendering();
+ const Matrix4x4 newTransformMatrix =
+ shouldSkipTransform ? Matrix4x4(): GetTransformForRendering();
uint32_t flags = FrameLayerBuilder::CONTAINER_ALLOW_PULL_BACKGROUND_COLOR;
RefPtr<ContainerLayer> container = aManager->GetLayerBuilder()->
diff --git dom/svg/crashtests/1343147.svg dom/svg/crashtests/1343147.svg
new file mode 100644
index 000000000000..d9c2611ca822
--- /dev/null
+++ dom/svg/crashtests/1343147.svg
@@ -0,0 +1,13 @@
+<svg xmlns="http://www.w3.org/2000/svg">
+<style>
+<![CDATA[
+ svg {
+ background-image: linear-gradient(lime, lime);
+ background-clip: text;
+ }
+ text { transform: skewy(30grad); }
+ g { perspective: 0; }
+]]>
+</style>
+ <g><text>hello</text></g>
+</svg>
diff --git dom/svg/crashtests/crashtests.list dom/svg/crashtests/crashtests.list
index 1727a206ec4f..57ab320161e2 100644
--- dom/svg/crashtests/crashtests.list
+++ dom/svg/crashtests/crashtests.list
@@ -90,4 +90,5 @@ load 1329849-5.svg
load 1329849-6.svg
load 1329093-1.html
load 1329093-2.html
+load 1343147.svg
load 1402798.html

View File

@ -1,262 +0,0 @@
commit e530ba4d4394
Author: Thomas Wisniewski <wisniewskit@gmail.com>
Date: Tue Jul 4 20:59:26 2017 -0400
Bug 1355576 - Add ability to clear all localStorage with the browsingData API; r=bsilverberg,janv
MozReview-Commit-ID: 4UUqg62yIo9
--HG--
extra : rebase_source : 9c6154bbe878fc3921d22027fdc90dbdaed05be9
---
browser/components/extensions/ext-browsingData.js | 10 +++
.../extensions/schemas/browsing_data.json | 1 -
.../extensions/test/browser/browser-common.ini | 1 +
.../browser_ext_browsingData_localStorage.js | 93 ++++++++++++++++++++++
.../test/xpcshell/test_ext_browsingData.js | 4 +-
dom/storage/LocalStorageManager.cpp | 3 +-
dom/storage/StorageObserver.cpp | 12 +++
.../extensions/schemas/browsing_data.json | 1 -
8 files changed, 120 insertions(+), 5 deletions(-)
diff --git browser/components/extensions/ext-browsingData.js browser/components/extensions/ext-browsingData.js
index fd59141dd15d..109ec9601487 100644
--- browser/components/extensions/ext-browsingData.js
+++ browser/components/extensions/ext-browsingData.js
@@ -83,6 +83,10 @@ const clearHistory = options => {
return sanitizer.items.history.clear(makeRange(options));
};
+const clearLocalStorage = async function(options) {
+ Services.obs.notifyObservers(null, "extension:purge-localStorage");
+};
+
const clearPasswords = async function(options) {
let loginManager = Services.logins;
let yieldCounter = 0;
@@ -152,6 +156,9 @@ const doRemoval = (options, dataToRemove, extension) => {
case "history":
removalPromises.push(clearHistory(options));
break;
+ case "localStorage":
+ removalPromises.push(clearLocalStorage(options));
+ break;
case "passwords":
removalPromises.push(clearPasswords(options));
break;
@@ -225,6 +232,9 @@ this.browsingData = class extends ExtensionAPI {
removeHistory(options) {
return doRemoval(options, {history: true});
},
+ removeLocalStorage(options) {
+ return doRemoval(options, {localStorage: true});
+ },
removePasswords(options) {
return doRemoval(options, {passwords: true});
},
diff --git browser/components/extensions/schemas/browsing_data.json browser/components/extensions/schemas/browsing_data.json
index a780f5640c8f..7755714eb898 100644
--- browser/components/extensions/schemas/browsing_data.json
+++ browser/components/extensions/schemas/browsing_data.json
@@ -341,7 +341,6 @@
"description": "Clears websites' local storage data.",
"type": "function",
"async": "callback",
- "unsupported": true,
"parameters": [
{
"$ref": "RemovalOptions",
diff --git browser/components/extensions/test/browser/browser-common.ini browser/components/extensions/test/browser/browser-common.ini
index 464b8ba18f37..e3f7700f3939 100644
--- browser/components/extensions/test/browser/browser-common.ini
+++ browser/components/extensions/test/browser/browser-common.ini
@@ -46,6 +46,7 @@ skip-if = (os == 'win' && !debug) # bug 1352668
[browser_ext_browserAction_theme_icons.js]
[browser_ext_browsingData_formData.js]
[browser_ext_browsingData_history.js]
+[browser_ext_browsingData_localStorage.js]
[browser_ext_browsingData_pluginData.js]
[browser_ext_browsingData_serviceWorkers.js]
[browser_ext_commands_execute_browser_action.js]
diff --git browser/components/extensions/test/browser/browser_ext_browsingData_localStorage.js browser/components/extensions/test/browser/browser_ext_browsingData_localStorage.js
new file mode 100644
index 000000000000..215f26d1fcb6
--- /dev/null
+++ browser/components/extensions/test/browser/browser_ext_browsingData_localStorage.js
@@ -0,0 +1,93 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+"use strict";
+
+add_task(async function testLocalStorage() {
+ async function background() {
+ function openTabs() {
+ let promise = new Promise(resolve => {
+ let tabURLs = [
+ "http://example.com/",
+ "http://example.net/",
+ ];
+
+ let tabs;
+ let waitingCount = tabURLs.length;
+
+ let listener = async msg => {
+ if (msg !== "content-script-ready" || --waitingCount) {
+ return;
+ }
+ browser.runtime.onMessage.removeListener(listener);
+ resolve(Promise.all(tabs));
+ };
+
+ browser.runtime.onMessage.addListener(listener);
+
+ tabs = tabURLs.map(url => {
+ return browser.tabs.create({url: url});
+ });
+ });
+
+ return promise;
+ }
+
+ function sendMessageToTabs(tabs, message) {
+ return Promise.all(
+ tabs.map(tab => { return browser.tabs.sendMessage(tab.id, message); }));
+ }
+
+ let tabs = await openTabs();
+
+ await sendMessageToTabs(tabs, "resetLocalStorage");
+ await sendMessageToTabs(tabs, "checkLocalStorageSet");
+ await browser.browsingData.removeLocalStorage({});
+ await sendMessageToTabs(tabs, "checkLocalStorageCleared");
+
+ await sendMessageToTabs(tabs, "resetLocalStorage");
+ await sendMessageToTabs(tabs, "checkLocalStorageSet");
+ await browser.browsingData.remove({}, {localStorage: true});
+ await sendMessageToTabs(tabs, "checkLocalStorageCleared");
+
+ browser.tabs.remove(tabs.map(tab => tab.id));
+
+ browser.test.notifyPass("done");
+ }
+
+ function contentScript() {
+ browser.runtime.onMessage.addListener(msg => {
+ if (msg === "resetLocalStorage") {
+ localStorage.clear();
+ localStorage.setItem("test", "test");
+ } else if (msg === "checkLocalStorageSet") {
+ browser.test.assertEq("test", localStorage.getItem("test"));
+ } else if (msg === "checkLocalStorageCleared") {
+ browser.test.assertEq(null, localStorage.getItem("test"));
+ }
+ });
+ browser.runtime.sendMessage("content-script-ready");
+ }
+
+ let extension = ExtensionTestUtils.loadExtension({
+ background,
+ manifest: {
+ "permissions": ["browsingData"],
+ "content_scripts": [{
+ "matches": [
+ "http://example.com/",
+ "http://example.net/",
+ ],
+ "js": ["content-script.js"],
+ "run_at": "document_start",
+ }],
+ },
+ files: {
+ "content-script.js": contentScript,
+ },
+ });
+
+ await extension.startup();
+ await extension.awaitFinish("done");
+ await extension.unload();
+});
+
diff --git browser/components/extensions/test/xpcshell/test_ext_browsingData.js browser/components/extensions/test/xpcshell/test_ext_browsingData.js
index 0c1c4874ca44..0b8972058e64 100644
--- browser/components/extensions/test/xpcshell/test_ext_browsingData.js
+++ browser/components/extensions/test/xpcshell/test_ext_browsingData.js
@@ -44,7 +44,7 @@ add_task(async function testInvalidArguments() {
add_task(async function testUnimplementedDataType() {
function background() {
- browser.browsingData.remove({}, {localStorage: true});
+ browser.browsingData.remove({}, {indexedDB: true});
browser.test.sendMessage("finished");
}
@@ -61,6 +61,6 @@ add_task(async function testUnimplementedDataType() {
await extension.unload();
});
- let warningObserved = messages.find(line => /Firefox does not support dataTypes: localStorage/.test(line));
+ let warningObserved = messages.find(line => /Firefox does not support dataTypes: indexedDB/.test(line));
ok(warningObserved, "Warning issued when calling remove with an unimplemented dataType.");
});
diff --git dom/storage/LocalStorageManager.cpp dom/storage/LocalStorageManager.cpp
index a161de2bc596..f366e7874a90 100644
--- dom/storage/LocalStorageManager.cpp
+++ dom/storage/LocalStorageManager.cpp
@@ -386,7 +386,8 @@ LocalStorageManager::Observe(const char* aTopic,
}
// Clear everything, caches + database
- if (!strcmp(aTopic, "cookie-cleared")) {
+ if (!strcmp(aTopic, "cookie-cleared") ||
+ !strcmp(aTopic, "extension:purge-localStorage-caches")) {
ClearCaches(LocalStorageCache::kUnloadComplete, pattern, EmptyCString());
return NS_OK;
}
diff --git dom/storage/StorageObserver.cpp dom/storage/StorageObserver.cpp
index e5b010f88c7b..48d484748209 100644
--- dom/storage/StorageObserver.cpp
+++ dom/storage/StorageObserver.cpp
@@ -66,6 +66,7 @@ StorageObserver::Init()
obs->AddObserver(sSelf, "browser:purge-domain-data", true);
obs->AddObserver(sSelf, "last-pb-context-exited", true);
obs->AddObserver(sSelf, "clear-origin-attributes-data", true);
+ obs->AddObserver(sSelf, "extension:purge-localStorage", true);
// Shutdown
obs->AddObserver(sSelf, "profile-after-change", true);
@@ -270,6 +271,23 @@ StorageObserver::Observe(nsISupports* aSubject,
Notify("session-only-cleared", NS_ConvertUTF8toUTF16(originSuffix),
originScope);
+
+ return NS_OK;
+ }
+
+ if (!strcmp(aTopic, "extension:purge-localStorage")) {
+ StorageDBChild* storageChild = StorageDBChild::GetOrCreate();
+ if (NS_WARN_IF(!storageChild)) {
+ return NS_ERROR_FAILURE;
+ }
+
+ storageChild->AsyncClearAll();
+
+ if (XRE_IsParentProcess()) {
+ storageChild->SendClearAll();
+ }
+
+ Notify("extension:purge-localStorage-caches");
return NS_OK;
}
diff --git mobile/android/components/extensions/schemas/browsing_data.json mobile/android/components/extensions/schemas/browsing_data.json
index 483a462d422c..1019c1a23953 100644
--- mobile/android/components/extensions/schemas/browsing_data.json
+++ mobile/android/components/extensions/schemas/browsing_data.json
@@ -345,7 +345,6 @@
"description": "Clears websites' local storage data.",
"type": "function",
"async": "callback",
- "unsupported": true,
"parameters": [
{
"$ref": "RemovalOptions",

View File

@ -1,60 +0,0 @@
commit 97515a9302ed
Author: James Cheng <jacheng@mozilla.com>
Date: Mon Oct 9 13:40:12 2017 -0400
Bug 1365894 - Make SystemGroupImpl be a normal ref-counted object. r=ehsan, a=ritu
MozReview-Commit-ID: LUcoBhNx2M5
--HG--
extra : source : 3959033a31666770047dd460979032464a48ba66
---
xpcom/threads/SystemGroup.cpp | 18 +++++-------------
1 file changed, 5 insertions(+), 13 deletions(-)
diff --git xpcom/threads/SystemGroup.cpp xpcom/threads/SystemGroup.cpp
index a95ecc6cdd77..04bf3bd248ef 100644
--- xpcom/threads/SystemGroup.cpp
+++ xpcom/threads/SystemGroup.cpp
@@ -16,7 +16,7 @@ class SystemGroupImpl final : public SchedulerGroup
{
public:
SystemGroupImpl();
- ~SystemGroupImpl() {}
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(SystemGroupImpl)
static void InitStatic();
static void ShutdownStatic();
@@ -24,20 +24,12 @@ public:
static bool Initialized() { return !!sSingleton; }
- NS_METHOD_(MozExternalRefCountType) AddRef(void)
- {
- return 2;
- }
- NS_METHOD_(MozExternalRefCountType) Release(void)
- {
- return 1;
- }
-
private:
- static UniquePtr<SystemGroupImpl> sSingleton;
+ ~SystemGroupImpl() = default;
+ static StaticRefPtr<SystemGroupImpl> sSingleton;
};
-UniquePtr<SystemGroupImpl> SystemGroupImpl::sSingleton;
+StaticRefPtr<SystemGroupImpl> SystemGroupImpl::sSingleton;
SystemGroupImpl::SystemGroupImpl()
{
@@ -49,7 +41,7 @@ SystemGroupImpl::InitStatic()
{
MOZ_ASSERT(!sSingleton);
MOZ_ASSERT(NS_IsMainThread());
- sSingleton = MakeUnique<SystemGroupImpl>();
+ sSingleton = new SystemGroupImpl();
}
/* static */ void

View File

@ -1,128 +0,0 @@
commit dfe9efffb57b
Author: Marco Bonardo <mbonardo@mozilla.com>
Date: Wed Oct 4 11:13:19 2017 +0200
Bug 1366420. r=standard8, a=ritu
MozReview-Commit-ID: FOIqr5RdRjz
--HG--
extra : source : 08312cdfb2304264e6871357fe2e6e7831272d21
---
toolkit/components/places/BookmarkHTMLUtils.jsm | 2 +-
.../unit/test_bookmarks_html_escape_entities.js | 81 ++++++++++++++++++++++
toolkit/components/places/tests/unit/xpcshell.ini | 1 +
3 files changed, 83 insertions(+), 1 deletion(-)
diff --git toolkit/components/places/BookmarkHTMLUtils.jsm toolkit/components/places/BookmarkHTMLUtils.jsm
index 653e29fc5875..f4c1e7495d32 100644
--- toolkit/components/places/BookmarkHTMLUtils.jsm
+++ toolkit/components/places/BookmarkHTMLUtils.jsm
@@ -1143,7 +1143,7 @@ BookmarkExporter.prototype = {
if (aItem.charset)
this._writeAttribute("LAST_CHARSET", escapeHtmlEntities(aItem.charset));
if (aItem.tags)
- this._writeAttribute("TAGS", aItem.tags);
+ this._writeAttribute("TAGS", escapeHtmlEntities(aItem.tags));
this._writeLine(">" + escapeHtmlEntities(aItem.title) + "</A>");
this._writeDescription(aItem, aIndent);
},
diff --git toolkit/components/places/tests/unit/test_bookmarks_html_escape_entities.js toolkit/components/places/tests/unit/test_bookmarks_html_escape_entities.js
new file mode 100644
index 000000000000..73c5e0e0744d
--- /dev/null
+++ toolkit/components/places/tests/unit/test_bookmarks_html_escape_entities.js
@@ -0,0 +1,81 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+// Checks that html entities are escaped in bookmarks.html files.
+
+const DESCRIPTION_ANNO = "bookmarkProperties/description";
+
+add_task(async function() {
+ // Removes bookmarks.html if the file already exists.
+ let HTMLFile = OS.Path.join(OS.Constants.Path.profileDir, "bookmarks.html");
+ if ((await OS.File.exists(HTMLFile))) {
+ await OS.File.remove(HTMLFile);
+ }
+
+ let unescaped = '<unescaped="test">';
+ // Adds bookmarks and tags to the database.
+ const url = 'http://www.google.it/"/';
+ let bm = await PlacesUtils.bookmarks.insert({
+ parentGuid: PlacesUtils.bookmarks.unfiledGuid,
+ url,
+ title: unescaped
+ });
+ await PlacesUtils.keywords.insert({ url, keyword: unescaped, postData: unescaped })
+ let uri = Services.io.newURI(url);
+ PlacesUtils.tagging.tagURI(uri, [unescaped]);
+ await PlacesUtils.setCharsetForURI(uri, unescaped);
+ PlacesUtils.annotations.setItemAnnotation(
+ await PlacesUtils.promiseItemId(bm.guid),
+ DESCRIPTION_ANNO, unescaped, 0, PlacesUtils.annotations.EXPIRE_NEVER);
+
+ // Exports the bookmarks as a HTML file.
+ await BookmarkHTMLUtils.exportToFile(HTMLFile);
+ await PlacesUtils.bookmarks.remove(bm);
+
+ // Check there are no unescaped entities in the html file.
+ let xml = await new Promise((resolve, reject) => {
+ let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
+ .createInstance(Ci.nsIXMLHttpRequest);
+ xhr.onload = () => {
+ try {
+ resolve(xhr.responseXML);
+ } catch (e) {
+ reject(e);
+ }
+ };
+ xhr.onabort = xhr.onerror = xhr.ontimeout = () => {
+ reject(new Error("xmlhttprequest failed"));
+ };
+ xhr.open("GET", OS.Path.toFileURI(HTMLFile));
+ xhr.responseType = "document";
+ xhr.overrideMimeType("text/html");
+ xhr.send();
+ });
+
+ let checksCount = 6;
+ for (let current = xml; current;
+ current = current.firstChild || current.nextSibling || current.parentNode.nextSibling) {
+ switch (current.nodeType) {
+ case Ci.nsIDOMNode.ELEMENT_NODE:
+ for (let {name, value} of current.attributes) {
+ do_print("Found attribute: " + name);
+ // Check tags, keyword, postData and charSet.
+ if (["tags", "last_charset", "shortcuturl", "post_data"].includes(name)) {
+ Assert.equal(value, unescaped, `Attribute ${name} should be complete`);
+ checksCount--;
+ }
+ }
+ break;
+ case Ci.nsIDOMNode.TEXT_NODE:
+ // Check Title and description.
+ if (!current.data.startsWith("\n") && !current.data.includes("Bookmarks")) {
+ Assert.equal(current.data.trim(), unescaped, "Text node should be complete");
+ checksCount--;
+ }
+ break;
+ }
+ }
+ Assert.equal(checksCount, 0, "All the checks ran")
+});
diff --git toolkit/components/places/tests/unit/xpcshell.ini toolkit/components/places/tests/unit/xpcshell.ini
index 6952e4158753..776e7e548f92 100644
--- toolkit/components/places/tests/unit/xpcshell.ini
+++ toolkit/components/places/tests/unit/xpcshell.ini
@@ -67,6 +67,7 @@ skip-if = (os == "win" && os_version == "5.1") # Bug 1158887
[test_bookmarks_json.js]
[test_bookmarks_html.js]
[test_bookmarks_html_corrupt.js]
+[test_bookmarks_html_escape_entities.js]
[test_bookmarks_html_import_tags.js]
[test_bookmarks_html_singleframe.js]
[test_bookmarks_restore_notification.js]

View File

@ -1,66 +0,0 @@
commit 4a1737e0c456
Author: David Keeler <dkeeler@mozilla.com>
Date: Fri Sep 15 14:47:54 2017 -0700
Bug 1369561 - Address misc. SnprintfLiteral correctness nits. r=jld, r=froydnj, a=ritu
--HG--
extra : source : f5533b6cd09c35eef381e311940b5bd5231d3553
---
security/sandbox/linux/SandboxUtil.cpp | 17 ++++++++++-------
xpcom/base/nsSystemInfo.cpp | 2 +-
2 files changed, 11 insertions(+), 8 deletions(-)
diff --git security/sandbox/linux/SandboxUtil.cpp security/sandbox/linux/SandboxUtil.cpp
index ad6003ecaad5..999329882364 100644
--- security/sandbox/linux/SandboxUtil.cpp
+++ security/sandbox/linux/SandboxUtil.cpp
@@ -62,7 +62,6 @@ UnshareUserNamespace()
uid_t uid = getuid();
gid_t gid = getgid();
char buf[80];
- size_t len;
if (syscall(__NR_unshare, CLONE_NEWUSER) != 0) {
return false;
@@ -84,17 +83,21 @@ UnshareUserNamespace()
// current thread. However, CLONE_NEWUSER can be unshared only in a
// single-threaded process, so those are equivalent if we reach this
// point.
- len = size_t(SprintfLiteral(buf, "%u %u 1\n", uid, uid));
- MOZ_ASSERT(len < sizeof(buf));
- if (!WriteStringToFile("/proc/self/uid_map", buf, len)) {
+ int len = SprintfLiteral(buf, "%u %u 1\n", uid, uid);
+ if (len >= int(sizeof(buf)) || len < 0) {
+ return false;
+ }
+ if (!WriteStringToFile("/proc/self/uid_map", buf, size_t(len))) {
MOZ_CRASH("Failed to write /proc/self/uid_map");
}
Unused << WriteStringToFile("/proc/self/setgroups", "deny", 4);
- len = size_t(SprintfLiteral(buf, "%u %u 1\n", gid, gid));
- MOZ_ASSERT(len < sizeof(buf));
- if (!WriteStringToFile("/proc/self/gid_map", buf, len)) {
+ len = SprintfLiteral(buf, "%u %u 1\n", gid, gid);
+ if (len >= int(sizeof(buf)) || len < 0) {
+ return false;
+ }
+ if (!WriteStringToFile("/proc/self/gid_map", buf, size_t(len))) {
MOZ_CRASH("Failed to write /proc/self/gid_map");
}
return true;
diff --git xpcom/base/nsSystemInfo.cpp xpcom/base/nsSystemInfo.cpp
index e5a7fe97be03..782dc9abf37d 100644
--- xpcom/base/nsSystemInfo.cpp
+++ xpcom/base/nsSystemInfo.cpp
@@ -706,7 +706,7 @@ nsSystemInfo::Init()
}
nsAutoCString secondaryLibrary;
- if (gtkver_len > 0) {
+ if (gtkver_len > 0 && gtkver_len < int(sizeof(gtkver))) {
secondaryLibrary.Append(nsDependentCSubstring(gtkver, gtkver_len));
}

View File

@ -1,100 +0,0 @@
commit c79086d4c25c
Author: Jonathan Kew <jkew@mozilla.com>
Date: Wed Sep 27 11:16:35 2017 +0100
Bug 1370497 - Check ScriptExtensions property of combining marks when available. r=valentin, a=ritu
--HG--
extra : source : 6bd2d96c0c3d952b205e1bb2f6915cbc820a61a1
extra : amend_source : b0c6b6fbea0bf77c8d1527e131d3773b4d959ea0
---
netwerk/dns/nsIDNService.cpp | 45 ++++++++++++++++++++++++++++++++------
netwerk/test/unit/test_idn_urls.js | 5 +++++
2 files changed, 43 insertions(+), 7 deletions(-)
diff --git netwerk/dns/nsIDNService.cpp netwerk/dns/nsIDNService.cpp
index 4c45a2d52e45..e07910a7e70d 100644
--- netwerk/dns/nsIDNService.cpp
+++ netwerk/dns/nsIDNService.cpp
@@ -26,6 +26,7 @@
const bool kIDNA2008_TransitionalProcessing = false;
#include "ICUUtils.h"
+#include "unicode/uscript.h"
#endif
using namespace mozilla::unicode;
@@ -900,8 +901,8 @@ bool nsIDNService::isLabelSafe(const nsAString &label)
}
// Check for mixed numbering systems
- if (GetGeneralCategory(ch) ==
- HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER) {
+ auto genCat = GetGeneralCategory(ch);
+ if (genCat == HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER) {
uint32_t zeroCharacter = ch - GetNumericValue(ch);
if (savedNumberingSystem == 0) {
// If we encounter a decimal number, save the zero character from that
@@ -912,11 +913,41 @@ bool nsIDNService::isLabelSafe(const nsAString &label)
}
}
- // Check for consecutive non-spacing marks
- if (previousChar != 0 &&
- previousChar == ch &&
- GetGeneralCategory(ch) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) {
- return false;
+ if (genCat == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) {
+ // Check for consecutive non-spacing marks.
+ if (previousChar != 0 && previousChar == ch) {
+ return false;
+ }
+ // Check for marks whose expected script doesn't match the base script.
+ if (lastScript != Script::INVALID) {
+ const size_t kMaxScripts = 32; // more than ample for current values
+ // of ScriptExtensions property
+ UScriptCode scripts[kMaxScripts];
+ UErrorCode errorCode = U_ZERO_ERROR;
+ int nScripts = uscript_getScriptExtensions(ch, scripts, kMaxScripts,
+ &errorCode);
+ MOZ_ASSERT(U_SUCCESS(errorCode), "uscript_getScriptExtensions failed");
+ if (U_FAILURE(errorCode)) {
+ return false;
+ }
+ // nScripts will always be >= 1, because even for undefined characters
+ // uscript_getScriptExtensions will return Script::INVALID.
+ // If the mark just has script=COMMON or INHERITED, we can't check any
+ // more carefully, but if it has specific scriptExtension codes, then
+ // assume those are the only valid scripts to use it with.
+ if (nScripts > 1 ||
+ (Script(scripts[0]) != Script::COMMON &&
+ Script(scripts[0]) != Script::INHERITED)) {
+ while (--nScripts >= 0) {
+ if (Script(scripts[nScripts]) == lastScript) {
+ break;
+ }
+ }
+ if (nScripts == -1) {
+ return false;
+ }
+ }
+ }
}
// Simplified/Traditional Chinese check temporarily disabled -- bug 857481
diff --git netwerk/test/unit/test_idn_urls.js netwerk/test/unit/test_idn_urls.js
index 0d8cf3216293..f39a9650a13b 100644
--- netwerk/test/unit/test_idn_urls.js
+++ netwerk/test/unit/test_idn_urls.js
@@ -295,6 +295,11 @@ const testcases = [
["䕮䕵䕶䕱.中国123", "xn--google.xn--123-u68dy61b", false, true, true],
["xn--accountlogin.䕮䕵䕶䕱", "xn--accountlogin.xn--google", false, true, true],
["䕮䕵䕶䕱.xn--accountlogin", "xn--google.xn--accountlogin", false, true, true],
+
+ // Arabic diacritic not allowed in Latin text (bug 1370497)
+ ["goo\u0650gle", "xn--google-yri", false, false, false],
+ // ...but Arabic diacritics are allowed on Arabic text
+ ["العَرَبِي", "xn--mgbc0a5a6cxbzabt", false, true, true],
];
const profiles = ["ASCII", "high", "moderate"];

View File

@ -1,37 +0,0 @@
commit b481800095d4
Author: Stone Shih <sshih@mozilla.com>
Date: Tue Sep 19 15:41:52 2017 +0800
Bug 1375146 - Revise sending drag event. r=smaug, a=ritu
--HG--
extra : source : d4496b8befbf0ef5ae124a9fbda37ad5b885f9e1
---
dom/events/EventStateManager.cpp | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git dom/events/EventStateManager.cpp dom/events/EventStateManager.cpp
index b94dc0c88e01..1f48884058de 100644
--- dom/events/EventStateManager.cpp
+++ dom/events/EventStateManager.cpp
@@ -1292,8 +1292,9 @@ EventStateManager::DispatchCrossProcessEvent(WidgetEvent* aEvent,
return;
}
case eDragEventClass: {
- if (remote->Manager()->IsContentParent()) {
- remote->Manager()->AsContentParent()->MaybeInvokeDragSession(remote);
+ RefPtr<TabParent> tabParent = remote;
+ if (tabParent->Manager()->IsContentParent()) {
+ tabParent->Manager()->AsContentParent()->MaybeInvokeDragSession(tabParent);
}
nsCOMPtr<nsIDragSession> dragSession = nsContentUtils::GetDragSession();
@@ -1309,7 +1310,7 @@ EventStateManager::DispatchCrossProcessEvent(WidgetEvent* aEvent,
}
}
- remote->SendRealDragEvent(*aEvent->AsDragEvent(), action, dropEffect);
+ tabParent->SendRealDragEvent(*aEvent->AsDragEvent(), action, dropEffect);
return;
}
case ePluginEventClass: {

View File

@ -1,929 +0,0 @@
commit 2b68b38709b1
Author: Andrew McCreight <continuation@gmail.com>
Date: Tue Aug 22 14:24:11 2017 -0700
Bug 1377587, part 1 - Always act like __exposedProps__ is missing. r=krizsa
This patch gently removes support for __exposedProps__ by changing
ExposedPropertiesOnly::check() to always return false, while still
failing silently in deny for some kinds of access.
The tests that I changed all involve testing the behavior with
__exposedProps__. I adjusted them to expect it to fail, or to adjust
the error message they get when they fail. That seemed better than
deleting them entirely.
Note that test_bug1065185.html had a bug, so that it never executed
the first case. I fixed that, and then fixed up the test to work when
__exposedProps__ is not supported.
This also removes various bits of the test framework that use
__exposedProps__, but don't actually need to.
MozReview-Commit-ID: 8fvkAmITmXY
--HG--
extra : rebase_source : ef7e2c55adc12511f17f3865ebb46c343875f0b3
---
addon-sdk/source/lib/sdk/console/plain-text.js | 10 --
addon-sdk/source/lib/sdk/test/loader.js | 5 -
.../addons/e10s-content/lib/test-content-script.js | 6 +-
addon-sdk/source/test/test-content-script.js | 6 +-
devtools/server/tests/unit/test_objectgrips-17.js | 4 -
dom/base/nsDeprecatedOperationList.h | 1 -
dom/base/test/chrome/cpows_child.js | 12 +-
dom/locales/en-US/chrome/dom/dom.properties | 2 -
js/xpconnect/src/XPCJSRuntime.cpp | 1 -
js/xpconnect/src/xpcprivate.h | 1 -
js/xpconnect/tests/chrome/test_bug1065185.html | 6 +-
js/xpconnect/tests/chrome/test_cows.xul | 80 +++------
js/xpconnect/tests/chrome/test_exposeInDerived.xul | 13 +-
js/xpconnect/tests/unit/test_bug1082450.js | 20 +--
js/xpconnect/tests/unit/test_bug780370.js | 7 +-
js/xpconnect/tests/unit/test_bug813901.js | 2 +-
js/xpconnect/tests/unit/test_bug853709.js | 4 +-
js/xpconnect/tests/unit/test_bug854558.js | 2 +-
js/xpconnect/tests/unit/test_bug930091.js | 2 +-
js/xpconnect/wrappers/AccessCheck.cpp | 179 ---------------------
js/xpconnect/wrappers/AccessCheck.h | 11 +-
js/xpconnect/wrappers/ChromeObjectWrapper.h | 6 +-
js/xpconnect/wrappers/WrapperFactory.cpp | 4 +-
js/xpconnect/wrappers/XrayWrapper.cpp | 2 +-
testing/mochitest/tests/SimpleTest/ChromePowers.js | 9 --
.../specialpowers/content/MockPermissionPrompt.jsm | 12 --
.../components/addoncompat/RemoteAddonsParent.jsm | 2 +-
27 files changed, 74 insertions(+), 335 deletions(-)
diff --git addon-sdk/source/lib/sdk/console/plain-text.js addon-sdk/source/lib/sdk/console/plain-text.js
index 0e44cf106d52..07b8eb629e12 100644
--- addon-sdk/source/lib/sdk/console/plain-text.js
+++ addon-sdk/source/lib/sdk/console/plain-text.js
@@ -62,16 +62,6 @@ function PlainTextConsole(print, innerID) {
}
});
- // We defined the `__exposedProps__` in our console chrome object.
- //
- // Meanwhile we're investigating with the platform team if `__exposedProps__`
- // are needed, or are just a left-over.
-
- console.__exposedProps__ = Object.keys(ConsoleAPI.prototype).reduce(function(exposed, prop) {
- exposed[prop] = "r";
- return exposed;
- }, {});
-
Object.freeze(console);
return console;
};
diff --git addon-sdk/source/lib/sdk/test/loader.js addon-sdk/source/lib/sdk/test/loader.js
index 33ba2ca5a029..b555de63f02a 100644
--- addon-sdk/source/lib/sdk/test/loader.js
+++ addon-sdk/source/lib/sdk/test/loader.js
@@ -53,11 +53,6 @@ function HookedPlainTextConsole(hook, print, innerID) {
this.exception = hook.bind(null, "exception", innerID);
this.time = hook.bind(null, "time", innerID);
this.timeEnd = hook.bind(null, "timeEnd", innerID);
-
- this.__exposedProps__ = {
- log: "rw", info: "rw", warn: "rw", error: "rw", debug: "rw",
- exception: "rw", time: "rw", timeEnd: "rw"
- };
}
// Creates a custom loader instance whose console module is hooked in order
diff --git addon-sdk/source/test/addons/e10s-content/lib/test-content-script.js addon-sdk/source/test/addons/e10s-content/lib/test-content-script.js
index 477895e40481..3dccfec618d3 100644
--- addon-sdk/source/test/addons/e10s-content/lib/test-content-script.js
+++ addon-sdk/source/test/addons/e10s-content/lib/test-content-script.js
@@ -444,7 +444,7 @@ exports["test Highlight toString Behavior"] = createProxyTest("", function (help
let strToString = helper.rawWindow.Object.prototype.toString.call("");
assert.ok(/\[object String.*\]/.test(strToString), "strings are strings");
- let o = {__exposedProps__:{}};
+ let o = {};
let objToString = helper.rawWindow.Object.prototype.toString.call(o);
assert.ok(/\[object Object.*\]/.test(objToString), "objects are objects");
@@ -622,10 +622,6 @@ exports["test Functions"] = createProxyTest("", function (helper) {
helper.rawWindow.isEqual = function isEqual(a, b) {
return a == b;
};
- // bug 784116: workaround in order to allow proxy code to cache proxies on
- // these functions:
- helper.rawWindow.callFunction.__exposedProps__ = {__proxy: 'rw'};
- helper.rawWindow.isEqual.__exposedProps__ = {__proxy: 'rw'};
helper.createWorker(
'new ' + function ContentScriptScope() {
diff --git addon-sdk/source/test/test-content-script.js addon-sdk/source/test/test-content-script.js
index 709fb5a3aa91..a02e66f65eea 100644
--- addon-sdk/source/test/test-content-script.js
+++ addon-sdk/source/test/test-content-script.js
@@ -444,7 +444,7 @@ exports["test Highlight toString Behavior"] = createProxyTest("", function (help
let strToString = helper.rawWindow.Object.prototype.toString.call("");
assert.ok(/\[object String.*\]/.test(strToString), "strings are strings");
- let o = {__exposedProps__:{}};
+ let o = {};
let objToString = helper.rawWindow.Object.prototype.toString.call(o);
assert.ok(/\[object Object.*\]/.test(objToString), "objects are objects");
@@ -622,10 +622,6 @@ exports["test Functions"] = createProxyTest("", function (helper) {
helper.rawWindow.isEqual = function isEqual(a, b) {
return a == b;
};
- // bug 784116: workaround in order to allow proxy code to cache proxies on
- // these functions:
- helper.rawWindow.callFunction.__exposedProps__ = {__proxy: 'rw'};
- helper.rawWindow.isEqual.__exposedProps__ = {__proxy: 'rw'};
helper.createWorker(
'new ' + function ContentScriptScope() {
diff --git dom/base/nsDeprecatedOperationList.h dom/base/nsDeprecatedOperationList.h
index 2523187c63a7..adcf4d9d8202 100644
--- dom/base/nsDeprecatedOperationList.h
+++ dom/base/nsDeprecatedOperationList.h
@@ -21,7 +21,6 @@ DEPRECATED_OPERATION(NodeValue)
DEPRECATED_OPERATION(TextContent)
DEPRECATED_OPERATION(EnablePrivilege)
DEPRECATED_OPERATION(DOMExceptionCode)
-DEPRECATED_OPERATION(NoExposedProps)
DEPRECATED_OPERATION(MutationEvent)
DEPRECATED_OPERATION(Components)
DEPRECATED_OPERATION(PrefixedVisibilityAPI)
diff --git dom/base/test/chrome/cpows_child.js dom/base/test/chrome/cpows_child.js
index 6d240a7eaa51..fc7e3f2c9d0f 100644
--- dom/base/test/chrome/cpows_child.js
+++ dom/base/test/chrome/cpows_child.js
@@ -105,7 +105,13 @@ function parent_test(finish)
addMessageListener("cpows:from_parent", (msg) => {
let obj = msg.objects.obj;
- ok(obj.a == 1, "correct value from parent");
+ if (is_remote) {
+ ok(obj.a == undefined, "__exposedProps__ should not work");
+ } else {
+ // The same process test is not run as content, so the field can
+ // be accessed even though __exposedProps__ has been removed.
+ ok(obj.a == 1, "correct value from parent");
+ }
// Test that a CPOW reference to a function in the chrome process
// is callable from unprivileged content. Greasemonkey uses this
@@ -260,11 +266,11 @@ function lifetime_test(finish)
var obj = {"will_die": {"f": 1}};
let [result] = sendRpcMessage("cpows:lifetime_test_1", {}, {obj: obj});
ok(result == 10, "got sync result");
- ok(obj.wont_die.f == 2, "got reverse CPOW");
+ ok(obj.wont_die.f == undefined, "got reverse CPOW");
obj.will_die = null;
Components.utils.schedulePreciseGC(function() {
addMessageListener("cpows:lifetime_test_3", (msg) => {
- ok(obj.wont_die.f == 2, "reverse CPOW still works");
+ ok(obj.wont_die.f == undefined, "reverse CPOW still works");
finish();
});
sendRpcMessage("cpows:lifetime_test_2");
diff --git dom/locales/en-US/chrome/dom/dom.properties dom/locales/en-US/chrome/dom/dom.properties
index 5c94a580287a..ac9dbed58e08 100644
--- dom/locales/en-US/chrome/dom/dom.properties
+++ dom/locales/en-US/chrome/dom/dom.properties
@@ -154,8 +154,6 @@ MediaEMENoCapabilitiesDeprecatedWarning=Calling navigator.requestMediaKeySystemA
MediaEMENoCodecsDeprecatedWarning=Calling navigator.requestMediaKeySystemAccess() (at %S) passing a candidate MediaKeySystemConfiguration containing audioCapabilities or videoCapabilities without a contentType with a “codecs” string is deprecated and will soon become unsupported.
# LOCALIZATION NOTE: Do not translate "DOMException", "code" and "name"
DOMExceptionCodeWarning=Use of DOMExceptions code attribute is deprecated. Use name instead.
-# LOCALIZATION NOTE: Do not translate "__exposedProps__"
-NoExposedPropsWarning=Exposing chrome JS objects to content without __exposedProps__ is insecure and deprecated. See https://developer.mozilla.org/en/XPConnect_wrappers for more information.
# LOCALIZATION NOTE: Do not translate "Mutation Event" and "MutationObserver"
MutationEventWarning=Use of Mutation Events is deprecated. Use MutationObserver instead.
# LOCALIZATION NOTE: Do not translate "Components"
diff --git js/xpconnect/src/XPCJSRuntime.cpp js/xpconnect/src/XPCJSRuntime.cpp
index 455b9f8e963f..ff9aea0a41eb 100644
--- js/xpconnect/src/XPCJSRuntime.cpp
+++ js/xpconnect/src/XPCJSRuntime.cpp
@@ -93,7 +93,6 @@ const char* const XPCJSRuntime::mStrings[] = {
"item", // IDX_ITEM
"__proto__", // IDX_PROTO
"__iterator__", // IDX_ITERATOR
- "__exposedProps__", // IDX_EXPOSEDPROPS
"eval", // IDX_EVAL
"controllers", // IDX_CONTROLLERS
"Controllers", // IDX_CONTROLLERS_CLASS
diff --git js/xpconnect/src/xpcprivate.h js/xpconnect/src/xpcprivate.h
index fb7e43c22cd0..5d877f09d301 100644
--- js/xpconnect/src/xpcprivate.h
+++ js/xpconnect/src/xpcprivate.h
@@ -460,7 +460,6 @@ public:
IDX_ITEM ,
IDX_PROTO ,
IDX_ITERATOR ,
- IDX_EXPOSEDPROPS ,
IDX_EVAL ,
IDX_CONTROLLERS ,
IDX_CONTROLLERS_CLASS ,
diff --git js/xpconnect/tests/chrome/test_bug1065185.html js/xpconnect/tests/chrome/test_bug1065185.html
index cdd65326f9c8..7ea81fc8aa6f 100644
--- js/xpconnect/tests/chrome/test_bug1065185.html
+++ js/xpconnect/tests/chrome/test_bug1065185.html
@@ -25,11 +25,11 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1065185
var gLoadCount = 0;
function loaded() {
- switch(++gLoadCount) {
+ switch(gLoadCount++) {
case 0:
- doMonitor([]);
+ doMonitor([/access to property "a"/i]);
window[0].wrappedJSObject.probe = { a: 2, __exposedProps__: { 'a': 'r' } };
- is(window[0].eval('probe.a'), 2, "Accessed exposed prop");
+ is(window[0].eval('probe.a'), undefined, "Accessed exposed prop");
endMonitor();
break;
case 1:
diff --git js/xpconnect/tests/chrome/test_cows.xul js/xpconnect/tests/chrome/test_cows.xul
index 75c5250dd150..adfdd686540b 100644
--- js/xpconnect/tests/chrome/test_cows.xul
+++ js/xpconnect/tests/chrome/test_cows.xul
@@ -49,13 +49,6 @@ sandbox.getCOW = getCOW;
const TEST_API = ['is', 'isnot', 'ok', 'todo_is', 'todo_isnot', 'todo'];
TEST_API.forEach(function(name) { sandbox[name] = window[name]; });
-sandbox.alienObject = {
- __exposedProps__: {funProp: 'r'},
- funProp: function foo(x) {
- return x + 1;
- }
-};
-
sandbox.chromeGet = function (obj, prop) { return obj[prop]; };
function COWTests() {
@@ -74,17 +67,6 @@ function COWTests() {
// functions like assertIsWritable(myObj, 'someproperty') might
// be useful.
- function isProp(obj, propName, value, desc) {
- try {
- is(obj[propName], value, "getting " + propName + " on " + desc);
- ok(propName in obj,
- propName + " on " + desc + " should exist");
- ok(Object.hasOwnProperty.call(obj, propName),
- propName + " on " + desc + " should exist");
- } catch (e) {
- ok(false, "getting " + propName + " on " + desc + " threw " + e);
- }
- }
function isPropHidden(obj, propName, desc) {
try {
is(obj[propName], undefined,
@@ -103,7 +85,7 @@ function COWTests() {
var empty = {};
var nonempty = {foo: 42, bar: 33};
is(getCOW(empty).foo, undefined,
- "shouldn't throw when accessing exposed properties that doesn't exist");
+ "shouldn't throw when accessing exposed properties that don't exist");
PROPS_TO_TEST.forEach(function(name) {
isPropHidden(getCOW(nonempty), name, "object without exposedProps");
@@ -135,18 +117,12 @@ function COWTests() {
var strict = { __exposedProps__: { foo: "r" }, foo: "foo property" };
var strictCOWr = getCOW(strict);
PROPS_TO_TEST.forEach(function(name) {
- if (name == "foo") {
- isProp(strictCOWr, name, "foo property",
- "object with exposed 'foo'");
- }
- else {
- isPropHidden(strictCOW, name, "object with exposed 'foo'");
- }
+ isPropHidden(strictCOW, name, "object with exposed 'foo'");
});
- is(getNames(strictCOWr).length, 1,
- "object with exposedProps only enumerate exposed props");
- is(getNames(strictCOWr)[0], "foo",
- "object with exposedProps only enumerate exposed props");
+ is(getNames(strictCOWr).length, 0,
+ "exposed props does not enumerate anything");
+ is(getNames(strictCOWr)[0], undefined,
+ "exposed props does not enumerate anything");
// Test writable property
var writable = getCOW({ __exposedProps__: {foo: 'w'}});
@@ -154,25 +130,18 @@ function COWTests() {
ok(!("foo" in writable),
"non-existing write-only property shouldn't exist");
writable.foo = 5;
- is(chromeGet(writable, "foo"), 5, "writing to a write-only exposed prop works");
- todo("foo" in writable,
- "existing write-only property should exist");
- } catch (e) {
- ok(false, "writing to a write-only exposed prop shouldn't throw " + e);
- }
- try {
- writable.foo;
- todo(false, "reading from a write-only exposed prop should throw");
+ ok(false, "writing to a write-only exposed prop should throw");
} catch (e) {
- todo(/Permission denied/.test(e),
- "reading from a write-only exposed prop should throw");
+ ok(/Permission denied/.test(e),
+ "writing to a write-only exposed prop should throw the right error");
}
+ is(writable.foo, undefined,
+ "reading from a write-only exposed prop should return undefined");
try {
delete writable.foo;
- is(chromeGet(writable, "foo"), undefined,
- "deleting a write-only exposed prop works");
+ ok(false, "deleting a write-only exposed prop should throw");
} catch (e) {
- ok(false, "deleting a write-only exposed prop shouldn't throw " + e);
+ ok(true, "deleting a write-only exposed prop should throw " + e);
}
// Test readable property
@@ -180,8 +149,8 @@ function COWTests() {
foo: 5,
bar: 6 };
try {
- isProp(getCOW(readable), "foo", 5,
- "reading from a readable exposed prop works");
+ isPropHidden(getCOW(readable), "foo", undefined,
+ "reading from a readable exposed prop shouldn't work");
} catch (e) {
ok(false, "reading from a readable exposed prop shouldn't throw " + e);
}
@@ -202,8 +171,7 @@ function COWTests() {
try {
var props = getNames(getCOW(readable));
- is(props.length, 1, "COW w/ one exposed prop should enumerate once");
- is(props[0], 'foo', "COW w/ one exposed prop should enumerate it");
+ is(props.length, 0, "COW w/ one exposed prop should not enumerate");
} catch (e) {
ok(false, "COW w/ a readable prop should not raise exc " +
"on enumeration: " + e);
@@ -215,21 +183,17 @@ function COWTests() {
ok(!("foo" in readwrite),
"non-existing readwrite property shouldn't exist");
readwrite.foo = 5;
- is(readwrite.foo, 5, "writing to a readwrite exposed prop looks like it worked");
- is(chromeGet(readwrite, "foo"), 5, "writing to a readwrite exposed prop works");
- ok("foo" in readwrite,
- "existing readwrite property should exist");
+ ok(false, "writing to a readwrite exposed prop should throw");
} catch (e) {
- ok(false, "writing to a readwrite exposed prop shouldn't throw " + e);
+ ok(/Permission denied/.test(e),
+ "writing to a readwrite exposed prop should throw the right error");
}
try {
delete readwrite.foo;
- is(readwrite.foo, undefined, "deleting readwrite prop looks like it worked");
- ok(!("foo" in readwrite), "deleting readwrite prop looks like it really worked");
- is(chromeGet(readwrite, "foo"), undefined,
- "deleting a readwrite exposed prop works");
+ ok(false, "deleting a readwrite prop should throw");
} catch (e) {
- ok(false, "deleting a readwrite exposed prop shouldn't throw " + e);
+ ok(/Permission denied/.test(e),
+ "deleting a readwrite exposed prop should throw the right error");
}
// Readables and functions
diff --git js/xpconnect/tests/chrome/test_exposeInDerived.xul js/xpconnect/tests/chrome/test_exposeInDerived.xul
index 2ed3bb91e7fd..7e6c24e56db1 100644
--- js/xpconnect/tests/chrome/test_exposeInDerived.xul
+++ js/xpconnect/tests/chrome/test_exposeInDerived.xul
@@ -17,7 +17,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=804630
<!-- test code goes here -->
<script type="application/javascript">
<![CDATA[
- /** Test to make sure that COWed objects can expose properties from their prototypes. **/
+ /** Test to make sure that COWed objects can't expose properties from their prototypes. **/
const Cu = Components.utils;
// Set up the sandbox.
@@ -25,7 +25,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=804630
sb.ok = ok;
sb.is = is;
- // Make a chrome object that exposes objects off its prototype.
+ // Make a chrome object that tries to expose objects off its prototype.
sb.proto = { read: 42, readWrite: 32, __exposedProps__: {} };
sb.obj = { __exposedProps__: { read: 'r', readWrite: 'rw' } };
sb.obj.__proto__ = sb.proto;
@@ -36,10 +36,11 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=804630
'try { proto.readWrite = 12; wrote = true; } catch(e) {} ' +
' ok(!wrote, "Should not write proto property");', sb);
- // Make sure we can access the exposed properties via the derived object.
- Cu.evalInSandbox('is(obj.read, 42, "obj.read accessible");', sb);
- Cu.evalInSandbox('is(obj.readWrite, 32, "obj.readWrite is readable");', sb);
- Cu.evalInSandbox('obj.readWrite = 8; is(obj.readWrite, 8, "obj.readWrite is writable");', sb);
+ // Make sure we can't access the exposed properties via the derived object.
+ Cu.evalInSandbox('is(obj.read, undefined, "obj.read inaccessible");', sb);
+ Cu.evalInSandbox('is(obj.readWrite, undefined, "obj.readWrite is not readable");', sb);
+ Cu.evalInSandbox('try { obj.readWrite = 8; ok(false, "obj.readWrite is not writable"); } catch (e) {};',
+ sb);
]]>
</script>
diff --git js/xpconnect/tests/unit/test_bug1082450.js js/xpconnect/tests/unit/test_bug1082450.js
index 07f45f06beef..5880fcbcd4e6 100644
--- js/xpconnect/tests/unit/test_bug1082450.js
+++ js/xpconnect/tests/unit/test_bug1082450.js
@@ -5,9 +5,9 @@ function run_test() {
function checkThrows(str, rgxp) {
try {
sb.eval(str);
- do_check_true(false);
+ do_check_true(false, "eval should have thrown");
} catch (e) {
- do_check_true(rgxp.test(e));
+ do_check_true(rgxp.test(e), "error message should match");
}
}
@@ -29,12 +29,12 @@ function run_test() {
chromeCallableValueProp: 'r' }
};
- do_check_eq(sb.eval('exposed.simpleValueProp'), 42);
- do_check_eq(sb.eval('exposed.objectValueProp.val'), 42);
- checkThrows('exposed.getterProp;', /privileged accessor/i);
- checkThrows('exposed.setterProp = 42;', /privileged accessor/i);
- checkThrows('exposed.getterSetterProp;', /privileged accessor/i);
- checkThrows('exposed.getterSetterProp = 42;', /privileged accessor/i);
- do_check_eq(sb.eval('exposed.contentCallableValueProp()'), 42);
- checkThrows('exposed.chromeCallableValueProp();', /privileged or cross-origin callable/i);
+ do_check_eq(sb.eval('exposed.simpleValueProp'), undefined);
+ do_check_eq(sb.eval('exposed.objectValueProp'), undefined);
+ do_check_eq(sb.eval('exposed.getterProp;'), undefined);
+ do_check_eq(sb.eval('exposed.getterSetterProp;'), undefined);
+ checkThrows('exposed.setterProp = 42;', /Permission denied/i);
+ checkThrows('exposed.getterSetterProp = 42;', /Permission denied/i);
+ do_check_eq(sb.eval('exposed.contentCallableValueProp'), undefined);
+ checkThrows('exposed.chromeCallableValueProp();', /is not a function/i);
}
diff --git js/xpconnect/tests/unit/test_bug780370.js js/xpconnect/tests/unit/test_bug780370.js
index 40d6f9748015..7ae757f0cd01 100644
--- js/xpconnect/tests/unit/test_bug780370.js
+++ js/xpconnect/tests/unit/test_bug780370.js
@@ -14,10 +14,5 @@ function run_test()
var sb = Cu.Sandbox("http://www.example.com");
sb.obj = { foo: 42, __exposedProps__: { hasOwnProperty: 'r' } };
do_check_eq(Cu.evalInSandbox('typeof obj.foo', sb), 'undefined', "COW works as expected");
- try {
- Cu.evalInSandbox('obj.hasOwnProperty', sb);
- do_check_true(false);
- } catch (e) {
- do_check_true(/privileged or cross-origin callable/i.test(e));
- }
+ do_check_eq(Cu.evalInSandbox('obj.hasOwnProperty', sb), undefined);
}
diff --git js/xpconnect/tests/unit/test_bug813901.js js/xpconnect/tests/unit/test_bug813901.js
index 42f981581b51..2efc6539e879 100644
--- js/xpconnect/tests/unit/test_bug813901.js
+++ js/xpconnect/tests/unit/test_bug813901.js
@@ -21,5 +21,5 @@ function run_test() {
checkThrows('obj.foo = 3;', sb, /denied/);
Cu.evalInSandbox("var p = {__exposedProps__: {foo: 'rw'}};", sb);
sb.obj.__proto__ = sb.p;
- checkThrows('obj.foo = 4;', sb, /__exposedProps__/);
+ checkThrows('obj.foo = 4;', sb, /denied/);
}
diff --git js/xpconnect/tests/unit/test_bug853709.js js/xpconnect/tests/unit/test_bug853709.js
index c7e51757dc63..1667d2241f93 100644
--- js/xpconnect/tests/unit/test_bug853709.js
+++ js/xpconnect/tests/unit/test_bug853709.js
@@ -8,7 +8,7 @@ function setupChromeSandbox() {
function checkDefineThrows(sb, obj, prop, desc) {
var result = Cu.evalInSandbox('(function() { try { Object.defineProperty(' + obj + ', "' + prop + '", ' + desc.toSource() + '); return "nothrow"; } catch (e) { return e.toString(); }})();', sb);
do_check_neq(result, 'nothrow');
- do_check_true(!!/denied/.exec(result));
+ do_check_true(!!/denied|prohibited/.exec(result));
do_check_true(result.indexOf(prop) != -1); // Make sure the prop name is in the error message.
}
@@ -19,7 +19,7 @@ function run_test() {
contentSB.chromeObj = chromeSB.chromeObj;
contentSB.chromeArr = chromeSB.chromeArr;
- do_check_eq(Cu.evalInSandbox('chromeObj.a', contentSB), 2);
+ do_check_eq(Cu.evalInSandbox('chromeObj.a', contentSB), undefined);
try {
Cu.evalInSandbox('chromeArr[1]', contentSB);
do_check_true(false);
diff --git js/xpconnect/tests/unit/test_bug854558.js js/xpconnect/tests/unit/test_bug854558.js
index d60d23a5baf8..574194dc3f52 100644
--- js/xpconnect/tests/unit/test_bug854558.js
+++ js/xpconnect/tests/unit/test_bug854558.js
@@ -7,5 +7,5 @@ function run_test() {
contentSB.foo = chromeSB.foo;
do_check_eq(Cu.evalInSandbox('foo.a', contentSB), undefined, "Default deny with no __exposedProps__");
Cu.evalInSandbox('this.foo.__exposedProps__ = {a: "r"}', chromeSB);
- do_check_eq(Cu.evalInSandbox('foo.a', contentSB), 2, "works with __exposedProps__");
+ do_check_eq(Cu.evalInSandbox('foo.a', contentSB), undefined, "Still not allowed with __exposedProps__");
}
diff --git js/xpconnect/tests/unit/test_bug930091.js js/xpconnect/tests/unit/test_bug930091.js
index aa11d5db2640..ecb2a60aed11 100644
--- js/xpconnect/tests/unit/test_bug930091.js
+++ js/xpconnect/tests/unit/test_bug930091.js
@@ -5,7 +5,7 @@ function checkThrows(fn) {
fn();
ok(false, "Should have thrown");
} catch (e) {
- do_check_true(/denied|insecure/.test(e));
+ do_check_true(/denied|insecure|prohibited/.test(e));
}
}
diff --git js/xpconnect/wrappers/AccessCheck.cpp js/xpconnect/wrappers/AccessCheck.cpp
index 07599ce7906a..b730310731e2 100644
--- js/xpconnect/wrappers/AccessCheck.cpp
+++ js/xpconnect/wrappers/AccessCheck.cpp
@@ -252,20 +252,6 @@ AccessCheck::checkPassToPrivilegedCode(JSContext* cx, HandleObject wrapper, Hand
return true;
}
- // COWs are fine to pass to chrome if and only if they have __exposedProps__,
- // since presumably content should never have a reason to pass an opaque
- // object back to chrome.
- if (AccessCheck::isChrome(js::UncheckedUnwrap(wrapper)) && WrapperFactory::IsCOW(obj)) {
- RootedObject target(cx, js::UncheckedUnwrap(obj));
- JSAutoCompartment ac(cx, target);
- RootedId id(cx, GetJSIDByIndex(cx, XPCJSContext::IDX_EXPOSEDPROPS));
- bool found = false;
- if (!JS_HasPropertyById(cx, target, id, &found))
- return false;
- if (found)
- return true;
- }
-
// Same-origin wrappers are fine.
if (AccessCheck::wrapperSubsumes(obj))
return true;
@@ -323,171 +309,6 @@ AccessCheck::reportCrossOriginDenial(JSContext* cx, JS::HandleId id,
MOZ_ALWAYS_TRUE(rv.MaybeSetPendingException(cx));
}
-enum Access { READ = (1<<0), WRITE = (1<<1), NO_ACCESS = 0 };
-
-static void
-EnterAndThrowASCII(JSContext* cx, JSObject* wrapper, const char* msg)
-{
- JSAutoCompartment ac(cx, wrapper);
- JS_ReportErrorASCII(cx, "%s", msg);
-}
-
-bool
-ExposedPropertiesOnly::check(JSContext* cx, HandleObject wrapper, HandleId id, Wrapper::Action act)
-{
- RootedObject wrappedObject(cx, Wrapper::wrappedObject(wrapper));
-
- if (act == Wrapper::CALL)
- return false;
-
- // For the case of getting a property descriptor, we allow if either GET or SET
- // is allowed, and rely on FilteringWrapper to filter out any disallowed accessors.
- if (act == Wrapper::GET_PROPERTY_DESCRIPTOR) {
- return check(cx, wrapper, id, Wrapper::GET) ||
- check(cx, wrapper, id, Wrapper::SET);
- }
-
- RootedId exposedPropsId(cx, GetJSIDByIndex(cx, XPCJSContext::IDX_EXPOSEDPROPS));
-
- // We need to enter the wrappee's compartment to look at __exposedProps__,
- // but we want to be in the wrapper's compartment if we call Deny().
- //
- // Unfortunately, |cx| can be in either compartment when we call ::check. :-(
- JSAutoCompartment ac(cx, wrappedObject);
-
- bool found = false;
- if (!JS_HasPropertyById(cx, wrappedObject, exposedPropsId, &found))
- return false;
-
- // If no __exposedProps__ existed, deny access.
- if (!found) {
- // Previously we automatically granted access to indexed properties and
- // .length for Array COWs. We're not doing that anymore, so make sure to
- // let people know what's going on.
- bool isArray;
- if (!JS_IsArrayObject(cx, wrappedObject, &isArray))
- return false;
- if (!isArray)
- isArray = JS_IsTypedArrayObject(wrappedObject);
- bool isIndexedAccessOnArray = isArray && JSID_IS_INT(id) && JSID_TO_INT(id) >= 0;
- bool isLengthAccessOnArray = isArray && JSID_IS_STRING(id) &&
- JS_FlatStringEqualsAscii(JSID_TO_FLAT_STRING(id), "length");
- if (isIndexedAccessOnArray || isLengthAccessOnArray) {
- JSAutoCompartment ac2(cx, wrapper);
- ReportWrapperDenial(cx, id, WrapperDenialForCOW,
- "Access to elements and length of privileged Array not permitted");
- }
-
- return false;
- }
-
- if (id == JSID_VOID)
- return true;
-
- Rooted<PropertyDescriptor> desc(cx);
- if (!JS_GetPropertyDescriptorById(cx, wrappedObject, exposedPropsId, &desc))
- return false;
-
- if (!desc.object())
- return false;
-
- if (desc.hasGetterOrSetter()) {
- EnterAndThrowASCII(cx, wrapper, "__exposedProps__ must be a value property");
- return false;
- }
-
- RootedValue exposedProps(cx, desc.value());
- if (exposedProps.isNullOrUndefined())
- return false;
-
- if (!exposedProps.isObject()) {
- EnterAndThrowASCII(cx, wrapper, "__exposedProps__ must be undefined, null, or an Object");
- return false;
- }
-
- RootedObject hallpass(cx, &exposedProps.toObject());
-
- if (!AccessCheck::subsumes(js::UncheckedUnwrap(hallpass), wrappedObject)) {
- EnterAndThrowASCII(cx, wrapper, "Invalid __exposedProps__");
- return false;
- }
-
- Access access = NO_ACCESS;
-
- if (!JS_GetPropertyDescriptorById(cx, hallpass, id, &desc)) {
- return false; // Error
- }
- if (!desc.object() || !desc.enumerable())
- return false;
-
- if (!desc.value().isString()) {
- EnterAndThrowASCII(cx, wrapper, "property must be a string");
- return false;
- }
-
- JSFlatString* flat = JS_FlattenString(cx, desc.value().toString());
- if (!flat)
- return false;
-
- size_t length = JS_GetStringLength(JS_FORGET_STRING_FLATNESS(flat));
-
- for (size_t i = 0; i < length; ++i) {
- char16_t ch = JS_GetFlatStringCharAt(flat, i);
- switch (ch) {
- case 'r':
- if (access & READ) {
- EnterAndThrowASCII(cx, wrapper, "duplicate 'readable' property flag");
- return false;
- }
- access = Access(access | READ);
- break;
-
- case 'w':
- if (access & WRITE) {
- EnterAndThrowASCII(cx, wrapper, "duplicate 'writable' property flag");
- return false;
- }
- access = Access(access | WRITE);
- break;
-
- default:
- EnterAndThrowASCII(cx, wrapper, "properties can only be readable or read and writable");
- return false;
- }
- }
-
- if (access == NO_ACCESS) {
- EnterAndThrowASCII(cx, wrapper, "specified properties must have a permission bit set");
- return false;
- }
-
- if ((act == Wrapper::SET && !(access & WRITE)) ||
- (act != Wrapper::SET && !(access & READ))) {
- return false;
- }
-
- // Inspect the property on the underlying object to check for red flags.
- if (!JS_GetPropertyDescriptorById(cx, wrappedObject, id, &desc))
- return false;
-
- // Reject accessor properties.
- if (desc.hasGetterOrSetter()) {
- EnterAndThrowASCII(cx, wrapper, "Exposing privileged accessor properties is prohibited");
- return false;
- }
-
- // Reject privileged or cross-origin callables.
- if (desc.value().isObject()) {
- RootedObject maybeCallable(cx, js::UncheckedUnwrap(&desc.value().toObject()));
- if (JS::IsCallable(maybeCallable) && !AccessCheck::subsumes(wrapper, maybeCallable)) {
- EnterAndThrowASCII(cx, wrapper, "Exposing privileged or cross-origin callable is prohibited");
- return false;
- }
- }
-
- return true;
-}
-
bool
ExposedPropertiesOnly::deny(JSContext* cx, js::Wrapper::Action act, HandleId id,
bool mayThrow)
diff --git js/xpconnect/wrappers/AccessCheck.h js/xpconnect/wrappers/AccessCheck.h
index 678dce3e0b81..c4873760ab7a 100644
--- js/xpconnect/wrappers/AccessCheck.h
+++ js/xpconnect/wrappers/AccessCheck.h
@@ -104,10 +104,15 @@ struct CrossOriginAccessiblePropertiesOnly : public Policy {
}
};
-// This policy only permits access to properties if they appear in the
-// objects exposed properties list.
+// This class used to support permitting access to properties if they
+// appeared in an access list on the object, but now it acts like an
+// Opaque wrapper, with the exception that it fails silently for GET,
+// ENUMERATE, and GET_PROPERTY_DESCRIPTOR. This is done for backwards
+// compatibility. See bug 1397513.
struct ExposedPropertiesOnly : public Policy {
- static bool check(JSContext* cx, JS::HandleObject wrapper, JS::HandleId id, js::Wrapper::Action act);
+ static bool check(JSContext* cx, JS::HandleObject wrapper, JS::HandleId id, js::Wrapper::Action act) {
+ return false;
+ }
static bool deny(JSContext* cx, js::Wrapper::Action act, JS::HandleId id,
bool mayThrow);
diff --git js/xpconnect/wrappers/ChromeObjectWrapper.h js/xpconnect/wrappers/ChromeObjectWrapper.h
index 8b273e470814..c17feed10b9a 100644
--- js/xpconnect/wrappers/ChromeObjectWrapper.h
+++ js/xpconnect/wrappers/ChromeObjectWrapper.h
@@ -16,9 +16,9 @@ namespace xpc {
struct ExposedPropertiesOnly;
// When a vanilla chrome JS object is exposed to content, we use a wrapper that
-// supports __exposedProps__ for legacy reasons. For extra security, we override
-// the traps that allow content to pass an object to chrome, and perform extra
-// security checks on them.
+// fails silently on GET, ENUMERATE, and GET_PROPERTY_DESCRIPTOR for legacy
+// reasons. For extra security, we override the traps that allow content to pass
+// an object to chrome, and perform extra security checks on them.
#define ChromeObjectWrapperBase \
FilteringWrapper<js::CrossCompartmentSecurityWrapper, ExposedPropertiesOnly>
diff --git js/xpconnect/wrappers/WrapperFactory.cpp js/xpconnect/wrappers/WrapperFactory.cpp
index 6296f69fbea4..760d2c9afda8 100644
--- js/xpconnect/wrappers/WrapperFactory.cpp
+++ js/xpconnect/wrappers/WrapperFactory.cpp
@@ -514,8 +514,8 @@ WrapperFactory::Rewrap(JSContext* cx, HandleObject existing, HandleObject obj)
wrapper = &FilteringWrapper<CrossCompartmentSecurityWrapper, OpaqueWithCall>::singleton;
}
- // For Vanilla JSObjects exposed from chrome to content, we use a wrapper
- // that supports __exposedProps__. We'd like to get rid of these eventually,
+ // For vanilla JSObjects exposed from chrome to content, we use a wrapper
+ // that fails silently in a few cases. We'd like to get rid of this eventually,
// but in their current form they don't cause much trouble.
else if (IdentifyStandardInstance(obj) == JSProto_Object) {
wrapper = &ChromeObjectWrapper::singleton;
diff --git js/xpconnect/wrappers/XrayWrapper.cpp js/xpconnect/wrappers/XrayWrapper.cpp
index 44dd7cb47146..28e29ea13d93 100644
--- js/xpconnect/wrappers/XrayWrapper.cpp
+++ js/xpconnect/wrappers/XrayWrapper.cpp
@@ -291,7 +291,7 @@ ReportWrapperDenial(JSContext* cx, HandleId id, WrapperDenialType type, const ch
MOZ_ASSERT(type == WrapperDenialForCOW);
errorMessage.emplace("Security wrapper denied access to property %s on privileged "
"Javascript object. Support for exposing privileged objects "
- "to untrusted content via __exposedProps__ is being gradually "
+ "to untrusted content via __exposedProps__ has been "
"removed - use WebIDL bindings or Components.utils.cloneInto "
"instead. Note that only the first denied property access from a "
"given global object will be reported.",
diff --git testing/mochitest/tests/SimpleTest/ChromePowers.js testing/mochitest/tests/SimpleTest/ChromePowers.js
index 97de578157c0..7fbf66e2fd00 100644
--- testing/mochitest/tests/SimpleTest/ChromePowers.js
+++ testing/mochitest/tests/SimpleTest/ChromePowers.js
@@ -104,15 +104,6 @@ ChromePowers.prototype.executeAfterFlushingMessageQueue = function(aCallback) {
aCallback();
};
-// Expose everything but internal APIs (starting with underscores) to
-// web content. We cannot use Object.keys to view SpecialPowers.prototype since
-// we are using the functions from SpecialPowersAPI.prototype
-ChromePowers.prototype.__exposedProps__ = {};
-for (var i in ChromePowers.prototype) {
- if (i.charAt(0) != "_")
- ChromePowers.prototype.__exposedProps__[i] = "r";
-}
-
if ((window.parent !== null) &&
(window.parent !== undefined) &&
(window.parent.wrappedJSObject.SpecialPowers) &&
diff --git testing/specialpowers/content/MockPermissionPrompt.jsm testing/specialpowers/content/MockPermissionPrompt.jsm
index 71d0f5d2768a..1d86cc00e360 100644
--- testing/specialpowers/content/MockPermissionPrompt.jsm
+++ testing/specialpowers/content/MockPermissionPrompt.jsm
@@ -83,15 +83,3 @@ MockPermissionPromptInstance.prototype = {
request.allow();
}
};
-
-// Expose everything to content. We call reset() here so that all of the relevant
-// lazy expandos get added.
-MockPermissionPrompt.reset();
-function exposeAll(obj) {
- var props = {};
- for (var prop in obj)
- props[prop] = "rw";
- obj.__exposedProps__ = props;
-}
-exposeAll(MockPermissionPrompt);
-exposeAll(MockPermissionPromptInstance.prototype);
diff --git toolkit/components/addoncompat/RemoteAddonsParent.jsm toolkit/components/addoncompat/RemoteAddonsParent.jsm
index 1adbc0397729..d640c47d31f8 100644
--- toolkit/components/addoncompat/RemoteAddonsParent.jsm
+++ toolkit/components/addoncompat/RemoteAddonsParent.jsm
@@ -735,7 +735,7 @@ var SandboxParent = {
if (rest.length) {
// Do a shallow copy of the options object into the child
// process. This way we don't have to access it through a Chrome
- // object wrapper, which would require __exposedProps__.
+ // object wrapper, which would not let us access any properties.
//
// The only object property here is sandboxPrototype. We assume
// it's a child process object (since that's what Greasemonkey
commit f89c72edb79e
Author: Andrew McCreight <continuation@gmail.com>
Date: Thu Sep 7 11:17:16 2017 -0700
Bug 1377587, part 2 - Rename ExposedPropertiesOnly to OpaqueWithSilentFailing. r=krizsa
This class doesn't have anything to do with __exposedProps__ any more,
so give it a more descriptive name. We'd still like to remove it
entirely eventually.
MozReview-Commit-ID: 87KCpG6f8rI
--HG--
extra : rebase_source : 98a51a6af0fc8446dbcd8efa083d6c79286279d3
---
js/xpconnect/wrappers/AccessCheck.cpp | 4 ++--
js/xpconnect/wrappers/AccessCheck.h | 2 +-
js/xpconnect/wrappers/ChromeObjectWrapper.h | 4 ++--
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git js/xpconnect/wrappers/AccessCheck.cpp js/xpconnect/wrappers/AccessCheck.cpp
index b730310731e2..620f1f678f51 100644
--- js/xpconnect/wrappers/AccessCheck.cpp
+++ js/xpconnect/wrappers/AccessCheck.cpp
@@ -310,8 +310,8 @@ AccessCheck::reportCrossOriginDenial(JSContext* cx, JS::HandleId id,
}
bool
-ExposedPropertiesOnly::deny(JSContext* cx, js::Wrapper::Action act, HandleId id,
- bool mayThrow)
+OpaqueWithSilentFailing::deny(JSContext* cx, js::Wrapper::Action act, HandleId id,
+ bool mayThrow)
{
// Fail silently for GET, ENUMERATE, and GET_PROPERTY_DESCRIPTOR.
if (act == js::Wrapper::GET || act == js::Wrapper::ENUMERATE ||
diff --git js/xpconnect/wrappers/AccessCheck.h js/xpconnect/wrappers/AccessCheck.h
index c4873760ab7a..6783258f8d94 100644
--- js/xpconnect/wrappers/AccessCheck.h
+++ js/xpconnect/wrappers/AccessCheck.h
@@ -109,7 +109,7 @@ struct CrossOriginAccessiblePropertiesOnly : public Policy {
// Opaque wrapper, with the exception that it fails silently for GET,
// ENUMERATE, and GET_PROPERTY_DESCRIPTOR. This is done for backwards
// compatibility. See bug 1397513.
-struct ExposedPropertiesOnly : public Policy {
+struct OpaqueWithSilentFailing : public Policy {
static bool check(JSContext* cx, JS::HandleObject wrapper, JS::HandleId id, js::Wrapper::Action act) {
return false;
}
diff --git js/xpconnect/wrappers/ChromeObjectWrapper.h js/xpconnect/wrappers/ChromeObjectWrapper.h
index c17feed10b9a..da4870237501 100644
--- js/xpconnect/wrappers/ChromeObjectWrapper.h
+++ js/xpconnect/wrappers/ChromeObjectWrapper.h
@@ -13,14 +13,14 @@
namespace xpc {
-struct ExposedPropertiesOnly;
+struct OpaqueWithSilentFailing;
// When a vanilla chrome JS object is exposed to content, we use a wrapper that
// fails silently on GET, ENUMERATE, and GET_PROPERTY_DESCRIPTOR for legacy
// reasons. For extra security, we override the traps that allow content to pass
// an object to chrome, and perform extra security checks on them.
#define ChromeObjectWrapperBase \
- FilteringWrapper<js::CrossCompartmentSecurityWrapper, ExposedPropertiesOnly>
+ FilteringWrapper<js::CrossCompartmentSecurityWrapper, OpaqueWithSilentFailing>
class ChromeObjectWrapper : public ChromeObjectWrapperBase
{

View File

@ -1,362 +0,0 @@
commit 256e249566d8
Author: Christoph Kerschbaumer <ckerschb@christophkerschbaumer.com>
Date: Fri Aug 4 14:11:17 2017 +0200
Bug 1381761 - Treating 'data:' documents as unique, opaque origins should still inherit the CSP. r=smaug,dveditz
---
caps/moz.build | 1 +
caps/nsScriptSecurityManager.cpp | 96 +++++++++++++++++++++++++---------------
2 files changed, 62 insertions(+), 35 deletions(-)
diff --git caps/moz.build caps/moz.build
index 46331e93f097..af369e3268e0 100644
--- caps/moz.build
+++ caps/moz.build
@@ -56,6 +56,7 @@ LOCAL_INCLUDES += [
'/docshell/base',
'/dom/base',
'/js/xpconnect/src',
+ '/netwerk/base',
]
if CONFIG['ENABLE_TESTS']:
diff --git caps/nsScriptSecurityManager.cpp caps/nsScriptSecurityManager.cpp
index a930b324a6a2..90695ebd126f 100644
--- caps/nsScriptSecurityManager.cpp
+++ caps/nsScriptSecurityManager.cpp
@@ -45,6 +45,7 @@
#include "nsIWindowWatcher.h"
#include "nsIConsoleService.h"
#include "nsIObserverService.h"
+#include "nsIOService.h"
#include "nsIContent.h"
#include "nsDOMJSUtils.h"
#include "nsAboutProtocolUtils.h"
@@ -265,6 +266,61 @@ nsScriptSecurityManager::GetChannelResultPrincipalIfNotSandboxed(nsIChannel* aCh
/*aIgnoreSandboxing*/ true);
}
+static void
+InheritAndSetCSPOnPrincipalIfNeeded(nsIChannel* aChannel, nsIPrincipal* aPrincipal)
+{
+ // loading a data: URI into an iframe, or loading frame[srcdoc] need
+ // to inherit the CSP (see Bug 1073952, 1381761).
+ MOZ_ASSERT(aChannel && aPrincipal, "need a valid channel and principal");
+ if (!aChannel) {
+ return;
+ }
+
+ nsCOMPtr<nsILoadInfo> loadInfo = aChannel->GetLoadInfo();
+ if (!loadInfo ||
+ loadInfo->GetExternalContentPolicyType() != nsIContentPolicy::TYPE_SUBDOCUMENT) {
+ return;
+ }
+
+ nsCOMPtr<nsIURI> uri;
+ nsresult rv = aChannel->GetURI(getter_AddRefs(uri));
+ NS_ENSURE_SUCCESS_VOID(rv);
+ nsAutoCString URISpec;
+ rv = uri->GetSpec(URISpec);
+ NS_ENSURE_SUCCESS_VOID(rv);
+
+ bool isSrcDoc = URISpec.EqualsLiteral("about:srcdoc");
+ bool isData = (NS_SUCCEEDED(uri->SchemeIs("data", &isData)) && isData);
+
+ if (!isSrcDoc && !isData) {
+ return;
+ }
+
+ nsCOMPtr<nsIPrincipal> principalToInherit = loadInfo->PrincipalToInherit();
+ if (!principalToInherit) {
+ principalToInherit = loadInfo->TriggeringPrincipal();
+ }
+ nsCOMPtr<nsIContentSecurityPolicy> originalCSP;
+ principalToInherit->GetCsp(getter_AddRefs(originalCSP));
+ if (!originalCSP) {
+ return;
+ }
+
+ // if the principalToInherit had a CSP, add it to the before
+ // created NullPrincipal (unless it already has one)
+ MOZ_ASSERT(aPrincipal->GetIsNullPrincipal(),
+ "inheriting the CSP only valid for NullPrincipal");
+ nsCOMPtr<nsIContentSecurityPolicy> nullPrincipalCSP;
+ aPrincipal->GetCsp(getter_AddRefs(nullPrincipalCSP));
+ if (nullPrincipalCSP) {
+ MOZ_ASSERT(nullPrincipalCSP == originalCSP,
+ "There should be no other CSP here.");
+ // CSPs are equal, no need to set it again.
+ return;
+ }
+ aPrincipal->SetCsp(originalCSP);
+}
+
nsresult
nsScriptSecurityManager::GetChannelResultPrincipal(nsIChannel* aChannel,
nsIPrincipal** aPrincipal,
@@ -295,40 +351,7 @@ nsScriptSecurityManager::GetChannelResultPrincipal(nsIChannel* aChannel,
if (!aIgnoreSandboxing && loadInfo->GetLoadingSandboxed()) {
MOZ_ALWAYS_TRUE(NS_SUCCEEDED(loadInfo->GetSandboxedLoadingPrincipal(aPrincipal)));
MOZ_ASSERT(*aPrincipal);
- // if the new NullPrincipal (above) loads an iframe[srcdoc], we
- // need to inherit an existing CSP to avoid bypasses (bug 1073952).
- // We continue inheriting for nested frames with e.g., data: URLs.
- if (loadInfo->GetExternalContentPolicyType() == nsIContentPolicy::TYPE_SUBDOCUMENT) {
- nsCOMPtr<nsIURI> uri;
- aChannel->GetURI(getter_AddRefs(uri));
- nsAutoCString URISpec;
- uri->GetSpec(URISpec);
- bool isData = (NS_SUCCEEDED(uri->SchemeIs("data", &isData)) && isData);
- if (URISpec.EqualsLiteral("about:srcdoc") || isData) {
- nsCOMPtr<nsIPrincipal> principalToInherit = loadInfo->PrincipalToInherit();
- if (!principalToInherit) {
- principalToInherit = loadInfo->TriggeringPrincipal();
- }
- nsCOMPtr<nsIContentSecurityPolicy> originalCSP;
- principalToInherit->GetCsp(getter_AddRefs(originalCSP));
- if (originalCSP) {
- // if the principalToInherit had a CSP,
- // add it to the newly created NullPrincipal
- // (unless it already has one)
- nsCOMPtr<nsIContentSecurityPolicy> nullPrincipalCSP;
- (*aPrincipal)->GetCsp(getter_AddRefs(nullPrincipalCSP));
- if (nullPrincipalCSP) {
- MOZ_ASSERT(nullPrincipalCSP == originalCSP,
- "There should be no other CSP here.");
- // CSPs are equal, no need to set it again.
- return NS_OK;
- } else {
- nsresult rv = (*aPrincipal)->SetCsp(originalCSP);
- NS_ENSURE_SUCCESS(rv, rv);
- }
- }
- }
- }
+ InheritAndSetCSPOnPrincipalIfNeeded(aChannel, *aPrincipal);
return NS_OK;
}
@@ -376,7 +399,10 @@ nsScriptSecurityManager::GetChannelResultPrincipal(nsIChannel* aChannel,
}
}
}
- return GetChannelURIPrincipal(aChannel, aPrincipal);
+ nsresult rv = GetChannelURIPrincipal(aChannel, aPrincipal);
+ NS_ENSURE_SUCCESS(rv, rv);
+ InheritAndSetCSPOnPrincipalIfNeeded(aChannel, *aPrincipal);
+ return NS_OK;
}
/* The principal of the URI that this channel is loading. This is never
commit 9427f1bbd826
Author: Christoph Kerschbaumer <ckerschb@christophkerschbaumer.com>
Date: Fri Aug 4 14:10:21 2017 +0200
Bug 1381761 - Convert test browser_911547.js to comply with new data: URI inheritance model. r=dveditz
---
.../components/sessionstore/test/browser_911547.js | 47 ++++++++++++++++------
.../sessionstore/test/browser_911547_sample.html | 6 +--
2 files changed, 37 insertions(+), 16 deletions(-)
diff --git browser/components/sessionstore/test/browser_911547.js browser/components/sessionstore/test/browser_911547.js
index f0da70ed8f8c..cb95ddad7f2a 100644
--- browser/components/sessionstore/test/browser_911547.js
+++ browser/components/sessionstore/test/browser_911547.js
@@ -1,11 +1,17 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
-// This tests that session restore component does restore the right content
-// security policy with the document.
-// The policy being tested disallows inline scripts
+// This test is two fold:
+// a) if security.data_uri.unique_opaque_origin == false, then
+// this tests that session restore component does restore the right
+// content security policy with the document. (The policy being
+// tested disallows inline scripts).
+// b) if security.data_uri.unique_opaque_origin == true, then
+// this tests that data: URIs do not inherit the CSP from
+// it's enclosing context.
add_task(async function test() {
+ let dataURIPref = Services.prefs.getBoolPref("security.data_uri.unique_opaque_origin");
// create a tab that has a CSP
let testURL = "http://mochi.test:8888/browser/browser/components/sessionstore/test/browser_911547_sample.html";
let tab = gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, testURL);
@@ -16,23 +22,33 @@ add_task(async function test() {
// this is a baseline to ensure CSP is active
// attempt to inject and run a script via inline (pre-restore, allowed)
- await injectInlineScript(browser, `document.getElementById("test_id").value = "fail";`);
+ await injectInlineScript(browser, `document.getElementById("test_id1").value = "id1_modified";`);
let loadedPromise = promiseBrowserLoaded(browser);
await ContentTask.spawn(browser, null, function() {
- is(content.document.getElementById("test_id").value, "ok",
+ is(content.document.getElementById("test_id1").value, "id1_initial",
"CSP should block the inline script that modifies test_id");
- // attempt to click a link to a data: URI (will inherit the CSP of the
- // origin document) and navigate to the data URI in the link.
+
+ // (a) if security.data_uri.unique_opaque_origin == false:
+ // attempt to click a link to a data: URI (will inherit the CSP of
+ // the origin document) and navigate to the data URI in the link.
+ // (b) if security.data_uri.unique_opaque_origin == true:
+ // attempt to click a link to a data: URI (will *not* inherit the CSP of
+ // the origin document) and navigate to the data URI in the link.
content.document.getElementById("test_data_link").click();
});
await loadedPromise;
- await ContentTask.spawn(browser, null, function() {
- is(content.document.getElementById("test_id2").value, "ok",
- "CSP should block the script loaded by the clicked data URI");
+ await ContentTask.spawn(browser, {dataURIPref}, function( {dataURIPref}) { // eslint-disable-line
+ if (dataURIPref) {
+ is(content.document.getElementById("test_id2").value, "id2_modified",
+ "data: URI should *not* inherit the CSP of the enclosing context");
+ } else {
+ is(content.document.getElementById("test_id2").value, "id2_initial",
+ "CSP should block the script loaded by the clicked data URI");
+ }
});
// close the tab
@@ -43,9 +59,14 @@ add_task(async function test() {
await promiseTabRestored(tab);
browser = tab.linkedBrowser;
- await ContentTask.spawn(browser, null, function() {
- is(content.document.getElementById("test_id2").value, "ok",
- "CSP should block the script loaded by the clicked data URI after restore");
+ await ContentTask.spawn(browser, {dataURIPref}, function({dataURIPref}) { // eslint-disable-line
+ if (dataURIPref) {
+ is(content.document.getElementById("test_id2").value, "id2_modified",
+ "data: URI should *not* inherit the CSP of the enclosing context");
+ } else {
+ is(content.document.getElementById("test_id2").value, "id2_initial",
+ "CSP should block the script loaded by the clicked data URI after restore");
+ }
});
// clean up
diff --git browser/components/sessionstore/test/browser_911547_sample.html browser/components/sessionstore/test/browser_911547_sample.html
index ccc2011593d4..73cb99ee41f1 100644
--- browser/components/sessionstore/test/browser_911547_sample.html
+++ browser/components/sessionstore/test/browser_911547_sample.html
@@ -8,12 +8,12 @@
<!--
this element gets modified by an injected script;
- that script should be blocked by CSP.
+ that script should be blocked by CSP if security.data_uri.unique_opaque_origin == false;
Inline scripts can modify it, but not data uris.
-->
- <input type="text" id="test_id" value="ok">
+ <input type="text" id="test_id1" value="id1_initial">
- <a id="test_data_link" href="data:text/html;charset=utf-8,<input type='text' id='test_id2' value='ok'/> <script>document.getElementById('test_id2').value = 'fail';</script>">Test Link</a>
+ <a id="test_data_link" href="data:text/html;charset=utf-8,<input type='text' id='test_id2' value='id2_initial'/> <script>document.getElementById('test_id2').value = 'id2_modified';</script>">Test Link</a>
</body>
</html>
commit 8b999864f0bb
Author: Christoph Kerschbaumer <ckerschb@christophkerschbaumer.com>
Date: Fri Aug 4 14:10:38 2017 +0200
Bug 1381761 - Test data: URIs inherit the CSP even if treated as unique, opaque origins. r=dveditz
---
.../test/csp/file_data_csp_inheritance.html | 21 +++++++++++++
dom/security/test/csp/mochitest.ini | 2 ++
.../test/csp/test_data_csp_inheritance.html | 34 ++++++++++++++++++++++
3 files changed, 57 insertions(+)
diff --git dom/security/test/csp/file_data_csp_inheritance.html dom/security/test/csp/file_data_csp_inheritance.html
new file mode 100644
index 000000000000..299c30255aa6
--- /dev/null
+++ dom/security/test/csp/file_data_csp_inheritance.html
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Bug 1381761 - Treating 'data:' documents as unique, opaque origins should still inherit the CSP</title>
+ <meta charset="utf-8">
+ <meta http-equiv="Content-Security-Policy" content= "img-src 'none'"/>
+</head>
+<body>
+<iframe id="dataFrame" src="data:text/html,<body>should inherit csp</body>"></iframe>
+
+<script type="application/javascript">
+ // get the csp in JSON notation from the principal
+ var frame = document.getElementById("dataFrame");
+ var principal = SpecialPowers.wrap(frame.contentDocument).nodePrincipal;
+ var cspJSON = principal.cspJSON;
+ var result = principal.cspJSON ? "dataInheritsCSP" : "dataDoesNotInheritCSP";
+ window.parent.postMessage({result}, "*");
+</script>
+
+</body>
+</html>
diff --git dom/security/test/csp/mochitest.ini dom/security/test/csp/mochitest.ini
index ba391ad59799..09f80b2969d7 100644
--- dom/security/test/csp/mochitest.ini
+++ dom/security/test/csp/mochitest.ini
@@ -217,6 +217,7 @@ support-files =
file_ignore_xfo.html^headers^
file_ro_ignore_xfo.html
file_ro_ignore_xfo.html^headers^
+ file_data_csp_inheritance.html
file_report_font_cache-1.html
file_report_font_cache-2.html
file_report_font_cache-2.html^headers^
@@ -308,4 +309,5 @@ tags = mcb
[test_websocket_self.html]
skip-if = toolkit == 'android'
[test_ignore_xfo.html]
+[test_data_csp_inheritance.html]
[test_data_csp_merge.html]
diff --git dom/security/test/csp/test_data_csp_inheritance.html dom/security/test/csp/test_data_csp_inheritance.html
new file mode 100644
index 000000000000..3afc4f7c02bc
--- /dev/null
+++ dom/security/test/csp/test_data_csp_inheritance.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Bug 1381761 - Treating 'data:' documents as unique, opaque origins should still inherit the CSP</title>
+ <!-- Including SimpleTest.js so we can use waitForExplicitFinish !-->
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<iframe style="width:100%;" id="testframe"></iframe>
+
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+/* Description of the test:
+ * We load an iframe using a meta CSP which includes another iframe
+ * using a data: URI. We make sure the CSP gets inherited into
+ * the data: URI iframe.
+ */
+
+window.addEventListener("message", receiveMessage);
+function receiveMessage(event) {
+ window.removeEventListener("message", receiveMessage);
+ is(event.data.result, "dataInheritsCSP",
+ "data: URI iframe inherits CSP from including context");
+ SimpleTest.finish();
+}
+
+document.getElementById("testframe").src = "file_data_csp_inheritance.html";
+
+</script>
+</body>
+</html>

View File

@ -1,200 +0,0 @@
commit 6b3da0609f95
Author: Byron Campen [:bwc] <docfaraday@gmail.com>
Date: Thu Sep 14 12:19:24 2017 -0500
Bug 1383019: Move more logic under the protection of nsTimerImpl::mMutex, and simplify. r=froydnj, a=abillings
MozReview-Commit-ID: JjYScKwyika
--HG--
extra : rebase_source : a5a8a17f86459ace51d9250454bd4cf1433130b0
---
xpcom/threads/TimerThread.cpp | 12 ++++++----
xpcom/threads/TimerThread.h | 32 -------------------------
xpcom/threads/nsTimerImpl.cpp | 56 +++++++++++++++++++++----------------------
xpcom/threads/nsTimerImpl.h | 5 ++--
4 files changed, 36 insertions(+), 69 deletions(-)
diff --git xpcom/threads/TimerThread.cpp xpcom/threads/TimerThread.cpp
index b91b27b2073a..99a40d91b3c0 100644
--- xpcom/threads/TimerThread.cpp
+++ xpcom/threads/TimerThread.cpp
@@ -331,7 +331,7 @@ TimerThread::Shutdown()
return NS_ERROR_NOT_INITIALIZED;
}
- nsTArray<UniquePtr<Entry>> timers;
+ nsTArray<RefPtr<nsTimerImpl>> timers;
{
// lock scope
MonitorAutoLock lock(mMonitor);
@@ -350,12 +350,14 @@ TimerThread::Shutdown()
// might potentially call some code reentering the same lock
// that leads to unexpected behavior or deadlock.
// See bug 422472.
- mTimers.SwapElements(timers);
+ for (const UniquePtr<Entry>& entry : mTimers) {
+ timers.AppendElement(entry->Take());
+ }
+
+ mTimers.Clear();
}
- uint32_t timersCount = timers.Length();
- for (uint32_t i = 0; i < timersCount; i++) {
- RefPtr<nsTimerImpl> timer = timers[i]->Take();
+ for (const RefPtr<nsTimerImpl>& timer : timers) {
if (timer) {
timer->Cancel();
}
diff --git xpcom/threads/TimerThread.h xpcom/threads/TimerThread.h
index f65c501c50e8..6610f5bf387b 100644
--- xpcom/threads/TimerThread.h
+++ xpcom/threads/TimerThread.h
@@ -129,36 +129,4 @@ private:
uint32_t mAllowedEarlyFiringMicroseconds;
};
-struct TimerAdditionComparator
-{
- TimerAdditionComparator(const mozilla::TimeStamp& aNow,
- nsTimerImpl* aTimerToInsert) :
- now(aNow)
-#ifdef DEBUG
- , timerToInsert(aTimerToInsert)
-#endif
- {
- }
-
- bool LessThan(nsTimerImpl* aFromArray, nsTimerImpl* aNewTimer) const
- {
- MOZ_ASSERT(aNewTimer == timerToInsert, "Unexpected timer ordering");
-
- // Skip any overdue timers.
- return aFromArray->mTimeout <= now ||
- aFromArray->mTimeout <= aNewTimer->mTimeout;
- }
-
- bool Equals(nsTimerImpl* aFromArray, nsTimerImpl* aNewTimer) const
- {
- return false;
- }
-
-private:
- const mozilla::TimeStamp& now;
-#ifdef DEBUG
- const nsTimerImpl* const timerToInsert;
-#endif
-};
-
#endif /* TimerThread_h___ */
diff --git xpcom/threads/nsTimerImpl.cpp xpcom/threads/nsTimerImpl.cpp
index f6803791fe45..735271af089a 100644
--- xpcom/threads/nsTimerImpl.cpp
+++ xpcom/threads/nsTimerImpl.cpp
@@ -133,16 +133,8 @@ nsTimer::Release(void)
NS_LOG_RELEASE(this, count, "nsTimer");
if (count == 1) {
- if (!mImpl->CancelCheckIfFiring()) {
- // Last ref, in nsTimerImpl::mITimer. Make sure the cycle is broken.
- // (when Cancel fails, nsTimerImpl::Fire is in progress, which has grabbed
- // another ref to the nsITimer since we checked the value of mRefCnt
- // above)
- // If there is a nsTimerEvent in a queue for this timer, the nsTimer will
- // live until that event pops, otherwise the nsTimerImpl will go away and
- // the nsTimer along with it.
- mImpl = nullptr;
- }
+ // Last ref, in nsTimerImpl::mITimer. Make sure the cycle is broken.
+ mImpl->CancelImpl(true);
} else if (count == 0) {
delete this;
}
@@ -322,31 +314,37 @@ nsTimerImpl::Init(nsIObserver* aObserver, uint32_t aDelay, uint32_t aType)
return InitCommon(aDelay, aType, mozilla::Move(cb));
}
-bool
-nsTimerImpl::CancelCheckIfFiring()
+nsresult
+nsTimerImpl::Cancel()
{
- Callback cb;
+ CancelImpl(false);
+ return NS_OK;
+}
- MutexAutoLock lock(mMutex);
+void
+nsTimerImpl::CancelImpl(bool aClearITimer)
+{
+ Callback cbTrash;
+ RefPtr<nsITimer> timerTrash;
- if (gThread) {
- gThread->RemoveTimer(this);
- }
+ {
+ MutexAutoLock lock(mMutex);
+ if (gThread) {
+ gThread->RemoveTimer(this);
+ }
- cb.swap(mCallback);
- ++mGeneration;
+ cbTrash.swap(mCallback);
+ ++mGeneration;
- if (mCallbackDuringFire.mType != Callback::Type::Unknown) {
- return true;
+ // Don't clear this if we're firing; once Fire returns, we'll get this call
+ // again.
+ if (aClearITimer &&
+ (mCallbackDuringFire.mType == Callback::Type::Unknown)) {
+ MOZ_RELEASE_ASSERT(mITimer, "mITimer was nulled already! "
+ "This indicates that someone has messed up the refcount on nsTimer!");
+ timerTrash.swap(mITimer);
+ }
}
- return false;
-}
-
-nsresult
-nsTimerImpl::Cancel()
-{
- (void)CancelCheckIfFiring();
- return NS_OK;
}
nsresult
diff --git xpcom/threads/nsTimerImpl.h xpcom/threads/nsTimerImpl.h
index 4b26cd21d80a..1cb530c0be3d 100644
--- xpcom/threads/nsTimerImpl.h
+++ xpcom/threads/nsTimerImpl.h
@@ -56,7 +56,7 @@ public:
static void Shutdown();
void SetDelayInternal(uint32_t aDelay, TimeStamp aBase = TimeStamp::Now());
- bool CancelCheckIfFiring();
+ void CancelImpl(bool aClearITimer);
void Fire(int32_t aGeneration);
@@ -211,7 +211,7 @@ public:
static double sDeltaSum;
static double sDeltaSumSquared;
static double sDeltaNum;
- const RefPtr<nsITimer> mITimer;
+ RefPtr<nsITimer> mITimer;
mozilla::Mutex mMutex;
Callback mCallback;
Callback mCallbackDuringFire;
@@ -225,7 +225,6 @@ public:
friend class TimerThread;
friend class nsTimerEvent;
- friend struct TimerAdditionComparator;
NS_DECL_THREADSAFE_ISUPPORTS
NS_FORWARD_SAFE_NSITIMER(mImpl);

View File

@ -1,218 +0,0 @@
commit 485ed2f2b015
Author: Jan de Mooij <jdemooij@mozilla.com>
Date: Mon Sep 18 15:08:44 2017 +0200
Bug 1384121 part 1 - Don't sweep ObjectGroups under IC helper functions. r=bhackett
---
js/src/jit/IonCacheIRCompiler.cpp | 4 ++--
js/src/vm/ObjectGroup.h | 2 ++
js/src/vm/TypeInference-inl.h | 29 ++++++++++++++++++++++-------
js/src/vm/UnboxedObject.cpp | 2 +-
4 files changed, 27 insertions(+), 10 deletions(-)
diff --git js/src/jit/IonCacheIRCompiler.cpp js/src/jit/IonCacheIRCompiler.cpp
index b11aed7966b6..bbfbdae57b12 100644
--- js/src/jit/IonCacheIRCompiler.cpp
+++ js/src/jit/IonCacheIRCompiler.cpp
@@ -1324,9 +1324,9 @@ IonCacheIRCompiler::emitCallStringSplitResult()
static bool
GroupHasPropertyTypes(ObjectGroup* group, jsid* id, Value* v)
{
- if (group->unknownProperties())
+ if (group->unknownPropertiesDontCheckGeneration())
return true;
- HeapTypeSet* propTypes = group->maybeGetProperty(*id);
+ HeapTypeSet* propTypes = group->maybeGetPropertyDontCheckGeneration(*id);
if (!propTypes)
return true;
if (!propTypes->nonConstantProperty())
diff --git js/src/vm/ObjectGroup.h js/src/vm/ObjectGroup.h
index 237b5a152576..0eba71ee084f 100644
--- js/src/vm/ObjectGroup.h
+++ js/src/vm/ObjectGroup.h
@@ -390,6 +390,7 @@ class ObjectGroup : public gc::TenuredCell
/* Get a property only if it already exists. */
MOZ_ALWAYS_INLINE HeapTypeSet* maybeGetProperty(jsid id);
+ MOZ_ALWAYS_INLINE HeapTypeSet* maybeGetPropertyDontCheckGeneration(jsid id);
/*
* Iterate through the group's properties. getPropertyCount overapproximates
@@ -471,6 +472,7 @@ class ObjectGroup : public gc::TenuredCell
}
inline uint32_t basePropertyCount();
+ inline uint32_t basePropertyCountDontCheckGeneration();
private:
inline void setBasePropertyCount(uint32_t count);
diff --git js/src/vm/TypeInference-inl.h js/src/vm/TypeInference-inl.h
index f7cd3459ef19..f2b0b9a52fbc 100644
--- js/src/vm/TypeInference-inl.h
+++ js/src/vm/TypeInference-inl.h
@@ -369,10 +369,10 @@ TypeMonitorCall(JSContext* cx, const js::CallArgs& args, bool constructing)
MOZ_ALWAYS_INLINE bool
TrackPropertyTypes(JSObject* obj, jsid id)
{
- if (obj->hasLazyGroup() || obj->group()->unknownProperties())
+ if (obj->hasLazyGroup() || obj->group()->unknownPropertiesDontCheckGeneration())
return false;
- if (obj->isSingleton() && !obj->group()->maybeGetProperty(id))
+ if (obj->isSingleton() && !obj->group()->maybeGetPropertyDontCheckGeneration(id))
return false;
return true;
@@ -410,7 +410,7 @@ HasTrackedPropertyType(JSObject* obj, jsid id, TypeSet::Type type)
MOZ_ASSERT(id == IdToTypeId(id));
MOZ_ASSERT(TrackPropertyTypes(obj, id));
- if (HeapTypeSet* types = obj->group()->maybeGetProperty(id)) {
+ if (HeapTypeSet* types = obj->group()->maybeGetPropertyDontCheckGeneration(id)) {
if (!types->hasType(type))
return false;
// Non-constant properties are only relevant for singleton objects.
@@ -1074,10 +1074,18 @@ TypeSet::getObjectClass(unsigned i) const
// ObjectGroup
/////////////////////////////////////////////////////////////////////
+inline uint32_t
+ObjectGroup::basePropertyCountDontCheckGeneration()
+{
+ uint32_t flags = flagsDontCheckGeneration();
+ return (flags & OBJECT_FLAG_PROPERTY_COUNT_MASK) >> OBJECT_FLAG_PROPERTY_COUNT_SHIFT;
+}
+
inline uint32_t
ObjectGroup::basePropertyCount()
{
- return (flags() & OBJECT_FLAG_PROPERTY_COUNT_MASK) >> OBJECT_FLAG_PROPERTY_COUNT_SHIFT;
+ maybeSweep(nullptr);
+ return basePropertyCountDontCheckGeneration();
}
inline void
@@ -1134,14 +1142,14 @@ ObjectGroup::getProperty(JSContext* cx, JSObject* obj, jsid id)
}
MOZ_ALWAYS_INLINE HeapTypeSet*
-ObjectGroup::maybeGetProperty(jsid id)
+ObjectGroup::maybeGetPropertyDontCheckGeneration(jsid id)
{
MOZ_ASSERT(JSID_IS_VOID(id) || JSID_IS_EMPTY(id) || JSID_IS_STRING(id) || JSID_IS_SYMBOL(id));
MOZ_ASSERT_IF(!JSID_IS_EMPTY(id), id == IdToTypeId(id));
- MOZ_ASSERT(!unknownProperties());
+ MOZ_ASSERT(!unknownPropertiesDontCheckGeneration());
Property* prop = TypeHashSet::Lookup<jsid, Property, Property>
- (propertySet, basePropertyCount(), id);
+ (propertySet, basePropertyCountDontCheckGeneration(), id);
if (!prop)
return nullptr;
@@ -1150,6 +1158,13 @@ ObjectGroup::maybeGetProperty(jsid id)
return &prop->types;
}
+MOZ_ALWAYS_INLINE HeapTypeSet*
+ObjectGroup::maybeGetProperty(jsid id)
+{
+ maybeSweep(nullptr);
+ return maybeGetPropertyDontCheckGeneration(id);
+}
+
inline unsigned
ObjectGroup::getPropertyCount()
{
diff --git js/src/vm/UnboxedObject.cpp js/src/vm/UnboxedObject.cpp
index c155b7dc47c9..4e007489a67e 100644
--- js/src/vm/UnboxedObject.cpp
+++ js/src/vm/UnboxedObject.cpp
@@ -363,7 +363,7 @@ UnboxedPlainObject::ensureExpando(JSContext* cx, Handle<UnboxedPlainObject*> obj
bool
UnboxedPlainObject::containsUnboxedOrExpandoProperty(JSContext* cx, jsid id) const
{
- if (layout().lookup(id))
+ if (layoutDontCheckGeneration().lookup(id))
return true;
if (maybeExpando() && maybeExpando()->containsShapeOrElement(cx, id))
commit e240cf665f74
Author: Jan de Mooij <jdemooij@mozilla.com>
Date: Wed Sep 20 12:13:54 2017 +0200
Bug 1384121 part 2 - Add asserts to catch similar bugs and fix some false positives. r=nbp
---
js/src/jit/Bailouts.cpp | 4 ----
js/src/jit/JSJitFrameIter.cpp | 2 ++
js/src/jit/VMFunctions.cpp | 1 -
js/src/jit/arm/Trampoline-arm.cpp | 9 ++++++---
js/src/jit/arm64/Trampoline-arm64.cpp | 9 ++++++---
js/src/jit/mips32/Trampoline-mips32.cpp | 9 ++++++---
js/src/jit/mips64/Trampoline-mips64.cpp | 9 ++++++---
js/src/jit/x64/Trampoline-x64.cpp | 9 ++++++---
js/src/jit/x86/Trampoline-x86.cpp | 9 ++++++---
js/src/vm/ObjectGroup-inl.h | 1 +
js/src/vm/Stack.cpp | 2 ++
js/src/vm/TypeInference.cpp | 3 +++
12 files changed, 44 insertions(+), 23 deletions(-)
diff --git js/src/jit/JSJitFrameIter.cpp js/src/jit/JSJitFrameIter.cpp
index 3774b327d21c..ae76bc2abaf0 100644
--- js/src/jit/JitFrameIterator.cpp
+++ js/src/jit/JitFrameIterator.cpp
@@ -25,6 +25,8 @@ JSJitFrameIter::JSJitFrameIter(const JitActivation* activation)
current_ = activation_->bailoutData()->fp();
frameSize_ = activation_->bailoutData()->topFrameSize();
type_ = JitFrame_Bailout;
+ } else {
+ MOZ_ASSERT(!TlsContext.get()->inUnsafeCallWithABI);
}
}
diff --git js/src/vm/ObjectGroup-inl.h js/src/vm/ObjectGroup-inl.h
index 7e023ecbad8e..d7caa63d8725 100644
--- js/src/vm/ObjectGroup-inl.h
+++ js/src/vm/ObjectGroup-inl.h
@@ -16,6 +16,7 @@ ObjectGroup::needsSweep()
{
// Note: this can be called off thread during compacting GCs, in which case
// nothing will be running on the active thread.
+ MOZ_ASSERT(!TlsContext.get()->inUnsafeCallWithABI);
return generation() != zoneFromAnyThread()->types.generation;
}
diff --git js/src/vm/Stack.cpp js/src/vm/Stack.cpp
index d3c0038db5ca..0406195abd56 100644
--- js/src/vm/Stack.cpp
+++ js/src/vm/Stack.cpp
@@ -605,6 +605,8 @@ FrameIter::popInterpreterFrame()
void
FrameIter::settleOnActivation()
{
+ MOZ_ASSERT(!data_.cx_->inUnsafeCallWithABI);
+
while (true) {
if (data_.activations_.done()) {
data_.state_ = DONE;
diff --git js/src/vm/TypeInference.cpp js/src/vm/TypeInference.cpp
index f0562a4355f8..eba18e34397e 100644
--- js/src/vm/TypeInference.cpp
+++ js/src/vm/TypeInference.cpp
@@ -4428,6 +4428,8 @@ ObjectGroup::sweep(AutoClearTypeInferenceStateOnOOM* oom)
/* static */ void
JSScript::maybeSweepTypes(AutoClearTypeInferenceStateOnOOM* oom)
{
+ MOZ_ASSERT(!TlsContext.get()->inUnsafeCallWithABI);
+
if (!types_ || typesGeneration() == zone()->types.generation)
return;
@@ -4611,6 +4613,7 @@ AutoClearTypeInferenceStateOnOOM::AutoClearTypeInferenceStateOnOOM(Zone* zone)
: zone(zone), oom(false)
{
MOZ_RELEASE_ASSERT(CurrentThreadCanAccessZone(zone));
+ MOZ_ASSERT(!TlsContext.get()->inUnsafeCallWithABI);
zone->types.setSweepingTypes(true);
}

View File

@ -1,796 +0,0 @@
diff --git widget/gtk/nsLookAndFeel.cpp widget/gtk/nsLookAndFeel.cpp
index 6bb3e27c6653..f4c35d82200a 100644
--- widget/gtk/nsLookAndFeel.cpp
+++ widget/gtk/nsLookAndFeel.cpp
@@ -29,11 +29,9 @@
#include "mozilla/gfx/2D.h"
-#if MOZ_WIDGET_GTK != 2
#include <cairo-gobject.h>
#include "WidgetStyleCache.h"
#include "prenv.h"
-#endif
using mozilla::LookAndFeel;
@@ -49,9 +47,6 @@ using mozilla::LookAndFeel;
nsLookAndFeel::nsLookAndFeel()
: nsXPLookAndFeel(),
-#if (MOZ_WIDGET_GTK == 2)
- mStyle(nullptr),
-#endif
mDefaultFontCached(false), mButtonFontCached(false),
mFieldFontCached(false), mMenuFontCached(false),
mInitialized(false)
@@ -66,12 +61,8 @@ nsLookAndFeel::NativeInit()
nsLookAndFeel::~nsLookAndFeel()
{
-#if (MOZ_WIDGET_GTK == 2)
- g_object_unref(mStyle);
-#endif
}
-#if MOZ_WIDGET_GTK != 2
// Modifies color |*aDest| as if a pattern of color |aSource| was painted with
// CAIRO_OPERATOR_OVER to a surface with color |*aDest|.
static void
@@ -228,42 +219,19 @@ GetBorderColors(GtkStyleContext* aContext,
*aDarkColor = GDK_RGBA_TO_NS_RGBA(darkColor);
return ret;
}
-#endif
nsresult
nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
{
EnsureInit();
-#if (MOZ_WIDGET_GTK == 3)
GdkRGBA gdk_color;
-#endif
nsresult res = NS_OK;
switch (aID) {
// These colors don't seem to be used for anything anymore in Mozilla
// (except here at least TextSelectBackground and TextSelectForeground)
// The CSS2 colors below are used.
-#if (MOZ_WIDGET_GTK == 2)
- case eColorID_WindowBackground:
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_NORMAL]);
- break;
- case eColorID_WindowForeground:
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_NORMAL]);
- break;
- case eColorID_WidgetBackground:
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]);
- break;
- case eColorID_WidgetForeground:
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_NORMAL]);
- break;
- case eColorID_WidgetSelectBackground:
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_SELECTED]);
- break;
- case eColorID_WidgetSelectForeground:
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_SELECTED]);
- break;
-#else
case eColorID_WindowBackground:
case eColorID_WidgetBackground:
case eColorID_TextBackground:
@@ -303,35 +271,12 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
case eColorID__moz_html_cellhighlighttext:
aColor = sTextSelectedText;
break;
-#endif
case eColorID_Widget3DHighlight:
aColor = NS_RGB(0xa0,0xa0,0xa0);
break;
case eColorID_Widget3DShadow:
aColor = NS_RGB(0x40,0x40,0x40);
break;
-#if (MOZ_WIDGET_GTK == 2)
- case eColorID_TextBackground:
- // not used?
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_NORMAL]);
- break;
- case eColorID_TextForeground:
- // not used?
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_NORMAL]);
- break;
- case eColorID_TextSelectBackground:
- case eColorID_IMESelectedRawTextBackground:
- case eColorID_IMESelectedConvertedTextBackground:
- // still used
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_SELECTED]);
- break;
- case eColorID_TextSelectForeground:
- case eColorID_IMESelectedRawTextForeground:
- case eColorID_IMESelectedConvertedTextForeground:
- // still used
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_SELECTED]);
- break;
-#endif
case eColorID_IMERawInputBackground:
case eColorID_IMEConvertedTextBackground:
aColor = NS_TRANSPARENT;
@@ -352,53 +297,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
aColor = NS_RGB(0xff, 0, 0);
break;
-#if (MOZ_WIDGET_GTK == 2)
- // css2 http://www.w3.org/TR/REC-CSS2/ui.html#system-colors
- case eColorID_activeborder:
- // active window border
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]);
- break;
- case eColorID_activecaption:
- // active window caption background
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]);
- break;
- case eColorID_appworkspace:
- // MDI background color
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]);
- break;
- case eColorID_background:
- // desktop background
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]);
- break;
- case eColorID_captiontext:
- // text in active window caption, size box, and scrollbar arrow box (!)
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_NORMAL]);
- break;
- case eColorID_graytext:
- // disabled text in windows, menus, etc.
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_INSENSITIVE]);
- break;
- case eColorID_highlight:
- // background of selected item
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_SELECTED]);
- break;
- case eColorID_highlighttext:
- // text of selected item
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_SELECTED]);
- break;
- case eColorID_inactiveborder:
- // inactive window border
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]);
- break;
- case eColorID_inactivecaption:
- // inactive window caption
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_INSENSITIVE]);
- break;
- case eColorID_inactivecaptiontext:
- // text in inactive window caption
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_INSENSITIVE]);
- break;
-#else
// css2 http://www.w3.org/TR/REC-CSS2/ui.html#system-colors
case eColorID_activeborder: {
// active window border
@@ -433,7 +331,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
ReleaseStyleContext(style);
break;
}
-#endif
case eColorID_infobackground:
// tooltip background color
aColor = sInfoBackground;
@@ -452,11 +349,7 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
break;
case eColorID_scrollbar:
// scrollbar gray area
-#if (MOZ_WIDGET_GTK == 2)
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_ACTIVE]);
-#else
aColor = sMozScrollbar;
-#endif
break;
case eColorID_threedlightshadow:
@@ -465,11 +358,7 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
case eColorID_threedface:
case eColorID_buttonface:
// 3-D face color
-#if (MOZ_WIDGET_GTK == 3)
aColor = sMozWindowBackground;
-#else
- aColor = sButtonBackground;
-#endif
break;
case eColorID_buttontext:
@@ -491,56 +380,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
aColor = sFrameInnerDarkBorder;
break;
-#if (MOZ_WIDGET_GTK == 2)
- case eColorID_threeddarkshadow:
- // 3-D shadow outer edge color
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->black);
- break;
-
- case eColorID_window:
- case eColorID_windowframe:
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]);
- break;
-
- case eColorID_windowtext:
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_NORMAL]);
- break;
-
- case eColorID__moz_eventreerow:
- case eColorID__moz_field:
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_NORMAL]);
- break;
- case eColorID__moz_fieldtext:
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_NORMAL]);
- break;
- case eColorID__moz_dialog:
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]);
- break;
- case eColorID__moz_dialogtext:
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_NORMAL]);
- break;
- case eColorID__moz_dragtargetzone:
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_SELECTED]);
- break;
- case eColorID__moz_buttondefault:
- // default button border color
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->black);
- break;
- case eColorID__moz_buttonhoverface:
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_PRELIGHT]);
- break;
- case eColorID__moz_buttonhovertext:
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_PRELIGHT]);
- break;
- case eColorID__moz_cellhighlight:
- case eColorID__moz_html_cellhighlight:
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_ACTIVE]);
- break;
- case eColorID__moz_cellhighlighttext:
- case eColorID__moz_html_cellhighlighttext:
- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_ACTIVE]);
- break;
-#else
case eColorID_threeddarkshadow:
// Hardcode to black
aColor = NS_RGB(0x00,0x00,0x00);
@@ -574,7 +413,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
case eColorID__moz_buttonhovertext:
aColor = sButtonHoverText;
break;
-#endif
case eColorID__moz_menuhover:
aColor = sMenuHover;
break;
@@ -590,11 +428,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
case eColorID__moz_comboboxtext:
aColor = sComboBoxText;
break;
-#if (MOZ_WIDGET_GTK == 2)
- case eColorID__moz_combobox:
- aColor = sComboBoxBackground;
- break;
-#endif
case eColorID__moz_menubartext:
aColor = sMenuBarText;
break;
@@ -602,11 +435,7 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
aColor = sMenuBarHoverText;
break;
case eColorID__moz_gtk_info_bar_text:
-#if (MOZ_WIDGET_GTK == 3)
aColor = sInfoBarText;
-#else
- aColor = sInfoText;
-#endif
break;
default:
/* default color is BLACK */
@@ -618,27 +447,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
return res;
}
-#if (MOZ_WIDGET_GTK == 2)
-static void darken_gdk_color(GdkColor *src, GdkColor *dest)
-{
- gdouble red;
- gdouble green;
- gdouble blue;
-
- red = (gdouble) src->red / 65535.0;
- green = (gdouble) src->green / 65535.0;
- blue = (gdouble) src->blue / 65535.0;
-
- red *= 0.93;
- green *= 0.93;
- blue *= 0.93;
-
- dest->red = red * 65535.0;
- dest->green = green * 65535.0;
- dest->blue = blue * 65535.0;
-}
-#endif
-
static int32_t CheckWidgetStyle(GtkWidget* aWidget, const char* aStyle, int32_t aResult) {
gboolean value = FALSE;
gtk_widget_style_get(aWidget, aStyle, &value, nullptr);
@@ -826,14 +634,8 @@ nsLookAndFeel::GetIntImpl(IntID aID, int32_t &aResult)
res = NS_ERROR_NOT_IMPLEMENTED;
break;
case eIntID_TouchEnabled:
-#if MOZ_WIDGET_GTK == 3
aResult = mozilla::widget::WidgetUtils::IsTouchDeviceSupportPresent();
break;
-#else
- aResult = 0;
- res = NS_ERROR_NOT_IMPLEMENTED;
-#endif
- break;
case eIntID_MacGraphiteTheme:
aResult = 0;
res = NS_ERROR_NOT_IMPLEMENTED;
@@ -905,24 +707,20 @@ nsLookAndFeel::GetFloatImpl(FloatID aID, float &aResult)
}
static void
-GetSystemFontInfo(GtkWidget *aWidget,
+GetSystemFontInfo(GtkStyleContext *aStyle,
nsString *aFontName,
gfxFontStyle *aFontStyle)
{
- GtkSettings *settings = gtk_widget_get_settings(aWidget);
-
aFontStyle->style = NS_FONT_STYLE_NORMAL;
- gchar *fontname;
- g_object_get(settings, "gtk-font-name", &fontname, nullptr);
-
+ // As in
+ // https://git.gnome.org/browse/gtk+/tree/gtk/gtkwidget.c?h=3.22.19#n10333
PangoFontDescription *desc;
- desc = pango_font_description_from_string(fontname);
+ gtk_style_context_get(aStyle, gtk_style_context_get_state(aStyle),
+ "font", &desc, nullptr);
aFontStyle->systemFont = true;
- g_free(fontname);
-
NS_NAMED_LITERAL_STRING(quote, "\"");
NS_ConvertUTF8toUTF16 family(pango_font_description_get_family(desc));
*aFontName = quote + family + quote;
@@ -953,96 +751,28 @@ GetSystemFontInfo(GtkWidget *aWidget,
pango_font_description_free(desc);
}
-static void
-GetSystemFontInfo(LookAndFeel::FontID aID,
- nsString *aFontName,
- gfxFontStyle *aFontStyle)
-{
- if (aID == LookAndFeel::eFont_Widget) {
- GtkWidget *label = gtk_label_new("M");
- GtkWidget *parent = gtk_fixed_new();
- GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP);
-
- gtk_container_add(GTK_CONTAINER(parent), label);
- gtk_container_add(GTK_CONTAINER(window), parent);
-
- gtk_widget_ensure_style(label);
- GetSystemFontInfo(label, aFontName, aFontStyle);
- gtk_widget_destroy(window); // no unref, windows are different
-
- } else if (aID == LookAndFeel::eFont_Button) {
- GtkWidget *label = gtk_label_new("M");
- GtkWidget *parent = gtk_fixed_new();
- GtkWidget *button = gtk_button_new();
- GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP);
-
- gtk_container_add(GTK_CONTAINER(button), label);
- gtk_container_add(GTK_CONTAINER(parent), button);
- gtk_container_add(GTK_CONTAINER(window), parent);
-
- gtk_widget_ensure_style(label);
- GetSystemFontInfo(label, aFontName, aFontStyle);
- gtk_widget_destroy(window); // no unref, windows are different
-
- } else if (aID == LookAndFeel::eFont_Field) {
- GtkWidget *entry = gtk_entry_new();
- GtkWidget *parent = gtk_fixed_new();
- GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP);
-
- gtk_container_add(GTK_CONTAINER(parent), entry);
- gtk_container_add(GTK_CONTAINER(window), parent);
-
- gtk_widget_ensure_style(entry);
- GetSystemFontInfo(entry, aFontName, aFontStyle);
- gtk_widget_destroy(window); // no unref, windows are different
-
- } else {
- MOZ_ASSERT(aID == LookAndFeel::eFont_Menu, "unexpected font ID");
- GtkWidget *accel_label = gtk_accel_label_new("M");
- GtkWidget *menuitem = gtk_menu_item_new();
- GtkWidget *menu = gtk_menu_new();
- g_object_ref_sink(menu);
-
- gtk_container_add(GTK_CONTAINER(menuitem), accel_label);
- gtk_menu_shell_append((GtkMenuShell *)GTK_MENU(menu), menuitem);
-
- gtk_widget_ensure_style(accel_label);
- GetSystemFontInfo(accel_label, aFontName, aFontStyle);
- g_object_unref(menu);
- }
-}
-
bool
nsLookAndFeel::GetFontImpl(FontID aID, nsString& aFontName,
gfxFontStyle& aFontStyle,
float aDevPixPerCSSPixel)
{
- nsString *cachedFontName = nullptr;
- gfxFontStyle *cachedFontStyle = nullptr;
- bool *isCached = nullptr;
-
switch (aID) {
case eFont_Menu: // css2
case eFont_PullDownMenu: // css3
- cachedFontName = &mMenuFontName;
- cachedFontStyle = &mMenuFontStyle;
- isCached = &mMenuFontCached;
- aID = eFont_Menu;
- break;
+ aFontName = mMenuFontName;
+ aFontStyle = mMenuFontStyle;
+ return true;
case eFont_Field: // css3
case eFont_List: // css3
- cachedFontName = &mFieldFontName;
- cachedFontStyle = &mFieldFontStyle;
- isCached = &mFieldFontCached;
- aID = eFont_Field;
- break;
+ aFontName = mFieldFontName;
+ aFontStyle = mFieldFontStyle;
+ return true;
case eFont_Button: // css3
- cachedFontName = &mButtonFontName;
- cachedFontStyle = &mButtonFontStyle;
- isCached = &mButtonFontCached;
- break;
+ aFontName = mButtonFontName;
+ aFontStyle = mButtonFontStyle;
+ return true;
case eFont_Caption: // css2
case eFont_Icon: // css2
@@ -1057,21 +787,11 @@ nsLookAndFeel::GetFontImpl(FontID aID, nsString& aFontName,
case eFont_Dialog: // css3
case eFont_Tooltips: // moz
case eFont_Widget: // moz
- cachedFontName = &mDefaultFontName;
- cachedFontStyle = &mDefaultFontStyle;
- isCached = &mDefaultFontCached;
- aID = eFont_Widget;
- break;
- }
-
- if (!*isCached) {
- GetSystemFontInfo(aID, cachedFontName, cachedFontStyle);
- *isCached = true;
+ default:
+ aFontName = mDefaultFontName;
+ aFontStyle = mDefaultFontStyle;
+ return true;
}
-
- aFontName = *cachedFontName;
- aFontStyle = *cachedFontStyle;
- return true;
}
void
@@ -1087,70 +807,6 @@ nsLookAndFeel::EnsureInit()
// gtk does non threadsafe refcounting
MOZ_ASSERT(NS_IsMainThread());
-#if (MOZ_WIDGET_GTK == 2)
- NS_ASSERTION(!mStyle, "already initialized");
- // GtkInvisibles come with a refcount that is not floating
- // (since their initialization code calls g_object_ref_sink) and
- // their destroy code releases that reference (which means they
- // have to be explicitly destroyed, since calling unref enough
- // to cause destruction would lead to *another* unref).
- // However, this combination means that it's actually still ok
- // to use the normal pattern, which is to g_object_ref_sink
- // after construction, and then destroy *and* unref when we're
- // done. (Though we could skip the g_object_ref_sink and the
- // corresponding g_object_unref, but that's particular to
- // GtkInvisibles and GtkWindows.)
- GtkWidget *widget = gtk_invisible_new();
- g_object_ref_sink(widget); // effectively g_object_ref (see above)
-
- gtk_widget_ensure_style(widget);
- mStyle = gtk_style_copy(gtk_widget_get_style(widget));
-
- gtk_widget_destroy(widget);
- g_object_unref(widget);
-
- // tooltip foreground and background
- GtkStyle *style = gtk_rc_get_style_by_paths(gtk_settings_get_default(),
- "gtk-tooltips", "GtkWindow",
- GTK_TYPE_WINDOW);
- if (style) {
- sInfoBackground = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]);
- sInfoText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]);
- }
-
- // menu foreground & menu background
- GtkWidget *accel_label = gtk_accel_label_new("M");
- GtkWidget *menuitem = gtk_menu_item_new();
- GtkWidget *menu = gtk_menu_new();
-
- g_object_ref_sink(menu);
-
- gtk_container_add(GTK_CONTAINER(menuitem), accel_label);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
-
- gtk_widget_set_style(accel_label, nullptr);
- gtk_widget_set_style(menu, nullptr);
- gtk_widget_realize(menu);
- gtk_widget_realize(accel_label);
-
- style = gtk_widget_get_style(accel_label);
- if (style) {
- sMenuText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]);
- }
-
- style = gtk_widget_get_style(menu);
- if (style) {
- sMenuBackground = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]);
- }
-
- style = gtk_widget_get_style(menuitem);
- if (style) {
- sMenuHover = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_PRELIGHT]);
- sMenuHoverText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_PRELIGHT]);
- }
-
- g_object_unref(menu);
-#else
GdkRGBA color;
GtkStyleContext *style;
@@ -1195,6 +851,12 @@ nsLookAndFeel::EnsureInit()
}
}
+ // The label is not added to a parent widget, but shared for constructing
+ // different style contexts. The node hierarchy is constructed only on
+ // the label style context.
+ GtkWidget *labelWidget = gtk_label_new("M");
+ g_object_ref_sink(labelWidget);
+
// Scrollbar colors
style = ClaimStyleContext(MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL);
gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color);
@@ -1208,6 +870,13 @@ nsLookAndFeel::EnsureInit()
gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color);
sMozWindowText = GDK_RGBA_TO_NS_RGBA(color);
ReleaseStyleContext(style);
+ style = ClaimStyleContext(MOZ_GTK_WINDOW_CONTAINER);
+ {
+ GtkStyleContext* labelStyle = CreateStyleForWidget(labelWidget, style);
+ GetSystemFontInfo(labelStyle, &mDefaultFontName, &mDefaultFontStyle);
+ g_object_unref(labelStyle);
+ }
+ ReleaseStyleContext(style);
// tooltip foreground and background
style = ClaimStyleContext(MOZ_GTK_TOOLTIP);
@@ -1224,6 +893,9 @@ nsLookAndFeel::EnsureInit()
{
GtkStyleContext* accelStyle =
CreateStyleForWidget(gtk_accel_label_new("M"), style);
+
+ GetSystemFontInfo(accelStyle, &mMenuFontName, &mMenuFontStyle);
+
gtk_style_context_get_color(accelStyle, GTK_STATE_FLAG_NORMAL, &color);
sMenuText = GDK_RGBA_TO_NS_RGBA(color);
gtk_style_context_get_color(accelStyle, GTK_STATE_FLAG_INSENSITIVE, &color);
@@ -1243,17 +915,8 @@ nsLookAndFeel::EnsureInit()
gtk_style_context_get_color(style, GTK_STATE_FLAG_PRELIGHT, &color);
sMenuHoverText = GDK_RGBA_TO_NS_RGBA(color);
ReleaseStyleContext(style);
-#endif
- // button styles
GtkWidget *parent = gtk_fixed_new();
- GtkWidget *button = gtk_button_new();
- GtkWidget *label = gtk_label_new("M");
-#if (MOZ_WIDGET_GTK == 2)
- GtkWidget *combobox = gtk_combo_box_new();
- GtkWidget *comboboxLabel = gtk_label_new("M");
- gtk_container_add(GTK_CONTAINER(combobox), comboboxLabel);
-#endif
GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP);
GtkWidget *treeView = gtk_tree_view_new();
GtkWidget *linkButton = gtk_link_button_new("http://example.com/");
@@ -1262,94 +925,14 @@ nsLookAndFeel::EnsureInit()
GtkWidget *entry = gtk_entry_new();
GtkWidget *textView = gtk_text_view_new();
- gtk_container_add(GTK_CONTAINER(button), label);
- gtk_container_add(GTK_CONTAINER(parent), button);
gtk_container_add(GTK_CONTAINER(parent), treeView);
gtk_container_add(GTK_CONTAINER(parent), linkButton);
-#if (MOZ_WIDGET_GTK == 2)
- gtk_container_add(GTK_CONTAINER(parent), combobox);
-#endif
gtk_container_add(GTK_CONTAINER(parent), menuBar);
gtk_menu_shell_append(GTK_MENU_SHELL(menuBar), menuBarItem);
gtk_container_add(GTK_CONTAINER(window), parent);
gtk_container_add(GTK_CONTAINER(parent), entry);
gtk_container_add(GTK_CONTAINER(parent), textView);
-#if (MOZ_WIDGET_GTK == 2)
- gtk_widget_set_style(button, nullptr);
- gtk_widget_set_style(label, nullptr);
- gtk_widget_set_style(treeView, nullptr);
- gtk_widget_set_style(linkButton, nullptr);
- gtk_widget_set_style(combobox, nullptr);
- gtk_widget_set_style(comboboxLabel, nullptr);
- gtk_widget_set_style(menuBar, nullptr);
- gtk_widget_set_style(entry, nullptr);
-
- gtk_widget_realize(button);
- gtk_widget_realize(label);
- gtk_widget_realize(treeView);
- gtk_widget_realize(linkButton);
- gtk_widget_realize(combobox);
- gtk_widget_realize(comboboxLabel);
- gtk_widget_realize(menuBar);
- gtk_widget_realize(entry);
-
- style = gtk_widget_get_style(label);
- if (style) {
- sButtonText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]);
- }
-
- style = gtk_widget_get_style(comboboxLabel);
- if (style) {
- sComboBoxText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]);
- }
- style = gtk_widget_get_style(combobox);
- if (style) {
- sComboBoxBackground = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]);
- }
-
- style = gtk_widget_get_style(menuBar);
- if (style) {
- sMenuBarText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]);
- sMenuBarHoverText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_SELECTED]);
- }
-
- // GTK's guide to fancy odd row background colors:
- // 1) Check if a theme explicitly defines an odd row color
- // 2) If not, check if it defines an even row color, and darken it
- // slightly by a hardcoded value (gtkstyle.c)
- // 3) If neither are defined, take the base background color and
- // darken that by a hardcoded value
- colorValuePtr = nullptr;
- gtk_widget_style_get(treeView,
- "odd-row-color", &colorValuePtr,
- nullptr);
-
- if (colorValuePtr) {
- colorValue = *colorValuePtr;
- } else {
- gtk_widget_style_get(treeView,
- "even-row-color", &colorValuePtr,
- nullptr);
- if (colorValuePtr)
- darken_gdk_color(colorValuePtr, &colorValue);
- else
- darken_gdk_color(&treeView->style->base[GTK_STATE_NORMAL], &colorValue);
- }
-
- sOddCellBackground = GDK_COLOR_TO_NS_RGB(colorValue);
- if (colorValuePtr)
- gdk_color_free(colorValuePtr);
-
- style = gtk_widget_get_style(button);
- if (style) {
- sButtonBackground = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]);
- sFrameOuterLightBorder =
- GDK_COLOR_TO_NS_RGB(style->light[GTK_STATE_NORMAL]);
- sFrameInnerDarkBorder =
- GDK_COLOR_TO_NS_RGB(style->dark[GTK_STATE_NORMAL]);
- }
-#else
// Text colors
GdkRGBA bgColor;
// If the text window background is translucent, then the background of
@@ -1381,8 +964,10 @@ nsLookAndFeel::EnsureInit()
// Button text color
style = ClaimStyleContext(MOZ_GTK_BUTTON);
{
- GtkStyleContext* labelStyle =
- CreateStyleForWidget(gtk_label_new("M"), style);
+ GtkStyleContext* labelStyle = CreateStyleForWidget(labelWidget, style);
+
+ GetSystemFontInfo(labelStyle, &mButtonFontName, &mButtonFontStyle);
+
gtk_style_context_get_color(labelStyle, GTK_STATE_FLAG_NORMAL, &color);
sButtonText = GDK_RGBA_TO_NS_RGBA(color);
gtk_style_context_get_color(labelStyle, GTK_STATE_FLAG_PRELIGHT, &color);
@@ -1446,7 +1031,6 @@ nsLookAndFeel::EnsureInit()
gtk_style_context_add_class(style, GTK_STYLE_CLASS_INFO);
gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color);
sInfoBarText = GDK_RGBA_TO_NS_RGBA(color);
-#endif
// Some themes have a unified menu bar, and support window dragging on it
gboolean supports_menubar_drag = FALSE;
GParamSpec *param_spec =
@@ -1493,7 +1074,11 @@ nsLookAndFeel::EnsureInit()
"cursor-aspect-ratio", &sCaretRatio,
nullptr);
+ GetSystemFontInfo(gtk_widget_get_style_context(entry),
+ &mFieldFontName, &mFieldFontStyle);
+
gtk_widget_destroy(window);
+ g_object_unref(labelWidget);
}
// virtual
@@ -1515,11 +1100,6 @@ nsLookAndFeel::RefreshImpl()
mFieldFontCached = false;
mMenuFontCached = false;
-#if (MOZ_WIDGET_GTK == 2)
- g_object_unref(mStyle);
- mStyle = nullptr;
-#endif
-
mInitialized = false;
}
diff --git widget/gtk/nsLookAndFeel.h widget/gtk/nsLookAndFeel.h
index 9a4015e95415..38cd51c056d6 100644
--- widget/gtk/nsLookAndFeel.h
+++ widget/gtk/nsLookAndFeel.h
@@ -33,9 +33,6 @@ public:
virtual bool GetEchoPasswordImpl();
protected:
-#if (MOZ_WIDGET_GTK == 2)
- struct _GtkStyle *mStyle;
-#endif
// Cached fonts
bool mDefaultFontCached;
@@ -63,7 +60,6 @@ protected:
nscolor sMenuHoverText;
nscolor sButtonText;
nscolor sButtonHoverText;
- nscolor sButtonBackground;
nscolor sFrameOuterLightBorder;
nscolor sFrameInnerDarkBorder;
nscolor sOddCellBackground;
@@ -77,9 +73,7 @@ protected:
nscolor sTextSelectedText;
nscolor sTextSelectedBackground;
nscolor sMozScrollbar;
-#if (MOZ_WIDGET_GTK == 3)
nscolor sInfoBarText;
-#endif
char16_t sInvisibleCharacter;
float sCaretRatio;
bool sMenuSupportsDrag;

View File

@ -1,89 +0,0 @@
commit efbe3a9af876
Author: Manish Goregaokar <manishearth@gmail.com>
Date: Wed Aug 2 11:24:35 2017 -0700
Bug 1386887 - Clean up FFI lifetimes to work on nightly; r=emilio
MozReview-Commit-ID: 5WAIVd6p2du
---
layout/style/ServoBindingList.h | 4 ++--
layout/style/ServoBindingTypes.h | 2 ++
layout/style/ServoBindings.h | 4 ++--
layout/style/ServoBindings.toml | 4 +++-
4 files changed, 9 insertions(+), 5 deletions(-)
diff --git layout/style/ServoBindingList.h layout/style/ServoBindingList.h
index 6c669ebb3d3e..87ade14ea4de 100644
--- layout/style/ServoBindingList.h
+++ layout/style/ServoBindingList.h
@@ -379,10 +379,10 @@ SERVO_BINDING_FUNC(Servo_DeclarationBlock_HasCSSWideKeyword, bool,
nsCSSPropertyID property)
// Compose animation value for a given property.
// |base_values| is nsRefPtrHashtable<nsUint32HashKey, RawServoAnimationValue>.
-// We use void* to avoid exposing nsRefPtrHashtable in FFI.
+// We use RawServoAnimationValueTableBorrowed to avoid exposing nsRefPtrHashtable in FFI.
SERVO_BINDING_FUNC(Servo_AnimationCompose, void,
RawServoAnimationValueMapBorrowedMut animation_values,
- void* base_values,
+ RawServoAnimationValueTableBorrowed base_values,
nsCSSPropertyID property,
RawGeckoAnimationPropertySegmentBorrowed animation_segment,
RawGeckoAnimationPropertySegmentBorrowed last_segment,
diff --git layout/style/ServoBindingTypes.h layout/style/ServoBindingTypes.h
index aaf4fc27e1b9..69be15ee9f51 100644
--- layout/style/ServoBindingTypes.h
+++ layout/style/ServoBindingTypes.h
@@ -54,6 +54,8 @@ class nsXBLBinding;
using mozilla::dom::StyleChildrenIterator;
using mozilla::ServoElementSnapshot;
+typedef void* RawServoAnimationValueTableBorrowed;
+
typedef nsINode RawGeckoNode;
typedef mozilla::dom::Element RawGeckoElement;
typedef nsIDocument RawGeckoDocument;
diff --git layout/style/ServoBindings.h layout/style/ServoBindings.h
index 493ca63f932b..c6ced6d1fedb 100644
--- layout/style/ServoBindings.h
+++ layout/style/ServoBindings.h
@@ -268,9 +268,9 @@ double Gecko_GetPositionInSegment(
// Get servo's AnimationValue for |aProperty| from the cached base style
// |aBaseStyles|.
// |aBaseStyles| is nsRefPtrHashtable<nsUint32HashKey, RawServoAnimationValue>.
-// We use void* to avoid exposing nsRefPtrHashtable in FFI.
+// We use RawServoAnimationValueTableBorrowed to avoid exposing nsRefPtrHashtable in FFI.
RawServoAnimationValueBorrowedOrNull Gecko_AnimationGetBaseStyle(
- void* aBaseStyles,
+ RawServoAnimationValueTableBorrowed aBaseStyles,
nsCSSPropertyID aProperty);
void Gecko_StyleTransition_SetUnsupportedProperty(
mozilla::StyleTransition* aTransition,
diff --git layout/style/ServoBindings.toml layout/style/ServoBindings.toml
index 11e372541235..3c3902beea80 100644
--- layout/style/ServoBindings.toml
+++ layout/style/ServoBindings.toml
@@ -357,6 +357,7 @@ raw-lines = [
"pub type ServoStyleContextBorrowed<'a> = &'a ::properties::ComputedValues;",
"pub type ServoStyleContextBorrowedOrNull<'a> = Option<&'a ::properties::ComputedValues>;",
"pub type ServoComputedDataBorrowed<'a> = &'a ServoComputedData;",
+ "pub type RawServoAnimationValueTableBorrowed<'a> = &'a ();"
]
whitelist-functions = ["Servo_.*", "Gecko_.*"]
structs-types = [
@@ -389,7 +390,7 @@ structs-types = [
"RawGeckoPresContext",
"RawGeckoPresContextOwned",
"RawGeckoStyleAnimationList",
- "RawGeckoStyleChildrenIteratorBorrowedMut",
+ "RawGeckoStyleChildrenIterator",
"RawGeckoServoStyleRuleList",
"RawGeckoURLExtraData",
"RawGeckoXBLBinding",
@@ -526,6 +527,7 @@ servo-borrow-types = [
"RawGeckoFontFaceRuleList",
"RawGeckoServoStyleRuleList",
"RawGeckoServoAnimationValueList",
+ "RawGeckoStyleChildrenIterator",
]
fixups = [
# hack for gecko-owned string

View File

@ -1,14 +0,0 @@
https://github.com/kinetiknz/cubeb/commit/16f9ccc064f2
--- media/libcubeb/src/cubeb_jack.cpp.orig 2017-07-07 05:37:16 UTC
+++ media/libcubeb/src/cubeb_jack.cpp
@@ -8,7 +8,9 @@
*/
#define _DEFAULT_SOURCE
#define _BSD_SOURCE
+#ifndef __FreeBSD__
#define _POSIX_SOURCE
+#endif
#include <dlfcn.h>
#include <stdio.h>
#include <string.h>

View File

@ -1,49 +0,0 @@
commit e1c252eab1f4
Author: Milan Sreckovic <milan@mozilla.com>
Date: Mon Oct 23 16:22:47 2017 -0400
Bug 1387799 - Keep an extra reference. r=jrmuizel, a=ritu
--HG--
extra : source : 8199078921c6b4c0ee4c984100d33750dfe8e144
---
gfx/layers/ipc/CompositorBridgeChild.cpp | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git gfx/layers/ipc/CompositorBridgeChild.cpp gfx/layers/ipc/CompositorBridgeChild.cpp
index 9419f4b2da36..55fd9c10871b 100644
--- gfx/layers/ipc/CompositorBridgeChild.cpp
+++ gfx/layers/ipc/CompositorBridgeChild.cpp
@@ -523,10 +523,14 @@ CompositorBridgeChild::RecvHideAllPlugins(const uintptr_t& aParentWidget)
}
mozilla::ipc::IPCResult
-CompositorBridgeChild::RecvDidComposite(const uint64_t& aId, const uint64_t& aTransactionId,
+CompositorBridgeChild::RecvDidComposite(const uint64_t& aId,
+ const uint64_t& aTransactionId,
const TimeStamp& aCompositeStart,
const TimeStamp& aCompositeEnd)
{
+ // Hold a reference to keep texture pools alive. See bug 1387799
+ AutoTArray<RefPtr<TextureClientPool>,2> texturePools = mTexturePools;
+
if (mLayerManager) {
MOZ_ASSERT(aId == 0);
MOZ_ASSERT(mLayerManager->GetBackendType() == LayersBackend::LAYERS_CLIENT ||
@@ -541,13 +545,14 @@ CompositorBridgeChild::RecvDidComposite(const uint64_t& aId, const uint64_t& aTr
}
}
- for (size_t i = 0; i < mTexturePools.Length(); i++) {
- mTexturePools[i]->ReturnDeferredClients();
+ for (size_t i = 0; i < texturePools.Length(); i++) {
+ texturePools[i]->ReturnDeferredClients();
}
return IPC_OK();
}
+
void
CompositorBridgeChild::ActorDestroy(ActorDestroyReason aWhy)
{

View File

@ -1,42 +0,0 @@
commit a1341ccf6d63
Author: Christoph Kerschbaumer <ckerschb@christophkerschbaumer.com>
Date: Sun Aug 6 11:37:09 2017 +0200
Bug 1387811 - Follow up for Test within Bug 1381761: CSP JSON is never null, hence it's better to check actual contents of JSON for testing. r=dveditz
---
dom/security/test/csp/file_data_csp_inheritance.html | 6 ++++--
dom/security/test/csp/test_data_csp_inheritance.html | 4 +++-
2 files changed, 7 insertions(+), 3 deletions(-)
diff --git dom/security/test/csp/file_data_csp_inheritance.html dom/security/test/csp/file_data_csp_inheritance.html
index 299c30255aa6..cbb4865343db 100644
--- dom/security/test/csp/file_data_csp_inheritance.html
+++ dom/security/test/csp/file_data_csp_inheritance.html
@@ -13,8 +13,10 @@
var frame = document.getElementById("dataFrame");
var principal = SpecialPowers.wrap(frame.contentDocument).nodePrincipal;
var cspJSON = principal.cspJSON;
- var result = principal.cspJSON ? "dataInheritsCSP" : "dataDoesNotInheritCSP";
- window.parent.postMessage({result}, "*");
+ var cspOBJ = JSON.parse(principal.cspJSON);
+ // make sure we got >>one<< policy
+ var policies = cspOBJ["csp-policies"];
+ window.parent.postMessage({result: policies.length}, "*");
</script>
</body>
diff --git dom/security/test/csp/test_data_csp_inheritance.html dom/security/test/csp/test_data_csp_inheritance.html
index 3afc4f7c02bc..bde2f5617e65 100644
--- dom/security/test/csp/test_data_csp_inheritance.html
+++ dom/security/test/csp/test_data_csp_inheritance.html
@@ -22,7 +22,9 @@ SimpleTest.waitForExplicitFinish();
window.addEventListener("message", receiveMessage);
function receiveMessage(event) {
window.removeEventListener("message", receiveMessage);
- is(event.data.result, "dataInheritsCSP",
+ // toplevel CSP should apply to data: URI iframe hence resulting
+ // in 1 applied policy.
+ is(event.data.result, 1,
"data: URI iframe inherits CSP from including context");
SimpleTest.finish();
}

View File

@ -1,38 +0,0 @@
commit 8687f49efa88
Author: sotaro <sotaro.ikeda.g@gmail.com>
Date: Wed Aug 23 13:49:29 2017 +0900
Bug 1387845 - Add more NS_BUILD_REFCNT_LOGGING in AtomicRefCountedWithFinalize r=nical
---
gfx/layers/AtomicRefCountedWithFinalize.h | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git gfx/layers/AtomicRefCountedWithFinalize.h gfx/layers/AtomicRefCountedWithFinalize.h
index 37f0a9f592a1..9941ccb13f2d 100644
--- gfx/layers/AtomicRefCountedWithFinalize.h
+++ gfx/layers/AtomicRefCountedWithFinalize.h
@@ -101,8 +101,12 @@ public:
private:
void AddRef() {
MOZ_ASSERT(mRefCount >= 0, "AddRef() during/after Finalize()/dtor.");
- mRefCount++;
- NS_LOG_ADDREF(this, mRefCount, mName, sizeof(*this));
+#ifdef NS_BUILD_REFCNT_LOGGING
+ int currCount = ++mRefCount;
+ NS_LOG_ADDREF(this, currCount, mName, sizeof(*this));
+#else
+ ++mRefCount;
+#endif
}
void Release() {
@@ -118,7 +122,9 @@ private:
++mRefCount;
return;
}
+#ifdef NS_BUILD_REFCNT_LOGGING
NS_LOG_RELEASE(this, currCount, mName);
+#endif
if (0 == currCount) {
mRefCount = detail::DEAD;

View File

@ -1,144 +0,0 @@
commit d20c7d929c84
Author: Ethan <ettseng@mozilla.com>
Date: Fri Sep 1 17:29:44 2017 +0800
Bug 1393283 - Use the last ESR version as the spoofed Firefox version. r=tihuang, r=mcmanus
---
.../test/browser/browser_navigator.js | 2 +-
netwerk/protocol/http/nsHttpHandler.cpp | 16 +++----
.../resistfingerprinting/nsRFPService.cpp | 56 ++++++++++++++++++++++
.../components/resistfingerprinting/nsRFPService.h | 3 ++
4 files changed, 66 insertions(+), 11 deletions(-)
diff --git browser/components/resistfingerprinting/test/browser/browser_navigator.js browser/components/resistfingerprinting/test/browser/browser_navigator.js
index 25c393d8bb2a..9f52e34a9451 100644
--- browser/components/resistfingerprinting/test/browser/browser_navigator.js
+++ browser/components/resistfingerprinting/test/browser/browser_navigator.js
@@ -91,7 +91,7 @@ add_task(async function setup() {
let appInfo = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo);
let appVersion = parseInt(appInfo.version);
- let spoofedVersion = appVersion - (appVersion % 10);
+ let spoofedVersion = appVersion - ((appVersion - 3) % 7);
spoofedUserAgent = `Mozilla/5.0 (${SPOOFED_OSCPU}; rv:${spoofedVersion}.0) Gecko/20100101 Firefox/${spoofedVersion}.0`;
});
diff --git netwerk/protocol/http/nsHttpHandler.cpp netwerk/protocol/http/nsHttpHandler.cpp
index 31d0f8832732..b957d835b52f 100644
--- netwerk/protocol/http/nsHttpHandler.cpp
+++ netwerk/protocol/http/nsHttpHandler.cpp
@@ -461,16 +461,12 @@ nsHttpHandler::Init()
mAppVersion.AssignLiteral(MOZ_APP_UA_VERSION);
}
- // Generating the spoofed userAgent for fingerprinting resistance.
- // The browser version will be rounded down to a multiple of 10.
- // By doing so, the anonymity group will cover more versions instead of one
- // version.
- uint32_t spoofedVersion = mAppVersion.ToInteger(&rv);
- if (NS_SUCCEEDED(rv)) {
- spoofedVersion = spoofedVersion - (spoofedVersion % 10);
- mSpoofedUserAgent.Assign(nsPrintfCString(
- "Mozilla/5.0 (%s; rv:%d.0) Gecko/%s Firefox/%d.0",
- SPOOFED_OSCPU, spoofedVersion, LEGACY_BUILD_ID, spoofedVersion));
+ // Generating the spoofed User Agent for fingerprinting resistance.
+ rv = nsRFPService::GetSpoofedUserAgent(mSpoofedUserAgent);
+ if (NS_FAILED(rv)) {
+ // Empty mSpoofedUserAgent to make sure the unsuccessful spoofed UA string
+ // will not be used anywhere.
+ mSpoofedUserAgent.Truncate();
}
mSessionStartTime = NowInSeconds();
diff --git toolkit/components/resistfingerprinting/nsRFPService.cpp toolkit/components/resistfingerprinting/nsRFPService.cpp
index 94554200c3b8..96a2940c04a0 100644
--- toolkit/components/resistfingerprinting/nsRFPService.cpp
+++ toolkit/components/resistfingerprinting/nsRFPService.cpp
@@ -18,10 +18,13 @@
#include "nsServiceManagerUtils.h"
#include "nsString.h"
#include "nsXULAppAPI.h"
+#include "nsPrintfCString.h"
#include "nsIObserverService.h"
#include "nsIPrefBranch.h"
#include "nsIPrefService.h"
+#include "nsIXULAppInfo.h"
+#include "nsIXULRuntime.h"
#include "nsJSUtils.h"
#include "prenv.h"
@@ -162,6 +165,59 @@ nsRFPService::GetSpoofedPresentedFrames(double aTime, uint32_t aWidth, uint32_t
return NSToIntFloor(time * sVideoFramesPerSec * ((100 - boundedDroppedRatio) / 100.0));
}
+/* static */
+nsresult
+nsRFPService::GetSpoofedUserAgent(nsACString &userAgent)
+{
+ // This function generates the spoofed value of User Agent.
+ // We spoof the values of the platform and Firefox version, which could be
+ // used as fingerprinting sources to identify individuals.
+ // Reference of the format of User Agent:
+ // https://developer.mozilla.org/en-US/docs/Web/API/NavigatorID/userAgent
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent
+
+ nsresult rv;
+ nsCOMPtr<nsIXULAppInfo> appInfo =
+ do_GetService("@mozilla.org/xre/app-info;1", &rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ nsAutoCString appVersion;
+ rv = appInfo->GetVersion(appVersion);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // The browser version will be spoofed as the last ESR version.
+ // By doing so, the anonymity group will cover more versions instead of one
+ // version.
+ uint32_t firefoxVersion = appVersion.ToInteger(&rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // Starting from Firefox 10, Firefox ESR was released once every seven
+ // Firefox releases, e.g. Firefox 10, 17, 24, 31, and so on.
+ // We infer the last and closest ESR version based on this rule.
+ nsCOMPtr<nsIXULRuntime> runtime =
+ do_GetService("@mozilla.org/xre/runtime;1", &rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ nsAutoCString updateChannel;
+ rv = runtime->GetDefaultUpdateChannel(updateChannel);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // If we are running in Firefox ESR, determine whether the formula of ESR
+ // version has changed. Once changed, we must update the formula in this
+ // function.
+ if (updateChannel.Equals("esr")) {
+ MOZ_ASSERT(((firefoxVersion % 7) == 3),
+ "Please udpate ESR version formula in nsRFPService.cpp");
+ }
+
+ uint32_t spoofedVersion = firefoxVersion - ((firefoxVersion - 3) % 7);
+ userAgent.Assign(nsPrintfCString(
+ "Mozilla/5.0 (%s; rv:%d.0) Gecko/%s Firefox/%d.0",
+ SPOOFED_OSCPU, spoofedVersion, LEGACY_BUILD_ID, spoofedVersion));
+
+ return rv;
+}
+
nsresult
nsRFPService::Init()
{
diff --git toolkit/components/resistfingerprinting/nsRFPService.h toolkit/components/resistfingerprinting/nsRFPService.h
index cf1f688bb992..bad80383883b 100644
--- toolkit/components/resistfingerprinting/nsRFPService.h
+++ toolkit/components/resistfingerprinting/nsRFPService.h
@@ -49,6 +49,9 @@ public:
static uint32_t GetSpoofedDroppedFrames(double aTime, uint32_t aWidth, uint32_t aHeight);
static uint32_t GetSpoofedPresentedFrames(double aTime, uint32_t aWidth, uint32_t aHeight);
+ // This method generates the spoofed value of User Agent.
+ static nsresult GetSpoofedUserAgent(nsACString &userAgent);
+
private:
nsresult Init();

View File

@ -1,387 +0,0 @@
commit e70d76485c22
Author: Thomas Nguyen <tnguyen@mozilla.com>
Date: Tue Sep 5 17:14:54 2017 +0800
Bug 1394031 - Remove mCryptoHash members of nsUrlClassifierDBServiceWorker and ProtocolParser
The usage of cryptoHash consists of a complete set of Init, Update, and Finish, there's
no reason to keep it around
MozReview-Commit-ID: 7bT9IsWEM5m
---
toolkit/components/url-classifier/Classifier.cpp | 5 +---
toolkit/components/url-classifier/Classifier.h | 2 --
toolkit/components/url-classifier/Entries.h | 12 ++++++----
.../components/url-classifier/ProtocolParser.cpp | 15 ++++--------
toolkit/components/url-classifier/ProtocolParser.h | 4 ----
.../url-classifier/nsUrlClassifierDBService.cpp | 8 -------
.../url-classifier/nsUrlClassifierDBService.h | 3 ---
.../url-classifier/tests/gtest/Common.cpp | 3 +--
.../url-classifier/tests/gtest/TestCaching.cpp | 28 ++++++++--------------
.../url-classifier/tests/gtest/TestClassifier.cpp | 3 +--
.../tests/gtest/TestLookupCacheV4.cpp | 3 +--
.../tests/unit/head_urlclassifier.js | 3 +++
12 files changed, 29 insertions(+), 60 deletions(-)
diff --git toolkit/components/url-classifier/Classifier.cpp toolkit/components/url-classifier/Classifier.cpp
index 68169925d2d0..404e31e2421e 100644
--- toolkit/components/url-classifier/Classifier.cpp
+++ toolkit/components/url-classifier/Classifier.cpp
@@ -257,9 +257,6 @@ Classifier::Open(nsIFile& aCacheDirectory)
rv = CreateStoreDirectory();
NS_ENSURE_SUCCESS(rv, rv);
- mCryptoHash = do_CreateInstance(NS_CRYPTO_HASH_CONTRACTID, &rv);
- NS_ENSURE_SUCCESS(rv, rv);
-
// Build the list of know urlclassifier lists
// XXX: Disk IO potentially on the main thread during startup
RegenActiveTables();
@@ -470,7 +467,7 @@ Classifier::Check(const nsACString& aSpec,
// Now check each lookup fragment against the entries in the DB.
for (uint32_t i = 0; i < fragments.Length(); i++) {
Completion lookupHash;
- lookupHash.FromPlaintext(fragments[i], mCryptoHash);
+ lookupHash.FromPlaintext(fragments[i]);
if (LOG_ENABLED()) {
nsAutoCString checking;
diff --git toolkit/components/url-classifier/Classifier.h toolkit/components/url-classifier/Classifier.h
index 83cbcecf5ee8..e8bf890dc95a 100644
--- toolkit/components/url-classifier/Classifier.h
+++ toolkit/components/url-classifier/Classifier.h
@@ -13,7 +13,6 @@
#include "nsCOMPtr.h"
#include "nsString.h"
#include "nsIFile.h"
-#include "nsICryptoHash.h"
#include "nsDataHashtable.h"
class nsIThread;
@@ -207,7 +206,6 @@ private:
nsCOMPtr<nsIFile> mBackupDirectory;
nsCOMPtr<nsIFile> mUpdatingDirectory; // For update only.
nsCOMPtr<nsIFile> mToDeleteDirectory;
- nsCOMPtr<nsICryptoHash> mCryptoHash;
nsTArray<LookupCache*> mLookupCaches; // For query only.
nsTArray<nsCString> mActiveTablesCache;
uint32_t mHashKey;
diff --git toolkit/components/url-classifier/Entries.h toolkit/components/url-classifier/Entries.h
index bb32204db0f3..d664b57f1d27 100644
--- toolkit/components/url-classifier/Entries.h
+++ toolkit/components/url-classifier/Entries.h
@@ -35,21 +35,25 @@ struct SafebrowsingHash
typedef SafebrowsingHash<S, Comparator> self_type;
uint8_t buf[S];
- nsresult FromPlaintext(const nsACString& aPlainText, nsICryptoHash* aHash) {
+ nsresult FromPlaintext(const nsACString& aPlainText) {
// From the protocol doc:
// Each entry in the chunk is composed
// of the SHA 256 hash of a suffix/prefix expression.
+ nsresult rv;
+ nsCOMPtr<nsICryptoHash> hash =
+ do_CreateInstance(NS_CRYPTO_HASH_CONTRACTID, &rv);
+ NS_ENSURE_SUCCESS(rv, rv);
- nsresult rv = aHash->Init(nsICryptoHash::SHA256);
+ rv = hash->Init(nsICryptoHash::SHA256);
NS_ENSURE_SUCCESS(rv, rv);
- rv = aHash->Update
+ rv = hash->Update
(reinterpret_cast<const uint8_t*>(aPlainText.BeginReading()),
aPlainText.Length());
NS_ENSURE_SUCCESS(rv, rv);
nsAutoCString hashed;
- rv = aHash->Finish(false, hashed);
+ rv = hash->Finish(false, hashed);
NS_ENSURE_SUCCESS(rv, rv);
NS_ASSERTION(hashed.Length() >= sHashSize,
diff --git toolkit/components/url-classifier/ProtocolParser.cpp toolkit/components/url-classifier/ProtocolParser.cpp
index 5f61c7bbcf6b..d4fce581e394 100644
--- toolkit/components/url-classifier/ProtocolParser.cpp
+++ toolkit/components/url-classifier/ProtocolParser.cpp
@@ -80,13 +80,6 @@ ProtocolParser::~ProtocolParser()
CleanupUpdates();
}
-nsresult
-ProtocolParser::Init(nsICryptoHash* aHasher)
-{
- mCryptoHash = aHasher;
- return NS_OK;
-}
-
void
ProtocolParser::CleanupUpdates()
{
@@ -404,7 +397,7 @@ ProtocolParserV2::ProcessPlaintextChunk(const nsACString& aChunk)
if (mChunkState.type == CHUNK_ADD) {
if (mChunkState.hashSize == COMPLETE_SIZE) {
Completion hash;
- hash.FromPlaintext(line, mCryptoHash);
+ hash.FromPlaintext(line);
nsresult rv = mTableUpdate->NewAddComplete(mChunkState.num, hash);
if (NS_FAILED(rv)) {
return rv;
@@ -412,7 +405,7 @@ ProtocolParserV2::ProcessPlaintextChunk(const nsACString& aChunk)
} else {
NS_ASSERTION(mChunkState.hashSize == 4, "Only 32- or 4-byte hashes can be used for add chunks.");
Prefix hash;
- hash.FromPlaintext(line, mCryptoHash);
+ hash.FromPlaintext(line);
nsresult rv = mTableUpdate->NewAddPrefix(mChunkState.num, hash);
if (NS_FAILED(rv)) {
return rv;
@@ -433,7 +426,7 @@ ProtocolParserV2::ProcessPlaintextChunk(const nsACString& aChunk)
if (mChunkState.hashSize == COMPLETE_SIZE) {
Completion hash;
- hash.FromPlaintext(Substring(iter, end), mCryptoHash);
+ hash.FromPlaintext(Substring(iter, end));
nsresult rv = mTableUpdate->NewSubComplete(addChunk, hash, mChunkState.num);
if (NS_FAILED(rv)) {
return rv;
@@ -441,7 +434,7 @@ ProtocolParserV2::ProcessPlaintextChunk(const nsACString& aChunk)
} else {
NS_ASSERTION(mChunkState.hashSize == 4, "Only 32- or 4-byte hashes can be used for add chunks.");
Prefix hash;
- hash.FromPlaintext(Substring(iter, end), mCryptoHash);
+ hash.FromPlaintext(Substring(iter, end));
nsresult rv = mTableUpdate->NewSubPrefix(addChunk, hash, mChunkState.num);
if (NS_FAILED(rv)) {
return rv;
diff --git toolkit/components/url-classifier/ProtocolParser.h toolkit/components/url-classifier/ProtocolParser.h
index 329911621f18..066e8892df7b 100644
--- toolkit/components/url-classifier/ProtocolParser.h
+++ toolkit/components/url-classifier/ProtocolParser.h
@@ -7,7 +7,6 @@
#define ProtocolParser_h__
#include "HashStore.h"
-#include "nsICryptoHMAC.h"
#include "safebrowsing.pb.h"
namespace mozilla {
@@ -28,8 +27,6 @@ public:
nsresult Status() const { return mUpdateStatus; }
- nsresult Init(nsICryptoHash* aHasher);
-
#ifdef MOZ_SAFEBROWSING_DUMP_FAILED_UPDATES
virtual nsCString GetRawTableUpdates() const { return mPending; }
#endif
@@ -73,7 +70,6 @@ protected:
nsTArray<TableUpdate*> mTableUpdates;
nsTArray<ForwardedUpdate> mForwards;
- nsCOMPtr<nsICryptoHash> mCryptoHash;
// The table names that were requested from the client.
nsTArray<nsCString> mRequestedTables;
diff --git toolkit/components/url-classifier/nsUrlClassifierDBService.cpp toolkit/components/url-classifier/nsUrlClassifierDBService.cpp
index 6d82c25de7cf..40de1b4130b0 100644
--- toolkit/components/url-classifier/nsUrlClassifierDBService.cpp
+++ toolkit/components/url-classifier/nsUrlClassifierDBService.cpp
@@ -8,8 +8,6 @@
#include "nsAppDirectoryServiceDefs.h"
#include "nsArrayUtils.h"
#include "nsCRT.h"
-#include "nsICryptoHash.h"
-#include "nsICryptoHMAC.h"
#include "nsIDirectoryService.h"
#include "nsIKeyModule.h"
#include "nsIObserverService.h"
@@ -467,8 +465,6 @@ nsUrlClassifierDBServiceWorker::BeginStream(const nsACString &table)
return NS_ERROR_OUT_OF_MEMORY;
}
- mProtocolParser->Init(mCryptoHash);
-
if (!table.IsEmpty()) {
mProtocolParser->SetCurrentTable(table);
}
@@ -809,7 +805,6 @@ nsUrlClassifierDBServiceWorker::CloseDb()
mClassifier = nullptr;
}
- mCryptoHash = nullptr;
LOG(("urlclassifier db closed\n"));
return NS_OK;
@@ -944,9 +939,6 @@ nsUrlClassifierDBServiceWorker::OpenDb()
}
nsresult rv;
- mCryptoHash = do_CreateInstance(NS_CRYPTO_HASH_CONTRACTID, &rv);
- NS_ENSURE_SUCCESS(rv, rv);
-
nsAutoPtr<Classifier> classifier(new (fallible) Classifier());
if (!classifier) {
return NS_ERROR_OUT_OF_MEMORY;
diff --git toolkit/components/url-classifier/nsUrlClassifierDBService.h toolkit/components/url-classifier/nsUrlClassifierDBService.h
index 8d284f5b0842..a4c5952e91bb 100644
--- toolkit/components/url-classifier/nsUrlClassifierDBService.h
+++ toolkit/components/url-classifier/nsUrlClassifierDBService.h
@@ -270,9 +270,6 @@ private:
bool IsSameAsLastResults(CacheResultArray& aResult);
- // Can only be used on the background thread
- nsCOMPtr<nsICryptoHash> mCryptoHash;
-
nsAutoPtr<mozilla::safebrowsing::Classifier> mClassifier;
// The class that actually parses the update chunks.
nsAutoPtr<ProtocolParser> mProtocolParser;
diff --git toolkit/components/url-classifier/tests/gtest/Common.cpp toolkit/components/url-classifier/tests/gtest/Common.cpp
index 2d11cf87ccca..812151f569a4 100644
--- toolkit/components/url-classifier/tests/gtest/Common.cpp
+++ toolkit/components/url-classifier/tests/gtest/Common.cpp
@@ -152,8 +152,7 @@ nsCString
GeneratePrefix(const nsCString& aFragment, uint8_t aLength)
{
Completion complete;
- nsCOMPtr<nsICryptoHash> cryptoHash = do_CreateInstance(NS_CRYPTO_HASH_CONTRACTID);
- complete.FromPlaintext(aFragment, cryptoHash);
+ complete.FromPlaintext(aFragment);
nsCString hash;
hash.Assign((const char *)complete.buf, aLength);
diff --git toolkit/components/url-classifier/tests/gtest/TestCaching.cpp toolkit/components/url-classifier/tests/gtest/TestCaching.cpp
index b280f7c61af6..7a9f5cdbb0e7 100644
--- toolkit/components/url-classifier/tests/gtest/TestCaching.cpp
+++ toolkit/components/url-classifier/tests/gtest/TestCaching.cpp
@@ -18,14 +18,11 @@ SetupCacheEntry(LookupCacheV2* aLookupCache,
MissPrefixArray misses;
MissPrefixArray emptyMisses;
- nsCOMPtr<nsICryptoHash> cryptoHash =
- do_CreateInstance(NS_CRYPTO_HASH_CONTRACTID);
-
AddComplete* add = completes.AppendElement(fallible);
- add->complete.FromPlaintext(aCompletion, cryptoHash);
+ add->complete.FromPlaintext(aCompletion);
Prefix* prefix = misses.AppendElement(fallible);
- prefix->FromPlaintext(aCompletion, cryptoHash);
+ prefix->FromPlaintext(aCompletion);
// Setup positive cache first otherwise negative cache expiry will be
// overwritten.
@@ -45,9 +42,7 @@ SetupCacheEntry(LookupCacheV4* aLookupCache,
FullHashResponseMap map;
Prefix prefix;
- nsCOMPtr<nsICryptoHash> cryptoHash =
- do_CreateInstance(NS_CRYPTO_HASH_CONTRACTID);
- prefix.FromPlaintext(aCompletion, cryptoHash);
+ prefix.FromPlaintext(aCompletion);
CachedFullHashResponse* response = map.LookupOrAdd(prefix.ToUint32());
@@ -104,8 +99,7 @@ TestCache(const _Fragment& aFragment,
T* aCache = nullptr)
{
Completion lookupHash;
- nsCOMPtr<nsICryptoHash> cryptoHash = do_CreateInstance(NS_CRYPTO_HASH_CONTRACTID);
- lookupHash.FromPlaintext(aFragment, cryptoHash);
+ lookupHash.FromPlaintext(aFragment);
TestCache<T>(lookupHash, aExpectedHas, aExpectedConfirmed, aExpectedInCache, aCache);
}
@@ -148,13 +142,12 @@ TEST(UrlClassifierCaching, InNegativeCacheNotExpired)
{
// Create a fullhash whose prefix matches the prefix in negative cache
// but completion doesn't match any fullhash in positive cache.
- nsCOMPtr<nsICryptoHash> cryptoHash = do_CreateInstance(NS_CRYPTO_HASH_CONTRACTID);
Completion prefix;
- prefix.FromPlaintext(_Fragment("cache.notexpired.com/"), cryptoHash);
+ prefix.FromPlaintext(_Fragment("cache.notexpired.com/"));
Completion fullhash;
- fullhash.FromPlaintext(_Fragment("firefox.com/"), cryptoHash);
+ fullhash.FromPlaintext(_Fragment("firefox.com/"));
// Overwrite the 4-byte prefix of `fullhash` so that it conflicts with `prefix`.
// Since "cache.notexpired.com" is added to database in TestCache as a
@@ -171,13 +164,12 @@ TEST(UrlClassifierCaching, InNegativeCacheNotExpired)
TEST(UrlClassifierCaching, InNegativeCacheExpired)
{
// Create a fullhash whose prefix is in the cache.
- nsCOMPtr<nsICryptoHash> cryptoHash = do_CreateInstance(NS_CRYPTO_HASH_CONTRACTID);
Completion prefix;
- prefix.FromPlaintext(_Fragment("cache.expired.com/"), cryptoHash);
+ prefix.FromPlaintext(_Fragment("cache.expired.com/"));
Completion fullhash;
- fullhash.FromPlaintext(_Fragment("firefox.com/"), cryptoHash);
+ fullhash.FromPlaintext(_Fragment("firefox.com/"));
memcpy(fullhash.buf, prefix.buf, 10);
@@ -255,7 +247,7 @@ TEST(UrlClassifierCaching, NegativeCacheExpireV2)
MissPrefixArray misses;
Prefix* prefix = misses.AppendElement(fallible);
- prefix->FromPlaintext(NEG_CACHE_EXPIRED_URL, cryptoHash);
+ prefix->FromPlaintext(NEG_CACHE_EXPIRED_URL);
AddCompleteArray dummy;
cache->AddGethashResultToCache(dummy, misses, EXPIRED_TIME_SEC);
@@ -275,7 +267,7 @@ TEST(UrlClassifierCaching, NegativeCacheExpireV4)
FullHashResponseMap map;
Prefix prefix;
nsCOMPtr<nsICryptoHash> cryptoHash = do_CreateInstance(NS_CRYPTO_HASH_CONTRACTID);
- prefix.FromPlaintext(NEG_CACHE_EXPIRED_URL, cryptoHash);
+ prefix.FromPlaintext(NEG_CACHE_EXPIRED_URL);
CachedFullHashResponse* response = map.LookupOrAdd(prefix.ToUint32());
response->negativeCacheExpirySec = EXPIRED_TIME_SEC;
diff --git toolkit/components/url-classifier/tests/gtest/TestClassifier.cpp toolkit/components/url-classifier/tests/gtest/TestClassifier.cpp
index a4d21581315e..23b7e9ef59d1 100644
--- toolkit/components/url-classifier/tests/gtest/TestClassifier.cpp
+++ toolkit/components/url-classifier/tests/gtest/TestClassifier.cpp
@@ -71,8 +71,7 @@ TestReadNoiseEntries(Classifier* classifier,
const nsCString& aFragment)
{
Completion lookupHash;
- nsCOMPtr<nsICryptoHash> cryptoHash = do_CreateInstance(NS_CRYPTO_HASH_CONTRACTID);
- lookupHash.FromPlaintext(aFragment, cryptoHash);
+ lookupHash.FromPlaintext(aFragment);
LookupResult result;
result.hash.complete = lookupHash;
diff --git toolkit/components/url-classifier/tests/gtest/TestLookupCacheV4.cpp toolkit/components/url-classifier/tests/gtest/TestLookupCacheV4.cpp
index b2ed091ae308..3fbea2d9d475 100644
--- toolkit/components/url-classifier/tests/gtest/TestLookupCacheV4.cpp
+++ toolkit/components/url-classifier/tests/gtest/TestLookupCacheV4.cpp
@@ -17,8 +17,7 @@ TestHasPrefix(const _Fragment& aFragment, bool aExpectedHas, bool aExpectedCompl
UniquePtr<LookupCache> cache = SetupLookupCache<LookupCacheV4>(array);
Completion lookupHash;
- nsCOMPtr<nsICryptoHash> cryptoHash = do_CreateInstance(NS_CRYPTO_HASH_CONTRACTID);
- lookupHash.FromPlaintext(aFragment, cryptoHash);
+ lookupHash.FromPlaintext(aFragment);
bool has, confirmed;
uint32_t matchLength;
diff --git toolkit/components/url-classifier/tests/unit/head_urlclassifier.js toolkit/components/url-classifier/tests/unit/head_urlclassifier.js
index f52ded37c2e9..61b0c170d457 100644
--- toolkit/components/url-classifier/tests/unit/head_urlclassifier.js
+++ toolkit/components/url-classifier/tests/unit/head_urlclassifier.js
@@ -17,6 +17,9 @@ do_get_profile();
var dirSvc = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties);
+// Ensure PSM is initialized before the test
+Cc["@mozilla.org/psm;1"].getService(Ci.nsISupports);
+
var iosvc = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
var secMan = Cc["@mozilla.org/scriptsecuritymanager;1"]

View File

@ -1,24 +0,0 @@
commit a51675964a63
Author: Jeff Gilbert <jgilbert@mozilla.com>
Date: Tue Oct 17 17:14:29 2017 -0700
Bug 1394265 - Set MAX_COMBINED_TEXTURE_IMAGE_UNITS to 0 if GetIntegeriv fails. - r=daoshengmu a=ritu
MozReview-Commit-ID: 5h6UPXczKhb
---
dom/canvas/WebGLContextValidate.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git dom/canvas/WebGLContextValidate.cpp dom/canvas/WebGLContextValidate.cpp
index a8334e546414..ebf0aa8c2d78 100644
--- dom/canvas/WebGLContextValidate.cpp
+++ dom/canvas/WebGLContextValidate.cpp
@@ -554,7 +554,7 @@ WebGLContext::InitAndValidateGL(FailureReason* const out_failReason)
if (MinCapabilityMode())
mGLMaxTextureUnits = MINVALUE_GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS;
else
- gl->fGetIntegerv(LOCAL_GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &mGLMaxTextureUnits);
+ mGLMaxTextureUnits = gl->GetIntAs<GLint>(LOCAL_GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS);
if (mGLMaxTextureUnits < 8) {
const nsPrintfCString reason("GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: %d is < 8!",

View File

@ -1,60 +0,0 @@
commit a2b75aa9409c
Author: Tooru Fujisawa <arai_a@mac.com>
Date: Sun Sep 17 19:52:04 2017 +0900
Bug 1394530 - Stop using optimized path for non PromiseObject. r=till, a=sledru
--HG--
extra : source : 079ff8998fd50540948d3262a3a8b1f4d61b43e9
---
js/src/builtin/Promise.cpp | 21 ++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)
diff --git js/src/builtin/Promise.cpp js/src/builtin/Promise.cpp
index 1cb1cff0682e..e316f090504d 100644
--- js/src/builtin/Promise.cpp
+++ js/src/builtin/Promise.cpp
@@ -2365,6 +2365,15 @@ NewReactionRecord(JSContext* cx, HandleObject resultPromise, HandleValue onFulfi
HandleValue onRejected, HandleObject resolve, HandleObject reject,
HandleObject incumbentGlobalObject)
{
+ // Either of the following conditions must be met:
+ // * resultPromise is a PromiseObject
+ // * resolve and reject are callable
+ // except for Async Generator, there resultPromise can be nullptr.
+ MOZ_ASSERT_IF(resultPromise && !resultPromise->is<PromiseObject>(), resolve);
+ MOZ_ASSERT_IF(resultPromise && !resultPromise->is<PromiseObject>(), IsCallable(resolve));
+ MOZ_ASSERT_IF(resultPromise && !resultPromise->is<PromiseObject>(), reject);
+ MOZ_ASSERT_IF(resultPromise && !resultPromise->is<PromiseObject>(), IsCallable(reject));
+
Rooted<PromiseReactionRecord*> reaction(cx, NewObjectWithClassProto<PromiseReactionRecord>(cx));
if (!reaction)
return nullptr;
@@ -3072,7 +3081,7 @@ BlockOnPromise(JSContext* cx, HandleValue promiseVal, HandleObject blockedPromis
// rejected promises list.
bool addToDependent = true;
- if (C == PromiseCtor) {
+ if (C == PromiseCtor && resultPromise->is<PromiseObject>()) {
addToDependent = false;
} else {
// 25.4.5.3., step 4.
@@ -3131,12 +3140,14 @@ BlockOnPromise(JSContext* cx, HandleValue promiseVal, HandleObject blockedPromis
return false;
}
- // If the object to depend on isn't a, maybe-wrapped, Promise instance,
- // we ignore it. All this does is lose some small amount of debug
- // information in scenarios that are highly unlikely to occur in useful
- // code.
+ // If either the object to depend on or the object that gets blocked isn't
+ // a, maybe-wrapped, Promise instance, we ignore it. All this does is lose
+ // some small amount of debug information in scenarios that are highly
+ // unlikely to occur in useful code.
if (!unwrappedPromiseObj->is<PromiseObject>())
return true;
+ if (!blockedPromise_->is<PromiseObject>())
+ return true;
Rooted<PromiseObject*> promise(cx, &unwrappedPromiseObj->as<PromiseObject>());
return AddPromiseReaction(cx, promise, UndefinedHandleValue, UndefinedHandleValue,

View File

@ -1,49 +0,0 @@
commit 8ab8a207d511
Author: Jamie Nicol <jnicol@mozilla.com>
Date: Mon Oct 9 17:48:59 2017 +0100
Bug 1395138 - Hold reference to layers in ContainerLayerComposite::mPrepared. r=mattwoodrow, a=sledru
MozReview-Commit-ID: 6qUDRnRcFAw
---
gfx/layers/composite/ContainerLayerComposite.cpp | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git gfx/layers/composite/ContainerLayerComposite.cpp gfx/layers/composite/ContainerLayerComposite.cpp
index aad2993629fc..28d9e79925a0 100755
--- gfx/layers/composite/ContainerLayerComposite.cpp
+++ gfx/layers/composite/ContainerLayerComposite.cpp
@@ -161,12 +161,12 @@ static gfx::IntRect ContainerVisibleRect(ContainerT* aContainer)
/* all of the per-layer prepared data we need to maintain */
struct PreparedLayer
{
- PreparedLayer(LayerComposite *aLayer,
+ PreparedLayer(Layer *aLayer,
RenderTargetIntRect aClipRect,
Maybe<gfx::Polygon>&& aGeometry)
: mLayer(aLayer), mClipRect(aClipRect), mGeometry(Move(aGeometry)) {}
- LayerComposite* mLayer;
+ RefPtr<Layer> mLayer;
RenderTargetIntRect mClipRect;
Maybe<Polygon> mGeometry;
};
@@ -230,7 +230,8 @@ ContainerPrepare(ContainerT* aContainer,
CULLING_LOG("Preparing sublayer %p\n", layerToRender->GetLayer());
layerToRender->Prepare(clipRect);
- aContainer->mPrepared->mLayers.AppendElement(PreparedLayer(layerToRender, clipRect,
+ aContainer->mPrepared->mLayers.AppendElement(PreparedLayer(layerToRender->GetLayer(),
+ clipRect,
Move(layer.geometry)));
}
@@ -408,7 +409,7 @@ RenderLayers(ContainerT* aContainer, LayerManagerComposite* aManager,
PreparedLayer& preparedData = aContainer->mPrepared->mLayers[i];
const gfx::IntRect clipRect = preparedData.mClipRect.ToUnknownRect();
- LayerComposite* layerToRender = preparedData.mLayer;
+ LayerComposite* layerToRender = static_cast<LayerComposite*>(preparedData.mLayer->ImplData());
const Maybe<gfx::Polygon>& childGeometry = preparedData.mGeometry;
Layer* layer = layerToRender->GetLayer();

View File

@ -1,48 +0,0 @@
commit 2bffd0136caf
Author: Olli Pettay <Olli.Pettay@helsinki.fi>
Date: Fri Oct 20 11:02:29 2017 +0100
Bug 1397811 - In order to not leak properties, ensure all the properties of adopted nodes are removed in case the adopt call fails. r=bz, a=lizzard
--HG--
extra : source : b609906f34b50f8e4236d0fee8d01338181dd906
---
dom/base/nsNodeUtils.cpp | 21 +++++++++------------
1 file changed, 9 insertions(+), 12 deletions(-)
diff --git dom/base/nsNodeUtils.cpp dom/base/nsNodeUtils.cpp
index dd958aa443ce..20e714d54065 100644
--- dom/base/nsNodeUtils.cpp
+++ dom/base/nsNodeUtils.cpp
@@ -605,6 +605,15 @@ nsNodeUtils::CloneAndAdopt(nsINode *aNode, bool aClone, bool aDeep,
}
}
+ if (aNodesWithProperties && aNode->HasProperties()) {
+ bool ok = aNodesWithProperties->AppendObject(aNode);
+ MOZ_RELEASE_ASSERT(ok, "Out of memory");
+ if (aClone) {
+ ok = aNodesWithProperties->AppendObject(clone);
+ MOZ_RELEASE_ASSERT(ok, "Out of memory");
+ }
+ }
+
if (aDeep && (!aClone || !aNode->IsNodeOfType(nsINode::eATTRIBUTE))) {
// aNode's children.
for (nsIContent* cloneChild = aNode->GetFirstChild();
@@ -664,15 +673,6 @@ nsNodeUtils::CloneAndAdopt(nsINode *aNode, bool aClone, bool aDeep,
}
#endif
- if (aNodesWithProperties && aNode->HasProperties()) {
- bool ok = aNodesWithProperties->AppendObject(aNode);
- if (aClone) {
- ok = ok && aNodesWithProperties->AppendObject(clone);
- }
-
- NS_ENSURE_TRUE(ok, NS_ERROR_OUT_OF_MEMORY);
- }
-
clone.forget(aResult);
return NS_OK;

View File

@ -1,104 +0,0 @@
commit aec4b24e060f
Author: Jan-Ivar Bruaroey <jib@mozilla.com>
Date: Thu Sep 21 10:45:56 2017 -0400
Bug 1399922 - Use a static mutex for getting deviceId keys in MediaParent. r=jesup, a=sledru
MozReview-Commit-ID: E6pzyAM4jOQ
--HG--
extra : source : b030607a3ddbc015d30dbffc5eba0789cae6db62
---
dom/media/systemservices/MediaParent.cpp | 32 +++++++++++++++++++++-----------
1 file changed, 21 insertions(+), 11 deletions(-)
diff --git dom/media/systemservices/MediaParent.cpp dom/media/systemservices/MediaParent.cpp
index c7798dd73dc6..485f9bdee808 100644
--- dom/media/systemservices/MediaParent.cpp
+++ dom/media/systemservices/MediaParent.cpp
@@ -37,6 +37,7 @@ mozilla::LazyLogModule gMediaParentLog("MediaParent");
namespace mozilla {
namespace media {
+StaticMutex sOriginKeyStoreMutex;
static OriginKeyStore* sOriginKeyStore = nullptr;
class OriginKeyStore : public nsISupports
@@ -396,6 +397,7 @@ class OriginKeyStore : public nsISupports
private:
virtual ~OriginKeyStore()
{
+ StaticMutexAutoLock lock(sOriginKeyStoreMutex);
sOriginKeyStore = nullptr;
LOG((__FUNCTION__));
}
@@ -404,6 +406,7 @@ public:
static OriginKeyStore* Get()
{
MOZ_ASSERT(NS_IsMainThread());
+ StaticMutexAutoLock lock(sOriginKeyStoreMutex);
if (!sOriginKeyStore) {
sOriginKeyStore = new OriginKeyStore();
}
@@ -447,8 +450,8 @@ Parent<Super>::RecvGetPrincipalKey(const uint32_t& aRequestId,
return IPCResult(this, false);
}
- // Then over to stream-transport thread to do the actual file io.
- // Stash a pledge to hold the answer and get an id for this request.
+ // Then over to stream-transport thread (a thread pool) to do the actual
+ // file io. Stash a pledge to hold the answer and get an id for this request.
RefPtr<Pledge<nsCString>> p = new Pledge<nsCString>();
uint32_t id = mOutstandingPledges.Append(*p);
@@ -460,14 +463,18 @@ Parent<Super>::RecvGetPrincipalKey(const uint32_t& aRequestId,
rv = sts->Dispatch(NewRunnableFrom([this, that, id, profileDir,
aPrincipalInfo, aPersist]() -> nsresult {
MOZ_ASSERT(!NS_IsMainThread());
- mOriginKeyStore->mOriginKeys.SetProfileDir(profileDir);
+ StaticMutexAutoLock lock(sOriginKeyStoreMutex);
+ if (!sOriginKeyStore) {
+ return NS_ERROR_FAILURE;
+ }
+ sOriginKeyStore->mOriginKeys.SetProfileDir(profileDir);
nsresult rv;
nsAutoCString result;
if (IsPincipalInfoPrivate(aPrincipalInfo)) {
- rv = mOriginKeyStore->mPrivateBrowsingOriginKeys.GetPrincipalKey(aPrincipalInfo, result);
+ rv = sOriginKeyStore->mPrivateBrowsingOriginKeys.GetPrincipalKey(aPrincipalInfo, result);
} else {
- rv = mOriginKeyStore->mOriginKeys.GetPrincipalKey(aPrincipalInfo, result, aPersist);
+ rv = sOriginKeyStore->mOriginKeys.GetPrincipalKey(aPrincipalInfo, result, aPersist);
}
if (NS_WARN_IF(NS_FAILED(rv))) {
@@ -518,19 +525,22 @@ Parent<Super>::RecvSanitizeOriginKeys(const uint64_t& aSinceWhen,
if (NS_WARN_IF(NS_FAILED(rv))) {
return IPCResult(this, false);
}
- // Over to stream-transport thread to do the file io.
+ // Over to stream-transport thread (a thread pool) to do the file io.
nsCOMPtr<nsIEventTarget> sts = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID);
MOZ_ASSERT(sts);
- RefPtr<OriginKeyStore> store(mOriginKeyStore);
- rv = sts->Dispatch(NewRunnableFrom([profileDir, store, aSinceWhen,
+ rv = sts->Dispatch(NewRunnableFrom([profileDir, aSinceWhen,
aOnlyPrivateBrowsing]() -> nsresult {
MOZ_ASSERT(!NS_IsMainThread());
- store->mPrivateBrowsingOriginKeys.Clear(aSinceWhen);
+ StaticMutexAutoLock lock(sOriginKeyStoreMutex);
+ if (!sOriginKeyStore) {
+ return NS_ERROR_FAILURE;
+ }
+ sOriginKeyStore->mPrivateBrowsingOriginKeys.Clear(aSinceWhen);
if (!aOnlyPrivateBrowsing) {
- store->mOriginKeys.SetProfileDir(profileDir);
- store->mOriginKeys.Clear(aSinceWhen);
+ sOriginKeyStore->mOriginKeys.SetProfileDir(profileDir);
+ sOriginKeyStore->mOriginKeys.Clear(aSinceWhen);
}
return NS_OK;
}), NS_DISPATCH_NORMAL);

View File

@ -1,120 +0,0 @@
commit 677c707a4f11
Author: Jon Coppeard <jcoppeard@mozilla.com>
Date: Mon Oct 9 10:03:20 2017 +0100
Bug 1400003 - Mark Heap<T> and barrier classes as MOZ_NON_MEMMOVABLE. r=sfink, r=froydnj, a=lizzard
--HG--
extra : source : 6ad5b916c9659aeb4b901d8f9ec7f121dc2c4418
---
js/public/RootingAPI.h | 10 +++++++++-
js/src/gc/Barrier.h | 5 ++++-
xpcom/ds/nsTArray.h | 27 +++++++++++++--------------
3 files changed, 26 insertions(+), 16 deletions(-)
diff --git js/public/RootingAPI.h js/public/RootingAPI.h
index 74a61af93703..f8ec7c5a1f5b 100644
--- js/public/RootingAPI.h
+++ js/public/RootingAPI.h
@@ -231,7 +231,7 @@ AssertGCThingIsNotAnObjectSubclass(js::gc::Cell* cell) {}
* Type T must be a public GC pointer type.
*/
template <typename T>
-class Heap : public js::HeapBase<T, Heap<T>>
+class MOZ_NON_MEMMOVABLE Heap : public js::HeapBase<T, Heap<T>>
{
// Please note: this can actually also be used by nsXBLMaybeCompiled<T>, for legacy reasons.
static_assert(js::IsHeapConstructibleType<T>::value,
@@ -1246,6 +1246,14 @@ class JS_PUBLIC_API(ObjectPtr)
explicit ObjectPtr(JSObject* obj) : value(obj) {}
+ ObjectPtr(const ObjectPtr& other) : value(other.value) {}
+
+ ObjectPtr(ObjectPtr&& other)
+ : value(other.value)
+ {
+ other.value = nullptr;
+ }
+
/* Always call finalize before the destructor. */
~ObjectPtr() { MOZ_ASSERT(!value); }
diff --git js/src/gc/Barrier.h js/src/gc/Barrier.h
index 9c4f53975752..1740315c14e9 100644
--- js/src/gc/Barrier.h
+++ js/src/gc/Barrier.h
@@ -318,8 +318,11 @@ struct InternalBarrierMethods<jsid>
};
// Base class of all barrier types.
+//
+// This is marked non-memmovable since post barriers added by derived classes
+// can add pointers to class instances to the store buffer.
template <typename T>
-class BarrieredBase
+class MOZ_NON_MEMMOVABLE BarrieredBase
{
protected:
// BarrieredBase is not directly instantiable.
diff --git xpcom/ds/nsTArray.h xpcom/ds/nsTArray.h
index 424a50ba421e..4e9b57126bfb 100644
--- xpcom/ds/nsTArray.h
+++ xpcom/ds/nsTArray.h
@@ -37,6 +37,7 @@
namespace JS {
template<class T>
class Heap;
+class ObjectPtr;
} /* namespace JS */
class nsRegion;
@@ -708,7 +709,7 @@ struct nsTArray_CopyWithConstructors
template<class E>
struct MOZ_NEEDS_MEMMOVABLE_TYPE nsTArray_CopyChooser
{
- typedef nsTArray_CopyWithMemutils Type;
+ using Type = nsTArray_CopyWithMemutils;
};
//
@@ -719,14 +720,18 @@ struct MOZ_NEEDS_MEMMOVABLE_TYPE nsTArray_CopyChooser
template<> \
struct nsTArray_CopyChooser<T> \
{ \
- typedef nsTArray_CopyWithConstructors<T> Type; \
+ using Type = nsTArray_CopyWithConstructors<T>; \
};
-template<class E>
-struct nsTArray_CopyChooser<JS::Heap<E>>
-{
- typedef nsTArray_CopyWithConstructors<JS::Heap<E>> Type;
-};
+#define DECLARE_USE_COPY_CONSTRUCTORS_FOR_TEMPLATE(T) \
+ template<typename S> \
+ struct nsTArray_CopyChooser<T<S>> \
+ { \
+ using Type = nsTArray_CopyWithConstructors<T<S>>; \
+ };
+
+DECLARE_USE_COPY_CONSTRUCTORS_FOR_TEMPLATE(JS::Heap)
+DECLARE_USE_COPY_CONSTRUCTORS_FOR_TEMPLATE(std::function)
DECLARE_USE_COPY_CONSTRUCTORS(nsRegion)
DECLARE_USE_COPY_CONSTRUCTORS(nsIntRegion)
@@ -740,13 +745,7 @@ DECLARE_USE_COPY_CONSTRUCTORS(mozilla::dom::indexedDB::SerializedStructuredClone
DECLARE_USE_COPY_CONSTRUCTORS(JSStructuredCloneData)
DECLARE_USE_COPY_CONSTRUCTORS(mozilla::dom::MessagePortMessage)
DECLARE_USE_COPY_CONSTRUCTORS(mozilla::SourceBufferTask)
-
-template<typename T>
-struct nsTArray_CopyChooser<std::function<T>>
-{
- typedef nsTArray_CopyWithConstructors<std::function<T>> Type;
-};
-
+DECLARE_USE_COPY_CONSTRUCTORS(JS::ObjectPtr)
//
// Base class for nsTArray_Impl that is templated on element type and derived

View File

@ -1,27 +0,0 @@
commit 62b41b600acc
Author: Dragana Damjanovic <dd.mozilla@gmail.com>
Date: Mon Oct 9 14:59:32 2017 -0400
Bug 1400554 - Cancel a time in TLSFilterTransaction if transaction is canceled. r=mcmanus, a=ritu
--HG--
extra : source : 67315954145e9cae0efe8c5323452a70a13c5484
---
netwerk/protocol/http/TunnelUtils.cpp | 4 ++++
1 file changed, 4 insertions(+)
diff --git netwerk/protocol/http/TunnelUtils.cpp netwerk/protocol/http/TunnelUtils.cpp
index d0f6ef0b1873..0cf3ea4f3008 100644
--- netwerk/protocol/http/TunnelUtils.cpp
+++ netwerk/protocol/http/TunnelUtils.cpp
@@ -126,6 +126,10 @@ TLSFilterTransaction::Close(nsresult aReason)
return;
}
+ if (mTimer) {
+ mTimer->Cancel();
+ mTimer = nullptr;
+ }
mTransaction->Close(aReason);
mTransaction = nullptr;
}

View File

@ -1,76 +0,0 @@
commit 5d3c733f43dd
Author: Gabriele Svelto <gsvelto@mozilla.com>
Date: Fri Sep 22 15:06:22 2017 +0200
Bug 1401339 - Look for libcurl under platform-specific paths; r=Dexter a=sylvestre
MozReview-Commit-ID: 6wijqLsar56
--HG--
extra : source : ebd3c3b2d64442c2b5eb7ab3e87c4b423311f3f4
---
.../pingsender/pingsender_unix_common.cpp | 40 +++++++++++++++-------
1 file changed, 28 insertions(+), 12 deletions(-)
diff --git toolkit/components/telemetry/pingsender/pingsender_unix_common.cpp toolkit/components/telemetry/pingsender/pingsender_unix_common.cpp
index b1cea81f6288..ae20f4114193 100644
--- toolkit/components/telemetry/pingsender/pingsender_unix_common.cpp
+++ toolkit/components/telemetry/pingsender/pingsender_unix_common.cpp
@@ -80,29 +80,45 @@ CurlWrapper::~CurlWrapper()
bool
CurlWrapper::Init()
{
- // libcurl might show up under different names, try them all until we find it
+ const char* libcurlPaths[] = {
+ "/usr/lib",
+#ifdef XP_LINUX
+ "/usr/lib32",
+ "/usr/lib64",
+ "/usr/lib/i386-linux-gnu", // Debian 32-bit x86
+ "/usr/lib/x86_64-linux-gnu", // Debian 64-bit x86
+#endif // XP_LINUX
+ };
+
const char* libcurlNames[] = {
+#ifdef XP_LINUX
"libcurl.so",
"libcurl.so.4",
// Debian gives libcurl a different name when it is built against GnuTLS
+ "libcurl-gnutls.so",
"libcurl-gnutls.so.4",
- // Older libcurl if we can't find anything better
+ // Older versions in case we find nothing better
"libcurl.so.3",
-#ifndef HAVE_64BIT_BUILD
- // 32-bit versions on 64-bit hosts
- "/usr/lib32/libcurl.so",
- "/usr/lib32/libcurl.so.4",
- "/usr/lib32/libcurl-gnutls.so.4",
- "/usr/lib32/libcurl.so.3",
-#endif
+ "libcurl-gnutls.so.3", // See above for Debian
+#elif defined(XP_MACOSX)
// macOS
"libcurl.dylib",
"libcurl.4.dylib",
- "libcurl.3.dylib"
+ "libcurl.3.dylib",
+#endif
};
- for (const char* libname : libcurlNames) {
- mLib = dlopen(libname, RTLD_NOW);
+ // libcurl might show up under different names, try them all until we find it
+
+ for (const char* libpath : libcurlPaths) {
+ for (const char* libname : libcurlNames) {
+ string fullpath = string(libpath) + "/" + libname;
+ mLib = dlopen(fullpath.c_str(), RTLD_NOW);
+
+ if (mLib) {
+ break;
+ }
+ }
if (mLib) {
break;

View File

@ -1,27 +0,0 @@
commit d0ed05261f20
Author: jason laster <jlaster@mozilla.com>
Date: Wed Sep 20 10:52:54 2017 -0400
Bug 1401573 - Fix PoE, Link, and linux issue. r=nchevobbe
MozReview-Commit-ID: 35TA6bhW1Wr
---
devtools/client/debugger/new/debugger.js | 68 +++++++++++++++++-----
devtools/client/debugger/new/panel.js | 27 ++++++++-
.../new/test/mochitest/browser_dbg-expressions.js | 2 +-
3 files changed, 79 insertions(+), 18 deletions(-)
diff --git devtools/client/debugger/new/debugger.js devtools/client/debugger/new/debugger.js
index f52a3e380ab6..c1213180cb13 100644
--- devtools/client/debugger/new/debugger.js
+++ devtools/client/debugger/new/debugger.js
@@ -29493,7 +29493,8 @@ return /******/ (function(modules) { // webpackBootstr
}
function getKeyForOS(os, action) {
- return KEYS[os][action];
+ var osActions = KEYS[os] || KEYS.Linux;
+ return osActions[action];
}
function formatKey(action) {

View File

@ -1,31 +0,0 @@
commit 38e6bb85066b
Author: Jon Coppeard <jcoppeard@mozilla.com>
Date: Fri Sep 22 13:09:44 2017 +0100
Bug 1401804 - Fix IsMarkedBlack check used in gray marking asserts r=sfink a=sylvestre
---
js/src/gc/Barrier.cpp | 11 ++---------
1 file changed, 2 insertions(+), 9 deletions(-)
diff --git js/src/gc/Barrier.cpp js/src/gc/Barrier.cpp
index 5a5dfbe9bed0..0c42d16e7117 100644
--- js/src/gc/Barrier.cpp
+++ js/src/gc/Barrier.cpp
@@ -33,15 +33,8 @@ RuntimeFromActiveCooperatingThreadIsHeapMajorCollecting(JS::shadow::Zone* shadow
bool
IsMarkedBlack(JSObject* obj)
{
- // Note: we assume conservatively that Nursery things will be live.
- if (!obj->isTenured())
- return true;
-
- gc::TenuredCell& tenured = obj->asTenured();
- if (tenured.isMarkedAny() || tenured.arena()->allocatedDuringIncremental)
- return true;
-
- return false;
+ return obj->isMarkedBlack() ||
+ (obj->isTenured() && obj->asTenured().arena()->allocatedDuringIncremental);
}
bool

View File

@ -1,199 +0,0 @@
commit 3b1474dc71b8
Author: Christoph Kerschbaumer <ckerschb@christophkerschbaumer.com>
Date: Mon Oct 2 09:11:57 2017 +0200
Bug 1402363 - Explicitly cancel channel after mixed content redirect. r=honza, r=kate, a=ritu
--HG--
extra : source : 2773796df8a337e5de31811acb4662ce67955f93
---
dom/security/nsMixedContentBlocker.cpp | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git dom/security/nsMixedContentBlocker.cpp dom/security/nsMixedContentBlocker.cpp
index 46760e69cb91..28740da9efca 100644
--- dom/security/nsMixedContentBlocker.cpp
+++ dom/security/nsMixedContentBlocker.cpp
@@ -394,7 +394,11 @@ nsMixedContentBlocker::AsyncOnChannelRedirect(nsIChannel* aOldChannel,
nullptr, // aExtra
requestingPrincipal,
&decision);
- NS_ENSURE_SUCCESS(rv, rv);
+ if (NS_FAILED(rv)) {
+ autoCallback.DontCallback();
+ aOldChannel->Cancel(NS_ERROR_DOM_BAD_URI);
+ return NS_BINDING_FAILED;
+ }
if (nsMixedContentBlocker::sSendHSTSPriming) {
// The LoadInfo passed in is for the original channel, HSTS priming needs to
@@ -419,6 +423,7 @@ nsMixedContentBlocker::AsyncOnChannelRedirect(nsIChannel* aOldChannel,
// If the channel is about to load mixed content, abort the channel
if (!NS_CP_ACCEPTED(decision)) {
autoCallback.DontCallback();
+ aOldChannel->Cancel(NS_ERROR_DOM_BAD_URI);
return NS_BINDING_FAILED;
}
commit a709f413ebbd (tag: FIREFOX_57_0b5_RELEASE, tag: FIREFOX_57_0b5_BUILD1)
Author: Christoph Kerschbaumer <ckerschb@christophkerschbaumer.com>
Date: Mon Oct 2 09:12:12 2017 +0200
Bug 1402363 - Test Mixed Content Redirect Blocking. r=tanvi, r=kate, a=ritu
--HG--
extra : source : fcefba24074f60e2d3296996e20a8dd8bc6bebe0
---
.../test/mixedcontentblocker/file_redirect.html | 31 ++++++++++++++
.../mixedcontentblocker/file_redirect_handler.sjs | 29 +++++++++++++
.../test/mixedcontentblocker/mochitest.ini | 3 ++
.../test/mixedcontentblocker/test_redirect.html | 50 ++++++++++++++++++++++
4 files changed, 113 insertions(+)
diff --git dom/security/test/mixedcontentblocker/file_redirect.html dom/security/test/mixedcontentblocker/file_redirect.html
new file mode 100644
index 000000000000..99e187379139
--- /dev/null
+++ dom/security/test/mixedcontentblocker/file_redirect.html
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Bug1402363: Test mixed content redirects</title>
+</head>
+<body>
+
+<script type="text/javascript">
+ const PATH = "https://example.com/tests/dom/security/test/mixedcontentblocker/";
+
+ // check a fetch redirect from https to https (should be allowed)
+ fetch(PATH + "file_redirect_handler.sjs?https-to-https-redirect", {
+ method: 'get'
+ }).then(function(response) {
+ window.parent.postMessage("https-to-https-loaded", "*");
+ }).catch(function(err) {
+ window.parent.postMessage("https-to-https-blocked", "*");
+ });
+
+ // check a fetch redirect from https to http (should be blocked)
+ fetch(PATH + "file_redirect_handler.sjs?https-to-http-redirect", {
+ method: 'get'
+ }).then(function(response) {
+ window.parent.postMessage("https-to-http-loaded", "*");
+ }).catch(function(err) {
+ window.parent.postMessage("https-to-http-blocked", "*");
+ });
+
+</script>
+</body>
+</html>
diff --git dom/security/test/mixedcontentblocker/file_redirect_handler.sjs dom/security/test/mixedcontentblocker/file_redirect_handler.sjs
new file mode 100644
index 000000000000..88dc849fe9a7
--- /dev/null
+++ dom/security/test/mixedcontentblocker/file_redirect_handler.sjs
@@ -0,0 +1,29 @@
+// custom *.sjs file for
+// Bug 1402363: Test Mixed Content Redirect Blocking.
+
+const URL_PATH = "example.com/tests/dom/security/test/mixedcontentblocker/";
+
+function handleRequest(request, response) {
+ response.setHeader("Cache-Control", "no-cache", false);
+ let queryStr = request.queryString;
+
+ if (queryStr === "https-to-https-redirect") {
+ response.setStatusLine("1.1", 302, "Found");
+ response.setHeader("Location",
+ "https://" + URL_PATH + "file_redirect_handler.sjs?load", false);
+ return;
+ }
+
+ if (queryStr === "https-to-http-redirect") {
+ response.setStatusLine("1.1", 302, "Found");
+ response.setHeader("Location",
+ "http://" + URL_PATH + "file_redirect_handler.sjs?load", false);
+ return;
+ }
+
+ if (queryStr === "load") {
+ response.setHeader("Content-Type", "text/html", false);
+ response.write("foo");
+ return;
+ }
+}
diff --git dom/security/test/mixedcontentblocker/mochitest.ini dom/security/test/mixedcontentblocker/mochitest.ini
index 7eed89effbce..9daf1f0ae73b 100644
--- dom/security/test/mixedcontentblocker/mochitest.ini
+++ dom/security/test/mixedcontentblocker/mochitest.ini
@@ -14,6 +14,8 @@ support-files =
file_server.sjs
!/dom/media/test/320x240.ogv
!/image/test/mochitest/blue.png
+ file_redirect.html
+ file_redirect_handler.sjs
[test_main.html]
skip-if = toolkit == 'android' #TIMED_OUT
@@ -21,3 +23,4 @@ skip-if = toolkit == 'android' #TIMED_OUT
skip-if = toolkit == 'android' || (os=='linux' && bits==32) #Android: TIMED_OUT; Linux32:bug 1324870
[test_frameNavigation.html]
skip-if = toolkit == 'android' #TIMED_OUT
+[test_redirect.html]
diff --git dom/security/test/mixedcontentblocker/test_redirect.html dom/security/test/mixedcontentblocker/test_redirect.html
new file mode 100644
index 000000000000..f4aeef3d9895
--- /dev/null
+++ dom/security/test/mixedcontentblocker/test_redirect.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Bug1402363: Test mixed content redirects</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+
+<body onload='startTest()'>
+<iframe style="width:100%;height:300px;" id="testframe"></iframe>
+
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+const PATH = "https://example.com/tests/dom/security/test/mixedcontentblocker/";
+let testcounter = 0;
+
+window.addEventListener("message", receiveMessage);
+function receiveMessage(event) {
+ if (event.data === "https-to-https-loaded") {
+ ok(true, "https to https fetch redirect should be allowed");
+ }
+ else if (event.data === "https-to-http-blocked") {
+ ok(true, "https to http fetch redirect should be blocked");
+ }
+ else {
+ ok(false, "sanity: we should never enter that branch (" + event.data + ")");
+ }
+ testcounter++;
+ if (testcounter < 2) {
+ return;
+ }
+ window.removeEventListener("message", receiveMessage);
+ SimpleTest.finish();
+}
+
+function startTest() {
+ SpecialPowers.pushPrefEnv({
+ 'set': [["security.mixed_content.use_hsts", false],
+ ["security.mixed_content.send_hsts_priming", false]]
+ }, function () {
+ let testframe = document.getElementById("testframe");
+ testframe.src = PATH + "file_redirect.html";
+ });
+}
+
+</script>
+</body>
+</html>

View File

@ -1,181 +0,0 @@
commit 44b4458e2d21
Author: Emilio Cobos Álvarez <emilio@crisal.io>
Date: Mon Sep 25 18:25:29 2017 +0200
Bug 1402442 - Properly remove display: contents pseudo-frames. r=mats, a=ritu
MozReview-Commit-ID: 4pjVLQfv3YR
Signed-off-by: Emilio Cobos Álvarez <emilio@crisal.io>
--HG--
extra : source : faa69ac1c14b79838cc0aac842b470a110542ebd
extra : amend_source : 3a76e0123bf3f7d10295000cc44fd8bdddf700df
---
layout/base/nsCSSFrameConstructor.cpp | 26 +++++++++++++++-------
testing/web-platform/meta/MANIFEST.json | 25 +++++++++++++++++++++
...dynamic-generated-content-fieldset-001.html.ini | 4 ++++
...dynamic-generated-content-fieldset-001-ref.html | 16 +++++++++++++
...nts-dynamic-generated-content-fieldset-001.html | 26 ++++++++++++++++++++++
5 files changed, 89 insertions(+), 8 deletions(-)
diff --git layout/base/nsCSSFrameConstructor.cpp layout/base/nsCSSFrameConstructor.cpp
index 99b1211b399b..4fce3fb381a7 100644
--- layout/base/nsCSSFrameConstructor.cpp
+++ layout/base/nsCSSFrameConstructor.cpp
@@ -1698,6 +1698,17 @@ nsCSSFrameConstructor::NotifyDestroyingFrame(nsIFrame* aFrame)
nsFrameManager::NotifyDestroyingFrame(aFrame);
}
+static bool
+HasGeneratedContent(const nsIContent* aChild)
+{
+ if (!aChild->MayHaveAnonymousChildren()) {
+ return false;
+ }
+
+ return nsLayoutUtils::GetBeforeFrame(aChild) ||
+ nsLayoutUtils::GetAfterFrame(aChild);
+}
+
struct nsGenConInitializer {
nsAutoPtr<nsGenConNode> mNode;
nsGenConList* mList;
@@ -8642,16 +8653,15 @@ nsCSSFrameConstructor::ContentRemoved(nsIContent* aCo
MOZ_ASSERT(!childFrame || !GetDisplayContentsStyleFor(aChild),
"display:contents nodes shouldn't have a frame");
if (!childFrame && GetDisplayContentsStyleFor(aChild)) {
- nsIContent* ancestor = aContainer;
- MOZ_ASSERT(ancestor, "display: contents on the root?");
- while (!ancestor->GetPrimaryFrame()) {
- // FIXME(emilio): Should this use the flattened tree parent instead?
- ancestor = ancestor->GetParent();
- MOZ_ASSERT(ancestor, "we can't have a display: contents subtree root!");
- }
+ if (HasGeneratedContent(aChild)) {
+ nsIContent* ancestor = aContainer;
+ MOZ_ASSERT(ancestor, "display: contents on the root?");
+ while (!ancestor->GetPrimaryFrame()) {
+ // FIXME(emilio): Should this use the flattened tree parent instead?
+ ancestor = ancestor->GetParent();
+ MOZ_ASSERT(ancestor, "we can't have a display: contents subtree root!");
+ }
- nsIFrame* ancestorFrame = ancestor->GetPrimaryFrame();
- if (ancestorFrame->GetProperty(nsIFrame::GenConProperty())) {
*aDidReconstruct = true;
LAYOUT_PHASE_TEMP_EXIT();
diff --git testing/web-platform/meta/MANIFEST.json testing/web-platform/meta/MANIFEST.json
index 5f05321c5a70..8aed4a4b5078 100644
--- testing/web-platform/meta/MANIFEST.json
+++ testing/web-platform/meta/MANIFEST.json
@@ -102975,6 +102975,18 @@
{}
]
],
+ "css/css-display-3/display-contents-dynamic-generated-content-fieldset-001.html": [
+ [
+ "/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001.html",
+ [
+ [
+ "/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-display-3/display-contents-dynamic-inline-flex-001-inline.html": [
[
"/css/css-display-3/display-contents-dynamic-inline-flex-001-inline.html",
@@ -227658,6 +227670,11 @@
{}
]
],
+ "css/css-display-3/display-contents-dynamic-generated-content-fieldset-001-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/css-display-3/display-contents-flex-001-ref.html": [
[
{}
@@ -502880,6 +502897,14 @@
"a2d7c9368ed8c01ca06c36646666270e85aee070",
"reftest"
],
+ "css/css-display-3/display-contents-dynamic-generated-content-fieldset-001-ref.html": [
+ "30ec5c8ddacfbfef8434c37ca7a0a766f2bbc89a",
+ "support"
+ ],
+ "css/css-display-3/display-contents-dynamic-generated-content-fieldset-001.html": [
+ "984bebb3c3b8661aedef4a229848dfa818bb1f4a",
+ "reftest"
+ ],
"css/css-display-3/display-contents-dynamic-inline-flex-001-inline.html": [
"40fb07e8ada1530e6835ff2d4e49c5571ffb0baa",
"reftest"
diff --git testing/web-platform/meta/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001.html.ini testing/web-platform/meta/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001.html.ini
new file mode 100644
index 000000000000..63c7442a2362
--- /dev/null
+++ testing/web-platform/meta/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001.html.ini
@@ -0,0 +1,4 @@
+[display-contents-dynamic-generated-content-fieldset-001.html]
+ type: reftest
+ expected:
+ if not stylo: FAIL
diff --git testing/web-platform/tests/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001-ref.html testing/web-platform/tests/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001-ref.html
new file mode 100644
index 000000000000..651bc19b83e9
--- /dev/null
+++ testing/web-platform/tests/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001-ref.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS Reftest Reference</title>
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<style>
+div {
+ display: contents;
+ border: 10px solid red;
+}
+</style>
+<p>
+ Test passes if there is no red text and no red border.
+</p>
+<fieldset>
+ <div></div>
+</fieldset>
diff --git testing/web-platform/tests/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001.html testing/web-platform/tests/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001.html
new file mode 100644
index 000000000000..8f8a0ba47971
--- /dev/null
+++ testing/web-platform/tests/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS Test: Dynamic changes to display: contents generated content in fieldsets.</title>
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<link rel="help" href="https://drafts.csswg.org/css-display-3/#valdef-display-contents">
+<link rel="match" href="display-contents-dynamic-generated-content-fieldset-001-ref.html">
+<style>
+.after::after {
+ content: "FAIL";
+ color: red;
+}
+div {
+ display: contents;
+ border: 10px solid red;
+}
+</style>
+<p>
+ Test passes if there is no red text and no red border.
+</p>
+<fieldset>
+ <div class="after"></div>
+</fieldset>
+<script>
+document.body.offsetHeight;
+document.querySelector("div").classList.remove("after");
+</script>

View File

@ -1,66 +0,0 @@
commit 434da479b6e1
Author: Jan de Mooij <jdemooij@mozilla.com>
Date: Wed Sep 27 14:43:36 2017 +0200
Bug 1402876 - Remove unnecessary InvalidateCompilerOutputsForScript call. r=nbp, a=sledru
--HG--
extra : source : c1a158ca2b1cfc009cd1545538cacbc4feabc48b
---
js/src/jit/Ion.cpp | 3 ---
js/src/vm/TypeInference.cpp | 12 ------------
js/src/vm/TypeInference.h | 4 ----
3 files changed, 19 deletions(-)
diff --git js/src/jit/Ion.cpp js/src/jit/Ion.cpp
index ba583fe12297..f205b83d2893 100644
--- js/src/jit/Ion.cpp
+++ js/src/jit/Ion.cpp
@@ -574,9 +574,6 @@ jit::LinkIonScript(JSContext* cx, HandleScript calleeScript)
// doesn't has code to handle it after linking happened. So it's
// not OK to throw a catchable exception from there.
cx->clearPendingException();
-
- // Reset the TypeZone's compiler output for this script, if any.
- InvalidateCompilerOutputsForScript(cx, calleeScript);
}
}
diff --git js/src/vm/TypeInference.cpp js/src/vm/TypeInference.cpp
index de98bb654fa8..70d6dfc19d20 100644
--- js/src/vm/TypeInference.cpp
+++ js/src/vm/TypeInference.cpp
@@ -1511,18 +1511,6 @@ js::FinishCompilation(JSContext* cx, HandleScript script, CompilerConstraintList
return true;
}
-void
-js::InvalidateCompilerOutputsForScript(JSContext* cx, HandleScript script)
-{
- TypeZone& types = cx->zone()->types;
- if (types.compilerOutputs) {
- for (auto& co : *types.compilerOutputs) {
- if (co.script() == script)
- co.invalidate();
- }
- }
-}
-
static void
CheckDefinitePropertiesTypeSet(JSContext* cx, TemporaryTypeSet* frozen, StackTypeSet* actual)
{
diff --git js/src/vm/TypeInference.h js/src/vm/TypeInference.h
index df2d496ca879..318c3e813b1a 100644
--- js/src/vm/TypeInference.h
+++ js/src/vm/TypeInference.h
@@ -1299,10 +1299,6 @@ bool
FinishCompilation(JSContext* cx, HandleScript script, CompilerConstraintList* constraints,
RecompileInfo* precompileInfo, bool* isValidOut);
-// Reset any CompilerOutput present for a script.
-void
-InvalidateCompilerOutputsForScript(JSContext* cx, HandleScript script);
-
// Update the actual types in any scripts queried by constraints with any
// speculative types added during the definite properties analysis.
void

View File

@ -1,40 +0,0 @@
commit 6bf098b436b0
Author: Gijs Kruitbosch <gijskruitbosch@gmail.com>
Date: Mon Sep 25 17:24:26 2017 +0100
Bug 1402896 - Make the url bar strip javascript even when preceded by control characters. r=mak, a=sledru
MozReview-Commit-ID: 5ZO8n5lfvnl
--HG--
extra : source : 638e145f6bba437642d55f7b2baf5458df61419a
---
browser/base/content/browser.js | 2 +-
.../content/test/urlbar/browser_removeUnsafeProtocolsFromURLBarPaste.js | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git browser/base/content/browser.js browser/base/content/browser.js
index 8b0fb0276d19..b73ab2a3dd7e 100755
--- browser/base/content/browser.js
+++ browser/base/content/browser.js
@@ -6128,7 +6128,7 @@ function stripUnsafeProtocolOnPaste(pasteData) {
// LOAD_FLAGS_DISALLOW_INHERIT_PRINCIPAL for those.
let changed = false;
let pasteDataNoJS = pasteData.replace(/\r?\n/g, "")
- .replace(/^(?:\s*javascript:)+/i,
+ .replace(/^(?:\W*javascript:)+/i,
() => {
changed = true;
return "";
diff --git browser/base/content/test/urlbar/browser_removeUnsafeProtocolsFromURLBarPaste.js browser/base/content/test/urlbar/browser_removeUnsafeProtocolsFromURLBarPaste.js
index 6f6682d51688..27129297b0a3 100644
--- browser/base/content/test/urlbar/browser_removeUnsafeProtocolsFromURLBarPaste.js
+++ browser/base/content/test/urlbar/browser_removeUnsafeProtocolsFromURLBarPaste.js
@@ -7,6 +7,7 @@ var pairs = [
["javascript:", ""],
["javascript:1+1", "1+1"],
["javascript:document.domain", "document.domain"],
+ [" \u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009javascript:document.domain", "document.domain"],
["java\nscript:foo", "foo"],
["http://\nexample.com", "http://example.com"],
["http://\nexample.com\n", "http://example.com"],

View File

@ -1,51 +0,0 @@
commit 6149574dc0f9
Author: Gabriele Svelto <gsvelto@mozilla.com>
Date: Tue Sep 26 09:35:03 2017 +0200
Bug 1402966 - Search for libcurl in more paths to support various *BSDs. r=Dexter, a=sledru
MozReview-Commit-ID: J4ykuSVEa0y
--HG--
extra : source : 4741b93cfdf29517ff8eae863825fdc2ab5bd7bd
---
.../telemetry/pingsender/pingsender_unix_common.cpp | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git toolkit/components/telemetry/pingsender/pingsender_unix_common.cpp toolkit/components/telemetry/pingsender/pingsender_unix_common.cpp
index ae20f4114193..7817e93e3d1f 100644
--- toolkit/components/telemetry/pingsender/pingsender_unix_common.cpp
+++ toolkit/components/telemetry/pingsender/pingsender_unix_common.cpp
@@ -88,10 +88,19 @@ CurlWrapper::Init()
"/usr/lib/i386-linux-gnu", // Debian 32-bit x86
"/usr/lib/x86_64-linux-gnu", // Debian 64-bit x86
#endif // XP_LINUX
+#if !defined(XP_MACOSX) && !defined(XP_LINUX) // Various BSDs
+ "/usr/local/lib", // FreeBSD, OpenBSD
+ "/usr/pkg/lib", // NetBSD
+#endif // !defined(XP_MACOSX) && !defined(XP_LINUX)
};
const char* libcurlNames[] = {
-#ifdef XP_LINUX
+#if defined(XP_MACOSX)
+ // macOS
+ "libcurl.dylib",
+ "libcurl.4.dylib",
+ "libcurl.3.dylib",
+#else // Linux, *BSD, ...
"libcurl.so",
"libcurl.so.4",
// Debian gives libcurl a different name when it is built against GnuTLS
@@ -100,11 +109,6 @@ CurlWrapper::Init()
// Older versions in case we find nothing better
"libcurl.so.3",
"libcurl-gnutls.so.3", // See above for Debian
-#elif defined(XP_MACOSX)
- // macOS
- "libcurl.dylib",
- "libcurl.4.dylib",
- "libcurl.3.dylib",
#endif
};

View File

@ -1,392 +0,0 @@
commit 474ae0592f23
Author: Boris Zbarsky <bzbarsky@mit.edu>
Date: Thu Sep 28 22:05:43 2017 -0400
Bug 1403646 - Make sure dead object proxies have the same background-finalization status as the wrapper they replace. r=jonco, a=sledru
MozReview-Commit-ID: GTKbR0azcRy
--HG--
extra : source : 296e1b4704deb1c6b3f9a6f5fc56688e89c01117
---
js/src/proxy/DeadObjectProxy.cpp | 204 +++++++++++++++++++++++++++------------
js/src/proxy/DeadObjectProxy.h | 13 ++-
2 files changed, 156 insertions(+), 61 deletions(-)
diff --git js/src/proxy/DeadObjectProxy.cpp js/src/proxy/DeadObjectProxy.cpp
index 3bd7a405c002..658880a07616 100644
--- js/src/proxy/DeadObjectProxy.cpp
+++ js/src/proxy/DeadObjectProxy.cpp
@@ -20,73 +20,81 @@ ReportDead(JSContext *cx)
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_DEAD_OBJECT);
}
-template <DeadProxyIsCallableIsConstructorOption CC>
+template <DeadProxyIsCallableIsConstructorOption CC,
+ DeadProxyBackgroundFinalized BF>
bool
-DeadObjectProxy<CC>::getOwnPropertyDescriptor(JSContext* cx, HandleObject wrapper, HandleId id,
- MutableHandle<PropertyDescriptor> desc) const
+DeadObjectProxy<CC, BF>::getOwnPropertyDescriptor(JSContext* cx, HandleObject wrapper, HandleId id,
+ MutableHandle<PropertyDescriptor> desc) const
{
ReportDead(cx);
return false;
}
-template <DeadProxyIsCallableIsConstructorOption CC>
+template <DeadProxyIsCallableIsConstructorOption CC,
+ DeadProxyBackgroundFinalized BF>
bool
-DeadObjectProxy<CC>::defineProperty(JSContext* cx, HandleObject wrapper, HandleId id,
- Handle<PropertyDescriptor> desc,
- ObjectOpResult& result) const
+DeadObjectProxy<CC, BF>::defineProperty(JSContext* cx, HandleObject wrapper, HandleId id,
+ Handle<PropertyDescriptor> desc,
+ ObjectOpResult& result) const
{
ReportDead(cx);
return false;
}
-template <DeadProxyIsCallableIsConstructorOption CC>
+template <DeadProxyIsCallableIsConstructorOption CC,
+ DeadProxyBackgroundFinalized BF>
bool
-DeadObjectProxy<CC>::ownPropertyKeys(JSContext* cx, HandleObject wrapper,
- AutoIdVector& props) const
+DeadObjectProxy<CC, BF>::ownPropertyKeys(JSContext* cx, HandleObject wrapper,
+ AutoIdVector& props) const
{
ReportDead(cx);
return false;
}
-template <DeadProxyIsCallableIsConstructorOption CC>
+template <DeadProxyIsCallableIsConstructorOption CC,
+ DeadProxyBackgroundFinalized BF>
bool
-DeadObjectProxy<CC>::delete_(JSContext* cx, HandleObject wrapper, HandleId id,
- ObjectOpResult& result) const
+DeadObjectProxy<CC, BF>::delete_(JSContext* cx, HandleObject wrapper, HandleId id,
+ ObjectOpResult& result) const
{
ReportDead(cx);
return false;
}
-template <DeadProxyIsCallableIsConstructorOption CC>
+template <DeadProxyIsCallableIsConstructorOption CC,
+ DeadProxyBackgroundFinalized BF>
bool
-DeadObjectProxy<CC>::getPrototype(JSContext* cx, HandleObject proxy,
- MutableHandleObject protop) const
+DeadObjectProxy<CC, BF>::getPrototype(JSContext* cx, HandleObject proxy,
+ MutableHandleObject protop) const
{
protop.set(nullptr);
return true;
}
-template <DeadProxyIsCallableIsConstructorOption CC>
+template <DeadProxyIsCallableIsConstructorOption CC,
+ DeadProxyBackgroundFinalized BF>
bool
-DeadObjectProxy<CC>::getPrototypeIfOrdinary(JSContext* cx, HandleObject proxy, bool* isOrdinary,
- MutableHandleObject protop) const
+DeadObjectProxy<CC, BF>::getPrototypeIfOrdinary(JSContext* cx, HandleObject proxy, bool* isOrdinary,
+ MutableHandleObject protop) const
{
*isOrdinary = false;
return true;
}
-template <DeadProxyIsCallableIsConstructorOption CC>
+template <DeadProxyIsCallableIsConstructorOption CC,
+ DeadProxyBackgroundFinalized BF>
bool
-DeadObjectProxy<CC>::preventExtensions(JSContext* cx, HandleObject proxy,
- ObjectOpResult& result) const
+DeadObjectProxy<CC, BF>::preventExtensions(JSContext* cx, HandleObject proxy,
+ ObjectOpResult& result) const
{
ReportDead(cx);
return false;
}
-template <DeadProxyIsCallableIsConstructorOption CC>
+template <DeadProxyIsCallableIsConstructorOption CC,
+ DeadProxyBackgroundFinalized BF>
bool
-DeadObjectProxy<CC>::isExtensible(JSContext* cx, HandleObject proxy, bool* extensible) const
+DeadObjectProxy<CC, BF>::isExtensible(JSContext* cx, HandleObject proxy, bool* extensible) const
{
// This is kind of meaningless, but dead-object semantics aside,
// [[Extensible]] always being true is consistent with other proxy types.
@@ -94,95 +102,141 @@ DeadObjectProxy<CC>::isExtensible(JSContext* cx, HandleObject proxy, bool* exten
return true;
}
-template <DeadProxyIsCallableIsConstructorOption CC>
+template <DeadProxyIsCallableIsConstructorOption CC,
+ DeadProxyBackgroundFinalized BF>
bool
-DeadObjectProxy<CC>::call(JSContext* cx, HandleObject wrapper, const CallArgs& args) const
+DeadObjectProxy<CC, BF>::call(JSContext* cx, HandleObject wrapper, const CallArgs& args) const
{
ReportDead(cx);
return false;
}
-template <DeadProxyIsCallableIsConstructorOption CC>
+template <DeadProxyIsCallableIsConstructorOption CC,
+ DeadProxyBackgroundFinalized BF>
bool
-DeadObjectProxy<CC>::construct(JSContext* cx, HandleObject wrapper, const CallArgs& args) const
+DeadObjectProxy<CC, BF>::construct(JSContext* cx, HandleObject wrapper, const CallArgs& args) const
{
ReportDead(cx);
return false;
}
-template <DeadProxyIsCallableIsConstructorOption CC>
+template <DeadProxyIsCallableIsConstructorOption CC,
+ DeadProxyBackgroundFinalized BF>
bool
-DeadObjectProxy<CC>::nativeCall(JSContext* cx, IsAcceptableThis test, NativeImpl impl,
- const CallArgs& args) const
+DeadObjectProxy<CC, BF>::nativeCall(JSContext* cx, IsAcceptableThis test, NativeImpl impl,
+ const CallArgs& args) const
{
ReportDead(cx);
return false;
}
-template <DeadProxyIsCallableIsConstructorOption CC>
+template <DeadProxyIsCallableIsConstructorOption CC,
+ DeadProxyBackgroundFinalized BF>
bool
-DeadObjectProxy<CC>::hasInstance(JSContext* cx, HandleObject proxy, MutableHandleValue v,
- bool* bp) const
+DeadObjectProxy<CC, BF>::hasInstance(JSContext* cx, HandleObject proxy, MutableHandleValue v,
+ bool* bp) const
{
ReportDead(cx);
return false;
}
-template <DeadProxyIsCallableIsConstructorOption CC>
+template <DeadProxyIsCallableIsConstructorOption CC,
+ DeadProxyBackgroundFinalized BF>
bool
-DeadObjectProxy<CC>::getBuiltinClass(JSContext* cx, HandleObject proxy, ESClass* cls) const
+DeadObjectProxy<CC, BF>::getBuiltinClass(JSContext* cx, HandleObject proxy, ESClass* cls) const
{
ReportDead(cx);
return false;
}
-template <DeadProxyIsCallableIsConstructorOption CC>
+template <DeadProxyIsCallableIsConstructorOption CC,
+ DeadProxyBackgroundFinalized BF>
bool
-DeadObjectProxy<CC>::isArray(JSContext* cx, HandleObject obj, JS::IsArrayAnswer* answer) const
+DeadObjectProxy<CC, BF>::isArray(JSContext* cx, HandleObject obj, JS::IsArrayAnswer* answer) const
{
ReportDead(cx);
return false;
}
-template <DeadProxyIsCallableIsConstructorOption CC>
+template <DeadProxyIsCallableIsConstructorOption CC,
+ DeadProxyBackgroundFinalized BF>
const char*
-DeadObjectProxy<CC>::className(JSContext* cx, HandleObject wrapper) const
+DeadObjectProxy<CC, BF>::className(JSContext* cx, HandleObject wrapper) const
{
return "DeadObject";
}
-template <DeadProxyIsCallableIsConstructorOption CC>
+template <DeadProxyIsCallableIsConstructorOption CC,
+ DeadProxyBackgroundFinalized BF>
JSString*
-DeadObjectProxy<CC>::fun_toString(JSContext* cx, HandleObject proxy, bool isToSource) const
+DeadObjectProxy<CC, BF>::fun_toString(JSContext* cx, HandleObject proxy, bool isToSource) const
{
ReportDead(cx);
return nullptr;
}
-template <DeadProxyIsCallableIsConstructorOption CC>
+template <DeadProxyIsCallableIsConstructorOption CC,
+ DeadProxyBackgroundFinalized BF>
RegExpShared*
-DeadObjectProxy<CC>::regexp_toShared(JSContext* cx, HandleObject proxy) const
+DeadObjectProxy<CC, BF>::regexp_toShared(JSContext* cx, HandleObject proxy) const
{
ReportDead(cx);
return nullptr;
}
template <>
-const char DeadObjectProxy<DeadProxyNotCallableNotConstructor>::family = 0;
+const char DeadObjectProxy<DeadProxyNotCallableNotConstructor,
+ DeadProxyBackgroundFinalized::Yes>::family = 0;
template <>
-const char DeadObjectProxy<DeadProxyNotCallableIsConstructor>::family = 0;
+const char DeadObjectProxy<DeadProxyNotCallableNotConstructor,
+ DeadProxyBackgroundFinalized::No>::family = 0;
template <>
-const char DeadObjectProxy<DeadProxyIsCallableNotConstructor>::family = 0;
+const char DeadObjectProxy<DeadProxyNotCallableIsConstructor,
+ DeadProxyBackgroundFinalized::Yes>::family = 0;
template <>
-const char DeadObjectProxy<DeadProxyIsCallableIsConstructor>::family = 0;
+const char DeadObjectProxy<DeadProxyNotCallableIsConstructor,
+ DeadProxyBackgroundFinalized::No>::family = 0;
+template <>
+const char DeadObjectProxy<DeadProxyIsCallableNotConstructor,
+ DeadProxyBackgroundFinalized::Yes>::family = 0;
+template <>
+const char DeadObjectProxy<DeadProxyIsCallableNotConstructor,
+ DeadProxyBackgroundFinalized::No>::family = 0;
+template <>
+const char DeadObjectProxy<DeadProxyIsCallableIsConstructor,
+ DeadProxyBackgroundFinalized::Yes>::family = 0;
+template <>
+const char DeadObjectProxy<DeadProxyIsCallableIsConstructor,
+ DeadProxyBackgroundFinalized::No>::family = 0;
bool
js::IsDeadProxyObject(JSObject* obj)
{
- return IsDerivedProxyObject(obj, DeadObjectProxy<DeadProxyNotCallableNotConstructor>::singleton()) ||
- IsDerivedProxyObject(obj, DeadObjectProxy<DeadProxyIsCallableIsConstructor>::singleton()) ||
- IsDerivedProxyObject(obj, DeadObjectProxy<DeadProxyIsCallableNotConstructor>::singleton()) ||
- IsDerivedProxyObject(obj, DeadObjectProxy<DeadProxyNotCallableIsConstructor>::singleton());
+ return
+ IsDerivedProxyObject(obj,
+ DeadObjectProxy<DeadProxyNotCallableNotConstructor,
+ DeadProxyBackgroundFinalized::Yes>::singleton()) ||
+ IsDerivedProxyObject(obj,
+ DeadObjectProxy<DeadProxyNotCallableNotConstructor,
+ DeadProxyBackgroundFinalized::No>::singleton()) ||
+ IsDerivedProxyObject(obj,
+ DeadObjectProxy<DeadProxyIsCallableIsConstructor,
+ DeadProxyBackgroundFinalized::Yes>::singleton()) ||
+ IsDerivedProxyObject(obj,
+ DeadObjectProxy<DeadProxyIsCallableIsConstructor,
+ DeadProxyBackgroundFinalized::No>::singleton()) ||
+ IsDerivedProxyObject(obj,
+ DeadObjectProxy<DeadProxyIsCallableNotConstructor,
+ DeadProxyBackgroundFinalized::Yes>::singleton()) ||
+ IsDerivedProxyObject(obj,
+ DeadObjectProxy<DeadProxyIsCallableNotConstructor,
+ DeadProxyBackgroundFinalized::No>::singleton()) ||
+ IsDerivedProxyObject(obj,
+ DeadObjectProxy<DeadProxyNotCallableIsConstructor,
+ DeadProxyBackgroundFinalized::Yes>::singleton()) ||
+ IsDerivedProxyObject(obj,
+ DeadObjectProxy<DeadProxyNotCallableIsConstructor,
+ DeadProxyBackgroundFinalized::No>::singleton());
}
@@ -190,19 +244,48 @@ const BaseProxyHandler*
js::SelectDeadProxyHandler(ProxyObject* obj)
{
// When nuking scripted proxies, isCallable and isConstructor values for
- // the proxy needs to be preserved.
+ // the proxy needs to be preserved. So does background-finalization status.
uint32_t callable = obj->handler()->isCallable(obj);
uint32_t constructor = obj->handler()->isConstructor(obj);
+ bool finalizeInBackground = obj->handler()->finalizeInBackground(obj->private_());
if (callable) {
- if (constructor)
- return DeadObjectProxy<DeadProxyIsCallableIsConstructor>::singleton();
- return DeadObjectProxy<DeadProxyIsCallableNotConstructor>::singleton();
+ if (constructor) {
+ if (finalizeInBackground) {
+ return DeadObjectProxy<DeadProxyIsCallableIsConstructor,
+ DeadProxyBackgroundFinalized::Yes>::singleton();
+ } else {
+ return DeadObjectProxy<DeadProxyIsCallableIsConstructor,
+ DeadProxyBackgroundFinalized::No>::singleton();
+ }
+ }
+
+ if (finalizeInBackground) {
+ return DeadObjectProxy<DeadProxyIsCallableNotConstructor,
+ DeadProxyBackgroundFinalized::Yes>::singleton();
+ }
+
+ return DeadObjectProxy<DeadProxyIsCallableNotConstructor,
+ DeadProxyBackgroundFinalized::No>::singleton();
+ }
+
+ if (constructor) {
+ if (finalizeInBackground) {
+ return DeadObjectProxy<DeadProxyNotCallableIsConstructor,
+ DeadProxyBackgroundFinalized::Yes>::singleton();
+ }
+
+ return DeadObjectProxy<DeadProxyNotCallableIsConstructor,
+ DeadProxyBackgroundFinalized::No>::singleton();
+ }
+
+ if (finalizeInBackground) {
+ return DeadObjectProxy<DeadProxyNotCallableNotConstructor,
+ DeadProxyBackgroundFinalized::Yes>::singleton();
}
- if (constructor)
- return DeadObjectProxy<DeadProxyNotCallableIsConstructor>::singleton();
- return DeadObjectProxy<DeadProxyNotCallableNotConstructor>::singleton();
+ return DeadObjectProxy<DeadProxyNotCallableNotConstructor,
+ DeadProxyBackgroundFinalized::No>::singleton();
}
JSObject*
@@ -214,7 +297,8 @@ js::NewDeadProxyObject(JSContext* cx, JSObject* origObj)
if (origObj && origObj->is<ProxyObject>())
handler = SelectDeadProxyHandler(&origObj->as<ProxyObject>());
else
- handler = DeadObjectProxy<DeadProxyNotCallableNotConstructor>::singleton();
+ handler = DeadObjectProxy<DeadProxyNotCallableNotConstructor,
+ DeadProxyBackgroundFinalized::Yes>::singleton();
return NewProxyObject(cx, handler, NullHandleValue, nullptr, ProxyOptions());
}
diff --git js/src/proxy/DeadObjectProxy.h js/src/proxy/DeadObjectProxy.h
index 42f21288d0e3..f29c972cf10a 100644
--- js/src/proxy/DeadObjectProxy.h
+++ js/src/proxy/DeadObjectProxy.h
@@ -21,7 +21,14 @@ enum DeadProxyIsCallableIsConstructorOption
DeadProxyIsCallableIsConstructor
};
-template <DeadProxyIsCallableIsConstructorOption CC>
+enum class DeadProxyBackgroundFinalized
+{
+ Yes,
+ No
+};
+
+template <DeadProxyIsCallableIsConstructorOption CC,
+ DeadProxyBackgroundFinalized BackgroundFinalized>
class DeadObjectProxy : public BaseProxyHandler
{
public:
@@ -70,6 +77,10 @@ class DeadObjectProxy : public BaseProxyHandler
return CC == DeadProxyIsCallableIsConstructor || CC == DeadProxyNotCallableIsConstructor;
}
+ virtual bool finalizeInBackground(const JS::Value& priv) const override {
+ return BackgroundFinalized == DeadProxyBackgroundFinalized::Yes;
+ }
+
static const DeadObjectProxy* singleton() {
static DeadObjectProxy singleton;
return &singleton;

View File

@ -1,299 +0,0 @@
commit 5647dde295f4
Author: Emilio Cobos Álvarez <emilio@crisal.io>
Date: Wed Oct 4 11:36:20 2017 +0200
Bug 1404324 - Use the placeholder state to remove out-of-flows that aren't real descendants of the destruction root. r=bz, a=ritu
Using the style of the frame can mess things up when we reparent them due to
::first-line before removing them.
MozReview-Commit-ID: 3Dt0wF2XRAH
--HG--
extra : source : 5a034cdb513208dd19adf0babf30ee734968a78f
extra : histedit_source : 4cd958939c5a76e013695e931d721454268a0dc7%2C96bdeda302c567493c7db5105f306595d25332e1
---
layout/base/nsCSSFrameConstructor.cpp | 8 +++---
layout/base/nsLayoutUtils.cpp | 46 +++------------------------------
layout/generic/nsPlaceholderFrame.cpp | 27 ++++++++++++++++---
layout/generic/nsPlaceholderFrame.h | 21 ++++++++-------
layout/style/crashtests/1404324-1.html | 12 +++++++++
layout/style/crashtests/1404324-2.html | 10 +++++++
layout/style/crashtests/1404324-3.html | 14 ++++++++++
layout/style/crashtests/crashtests.list | 3 +++
8 files changed, 83 insertions(+), 58 deletions(-)
diff --git layout/base/nsCSSFrameConstructor.cpp layout/base/nsCSSFrameConstructor.cpp
index c840416fd6a7..99b1211b399b 100644
--- layout/base/nsCSSFrameConstructor.cpp
+++ layout/base/nsCSSFrameConstructor.cpp
@@ -1260,8 +1260,10 @@ nsFrameConstructorState::GetOutOfFlowFrameItems(nsIFrame* aNewFrame,
if (disp->mTopLayer != NS_STYLE_TOP_LAYER_NONE) {
*aPlaceholderType = PLACEHOLDER_FOR_TOPLAYER;
if (disp->mPosition == NS_STYLE_POSITION_FIXED) {
+ *aPlaceholderType |= PLACEHOLDER_FOR_FIXEDPOS;
return &mTopLayerFixedItems;
}
+ *aPlaceholderType |= PLACEHOLDER_FOR_ABSPOS;
return &mTopLayerAbsoluteItems;
}
if (disp->mPosition == NS_STYLE_POSITION_ABSOLUTE) {
@@ -1303,11 +1305,11 @@ nsFrameConstructorState::ConstructBackdropFrameFor(nsIContent* aContent,
nsAbsoluteItems* frameItems = GetOutOfFlowFrameItems(backdropFrame,
true, true, false,
&placeholderType);
- MOZ_ASSERT(placeholderType == PLACEHOLDER_FOR_TOPLAYER);
+ MOZ_ASSERT(placeholderType & PLACEHOLDER_FOR_TOPLAYER);
nsIFrame* placeholder = nsCSSFrameConstructor::
CreatePlaceholderFrameFor(mPresShell, aContent, backdropFrame,
- frame, nullptr, PLACEHOLDER_FOR_TOPLAYER);
+ frame, nullptr, placeholderType);
nsFrameList temp(placeholder, placeholder);
frame->SetInitialChildList(nsIFrame::kBackdropList, temp);
@@ -1361,7 +1363,7 @@ nsFrameConstructorState::AddChild(nsIFrame* aNewFrame,
// Add the placeholder frame to the flow
aFrameItems.AddChild(placeholderFrame);
- if (placeholderType == PLACEHOLDER_FOR_TOPLAYER) {
+ if (placeholderType & PLACEHOLDER_FOR_TOPLAYER) {
ConstructBackdropFrameFor(aContent, aNewFrame);
}
}
diff --git layout/base/nsLayoutUtils.cpp layout/base/nsLayoutUtils.cpp
index cb010c0a1a80..94ead9830c25 100644
--- layout/base/nsLayoutUtils.cpp
+++ layout/base/nsLayoutUtils.cpp
@@ -1525,6 +1525,8 @@ nsLayoutUtils::GetChildListNameFor(nsIFrame* aChildFrame)
{
nsIFrame::ChildListID id = nsIFrame::kPrincipalList;
+ MOZ_DIAGNOSTIC_ASSERT(!(aChildFrame->GetStateBits() & NS_FRAME_OUT_OF_FLOW));
+
if (aChildFrame->GetStateBits() & NS_FRAME_IS_OVERFLOW_CONTAINER) {
nsIFrame* pif = aChildFrame->GetPrevInFlow();
if (pif->GetParent() == aChildFrame->GetParent()) {
@@ -1533,35 +1535,6 @@ nsLayoutUtils::GetChildListNameFor(nsIFrame* aChildFrame)
else {
id = nsIFrame::kOverflowContainersList;
}
- }
- // See if the frame is moved out of the flow
- else if (aChildFrame->GetStateBits() & NS_FRAME_OUT_OF_FLOW) {
- // Look at the style information to tell
- const nsStyleDisplay* disp = aChildFrame->StyleDisplay();
-
- if (NS_STYLE_POSITION_ABSOLUTE == disp->mPosition) {
- id = nsIFrame::kAbsoluteList;
- } else if (NS_STYLE_POSITION_FIXED == disp->mPosition) {
- if (nsLayoutUtils::IsReallyFixedPos(aChildFrame)) {
- id = nsIFrame::kFixedList;
- } else {
- id = nsIFrame::kAbsoluteList;
- }
-#ifdef MOZ_XUL
- } else if (StyleDisplay::MozPopup == disp->mDisplay) {
- // Out-of-flows that are DISPLAY_POPUP must be kids of the root popup set
-#ifdef DEBUG
- nsIFrame* parent = aChildFrame->GetParent();
- NS_ASSERTION(parent && parent->IsPopupSetFrame(), "Unexpected parent");
-#endif // DEBUG
-
- id = nsIFrame::kPopupList;
-#endif // MOZ_XUL
- } else {
- NS_ASSERTION(aChildFrame->IsFloating(), "not a floated frame");
- id = nsIFrame::kFloatList;
- }
-
} else {
LayoutFrameType childType = aChildFrame->Type();
if (LayoutFrameType::MenuPopup == childType) {
@@ -1596,19 +1569,8 @@ nsLayoutUtils::GetChildListNameFor(nsIFrame* aChildFrame)
nsContainerFrame* parent = aChildFrame->GetParent();
bool found = parent->GetChildList(id).ContainsFrame(aChildFrame);
if (!found) {
- if (!(aChildFrame->GetStateBits() & NS_FRAME_OUT_OF_FLOW)) {
- found = parent->GetChildList(nsIFrame::kOverflowList)
- .ContainsFrame(aChildFrame);
- }
- else if (aChildFrame->IsFloating()) {
- found = parent->GetChildList(nsIFrame::kOverflowOutOfFlowList)
- .ContainsFrame(aChildFrame);
- if (!found) {
- found = parent->GetChildList(nsIFrame::kPushedFloatsList)
- .ContainsFrame(aChildFrame);
- }
- }
- // else it's positioned and should have been on the 'id' child list.
+ found = parent->GetChildList(nsIFrame::kOverflowList)
+ .ContainsFrame(aChildFrame);
NS_POSTCONDITION(found, "not in child list");
}
#endif
diff --git layout/generic/nsPlaceholderFrame.cpp layout/generic/nsPlaceholderFrame.cpp
index 7da2582ae526..4b2e1bf84b36 100644
--- layout/generic/nsPlaceholderFrame.cpp
+++ layout/generic/nsPlaceholderFrame.cpp
@@ -25,9 +25,9 @@ using namespace mozilla::gfx;
nsIFrame*
NS_NewPlaceholderFrame(nsIPresShell* aPresShell, nsStyleContext* aContext,
- nsFrameState aTypeBit)
+ nsFrameState aTypeBits)
{
- return new (aPresShell) nsPlaceholderFrame(aContext, aTypeBit);
+ return new (aPresShell) nsPlaceholderFrame(aContext, aTypeBits);
}
NS_IMPL_FRAMEARENA_HELPERS(nsPlaceholderFrame)
@@ -155,6 +155,26 @@ nsPlaceholderFrame::Reflow(nsPresContext* aPresContext,
NS_FRAME_SET_TRUNCATION(aStatus, aReflowInput, aDesiredSize);
}
+static nsIFrame::ChildListID
+ChildListIDForOutOfFlow(nsFrameState aPlaceholderState, nsIFrame* aChild)
+{
+ if (aPlaceholderState & PLACEHOLDER_FOR_FLOAT) {
+ return nsIFrame::kFloatList;
+ }
+ if (aPlaceholderState & PLACEHOLDER_FOR_POPUP) {
+ return nsIFrame::kPopupList;
+ }
+ if (aPlaceholderState & PLACEHOLDER_FOR_FIXEDPOS) {
+ return nsLayoutUtils::IsReallyFixedPos(aChild)
+ ? nsIFrame::kFixedList : nsIFrame::kAbsoluteList;
+ }
+ if (aPlaceholderState & PLACEHOLDER_FOR_ABSPOS) {
+ return nsIFrame::kAbsoluteList;
+ }
+ MOZ_DIAGNOSTIC_ASSERT(false, "unknown list");
+ return nsIFrame::kFloatList;
+}
+
void
nsPlaceholderFrame::DestroyFrom(nsIFrame* aDestructRoot)
{
@@ -162,12 +182,13 @@ nsPlaceholderFrame::DestroyFrom(nsIFrame* aDestructRoot)
if (oof) {
mOutOfFlowFrame = nullptr;
oof->DeleteProperty(nsIFrame::PlaceholderFrameProperty());
+
// If aDestructRoot is not an ancestor of the out-of-flow frame,
// then call RemoveFrame on it here.
// Also destroy it here if it's a popup frame. (Bug 96291)
if ((GetStateBits() & PLACEHOLDER_FOR_POPUP) ||
!nsLayoutUtils::IsProperAncestorFrame(aDestructRoot, oof)) {
- ChildListID listId = nsLayoutUtils::GetChildListNameFor(oof);
+ ChildListID listId = ChildListIDForOutOfFlow(GetStateBits(), oof);
nsFrameManager* fm = PresContext()->GetPresShell()->FrameManager();
fm->RemoveFrame(listId, oof);
}
diff --git layout/generic/nsPlaceholderFrame.h layout/generic/nsPlaceholderFrame.h
index e270c76cdd31..2af9b4ccbc93 100644
--- layout/generic/nsPlaceholderFrame.h
+++ layout/generic/nsPlaceholderFrame.h
@@ -40,7 +40,7 @@
nsIFrame* NS_NewPlaceholderFrame(nsIPresShell* aPresShell,
nsStyleContext* aContext,
- nsFrameState aTypeBit);
+ nsFrameState aTypeBits);
#define PLACEHOLDER_TYPE_MASK (PLACEHOLDER_FOR_FLOAT | \
PLACEHOLDER_FOR_ABSPOS | \
@@ -65,18 +65,19 @@ public:
*/
friend nsIFrame* NS_NewPlaceholderFrame(nsIPresShell* aPresShell,
nsStyleContext* aContext,
- nsFrameState aTypeBit);
- nsPlaceholderFrame(nsStyleContext* aContext, nsFrameState aTypeBit)
+ nsFrameState aTypeBits);
+ nsPlaceholderFrame(nsStyleContext* aContext, nsFrameState aTypeBits)
: nsFrame(aContext, kClassID)
, mOutOfFlowFrame(nullptr)
{
- NS_PRECONDITION(aTypeBit == PLACEHOLDER_FOR_FLOAT ||
- aTypeBit == PLACEHOLDER_FOR_ABSPOS ||
- aTypeBit == PLACEHOLDER_FOR_FIXEDPOS ||
- aTypeBit == PLACEHOLDER_FOR_POPUP ||
- aTypeBit == PLACEHOLDER_FOR_TOPLAYER,
- "Unexpected type bit");
- AddStateBits(aTypeBit);
+ MOZ_ASSERT(aTypeBits == PLACEHOLDER_FOR_FLOAT ||
+ aTypeBits == PLACEHOLDER_FOR_ABSPOS ||
+ aTypeBits == PLACEHOLDER_FOR_FIXEDPOS ||
+ aTypeBits == PLACEHOLDER_FOR_POPUP ||
+ aTypeBits == (PLACEHOLDER_FOR_TOPLAYER | PLACEHOLDER_FOR_ABSPOS) ||
+ aTypeBits == (PLACEHOLDER_FOR_TOPLAYER | PLACEHOLDER_FOR_FIXEDPOS),
+ "Unexpected type bit");
+ AddStateBits(aTypeBits);
}
// Get/Set the associated out of flow frame
diff --git layout/style/crashtests/1404324-1.html layout/style/crashtests/1404324-1.html
new file mode 100644
index 000000000000..574a5437cb1b
--- /dev/null
+++ layout/style/crashtests/1404324-1.html
@@ -0,0 +1,12 @@
+<style></style>
+<script>
+document.documentElement.className = 'c1'
+o1 = document.createElement('form')
+o2 = document.createElement('e')
+o1.className = 'c2'
+document.documentElement.appendChild(o1)
+document.documentElement.appendChild(o2)
+document.styleSheets[0].insertRule('.c1:first-line, .c2 { position:fixed', 0);
+document.documentElement.getBoundingClientRect()
+document.styleSheets[0].cssRules[0].style.position = 'relative'
+</script>
diff --git layout/style/crashtests/1404324-2.html layout/style/crashtests/1404324-2.html
new file mode 100644
index 000000000000..797347d5c058
--- /dev/null
+++ layout/style/crashtests/1404324-2.html
@@ -0,0 +1,10 @@
+<style>
+ del, *::first-line {
+ position: absolute;
+ }
+</style>
+<del></del>
+<script>
+ document.documentElement.offsetTop;
+ document.styleSheets[0].cssRules[0].style.position = 'sticky'
+</script>
diff --git layout/style/crashtests/1404324-3.html layout/style/crashtests/1404324-3.html
new file mode 100644
index 000000000000..3b06f12a2bf6
--- /dev/null
+++ layout/style/crashtests/1404324-3.html
@@ -0,0 +1,14 @@
+<style>
+del {
+ position: absolute;
+}
+
+body::first-line {
+ color: red;
+}
+</style>
+<del></del>
+<script>
+ document.documentElement.offsetTop;
+ document.styleSheets[0].cssRules[0].style.position = 'sticky'
+</script>
diff --git layout/style/crashtests/crashtests.list layout/style/crashtests/crashtests.list
index be9a46c52bfa..5eaba6935ee2 100644
--- layout/style/crashtests/crashtests.list
+++ layout/style/crashtests/crashtests.list
@@ -238,3 +238,6 @@ load 1403615.html
load 1387481-1.html
load 1387499.html
load 1391577.html
+asserts-if(stylo,1) load 1404324-1.html # bug 1405605
+load 1404324-2.html
+load 1404324-3.html

View File

@ -1,111 +0,0 @@
commit 3eff0850dd67
Author: Jan de Mooij <jdemooij@mozilla.com>
Date: Thu Oct 26 16:15:35 2017 +0200
Bug 1404636 - Special-case typed arrays in PropertyReadNeedsTypeBarrier. r=bhackett, a=lizzard
--HG--
extra : source : 74d76655c9192b20dc69ddfa40c38e65fa9a47e3
---
js/src/jit/IonBuilder.cpp | 26 --------------------------
js/src/jit/MIR.cpp | 8 ++++++++
js/src/jit/MIR.h | 23 +++++++++++++++++++++++
3 files changed, 31 insertions(+), 26 deletions(-)
diff --git js/src/jit/IonBuilder.cpp js/src/jit/IonBuilder.cpp
index 0f78e9d5d3b7..f0ef380da2bc 100644
--- js/src/jit/IonBuilder.cpp
+++ js/src/jit/IonBuilder.cpp
@@ -7825,9 +7825,6 @@ IonBuilder::getElemTryTypedObject(bool* emitted, MDefinition* obj, MDefinition*
MOZ_CRASH("Bad kind");
}
-static MIRType
-MIRTypeForTypedArrayRead(Scalar::Type arrayType, bool observedDouble);
-
bool
IonBuilder::checkTypedObjectIndexInBounds(uint32_t elemSize,
MDefinition* obj,
@@ -8793,29 +8790,6 @@ IonBuilder::convertShiftToMaskForStaticTypedArray(MDefinition* id,
return ptr;
}
-static MIRType
-MIRTypeForTypedArrayRead(Scalar::Type arrayType, bool observedDouble)
-{
- switch (arrayType) {
- case Scalar::Int8:
- case Scalar::Uint8:
- case Scalar::Uint8Clamped:
- case Scalar::Int16:
- case Scalar::Uint16:
- case Scalar::Int32:
- return MIRType::Int32;
- case Scalar::Uint32:
- return observedDouble ? MIRType::Double : MIRType::Int32;
- case Scalar::Float32:
- return MIRType::Float32;
- case Scalar::Float64:
- return MIRType::Double;
- default:
- break;
- }
- MOZ_CRASH("Unknown typed array type");
-}
-
AbortReasonOr<Ok>
IonBuilder::jsop_getelem_typed(MDefinition* obj, MDefinition* index,
Scalar::Type arrayType)
diff --git js/src/jit/MIR.cpp js/src/jit/MIR.cpp
index bac5948bfc21..ef286b7d546c 100644
--- js/src/jit/MIR.cpp
+++ js/src/jit/MIR.cpp
@@ -6235,6 +6235,14 @@ PropertyReadNeedsTypeBarrier(CompilerConstraintList* constraints,
return BarrierKind::TypeSet;
}
+ if (!name && IsTypedArrayClass(key->clasp())) {
+ Scalar::Type arrayType = Scalar::Type(key->clasp() - &TypedArrayObject::classes[0]);
+ MIRType type = MIRTypeForTypedArrayRead(arrayType, true);
+ if (observed->mightBeMIRType(type))
+ return BarrierKind::NoBarrier;
+ return BarrierKind::TypeSet;
+ }
+
jsid id = name ? NameToId(name) : JSID_VOID;
HeapTypeSetKey property = key->property(id);
if (property.maybeTypes()) {
diff --git js/src/jit/MIR.h js/src/jit/MIR.h
index d6d895b2caf2..16824b3f67ad 100644
--- js/src/jit/MIR.h
+++ js/src/jit/MIR.h
@@ -15107,6 +15107,29 @@ ArrayPrototypeHasIndexedProperty(IonBuilder* builder, JSScript* script);
AbortReasonOr<bool>
TypeCanHaveExtraIndexedProperties(IonBuilder* builder, TemporaryTypeSet* types);
+inline MIRType
+MIRTypeForTypedArrayRead(Scalar::Type arrayType, bool observedDouble)
+{
+ switch (arrayType) {
+ case Scalar::Int8:
+ case Scalar::Uint8:
+ case Scalar::Uint8Clamped:
+ case Scalar::Int16:
+ case Scalar::Uint16:
+ case Scalar::Int32:
+ return MIRType::Int32;
+ case Scalar::Uint32:
+ return observedDouble ? MIRType::Double : MIRType::Int32;
+ case Scalar::Float32:
+ return MIRType::Float32;
+ case Scalar::Float64:
+ return MIRType::Double;
+ default:
+ break;
+ }
+ MOZ_CRASH("Unknown typed array type");
+}
+
} // namespace jit
} // namespace js

View File

@ -1,170 +0,0 @@
commit 2c8bf0ecbc5d
Author: Andrea Marchesini <amarchesini@mozilla.com>
Date: Wed Oct 4 14:18:19 2017 +0200
Bug 1404910 - WebSocket should consider the corrent top-level window principal. r=smaug, a=ritu
--HG--
extra : source : c543c0a50db700883b57c052710c97b5ef731e1f
---
dom/base/WebSocket.cpp | 15 ++++---
dom/base/test/iframe_webSocket_sandbox.html | 65 +++++++++++++++++++++++++++++
dom/base/test/mochitest.ini | 3 ++
dom/base/test/test_webSocket_sandbox.html | 34 +++++++++++++++
4 files changed, 109 insertions(+), 8 deletions(-)
diff --git dom/base/WebSocket.cpp dom/base/WebSocket.cpp
index dc2c1c70107b..982c67cd2abd 100644
--- dom/base/WebSocket.cpp
+++ dom/base/WebSocket.cpp
@@ -1666,18 +1666,17 @@ WebSocketImpl::Init(JSContext* aCx,
nsCOMPtr<nsPIDOMWindowInner> innerWindow;
while (true) {
- if (principal) {
- bool isNullPrincipal = true;
- isNullPrincipal = principal->GetIsNullPrincipal();
- if (isNullPrincipal || nsContentUtils::IsSystemPrincipal(principal)) {
- break;
- }
+ if (principal && !principal->GetIsNullPrincipal()) {
+ break;
}
if (!innerWindow) {
innerWindow = do_QueryInterface(globalObject);
- if (NS_WARN_IF(!innerWindow)) {
- return NS_ERROR_DOM_SECURITY_ERR;
+ if (!innerWindow) {
+ // If we are in a XPConnect sandbox or in a JS component,
+ // innerWindow will be null. There is nothing on top of this to be
+ // considered.
+ break;
}
}
diff --git dom/base/test/iframe_webSocket_sandbox.html dom/base/test/iframe_webSocket_sandbox.html
new file mode 100644
index 000000000000..d889a79b05da
--- /dev/null
+++ dom/base/test/iframe_webSocket_sandbox.html
@@ -0,0 +1,65 @@
+<html><body>
+<iframe id="frame" sandbox="allow-scripts allow-popups"></iframe>
+<script type="application/javascript;version=1.8">
+onmessage = function(e) {
+ parent.postMessage(e.data, '*');
+}
+
+var ifr = document.getElementById('frame');
+
+if (location.search == '?nested') {
+ var url = new URL(location);
+ url.search = "";
+ ifr.src = url.href;
+} else if (location.search == '?popup') {
+ var url = new URL(location);
+ url.search = "?opener";
+
+ ifr.srcdoc = "<html><script>" +
+ "window.open('" + url.href + "', 'foobar');" +
+ "onmessage = function(e) { " +
+ " parent.postMessage(e.data, '*'); " +
+ "}" +
+ "</scr" + "ipt></html>";
+} else if (location.search == '?opener') {
+ try{
+ var socket = new WebSocket('ws://mochi.test:8888/tests/dom/base/test/file_websocket_basic');
+ socket.onerror = function(e) {
+ opener.postMessage('WS onerror', '*');
+ close();
+ };
+ socket.onopen = function(event) {
+ opener.postMessage('WS onopen', '*');
+ close();
+ };
+ } catch(e) {
+ if (e.name == 'SecurityError') {
+ opener.postMessage('WS Throws!', '*');
+ } else {
+ opener.postMessage('WS Throws something else!', '*');
+ }
+ close();
+ }
+} else {
+ ifr.srcdoc = `
+ <html><script>
+ try{
+ var socket = new WebSocket('ws://mochi.test:8888/tests/dom/base/test/file_websocket_basic');
+ socket.onerror = function(e) {
+ parent.postMessage('WS onerror', '*');
+ };
+ socket.onopen = function(event) {
+ parent.postMessage('WS onopen', '*');
+ };
+ } catch(e) {
+ if (e.name == 'SecurityError') {
+ parent.postMessage('WS Throws!', '*');
+ } else {
+ parent.postMessage('WS Throws something else!', '*');
+ }
+ }
+ </scr`+`ipt>
+ </html>`;
+}
+</script>
+</body></html>
diff --git dom/base/test/mochitest.ini dom/base/test/mochitest.ini
index 670dd5ae0a06..5d59fe1ea7b8 100644
--- dom/base/test/mochitest.ini
+++ dom/base/test/mochitest.ini
@@ -804,6 +804,9 @@ skip-if = toolkit == 'android'
skip-if = toolkit == 'android'
[test_websocket_permessage_deflate.html]
skip-if = toolkit == 'android'
+[test_webSocket_sandbox.html]
+skip-if = toolkit == 'android'
+support-files = iframe_webSocket_sandbox.html
[test_websocket1.html]
skip-if = toolkit == 'android'
[test_websocket2.html]
diff --git dom/base/test/test_webSocket_sandbox.html dom/base/test/test_webSocket_sandbox.html
new file mode 100644
index 000000000000..b343fa784f39
--- /dev/null
+++ dom/base/test/test_webSocket_sandbox.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Bug 1252751</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<div id="container"></div>
+<iframe id="frame"></iframe>
+<script type="application/javascript;version=1.8">
+var urls = [ "https://example.com/tests/dom/base/test/iframe_webSocket_sandbox.html",
+ "https://example.com/tests/dom/base/test/iframe_webSocket_sandbox.html?nested",
+ "https://example.com/tests/dom/base/test/iframe_webSocket_sandbox.html?popup" ];
+
+onmessage = function(e) {
+ is(e.data, "WS Throws!", "ws://URI cannot be used by a https iframe");
+ runTest();
+}
+
+function runTest() {
+ if (!urls.length) {
+ SimpleTest.finish();
+ return;
+ }
+
+ document.getElementById("frame").src = urls.shift();
+}
+
+SimpleTest.waitForExplicitFinish();
+runTest();
+</script>
+</body>
+</html>

View File

@ -1,53 +0,0 @@
commit 3708901c15ba
Author: Byron Campen [:bwc] <docfaraday@gmail.com>
Date: Thu Oct 12 12:12:40 2017 -0500
Bug 1406154 - Ensure that we avoid truncating the interface description strings in a couple of corner cases. r=drno, a=sledru
MozReview-Commit-ID: KMTpbkvA4N
--HG--
extra : source : 5c8d4905c2bdbb3cfa0db5e07a3cd6ba4eb23fdd
---
media/mtransport/nrinterfaceprioritizer.cpp | 2 +-
media/mtransport/third_party/nICEr/src/net/transport_addr.c | 6 +++++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git media/mtransport/nrinterfaceprioritizer.cpp media/mtransport/nrinterfaceprioritizer.cpp
index 37756991239c..34b941c53a45 100644
--- media/mtransport/nrinterfaceprioritizer.cpp
+++ media/mtransport/nrinterfaceprioritizer.cpp
@@ -28,7 +28,7 @@ public:
bool Init(const nr_local_addr& local_addr) {
ifname_ = local_addr.addr.ifname;
- char buf[MAXIFNAME + 41];
+ char buf[MAXIFNAME + 47];
int r = nr_transport_addr_fmt_ifname_addr_string(&local_addr.addr, buf, sizeof(buf));
if (r) {
MOZ_MTLOG(ML_ERROR, "Error formatting interface key.");
diff --git media/mtransport/third_party/nICEr/src/net/transport_addr.c media/mtransport/third_party/nICEr/src/net/transport_addr.c
index 99564a08e8b9..ae849f43387e 100644
--- media/mtransport/third_party/nICEr/src/net/transport_addr.c
+++ media/mtransport/third_party/nICEr/src/net/transport_addr.c
@@ -98,7 +98,8 @@ int nr_transport_addr_fmt_addr_string(nr_transport_addr *addr)
int nr_transport_addr_fmt_ifname_addr_string(const nr_transport_addr *addr, char *buf, int len)
{
int _status;
- char buffer[40];
+ /* leave room for a fully-expanded IPV4-mapped IPV6 address */
+ char buffer[46];
switch(addr->ip_version){
case NR_IPV4:
@@ -114,7 +115,10 @@ int nr_transport_addr_fmt_ifname_addr_string(const nr_transport_addr *addr, char
default:
ABORT(R_INTERNAL);
}
+ buffer[sizeof(buffer) - 1] = '\0';
+
snprintf(buf,len,"%s:%s",addr->ifname,buffer);
+ buf[len - 1] = '\0';
_status=0;
abort:

View File

@ -1,36 +0,0 @@
commit c79dd79bdb5c
Author: André Bargull <andre.bargull@gmail.com>
Date: Thu Oct 12 09:20:07 2017 -0700
Bug 1406398 - Avoid rooting the object twice in EnumerableOwnProperties. r=jandem, a=lizzard
--HG--
extra : source : c2cecb6d6f9bb85f258a66cf8e94c1860adde7e5
---
js/src/builtin/Object.cpp | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git js/src/builtin/Object.cpp js/src/builtin/Object.cpp
index dff377a1cd97..ff4dd029cb52 100644
--- js/src/builtin/Object.cpp
+++ js/src/builtin/Object.cpp
@@ -1246,9 +1246,6 @@ EnumerableOwnProperties(JSContext* cx, const JS::CallArgs& args, EnumerableOwnPr
RootedId id(cx);
RootedValue key(cx);
RootedValue value(cx);
- RootedNativeObject nobj(cx);
- if (obj->is<NativeObject>())
- nobj = &obj->as<NativeObject>();
RootedShape shape(cx);
Rooted<PropertyDescriptor> desc(cx);
// Step 4.
@@ -1265,7 +1262,8 @@ EnumerableOwnProperties(JSContext* cx, const JS::CallArgs& args, EnumerableOwnPr
}
// Step 4.a.i.
- if (nobj) {
+ if (obj->is<NativeObject>()) {
+ HandleNativeObject nobj = obj.as<NativeObject>();
if (JSID_IS_INT(id) && nobj->containsDenseElement(JSID_TO_INT(id))) {
value = nobj->getDenseOrTypedArrayElement(JSID_TO_INT(id));
} else {

View File

@ -1,47 +0,0 @@
commit f2e38d27a7e3
Author: Emilio Cobos Álvarez <emilio@crisal.io>
Date: Tue Oct 24 17:44:12 2017 -0400
Bug 1406750 - Use GetStyleContextNoFlush in UpdateCurrentStyleSources, and avoid flushing mPresShell twice. r=bz, a=abillings
MozReview-Commit-ID: Nfu9FZcIzQ
--HG--
extra : source : c73db1c3b6e78a5fad216ca7cc7e4ce312c30a98
extra : amend_source : 9b31fa281368a9dc39a4a949cb85ae2f354a4308
---
layout/style/nsComputedDOMStyle.cpp | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git layout/style/nsComputedDOMStyle.cpp layout/style/nsComputedDOMStyle.cpp
index 062e00ffebc5..1aa07e691d4a 100644
--- layout/style/nsComputedDOMStyle.cpp
+++ layout/style/nsComputedDOMStyle.cpp
@@ -832,6 +832,11 @@ nsComputedDOMStyle::UpdateCurrentStyleSources(bool aNeedsLayoutFlush)
return;
}
+ nsCOMPtr<nsIPresShell> presShellForContent = GetPresShellForContent(mContent);
+ if (presShellForContent && presShellForContent != mPresShell) {
+ presShellForContent->FlushPendingNotifications(FlushType::Style);
+ }
+
// We need to use GetUndisplayedRestyleGeneration instead of
// GetRestyleGeneration, because the caching of mStyleContext is an
// optimization that is useful only for displayed elements.
@@ -922,10 +927,11 @@ nsComputedDOMStyle::UpdateCurrentStyleSources(bool aNeedsLayoutFlush)
#endif
// Need to resolve a style context
RefPtr<nsStyleContext> resolvedStyleContext =
- nsComputedDOMStyle::GetStyleContext(mContent->AsElement(),
- mPseudo,
- mPresShell,
- mStyleType);
+ nsComputedDOMStyle::GetStyleContextNoFlush(
+ mContent->AsElement(),
+ mPseudo,
+ presShellForContent ? presShellForContent.get() : mPresShell,
+ mStyleType);
if (!resolvedStyleContext) {
ClearStyleContext();
return;

View File

@ -1,48 +0,0 @@
commit 5666a545d8a1
Author: David Anderson <danderson@mozilla.com>
Date: Mon Oct 23 16:18:24 2017 -0400
Bug 1407032 - Reorder when GPUProcessHosts are destroyed. r=rhunt, a=ritu
--HG--
extra : source : 2fb069813d832de4338028cf84c8dab483ba0fda
---
gfx/ipc/GPUProcessHost.cpp | 19 ++++++-------------
1 file changed, 6 insertions(+), 13 deletions(-)
diff --git gfx/ipc/GPUProcessHost.cpp gfx/ipc/GPUProcessHost.cpp
index 544baea242cf..249decc52a95 100644
--- gfx/ipc/GPUProcessHost.cpp
+++ gfx/ipc/GPUProcessHost.cpp
@@ -190,25 +190,18 @@ GPUProcessHost::Shutdown()
void
GPUProcessHost::OnChannelClosed()
{
- if (!mShutdownRequested) {
+ mChannelClosed = true;
+
+ if (!mShutdownRequested && mListener) {
// This is an unclean shutdown. Notify our listener that we're going away.
- mChannelClosed = true;
- if (mListener) {
- mListener->OnProcessUnexpectedShutdown(this);
- }
+ mListener->OnProcessUnexpectedShutdown(this);
+ } else {
+ DestroyProcess();
}
// Release the actor.
GPUChild::Destroy(Move(mGPUChild));
MOZ_ASSERT(!mGPUChild);
-
- // If the owner of GPUProcessHost already requested shutdown, we can now
- // schedule destruction. Otherwise we must wait for someone to call
- // Shutdown. Note that GPUProcessManager calls Shutdown within
- // OnProcessUnexpectedShutdown.
- if (mShutdownRequested) {
- DestroyProcess();
- }
}
void

View File

@ -1,28 +0,0 @@
commit b2d46387afc9
Author: Boris Zbarsky <bzbarsky@mit.edu>
Date: Wed Oct 11 22:19:06 2017 -0400
Bug 1407375 - Make sure to call NodeInfoChanged whenever we change the nodeinfo on a node. r=peterv, a=ritu
MozReview-Commit-ID: 71k1jv8thFA
--HG--
extra : source : 51ff2d13e50c1e8f7731e4c7243064bb96d2e4d0
---
dom/base/nsNodeUtils.cpp | 3 +++
1 file changed, 3 insertions(+)
diff --git dom/base/nsNodeUtils.cpp dom/base/nsNodeUtils.cpp
index 64ab9e852966..dd958aa443ce 100644
--- dom/base/nsNodeUtils.cpp
+++ dom/base/nsNodeUtils.cpp
@@ -593,6 +593,9 @@ nsNodeUtils::CloneAndAdopt(nsINode *aNode, bool aClone, bool aDeep,
aNode->OwnerDoc()->UnregisterActivityObserver(aNode->AsElement());
}
aNode->mNodeInfo.swap(newNodeInfo);
+ if (elem) {
+ elem->NodeInfoChanged(newDoc);
+ }
if (wasRegistered) {
aNode->OwnerDoc()->RegisterActivityObserver(aNode->AsElement());
}

View File

@ -1,26 +0,0 @@
commit a8fee72c6fc1
Author: Andrew McCreight <continuation@gmail.com>
Date: Fri Oct 20 16:11:26 2017 -0400
Bug 1407740 - Fix a crash by setting a flag to true. r=bz, a=lizzard
--HG--
extra : source : 23d3b458f69c56b0f3b2b8faa1453f79e32ce70c
---
docshell/base/nsDocShell.cpp | 3 +++
1 file changed, 3 insertions(+)
diff --git docshell/base/nsDocShell.cpp docshell/base/nsDocShell.cpp
index 6748a2722e5a..f7dc1508a74d 100644
--- docshell/base/nsDocShell.cpp
+++ docshell/base/nsDocShell.cpp
@@ -881,6 +881,9 @@ nsDocShell::~nsDocShell()
{
MOZ_ASSERT(!mObserved);
+ // Avoid notifying observers while we're in the dtor.
+ mIsBeingDestroyed = true;
+
Destroy();
nsCOMPtr<nsISHistoryInternal> shPrivate(do_QueryInterface(mSessionHistory));

View File

@ -1,35 +0,0 @@
commit 390b56f13f00
Author: Andrea Marchesini <amarchesini@mozilla.com>
Date: Fri Oct 13 07:11:40 2017 +0200
Bug 1407751 - DefineOSFileConstants should return false if OSFileConstants service is not initialized. r=froydnj, a=ritu
--HG--
extra : source : 2f76e40db328035331dd6aa79d0e5fbf04db7c96
---
dom/system/OSFileConstants.cpp | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git dom/system/OSFileConstants.cpp dom/system/OSFileConstants.cpp
index edafe9f1c560..3cd77f6c3c12 100644
--- dom/system/OSFileConstants.cpp
+++ dom/system/OSFileConstants.cpp
@@ -346,6 +346,7 @@ void CleanupOSFileConstants()
gInitialized = false;
delete gPaths;
+ gPaths = nullptr;
}
@@ -874,9 +875,7 @@ bool SetStringProperty(JSContext *cx, JS::Handle<JSObject*> aObject, const char
*/
bool DefineOSFileConstants(JSContext *cx, JS::Handle<JSObject*> global)
{
- MOZ_ASSERT(gInitialized);
-
- if (gPaths == nullptr) {
+ if (!gInitialized || gPaths == nullptr) {
// If an initialization error was ignored, we may end up with
// |gInitialized == true| but |gPaths == nullptr|. We cannot
// |MOZ_ASSERT| this, as this would kill precompile_cache.js,

View File

@ -1,25 +0,0 @@
commit 988e61cc6282
Author: Andrew McCreight <continuation@gmail.com>
Date: Mon Oct 23 10:18:42 2017 -0400
Bug 1408005 - Clear gApplicationReputationService in the dtor. r=francois, a=abillings
--HG--
extra : source : 1613834d8d1145200886a039f733b1e066c63cbd
---
toolkit/components/downloads/ApplicationReputation.cpp | 2 ++
1 file changed, 2 insertions(+)
diff --git toolkit/components/downloads/ApplicationReputation.cpp toolkit/components/downloads/ApplicationReputation.cpp
index b19841d8235d..18bc3b71728d 100644
--- toolkit/components/downloads/ApplicationReputation.cpp
+++ toolkit/components/downloads/ApplicationReputation.cpp
@@ -1576,6 +1576,8 @@ ApplicationReputationService::ApplicationReputationService()
ApplicationReputationService::~ApplicationReputationService() {
LOG(("Application reputation service shutting down"));
+ MOZ_ASSERT(gApplicationReputationService == this);
+ gApplicationReputationService = nullptr;
}
NS_IMETHODIMP

View File

@ -1,37 +0,0 @@
commit 81f184512a09
Author: Jan de Mooij <jdemooij@mozilla.com>
Date: Wed Oct 25 11:30:17 2017 +0200
Bug 1408412 - Use ARGS_LENGTH_MAX as upper bound in MArgumentsLength::computeRange. r=nbp, a=lizzard
--HG--
extra : source : aaf54dce048a85806833529a5d53ecc46156ef47
---
js/src/jit/RangeAnalysis.cpp | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git js/src/jit/RangeAnalysis.cpp js/src/jit/RangeAnalysis.cpp
index a3daefa848a7..19715ccc250a 100644
--- js/src/jit/RangeAnalysis.cpp
+++ js/src/jit/RangeAnalysis.cpp
@@ -15,6 +15,7 @@
#include "jit/MIRGenerator.h"
#include "jit/MIRGraph.h"
#include "js/Conversions.h"
+#include "vm/ArgumentsObject.h"
#include "vm/TypedArrayObject.h"
#include "jsopcodeinlines.h"
@@ -1845,9 +1846,9 @@ MArgumentsLength::computeRange(TempAllocator& alloc)
{
// This is is a conservative upper bound on what |TooManyActualArguments|
// checks. If exceeded, Ion will not be entered in the first place.
- MOZ_ASSERT(JitOptions.maxStackArgs <= UINT32_MAX,
- "NewUInt32Range requires a uint32 value");
- setRange(Range::NewUInt32Range(alloc, 0, JitOptions.maxStackArgs));
+ static_assert(ARGS_LENGTH_MAX <= UINT32_MAX,
+ "NewUInt32Range requires a uint32 value");
+ setRange(Range::NewUInt32Range(alloc, 0, ARGS_LENGTH_MAX));
}
void

View File

@ -1,55 +0,0 @@
commit 5b8d4bd1ffaa
Author: Jonathan Kew <jkew@mozilla.com>
Date: Wed Oct 18 10:24:03 2017 +0100
Bug 1408782 - Force punycode display for IDNs with a <dotless-i, combining mark above> sequence. r=valentin a=ritu
---
netwerk/dns/nsIDNService.cpp | 9 +++++++++
netwerk/test/unit/test_idn_urls.js | 7 +++++++
2 files changed, 16 insertions(+)
diff --git netwerk/dns/nsIDNService.cpp netwerk/dns/nsIDNService.cpp
index e07910a7e70d..a89b4301ea07 100644
--- netwerk/dns/nsIDNService.cpp
+++ netwerk/dns/nsIDNService.cpp
@@ -867,6 +867,7 @@ bool nsIDNService::isLabelSafe(const nsAString &label)
Script lastScript = Script::INVALID;
uint32_t previousChar = 0;
+ uint32_t baseChar = 0; // last non-diacritic seen (base char for marks)
uint32_t savedNumberingSystem = 0;
// Simplified/Traditional Chinese check temporarily disabled -- bug 857481
#if 0
@@ -948,6 +949,14 @@ bool nsIDNService::isLabelSafe(const nsAString &label)
}
}
}
+ // Check for diacritics on dotless-i, which would be indistinguishable
+ // from normal accented letter i.
+ if (baseChar == 0x0131 &&
+ ((ch >= 0x0300 && ch <= 0x0314) || ch == 0x031a)) {
+ return false;
+ }
+ } else {
+ baseChar = ch;
}
// Simplified/Traditional Chinese check temporarily disabled -- bug 857481
diff --git netwerk/test/unit/test_idn_urls.js netwerk/test/unit/test_idn_urls.js
index f39a9650a13b..e0d73ca512ee 100644
--- netwerk/test/unit/test_idn_urls.js
+++ netwerk/test/unit/test_idn_urls.js
@@ -300,6 +300,13 @@ const testcases = [
["goo\u0650gle", "xn--google-yri", false, false, false],
// ...but Arabic diacritics are allowed on Arabic text
["العَرَبِي", "xn--mgbc0a5a6cxbzabt", false, true, true],
+
+ // Accents above dotless-i are not allowed
+ ["na\u0131\u0308ve", "xn--nave-mza04z", false, false, false],
+ ["d\u0131\u0302ner", "xn--dner-lza40z", false, false, false],
+ // but the corresponding accented-i (based on dotted i) is OK
+ ["na\u00efve.com", "xn--nave-6pa.com", false, true, true],
+ ["d\u00eener.com", "xn--dner-0pa.com", false, true, true],
];
const profiles = ["ASCII", "high", "moderate"];

View File

@ -1,34 +0,0 @@
commit 53a3958e0a76
Author: Valentin Gosu <valentin.gosu@gmail.com>
Date: Sat Oct 28 00:15:01 2017 +0200
Bug 1408990 - Only add the entry to the performance object if the loading document's principal is the same as the triggering principal. r=bz, r=dragana, a=lizzard
MozReview-Commit-ID: 7o8XKHioP1p
--HG--
extra : rebase_source : 33d4044b4901cee460cc69a0bae1fe0e84dab2aa
extra : source : ff9e841ff8544053f184d2e425500d5dd13ee14d
---
netwerk/protocol/http/HttpBaseChannel.cpp | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git netwerk/protocol/http/HttpBaseChannel.cpp netwerk/protocol/http/HttpBaseChannel.cpp
index 8a5c4d8d9f45..16e59241e2fc 100644
--- netwerk/protocol/http/HttpBaseChannel.cpp
+++ netwerk/protocol/http/HttpBaseChannel.cpp
@@ -4088,6 +4088,14 @@ HttpBaseChannel::GetPerformance()
return nullptr;
}
+ // We only add to the document's performance object if it has the same
+ // principal as the one triggering the load. This is to prevent navigations
+ // triggered _by_ the iframe from showing up in the parent document's
+ // performance entries if they have different origins.
+ if (!mLoadInfo->TriggeringPrincipal()->Equals(loadingDocument->NodePrincipal())) {
+ return nullptr;
+ }
+
nsCOMPtr<nsPIDOMWindowInner> innerWindow = loadingDocument->GetInnerWindow();
if (!innerWindow) {
return nullptr;

View File

@ -1,27 +0,0 @@
Bug 1409680 - Extend --disable-debug-symbols to Rust code.
This reduces disk I/O and memory usage during build that already lacks
debugging symbols from C++ code, allowing to use more jobs on 32bit hosts.
--disable-debug-symbols build on FreeBSD 10.3 i386 (8 cores) host:
Max RSS before: libxul - 612 Mb, libgkrust - 1908 Mb
Max RSS after: libxul - 444 Mb, libgkrust - 1471 Mb
Binary before: libxul - 203 Mb, libgkrust - 732 Mb
Binary after: libxul - 123 Mb, libgkrust - 301 Mb
--- config/rules.mk.orig 2017-09-14 20:15:53 UTC
+++ config/rules.mk
@@ -906,11 +906,13 @@ ifdef MOZ_USING_SCCACHE
sccache_wrap := RUSTC_WRAPPER='$(CCACHE)'
endif
+ifdef MOZ_DEBUG_SYMBOLS
# XXX hack to work around dsymutil failing on cross-OSX builds (bug 1380381)
ifeq ($(HOST_OS_ARCH)-$(OS_ARCH),Linux-Darwin)
default_rustflags += -C debuginfo=1
else
default_rustflags += -C debuginfo=2
+endif
endif
# We use the + prefix to pass down the jobserver fds to cargo, but we

View File

@ -1,44 +0,0 @@
commit da2637dd8a23
Author: David Keeler <dkeeler@mozilla.com>
Date: Wed Oct 25 09:54:13 2017 -0700
Bug 1411458 - Confirm we actually have a PKCS#7 signedData content info. r=jcj, a=ritu
MozReview-Commit-ID: GKfL1C0EPWt
--HG--
extra : source : 22a772cfa62ae6908751b1cdd98a9234f2ea6105
---
security/manager/ssl/nsDataSignatureVerifier.cpp | 6 ++++++
security/nss.symbols | 1 +
2 files changed, 7 insertions(+)
diff --git security/manager/ssl/nsDataSignatureVerifier.cpp security/manager/ssl/nsDataSignatureVerifier.cpp
index f78740365e1a..2527431dd9ae 100644
--- security/manager/ssl/nsDataSignatureVerifier.cpp
+++ security/manager/ssl/nsDataSignatureVerifier.cpp
@@ -170,6 +170,12 @@ VerifyCMSDetachedSignatureIncludingCertificate(
return NS_ERROR_CMS_VERIFY_NO_CONTENT_INFO;
}
+ // We're expecting this to be a PKCS#7 signedData content info.
+ if (NSS_CMSContentInfo_GetContentTypeTag(cinfo)
+ != SEC_OID_PKCS7_SIGNED_DATA) {
+ return NS_ERROR_CMS_VERIFY_NO_CONTENT_INFO;
+ }
+
// signedData is non-owning
NSSCMSSignedData* signedData =
static_cast<NSSCMSSignedData*>(NSS_CMSContentInfo_GetContent(cinfo));
diff --git security/nss.symbols security/nss.symbols
index 626fc64d96f9..517a577a8de4 100644
--- security/nss.symbols
+++ security/nss.symbols
@@ -181,6 +181,7 @@ HASH_ResultLenByOidTag
HASH_Update
NSSBase64_EncodeItem_Util
NSS_CMSContentInfo_GetContent
+NSS_CMSContentInfo_GetContentTypeTag
NSS_CMSContentInfo_SetContent_Data
NSS_CMSContentInfo_SetContent_EnvelopedData
NSS_CMSContentInfo_SetContent_SignedData

View File

@ -1,42 +0,0 @@
commit 4bb201af8ede
Author: Emilio Cobos Álvarez <emilio@crisal.io>
Date: Sun Oct 29 17:39:20 2017 -0400
Bug 1412252 - Only fetch mPresShell after flushing the relevant content pres shell. r=bz, a=ritu
MozReview-Commit-ID: BkcYtu2MsNs
--HG--
extra : rebase_source : aaf4e69af1cfb4e6becd491f3f4a6e4924cb307a
extra : source : 044406030675adf7dfdb0317fca3852fa1ea3ff7
---
layout/style/nsComputedDOMStyle.cpp | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git layout/style/nsComputedDOMStyle.cpp layout/style/nsComputedDOMStyle.cpp
index 1aa07e691d4a..1eb9fbebdc8d 100644
--- layout/style/nsComputedDOMStyle.cpp
+++ layout/style/nsComputedDOMStyle.cpp
@@ -826,17 +826,17 @@ nsComputedDOMStyle::UpdateCurrentStyleSources(bool aNeedsLayoutFlush)
mFlushedPendingReflows = aNeedsLayoutFlush;
#endif
+ nsCOMPtr<nsIPresShell> presShellForContent = GetPresShellForContent(mContent);
+ if (presShellForContent && presShellForContent != document->GetShell()) {
+ presShellForContent->FlushPendingNotifications(FlushType::Style);
+ }
+
mPresShell = document->GetShell();
if (!mPresShell || !mPresShell->GetPresContext()) {
ClearStyleContext();
return;
}
- nsCOMPtr<nsIPresShell> presShellForContent = GetPresShellForContent(mContent);
- if (presShellForContent && presShellForContent != mPresShell) {
- presShellForContent->FlushPendingNotifications(FlushType::Style);
- }
-
// We need to use GetUndisplayedRestyleGeneration instead of
// GetRestyleGeneration, because the caching of mStyleContext is an
// optimization that is useful only for displayed elements.

View File

@ -261,7 +261,7 @@ index 9297e4d6f501..d8e273887e4b 100644
+option('--with-system-harfbuzz',
+ help="Use system harfbuzz (located with pkgconfig)")
+
+system_harfbuzz = pkg_check_modules('MOZ_HARFBUZZ', 'harfbuzz >= 1.4.7',
+system_harfbuzz = pkg_check_modules('MOZ_HARFBUZZ', 'harfbuzz >= 1.5.1',
+ when='--with-system-harfbuzz')
+
+set_config('MOZ_SYSTEM_HARFBUZZ', depends_if(system_harfbuzz)(lambda _: True))

View File

@ -1,11 +1,11 @@
--- build/pgo/profileserver.py.orig 2011-02-24 21:49:47.000000000 +0100
+++ build/pgo/profileserver.py 2011-02-24 21:50:30.000000000 +0100
@@ -59,7 +59,7 @@ if __name__ == '__main__':
env["MOZ_JAR_LOG_FILE"] = os.path.abspath(jarlog)
print "jarlog: %s" % env["MOZ_JAR_LOG_FILE"]
--- build/pgo/profileserver.py.orig 2017-09-15 04:15:39 UTC
+++ build/pgo/profileserver.py
@@ -87,7 +87,7 @@ if __name__ == '__main__':
env["MOZ_JAR_LOG_FILE"] = os.path.abspath(jarlog)
print "jarlog: %s" % env["MOZ_JAR_LOG_FILE"]
- cmdargs = ["http://localhost:%d/index.html" % PORT]
+ cmdargs = ["http://127.0.0.1:%d/index.html" % PORT]
runner = FirefoxRunner(profile=profile,
binary=build.get_binary_path(where="staged-package"),
cmdargs=cmdargs,
- cmdargs = ["http://localhost:%d/index.html" % PORT]
+ cmdargs = ["http://127.0.0.1:%d/index.html" % PORT]
runner = FirefoxRunner(profile=profile,
binary=build.get_binary_path(
where="staged-package"),

View File

@ -1,53 +0,0 @@
commit 4cbdfa028752
Author: Manish Goregaokar <manishsmail@gmail.com>
Date: Tue Aug 1 12:57:42 2017 -0500
servo: Merge #17934 - Remove doc comment on statement (from Manishearth:doc-comment); r=canaltinova
rustc warns about these now
Source-Repo: https://github.com/servo/servo
Source-Revision: b49311c65a083a9b8eb03741bf7ea980b64f1e03
--HG--
extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear
extra : subtree_revision : 6b3c7d7f4ffeb9e271c52d418cda42cac5dd378d
---
servo/components/style/values/specified/image.rs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git servo/components/style/values/specified/image.rs servo/components/style/values/specified/image.rs
index 37ed00ccf443..687c6f17d432 100644
--- servo/components/style/values/specified/image.rs
+++ servo/components/style/values/specified/image.rs
@@ -686,14 +686,14 @@ impl LineDirection {
input.try(|i| {
let to_ident = i.try(|i| i.expect_ident_matching("to"));
match *compat_mode {
- /// `to` keyword is mandatory in modern syntax.
+ // `to` keyword is mandatory in modern syntax.
CompatMode::Modern => to_ident?,
// Fall back to Modern compatibility mode in case there is a `to` keyword.
// According to Gecko, `-moz-linear-gradient(to ...)` should serialize like
// `linear-gradient(to ...)`.
CompatMode::Moz if to_ident.is_ok() => *compat_mode = CompatMode::Modern,
- /// There is no `to` keyword in webkit prefixed syntax. If it's consumed,
- /// parsing should throw an error.
+ // There is no `to` keyword in webkit prefixed syntax. If it's consumed,
+ // parsing should throw an error.
CompatMode::WebKit if to_ident.is_ok() => {
return Err(SelectorParseError::UnexpectedIdent("to".into()).into())
},
diff --git servo/components/style/properties/gecko.mako.rs servo/components/style/properties/gecko.mako.rs
index 37ed00ccf443..687c6f17d432 100644
--- servo/components/style/properties/gecko.mako.rs
+++ servo/components/style/properties/gecko.mako.rs
@@ -2081,7 +2081,7 @@ fn static_assert() {
return (parent_size, parent_unconstrained_size)
}
- /// XXXManishearth this should also handle text zoom
+ // XXXManishearth this should also handle text zoom
let min = Au(parent.gecko.mScriptMinSize);
let scale = (parent.gecko.mScriptSizeMultiplier as f32).powi(delta as i32);

View File

@ -1,110 +0,0 @@
commit 9f5c1f2e4b5b
Author: Manish Goregaokar <manishsmail@gmail.com>
Date: Thu Aug 3 16:27:12 2017 -0500
servo: Merge #17969 - Update stylo code to work on nightly (from Manishearth:rustup); r=emilio
r=emilio https://bugzilla.mozilla.org/show_bug.cgi?id=1386887
Source-Repo: https://github.com/servo/servo
Source-Revision: 7cee7d7fcc4194e410fa8a308a77d37ac452778a
--HG--
extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear
extra : subtree_revision : d9c874ebcfa1e64c86265d0ed2e5cff65d9133be
---
servo/components/style/gecko/generated/bindings.rs | 12 +++++++++---
servo/components/style/gecko/wrapper.rs | 7 ++++++-
servo/ports/geckolib/glue.rs | 3 ++-
3 files changed, 17 insertions(+), 5 deletions(-)
diff --git servo/components/style/gecko/generated/bindings.rs servo/components/style/gecko/generated/bindings.rs
index e46bdfe1e1ea..b6703ab95bf7 100644
--- servo/components/style/gecko/generated/bindings.rs
+++ servo/components/style/gecko/generated/bindings.rs
@@ -8,6 +8,7 @@ type nsAString_internal = nsAString;
pub type ServoStyleContextBorrowed<'a> = &'a ::properties::ComputedValues;
pub type ServoStyleContextBorrowedOrNull<'a> = Option<&'a ::properties::ComputedValues>;
pub type ServoComputedDataBorrowed<'a> = &'a ServoComputedData;
+pub type RawServoAnimationValueTableBorrowed<'a> = &'a ();
use gecko_bindings::structs::mozilla::css::GridTemplateAreasValue;
use gecko_bindings::structs::mozilla::css::ErrorReporter;
use gecko_bindings::structs::mozilla::css::ImageValue;
@@ -37,7 +38,7 @@ use gecko_bindings::structs::RawServoStyleRule;
use gecko_bindings::structs::RawGeckoPresContext;
use gecko_bindings::structs::RawGeckoPresContextOwned;
use gecko_bindings::structs::RawGeckoStyleAnimationList;
-use gecko_bindings::structs::RawGeckoStyleChildrenIteratorBorrowedMut;
+use gecko_bindings::structs::RawGeckoStyleChildrenIterator;
use gecko_bindings::structs::RawGeckoServoStyleRuleList;
use gecko_bindings::structs::RawGeckoURLExtraData;
use gecko_bindings::structs::RawGeckoXBLBinding;
@@ -320,6 +321,10 @@ pub type RawGeckoServoAnimationValueListBorrowed<'a> = &'a RawGeckoServoAnimatio
pub type RawGeckoServoAnimationValueListBorrowedOrNull<'a> = Option<&'a RawGeckoServoAnimationValueList>;
pub type RawGeckoServoAnimationValueListBorrowedMut<'a> = &'a mut RawGeckoServoAnimationValueList;
pub type RawGeckoServoAnimationValueListBorrowedMutOrNull<'a> = Option<&'a mut RawGeckoServoAnimationValueList>;
+pub type RawGeckoStyleChildrenIteratorBorrowed<'a> = &'a RawGeckoStyleChildrenIterator;
+pub type RawGeckoStyleChildrenIteratorBorrowedOrNull<'a> = Option<&'a RawGeckoStyleChildrenIterator>;
+pub type RawGeckoStyleChildrenIteratorBorrowedMut<'a> = &'a mut RawGeckoStyleChildrenIterator;
+pub type RawGeckoStyleChildrenIteratorBorrowedMutOrNull<'a> = Option<&'a mut RawGeckoStyleChildrenIterator>;
pub type ServoCssRulesStrong = ::gecko_bindings::sugar::ownership::Strong<ServoCssRules>;
pub type ServoCssRulesBorrowed<'a> = &'a ServoCssRules;
pub type ServoCssRulesBorrowedOrNull<'a> = Option<&'a ServoCssRules>;
@@ -840,7 +845,7 @@ extern "C" {
}
extern "C" {
pub fn Gecko_AnimationGetBaseStyle(aBaseStyles:
- *mut ::std::os::raw::c_void,
+ RawServoAnimationValueTableBorrowed,
aProperty: nsCSSPropertyID)
-> RawServoAnimationValueBorrowedOrNull;
}
@@ -2602,7 +2607,8 @@ extern "C" {
extern "C" {
pub fn Servo_AnimationCompose(animation_values:
RawServoAnimationValueMapBorrowedMut,
- base_values: *mut ::std::os::raw::c_void,
+ base_values:
+ RawServoAnimationValueTableBorrowed,
property: nsCSSPropertyID,
animation_segment:
RawGeckoAnimationPropertySegmentBorrowed,
diff --git servo/components/style/gecko/wrapper.rs servo/components/style/gecko/wrapper.rs
index dae898692313..6d62f54951cc 100644
--- servo/components/style/gecko/wrapper.rs
+++ servo/components/style/gecko/wrapper.rs
@@ -387,7 +387,12 @@ impl<'a> Iterator for GeckoChildrenIterator<'a> {
curr
},
GeckoChildrenIterator::GeckoIterator(ref mut it) => unsafe {
- Gecko_GetNextStyleChild(it).map(GeckoNode)
+ // We do this unsafe lengthening of the lifetime here because
+ // structs::StyleChildrenIterator is actually StyleChildrenIterator<'a>,
+ // however we can't express this easily with bindgen, and it would
+ // introduce functions with two input lifetimes into bindgen,
+ // which would be out of scope for elision.
+ Gecko_GetNextStyleChild(&mut * (it as *mut _)).map(GeckoNode)
}
}
}
diff --git servo/ports/geckolib/glue.rs servo/ports/geckolib/glue.rs
index 367d24ff87b2..e69959f3710b 100644
--- servo/ports/geckolib/glue.rs
+++ servo/ports/geckolib/glue.rs
@@ -59,6 +59,7 @@ use style::gecko_bindings::bindings::RawGeckoServoStyleRuleListBorrowedMut;
use style::gecko_bindings::bindings::RawServoAnimationValueBorrowed;
use style::gecko_bindings::bindings::RawServoAnimationValueMapBorrowedMut;
use style::gecko_bindings::bindings::RawServoAnimationValueStrong;
+use style::gecko_bindings::bindings::RawServoAnimationValueTableBorrowed;
use style::gecko_bindings::bindings::RawServoStyleRuleBorrowed;
use style::gecko_bindings::bindings::ServoStyleContextBorrowedOrNull;
use style::gecko_bindings::bindings::nsTArrayBorrowed_uintptr_t;
@@ -374,7 +375,7 @@ pub extern "C" fn Servo_AnimationValues_ComputeDistance(from: RawServoAnimationV
#[no_mangle]
pub extern "C" fn Servo_AnimationCompose(raw_value_map: RawServoAnimationValueMapBorrowedMut,
- base_values: *mut ::std::os::raw::c_void,
+ base_values: RawServoAnimationValueTableBorrowed,
css_property: nsCSSPropertyID,
segment: RawGeckoAnimationPropertySegmentBorrowed,
last_segment: RawGeckoAnimationPropertySegmentBorrowed,

View File

@ -1,763 +0,0 @@
commit ea9c8db790e4
Author: Simon Sapin <simon.sapin@exyr.org>
Date: Tue Aug 15 07:31:04 2017 -0500
servo: Merge #18046 - Upgrade to rustc 1.21.0-nightly (13d94d5fa 2017-08-10) (from servo:rustup); r=emilio
Source-Repo: https://github.com/servo/servo
Source-Revision: 7d9b82b9efa7b10a2e34d93df5ac535d99518f7a
--HG--
extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear
extra : subtree_revision : e1b3d113c3edaea3c4c07f8b206f2e02922e3caf
---
servo/Cargo.lock | 6 +++---
servo/components/devtools/lib.rs | 2 +-
servo/components/layout/animation.rs | 2 +-
servo/components/layout/construct.rs | 6 +++---
servo/components/layout/display_list_builder.rs | 2 +-
servo/components/layout/flex.rs | 6 +++---
servo/components/layout/inline.rs | 4 ++--
servo/components/layout/sequential.rs | 2 +-
servo/components/layout/table_cell.rs | 2 +-
servo/components/layout/text.rs | 2 +-
servo/components/net/cookie_storage.rs | 2 +-
servo/components/profile/heartbeats.rs | 4 ++--
servo/components/script/dom/bindings/js.rs | 4 ++--
servo/components/script/dom/cssstyledeclaration.rs | 8 ++++----
servo/components/script/dom/cssstylerule.rs | 2 +-
servo/components/script/dom/document.rs | 12 ++++++------
servo/components/script/dom/medialist.rs | 4 ++--
servo/components/script/dom/range.rs | 4 ++--
.../script/dom/servoparser/async_html.rs | 4 ++--
servo/components/script/dom/url.rs | 4 ++--
servo/components/script/dom/vrdisplay.rs | 2 +-
.../components/script/dom/webglrenderingcontext.rs | 2 +-
servo/components/script/dom/xmlhttprequest.rs | 2 +-
servo/components/script/lib.rs | 1 -
.../script_plugins/unrooted_must_root.rs | 22 +++++++++++++++-------
servo/components/selectors/matching.rs | 2 +-
servo/components/selectors/parser.rs | 2 +-
.../style/invalidation/element/invalidator.rs | 2 +-
servo/components/style/matching.rs | 2 +-
.../components/style/properties/properties.mako.rs | 2 +-
servo/components/style/style_adjuster.rs | 2 +-
servo/components/style/style_resolver.rs | 2 +-
servo/components/style/stylesheets/rule_list.rs | 2 +-
servo/components/style/stylesheets/rule_parser.rs | 2 +-
.../components/style/stylesheets/rules_iterator.rs | 2 +-
servo/components/style/values/animated/color.rs | 2 +-
servo/components/style/values/computed/border.rs | 2 +-
servo/components/webdriver_server/lib.rs | 2 +-
servo/rust-commit-hash | 2 +-
servo/tests/unit/style/stylist.rs | 13 -------------
40 files changed, 73 insertions(+), 79 deletions(-)
diff --git servo/Cargo.lock servo/Cargo.lock
index 50dd6e1a785a..2aa7bd8ea3dd 100644
--- servo/Cargo.lock
+++ servo/Cargo.lock
@@ -3577,7 +3577,7 @@ version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"error-chain 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "xcb 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "xcb 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -3592,7 +3592,7 @@ dependencies = [
[[package]]
name = "xcb"
-version = "0.7.6"
+version = "0.7.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3918,7 +3918,7 @@ dependencies = [
"checksum x11 2.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db27c597c187da52194a4b8232e7d869503911aab9ff726fefb76d7a830f78ed"
"checksum x11-clipboard 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "731230b8edcbb9d99247105e4c9ec0a538594d50ad68d2afa8662195f9db2973"
"checksum x11-dl 2.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "326c500cdc166fd7c70dd8c8a829cd5c0ce7be5a5d98c25817de2b9bdc67faf8"
-"checksum xcb 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "63e3a849b73e4e1905e4f4d48f1750429bc86ea9f473632ab382a6f69ecb6b33"
+"checksum xcb 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)" = "7cede38417fcdf2f0a9d8abf1cea1c1b066320a8a316e9583a0d717c334fafb2"
"checksum xdg 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a66b7c2281ebde13cf4391d70d4c7e5946c3c25e72a7b859ca8f677dcd0b0c61"
"checksum xi-unicode 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "12ea8eda4b1eb72f02d148402e23832d56a33f55d8c1b2d5bcdde91d79d47cb1"
"checksum xml-rs 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7ec6c39eaa68382c8e31e35239402c0a9489d4141a8ceb0c716099a0b515b562"
diff --git servo/components/devtools/lib.rs servo/components/devtools/lib.rs
index d5a2764a7102..6a25696eaed7 100644
--- servo/components/devtools/lib.rs
+++ servo/components/devtools/lib.rs
@@ -306,7 +306,7 @@ fn run_server(sender: Sender<DevtoolsControlMsg>,
columnNumber: console_message.columnNumber,
},
};
- for mut stream in &mut *console_actor.streams.borrow_mut() {
+ for stream in &mut *console_actor.streams.borrow_mut() {
stream.write_json_packet(&msg);
}
}
diff --git servo/components/layout/animation.rs servo/components/layout/animation.rs
index e4a2782c1271..ebbba82fcc6a 100644
--- servo/components/layout/animation.rs
+++ servo/components/layout/animation.rs
@@ -39,7 +39,7 @@ pub fn update_animation_state(constellation_chan: &IpcSender<ConstellationMsg>,
// run.
if let Some(ref mut animations) = running_animations.get_mut(node) {
// TODO: This being linear is probably not optimal.
- for mut anim in animations.iter_mut() {
+ for anim in animations.iter_mut() {
if let Animation::Keyframes(_, ref anim_name, ref mut anim_state) = *anim {
if *name == *anim_name {
debug!("update_animation_state: Found other animation {}", name);
diff --git servo/components/layout/construct.rs servo/components/layout/construct.rs
index c863219941e4..7ef391b42183 100644
--- servo/components/layout/construct.rs
+++ servo/components/layout/construct.rs
@@ -1921,7 +1921,7 @@ impl Legalizer {
/// true for anonymous block children of flex flows.
fn try_to_add_child(&mut self, context: &SharedStyleContext, parent: &mut FlowRef, child: &mut FlowRef)
-> bool {
- let mut parent = self.stack.last_mut().unwrap_or(parent);
+ let parent = self.stack.last_mut().unwrap_or(parent);
let (parent_class, child_class) = (parent.class(), child.class());
match (parent_class, child_class) {
(FlowClass::TableWrapper, FlowClass::Table) |
@@ -1962,7 +1962,7 @@ impl Legalizer {
} else {
IS_BLOCK_FLEX_ITEM
};
- let mut block = FlowRef::deref_mut(&mut block_wrapper).as_mut_block();
+ let block = FlowRef::deref_mut(&mut block_wrapper).as_mut_block();
block.base.flags.insert(MARGINS_CANNOT_COLLAPSE);
block.fragment.flags.insert(flag);
}
@@ -1979,7 +1979,7 @@ impl Legalizer {
} else {
IS_BLOCK_FLEX_ITEM
};
- let mut block = FlowRef::deref_mut(child).as_mut_block();
+ let block = FlowRef::deref_mut(child).as_mut_block();
block.base.flags.insert(MARGINS_CANNOT_COLLAPSE);
block.fragment.flags.insert(flag);
}
diff --git servo/components/layout/display_list_builder.rs servo/components/layout/display_list_builder.rs
index f8b26899b57d..783574afd2a3 100644
--- servo/components/layout/display_list_builder.rs
+++ servo/components/layout/display_list_builder.rs
@@ -2718,7 +2718,7 @@ impl InlineFlowDisplayListBuilding for InlineFlow {
self.base.scroll_root_id = Some(state.current_scroll_root_id);
self.base.clip = state.clip_stack.last().cloned().unwrap_or_else(max_rect);
- for mut fragment in self.fragments.fragments.iter_mut() {
+ for fragment in self.fragments.fragments.iter_mut() {
let previous_containing_block_scroll_root_id = state.containing_block_scroll_root_id;
if establishes_containing_block_for_absolute(fragment.style.get_box().position) {
state.containing_block_scroll_root_id = state.current_scroll_root_id;
diff --git servo/components/layout/flex.rs servo/components/layout/flex.rs
index 353c939f58b9..d79580f8cd0d 100644
--- servo/components/layout/flex.rs
+++ servo/components/layout/flex.rs
@@ -415,7 +415,7 @@ impl FlexFlow {
let items = &mut self.items[start..];
let mut children = self.block_flow.base.children.random_access_mut();
- for mut item in items {
+ for item in items {
let kid = children.get(item.index);
item.init_sizes(kid, container_size, self.main_mode);
let outer_main_size = item.outer_main_size(kid, self.main_mode);
@@ -607,7 +607,7 @@ impl FlexFlow {
let mut children = self.block_flow.base.children.random_access_mut();
for item in items.iter_mut() {
- let mut block = children.get(item.index).as_mut_block();
+ let block = children.get(item.index).as_mut_block();
block.base.block_container_writing_mode = container_mode;
block.base.block_container_inline_size = inline_size;
@@ -659,7 +659,7 @@ impl FlexFlow {
let mut children = self.block_flow.base.children.random_access_mut();
for item in &mut self.items {
- let mut base = flow::mut_base(children.get(item.index));
+ let base = flow::mut_base(children.get(item.index));
if !self.main_reverse {
base.position.start.b = cur_b;
cur_b = cur_b + base.position.size.block;
diff --git servo/components/layout/inline.rs servo/components/layout/inline.rs
index d5813d9bea22..10e091c3c66d 100644
--- servo/components/layout/inline.rs
+++ servo/components/layout/inline.rs
@@ -435,7 +435,7 @@ impl LineBreaker {
return
}
let last_fragment_index = self.pending_line.range.end() - FragmentIndex(1);
- let mut fragment = &mut self.new_fragments[last_fragment_index.get() as usize];
+ let fragment = &mut self.new_fragments[last_fragment_index.get() as usize];
let old_fragment_inline_size = fragment.border_box.size.inline;
@@ -1047,7 +1047,7 @@ impl InlineFlow {
let space_per_expansion_opportunity = slack_inline_size / expansion_opportunities as i32;
for fragment_index in line.range.each_index() {
let fragment = fragments.get_mut(fragment_index.to_usize());
- let mut scanned_text_fragment_info = match fragment.specific {
+ let scanned_text_fragment_info = match fragment.specific {
SpecificFragmentInfo::ScannedText(ref mut info) if !info.range.is_empty() => info,
_ => continue
};
diff --git servo/components/layout/sequential.rs servo/components/layout/sequential.rs
index f6f8ce429e4f..4986ebb6c852 100644
--- servo/components/layout/sequential.rs
+++ servo/components/layout/sequential.rs
@@ -133,7 +133,7 @@ pub fn store_overflow(layout_context: &LayoutContext, flow: &mut Flow) {
return;
}
- for mut kid in flow::mut_base(flow).child_iter_mut() {
+ for kid in flow::mut_base(flow).child_iter_mut() {
store_overflow(layout_context, kid);
}
diff --git servo/components/layout/table_cell.rs servo/components/layout/table_cell.rs
index 7ef02e28db65..fd807989b463 100644
--- servo/components/layout/table_cell.rs
+++ servo/components/layout/table_cell.rs
@@ -136,7 +136,7 @@ impl TableCellFlow {
}
for kid in flow::mut_base(self).children.iter_mut() {
- let mut kid_base = flow::mut_base(kid);
+ let kid_base = flow::mut_base(kid);
if !kid_base.flags.contains(IS_ABSOLUTELY_POSITIONED) {
kid_base.position.start.b += offset
}
diff --git servo/components/layout/text.rs servo/components/layout/text.rs
index 6e1c7b2a43a1..9a207a2bb84e 100644
--- servo/components/layout/text.rs
+++ servo/components/layout/text.rs
@@ -460,7 +460,7 @@ fn split_first_fragment_at_newline_if_necessary(fragments: &mut LinkedList<Fragm
}
let new_fragment = {
- let mut first_fragment = fragments.front_mut().unwrap();
+ let first_fragment = fragments.front_mut().unwrap();
let string_before;
let selection_before;
{
diff --git servo/components/net/cookie_storage.rs servo/components/net/cookie_storage.rs
index f255f57b56d2..b3147ef4dd32 100644
--- servo/components/net/cookie_storage.rs
+++ servo/components/net/cookie_storage.rs
@@ -103,7 +103,7 @@ impl CookieStorage {
// Step 12
let domain = reg_host(&cookie.cookie.domain().as_ref().unwrap_or(&""));
- let mut cookies = self.cookies_map.entry(domain).or_insert(vec![]);
+ let cookies = self.cookies_map.entry(domain).or_insert(vec![]);
if cookies.len() == self.max_per_host {
let old_len = cookies.len();
diff --git servo/components/profile/heartbeats.rs servo/components/profile/heartbeats.rs
index 4661dad61836..0d474fe3a111 100644
--- servo/components/profile/heartbeats.rs
+++ servo/components/profile/heartbeats.rs
@@ -33,7 +33,7 @@ pub fn cleanup() {
)
);
if let Some(mut hbs) = hbs_opt_box {
- for (_, mut v) in hbs.iter_mut() {
+ for (_, v) in hbs.iter_mut() {
// log any remaining heartbeat records before dropping
log_heartbeat_records(v);
}
@@ -65,7 +65,7 @@ pub fn maybe_heartbeat(category: &ProfilerCategory,
if !(*hbs_ptr).contains_key(category) {
maybe_create_heartbeat(&mut (*hbs_ptr), category.clone());
}
- if let Some(mut h) = (*hbs_ptr).get_mut(category) {
+ if let Some(h) = (*hbs_ptr).get_mut(category) {
(*h).heartbeat(0, 1, start_time, end_time, start_energy, end_energy);
}
}
diff --git servo/components/script/dom/bindings/js.rs servo/components/script/dom/bindings/js.rs
index 975ddeda13b0..abfd9f47eff1 100644
--- servo/components/script/dom/bindings/js.rs
+++ servo/components/script/dom/bindings/js.rs
@@ -469,7 +469,7 @@ impl RootCollection {
/// Start tracking a stack-based root
unsafe fn root(&self, untracked_reflector: *const Reflector) {
debug_assert!(thread_state::get().is_script());
- let mut roots = &mut *self.roots.get();
+ let roots = &mut *self.roots.get();
roots.push(untracked_reflector);
assert!(!(*untracked_reflector).get_jsobject().is_null())
}
@@ -479,7 +479,7 @@ impl RootCollection {
assert!(!tracked_reflector.is_null());
assert!(!(*tracked_reflector).get_jsobject().is_null());
debug_assert!(thread_state::get().is_script());
- let mut roots = &mut *self.roots.get();
+ let roots = &mut *self.roots.get();
match roots.iter().rposition(|r| *r == tracked_reflector) {
Some(idx) => {
roots.remove(idx);
diff --git servo/components/script/dom/cssstyledeclaration.rs servo/components/script/dom/cssstyledeclaration.rs
index 0732c9af9e45..ddf085b34913 100644
--- servo/components/script/dom/cssstyledeclaration.rs
+++ servo/components/script/dom/cssstyledeclaration.rs
@@ -238,7 +238,7 @@ impl CSSStyleDeclaration {
return Err(Error::NoModificationAllowed);
}
- self.owner.mutate_associated_block(|ref mut pdb, mut changed| {
+ self.owner.mutate_associated_block(|pdb, changed| {
if value.is_empty() {
// Step 3
*changed = pdb.remove_property(&id);
@@ -360,7 +360,7 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration {
_ => return Ok(()),
};
- self.owner.mutate_associated_block(|ref mut pdb, mut changed| {
+ self.owner.mutate_associated_block(|pdb, changed| {
// Step 5 & 6
*changed = pdb.set_importance(&id, importance);
});
@@ -388,7 +388,7 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration {
};
let mut string = String::new();
- self.owner.mutate_associated_block(|mut pdb, mut changed| {
+ self.owner.mutate_associated_block(|pdb, changed| {
pdb.property_value_to_css(&id, &mut string).unwrap();
*changed = pdb.remove_property(&id);
});
@@ -438,7 +438,7 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration {
}
let quirks_mode = window.Document().quirks_mode();
- self.owner.mutate_associated_block(|mut pdb, mut _changed| {
+ self.owner.mutate_associated_block(|pdb, _changed| {
// Step 3
*pdb = parse_style_attribute(&value,
&self.owner.base_url(),
diff --git servo/components/script/dom/cssstylerule.rs servo/components/script/dom/cssstylerule.rs
index ea121ef900a9..12e9cdcc8694 100644
--- servo/components/script/dom/cssstylerule.rs
+++ servo/components/script/dom/cssstylerule.rs
@@ -99,7 +99,7 @@ impl CSSStyleRuleMethods for CSSStyleRule {
if let Ok(mut s) = SelectorList::parse(&parser, &mut css_parser) {
// This mirrors what we do in CSSStyleOwner::mutate_associated_block.
let mut guard = self.cssrule.shared_lock().write();
- let mut stylerule = self.stylerule.write_with(&mut guard);
+ let stylerule = self.stylerule.write_with(&mut guard);
mem::swap(&mut stylerule.selectors, &mut s);
// It seems like we will want to avoid having to invalidate all
// stylesheets eventually!
diff --git servo/components/script/dom/document.rs servo/components/script/dom/document.rs
index 90ea06fbe7b4..71bb02eaa364 100644
--- servo/components/script/dom/document.rs
+++ servo/components/script/dom/document.rs
@@ -633,7 +633,7 @@ impl Document {
// reset_form_owner_for_listeners -> reset_form_owner -> GetElementById
{
let mut id_map = self.id_map.borrow_mut();
- let mut elements = id_map.entry(id.clone()).or_insert(Vec::new());
+ let elements = id_map.entry(id.clone()).or_insert(Vec::new());
elements.insert_pre_order(element, root.r().upcast::<Node>());
}
self.reset_form_owner_for_listeners(&id);
@@ -642,7 +642,7 @@ impl Document {
pub fn register_form_id_listener<T: ?Sized + FormControl>(&self, id: DOMString, listener: &T) {
let mut map = self.form_id_listener_map.borrow_mut();
let listener = listener.to_element();
- let mut set = map.entry(Atom::from(id)).or_insert(HashSet::new());
+ let set = map.entry(Atom::from(id)).or_insert(HashSet::new());
set.insert(JS::from_ref(listener));
}
@@ -1572,7 +1572,7 @@ impl Document {
/// https://html.spec.whatwg.org/multipage/#dom-window-cancelanimationframe
pub fn cancel_animation_frame(&self, ident: u32) {
let mut list = self.animation_frame_list.borrow_mut();
- if let Some(mut pair) = list.iter_mut().find(|pair| pair.0 == ident) {
+ if let Some(pair) = list.iter_mut().find(|pair| pair.0 == ident) {
pair.1 = None;
}
}
@@ -2399,7 +2399,7 @@ impl Document {
if entry.snapshot.is_none() {
entry.snapshot = Some(Snapshot::new(el.html_element_in_html_document()));
}
- let mut snapshot = entry.snapshot.as_mut().unwrap();
+ let snapshot = entry.snapshot.as_mut().unwrap();
if snapshot.state.is_none() {
snapshot.state = Some(el.state());
}
@@ -2426,7 +2426,7 @@ impl Document {
entry.hint.insert(RESTYLE_SELF);
}
- let mut snapshot = entry.snapshot.as_mut().unwrap();
+ let snapshot = entry.snapshot.as_mut().unwrap();
if attr.local_name() == &local_name!("id") {
snapshot.id_changed = true;
} else if attr.local_name() == &local_name!("class") {
@@ -4028,7 +4028,7 @@ impl PendingInOrderScriptVec {
fn loaded(&self, element: &HTMLScriptElement, result: ScriptResult) {
let mut scripts = self.scripts.borrow_mut();
- let mut entry = scripts.iter_mut().find(|entry| &*entry.element == element).unwrap();
+ let entry = scripts.iter_mut().find(|entry| &*entry.element == element).unwrap();
entry.loaded(result);
}
diff --git servo/components/script/dom/medialist.rs servo/components/script/dom/medialist.rs
index 0064d0445095..ae20f5aa0422 100644
--- servo/components/script/dom/medialist.rs
+++ servo/components/script/dom/medialist.rs
@@ -63,7 +63,7 @@ impl MediaListMethods for MediaList {
// https://drafts.csswg.org/cssom/#dom-medialist-mediatext
fn SetMediaText(&self, value: DOMString) {
let mut guard = self.shared_lock().write();
- let mut media_queries = self.media_queries.write_with(&mut guard);
+ let media_queries = self.media_queries.write_with(&mut guard);
// Step 2
if value.is_empty() {
// Step 1
@@ -154,7 +154,7 @@ impl MediaListMethods for MediaList {
// Step 3
let m_serialized = m.unwrap().to_css_string();
let mut guard = self.shared_lock().write();
- let mut media_list = self.media_queries.write_with(&mut guard);
+ let media_list = self.media_queries.write_with(&mut guard);
let new_vec = media_list.media_queries.drain(..)
.filter(|q| m_serialized != q.to_css_string())
.collect();
diff --git servo/components/script/dom/range.rs servo/components/script/dom/range.rs
index fa849a0fc1a2..1e65caedc9dd 100644
--- servo/components/script/dom/range.rs
+++ servo/components/script/dom/range.rs
@@ -1049,7 +1049,7 @@ impl WeakRangeVec {
let offset = context.index();
let parent = context.parent;
unsafe {
- let mut ranges = &mut *self.cell.get();
+ let ranges = &mut *self.cell.get();
ranges.update(|entry| {
let range = entry.root().unwrap();
@@ -1076,7 +1076,7 @@ impl WeakRangeVec {
}
unsafe {
- let mut ranges = &mut *self.cell.get();
+ let ranges = &mut *self.cell.get();
ranges.update(|entry| {
let range = entry.root().unwrap();
diff --git servo/components/script/dom/servoparser/async_html.rs servo/components/script/dom/servoparser/async_html.rs
index 59411fda1c73..70d2008f49f6 100644
--- servo/components/script/dom/servoparser/async_html.rs
+++ servo/components/script/dom/servoparser/async_html.rs
@@ -568,7 +568,7 @@ impl TreeSink for Sink {
}
let node = self.new_parse_node();
{
- let mut data = self.get_parse_node_data_mut(&target.id);
+ let data = self.get_parse_node_data_mut(&target.id);
data.contents = Some(node.clone());
}
self.send_op(ParseOperation::GetTemplateContents { target: target.id, contents: node.id });
@@ -596,7 +596,7 @@ impl TreeSink for Sink {
let mut node = self.new_parse_node();
node.qual_name = Some(name.clone());
{
- let mut node_data = self.get_parse_node_data_mut(&node.id);
+ let node_data = self.get_parse_node_data_mut(&node.id);
node_data.is_integration_point = html_attrs.iter()
.any(|attr| {
let attr_value = &String::from(attr.value.clone());
diff --git servo/components/script/dom/url.rs servo/components/script/dom/url.rs
index a02a735638fc..41de4dcc0c72 100644
--- servo/components/script/dom/url.rs
+++ servo/components/script/dom/url.rs
@@ -96,8 +96,8 @@ impl URL {
// https://w3c.github.io/FileAPI/#dfn-createObjectURL
pub fn CreateObjectURL(global: &GlobalScope, blob: &Blob) -> DOMString {
- /// XXX: Second field is an unicode-serialized Origin, it is a temporary workaround
- /// and should not be trusted. See issue https://github.com/servo/servo/issues/11722
+ // XXX: Second field is an unicode-serialized Origin, it is a temporary workaround
+ // and should not be trusted. See issue https://github.com/servo/servo/issues/11722
let origin = get_blob_origin(&global.get_url());
let id = blob.get_blob_url_id();
diff --git servo/components/script/dom/vrdisplay.rs servo/components/script/dom/vrdisplay.rs
index 3f73a577fad7..54f06fb928f2 100644
--- servo/components/script/dom/vrdisplay.rs
+++ servo/components/script/dom/vrdisplay.rs
@@ -268,7 +268,7 @@ impl VRDisplayMethods for VRDisplay {
fn CancelAnimationFrame(&self, handle: u32) {
if self.presenting.get() {
let mut list = self.raf_callback_list.borrow_mut();
- if let Some(mut pair) = list.iter_mut().find(|pair| pair.0 == handle) {
+ if let Some(pair) = list.iter_mut().find(|pair| pair.0 == handle) {
pair.1 = None;
}
} else {
diff --git servo/components/script/dom/webglrenderingcontext.rs servo/components/script/dom/webglrenderingcontext.rs
index 73d4ddba1b90..62c92b42785c 100644
--- servo/components/script/dom/webglrenderingcontext.rs
+++ servo/components/script/dom/webglrenderingcontext.rs
@@ -2434,7 +2434,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
}
typedarray!(in(cx) let mut pixels_data: ArrayBufferView = pixels);
- let (array_type, mut data) = match { pixels_data.as_mut() } {
+ let (array_type, data) = match { pixels_data.as_mut() } {
Ok(data) => (data.get_array_type(), data.as_mut_slice()),
Err(_) => return Err(Error::Type("Not an ArrayBufferView".to_owned())),
};
diff --git servo/components/script/dom/xmlhttprequest.rs servo/components/script/dom/xmlhttprequest.rs
index 6ed2dda1851f..e6652d79d706 100644
--- servo/components/script/dom/xmlhttprequest.rs
+++ servo/components/script/dom/xmlhttprequest.rs
@@ -627,7 +627,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest {
if !content_type_set {
let ct = request.headers.get_mut::<ContentType>();
- if let Some(mut ct) = ct {
+ if let Some(ct) = ct {
if let Some(encoding) = encoding {
for param in &mut (ct.0).2 {
if param.0 == MimeAttr::Charset {
diff --git servo/components/script/lib.rs servo/components/script/lib.rs
index e1a1ab592cb7..5824d6f2e490 100644
--- servo/components/script/lib.rs
+++ servo/components/script/lib.rs
@@ -9,7 +9,6 @@
#![feature(mpsc_select)]
#![feature(nonzero)]
#![feature(on_unimplemented)]
-#![feature(option_entry)]
#![feature(plugin)]
#![feature(proc_macro)]
#![feature(stmt_expr_attributes)]
diff --git servo/components/script_plugins/unrooted_must_root.rs servo/components/script_plugins/unrooted_must_root.rs
index 5dbd2b1a3bdd..f3f5e60ab62a 100644
--- servo/components/script_plugins/unrooted_must_root.rs
+++ servo/components/script_plugins/unrooted_must_root.rs
@@ -182,7 +182,7 @@ impl<'a, 'b, 'tcx> visit::Visitor<'tcx> for FnDefVisitor<'a, 'b, 'tcx> {
}
match expr.node {
- /// Trait casts from #[must_root] types are not allowed
+ // Trait casts from #[must_root] types are not allowed
hir::ExprCast(ref subexpr, _) => require_rooted(cx, self.in_new_function, &*subexpr),
// This catches assignments... the main point of this would be to catch mutable
// references to `JS<T>`.
@@ -206,13 +206,21 @@ impl<'a, 'b, 'tcx> visit::Visitor<'tcx> for FnDefVisitor<'a, 'b, 'tcx> {
fn visit_pat(&mut self, pat: &'tcx hir::Pat) {
let cx = self.cx;
- if let hir::PatKind::Binding(hir::BindingMode::BindByValue(_), _, _, _) = pat.node {
- let ty = cx.tables.pat_ty(pat);
- if is_unrooted_ty(cx, ty, self.in_new_function) {
- cx.span_lint(UNROOTED_MUST_ROOT,
- pat.span,
- &format!("Expression of type {:?} must be rooted", ty))
+ // We want to detect pattern bindings that move a value onto the stack.
+ // When "default binding modes" https://github.com/rust-lang/rust/issues/42640
+ // are implemented, the `Unannotated` case could cause false-positives.
+ // These should be fixable by adding an explicit `ref`.
+ match pat.node {
+ hir::PatKind::Binding(hir::BindingAnnotation::Unannotated, _, _, _) |
+ hir::PatKind::Binding(hir::BindingAnnotation::Mutable, _, _, _) => {
+ let ty = cx.tables.pat_ty(pat);
+ if is_unrooted_ty(cx, ty, self.in_new_function) {
+ cx.span_lint(UNROOTED_MUST_ROOT,
+ pat.span,
+ &format!("Expression of type {:?} must be rooted", ty))
+ }
}
+ _ => {}
}
visit::walk_pat(self, pat);
diff --git servo/components/selectors/matching.rs servo/components/selectors/matching.rs
index 7bd9814d26fb..8f6b2fa6aa54 100644
--- servo/components/selectors/matching.rs
+++ servo/components/selectors/matching.rs
@@ -458,7 +458,7 @@ where
/// Matches a complex selector.
pub fn matches_complex_selector<E, F>(mut iter: SelectorIter<E::Impl>,
element: &E,
- mut context: &mut LocalMatchingContext<E::Impl>,
+ context: &mut LocalMatchingContext<E::Impl>,
flags_setter: &mut F)
-> bool
where E: Element,
diff --git servo/components/selectors/parser.rs servo/components/selectors/parser.rs
index 490399ce38ce..6b2c1f2b4e86 100644
--- servo/components/selectors/parser.rs
+++ servo/components/selectors/parser.rs
@@ -1464,7 +1464,7 @@ fn parse_negation<'i, 't, P, E, Impl>(parser: &P,
fn parse_compound_selector<'i, 't, P, E, Impl>(
parser: &P,
input: &mut CssParser<'i, 't>,
- mut builder: &mut SelectorBuilder<Impl>)
+ builder: &mut SelectorBuilder<Impl>)
-> Result<bool, ParseError<'i, SelectorParseError<'i, E>>>
where P: Parser<'i, Impl=Impl, Error=E>, Impl: SelectorImpl
{
diff --git servo/components/style/invalidation/element/invalidator.rs servo/components/style/invalidation/element/invalidator.rs
index 848c5cd13dc8..b8510ba3169b 100644
--- servo/components/style/invalidation/element/invalidator.rs
+++ servo/components/style/invalidation/element/invalidator.rs
@@ -154,7 +154,7 @@ impl<'a, 'b: 'a, E> TreeStyleInvalidator<'a, 'b, E>
trace!(" > visitedness change, force subtree restyle");
// We can't just return here because there may also be attribute
// changes as well that imply additional hints.
- let mut data = self.data.as_mut().unwrap();
+ let data = self.data.as_mut().unwrap();
data.restyle.hint.insert(RestyleHint::restyle_subtree());
}
diff --git servo/components/style/matching.rs servo/components/style/matching.rs
index b62bc54bf768..f58d7cd123e6 100644
--- servo/components/style/matching.rs
+++ servo/components/style/matching.rs
@@ -440,7 +440,7 @@ pub trait MatchMethods : TElement {
fn finish_restyle(
&self,
context: &mut StyleContext<Self>,
- mut data: &mut ElementData,
+ data: &mut ElementData,
mut new_styles: ElementStyles,
important_rules_changed: bool,
) -> ChildCascadeRequirement {
diff --git servo/components/style/properties/properties.mako.rs servo/components/style/properties/properties.mako.rs
index d98e173db5ba..81ff00fb6d5e 100644
--- servo/components/style/properties/properties.mako.rs
+++ servo/components/style/properties/properties.mako.rs
@@ -3364,7 +3364,7 @@ pub fn modify_border_style_for_inline_sides(style: &mut Arc<ComputedValues>,
return;
}
}
- let mut style = Arc::make_mut(style);
+ let style = Arc::make_mut(style);
let border = Arc::make_mut(&mut style.border);
match side {
PhysicalSide::Left => {
diff --git servo/components/style/style_adjuster.rs servo/components/style/style_adjuster.rs
index 366641ebe0bc..6e51fa74072a 100644
--- servo/components/style/style_adjuster.rs
+++ servo/components/style/style_adjuster.rs
@@ -269,7 +269,7 @@ impl<'a, 'b: 'a> StyleAdjuster<'a, 'b> {
if overflow_x != original_overflow_x ||
overflow_y != original_overflow_y {
- let mut box_style = self.style.mutate_box();
+ let box_style = self.style.mutate_box();
box_style.set_overflow_x(overflow_x);
box_style.set_overflow_y(overflow_y);
}
diff --git servo/components/style/style_resolver.rs servo/components/style/style_resolver.rs
index cf512c4fbdd2..3fc1d57cc8f7 100644
--- servo/components/style/style_resolver.rs
+++ servo/components/style/style_resolver.rs
@@ -247,7 +247,7 @@ where
Some(&*primary_style.style)
};
- for (i, mut inputs) in pseudo_array.iter_mut().enumerate() {
+ for (i, inputs) in pseudo_array.iter_mut().enumerate() {
if let Some(inputs) = inputs.take() {
let pseudo = PseudoElement::from_eager_index(i);
pseudo_styles.set(
diff --git servo/components/style/stylesheets/rule_list.rs servo/components/style/stylesheets/rule_list.rs
index 82e78015400d..14b3dc5e7696 100644
--- servo/components/style/stylesheets/rule_list.rs
+++ servo/components/style/stylesheets/rule_list.rs
@@ -150,7 +150,7 @@ impl CssRulesHelpers for RawOffsetArc<Locked<CssRules>> {
{
let mut write_guard = lock.write();
- let mut rules = self.write_with(&mut write_guard);
+ let rules = self.write_with(&mut write_guard);
// Step 5
// Computes the maximum allowed parser state at a given index.
let rev_state = rules.0.get(index).map_or(State::Body, CssRule::rule_state);
diff --git servo/components/style/stylesheets/rule_parser.rs servo/components/style/stylesheets/rule_parser.rs
index 007d7e11026e..f0d224e498a7 100644
--- servo/components/style/stylesheets/rule_parser.rs
+++ servo/components/style/stylesheets/rule_parser.rs
@@ -209,7 +209,7 @@ impl<'a, 'i> AtRuleParser<'i> for TopLevelRuleParser<'a> {
let id = register_namespace(&url)
.map_err(|()| StyleParseError::UnspecifiedError)?;
- let mut namespaces = self.namespaces.as_mut().unwrap();
+ let namespaces = self.namespaces.as_mut().unwrap();
let opt_prefix = if let Ok(prefix) = prefix_result {
let prefix = Prefix::from(prefix.as_ref());
diff --git servo/components/style/stylesheets/rules_iterator.rs servo/components/style/stylesheets/rules_iterator.rs
index 95a3ab8b3885..65e1b637ae52 100644
--- servo/components/style/stylesheets/rules_iterator.rs
+++ servo/components/style/stylesheets/rules_iterator.rs
@@ -70,7 +70,7 @@ impl<'a, 'b, C> Iterator for RulesIterator<'a, 'b, C>
let rule;
let sub_iter = {
- let mut nested_iter = self.stack.last_mut().unwrap();
+ let nested_iter = self.stack.last_mut().unwrap();
rule = match nested_iter.next() {
Some(r) => r,
None => {
diff --git servo/components/webdriver_server/lib.rs servo/components/webdriver_server/lib.rs
index bd2f667f9892..28a4885f0d41 100644
--- servo/components/webdriver_server/lib.rs
+++ servo/components/webdriver_server/lib.rs
@@ -702,7 +702,7 @@ impl Handler {
fn handle_set_timeouts(&mut self,
parameters: &TimeoutsParameters)
-> WebDriverResult<WebDriverResponse> {
- let mut session = self.session
+ let session = self.session
.as_mut()
.ok_or(WebDriverError::new(ErrorStatus::SessionNotCreated, ""))?;
diff --git servo/rust-commit-hash servo/rust-commit-hash
index d4f08fe97644..a08d23cd1a71 100644
--- servo/rust-commit-hash
+++ servo/rust-commit-hash
@@ -1 +1 @@
-599be0d18f4c6ddf36366d2a5a2ca6dc65886896
+13d94d5fa8129a34f5c77a1bcd76983f5aed2434
diff --git servo/tests/unit/style/stylist.rs servo/tests/unit/style/stylist.rs
index da9a9478957a..52067b501788 100644
--- servo/tests/unit/style/stylist.rs
+++ servo/tests/unit/style/stylist.rs
@@ -51,19 +51,6 @@ fn get_mock_rules(css_selectors: &[&str]) -> (Vec<Vec<Rule>>, SharedRwLock) {
}).collect(), shared_lock)
}
-fn get_mock_map(selectors: &[&str]) -> (SelectorMap<Rule>, SharedRwLock) {
- let mut map = SelectorMap::<Rule>::new();
- let (selector_rules, shared_lock) = get_mock_rules(selectors);
-
- for rules in selector_rules.into_iter() {
- for rule in rules.into_iter() {
- map.insert(rule, QuirksMode::NoQuirks)
- }
- }
-
- (map, shared_lock)
-}
-
fn parse_selectors(selectors: &[&str]) -> Vec<Selector<SelectorImpl>> {
selectors.iter()
.map(|x| SelectorParser::parse_author_origin_no_namespace(x).unwrap().0

View File

@ -1,232 +0,0 @@
commit f0acf27d189d
Author: Simon Sapin <simon.sapin@exyr.org>
Date: Thu Aug 17 11:05:32 2017 -0500
servo: Merge #18126 - geckolib: Fix some warnings (treated as error) new in Rust Nigthly (from servo:glow-fox); r=emilio
Source-Repo: https://github.com/servo/servo
Source-Revision: cc86ca2bcdec5e89ee5279085ea38db63ef41af9
--HG--
extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear
extra : subtree_revision : 0586dbc81f1411c89821605a6dae4ebd0af8f0d5
---
servo/components/style/gecko/conversions.rs | 2 +-
servo/components/style/gecko/wrapper.rs | 2 +-
.../style/gecko_bindings/sugar/ns_t_array.rs | 4 ++--
servo/components/style/properties/gecko.mako.rs | 18 +++++++++---------
servo/components/style/style_adjuster.rs | 4 ++--
servo/ports/geckolib/glue.rs | 12 ++++++------
6 files changed, 21 insertions(+), 21 deletions(-)
diff --git servo/components/style/gecko/conversions.rs servo/components/style/gecko/conversions.rs
index 8f3fb6bf2d0f..51015997c5c1 100644
--- servo/components/style/gecko/conversions.rs
+++ servo/components/style/gecko/conversions.rs
@@ -348,7 +348,7 @@ impl nsStyleImage {
// NB: stops are guaranteed to be none in the gecko side by
// default.
- let mut gecko_stop = unsafe {
+ let gecko_stop = unsafe {
&mut (*gecko_gradient).mStops[index]
};
let mut coord = nsStyleCoord::null();
diff --git servo/components/style/gecko/wrapper.rs servo/components/style/gecko/wrapper.rs
index 034dd94590e2..c402ddaf15bd 100644
--- servo/components/style/gecko/wrapper.rs
+++ servo/components/style/gecko/wrapper.rs
@@ -424,7 +424,7 @@ impl<'lb> GeckoXBLBinding<'lb> {
}
}
- fn each_xbl_stylist<F>(self, mut f: &mut F)
+ fn each_xbl_stylist<F>(self, f: &mut F)
where
F: FnMut(&Stylist),
{
diff --git servo/components/style/gecko_bindings/sugar/ns_t_array.rs servo/components/style/gecko_bindings/sugar/ns_t_array.rs
index 6bc389702f54..068e10ddea1b 100644
--- servo/components/style/gecko_bindings/sugar/ns_t_array.rs
+++ servo/components/style/gecko_bindings/sugar/ns_t_array.rs
@@ -90,7 +90,7 @@ impl<T> nsTArray<T> {
// this can leak
debug_assert!(len >= self.len() as u32);
self.ensure_capacity(len as usize);
- let mut header = self.header_mut();
+ let header = self.header_mut();
header.mLength = len;
}
@@ -99,7 +99,7 @@ impl<T> nsTArray<T> {
/// This will not leak since it only works on POD types (and thus doesn't assert)
pub unsafe fn set_len_pod(&mut self, len: u32) where T: Copy {
self.ensure_capacity(len as usize);
- let mut header = unsafe { self.header_mut() };
+ let header = unsafe { self.header_mut() };
header.mLength = len;
}
}
diff --git servo/components/style/properties/gecko.mako.rs servo/components/style/properties/gecko.mako.rs
index 9a2ab2135fc5..bc41ef139af5 100644
--- servo/components/style/properties/gecko.mako.rs
+++ servo/components/style/properties/gecko.mako.rs
@@ -4136,14 +4136,14 @@ fn static_assert() {
fn init_shadow(filter: &mut nsStyleFilter) -> &mut nsCSSShadowArray {
unsafe {
let ref mut union = filter.__bindgen_anon_1;
- let mut shadow_array: &mut *mut nsCSSShadowArray = union.mDropShadow.as_mut();
+ let shadow_array: &mut *mut nsCSSShadowArray = union.mDropShadow.as_mut();
*shadow_array = Gecko_NewCSSShadowArray(1);
&mut **shadow_array
}
}
- let mut gecko_shadow = init_shadow(gecko_filter);
+ let gecko_shadow = init_shadow(gecko_filter);
gecko_shadow.mArray[0].set_from_simple_shadow(shadow);
},
Url(ref url) => {
@@ -4665,14 +4665,14 @@ fn static_assert() {
unsafe {
// We have to be very careful to avoid a copy here!
let ref mut union = ${ident}.__bindgen_anon_1;
- let mut shape: &mut *mut StyleBasicShape = union.mBasicShape.as_mut();
+ let shape: &mut *mut StyleBasicShape = union.mBasicShape.as_mut();
*shape = Gecko_NewBasicShape(ty);
&mut **shape
}
}
match servo_shape {
BasicShape::Inset(inset) => {
- let mut shape = init_shape(${ident}, StyleBasicShapeType::Inset);
+ let shape = init_shape(${ident}, StyleBasicShapeType::Inset);
unsafe { shape.mCoordinates.set_len(4) };
// set_len() can't call constructors, so the coordinates
@@ -4694,7 +4694,7 @@ fn static_assert() {
set_corners_from_radius(inset.round, &mut shape.mRadius);
}
BasicShape::Circle(circ) => {
- let mut shape = init_shape(${ident}, StyleBasicShapeType::Circle);
+ let shape = init_shape(${ident}, StyleBasicShapeType::Circle);
unsafe { shape.mCoordinates.set_len(1) };
shape.mCoordinates[0].leaky_set_null();
circ.radius.to_gecko_style_coord(&mut shape.mCoordinates[0]);
@@ -4702,7 +4702,7 @@ fn static_assert() {
shape.mPosition = circ.position.into();
}
BasicShape::Ellipse(el) => {
- let mut shape = init_shape(${ident}, StyleBasicShapeType::Ellipse);
+ let shape = init_shape(${ident}, StyleBasicShapeType::Ellipse);
unsafe { shape.mCoordinates.set_len(2) };
shape.mCoordinates[0].leaky_set_null();
el.semiaxis_x.to_gecko_style_coord(&mut shape.mCoordinates[0]);
@@ -4712,7 +4712,7 @@ fn static_assert() {
shape.mPosition = el.position.into();
}
BasicShape::Polygon(poly) => {
- let mut shape = init_shape(${ident}, StyleBasicShapeType::Polygon);
+ let shape = init_shape(${ident}, StyleBasicShapeType::Polygon);
unsafe {
shape.mCoordinates.set_len(poly.coordinates.len() as u32 * 2);
}
@@ -4797,7 +4797,7 @@ clip-path
bindings::Gecko_nsStyleSVG_SetDashArrayLength(&mut self.gecko, v.len() as u32);
}
- for (mut gecko, servo) in self.gecko.mStrokeDasharray.iter_mut().zip(v) {
+ for (gecko, servo) in self.gecko.mStrokeDasharray.iter_mut().zip(v) {
match servo {
Either::First(number) => gecko.set_value(CoordDataValue::Factor(number)),
Either::Second(lop) => gecko.set(lop),
@@ -4885,7 +4885,7 @@ clip-path
}
self.gecko.mContextPropsBits = 0;
- for (mut gecko, servo) in self.gecko.mContextProps.iter_mut().zip(v) {
+ for (gecko, servo) in self.gecko.mContextProps.iter_mut().zip(v) {
if servo.0 == atom!("fill") {
self.gecko.mContextPropsBits |= structs::NS_STYLE_CONTEXT_PROPERTY_FILL as u8;
} else if servo.0 == atom!("stroke") {
diff --git servo/components/style/style_adjuster.rs servo/components/style/style_adjuster.rs
index 03b15916b237..366641ebe0bc 100644
--- servo/components/style/style_adjuster.rs
+++ servo/components/style/style_adjuster.rs
@@ -167,7 +167,7 @@ impl<'a, 'b: 'a> StyleAdjuster<'a, 'b> {
// When 'contain: paint', update overflow from 'visible' to 'clip'.
if self.style.get_box().clone_contain().contains(contain::PAINT) {
if self.style.get_box().clone_overflow_x() == overflow::visible {
- let mut box_style = self.style.mutate_box();
+ let box_style = self.style.mutate_box();
box_style.set_overflow_x(overflow::_moz_hidden_unscrollable);
box_style.set_overflow_y(overflow::_moz_hidden_unscrollable);
}
@@ -182,7 +182,7 @@ impl<'a, 'b: 'a> StyleAdjuster<'a, 'b> {
use properties::longhands::font_style::computed_value::T as font_style;
use properties::longhands::font_weight::computed_value::T as font_weight;
if self.style.get_font().clone__moz_math_variant() != moz_math_variant::none {
- let mut font_style = self.style.mutate_font();
+ let font_style = self.style.mutate_font();
// Sadly we don't have a nice name for the computed value
// of "font-weight: normal".
font_style.set_font_weight(font_weight::normal());
diff --git servo/ports/geckolib/glue.rs servo/ports/geckolib/glue.rs
index 977728286fc3..fa09bee29553 100644
--- servo/ports/geckolib/glue.rs
+++ servo/ports/geckolib/glue.rs
@@ -815,7 +815,7 @@ pub extern "C" fn Servo_StyleSet_AppendStyleSheet(
) {
let global_style_data = &*GLOBAL_STYLE_DATA;
let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut();
- let mut data = &mut *data;
+ let data = &mut *data;
let guard = global_style_data.shared_lock.read();
data.stylesheets.append_stylesheet(
&data.stylist,
@@ -867,7 +867,7 @@ pub extern "C" fn Servo_StyleSet_PrependStyleSheet(
) {
let global_style_data = &*GLOBAL_STYLE_DATA;
let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut();
- let mut data = &mut *data;
+ let data = &mut *data;
let guard = global_style_data.shared_lock.read();
data.stylesheets.prepend_stylesheet(
&data.stylist,
@@ -885,7 +885,7 @@ pub extern "C" fn Servo_StyleSet_InsertStyleSheetBefore(
) {
let global_style_data = &*GLOBAL_STYLE_DATA;
let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut();
- let mut data = &mut *data;
+ let data = &mut *data;
let guard = global_style_data.shared_lock.read();
data.stylesheets.insert_stylesheet_before(
&data.stylist,
@@ -903,7 +903,7 @@ pub extern "C" fn Servo_StyleSet_RemoveStyleSheet(
) {
let global_style_data = &*GLOBAL_STYLE_DATA;
let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut();
- let mut data = &mut *data;
+ let data = &mut *data;
let guard = global_style_data.shared_lock.read();
data.stylesheets.remove_stylesheet(
&data.stylist,
@@ -1274,7 +1274,7 @@ pub extern "C" fn Servo_StyleRule_GetSpecificityAtIndex(
specificity: *mut u64
) {
read_locked_arc(rule, |rule: &StyleRule| {
- let mut specificity = unsafe { specificity.as_mut().unwrap() };
+ let specificity = unsafe { specificity.as_mut().unwrap() };
let index = index as usize;
if index >= rule.selectors.0.len() {
*specificity = 0;
@@ -2775,7 +2775,7 @@ pub extern "C" fn Servo_NoteExplicitHints(element: RawGeckoElementBorrowed,
pub extern "C" fn Servo_TakeChangeHint(element: RawGeckoElementBorrowed,
was_restyled: *mut bool) -> nsChangeHint
{
- let mut was_restyled = unsafe { was_restyled.as_mut().unwrap() };
+ let was_restyled = unsafe { was_restyled.as_mut().unwrap() };
let element = GeckoElement(element);
let damage = match element.mutate_data() {