aboutsummaryrefslogtreecommitdiff
path: root/www
diff options
context:
space:
mode:
authorBeat Gaetzi <beat@FreeBSD.org>2014-03-19 20:46:37 +0000
committerBeat Gaetzi <beat@FreeBSD.org>2014-03-19 20:46:37 +0000
commitc80e090095217ca31b70c2e08b6ce4f9e9c17aa3 (patch)
tree8328d62bf6a7445a78ee750e6a14a1c78a2b33ac /www
parentca3e7bd8cf90e3783db9c9964132ac0105144579 (diff)
downloadports-c80e090095217ca31b70c2e08b6ce4f9e9c17aa3.tar.gz
ports-c80e090095217ca31b70c2e08b6ce4f9e9c17aa3.zip
Notes
Diffstat (limited to 'www')
-rw-r--r--www/firefox-esr-i18n/Makefile2
-rw-r--r--www/firefox-esr-i18n/distinfo356
-rw-r--r--www/firefox-esr/Makefile7
-rw-r--r--www/firefox-esr/distinfo4
-rw-r--r--www/firefox-esr/files/patch-bug89339777
-rw-r--r--www/firefox-esr/files/patch-bug94894638
-rw-r--r--www/firefox-esr/files/patch-bug961264266
-rw-r--r--www/firefox-esr/files/patch-bug96181648
-rw-r--r--www/firefox-esr/files/patch-bug96234518
-rw-r--r--www/firefox-esr/files/patch-bug97563463
-rw-r--r--www/firefox-esr/files/patch-bug97745727
-rw-r--r--www/firefox-esr/files/patch-clang32-libc++-visibility-hack38
-rw-r--r--www/firefox-esr/files/patch-clang34-disable-stdcall13
-rw-r--r--www/firefox-esr/files/patch-memory-jemalloc-Makefile.in10
-rw-r--r--www/firefox-esr/files/patch-z-bug847568234
-rw-r--r--www/firefox-esr/files/patch-zz-bug517422324
-rw-r--r--www/firefox-esr/pkg-message13
-rw-r--r--www/firefox-i18n/Makefile5
-rw-r--r--www/firefox-i18n/distinfo340
-rw-r--r--www/firefox/Makefile29
-rw-r--r--www/firefox/Makefile.options6
-rw-r--r--www/firefox/distinfo4
-rw-r--r--www/firefox/files/patch-bug8069171996
-rw-r--r--www/firefox/files/patch-bug81071668
-rw-r--r--www/firefox/files/patch-bug82698520
-rw-r--r--www/firefox/files/patch-bug847568188
-rw-r--r--www/firefox/files/patch-bug89339779
-rw-r--r--www/firefox/files/patch-bug945046160
-rw-r--r--www/firefox/files/patch-bug94656062
-rw-r--r--www/firefox/files/patch-bug94894657
-rw-r--r--www/firefox/files/patch-bug961264266
-rw-r--r--www/firefox/files/patch-bug96181648
-rw-r--r--www/firefox/files/patch-bug96234518
-rw-r--r--www/firefox/files/patch-bug97374438
-rw-r--r--www/firefox/files/patch-bug97563463
-rw-r--r--www/firefox/files/patch-bug97745727
-rw-r--r--www/firefox/files/patch-clang32-libc++-visibility-hack38
-rw-r--r--www/firefox/files/patch-clang34-disable-stdcall13
-rw-r--r--www/firefox/files/patch-js-src-Makefile.in11
-rw-r--r--www/firefox/files/patch-memory-jemalloc-Makefile.in10
-rw-r--r--www/firefox/files/patch-toolkit_xre_Makefile.in8
-rw-r--r--www/firefox/files/patch-z-bug517422263
-rw-r--r--www/firefox/pkg-message14
-rw-r--r--www/libxul/Makefile4
-rw-r--r--www/libxul/files/patch-bug89339731
-rw-r--r--www/libxul/files/patch-bug961264266
-rw-r--r--www/libxul/files/patch-bug97563463
-rw-r--r--www/libxul/files/patch-bug97745727
-rw-r--r--www/libxul/files/patch-clang32-libc++-visibility-hack38
-rw-r--r--www/libxul/files/patch-clang34-disable-stdcall13
-rw-r--r--www/libxul/files/patch-memory-jemalloc-Makefile.in10
-rw-r--r--www/libxul/files/patch-z-bug847568234
-rw-r--r--www/libxul/files/patch-zz-bug517422324
-rw-r--r--www/linux-firefox/Makefile2
-rw-r--r--www/linux-firefox/distinfo4
55 files changed, 5465 insertions, 920 deletions
diff --git a/www/firefox-esr-i18n/Makefile b/www/firefox-esr-i18n/Makefile
index f26a0138ce78..5091021d07ec 100644
--- a/www/firefox-esr-i18n/Makefile
+++ b/www/firefox-esr-i18n/Makefile
@@ -2,7 +2,7 @@
# $FreeBSD$
PORTNAME= firefox
-PORTVERSION= 24.3.0
+PORTVERSION= 24.4.0
CATEGORIES= www
MASTER_SITES= MOZILLA/${PORTNAME:S|-i18n||}/releases/${PORTVERSION}esr/linux-i686/xpi
PKGNAMEPREFIX=
diff --git a/www/firefox-esr-i18n/distinfo b/www/firefox-esr-i18n/distinfo
index 74870c97203b..1db0b44c51b8 100644
--- a/www/firefox-esr-i18n/distinfo
+++ b/www/firefox-esr-i18n/distinfo
@@ -1,178 +1,178 @@
-SHA256 (xpi/firefox-24.3.0/ach.xpi) = 64db970baf85866646db1a35d3f3d85c0eaceecf65b5cddaff162c385a813afc
-SIZE (xpi/firefox-24.3.0/ach.xpi) = 339946
-SHA256 (xpi/firefox-24.3.0/af.xpi) = 5310ce2c92cb13ac6ed8707a439b08fddc6754764396c9102bf91a8fc0891224
-SIZE (xpi/firefox-24.3.0/af.xpi) = 333184
-SHA256 (xpi/firefox-24.3.0/ak.xpi) = 1f7c3fd82de81cb93a02e95bee0ed7b221949ebdc22c6a115cc7e462c49a7d33
-SIZE (xpi/firefox-24.3.0/ak.xpi) = 340940
-SHA256 (xpi/firefox-24.3.0/ar.xpi) = 37c209381586dd990af122aa0bce4078e4b3bfb890dc70cc11e58ca406cdc00b
-SIZE (xpi/firefox-24.3.0/ar.xpi) = 360849
-SHA256 (xpi/firefox-24.3.0/as.xpi) = d9d7a7293c244e26fde86782a1e904c192eee5f2948aa48cbd7945195a6b7ee4
-SIZE (xpi/firefox-24.3.0/as.xpi) = 378085
-SHA256 (xpi/firefox-24.3.0/ast.xpi) = 18151b4031cd3e4258599a28130a8cd4bc5fd53b5ce28796a3f67574e6723cde
-SIZE (xpi/firefox-24.3.0/ast.xpi) = 292876
-SHA256 (xpi/firefox-24.3.0/be.xpi) = ed0ec004846d7bcc0a25723af5e622e93555234f50bef68e89b4872078076332
-SIZE (xpi/firefox-24.3.0/be.xpi) = 316955
-SHA256 (xpi/firefox-24.3.0/bg.xpi) = 03adc8500253efebef556b1211c95a280ed8de44f122e720dde4b7422bc9bfaf
-SIZE (xpi/firefox-24.3.0/bg.xpi) = 373136
-SHA256 (xpi/firefox-24.3.0/bn-BD.xpi) = 9ca3f119365a58b13c5df152c39f7efac8cd6bdbb0d1e9994a97821bb38dbc34
-SIZE (xpi/firefox-24.3.0/bn-BD.xpi) = 394939
-SHA256 (xpi/firefox-24.3.0/bn-IN.xpi) = c81b13f48c484fffd7b903220c4d3cad10a6a5e64b54c496185026805523b302
-SIZE (xpi/firefox-24.3.0/bn-IN.xpi) = 427780
-SHA256 (xpi/firefox-24.3.0/br.xpi) = 009e89ef2cadf0c8ba7159fe8b38762577cef02376f3218023bd5363074b073b
-SIZE (xpi/firefox-24.3.0/br.xpi) = 330509
-SHA256 (xpi/firefox-24.3.0/bs.xpi) = 1fc58ef8fb50fc1696528f300b6bdaf60e4e953eb26bb89f85724577cdb29a9d
-SIZE (xpi/firefox-24.3.0/bs.xpi) = 341620
-SHA256 (xpi/firefox-24.3.0/ca.xpi) = e10a2e2ca7472ddde2b9bffc3148a903ce0fd32e52c905ac3b6063cdb5106490
-SIZE (xpi/firefox-24.3.0/ca.xpi) = 341257
-SHA256 (xpi/firefox-24.3.0/cs.xpi) = ec730bdd950255a9e3f87ef26fb61e7f19a9538fc71a2248ce0a0c99f1a50ea5
-SIZE (xpi/firefox-24.3.0/cs.xpi) = 335946
-SHA256 (xpi/firefox-24.3.0/csb.xpi) = c6644a81cb7f7a25dc09fd5a3e034b581a5777885ed9b2a985e7c51b8e1b9441
-SIZE (xpi/firefox-24.3.0/csb.xpi) = 329796
-SHA256 (xpi/firefox-24.3.0/cy.xpi) = bdcbdb768b90ac53ab710c7b364d0f67ed7f16dfdf853cedcaf8b18b23f97144
-SIZE (xpi/firefox-24.3.0/cy.xpi) = 330643
-SHA256 (xpi/firefox-24.3.0/da.xpi) = ccb76d66985244b8fc54e767d2d879bca1dac45135999ebe898458e19f7bc438
-SIZE (xpi/firefox-24.3.0/da.xpi) = 326881
-SHA256 (xpi/firefox-24.3.0/de.xpi) = a7cc6bbcb6b0c5133153c465b496cf25101dd57cec1276bcab9ce172e1766497
-SIZE (xpi/firefox-24.3.0/de.xpi) = 323258
-SHA256 (xpi/firefox-24.3.0/el.xpi) = c0c45300b7c72f8747d534cf9c8936d59829d30f6908de75b4834799f9ad27d9
-SIZE (xpi/firefox-24.3.0/el.xpi) = 365320
-SHA256 (xpi/firefox-24.3.0/en-GB.xpi) = e4b01fde8cf4e81b3e72c08f60ba0d2ecab6545f3eb067c39fc5a00759701948
-SIZE (xpi/firefox-24.3.0/en-GB.xpi) = 318297
-SHA256 (xpi/firefox-24.3.0/en-US.xpi) = be2c886712d2238140b3c1ddc70850a4879ed370d0eba8c424a19cb7169ac6ac
-SIZE (xpi/firefox-24.3.0/en-US.xpi) = 320993
-SHA256 (xpi/firefox-24.3.0/en-ZA.xpi) = bd68df76bf8f55bc591a0c2a44ffcb400a62a4d7325e0bd69d822d456048807b
-SIZE (xpi/firefox-24.3.0/en-ZA.xpi) = 319321
-SHA256 (xpi/firefox-24.3.0/eo.xpi) = 15da1d8a721cd80784b861c3eee5f0243c98477ef33fb3e08fccd3b392c75bc7
-SIZE (xpi/firefox-24.3.0/eo.xpi) = 334939
-SHA256 (xpi/firefox-24.3.0/es-AR.xpi) = a4bdb350385ac279a7bef73b0d4aa70eabd21f57e669fd59780faa2a3995b7a9
-SIZE (xpi/firefox-24.3.0/es-AR.xpi) = 334010
-SHA256 (xpi/firefox-24.3.0/es-CL.xpi) = 9977f0f505c3bb5b97f13172f5e67598396c7f3eed15d662034c6b0cbbb5e027
-SIZE (xpi/firefox-24.3.0/es-CL.xpi) = 287026
-SHA256 (xpi/firefox-24.3.0/es-ES.xpi) = b53f8f724ba9588ecd273ff1b49476eeea0eff1747fde8cdefa2147951284b7c
-SIZE (xpi/firefox-24.3.0/es-ES.xpi) = 277859
-SHA256 (xpi/firefox-24.3.0/es-MX.xpi) = 2ee049e7cc5eb0893909c568269321f0f633bae8fadf81d496a029fee62337f3
-SIZE (xpi/firefox-24.3.0/es-MX.xpi) = 302624
-SHA256 (xpi/firefox-24.3.0/et.xpi) = 582efe5cbd9e3baf6eb7b2ae0d36bcdbe06ea076ae037f3d753218cfbe7a5fab
-SIZE (xpi/firefox-24.3.0/et.xpi) = 327697
-SHA256 (xpi/firefox-24.3.0/eu.xpi) = eed1c1b6ac88fe0f3a9e972bc5dfd0b27a3843f76bc307db0616edaad5601493
-SIZE (xpi/firefox-24.3.0/eu.xpi) = 332422
-SHA256 (xpi/firefox-24.3.0/fa.xpi) = c3b5d64a285febabd7f652c3e3be8876c1786d72307a81474f1ae9d39aeb8f53
-SIZE (xpi/firefox-24.3.0/fa.xpi) = 375633
-SHA256 (xpi/firefox-24.3.0/ff.xpi) = 53ee38d8b810bdeaa6fd34495ca5fc411b265145dab8416cd8b707d546761bf4
-SIZE (xpi/firefox-24.3.0/ff.xpi) = 332815
-SHA256 (xpi/firefox-24.3.0/fi.xpi) = b1a0a85b635e889e94d7a67bb5141264c68949f80b18413a84c58979fe6f5828
-SIZE (xpi/firefox-24.3.0/fi.xpi) = 328891
-SHA256 (xpi/firefox-24.3.0/fr.xpi) = e88b5111b955a21e87dbd36d239737267b5fc266c67bd9f07dd79a24e22a9ec1
-SIZE (xpi/firefox-24.3.0/fr.xpi) = 339178
-SHA256 (xpi/firefox-24.3.0/fy-NL.xpi) = 89c3eb9e5836382f993f79f68de82a4b5d69bdbc2f5a25e8712739bf21d49745
-SIZE (xpi/firefox-24.3.0/fy-NL.xpi) = 336589
-SHA256 (xpi/firefox-24.3.0/ga-IE.xpi) = 7cb572bcb3038bb8f76a12e8cc4d0fde472f5fd3d9727febe70c8b137f4731c4
-SIZE (xpi/firefox-24.3.0/ga-IE.xpi) = 345294
-SHA256 (xpi/firefox-24.3.0/gd.xpi) = f2a6906bfad69b5b9c5fd6131b51e277b4a23ce42bdf01de998f289aca0f2002
-SIZE (xpi/firefox-24.3.0/gd.xpi) = 344811
-SHA256 (xpi/firefox-24.3.0/gl.xpi) = 3798be53b39c26af1a1aa5aa3ed4fd74064672292acb96ca1942983392baaec4
-SIZE (xpi/firefox-24.3.0/gl.xpi) = 336919
-SHA256 (xpi/firefox-24.3.0/gu-IN.xpi) = eb5c7e71a5c7c3e721b0265e3efc7be82ddc90d8331894b2283e4e46baa52abb
-SIZE (xpi/firefox-24.3.0/gu-IN.xpi) = 359359
-SHA256 (xpi/firefox-24.3.0/he.xpi) = 65b99f67980b849c5902c815b51c409af1f264d027a7f6734721744a20401642
-SIZE (xpi/firefox-24.3.0/he.xpi) = 354630
-SHA256 (xpi/firefox-24.3.0/hi-IN.xpi) = 73f26db3abaf843d7e33cfa1ca1a4f844d724d4b537ccf89e499be36feb56c64
-SIZE (xpi/firefox-24.3.0/hi-IN.xpi) = 379120
-SHA256 (xpi/firefox-24.3.0/hr.xpi) = abff490082357310a616a40fe9fed8265f73389b8f51f8641b186e1ffac28ddd
-SIZE (xpi/firefox-24.3.0/hr.xpi) = 336840
-SHA256 (xpi/firefox-24.3.0/hu.xpi) = e28505669fa0d90742b64baaafed57d479e2c2ff301e28ec4afafc405d1dbe97
-SIZE (xpi/firefox-24.3.0/hu.xpi) = 344103
-SHA256 (xpi/firefox-24.3.0/hy-AM.xpi) = 8ec470d3e4b43fe13643818a066ceee8329b28bfb8c1256c4cf7cc47b117267f
-SIZE (xpi/firefox-24.3.0/hy-AM.xpi) = 385180
-SHA256 (xpi/firefox-24.3.0/id.xpi) = 5653546db2e5e2af5314b4dff59ad6ec04a25572e5b025b03a783da1fe9b0a64
-SIZE (xpi/firefox-24.3.0/id.xpi) = 319795
-SHA256 (xpi/firefox-24.3.0/is.xpi) = 1e6e216855372e6add82bd7c3c86c77139a4deedd7a6e15039374a329e96904a
-SIZE (xpi/firefox-24.3.0/is.xpi) = 331826
-SHA256 (xpi/firefox-24.3.0/it.xpi) = a970a4113eb0d76f7040eb4a4fbe1a912a7214a693c5e669d330766f964cfe19
-SIZE (xpi/firefox-24.3.0/it.xpi) = 271925
-SHA256 (xpi/firefox-24.3.0/ja.xpi) = d34674787df5536da3eeee7b1216b8418f348d54ea137075af32e73c128e4c37
-SIZE (xpi/firefox-24.3.0/ja.xpi) = 370903
-SHA256 (xpi/firefox-24.3.0/kk.xpi) = 2e50ba73b8f31ab0a42e0e82a1ccfe136577c3c0d18b140e2c207ba322a0a25c
-SIZE (xpi/firefox-24.3.0/kk.xpi) = 377502
-SHA256 (xpi/firefox-24.3.0/km.xpi) = 9a556c837c626ab09fd4a764a3fcce7f8d22ef46075b8645153e611c8d526327
-SIZE (xpi/firefox-24.3.0/km.xpi) = 400559
-SHA256 (xpi/firefox-24.3.0/kn.xpi) = 66e60088b6b57bbe048d30c82d34e723220bd4aa59514d8548604c333f9b9f1f
-SIZE (xpi/firefox-24.3.0/kn.xpi) = 391033
-SHA256 (xpi/firefox-24.3.0/ko.xpi) = 3a985523d9ab50087ef3ccc9897b9ff32f04ca1a8e94735cb9c5f69c20fbc5ec
-SIZE (xpi/firefox-24.3.0/ko.xpi) = 346164
-SHA256 (xpi/firefox-24.3.0/ku.xpi) = 748d3f91a1df0d70541acbcb5563d767179d6c12e8fe357df6e9c871f7336a4e
-SIZE (xpi/firefox-24.3.0/ku.xpi) = 355630
-SHA256 (xpi/firefox-24.3.0/lg.xpi) = 626647ad35191bb67bb79ae6493a57980ac0aca09f1fa022ec763150d699a4b0
-SIZE (xpi/firefox-24.3.0/lg.xpi) = 351111
-SHA256 (xpi/firefox-24.3.0/lij.xpi) = b2134c2dba17807e813e917d3ba53251dded71054c703838a5729cb423ec46ef
-SIZE (xpi/firefox-24.3.0/lij.xpi) = 322700
-SHA256 (xpi/firefox-24.3.0/lt.xpi) = 5ee892d76d8089aeecf090af4e5750af7a34e5d982025e9140a1cf59255eb434
-SIZE (xpi/firefox-24.3.0/lt.xpi) = 352045
-SHA256 (xpi/firefox-24.3.0/lv.xpi) = 0e3593566ea3115b5bda3ec6703905727b2ee2376e6c84318a7e60081e85a95f
-SIZE (xpi/firefox-24.3.0/lv.xpi) = 328664
-SHA256 (xpi/firefox-24.3.0/mai.xpi) = 1fe31a7ebb6e565c14ea846ed5ac460add111011a7ed0a0f14bead107a6354c0
-SIZE (xpi/firefox-24.3.0/mai.xpi) = 379767
-SHA256 (xpi/firefox-24.3.0/mk.xpi) = 09e7c0cf2cb33d4a8ca00c7aa5ce0accd78ad85a28ca95100b7aa117524a16b2
-SIZE (xpi/firefox-24.3.0/mk.xpi) = 376316
-SHA256 (xpi/firefox-24.3.0/ml.xpi) = f110a91f63a1114bf18b070a8c60f04e5bcfbdd4de2d7903747b696c863f3e69
-SIZE (xpi/firefox-24.3.0/ml.xpi) = 399677
-SHA256 (xpi/firefox-24.3.0/mr.xpi) = 36fa29872a13ad74f26a675d12d6566feb1d0fa53f384042b8c3cff6e67dc261
-SIZE (xpi/firefox-24.3.0/mr.xpi) = 380231
-SHA256 (xpi/firefox-24.3.0/nb-NO.xpi) = 6858d949388445c42ecb6af705a419e4a43a118dcfbfec62531fbe1f574883c2
-SIZE (xpi/firefox-24.3.0/nb-NO.xpi) = 330966
-SHA256 (xpi/firefox-24.3.0/nl.xpi) = f6a32e34920edd06e7382e190b69c44cb22fcdad08e53c76e0298563a4b7d8d4
-SIZE (xpi/firefox-24.3.0/nl.xpi) = 331404
-SHA256 (xpi/firefox-24.3.0/nn-NO.xpi) = 954621914f1ecb621f5c0a556f22b81f52afb473e9663f9af84d92daa783c1a4
-SIZE (xpi/firefox-24.3.0/nn-NO.xpi) = 333906
-SHA256 (xpi/firefox-24.3.0/nso.xpi) = c3b0d3faa14cfb72954a81421b8093c5994b0f0d9265db07f1b0978c4e5bed77
-SIZE (xpi/firefox-24.3.0/nso.xpi) = 336297
-SHA256 (xpi/firefox-24.3.0/or.xpi) = efd3ab4fd7e8b54a70e79e520b4e8583a87c4da5c41fd05a25d4544fa7c2f7f0
-SIZE (xpi/firefox-24.3.0/or.xpi) = 364592
-SHA256 (xpi/firefox-24.3.0/pa-IN.xpi) = 06ef38a33c8881c57b12caf6d629a8752120115fd46181366ae274fb828f1a4f
-SIZE (xpi/firefox-24.3.0/pa-IN.xpi) = 365653
-SHA256 (xpi/firefox-24.3.0/pl.xpi) = 638943d186944e9ccdbaa7b59ec9c3421a75c7417957ab0ce6e1fac5088f5591
-SIZE (xpi/firefox-24.3.0/pl.xpi) = 341995
-SHA256 (xpi/firefox-24.3.0/pt-BR.xpi) = aa967ebf638b809bf575767ec6876b165127dd175093b845a9d07493aa77e7b9
-SIZE (xpi/firefox-24.3.0/pt-BR.xpi) = 334605
-SHA256 (xpi/firefox-24.3.0/pt-PT.xpi) = 4b55ef991c5c315409090032345a15298410cb7416128d4316640c9925ecce3c
-SIZE (xpi/firefox-24.3.0/pt-PT.xpi) = 332739
-SHA256 (xpi/firefox-24.3.0/rm.xpi) = 6f221df14399917870ab175f8fd7af6aa3e930a445bc01a60ad25b3027fd7f7c
-SIZE (xpi/firefox-24.3.0/rm.xpi) = 339697
-SHA256 (xpi/firefox-24.3.0/ro.xpi) = 7f0a0e23f1d2313099ca864b0c7aef52e40a227f594e1b2e408978f435b5cc21
-SIZE (xpi/firefox-24.3.0/ro.xpi) = 362236
-SHA256 (xpi/firefox-24.3.0/ru.xpi) = 60f08a240874c74a6fd31617e9ef566e4d107ea3131a602d2f8595900fac530c
-SIZE (xpi/firefox-24.3.0/ru.xpi) = 322761
-SHA256 (xpi/firefox-24.3.0/si.xpi) = 65cb4c4e3cb5cb4620fde963b061eac30f43dd56e0b8dd38b0afcdc66180df66
-SIZE (xpi/firefox-24.3.0/si.xpi) = 372982
-SHA256 (xpi/firefox-24.3.0/sk.xpi) = 4566d741ce0a12523946037140dff0e40ef4bf270c2beb2437b7c6b4a0dd6f8a
-SIZE (xpi/firefox-24.3.0/sk.xpi) = 347878
-SHA256 (xpi/firefox-24.3.0/sl.xpi) = 7184931150ec4251ff3d9811d757f8f72672b33899077c4f072775016322400c
-SIZE (xpi/firefox-24.3.0/sl.xpi) = 331572
-SHA256 (xpi/firefox-24.3.0/son.xpi) = 34bac860ded37d691c9b04cb732ef5d5c321435ef1645835a5d1501ff3a108b0
-SIZE (xpi/firefox-24.3.0/son.xpi) = 328899
-SHA256 (xpi/firefox-24.3.0/sq.xpi) = 6a63ad5ff427c9b01d37137c6fd92ca1337b347348f1a820391cae04999ff6da
-SIZE (xpi/firefox-24.3.0/sq.xpi) = 340676
-SHA256 (xpi/firefox-24.3.0/sr.xpi) = 3292db27de10f269d44cd353a7bdb1a10ba6dec6132c23b7acec2e6a6a2f2198
-SIZE (xpi/firefox-24.3.0/sr.xpi) = 385108
-SHA256 (xpi/firefox-24.3.0/sv-SE.xpi) = 67b0b85ea121dc51e12ab842813412155fd644cb642919fc273d5fa879693b44
-SIZE (xpi/firefox-24.3.0/sv-SE.xpi) = 333506
-SHA256 (xpi/firefox-24.3.0/ta-LK.xpi) = b3dbb0dffd4caa293ac705d7d006e5ed8107b26d052dcd8d529456789c5d296c
-SIZE (xpi/firefox-24.3.0/ta-LK.xpi) = 384155
-SHA256 (xpi/firefox-24.3.0/ta.xpi) = 4db58f21bba82fa6f15234f6dfec5b970daf135dbd70b75c15191387c03b07ce
-SIZE (xpi/firefox-24.3.0/ta.xpi) = 381423
-SHA256 (xpi/firefox-24.3.0/te.xpi) = f8d9e3036f69e3551885d9c4184bb2668e11969e3d91b6fd3b30b43e0a672e80
-SIZE (xpi/firefox-24.3.0/te.xpi) = 394563
-SHA256 (xpi/firefox-24.3.0/th.xpi) = 3ea3c380854caf0784d68935163b15c71c337c8356b1fac08e4f6278848dc13b
-SIZE (xpi/firefox-24.3.0/th.xpi) = 379822
-SHA256 (xpi/firefox-24.3.0/tr.xpi) = fb03277db936ae43a159d211575e215d4109d47a425187ca5bea7d6882b8f78c
-SIZE (xpi/firefox-24.3.0/tr.xpi) = 340387
-SHA256 (xpi/firefox-24.3.0/uk.xpi) = d4f55ae8e0be558b4a6f475b465a2367aefe84be3cd984853cb506819c003aba
-SIZE (xpi/firefox-24.3.0/uk.xpi) = 365699
-SHA256 (xpi/firefox-24.3.0/vi.xpi) = 1822addccfb99d76666b64ccdccac8215835a5525174d5e4e5de074d7cfb529f
-SIZE (xpi/firefox-24.3.0/vi.xpi) = 358430
-SHA256 (xpi/firefox-24.3.0/zh-CN.xpi) = bb7ba2bb358263fd8db5a3e0ebc9fff8f3fc6a2c843c03bda5e7a91cfb212426
-SIZE (xpi/firefox-24.3.0/zh-CN.xpi) = 358182
-SHA256 (xpi/firefox-24.3.0/zh-TW.xpi) = 4927c0fc3336f3300e04f4f2ca06126b42e21964cbdd19f5596caa213fc791b1
-SIZE (xpi/firefox-24.3.0/zh-TW.xpi) = 351832
-SHA256 (xpi/firefox-24.3.0/zu.xpi) = e5a7b91fdf0fa6bebd50cd01420ca07a667dbb37507c5e7e069990bb0d338fbb
-SIZE (xpi/firefox-24.3.0/zu.xpi) = 340394
+SHA256 (xpi/firefox-24.4.0/ach.xpi) = 6c9b14a2cae9c80cc4bc672e159cf59e392a0b3fcf9e1db6a548d006fd9407e9
+SIZE (xpi/firefox-24.4.0/ach.xpi) = 339946
+SHA256 (xpi/firefox-24.4.0/af.xpi) = 097e30e4362c61cb73b727426e71e6807564955b66afa4c4fa34736f9b4fb9a5
+SIZE (xpi/firefox-24.4.0/af.xpi) = 333184
+SHA256 (xpi/firefox-24.4.0/ak.xpi) = d67cd4cdf43f2470b00dc2aa26ddce7cd57074ab040542899ef83dbbfba9e9b7
+SIZE (xpi/firefox-24.4.0/ak.xpi) = 340940
+SHA256 (xpi/firefox-24.4.0/ar.xpi) = d3a941366892bc83cc4fb8f9f9bb616ae8cd9267005e586a3280aee5d0af715d
+SIZE (xpi/firefox-24.4.0/ar.xpi) = 360849
+SHA256 (xpi/firefox-24.4.0/as.xpi) = a474fa95ab4f3242c33b9684c4565e093962050f365cae48796fbec9c03a382f
+SIZE (xpi/firefox-24.4.0/as.xpi) = 378085
+SHA256 (xpi/firefox-24.4.0/ast.xpi) = f838b197e83f9e21a082552b8b4bc5b89145a75c26544cd3e88b9de3aeb15839
+SIZE (xpi/firefox-24.4.0/ast.xpi) = 292876
+SHA256 (xpi/firefox-24.4.0/be.xpi) = ebcccc35617106a647923714c24e02ba7c495da54f2b8e6f5840a99c5a70a174
+SIZE (xpi/firefox-24.4.0/be.xpi) = 316955
+SHA256 (xpi/firefox-24.4.0/bg.xpi) = 4077846e7683c064b1a7e5626a06888cd760d3728e6911764482cd8933aeb2e1
+SIZE (xpi/firefox-24.4.0/bg.xpi) = 373136
+SHA256 (xpi/firefox-24.4.0/bn-BD.xpi) = 3ece7fb100ef39de164f6051c7843b672af617f02557f944e04c21370b39ee80
+SIZE (xpi/firefox-24.4.0/bn-BD.xpi) = 394939
+SHA256 (xpi/firefox-24.4.0/bn-IN.xpi) = a525964c6ee4a393b17dee20c7f54a9ffec5ba8f7a78172e17fc2a422cc90c7d
+SIZE (xpi/firefox-24.4.0/bn-IN.xpi) = 427780
+SHA256 (xpi/firefox-24.4.0/br.xpi) = 65938d9974751a2c7f71a3df3a30dea0944656dc97a27280fede8bfb5758ced2
+SIZE (xpi/firefox-24.4.0/br.xpi) = 330509
+SHA256 (xpi/firefox-24.4.0/bs.xpi) = 1c8d46fe6086cddea58bb54c8081cbdb05c1fe068f041bcaa1dae3899bdaa2a4
+SIZE (xpi/firefox-24.4.0/bs.xpi) = 341620
+SHA256 (xpi/firefox-24.4.0/ca.xpi) = 4ef5227bef8d3e946c8f36353361623cb5333b1f32e0196558409e6c806ce1a7
+SIZE (xpi/firefox-24.4.0/ca.xpi) = 341257
+SHA256 (xpi/firefox-24.4.0/cs.xpi) = 0c460f153c77fe668c8279e1a61b9d8df1eb2fc1ecb47027a1edc8ef8d5a5157
+SIZE (xpi/firefox-24.4.0/cs.xpi) = 335946
+SHA256 (xpi/firefox-24.4.0/csb.xpi) = 7d3478b8966bb077e74a9d42643e2b1e0d714fdabd8e1b0a84e6005fd3e4a155
+SIZE (xpi/firefox-24.4.0/csb.xpi) = 329796
+SHA256 (xpi/firefox-24.4.0/cy.xpi) = 7227d1e9c29cc3ca5cb311691ee53b31e937ca3c132c65374ad7aa1d04450887
+SIZE (xpi/firefox-24.4.0/cy.xpi) = 330643
+SHA256 (xpi/firefox-24.4.0/da.xpi) = f3208663201b779744ae107ff409c0d61fee9db2d97a3ff3b6905ab9a8b067ac
+SIZE (xpi/firefox-24.4.0/da.xpi) = 326881
+SHA256 (xpi/firefox-24.4.0/de.xpi) = bded7217b67006cde313a4e8f517c911a09cddb3be1860ae13f1837e24515d29
+SIZE (xpi/firefox-24.4.0/de.xpi) = 323258
+SHA256 (xpi/firefox-24.4.0/el.xpi) = d2db91792610a0871ac4284c03411d34a2031b2fe219a6d311a90718b85cfbcd
+SIZE (xpi/firefox-24.4.0/el.xpi) = 365320
+SHA256 (xpi/firefox-24.4.0/en-GB.xpi) = 8bf0bc0409da9b9b573c7c23561135819e5f468011551a04f74faed939d0a275
+SIZE (xpi/firefox-24.4.0/en-GB.xpi) = 318297
+SHA256 (xpi/firefox-24.4.0/en-US.xpi) = e8048f4ede5b107c355c3a8bf9993263588846dd88da9c0469b31479eb3ccee5
+SIZE (xpi/firefox-24.4.0/en-US.xpi) = 320993
+SHA256 (xpi/firefox-24.4.0/en-ZA.xpi) = 26ba9959aff13112aa9b15dcf9180425f32fdfc699cb037e9969ad62d3384160
+SIZE (xpi/firefox-24.4.0/en-ZA.xpi) = 319321
+SHA256 (xpi/firefox-24.4.0/eo.xpi) = bcfafbb225eb5a660265a36a7cd6d5d59070fc2187566d8e9517c63fab4bbc02
+SIZE (xpi/firefox-24.4.0/eo.xpi) = 334939
+SHA256 (xpi/firefox-24.4.0/es-AR.xpi) = 6d1ae40351dc435ddf10be8f49525620d29c62a8b1214f7228cd54bc0ad79192
+SIZE (xpi/firefox-24.4.0/es-AR.xpi) = 334010
+SHA256 (xpi/firefox-24.4.0/es-CL.xpi) = ec1387cd96aed7079f5ec59d3521345852fcaed4fccaf4fbf109683cfb1ff104
+SIZE (xpi/firefox-24.4.0/es-CL.xpi) = 287026
+SHA256 (xpi/firefox-24.4.0/es-ES.xpi) = cdb1e3b61c3eb60dde4d2588b58767f6e313b4f274b8380af22b801b1f2b9d97
+SIZE (xpi/firefox-24.4.0/es-ES.xpi) = 277859
+SHA256 (xpi/firefox-24.4.0/es-MX.xpi) = 571d502b2ec13960714f894908fc8cd636b37fb42646f961a8d5609d8164534d
+SIZE (xpi/firefox-24.4.0/es-MX.xpi) = 302624
+SHA256 (xpi/firefox-24.4.0/et.xpi) = d80f8622c5d731384a0d63e3913cdbdec4065463690652ed5ccb85b012232678
+SIZE (xpi/firefox-24.4.0/et.xpi) = 327697
+SHA256 (xpi/firefox-24.4.0/eu.xpi) = a9f7959d3b9a15bdcde205709762e8a3ee49b3dd7a7a661314f530340d5d99bf
+SIZE (xpi/firefox-24.4.0/eu.xpi) = 332422
+SHA256 (xpi/firefox-24.4.0/fa.xpi) = 18f347d60c7d74bd55d4e3d41cbcaf91ddc8b50e5ab270bf12ee6bb234ac8df7
+SIZE (xpi/firefox-24.4.0/fa.xpi) = 375633
+SHA256 (xpi/firefox-24.4.0/ff.xpi) = 6b36e0ef8313dedd5137855fc63745f8f134b889f0971e8f13887ecf33e27d6d
+SIZE (xpi/firefox-24.4.0/ff.xpi) = 332815
+SHA256 (xpi/firefox-24.4.0/fi.xpi) = 6c24f1edd0c528684493e9524041dbaa240b69fc35580e5c92f44f6205b31c64
+SIZE (xpi/firefox-24.4.0/fi.xpi) = 328891
+SHA256 (xpi/firefox-24.4.0/fr.xpi) = 263af45a3ccb7581ab54ba4276f7465227a1827593f44ac6f3d81e3ac3b2ec06
+SIZE (xpi/firefox-24.4.0/fr.xpi) = 339178
+SHA256 (xpi/firefox-24.4.0/fy-NL.xpi) = 5e07a386ccd1b57d6b4943a79ae07254fc95f8ee6866bd29f1f1615b788af298
+SIZE (xpi/firefox-24.4.0/fy-NL.xpi) = 336589
+SHA256 (xpi/firefox-24.4.0/ga-IE.xpi) = 4ee9a6892c91c37386dd1fec94cd6d9f71c637940bd54a5f4de2b30444760389
+SIZE (xpi/firefox-24.4.0/ga-IE.xpi) = 345294
+SHA256 (xpi/firefox-24.4.0/gd.xpi) = ade6ba8fcd860cd701e24dcebe68adafe8012bb28b9581b35742c55b91519467
+SIZE (xpi/firefox-24.4.0/gd.xpi) = 344811
+SHA256 (xpi/firefox-24.4.0/gl.xpi) = f76240bdf1dd6148d2e719117e2c208cfe67e48df32d6d3947993f9ab924e6fa
+SIZE (xpi/firefox-24.4.0/gl.xpi) = 336919
+SHA256 (xpi/firefox-24.4.0/gu-IN.xpi) = 61574576e87ad030b8fbd6218f10d5aab37ab59173983f565e33a26209c4e196
+SIZE (xpi/firefox-24.4.0/gu-IN.xpi) = 359359
+SHA256 (xpi/firefox-24.4.0/he.xpi) = 09d40f8270f4ba52a771299174cf5a50b44485a179875b0ac40dbf2d5a0369db
+SIZE (xpi/firefox-24.4.0/he.xpi) = 354630
+SHA256 (xpi/firefox-24.4.0/hi-IN.xpi) = e8fc479ae81d15f3f56a20ec47b138e98d71f0316fd330b66dba00725a20a2fd
+SIZE (xpi/firefox-24.4.0/hi-IN.xpi) = 379121
+SHA256 (xpi/firefox-24.4.0/hr.xpi) = 601ed868c7ad23af8546ecee0b2933c3ada82cff6c5add3a532a83d32806fbcb
+SIZE (xpi/firefox-24.4.0/hr.xpi) = 336840
+SHA256 (xpi/firefox-24.4.0/hu.xpi) = bdbdac9b971df54bb6e44cf64dfe3843d90cf6d8095b9e616de718f92b5c11b9
+SIZE (xpi/firefox-24.4.0/hu.xpi) = 344103
+SHA256 (xpi/firefox-24.4.0/hy-AM.xpi) = 7c4de83faf3cdd4ff6ffbfec2847238ab00acd6b1d608a9061a10809b86b30c8
+SIZE (xpi/firefox-24.4.0/hy-AM.xpi) = 385180
+SHA256 (xpi/firefox-24.4.0/id.xpi) = 4547931f4361cb06c0a66b0ee1f909f60b7324acffadc127eaa2b2c78824a038
+SIZE (xpi/firefox-24.4.0/id.xpi) = 319795
+SHA256 (xpi/firefox-24.4.0/is.xpi) = f9bb8e5d44768c3cd2b28216b07b27349e977312b2c1a34d96d6e98d83277c9f
+SIZE (xpi/firefox-24.4.0/is.xpi) = 331826
+SHA256 (xpi/firefox-24.4.0/it.xpi) = e218243a4c38268876a6a25573b513f4fe6a89fe518cf62eca13f66990070079
+SIZE (xpi/firefox-24.4.0/it.xpi) = 271925
+SHA256 (xpi/firefox-24.4.0/ja.xpi) = 1cdfde63a969340652ac9c39468d86fae722b6bb3ae4ce454dd4b694b3b26dd1
+SIZE (xpi/firefox-24.4.0/ja.xpi) = 370903
+SHA256 (xpi/firefox-24.4.0/kk.xpi) = 299a2273d78956c46b5d673dc80d831cc3b92885b1fe03fce28a0d6d4f44f57b
+SIZE (xpi/firefox-24.4.0/kk.xpi) = 377502
+SHA256 (xpi/firefox-24.4.0/km.xpi) = 11683106c4a09343ade9fb61f07c15ec6b6f8869b8e7ade15cf76e1b6f434120
+SIZE (xpi/firefox-24.4.0/km.xpi) = 400559
+SHA256 (xpi/firefox-24.4.0/kn.xpi) = c0dc5d43d75f0aaf590c9f11bf2425684fed5b8e1cc00e3720d2bffd4dfc5923
+SIZE (xpi/firefox-24.4.0/kn.xpi) = 391033
+SHA256 (xpi/firefox-24.4.0/ko.xpi) = 7ff1514c8945f97621bd21075fe5f544d1c89c7f830933973f2b66324e27db7e
+SIZE (xpi/firefox-24.4.0/ko.xpi) = 346164
+SHA256 (xpi/firefox-24.4.0/ku.xpi) = e5c8f561e80bf6c8f80e733b7403e04169eb91376227cab8795b4e63e8e009c8
+SIZE (xpi/firefox-24.4.0/ku.xpi) = 355632
+SHA256 (xpi/firefox-24.4.0/lg.xpi) = 6fa17d6767b7cef6e5d7c199dd82d1aab826d4bb54d016117f88bd2a5dc82acb
+SIZE (xpi/firefox-24.4.0/lg.xpi) = 351111
+SHA256 (xpi/firefox-24.4.0/lij.xpi) = 6ca4d46dca097703a6c55cd12837f596f52c5c0dd3ef55f59f72476c4615c576
+SIZE (xpi/firefox-24.4.0/lij.xpi) = 322700
+SHA256 (xpi/firefox-24.4.0/lt.xpi) = 17cd459c6a7a699408b361d4debf37afd1d722c96b7f78754e2c5848c941215a
+SIZE (xpi/firefox-24.4.0/lt.xpi) = 352045
+SHA256 (xpi/firefox-24.4.0/lv.xpi) = c14a6897ff67d17d37b677382d30b1e3b392dd70b7cfeadf72315a7fc7c9e25c
+SIZE (xpi/firefox-24.4.0/lv.xpi) = 328664
+SHA256 (xpi/firefox-24.4.0/mai.xpi) = 7aa629e4625e892e2802c9ef062daf2ef6bf5ec8cf99b5fad3e718d1f19d8d3d
+SIZE (xpi/firefox-24.4.0/mai.xpi) = 379767
+SHA256 (xpi/firefox-24.4.0/mk.xpi) = 77124e0e3278b61acd48acb2c62179fdf7101d268a721d5ee6332c62d767b902
+SIZE (xpi/firefox-24.4.0/mk.xpi) = 376316
+SHA256 (xpi/firefox-24.4.0/ml.xpi) = a73740c766b7e9a1cd74cb7903bc925d348a6c9731bc59620ec756ec6250e3a3
+SIZE (xpi/firefox-24.4.0/ml.xpi) = 399677
+SHA256 (xpi/firefox-24.4.0/mr.xpi) = 72cebc76ac9974241ee443a8bd6154b2051a697dc1d02d4d1ce1e51eec16099b
+SIZE (xpi/firefox-24.4.0/mr.xpi) = 380231
+SHA256 (xpi/firefox-24.4.0/nb-NO.xpi) = 5b962da03635d5bab53b5ed4ff6dd42e4bc4450035a1f47b70c050a987a92827
+SIZE (xpi/firefox-24.4.0/nb-NO.xpi) = 330966
+SHA256 (xpi/firefox-24.4.0/nl.xpi) = ceb11793de0f9ab3f76491104ac92fc863454e8284254ffbc19c4540b79590b5
+SIZE (xpi/firefox-24.4.0/nl.xpi) = 331404
+SHA256 (xpi/firefox-24.4.0/nn-NO.xpi) = 3c05475c86ff4f06382067a560e2c0a451ef956dcce5bd0c4b0945d93112fef3
+SIZE (xpi/firefox-24.4.0/nn-NO.xpi) = 333906
+SHA256 (xpi/firefox-24.4.0/nso.xpi) = e5088e7becf14b568d97ba788ba6d3d7f8849f909343ae08cf4fddaf9b791cb0
+SIZE (xpi/firefox-24.4.0/nso.xpi) = 336297
+SHA256 (xpi/firefox-24.4.0/or.xpi) = eb47be1342121d0b9da8f67581393920498d173d6caa38972d14b2f49db22188
+SIZE (xpi/firefox-24.4.0/or.xpi) = 364592
+SHA256 (xpi/firefox-24.4.0/pa-IN.xpi) = caa2c2819a365d5aa012b3782905bab9a6bfefd0a70b3f490297ff6d1fc1e1de
+SIZE (xpi/firefox-24.4.0/pa-IN.xpi) = 365653
+SHA256 (xpi/firefox-24.4.0/pl.xpi) = 62bb7ab15c891c46cd39242c89a79deec25d2890158150cd97bd682c042e9897
+SIZE (xpi/firefox-24.4.0/pl.xpi) = 341995
+SHA256 (xpi/firefox-24.4.0/pt-BR.xpi) = 01cfd10c7a28d65e8196c408af32f4e0a2186c695425d1f5bc8ce424f6f5e022
+SIZE (xpi/firefox-24.4.0/pt-BR.xpi) = 334605
+SHA256 (xpi/firefox-24.4.0/pt-PT.xpi) = 68dc954bebb472ed88d2a57ce49234bc7fb4f741bc8c45e3531585d0e20ba7bd
+SIZE (xpi/firefox-24.4.0/pt-PT.xpi) = 332739
+SHA256 (xpi/firefox-24.4.0/rm.xpi) = cbed0f16189d775b736b019bf9c2a701e18caf10a19c704c8a995c57064704e4
+SIZE (xpi/firefox-24.4.0/rm.xpi) = 339697
+SHA256 (xpi/firefox-24.4.0/ro.xpi) = 0f4ef300df7cde26c0e8cde12aaa1b898afc095ccfef8176ff0ad10b574de711
+SIZE (xpi/firefox-24.4.0/ro.xpi) = 362236
+SHA256 (xpi/firefox-24.4.0/ru.xpi) = 0eafd9766b4048d615262bcc537b2fd4607fc7e46e391b165eab86080c9ea282
+SIZE (xpi/firefox-24.4.0/ru.xpi) = 322761
+SHA256 (xpi/firefox-24.4.0/si.xpi) = 7fd6911233b6cf3a8ebe8b9e2bd57be05f754cd81d48fd548cd154919196f3a2
+SIZE (xpi/firefox-24.4.0/si.xpi) = 372982
+SHA256 (xpi/firefox-24.4.0/sk.xpi) = ccbb12bc8cd84e20aab4273ddae867cb6c633d0396e1cb0bbf81b437f70adf9e
+SIZE (xpi/firefox-24.4.0/sk.xpi) = 347878
+SHA256 (xpi/firefox-24.4.0/sl.xpi) = 20988a15236a879ecdf0c047a858664ad9edccc1e3e9d3324e991c4d595e3b19
+SIZE (xpi/firefox-24.4.0/sl.xpi) = 331572
+SHA256 (xpi/firefox-24.4.0/son.xpi) = cc1f2044d01a6f18f86f270ddac4a4dc4e8f27325d592fb0b6785868671581a9
+SIZE (xpi/firefox-24.4.0/son.xpi) = 328899
+SHA256 (xpi/firefox-24.4.0/sq.xpi) = 22eea4fca9b37dfc631562f4a74b1f1462cd709a7dc9c710f7b2ca235b3be179
+SIZE (xpi/firefox-24.4.0/sq.xpi) = 340676
+SHA256 (xpi/firefox-24.4.0/sr.xpi) = 6df58a1187e6021ecceb612aaec17afc594f12cb9a3083faad37b4616c6d1f27
+SIZE (xpi/firefox-24.4.0/sr.xpi) = 385108
+SHA256 (xpi/firefox-24.4.0/sv-SE.xpi) = b45a5cf64718b756e36e3bb812d82c9181fa802759e3bcbb09cb23f194fe4694
+SIZE (xpi/firefox-24.4.0/sv-SE.xpi) = 333506
+SHA256 (xpi/firefox-24.4.0/ta-LK.xpi) = 958d69eeaf59525a777e9ba4cff13fd046d59a7714c77b413ddf9946528c3ea2
+SIZE (xpi/firefox-24.4.0/ta-LK.xpi) = 384155
+SHA256 (xpi/firefox-24.4.0/ta.xpi) = d02a7be5340619219de9e50d8c6adb44001c92e4423ed1f0ae75425f5e7fbc2e
+SIZE (xpi/firefox-24.4.0/ta.xpi) = 381423
+SHA256 (xpi/firefox-24.4.0/te.xpi) = b7eceef56d4cd9228c88ac1b833263e12880a16bc0cb55164b55627dc9da7a2d
+SIZE (xpi/firefox-24.4.0/te.xpi) = 394563
+SHA256 (xpi/firefox-24.4.0/th.xpi) = 7f9f89f6635d3aa496f0aaf51ca9e1f8c5f6f603b1844976c726cd73168c1a9b
+SIZE (xpi/firefox-24.4.0/th.xpi) = 379822
+SHA256 (xpi/firefox-24.4.0/tr.xpi) = 7c06d25c15592691402b8b0f4ebd365ca37f63b471d4f3833507f5c6dd25ec5c
+SIZE (xpi/firefox-24.4.0/tr.xpi) = 340387
+SHA256 (xpi/firefox-24.4.0/uk.xpi) = 3511f4c1ef862b746cd05cc24a785f6f2977dd2f40dd75145be9bf101f6666d8
+SIZE (xpi/firefox-24.4.0/uk.xpi) = 365699
+SHA256 (xpi/firefox-24.4.0/vi.xpi) = 3939e74ccdc7cf50442d5c84365433f8ee6d6d411a420ebf6d00795d9275f84a
+SIZE (xpi/firefox-24.4.0/vi.xpi) = 358430
+SHA256 (xpi/firefox-24.4.0/zh-CN.xpi) = 62af57b1a883c7d0219b093d816b81a773ac0edee3eb0712e239d738dfe3803c
+SIZE (xpi/firefox-24.4.0/zh-CN.xpi) = 358182
+SHA256 (xpi/firefox-24.4.0/zh-TW.xpi) = 2ca77f34354bf418a54d372dc0a490bd72bf0fea75271f21284be5c35376f864
+SIZE (xpi/firefox-24.4.0/zh-TW.xpi) = 351832
+SHA256 (xpi/firefox-24.4.0/zu.xpi) = 9b83e06d4db31a6a80ed0adb072faeff2040e11f619dc5e136f275960eb50a12
+SIZE (xpi/firefox-24.4.0/zu.xpi) = 340394
diff --git a/www/firefox-esr/Makefile b/www/firefox-esr/Makefile
index 314bfe9f8dd9..74c76a9447f4 100644
--- a/www/firefox-esr/Makefile
+++ b/www/firefox-esr/Makefile
@@ -2,8 +2,7 @@
# $FreeBSD$
PORTNAME= firefox
-DISTVERSION= 24.3.0
-PORTREVISION= 2
+DISTVERSION= 24.4.0
PORTEPOCH= 1
CATEGORIES= www ipv6
MASTER_SITES= MOZILLA/${PORTNAME}/releases/${DISTVERSION}esr/source
@@ -18,7 +17,11 @@ BUILD_DEPENDS= nspr>=4.10.2:${PORTSDIR}/devel/nspr \
sqlite3>=3.7.17:${PORTSDIR}/databases/sqlite3 \
${PYTHON_PKGNAMEPREFIX}sqlite3>0:${PORTSDIR}/databases/py-sqlite3 \
cairo>=1.10.2_1,1:${PORTSDIR}/graphics/cairo \
+ harfbuzz>=0.9.16:${PORTSDIR}/print/harfbuzz \
+ libvorbis>=1.3.4:${PORTSDIR}/audio/libvorbis \
+ opus>=1.1:${PORTSDIR}/audio/opus \
v4l_compat>0:${PORTSDIR}/multimedia/v4l_compat \
+ zip:${PORTSDIR}/archivers/zip \
unzip:${PORTSDIR}/archivers/unzip
LIB_DEPENDS= libv4l2.so:${PORTSDIR}/multimedia/libv4l
diff --git a/www/firefox-esr/distinfo b/www/firefox-esr/distinfo
index b8f85a402c3f..2ef7d1a4281d 100644
--- a/www/firefox-esr/distinfo
+++ b/www/firefox-esr/distinfo
@@ -1,2 +1,2 @@
-SHA256 (firefox-24.3.0esr.source.tar.bz2) = 0d38dd50beffff640cfea67fcf8f44bb95c3c927ccfa225f2b937b9a4ba262b9
-SIZE (firefox-24.3.0esr.source.tar.bz2) = 119391302
+SHA256 (firefox-24.4.0esr.source.tar.bz2) = b56fb5f16e0fe42bdf9ba560a64bca3633cdea5d264f7e9beca01b7a355efd6e
+SIZE (firefox-24.4.0esr.source.tar.bz2) = 119614180
diff --git a/www/firefox-esr/files/patch-bug893397 b/www/firefox-esr/files/patch-bug893397
index 4d755c2ebb17..906f712d58dd 100644
--- a/www/firefox-esr/files/patch-bug893397
+++ b/www/firefox-esr/files/patch-bug893397
@@ -2,7 +2,7 @@ diff --git configure.in configure.in
index 549ad06..2878d9f 100644
--- configure.in
+++ configure.in
-@@ -8491,7 +8491,7 @@ case "$OS_TARGET" in
+@@ -8091,7 +8091,7 @@ case "$OS_TARGET" in
NECKO_WIFI=1
fi
;;
@@ -15,9 +15,9 @@ diff --git netwerk/wifi/moz.build netwerk/wifi/moz.build
index 07b01de..11706af 100644
--- netwerk/wifi/moz.build
+++ netwerk/wifi/moz.build
-@@ -34,6 +34,10 @@ if CONFIG['OS_ARCH'] == 'Darwin':
- CMMSRCS += [
- 'osx_corewlan.mm',
+@@ -31,6 +31,10 @@ if CONFIG['OS_ARCH'] == 'Darwin':
+ CPP_SOURCES += [
+ 'nsWifiScannerMac.cpp',
]
+elif CONFIG['OS_ARCH'] == 'FreeBSD':
+ CPP_SOURCES += [
@@ -31,7 +31,7 @@ new file mode 100644
index 0000000..80d4cb6
--- /dev/null
+++ netwerk/wifi/nsWifiScannerFreeBSD.cpp
-@@ -0,0 +1,172 @@
+@@ -0,0 +1,167 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
@@ -60,43 +60,39 @@ index 0000000..80d4cb6
+static nsresult
+FreeBSDGetAccessPointData(nsCOMArray<nsWifiAccessPoint> &accessPoints)
+{
-+ bool res = false;
-+ char *dupn = NULL;
-+ struct ifaddrs *ifal, *ifa;
-+ unsigned len;
-+
+ // get list of interfaces
-+ if (getifaddrs(&ifal) < 0)
++ struct ifaddrs *ifal;
++ if (getifaddrs(&ifal) < 0) {
+ return NS_ERROR_FAILURE;
++ }
+
+ accessPoints.Clear();
+
+ // loop through the interfaces
++ nsresult rv = NS_ERROR_FAILURE;
++ struct ifaddrs *ifa;
+ for (ifa = ifal; ifa; ifa = ifa->ifa_next) {
-+ int s;
-+ struct ifreq ifr;
-+ struct ifmediareq ifmr;
-+ struct ieee80211req i802r;
-+ char iscanbuf[32*1024], *vsr;
-+
-+ memset(&ifr, 0, sizeof(ifr));
-+
-+ // list can contain duplicates, so ignore those
-+ if (dupn != NULL && strcmp(dupn, ifa->ifa_name) == 0)
++ // limit to one interface per address
++ if (ifa->ifa_addr->sa_family != AF_LINK) {
+ continue;
-+ dupn = ifa->ifa_name;
++ }
+
+ // store interface name in socket structure
++ struct ifreq ifr;
++ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, ifa->ifa_name, sizeof(ifr.ifr_name));
+ ifr.ifr_addr.sa_family = AF_LOCAL;
+
+ // open socket to interface
-+ if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
++ int s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0);
++ if (s < 0) {
+ continue;
++ }
+
+ // clear interface media structure
-+ (void) memset(&ifmr, 0, sizeof(ifmr));
-+ (void) strncpy(ifmr.ifm_name, ifa->ifa_name, sizeof(ifmr.ifm_name));
++ struct ifmediareq ifmr;
++ memset(&ifmr, 0, sizeof(ifmr));
++ strncpy(ifmr.ifm_name, ifa->ifa_name, sizeof(ifmr.ifm_name));
+
+ // get interface media information
+ if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) {
@@ -111,8 +107,10 @@ index 0000000..80d4cb6
+ }
+
+ // perform WiFi scan
-+ (void) memset(&i802r, 0, sizeof(i802r));
-+ (void) strncpy(i802r.i_name, ifa->ifa_name, sizeof(i802r.i_name));
++ struct ieee80211req i802r;
++ char iscanbuf[32*1024];
++ memset(&i802r, 0, sizeof(i802r));
++ strncpy(i802r.i_name, ifa->ifa_name, sizeof(i802r.i_name));
+ i802r.i_type = IEEE80211_IOC_SCAN_RESULTS;
+ i802r.i_data = iscanbuf;
+ i802r.i_len = sizeof(iscanbuf);
@@ -125,36 +123,33 @@ index 0000000..80d4cb6
+ close(s);
+
+ // loop through WiFi networks and build geoloc-lookup structure
-+ vsr = (char *) i802r.i_data;
-+ len = i802r.i_len;
++ char *vsr = (char *) i802r.i_data;
++ unsigned len = i802r.i_len;
+ while (len >= sizeof(struct ieee80211req_scan_result)) {
-+ struct ieee80211req_scan_result *isr;
-+ char *id;
-+ int idlen;
-+ char ssid[IEEE80211_NWID_LEN+1];
-+ nsWifiAccessPoint *ap;
-+
-+ isr = (struct ieee80211req_scan_result *) vsr;
++ struct ieee80211req_scan_result *isr =
++ (struct ieee80211req_scan_result *) vsr;
+
+ // determine size of this entry
++ char *id;
++ int idlen;
+ if (isr->isr_meshid_len) {
+ id = vsr + isr->isr_ie_off + isr->isr_ssid_len;
+ idlen = isr->isr_meshid_len;
-+ }
-+ else {
++ } else {
+ id = vsr + isr->isr_ie_off;
+ idlen = isr->isr_ssid_len;
+ }
+
+ // copy network data
++ char ssid[IEEE80211_NWID_LEN+1];
+ strncpy(ssid, id, idlen);
+ ssid[idlen] = '\0';
-+ ap = new nsWifiAccessPoint();
++ nsWifiAccessPoint *ap = new nsWifiAccessPoint();
+ ap->setSSID(ssid, strlen(ssid));
+ ap->setMac(isr->isr_bssid);
+ ap->setSignal(isr->isr_rssi);
+ accessPoints.AppendObject(ap);
-+ res = true;
++ rv = NS_OK;
+
+ // log the data
+ LOG(( "FreeBSD access point: "
@@ -172,7 +167,7 @@ index 0000000..80d4cb6
+
+ freeifaddrs(ifal);
+
-+ return res ? NS_OK : NS_ERROR_FAILURE;
++ return rv;
+}
+
+nsresult
diff --git a/www/firefox-esr/files/patch-bug948946 b/www/firefox-esr/files/patch-bug948946
index 146668185b2c..63e35e8f550b 100644
--- a/www/firefox-esr/files/patch-bug948946
+++ b/www/firefox-esr/files/patch-bug948946
@@ -1,12 +1,26 @@
-diff --git browser/themes/moz.build browser/themes/moz.build
-index d82bda3..86d343d 100644
---- browser/themes/moz.build
-+++ browser/themes/moz.build
-@@ -9,6 +9,7 @@ toolkit = CONFIG['MOZ_WIDGET_TOOLKIT']
- if toolkit == 'cocoa':
- DIRS += ['osx']
- elif toolkit in ('gtk2', 'gtk3', 'qt'):
-+ DEFINES += ['-DXP_LINUX']
- DIRS += ['linux']
- else:
- DIRS += ['windows']
+diff --git browser/themes/shared/devtools/common.inc.css browser/themes/shared/devtools/common.inc.css
+index 268164e..922f21a 100644
+--- browser/themes/shared/devtools/common.inc.css
++++ browser/themes/shared/devtools/common.inc.css
+@@ -14,7 +14,7 @@
+ background-color: transparent;
+ background-image: linear-gradient(to bottom, hsla(209,18%,18%,0.9), hsl(210,11%,16%));
+ border-radius: 3px;
+-%ifdef XP_LINUX
++%if defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_QT)
+ max-height: 32rem;
+ %else
+ max-height: 40rem;
+diff --git browser/themes/shared/devtools/highlighter.inc.css browser/themes/shared/devtools/highlighter.inc.css
+index 3d5ae51..3fb4b01 100644
+--- browser/themes/shared/devtools/highlighter.inc.css
++++ browser/themes/shared/devtools/highlighter.inc.css
+@@ -54,7 +54,7 @@ html|*.highlighter-nodeinfobar-pseudo-classes {
+ padding: 0;
+ width: 26px;
+ min-height: 26px;
+-%ifndef XP_LINUX
++%if !defined(MOZ_WIDGET_GTK) && !defined(MOZ_WIDGET_QT)
+ background-color: transparent;
+ %endif
+ }
diff --git a/www/firefox-esr/files/patch-bug961264 b/www/firefox-esr/files/patch-bug961264
new file mode 100644
index 000000000000..85bc94d001ff
--- /dev/null
+++ b/www/firefox-esr/files/patch-bug961264
@@ -0,0 +1,266 @@
+commit d099acd
+Author: Trevor Saunders <trev.saunders@gmail.com>
+Date: Fri Jan 17 15:08:00 2014 -0800
+
+ Bug 961264 - Remove obsolete checks for gcc visibility stuff.
+---
+ configure.in | 115 +++-------------------------------------------------
+ js/src/configure.in | 111 ++------------------------------------------------
+ 2 files changed, 8 insertions(+), 218 deletions(-)
+
+diff --git configure.in configure.in
+index dfb8193..33d71b3 100644
+--- configure.in
++++ configure.in
+@@ -2507,118 +2507,15 @@ MOZ_CXX11
+
+ AC_LANG_C
+
+-dnl Check for .hidden assembler directive and visibility attribute.
+-dnl Borrowed from glibc configure.in
++dnl Setup default hidden visibility and wrapped system headers.
+ dnl ===============================================================
+ if test "$GNU_CC"; then
+- AC_CACHE_CHECK(for visibility(hidden) attribute,
+- ac_cv_visibility_hidden,
+- [cat > conftest.c <<EOF
+- int foo __attribute__ ((visibility ("hidden"))) = 1;
+-EOF
+- ac_cv_visibility_hidden=no
+- if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then
+- if egrep '\.(hidden|private_extern).*foo' conftest.s >/dev/null; then
+- ac_cv_visibility_hidden=yes
+- fi
+- fi
+- rm -f conftest.[cs]
+- ])
+- if test "$ac_cv_visibility_hidden" = "yes"; then
+- AC_DEFINE(HAVE_VISIBILITY_HIDDEN_ATTRIBUTE)
+-
+- AC_CACHE_CHECK(for visibility(default) attribute,
+- ac_cv_visibility_default,
+- [cat > conftest.c <<EOF
+- int foo __attribute__ ((visibility ("default"))) = 1;
+-EOF
+- ac_cv_visibility_default=no
+- if ${CC-cc} -fvisibility=hidden -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then
+- if ! egrep '\.(hidden|private_extern).*foo' conftest.s >/dev/null; then
+- ac_cv_visibility_default=yes
+- fi
+- fi
+- rm -f conftest.[cs]
+- ])
+- if test "$ac_cv_visibility_default" = "yes"; then
+- AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE)
+-
+- AC_CACHE_CHECK(for visibility pragma support,
+- ac_cv_visibility_pragma,
+- [cat > conftest.c <<EOF
+-#pragma GCC visibility push(hidden)
+- int foo_hidden = 1;
+-#pragma GCC visibility push(default)
+- int foo_default = 1;
+-EOF
+- ac_cv_visibility_pragma=no
+- if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then
+- if egrep '\.(hidden|private_extern).*foo_hidden' conftest.s >/dev/null; then
+- if ! egrep '\.(hidden|private_extern).*foo_default' conftest.s > /dev/null; then
+- ac_cv_visibility_pragma=yes
+- fi
+- fi
+- fi
+- rm -f conftest.[cs]
+- ])
+- if test "$ac_cv_visibility_pragma" = "yes"; then
+- AC_CACHE_CHECK(For gcc visibility bug with class-level attributes (GCC bug 26905),
+- ac_cv_have_visibility_class_bug,
+- [cat > conftest.c <<EOF
+-#pragma GCC visibility push(hidden)
+-struct __attribute__ ((visibility ("default"))) TestStruct {
+- static void Init();
+-};
+-__attribute__ ((visibility ("default"))) void TestFunc() {
+- TestStruct::Init();
+-}
+-EOF
+- ac_cv_have_visibility_class_bug=no
+- if ! ${CXX-g++} ${CXXFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
+- ac_cv_have_visibility_class_bug=yes
+- else
+- if test `egrep -c '@PLT|\\$stub' conftest.S` = 0; then
+- ac_cv_have_visibility_class_bug=yes
+- fi
+- fi
+- rm -rf conftest.{c,S}
+- ])
+-
+- AC_CACHE_CHECK(For x86_64 gcc visibility bug with builtins (GCC bug 20297),
+- ac_cv_have_visibility_builtin_bug,
+- [cat > conftest.c <<EOF
+-#pragma GCC visibility push(hidden)
+-#pragma GCC visibility push(default)
+-#include <string.h>
+-#pragma GCC visibility pop
+-
+-__attribute__ ((visibility ("default"))) void Func() {
+- char c[[100]];
+- memset(c, 0, sizeof(c));
+-}
+-EOF
+- ac_cv_have_visibility_builtin_bug=no
+- if ! ${CC-cc} ${CFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -O2 -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
+- ac_cv_have_visibility_builtin_bug=yes
+- else
+- if test `grep -c "@PLT" conftest.S` = 0; then
+- ac_cv_visibility_builtin_bug=yes
+- fi
+- fi
+- rm -f conftest.{c,S}
+- ])
+- if test "$ac_cv_have_visibility_builtin_bug" = "no" -a \
+- "$ac_cv_have_visibility_class_bug" = "no"; then
+- VISIBILITY_FLAGS='-I$(DIST)/system_wrappers -include $(topsrcdir)/config/gcc_hidden.h'
+- WRAP_SYSTEM_INCLUDES=1
+- STL_FLAGS='-I$(DIST)/stl_wrappers'
+- WRAP_STL_INCLUDES=1
+- else
+- VISIBILITY_FLAGS='-fvisibility=hidden'
+- fi # have visibility pragma bug
+- fi # have visibility pragma
+- fi # have visibility(default) attribute
+- fi # have visibility(hidden) attribute
++ AC_DEFINE(HAVE_VISIBILITY_HIDDEN_ATTRIBUTE)
++ AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE)
++ VISIBILITY_FLAGS='-I$(DIST)/system_wrappers -include $(topsrcdir)/config/gcc_hidden.h'
++ WRAP_SYSTEM_INCLUDES=1
++ STL_FLAGS='-I$(DIST)/stl_wrappers'
++ WRAP_STL_INCLUDES=1
+ fi # GNU_CC
+
+ # visibility hidden flag for Sun Studio on Solaris
+diff --git js/src/configure.in js/src/configure.in
+index bddd46d..d4b522e 100644
+--- js/src/configure.in
++++ js/src/configure.in
+@@ -2348,116 +2348,13 @@ fi
+
+ AC_LANG_C
+
+-dnl Check for .hidden assembler directive and visibility attribute.
+-dnl Borrowed from glibc configure.in
++dnl Setup default hidden visibility and wrapped system headers.
+ dnl ===============================================================
+ if test "$GNU_CC"; then
+- AC_CACHE_CHECK(for visibility(hidden) attribute,
+- ac_cv_visibility_hidden,
+- [cat > conftest.c <<EOF
+- int foo __attribute__ ((visibility ("hidden"))) = 1;
+-EOF
+- ac_cv_visibility_hidden=no
+- if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then
+- if egrep '\.(hidden|private_extern).*foo' conftest.s >/dev/null; then
+- ac_cv_visibility_hidden=yes
+- fi
+- fi
+- rm -f conftest.[cs]
+- ])
+- if test "$ac_cv_visibility_hidden" = "yes"; then
+- AC_DEFINE(HAVE_VISIBILITY_HIDDEN_ATTRIBUTE)
+-
+- AC_CACHE_CHECK(for visibility(default) attribute,
+- ac_cv_visibility_default,
+- [cat > conftest.c <<EOF
+- int foo __attribute__ ((visibility ("default"))) = 1;
+-EOF
+- ac_cv_visibility_default=no
+- if ${CC-cc} -fvisibility=hidden -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then
+- if ! egrep '\.(hidden|private_extern).*foo' conftest.s >/dev/null; then
+- ac_cv_visibility_default=yes
+- fi
+- fi
+- rm -f conftest.[cs]
+- ])
+- if test "$ac_cv_visibility_default" = "yes"; then
+- AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE)
+-
+- AC_CACHE_CHECK(for visibility pragma support,
+- ac_cv_visibility_pragma,
+- [cat > conftest.c <<EOF
+-#pragma GCC visibility push(hidden)
+- int foo_hidden = 1;
+-#pragma GCC visibility push(default)
+- int foo_default = 1;
+-EOF
+- ac_cv_visibility_pragma=no
+- if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then
+- if egrep '\.(hidden|private_extern).*foo_hidden' conftest.s >/dev/null; then
+- if ! egrep '\.(hidden|private_extern).*foo_default' conftest.s > /dev/null; then
+- ac_cv_visibility_pragma=yes
+- fi
+- fi
+- fi
+- rm -f conftest.[cs]
+- ])
+- if test "$ac_cv_visibility_pragma" = "yes"; then
+- AC_CACHE_CHECK(For gcc visibility bug with class-level attributes (GCC bug 26905),
+- ac_cv_have_visibility_class_bug,
+- [cat > conftest.c <<EOF
+-#pragma GCC visibility push(hidden)
+-struct __attribute__ ((visibility ("default"))) TestStruct {
+- static void Init();
+-};
+-__attribute__ ((visibility ("default"))) void TestFunc() {
+- TestStruct::Init();
+-}
+-EOF
+- ac_cv_have_visibility_class_bug=no
+- if ! ${CXX-g++} ${CXXFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
+- ac_cv_have_visibility_class_bug=yes
+- else
+- if test `egrep -c '@PLT|\\$stub' conftest.S` = 0; then
+- ac_cv_have_visibility_class_bug=yes
+- fi
+- fi
+- rm -rf conftest.{c,S}
+- ])
+-
+- AC_CACHE_CHECK(For x86_64 gcc visibility bug with builtins (GCC bug 20297),
+- ac_cv_have_visibility_builtin_bug,
+- [cat > conftest.c <<EOF
+-#pragma GCC visibility push(hidden)
+-#pragma GCC visibility push(default)
+-#include <string.h>
+-#pragma GCC visibility pop
+-
+-__attribute__ ((visibility ("default"))) void Func() {
+- char c[[100]];
+- memset(c, 0, sizeof(c));
+-}
+-EOF
+- ac_cv_have_visibility_builtin_bug=no
+- if ! ${CC-cc} ${CFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -O2 -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
+- ac_cv_have_visibility_builtin_bug=yes
+- else
+- if test `grep -c "@PLT" conftest.S` = 0; then
+- ac_cv_visibility_builtin_bug=yes
+- fi
+- fi
+- rm -f conftest.{c,S}
+- ])
+- if test "$ac_cv_have_visibility_builtin_bug" = "no" -a \
+- "$ac_cv_have_visibility_class_bug" = "no"; then
+- VISIBILITY_FLAGS='-I$(DIST)/system_wrappers_js -include $(topsrcdir)/config/gcc_hidden.h'
+- WRAP_SYSTEM_INCLUDES=1
+- else
+- VISIBILITY_FLAGS='-fvisibility=hidden'
+- fi # have visibility pragma bug
+- fi # have visibility pragma
+- fi # have visibility(default) attribute
+- fi # have visibility(hidden) attribute
++ AC_DEFINE(HAVE_VISIBILITY_HIDDEN_ATTRIBUTE)
++ AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE)
++ VISIBILITY_FLAGS='-I$(DIST)/system_wrappers_js -include $(topsrcdir)/config/gcc_hidden.h'
++ WRAP_SYSTEM_INCLUDES=1
+ fi # GNU_CC
+
+ # visibility hidden flag for Sun Studio on Solaris
diff --git a/www/firefox-esr/files/patch-bug961816 b/www/firefox-esr/files/patch-bug961816
new file mode 100644
index 000000000000..322e73f952f6
--- /dev/null
+++ b/www/firefox-esr/files/patch-bug961816
@@ -0,0 +1,48 @@
+diff --git config/system-headers config/system-headers
+index 8803150..ae38d68 100644
+--- config/system-headers
++++ config/system-headers
+@@ -1158,3 +1158,4 @@ unicode/unum.h
+ unicode/ustring.h
+ #endif
+ libutil.h
++unwind.h
+diff --git configure.in configure.in
+index f452a5e..a1ebbcc 100644
+--- configure.in
++++ configure.in
+@@ -7455,7 +7455,10 @@ dnl ========================================================
+ dnl = Support for gcc stack unwinding (from gcc 3.3)
+ dnl ========================================================
+ if test -z "$SKIP_LIBRARY_CHECKS"; then
++ AC_LANG_SAVE
++ AC_LANG_CPLUSPLUS
+ MOZ_CHECK_HEADER(unwind.h, AC_CHECK_FUNCS(_Unwind_Backtrace))
++ AC_LANG_RESTORE
+ fi
+
+ dnl ========================================================
+diff --git config/system-headers config/system-headers
+index 8803150..ae38d68 100644
+--- js/src/config/system-headers
++++ js/src/config/system-headers
+@@ -1158,3 +1158,4 @@ unicode/unum.h
+ unicode/ustring.h
+ #endif
+ libutil.h
++unwind.h
+diff --git configure.in configure.in
+index f452a5e..a1ebbcc 100644
+--- js/src/configure.in
++++ js/src/configure.in
+@@ -7455,7 +7455,10 @@ dnl ========================================================
+ dnl = Support for gcc stack unwinding (from gcc 3.3)
+ dnl ========================================================
+ if test -z "$SKIP_LIBRARY_CHECKS"; then
++ AC_LANG_SAVE
++ AC_LANG_CPLUSPLUS
+ MOZ_CHECK_HEADER(unwind.h, AC_CHECK_FUNCS(_Unwind_Backtrace))
++ AC_LANG_RESTORE
+ fi
+
+ dnl ========================================================
diff --git a/www/firefox-esr/files/patch-bug962345 b/www/firefox-esr/files/patch-bug962345
new file mode 100644
index 000000000000..a465c93a51d1
--- /dev/null
+++ b/www/firefox-esr/files/patch-bug962345
@@ -0,0 +1,18 @@
+diff --git config/system-headers config/system-headers
+index 8803150..ae38d68 100644
+--- config/system-headers
++++ config/system-headers
+@@ -1159,3 +1159,4 @@ unicode/ustring.h
+ #endif
+ libutil.h
+ unwind.h
++cairo-qt.h
+diff --git config/system-headers config/system-headers
+index 8803150..ae38d68 100644
+--- js/src/config/system-headers
++++ js/src/config/system-headers
+@@ -1159,3 +1159,4 @@ unicode/ustring.h
+ #endif
+ libutil.h
+ unwind.h
++cairo-qt.h
diff --git a/www/firefox-esr/files/patch-bug975634 b/www/firefox-esr/files/patch-bug975634
new file mode 100644
index 000000000000..d41e69e83892
--- /dev/null
+++ b/www/firefox-esr/files/patch-bug975634
@@ -0,0 +1,63 @@
+diff --git configure.in configure.in
+index 0d9236a..0447104 100644
+--- configure.in
++++ configure.in
+@@ -9034,6 +9034,20 @@ AC_SUBST(MOZ_FOLD_LIBS)
+ AC_SUBST(MOZ_ENABLE_SZIP)
+ AC_SUBST(MOZ_SZIP_FLAGS)
+
++AC_MSG_CHECKING([for posix_fadvise])
++AC_TRY_LINK([#define _XOPEN_SOURCE 600
++ #include <fcntl.h>],
++ [posix_fadvise(0, 0, 0, 0);],
++ [ac_cv___posix_fadvise=true],
++ [ac_cv___posix_fadvise=false])
++
++if test "$ac_cv___posix_fadvise" = true ; then
++ AC_DEFINE(HAVE_POSIX_FADVISE)
++ AC_MSG_RESULT(yes)
++else
++ AC_MSG_RESULT(no)
++fi
++
+ AC_MSG_CHECKING([for posix_fallocate])
+ AC_TRY_LINK([#define _XOPEN_SOURCE 600
+ #include <fcntl.h>],
+diff --git js/src/configure.in js/src/configure.in
+index da9767c..352ba14 100644
+--- js/src/configure.in
++++ js/src/configure.in
+@@ -4025,6 +4025,20 @@ AC_SUBST(CXX_VERSION)
+ AC_SUBST(MSMANIFEST_TOOL)
+ AC_SUBST(MOZ_LINKER)
+
++AC_MSG_CHECKING([for posix_fadvise])
++AC_TRY_LINK([#define _XOPEN_SOURCE 600
++ #include <fcntl.h>],
++ [posix_fadvise(0, 0, 0, 0);],
++ [ac_cv___posix_fadvise=true],
++ [ac_cv___posix_fadvise=false])
++
++if test "$ac_cv___posix_fadvise" = true ; then
++ AC_DEFINE(HAVE_POSIX_FADVISE)
++ AC_MSG_RESULT(yes)
++else
++ AC_MSG_RESULT(no)
++fi
++
+ AC_MSG_CHECKING([for posix_fallocate])
+ AC_TRY_LINK([#define _XOPEN_SOURCE 600
+ #include <fcntl.h>],
+diff --git xpcom/io/nsLocalFileUnix.cpp xpcom/io/nsLocalFileUnix.cpp
+index bacf06c..0e46e4a 100644
+--- xpcom/io/nsLocalFileUnix.cpp
++++ xpcom/io/nsLocalFileUnix.cpp
+@@ -382,7 +382,7 @@ nsLocalFile::OpenNSPRFileDesc(int32_t flags, int32_t mode, PRFileDesc **_retval)
+ PR_Delete(mPath.get());
+ }
+
+-#if defined(LINUX) && !defined(ANDROID)
++#if defined(HAVE_POSIX_FADVISE)
+ if (flags & OS_READAHEAD) {
+ posix_fadvise(PR_FileDesc2NativeHandle(*_retval), 0, 0,
+ POSIX_FADV_SEQUENTIAL);
diff --git a/www/firefox-esr/files/patch-bug977457 b/www/firefox-esr/files/patch-bug977457
new file mode 100644
index 000000000000..cf57b6b1b809
--- /dev/null
+++ b/www/firefox-esr/files/patch-bug977457
@@ -0,0 +1,27 @@
+diff --git xpcom/base/nsStackWalk.cpp xpcom/base/nsStackWalk.cpp
+index bb0e15b..7641267 100644
+--- xpcom/base/nsStackWalk.cpp
++++ xpcom/base/nsStackWalk.cpp
+@@ -23,6 +23,12 @@ struct CriticalAddress {
+ };
+ static CriticalAddress gCriticalAddress;
+
++// for _Unwind_Backtrace from libcxxrt or libunwind
++// cxxabi.h from libcxxrt implicitly includes unwind.h first
++#if defined(HAVE__UNWIND_BACKTRACE) && !defined(_GNU_SOURCE)
++#define _GNU_SOURCE
++#endif
++
+ #if defined(HAVE_DLOPEN) || defined(XP_MACOSX)
+ #include <dlfcn.h>
+ #endif
+@@ -1222,9 +1228,6 @@ NS_StackWalk(NS_WalkStackCallback aCallback, uint32_t aSkipFrames,
+ #elif defined(HAVE__UNWIND_BACKTRACE)
+
+ // libgcc_s.so symbols _Unwind_Backtrace@@GCC_3.3 and _Unwind_GetIP@@GCC_3.0
+-#ifndef _GNU_SOURCE
+-#define _GNU_SOURCE
+-#endif
+ #include <unwind.h>
+
+ struct unwind_info {
diff --git a/www/firefox-esr/files/patch-clang32-libc++-visibility-hack b/www/firefox-esr/files/patch-clang32-libc++-visibility-hack
deleted file mode 100644
index ccada32cbee3..000000000000
--- a/www/firefox-esr/files/patch-clang32-libc++-visibility-hack
+++ /dev/null
@@ -1,38 +0,0 @@
---- configure.in~
-+++ configure.in
-@@ -2855,6 +2855,7 @@ EOF
- #pragma GCC visibility push(hidden)
- #pragma GCC visibility push(default)
- #include <string.h>
-+#include <iterator>
- #pragma GCC visibility pop
-
- __attribute__ ((visibility ("default"))) void Func() {
-@@ -2863,7 +2864,7 @@ __attribute__ ((visibility ("default"))) void Func() {
- }
- EOF
- ac_cv_have_visibility_builtin_bug=no
-- if ! ${CC-cc} ${CFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -O2 -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
-+ if ! ${CXX-c++} ${CXXFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -O2 -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
- ac_cv_have_visibility_builtin_bug=yes
- else
- if test `grep -c "@PLT" conftest.S` = 0; then
---- js/src/configure.in~
-+++ js/src/configure.in
-@@ -2855,6 +2855,7 @@ EOF
- #pragma GCC visibility push(hidden)
- #pragma GCC visibility push(default)
- #include <string.h>
-+#include <iterator>
- #pragma GCC visibility pop
-
- __attribute__ ((visibility ("default"))) void Func() {
-@@ -2863,7 +2864,7 @@ __attribute__ ((visibility ("default"))) void Func() {
- }
- EOF
- ac_cv_have_visibility_builtin_bug=no
-- if ! ${CC-cc} ${CFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -O2 -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
-+ if ! ${CXX-c++} ${CXXFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -O2 -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
- ac_cv_have_visibility_builtin_bug=yes
- else
- if test `grep -c "@PLT" conftest.S` = 0; then
diff --git a/www/firefox-esr/files/patch-clang34-disable-stdcall b/www/firefox-esr/files/patch-clang34-disable-stdcall
new file mode 100644
index 000000000000..8f4bb31b9ccd
--- /dev/null
+++ b/www/firefox-esr/files/patch-clang34-disable-stdcall
@@ -0,0 +1,13 @@
+# http://llvm.org/bugs/show_bug.cgi?id=19007
+
+--- xpcom/base/nscore.h~
++++ xpcom/base/nscore.h
+@@ -110,7 +110,7 @@
+ * NS_HIDDEN_(int) NS_FASTCALL func2(char *foo);
+ */
+
+-#if defined(__i386__) && defined(__GNUC__) && !defined(XP_OS2)
++#if defined(__i386__) && defined(__GNUC__) && !defined(XP_OS2) && !(defined(__clang__) && __clang_major__ == 3 && __clang_minor__ == 4 && __clang_patchlevel__ == 0)
+ #define NS_FASTCALL __attribute__ ((regparm (3), stdcall))
+ #define NS_CONSTRUCTOR_FASTCALL __attribute__ ((regparm (3), stdcall))
+ #elif defined(XP_WIN) && !defined(_WIN64)
diff --git a/www/firefox-esr/files/patch-memory-jemalloc-Makefile.in b/www/firefox-esr/files/patch-memory-jemalloc-Makefile.in
new file mode 100644
index 000000000000..e02b050cbb1d
--- /dev/null
+++ b/www/firefox-esr/files/patch-memory-jemalloc-Makefile.in
@@ -0,0 +1,10 @@
+--- memory/jemalloc/Makefile.in~
++++ memory/jemalloc/Makefile.in
+@@ -12,3 +12,7 @@ include $(topsrcdir)/config/rules.mk
+ ifdef GNU_CC
+ CFLAGS += -std=gnu99
+ endif
++
++# XXX startup crash workaround for gcc47 on amd64
++jemalloc.$(OBJ_SUFFIX): OS_CFLAGS := $(filter-out -O3 -Ofast,$(OS_CFLAGS))
++jemalloc.$(OBJ_SUFFIX): MOZ_OPTIMIZE_FLAGS=
diff --git a/www/firefox-esr/files/patch-z-bug847568 b/www/firefox-esr/files/patch-z-bug847568
new file mode 100644
index 000000000000..14f7e151aa94
--- /dev/null
+++ b/www/firefox-esr/files/patch-z-bug847568
@@ -0,0 +1,234 @@
+# Allow building against system-wide graphite2/harfbuzz.
+
+diff --git config/Makefile.in config/Makefile.in
+index 14bfc0d..5383399 100644
+--- config/Makefile.in
++++ config/Makefile.in
+@@ -77,6 +77,8 @@ export:: $(export-preqs)
+ -DMOZ_NATIVE_LIBEVENT=$(MOZ_NATIVE_LIBEVENT) \
+ -DMOZ_NATIVE_LIBVPX=$(MOZ_NATIVE_LIBVPX) \
+ -DMOZ_NATIVE_ICU=$(MOZ_NATIVE_ICU) \
++ -DMOZ_NATIVE_GRAPHITE2=$(MOZ_NATIVE_GRAPHITE2) \
++ -DMOZ_NATIVE_HARFBUZZ=$(MOZ_NATIVE_HARFBUZZ) \
+ $(srcdir)/system-headers | $(PERL) $(topsrcdir)/nsprpub/config/make-system-wrappers.pl system_wrappers
+ $(INSTALL) system_wrappers $(DIST)
+
+diff --git config/system-headers config/system-headers
+index 126391e..b711fc3 100644
+--- config/system-headers
++++ config/system-headers
+@@ -1144,3 +1144,11 @@ unicode/utypes.h
+ #endif
+ libutil.h
+ unwind.h
++#if MOZ_NATIVE_GRAPHITE2==1
++graphite2/Font.h
++graphite2/Segment.h
++#endif
++#if MOZ_NATIVE_HARFBUZZ==1
++harfbuzz/hb-ot.h
++harfbuzz/hb.h
++#endif
+diff --git configure.in configure.in
+index bbc7b40..1747206 100644
+--- configure.in
++++ configure.in
+@@ -7830,6 +7830,38 @@ if test "$USE_FC_FREETYPE"; then
+ fi
+
+ dnl ========================================================
++dnl Check for graphite2 and harfbuzz
++dnl ========================================================
++
++MOZ_ARG_WITH_BOOL(system-harfbuzz,
++[ --with-system-harfbuzz Use system harfbuzz (located with pkgconfig)],
++MOZ_NATIVE_HARFBUZZ=1,
++MOZ_NATIVE_HARFBUZZ= )
++
++if test -n "$MOZ_NATIVE_HARFBUZZ"; then
++ PKG_CHECK_MODULES(MOZ_HARFBUZZ, harfbuzz >= 0.9.16)
++else
++ MOZ_HARFBUZZ_LIBS='$(DEPTH)/gfx/harfbuzz/src/$(LIB_PREFIX)mozharfbuzz.$(LIB_SUFFIX)'
++fi
++AC_SUBST(MOZ_NATIVE_HARFBUZZ)
++AC_SUBST(MOZ_HARFBUZZ_CFLAGS)
++AC_SUBST(MOZ_HARFBUZZ_LIBS)
++
++MOZ_ARG_WITH_BOOL(system-graphite2,
++[ --with-system-graphite2 Use system graphite2 (located with pkgconfig)],
++MOZ_NATIVE_GRAPHITE2=1,
++MOZ_NATIVE_GRAPHITE2= )
++
++if test -n "$MOZ_NATIVE_GRAPHITE2"; then
++ PKG_CHECK_MODULES(MOZ_GRAPHITE, graphite2 >= 1.2.3)
++else
++ MOZ_GRAPHITE_LIBS='$(DEPTH)/gfx/graphite2/src/$(LIB_PREFIX)mozgraphite2.$(LIB_SUFFIX)'
++fi
++AC_SUBST(MOZ_NATIVE_GRAPHITE2)
++AC_SUBST(MOZ_GRAPHITE_CFLAGS)
++AC_SUBST(MOZ_GRAPHITE_LIBS)
++
++dnl ========================================================
+ dnl Check for pixman and cairo
+ dnl ========================================================
+
+@@ -8379,18 +8412,6 @@ QCMS_LIBS='$(DEPTH)/gfx/qcms/$(LIB_PREFI
+ AC_SUBST(QCMS_LIBS)
+
+ dnl ========================================================
+-dnl HarfBuzz
+-dnl ========================================================
+-MOZ_HARFBUZZ_LIBS='$(DEPTH)/gfx/harfbuzz/src/$(LIB_PREFIX)mozharfbuzz.$(LIB_SUFFIX)'
+-AC_SUBST(MOZ_HARFBUZZ_LIBS)
+-
+-dnl ========================================================
+-dnl SIL Graphite
+-dnl ========================================================
+-MOZ_GRAPHITE_LIBS='$(DEPTH)/gfx/graphite2/src/$(LIB_PREFIX)mozgraphite2.$(LIB_SUFFIX)'
+-AC_SUBST(MOZ_GRAPHITE_LIBS)
+-
+-dnl ========================================================
+ dnl OTS
+ dnl ========================================================
+ MOZ_OTS_LIBS='$(DEPTH)/gfx/ots/src/$(LIB_PREFIX)mozots.$(LIB_SUFFIX)'
+diff --git content/base/src/Makefile.in content/base/src/Makefile.in
+index a618096..596901a 100644
+--- content/base/src/Makefile.in
++++ content/base/src/Makefile.in
+@@ -5,6 +5,10 @@
+
+ include $(topsrcdir)/config/rules.mk
+
++ifdef MOZ_NATIVE_HARFBUZZ
++nsContentUtils.$(OBJ_SUFFIX): CXXFLAGS+=$(MOZ_HARFBUZZ_CFLAGS)
++endif
++
+ # gcc requires -msse2 for this file since it uses SSE2 intrinsics. (See bug
+ # 585538 comment 12.)
+ ifneq (,$(INTEL_ARCHITECTURE))
+diff --git gfx/moz.build gfx/moz.build
+index 519aa46..6929751 100644
+--- gfx/moz.build
++++ gfx/moz.build
+@@ -7,6 +7,12 @@
+ if CONFIG['MOZ_TREE_CAIRO']:
+ DIRS += ['cairo']
+
++if not CONFIG['MOZ_NATIVE_GRAPHITE2']:
++ DIRS += ['graphite2/src' ]
++
++if not CONFIG['MOZ_NATIVE_HARFBUZZ']:
++ DIRS += ['harfbuzz/src']
++
+ DIRS += [
+ '2d',
+ 'ycbcr',
+@@ -15,8 +21,6 @@ DIRS += [
+ 'qcms',
+ 'gl',
+ 'layers',
+- 'graphite2/src',
+- 'harfbuzz/src',
+ 'ots/src',
+ 'thebes',
+ 'ipc',
+diff --git gfx/skia/Makefile.in gfx/skia/Makefile.in
+index 07a77a3..067f7bd 100644
+--- gfx/skia/Makefile.in
++++ gfx/skia/Makefile.in
+@@ -15,6 +15,10 @@ ifeq (qt,$(MOZ_WIDGET_TOOLKIT))
+ OS_CXXFLAGS += $(MOZ_CAIRO_CFLAGS) $(MOZ_PANGO_CFLAGS) $(CAIRO_FT_CFLAGS)
+ endif
+
++ifdef MOZ_NATIVE_HARFBUZZ
++OS_CXXFLAGS += $(MOZ_HARFBUZZ_CFLAGS)
++endif
++
+ include $(topsrcdir)/config/rules.mk
+
+ ifneq (,$(INTEL_ARCHITECTURE))
+diff --git gfx/thebes/Makefile.in gfx/thebes/Makefile.in
+index e9f6b6c..0df2d8d 100644
+--- gfx/thebes/Makefile.in
++++ gfx/thebes/Makefile.in
+@@ -13,6 +13,14 @@ DEFINES := $(filter-out -DUNICODE,$(DEFINES))
+ CXXFLAGS += $(MOZ_CAIRO_CFLAGS) $(TK_CFLAGS)
+ CFLAGS += $(MOZ_CAIRO_CFLAGS) $(TK_CFLAGS)
+
++ifdef MOZ_NATIVE_GRAPHITE2
++CXXFLAGS += $(MOZ_GRAPHITE_CFLAGS)
++endif
++
++ifdef MOZ_NATIVE_HARFBUZZ
++CXXFLAGS += $(MOZ_HARFBUZZ_CFLAGS)
++endif
++
+ ifeq ($(MOZ_WIDGET_TOOLKIT),android)
+ CXXFLAGS += $(CAIRO_FT_CFLAGS)
+ endif
+diff --git intl/unicharutil/util/Makefile.in intl/unicharutil/util/Makefile.in
+index f6b9f7c..11c44f4 100644
+--- intl/unicharutil/util/Makefile.in
++++ intl/unicharutil/util/Makefile.in
+@@ -21,3 +21,7 @@ ifdef _MSC_VER
+ OS_COMPILE_CXXFLAGS += -Zl
+ OS_COMPILE_CFLAGS += -Zl
+ endif
++
++ifdef MOZ_NATIVE_HARFBUZZ
++nsUnicodePropertyData.$(OBJ_SUFFIX): CXXFLAGS+=$(MOZ_HARFBUZZ_CFLAGS)
++endif
+diff --git layout/media/Makefile.in layout/media/Makefile.in
+index 1cacbd7..a8cd156 100644
+--- layout/media/Makefile.in
++++ layout/media/Makefile.in
+@@ -18,10 +18,16 @@ endif
+ SHARED_LIBRARY_LIBS = \
+ $(MOZ_OTS_LIBS) \
+ $(QCMS_LIBS) \
+- $(MOZ_GRAPHITE_LIBS) \
+- $(MOZ_HARFBUZZ_LIBS) \
+ $(NULL)
+
++ifndef MOZ_NATIVE_GRAPHITE2
++SHARED_LIBRARY_LIBS += $(MOZ_GRAPHITE_LIBS)
++endif
++
++ifndef MOZ_NATIVE_HARFBUZZ
++SHARED_LIBRARY_LIBS += $(MOZ_HARFBUZZ_LIBS)
++endif
++
+ ifdef MOZ_TREE_CAIRO
+ SHARED_LIBRARY_LIBS += $(MOZ_CAIRO_LIBS)
+ endif
+diff --git netwerk/dns/Makefile.in netwerk/dns/Makefile.in
+index 1cacbd7..a8cd156 100644
+--- netwerk/dns/Makefile.in
++++ netwerk/dns/Makefile.in
+@@ -9,3 +9,7 @@ include $(topsrcdir)/config/rules.mk
+ # for effective TLD data.
+ etld_data.inc: $(srcdir)/prepare_tlds.py $(srcdir)/effective_tld_names.dat
+ $(PYTHON) $(srcdir)/prepare_tlds.py $(srcdir)/effective_tld_names.dat > etld_data.inc
++
++ifdef MOZ_NATIVE_HARFBUZZ
++nsIDNService.$(OBJ_SUFFIX): CXXFLAGS+=$(MOZ_HARFBUZZ_CFLAGS)
++endif
+diff --git toolkit/library/Makefile.in toolkit/library/Makefile.in
+index 007f272..27f488e 100644
+--- toolkit/library/Makefile.in
++++ toolkit/library/Makefile.in
+@@ -103,6 +103,14 @@ ifndef MOZ_TREE_PIXMAN
+ EXTRA_DSO_LDOPTS += $(MOZ_PIXMAN_LIBS)
+ endif
+
++ifdef MOZ_NATIVE_GRAPHITE2
++EXTRA_DSO_LDOPTS += $(MOZ_GRAPHITE_LIBS)
++endif
++
++ifdef MOZ_NATIVE_HARFBUZZ
++EXTRA_DSO_LDOPTS += $(MOZ_HARFBUZZ_LIBS)
++endif
++
+ ifdef MOZ_DMD
+ EXTRA_DSO_LDOPTS += $(call EXPAND_LIBNAME_PATH,dmd,$(DIST)/lib)
+ endif
diff --git a/www/firefox-esr/files/patch-zz-bug517422 b/www/firefox-esr/files/patch-zz-bug517422
new file mode 100644
index 000000000000..85db66a2acdc
--- /dev/null
+++ b/www/firefox-esr/files/patch-zz-bug517422
@@ -0,0 +1,324 @@
+# Allow building against system-wide ogg/vorbis/opus.
+
+diff --git config/Makefile.in config/Makefile.in
+index 5383399..4393ae8 100644
+--- config/Makefile.in
++++ config/Makefile.in
+@@ -79,6 +79,9 @@ export:: $(export-preqs)
+ -DMOZ_NATIVE_ICU=$(MOZ_NATIVE_ICU) \
+ -DMOZ_NATIVE_GRAPHITE2=$(MOZ_NATIVE_GRAPHITE2) \
+ -DMOZ_NATIVE_HARFBUZZ=$(MOZ_NATIVE_HARFBUZZ) \
++ -DMOZ_NATIVE_OGG=$(MOZ_NATIVE_OGG) \
++ -DMOZ_NATIVE_VORBIS=$(MOZ_NATIVE_VORBIS) \
++ -DMOZ_NATIVE_OPUS=$(MOZ_NATIVE_OPUS) \
+ $(srcdir)/system-headers | $(PERL) $(topsrcdir)/nsprpub/config/make-system-wrappers.pl system_wrappers
+ $(INSTALL) system_wrappers $(DIST)
+
+diff --git toolkit/toolkit.mozbuild toolkit/toolkit.mozbuild
+index c22a36c..2febb45 100644
+--- toolkit/toolkit.mozbuild
++++ toolkit/toolkit.mozbuild
+@@ -64,13 +64,13 @@ add_tier_dir('platform', 'rdf')
+ if CONFIG['MOZ_JSDEBUGGER']:
+ add_tier_dir('platform', 'js/jsd')
+
+-if CONFIG['MOZ_VORBIS']:
++if CONFIG['MOZ_VORBIS'] and not CONFIG['MOZ_NATIVE_VORBIS']:
+ add_tier_dir('platform', 'media/libvorbis')
+
+ if CONFIG['MOZ_TREMOR']:
+ add_tier_dir('platform', 'media/libtremor')
+
+-if CONFIG['MOZ_OPUS']:
++if CONFIG['MOZ_OPUS'] and not CONFIG['MOZ_NATIVE_OPUS']:
+ add_tier_dir('platform', 'media/libopus')
+
+ if CONFIG['MOZ_WEBM']:
+@@ -82,7 +82,9 @@ if CONFIG['MOZ_VP8'] and not CONFIG['MOZ
+ add_tier_dir('platform', 'media/libvpx')
+
+ if CONFIG['MOZ_OGG']:
+- add_tier_dir('platform', ['media/libogg', 'media/libtheora'])
++ if not CONFIG['MOZ_NATIVE_OGG']:
++ add_tier_dir('platform', 'media/libogg')
++ add_tier_dir('platform', 'media/libtheora')
+
+ if CONFIG['MOZ_WEBRTC']:
+ add_tier_dir('platform', [
+diff --git config/system-headers config/system-headers
+index b711fc3..fd3c14f 100644
+--- config/system-headers
++++ config/system-headers
+@@ -1152,3 +1152,17 @@ graphite2/Segment.h
+ harfbuzz/hb-ot.h
+ harfbuzz/hb.h
+ #endif
++#if MOZ_NATIVE_OGG==1
++ogg/ogg.h
++ogg/os_types.h
++#endif
++#if MOZ_NATIVE_VORBIS==1
++vorbis/codec.h
++vorbis/vorbisenc.h
++#endif
++#if MOZ_NATIVE_OPUS==1
++opus.h
++opus_multistream.h
++opus/opus.h
++opus/opus_multistream.h
++#endif
+diff --git configure.in configure.in
+index df49287..05e97ff 100644
+--- configure.in
++++ configure.in
+@@ -5143,6 +5143,40 @@ if test -n "$MOZ_OGG"; then
+ fi
+
+ dnl ========================================================
++dnl Check for libogg
++dnl ========================================================
++
++MOZ_ARG_WITH_BOOL(system-ogg,
++[ --with-system-ogg Use system libogg (located with pkgconfig)],
++MOZ_NATIVE_OGG=1,
++MOZ_NATIVE_OGG= )
++
++if test -n "$MOZ_NATIVE_OGG"; then
++ PKG_CHECK_MODULES(MOZ_OGG, ogg >= 1.2.1)
++fi
++
++AC_SUBST(MOZ_NATIVE_OGG)
++AC_SUBST(MOZ_OGG_CFLAGS)
++AC_SUBST(MOZ_OGG_LIBS)
++
++dnl ========================================================
++dnl Check for libvorbis
++dnl ========================================================
++
++MOZ_ARG_WITH_BOOL(system-vorbis,
++[ --with-system-vorbis Use system libvorbis (located with pkgconfig)],
++MOZ_NATIVE_VORBIS=1,
++MOZ_NATIVE_VORBIS= )
++
++if test -n "$MOZ_NATIVE_VORBIS"; then
++ PKG_CHECK_MODULES(MOZ_VORBIS, vorbis vorbisenc >= 1.3.4)
++fi
++
++AC_SUBST(MOZ_NATIVE_VORBIS)
++AC_SUBST(MOZ_VORBIS_CFLAGS)
++AC_SUBST(MOZ_VORBIS_LIBS)
++
++dnl ========================================================
+ dnl = Disable Opus audio codec support
+ dnl ========================================================
+ MOZ_ARG_DISABLE_BOOL(opus,
+@@ -5151,6 +5185,25 @@ MOZ_ARG_DISABLE_BOOL(opus,
+ MOZ_OPUS=1)
+
+ dnl ========================================================
++dnl Check for libopus
++dnl ========================================================
++
++MOZ_ARG_WITH_BOOL(system-opus,
++[ --with-system-opus Use system libopus (located with pkgconfig)],
++MOZ_NATIVE_OPUS=1,
++MOZ_NATIVE_OPUS= )
++
++if test -n "$MOZ_NATIVE_OPUS"; then
++ PKG_CHECK_MODULES(MOZ_OPUS, opus >= 1.1)
++else
++ MOZ_OPUS_CFLAGS='-I$(topsrcdir)/media/libopus/include'
++fi
++
++AC_SUBST(MOZ_NATIVE_OPUS)
++AC_SUBST(MOZ_OPUS_CFLAGS)
++AC_SUBST(MOZ_OPUS_LIBS)
++
++dnl ========================================================
+ dnl = Disable VP8 decoder support
+ dnl ========================================================
+ MOZ_ARG_DISABLE_BOOL(webm,
+diff --git content/media/Makefile.in content/media/Makefile.in
+index 68f360e..76f2d57 100644
+--- content/media/Makefile.in
++++ content/media/Makefile.in
+@@ -7,4 +7,16 @@ include $(topsrcdir)/config/rules.mk
+ CFLAGS += $(GSTREAMER_CFLAGS)
+ CXXFLAGS += $(GSTREAMER_CFLAGS)
+
++ifdef MOZ_NATIVE_OGG
++CXXFLAGS += $(MOZ_OGG_CFLAGS)
++endif
++
++ifdef MOZ_NATIVE_VORBIS
++CXXFLAGS += $(MOZ_VORBIS_CFLAGS)
++endif
++
++ifdef MOZ_NATIVE_OPUS
++CXXFLAGS += $(MOZ_OPUS_CFLAGS)
++endif
++
+ AudioNodeEngineNEON.$(OBJ_SUFFIX): CXXFLAGS += -mfpu=neon
+diff --git layout/media/Makefile.in layout/media/Makefile.in
+index 1cacbd7..a8cd156 100644
+--- layout/media/Makefile.in
++++ layout/media/Makefile.in
+@@ -30,12 +36,21 @@ ifdef MOZ_TREE_PIXMAN
+ SHARED_LIBRARY_LIBS += $(MOZ_PIXMAN_LIBS)
+ endif
+
++ifdef MOZ_OGG
++ifndef MOZ_NATIVE_OGG
++SHARED_LIBRARY_LIBS += \
++ $(DEPTH)/media/libogg/src/$(LIB_PREFIX)ogg.$(LIB_SUFFIX) \
++ $(NULL)
++endif
++endif
++
+ ifdef MOZ_VORBIS
++ifndef MOZ_NATIVE_VORBIS
+ SHARED_LIBRARY_LIBS += \
+ $(DEPTH)/media/libvorbis/lib/$(LIB_PREFIX)vorbis.$(LIB_SUFFIX) \
+- $(DEPTH)/media/libogg/src/$(LIB_PREFIX)ogg.$(LIB_SUFFIX) \
+ $(NULL)
+ endif
++endif
+
+ ifdef MOZ_TREMOR
+ SHARED_LIBRARY_LIBS += \
+@@ -51,10 +66,12 @@ SHARED_LIBRARY_LIBS += \
+ endif
+
+ ifdef MOZ_OPUS
++ifndef MOZ_NATIVE_OPUS
+ SHARED_LIBRARY_LIBS += \
+ $(DEPTH)/media/libopus/$(LIB_PREFIX)opus.$(LIB_SUFFIX) \
+ $(NULL)
+ endif
++endif
+
+ ifdef MOZ_WEBM
+ SHARED_LIBRARY_LIBS += \
+diff --git media/libtheora/Makefile.in media/libtheora/Makefile.in
+new file mode 100644
+index 0000000..1f02dc0
+--- /dev/null
++++ media/libtheora/Makefile.in
+@@ -0,0 +1,16 @@
++# This Source Code Form is subject to the terms of the Mozilla Public
++# License, v. 2.0. If a copy of the MPL was not distributed with this
++# file, You can obtain one at http://mozilla.org/MPL/2.0/.
++
++DEPTH = @DEPTH@
++topsrcdir = @top_srcdir@
++srcdir = @srcdir@
++VPATH = @srcdir@
++
++include $(DEPTH)/config/autoconf.mk
++
++include $(topsrcdir)/config/rules.mk
++
++ifdef MOZ_NATIVE_OGG
++CFLAGS += $(MOZ_OGG_CFLAGS)
++endif
+diff --git media/libtremor/Makefile.in media/libtremor/Makefile.in
+new file mode 100644
+index 0000000..1f02dc0
+--- /dev/null
++++ media/libtremor/Makefile.in
+@@ -0,0 +1,16 @@
++# This Source Code Form is subject to the terms of the Mozilla Public
++# License, v. 2.0. If a copy of the MPL was not distributed with this
++# file, You can obtain one at http://mozilla.org/MPL/2.0/.
++
++DEPTH = @DEPTH@
++topsrcdir = @top_srcdir@
++srcdir = @srcdir@
++VPATH = @srcdir@
++
++include $(DEPTH)/config/autoconf.mk
++
++include $(topsrcdir)/config/rules.mk
++
++ifdef MOZ_NATIVE_OGG
++CFLAGS += $(MOZ_OGG_CFLAGS)
++endif
+diff --git media/libvorbis/Makefile.in media/libvorbis/Makefile.in
+new file mode 100644
+index 0000000..1f02dc0
+--- /dev/null
++++ media/libvorbis/Makefile.in
+@@ -0,0 +1,16 @@
++# This Source Code Form is subject to the terms of the Mozilla Public
++# License, v. 2.0. If a copy of the MPL was not distributed with this
++# file, You can obtain one at http://mozilla.org/MPL/2.0/.
++
++DEPTH = @DEPTH@
++topsrcdir = @top_srcdir@
++srcdir = @srcdir@
++VPATH = @srcdir@
++
++include $(DEPTH)/config/autoconf.mk
++
++include $(topsrcdir)/config/rules.mk
++
++ifdef MOZ_NATIVE_OGG
++CFLAGS += $(MOZ_OGG_CFLAGS)
++endif
+diff --git media/webrtc/signaling/test/Makefile.in media/webrtc/signaling/test/Makefile.in
+index c5e82c4..91ef86a 100644
+--- media/webrtc/signaling/test/Makefile.in
++++ media/webrtc/signaling/test/Makefile.in
+@@ -48,6 +48,12 @@ LIBS += \
+ $(NULL)
+ endif
+
++ifdef MOZ_NATIVE_OPUS
++LIBS += \
++ $(MOZ_OPUS_LIBS) \
++ $(NULL)
++endif
++
+ ifdef MOZ_NATIVE_LIBVPX
+ LIBS += \
+ $(MOZ_LIBVPX_LIBS) \
+diff --git media/webrtc/trunk/webrtc/modules/audio_coding/codecs/opus/opus.gypi media/webrtc/trunk/webrtc/modules/audio_coding/codecs/opus/opus.gypi
+index 00e77e7..55f48ab 100644
+--- media/webrtc/trunk/webrtc/modules/audio_coding/codecs/opus/opus.gypi
++++ media/webrtc/trunk/webrtc/modules/audio_coding/codecs/opus/opus.gypi
+@@ -14,9 +14,9 @@
+ 'conditions': [
+ ['build_with_mozilla==1', {
+ # Mozilla provides its own build of the opus library.
+- 'include_dirs': [
+- '$(DIST)/include/opus',
+- ]
++ 'cflags_mozilla': [
++ '$(MOZ_OPUS_CFLAGS)',
++ ],
+ }, {
+ 'dependencies': [
+ '<(DEPTH)/third_party/opus/opus.gyp:opus'
+diff --git toolkit/library/Makefile.in toolkit/library/Makefile.in
+index 27f488e..cd27084 100644
+--- toolkit/library/Makefile.in
++++ toolkit/library/Makefile.in
+@@ -91,6 +91,18 @@ ifdef MOZ_NATIVE_HUNSPELL
+ EXTRA_DSO_LDOPTS += $(MOZ_HUNSPELL_LIBS)
+ endif
+
++ifdef MOZ_NATIVE_OGG
++EXTRA_DSO_LDOPTS += $(MOZ_OGG_LIBS)
++endif
++
++ifdef MOZ_NATIVE_VORBIS
++EXTRA_DSO_LDOPTS += $(MOZ_VORBIS_LIBS)
++endif
++
++ifdef MOZ_NATIVE_OPUS
++EXTRA_DSO_LDOPTS += $(MOZ_OPUS_LIBS)
++endif
++
+ ifdef MOZ_NATIVE_LIBEVENT
+ EXTRA_DSO_LDOPTS += $(MOZ_LIBEVENT_LIBS)
+ endif
diff --git a/www/firefox-esr/pkg-message b/www/firefox-esr/pkg-message
index 33841ae90f29..7a3e4ea85d32 100644
--- a/www/firefox-esr/pkg-message
+++ b/www/firefox-esr/pkg-message
@@ -16,8 +16,17 @@ The SSH server on remote_host must allow pub key authentication.
Firefox and HTML5
-Certain functions used to display HTML5 elements need the sem module
-only on 8.x releases.
+H.264 or MP3 playback may fail due to ffmpeg/libav bug with one of
+the following messages on the terminal
+
+ (gst-plugin-scanner:13877): GStreamer-WARNING **: Failed to load plugin '/usr/local/lib/gstreamer-0.10/libgstffmpeg.so': /usr/local/lib/gstreamer-0.10/libgstffmpeg.so: Undefined symbol "ff_mlp_init_x86"
+ (gst-plugin-scanner:42518): GStreamer-WARNING **: Failed to load plugin '/usr/local/lib/gstreamer-0.10/libgstffmpeg.so': /usr/local/lib/gstreamer-0.10/libgstffmpeg.so: Undefined symbol "ff_deinterlace_line_mmx"
+
+If you happen to be affected please apply the fix in ports/181964 and
+rebuild the ports.
+
+Also, certain functions used to display HTML5 elements need the sem(4)
+module but only on 8.x releases (or before r201546).
If your Firefox crashes with the following message while viewing a
HTML5 page:
diff --git a/www/firefox-i18n/Makefile b/www/firefox-i18n/Makefile
index 323696beca3d..69f0f33f95e6 100644
--- a/www/firefox-i18n/Makefile
+++ b/www/firefox-i18n/Makefile
@@ -2,8 +2,7 @@
# $FreeBSD$
PORTNAME= firefox-i18n
-PORTVERSION= 27.0.1
-PORTREVISION= 1
+PORTVERSION= 28.0
CATEGORIES= www
MASTER_SITES= MOZILLA/${PORTNAME:S|-i18n||}/releases/${PORTVERSION}/linux-i686/xpi
PKGNAMEPREFIX=
@@ -16,7 +15,7 @@ COMMENT= Localized interface for Firefox
EXTRACT_DEPENDS= zip:${PORTSDIR}/archivers/zip
USES= zip:infozip
-USE_FIREFOX= 27
+USE_FIREFOX= 28
USE_XPI= firefox linux-firefox
NO_ARCH= yes
diff --git a/www/firefox-i18n/distinfo b/www/firefox-i18n/distinfo
index a5981faaa627..6cee9edc94ab 100644
--- a/www/firefox-i18n/distinfo
+++ b/www/firefox-i18n/distinfo
@@ -1,170 +1,170 @@
-SHA256 (xpi/firefox-i18n-27.0.1/ach.xpi) = 7fd51b61fa65c8b97c3fb023df17f3eff86856fb12b5a81a8f384c3adc8a008c
-SIZE (xpi/firefox-i18n-27.0.1/ach.xpi) = 355298
-SHA256 (xpi/firefox-i18n-27.0.1/af.xpi) = 3c24a0b84731383c0adbaa1740cc70a9e303e3f9d4ebcdf30746715cb46d4251
-SIZE (xpi/firefox-i18n-27.0.1/af.xpi) = 348847
-SHA256 (xpi/firefox-i18n-27.0.1/ar.xpi) = e5b01b8bdc044f5e82b1838b7020943ddb0f2073d4012223a5885524c3418b59
-SIZE (xpi/firefox-i18n-27.0.1/ar.xpi) = 378145
-SHA256 (xpi/firefox-i18n-27.0.1/as.xpi) = 57c1f1d5be4656eba68364ee932db93dc38c97bc34662381c64a3bf970ba0e08
-SIZE (xpi/firefox-i18n-27.0.1/as.xpi) = 400777
-SHA256 (xpi/firefox-i18n-27.0.1/ast.xpi) = db854e118d2496742c40cdf0e79f5960755a4b17f217fbdabd68b4457ac515fe
-SIZE (xpi/firefox-i18n-27.0.1/ast.xpi) = 309187
-SHA256 (xpi/firefox-i18n-27.0.1/be.xpi) = 014744016427daf5108b5cf8718e0bfe5dbdddfd1cdbcbb5eaff15e00b4b909c
-SIZE (xpi/firefox-i18n-27.0.1/be.xpi) = 332358
-SHA256 (xpi/firefox-i18n-27.0.1/bg.xpi) = 90790e53f3376ba63de99ee328152e1716a5213f4b6d8808f854522c68e00752
-SIZE (xpi/firefox-i18n-27.0.1/bg.xpi) = 389842
-SHA256 (xpi/firefox-i18n-27.0.1/bn-BD.xpi) = f9599dcdc3a93ca3723f12dbda26aeae0cb8101f9afee7bf64e59d22483ecda0
-SIZE (xpi/firefox-i18n-27.0.1/bn-BD.xpi) = 410846
-SHA256 (xpi/firefox-i18n-27.0.1/bn-IN.xpi) = ff339c0e3848905483b2c43ce3a9c8f9c6a34178a9b7ba4a12a0594fbeadd0bc
-SIZE (xpi/firefox-i18n-27.0.1/bn-IN.xpi) = 407699
-SHA256 (xpi/firefox-i18n-27.0.1/br.xpi) = 0381b7351d5ee608e57f34533c7bac47a34bf9e8d3fbb06e3e72227ae601ab00
-SIZE (xpi/firefox-i18n-27.0.1/br.xpi) = 351228
-SHA256 (xpi/firefox-i18n-27.0.1/bs.xpi) = bd7196a9a26540bdad362a8d0231c28eb5aa40b11ce8651f07b62443d10b34d7
-SIZE (xpi/firefox-i18n-27.0.1/bs.xpi) = 354539
-SHA256 (xpi/firefox-i18n-27.0.1/ca.xpi) = fffe916f3425bec9abf9b140a2764f41904b1262da3e2aff73b45b72f7ce519d
-SIZE (xpi/firefox-i18n-27.0.1/ca.xpi) = 357569
-SHA256 (xpi/firefox-i18n-27.0.1/cs.xpi) = 80cfc2967b82d75f0f35fae680b1d8e1b040efa370b194cc69fc175cfc6ebbff
-SIZE (xpi/firefox-i18n-27.0.1/cs.xpi) = 353325
-SHA256 (xpi/firefox-i18n-27.0.1/csb.xpi) = 7f731c41b280dc32467dc47eac7f9e56710152cbbdb54b41208809f0dba2e26f
-SIZE (xpi/firefox-i18n-27.0.1/csb.xpi) = 343114
-SHA256 (xpi/firefox-i18n-27.0.1/cy.xpi) = ed58e9e4357dbd8c227853f5479657e507a55c66ee8d49fe2235e05ca4531954
-SIZE (xpi/firefox-i18n-27.0.1/cy.xpi) = 351734
-SHA256 (xpi/firefox-i18n-27.0.1/da.xpi) = 8631a1bab826eb59ad80e9bd36c7b6e74ba020ca3a30e66db37b23cb9287fa59
-SIZE (xpi/firefox-i18n-27.0.1/da.xpi) = 343539
-SHA256 (xpi/firefox-i18n-27.0.1/de.xpi) = 76e69f0ca67743fbf353b6140882d61bb453c665c7c94fb1ef588850e4a823fe
-SIZE (xpi/firefox-i18n-27.0.1/de.xpi) = 345771
-SHA256 (xpi/firefox-i18n-27.0.1/el.xpi) = 33c44d716de9a0cd094683194d42b48abd0284e56a5fdf09ab727041be60015d
-SIZE (xpi/firefox-i18n-27.0.1/el.xpi) = 378045
-SHA256 (xpi/firefox-i18n-27.0.1/en-GB.xpi) = bcdbf20656d7c651aa4c01c0ba8955e97e1611ad55c9f09d462c35e8f3e86de1
-SIZE (xpi/firefox-i18n-27.0.1/en-GB.xpi) = 337400
-SHA256 (xpi/firefox-i18n-27.0.1/en-US.xpi) = cb0b5e9881ffab4391868f36caff46a9c83d6f730c66e8945f5f801201e6d71e
-SIZE (xpi/firefox-i18n-27.0.1/en-US.xpi) = 335284
-SHA256 (xpi/firefox-i18n-27.0.1/en-ZA.xpi) = 20580717ce76995a13d7e49fca1816d3a90b596d6fbd8b577442b001ec07293b
-SIZE (xpi/firefox-i18n-27.0.1/en-ZA.xpi) = 332018
-SHA256 (xpi/firefox-i18n-27.0.1/eo.xpi) = 5c205cf950441f8e92a183ead11c1c4fdf7b476aacff36333ededaa2409721d5
-SIZE (xpi/firefox-i18n-27.0.1/eo.xpi) = 351110
-SHA256 (xpi/firefox-i18n-27.0.1/es-AR.xpi) = a49b9883cdec950297b5b17657a401c3f99cba6fb2dd7c8ed930c977313f419e
-SIZE (xpi/firefox-i18n-27.0.1/es-AR.xpi) = 354329
-SHA256 (xpi/firefox-i18n-27.0.1/es-CL.xpi) = d9512918c64dc2fadc8b456d636bc843b991d8dda0165f6ff2348b1aaff1cc0b
-SIZE (xpi/firefox-i18n-27.0.1/es-CL.xpi) = 301974
-SHA256 (xpi/firefox-i18n-27.0.1/es-ES.xpi) = a4de8098a9eb283e18e961ed620cd5161c4d53197fc94eed5bc363ab87c5397c
-SIZE (xpi/firefox-i18n-27.0.1/es-ES.xpi) = 293442
-SHA256 (xpi/firefox-i18n-27.0.1/es-MX.xpi) = 0b41fdd43acd650f4168d1636ddb11ddbfc93c812e22ce377c0a8863ada5a455
-SIZE (xpi/firefox-i18n-27.0.1/es-MX.xpi) = 356362
-SHA256 (xpi/firefox-i18n-27.0.1/et.xpi) = 2c058329513bea6292eba9ff6e9a327b0bfad1f18591bcb81d63c9bab3ffd03d
-SIZE (xpi/firefox-i18n-27.0.1/et.xpi) = 343297
-SHA256 (xpi/firefox-i18n-27.0.1/eu.xpi) = a63e66601ef3407058c016e4f3bfc7e3ceba1dc376524b2f93217e34643ed77c
-SIZE (xpi/firefox-i18n-27.0.1/eu.xpi) = 350046
-SHA256 (xpi/firefox-i18n-27.0.1/fa.xpi) = 1490eed610bee140a263ca8416d0d1214441112b0e51e359c24e0dc0a201268f
-SIZE (xpi/firefox-i18n-27.0.1/fa.xpi) = 391168
-SHA256 (xpi/firefox-i18n-27.0.1/ff.xpi) = ee1404e5c8d2ca6a550bf5c8fd9718fbc808ee0b8532532681c1390b8e4c6cb2
-SIZE (xpi/firefox-i18n-27.0.1/ff.xpi) = 348062
-SHA256 (xpi/firefox-i18n-27.0.1/fi.xpi) = 259e791b24a91aef78c99255b771f157b1efc3739d405f41e9c326878835e950
-SIZE (xpi/firefox-i18n-27.0.1/fi.xpi) = 347380
-SHA256 (xpi/firefox-i18n-27.0.1/fr.xpi) = 7d03eb003395feb4fac862b1d0f3737410cd5392041379fa9792a9ed3127b5c7
-SIZE (xpi/firefox-i18n-27.0.1/fr.xpi) = 360467
-SHA256 (xpi/firefox-i18n-27.0.1/fy-NL.xpi) = 35845cda7de27125e1f55b755fbe047ecc4eb43323c35fa6fed0fe6babc92510
-SIZE (xpi/firefox-i18n-27.0.1/fy-NL.xpi) = 356628
-SHA256 (xpi/firefox-i18n-27.0.1/ga-IE.xpi) = 001d37b52e9d2652ee76ce471ec48bc77e6707dc4ad4b9b6598072cc70c2b553
-SIZE (xpi/firefox-i18n-27.0.1/ga-IE.xpi) = 361190
-SHA256 (xpi/firefox-i18n-27.0.1/gd.xpi) = 6972479be553870844a3899c940f8b20f5141da4d379080828ec88640ca2a1ca
-SIZE (xpi/firefox-i18n-27.0.1/gd.xpi) = 357708
-SHA256 (xpi/firefox-i18n-27.0.1/gl.xpi) = fc5b481debae6b1e6cd78bbfb6663b008097f41926e07f0409f4d20481735898
-SIZE (xpi/firefox-i18n-27.0.1/gl.xpi) = 353149
-SHA256 (xpi/firefox-i18n-27.0.1/gu-IN.xpi) = c26284cccbd092f5b088e4e918982cfe226b67e5bbb678ee313fca71c3368937
-SIZE (xpi/firefox-i18n-27.0.1/gu-IN.xpi) = 377592
-SHA256 (xpi/firefox-i18n-27.0.1/he.xpi) = b859423e664179e13a848d8005a8661833110463c8e4d4ab8d90b924aef32e73
-SIZE (xpi/firefox-i18n-27.0.1/he.xpi) = 370012
-SHA256 (xpi/firefox-i18n-27.0.1/hi-IN.xpi) = 924785657676ffe4cb579ff600af27dcf0a83bd578bde615e30bb9ac1aa3b353
-SIZE (xpi/firefox-i18n-27.0.1/hi-IN.xpi) = 396450
-SHA256 (xpi/firefox-i18n-27.0.1/hr.xpi) = 12d4b7d7ddb57f75b4e803c837dde4e5c1e0f89e90ad47f9e0513221480e55d2
-SIZE (xpi/firefox-i18n-27.0.1/hr.xpi) = 357708
-SHA256 (xpi/firefox-i18n-27.0.1/hu.xpi) = c7658a709f2300368a4e41641dcf39563e38488a29d8728bc00c44d0a3f991e5
-SIZE (xpi/firefox-i18n-27.0.1/hu.xpi) = 361928
-SHA256 (xpi/firefox-i18n-27.0.1/hy-AM.xpi) = 3e546cbb23b0cbbc26c0a1e6a755415a1f830860e5f8d0be6021057dbd77ce4f
-SIZE (xpi/firefox-i18n-27.0.1/hy-AM.xpi) = 402982
-SHA256 (xpi/firefox-i18n-27.0.1/id.xpi) = ab18c9facfe79f61be21a5a50353e9aabfc45a8ce3d142f33bfab054f5bcd8af
-SIZE (xpi/firefox-i18n-27.0.1/id.xpi) = 339612
-SHA256 (xpi/firefox-i18n-27.0.1/is.xpi) = 5c5bcd4e320d77825c773d09db994c4ea4bbb06878102fef196d4ab69c54a122
-SIZE (xpi/firefox-i18n-27.0.1/is.xpi) = 346530
-SHA256 (xpi/firefox-i18n-27.0.1/it.xpi) = 9e1a74a199ec59a1ee34683bb372915041cf02b40dc3254b201aa60e7b98e037
-SIZE (xpi/firefox-i18n-27.0.1/it.xpi) = 291091
-SHA256 (xpi/firefox-i18n-27.0.1/ja.xpi) = 33611e4a44b09aa5722469c1435308d7c8deaccb4a85b68ac2d403e982ca3d44
-SIZE (xpi/firefox-i18n-27.0.1/ja.xpi) = 393701
-SHA256 (xpi/firefox-i18n-27.0.1/kk.xpi) = a13e62eac0e4f7b49b5c3ac3086bea943c592aff36af23b51f5dfdb7f1ddb9cb
-SIZE (xpi/firefox-i18n-27.0.1/kk.xpi) = 396374
-SHA256 (xpi/firefox-i18n-27.0.1/km.xpi) = 53bac94b5edb3eb08dd0b798dc9e1fe2de3765682465d5ebb9c91da68fd3c7d0
-SIZE (xpi/firefox-i18n-27.0.1/km.xpi) = 418734
-SHA256 (xpi/firefox-i18n-27.0.1/kn.xpi) = 3f04c7152b4369fd8b053af4a0917a494b8b41a6e8c18ed5c8879b3bbf20ad58
-SIZE (xpi/firefox-i18n-27.0.1/kn.xpi) = 408352
-SHA256 (xpi/firefox-i18n-27.0.1/ko.xpi) = 09c49b9f8d2f08113aa6a05650f6cb2540b879cff0918ff099c213a17c7ec60c
-SIZE (xpi/firefox-i18n-27.0.1/ko.xpi) = 363840
-SHA256 (xpi/firefox-i18n-27.0.1/ku.xpi) = 1e702417d90075123e8da9df0759db0b1b6a9766ef8f5a44662350032386947b
-SIZE (xpi/firefox-i18n-27.0.1/ku.xpi) = 370260
-SHA256 (xpi/firefox-i18n-27.0.1/lij.xpi) = 4025e99a1f58e81bca6fb018fabf86e0eb4b47aef47ba428bdad9d06d0e17f5e
-SIZE (xpi/firefox-i18n-27.0.1/lij.xpi) = 339920
-SHA256 (xpi/firefox-i18n-27.0.1/lt.xpi) = 5d9a50591c42dd54bfa594720d0ba00c0e042a1317c3b2de6aa60c3e834afb88
-SIZE (xpi/firefox-i18n-27.0.1/lt.xpi) = 369740
-SHA256 (xpi/firefox-i18n-27.0.1/lv.xpi) = 5bc36a930ae8f79845b1cfd7351bb7a5a67e886b2557f187e4441132c53ebe6a
-SIZE (xpi/firefox-i18n-27.0.1/lv.xpi) = 343466
-SHA256 (xpi/firefox-i18n-27.0.1/mai.xpi) = 62293afe68096c14e60cae956a6f48dbef31bdbfc3ff70c70f356a67e7d4223b
-SIZE (xpi/firefox-i18n-27.0.1/mai.xpi) = 396633
-SHA256 (xpi/firefox-i18n-27.0.1/mk.xpi) = 2a7c5aa6c723cae0770ef64d94e72175a4d53e7be003f1ea7691e0bd86a15022
-SIZE (xpi/firefox-i18n-27.0.1/mk.xpi) = 392645
-SHA256 (xpi/firefox-i18n-27.0.1/ml.xpi) = a6fa9c3256b2c2dba54b3bc6bf64320bf0ef3aab1f0f0957b2a928916d05924e
-SIZE (xpi/firefox-i18n-27.0.1/ml.xpi) = 417095
-SHA256 (xpi/firefox-i18n-27.0.1/mr.xpi) = bfb1bfd5ac0a4b5a95651b6eb25aaf2afbaf923b95ec23adde0081ba36f720d0
-SIZE (xpi/firefox-i18n-27.0.1/mr.xpi) = 397289
-SHA256 (xpi/firefox-i18n-27.0.1/nb-NO.xpi) = a8936b347d671483ae24bcdc055406f47447af4a4c74632b51861e8128d9d550
-SIZE (xpi/firefox-i18n-27.0.1/nb-NO.xpi) = 346640
-SHA256 (xpi/firefox-i18n-27.0.1/nl.xpi) = 8f2871a4947e1b64a8d7f8a4e3da0ff923573012f5e764e3400a94347a4990e4
-SIZE (xpi/firefox-i18n-27.0.1/nl.xpi) = 348112
-SHA256 (xpi/firefox-i18n-27.0.1/nn-NO.xpi) = 2810dcd7bc5cd13a7fe7a62ac8aa4a5e5f9fd7cc381f0fb7c01dabc91c588c4a
-SIZE (xpi/firefox-i18n-27.0.1/nn-NO.xpi) = 344619
-SHA256 (xpi/firefox-i18n-27.0.1/or.xpi) = 76f6cbe08a243d6d12d68b9346c32a98c24bcf5f2eee60f69ba6ec855cea256b
-SIZE (xpi/firefox-i18n-27.0.1/or.xpi) = 410073
-SHA256 (xpi/firefox-i18n-27.0.1/pa-IN.xpi) = 37b5a1211e8f687c83ed1417bb493a55ef204457937a9c4a6aafdc18470367a0
-SIZE (xpi/firefox-i18n-27.0.1/pa-IN.xpi) = 385302
-SHA256 (xpi/firefox-i18n-27.0.1/pl.xpi) = c0aead3d3a3f13f777dbd8bea6fb4e231515d21c0e1a594aece28ba1ded80417
-SIZE (xpi/firefox-i18n-27.0.1/pl.xpi) = 348871
-SHA256 (xpi/firefox-i18n-27.0.1/pt-BR.xpi) = 154e7a7e8e41b3a44db436bf09a37c82eb414e91f51a2f1460cc826f6c0d8d2e
-SIZE (xpi/firefox-i18n-27.0.1/pt-BR.xpi) = 354077
-SHA256 (xpi/firefox-i18n-27.0.1/pt-PT.xpi) = cee65b6763cdf4b619cf61aca2ec8507c078f9fd2933a961971e51f0e28c3810
-SIZE (xpi/firefox-i18n-27.0.1/pt-PT.xpi) = 347958
-SHA256 (xpi/firefox-i18n-27.0.1/rm.xpi) = fdc1ac828180a1458e852964db1714abe1e9e52bedc0a8856ed06498673febf0
-SIZE (xpi/firefox-i18n-27.0.1/rm.xpi) = 349337
-SHA256 (xpi/firefox-i18n-27.0.1/ro.xpi) = edf65a7120dd2290a210baeac4a7ccec9cf38b06ae427948577495afcdcdde2d
-SIZE (xpi/firefox-i18n-27.0.1/ro.xpi) = 378831
-SHA256 (xpi/firefox-i18n-27.0.1/ru.xpi) = eb9b80f7772e1f3eb32e3ce637cdf6bb7c48029e9dc9f374e7177ec87b5a95cf
-SIZE (xpi/firefox-i18n-27.0.1/ru.xpi) = 336572
-SHA256 (xpi/firefox-i18n-27.0.1/si.xpi) = 57281c4b0a56473ac156b67ec18c1f6e0a990b478ba098c81169afbec2859843
-SIZE (xpi/firefox-i18n-27.0.1/si.xpi) = 387684
-SHA256 (xpi/firefox-i18n-27.0.1/sk.xpi) = aad9269f18e788c121575e947f4e32664221459f3ee0196427c37ce48d48eb50
-SIZE (xpi/firefox-i18n-27.0.1/sk.xpi) = 364725
-SHA256 (xpi/firefox-i18n-27.0.1/sl.xpi) = abe8710b398cd669ddfaef007870d091ca0d25f4ad9f167dd1dd76d3ff604659
-SIZE (xpi/firefox-i18n-27.0.1/sl.xpi) = 347789
-SHA256 (xpi/firefox-i18n-27.0.1/son.xpi) = 6501f79574a8f7023845172b47173dd2af06c8a8d3937373658cd1dd9e0c53cd
-SIZE (xpi/firefox-i18n-27.0.1/son.xpi) = 344435
-SHA256 (xpi/firefox-i18n-27.0.1/sq.xpi) = afcc8af1060913157016d3c4ce2f61099ec11bab9ce8e6428383abfe01f781ee
-SIZE (xpi/firefox-i18n-27.0.1/sq.xpi) = 357149
-SHA256 (xpi/firefox-i18n-27.0.1/sr.xpi) = 41932136881f0cf6a3d34510a1bc70a0e77cc7b34ff75fd976c6030737388070
-SIZE (xpi/firefox-i18n-27.0.1/sr.xpi) = 399941
-SHA256 (xpi/firefox-i18n-27.0.1/sv-SE.xpi) = 01d6541ab4911c707f03364f884e69313c618f1bbc48092162e1a8fbcee13f92
-SIZE (xpi/firefox-i18n-27.0.1/sv-SE.xpi) = 352870
-SHA256 (xpi/firefox-i18n-27.0.1/ta.xpi) = 08182f6733358296930a9cbcf91c3f49629520a08fa6d97b158b6c146dd09375
-SIZE (xpi/firefox-i18n-27.0.1/ta.xpi) = 400413
-SHA256 (xpi/firefox-i18n-27.0.1/te.xpi) = 167f3bb93df3e7a71396dd811f69338a5fa7fdc9fc35c8c583b08a9ea5dfa0b9
-SIZE (xpi/firefox-i18n-27.0.1/te.xpi) = 417869
-SHA256 (xpi/firefox-i18n-27.0.1/th.xpi) = 3f34b2ffb2c7cbedd0cfe209846f7e1312cfbf0806168a274003dcac0792e5b7
-SIZE (xpi/firefox-i18n-27.0.1/th.xpi) = 394993
-SHA256 (xpi/firefox-i18n-27.0.1/tr.xpi) = ad2af4a27c81dcc663719afb6ec90cd239221e9d476bbc2afde4b593da2693c4
-SIZE (xpi/firefox-i18n-27.0.1/tr.xpi) = 356669
-SHA256 (xpi/firefox-i18n-27.0.1/uk.xpi) = 47cd2cd67c7a81bb9739d2a228b7577387ff4c4f8d64584f3deafcb588c2ef9c
-SIZE (xpi/firefox-i18n-27.0.1/uk.xpi) = 381435
-SHA256 (xpi/firefox-i18n-27.0.1/vi.xpi) = 706b7387ac51d07c323a0c56940b4db1fcb291b2e52919299391a687fa24376e
-SIZE (xpi/firefox-i18n-27.0.1/vi.xpi) = 375486
-SHA256 (xpi/firefox-i18n-27.0.1/zh-CN.xpi) = ff705b97b0173186116ad31470f0e336805ab572176ee5826b263775dc962063
-SIZE (xpi/firefox-i18n-27.0.1/zh-CN.xpi) = 374671
-SHA256 (xpi/firefox-i18n-27.0.1/zh-TW.xpi) = 0e0dbcc76c2408e02b90f6a6c9a6bb0daa253c7330bf0d17aaed7fa1768f7e87
-SIZE (xpi/firefox-i18n-27.0.1/zh-TW.xpi) = 372319
-SHA256 (xpi/firefox-i18n-27.0.1/zu.xpi) = ba016e542e0864427dfd733d4361042ad610f7e2ff045bf9cb15795a8b072e81
-SIZE (xpi/firefox-i18n-27.0.1/zu.xpi) = 357236
+SHA256 (xpi/firefox-i18n-28.0/ach.xpi) = b136b56da7f11a953ea881fed60ad15a20d91682c2dbe4a3519358f44d981dab
+SIZE (xpi/firefox-i18n-28.0/ach.xpi) = 365708
+SHA256 (xpi/firefox-i18n-28.0/af.xpi) = d31886aff8bbb30347f7287c93ce4b9b55f898bebeb0897486be5ad5101cd381
+SIZE (xpi/firefox-i18n-28.0/af.xpi) = 359588
+SHA256 (xpi/firefox-i18n-28.0/ar.xpi) = 6868b3ac85f67f7c5d604f1ec0bb40238fa7f99b9615d97709c9c3eecf6586cc
+SIZE (xpi/firefox-i18n-28.0/ar.xpi) = 388973
+SHA256 (xpi/firefox-i18n-28.0/as.xpi) = 0c7e712625db2b4fd3c8626a88b03c4f91dacd252dc8db0b332da205ff2e3d8f
+SIZE (xpi/firefox-i18n-28.0/as.xpi) = 404105
+SHA256 (xpi/firefox-i18n-28.0/ast.xpi) = c339a8c821547204d1c50ae504cdc3ba53a85c8d0ac3a315f22c68d9da2dfe51
+SIZE (xpi/firefox-i18n-28.0/ast.xpi) = 316220
+SHA256 (xpi/firefox-i18n-28.0/be.xpi) = 210247068b21cead73b623d9b860d1607247015f5462d388aa7d886466ba8391
+SIZE (xpi/firefox-i18n-28.0/be.xpi) = 342303
+SHA256 (xpi/firefox-i18n-28.0/bg.xpi) = bdc9aee10f414c86a463e08103afea3e5cad57c5818d0e71f9565faf05934f4a
+SIZE (xpi/firefox-i18n-28.0/bg.xpi) = 393202
+SHA256 (xpi/firefox-i18n-28.0/bn-BD.xpi) = 4d4423b348cd226eea97a0295485f88057f80f42498744099a75bdcad4fa6f1d
+SIZE (xpi/firefox-i18n-28.0/bn-BD.xpi) = 418538
+SHA256 (xpi/firefox-i18n-28.0/bn-IN.xpi) = 41e6dad5dcf383ad0448973bf7692d21d3c08aaf51e5a756ee85739b8664ed22
+SIZE (xpi/firefox-i18n-28.0/bn-IN.xpi) = 413539
+SHA256 (xpi/firefox-i18n-28.0/br.xpi) = 9d1432b1b097e69bd5b23cca38696f3768111a7695112c27320b6c0eb4c85cbb
+SIZE (xpi/firefox-i18n-28.0/br.xpi) = 353930
+SHA256 (xpi/firefox-i18n-28.0/bs.xpi) = ec26c60cbb118b93be7ee14f99d08023192d64e4cfed348cc092059161795955
+SIZE (xpi/firefox-i18n-28.0/bs.xpi) = 363402
+SHA256 (xpi/firefox-i18n-28.0/ca.xpi) = 699f55f7c6d05e30750bc5081f20834c1cf6042760281a42b8ba8eaa93cc546f
+SIZE (xpi/firefox-i18n-28.0/ca.xpi) = 362967
+SHA256 (xpi/firefox-i18n-28.0/cs.xpi) = c0419442a82ef33874a602c969068e81f652ce9b81dd758c26fcf50668d3f751
+SIZE (xpi/firefox-i18n-28.0/cs.xpi) = 356815
+SHA256 (xpi/firefox-i18n-28.0/csb.xpi) = eadf904b54438b17e8bacca9987444b7b0cd0367fa2c2c26202ebbf9bd5b70e0
+SIZE (xpi/firefox-i18n-28.0/csb.xpi) = 347618
+SHA256 (xpi/firefox-i18n-28.0/cy.xpi) = 113041740f7494150fb22ebd857fdbbb8fa23b063154ea04c9b82ce89a25eefc
+SIZE (xpi/firefox-i18n-28.0/cy.xpi) = 354719
+SHA256 (xpi/firefox-i18n-28.0/da.xpi) = 40cebc8db2232409003f2a23d3ce254ec38ae651bd0160c26815f1a9c438328e
+SIZE (xpi/firefox-i18n-28.0/da.xpi) = 348722
+SHA256 (xpi/firefox-i18n-28.0/de.xpi) = 2f69ef2213355e608eba50787ec19ba7b1e57f87c3b0f334697ca8de4716ad5e
+SIZE (xpi/firefox-i18n-28.0/de.xpi) = 355502
+SHA256 (xpi/firefox-i18n-28.0/el.xpi) = f13121675409c9c39ebff994844ef61df73de1d9e2ae77e784cc477f63ee723d
+SIZE (xpi/firefox-i18n-28.0/el.xpi) = 389423
+SHA256 (xpi/firefox-i18n-28.0/en-GB.xpi) = 60c7e40108749db48bf1026d3a0981724843d65c8569a49a34c64e4de642a401
+SIZE (xpi/firefox-i18n-28.0/en-GB.xpi) = 342860
+SHA256 (xpi/firefox-i18n-28.0/en-US.xpi) = b9a491b4315f2326b9e4b03295982b872a916b75478452e8744903c52496ce3a
+SIZE (xpi/firefox-i18n-28.0/en-US.xpi) = 345900
+SHA256 (xpi/firefox-i18n-28.0/en-ZA.xpi) = cf5d7fe183e312bc9a7b5c3121e73fbb31bb441277436c814bd2c75ef3b7fb89
+SIZE (xpi/firefox-i18n-28.0/en-ZA.xpi) = 338114
+SHA256 (xpi/firefox-i18n-28.0/eo.xpi) = 2e08a1463a6842bf0b03b9a856006dcf1fcaea42c452f9aa96d50a2b35a45bef
+SIZE (xpi/firefox-i18n-28.0/eo.xpi) = 361749
+SHA256 (xpi/firefox-i18n-28.0/es-AR.xpi) = f9b9528fdb5f3c9afd6a15086673dba708ced06adf0e3064b4436e85aa2362d0
+SIZE (xpi/firefox-i18n-28.0/es-AR.xpi) = 357323
+SHA256 (xpi/firefox-i18n-28.0/es-CL.xpi) = a8fcd6440ae1184f274e6f8a00aebdeebf8b9768e5ec47ddb5cadd00efc71c14
+SIZE (xpi/firefox-i18n-28.0/es-CL.xpi) = 306617
+SHA256 (xpi/firefox-i18n-28.0/es-ES.xpi) = c332b136719394dbe623efe29c443acf0d35674fef27c0afb86cfb0243e72e90
+SIZE (xpi/firefox-i18n-28.0/es-ES.xpi) = 300690
+SHA256 (xpi/firefox-i18n-28.0/es-MX.xpi) = c7ccd0f83b0d962eb1e1ce4eec752fd5bdba6c8ad0f8774b2147a2fc58c25af7
+SIZE (xpi/firefox-i18n-28.0/es-MX.xpi) = 361856
+SHA256 (xpi/firefox-i18n-28.0/et.xpi) = 0e97596ac377a289749437790e314400ee3a40d4ece77493d876f347e198a4d6
+SIZE (xpi/firefox-i18n-28.0/et.xpi) = 345628
+SHA256 (xpi/firefox-i18n-28.0/eu.xpi) = 424c8ab11aec74ce8c608d55c09cba9a9bff047f917042ea92f54f1f2933ad05
+SIZE (xpi/firefox-i18n-28.0/eu.xpi) = 361444
+SHA256 (xpi/firefox-i18n-28.0/fa.xpi) = 37f16c79b6b558bfef6cc10078c9f42557154ffbd00c7b157cf1279b9a0330ff
+SIZE (xpi/firefox-i18n-28.0/fa.xpi) = 401703
+SHA256 (xpi/firefox-i18n-28.0/ff.xpi) = ef10639f9dc81fa67c285f32b8e391e626099b3d64b6b627c8e0376e9eac77c6
+SIZE (xpi/firefox-i18n-28.0/ff.xpi) = 354038
+SHA256 (xpi/firefox-i18n-28.0/fi.xpi) = 73102b5d087b3dd3fd711422405c715b73ffe2edb60c359df474d6234167683b
+SIZE (xpi/firefox-i18n-28.0/fi.xpi) = 352826
+SHA256 (xpi/firefox-i18n-28.0/fr.xpi) = c1968bd6466f33d23f0ae9166fee86b7c0987b7ff25ff4b70c50b68ed6dc8416
+SIZE (xpi/firefox-i18n-28.0/fr.xpi) = 368924
+SHA256 (xpi/firefox-i18n-28.0/fy-NL.xpi) = 98ae07fa2c2958347eb856c910c0699e201e61084ee8544bfc939f1b1a6de2b9
+SIZE (xpi/firefox-i18n-28.0/fy-NL.xpi) = 362225
+SHA256 (xpi/firefox-i18n-28.0/ga-IE.xpi) = cc2b07595c5dcfb958e178527d5e8f9e681d89ab3125bb0706d9bdbf10341bb6
+SIZE (xpi/firefox-i18n-28.0/ga-IE.xpi) = 370253
+SHA256 (xpi/firefox-i18n-28.0/gd.xpi) = 0664ca2275edbd252fdcf263e35bfa92a77c9efe36b65bd659400c1b0cf788d6
+SIZE (xpi/firefox-i18n-28.0/gd.xpi) = 365215
+SHA256 (xpi/firefox-i18n-28.0/gl.xpi) = b867e7cf30c0aa412d460ac5df7f8dfb6fc2b9698c523103df277c35caaef3ef
+SIZE (xpi/firefox-i18n-28.0/gl.xpi) = 356135
+SHA256 (xpi/firefox-i18n-28.0/gu-IN.xpi) = 49bde1c80351816c2a5e5f4d1adfc820c14f506ed0a3482459528c2fe62b3ba2
+SIZE (xpi/firefox-i18n-28.0/gu-IN.xpi) = 383829
+SHA256 (xpi/firefox-i18n-28.0/he.xpi) = d73be9210a92fb32097a8c2f4496e70c1bfbcbb30739a1104d8ec9d70080e0ce
+SIZE (xpi/firefox-i18n-28.0/he.xpi) = 377878
+SHA256 (xpi/firefox-i18n-28.0/hi-IN.xpi) = 857e2b2d0a18f78edc77253f4d0fc46efb56207dcdd889540d6b4a13dd078e75
+SIZE (xpi/firefox-i18n-28.0/hi-IN.xpi) = 402393
+SHA256 (xpi/firefox-i18n-28.0/hr.xpi) = c7f5903ba41003a7ed58103bade0b90e8f68bffc2c4fc1045de35e6e12eac97b
+SIZE (xpi/firefox-i18n-28.0/hr.xpi) = 368420
+SHA256 (xpi/firefox-i18n-28.0/hu.xpi) = b8b393d12a7e507974c9e8f1460937c6478cfa88b8e01b50022a18379ccdd45b
+SIZE (xpi/firefox-i18n-28.0/hu.xpi) = 365031
+SHA256 (xpi/firefox-i18n-28.0/hy-AM.xpi) = f70dd6f55428fa489a092b534dfcc641bd4ca8cc2c974c2e414a6ef02ddd7bca
+SIZE (xpi/firefox-i18n-28.0/hy-AM.xpi) = 411717
+SHA256 (xpi/firefox-i18n-28.0/id.xpi) = 1802597955551e1a34d3678dd697f868899a73b7dfe71d3ec587730daa9a41e8
+SIZE (xpi/firefox-i18n-28.0/id.xpi) = 342613
+SHA256 (xpi/firefox-i18n-28.0/is.xpi) = 7350573b17652d5d4ef10b0cb22fa3aa6c983d1cca079e886773169171ad10ef
+SIZE (xpi/firefox-i18n-28.0/is.xpi) = 357816
+SHA256 (xpi/firefox-i18n-28.0/it.xpi) = b5a435bd9b3d5cd0ab08fb1b8465e68b5e0ebbf6f048d7f72ef22c8ff75de68d
+SIZE (xpi/firefox-i18n-28.0/it.xpi) = 298277
+SHA256 (xpi/firefox-i18n-28.0/ja.xpi) = ba5f461f81e1214b2a6fc8909ad730e7b43acb54cce4558ac271eb9d2155feba
+SIZE (xpi/firefox-i18n-28.0/ja.xpi) = 397187
+SHA256 (xpi/firefox-i18n-28.0/kk.xpi) = bcf04952d1fc3f14c719a3892a08e11b27945a1909e86fc814afa65e67b042a2
+SIZE (xpi/firefox-i18n-28.0/kk.xpi) = 400317
+SHA256 (xpi/firefox-i18n-28.0/km.xpi) = 4abb71c4afecf5ab5106690aea017a79f39b3f8befc7da9099deb504b546be91
+SIZE (xpi/firefox-i18n-28.0/km.xpi) = 430426
+SHA256 (xpi/firefox-i18n-28.0/kn.xpi) = 4bb0d4fac170af23d99783faa838121bfb6adb718b332b7b916757ff34c5b997
+SIZE (xpi/firefox-i18n-28.0/kn.xpi) = 414253
+SHA256 (xpi/firefox-i18n-28.0/ko.xpi) = 98abfda2e65edead79ef433f663473c362e9a329d68ea6da0245288fc9c85aef
+SIZE (xpi/firefox-i18n-28.0/ko.xpi) = 364490
+SHA256 (xpi/firefox-i18n-28.0/ku.xpi) = 3abdfaafdf41877b903750f1189b4888ea2f2d269b90190f3dba31dfa9ed1eb4
+SIZE (xpi/firefox-i18n-28.0/ku.xpi) = 370338
+SHA256 (xpi/firefox-i18n-28.0/lij.xpi) = 298cc4c9b933e033cd470f7d427b5a46023f89bce41d6a0f1607063e791bed6b
+SIZE (xpi/firefox-i18n-28.0/lij.xpi) = 343230
+SHA256 (xpi/firefox-i18n-28.0/lt.xpi) = db38c3cf9466a8ee5bd4b41d8b248c4d045dcb2a28166eced4092d964a1339c4
+SIZE (xpi/firefox-i18n-28.0/lt.xpi) = 375228
+SHA256 (xpi/firefox-i18n-28.0/lv.xpi) = db860bb6da3225641dcd20b089da86bbbb4cf2d2c89a6f2ff76cd3c5a76017ff
+SIZE (xpi/firefox-i18n-28.0/lv.xpi) = 352613
+SHA256 (xpi/firefox-i18n-28.0/mai.xpi) = 1dd4d584f32cdbfaa5fdb0797f0fbf9e8509939a4f959735aa7ccd73a976ab73
+SIZE (xpi/firefox-i18n-28.0/mai.xpi) = 402487
+SHA256 (xpi/firefox-i18n-28.0/mk.xpi) = 4261272a0c4fdcb0b5a0ecc0c2bdc5a7ee92c975fb64df8e503d0f3b8e33b7ca
+SIZE (xpi/firefox-i18n-28.0/mk.xpi) = 403249
+SHA256 (xpi/firefox-i18n-28.0/ml.xpi) = 9ad7ab15bc18921f4d9c66ffc81d42b03c1d3eaa18942d91c9d6268e392c42cb
+SIZE (xpi/firefox-i18n-28.0/ml.xpi) = 422955
+SHA256 (xpi/firefox-i18n-28.0/mr.xpi) = 6a6ea853ff5b59b589c3bffb5cc8cefff049bfb2e62f96375c673c6761b436b8
+SIZE (xpi/firefox-i18n-28.0/mr.xpi) = 400779
+SHA256 (xpi/firefox-i18n-28.0/nb-NO.xpi) = f8eb9decdbbe8cb29736a2462111800955c10fb703e1a19c2949f9b501df99d9
+SIZE (xpi/firefox-i18n-28.0/nb-NO.xpi) = 352710
+SHA256 (xpi/firefox-i18n-28.0/nl.xpi) = f3cdb52c0f6d06b65733873db3b2e955f86be6ccd345f7fadbb0e164c6a9ca1b
+SIZE (xpi/firefox-i18n-28.0/nl.xpi) = 354060
+SHA256 (xpi/firefox-i18n-28.0/nn-NO.xpi) = 0f9c63147569243acc6a79148c80f0343bd4515a181b76dea082062c09c4ae29
+SIZE (xpi/firefox-i18n-28.0/nn-NO.xpi) = 350907
+SHA256 (xpi/firefox-i18n-28.0/or.xpi) = 4077c172b622174323b253ff8ce5a917d8e354d0a6bdfbd20cce8e626a134c87
+SIZE (xpi/firefox-i18n-28.0/or.xpi) = 415914
+SHA256 (xpi/firefox-i18n-28.0/pa-IN.xpi) = 43dd812f1408246270421f628c754b6742cf24fcf0ca6f700743ea3c523152e7
+SIZE (xpi/firefox-i18n-28.0/pa-IN.xpi) = 390707
+SHA256 (xpi/firefox-i18n-28.0/pl.xpi) = 18b5fde187f321ddc3a8f4a84adfab74573ee8109fca026dec5aa77c2ddaddfd
+SIZE (xpi/firefox-i18n-28.0/pl.xpi) = 350840
+SHA256 (xpi/firefox-i18n-28.0/pt-BR.xpi) = 39d2f7a4da6be9f6645555d74a7919d4869084425658de599e9ea4e1cb59a07e
+SIZE (xpi/firefox-i18n-28.0/pt-BR.xpi) = 364786
+SHA256 (xpi/firefox-i18n-28.0/pt-PT.xpi) = 01e6a29c67209fff477fa0c7b3fa4323493001c5e213fc27c337d9038c4ae7d2
+SIZE (xpi/firefox-i18n-28.0/pt-PT.xpi) = 351712
+SHA256 (xpi/firefox-i18n-28.0/rm.xpi) = 1816eb801fac06e94744b6aa2ebcb1a246e6dbf649cbac451eeb56fd28b44371
+SIZE (xpi/firefox-i18n-28.0/rm.xpi) = 355274
+SHA256 (xpi/firefox-i18n-28.0/ro.xpi) = 3aea16672c42490a2e0fca07e49137ce8fd5b31bdb41e0ec761cd25e234ce80e
+SIZE (xpi/firefox-i18n-28.0/ro.xpi) = 389917
+SHA256 (xpi/firefox-i18n-28.0/ru.xpi) = 3322b9e7b6033f0f5e75a2a351ec3acc89566af33dcdb4088b63c2d190591df6
+SIZE (xpi/firefox-i18n-28.0/ru.xpi) = 338409
+SHA256 (xpi/firefox-i18n-28.0/si.xpi) = 14575b7ad943feb270d17c085035d7a8f4868df757891d115eddf660b24ca070
+SIZE (xpi/firefox-i18n-28.0/si.xpi) = 395716
+SHA256 (xpi/firefox-i18n-28.0/sk.xpi) = b943274c6e43b367a263ba3ae412df339d278d803792d9f24446610b3d75d99e
+SIZE (xpi/firefox-i18n-28.0/sk.xpi) = 367790
+SHA256 (xpi/firefox-i18n-28.0/sl.xpi) = 3de9c88b58fd5742239d12c9718601bb818928f64232b3b692405d34f1fb41ee
+SIZE (xpi/firefox-i18n-28.0/sl.xpi) = 350314
+SHA256 (xpi/firefox-i18n-28.0/son.xpi) = ecc81bed49d7a9fd411fe782f299c604c30445fe27ca2f435a4a781130906ac1
+SIZE (xpi/firefox-i18n-28.0/son.xpi) = 350556
+SHA256 (xpi/firefox-i18n-28.0/sq.xpi) = 44dc62e8306e19c0f03da86d24b081a4ecb1bf8a3ce5a9a6c404118a33b7b88a
+SIZE (xpi/firefox-i18n-28.0/sq.xpi) = 366311
+SHA256 (xpi/firefox-i18n-28.0/sr.xpi) = 4c930c91f103fc6da8e98c36c2bbe73d52eddb81e767db8ee52b31d434d90503
+SIZE (xpi/firefox-i18n-28.0/sr.xpi) = 405134
+SHA256 (xpi/firefox-i18n-28.0/sv-SE.xpi) = ede9dea32ce9a76c2dcafa2fa7e0c945c14fcad474bb0f17e1dc5fe66d949c6b
+SIZE (xpi/firefox-i18n-28.0/sv-SE.xpi) = 358314
+SHA256 (xpi/firefox-i18n-28.0/ta.xpi) = 3f2159a4dca0be04b92bc8b0e75141605573f029ef25f2866723766e3d67b10d
+SIZE (xpi/firefox-i18n-28.0/ta.xpi) = 408325
+SHA256 (xpi/firefox-i18n-28.0/te.xpi) = 084fb31b336c1cde2b306cc0ef267bef3ee0ebe98fc4ce63af65b8a88a405827
+SIZE (xpi/firefox-i18n-28.0/te.xpi) = 421139
+SHA256 (xpi/firefox-i18n-28.0/th.xpi) = d3facd06cba97a1e5417bfec468fafb5773b898c687639f323470aef4ca3e84e
+SIZE (xpi/firefox-i18n-28.0/th.xpi) = 406135
+SHA256 (xpi/firefox-i18n-28.0/tr.xpi) = ec03c8da04ddd2f0be3a44fd2fed31fec74ac48f5d421bcd9e760fe93e317cae
+SIZE (xpi/firefox-i18n-28.0/tr.xpi) = 361998
+SHA256 (xpi/firefox-i18n-28.0/uk.xpi) = 03964470eabe2d81b66c2b048bd797da3175673863edc2f66390ba18ede2352c
+SIZE (xpi/firefox-i18n-28.0/uk.xpi) = 388297
+SHA256 (xpi/firefox-i18n-28.0/vi.xpi) = a7e91ac2ae79cddd545fae73ed8c39af5a9b03a15d92174bfe3efb4a1fafcf67
+SIZE (xpi/firefox-i18n-28.0/vi.xpi) = 378856
+SHA256 (xpi/firefox-i18n-28.0/zh-CN.xpi) = ad95ab921f7c1d561f65dd37eed544c00e7c0d003475feeae40b3dcedee4913e
+SIZE (xpi/firefox-i18n-28.0/zh-CN.xpi) = 381762
+SHA256 (xpi/firefox-i18n-28.0/zh-TW.xpi) = a6378d8a1251f3fb1e2f6148a9767529fe9eaed0d44572b958fd37c64c3feab7
+SIZE (xpi/firefox-i18n-28.0/zh-TW.xpi) = 375528
+SHA256 (xpi/firefox-i18n-28.0/zu.xpi) = ccc10b9e39733e6abdd9bd8a52c6ee3cf6c32801635d874aec9533dcc90b821b
+SIZE (xpi/firefox-i18n-28.0/zu.xpi) = 365908
diff --git a/www/firefox/Makefile b/www/firefox/Makefile
index 345fff78d5da..b0d3ccaad13f 100644
--- a/www/firefox/Makefile
+++ b/www/firefox/Makefile
@@ -2,8 +2,7 @@
# $FreeBSD$
PORTNAME= firefox
-DISTVERSION= 27.0.1
-PORTREVISION= 1
+DISTVERSION= 28.0
PORTEPOCH= 1
CATEGORIES= www ipv6
MASTER_SITES= MOZILLA/${PORTNAME}/releases/${DISTVERSION}/source
@@ -12,11 +11,16 @@ DISTNAME= ${PORTNAME}-${DISTVERSION}.source
MAINTAINER= gecko@FreeBSD.org
COMMENT= Web browser based on the browser portion of Mozilla
-BUILD_DEPENDS= nspr>=4.10.2:${PORTSDIR}/devel/nspr \
+BUILD_DEPENDS= nspr>=4.10.3:${PORTSDIR}/devel/nspr \
nss>=3.15.4:${PORTSDIR}/security/nss \
- sqlite3>=3.8.0.2:${PORTSDIR}/databases/sqlite3 \
+ harfbuzz>=0.9.25:${PORTSDIR}/print/harfbuzz \
+ libvorbis>=1.3.4:${PORTSDIR}/audio/libvorbis \
+ opus>=1.1:${PORTSDIR}/audio/opus \
+ libvpx>=1.3.0:${PORTSDIR}/multimedia/libvpx \
+ sqlite3>=3.8.1:${PORTSDIR}/databases/sqlite3 \
${PYTHON_PKGNAMEPREFIX}sqlite3>0:${PORTSDIR}/databases/py-sqlite3 \
v4l_compat>0:${PORTSDIR}/multimedia/v4l_compat \
+ zip:${PORTSDIR}/archivers/zip \
unzip:${PORTSDIR}/archivers/unzip
# cairo>=1.12.16,2:${PORTSDIR}/graphics/cairo \
@@ -53,8 +57,21 @@ MOZ_OPTIONS= --program-transform-name='s/firefox/${MOZILLA}/' \
WRKSRC:= ${WRKDIR}/mozilla-release
-.if ${ARCH} == i386 && ${OSVERSION} < 1000000
-USE_GCC?= yes
+# avoid clang 3.2/3.3 crash in js/src/jsgc.cpp on refillFreeList<(js::AllowGC)1>
+# http://svnweb.freebsd.org/changeset/base/255804
+.if ${CHOSEN_COMPILER_TYPE} == clang && ${ARCH} == i386 && ${OSVERSION} < 1000056
+. if ${PORT_OPTIONS:MOPTIMIZED_CFLAGS}
+BROKEN= Cannot build with OPTIMIZED_CFLAGS option due to \
+ a ${CHOSEN_COMPILER_TYPE} bug: unset the option or \
+ use FAVORITE_COMPILER=gcc in Makefile.local/make.conf
+# apply workaround only for -O2 or greater
+. elif ${CXXFLAGS:M-O*} && ! ${CXXFLAGS:M-O[01]}
+. if ${MACHINE_CPU:Msse2}
+CXXFLAGS+= -msse2
+. else
+CXXFLAGS+= -O1
+. endif
+. endif
.endif
.if ${PORT_OPTIONS:MALSA}
diff --git a/www/firefox/Makefile.options b/www/firefox/Makefile.options
index cd36e07ea76e..22c59d7d5bda 100644
--- a/www/firefox/Makefile.options
+++ b/www/firefox/Makefile.options
@@ -2,10 +2,10 @@
OPTIONS_DEFINE+= DBUS DEBUG GCONF GIO GNOMEUI GNOMEVFS2 GSTREAMER \
LIBPROXY LOGGING OPTIMIZED_CFLAGS PGO PROFILE TEST
-OPTIONS_DEFAULT+= ALSA DBUS GIO GSTREAMER LOGGING
+OPTIONS_DEFAULT+= ALSA DBUS GIO GSTREAMER LOGGING OPTIMIZED_CFLAGS
-OPTIONS_SINGLE+= AUDIO
-OPTIONS_SINGLE_AUDIO= ALSA PULSEAUDIO
+OPTIONS_MULTI+= AUDIO
+OPTIONS_MULTI_AUDIO= ALSA PULSEAUDIO
ENIGMAIL_DESC?= Enigmail extension
GIO_DESC?= GIO for file I/O # move to bsd.options.desc.mk
diff --git a/www/firefox/distinfo b/www/firefox/distinfo
index eae720437e7d..9f74482ee364 100644
--- a/www/firefox/distinfo
+++ b/www/firefox/distinfo
@@ -1,2 +1,2 @@
-SHA256 (firefox-27.0.1.source.tar.bz2) = 76057ac365fe60b51915e8dba2960546fb3a60a2b5747207a8c936e4fc280d8f
-SIZE (firefox-27.0.1.source.tar.bz2) = 129249507
+SHA256 (firefox-28.0.source.tar.bz2) = 2ffd0484e7eab52166b851681878a86d54223a6764c756721430fae8e1599628
+SIZE (firefox-28.0.source.tar.bz2) = 134968426
diff --git a/www/firefox/files/patch-bug806917 b/www/firefox/files/patch-bug806917
new file mode 100644
index 000000000000..16e326831c71
--- /dev/null
+++ b/www/firefox/files/patch-bug806917
@@ -0,0 +1,1996 @@
+commit cb40a26
+Author: Alessandro Decina <alessandro.d@gmail.com>
+Date: Fri Jan 03 08:16:54 2014 -0800
+
+ Bug 806917 - support GStreamer 1.0
+---
+ configure.in | 66 ++-
+ content/media/gstreamer/GStreamerAllocator.cpp | 198 +++++++
+ content/media/gstreamer/GStreamerAllocator.h | 25 +
+ content/media/gstreamer/GStreamerFormatHelper.cpp | 13 +-
+ content/media/gstreamer/GStreamerFunctionList.h | 93 +++-
+ content/media/gstreamer/GStreamerLoader.cpp | 48 +-
+ content/media/gstreamer/GStreamerLoader.h | 8 +
+ content/media/gstreamer/GStreamerReader-0.10.cpp | 203 +++++++
+ content/media/gstreamer/GStreamerReader.cpp | 632 ++++++++++++++--------
+ content/media/gstreamer/GStreamerReader.h | 42 +-
+ content/media/gstreamer/moz.build | 11 +-
+ content/media/test/manifest.js | 6 +-
+ 12 files changed, 1061 insertions(+), 284 deletions(-)
+
+diff --git configure.in configure.in
+index 9776b8d..0b1698d 100644
+--- configure.in
++++ configure.in
+@@ -3955,6 +3955,7 @@ MOZ_SAMPLE_TYPE_FLOAT32=
+ MOZ_SAMPLE_TYPE_S16=
+ MOZ_OPUS=1
+ MOZ_WEBM=1
++MOZ_GSTREAMER=
+ MOZ_DIRECTSHOW=
+ MOZ_WMF=
+ MOZ_FMP4=
+@@ -5606,43 +5607,60 @@ dnl = Enable GStreamer
+ dnl ========================================================
+ if test "$OS_TARGET" = "Linux"; then
+ MOZ_GSTREAMER=1
++ GST_API_VERSION=0.10
+ fi
+
+-MOZ_ARG_ENABLE_BOOL(gstreamer,
+-[ --enable-gstreamer Enable GStreamer support],
+-MOZ_GSTREAMER=1,
+-MOZ_GSTREAMER=)
+-
+-if test "$MOZ_GSTREAMER"; then
+- # API version, eg 0.10, 1.0 etc
++MOZ_ARG_ENABLE_STRING(gstreamer,
++[ --enable-gstreamer[=0.10] Enable GStreamer support],
++[ MOZ_GSTREAMER=1
++ # API version, eg 0.10, 1.0 etc
++ if test -z "$enableval" -o "$enableval" = "yes"; then
+ GST_API_VERSION=0.10
++ elif test "$enableval" = "no"; then
++ MOZ_GSTREAMER=
++ else
++ GST_API_VERSION=$enableval
++ fi],
++)
++
++if test -n "$MOZ_GSTREAMER"; then
+ # core/base release number
+- GST_VERSION=0.10.25
++ if test "$GST_API_VERSION" = "1.0"; then
++ GST_VERSION=1.0
++ else
++ GST_VERSION=0.10.25
++ fi
++
+ PKG_CHECK_MODULES(GSTREAMER,
+ gstreamer-$GST_API_VERSION >= $GST_VERSION
+ gstreamer-app-$GST_API_VERSION
+- gstreamer-plugins-base-$GST_API_VERSION, ,
+- AC_MSG_ERROR([gstreamer and gstreamer-plugins-base development packages are needed to build gstreamer backend. Install them or disable gstreamer support with --disable-gstreamer]))
+- if test -n "$GSTREAMER_LIBS"; then
+- _SAVE_LDFLAGS=$LDFLAGS
+- LDFLAGS="$LDFLAGS $GSTREAMER_LIBS -lgstvideo-$GST_API_VERSION"
+- AC_TRY_LINK(,[return 0;],_HAVE_LIBGSTVIDEO=1,_HAVE_LIBGSTVIDEO=)
+- if test -n "$_HAVE_LIBGSTVIDEO" ; then
+- GSTREAMER_LIBS="$GSTREAMER_LIBS -lgstvideo-$GST_API_VERSION"
+- else
+- AC_MSG_ERROR([gstreamer-plugins-base found, but no libgstvideo. Something has gone terribly wrong. Try reinstalling gstreamer-plugins-base; failing that, disable the gstreamer backend with --disable-gstreamer.])
+- fi
+- LDFLAGS=$_SAVE_LDFLAGS
++ gstreamer-plugins-base-$GST_API_VERSION,
++ [_HAVE_GSTREAMER=1],
++ [_HAVE_GSTREAMER=])
++ if test -z "$_HAVE_GSTREAMER"; then
++ AC_MSG_ERROR([gstreamer and gstreamer-plugins-base development packages are needed to build gstreamer backend. Install them or disable gstreamer support with --disable-gstreamer])
++ fi
++
++ _SAVE_LDFLAGS=$LDFLAGS
++ LDFLAGS="$LDFLAGS $GSTREAMER_LIBS -lgstvideo-$GST_API_VERSION"
++ AC_TRY_LINK(,[return 0;],_HAVE_LIBGSTVIDEO=1,_HAVE_LIBGSTVIDEO=)
++ if test -n "$_HAVE_LIBGSTVIDEO" ; then
++ GSTREAMER_LIBS="$GSTREAMER_LIBS -lgstvideo-$GST_API_VERSION"
+ else
+- AC_MSG_ERROR([gstreamer and gstreamer-plugins-base development packages are needed to build gstreamer backend. Install them or disable gstreamer support with --disable-gstreamer])
++ AC_MSG_ERROR([gstreamer-plugins-base found, but no libgstvideo. Something has gone terribly wrong. Try reinstalling gstreamer-plugins-base; failing that, disable the gstreamer backend with --disable-gstreamer.])
+ fi
++ LDFLAGS=$_SAVE_LDFLAGS
++
++ AC_SUBST(GSTREAMER_CFLAGS)
++ AC_SUBST(GSTREAMER_LIBS)
+ fi
+-AC_SUBST(GSTREAMER_CFLAGS)
+-AC_SUBST(GSTREAMER_LIBS)
++
+ AC_SUBST(MOZ_GSTREAMER)
++AC_SUBST(GST_API_VERSION)
+
+ if test -n "$MOZ_GSTREAMER"; then
+- AC_DEFINE(MOZ_GSTREAMER)
++ AC_DEFINE(MOZ_GSTREAMER)
++ AC_DEFINE_UNQUOTED(GST_API_VERSION, "$GST_API_VERSION")
+ fi
+
+
+diff --git content/media/gstreamer/GStreamerAllocator.cpp content/media/gstreamer/GStreamerAllocator.cpp
+new file mode 100644
+index 0000000..69d0385
+--- /dev/null
++++ content/media/gstreamer/GStreamerAllocator.cpp
+@@ -0,0 +1,198 @@
++#ifdef HAVE_CONFIG_H
++#include "config.h"
++#endif
++
++#include "GStreamerAllocator.h"
++
++#include <gst/video/video.h>
++#include <gst/video/gstvideometa.h>
++
++#include "GStreamerLoader.h"
++
++using namespace mozilla::layers;
++
++namespace mozilla {
++
++typedef struct
++{
++ GstAllocator parent;
++ GStreamerReader *reader;
++} MozGfxMemoryAllocator;
++
++typedef struct
++{
++ GstAllocatorClass parent;
++} MozGfxMemoryAllocatorClass;
++
++typedef struct
++{
++ GstMemory memory;
++ PlanarYCbCrImage* image;
++ guint8* data;
++} MozGfxMemory;
++
++typedef struct
++{
++ GstMeta meta;
++} MozGfxMeta;
++
++typedef struct
++{
++ GstVideoBufferPoolClass parent_class;
++} MozGfxBufferPoolClass;
++
++typedef struct
++{
++ GstVideoBufferPool pool;
++} MozGfxBufferPool;
++
++G_DEFINE_TYPE(MozGfxMemoryAllocator, moz_gfx_memory_allocator, GST_TYPE_ALLOCATOR);
++G_DEFINE_TYPE(MozGfxBufferPool, moz_gfx_buffer_pool, GST_TYPE_VIDEO_BUFFER_POOL);
++
++void
++moz_gfx_memory_reset(MozGfxMemory *mem)
++{
++ if (mem->image)
++ mem->image->Release();
++
++ ImageContainer* container = ((MozGfxMemoryAllocator*) mem->memory.allocator)->reader->GetImageContainer();
++ ImageFormat format = PLANAR_YCBCR;
++ mem->image = reinterpret_cast<PlanarYCbCrImage*>(container->CreateImage(&format, 1).get());
++ mem->data = mem->image->AllocateAndGetNewBuffer(mem->memory.size);
++}
++
++static GstMemory*
++moz_gfx_memory_allocator_alloc(GstAllocator* aAllocator, gsize aSize,
++ GstAllocationParams* aParams)
++{
++ MozGfxMemory* mem = g_slice_new (MozGfxMemory);
++ gsize maxsize = aSize + aParams->prefix + aParams->padding;
++ gst_memory_init(GST_MEMORY_CAST (mem),
++ (GstMemoryFlags)aParams->flags,
++ aAllocator, NULL, maxsize, aParams->align,
++ aParams->prefix, aSize);
++ mem->image = NULL;
++ moz_gfx_memory_reset(mem);
++
++ return (GstMemory *) mem;
++}
++
++static void
++moz_gfx_memory_allocator_free (GstAllocator * allocator, GstMemory * gmem)
++{
++ MozGfxMemory *mem = (MozGfxMemory *) gmem;
++
++ if (mem->memory.parent)
++ goto sub_mem;
++
++ if (mem->image)
++ mem->image->Release();
++
++sub_mem:
++ g_slice_free (MozGfxMemory, mem);
++}
++
++static gpointer
++moz_gfx_memory_map (MozGfxMemory * mem, gsize maxsize, GstMapFlags flags)
++{
++ // check that the allocation didn't fail
++ if (mem->data == nullptr)
++ return nullptr;
++
++ return mem->data + mem->memory.offset;
++}
++
++static gboolean
++moz_gfx_memory_unmap (MozGfxMemory * mem)
++{
++ return TRUE;
++}
++
++static MozGfxMemory *
++moz_gfx_memory_share (MozGfxMemory * mem, gssize offset, gsize size)
++{
++ MozGfxMemory *sub;
++ GstMemory *parent;
++
++ /* find the real parent */
++ if ((parent = mem->memory.parent) == NULL)
++ parent = (GstMemory *) mem;
++
++ if (size == (gsize) -1)
++ size = mem->memory.size - offset;
++
++ /* the shared memory is always readonly */
++ sub = g_slice_new (MozGfxMemory);
++
++ gst_memory_init (GST_MEMORY_CAST (sub),
++ (GstMemoryFlags) (GST_MINI_OBJECT_FLAGS (parent) | GST_MINI_OBJECT_FLAG_LOCK_READONLY),
++ mem->memory.allocator, &mem->memory, mem->memory.maxsize, mem->memory.align,
++ mem->memory.offset + offset, size);
++
++ sub->image = mem->image;
++ sub->data = mem->data;
++
++ return sub;
++}
++
++static void
++moz_gfx_memory_allocator_class_init (MozGfxMemoryAllocatorClass * klass)
++{
++ GstAllocatorClass *allocator_class;
++
++ allocator_class = (GstAllocatorClass *) klass;
++
++ allocator_class->alloc = moz_gfx_memory_allocator_alloc;
++ allocator_class->free = moz_gfx_memory_allocator_free;
++}
++
++static void
++moz_gfx_memory_allocator_init (MozGfxMemoryAllocator * allocator)
++{
++ GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator);
++
++ alloc->mem_type = "moz-gfx-image";
++ alloc->mem_map = (GstMemoryMapFunction) moz_gfx_memory_map;
++ alloc->mem_unmap = (GstMemoryUnmapFunction) moz_gfx_memory_unmap;
++ alloc->mem_share = (GstMemoryShareFunction) moz_gfx_memory_share;
++ /* fallback copy and is_span */
++}
++
++void
++moz_gfx_memory_allocator_set_reader(GstAllocator* aAllocator, GStreamerReader* aReader)
++{
++ MozGfxMemoryAllocator *allocator = (MozGfxMemoryAllocator *) aAllocator;
++ allocator->reader = aReader;
++}
++
++nsRefPtr<PlanarYCbCrImage>
++moz_gfx_memory_get_image(GstMemory *aMemory)
++{
++ NS_ASSERTION(GST_IS_MOZ_GFX_MEMORY_ALLOCATOR(aMemory->allocator), "Should be a gfx image");
++
++ return ((MozGfxMemory *) aMemory)->image;
++}
++
++void
++moz_gfx_buffer_pool_reset_buffer (GstBufferPool* aPool, GstBuffer* aBuffer)
++{
++ GstMemory* mem = gst_buffer_peek_memory(aBuffer, 0);
++
++ NS_ASSERTION(GST_IS_MOZ_GFX_MEMORY_ALLOCATOR(mem->allocator), "Should be a gfx image");
++ moz_gfx_memory_reset((MozGfxMemory *) mem);
++ GST_BUFFER_POOL_CLASS(moz_gfx_buffer_pool_parent_class)->reset_buffer(aPool, aBuffer);
++}
++
++static void
++moz_gfx_buffer_pool_class_init (MozGfxBufferPoolClass * klass)
++{
++ GstBufferPoolClass *pool_class = (GstBufferPoolClass *) klass;
++ pool_class->reset_buffer = moz_gfx_buffer_pool_reset_buffer;
++}
++
++static void
++moz_gfx_buffer_pool_init (MozGfxBufferPool * pool)
++{
++}
++
++} // namespace mozilla
+diff --git content/media/gstreamer/GStreamerAllocator.h content/media/gstreamer/GStreamerAllocator.h
+new file mode 100644
+index 0000000..05a4412
+--- /dev/null
++++ content/media/gstreamer/GStreamerAllocator.h
+@@ -0,0 +1,25 @@
++/* This Source Code Form is subject to the terms of the Mozilla Public
++ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
++ * You can obtain one at http://mozilla.org/MPL/2.0/. */
++
++#if !defined(GStreamerAllocator_h_)
++#define GStreamerAllocator_h_
++
++#include "GStreamerReader.h"
++
++#define GST_TYPE_MOZ_GFX_MEMORY_ALLOCATOR (moz_gfx_memory_allocator_get_type())
++#define GST_IS_MOZ_GFX_MEMORY_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MOZ_GFX_MEMORY_ALLOCATOR))
++#define GST_TYPE_MOZ_GFX_BUFFER_POOL (moz_gfx_buffer_pool_get_type())
++#define GST_IS_MOZ_GFX_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MOZ_GFX_BUFFER_POOL))
++
++namespace mozilla {
++
++GType moz_gfx_memory_allocator_get_type();
++void moz_gfx_memory_allocator_set_reader(GstAllocator *aAllocator, GStreamerReader* aReader);
++nsRefPtr<layers::PlanarYCbCrImage> moz_gfx_memory_get_image(GstMemory *aMemory);
++
++GType moz_gfx_buffer_pool_get_type();
++
++} // namespace mozilla
++
++#endif
+diff --git content/media/gstreamer/GStreamerFormatHelper.cpp content/media/gstreamer/GStreamerFormatHelper.cpp
+index be71331..a5e5db8 100644
+--- content/media/gstreamer/GStreamerFormatHelper.cpp
++++ content/media/gstreamer/GStreamerFormatHelper.cpp
+@@ -294,12 +294,23 @@ bool GStreamerFormatHelper::CanHandleCodecCaps(GstCaps* aCaps)
+ GList* GStreamerFormatHelper::GetFactories() {
+ NS_ASSERTION(sLoadOK, "GStreamer library not linked");
+
+- uint32_t cookie = gst_default_registry_get_feature_list_cookie ();
++#if GST_VERSION_MAJOR >= 1
++ uint32_t cookie = gst_registry_get_feature_list_cookie(gst_registry_get());
++#else
++ uint32_t cookie = gst_default_registry_get_feature_list_cookie();
++#endif
+ if (cookie != mCookie) {
+ g_list_free(mFactories);
++#if GST_VERSION_MAJOR >= 1
++ mFactories =
++ gst_registry_feature_filter(gst_registry_get(),
++ (GstPluginFeatureFilter)FactoryFilter,
++ false, nullptr);
++#else
+ mFactories =
+ gst_default_registry_feature_filter((GstPluginFeatureFilter)FactoryFilter,
+ false, nullptr);
++#endif
+ mCookie = cookie;
+ }
+
+diff --git content/media/gstreamer/GStreamerFunctionList.h content/media/gstreamer/GStreamerFunctionList.h
+index 56877c0..e169449 100644
+--- content/media/gstreamer/GStreamerFunctionList.h
++++ content/media/gstreamer/GStreamerFunctionList.h
+@@ -9,7 +9,6 @@
+ * List of symbol names we need to dlsym from the gstreamer library.
+ */
+ GST_FUNC(LIBGSTAPP, gst_app_sink_get_type)
+-GST_FUNC(LIBGSTAPP, gst_app_sink_pull_buffer)
+ GST_FUNC(LIBGSTAPP, gst_app_sink_set_callbacks)
+ GST_FUNC(LIBGSTAPP, gst_app_src_end_of_stream)
+ GST_FUNC(LIBGSTAPP, gst_app_src_get_size)
+@@ -22,10 +21,8 @@ GST_FUNC(LIBGSTAPP, gst_app_src_set_stream_type)
+ GST_FUNC(LIBGSTREAMER, gst_bin_get_by_name)
+ GST_FUNC(LIBGSTREAMER, gst_bin_get_type)
+ GST_FUNC(LIBGSTREAMER, gst_bin_iterate_recurse)
+-GST_FUNC(LIBGSTREAMER, gst_buffer_copy_metadata)
+ GST_FUNC(LIBGSTREAMER, gst_buffer_get_type)
+ GST_FUNC(LIBGSTREAMER, gst_buffer_new)
+-GST_FUNC(LIBGSTREAMER, gst_buffer_new_and_alloc)
+ GST_FUNC(LIBGSTREAMER, gst_bus_set_sync_handler)
+ GST_FUNC(LIBGSTREAMER, gst_bus_timed_pop_filtered)
+ GST_FUNC(LIBGSTREAMER, gst_caps_append)
+@@ -37,47 +34,37 @@ GST_FUNC(LIBGSTREAMER, gst_caps_new_any)
+ GST_FUNC(LIBGSTREAMER, gst_caps_new_empty)
+ GST_FUNC(LIBGSTREAMER, gst_caps_new_full)
+ GST_FUNC(LIBGSTREAMER, gst_caps_new_simple)
+-GST_FUNC(LIBGSTREAMER, gst_caps_unref)
+-GST_FUNC(LIBGSTREAMER, gst_element_factory_get_klass)
++GST_FUNC(LIBGSTREAMER, gst_caps_set_simple)
+ GST_FUNC(LIBGSTREAMER, gst_element_factory_get_static_pad_templates)
+ GST_FUNC(LIBGSTREAMER, gst_element_factory_get_type)
+ GST_FUNC(LIBGSTREAMER, gst_element_factory_make)
+ GST_FUNC(LIBGSTREAMER, gst_element_get_factory)
+-GST_FUNC(LIBGSTREAMER, gst_element_get_pad)
++GST_FUNC(LIBGSTREAMER, gst_element_get_static_pad)
+ GST_FUNC(LIBGSTREAMER, gst_element_get_type)
+ GST_FUNC(LIBGSTREAMER, gst_element_query_convert)
+ GST_FUNC(LIBGSTREAMER, gst_element_query_duration)
+ GST_FUNC(LIBGSTREAMER, gst_element_seek_simple)
+ GST_FUNC(LIBGSTREAMER, gst_element_set_state)
+-GST_FUNC(LIBGSTREAMER, gst_event_parse_new_segment)
+ GST_FUNC(LIBGSTREAMER, gst_flow_get_name)
+ GST_FUNC(LIBGSTREAMER, gst_init)
+ GST_FUNC(LIBGSTREAMER, gst_init_check)
+ GST_FUNC(LIBGSTREAMER, gst_iterator_next)
+ GST_FUNC(LIBGSTREAMER, gst_message_parse_error)
+ GST_FUNC(LIBGSTREAMER, gst_message_type_get_name)
+-GST_FUNC(LIBGSTREAMER, gst_mini_object_get_type)
+-GST_FUNC(LIBGSTREAMER, gst_mini_object_new)
+ GST_FUNC(LIBGSTREAMER, gst_mini_object_ref)
+ GST_FUNC(LIBGSTREAMER, gst_mini_object_unref)
+ GST_FUNC(LIBGSTREAMER, gst_object_get_name)
+ GST_FUNC(LIBGSTREAMER, gst_object_get_parent)
+ GST_FUNC(LIBGSTREAMER, gst_object_unref)
+-GST_FUNC(LIBGSTREAMER, gst_pad_add_event_probe)
+-GST_FUNC(LIBGSTREAMER, gst_pad_alloc_buffer)
+ GST_FUNC(LIBGSTREAMER, gst_pad_get_element_private)
+-GST_FUNC(LIBGSTREAMER, gst_pad_get_negotiated_caps)
+-GST_FUNC(LIBGSTREAMER, gst_pad_set_bufferalloc_function)
+ GST_FUNC(LIBGSTREAMER, gst_pad_set_element_private)
+ GST_FUNC(LIBGSTREAMER, gst_parse_bin_from_description)
+ GST_FUNC(LIBGSTREAMER, gst_pipeline_get_bus)
+ GST_FUNC(LIBGSTREAMER, gst_pipeline_get_type)
+ GST_FUNC(LIBGSTREAMER, gst_plugin_feature_get_rank)
+ GST_FUNC(LIBGSTREAMER, gst_registry_feature_filter)
+-GST_FUNC(LIBGSTREAMER, gst_registry_get_default)
+ GST_FUNC(LIBGSTREAMER, gst_registry_get_feature_list_cookie)
+ GST_FUNC(LIBGSTREAMER, gst_segment_init)
+-GST_FUNC(LIBGSTREAMER, gst_segment_set_newsegment)
+ GST_FUNC(LIBGSTREAMER, gst_segment_to_stream_time)
+ GST_FUNC(LIBGSTREAMER, gst_static_caps_get)
+ GST_FUNC(LIBGSTREAMER, gst_structure_copy)
+@@ -85,11 +72,82 @@ GST_FUNC(LIBGSTREAMER, gst_structure_get_int)
+ GST_FUNC(LIBGSTREAMER, gst_structure_get_value)
+ GST_FUNC(LIBGSTREAMER, gst_structure_new)
+ GST_FUNC(LIBGSTREAMER, gst_util_uint64_scale)
++
++#if GST_VERSION_MAJOR == 0
++GST_FUNC(LIBGSTAPP, gst_app_sink_pull_buffer)
++GST_FUNC(LIBGSTREAMER, gst_buffer_copy_metadata)
++GST_FUNC(LIBGSTREAMER, gst_buffer_new_and_alloc)
++GST_FUNC(LIBGSTREAMER, gst_caps_unref)
++GST_FUNC(LIBGSTREAMER, gst_element_factory_get_klass)
++GST_FUNC(LIBGSTREAMER, gst_element_get_pad)
++GST_FUNC(LIBGSTREAMER, gst_event_parse_new_segment)
++GST_FUNC(LIBGSTREAMER, gst_mini_object_get_type)
++GST_FUNC(LIBGSTREAMER, gst_mini_object_new)
++GST_FUNC(LIBGSTREAMER, gst_pad_add_event_probe)
++GST_FUNC(LIBGSTREAMER, gst_pad_alloc_buffer)
++GST_FUNC(LIBGSTREAMER, gst_pad_get_negotiated_caps)
++GST_FUNC(LIBGSTREAMER, gst_pad_set_bufferalloc_function)
++GST_FUNC(LIBGSTREAMER, gst_registry_get_default)
++GST_FUNC(LIBGSTREAMER, gst_segment_set_newsegment)
+ GST_FUNC(LIBGSTVIDEO, gst_video_format_get_component_height)
+ GST_FUNC(LIBGSTVIDEO, gst_video_format_get_component_offset)
+ GST_FUNC(LIBGSTVIDEO, gst_video_format_get_component_width)
++GST_FUNC(LIBGSTVIDEO, gst_video_format_get_pixel_stride)
+ GST_FUNC(LIBGSTVIDEO, gst_video_format_get_row_stride)
+ GST_FUNC(LIBGSTVIDEO, gst_video_format_parse_caps)
++#else
++
++GST_FUNC(LIBGSTAPP, gst_app_sink_pull_sample)
++GST_FUNC(LIBGSTREAMER, _gst_caps_any)
++GST_FUNC(LIBGSTREAMER, gst_allocator_get_type)
++GST_FUNC(LIBGSTREAMER, gst_buffer_copy_into)
++GST_FUNC(LIBGSTREAMER, gst_buffer_extract)
++GST_FUNC(LIBGSTREAMER, gst_buffer_get_meta)
++GST_FUNC(LIBGSTREAMER, gst_buffer_get_size)
++GST_FUNC(LIBGSTREAMER, gst_buffer_map)
++GST_FUNC(LIBGSTREAMER, gst_buffer_new_allocate)
++GST_FUNC(LIBGSTREAMER, gst_buffer_n_memory)
++GST_FUNC(LIBGSTREAMER, gst_buffer_peek_memory)
++GST_FUNC(LIBGSTREAMER, gst_buffer_pool_acquire_buffer)
++GST_FUNC(LIBGSTREAMER, gst_buffer_pool_config_set_allocator)
++GST_FUNC(LIBGSTREAMER, gst_buffer_pool_config_set_params)
++GST_FUNC(LIBGSTREAMER, gst_buffer_pool_get_config)
++GST_FUNC(LIBGSTREAMER, gst_buffer_pool_get_type)
++GST_FUNC(LIBGSTREAMER, gst_buffer_pool_is_active)
++GST_FUNC(LIBGSTREAMER, gst_buffer_pool_set_active)
++GST_FUNC(LIBGSTREAMER, gst_buffer_pool_set_config)
++GST_FUNC(LIBGSTREAMER, gst_buffer_set_size)
++GST_FUNC(LIBGSTREAMER, gst_buffer_unmap)
++GST_FUNC(LIBGSTREAMER, gst_element_factory_get_metadata)
++GST_FUNC(LIBGSTREAMER, gst_event_parse_segment)
++GST_FUNC(LIBGSTREAMER, gst_memory_init)
++GST_FUNC(LIBGSTREAMER, gst_memory_map)
++GST_FUNC(LIBGSTREAMER, gst_memory_unmap)
++GST_FUNC(LIBGSTREAMER, gst_object_get_type)
++GST_FUNC(LIBGSTREAMER, gst_pad_add_probe)
++GST_FUNC(LIBGSTREAMER, gst_pad_get_current_caps)
++GST_FUNC(LIBGSTREAMER, gst_pad_probe_info_get_query)
++GST_FUNC(LIBGSTREAMER, gst_query_add_allocation_meta)
++GST_FUNC(LIBGSTREAMER, gst_query_add_allocation_param)
++GST_FUNC(LIBGSTREAMER, gst_query_add_allocation_pool)
++GST_FUNC(LIBGSTREAMER, gst_query_parse_allocation)
++GST_FUNC(LIBGSTREAMER, gst_registry_get)
++GST_FUNC(LIBGSTREAMER, gst_sample_get_buffer)
++GST_FUNC(LIBGSTREAMER, gst_segment_copy_into)
++GST_FUNC(LIBGSTREAMER, gst_structure_free)
++GST_FUNC(LIBGSTVIDEO, gst_buffer_pool_config_get_video_alignment)
++GST_FUNC(LIBGSTVIDEO, gst_buffer_pool_has_option)
++GST_FUNC(LIBGSTVIDEO, gst_video_buffer_pool_get_type)
++GST_FUNC(LIBGSTVIDEO, gst_video_frame_map)
++GST_FUNC(LIBGSTVIDEO, gst_video_frame_unmap)
++GST_FUNC(LIBGSTVIDEO, gst_video_info_align)
++GST_FUNC(LIBGSTVIDEO, gst_video_info_from_caps)
++GST_FUNC(LIBGSTVIDEO, gst_video_info_init)
++GST_FUNC(LIBGSTVIDEO, gst_video_meta_api_get_type)
++GST_FUNC(LIBGSTVIDEO, gst_video_meta_map)
++GST_FUNC(LIBGSTVIDEO, gst_video_meta_unmap)
++
++#endif
+
+ /*
+ * Functions that have been defined in the header file. We replace them so that
+@@ -99,6 +157,11 @@ GST_FUNC(LIBGSTVIDEO, gst_video_format_parse_caps)
+ REPLACE_FUNC(gst_buffer_ref);
+ REPLACE_FUNC(gst_buffer_unref);
+ REPLACE_FUNC(gst_message_unref);
++
++#if GST_VERSION_MAJOR == 1
++REPLACE_FUNC(gst_caps_unref);
++REPLACE_FUNC(gst_sample_unref);
++#endif
+ #endif
+
+ #endif // !defined(__APPLE__)
+diff --git content/media/gstreamer/GStreamerLoader.cpp content/media/gstreamer/GStreamerLoader.cpp
+index 5961b23..e6457e0 100644
+--- content/media/gstreamer/GStreamerLoader.cpp
++++ content/media/gstreamer/GStreamerLoader.cpp
+@@ -6,13 +6,21 @@
+ #include <dlfcn.h>
+ #include <stdio.h>
+
+-#include "GStreamerLoader.h"
++#include "nsDebug.h"
+ #include "mozilla/NullPtr.h"
+
++#include "GStreamerLoader.h"
++
+ #define LIBGSTREAMER 0
+ #define LIBGSTAPP 1
+ #define LIBGSTVIDEO 2
+
++#ifdef __OpenBSD__
++#define LIB_GST_SUFFIX ".so"
++#else
++#define LIB_GST_SUFFIX ".so.0"
++#endif
++
+ namespace mozilla {
+
+ /*
+@@ -32,6 +40,11 @@ namespace mozilla {
+ GstBuffer * gst_buffer_ref_impl(GstBuffer *buf);
+ void gst_buffer_unref_impl(GstBuffer *buf);
+ void gst_message_unref_impl(GstMessage *msg);
++void gst_caps_unref_impl(GstCaps *caps);
++
++#if GST_VERSION_MAJOR == 1
++void gst_sample_unref_impl(GstSample *sample);
++#endif
+
+ bool
+ load_gstreamer()
+@@ -58,32 +71,25 @@ load_gstreamer()
+ if (major == GST_VERSION_MAJOR && minor == GST_VERSION_MINOR) {
+ gstreamerLib = RTLD_DEFAULT;
+ } else {
+-#ifdef __OpenBSD__
+- gstreamerLib = dlopen("libgstreamer-0.10.so", RTLD_NOW | RTLD_LOCAL);
+-#else
+- gstreamerLib = dlopen("libgstreamer-0.10.so.0", RTLD_NOW | RTLD_LOCAL);
+-#endif
++ gstreamerLib = dlopen("libgstreamer-" GST_API_VERSION LIB_GST_SUFFIX, RTLD_NOW | RTLD_LOCAL);
+ }
+
+- void *handles[] = {
++ void *handles[3] = {
+ gstreamerLib,
+-#ifdef __OpenBSD__
+- dlopen("libgstapp-0.10.so", RTLD_NOW | RTLD_LOCAL),
+- dlopen("libgstvideo-0.10.so", RTLD_NOW | RTLD_LOCAL)
+-#else
+- dlopen("libgstapp-0.10.so.0", RTLD_NOW | RTLD_LOCAL),
+- dlopen("libgstvideo-0.10.so.0", RTLD_NOW | RTLD_LOCAL)
+-#endif
++ dlopen("libgstapp-" GST_API_VERSION LIB_GST_SUFFIX, RTLD_NOW | RTLD_LOCAL),
++ dlopen("libgstvideo-" GST_API_VERSION LIB_GST_SUFFIX, RTLD_NOW | RTLD_LOCAL)
+ };
+
+ for (size_t i = 0; i < sizeof(handles) / sizeof(handles[0]); i++) {
+ if (!handles[i]) {
++ NS_WARNING("Couldn't link gstreamer libraries");
+ goto fail;
+ }
+ }
+
+ #define GST_FUNC(lib, symbol) \
+ if (!(symbol = (typeof(symbol))dlsym(handles[lib], #symbol))) { \
++ NS_WARNING("Couldn't link symbol " #symbol); \
+ goto fail; \
+ }
+ #define REPLACE_FUNC(symbol) symbol = symbol##_impl;
+@@ -123,4 +129,18 @@ gst_message_unref_impl(GstMessage *msg)
+ gst_mini_object_unref(GST_MINI_OBJECT_CAST(msg));
+ }
+
++#if GST_VERSION_MAJOR == 1
++void
++gst_sample_unref_impl(GstSample *sample)
++{
++ gst_mini_object_unref(GST_MINI_OBJECT_CAST(sample));
++}
++#endif
++
++void
++gst_caps_unref_impl(GstCaps *caps)
++{
++ gst_mini_object_unref(GST_MINI_OBJECT_CAST(caps));
++}
++
+ }
+diff --git content/media/gstreamer/GStreamerLoader.h content/media/gstreamer/GStreamerLoader.h
+index 2d801722..cd7fe6d 100644
+--- content/media/gstreamer/GStreamerLoader.h
++++ content/media/gstreamer/GStreamerLoader.h
+@@ -22,6 +22,11 @@
+ #include <gst/video/video.h>
+ #pragma GCC diagnostic pop
+
++#if GST_VERSION_MAJOR == 1
++#include <gst/video/gstvideometa.h>
++#include <gst/video/gstvideopool.h>
++#endif
++
+ namespace mozilla {
+
+ /*
+@@ -42,4 +47,7 @@ bool load_gstreamer();
+
+ }
+
++#undef GST_CAPS_ANY
++#define GST_CAPS_ANY (*_gst_caps_any)
++
+ #endif // GStreamerLoader_h_
+diff --git content/media/gstreamer/GStreamerReader-0.10.cpp content/media/gstreamer/GStreamerReader-0.10.cpp
+new file mode 100644
+index 0000000..fb98bde
+--- /dev/null
++++ content/media/gstreamer/GStreamerReader-0.10.cpp
+@@ -0,0 +1,203 @@
++#include "nsError.h"
++#include "MediaDecoderStateMachine.h"
++#include "AbstractMediaDecoder.h"
++#include "MediaResource.h"
++#include "GStreamerReader.h"
++#include "GStreamerMozVideoBuffer.h"
++#include "GStreamerFormatHelper.h"
++#include "VideoUtils.h"
++#include "mozilla/dom/TimeRanges.h"
++#include "mozilla/Preferences.h"
++
++using namespace mozilla;
++using mozilla::layers::PlanarYCbCrImage;
++using mozilla::layers::ImageContainer;
++
++GstFlowReturn GStreamerReader::AllocateVideoBufferCb(GstPad* aPad,
++ guint64 aOffset,
++ guint aSize,
++ GstCaps* aCaps,
++ GstBuffer** aBuf)
++{
++ GStreamerReader* reader = reinterpret_cast<GStreamerReader*>(gst_pad_get_element_private(aPad));
++ return reader->AllocateVideoBuffer(aPad, aOffset, aSize, aCaps, aBuf);
++}
++
++GstFlowReturn GStreamerReader::AllocateVideoBuffer(GstPad* aPad,
++ guint64 aOffset,
++ guint aSize,
++ GstCaps* aCaps,
++ GstBuffer** aBuf)
++{
++ nsRefPtr<PlanarYCbCrImage> image;
++ return AllocateVideoBufferFull(aPad, aOffset, aSize, aCaps, aBuf, image);
++}
++
++GstFlowReturn GStreamerReader::AllocateVideoBufferFull(GstPad* aPad,
++ guint64 aOffset,
++ guint aSize,
++ GstCaps* aCaps,
++ GstBuffer** aBuf,
++ nsRefPtr<PlanarYCbCrImage>& aImage)
++{
++ /* allocate an image using the container */
++ ImageContainer* container = mDecoder->GetImageContainer();
++ if (!container) {
++ // We don't have an ImageContainer. We probably belong to an <audio>
++ // element.
++ return GST_FLOW_NOT_SUPPORTED;
++ }
++ ImageFormat format = PLANAR_YCBCR;
++ PlanarYCbCrImage* img = reinterpret_cast<PlanarYCbCrImage*>(container->CreateImage(&format, 1).get());
++ nsRefPtr<PlanarYCbCrImage> image = dont_AddRef(img);
++
++ /* prepare a GstBuffer pointing to the underlying PlanarYCbCrImage buffer */
++ GstBuffer* buf = GST_BUFFER(gst_moz_video_buffer_new());
++ GST_BUFFER_SIZE(buf) = aSize;
++ /* allocate the actual YUV buffer */
++ GST_BUFFER_DATA(buf) = image->AllocateAndGetNewBuffer(aSize);
++
++ aImage = image;
++
++ /* create a GstMozVideoBufferData to hold the image */
++ GstMozVideoBufferData* bufferdata = new GstMozVideoBufferData(image);
++
++ /* Attach bufferdata to our GstMozVideoBuffer, it will take care to free it */
++ gst_moz_video_buffer_set_data(GST_MOZ_VIDEO_BUFFER(buf), bufferdata);
++
++ *aBuf = buf;
++ return GST_FLOW_OK;
++}
++
++gboolean GStreamerReader::EventProbe(GstPad* aPad, GstEvent* aEvent)
++{
++ GstElement* parent = GST_ELEMENT(gst_pad_get_parent(aPad));
++ switch(GST_EVENT_TYPE(aEvent)) {
++ case GST_EVENT_NEWSEGMENT:
++ {
++ gboolean update;
++ gdouble rate;
++ GstFormat format;
++ gint64 start, stop, position;
++ GstSegment* segment;
++
++ /* Store the segments so we can convert timestamps to stream time, which
++ * is what the upper layers sync on.
++ */
++ ReentrantMonitorAutoEnter mon(mGstThreadsMonitor);
++ gst_event_parse_new_segment(aEvent, &update, &rate, &format,
++ &start, &stop, &position);
++ if (parent == GST_ELEMENT(mVideoAppSink))
++ segment = &mVideoSegment;
++ else
++ segment = &mAudioSegment;
++ gst_segment_set_newsegment(segment, update, rate, format,
++ start, stop, position);
++ break;
++ }
++ case GST_EVENT_FLUSH_STOP:
++ /* Reset on seeks */
++ ResetDecode();
++ break;
++ default:
++ break;
++ }
++ gst_object_unref(parent);
++
++ return TRUE;
++}
++
++gboolean GStreamerReader::EventProbeCb(GstPad* aPad,
++ GstEvent* aEvent,
++ gpointer aUserData)
++{
++ GStreamerReader* reader = reinterpret_cast<GStreamerReader*>(aUserData);
++ return reader->EventProbe(aPad, aEvent);
++}
++
++nsRefPtr<PlanarYCbCrImage> GStreamerReader::GetImageFromBuffer(GstBuffer* aBuffer)
++{
++ if (!GST_IS_MOZ_VIDEO_BUFFER (aBuffer))
++ return nullptr;
++
++ nsRefPtr<PlanarYCbCrImage> image;
++ GstMozVideoBufferData* bufferdata = reinterpret_cast<GstMozVideoBufferData*>(gst_moz_video_buffer_get_data(GST_MOZ_VIDEO_BUFFER(aBuffer)));
++ image = bufferdata->mImage;
++
++ PlanarYCbCrImage::Data data;
++ data.mPicX = data.mPicY = 0;
++ data.mPicSize = nsIntSize(mPicture.width, mPicture.height);
++ data.mStereoMode = STEREO_MODE_MONO;
++
++ data.mYChannel = GST_BUFFER_DATA(aBuffer);
++ data.mYStride = gst_video_format_get_row_stride(mFormat, 0, mPicture.width);
++ data.mYSize = nsIntSize(data.mYStride,
++ gst_video_format_get_component_height(mFormat, 0, mPicture.height));
++ data.mYSkip = 0;
++ data.mCbCrStride = gst_video_format_get_row_stride(mFormat, 1, mPicture.width);
++ data.mCbCrSize = nsIntSize(data.mCbCrStride,
++ gst_video_format_get_component_height(mFormat, 1, mPicture.height));
++ data.mCbChannel = data.mYChannel + gst_video_format_get_component_offset(mFormat, 1,
++ mPicture.width, mPicture.height);
++ data.mCrChannel = data.mYChannel + gst_video_format_get_component_offset(mFormat, 2,
++ mPicture.width, mPicture.height);
++ data.mCbSkip = 0;
++ data.mCrSkip = 0;
++
++ image->SetDataNoCopy(data);
++
++ return image;
++}
++
++void GStreamerReader::CopyIntoImageBuffer(GstBuffer* aBuffer,
++ GstBuffer** aOutBuffer,
++ nsRefPtr<PlanarYCbCrImage> &aImage)
++{
++ AllocateVideoBufferFull(nullptr, GST_BUFFER_OFFSET(aBuffer),
++ GST_BUFFER_SIZE(aBuffer), nullptr, aOutBuffer, aImage);
++
++ gst_buffer_copy_metadata(*aOutBuffer, aBuffer, (GstBufferCopyFlags)GST_BUFFER_COPY_ALL);
++ memcpy(GST_BUFFER_DATA(*aOutBuffer), GST_BUFFER_DATA(aBuffer), GST_BUFFER_SIZE(*aOutBuffer));
++
++ aImage = GetImageFromBuffer(*aOutBuffer);
++}
++
++GstCaps* GStreamerReader::BuildAudioSinkCaps()
++{
++ GstCaps* caps;
++#ifdef IS_LITTLE_ENDIAN
++ int endianness = 1234;
++#else
++ int endianness = 4321;
++#endif
++ gint width;
++#ifdef MOZ_SAMPLE_TYPE_FLOAT32
++ caps = gst_caps_from_string("audio/x-raw-float, channels={1,2}");
++ width = 32;
++#else /* !MOZ_SAMPLE_TYPE_FLOAT32 */
++ caps = gst_caps_from_string("audio/x-raw-int, channels={1,2}");
++ width = 16;
++#endif
++ gst_caps_set_simple(caps,
++ "width", G_TYPE_INT, width,
++ "endianness", G_TYPE_INT, endianness,
++ NULL);
++
++ return caps;
++}
++
++void GStreamerReader::InstallPadCallbacks()
++{
++ GstPad* sinkpad = gst_element_get_static_pad(GST_ELEMENT(mVideoAppSink), "sink");
++ gst_pad_add_event_probe(sinkpad,
++ G_CALLBACK(&GStreamerReader::EventProbeCb), this);
++
++ gst_pad_set_bufferalloc_function(sinkpad, GStreamerReader::AllocateVideoBufferCb);
++ gst_pad_set_element_private(sinkpad, this);
++ gst_object_unref(sinkpad);
++
++ sinkpad = gst_element_get_static_pad(GST_ELEMENT(mAudioAppSink), "sink");
++ gst_pad_add_event_probe(sinkpad,
++ G_CALLBACK(&GStreamerReader::EventProbeCb), this);
++ gst_object_unref(sinkpad);
++}
+diff --git content/media/gstreamer/GStreamerReader.cpp content/media/gstreamer/GStreamerReader.cpp
+index 2be45dc..54509e3 100644
+--- content/media/gstreamer/GStreamerReader.cpp
++++ content/media/gstreamer/GStreamerReader.cpp
+@@ -10,8 +10,10 @@
+ #include "AbstractMediaDecoder.h"
+ #include "MediaResource.h"
+ #include "GStreamerReader.h"
++#if GST_VERSION_MAJOR >= 1
++#include "GStreamerAllocator.h"
++#endif
+ #include "GStreamerFormatHelper.h"
+-#include "GStreamerMozVideoBuffer.h"
+ #include "VideoUtils.h"
+ #include "mozilla/dom/TimeRanges.h"
+ #include "mozilla/Preferences.h"
+@@ -31,14 +33,16 @@ extern PRLogModuleInfo* gMediaDecoderLog;
+ #define LOG(type, msg, ...)
+ #endif
+
+-extern bool
+-IsYV12Format(const VideoData::YCbCrBuffer::Plane& aYPlane,
+- const VideoData::YCbCrBuffer::Plane& aCbPlane,
+- const VideoData::YCbCrBuffer::Plane& aCrPlane);
+-
++#if DEBUG
+ static const unsigned int MAX_CHANNELS = 4;
+-// Let the demuxer work in pull mode for short files
+-static const int SHORT_FILE_SIZE = 1024 * 1024;
++#endif
++// Let the demuxer work in pull mode for short files. This used to be a micro
++// optimization to have more accurate durations for ogg files in mochitests.
++// Since as of today we aren't using gstreamer to demux ogg, and having demuxers
++// work in pull mode over http makes them slower (since they really assume
++// near-zero latency in pull mode) set the constant to 0 for now, which
++// effectively disables it.
++static const int SHORT_FILE_SIZE = 0;
+ // The default resource->Read() size when working in push mode
+ static const int DEFAULT_SOURCE_READ_SIZE = 50 * 1024;
+
+@@ -60,6 +62,10 @@ GStreamerReader::GStreamerReader(AbstractMediaDecoder* aDecoder)
+ : MediaDecoderReader(aDecoder),
+ mMP3FrameParser(aDecoder->GetResource()->GetLength()),
+ mUseParserDuration(false),
++#if GST_VERSION_MAJOR >= 1
++ mAllocator(nullptr),
++ mBufferPool(nullptr),
++#endif
+ mPlayBin(nullptr),
+ mBus(nullptr),
+ mSource(nullptr),
+@@ -72,6 +78,9 @@ GStreamerReader::GStreamerReader(AbstractMediaDecoder* aDecoder)
+ mAudioSinkBufferCount(0),
+ mGstThreadsMonitor("media.gst.threads"),
+ mReachedEos(false),
++#if GST_VERSION_MAJOR >= 1
++ mConfigureAlignment(true),
++#endif
+ fpsNum(0),
+ fpsDen(0)
+ {
+@@ -83,8 +92,12 @@ GStreamerReader::GStreamerReader(AbstractMediaDecoder* aDecoder)
+
+ mSinkCallbacks.eos = GStreamerReader::EosCb;
+ mSinkCallbacks.new_preroll = GStreamerReader::NewPrerollCb;
++#if GST_VERSION_MAJOR >= 1
++ mSinkCallbacks.new_sample = GStreamerReader::NewBufferCb;
++#else
+ mSinkCallbacks.new_buffer = GStreamerReader::NewBufferCb;
+ mSinkCallbacks.new_buffer_list = nullptr;
++#endif
+
+ gst_segment_init(&mVideoSegment, GST_FORMAT_UNDEFINED);
+ gst_segment_init(&mAudioSegment, GST_FORMAT_UNDEFINED);
+@@ -108,65 +121,59 @@ GStreamerReader::~GStreamerReader()
+ mAudioAppSink = nullptr;
+ gst_object_unref(mBus);
+ mBus = nullptr;
++#if GST_VERSION_MAJOR >= 1
++ g_object_unref(mAllocator);
++ g_object_unref(mBufferPool);
++#endif
+ }
+ }
+
+ nsresult GStreamerReader::Init(MediaDecoderReader* aCloneDonor)
+ {
+- GError* error = nullptr;
+- if (!gst_init_check(0, 0, &error)) {
+- LOG(PR_LOG_ERROR, "gst initialization failed: %s", error->message);
+- g_error_free(error);
+- return NS_ERROR_FAILURE;
+- }
++ GStreamerFormatHelper::Instance();
++
++#if GST_VERSION_MAJOR >= 1
++ mAllocator = static_cast<GstAllocator*>(g_object_new(GST_TYPE_MOZ_GFX_MEMORY_ALLOCATOR, nullptr));
++ moz_gfx_memory_allocator_set_reader(mAllocator, this);
++
++ mBufferPool = static_cast<GstBufferPool*>(g_object_new(GST_TYPE_MOZ_GFX_BUFFER_POOL, nullptr));
++#endif
+
++#if GST_VERSION_MAJOR >= 1
++ mPlayBin = gst_element_factory_make("playbin", nullptr);
++#else
+ mPlayBin = gst_element_factory_make("playbin2", nullptr);
++#endif
+ if (!mPlayBin) {
+- LOG(PR_LOG_ERROR, "couldn't create playbin2");
++ LOG(PR_LOG_ERROR, "couldn't create playbin");
+ return NS_ERROR_FAILURE;
+ }
+ g_object_set(mPlayBin, "buffer-size", 0, nullptr);
+ mBus = gst_pipeline_get_bus(GST_PIPELINE(mPlayBin));
+
+ mVideoSink = gst_parse_bin_from_description("capsfilter name=filter ! "
+- "appsink name=videosink sync=true max-buffers=1 "
++ "appsink name=videosink sync=false max-buffers=1 "
++#if GST_VERSION_MAJOR >= 1
++ "caps=video/x-raw,format=I420"
++#else
+ "caps=video/x-raw-yuv,format=(fourcc)I420"
++#endif
+ , TRUE, nullptr);
+ mVideoAppSink = GST_APP_SINK(gst_bin_get_by_name(GST_BIN(mVideoSink),
+ "videosink"));
+- gst_app_sink_set_callbacks(mVideoAppSink, &mSinkCallbacks,
+- (gpointer) this, nullptr);
+- GstPad* sinkpad = gst_element_get_pad(GST_ELEMENT(mVideoAppSink), "sink");
+- gst_pad_add_event_probe(sinkpad,
+- G_CALLBACK(&GStreamerReader::EventProbeCb), this);
+- gst_object_unref(sinkpad);
+- gst_pad_set_bufferalloc_function(sinkpad, GStreamerReader::AllocateVideoBufferCb);
+- gst_pad_set_element_private(sinkpad, this);
+-
+ mAudioSink = gst_parse_bin_from_description("capsfilter name=filter ! "
+-#ifdef MOZ_SAMPLE_TYPE_FLOAT32
+- "appsink name=audiosink max-buffers=2 sync=false caps=audio/x-raw-float,"
+-#ifdef IS_LITTLE_ENDIAN
+- "channels={1,2},width=32,endianness=1234", TRUE, nullptr);
+-#else
+- "channels={1,2},width=32,endianness=4321", TRUE, nullptr);
+-#endif
+-#else
+- "appsink name=audiosink max-buffers=2 sync=false caps=audio/x-raw-int,"
+-#ifdef IS_LITTLE_ENDIAN
+- "channels={1,2},width=16,endianness=1234", TRUE, nullptr);
+-#else
+- "channels={1,2},width=16,endianness=4321", TRUE, nullptr);
+-#endif
+-#endif
++ "appsink name=audiosink sync=false max-buffers=1", TRUE, nullptr);
+ mAudioAppSink = GST_APP_SINK(gst_bin_get_by_name(GST_BIN(mAudioSink),
+ "audiosink"));
++ GstCaps* caps = BuildAudioSinkCaps();
++ g_object_set(mAudioAppSink, "caps", caps, nullptr);
++ gst_caps_unref(caps);
++
++ gst_app_sink_set_callbacks(mVideoAppSink, &mSinkCallbacks,
++ (gpointer) this, nullptr);
+ gst_app_sink_set_callbacks(mAudioAppSink, &mSinkCallbacks,
+ (gpointer) this, nullptr);
+- sinkpad = gst_element_get_pad(GST_ELEMENT(mAudioAppSink), "sink");
+- gst_pad_add_event_probe(sinkpad,
+- G_CALLBACK(&GStreamerReader::EventProbeCb), this);
+- gst_object_unref(sinkpad);
++ InstallPadCallbacks();
+
+ g_object_set(mPlayBin, "uri", "appsrc://",
+ "video-sink", mVideoSink,
+@@ -331,7 +340,7 @@ nsresult GStreamerReader::ReadMetadata(MediaInfo* aInfo,
+ /* Little trick: set the target caps to "skip" so that playbin2 fails to
+ * find a decoder for the stream we want to skip.
+ */
+- GstCaps* filterCaps = gst_caps_new_simple ("skip", nullptr);
++ GstCaps* filterCaps = gst_caps_new_simple ("skip", nullptr, nullptr);
+ g_object_set(filter, "caps", filterCaps, nullptr);
+ gst_caps_unref(filterCaps);
+ gst_object_unref(filter);
+@@ -358,6 +367,7 @@ nsresult GStreamerReader::ReadMetadata(MediaInfo* aInfo,
+ gst_message_unref(message);
+ ret = NS_ERROR_FAILURE;
+ } else {
++ LOG(PR_LOG_DEBUG, "read metadata pipeline prerolled");
+ gst_message_unref(message);
+ ret = NS_OK;
+ break;
+@@ -373,21 +383,24 @@ nsresult GStreamerReader::ReadMetadata(MediaInfo* aInfo,
+
+ /* FIXME: workaround for a bug in matroskademux. This seek makes matroskademux
+ * parse the index */
++ LOG(PR_LOG_DEBUG, "doing matroskademux seek hack");
+ if (gst_element_seek_simple(mPlayBin, GST_FORMAT_TIME,
+ GST_SEEK_FLAG_FLUSH, 0)) {
+ /* after a seek we need to wait again for ASYNC_DONE */
+- message = gst_bus_timed_pop_filtered(mBus, GST_CLOCK_TIME_NONE,
++ message = gst_bus_timed_pop_filtered(mBus, 5 * GST_SECOND,
+ (GstMessageType)(GST_MESSAGE_ASYNC_DONE | GST_MESSAGE_ERROR));
+- if (GST_MESSAGE_TYPE(message) == GST_MESSAGE_ERROR) {
++ LOG(PR_LOG_DEBUG, "matroskademux seek hack done");
++ if (GST_MESSAGE_TYPE(message) != GST_MESSAGE_ASYNC_DONE) {
+ gst_element_set_state(mPlayBin, GST_STATE_NULL);
+ gst_message_unref(message);
+ return NS_ERROR_FAILURE;
+ }
++ } else {
++ LOG(PR_LOG_DEBUG, "matroskademux seek hack failed (non fatal)");
+ }
+
+ /* report the duration */
+ gint64 duration;
+- GstFormat format = GST_FORMAT_TIME;
+
+ if (isMP3 && mMP3FrameParser.IsMP3()) {
+ // The MP3FrameParser has reported a duration; use that over the gstreamer
+@@ -396,17 +409,25 @@ nsresult GStreamerReader::ReadMetadata(MediaInfo* aInfo,
+ mUseParserDuration = true;
+ mLastParserDuration = mMP3FrameParser.GetDuration();
+ mDecoder->SetMediaDuration(mLastParserDuration);
+-
+- } else if (gst_element_query_duration(GST_ELEMENT(mPlayBin),
+- &format, &duration) && format == GST_FORMAT_TIME) {
+- // Otherwise use the gstreamer duration.
+- ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
+- LOG(PR_LOG_DEBUG, "returning duration %" GST_TIME_FORMAT, GST_TIME_ARGS(duration));
+- duration = GST_TIME_AS_USECONDS (duration);
+- mDecoder->SetMediaDuration(duration);
+-
+ } else {
+- mDecoder->SetMediaSeekable(false);
++ LOG(PR_LOG_DEBUG, "querying duration");
++ // Otherwise use the gstreamer duration.
++#if GST_VERSION_MAJOR >= 1
++ if (gst_element_query_duration(GST_ELEMENT(mPlayBin),
++ GST_FORMAT_TIME, &duration)) {
++#else
++ GstFormat format = GST_FORMAT_TIME;
++ if (gst_element_query_duration(GST_ELEMENT(mPlayBin),
++ &format, &duration) && format == GST_FORMAT_TIME) {
++#endif
++ ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor());
++ LOG(PR_LOG_DEBUG, "have duration %" GST_TIME_FORMAT,
++ GST_TIME_ARGS (duration));
++ duration = GST_TIME_AS_USECONDS (duration);
++ mDecoder->SetMediaDuration(duration);
++ } else {
++ mDecoder->SetMediaSeekable(false);
++ }
+ }
+
+ int n_video = 0, n_audio = 0;
+@@ -410,7 +428,11 @@ nsresult GStreamerReader::ReadMetadata(MediaInfo* aInfo,
+ *aTags = nullptr;
+
+ // Watch the pipeline for fatal errors
++#if GST_VERSION_MAJOR >= 1
++ gst_bus_set_sync_handler(mBus, GStreamerReader::ErrorCb, this, nullptr);
++#else
+ gst_bus_set_sync_handler(mBus, GStreamerReader::ErrorCb, this);
++#endif
+
+ /* set the pipeline to PLAYING so that it starts decoding and queueing data in
+ * the appsinks */
+@@ -424,19 +446,35 @@ nsresult GStreamerReader::CheckSupportedFormats()
+ bool done = false;
+ bool unsupported = false;
+
+- GstIterator *it = gst_bin_iterate_recurse(GST_BIN(mPlayBin));
++ GstIterator* it = gst_bin_iterate_recurse(GST_BIN(mPlayBin));
+ while (!done) {
++ GstIteratorResult res;
+ GstElement* element;
+- GstIteratorResult res = gst_iterator_next(it, (void **)&element);
++
++#if GST_VERSION_MAJOR >= 1
++ GValue value = {0,};
++ res = gst_iterator_next(it, &value);
++#else
++ res = gst_iterator_next(it, (void **) &element);
++#endif
+ switch(res) {
+ case GST_ITERATOR_OK:
+ {
++#if GST_VERSION_MAJOR >= 1
++ element = GST_ELEMENT (g_value_get_object (&value));
++#endif
+ GstElementFactory* factory = gst_element_get_factory(element);
+ if (factory) {
+ const char* klass = gst_element_factory_get_klass(factory);
+- GstPad* pad = gst_element_get_pad(element, "sink");
++ GstPad* pad = gst_element_get_static_pad(element, "sink");
+ if (pad) {
+- GstCaps* caps = gst_pad_get_negotiated_caps(pad);
++ GstCaps* caps;
++
++#if GST_VERSION_MAJOR >= 1
++ caps = gst_pad_get_current_caps(pad);
++#else
++ caps = gst_pad_get_negotiated_caps(pad);
++#endif
+
+ if (caps) {
+ /* check for demuxers but ignore elements like id3demux */
+@@ -451,7 +489,11 @@ nsresult GStreamerReader::CheckSupportedFormats()
+ }
+ }
+
++#if GST_VERSION_MAJOR >= 1
++ g_value_unset (&value);
++#else
+ gst_object_unref(element);
++#endif
+ done = unsupported;
+ break;
+ }
+@@ -475,6 +517,8 @@ nsresult GStreamerReader::ResetDecode()
+ {
+ nsresult res = NS_OK;
+
++ LOG(PR_LOG_DEBUG, "reset decode");
++
+ if (NS_FAILED(MediaDecoderReader::ResetDecode())) {
+ res = NS_ERROR_FAILURE;
+ }
+@@ -485,6 +529,11 @@ nsresult GStreamerReader::ResetDecode()
+ mVideoSinkBufferCount = 0;
+ mAudioSinkBufferCount = 0;
+ mReachedEos = false;
++#if GST_VERSION_MAJOR >= 1
++ mConfigureAlignment = true;
++#endif
++
++ LOG(PR_LOG_DEBUG, "reset decode done");
+
+ return res;
+ }
+@@ -508,11 +557,11 @@ bool GStreamerReader::DecodeAudioData()
+ /* We have nothing decoded so it makes no sense to return to the state machine
+ * as it will call us back immediately, we'll return again and so on, wasting
+ * CPU cycles for no job done. So, block here until there is either video or
+- * audio data available
++ * audio data available
+ */
+ mon.Wait();
+ if (!mAudioSinkBufferCount) {
+- /* There is still no audio data available, so either there is video data or
++ /* There is still no audio data available, so either there is video data or
+ * something else has happened (Eos, etc...). Return to the state machine
+ * to process it.
+ */
+@@ -524,24 +573,43 @@ bool GStreamerReader::DecodeAudioData()
+ }
+ }
+
++#if GST_VERSION_MAJOR >= 1
++ GstSample *sample = gst_app_sink_pull_sample(mAudioAppSink);
++ buffer = gst_buffer_ref(gst_sample_get_buffer(sample));
++ gst_sample_unref(sample);
++#else
+ buffer = gst_app_sink_pull_buffer(mAudioAppSink);
++#endif
++
+ mAudioSinkBufferCount--;
+ }
+
+ int64_t timestamp = GST_BUFFER_TIMESTAMP(buffer);
+ timestamp = gst_segment_to_stream_time(&mAudioSegment,
+ GST_FORMAT_TIME, timestamp);
++
+ timestamp = GST_TIME_AS_USECONDS(timestamp);
+ int64_t duration = 0;
+ if (GST_CLOCK_TIME_IS_VALID(GST_BUFFER_DURATION(buffer)))
+ duration = GST_TIME_AS_USECONDS(GST_BUFFER_DURATION(buffer));
+
+ int64_t offset = GST_BUFFER_OFFSET(buffer);
++#if GST_VERSION_MAJOR >= 1
++ GstMapInfo info;
++ gst_buffer_map(buffer, &info, GST_MAP_READ);
++ unsigned int size = info.size;
++#else
+ unsigned int size = GST_BUFFER_SIZE(buffer);
++#endif
+ int32_t frames = (size / sizeof(AudioDataValue)) / mInfo.mAudio.mChannels;
+ ssize_t outSize = static_cast<size_t>(size / sizeof(AudioDataValue));
+ nsAutoArrayPtr<AudioDataValue> data(new AudioDataValue[outSize]);
++#if GST_VERSION_MAJOR >= 1
++ memcpy(data, info.data, info.size);
++ gst_buffer_unmap(buffer, &info);
++#else
+ memcpy(data, GST_BUFFER_DATA(buffer), GST_BUFFER_SIZE(buffer));
++#endif
+ AudioData* audio = new AudioData(offset, timestamp, duration,
+ frames, data.forget(), mInfo.mAudio.mChannels);
+
+@@ -552,7 +620,7 @@ bool GStreamerReader::DecodeAudioData()
+ }
+
+ bool GStreamerReader::DecodeVideoFrame(bool &aKeyFrameSkip,
+- int64_t aTimeThreshold)
++ int64_t aTimeThreshold)
+ {
+ NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread.");
+
+@@ -571,11 +639,11 @@ bool GStreamerReader::DecodeVideoFrame(bool &aKeyFrameSkip,
+ /* We have nothing decoded so it makes no sense to return to the state machine
+ * as it will call us back immediately, we'll return again and so on, wasting
+ * CPU cycles for no job done. So, block here until there is either video or
+- * audio data available
++ * audio data available
+ */
+ mon.Wait();
+ if (!mVideoSinkBufferCount) {
+- /* There is still no video data available, so either there is audio data or
++ /* There is still no video data available, so either there is audio data or
+ * something else has happened (Eos, etc...). Return to the state machine
+ * to process it
+ */
+@@ -589,11 +657,17 @@ bool GStreamerReader::DecodeVideoFrame(bool &aKeyFrameSkip,
+
+ mDecoder->NotifyDecodedFrames(0, 1);
+
++#if GST_VERSION_MAJOR >= 1
++ GstSample *sample = gst_app_sink_pull_sample(mVideoAppSink);
++ buffer = gst_buffer_ref(gst_sample_get_buffer(sample));
++ gst_sample_unref(sample);
++#else
+ buffer = gst_app_sink_pull_buffer(mVideoAppSink);
++#endif
+ mVideoSinkBufferCount--;
+ }
+
+- bool isKeyframe = !GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DISCONT);
++ bool isKeyframe = !GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DELTA_UNIT);
+ if ((aKeyFrameSkip && !isKeyframe)) {
+ gst_buffer_unref(buffer);
+ return true;
+@@ -618,73 +695,55 @@ bool GStreamerReader::DecodeVideoFrame(bool &aKeyFrameSkip,
+ "frame has invalid timestamp");
+
+ timestamp = GST_TIME_AS_USECONDS(timestamp);
++ int64_t duration;
++ if (GST_CLOCK_TIME_IS_VALID(GST_BUFFER_DURATION(buffer)))
++ duration = GST_TIME_AS_USECONDS(GST_BUFFER_DURATION(buffer));
++ else if (fpsNum && fpsDen)
++ /* add 1-frame duration */
++ duration = gst_util_uint64_scale(GST_USECOND, fpsDen, fpsNum);
++
+ if (timestamp < aTimeThreshold) {
+ LOG(PR_LOG_DEBUG, "skipping frame %" GST_TIME_FORMAT
+- " threshold %" GST_TIME_FORMAT,
+- GST_TIME_ARGS(timestamp), GST_TIME_ARGS(aTimeThreshold));
++ " threshold %" GST_TIME_FORMAT,
++ GST_TIME_ARGS(timestamp * 1000),
++ GST_TIME_ARGS(aTimeThreshold * 1000));
+ gst_buffer_unref(buffer);
+ return true;
+ }
+-
+ if (!buffer)
+ /* no more frames */
+ return false;
+
+- int64_t duration = 0;
+- if (GST_CLOCK_TIME_IS_VALID(GST_BUFFER_DURATION(buffer)))
+- duration = GST_TIME_AS_USECONDS(GST_BUFFER_DURATION(buffer));
+- else if (fpsNum && fpsDen)
+- /* 1-frame duration */
+- duration = gst_util_uint64_scale(GST_USECOND, fpsNum, fpsDen);
+-
+- nsRefPtr<PlanarYCbCrImage> image;
+- GstMozVideoBufferData* bufferdata = reinterpret_cast<GstMozVideoBufferData*>
+- GST_IS_MOZ_VIDEO_BUFFER(buffer)?gst_moz_video_buffer_get_data(GST_MOZ_VIDEO_BUFFER(buffer)):nullptr;
+-
+- if(bufferdata)
+- image = bufferdata->mImage;
++#if GST_VERSION_MAJOR >= 1
++ if (mConfigureAlignment && buffer->pool) {
++ GstStructure *config = gst_buffer_pool_get_config(buffer->pool);
++ GstVideoAlignment align;
++ if (gst_buffer_pool_config_get_video_alignment(config, &align))
++ gst_video_info_align(&mVideoInfo, &align);
++ gst_structure_free(config);
++ mConfigureAlignment = false;
++ }
++#endif
+
++ nsRefPtr<PlanarYCbCrImage> image = GetImageFromBuffer(buffer);
+ if (!image) {
+ /* Ugh, upstream is not calling gst_pad_alloc_buffer(). Fallback to
+ * allocating a PlanarYCbCrImage backed GstBuffer here and memcpy.
+ */
+ GstBuffer* tmp = nullptr;
+- AllocateVideoBufferFull(nullptr, GST_BUFFER_OFFSET(buffer),
+- GST_BUFFER_SIZE(buffer), nullptr, &tmp, image);
+-
+- /* copy */
+- gst_buffer_copy_metadata(tmp, buffer, (GstBufferCopyFlags)GST_BUFFER_COPY_ALL);
+- memcpy(GST_BUFFER_DATA(tmp), GST_BUFFER_DATA(buffer),
+- GST_BUFFER_SIZE(tmp));
++ CopyIntoImageBuffer(buffer, &tmp, image);
+ gst_buffer_unref(buffer);
+ buffer = tmp;
+ }
+
+- guint8* data = GST_BUFFER_DATA(buffer);
+-
+- int width = mPicture.width;
+- int height = mPicture.height;
+- GstVideoFormat format = mFormat;
+-
+- VideoData::YCbCrBuffer b;
+- for(int i = 0; i < 3; i++) {
+- b.mPlanes[i].mData = data + gst_video_format_get_component_offset(format, i,
+- width, height);
+- b.mPlanes[i].mStride = gst_video_format_get_row_stride(format, i, width);
+- b.mPlanes[i].mHeight = gst_video_format_get_component_height(format,
+- i, height);
+- b.mPlanes[i].mWidth = gst_video_format_get_component_width(format,
+- i, width);
+- b.mPlanes[i].mOffset = 0;
+- b.mPlanes[i].mSkip = 0;
+- }
+-
+- isKeyframe = !GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DELTA_UNIT);
+ int64_t offset = mDecoder->GetResource()->Tell(); // Estimate location in media.
+- VideoData* video = VideoData::Create(mInfo.mVideo, image, offset,
+- timestamp, duration, b,
+- isKeyframe, -1, mPicture);
++ VideoData* video = VideoData::CreateFromImage(mInfo.mVideo,
++ mDecoder->GetImageContainer(),
++ offset, timestamp, duration,
++ static_cast<Image*>(image.get()),
++ isKeyframe, -1, mPicture);
+ mVideoQueue.Push(video);
++
+ gst_buffer_unref(buffer);
+
+ return true;
+@@ -698,6 +755,10 @@ nsresult GStreamerReader::Seek(int64_t aTarget,
+ return NS_ERROR_FAILURE;
+ }
+ LOG(PR_LOG_DEBUG, "seek succeeded");
++ GstMessage* message = gst_bus_timed_pop_filtered(mBus, GST_CLOCK_TIME_NONE,
++ (GstMessageType)(GST_MESSAGE_ASYNC_DONE | GST_MESSAGE_ERROR));
++ gst_message_unref(message);
++ LOG(PR_LOG_DEBUG, "seek completed");
+
+ return DecodeToTarget(aTarget);
+ }
+@@ -709,7 +770,9 @@ nsresult GStreamerReader::GetBuffered(dom::TimeRanges* aBuffered,
+ return NS_OK;
+ }
+
++#if GST_VERSION_MAJOR == 0
+ GstFormat format = GST_FORMAT_TIME;
++#endif
+ MediaResource* resource = mDecoder->GetResource();
+ nsTArray<MediaByteRange> ranges;
+ resource->GetCachedRanges(ranges);
+@@ -731,12 +794,21 @@ nsresult GStreamerReader::GetBuffered(dom::TimeRanges* aBuffered,
+ int64_t endOffset = ranges[index].mEnd;
+ gint64 startTime, endTime;
+
++#if GST_VERSION_MAJOR >= 1
++ if (!gst_element_query_convert(GST_ELEMENT(mPlayBin), GST_FORMAT_BYTES,
++ startOffset, GST_FORMAT_TIME, &startTime))
++ continue;
++ if (!gst_element_query_convert(GST_ELEMENT(mPlayBin), GST_FORMAT_BYTES,
++ endOffset, GST_FORMAT_TIME, &endTime))
++ continue;
++#else
+ if (!gst_element_query_convert(GST_ELEMENT(mPlayBin), GST_FORMAT_BYTES,
+ startOffset, &format, &startTime) || format != GST_FORMAT_TIME)
+ continue;
+ if (!gst_element_query_convert(GST_ELEMENT(mPlayBin), GST_FORMAT_BYTES,
+ endOffset, &format, &endTime) || format != GST_FORMAT_TIME)
+ continue;
++#endif
+
+ double start = (double) GST_TIME_AS_USECONDS (startTime) / GST_MSECOND;
+ double end = (double) GST_TIME_AS_USECONDS (endTime) / GST_MSECOND;
+@@ -755,7 +827,13 @@ void GStreamerReader::ReadAndPushData(guint aLength)
+ nsresult rv = NS_OK;
+
+ GstBuffer* buffer = gst_buffer_new_and_alloc(aLength);
++#if GST_VERSION_MAJOR >= 1
++ GstMapInfo info;
++ gst_buffer_map(buffer, &info, GST_MAP_WRITE);
++ guint8 *data = info.data;
++#else
+ guint8* data = GST_BUFFER_DATA(buffer);
++#endif
+ uint32_t size = 0, bytesRead = 0;
+ while(bytesRead < aLength) {
+ rv = resource->Read(reinterpret_cast<char*>(data + bytesRead),
+@@ -780,7 +860,12 @@ void GStreamerReader::ReadAndPushData(guint aLength)
+ int64_t offset2 = resource->Tell();
+ unused << offset2;
+
++#if GST_VERSION_MAJOR >= 1
++ gst_buffer_unmap(buffer, &info);
++ gst_buffer_set_size(buffer, bytesRead);
++#else
+ GST_BUFFER_SIZE(buffer) = bytesRead;
++#endif
+
+ GstFlowReturn ret = gst_app_src_push_buffer(mSource, gst_buffer_ref(buffer));
+ if (ret != GST_FLOW_OK) {
+@@ -786,8 +869,13 @@ int64_t GStreamerReader::QueryDuration()
+ gint64 duration = 0;
+ GstFormat format = GST_FORMAT_TIME;
+
++#if GST_VERSION_MAJOR >= 1
++ if (gst_element_query_duration(GST_ELEMENT(mPlayBin),
++ format, &duration)) {
++#else
+ if (gst_element_query_duration(GST_ELEMENT(mPlayBin),
+ &format, &duration)) {
++#endif
+ if (format == GST_FORMAT_TIME) {
+ LOG(PR_LOG_DEBUG, "pipeline duration %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (duration));
+@@ -866,108 +954,6 @@ gboolean GStreamerReader::SeekData(GstAppSrc* aSrc, guint64 aOffset)
+ return NS_SUCCEEDED(rv);
+ }
+
+-gboolean GStreamerReader::EventProbeCb(GstPad* aPad,
+- GstEvent* aEvent,
+- gpointer aUserData)
+-{
+- GStreamerReader* reader = reinterpret_cast<GStreamerReader*>(aUserData);
+- return reader->EventProbe(aPad, aEvent);
+-}
+-
+-gboolean GStreamerReader::EventProbe(GstPad* aPad, GstEvent* aEvent)
+-{
+- GstElement* parent = GST_ELEMENT(gst_pad_get_parent(aPad));
+- switch(GST_EVENT_TYPE(aEvent)) {
+- case GST_EVENT_NEWSEGMENT:
+- {
+- gboolean update;
+- gdouble rate;
+- GstFormat format;
+- gint64 start, stop, position;
+- GstSegment* segment;
+-
+- /* Store the segments so we can convert timestamps to stream time, which
+- * is what the upper layers sync on.
+- */
+- ReentrantMonitorAutoEnter mon(mGstThreadsMonitor);
+- gst_event_parse_new_segment(aEvent, &update, &rate, &format,
+- &start, &stop, &position);
+- if (parent == GST_ELEMENT(mVideoAppSink))
+- segment = &mVideoSegment;
+- else
+- segment = &mAudioSegment;
+- gst_segment_set_newsegment(segment, update, rate, format,
+- start, stop, position);
+- break;
+- }
+- case GST_EVENT_FLUSH_STOP:
+- /* Reset on seeks */
+- ResetDecode();
+- break;
+- default:
+- break;
+- }
+- gst_object_unref(parent);
+-
+- return TRUE;
+-}
+-
+-GstFlowReturn GStreamerReader::AllocateVideoBufferFull(GstPad* aPad,
+- guint64 aOffset,
+- guint aSize,
+- GstCaps* aCaps,
+- GstBuffer** aBuf,
+- nsRefPtr<PlanarYCbCrImage>& aImage)
+-{
+- /* allocate an image using the container */
+- ImageContainer* container = mDecoder->GetImageContainer();
+- if (!container) {
+- // We don't have an ImageContainer. We probably belong to an <audio>
+- // element.
+- return GST_FLOW_NOT_SUPPORTED;
+- }
+- ImageFormat format = PLANAR_YCBCR;
+- PlanarYCbCrImage* img = reinterpret_cast<PlanarYCbCrImage*>(container->CreateImage(&format, 1).get());
+- nsRefPtr<PlanarYCbCrImage> image = dont_AddRef(img);
+-
+- /* prepare a GstBuffer pointing to the underlying PlanarYCbCrImage buffer */
+- GstBuffer* buf = GST_BUFFER(gst_moz_video_buffer_new());
+- GST_BUFFER_SIZE(buf) = aSize;
+- /* allocate the actual YUV buffer */
+- GST_BUFFER_DATA(buf) = image->AllocateAndGetNewBuffer(aSize);
+-
+- aImage = image;
+-
+- /* create a GstMozVideoBufferData to hold the image */
+- GstMozVideoBufferData* bufferdata = new GstMozVideoBufferData(image);
+-
+- /* Attach bufferdata to our GstMozVideoBuffer, it will take care to free it */
+- gst_moz_video_buffer_set_data(GST_MOZ_VIDEO_BUFFER(buf), bufferdata);
+-
+- *aBuf = buf;
+- return GST_FLOW_OK;
+-}
+-
+-GstFlowReturn GStreamerReader::AllocateVideoBufferCb(GstPad* aPad,
+- guint64 aOffset,
+- guint aSize,
+- GstCaps* aCaps,
+- GstBuffer** aBuf)
+-{
+- GStreamerReader* reader = reinterpret_cast<GStreamerReader*>(gst_pad_get_element_private(aPad));
+- return reader->AllocateVideoBuffer(aPad, aOffset, aSize, aCaps, aBuf);
+-}
+-
+-GstFlowReturn GStreamerReader::AllocateVideoBuffer(GstPad* aPad,
+- guint64 aOffset,
+- guint aSize,
+- GstCaps* aCaps,
+- GstBuffer** aBuf)
+-{
+- nsRefPtr<PlanarYCbCrImage> image;
+- return AllocateVideoBufferFull(aPad, aOffset, aSize, aCaps, aBuf, image);
+-}
+-
+ GstFlowReturn GStreamerReader::NewPrerollCb(GstAppSink* aSink,
+ gpointer aUserData)
+ {
+@@ -979,8 +970,12 @@ void GStreamerReader::AudioPreroll()
+ {
+ /* The first audio buffer has reached the audio sink. Get rate and channels */
+ LOG(PR_LOG_DEBUG, "Audio preroll");
+- GstPad* sinkpad = gst_element_get_pad(GST_ELEMENT(mAudioAppSink), "sink");
++ GstPad* sinkpad = gst_element_get_static_pad(GST_ELEMENT(mAudioAppSink), "sink");
++#if GST_VERSION_MAJOR >= 1
++ GstCaps *caps = gst_pad_get_current_caps(sinkpad);
++#else
+ GstCaps* caps = gst_pad_get_negotiated_caps(sinkpad);
++#endif
+ GstStructure* s = gst_caps_get_structure(caps, 0);
+ mInfo.mAudio.mRate = mInfo.mAudio.mChannels = 0;
+ gst_structure_get_int(s, "rate", (gint*) &mInfo.mAudio.mRate);
+@@ -998,9 +993,18 @@ void GStreamerReader::VideoPreroll()
+ {
+ /* The first video buffer has reached the video sink. Get width and height */
+ LOG(PR_LOG_DEBUG, "Video preroll");
+- GstPad* sinkpad = gst_element_get_pad(GST_ELEMENT(mVideoAppSink), "sink");
++ GstPad* sinkpad = gst_element_get_static_pad(GST_ELEMENT(mVideoAppSink), "sink");
++#if GST_VERSION_MAJOR >= 1
++ GstCaps* caps = gst_pad_get_current_caps(sinkpad);
++ memset (&mVideoInfo, 0, sizeof (mVideoInfo));
++ gst_video_info_from_caps(&mVideoInfo, caps);
++ mFormat = mVideoInfo.finfo->format;
++ mPicture.width = mVideoInfo.width;
++ mPicture.height = mVideoInfo.height;
++#else
+ GstCaps* caps = gst_pad_get_negotiated_caps(sinkpad);
+ gst_video_format_parse_caps(caps, &mFormat, &mPicture.width, &mPicture.height);
++#endif
+ GstStructure* structure = gst_caps_get_structure(caps, 0);
+ gst_structure_get_fraction(structure, "framerate", &fpsNum, &fpsDen);
+ NS_ASSERTION(mPicture.width && mPicture.height, "invalid video resolution");
+@@ -1029,6 +1033,7 @@ void GStreamerReader::NewVideoBuffer()
+ /* We have a new video buffer queued in the video sink. Increment the counter
+ * and notify the decode thread potentially blocked in DecodeVideoFrame
+ */
++
+ mDecoder->NotifyDecodedFrames(1, 0);
+ mVideoSinkBufferCount++;
+ mon.NotifyAll();
+@@ -1095,5 +1100,199 @@ void GStreamerReader::NotifyDataArrived(const char *aBuffer,
+ }
+ }
+
++#if GST_VERSION_MAJOR >= 1
++GstCaps* GStreamerReader::BuildAudioSinkCaps()
++{
++ GstCaps* caps = gst_caps_from_string("audio/x-raw, channels={1,2}");
++ const char* format;
++#ifdef MOZ_SAMPLE_TYPE_FLOAT32
++#ifdef IS_LITTLE_ENDIAN
++ format = "F32LE";
++#else
++ format = "F32BE";
++#endif
++#else /* !MOZ_SAMPLE_TYPE_FLOAT32 */
++#ifdef IS_LITTLE_ENDIAN
++ format = "S16LE";
++#else
++ format = "S16BE";
++#endif
++#endif
++ gst_caps_set_simple(caps, "format", G_TYPE_STRING, format, nullptr);
++
++ return caps;
++}
++
++void GStreamerReader::InstallPadCallbacks()
++{
++ GstPad* sinkpad = gst_element_get_static_pad(GST_ELEMENT(mVideoAppSink), "sink");
++
++ gst_pad_add_probe(sinkpad,
++ (GstPadProbeType) (GST_PAD_PROBE_TYPE_SCHEDULING |
++ GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM |
++ GST_PAD_PROBE_TYPE_EVENT_UPSTREAM |
++ GST_PAD_PROBE_TYPE_EVENT_FLUSH),
++ &GStreamerReader::EventProbeCb, this, nullptr);
++ gst_pad_add_probe(sinkpad, GST_PAD_PROBE_TYPE_QUERY_DOWNSTREAM,
++ GStreamerReader::QueryProbeCb, nullptr, nullptr);
++
++ gst_pad_set_element_private(sinkpad, this);
++ gst_object_unref(sinkpad);
++
++ sinkpad = gst_element_get_static_pad(GST_ELEMENT(mAudioAppSink), "sink");
++ gst_pad_add_probe(sinkpad,
++ (GstPadProbeType) (GST_PAD_PROBE_TYPE_SCHEDULING |
++ GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM |
++ GST_PAD_PROBE_TYPE_EVENT_UPSTREAM |
++ GST_PAD_PROBE_TYPE_EVENT_FLUSH),
++ &GStreamerReader::EventProbeCb, this, nullptr);
++ gst_object_unref(sinkpad);
++}
++
++GstPadProbeReturn GStreamerReader::EventProbeCb(GstPad *aPad,
++ GstPadProbeInfo *aInfo,
++ gpointer aUserData)
++{
++ GStreamerReader *reader = (GStreamerReader *) aUserData;
++ GstEvent *aEvent = (GstEvent *)aInfo->data;
++ return reader->EventProbe(aPad, aEvent);
++}
++
++GstPadProbeReturn GStreamerReader::EventProbe(GstPad *aPad, GstEvent *aEvent)
++{
++ GstElement* parent = GST_ELEMENT(gst_pad_get_parent(aPad));
++
++ LOG(PR_LOG_DEBUG, "event probe %s", GST_EVENT_TYPE_NAME (aEvent));
++
++ switch(GST_EVENT_TYPE(aEvent)) {
++ case GST_EVENT_SEGMENT:
++ {
++ const GstSegment *newSegment;
++ GstSegment* segment;
++
++ /* Store the segments so we can convert timestamps to stream time, which
++ * is what the upper layers sync on.
++ */
++ ReentrantMonitorAutoEnter mon(mGstThreadsMonitor);
++#if GST_VERSION_MINOR <= 1 && GST_VERSION_MICRO < 1
++ ResetDecode();
++#endif
++ gst_event_parse_segment(aEvent, &newSegment);
++ if (parent == GST_ELEMENT(mVideoAppSink))
++ segment = &mVideoSegment;
++ else
++ segment = &mAudioSegment;
++ gst_segment_copy_into (newSegment, segment);
++ break;
++ }
++ case GST_EVENT_FLUSH_STOP:
++ /* Reset on seeks */
++ ResetDecode();
++ break;
++ default:
++ break;
++ }
++ gst_object_unref(parent);
++
++ return GST_PAD_PROBE_OK;
++}
++
++GstPadProbeReturn GStreamerReader::QueryProbeCb(GstPad* aPad, GstPadProbeInfo* aInfo, gpointer aUserData)
++{
++ GStreamerReader* reader = reinterpret_cast<GStreamerReader*>(gst_pad_get_element_private(aPad));
++ return reader->QueryProbe(aPad, aInfo, aUserData);
++}
++
++GstPadProbeReturn GStreamerReader::QueryProbe(GstPad* aPad, GstPadProbeInfo* aInfo, gpointer aUserData)
++{
++ GstQuery *query = gst_pad_probe_info_get_query(aInfo);
++ GstPadProbeReturn ret = GST_PAD_PROBE_OK;
++
++ switch (GST_QUERY_TYPE (query)) {
++ case GST_QUERY_ALLOCATION:
++ GstCaps *caps;
++ GstVideoInfo info;
++ gboolean need_pool;
++
++ gst_query_parse_allocation(query, &caps, &need_pool);
++ gst_video_info_init(&info);
++ gst_video_info_from_caps(&info, caps);
++ gst_query_add_allocation_param(query, mAllocator, nullptr);
++ gst_query_add_allocation_pool(query, mBufferPool, info.size, 0, 0);
++ gst_query_add_allocation_meta(query, GST_VIDEO_META_API_TYPE, nullptr);
++ break;
++ default:
++ break;
++ }
++
++ return ret;
++}
++
++void GStreamerReader::ImageDataFromVideoFrame(GstVideoFrame *aFrame,
++ PlanarYCbCrImage::Data *aData)
++{
++ NS_ASSERTION(GST_VIDEO_INFO_IS_YUV(&mVideoInfo),
++ "Non-YUV video frame formats not supported");
++ NS_ASSERTION(GST_VIDEO_FRAME_N_COMPONENTS(aFrame) == 3,
++ "Unsupported number of components in video frame");
++
++ aData->mPicX = aData->mPicY = 0;
++ aData->mPicSize = nsIntSize(mPicture.width, mPicture.height);
++ aData->mStereoMode = STEREO_MODE_MONO;
++
++ aData->mYChannel = GST_VIDEO_FRAME_COMP_DATA(aFrame, 0);
++ aData->mYStride = GST_VIDEO_FRAME_COMP_STRIDE(aFrame, 0);
++ aData->mYSize = nsIntSize(GST_VIDEO_FRAME_COMP_WIDTH(aFrame, 0),
++ GST_VIDEO_FRAME_COMP_HEIGHT(aFrame, 0));
++ aData->mYSkip = GST_VIDEO_FRAME_COMP_PSTRIDE(aFrame, 0) - 1;
++ aData->mCbCrStride = GST_VIDEO_FRAME_COMP_STRIDE(aFrame, 1);
++ aData->mCbCrSize = nsIntSize(GST_VIDEO_FRAME_COMP_WIDTH(aFrame, 1),
++ GST_VIDEO_FRAME_COMP_HEIGHT(aFrame, 1));
++ aData->mCbChannel = GST_VIDEO_FRAME_COMP_DATA(aFrame, 1);
++ aData->mCrChannel = GST_VIDEO_FRAME_COMP_DATA(aFrame, 2);
++ aData->mCbSkip = GST_VIDEO_FRAME_COMP_PSTRIDE(aFrame, 1) - 1;
++ aData->mCrSkip = GST_VIDEO_FRAME_COMP_PSTRIDE(aFrame, 2) - 1;
++}
++
++nsRefPtr<PlanarYCbCrImage> GStreamerReader::GetImageFromBuffer(GstBuffer* aBuffer)
++{
++ nsRefPtr<PlanarYCbCrImage> image = nullptr;
++
++ if (gst_buffer_n_memory(aBuffer) == 1) {
++ GstMemory* mem = gst_buffer_peek_memory(aBuffer, 0);
++ if (GST_IS_MOZ_GFX_MEMORY_ALLOCATOR(mem->allocator)) {
++ image = moz_gfx_memory_get_image(mem);
++
++ GstVideoFrame frame;
++ gst_video_frame_map(&frame, &mVideoInfo, aBuffer, GST_MAP_READ);
++ PlanarYCbCrImage::Data data;
++ ImageDataFromVideoFrame(&frame, &data);
++ image->SetDataNoCopy(data);
++ gst_video_frame_unmap(&frame);
++ }
++ }
++
++ return image;
++}
++
++void GStreamerReader::CopyIntoImageBuffer(GstBuffer* aBuffer,
++ GstBuffer** aOutBuffer,
++ nsRefPtr<PlanarYCbCrImage> &image)
++{
++ *aOutBuffer = gst_buffer_new_allocate(mAllocator, gst_buffer_get_size(aBuffer), nullptr);
++ GstMemory *mem = gst_buffer_peek_memory(*aOutBuffer, 0);
++ GstMapInfo map_info;
++ gst_memory_map(mem, &map_info, GST_MAP_WRITE);
++ gst_buffer_extract(aBuffer, 0, map_info.data, gst_buffer_get_size(aBuffer));
++ gst_memory_unmap(mem, &map_info);
++
++ /* create a new gst buffer with the newly created memory and copy the
++ * metadata over from the incoming buffer */
++ gst_buffer_copy_into(*aOutBuffer, aBuffer,
++ (GstBufferCopyFlags)(GST_BUFFER_COPY_METADATA), 0, -1);
++ image = GetImageFromBuffer(*aOutBuffer);
++}
++#endif
++
+ } // namespace mozilla
+
+diff --git content/media/gstreamer/GStreamerReader.h content/media/gstreamer/GStreamerReader.h
+index 1e30bed..6a90702 100644
+--- content/media/gstreamer/GStreamerReader.h
++++ content/media/gstreamer/GStreamerReader.h
+@@ -22,6 +22,7 @@
+
+ #include "MediaDecoderReader.h"
+ #include "MP3FrameParser.h"
++#include "ImageContainer.h"
+ #include "nsRect.h"
+
+ namespace mozilla {
+@@ -30,10 +31,6 @@ namespace dom {
+ class TimeRanges;
+ }
+
+-namespace layers {
+-class PlanarYCbCrImage;
+-}
+-
+ class AbstractMediaDecoder;
+
+ class GStreamerReader : public MediaDecoderReader
+@@ -67,10 +64,20 @@ public:
+ return mInfo.HasVideo();
+ }
+
++ layers::ImageContainer* GetImageContainer() { return mDecoder->GetImageContainer(); }
++
+ private:
+
+ void ReadAndPushData(guint aLength);
+ int64_t QueryDuration();
++ nsRefPtr<layers::PlanarYCbCrImage> GetImageFromBuffer(GstBuffer* aBuffer);
++ void CopyIntoImageBuffer(GstBuffer *aBuffer, GstBuffer** aOutBuffer, nsRefPtr<layers::PlanarYCbCrImage> &image);
++ GstCaps* BuildAudioSinkCaps();
++ void InstallPadCallbacks();
++
++#if GST_VERSION_MAJOR >= 1
++ void ImageDataFromVideoFrame(GstVideoFrame *aFrame, layers::PlanarYCbCrImage::Data *aData);
++#endif
+
+ /* Called once the pipeline is setup to check that the stream only contains
+ * supported formats
+@@ -105,20 +112,31 @@ private:
+ gboolean SeekData(GstAppSrc* aSrc, guint64 aOffset);
+
+ /* Called when events reach the sinks. See inline comments */
++#if GST_VERSION_MAJOR == 1
++ static GstPadProbeReturn EventProbeCb(GstPad *aPad, GstPadProbeInfo *aInfo, gpointer aUserData);
++ GstPadProbeReturn EventProbe(GstPad *aPad, GstEvent *aEvent);
++#else
+ static gboolean EventProbeCb(GstPad* aPad, GstEvent* aEvent, gpointer aUserData);
+ gboolean EventProbe(GstPad* aPad, GstEvent* aEvent);
++#endif
+
+- /* Called when elements in the video branch of the pipeline call
+- * gst_pad_alloc_buffer(). Used to provide PlanarYCbCrImage backed GstBuffers
+- * to the pipeline so that a memory copy can be avoided when handling YUV
+- * buffers from the pipeline to the gfx side.
++ /* Called when the video part of the pipeline allocates buffers. Used to
++ * provide PlanarYCbCrImage backed GstBuffers to the pipeline so that a memory
++ * copy can be avoided when handling YUV buffers from the pipeline to the gfx
++ * side.
+ */
++#if GST_VERSION_MAJOR == 1
++ static GstPadProbeReturn QueryProbeCb(GstPad *aPad, GstPadProbeInfo *aInfo, gpointer aUserData);
++ GstPadProbeReturn QueryProbe(GstPad *aPad, GstPadProbeInfo *aInfo, gpointer aUserData);
++#else
+ static GstFlowReturn AllocateVideoBufferCb(GstPad* aPad, guint64 aOffset, guint aSize,
+ GstCaps* aCaps, GstBuffer** aBuf);
+ GstFlowReturn AllocateVideoBufferFull(GstPad* aPad, guint64 aOffset, guint aSize,
+ GstCaps* aCaps, GstBuffer** aBuf, nsRefPtr<layers::PlanarYCbCrImage>& aImage);
+ GstFlowReturn AllocateVideoBuffer(GstPad* aPad, guint64 aOffset, guint aSize,
+ GstCaps* aCaps, GstBuffer** aBuf);
++#endif
++
+
+ /* Called when the pipeline is prerolled, that is when at start or after a
+ * seek, the first audio and video buffers are queued in the sinks.
+@@ -150,6 +168,11 @@ private:
+ bool mUseParserDuration;
+ int64_t mLastParserDuration;
+
++#if GST_VERSION_MAJOR >= 1
++ GstAllocator *mAllocator;
++ GstBufferPool *mBufferPool;
++ GstVideoInfo mVideoInfo;
++#endif
+ GstElement* mPlayBin;
+ GstBus* mBus;
+ GstAppSrc* mSource;
+@@ -180,6 +203,9 @@ private:
+ * DecodeAudioData and DecodeVideoFrame should not expect any more data
+ */
+ bool mReachedEos;
++#if GST_VERSION_MAJOR >= 1
++ bool mConfigureAlignment;
++#endif
+ int fpsNum;
+ int fpsDen;
+ };
+diff --git content/media/gstreamer/moz.build content/media/gstreamer/moz.build
+index 7d51bf5..a3c1856 100644
+--- content/media/gstreamer/moz.build
++++ content/media/gstreamer/moz.build
+@@ -15,10 +15,19 @@ SOURCES += [
+ 'GStreamerDecoder.cpp',
+ 'GStreamerFormatHelper.cpp',
+ 'GStreamerLoader.cpp',
+- 'GStreamerMozVideoBuffer.cpp',
+ 'GStreamerReader.cpp',
+ ]
+
++if CONFIG['GST_API_VERSION'] == '1.0':
++ SOURCES += [
++ 'GStreamerAllocator.cpp',
++ ]
++else:
++ SOURCES += [
++ 'GStreamerMozVideoBuffer.cpp',
++ 'GStreamerReader-0.10.cpp',
++ ]
++
+ FAIL_ON_WARNINGS = True
+
+ FINAL_LIBRARY = 'gklayout'
+diff --git content/media/test/manifest.js content/media/test/manifest.js
+index 6e39753..3c8c3b9 100644
+--- content/media/test/manifest.js
++++ content/media/test/manifest.js
+@@ -357,9 +357,9 @@ var gUnseekableTests = [
+ { name:"bogus.duh", type:"bogus/duh"}
+ ];
+ // Unfortunately big-buck-bunny-unseekable.mp4 is doesn't play on Windows 7, so
+-// only include it in the unseekable tests if we're on later versions of Windows.
+-if (navigator.userAgent.indexOf("Windows") == -1 ||
+- IsWindows8OrLater()) {
++// only include it in the unseekable tests if we're on later versions of Windows.
++// This test actually only passes on win8 at the moment.
++if (navigator.userAgent.indexOf("Windows") != -1 && IsWindows8OrLater()) {
+ gUnseekableTests = gUnseekableTests.concat([
+ { name:"big-buck-bunny-unseekable.mp4", type:"video/mp4" }
+ ]);
diff --git a/www/firefox/files/patch-bug810716 b/www/firefox/files/patch-bug810716
deleted file mode 100644
index 8c08e9a66986..000000000000
--- a/www/firefox/files/patch-bug810716
+++ /dev/null
@@ -1,68 +0,0 @@
-diff --git configure.in configure.in
-index 2084be9..eb6eeb2 100644
---- configure.in
-+++ configure.in
-@@ -3369,14 +3369,19 @@ fi
- AC_CACHE_CHECK(
- [for res_ninit()],
- ac_cv_func_res_ninit,
-- [AC_TRY_LINK([
-+ [AC_TRY_RUN([
- #ifdef linux
- #define _BSD_SOURCE 1
- #endif
-+ #include <sys/types.h>
-+ #include <netinet/in.h>
-+ #include <arpa/nameser.h>
- #include <resolv.h>
-- ],
-- [int foo = res_ninit(&_res);],
-+ int main(int argc, char **argv){
-+ int foo = res_ninit(&_res);
-+ }],
- [ac_cv_func_res_ninit=yes],
-+ [ac_cv_func_res_ninit=no],
- [ac_cv_func_res_ninit=no])
- ])
-
-diff --git extensions/auth/nsAuthGSSAPI.cpp extensions/auth/nsAuthGSSAPI.cpp
-index e828beb..6444246 100644
---- extensions/auth/nsAuthGSSAPI.cpp
-+++ extensions/auth/nsAuthGSSAPI.cpp
-@@ -39,6 +39,9 @@ typedef KLStatus (*KLCacheHasValidTickets_type)(
- #endif
-
- #if defined(HAVE_RES_NINIT)
-+#include <sys/types.h>
-+#include <netinet/in.h>
-+#include <arpa/nameser.h>
- #include <resolv.h>
- #endif
-
-diff --git js/src/configure.in js/src/configure.in
-index e25f569..b9722f9 100644
---- js/src/configure.in
-+++ js/src/configure.in
-@@ -2797,14 +2797,19 @@ fi
- AC_CACHE_CHECK(
- [for res_ninit()],
- ac_cv_func_res_ninit,
-- [AC_TRY_LINK([
-+ [AC_TRY_RUN([
- #ifdef linux
- #define _BSD_SOURCE 1
- #endif
-+ #include <sys/types.h>
-+ #include <netinet/in.h>
-+ #include <arpa/nameser.h>
- #include <resolv.h>
-- ],
-- [int foo = res_ninit(&_res);],
-+ int main(int argc, char **argv){
-+ int foo = res_ninit(&_res);
-+ }],
- [ac_cv_func_res_ninit=yes],
-+ [ac_cv_func_res_ninit=no],
- [ac_cv_func_res_ninit=no])
- ])
-
diff --git a/www/firefox/files/patch-bug826985 b/www/firefox/files/patch-bug826985
index fe55ff667281..524499cef75c 100644
--- a/www/firefox/files/patch-bug826985
+++ b/www/firefox/files/patch-bug826985
@@ -42,9 +42,9 @@ index b483cd1..f1dd1f0 100644
--- media/webrtc/signaling/test/Makefile.in
+++ media/webrtc/signaling/test/Makefile.in
@@ -17,6 +17,7 @@ LIBS = \
- $(NSPR_LIBS) \
$(NSS_LIBS) \
$(REALTIME_LIBS) \
+ $(MOZ_JS_LIBS) \
+ $(MOZ_LIBV4L2_LIBS) \
$(DEPTH)/xpcom/glue/$(LIB_PREFIX)xpcomglue_s.$(LIB_SUFFIX) \
$(DEPTH)/media/mtransport/standalone/$(LIB_PREFIX)mtransport_s.$(LIB_SUFFIX) \
@@ -53,7 +53,7 @@ diff --git media/webrtc/trunk/webrtc/modules/video_capture/linux/device_info_lin
index 239a292..bab496c 100644
--- media/webrtc/trunk/webrtc/modules/video_capture/linux/device_info_linux.cc
+++ media/webrtc/trunk/webrtc/modules/video_capture/linux/device_info_linux.cc
-@@ -26,11 +26,23 @@
+@@ -25,10 +25,21 @@
#else
#include <linux/videodev2.h>
#endif
@@ -61,9 +61,8 @@ index 239a292..bab496c 100644
+#include <libv4l2.h>
+#endif
- #include "ref_count.h"
- #include "trace.h"
-
+ #include "webrtc/system_wrappers/interface/ref_count.h"
+ #include "webrtc/system_wrappers/interface/trace.h"
+#ifdef HAVE_LIBV4L2
+#define open v4l2_open
@@ -73,10 +72,9 @@ index 239a292..bab496c 100644
+#define mmap v4l2_mmap
+#define munmap v4l2_munmap
+#endif
-+
+
namespace webrtc
{
- namespace videocapturemodule
@@ -130,6 +142,11 @@ WebRtc_Word32 DeviceInfoLinux::GetDeviceName(
memset(deviceNameUTF8, 0, deviceNameLength);
memcpy(cameraName, cap.card, sizeof(cap.card));
@@ -154,11 +152,11 @@ diff --git toolkit/library/Makefile.in toolkit/library/Makefile.in
index 9c16ffa..1db3794 100644
--- toolkit/library/Makefile.in
+++ toolkit/library/Makefile.in
-@@ -405,6 +405,7 @@ endif
+@@ -121,6 +121,7 @@ endif
EXTRA_DSO_LDOPTS += $(call EXPAND_LIBNAME_PATH,gkmedias,$(DIST)/lib)
ifdef MOZ_WEBRTC
+EXTRA_DSO_LDOPTS += $(MOZ_LIBV4L2_LIBS)
- ifdef MOZ_PEERCONNECTION
- COMPONENT_LIBS += peerconnection
- endif
+ ifdef MOZ_WEBRTC_SIGNALING
+ SHARED_LIBRARY_LIBS += \
+ $(DEPTH)/media/webrtc/signaling/signaling_ecc/$(LIB_PREFIX)ecc.$(LIB_SUFFIX) \
diff --git a/www/firefox/files/patch-bug847568 b/www/firefox/files/patch-bug847568
new file mode 100644
index 000000000000..bb98b518518b
--- /dev/null
+++ b/www/firefox/files/patch-bug847568
@@ -0,0 +1,188 @@
+# Allow building against system-wide graphite2/harfbuzz.
+
+diff --git config/Makefile.in config/Makefile.in
+index 14bfc0d..5383399 100644
+--- config/Makefile.in
++++ config/Makefile.in
+@@ -77,6 +77,8 @@ export:: $(export-preqs)
+ -DMOZ_NATIVE_LIBEVENT=$(MOZ_NATIVE_LIBEVENT) \
+ -DMOZ_NATIVE_LIBVPX=$(MOZ_NATIVE_LIBVPX) \
+ -DMOZ_NATIVE_ICU=$(MOZ_NATIVE_ICU) \
++ -DMOZ_NATIVE_GRAPHITE2=$(MOZ_NATIVE_GRAPHITE2) \
++ -DMOZ_NATIVE_HARFBUZZ=$(MOZ_NATIVE_HARFBUZZ) \
+ $(srcdir)/system-headers | $(PERL) $(topsrcdir)/nsprpub/config/make-system-wrappers.pl system_wrappers
+ $(INSTALL) system_wrappers $(DIST)
+
+diff --git config/system-headers config/system-headers
+index 126391e..b711fc3 100644
+--- config/system-headers
++++ config/system-headers
+@@ -1144,3 +1144,11 @@ unicode/utypes.h
+ #endif
+ libutil.h
+ unwind.h
++#if MOZ_NATIVE_GRAPHITE2==1
++graphite2/Font.h
++graphite2/Segment.h
++#endif
++#if MOZ_NATIVE_HARFBUZZ==1
++harfbuzz/hb-ot.h
++harfbuzz/hb.h
++#endif
+diff --git configure.in configure.in
+index bbc7b40..1747206 100644
+--- configure.in
++++ configure.in
+@@ -7848,6 +7848,34 @@ if test "$USE_FC_FREETYPE"; then
+ fi
+
+ dnl ========================================================
++dnl Check for graphite2 and harfbuzz
++dnl ========================================================
++
++MOZ_ARG_WITH_BOOL(system-harfbuzz,
++[ --with-system-harfbuzz Use system harfbuzz (located with pkgconfig)],
++MOZ_NATIVE_HARFBUZZ=1,
++MOZ_NATIVE_HARFBUZZ= )
++
++if test -n "$MOZ_NATIVE_HARFBUZZ"; then
++ PKG_CHECK_MODULES(MOZ_HARFBUZZ, harfbuzz >= 0.9.25)
++fi
++AC_SUBST(MOZ_NATIVE_HARFBUZZ)
++AC_SUBST(MOZ_HARFBUZZ_CFLAGS)
++AC_SUBST(MOZ_HARFBUZZ_LIBS)
++
++MOZ_ARG_WITH_BOOL(system-graphite2,
++[ --with-system-graphite2 Use system graphite2 (located with pkgconfig)],
++MOZ_NATIVE_GRAPHITE2=1,
++MOZ_NATIVE_GRAPHITE2= )
++
++if test -n "$MOZ_NATIVE_GRAPHITE2"; then
++ PKG_CHECK_MODULES(MOZ_GRAPHITE2, graphite2 >= 1.2.4)
++fi
++AC_SUBST(MOZ_NATIVE_GRAPHITE2)
++AC_SUBST(MOZ_GRAPHITE2_CFLAGS)
++AC_SUBST(MOZ_GRAPHITE2_LIBS)
++
++dnl ========================================================
+ dnl Check for pixman and cairo
+ dnl ========================================================
+
+diff --git content/base/src/Makefile.in content/base/src/Makefile.in
+index a618096..596901a 100644
+--- content/base/src/Makefile.in
++++ content/base/src/Makefile.in
+@@ -5,6 +5,10 @@
+
+ include $(topsrcdir)/config/rules.mk
+
++ifdef MOZ_NATIVE_HARFBUZZ
++nsContentUtils.$(OBJ_SUFFIX): CXXFLAGS+=$(MOZ_HARFBUZZ_CFLAGS)
++endif
++
+ # gcc requires -msse2 for this file since it uses SSE2 intrinsics. (See bug
+ # 585538 comment 12.)
+ ifneq (,$(INTEL_ARCHITECTURE))
+diff --git gfx/moz.build gfx/moz.build
+index 519aa46..6929751 100644
+--- gfx/moz.build
++++ gfx/moz.build
+@@ -7,6 +7,12 @@
+ if CONFIG['MOZ_TREE_CAIRO']:
+ DIRS += ['cairo']
+
++if not CONFIG['MOZ_NATIVE_GRAPHITE2']:
++ DIRS += ['graphite2/src' ]
++
++if not CONFIG['MOZ_NATIVE_HARFBUZZ']:
++ DIRS += ['harfbuzz/src']
++
+ DIRS += [
+ '2d',
+ 'ycbcr',
+@@ -15,8 +21,6 @@ DIRS += [
+ 'qcms',
+ 'gl',
+ 'layers',
+- 'graphite2/src',
+- 'harfbuzz/src',
+ 'ots/src',
+ 'thebes',
+ 'ipc',
+diff --git gfx/skia/Makefile.in gfx/skia/Makefile.in
+index 07a77a3..067f7bd 100644
+--- gfx/skia/Makefile.in
++++ gfx/skia/Makefile.in
+@@ -15,6 +15,10 @@ ifeq (qt,$(MOZ_WIDGET_TOOLKIT))
+ OS_CXXFLAGS += $(MOZ_CAIRO_CFLAGS) $(MOZ_PANGO_CFLAGS) $(CAIRO_FT_CFLAGS)
+ endif
+
++ifdef MOZ_NATIVE_HARFBUZZ
++OS_CXXFLAGS += $(MOZ_HARFBUZZ_CFLAGS)
++endif
++
+ include $(topsrcdir)/config/rules.mk
+
+ ifneq (,$(INTEL_ARCHITECTURE))
+diff --git gfx/thebes/Makefile.in gfx/thebes/Makefile.in
+index e9f6b6c..0df2d8d 100644
+--- gfx/thebes/Makefile.in
++++ gfx/thebes/Makefile.in
+@@ -13,6 +13,14 @@ DEFINES := $(filter-out -DUNICODE,$(DEFINES))
+ CXXFLAGS += $(MOZ_CAIRO_CFLAGS) $(TK_CFLAGS)
+ CFLAGS += $(MOZ_CAIRO_CFLAGS) $(TK_CFLAGS)
+
++ifdef MOZ_NATIVE_GRAPHITE2
++CXXFLAGS += $(MOZ_GRAPHITE2_CFLAGS)
++endif
++
++ifdef MOZ_NATIVE_HARFBUZZ
++CXXFLAGS += $(MOZ_HARFBUZZ_CFLAGS)
++endif
++
+ ifeq ($(MOZ_WIDGET_TOOLKIT),android)
+ CXXFLAGS += $(CAIRO_FT_CFLAGS)
+ endif
+diff --git intl/unicharutil/util/Makefile.in intl/unicharutil/util/Makefile.in
+index f6b9f7c..11c44f4 100644
+--- intl/unicharutil/util/Makefile.in
++++ intl/unicharutil/util/Makefile.in
+@@ -21,3 +21,7 @@ ifdef _MSC_VER
+ OS_COMPILE_CXXFLAGS += -Zl
+ OS_COMPILE_CFLAGS += -Zl
+ endif
++
++ifdef MOZ_NATIVE_HARFBUZZ
++nsUnicodePropertyData.$(OBJ_SUFFIX): CXXFLAGS+=$(MOZ_HARFBUZZ_CFLAGS)
++endif
+diff --git netwerk/dns/Makefile.in netwerk/dns/Makefile.in
+index 1cacbd7..a8cd156 100644
+--- netwerk/dns/Makefile.in
++++ netwerk/dns/Makefile.in
+@@ -9,3 +9,7 @@ include $(topsrcdir)/config/rules.mk
+ # for effective TLD data.
+ etld_data.inc: $(srcdir)/prepare_tlds.py $(srcdir)/effective_tld_names.dat
+ $(PYTHON) $(srcdir)/prepare_tlds.py $(srcdir)/effective_tld_names.dat > etld_data.inc
++
++ifdef MOZ_NATIVE_HARFBUZZ
++nsIDNService.$(OBJ_SUFFIX): CXXFLAGS+=$(MOZ_HARFBUZZ_CFLAGS)
++endif
+diff --git toolkit/library/Makefile.in toolkit/library/Makefile.in
+index 007f272..27f488e 100644
+--- toolkit/library/Makefile.in
++++ toolkit/library/Makefile.in
+@@ -103,6 +103,14 @@ ifndef MOZ_TREE_PIXMAN
+ EXTRA_DSO_LDOPTS += $(MOZ_PIXMAN_LIBS)
+ endif
+
++ifdef MOZ_NATIVE_GRAPHITE2
++EXTRA_DSO_LDOPTS += $(MOZ_GRAPHITE2_LIBS)
++endif
++
++ifdef MOZ_NATIVE_HARFBUZZ
++EXTRA_DSO_LDOPTS += $(MOZ_HARFBUZZ_LIBS)
++endif
++
+ ifdef MOZ_DMD
+ EXTRA_DSO_LDOPTS += $(call EXPAND_LIBNAME_PATH,dmd,$(DIST)/lib)
+ endif
diff --git a/www/firefox/files/patch-bug893397 b/www/firefox/files/patch-bug893397
index 0c719b99f70a..24ff54b9bc99 100644
--- a/www/firefox/files/patch-bug893397
+++ b/www/firefox/files/patch-bug893397
@@ -2,7 +2,7 @@ diff --git configure.in configure.in
index 549ad06..2878d9f 100644
--- configure.in
+++ configure.in
-@@ -8491,7 +8491,7 @@ case "$OS_TARGET" in
+@@ -8091,7 +8091,7 @@ case "$OS_TARGET" in
NECKO_WIFI=1
fi
;;
@@ -15,23 +15,23 @@ diff --git netwerk/wifi/moz.build netwerk/wifi/moz.build
index 07b01de..11706af 100644
--- netwerk/wifi/moz.build
+++ netwerk/wifi/moz.build
-@@ -34,6 +34,10 @@ if CONFIG['OS_ARCH'] == 'Darwin':
- CMMSRCS += [
+@@ -35,6 +35,10 @@ if CONFIG['OS_ARCH'] == 'Darwin':
+ UNIFIED_SOURCES += [
'osx_corewlan.mm',
]
+elif CONFIG['OS_ARCH'] == 'FreeBSD':
-+ SOURCES += [
++ UNIFIED_SOURCES += [
+ 'nsWifiScannerFreeBSD.cpp',
+ ]
elif CONFIG['OS_ARCH'] == 'WINNT':
- CPP_SOURCES += [
+ UNIFIED_SOURCES += [
'nsWifiScannerWin.cpp',
diff --git netwerk/wifi/nsWifiScannerFreeBSD.cpp netwerk/wifi/nsWifiScannerFreeBSD.cpp
new file mode 100644
index 0000000..80d4cb6
--- /dev/null
+++ netwerk/wifi/nsWifiScannerFreeBSD.cpp
-@@ -0,0 +1,172 @@
+@@ -0,0 +1,167 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
@@ -60,43 +60,39 @@ index 0000000..80d4cb6
+static nsresult
+FreeBSDGetAccessPointData(nsCOMArray<nsWifiAccessPoint> &accessPoints)
+{
-+ bool res = false;
-+ char *dupn = NULL;
-+ struct ifaddrs *ifal, *ifa;
-+ unsigned len;
-+
+ // get list of interfaces
-+ if (getifaddrs(&ifal) < 0)
++ struct ifaddrs *ifal;
++ if (getifaddrs(&ifal) < 0) {
+ return NS_ERROR_FAILURE;
++ }
+
+ accessPoints.Clear();
+
+ // loop through the interfaces
++ nsresult rv = NS_ERROR_FAILURE;
++ struct ifaddrs *ifa;
+ for (ifa = ifal; ifa; ifa = ifa->ifa_next) {
-+ int s;
-+ struct ifreq ifr;
-+ struct ifmediareq ifmr;
-+ struct ieee80211req i802r;
-+ char iscanbuf[32*1024], *vsr;
-+
-+ memset(&ifr, 0, sizeof(ifr));
-+
-+ // list can contain duplicates, so ignore those
-+ if (dupn != NULL && strcmp(dupn, ifa->ifa_name) == 0)
++ // limit to one interface per address
++ if (ifa->ifa_addr->sa_family != AF_LINK) {
+ continue;
-+ dupn = ifa->ifa_name;
++ }
+
+ // store interface name in socket structure
++ struct ifreq ifr;
++ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, ifa->ifa_name, sizeof(ifr.ifr_name));
+ ifr.ifr_addr.sa_family = AF_LOCAL;
+
+ // open socket to interface
-+ if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
++ int s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0);
++ if (s < 0) {
+ continue;
++ }
+
+ // clear interface media structure
-+ (void) memset(&ifmr, 0, sizeof(ifmr));
-+ (void) strncpy(ifmr.ifm_name, ifa->ifa_name, sizeof(ifmr.ifm_name));
++ struct ifmediareq ifmr;
++ memset(&ifmr, 0, sizeof(ifmr));
++ strncpy(ifmr.ifm_name, ifa->ifa_name, sizeof(ifmr.ifm_name));
+
+ // get interface media information
+ if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) {
@@ -111,8 +107,10 @@ index 0000000..80d4cb6
+ }
+
+ // perform WiFi scan
-+ (void) memset(&i802r, 0, sizeof(i802r));
-+ (void) strncpy(i802r.i_name, ifa->ifa_name, sizeof(i802r.i_name));
++ struct ieee80211req i802r;
++ char iscanbuf[32*1024];
++ memset(&i802r, 0, sizeof(i802r));
++ strncpy(i802r.i_name, ifa->ifa_name, sizeof(i802r.i_name));
+ i802r.i_type = IEEE80211_IOC_SCAN_RESULTS;
+ i802r.i_data = iscanbuf;
+ i802r.i_len = sizeof(iscanbuf);
@@ -125,36 +123,33 @@ index 0000000..80d4cb6
+ close(s);
+
+ // loop through WiFi networks and build geoloc-lookup structure
-+ vsr = (char *) i802r.i_data;
-+ len = i802r.i_len;
++ char *vsr = (char *) i802r.i_data;
++ unsigned len = i802r.i_len;
+ while (len >= sizeof(struct ieee80211req_scan_result)) {
-+ struct ieee80211req_scan_result *isr;
-+ char *id;
-+ int idlen;
-+ char ssid[IEEE80211_NWID_LEN+1];
-+ nsWifiAccessPoint *ap;
-+
-+ isr = (struct ieee80211req_scan_result *) vsr;
++ struct ieee80211req_scan_result *isr =
++ (struct ieee80211req_scan_result *) vsr;
+
+ // determine size of this entry
++ char *id;
++ int idlen;
+ if (isr->isr_meshid_len) {
+ id = vsr + isr->isr_ie_off + isr->isr_ssid_len;
+ idlen = isr->isr_meshid_len;
-+ }
-+ else {
++ } else {
+ id = vsr + isr->isr_ie_off;
+ idlen = isr->isr_ssid_len;
+ }
+
+ // copy network data
++ char ssid[IEEE80211_NWID_LEN+1];
+ strncpy(ssid, id, idlen);
+ ssid[idlen] = '\0';
-+ ap = new nsWifiAccessPoint();
++ nsWifiAccessPoint *ap = new nsWifiAccessPoint();
+ ap->setSSID(ssid, strlen(ssid));
+ ap->setMac(isr->isr_bssid);
+ ap->setSignal(isr->isr_rssi);
+ accessPoints.AppendObject(ap);
-+ res = true;
++ rv = NS_OK;
+
+ // log the data
+ LOG(( "FreeBSD access point: "
@@ -172,7 +167,7 @@ index 0000000..80d4cb6
+
+ freeifaddrs(ifal);
+
-+ return res ? NS_OK : NS_ERROR_FAILURE;
++ return rv;
+}
+
+nsresult
diff --git a/www/firefox/files/patch-bug945046 b/www/firefox/files/patch-bug945046
deleted file mode 100644
index aa6176003f95..000000000000
--- a/www/firefox/files/patch-bug945046
+++ /dev/null
@@ -1,160 +0,0 @@
-diff --git config/system-headers config/system-headers
-index 432cba6..18a9627 100644
---- config/system-headers
-+++ config/system-headers
-@@ -1131,3 +1131,4 @@ unicode/unum.h
- unicode/ustring.h
- unicode/utypes.h
- #endif
-+libutil.h
-diff --git js/src/config/system-headers js/src/config/system-headers
-index 432cba6..18a9627 100644
---- js/src/config/system-headers
-+++ js/src/config/system-headers
-@@ -1131,3 +1131,4 @@ unicode/unum.h
- unicode/ustring.h
- unicode/utypes.h
- #endif
-+libutil.h
-diff --git toolkit/library/Makefile.in toolkit/library/Makefile.in
-index 9975621..b4b037d 100644
---- toolkit/library/Makefile.in
-+++ toolkit/library/Makefile.in
-@@ -289,6 +289,10 @@ OS_LIBS += $(call EXPAND_LIBNAME,kvm)
- EXTRA_DSO_LDOPTS += -Wl,--warn-unresolved-symbols
- endif
-
-+ifeq ($(OS_ARCH),FreeBSD)
-+OS_LIBS += $(call EXPAND_LIBNAME,util)
-+endif
-+
- ifeq ($(OS_ARCH),WINNT)
- OS_LIBS += $(call EXPAND_LIBNAME,shell32 ole32 version winspool comdlg32 imm32 msimg32 shlwapi psapi ws2_32 dbghelp rasapi32 rasdlg iphlpapi uxtheme setupapi secur32 sensorsapi portabledeviceguids windowscodecs wininet wbemuuid)
- ifdef ACCESSIBILITY
-diff --git xpcom/base/nsMemoryReporterManager.cpp xpcom/base/nsMemoryReporterManager.cpp
-index b8147c8..0ffb34e 100644
---- xpcom/base/nsMemoryReporterManager.cpp
-+++ xpcom/base/nsMemoryReporterManager.cpp
-@@ -204,6 +204,61 @@ ResidentFastDistinguishedAmount(int64_t* aN)
- return ResidentDistinguishedAmount(aN);
- }
-
-+#ifdef __FreeBSD__
-+#include <libutil.h>
-+#include <algorithm>
-+
-+static nsresult
-+GetKinfoVmentrySelf(int64_t* prss, uint64_t* maxreg)
-+{
-+ int cnt;
-+ struct kinfo_vmentry *vmmap, *kve;
-+ if ((vmmap = kinfo_getvmmap(getpid(), &cnt)) == NULL)
-+ return NS_ERROR_FAILURE;
-+
-+ if (prss)
-+ *prss = 0;
-+ if (maxreg)
-+ *maxreg = 0;
-+
-+ for (int i = 0; i < cnt; i++) {
-+ kve = &vmmap[i];
-+ if (prss)
-+ *prss += kve->kve_private_resident;
-+ if (maxreg)
-+ *maxreg = std::max(*maxreg,
-+ kve->kve_end - kve->kve_start);
-+ }
-+
-+ free(vmmap);
-+ return NS_OK;
-+}
-+
-+#define HAVE_PRIVATE_REPORTER
-+static nsresult
-+PrivateDistinguishedAmount(int64_t* aN)
-+{
-+ int64_t priv;
-+ nsresult rv = GetKinfoVmentrySelf(&priv, NULL);
-+ if (NS_SUCCEEDED(rv))
-+ *aN = priv * getpagesize();
-+
-+ return NS_OK;
-+}
-+
-+#define HAVE_VSIZE_MAX_CONTIGUOUS_REPORTER 1
-+static nsresult
-+VsizeMaxContiguousDistinguishedAmount(int64_t* aN)
-+{
-+ uint64_t biggestRegion;
-+ nsresult rv = GetKinfoVmentrySelf(NULL, &biggestRegion);
-+ if (NS_SUCCEEDED(rv))
-+ *aN = biggestRegion;
-+
-+ return NS_OK;
-+}
-+#endif // FreeBSD
-+
- #elif defined(SOLARIS)
-
- #include <procfs.h>
-@@ -416,6 +470,25 @@ VsizeMaxContiguousDistinguishedAmount(int64_t* aN)
- return NS_OK;
- }
-
-+#define HAVE_PRIVATE_REPORTER
-+static nsresult
-+PrivateDistinguishedAmount(int64_t* aN)
-+{
-+ PROCESS_MEMORY_COUNTERS_EX pmcex;
-+ pmcex.cb = sizeof(PROCESS_MEMORY_COUNTERS_EX);
-+
-+ if (!GetProcessMemoryInfo(
-+ GetCurrentProcess(),
-+ (PPROCESS_MEMORY_COUNTERS) &pmcex, sizeof(pmcex))) {
-+ return NS_ERROR_FAILURE;
-+ }
-+
-+ *aN = pmcex.PrivateUsage;
-+ return NS_OK;
-+}
-+#endif // XP_<PLATFORM>
-+
-+#ifdef HAVE_VSIZE_MAX_CONTIGUOUS_REPORTER
- class VsizeMaxContiguousReporter MOZ_FINAL : public MemoryUniReporter
- {
- public:
-@@ -429,8 +502,9 @@ public:
- return VsizeMaxContiguousDistinguishedAmount(aAmount);
- }
- };
-+#endif
-
--#define HAVE_PRIVATE_REPORTER
-+#ifdef HAVE_PRIVATE_REPORTER
- class PrivateReporter MOZ_FINAL : public MemoryUniReporter
- {
- public:
-@@ -443,21 +517,10 @@ public:
-
- NS_IMETHOD GetAmount(int64_t* aAmount)
- {
-- PROCESS_MEMORY_COUNTERS_EX pmcex;
-- pmcex.cb = sizeof(PROCESS_MEMORY_COUNTERS_EX);
--
-- if (!GetProcessMemoryInfo(
-- GetCurrentProcess(),
-- (PPROCESS_MEMORY_COUNTERS) &pmcex, sizeof(pmcex))) {
-- return NS_ERROR_FAILURE;
-- }
--
-- *aAmount = pmcex.PrivateUsage;
-- return NS_OK;
-+ return PrivateDistinguishedAmount(aAmount);
- }
- };
--
--#endif // XP_<PLATFORM>
-+#endif
-
- #ifdef HAVE_VSIZE_AND_RESIDENT_REPORTERS
- class VsizeReporter MOZ_FINAL : public MemoryUniReporter
diff --git a/www/firefox/files/patch-bug946560 b/www/firefox/files/patch-bug946560
deleted file mode 100644
index 83fccc160bcc..000000000000
--- a/www/firefox/files/patch-bug946560
+++ /dev/null
@@ -1,62 +0,0 @@
-diff --git xpcom/base/nsMemoryInfoDumper.cpp xpcom/base/nsMemoryInfoDumper.cpp
-index 0b2f78c..d857374 100644
---- xpcom/base/nsMemoryInfoDumper.cpp
-+++ xpcom/base/nsMemoryInfoDumper.cpp
-@@ -6,7 +6,7 @@
-
- #include "mozilla/nsMemoryInfoDumper.h"
-
--#ifdef XP_LINUX
-+#if defined(XP_LINUX) || defined(__FreeBSD__)
- #include "mozilla/Preferences.h"
- #endif
- #include "mozilla/unused.h"
-@@ -31,7 +31,7 @@
- #include <unistd.h>
- #endif
-
--#ifdef XP_LINUX
-+#if defined(XP_LINUX) || defined(__FreeBSD__)
- #include <fcntl.h>
- #include <sys/types.h>
- #include <sys/stat.h>
-@@ -110,7 +110,7 @@ private:
-
- } // anonymous namespace
-
--#ifdef XP_LINUX // {
-+#if defined(XP_LINUX) || defined(__FreeBSD__) // {
- namespace {
-
- /*
-@@ -552,7 +552,7 @@ nsMemoryInfoDumper::~nsMemoryInfoDumper()
- /* static */ void
- nsMemoryInfoDumper::Initialize()
- {
--#ifdef XP_LINUX
-+#if defined(XP_LINUX) || defined(__FreeBSD__)
- SignalPipeWatcher::Create();
- FifoWatcher::MaybeCreate();
- #endif
-diff --git xpcom/base/nsMemoryReporterManager.cpp xpcom/base/nsMemoryReporterManager.cpp
-index 1252e27..6f22093 100644
---- xpcom/base/nsMemoryReporterManager.cpp
-+++ xpcom/base/nsMemoryReporterManager.cpp
-@@ -17,7 +17,7 @@
- #include "nsPIDOMWindow.h"
- #include "nsIObserverService.h"
- #include "nsIGlobalObject.h"
--#if defined(XP_LINUX)
-+#if defined(XP_LINUX) || defined(__FreeBSD__)
- #include "nsMemoryInfoDumper.h"
- #endif
- #include "mozilla/Attributes.h"
-@@ -898,7 +898,7 @@ nsMemoryReporterManager::Init()
- RegisterStrongReporter(new mozilla::dmd::DMDReporter());
- #endif
-
--#if defined(XP_LINUX)
-+#if defined(XP_LINUX) || defined(__FreeBSD__)
- nsMemoryInfoDumper::Initialize();
- #endif
-
diff --git a/www/firefox/files/patch-bug948946 b/www/firefox/files/patch-bug948946
index 300a31a8f48d..531fc19f8b46 100644
--- a/www/firefox/files/patch-bug948946
+++ b/www/firefox/files/patch-bug948946
@@ -1,12 +1,45 @@
-diff --git browser/themes/moz.build browser/themes/moz.build
-index d82bda3..86d343d 100644
---- browser/themes/moz.build
-+++ browser/themes/moz.build
-@@ -9,6 +9,7 @@ toolkit = CONFIG['MOZ_WIDGET_TOOLKIT']
- if toolkit == 'cocoa':
- DIRS += ['osx']
- elif toolkit in ('gtk2', 'gtk3', 'qt'):
-+ DEFINES['XP_LINUX'] = 1
- DIRS += ['linux']
- else:
- DIRS += ['windows']
+diff --git browser/themes/shared/devtools/common.css browser/themes/shared/devtools/common.css
+index a8208dc..df70486 100644
+--- browser/themes/shared/devtools/common.css
++++ browser/themes/shared/devtools/common.css
+@@ -11,13 +11,13 @@
+ .devtools-monospace {
+ %ifdef XP_MACOSX
+ font-family: Menlo, monospace;
+-%endif
+-%ifdef XP_LINUX
++%elifdef XP_WIN
++ font-family: Consolas, monospace;
++%else
+ font-family: monospace;
+- font-size: 80%;
+ %endif
+-%ifdef XP_WIN
+- font-family: Consolas, monospace;
++%if defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_QT)
++ font-size: 80%;
+ %endif
+ }
+
+@@ -62,7 +62,7 @@
+ background-image: linear-gradient(to bottom, hsla(209,18%,18%,0.9), hsl(210,11%,16%));
+ border-radius: 3px;
+ overflow-x: hidden;
+-%ifdef XP_LINUX
++%if defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_QT)
+ max-height: 32rem;
+ %else
+ max-height: 40rem;
+diff --git browser/themes/shared/devtools/highlighter.inc.css browser/themes/shared/devtools/highlighter.inc.css
+index 5b881b5..050f78b 100644
+--- browser/themes/shared/devtools/highlighter.inc.css
++++ browser/themes/shared/devtools/highlighter.inc.css
+@@ -54,7 +54,7 @@ html|*.highlighter-nodeinfobar-pseudo-classes {
+ padding: 0;
+ width: 26px;
+ min-height: 26px;
+-%ifndef XP_LINUX
++%if !defined(MOZ_WIDGET_GTK) && !defined(MOZ_WIDGET_QT)
+ background-color: transparent;
+ %endif
+ }
diff --git a/www/firefox/files/patch-bug961264 b/www/firefox/files/patch-bug961264
new file mode 100644
index 000000000000..85bc94d001ff
--- /dev/null
+++ b/www/firefox/files/patch-bug961264
@@ -0,0 +1,266 @@
+commit d099acd
+Author: Trevor Saunders <trev.saunders@gmail.com>
+Date: Fri Jan 17 15:08:00 2014 -0800
+
+ Bug 961264 - Remove obsolete checks for gcc visibility stuff.
+---
+ configure.in | 115 +++-------------------------------------------------
+ js/src/configure.in | 111 ++------------------------------------------------
+ 2 files changed, 8 insertions(+), 218 deletions(-)
+
+diff --git configure.in configure.in
+index dfb8193..33d71b3 100644
+--- configure.in
++++ configure.in
+@@ -2507,118 +2507,15 @@ MOZ_CXX11
+
+ AC_LANG_C
+
+-dnl Check for .hidden assembler directive and visibility attribute.
+-dnl Borrowed from glibc configure.in
++dnl Setup default hidden visibility and wrapped system headers.
+ dnl ===============================================================
+ if test "$GNU_CC"; then
+- AC_CACHE_CHECK(for visibility(hidden) attribute,
+- ac_cv_visibility_hidden,
+- [cat > conftest.c <<EOF
+- int foo __attribute__ ((visibility ("hidden"))) = 1;
+-EOF
+- ac_cv_visibility_hidden=no
+- if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then
+- if egrep '\.(hidden|private_extern).*foo' conftest.s >/dev/null; then
+- ac_cv_visibility_hidden=yes
+- fi
+- fi
+- rm -f conftest.[cs]
+- ])
+- if test "$ac_cv_visibility_hidden" = "yes"; then
+- AC_DEFINE(HAVE_VISIBILITY_HIDDEN_ATTRIBUTE)
+-
+- AC_CACHE_CHECK(for visibility(default) attribute,
+- ac_cv_visibility_default,
+- [cat > conftest.c <<EOF
+- int foo __attribute__ ((visibility ("default"))) = 1;
+-EOF
+- ac_cv_visibility_default=no
+- if ${CC-cc} -fvisibility=hidden -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then
+- if ! egrep '\.(hidden|private_extern).*foo' conftest.s >/dev/null; then
+- ac_cv_visibility_default=yes
+- fi
+- fi
+- rm -f conftest.[cs]
+- ])
+- if test "$ac_cv_visibility_default" = "yes"; then
+- AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE)
+-
+- AC_CACHE_CHECK(for visibility pragma support,
+- ac_cv_visibility_pragma,
+- [cat > conftest.c <<EOF
+-#pragma GCC visibility push(hidden)
+- int foo_hidden = 1;
+-#pragma GCC visibility push(default)
+- int foo_default = 1;
+-EOF
+- ac_cv_visibility_pragma=no
+- if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then
+- if egrep '\.(hidden|private_extern).*foo_hidden' conftest.s >/dev/null; then
+- if ! egrep '\.(hidden|private_extern).*foo_default' conftest.s > /dev/null; then
+- ac_cv_visibility_pragma=yes
+- fi
+- fi
+- fi
+- rm -f conftest.[cs]
+- ])
+- if test "$ac_cv_visibility_pragma" = "yes"; then
+- AC_CACHE_CHECK(For gcc visibility bug with class-level attributes (GCC bug 26905),
+- ac_cv_have_visibility_class_bug,
+- [cat > conftest.c <<EOF
+-#pragma GCC visibility push(hidden)
+-struct __attribute__ ((visibility ("default"))) TestStruct {
+- static void Init();
+-};
+-__attribute__ ((visibility ("default"))) void TestFunc() {
+- TestStruct::Init();
+-}
+-EOF
+- ac_cv_have_visibility_class_bug=no
+- if ! ${CXX-g++} ${CXXFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
+- ac_cv_have_visibility_class_bug=yes
+- else
+- if test `egrep -c '@PLT|\\$stub' conftest.S` = 0; then
+- ac_cv_have_visibility_class_bug=yes
+- fi
+- fi
+- rm -rf conftest.{c,S}
+- ])
+-
+- AC_CACHE_CHECK(For x86_64 gcc visibility bug with builtins (GCC bug 20297),
+- ac_cv_have_visibility_builtin_bug,
+- [cat > conftest.c <<EOF
+-#pragma GCC visibility push(hidden)
+-#pragma GCC visibility push(default)
+-#include <string.h>
+-#pragma GCC visibility pop
+-
+-__attribute__ ((visibility ("default"))) void Func() {
+- char c[[100]];
+- memset(c, 0, sizeof(c));
+-}
+-EOF
+- ac_cv_have_visibility_builtin_bug=no
+- if ! ${CC-cc} ${CFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -O2 -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
+- ac_cv_have_visibility_builtin_bug=yes
+- else
+- if test `grep -c "@PLT" conftest.S` = 0; then
+- ac_cv_visibility_builtin_bug=yes
+- fi
+- fi
+- rm -f conftest.{c,S}
+- ])
+- if test "$ac_cv_have_visibility_builtin_bug" = "no" -a \
+- "$ac_cv_have_visibility_class_bug" = "no"; then
+- VISIBILITY_FLAGS='-I$(DIST)/system_wrappers -include $(topsrcdir)/config/gcc_hidden.h'
+- WRAP_SYSTEM_INCLUDES=1
+- STL_FLAGS='-I$(DIST)/stl_wrappers'
+- WRAP_STL_INCLUDES=1
+- else
+- VISIBILITY_FLAGS='-fvisibility=hidden'
+- fi # have visibility pragma bug
+- fi # have visibility pragma
+- fi # have visibility(default) attribute
+- fi # have visibility(hidden) attribute
++ AC_DEFINE(HAVE_VISIBILITY_HIDDEN_ATTRIBUTE)
++ AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE)
++ VISIBILITY_FLAGS='-I$(DIST)/system_wrappers -include $(topsrcdir)/config/gcc_hidden.h'
++ WRAP_SYSTEM_INCLUDES=1
++ STL_FLAGS='-I$(DIST)/stl_wrappers'
++ WRAP_STL_INCLUDES=1
+ fi # GNU_CC
+
+ # visibility hidden flag for Sun Studio on Solaris
+diff --git js/src/configure.in js/src/configure.in
+index bddd46d..d4b522e 100644
+--- js/src/configure.in
++++ js/src/configure.in
+@@ -2348,116 +2348,13 @@ fi
+
+ AC_LANG_C
+
+-dnl Check for .hidden assembler directive and visibility attribute.
+-dnl Borrowed from glibc configure.in
++dnl Setup default hidden visibility and wrapped system headers.
+ dnl ===============================================================
+ if test "$GNU_CC"; then
+- AC_CACHE_CHECK(for visibility(hidden) attribute,
+- ac_cv_visibility_hidden,
+- [cat > conftest.c <<EOF
+- int foo __attribute__ ((visibility ("hidden"))) = 1;
+-EOF
+- ac_cv_visibility_hidden=no
+- if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then
+- if egrep '\.(hidden|private_extern).*foo' conftest.s >/dev/null; then
+- ac_cv_visibility_hidden=yes
+- fi
+- fi
+- rm -f conftest.[cs]
+- ])
+- if test "$ac_cv_visibility_hidden" = "yes"; then
+- AC_DEFINE(HAVE_VISIBILITY_HIDDEN_ATTRIBUTE)
+-
+- AC_CACHE_CHECK(for visibility(default) attribute,
+- ac_cv_visibility_default,
+- [cat > conftest.c <<EOF
+- int foo __attribute__ ((visibility ("default"))) = 1;
+-EOF
+- ac_cv_visibility_default=no
+- if ${CC-cc} -fvisibility=hidden -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then
+- if ! egrep '\.(hidden|private_extern).*foo' conftest.s >/dev/null; then
+- ac_cv_visibility_default=yes
+- fi
+- fi
+- rm -f conftest.[cs]
+- ])
+- if test "$ac_cv_visibility_default" = "yes"; then
+- AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE)
+-
+- AC_CACHE_CHECK(for visibility pragma support,
+- ac_cv_visibility_pragma,
+- [cat > conftest.c <<EOF
+-#pragma GCC visibility push(hidden)
+- int foo_hidden = 1;
+-#pragma GCC visibility push(default)
+- int foo_default = 1;
+-EOF
+- ac_cv_visibility_pragma=no
+- if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then
+- if egrep '\.(hidden|private_extern).*foo_hidden' conftest.s >/dev/null; then
+- if ! egrep '\.(hidden|private_extern).*foo_default' conftest.s > /dev/null; then
+- ac_cv_visibility_pragma=yes
+- fi
+- fi
+- fi
+- rm -f conftest.[cs]
+- ])
+- if test "$ac_cv_visibility_pragma" = "yes"; then
+- AC_CACHE_CHECK(For gcc visibility bug with class-level attributes (GCC bug 26905),
+- ac_cv_have_visibility_class_bug,
+- [cat > conftest.c <<EOF
+-#pragma GCC visibility push(hidden)
+-struct __attribute__ ((visibility ("default"))) TestStruct {
+- static void Init();
+-};
+-__attribute__ ((visibility ("default"))) void TestFunc() {
+- TestStruct::Init();
+-}
+-EOF
+- ac_cv_have_visibility_class_bug=no
+- if ! ${CXX-g++} ${CXXFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
+- ac_cv_have_visibility_class_bug=yes
+- else
+- if test `egrep -c '@PLT|\\$stub' conftest.S` = 0; then
+- ac_cv_have_visibility_class_bug=yes
+- fi
+- fi
+- rm -rf conftest.{c,S}
+- ])
+-
+- AC_CACHE_CHECK(For x86_64 gcc visibility bug with builtins (GCC bug 20297),
+- ac_cv_have_visibility_builtin_bug,
+- [cat > conftest.c <<EOF
+-#pragma GCC visibility push(hidden)
+-#pragma GCC visibility push(default)
+-#include <string.h>
+-#pragma GCC visibility pop
+-
+-__attribute__ ((visibility ("default"))) void Func() {
+- char c[[100]];
+- memset(c, 0, sizeof(c));
+-}
+-EOF
+- ac_cv_have_visibility_builtin_bug=no
+- if ! ${CC-cc} ${CFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -O2 -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
+- ac_cv_have_visibility_builtin_bug=yes
+- else
+- if test `grep -c "@PLT" conftest.S` = 0; then
+- ac_cv_visibility_builtin_bug=yes
+- fi
+- fi
+- rm -f conftest.{c,S}
+- ])
+- if test "$ac_cv_have_visibility_builtin_bug" = "no" -a \
+- "$ac_cv_have_visibility_class_bug" = "no"; then
+- VISIBILITY_FLAGS='-I$(DIST)/system_wrappers_js -include $(topsrcdir)/config/gcc_hidden.h'
+- WRAP_SYSTEM_INCLUDES=1
+- else
+- VISIBILITY_FLAGS='-fvisibility=hidden'
+- fi # have visibility pragma bug
+- fi # have visibility pragma
+- fi # have visibility(default) attribute
+- fi # have visibility(hidden) attribute
++ AC_DEFINE(HAVE_VISIBILITY_HIDDEN_ATTRIBUTE)
++ AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE)
++ VISIBILITY_FLAGS='-I$(DIST)/system_wrappers_js -include $(topsrcdir)/config/gcc_hidden.h'
++ WRAP_SYSTEM_INCLUDES=1
+ fi # GNU_CC
+
+ # visibility hidden flag for Sun Studio on Solaris
diff --git a/www/firefox/files/patch-bug961816 b/www/firefox/files/patch-bug961816
new file mode 100644
index 000000000000..2e4d147f18f6
--- /dev/null
+++ b/www/firefox/files/patch-bug961816
@@ -0,0 +1,48 @@
+diff --git config/system-headers config/system-headers
+index 8803150..ae38d68 100644
+--- config/system-headers
++++ config/system-headers
+@@ -1145,3 +1145,4 @@ unicode/ustring.h
+ unicode/utypes.h
+ #endif
+ libutil.h
++unwind.h
+diff --git configure.in configure.in
+index f452a5e..a1ebbcc 100644
+--- configure.in
++++ configure.in
+@@ -7455,7 +7455,10 @@ dnl ========================================================
+ dnl = Support for gcc stack unwinding (from gcc 3.3)
+ dnl ========================================================
+ if test -z "$SKIP_LIBRARY_CHECKS"; then
++ AC_LANG_SAVE
++ AC_LANG_CPLUSPLUS
+ MOZ_CHECK_HEADER(unwind.h, AC_CHECK_FUNCS(_Unwind_Backtrace))
++ AC_LANG_RESTORE
+ fi
+
+ dnl ========================================================
+diff --git config/system-headers config/system-headers
+index 8803150..ae38d68 100644
+--- js/src/config/system-headers
++++ js/src/config/system-headers
+@@ -1145,3 +1145,4 @@ unicode/ustring.h
+ unicode/utypes.h
+ #endif
+ libutil.h
++unwind.h
+diff --git configure.in configure.in
+index f452a5e..a1ebbcc 100644
+--- js/src/configure.in
++++ js/src/configure.in
+@@ -7455,7 +7455,10 @@ dnl ========================================================
+ dnl = Support for gcc stack unwinding (from gcc 3.3)
+ dnl ========================================================
+ if test -z "$SKIP_LIBRARY_CHECKS"; then
++ AC_LANG_SAVE
++ AC_LANG_CPLUSPLUS
+ MOZ_CHECK_HEADER(unwind.h, AC_CHECK_FUNCS(_Unwind_Backtrace))
++ AC_LANG_RESTORE
+ fi
+
+ dnl ========================================================
diff --git a/www/firefox/files/patch-bug962345 b/www/firefox/files/patch-bug962345
new file mode 100644
index 000000000000..a606ec98d4bb
--- /dev/null
+++ b/www/firefox/files/patch-bug962345
@@ -0,0 +1,18 @@
+diff --git config/system-headers config/system-headers
+index 8803150..ae38d68 100644
+--- config/system-headers
++++ config/system-headers
+@@ -1144,3 +1144,4 @@ unicode/utypes.h
+ #endif
+ libutil.h
+ unwind.h
++cairo-qt.h
+diff --git config/system-headers config/system-headers
+index 8803150..ae38d68 100644
+--- js/src/config/system-headers
++++ js/src/config/system-headers
+@@ -1144,3 +1144,4 @@ unicode/utypes.h
+ #endif
+ libutil.h
+ unwind.h
++cairo-qt.h
diff --git a/www/firefox/files/patch-bug973744 b/www/firefox/files/patch-bug973744
new file mode 100644
index 000000000000..6e700705cfbc
--- /dev/null
+++ b/www/firefox/files/patch-bug973744
@@ -0,0 +1,38 @@
+commit 2506904
+Author: Alessandro Decina <alessandro.d@gmail.com>
+Date: Wed Feb 19 11:30:09 2014 -0500
+
+ Bug 973744 - Remove matroska seek hack in the gstreamer media backend. r=edwin
+---
+ content/media/gstreamer/GStreamerReader.cpp | 21 ---------------------
+ 1 file changed, 21 deletions(-)
+
+diff --git content/media/gstreamer/GStreamerReader.cpp content/media/gstreamer/GStreamerReader.cpp
+index e21ffdd..82dadeb 100644
+--- content/media/gstreamer/GStreamerReader.cpp
++++ content/media/gstreamer/GStreamerReader.cpp
+@@ -381,24 +381,6 @@ nsresult GStreamerReader::ReadMetadata(MediaInfo* aInfo,
+ /* we couldn't get this to play */
+ return ret;
+
+- /* FIXME: workaround for a bug in matroskademux. This seek makes matroskademux
+- * parse the index */
+- LOG(PR_LOG_DEBUG, "doing matroskademux seek hack");
+- if (gst_element_seek_simple(mPlayBin, GST_FORMAT_TIME,
+- GST_SEEK_FLAG_FLUSH, 0)) {
+- /* after a seek we need to wait again for ASYNC_DONE */
+- message = gst_bus_timed_pop_filtered(mBus, 5 * GST_SECOND,
+- (GstMessageType)(GST_MESSAGE_ASYNC_DONE | GST_MESSAGE_ERROR));
+- LOG(PR_LOG_DEBUG, "matroskademux seek hack done");
+- if (GST_MESSAGE_TYPE(message) != GST_MESSAGE_ASYNC_DONE) {
+- gst_element_set_state(mPlayBin, GST_STATE_NULL);
+- gst_message_unref(message);
+- return NS_ERROR_FAILURE;
+- }
+- } else {
+- LOG(PR_LOG_DEBUG, "matroskademux seek hack failed (non fatal)");
+- }
+-
+ /* report the duration */
+ gint64 duration;
+
diff --git a/www/firefox/files/patch-bug975634 b/www/firefox/files/patch-bug975634
new file mode 100644
index 000000000000..4b53531a9a34
--- /dev/null
+++ b/www/firefox/files/patch-bug975634
@@ -0,0 +1,63 @@
+diff --git configure.in configure.in
+index 0d9236a..0447104 100644
+--- configure.in
++++ configure.in
+@@ -8670,6 +8670,20 @@ fi
+ AC_SUBST(MOZ_EM_DEBUG)
+
+ if test -n "$COMPILE_ENVIRONMENT"; then
++AC_MSG_CHECKING([for posix_fadvise])
++AC_TRY_LINK([#define _XOPEN_SOURCE 600
++ #include <fcntl.h>],
++ [posix_fadvise(0, 0, 0, 0);],
++ [ac_cv___posix_fadvise=true],
++ [ac_cv___posix_fadvise=false])
++
++if test "$ac_cv___posix_fadvise" = true ; then
++ AC_DEFINE(HAVE_POSIX_FADVISE)
++ AC_MSG_RESULT(yes)
++else
++ AC_MSG_RESULT(no)
++fi
++
+ AC_MSG_CHECKING([for posix_fallocate])
+ AC_TRY_LINK([#define _XOPEN_SOURCE 600
+ #include <fcntl.h>],
+diff --git js/src/configure.in js/src/configure.in
+index da9767c..352ba14 100644
+--- js/src/configure.in
++++ js/src/configure.in
+@@ -4025,6 +4025,20 @@ AC_SUBST(CXX_VERSION)
+ AC_SUBST(MSMANIFEST_TOOL)
+ AC_SUBST(MOZ_LINKER)
+
++AC_MSG_CHECKING([for posix_fadvise])
++AC_TRY_LINK([#define _XOPEN_SOURCE 600
++ #include <fcntl.h>],
++ [posix_fadvise(0, 0, 0, 0);],
++ [ac_cv___posix_fadvise=true],
++ [ac_cv___posix_fadvise=false])
++
++if test "$ac_cv___posix_fadvise" = true ; then
++ AC_DEFINE(HAVE_POSIX_FADVISE)
++ AC_MSG_RESULT(yes)
++else
++ AC_MSG_RESULT(no)
++fi
++
+ AC_MSG_CHECKING([for posix_fallocate])
+ AC_TRY_LINK([#define _XOPEN_SOURCE 600
+ #include <fcntl.h>],
+diff --git xpcom/io/nsLocalFileUnix.cpp xpcom/io/nsLocalFileUnix.cpp
+index bacf06c..0e46e4a 100644
+--- xpcom/io/nsLocalFileUnix.cpp
++++ xpcom/io/nsLocalFileUnix.cpp
+@@ -382,7 +382,7 @@ nsLocalFile::OpenNSPRFileDesc(int32_t flags, int32_t mode, PRFileDesc **_retval)
+ PR_Delete(mPath.get());
+ }
+
+-#if defined(LINUX) && !defined(ANDROID)
++#if defined(HAVE_POSIX_FADVISE)
+ if (flags & OS_READAHEAD) {
+ posix_fadvise(PR_FileDesc2NativeHandle(*_retval), 0, 0,
+ POSIX_FADV_SEQUENTIAL);
diff --git a/www/firefox/files/patch-bug977457 b/www/firefox/files/patch-bug977457
new file mode 100644
index 000000000000..cf57b6b1b809
--- /dev/null
+++ b/www/firefox/files/patch-bug977457
@@ -0,0 +1,27 @@
+diff --git xpcom/base/nsStackWalk.cpp xpcom/base/nsStackWalk.cpp
+index bb0e15b..7641267 100644
+--- xpcom/base/nsStackWalk.cpp
++++ xpcom/base/nsStackWalk.cpp
+@@ -23,6 +23,12 @@ struct CriticalAddress {
+ };
+ static CriticalAddress gCriticalAddress;
+
++// for _Unwind_Backtrace from libcxxrt or libunwind
++// cxxabi.h from libcxxrt implicitly includes unwind.h first
++#if defined(HAVE__UNWIND_BACKTRACE) && !defined(_GNU_SOURCE)
++#define _GNU_SOURCE
++#endif
++
+ #if defined(HAVE_DLOPEN) || defined(XP_MACOSX)
+ #include <dlfcn.h>
+ #endif
+@@ -1222,9 +1228,6 @@ NS_StackWalk(NS_WalkStackCallback aCallback, uint32_t aSkipFrames,
+ #elif defined(HAVE__UNWIND_BACKTRACE)
+
+ // libgcc_s.so symbols _Unwind_Backtrace@@GCC_3.3 and _Unwind_GetIP@@GCC_3.0
+-#ifndef _GNU_SOURCE
+-#define _GNU_SOURCE
+-#endif
+ #include <unwind.h>
+
+ struct unwind_info {
diff --git a/www/firefox/files/patch-clang32-libc++-visibility-hack b/www/firefox/files/patch-clang32-libc++-visibility-hack
deleted file mode 100644
index ccada32cbee3..000000000000
--- a/www/firefox/files/patch-clang32-libc++-visibility-hack
+++ /dev/null
@@ -1,38 +0,0 @@
---- configure.in~
-+++ configure.in
-@@ -2855,6 +2855,7 @@ EOF
- #pragma GCC visibility push(hidden)
- #pragma GCC visibility push(default)
- #include <string.h>
-+#include <iterator>
- #pragma GCC visibility pop
-
- __attribute__ ((visibility ("default"))) void Func() {
-@@ -2863,7 +2864,7 @@ __attribute__ ((visibility ("default"))) void Func() {
- }
- EOF
- ac_cv_have_visibility_builtin_bug=no
-- if ! ${CC-cc} ${CFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -O2 -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
-+ if ! ${CXX-c++} ${CXXFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -O2 -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
- ac_cv_have_visibility_builtin_bug=yes
- else
- if test `grep -c "@PLT" conftest.S` = 0; then
---- js/src/configure.in~
-+++ js/src/configure.in
-@@ -2855,6 +2855,7 @@ EOF
- #pragma GCC visibility push(hidden)
- #pragma GCC visibility push(default)
- #include <string.h>
-+#include <iterator>
- #pragma GCC visibility pop
-
- __attribute__ ((visibility ("default"))) void Func() {
-@@ -2863,7 +2864,7 @@ __attribute__ ((visibility ("default"))) void Func() {
- }
- EOF
- ac_cv_have_visibility_builtin_bug=no
-- if ! ${CC-cc} ${CFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -O2 -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
-+ if ! ${CXX-c++} ${CXXFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -O2 -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
- ac_cv_have_visibility_builtin_bug=yes
- else
- if test `grep -c "@PLT" conftest.S` = 0; then
diff --git a/www/firefox/files/patch-clang34-disable-stdcall b/www/firefox/files/patch-clang34-disable-stdcall
new file mode 100644
index 000000000000..8f4bb31b9ccd
--- /dev/null
+++ b/www/firefox/files/patch-clang34-disable-stdcall
@@ -0,0 +1,13 @@
+# http://llvm.org/bugs/show_bug.cgi?id=19007
+
+--- xpcom/base/nscore.h~
++++ xpcom/base/nscore.h
+@@ -110,7 +110,7 @@
+ * NS_HIDDEN_(int) NS_FASTCALL func2(char *foo);
+ */
+
+-#if defined(__i386__) && defined(__GNUC__) && !defined(XP_OS2)
++#if defined(__i386__) && defined(__GNUC__) && !defined(XP_OS2) && !(defined(__clang__) && __clang_major__ == 3 && __clang_minor__ == 4 && __clang_patchlevel__ == 0)
+ #define NS_FASTCALL __attribute__ ((regparm (3), stdcall))
+ #define NS_CONSTRUCTOR_FASTCALL __attribute__ ((regparm (3), stdcall))
+ #elif defined(XP_WIN) && !defined(_WIN64)
diff --git a/www/firefox/files/patch-js-src-Makefile.in b/www/firefox/files/patch-js-src-Makefile.in
new file mode 100644
index 000000000000..fd51943d652b
--- /dev/null
+++ b/www/firefox/files/patch-js-src-Makefile.in
@@ -0,0 +1,11 @@
+--- js/src/Makefile.in~
++++ js/src/Makefile.in
+@@ -373,7 +373,7 @@ endif
+ ifdef MOZ_SHARED_ICU
+ EXTRA_DSO_LDOPTS += $(MOZ_ICU_LIBS)
+ else
+-SHARED_LIBRARY_LIBS += $(MOZ_ICU_LIBS)
++SHARED_LIBRARY_LIBS += $(filter-out -L% -l%,$(MOZ_ICU_LIBS))
+ endif
+
+ # Prevent floating point errors caused by VC++ optimizations
diff --git a/www/firefox/files/patch-memory-jemalloc-Makefile.in b/www/firefox/files/patch-memory-jemalloc-Makefile.in
new file mode 100644
index 000000000000..e02b050cbb1d
--- /dev/null
+++ b/www/firefox/files/patch-memory-jemalloc-Makefile.in
@@ -0,0 +1,10 @@
+--- memory/jemalloc/Makefile.in~
++++ memory/jemalloc/Makefile.in
+@@ -12,3 +12,7 @@ include $(topsrcdir)/config/rules.mk
+ ifdef GNU_CC
+ CFLAGS += -std=gnu99
+ endif
++
++# XXX startup crash workaround for gcc47 on amd64
++jemalloc.$(OBJ_SUFFIX): OS_CFLAGS := $(filter-out -O3 -Ofast,$(OS_CFLAGS))
++jemalloc.$(OBJ_SUFFIX): MOZ_OPTIMIZE_FLAGS=
diff --git a/www/firefox/files/patch-toolkit_xre_Makefile.in b/www/firefox/files/patch-toolkit_xre_Makefile.in
deleted file mode 100644
index 4a9c8533a2f8..000000000000
--- a/www/firefox/files/patch-toolkit_xre_Makefile.in
+++ /dev/null
@@ -1,8 +0,0 @@
---- toolkit/xre/Makefile.in.orig 2007-09-10 10:31:53.000000000 -0400
-+++ toolkit/xre/Makefile.in 2007-09-10 10:35:00.000000000 -0400
-@@ -263,5 +263,3 @@
- libs:: platform.ini
- $(INSTALL) $^ $(DIST)/bin
-
--install::
-- $(INSTALL) $(IFLAGS1) $^ $(DESTDIR)$(mozappdir)
diff --git a/www/firefox/files/patch-z-bug517422 b/www/firefox/files/patch-z-bug517422
new file mode 100644
index 000000000000..bc9dea891a3d
--- /dev/null
+++ b/www/firefox/files/patch-z-bug517422
@@ -0,0 +1,263 @@
+# Allow building against system-wide ogg/vorbis/opus.
+
+diff --git config/Makefile.in config/Makefile.in
+index 5383399..4393ae8 100644
+--- config/Makefile.in
++++ config/Makefile.in
+@@ -79,6 +79,9 @@ export:: $(export-preqs)
+ -DMOZ_NATIVE_ICU=$(MOZ_NATIVE_ICU) \
+ -DMOZ_NATIVE_GRAPHITE2=$(MOZ_NATIVE_GRAPHITE2) \
+ -DMOZ_NATIVE_HARFBUZZ=$(MOZ_NATIVE_HARFBUZZ) \
++ -DMOZ_NATIVE_OGG=$(MOZ_NATIVE_OGG) \
++ -DMOZ_NATIVE_VORBIS=$(MOZ_NATIVE_VORBIS) \
++ -DMOZ_NATIVE_OPUS=$(MOZ_NATIVE_OPUS) \
+ $(srcdir)/system-headers | $(PERL) $(topsrcdir)/nsprpub/config/make-system-wrappers.pl system_wrappers
+ $(INSTALL) system_wrappers $(DIST)
+
+diff --git config/external/moz.build config/external/moz.build
+index c22a36c..740402e 100644
+--- config/external/moz.build
++++ config/external/moz.build
+@@ -15,13 +15,13 @@ if CONFIG['MOZ_UPDATER']:
+ if not CONFIG['MOZ_NATIVE_BZ2']:
+ external_dirs += ['modules/libbz2']
+
+-if CONFIG['MOZ_VORBIS']:
++if CONFIG['MOZ_VORBIS'] and not CONFIG['MOZ_NATIVE_VORBIS']:
+ external_dirs += ['media/libvorbis']
+
+ if CONFIG['MOZ_TREMOR']:
+ external_dirs += ['media/libtremor']
+
+-if CONFIG['MOZ_OPUS']:
++if CONFIG['MOZ_OPUS'] and not CONFIG['MOZ_NATIVE_OPUS']:
+ external_dirs += ['media/libopus']
+
+ if CONFIG['MOZ_WEBM']:
+@@ -34,7 +34,9 @@ if CONFIG['MOZ_VPX'] and not CONFIG['MOZ_NATIVE_LIBVPX']:
+ external_dirs += ['media/libvpx']
+
+ if CONFIG['MOZ_OGG']:
+- external_dirs += ['media/libogg', 'media/libtheora']
++ if not CONFIG['MOZ_NATIVE_OGG']:
++ external_dirs += ['media/libogg']
++ external_dirs += ['media/libtheora']
+
+ if not CONFIG['MOZ_NATIVE_PNG']:
+ external_dirs += ['media/libpng']
+diff --git config/system-headers config/system-headers
+index b711fc3..fd3c14f 100644
+--- config/system-headers
++++ config/system-headers
+@@ -1153,3 +1153,17 @@ graphite2/Segment.h
+ harfbuzz/hb-ot.h
+ harfbuzz/hb.h
+ #endif
++#if MOZ_NATIVE_OGG==1
++ogg/ogg.h
++ogg/os_types.h
++#endif
++#if MOZ_NATIVE_VORBIS==1
++vorbis/codec.h
++vorbis/vorbisenc.h
++#endif
++#if MOZ_NATIVE_OPUS==1
++opus.h
++opus_multistream.h
++opus/opus.h
++opus/opus_multistream.h
++#endif
+diff --git configure.in configure.in
+index df49287..05e97ff 100644
+--- configure.in
++++ configure.in
+@@ -5130,6 +5130,40 @@ if test "${ac_cv_c_attribute_aligned}" != "0"; then
+ fi
+
+ dnl ========================================================
++dnl Check for libogg
++dnl ========================================================
++
++MOZ_ARG_WITH_BOOL(system-ogg,
++[ --with-system-ogg Use system libogg (located with pkgconfig)],
++MOZ_NATIVE_OGG=1,
++MOZ_NATIVE_OGG= )
++
++if test -n "$MOZ_NATIVE_OGG"; then
++ PKG_CHECK_MODULES(MOZ_OGG, ogg >= 1.2.1)
++fi
++
++AC_SUBST(MOZ_NATIVE_OGG)
++AC_SUBST(MOZ_OGG_CFLAGS)
++AC_SUBST(MOZ_OGG_LIBS)
++
++dnl ========================================================
++dnl Check for libvorbis
++dnl ========================================================
++
++MOZ_ARG_WITH_BOOL(system-vorbis,
++[ --with-system-vorbis Use system libvorbis (located with pkgconfig)],
++MOZ_NATIVE_VORBIS=1,
++MOZ_NATIVE_VORBIS= )
++
++if test -n "$MOZ_NATIVE_VORBIS"; then
++ PKG_CHECK_MODULES(MOZ_VORBIS, vorbis vorbisenc >= 1.3.4)
++fi
++
++AC_SUBST(MOZ_NATIVE_VORBIS)
++AC_SUBST(MOZ_VORBIS_CFLAGS)
++AC_SUBST(MOZ_VORBIS_LIBS)
++
++dnl ========================================================
+ dnl = Disable Opus audio codec support
+ dnl ========================================================
+ MOZ_ARG_DISABLE_BOOL(opus,
+@@ -5138,6 +5172,25 @@ MOZ_ARG_DISABLE_BOOL(opus,
+ MOZ_OPUS=1)
+
+ dnl ========================================================
++dnl Check for libopus
++dnl ========================================================
++
++MOZ_ARG_WITH_BOOL(system-opus,
++[ --with-system-opus Use system libopus (located with pkgconfig)],
++MOZ_NATIVE_OPUS=1,
++MOZ_NATIVE_OPUS= )
++
++if test -n "$MOZ_NATIVE_OPUS"; then
++ PKG_CHECK_MODULES(MOZ_OPUS, opus >= 1.1)
++else
++ MOZ_OPUS_CFLAGS='-I$(topsrcdir)/media/libopus/include'
++fi
++
++AC_SUBST(MOZ_NATIVE_OPUS)
++AC_SUBST(MOZ_OPUS_CFLAGS)
++AC_SUBST(MOZ_OPUS_LIBS)
++
++dnl ========================================================
+ dnl = Disable VP8 decoder support
+ dnl ========================================================
+ MOZ_ARG_DISABLE_BOOL(webm,
+diff --git content/media/Makefile.in content/media/Makefile.in
+index 68f360e..76f2d57 100644
+--- content/media/Makefile.in
++++ content/media/Makefile.in
+@@ -7,4 +7,16 @@ include $(topsrcdir)/config/rules.mk
+ CFLAGS += $(GSTREAMER_CFLAGS)
+ CXXFLAGS += $(GSTREAMER_CFLAGS)
+
++ifdef MOZ_NATIVE_OGG
++CXXFLAGS += $(MOZ_OGG_CFLAGS)
++endif
++
++ifdef MOZ_NATIVE_VORBIS
++CXXFLAGS += $(MOZ_VORBIS_CFLAGS)
++endif
++
++ifdef MOZ_NATIVE_OPUS
++CXXFLAGS += $(MOZ_OPUS_CFLAGS)
++endif
++
+ AudioNodeEngineNEON.$(OBJ_SUFFIX): CXXFLAGS += -mfpu=neon
+diff --git media/libtheora/Makefile.in media/libtheora/Makefile.in
+new file mode 100644
+index 0000000..1f02dc0
+--- /dev/null
++++ media/libtheora/Makefile.in
+@@ -0,0 +1,9 @@
++# This Source Code Form is subject to the terms of the Mozilla Public
++# License, v. 2.0. If a copy of the MPL was not distributed with this
++# file, You can obtain one at http://mozilla.org/MPL/2.0/.
++
++include $(topsrcdir)/config/rules.mk
++
++ifdef MOZ_NATIVE_OGG
++CFLAGS += $(MOZ_OGG_CFLAGS)
++endif
+diff --git media/libtremor/Makefile.in media/libtremor/Makefile.in
+new file mode 100644
+index 0000000..1f02dc0
+--- /dev/null
++++ media/libtremor/Makefile.in
+@@ -0,0 +1,9 @@
++# This Source Code Form is subject to the terms of the Mozilla Public
++# License, v. 2.0. If a copy of the MPL was not distributed with this
++# file, You can obtain one at http://mozilla.org/MPL/2.0/.
++
++include $(topsrcdir)/config/rules.mk
++
++ifdef MOZ_NATIVE_OGG
++CFLAGS += $(MOZ_OGG_CFLAGS)
++endif
+diff --git media/libvorbis/Makefile.in media/libvorbis/Makefile.in
+new file mode 100644
+index 0000000..1f02dc0
+--- /dev/null
++++ media/libvorbis/Makefile.in
+@@ -0,0 +1,9 @@
++# This Source Code Form is subject to the terms of the Mozilla Public
++# License, v. 2.0. If a copy of the MPL was not distributed with this
++# file, You can obtain one at http://mozilla.org/MPL/2.0/.
++
++include $(topsrcdir)/config/rules.mk
++
++ifdef MOZ_NATIVE_OGG
++CFLAGS += $(MOZ_OGG_CFLAGS)
++endif
+diff --git media/webrtc/signaling/test/Makefile.in media/webrtc/signaling/test/Makefile.in
+index c5e82c4..91ef86a 100644
+--- media/webrtc/signaling/test/Makefile.in
++++ media/webrtc/signaling/test/Makefile.in
+@@ -48,6 +48,12 @@ LIBS += \
+ $(NULL)
+ endif
+
++ifdef MOZ_NATIVE_OPUS
++LIBS += \
++ $(MOZ_OPUS_LIBS) \
++ $(NULL)
++endif
++
+ ifdef MOZ_NATIVE_LIBVPX
+ LIBS += \
+ $(MOZ_LIBVPX_LIBS) \
+diff --git media/webrtc/trunk/webrtc/modules/audio_coding/codecs/opus/opus.gypi media/webrtc/trunk/webrtc/modules/audio_coding/codecs/opus/opus.gypi
+index 00e77e7..55f48ab 100644
+--- media/webrtc/trunk/webrtc/modules/audio_coding/codecs/opus/opus.gypi
++++ media/webrtc/trunk/webrtc/modules/audio_coding/codecs/opus/opus.gypi
+@@ -14,9 +14,9 @@
+ 'conditions': [
+ ['build_with_mozilla==1', {
+ # Mozilla provides its own build of the opus library.
+- 'include_dirs': [
+- '$(DIST)/include/opus',
+- ]
++ 'cflags_mozilla': [
++ '$(MOZ_OPUS_CFLAGS)',
++ ],
+ }, {
+ 'dependencies': [
+ '<(DEPTH)/third_party/opus/opus.gyp:opus'
+diff --git toolkit/library/Makefile.in toolkit/library/Makefile.in
+index 27f488e..cd27084 100644
+--- toolkit/library/Makefile.in
++++ toolkit/library/Makefile.in
+@@ -91,6 +91,18 @@ ifdef MOZ_NATIVE_HUNSPELL
+ EXTRA_DSO_LDOPTS += $(MOZ_HUNSPELL_LIBS)
+ endif
+
++ifdef MOZ_NATIVE_OGG
++EXTRA_DSO_LDOPTS += $(MOZ_OGG_LIBS)
++endif
++
++ifdef MOZ_NATIVE_VORBIS
++EXTRA_DSO_LDOPTS += $(MOZ_VORBIS_LIBS)
++endif
++
++ifdef MOZ_NATIVE_OPUS
++EXTRA_DSO_LDOPTS += $(MOZ_OPUS_LIBS)
++endif
++
+ ifdef MOZ_NATIVE_LIBEVENT
+ EXTRA_DSO_LDOPTS += $(MOZ_LIBEVENT_LIBS)
+ endif
diff --git a/www/firefox/pkg-message b/www/firefox/pkg-message
index 33841ae90f29..90ee88f269ea 100644
--- a/www/firefox/pkg-message
+++ b/www/firefox/pkg-message
@@ -16,8 +16,18 @@ The SSH server on remote_host must allow pub key authentication.
Firefox and HTML5
-Certain functions used to display HTML5 elements need the sem module
-only on 8.x releases.
+H.264 or MP3 playback may fail due to ffmpeg/libav bug with one of
+the following messages on the terminal
+
+ (gst-plugin-scanner:35828): GStreamer-WARNING **: Failed to load plugin '/usr/local/lib/gstreamer-1.0/libgstlibav.so': /usr/local/lib/gstreamer-1.0/libgstlibav.so: Undefined symbol "ff_MPV_common_init_x86"
+ (gst-plugin-scanner:87596): GStreamer-WARNING **: Failed to load plugin '/usr/local/lib/gstreamer-1.0/libgstlibav.so': /usr/local/lib/gstreamer-1.0/libgstlibav.so: Undefined symbol "ff_deinterlace_line_mmx"
+ (gst-plugin-scanner:55274): GStreamer-WARNING **: Failed to load plugin '/usr/local/lib/gstreamer-1.0/libgstlibav.so': /usr/local/lib/gstreamer-1.0/libgstlibav.so: Undefined symbol "ff_vc1dsp_init_x86"
+
+If you happen to be affected please apply the fix in ports/181964 and
+rebuild the ports.
+
+Also, certain functions used to display HTML5 elements need the sem(4)
+module but only on 8.x releases (or before r201546).
If your Firefox crashes with the following message while viewing a
HTML5 page:
diff --git a/www/libxul/Makefile b/www/libxul/Makefile
index c6d7cb3fb4f2..ffd07fc388c3 100644
--- a/www/libxul/Makefile
+++ b/www/libxul/Makefile
@@ -16,7 +16,11 @@ BUILD_DEPENDS= nspr>=4.10.2:${PORTSDIR}/devel/nspr \
sqlite3>=3.7.17:${PORTSDIR}/databases/sqlite3 \
${PYTHON_PKGNAMEPREFIX}sqlite3>0:${PORTSDIR}/databases/py-sqlite3 \
cairo>=1.10.2_1,1:${PORTSDIR}/graphics/cairo \
+ harfbuzz>=0.9.16:${PORTSDIR}/print/harfbuzz \
+ libvorbis>=1.3.4:${PORTSDIR}/audio/libvorbis \
+ opus>=1.1:${PORTSDIR}/audio/opus \
v4l_compat>0:${PORTSDIR}/multimedia/v4l_compat \
+ zip:${PORTSDIR}/archivers/zip \
unzip:${PORTSDIR}/archivers/unzip
LIB_DEPENDS= libv4l2.so:${PORTSDIR}/multimedia/libv4l
diff --git a/www/libxul/files/patch-bug893397 b/www/libxul/files/patch-bug893397
index ab573204f4f4..906f712d58dd 100644
--- a/www/libxul/files/patch-bug893397
+++ b/www/libxul/files/patch-bug893397
@@ -31,7 +31,7 @@ new file mode 100644
index 0000000..80d4cb6
--- /dev/null
+++ netwerk/wifi/nsWifiScannerFreeBSD.cpp
-@@ -0,0 +1,168 @@
+@@ -0,0 +1,167 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
@@ -62,37 +62,37 @@ index 0000000..80d4cb6
+{
+ // get list of interfaces
+ struct ifaddrs *ifal;
-+ if (getifaddrs(&ifal) < 0)
++ if (getifaddrs(&ifal) < 0) {
+ return NS_ERROR_FAILURE;
++ }
+
+ accessPoints.Clear();
+
+ // loop through the interfaces
+ nsresult rv = NS_ERROR_FAILURE;
+ struct ifaddrs *ifa;
-+ char *dupn = NULL;
+ for (ifa = ifal; ifa; ifa = ifa->ifa_next) {
-+ struct ifreq ifr;
-+ memset(&ifr, 0, sizeof(ifr));
-+
-+ // list can contain duplicates, so ignore those
-+ if (dupn != NULL && strcmp(dupn, ifa->ifa_name) == 0)
++ // limit to one interface per address
++ if (ifa->ifa_addr->sa_family != AF_LINK) {
+ continue;
-+ dupn = ifa->ifa_name;
++ }
+
+ // store interface name in socket structure
++ struct ifreq ifr;
++ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, ifa->ifa_name, sizeof(ifr.ifr_name));
+ ifr.ifr_addr.sa_family = AF_LOCAL;
+
+ // open socket to interface
+ int s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0);
-+ if (s < 0)
++ if (s < 0) {
+ continue;
++ }
+
+ // clear interface media structure
+ struct ifmediareq ifmr;
-+ (void) memset(&ifmr, 0, sizeof(ifmr));
-+ (void) strncpy(ifmr.ifm_name, ifa->ifa_name, sizeof(ifmr.ifm_name));
++ memset(&ifmr, 0, sizeof(ifmr));
++ strncpy(ifmr.ifm_name, ifa->ifa_name, sizeof(ifmr.ifm_name));
+
+ // get interface media information
+ if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) {
@@ -109,8 +109,8 @@ index 0000000..80d4cb6
+ // perform WiFi scan
+ struct ieee80211req i802r;
+ char iscanbuf[32*1024];
-+ (void) memset(&i802r, 0, sizeof(i802r));
-+ (void) strncpy(i802r.i_name, ifa->ifa_name, sizeof(i802r.i_name));
++ memset(&i802r, 0, sizeof(i802r));
++ strncpy(i802r.i_name, ifa->ifa_name, sizeof(i802r.i_name));
+ i802r.i_type = IEEE80211_IOC_SCAN_RESULTS;
+ i802r.i_data = iscanbuf;
+ i802r.i_len = sizeof(iscanbuf);
@@ -135,8 +135,7 @@ index 0000000..80d4cb6
+ if (isr->isr_meshid_len) {
+ id = vsr + isr->isr_ie_off + isr->isr_ssid_len;
+ idlen = isr->isr_meshid_len;
-+ }
-+ else {
++ } else {
+ id = vsr + isr->isr_ie_off;
+ idlen = isr->isr_ssid_len;
+ }
diff --git a/www/libxul/files/patch-bug961264 b/www/libxul/files/patch-bug961264
new file mode 100644
index 000000000000..85bc94d001ff
--- /dev/null
+++ b/www/libxul/files/patch-bug961264
@@ -0,0 +1,266 @@
+commit d099acd
+Author: Trevor Saunders <trev.saunders@gmail.com>
+Date: Fri Jan 17 15:08:00 2014 -0800
+
+ Bug 961264 - Remove obsolete checks for gcc visibility stuff.
+---
+ configure.in | 115 +++-------------------------------------------------
+ js/src/configure.in | 111 ++------------------------------------------------
+ 2 files changed, 8 insertions(+), 218 deletions(-)
+
+diff --git configure.in configure.in
+index dfb8193..33d71b3 100644
+--- configure.in
++++ configure.in
+@@ -2507,118 +2507,15 @@ MOZ_CXX11
+
+ AC_LANG_C
+
+-dnl Check for .hidden assembler directive and visibility attribute.
+-dnl Borrowed from glibc configure.in
++dnl Setup default hidden visibility and wrapped system headers.
+ dnl ===============================================================
+ if test "$GNU_CC"; then
+- AC_CACHE_CHECK(for visibility(hidden) attribute,
+- ac_cv_visibility_hidden,
+- [cat > conftest.c <<EOF
+- int foo __attribute__ ((visibility ("hidden"))) = 1;
+-EOF
+- ac_cv_visibility_hidden=no
+- if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then
+- if egrep '\.(hidden|private_extern).*foo' conftest.s >/dev/null; then
+- ac_cv_visibility_hidden=yes
+- fi
+- fi
+- rm -f conftest.[cs]
+- ])
+- if test "$ac_cv_visibility_hidden" = "yes"; then
+- AC_DEFINE(HAVE_VISIBILITY_HIDDEN_ATTRIBUTE)
+-
+- AC_CACHE_CHECK(for visibility(default) attribute,
+- ac_cv_visibility_default,
+- [cat > conftest.c <<EOF
+- int foo __attribute__ ((visibility ("default"))) = 1;
+-EOF
+- ac_cv_visibility_default=no
+- if ${CC-cc} -fvisibility=hidden -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then
+- if ! egrep '\.(hidden|private_extern).*foo' conftest.s >/dev/null; then
+- ac_cv_visibility_default=yes
+- fi
+- fi
+- rm -f conftest.[cs]
+- ])
+- if test "$ac_cv_visibility_default" = "yes"; then
+- AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE)
+-
+- AC_CACHE_CHECK(for visibility pragma support,
+- ac_cv_visibility_pragma,
+- [cat > conftest.c <<EOF
+-#pragma GCC visibility push(hidden)
+- int foo_hidden = 1;
+-#pragma GCC visibility push(default)
+- int foo_default = 1;
+-EOF
+- ac_cv_visibility_pragma=no
+- if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then
+- if egrep '\.(hidden|private_extern).*foo_hidden' conftest.s >/dev/null; then
+- if ! egrep '\.(hidden|private_extern).*foo_default' conftest.s > /dev/null; then
+- ac_cv_visibility_pragma=yes
+- fi
+- fi
+- fi
+- rm -f conftest.[cs]
+- ])
+- if test "$ac_cv_visibility_pragma" = "yes"; then
+- AC_CACHE_CHECK(For gcc visibility bug with class-level attributes (GCC bug 26905),
+- ac_cv_have_visibility_class_bug,
+- [cat > conftest.c <<EOF
+-#pragma GCC visibility push(hidden)
+-struct __attribute__ ((visibility ("default"))) TestStruct {
+- static void Init();
+-};
+-__attribute__ ((visibility ("default"))) void TestFunc() {
+- TestStruct::Init();
+-}
+-EOF
+- ac_cv_have_visibility_class_bug=no
+- if ! ${CXX-g++} ${CXXFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
+- ac_cv_have_visibility_class_bug=yes
+- else
+- if test `egrep -c '@PLT|\\$stub' conftest.S` = 0; then
+- ac_cv_have_visibility_class_bug=yes
+- fi
+- fi
+- rm -rf conftest.{c,S}
+- ])
+-
+- AC_CACHE_CHECK(For x86_64 gcc visibility bug with builtins (GCC bug 20297),
+- ac_cv_have_visibility_builtin_bug,
+- [cat > conftest.c <<EOF
+-#pragma GCC visibility push(hidden)
+-#pragma GCC visibility push(default)
+-#include <string.h>
+-#pragma GCC visibility pop
+-
+-__attribute__ ((visibility ("default"))) void Func() {
+- char c[[100]];
+- memset(c, 0, sizeof(c));
+-}
+-EOF
+- ac_cv_have_visibility_builtin_bug=no
+- if ! ${CC-cc} ${CFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -O2 -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
+- ac_cv_have_visibility_builtin_bug=yes
+- else
+- if test `grep -c "@PLT" conftest.S` = 0; then
+- ac_cv_visibility_builtin_bug=yes
+- fi
+- fi
+- rm -f conftest.{c,S}
+- ])
+- if test "$ac_cv_have_visibility_builtin_bug" = "no" -a \
+- "$ac_cv_have_visibility_class_bug" = "no"; then
+- VISIBILITY_FLAGS='-I$(DIST)/system_wrappers -include $(topsrcdir)/config/gcc_hidden.h'
+- WRAP_SYSTEM_INCLUDES=1
+- STL_FLAGS='-I$(DIST)/stl_wrappers'
+- WRAP_STL_INCLUDES=1
+- else
+- VISIBILITY_FLAGS='-fvisibility=hidden'
+- fi # have visibility pragma bug
+- fi # have visibility pragma
+- fi # have visibility(default) attribute
+- fi # have visibility(hidden) attribute
++ AC_DEFINE(HAVE_VISIBILITY_HIDDEN_ATTRIBUTE)
++ AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE)
++ VISIBILITY_FLAGS='-I$(DIST)/system_wrappers -include $(topsrcdir)/config/gcc_hidden.h'
++ WRAP_SYSTEM_INCLUDES=1
++ STL_FLAGS='-I$(DIST)/stl_wrappers'
++ WRAP_STL_INCLUDES=1
+ fi # GNU_CC
+
+ # visibility hidden flag for Sun Studio on Solaris
+diff --git js/src/configure.in js/src/configure.in
+index bddd46d..d4b522e 100644
+--- js/src/configure.in
++++ js/src/configure.in
+@@ -2348,116 +2348,13 @@ fi
+
+ AC_LANG_C
+
+-dnl Check for .hidden assembler directive and visibility attribute.
+-dnl Borrowed from glibc configure.in
++dnl Setup default hidden visibility and wrapped system headers.
+ dnl ===============================================================
+ if test "$GNU_CC"; then
+- AC_CACHE_CHECK(for visibility(hidden) attribute,
+- ac_cv_visibility_hidden,
+- [cat > conftest.c <<EOF
+- int foo __attribute__ ((visibility ("hidden"))) = 1;
+-EOF
+- ac_cv_visibility_hidden=no
+- if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then
+- if egrep '\.(hidden|private_extern).*foo' conftest.s >/dev/null; then
+- ac_cv_visibility_hidden=yes
+- fi
+- fi
+- rm -f conftest.[cs]
+- ])
+- if test "$ac_cv_visibility_hidden" = "yes"; then
+- AC_DEFINE(HAVE_VISIBILITY_HIDDEN_ATTRIBUTE)
+-
+- AC_CACHE_CHECK(for visibility(default) attribute,
+- ac_cv_visibility_default,
+- [cat > conftest.c <<EOF
+- int foo __attribute__ ((visibility ("default"))) = 1;
+-EOF
+- ac_cv_visibility_default=no
+- if ${CC-cc} -fvisibility=hidden -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then
+- if ! egrep '\.(hidden|private_extern).*foo' conftest.s >/dev/null; then
+- ac_cv_visibility_default=yes
+- fi
+- fi
+- rm -f conftest.[cs]
+- ])
+- if test "$ac_cv_visibility_default" = "yes"; then
+- AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE)
+-
+- AC_CACHE_CHECK(for visibility pragma support,
+- ac_cv_visibility_pragma,
+- [cat > conftest.c <<EOF
+-#pragma GCC visibility push(hidden)
+- int foo_hidden = 1;
+-#pragma GCC visibility push(default)
+- int foo_default = 1;
+-EOF
+- ac_cv_visibility_pragma=no
+- if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then
+- if egrep '\.(hidden|private_extern).*foo_hidden' conftest.s >/dev/null; then
+- if ! egrep '\.(hidden|private_extern).*foo_default' conftest.s > /dev/null; then
+- ac_cv_visibility_pragma=yes
+- fi
+- fi
+- fi
+- rm -f conftest.[cs]
+- ])
+- if test "$ac_cv_visibility_pragma" = "yes"; then
+- AC_CACHE_CHECK(For gcc visibility bug with class-level attributes (GCC bug 26905),
+- ac_cv_have_visibility_class_bug,
+- [cat > conftest.c <<EOF
+-#pragma GCC visibility push(hidden)
+-struct __attribute__ ((visibility ("default"))) TestStruct {
+- static void Init();
+-};
+-__attribute__ ((visibility ("default"))) void TestFunc() {
+- TestStruct::Init();
+-}
+-EOF
+- ac_cv_have_visibility_class_bug=no
+- if ! ${CXX-g++} ${CXXFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
+- ac_cv_have_visibility_class_bug=yes
+- else
+- if test `egrep -c '@PLT|\\$stub' conftest.S` = 0; then
+- ac_cv_have_visibility_class_bug=yes
+- fi
+- fi
+- rm -rf conftest.{c,S}
+- ])
+-
+- AC_CACHE_CHECK(For x86_64 gcc visibility bug with builtins (GCC bug 20297),
+- ac_cv_have_visibility_builtin_bug,
+- [cat > conftest.c <<EOF
+-#pragma GCC visibility push(hidden)
+-#pragma GCC visibility push(default)
+-#include <string.h>
+-#pragma GCC visibility pop
+-
+-__attribute__ ((visibility ("default"))) void Func() {
+- char c[[100]];
+- memset(c, 0, sizeof(c));
+-}
+-EOF
+- ac_cv_have_visibility_builtin_bug=no
+- if ! ${CC-cc} ${CFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -O2 -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
+- ac_cv_have_visibility_builtin_bug=yes
+- else
+- if test `grep -c "@PLT" conftest.S` = 0; then
+- ac_cv_visibility_builtin_bug=yes
+- fi
+- fi
+- rm -f conftest.{c,S}
+- ])
+- if test "$ac_cv_have_visibility_builtin_bug" = "no" -a \
+- "$ac_cv_have_visibility_class_bug" = "no"; then
+- VISIBILITY_FLAGS='-I$(DIST)/system_wrappers_js -include $(topsrcdir)/config/gcc_hidden.h'
+- WRAP_SYSTEM_INCLUDES=1
+- else
+- VISIBILITY_FLAGS='-fvisibility=hidden'
+- fi # have visibility pragma bug
+- fi # have visibility pragma
+- fi # have visibility(default) attribute
+- fi # have visibility(hidden) attribute
++ AC_DEFINE(HAVE_VISIBILITY_HIDDEN_ATTRIBUTE)
++ AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE)
++ VISIBILITY_FLAGS='-I$(DIST)/system_wrappers_js -include $(topsrcdir)/config/gcc_hidden.h'
++ WRAP_SYSTEM_INCLUDES=1
+ fi # GNU_CC
+
+ # visibility hidden flag for Sun Studio on Solaris
diff --git a/www/libxul/files/patch-bug975634 b/www/libxul/files/patch-bug975634
new file mode 100644
index 000000000000..d41e69e83892
--- /dev/null
+++ b/www/libxul/files/patch-bug975634
@@ -0,0 +1,63 @@
+diff --git configure.in configure.in
+index 0d9236a..0447104 100644
+--- configure.in
++++ configure.in
+@@ -9034,6 +9034,20 @@ AC_SUBST(MOZ_FOLD_LIBS)
+ AC_SUBST(MOZ_ENABLE_SZIP)
+ AC_SUBST(MOZ_SZIP_FLAGS)
+
++AC_MSG_CHECKING([for posix_fadvise])
++AC_TRY_LINK([#define _XOPEN_SOURCE 600
++ #include <fcntl.h>],
++ [posix_fadvise(0, 0, 0, 0);],
++ [ac_cv___posix_fadvise=true],
++ [ac_cv___posix_fadvise=false])
++
++if test "$ac_cv___posix_fadvise" = true ; then
++ AC_DEFINE(HAVE_POSIX_FADVISE)
++ AC_MSG_RESULT(yes)
++else
++ AC_MSG_RESULT(no)
++fi
++
+ AC_MSG_CHECKING([for posix_fallocate])
+ AC_TRY_LINK([#define _XOPEN_SOURCE 600
+ #include <fcntl.h>],
+diff --git js/src/configure.in js/src/configure.in
+index da9767c..352ba14 100644
+--- js/src/configure.in
++++ js/src/configure.in
+@@ -4025,6 +4025,20 @@ AC_SUBST(CXX_VERSION)
+ AC_SUBST(MSMANIFEST_TOOL)
+ AC_SUBST(MOZ_LINKER)
+
++AC_MSG_CHECKING([for posix_fadvise])
++AC_TRY_LINK([#define _XOPEN_SOURCE 600
++ #include <fcntl.h>],
++ [posix_fadvise(0, 0, 0, 0);],
++ [ac_cv___posix_fadvise=true],
++ [ac_cv___posix_fadvise=false])
++
++if test "$ac_cv___posix_fadvise" = true ; then
++ AC_DEFINE(HAVE_POSIX_FADVISE)
++ AC_MSG_RESULT(yes)
++else
++ AC_MSG_RESULT(no)
++fi
++
+ AC_MSG_CHECKING([for posix_fallocate])
+ AC_TRY_LINK([#define _XOPEN_SOURCE 600
+ #include <fcntl.h>],
+diff --git xpcom/io/nsLocalFileUnix.cpp xpcom/io/nsLocalFileUnix.cpp
+index bacf06c..0e46e4a 100644
+--- xpcom/io/nsLocalFileUnix.cpp
++++ xpcom/io/nsLocalFileUnix.cpp
+@@ -382,7 +382,7 @@ nsLocalFile::OpenNSPRFileDesc(int32_t flags, int32_t mode, PRFileDesc **_retval)
+ PR_Delete(mPath.get());
+ }
+
+-#if defined(LINUX) && !defined(ANDROID)
++#if defined(HAVE_POSIX_FADVISE)
+ if (flags & OS_READAHEAD) {
+ posix_fadvise(PR_FileDesc2NativeHandle(*_retval), 0, 0,
+ POSIX_FADV_SEQUENTIAL);
diff --git a/www/libxul/files/patch-bug977457 b/www/libxul/files/patch-bug977457
new file mode 100644
index 000000000000..cf57b6b1b809
--- /dev/null
+++ b/www/libxul/files/patch-bug977457
@@ -0,0 +1,27 @@
+diff --git xpcom/base/nsStackWalk.cpp xpcom/base/nsStackWalk.cpp
+index bb0e15b..7641267 100644
+--- xpcom/base/nsStackWalk.cpp
++++ xpcom/base/nsStackWalk.cpp
+@@ -23,6 +23,12 @@ struct CriticalAddress {
+ };
+ static CriticalAddress gCriticalAddress;
+
++// for _Unwind_Backtrace from libcxxrt or libunwind
++// cxxabi.h from libcxxrt implicitly includes unwind.h first
++#if defined(HAVE__UNWIND_BACKTRACE) && !defined(_GNU_SOURCE)
++#define _GNU_SOURCE
++#endif
++
+ #if defined(HAVE_DLOPEN) || defined(XP_MACOSX)
+ #include <dlfcn.h>
+ #endif
+@@ -1222,9 +1228,6 @@ NS_StackWalk(NS_WalkStackCallback aCallback, uint32_t aSkipFrames,
+ #elif defined(HAVE__UNWIND_BACKTRACE)
+
+ // libgcc_s.so symbols _Unwind_Backtrace@@GCC_3.3 and _Unwind_GetIP@@GCC_3.0
+-#ifndef _GNU_SOURCE
+-#define _GNU_SOURCE
+-#endif
+ #include <unwind.h>
+
+ struct unwind_info {
diff --git a/www/libxul/files/patch-clang32-libc++-visibility-hack b/www/libxul/files/patch-clang32-libc++-visibility-hack
deleted file mode 100644
index ccada32cbee3..000000000000
--- a/www/libxul/files/patch-clang32-libc++-visibility-hack
+++ /dev/null
@@ -1,38 +0,0 @@
---- configure.in~
-+++ configure.in
-@@ -2855,6 +2855,7 @@ EOF
- #pragma GCC visibility push(hidden)
- #pragma GCC visibility push(default)
- #include <string.h>
-+#include <iterator>
- #pragma GCC visibility pop
-
- __attribute__ ((visibility ("default"))) void Func() {
-@@ -2863,7 +2864,7 @@ __attribute__ ((visibility ("default"))) void Func() {
- }
- EOF
- ac_cv_have_visibility_builtin_bug=no
-- if ! ${CC-cc} ${CFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -O2 -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
-+ if ! ${CXX-c++} ${CXXFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -O2 -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
- ac_cv_have_visibility_builtin_bug=yes
- else
- if test `grep -c "@PLT" conftest.S` = 0; then
---- js/src/configure.in~
-+++ js/src/configure.in
-@@ -2855,6 +2855,7 @@ EOF
- #pragma GCC visibility push(hidden)
- #pragma GCC visibility push(default)
- #include <string.h>
-+#include <iterator>
- #pragma GCC visibility pop
-
- __attribute__ ((visibility ("default"))) void Func() {
-@@ -2863,7 +2864,7 @@ __attribute__ ((visibility ("default"))) void Func() {
- }
- EOF
- ac_cv_have_visibility_builtin_bug=no
-- if ! ${CC-cc} ${CFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -O2 -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
-+ if ! ${CXX-c++} ${CXXFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -O2 -S -o conftest.S conftest.c > /dev/null 2>&1 ; then
- ac_cv_have_visibility_builtin_bug=yes
- else
- if test `grep -c "@PLT" conftest.S` = 0; then
diff --git a/www/libxul/files/patch-clang34-disable-stdcall b/www/libxul/files/patch-clang34-disable-stdcall
new file mode 100644
index 000000000000..8f4bb31b9ccd
--- /dev/null
+++ b/www/libxul/files/patch-clang34-disable-stdcall
@@ -0,0 +1,13 @@
+# http://llvm.org/bugs/show_bug.cgi?id=19007
+
+--- xpcom/base/nscore.h~
++++ xpcom/base/nscore.h
+@@ -110,7 +110,7 @@
+ * NS_HIDDEN_(int) NS_FASTCALL func2(char *foo);
+ */
+
+-#if defined(__i386__) && defined(__GNUC__) && !defined(XP_OS2)
++#if defined(__i386__) && defined(__GNUC__) && !defined(XP_OS2) && !(defined(__clang__) && __clang_major__ == 3 && __clang_minor__ == 4 && __clang_patchlevel__ == 0)
+ #define NS_FASTCALL __attribute__ ((regparm (3), stdcall))
+ #define NS_CONSTRUCTOR_FASTCALL __attribute__ ((regparm (3), stdcall))
+ #elif defined(XP_WIN) && !defined(_WIN64)
diff --git a/www/libxul/files/patch-memory-jemalloc-Makefile.in b/www/libxul/files/patch-memory-jemalloc-Makefile.in
new file mode 100644
index 000000000000..e02b050cbb1d
--- /dev/null
+++ b/www/libxul/files/patch-memory-jemalloc-Makefile.in
@@ -0,0 +1,10 @@
+--- memory/jemalloc/Makefile.in~
++++ memory/jemalloc/Makefile.in
+@@ -12,3 +12,7 @@ include $(topsrcdir)/config/rules.mk
+ ifdef GNU_CC
+ CFLAGS += -std=gnu99
+ endif
++
++# XXX startup crash workaround for gcc47 on amd64
++jemalloc.$(OBJ_SUFFIX): OS_CFLAGS := $(filter-out -O3 -Ofast,$(OS_CFLAGS))
++jemalloc.$(OBJ_SUFFIX): MOZ_OPTIMIZE_FLAGS=
diff --git a/www/libxul/files/patch-z-bug847568 b/www/libxul/files/patch-z-bug847568
new file mode 100644
index 000000000000..14f7e151aa94
--- /dev/null
+++ b/www/libxul/files/patch-z-bug847568
@@ -0,0 +1,234 @@
+# Allow building against system-wide graphite2/harfbuzz.
+
+diff --git config/Makefile.in config/Makefile.in
+index 14bfc0d..5383399 100644
+--- config/Makefile.in
++++ config/Makefile.in
+@@ -77,6 +77,8 @@ export:: $(export-preqs)
+ -DMOZ_NATIVE_LIBEVENT=$(MOZ_NATIVE_LIBEVENT) \
+ -DMOZ_NATIVE_LIBVPX=$(MOZ_NATIVE_LIBVPX) \
+ -DMOZ_NATIVE_ICU=$(MOZ_NATIVE_ICU) \
++ -DMOZ_NATIVE_GRAPHITE2=$(MOZ_NATIVE_GRAPHITE2) \
++ -DMOZ_NATIVE_HARFBUZZ=$(MOZ_NATIVE_HARFBUZZ) \
+ $(srcdir)/system-headers | $(PERL) $(topsrcdir)/nsprpub/config/make-system-wrappers.pl system_wrappers
+ $(INSTALL) system_wrappers $(DIST)
+
+diff --git config/system-headers config/system-headers
+index 126391e..b711fc3 100644
+--- config/system-headers
++++ config/system-headers
+@@ -1144,3 +1144,11 @@ unicode/utypes.h
+ #endif
+ libutil.h
+ unwind.h
++#if MOZ_NATIVE_GRAPHITE2==1
++graphite2/Font.h
++graphite2/Segment.h
++#endif
++#if MOZ_NATIVE_HARFBUZZ==1
++harfbuzz/hb-ot.h
++harfbuzz/hb.h
++#endif
+diff --git configure.in configure.in
+index bbc7b40..1747206 100644
+--- configure.in
++++ configure.in
+@@ -7830,6 +7830,38 @@ if test "$USE_FC_FREETYPE"; then
+ fi
+
+ dnl ========================================================
++dnl Check for graphite2 and harfbuzz
++dnl ========================================================
++
++MOZ_ARG_WITH_BOOL(system-harfbuzz,
++[ --with-system-harfbuzz Use system harfbuzz (located with pkgconfig)],
++MOZ_NATIVE_HARFBUZZ=1,
++MOZ_NATIVE_HARFBUZZ= )
++
++if test -n "$MOZ_NATIVE_HARFBUZZ"; then
++ PKG_CHECK_MODULES(MOZ_HARFBUZZ, harfbuzz >= 0.9.16)
++else
++ MOZ_HARFBUZZ_LIBS='$(DEPTH)/gfx/harfbuzz/src/$(LIB_PREFIX)mozharfbuzz.$(LIB_SUFFIX)'
++fi
++AC_SUBST(MOZ_NATIVE_HARFBUZZ)
++AC_SUBST(MOZ_HARFBUZZ_CFLAGS)
++AC_SUBST(MOZ_HARFBUZZ_LIBS)
++
++MOZ_ARG_WITH_BOOL(system-graphite2,
++[ --with-system-graphite2 Use system graphite2 (located with pkgconfig)],
++MOZ_NATIVE_GRAPHITE2=1,
++MOZ_NATIVE_GRAPHITE2= )
++
++if test -n "$MOZ_NATIVE_GRAPHITE2"; then
++ PKG_CHECK_MODULES(MOZ_GRAPHITE, graphite2 >= 1.2.3)
++else
++ MOZ_GRAPHITE_LIBS='$(DEPTH)/gfx/graphite2/src/$(LIB_PREFIX)mozgraphite2.$(LIB_SUFFIX)'
++fi
++AC_SUBST(MOZ_NATIVE_GRAPHITE2)
++AC_SUBST(MOZ_GRAPHITE_CFLAGS)
++AC_SUBST(MOZ_GRAPHITE_LIBS)
++
++dnl ========================================================
+ dnl Check for pixman and cairo
+ dnl ========================================================
+
+@@ -8379,18 +8412,6 @@ QCMS_LIBS='$(DEPTH)/gfx/qcms/$(LIB_PREFI
+ AC_SUBST(QCMS_LIBS)
+
+ dnl ========================================================
+-dnl HarfBuzz
+-dnl ========================================================
+-MOZ_HARFBUZZ_LIBS='$(DEPTH)/gfx/harfbuzz/src/$(LIB_PREFIX)mozharfbuzz.$(LIB_SUFFIX)'
+-AC_SUBST(MOZ_HARFBUZZ_LIBS)
+-
+-dnl ========================================================
+-dnl SIL Graphite
+-dnl ========================================================
+-MOZ_GRAPHITE_LIBS='$(DEPTH)/gfx/graphite2/src/$(LIB_PREFIX)mozgraphite2.$(LIB_SUFFIX)'
+-AC_SUBST(MOZ_GRAPHITE_LIBS)
+-
+-dnl ========================================================
+ dnl OTS
+ dnl ========================================================
+ MOZ_OTS_LIBS='$(DEPTH)/gfx/ots/src/$(LIB_PREFIX)mozots.$(LIB_SUFFIX)'
+diff --git content/base/src/Makefile.in content/base/src/Makefile.in
+index a618096..596901a 100644
+--- content/base/src/Makefile.in
++++ content/base/src/Makefile.in
+@@ -5,6 +5,10 @@
+
+ include $(topsrcdir)/config/rules.mk
+
++ifdef MOZ_NATIVE_HARFBUZZ
++nsContentUtils.$(OBJ_SUFFIX): CXXFLAGS+=$(MOZ_HARFBUZZ_CFLAGS)
++endif
++
+ # gcc requires -msse2 for this file since it uses SSE2 intrinsics. (See bug
+ # 585538 comment 12.)
+ ifneq (,$(INTEL_ARCHITECTURE))
+diff --git gfx/moz.build gfx/moz.build
+index 519aa46..6929751 100644
+--- gfx/moz.build
++++ gfx/moz.build
+@@ -7,6 +7,12 @@
+ if CONFIG['MOZ_TREE_CAIRO']:
+ DIRS += ['cairo']
+
++if not CONFIG['MOZ_NATIVE_GRAPHITE2']:
++ DIRS += ['graphite2/src' ]
++
++if not CONFIG['MOZ_NATIVE_HARFBUZZ']:
++ DIRS += ['harfbuzz/src']
++
+ DIRS += [
+ '2d',
+ 'ycbcr',
+@@ -15,8 +21,6 @@ DIRS += [
+ 'qcms',
+ 'gl',
+ 'layers',
+- 'graphite2/src',
+- 'harfbuzz/src',
+ 'ots/src',
+ 'thebes',
+ 'ipc',
+diff --git gfx/skia/Makefile.in gfx/skia/Makefile.in
+index 07a77a3..067f7bd 100644
+--- gfx/skia/Makefile.in
++++ gfx/skia/Makefile.in
+@@ -15,6 +15,10 @@ ifeq (qt,$(MOZ_WIDGET_TOOLKIT))
+ OS_CXXFLAGS += $(MOZ_CAIRO_CFLAGS) $(MOZ_PANGO_CFLAGS) $(CAIRO_FT_CFLAGS)
+ endif
+
++ifdef MOZ_NATIVE_HARFBUZZ
++OS_CXXFLAGS += $(MOZ_HARFBUZZ_CFLAGS)
++endif
++
+ include $(topsrcdir)/config/rules.mk
+
+ ifneq (,$(INTEL_ARCHITECTURE))
+diff --git gfx/thebes/Makefile.in gfx/thebes/Makefile.in
+index e9f6b6c..0df2d8d 100644
+--- gfx/thebes/Makefile.in
++++ gfx/thebes/Makefile.in
+@@ -13,6 +13,14 @@ DEFINES := $(filter-out -DUNICODE,$(DEFINES))
+ CXXFLAGS += $(MOZ_CAIRO_CFLAGS) $(TK_CFLAGS)
+ CFLAGS += $(MOZ_CAIRO_CFLAGS) $(TK_CFLAGS)
+
++ifdef MOZ_NATIVE_GRAPHITE2
++CXXFLAGS += $(MOZ_GRAPHITE_CFLAGS)
++endif
++
++ifdef MOZ_NATIVE_HARFBUZZ
++CXXFLAGS += $(MOZ_HARFBUZZ_CFLAGS)
++endif
++
+ ifeq ($(MOZ_WIDGET_TOOLKIT),android)
+ CXXFLAGS += $(CAIRO_FT_CFLAGS)
+ endif
+diff --git intl/unicharutil/util/Makefile.in intl/unicharutil/util/Makefile.in
+index f6b9f7c..11c44f4 100644
+--- intl/unicharutil/util/Makefile.in
++++ intl/unicharutil/util/Makefile.in
+@@ -21,3 +21,7 @@ ifdef _MSC_VER
+ OS_COMPILE_CXXFLAGS += -Zl
+ OS_COMPILE_CFLAGS += -Zl
+ endif
++
++ifdef MOZ_NATIVE_HARFBUZZ
++nsUnicodePropertyData.$(OBJ_SUFFIX): CXXFLAGS+=$(MOZ_HARFBUZZ_CFLAGS)
++endif
+diff --git layout/media/Makefile.in layout/media/Makefile.in
+index 1cacbd7..a8cd156 100644
+--- layout/media/Makefile.in
++++ layout/media/Makefile.in
+@@ -18,10 +18,16 @@ endif
+ SHARED_LIBRARY_LIBS = \
+ $(MOZ_OTS_LIBS) \
+ $(QCMS_LIBS) \
+- $(MOZ_GRAPHITE_LIBS) \
+- $(MOZ_HARFBUZZ_LIBS) \
+ $(NULL)
+
++ifndef MOZ_NATIVE_GRAPHITE2
++SHARED_LIBRARY_LIBS += $(MOZ_GRAPHITE_LIBS)
++endif
++
++ifndef MOZ_NATIVE_HARFBUZZ
++SHARED_LIBRARY_LIBS += $(MOZ_HARFBUZZ_LIBS)
++endif
++
+ ifdef MOZ_TREE_CAIRO
+ SHARED_LIBRARY_LIBS += $(MOZ_CAIRO_LIBS)
+ endif
+diff --git netwerk/dns/Makefile.in netwerk/dns/Makefile.in
+index 1cacbd7..a8cd156 100644
+--- netwerk/dns/Makefile.in
++++ netwerk/dns/Makefile.in
+@@ -9,3 +9,7 @@ include $(topsrcdir)/config/rules.mk
+ # for effective TLD data.
+ etld_data.inc: $(srcdir)/prepare_tlds.py $(srcdir)/effective_tld_names.dat
+ $(PYTHON) $(srcdir)/prepare_tlds.py $(srcdir)/effective_tld_names.dat > etld_data.inc
++
++ifdef MOZ_NATIVE_HARFBUZZ
++nsIDNService.$(OBJ_SUFFIX): CXXFLAGS+=$(MOZ_HARFBUZZ_CFLAGS)
++endif
+diff --git toolkit/library/Makefile.in toolkit/library/Makefile.in
+index 007f272..27f488e 100644
+--- toolkit/library/Makefile.in
++++ toolkit/library/Makefile.in
+@@ -103,6 +103,14 @@ ifndef MOZ_TREE_PIXMAN
+ EXTRA_DSO_LDOPTS += $(MOZ_PIXMAN_LIBS)
+ endif
+
++ifdef MOZ_NATIVE_GRAPHITE2
++EXTRA_DSO_LDOPTS += $(MOZ_GRAPHITE_LIBS)
++endif
++
++ifdef MOZ_NATIVE_HARFBUZZ
++EXTRA_DSO_LDOPTS += $(MOZ_HARFBUZZ_LIBS)
++endif
++
+ ifdef MOZ_DMD
+ EXTRA_DSO_LDOPTS += $(call EXPAND_LIBNAME_PATH,dmd,$(DIST)/lib)
+ endif
diff --git a/www/libxul/files/patch-zz-bug517422 b/www/libxul/files/patch-zz-bug517422
new file mode 100644
index 000000000000..85db66a2acdc
--- /dev/null
+++ b/www/libxul/files/patch-zz-bug517422
@@ -0,0 +1,324 @@
+# Allow building against system-wide ogg/vorbis/opus.
+
+diff --git config/Makefile.in config/Makefile.in
+index 5383399..4393ae8 100644
+--- config/Makefile.in
++++ config/Makefile.in
+@@ -79,6 +79,9 @@ export:: $(export-preqs)
+ -DMOZ_NATIVE_ICU=$(MOZ_NATIVE_ICU) \
+ -DMOZ_NATIVE_GRAPHITE2=$(MOZ_NATIVE_GRAPHITE2) \
+ -DMOZ_NATIVE_HARFBUZZ=$(MOZ_NATIVE_HARFBUZZ) \
++ -DMOZ_NATIVE_OGG=$(MOZ_NATIVE_OGG) \
++ -DMOZ_NATIVE_VORBIS=$(MOZ_NATIVE_VORBIS) \
++ -DMOZ_NATIVE_OPUS=$(MOZ_NATIVE_OPUS) \
+ $(srcdir)/system-headers | $(PERL) $(topsrcdir)/nsprpub/config/make-system-wrappers.pl system_wrappers
+ $(INSTALL) system_wrappers $(DIST)
+
+diff --git toolkit/toolkit.mozbuild toolkit/toolkit.mozbuild
+index c22a36c..2febb45 100644
+--- toolkit/toolkit.mozbuild
++++ toolkit/toolkit.mozbuild
+@@ -64,13 +64,13 @@ add_tier_dir('platform', 'rdf')
+ if CONFIG['MOZ_JSDEBUGGER']:
+ add_tier_dir('platform', 'js/jsd')
+
+-if CONFIG['MOZ_VORBIS']:
++if CONFIG['MOZ_VORBIS'] and not CONFIG['MOZ_NATIVE_VORBIS']:
+ add_tier_dir('platform', 'media/libvorbis')
+
+ if CONFIG['MOZ_TREMOR']:
+ add_tier_dir('platform', 'media/libtremor')
+
+-if CONFIG['MOZ_OPUS']:
++if CONFIG['MOZ_OPUS'] and not CONFIG['MOZ_NATIVE_OPUS']:
+ add_tier_dir('platform', 'media/libopus')
+
+ if CONFIG['MOZ_WEBM']:
+@@ -82,7 +82,9 @@ if CONFIG['MOZ_VP8'] and not CONFIG['MOZ
+ add_tier_dir('platform', 'media/libvpx')
+
+ if CONFIG['MOZ_OGG']:
+- add_tier_dir('platform', ['media/libogg', 'media/libtheora'])
++ if not CONFIG['MOZ_NATIVE_OGG']:
++ add_tier_dir('platform', 'media/libogg')
++ add_tier_dir('platform', 'media/libtheora')
+
+ if CONFIG['MOZ_WEBRTC']:
+ add_tier_dir('platform', [
+diff --git config/system-headers config/system-headers
+index b711fc3..fd3c14f 100644
+--- config/system-headers
++++ config/system-headers
+@@ -1152,3 +1152,17 @@ graphite2/Segment.h
+ harfbuzz/hb-ot.h
+ harfbuzz/hb.h
+ #endif
++#if MOZ_NATIVE_OGG==1
++ogg/ogg.h
++ogg/os_types.h
++#endif
++#if MOZ_NATIVE_VORBIS==1
++vorbis/codec.h
++vorbis/vorbisenc.h
++#endif
++#if MOZ_NATIVE_OPUS==1
++opus.h
++opus_multistream.h
++opus/opus.h
++opus/opus_multistream.h
++#endif
+diff --git configure.in configure.in
+index df49287..05e97ff 100644
+--- configure.in
++++ configure.in
+@@ -5143,6 +5143,40 @@ if test -n "$MOZ_OGG"; then
+ fi
+
+ dnl ========================================================
++dnl Check for libogg
++dnl ========================================================
++
++MOZ_ARG_WITH_BOOL(system-ogg,
++[ --with-system-ogg Use system libogg (located with pkgconfig)],
++MOZ_NATIVE_OGG=1,
++MOZ_NATIVE_OGG= )
++
++if test -n "$MOZ_NATIVE_OGG"; then
++ PKG_CHECK_MODULES(MOZ_OGG, ogg >= 1.2.1)
++fi
++
++AC_SUBST(MOZ_NATIVE_OGG)
++AC_SUBST(MOZ_OGG_CFLAGS)
++AC_SUBST(MOZ_OGG_LIBS)
++
++dnl ========================================================
++dnl Check for libvorbis
++dnl ========================================================
++
++MOZ_ARG_WITH_BOOL(system-vorbis,
++[ --with-system-vorbis Use system libvorbis (located with pkgconfig)],
++MOZ_NATIVE_VORBIS=1,
++MOZ_NATIVE_VORBIS= )
++
++if test -n "$MOZ_NATIVE_VORBIS"; then
++ PKG_CHECK_MODULES(MOZ_VORBIS, vorbis vorbisenc >= 1.3.4)
++fi
++
++AC_SUBST(MOZ_NATIVE_VORBIS)
++AC_SUBST(MOZ_VORBIS_CFLAGS)
++AC_SUBST(MOZ_VORBIS_LIBS)
++
++dnl ========================================================
+ dnl = Disable Opus audio codec support
+ dnl ========================================================
+ MOZ_ARG_DISABLE_BOOL(opus,
+@@ -5151,6 +5185,25 @@ MOZ_ARG_DISABLE_BOOL(opus,
+ MOZ_OPUS=1)
+
+ dnl ========================================================
++dnl Check for libopus
++dnl ========================================================
++
++MOZ_ARG_WITH_BOOL(system-opus,
++[ --with-system-opus Use system libopus (located with pkgconfig)],
++MOZ_NATIVE_OPUS=1,
++MOZ_NATIVE_OPUS= )
++
++if test -n "$MOZ_NATIVE_OPUS"; then
++ PKG_CHECK_MODULES(MOZ_OPUS, opus >= 1.1)
++else
++ MOZ_OPUS_CFLAGS='-I$(topsrcdir)/media/libopus/include'
++fi
++
++AC_SUBST(MOZ_NATIVE_OPUS)
++AC_SUBST(MOZ_OPUS_CFLAGS)
++AC_SUBST(MOZ_OPUS_LIBS)
++
++dnl ========================================================
+ dnl = Disable VP8 decoder support
+ dnl ========================================================
+ MOZ_ARG_DISABLE_BOOL(webm,
+diff --git content/media/Makefile.in content/media/Makefile.in
+index 68f360e..76f2d57 100644
+--- content/media/Makefile.in
++++ content/media/Makefile.in
+@@ -7,4 +7,16 @@ include $(topsrcdir)/config/rules.mk
+ CFLAGS += $(GSTREAMER_CFLAGS)
+ CXXFLAGS += $(GSTREAMER_CFLAGS)
+
++ifdef MOZ_NATIVE_OGG
++CXXFLAGS += $(MOZ_OGG_CFLAGS)
++endif
++
++ifdef MOZ_NATIVE_VORBIS
++CXXFLAGS += $(MOZ_VORBIS_CFLAGS)
++endif
++
++ifdef MOZ_NATIVE_OPUS
++CXXFLAGS += $(MOZ_OPUS_CFLAGS)
++endif
++
+ AudioNodeEngineNEON.$(OBJ_SUFFIX): CXXFLAGS += -mfpu=neon
+diff --git layout/media/Makefile.in layout/media/Makefile.in
+index 1cacbd7..a8cd156 100644
+--- layout/media/Makefile.in
++++ layout/media/Makefile.in
+@@ -30,12 +36,21 @@ ifdef MOZ_TREE_PIXMAN
+ SHARED_LIBRARY_LIBS += $(MOZ_PIXMAN_LIBS)
+ endif
+
++ifdef MOZ_OGG
++ifndef MOZ_NATIVE_OGG
++SHARED_LIBRARY_LIBS += \
++ $(DEPTH)/media/libogg/src/$(LIB_PREFIX)ogg.$(LIB_SUFFIX) \
++ $(NULL)
++endif
++endif
++
+ ifdef MOZ_VORBIS
++ifndef MOZ_NATIVE_VORBIS
+ SHARED_LIBRARY_LIBS += \
+ $(DEPTH)/media/libvorbis/lib/$(LIB_PREFIX)vorbis.$(LIB_SUFFIX) \
+- $(DEPTH)/media/libogg/src/$(LIB_PREFIX)ogg.$(LIB_SUFFIX) \
+ $(NULL)
+ endif
++endif
+
+ ifdef MOZ_TREMOR
+ SHARED_LIBRARY_LIBS += \
+@@ -51,10 +66,12 @@ SHARED_LIBRARY_LIBS += \
+ endif
+
+ ifdef MOZ_OPUS
++ifndef MOZ_NATIVE_OPUS
+ SHARED_LIBRARY_LIBS += \
+ $(DEPTH)/media/libopus/$(LIB_PREFIX)opus.$(LIB_SUFFIX) \
+ $(NULL)
+ endif
++endif
+
+ ifdef MOZ_WEBM
+ SHARED_LIBRARY_LIBS += \
+diff --git media/libtheora/Makefile.in media/libtheora/Makefile.in
+new file mode 100644
+index 0000000..1f02dc0
+--- /dev/null
++++ media/libtheora/Makefile.in
+@@ -0,0 +1,16 @@
++# This Source Code Form is subject to the terms of the Mozilla Public
++# License, v. 2.0. If a copy of the MPL was not distributed with this
++# file, You can obtain one at http://mozilla.org/MPL/2.0/.
++
++DEPTH = @DEPTH@
++topsrcdir = @top_srcdir@
++srcdir = @srcdir@
++VPATH = @srcdir@
++
++include $(DEPTH)/config/autoconf.mk
++
++include $(topsrcdir)/config/rules.mk
++
++ifdef MOZ_NATIVE_OGG
++CFLAGS += $(MOZ_OGG_CFLAGS)
++endif
+diff --git media/libtremor/Makefile.in media/libtremor/Makefile.in
+new file mode 100644
+index 0000000..1f02dc0
+--- /dev/null
++++ media/libtremor/Makefile.in
+@@ -0,0 +1,16 @@
++# This Source Code Form is subject to the terms of the Mozilla Public
++# License, v. 2.0. If a copy of the MPL was not distributed with this
++# file, You can obtain one at http://mozilla.org/MPL/2.0/.
++
++DEPTH = @DEPTH@
++topsrcdir = @top_srcdir@
++srcdir = @srcdir@
++VPATH = @srcdir@
++
++include $(DEPTH)/config/autoconf.mk
++
++include $(topsrcdir)/config/rules.mk
++
++ifdef MOZ_NATIVE_OGG
++CFLAGS += $(MOZ_OGG_CFLAGS)
++endif
+diff --git media/libvorbis/Makefile.in media/libvorbis/Makefile.in
+new file mode 100644
+index 0000000..1f02dc0
+--- /dev/null
++++ media/libvorbis/Makefile.in
+@@ -0,0 +1,16 @@
++# This Source Code Form is subject to the terms of the Mozilla Public
++# License, v. 2.0. If a copy of the MPL was not distributed with this
++# file, You can obtain one at http://mozilla.org/MPL/2.0/.
++
++DEPTH = @DEPTH@
++topsrcdir = @top_srcdir@
++srcdir = @srcdir@
++VPATH = @srcdir@
++
++include $(DEPTH)/config/autoconf.mk
++
++include $(topsrcdir)/config/rules.mk
++
++ifdef MOZ_NATIVE_OGG
++CFLAGS += $(MOZ_OGG_CFLAGS)
++endif
+diff --git media/webrtc/signaling/test/Makefile.in media/webrtc/signaling/test/Makefile.in
+index c5e82c4..91ef86a 100644
+--- media/webrtc/signaling/test/Makefile.in
++++ media/webrtc/signaling/test/Makefile.in
+@@ -48,6 +48,12 @@ LIBS += \
+ $(NULL)
+ endif
+
++ifdef MOZ_NATIVE_OPUS
++LIBS += \
++ $(MOZ_OPUS_LIBS) \
++ $(NULL)
++endif
++
+ ifdef MOZ_NATIVE_LIBVPX
+ LIBS += \
+ $(MOZ_LIBVPX_LIBS) \
+diff --git media/webrtc/trunk/webrtc/modules/audio_coding/codecs/opus/opus.gypi media/webrtc/trunk/webrtc/modules/audio_coding/codecs/opus/opus.gypi
+index 00e77e7..55f48ab 100644
+--- media/webrtc/trunk/webrtc/modules/audio_coding/codecs/opus/opus.gypi
++++ media/webrtc/trunk/webrtc/modules/audio_coding/codecs/opus/opus.gypi
+@@ -14,9 +14,9 @@
+ 'conditions': [
+ ['build_with_mozilla==1', {
+ # Mozilla provides its own build of the opus library.
+- 'include_dirs': [
+- '$(DIST)/include/opus',
+- ]
++ 'cflags_mozilla': [
++ '$(MOZ_OPUS_CFLAGS)',
++ ],
+ }, {
+ 'dependencies': [
+ '<(DEPTH)/third_party/opus/opus.gyp:opus'
+diff --git toolkit/library/Makefile.in toolkit/library/Makefile.in
+index 27f488e..cd27084 100644
+--- toolkit/library/Makefile.in
++++ toolkit/library/Makefile.in
+@@ -91,6 +91,18 @@ ifdef MOZ_NATIVE_HUNSPELL
+ EXTRA_DSO_LDOPTS += $(MOZ_HUNSPELL_LIBS)
+ endif
+
++ifdef MOZ_NATIVE_OGG
++EXTRA_DSO_LDOPTS += $(MOZ_OGG_LIBS)
++endif
++
++ifdef MOZ_NATIVE_VORBIS
++EXTRA_DSO_LDOPTS += $(MOZ_VORBIS_LIBS)
++endif
++
++ifdef MOZ_NATIVE_OPUS
++EXTRA_DSO_LDOPTS += $(MOZ_OPUS_LIBS)
++endif
++
+ ifdef MOZ_NATIVE_LIBEVENT
+ EXTRA_DSO_LDOPTS += $(MOZ_LIBEVENT_LIBS)
+ endif
diff --git a/www/linux-firefox/Makefile b/www/linux-firefox/Makefile
index 7255fcadcdfb..fb605a40cc59 100644
--- a/www/linux-firefox/Makefile
+++ b/www/linux-firefox/Makefile
@@ -2,7 +2,7 @@
# $FreeBSD$
PORTNAME= firefox
-DISTVERSION= 27.0.1
+DISTVERSION= 28.0
PORTEPOCH= 1
CATEGORIES= www ipv6
MASTER_SITES= MOZILLA/${PORTNAME}/releases/${DISTVERSION}/linux-i686/en-US
diff --git a/www/linux-firefox/distinfo b/www/linux-firefox/distinfo
index ceced656f6f5..d66bbcbde0b2 100644
--- a/www/linux-firefox/distinfo
+++ b/www/linux-firefox/distinfo
@@ -1,5 +1,5 @@
-SHA256 (firefox-27.0.1.tar.bz2) = c6734cf5cfaad395970d88c3c8f91ec633cd9301cf19620e70238c31443a0910
-SIZE (firefox-27.0.1.tar.bz2) = 30617660
+SHA256 (firefox-28.0.tar.bz2) = 10bc55b70e0e298ceb3613431c5a6cf36aaf1e6ace1a43616e452a7b232e7d38
+SIZE (firefox-28.0.tar.bz2) = 31203078
SHA256 (glib2-2.22.2-2.fc12.i686.rpm) = e3b459c245ec14e7248e9de4b506963a4773407f3e58835db5070d0ed02ecc99
SIZE (glib2-2.22.2-2.fc12.i686.rpm) = 1162908
SHA256 (gtk2-2.18.3-19.fc12.i686.rpm) = aea9cf7ffe9c8dae0faa2bf3d2aa1b2117c55dce03da72dcce8c268279ec0a4b