firefox 101.0-1 (znver1;x86_64;aarch64) 2022-15040
9999

Status published
Submitter cris [@T] beebames.com
Platform rolling
Repository main
URL https://abf.openmandriva.org/build_lists/210210
Packages
firefox-101.0-1.znver1.binary
firefox-101.0-1.znver1.source
firefox-af-101.0-1.znver1.binary
firefox-ar-101.0-1.znver1.binary
firefox-ast-101.0-1.znver1.binary
firefox-bg-101.0-1.znver1.binary
firefox-bn-101.0-1.znver1.binary
firefox-br-101.0-1.znver1.binary
firefox-bs-101.0-1.znver1.binary
firefox-ca-101.0-1.znver1.binary
firefox-cs-101.0-1.znver1.binary
firefox-cy-101.0-1.znver1.binary
firefox-da-101.0-1.znver1.binary
firefox-de-101.0-1.znver1.binary
firefox-debuginfo-101.0-1.znver1.debuginfo
firefox-debugsource-101.0-1.znver1.binary
firefox-devel-101.0-1.znver1.binary
firefox-el-101.0-1.znver1.binary
firefox-en_GB-101.0-1.znver1.binary
firefox-eo-101.0-1.znver1.binary
firefox-es_AR-101.0-1.znver1.binary
firefox-es_CL-101.0-1.znver1.binary
firefox-es_ES-101.0-1.znver1.binary
firefox-es_MX-101.0-1.znver1.binary
firefox-et-101.0-1.znver1.binary
firefox-eu-101.0-1.znver1.binary
firefox-fa-101.0-1.znver1.binary
firefox-fi-101.0-1.znver1.binary
firefox-fr-101.0-1.znver1.binary
firefox-fy-101.0-1.znver1.binary
firefox-ga_IE-101.0-1.znver1.binary
firefox-gd-101.0-1.znver1.binary
firefox-gl-101.0-1.znver1.binary
firefox-gu_IN-101.0-1.znver1.binary
firefox-he-101.0-1.znver1.binary
firefox-hi-101.0-1.znver1.binary
firefox-hr-101.0-1.znver1.binary
firefox-hu-101.0-1.znver1.binary
firefox-hy-101.0-1.znver1.binary
firefox-id-101.0-1.znver1.binary
firefox-is-101.0-1.znver1.binary
firefox-it-101.0-1.znver1.binary
firefox-ja-101.0-1.znver1.binary
firefox-kk-101.0-1.znver1.binary
firefox-km-101.0-1.znver1.binary
firefox-kn-101.0-1.znver1.binary
firefox-ko-101.0-1.znver1.binary
firefox-lt-101.0-1.znver1.binary
firefox-lv-101.0-1.znver1.binary
firefox-mk-101.0-1.znver1.binary
firefox-mr-101.0-1.znver1.binary
firefox-nb_NO-101.0-1.znver1.binary
firefox-nl-101.0-1.znver1.binary
firefox-nn_NO-101.0-1.znver1.binary
firefox-pa_IN-101.0-1.znver1.binary
firefox-pl-101.0-1.znver1.binary
firefox-pt_BR-101.0-1.znver1.binary
firefox-pt_PT-101.0-1.znver1.binary
firefox-ro-101.0-1.znver1.binary
firefox-ru-101.0-1.znver1.binary
firefox-si-101.0-1.znver1.binary
firefox-sk-101.0-1.znver1.binary
firefox-sl-101.0-1.znver1.binary
firefox-sq-101.0-1.znver1.binary
firefox-sr-101.0-1.znver1.binary
firefox-sv_SE-101.0-1.znver1.binary
firefox-ta-101.0-1.znver1.binary
firefox-te-101.0-1.znver1.binary
firefox-th-101.0-1.znver1.binary
firefox-tr-101.0-1.znver1.binary
firefox-uk-101.0-1.znver1.binary
firefox-vi-101.0-1.znver1.binary
firefox-zh_CN-101.0-1.znver1.binary
firefox-zh_TW-101.0-1.znver1.binary
firefox-101.0-1.x86_64.binary
firefox-101.0-1.x86_64.source
firefox-af-101.0-1.x86_64.binary
firefox-ar-101.0-1.x86_64.binary
firefox-ast-101.0-1.x86_64.binary
firefox-bg-101.0-1.x86_64.binary
firefox-bn-101.0-1.x86_64.binary
firefox-br-101.0-1.x86_64.binary
firefox-bs-101.0-1.x86_64.binary
firefox-ca-101.0-1.x86_64.binary
firefox-cs-101.0-1.x86_64.binary
firefox-cy-101.0-1.x86_64.binary
firefox-da-101.0-1.x86_64.binary
firefox-de-101.0-1.x86_64.binary
firefox-debuginfo-101.0-1.x86_64.debuginfo
firefox-debugsource-101.0-1.x86_64.binary
firefox-devel-101.0-1.x86_64.binary
firefox-el-101.0-1.x86_64.binary
firefox-en_GB-101.0-1.x86_64.binary
firefox-eo-101.0-1.x86_64.binary
firefox-es_AR-101.0-1.x86_64.binary
firefox-es_CL-101.0-1.x86_64.binary
firefox-es_ES-101.0-1.x86_64.binary
firefox-es_MX-101.0-1.x86_64.binary
firefox-et-101.0-1.x86_64.binary
firefox-eu-101.0-1.x86_64.binary
firefox-fa-101.0-1.x86_64.binary
firefox-fi-101.0-1.x86_64.binary
firefox-fr-101.0-1.x86_64.binary
firefox-fy-101.0-1.x86_64.binary
firefox-ga_IE-101.0-1.x86_64.binary
firefox-gd-101.0-1.x86_64.binary
firefox-gl-101.0-1.x86_64.binary
firefox-gu_IN-101.0-1.x86_64.binary
firefox-he-101.0-1.x86_64.binary
firefox-hi-101.0-1.x86_64.binary
firefox-hr-101.0-1.x86_64.binary
firefox-hu-101.0-1.x86_64.binary
firefox-hy-101.0-1.x86_64.binary
firefox-id-101.0-1.x86_64.binary
firefox-is-101.0-1.x86_64.binary
firefox-it-101.0-1.x86_64.binary
firefox-ja-101.0-1.x86_64.binary
firefox-kk-101.0-1.x86_64.binary
firefox-km-101.0-1.x86_64.binary
firefox-kn-101.0-1.x86_64.binary
firefox-ko-101.0-1.x86_64.binary
firefox-lt-101.0-1.x86_64.binary
firefox-lv-101.0-1.x86_64.binary
firefox-mk-101.0-1.x86_64.binary
firefox-mr-101.0-1.x86_64.binary
firefox-nb_NO-101.0-1.x86_64.binary
firefox-nl-101.0-1.x86_64.binary
firefox-nn_NO-101.0-1.x86_64.binary
firefox-pa_IN-101.0-1.x86_64.binary
firefox-pl-101.0-1.x86_64.binary
firefox-pt_BR-101.0-1.x86_64.binary
firefox-pt_PT-101.0-1.x86_64.binary
firefox-ro-101.0-1.x86_64.binary
firefox-ru-101.0-1.x86_64.binary
firefox-si-101.0-1.x86_64.binary
firefox-sk-101.0-1.x86_64.binary
firefox-sl-101.0-1.x86_64.binary
firefox-sq-101.0-1.x86_64.binary
firefox-sr-101.0-1.x86_64.binary
firefox-sv_SE-101.0-1.x86_64.binary
firefox-ta-101.0-1.x86_64.binary
firefox-te-101.0-1.x86_64.binary
firefox-th-101.0-1.x86_64.binary
firefox-tr-101.0-1.x86_64.binary
firefox-uk-101.0-1.x86_64.binary
firefox-vi-101.0-1.x86_64.binary
firefox-zh_CN-101.0-1.x86_64.binary
firefox-zh_TW-101.0-1.x86_64.binary
firefox-101.0-1.aarch64.binary
firefox-101.0-1.aarch64.source
firefox-af-101.0-1.aarch64.binary
firefox-ar-101.0-1.aarch64.binary
firefox-ast-101.0-1.aarch64.binary
firefox-bg-101.0-1.aarch64.binary
firefox-bn-101.0-1.aarch64.binary
firefox-br-101.0-1.aarch64.binary
firefox-bs-101.0-1.aarch64.binary
firefox-ca-101.0-1.aarch64.binary
firefox-cs-101.0-1.aarch64.binary
firefox-cy-101.0-1.aarch64.binary
firefox-da-101.0-1.aarch64.binary
firefox-de-101.0-1.aarch64.binary
firefox-debuginfo-101.0-1.aarch64.debuginfo
firefox-debugsource-101.0-1.aarch64.binary
firefox-devel-101.0-1.aarch64.binary
firefox-el-101.0-1.aarch64.binary
firefox-en_GB-101.0-1.aarch64.binary
firefox-eo-101.0-1.aarch64.binary
firefox-es_AR-101.0-1.aarch64.binary
firefox-es_CL-101.0-1.aarch64.binary
firefox-es_ES-101.0-1.aarch64.binary
firefox-es_MX-101.0-1.aarch64.binary
firefox-et-101.0-1.aarch64.binary
firefox-eu-101.0-1.aarch64.binary
firefox-fa-101.0-1.aarch64.binary
firefox-fi-101.0-1.aarch64.binary
firefox-fr-101.0-1.aarch64.binary
firefox-fy-101.0-1.aarch64.binary
firefox-ga_IE-101.0-1.aarch64.binary
firefox-gd-101.0-1.aarch64.binary
firefox-gl-101.0-1.aarch64.binary
firefox-gu_IN-101.0-1.aarch64.binary
firefox-he-101.0-1.aarch64.binary
firefox-hi-101.0-1.aarch64.binary
firefox-hr-101.0-1.aarch64.binary
firefox-hu-101.0-1.aarch64.binary
firefox-hy-101.0-1.aarch64.binary
firefox-id-101.0-1.aarch64.binary
firefox-is-101.0-1.aarch64.binary
firefox-it-101.0-1.aarch64.binary
firefox-ja-101.0-1.aarch64.binary
firefox-kk-101.0-1.aarch64.binary
firefox-km-101.0-1.aarch64.binary
firefox-kn-101.0-1.aarch64.binary
firefox-ko-101.0-1.aarch64.binary
firefox-lt-101.0-1.aarch64.binary
firefox-lv-101.0-1.aarch64.binary
firefox-mk-101.0-1.aarch64.binary
firefox-mr-101.0-1.aarch64.binary
firefox-nb_NO-101.0-1.aarch64.binary
firefox-nl-101.0-1.aarch64.binary
firefox-nn_NO-101.0-1.aarch64.binary
firefox-pa_IN-101.0-1.aarch64.binary
firefox-pl-101.0-1.aarch64.binary
firefox-pt_BR-101.0-1.aarch64.binary
firefox-pt_PT-101.0-1.aarch64.binary
firefox-ro-101.0-1.aarch64.binary
firefox-ru-101.0-1.aarch64.binary
firefox-si-101.0-1.aarch64.binary
firefox-sk-101.0-1.aarch64.binary
firefox-sl-101.0-1.aarch64.binary
firefox-sq-101.0-1.aarch64.binary
firefox-sr-101.0-1.aarch64.binary
firefox-sv_SE-101.0-1.aarch64.binary
firefox-ta-101.0-1.aarch64.binary
firefox-te-101.0-1.aarch64.binary
firefox-th-101.0-1.aarch64.binary
firefox-tr-101.0-1.aarch64.binary
firefox-uk-101.0-1.aarch64.binary
firefox-vi-101.0-1.aarch64.binary
firefox-zh_CN-101.0-1.aarch64.binary
firefox-zh_TW-101.0-1.aarch64.binary
Build Date 2022-06-01 14:04:28 +0000 UTC
Last Updated 2022-06-03 21:39:48.121336647 +0000 UTC
$ git diff --patch-with-stat --summary 25113c132ab00b3dfe0d8bc9500d4408ab9c9fd2..62b11b9c87be120b8e40a7562d0b30c6bfbf8d0b

 .abf.yml                                         |  141 +-
 firefox-93.0-kde.patch => firefox-99.0-kde.patch |   16 +-
 firefox.spec                                     |   43 +-
 mozilla-94.0-kde.patch                           | 1489 ----------------------
 mozilla-93.0-kde.patch => mozilla-99.0-kde.patch |   78 +-
 5 files changed, 146 insertions(+), 1621 deletions(-)
 rename firefox-93.0-kde.patch => firefox-99.0-kde.patch (96%)
 delete mode 100644 mozilla-94.0-kde.patch
 rename mozilla-93.0-kde.patch => mozilla-99.0-kde.patch (97%)

diff --git a/.abf.yml b/.abf.yml
index e3f732c..8a802db 100644
--- a/.abf.yml
+++ b/.abf.yml
@@ -1,72 +1,73 @@
 sources:
-  af.xpi: 3f2786a95a9f69b42f83c85485bc4a9ec4016591
-  ar.xpi: d9c32aa96a884674af80baebecace8d74d21d7d0
-  ast.xpi: 9a1c4ae79254cb985ecadc397dae729cdfb4c275
+  af.xpi: 71b441b23061bd3ab4d03e6f5bcf12d299cc458f
+  ar.xpi: d4f3855b10851140d9f715e3e80639df989fdca3
+  ast.xpi: 10de2eb94da86fc35d1c46ce5cac51ac2810b93c
   be.xpi: d2ca74c120a8e42c40c5e5f1d193ee73b1dee572
-  bg.xpi: e0bec96cc7f4768cb808b85056b877f5d63f3b27
-  bn.xpi: f2e41dc9baeda4fc7cdcb71a4735e8a7b5cf5834
-  br.xpi: 7ada0324aa236f5c17ac1924ae7b10c8bf89b35d
-  bs.xpi: e4c4443334e9ae14460f1fe4314f0f66b3805d62
-  ca.xpi: c96d3086cce13eddf0a8fc885c39922fa4718bd6
-  cs.xpi: 3ac58986726110405af4a07cbd87ee91b6669afe
-  cy.xpi: 85d7ccfe0c9b2bbeb092978f2131ad30f59ccab9
-  da.xpi: 86a7f017c1121190509eaba4963c4716e2423c9d
-  de.xpi: 82c381c062e8f4941e33d27cb899ff9de9a2b66d
-  el.xpi: f3a8d490cc04925ad2223f354eb157400b616dcf
-  en-GB.xpi: bcdf820f0d76f1d4b860a4c0ef0953ae39c88d45
-  eo.xpi: 2097d6cfca71717d11cd4baf752cf47de4e7fdca
-  es-AR.xpi: 8ef36a8589997534c403bc883c07f154e84fdd1f
-  es-CL.xpi: 0cde1131d37d807852d1cb4d3c8ad2247d6c6021
-  es-ES.xpi: afa2a027716675f9f194865a124f6e09466c078a
-  es-MX.xpi: 81e5320e22a7f128c09b5c186b86aa0e4aa11798
-  et.xpi: a0b0f98ce01d97a7421acacbbc17d24f2e6d5161
-  eu.xpi: 0d391ac3d72798ddad95b1f60af01263b53cf6ae
-  fa.xpi: c3dc56fc517eb13417f7e28039f5dd0f0cd4d675
-  fi.xpi: 13328a3bf00cb1b9d28a2e47fdad199463d8e02f
-  firefox-100.0.source.tar.xz: 5ccd3ee59d78650d010b8762af5c66ac2484176f
-  fr.xpi: 40c643db43477822b6d1aea2244e149527eb4125
-  fy-NL.xpi: f5943f257639b4bf5bba488438cbc11dff5d5a98
-  ga-IE.xpi: d9a29dfc521a3a8270d45ca92e0e8fc06540ccac
-  gd.xpi: d3cc353cd8e3dc1ec9c4fee4f8370c9b7d06b5db
-  gl.xpi: 60cfa78282b6759ca647ff32190b32ea405297ff
-  gu-IN.xpi: e93e129959ddd618790923d7b6bb793ae2891baa
-  he.xpi: f32a2fc8a202d3c155985d16f607a95cc15e571f
-  hi-IN.xpi: eb4372c59ba5f9c94ddd379c89b3b1ce6de434e5
-  hr.xpi: 0939830b8ffd73184aba1265ef11cdd6690d567f
-  hu.xpi: ac4de528660ae4ace81a9c019c1aa01dcdf09b4c
-  hy-AM.xpi: cdaf105c393c5d7491e8d99fb209af896e21c755
-  id.xpi: 59ccba08a71e4d3bab0fbced7fcd0d993143aa7a
-  is.xpi: 216db249f530842d72cf51719592fb7e489b6646
-  it.xpi: 77b74e0ea6aba3e1fc98c56b7fbd6630a9c3187a
-  ja.xpi: d965fb326a3ad8369e89923e6cbcf73faa55ae8d
-  kk.xpi: 20198fe34cc669da81d34b1dcee33bca146752f0
-  km.xpi: 012e71190bcaa2b49cf78e92808b7d1819cb03a4
-  kn.xpi: 603f432ce1091a01ff4308ef46a610333da13578
-  ko.xpi: d5efb4058a266897b5f79255152b63ea080ecc04
-  lt.xpi: 194f38ef34197ae2389323b6adad3cde16c5556b
-  lv.xpi: c38da031a3b2be5ef13cd9d2cb19c6ec656ac10c
-  mk.xpi: 16beb9933dc9f99df1f105ed3303f411081ef66e
-  mr.xpi: eaede6f25f595d31d2c501d60f9c3e6873513ea8
-  nb-NO.xpi: efde077d170911cc8fcc0436013bb97bc1c25f0f
-  nl.xpi: 8f2518893c095bfe57505e209ed83b6d530e54ab
-  nn-NO.xpi: 22cf2bc1af230cd178d60a996888e2ff63f9f0f8
-  pa-IN.xpi: f1c2cb0563a80be2e52edf579b5c014d2e9d454b
-  pl.xpi: 66bdb6d0828da18440b018e63de9ee2e112061ff
-  pt-BR.xpi: e700823657fe51d946f4be4e6f5154576a3e5fd7
-  pt-PT.xpi: 8cb0d4183116ab2916520082f3c4a7cf4844eeda
-  ro.xpi: 761e832d99eede112dc8a980e83c36d67df4d4a7
-  ru.xpi: 9dda097aad92761bf8c32cfa7324a57234632488
-  si.xpi: 7cba371060f5064e6d438d22861f793f687557d3
-  sk.xpi: 48b8756edd9dbf76ab048ac96bad54c51182d704
-  sl.xpi: 2d1edc64f66f2e76937c31903edb550d64370ee4
-  sq.xpi: e93eed6f4692dec43ee14d6bcadc8df130be7708
-  sr.xpi: 9776d26ca45f7be0581382d2f90378ce015cb4a7
-  sv-SE.xpi: 1f37db522947ae0ff523235def831b6d00cecf37
-  ta.xpi: 53ef65c761050e0ae585d068a2d10dec5d2b7e52
-  te.xpi: 7b30d7892fb55afccf528fa4071ea3075472f377
-  th.xpi: 1248ba713a59a861b984508db8070d9099a3d660
-  tr.xpi: 441ab5a7754aa6cfcc1df5c6f7cfe8e3349ade0f
-  uk.xpi: dfc21f0322efcd0935c7b50cdd1012d7db24eed8
-  vi.xpi: bfdd545d130a45509bf10e0122366a01fef4f9a8
-  zh-CN.xpi: 1118e07794357180ad69551ec389d45a1e7c7683
-  zh-TW.xpi: 626c18e14e0c14803059fb50dc412a433e6bf137
+  bg.xpi: 77a47d85cc4648205b6300e31f77b06355b952f8
+  bn.xpi: f2b70f5aa0b0533cc4eaae78564c2b071e616061
+  br.xpi: f6448365d7106819acc474c7a10be1271fc46728
+  bs.xpi: 1534aaa5712d20b7ec44c1024a135f021ecee562
+  ca.xpi: 3a4858dac04ba63025406c90c21cae36bb07d5f9
+  cbindgen-vendor.tar.xz: e5b896e6edab51fa5bb92c7ca4b7304cd7ac7cdf
+  cs.xpi: a9fc317e8fc49b1311f6b430762d626e19a5b517
+  cy.xpi: 80efeffa0b8fb28645349e755244bbad51d9978d
+  da.xpi: e954e45c6cbf5f9cb91185a38c60ce9e4679c247
+  de.xpi: 2adbc28543760702309d00121e529a2bff939d00
+  el.xpi: 4131313ffebc03aea7de5b0b2e82fc260f66e048
+  en-GB.xpi: 04e4167dfef5c3d6538a4938f98c6ff3d9b340e9
+  eo.xpi: 5f6c9d11f87e5fdb97386878cdf170cafdabfaf6
+  es-AR.xpi: 53d90929873d87cf6e8165dca7d2fe9ee8f1868a
+  es-CL.xpi: 504207f0b9fd68033ea93cc55d03d82025f07960
+  es-ES.xpi: 57d59a507fd70754d05e001dfdedca7392f143ed
+  es-MX.xpi: f5ba735df004fea7c0d07bd1b953c488a53fb41b
+  et.xpi: 9b1cb369d006d1f82625aae17971b107ffd377ea
+  eu.xpi: 68ef7b2224aa1c757470f446793a7483d3d90437
+  fa.xpi: be543c3f65bed7550a98c3104437085057dafd78
+  fi.xpi: 318c8c3ae55211bdb6f27a7625c84c9e8351acc9
+  firefox-101.0.source.tar.xz: b6551b114ee78ec221f19d5d512e4132ba2ecbbe
+  fr.xpi: 987455cad1b78946573cc016189eaf075e525a7a
+  fy-NL.xpi: 1a451fd7b0b64fc4dbee7a8ce5241bd4230080f7
+  ga-IE.xpi: 9079e94fe5c96dc996df332413cfcc4833cc7aaa
+  gd.xpi: 89fdd8c62737f7d25575834ebe1eb15d19eff4ba
+  gl.xpi: dc130d263d407028579c3be11fe45ef69c13aac9
+  gu-IN.xpi: 44ab83fd5d82340feee5d44433b03a3158c673a3
+  he.xpi: 28f1193de0fdb8f3eacdc99149aa28a93c8f05c0
+  hi-IN.xpi: 4fdddd47f5933198a42d15290641081769949ca5
+  hr.xpi: 1fcdc32c524da551befaf9758743757337596330
+  hu.xpi: f1fdf7d2ce1283785024a92775ec874f8c7ecf88
+  hy-AM.xpi: 686f5a1d9dc8cad13dc78c902dc9379e580d25f3
+  id.xpi: b782d1f990e3261b335514ef3954b7dc35feaad9
+  is.xpi: f9a3e5c88b33f32242a42d05d493934445178f88
+  it.xpi: beafe31dc90d7464b5974df4891121d1ba374ceb
+  ja.xpi: c676fbc470c08c6f319f572aad4dfbf3d476945d
+  kk.xpi: 23b47e84e44465827e1302bec497f584adc6dd74
+  km.xpi: 5ac39711db8c3c23a2dbf0a9588a924eb9874f51
+  kn.xpi: c67807832f94492efc3e2517bde556631147dcc1
+  ko.xpi: eb9267f585323bcbec54d3714ec7527260c28913
+  lt.xpi: 2b7beae406a700416ba58ce3d5828f81e9562d8b
+  lv.xpi: c0b8b7dc537df881955ac18560b76bf2887863c7
+  mk.xpi: 256ebeda1a2062c8ecd5a7e713b60ddc1747528f
+  mr.xpi: 806307c8790fc670a759de0e4a574f11f13692e1
+  nb-NO.xpi: 5a3b842dc1a96c5935710bfed487ed3f9897e466
+  nl.xpi: a3a7b3ff98a9a34c5cb6b0f40d8fd237a12be87e
+  nn-NO.xpi: e1a69e98fedb0210501b1f6fb4df356e0b6a39f0
+  pa-IN.xpi: ebe7d61d56e564a5a59a73c53fc46e25b91f066d
+  pl.xpi: 9fba27673080f2ac7517be0e7fe20a569b0feffa
+  pt-BR.xpi: bcbf5cce40c303e9c6d7932cb00f1481a74e79e7
+  pt-PT.xpi: a60df3768653dda1393f092d4776bb700dde3265
+  ro.xpi: 0f93257019ba140796a4b004bbb9e2b41def8d19
+  ru.xpi: 412aa8f6cd88fcdfafaf1ae1158c70f60a3f5e2d
+  si.xpi: 6052a6c14000b05f0eaa8dd1919304733f6818f0
+  sk.xpi: 31504fd36230ecb0223648d4a7a359eb1c1a70d6
+  sl.xpi: 32bfd42c9b09926e8aaa9d581fb452d227848ce3
+  sq.xpi: 8d14d4a4257f0363b383efbaeee9ad5ab2b5db4f
+  sr.xpi: 98775cfaf6c18849e7deeeeebfd084ed14d3e82f
+  sv-SE.xpi: 0174e09049f2f8db336b3964f7a58624d1eb8d54
+  ta.xpi: 75ee7357a118f520e67792a2aee46014ca2d7cf8
+  te.xpi: 368e12e00868bb61600fb4ab96dfad85ce9a10cd
+  th.xpi: a2321e49a87b3449e21f6d43e8a7339f7d4ea1e8
+  tr.xpi: 68ae36324e678403a17fb23153ca600f58982ba7
+  uk.xpi: 73331996037f09c2cd3c802ec04e453856fa9204
+  vi.xpi: 3c6329225cbca9f5d6d6b510b004c6a56d6f40a3
+  zh-CN.xpi: 51c2da04c66739a5b6fc92c9ffb762ac48722313
+  zh-TW.xpi: 35d1137620f9c814d619099a9368c567319afc24
diff --git a/firefox-93.0-kde.patch b/firefox-99.0-kde.patch
similarity index 96%
rename from firefox-93.0-kde.patch
rename to firefox-99.0-kde.patch
index 29d7e78..e1521ef 100644
--- a/firefox-93.0-kde.patch
+++ b/firefox-99.0-kde.patch
@@ -3,7 +3,7 @@
 # Date 1559300151 -7200
 #      Fri May 31 12:55:51 2019 +0200
 # Node ID 54d41b0033b8d649d842a1f862c6fed8b9874dec
-# Parent  856ef9c699423b1cd35e4df8745e78c409c8dbae
+# Parent  23d64c5753fda6f201477fe1f2f6cf1fb1657ccc
 How to apply this patch:
 1. Import and apply it
 2. cp browser/base/content/browser.xul browser/base/content/browser-kde.xul
@@ -14,7 +14,7 @@ How to apply this patch:
 diff --git a/browser/components/preferences/main.js b/browser/components/preferences/main.js
 --- a/browser/components/preferences/main.js
 +++ b/browser/components/preferences/main.js
-@@ -338,16 +338,23 @@ var gMainPane = {
+@@ -353,16 +353,23 @@ var gMainPane = {
          }, backoffTimes[this._backoffIndex + 1 < backoffTimes.length ? this._backoffIndex++ : backoffTimes.length - 1]);
        };
  
@@ -38,7 +38,7 @@ diff --git a/browser/components/preferences/main.js b/browser/components/prefere
      );
      let performanceSettingsUrl =
        Services.urlFormatter.formatURLPref("app.support.baseURL") +
-@@ -1313,16 +1320,27 @@ var gMainPane = {
+@@ -1365,16 +1372,27 @@ var gMainPane = {
        this._backoffIndex = 0;
  
        let shellSvc = getShellService();
@@ -69,7 +69,7 @@ diff --git a/browser/components/preferences/main.js b/browser/components/prefere
 diff --git a/browser/components/shell/moz.build b/browser/components/shell/moz.build
 --- a/browser/components/shell/moz.build
 +++ b/browser/components/shell/moz.build
-@@ -32,16 +32,18 @@ if CONFIG["MOZ_WIDGET_TOOLKIT"] == "coco
+@@ -31,16 +31,18 @@ if CONFIG["MOZ_WIDGET_TOOLKIT"] == "coco
      ]
  elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
      XPIDL_SOURCES += [
@@ -92,7 +92,7 @@ diff --git a/browser/components/shell/nsKDEShellService.cpp b/browser/components
 new file mode 100644
 --- /dev/null
 +++ b/browser/components/shell/nsKDEShellService.cpp
-@@ -0,0 +1,103 @@
+@@ -0,0 +1,109 @@
 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 +/* 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
@@ -196,6 +196,12 @@ new file mode 100644
 +    return NS_ERROR_NOT_IMPLEMENTED;
 +}
 +
++NS_IMETHODIMP
++nsKDEShellService::IsDefaultForScheme(nsTSubstring<char> const& aScheme, bool* aIsDefaultBrowser)
++{
++    return NS_ERROR_NOT_IMPLEMENTED;
++}
++
 diff --git a/browser/components/shell/nsKDEShellService.h b/browser/components/shell/nsKDEShellService.h
 new file mode 100644
 --- /dev/null
diff --git a/firefox.spec b/firefox.spec
index 32d6cfe..2b47840 100644
--- a/firefox.spec
+++ b/firefox.spec
@@ -30,6 +30,10 @@
 # (and not LLVM bytecode)
 %define _disable_lto 1
 
+# use bundled cbindgen
+# currently enabled as updating all rust deps would take eons
+%global use_bundled_cbindgen  1
+
 %bcond_with pgo
 
 # this seems fragile, so require the exact version or later (#58754)
@@ -225,12 +229,15 @@ Name:		firefox
 Epoch:		0
 # IMPORTANT: When updating, you MUST also update the l10n files by running
 # download.sh after editing the version number
-Version:	100.0
+Version:	101.0
 Release:	%{?beta:0.%{beta}.}1
 License:	MPLv1+
 Group:		Networking/WWW
 Url:		http://www.mozilla.com/firefox/
 Source0:	http://ftp.mozilla.org/pub/%{name}/releases/%{version}%{?beta:%{beta}}/source/%{name}-%{version}%{?beta:%{beta}}.source.tar.xz
+%if 0%{?use_bundled_cbindgen}
+Source2:	cbindgen-vendor.tar.xz
+%endif
 Source4:	%{name}.desktop
 Source5:	firefox-searchengines-jamendo.xml
 Source6:	firefox-searchengines-exalead.xml
@@ -252,8 +259,8 @@ Source100:      firefox.rpmlintrc
 }
 
 # Patches for kde integration of FF  from http://www.rosenauer.org/hg/mozilla/
-Patch11:	firefox-93.0-kde.patch
-Patch12:	mozilla-94.0-kde.patch
+#Patch11:	firefox-99.0-kde.patch
+#Patch12:	mozilla-99.0-kde.patch
 
 Patch14:	build-aarch64-skia.patch
 Patch15:	build-arm-libopus.patch
@@ -304,7 +311,7 @@ BuildRequires:	pkgconfig(glib-2.0)
 BuildRequires:	pkgconfig(gl)
 BuildRequires:	pkgconfig(libdrm)
 BuildRequires:	pkgconfig(gtk+-3.0)
-BuildRequires:	pkgconfig(icu-i18n)
+BuildRequires:	pkgconfig(icu-i18n) >= 71.1
 BuildRequires:	pkgconfig(hunspell)
 BuildRequires:	pkgconfig(libffi)
 BuildRequires:	pkgconfig(libIDL-2.0)
@@ -314,7 +321,7 @@ BuildRequires:	pkgconfig(libproxy-1.0)
 BuildRequires:	pkgconfig(libpulse)
 BuildRequires:	pkgconfig(libstartup-notification-1.0)
 BuildRequires:	pkgconfig(nspr) >= 4.32.0
-BuildRequires:	pkgconfig(nss) >= 3.75
+BuildRequires:	pkgconfig(nss) >= 3.78
 BuildRequires:	pkgconfig(ogg)
 BuildRequires:	pkgconfig(opus)
 BuildRequires:	pkgconfig(libpulse)
@@ -326,7 +333,9 @@ BuildRequires:	pkgconfig(xinerama)
 BuildRequires:	pkgconfig(xscrnsaver)
 BuildRequires:	pkgconfig(xt)
 BuildRequires:	pkgconfig(zlib)
-BuildRequires:	cbindgen >= 0.19.0
+%if !0%{?use_bundled_cbindgen}
+BuildRequires:	cbindgen >= 0.23.0
+%endif
 BuildRequires:	nss-static-devel
 BuildRequires:	clang-devel
 BuildRequires:	llvm-devel
@@ -337,8 +346,8 @@ BuildRequires:	pkgconfig(valgrind)
 BuildRequires:	yasm >= 1.0.1
 BuildRequires:	nasm
 %endif
-BuildRequires:	rust >= 1.53.0
-BuildRequires:	cargo >= 1.53.0
+BuildRequires:	rust >= 1.59.0
+BuildRequires:	cargo >= 1.59.0
 BuildRequires:	nodejs >= 10.19
 BuildRequires:	pkgconfig(jemalloc)
 %if %{with pgo}
@@ -499,6 +508,24 @@ export CC=gcc
 # because compile will fail of missing -fPIC  :)
 %set_build_flags
 
+%if 0%{?use_bundled_cbindgen}
+mkdir -p my_rust_vendor
+cd my_rust_vendor
+%{__tar} xf %{SOURCE2}
+mkdir -p .cargo
+cat > .cargo/config <<EOL
+[source.crates-io]
+replace-with = "vendored-sources"
+
+[source.vendored-sources]
+directory = "`pwd`"
+EOL
+
+env CARGO_HOME=.cargo cargo install cbindgen
+export PATH=`pwd`/.cargo/bin:$PATH
+cd -
+%endif
+
 # Show the config just for debugging
 export MOZCONFIG=$(pwd)/mozconfig
 cat $MOZCONFIG
diff --git a/mozilla-94.0-kde.patch b/mozilla-94.0-kde.patch
deleted file mode 100644
index 7bd0de4..0000000
--- a/mozilla-94.0-kde.patch
+++ /dev/null
@@ -1,1489 +0,0 @@
-diff -up firefox-96.0/modules/libpref/moz.build.2~ firefox-96.0/modules/libpref/moz.build
---- firefox-96.0/modules/libpref/moz.build.2~	2022-01-06 19:32:46.000000000 +0100
-+++ firefox-96.0/modules/libpref/moz.build	2022-01-10 21:34:48.660595261 +0100
-@@ -124,6 +124,10 @@ UNIFIED_SOURCES += [
-     "SharedPrefMap.cpp",
- ]
- 
-+LOCAL_INCLUDES += [
-+    '/toolkit/xre'
-+]
-+
- gen_all_tuple = tuple(gen_h + gen_cpp + gen_rs)
- 
- GeneratedFile(
-diff -up firefox-96.0/modules/libpref/Preferences.cpp.2~ firefox-96.0/modules/libpref/Preferences.cpp
---- firefox-96.0/modules/libpref/Preferences.cpp.2~	2022-01-06 19:32:46.000000000 +0100
-+++ firefox-96.0/modules/libpref/Preferences.cpp	2022-01-10 21:34:48.660595261 +0100
-@@ -89,6 +89,7 @@
- #ifdef MOZ_BACKGROUNDTASKS
- #  include "mozilla/BackgroundTasks.h"
- #endif
-+#include "nsKDEUtils.h"
- 
- #ifdef DEBUG
- #  include <map>
-@@ -4640,6 +4641,17 @@ nsresult Preferences::InitInitialObjects
- #endif
-   };
- 
-+  if(nsKDEUtils::kdeSession()) { // TODO what if some setup actually requires the helper?
-+    for(int i = 0;
-+        i < MOZ_ARRAY_LENGTH(specialFiles);
-+        ++i ) {
-+      if( *specialFiles[ i ] == '\0' ) {
-+        specialFiles[ i ] = "kde.js";
-+        break;
-+      }
-+    }
-+  }
-+
-   rv = pref_LoadPrefsInDir(defaultPrefDir, specialFiles,
-                            ArrayLength(specialFiles));
-   if (NS_FAILED(rv)) {
-@@ -4714,7 +4726,7 @@ nsresult Preferences::InitInitialObjects
-       }
- 
-       // Do we care if a file provided by this process fails to load?
--      pref_LoadPrefsInDir(path, nullptr, 0);
-+      pref_LoadPrefsInDir(path, specialFiles, ArrayLength(specialFiles));
-     }
-   }
- 
-diff -up firefox-96.0/python/mozbuild/mozpack/chrome/flags.py.2~ firefox-96.0/python/mozbuild/mozpack/chrome/flags.py
---- firefox-96.0/python/mozbuild/mozpack/chrome/flags.py.2~	2022-01-06 16:57:14.000000000 +0100
-+++ firefox-96.0/python/mozbuild/mozpack/chrome/flags.py	2022-01-10 21:34:48.660595261 +0100
-@@ -234,6 +234,7 @@ class Flags(OrderedDict):
-         "tablet": Flag,
-         "process": StringFlag,
-         "backgroundtask": StringFlag,
-+        "desktop": StringFlag,
-     }
-     RE = re.compile(r"([!<>=]+)")
- 
-diff -up firefox-96.0/python/mozbuild/mozpack/chrome/manifest.py.2~ firefox-96.0/python/mozbuild/mozpack/chrome/manifest.py
---- firefox-96.0/python/mozbuild/mozpack/chrome/manifest.py.2~	2022-01-06 16:56:52.000000000 +0100
-+++ firefox-96.0/python/mozbuild/mozpack/chrome/manifest.py	2022-01-10 21:34:48.660595261 +0100
-@@ -44,6 +44,7 @@ class ManifestEntry(object):
-         "process",
-         "contentaccessible",
-         "backgroundtask",
-+        "desktop",
-     ]
- 
-     def __init__(self, base, *flags):
-diff -up firefox-96.0/toolkit/components/downloads/moz.build.2~ firefox-96.0/toolkit/components/downloads/moz.build
---- firefox-96.0/toolkit/components/downloads/moz.build.2~	2022-01-06 19:33:04.000000000 +0100
-+++ firefox-96.0/toolkit/components/downloads/moz.build	2022-01-10 21:34:48.660595261 +0100
-@@ -50,5 +50,9 @@ if CONFIG["MOZ_PLACES"]:
- 
- FINAL_LIBRARY = "xul"
- 
-+LOCAL_INCLUDES += [
-+    '/toolkit/xre'
-+]
-+
- with Files("**"):
-     BUG_COMPONENT = ("Toolkit", "Downloads API")
-diff -up firefox-96.0/toolkit/mozapps/downloads/HelperAppDlg.jsm.2~ firefox-96.0/toolkit/mozapps/downloads/HelperAppDlg.jsm
---- firefox-96.0/toolkit/mozapps/downloads/HelperAppDlg.jsm.2~	2022-01-06 19:33:04.000000000 +0100
-+++ firefox-96.0/toolkit/mozapps/downloads/HelperAppDlg.jsm	2022-01-10 21:34:48.660595261 +0100
-@@ -1236,26 +1236,56 @@ nsUnknownContentTypeDialog.prototype = {
-         this.chosenApp = params.handlerApp;
-       }
-     } else if ("@mozilla.org/applicationchooser;1" in Cc) {
--      var nsIApplicationChooser = Ci.nsIApplicationChooser;
--      var appChooser = Cc["@mozilla.org/applicationchooser;1"].createInstance(
--        nsIApplicationChooser
--      );
--      appChooser.init(
--        this.mDialog,
--        this.dialogElement("strings").getString("chooseAppFilePickerTitle")
--      );
--      var contentTypeDialogObj = this;
--      let appChooserCallback = function appChooserCallback_done(aResult) {
--        if (aResult) {
--          contentTypeDialogObj.chosenApp = aResult.QueryInterface(
--            Ci.nsILocalHandlerApp
--          );
--        }
--        contentTypeDialogObj.finishChooseApp();
--      };
--      appChooser.open(this.mLauncher.MIMEInfo.MIMEType, appChooserCallback);
--      // The finishChooseApp is called from appChooserCallback
--      return;
-+      // handle the KDE case which is implemented in the filepicker
-+      // therefore falling back to Gtk2 like behaviour if KDE is running
-+      // FIXME this should be better handled in the nsIApplicationChooser
-+      // interface
-+      var env = Components.classes["@mozilla.org/process/environment;1"]
-+                          .getService(Components.interfaces.nsIEnvironment);
-+      if (env.get('KDE_FULL_SESSION') == "true")
-+      {
-+        var nsIFilePicker = Ci.nsIFilePicker;
-+        var fp = Cc["@mozilla.org/filepicker;1"]
-+                    .createInstance(nsIFilePicker);
-+        fp.init(this.mDialog,
-+                this.dialogElement("strings").getString("chooseAppFilePickerTitle"),
-+                nsIFilePicker.modeOpen);
-+
-+        fp.appendFilters(nsIFilePicker.filterApps);
-+
-+        fp.open(aResult => {
-+          if (aResult == nsIFilePicker.returnOK && fp.file) {
-+            // Remember the file they chose to run.
-+            var localHandlerApp =
-+              Cc["@mozilla.org/uriloader/local-handler-app;1"].
-+                         createInstance(Ci.nsILocalHandlerApp);
-+            localHandlerApp.executable = fp.file;
-+            this.chosenApp = localHandlerApp;
-+          }
-+          this.finishChooseApp();
-+        });
-+      } else {
-+        var nsIApplicationChooser = Ci.nsIApplicationChooser;
-+        var appChooser = Cc["@mozilla.org/applicationchooser;1"].createInstance(
-+          nsIApplicationChooser
-+        );
-+        appChooser.init(
-+          this.mDialog,
-+          this.dialogElement("strings").getString("chooseAppFilePickerTitle")
-+        );
-+        var contentTypeDialogObj = this;
-+        let appChooserCallback = function appChooserCallback_done(aResult) {
-+          if (aResult) {
-+            contentTypeDialogObj.chosenApp = aResult.QueryInterface(
-+              Ci.nsILocalHandlerApp
-+            );
-+          }
-+          contentTypeDialogObj.finishChooseApp();
-+        };
-+        appChooser.open(this.mLauncher.MIMEInfo.MIMEType, appChooserCallback);
-+        // The finishChooseApp is called from appChooserCallback
-+        return;
-+      }
-     } else {
-       var nsIFilePicker = Ci.nsIFilePicker;
-       var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
-diff -up firefox-96.0/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp.2~ firefox-96.0/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp
---- firefox-96.0/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp.2~	2022-01-06 16:58:15.000000000 +0100
-+++ firefox-96.0/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp	2022-01-10 21:34:48.660595261 +0100
-@@ -18,6 +18,7 @@
- #include "nsInterfaceHashtable.h"
- #include "mozilla/Attributes.h"
- #include "nsIURI.h"
-+#include "nsKDEUtils.h"
- 
- using namespace mozilla;
- 
-@@ -41,6 +42,8 @@ class nsUnixSystemProxySettings final :
-                                  nsACString& aResult);
-   nsresult SetProxyResultFromGSettings(const char* aKeyBase, const char* aType,
-                                        nsACString& aResult);
-+  nsresult GetProxyFromKDE(const nsACString& aScheme, const nsACString& aHost,
-+                           PRInt32 aPort, nsACString& aResult);
- };
- 
- NS_IMPL_ISUPPORTS(nsUnixSystemProxySettings, nsISystemProxySettings)
-@@ -382,6 +385,9 @@ nsresult nsUnixSystemProxySettings::GetP
-                                                    const nsACString& aHost,
-                                                    const int32_t aPort,
-                                                    nsACString& aResult) {
-+  if (nsKDEUtils::kdeSupport())
-+    return GetProxyFromKDE(aScheme, aHost, aPort, aResult);
-+
-   if (mProxySettings) {
-     nsresult rv = GetProxyFromGSettings(aScheme, aHost, aPort, aResult);
-     if (NS_SUCCEEDED(rv)) return rv;
-@@ -390,6 +396,32 @@ nsresult nsUnixSystemProxySettings::GetP
-   return GetProxyFromEnvironment(aScheme, aHost, aPort, aResult);
- }
- 
-+nsresult
-+nsUnixSystemProxySettings::GetProxyFromKDE(const nsACString& aScheme,
-+                                           const nsACString& aHost,
-+                                           PRInt32 aPort,
-+                                           nsACString& aResult)
-+{
-+  nsAutoCString url;
-+  url = aScheme;
-+  url += "://";
-+  url += aHost;
-+  if( aPort >= 0 )
-+  {
-+    url += ":";
-+    url += nsPrintfCString("%d", aPort);
-+  }
-+  nsTArray<nsCString> command;
-+  command.AppendElement( "GETPROXY"_ns );
-+  command.AppendElement( url );
-+  nsTArray<nsCString> result;
-+  if( !nsKDEUtils::command( command, &result ) || result.Length() != 1 )
-+    return NS_ERROR_FAILURE;
-+  aResult = result[0];
-+  return NS_OK;
-+}
-+
-+
- NS_IMPL_COMPONENT_FACTORY(nsUnixSystemProxySettings) {
-   auto result = MakeRefPtr<nsUnixSystemProxySettings>();
-   result->Init();
-diff -up firefox-96.0/toolkit/xre/moz.build.2~ firefox-96.0/toolkit/xre/moz.build
---- firefox-96.0/toolkit/xre/moz.build.2~	2022-01-06 19:33:05.000000000 +0100
-+++ firefox-96.0/toolkit/xre/moz.build	2022-01-10 21:34:48.660595261 +0100
-@@ -97,7 +97,9 @@ elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "ui
-         "UIKitDirProvider.mm",
-     ]
- elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
-+    EXPORTS += ['nsKDEUtils.h']
-     UNIFIED_SOURCES += [
-+        "nsKDEUtils.cpp",
-         "nsNativeAppSupportUnix.cpp",
-     ]
-     CXXFLAGS += CONFIG["MOZ_X11_SM_CFLAGS"]
-diff -up firefox-96.0/toolkit/xre/nsKDEUtils.cpp.2~ firefox-96.0/toolkit/xre/nsKDEUtils.cpp
---- firefox-96.0/toolkit/xre/nsKDEUtils.cpp.2~	2022-01-10 21:34:48.660595261 +0100
-+++ firefox-96.0/toolkit/xre/nsKDEUtils.cpp	2022-01-10 21:34:48.660595261 +0100
-@@ -0,0 +1,321 @@
-+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-+/* 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 "nsKDEUtils.h"
-+#include "nsIWidget.h"
-+#include "nsISupportsPrimitives.h"
-+#include "nsIMutableArray.h"
-+#include "nsComponentManagerUtils.h"
-+#include "nsArrayUtils.h"
-+
-+#include <gtk/gtk.h>
-+
-+#include <limits.h>
-+#include <stdio.h>
-+#include <sys/wait.h>
-+#include <sys/resource.h>
-+#include <unistd.h>
-+#include <X11/Xlib.h>
-+// copied from X11/X.h as a hack since for an unknown
-+// reason it's not picked up from X11/X.h
-+#ifndef None
-+#define None                 0L /* universal null resource or null atom */
-+#endif
-+
-+//#define DEBUG_KDE
-+#ifdef DEBUG_KDE
-+#define KMOZILLAHELPER "kmozillahelper"
-+#else
-+// not need for lib64, it's a binary
-+#define KMOZILLAHELPER "/usr/lib/mozilla/kmozillahelper"
-+#endif
-+
-+#define KMOZILLAHELPER_VERSION 6
-+#define MAKE_STR2( n ) #n
-+#define MAKE_STR( n ) MAKE_STR2( n )
-+
-+static bool getKdeSession()
-+{
-+    if (PR_GetEnv("KDE_FULL_SESSION"))
-+    {
-+      return true;
-+    }
-+    return false;
-+}
-+
-+static bool getKdeSupport()
-+    {
-+    nsTArray<nsCString> command;
-+    command.AppendElement( "CHECK"_ns );
-+    command.AppendElement( "KMOZILLAHELPER_VERSION"_ns );
-+    bool kde = nsKDEUtils::command( command );
-+#ifdef DEBUG_KDE
-+    fprintf( stderr, "KDE RUNNING %d\n", kde );
-+#endif
-+    return kde;
-+    }
-+
-+nsKDEUtils::nsKDEUtils()
-+    : commandFile( NULL )
-+    , replyFile( NULL )
-+    {
-+    }
-+
-+nsKDEUtils::~nsKDEUtils()
-+    {
-+//    closeHelper(); not actually useful, exiting will close the fd too
-+    }
-+
-+nsKDEUtils* nsKDEUtils::self()
-+    {
-+    static nsKDEUtils s;
-+    return &s;
-+    }
-+
-+static bool helperRunning = false;
-+static bool helperFailed = false;
-+
-+bool nsKDEUtils::kdeSession()
-+    {
-+    static bool session = getKdeSession();
-+    return session;
-+    }
-+
-+bool nsKDEUtils::kdeSupport()
-+    {
-+    static bool support = kdeSession() && getKdeSupport();
-+    return support && helperRunning;
-+    }
-+
-+struct nsKDECommandData
-+    {
-+    FILE* file;
-+    nsTArray<nsCString>* output;
-+    GMainLoop* loop;
-+    bool success;
-+    };
-+
-+static gboolean kdeReadFunc( GIOChannel*, GIOCondition, gpointer data )
-+    {
-+    nsKDECommandData* p = static_cast< nsKDECommandData* >( data );
-+    char buf[ 8192 ]; // TODO big enough
-+    bool command_done = false;
-+    bool command_failed = false;
-+    while( !command_done && !command_failed && fgets( buf, 8192, p->file ) != NULL )
-+        { // TODO what if the kernel splits a line into two chunks?
-+//#ifdef DEBUG_KDE
-+//        fprintf( stderr, "READ: %s %d\n", buf, feof( p->file ));
-+//#endif
-+        if( char* eol = strchr( buf, '\n' ))
-+            *eol = '\0';
-+        command_done = ( strcmp( buf, "\\1" ) == 0 );
-+        command_failed = ( strcmp( buf, "\\0" ) == 0 );
-+        nsAutoCString line( buf );
-+        line.ReplaceSubstring( "\\n", "\n" );
-+        line.ReplaceSubstring( "\\" "\\", "\\" ); //  \\ -> \ , i.e. unescape
-+        if( p->output && !( command_done || command_failed ))
-+            p->output->AppendElement( nsCString( buf )); // TODO utf8?
-+        }
-+    bool quit = false;
-+    if( feof( p->file ) || command_failed )
-+        {
-+        quit = true;
-+        p->success = false;
-+        }
-+    if( command_done )
-+        { // reading one reply finished
-+        quit = true;
-+        p->success = true;
-+        }
-+    if( quit )
-+        {
-+        if( p->loop )
-+            g_main_loop_quit( p->loop );
-+        return FALSE;
-+        }
-+    return TRUE;
-+    }
-+
-+bool nsKDEUtils::command( const nsTArray<nsCString>& command, nsTArray<nsCString>* output )
-+    {
-+    return self()->internalCommand( command, NULL, false, output );
-+    }
-+
-+bool nsKDEUtils::command( nsIArray* command, nsIArray** output)
-+    {
-+    nsTArray<nsCString> in;
-+    PRUint32 length;
-+    command->GetLength( &length );
-+    for ( PRUint32 i = 0; i < length; i++ )
-+        {
-+        nsCOMPtr<nsISupportsCString> str = do_QueryElementAt( command, i );
-+        if( str )
-+            {
-+            nsAutoCString s;
-+            str->GetData( s );
-+            in.AppendElement( s );
-+            }
-+        }
-+
-+    nsTArray<nsCString> out;
-+    bool ret = self()->internalCommand( in, NULL, false, &out );
-+
-+    if ( !output ) return ret;
-+
-+    nsCOMPtr<nsIMutableArray> result = do_CreateInstance( NS_ARRAY_CONTRACTID );
-+    if ( !result ) return false;
-+
-+    for ( PRUint32 i = 0; i < out.Length(); i++ )
-+        {
-+        nsCOMPtr<nsISupportsCString> rstr = do_CreateInstance( NS_SUPPORTS_CSTRING_CONTRACTID );
-+        if ( !rstr ) return false;
-+
-+        rstr->SetData( out[i] );
-+        result->AppendElement( rstr );
-+        }
-+
-+    NS_ADDREF( *output = result);
-+    return ret;
-+    }
-+
-+
-+bool nsKDEUtils::commandBlockUi( const nsTArray<nsCString>& command, GtkWindow* parent, nsTArray<nsCString>* output )
-+    {
-+    return self()->internalCommand( command, parent, true, output );
-+    }
-+
-+bool nsKDEUtils::internalCommand( const nsTArray<nsCString>& command, GtkWindow* parent, bool blockUi,
-+    nsTArray<nsCString>* output )
-+    {
-+    if( !startHelper())
-+        return false;
-+    feedCommand( command );
-+    // do not store the data in 'this' but in extra structure, just in case there
-+    // is reentrancy (can there be? the event loop is re-entered)
-+    nsKDECommandData data;
-+    data.file = replyFile;
-+    data.output = output;
-+    data.success = false;
-+    if( blockUi )
-+        {
-+        data.loop = g_main_loop_new( NULL, FALSE );
-+        GtkWidget* window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
-+        if( parent && gtk_window_get_group(parent) )
-+            gtk_window_group_add_window( gtk_window_get_group(parent), GTK_WINDOW( window ));
-+        gtk_widget_realize( window );
-+        gtk_widget_set_sensitive( window, TRUE );
-+        gtk_grab_add( window );
-+        GIOChannel* channel = g_io_channel_unix_new( fileno( data.file ));
-+        g_io_add_watch( channel, static_cast< GIOCondition >( G_IO_IN | G_IO_ERR | G_IO_HUP ), kdeReadFunc, &data );
-+        g_io_channel_unref( channel );
-+        g_main_loop_run( data.loop );
-+        g_main_loop_unref( data.loop );
-+        gtk_grab_remove( window );
-+        gtk_widget_destroy( window );
-+        }
-+    else
-+        {
-+        data.loop = NULL;
-+        while( kdeReadFunc( NULL, static_cast< GIOCondition >( 0 ), &data ))
-+            ;
-+        }
-+    return data.success;
-+    }
-+
-+bool nsKDEUtils::startHelper()
-+    {
-+    if( helperRunning )
-+        return true;
-+    if( helperFailed )
-+        return false;
-+    helperFailed = true;
-+    int fdcommand[ 2 ];
-+    int fdreply[ 2 ];
-+    if( pipe( fdcommand ) < 0 )
-+        return false;
-+    if( pipe( fdreply ) < 0 )
-+        {
-+        close( fdcommand[ 0 ] );
-+        close( fdcommand[ 1 ] );
-+        return false;
-+        }
-+    char* args[ 2 ] = { const_cast< char* >( KMOZILLAHELPER ), NULL };
-+    switch( fork())
-+        {
-+        case -1:
-+            {
-+            close( fdcommand[ 0 ] );
-+            close( fdcommand[ 1 ] );
-+            close( fdreply[ 0 ] );
-+            close( fdreply[ 1 ] );
-+            return false;
-+            }
-+        case 0: // child
-+            {
-+            if( dup2( fdcommand[ 0 ], STDIN_FILENO ) < 0 )
-+                _exit( 1 );
-+            if( dup2( fdreply[ 1 ], STDOUT_FILENO ) < 0 )
-+                _exit( 1 );
-+            int maxfd = 1024; // close all other fds
-+            struct rlimit rl;
-+            if( getrlimit( RLIMIT_NOFILE, &rl ) == 0 )
-+                maxfd = rl.rlim_max;
-+            for( int i = 3;
-+                 i < maxfd;
-+                 ++i )
-+                close( i );
-+#ifdef DEBUG_KDE
-+            execvp( KMOZILLAHELPER, args );
-+#else
-+            execv( KMOZILLAHELPER, args );
-+#endif
-+            _exit( 1 ); // failed
-+            }
-+        default: // parent
-+            {
-+            commandFile = fdopen( fdcommand[ 1 ], "w" );
-+            replyFile = fdopen( fdreply[ 0 ], "r" );
-+            close( fdcommand[ 0 ] );
-+            close( fdreply[ 1 ] );
-+            if( commandFile == NULL || replyFile == NULL )
-+                {
-+                closeHelper();
-+                return false;
-+                }
-+            // ok, helper ready, getKdeRunning() will check if it works
-+            }
-+        }
-+    helperFailed = false;
-+    helperRunning = true;
-+    return true;
-+    }
-+
-+void nsKDEUtils::closeHelper()
-+    {
-+    if( commandFile != NULL )
-+        fclose( commandFile ); // this will also make the helper quit
-+    if( replyFile != NULL )
-+        fclose( replyFile );
-+    helperRunning = false;
-+    }
-+
-+void nsKDEUtils::feedCommand( const nsTArray<nsCString>& command )
-+    {
-+    for( int i = 0;
-+         i < command.Length();
-+         ++i )
-+        {
-+        nsCString line = command[ i ];
-+        line.ReplaceSubstring( "\\", "\\" "\\" ); // \ -> \\ , i.e. escape
-+        line.ReplaceSubstring( "\n", "\\n" );
-+#ifdef DEBUG_KDE
-+        fprintf( stderr, "COMM: %s\n", line.get());
-+#endif
-+        fputs( line.get(), commandFile );
-+        fputs( "\n", commandFile );
-+        }
-+    fputs( "\\E\n", commandFile ); // done as \E, so it cannot happen in normal data
-+    fflush( commandFile );
-+    }
-diff -up firefox-96.0/toolkit/xre/nsKDEUtils.h.2~ firefox-96.0/toolkit/xre/nsKDEUtils.h
---- firefox-96.0/toolkit/xre/nsKDEUtils.h.2~	2022-01-10 21:34:48.660595261 +0100
-+++ firefox-96.0/toolkit/xre/nsKDEUtils.h	2022-01-10 21:34:48.660595261 +0100
-@@ -0,0 +1,48 @@
-+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-+/* This Source Code Form is subject to the terms of the Mozilla Public
-+ * License, v. 2.0. If a copy of the MPL was not distributed with this
-+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-+
-+#ifndef nsKDEUtils_h__
-+#define nsKDEUtils_h__
-+
-+#include "nsString.h"
-+#include "nsTArray.h"
-+#include <stdio.h>
-+
-+typedef struct _GtkWindow GtkWindow;
-+
-+class nsIArray;
-+
-+class NS_EXPORT nsKDEUtils
-+    {
-+    public:
-+        /* Returns true if running inside a KDE session (regardless of whether there is KDE
-+           support available for Firefox). This should be used e.g. when determining
-+           dialog button order but not for code that requires the KDE support. */
-+        static bool kdeSession();
-+        /* Returns true if running inside a KDE session and KDE support is available
-+           for Firefox. This should be used everywhere where the external helper is needed. */
-+        static bool kdeSupport();
-+        /* Executes the given helper command, returns true if helper returned success. */
-+        static bool command( const nsTArray<nsCString>& command, nsTArray<nsCString>* output = NULL );
-+        static bool command( nsIArray* command, nsIArray** output = NULL );
-+        /* Like command(), but additionally blocks the parent widget like if there was
-+           a modal dialog shown and enters the event loop (i.e. there are still paint updates,
-+           this is for commands that take long). */
-+        static bool commandBlockUi( const nsTArray<nsCString>& command, GtkWindow* parent, nsTArray<nsCString>* output = NULL );
-+
-+    private:
-+        nsKDEUtils();
-+        ~nsKDEUtils();
-+        static nsKDEUtils* self();
-+        bool startHelper();
-+        void closeHelper();
-+        void feedCommand( const nsTArray<nsCString>& command );
-+        bool internalCommand( const nsTArray<nsCString>& command, GtkWindow* parent, bool isParent,
-+            nsTArray<nsCString>* output );
-+        FILE* commandFile;
-+        FILE* replyFile;
-+    };
-+
-+#endif // nsKDEUtils
-diff -up firefox-96.0/uriloader/exthandler/HandlerServiceParent.cpp.2~ firefox-96.0/uriloader/exthandler/HandlerServiceParent.cpp
---- firefox-96.0/uriloader/exthandler/HandlerServiceParent.cpp.2~	2022-01-06 16:57:59.000000000 +0100
-+++ firefox-96.0/uriloader/exthandler/HandlerServiceParent.cpp	2022-01-10 21:34:48.660595261 +0100
-@@ -12,7 +12,7 @@
- #include "ContentHandlerService.h"
- #include "nsStringEnumerator.h"
- #ifdef MOZ_WIDGET_GTK
--#  include "unix/nsGNOMERegistry.h"
-+#  include "unix/nsCommonRegistry.h"
- #endif
- 
- using mozilla::dom::ContentHandlerService;
-@@ -304,7 +304,7 @@ mozilla::ipc::IPCResult HandlerServicePa
-   }
- #ifdef MOZ_WIDGET_GTK
-   // Check the GNOME registry for a protocol handler
--  *aHandlerExists = nsGNOMERegistry::HandlerExists(aProtocolScheme.get());
-+  *aHandlerExists = nsCommonRegistry::HandlerExists(aProtocolScheme.get());
- #else
-   *aHandlerExists = false;
- #endif
-@@ -333,7 +333,7 @@ mozilla::ipc::IPCResult HandlerServicePa
-   }
-   rv = protoSvc->ExternalProtocolHandlerExists(aProtocolScheme.get(),
-                                                aHandlerExists);
--
-+##
-   if (NS_WARN_IF(NS_FAILED(rv))) {
-     *aHandlerExists = false;
-   }
-diff -up firefox-96.0/uriloader/exthandler/moz.build.2~ firefox-96.0/uriloader/exthandler/moz.build
---- firefox-96.0/uriloader/exthandler/moz.build.2~	2022-01-06 19:33:05.000000000 +0100
-+++ firefox-96.0/uriloader/exthandler/moz.build	2022-01-10 21:40:48.237015273 +0100
-@@ -83,7 +83,9 @@ else:
- 
- if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
-     UNIFIED_SOURCES += [
-+        "unix/nsCommonRegistry.cpp",
-         "unix/nsGNOMERegistry.cpp",
-+        "unix/nsKDERegistry.cpp",
-         "unix/nsMIMEInfoUnix.cpp",
-     ]
- elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "android":
-@@ -131,6 +133,7 @@ LOCAL_INCLUDES += [
-     "/dom/ipc",
-     "/netwerk/base",
-     "/netwerk/protocol/http",
-+    "/toolkit/xre",
- ]
- 
- if CONFIG["MOZ_ENABLE_DBUS"]:
-diff -up firefox-96.0/uriloader/exthandler/unix/nsCommonRegistry.cpp.2~ firefox-96.0/uriloader/exthandler/unix/nsCommonRegistry.cpp
---- firefox-96.0/uriloader/exthandler/unix/nsCommonRegistry.cpp.2~	2022-01-10 21:34:48.660595261 +0100
-+++ firefox-96.0/uriloader/exthandler/unix/nsCommonRegistry.cpp	2022-01-10 21:34:48.660595261 +0100
-@@ -0,0 +1,53 @@
-+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-+/* 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 "nsCommonRegistry.h"
-+
-+#include "nsGNOMERegistry.h"
-+#include "nsKDERegistry.h"
-+#include "nsString.h"
-+#include "nsKDEUtils.h"
-+
-+/* static */ bool
-+nsCommonRegistry::HandlerExists(const char *aProtocolScheme)
-+{
-+    if( nsKDEUtils::kdeSupport())
-+        return nsKDERegistry::HandlerExists( aProtocolScheme );
-+    return nsGNOMERegistry::HandlerExists( aProtocolScheme );
-+}
-+
-+/* static */ nsresult
-+nsCommonRegistry::LoadURL(nsIURI *aURL)
-+{
-+    if( nsKDEUtils::kdeSupport())
-+        return nsKDERegistry::LoadURL( aURL );
-+    return nsGNOMERegistry::LoadURL( aURL );
-+}
-+
-+/* static */ void
-+nsCommonRegistry::GetAppDescForScheme(const nsACString& aScheme,
-+                                     nsAString& aDesc)
-+{
-+    if( nsKDEUtils::kdeSupport())
-+        return nsKDERegistry::GetAppDescForScheme( aScheme, aDesc );
-+    return nsGNOMERegistry::GetAppDescForScheme( aScheme, aDesc );
-+}
-+
-+
-+/* static */ already_AddRefed<nsMIMEInfoBase>
-+nsCommonRegistry::GetFromExtension(const nsACString& aFileExt)
-+{
-+    if( nsKDEUtils::kdeSupport())
-+        return nsKDERegistry::GetFromExtension( aFileExt );
-+    return nsGNOMERegistry::GetFromExtension( aFileExt );
-+}
-+
-+/* static */ already_AddRefed<nsMIMEInfoBase>
-+nsCommonRegistry::GetFromType(const nsACString& aMIMEType)
-+{
-+    if( nsKDEUtils::kdeSupport())
-+        return nsKDERegistry::GetFromType( aMIMEType );
-+    return nsGNOMERegistry::GetFromType( aMIMEType );
-+}
-diff -up firefox-96.0/uriloader/exthandler/unix/nsCommonRegistry.h.2~ firefox-96.0/uriloader/exthandler/unix/nsCommonRegistry.h
---- firefox-96.0/uriloader/exthandler/unix/nsCommonRegistry.h.2~	2022-01-10 21:34:48.660595261 +0100
-+++ firefox-96.0/uriloader/exthandler/unix/nsCommonRegistry.h	2022-01-10 21:34:48.660595261 +0100
-@@ -0,0 +1,28 @@
-+/* This Source Code Form is subject to the terms of the Mozilla Public
-+ * License, v. 2.0. If a copy of the MPL was not distributed with this
-+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-+
-+#ifndef nsCommonRegistry_h__
-+#define nsCommonRegistry_h__
-+
-+#include "nsIURI.h"
-+#include "nsCOMPtr.h"
-+
-+class nsMIMEInfoBase;
-+
-+class nsCommonRegistry
-+{
-+ public:
-+  static bool HandlerExists(const char *aProtocolScheme);
-+
-+  static nsresult LoadURL(nsIURI *aURL);
-+
-+  static void GetAppDescForScheme(const nsACString& aScheme,
-+                                  nsAString& aDesc);
-+
-+  static already_AddRefed<nsMIMEInfoBase> GetFromExtension(const nsACString& aFileExt);
-+
-+  static already_AddRefed<nsMIMEInfoBase> GetFromType(const nsACString& aMIMEType);
-+};
-+
-+#endif
-diff -up firefox-96.0/uriloader/exthandler/unix/nsKDERegistry.cpp.2~ firefox-96.0/uriloader/exthandler/unix/nsKDERegistry.cpp
---- firefox-96.0/uriloader/exthandler/unix/nsKDERegistry.cpp.2~	2022-01-10 21:34:48.661595265 +0100
-+++ firefox-96.0/uriloader/exthandler/unix/nsKDERegistry.cpp	2022-01-10 21:34:48.660595261 +0100
-@@ -0,0 +1,86 @@
-+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-+/* 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 "nsKDERegistry.h"
-+#include "prlink.h"
-+#include "prmem.h"
-+#include "nsString.h"
-+#include "nsMIMEInfoUnix.h"
-+#include "nsKDEUtils.h"
-+
-+/* static */ bool
-+nsKDERegistry::HandlerExists(const char *aProtocolScheme)
-+{
-+    nsTArray<nsCString> command;
-+    command.AppendElement( "HANDLEREXISTS"_ns );
-+    command.AppendElement( nsAutoCString( aProtocolScheme ));
-+    return nsKDEUtils::command( command );
-+}
-+
-+/* static */ nsresult
-+nsKDERegistry::LoadURL(nsIURI *aURL)
-+{
-+    nsTArray<nsCString> command;
-+    command.AppendElement( "OPEN"_ns );
-+    nsCString url;
-+    aURL->GetSpec( url );
-+    command.AppendElement( url );
-+    bool rv = nsKDEUtils::command( command );
-+    if (!rv)
-+      return NS_ERROR_FAILURE;
-+
-+    return NS_OK;
-+}
-+
-+/* static */ void
-+nsKDERegistry::GetAppDescForScheme(const nsACString& aScheme,
-+                                     nsAString& aDesc)
-+{
-+    nsTArray<nsCString> command;
-+    command.AppendElement( "GETAPPDESCFORSCHEME"_ns );
-+    command.AppendElement( aScheme );
-+    nsTArray<nsCString> output;
-+    if( nsKDEUtils::command( command, &output ) && output.Length() == 1 )
-+        CopyUTF8toUTF16( output[ 0 ], aDesc );
-+}
-+
-+
-+/* static */ already_AddRefed<nsMIMEInfoBase>
-+nsKDERegistry::GetFromExtension(const nsACString& aFileExt)
-+{
-+    NS_ASSERTION(aFileExt[0] != '.', "aFileExt shouldn't start with a dot");
-+    nsTArray<nsCString> command;
-+    command.AppendElement( "GETFROMEXTENSION"_ns );
-+    command.AppendElement( aFileExt );
-+    return GetFromHelper( command );
-+}
-+
-+/* static */ already_AddRefed<nsMIMEInfoBase>
-+nsKDERegistry::GetFromType(const nsACString& aMIMEType)
-+{
-+    nsTArray<nsCString> command;
-+    command.AppendElement( "GETFROMTYPE"_ns );
-+    command.AppendElement( aMIMEType );
-+    return GetFromHelper( command );
-+}
-+
-+/* static */ already_AddRefed<nsMIMEInfoBase>
-+nsKDERegistry::GetFromHelper(const nsTArray<nsCString>& command)
-+{
-+    nsTArray<nsCString> output;
-+    if( nsKDEUtils::command( command, &output ) && output.Length() == 3 )
-+        {
-+        nsCString mimetype = output[ 0 ];
-+        RefPtr<nsMIMEInfoUnix> mimeInfo = new nsMIMEInfoUnix( mimetype );
-+        NS_ENSURE_TRUE(mimeInfo, nullptr);
-+        nsCString description = output[ 1 ];
-+        mimeInfo->SetDescription(NS_ConvertUTF8toUTF16(description));
-+        nsCString handlerAppName = output[ 2 ];
-+        mimeInfo->SetDefaultDescription(NS_ConvertUTF8toUTF16(handlerAppName));
-+        mimeInfo->SetPreferredAction(nsIMIMEInfo::useSystemDefault);
-+        return mimeInfo.forget();
-+        }
-+    return nullptr;
-+}
-diff -up firefox-96.0/uriloader/exthandler/unix/nsKDERegistry.h.2~ firefox-96.0/uriloader/exthandler/unix/nsKDERegistry.h
---- firefox-96.0/uriloader/exthandler/unix/nsKDERegistry.h.2~	2022-01-10 21:34:48.661595265 +0100
-+++ firefox-96.0/uriloader/exthandler/unix/nsKDERegistry.h	2022-01-10 21:34:48.661595265 +0100
-@@ -0,0 +1,34 @@
-+/* This Source Code Form is subject to the terms of the Mozilla Public
-+ * License, v. 2.0. If a copy of the MPL was not distributed with this
-+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-+
-+#ifndef nsKDERegistry_h__
-+#define nsKDERegistry_h__
-+
-+#include "nsIURI.h"
-+#include "nsCOMPtr.h"
-+#include "nsTArray.h"
-+
-+class nsMIMEInfoBase;
-+//class nsAutoCString;
-+//class nsCString;
-+
-+class nsKDERegistry
-+{
-+ public:
-+  static bool HandlerExists(const char *aProtocolScheme);
-+
-+  static nsresult LoadURL(nsIURI *aURL);
-+
-+  static void GetAppDescForScheme(const nsACString& aScheme,
-+                                  nsAString& aDesc);
-+
-+  static already_AddRefed<nsMIMEInfoBase> GetFromExtension(const nsACString& aFileExt);
-+
-+  static already_AddRefed<nsMIMEInfoBase> GetFromType(const nsACString& aMIMEType);
-+ private:
-+  static already_AddRefed<nsMIMEInfoBase> GetFromHelper(const nsTArray<nsCString>& command);
-+
-+};
-+
-+#endif //nsKDERegistry_h__
-diff -up firefox-96.0/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp.2~ firefox-96.0/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp
---- firefox-96.0/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp.2~	2022-01-06 16:57:48.000000000 +0100
-+++ firefox-96.0/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp	2022-01-10 21:34:48.661595265 +0100
-@@ -5,16 +5,19 @@
-  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- 
- #include "nsMIMEInfoUnix.h"
--#include "nsGNOMERegistry.h"
-+#include "nsCommonRegistry.h"
- #include "nsIGIOService.h"
- #include "nsNetCID.h"
- #include "nsIIOService.h"
- #ifdef MOZ_ENABLE_DBUS
- #  include "nsDBusHandlerApp.h"
- #endif
-+#if defined(XP_UNIX) && !defined(XP_MACOSX)
-+#include "nsKDEUtils.h"
-+#endif
- 
- nsresult nsMIMEInfoUnix::LoadUriInternal(nsIURI* aURI) {
--  return nsGNOMERegistry::LoadURL(aURI);
-+  return nsCommonRegistry::LoadURL(aURI);
- }
- 
- NS_IMETHODIMP
-@@ -27,15 +30,15 @@ nsMIMEInfoUnix::GetHasDefaultHandler(boo
-   *_retval = false;
- 
-   if (mClass == eProtocolInfo) {
--    *_retval = nsGNOMERegistry::HandlerExists(mSchemeOrType.get());
-+    *_retval = nsCommonRegistry::HandlerExists(mSchemeOrType.get());
-   } else {
-     RefPtr<nsMIMEInfoBase> mimeInfo =
--        nsGNOMERegistry::GetFromType(mSchemeOrType);
-+        nsCommonRegistry::GetFromType(mSchemeOrType);
-     if (!mimeInfo) {
-       nsAutoCString ext;
-       nsresult rv = GetPrimaryExtension(ext);
-       if (NS_SUCCEEDED(rv)) {
--        mimeInfo = nsGNOMERegistry::GetFromExtension(ext);
-+        mimeInfo = nsCommonRegistry::GetFromExtension(ext);
-       }
-     }
-     if (mimeInfo) *_retval = true;
-@@ -55,6 +58,23 @@ nsresult nsMIMEInfoUnix::LaunchDefaultWi
-   nsAutoCString nativePath;
-   aFile->GetNativePath(nativePath);
- 
-+  if( nsKDEUtils::kdeSupport()) {
-+    bool supports;
-+    if( NS_SUCCEEDED( GetHasDefaultHandler( &supports )) && supports ) {
-+      nsTArray<nsCString> command;
-+      command.AppendElement( "OPEN"_ns );
-+      command.AppendElement( nativePath );
-+      command.AppendElement( "MIMETYPE"_ns );
-+      command.AppendElement( mSchemeOrType );
-+      if( nsKDEUtils::command( command ))
-+        return NS_OK;
-+    }
-+    if (!mDefaultApplication)
-+      return NS_ERROR_FILE_NOT_FOUND;
-+
-+    return LaunchWithIProcess(mDefaultApplication, nativePath);
-+  }
-+
-   nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
-   if (!giovfs) {
-     return NS_ERROR_FAILURE;
-diff -up firefox-96.0/uriloader/exthandler/unix/nsOSHelperAppService.cpp.2~ firefox-96.0/uriloader/exthandler/unix/nsOSHelperAppService.cpp
---- firefox-96.0/uriloader/exthandler/unix/nsOSHelperAppService.cpp.2~	2022-01-06 16:57:36.000000000 +0100
-+++ firefox-96.0/uriloader/exthandler/unix/nsOSHelperAppService.cpp	2022-01-10 21:34:48.661595265 +0100
-@@ -10,7 +10,7 @@
- #include "nsOSHelperAppService.h"
- #include "nsMIMEInfoUnix.h"
- #ifdef MOZ_WIDGET_GTK
--#  include "nsGNOMERegistry.h"
-+#  include "nsCommonRegistry.h"
- #  ifdef MOZ_BUILD_APP_IS_BROWSER
- #    include "nsIToolkitShellService.h"
- #    include "nsIGNOMEShellService.h"
-@@ -1030,7 +1030,7 @@ nsresult nsOSHelperAppService::OSProtoco
-   if (!XRE_IsContentProcess()) {
- #ifdef MOZ_WIDGET_GTK
-     // Check the GNOME registry for a protocol handler
--    *aHandlerExists = nsGNOMERegistry::HandlerExists(aProtocolScheme);
-+    *aHandlerExists = nsCommonRegistry::HandlerExists(aProtocolScheme);
- #else
-     *aHandlerExists = false;
- #endif
-@@ -1050,7 +1050,7 @@ nsresult nsOSHelperAppService::OSProtoco
- NS_IMETHODIMP nsOSHelperAppService::GetApplicationDescription(
-     const nsACString& aScheme, nsAString& _retval) {
- #ifdef MOZ_WIDGET_GTK
--  nsGNOMERegistry::GetAppDescForScheme(aScheme, _retval);
-+  nsCommonRegistry::GetAppDescForScheme(aScheme, _retval);
-   return _retval.IsEmpty() ? NS_ERROR_NOT_AVAILABLE : NS_OK;
- #else
-   return NS_ERROR_NOT_AVAILABLE;
-@@ -1153,7 +1153,7 @@ already_AddRefed<nsMIMEInfoBase> nsOSHel
- #ifdef MOZ_WIDGET_GTK
-     LOG(("Looking in GNOME registry\n"));
-     RefPtr<nsMIMEInfoBase> gnomeInfo =
--        nsGNOMERegistry::GetFromExtension(aFileExt);
-+        nsCommonRegistry::GetFromExtension(aFileExt);
-     if (gnomeInfo) {
-       LOG(("Got MIMEInfo from GNOME registry\n"));
-       return gnomeInfo.forget();
-@@ -1266,7 +1266,7 @@ already_AddRefed<nsMIMEInfoBase> nsOSHel
- 
- #ifdef MOZ_WIDGET_GTK
-   if (handler.IsEmpty()) {
--    RefPtr<nsMIMEInfoBase> gnomeInfo = nsGNOMERegistry::GetFromType(aMIMEType);
-+    RefPtr<nsMIMEInfoBase> gnomeInfo = nsCommonRegistry::GetFromType(aMIMEType);
-     if (gnomeInfo) {
-       LOG(
-           ("Got MIMEInfo from GNOME registry without extensions; setting them "
-diff -up firefox-96.0/widget/gtk/moz.build.2~ firefox-96.0/widget/gtk/moz.build
---- firefox-96.0/widget/gtk/moz.build.2~	2022-01-06 19:33:05.000000000 +0100
-+++ firefox-96.0/widget/gtk/moz.build	2022-01-10 21:34:48.661595265 +0100
-@@ -140,6 +140,7 @@ LOCAL_INCLUDES += [
-     "/layout/xul",
-     "/other-licenses/atk-1.0",
-     "/third_party/cups/include",
-+    "/toolkit/xre",
-     "/widget",
-     "/widget/headless",
- ]
-diff -up firefox-96.0/widget/gtk/nsFilePicker.cpp.2~ firefox-96.0/widget/gtk/nsFilePicker.cpp
---- firefox-96.0/widget/gtk/nsFilePicker.cpp.2~	2022-01-06 19:33:05.000000000 +0100
-+++ firefox-96.0/widget/gtk/nsFilePicker.cpp	2022-01-10 21:34:48.661595265 +0100
-@@ -5,6 +5,7 @@
- 
- #include <dlfcn.h>
- #include <gtk/gtk.h>
-+#include <gdk/gdkx.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <unistd.h>
-@@ -27,6 +28,8 @@
- #include "WidgetUtilsGtk.h"
- 
- #include "nsFilePicker.h"
-+#include "nsKDEUtils.h"
-+#include "nsURLHelper.h"
- 
- #undef LOG
- #ifdef MOZ_LOGGING
-@@ -247,7 +250,9 @@ NS_IMETHODIMP
- nsFilePicker::AppendFilter(const nsAString& aTitle, const nsAString& aFilter) {
-   if (aFilter.EqualsLiteral("..apps")) {
-     // No platform specific thing we can do here, really....
--    return NS_OK;
-+    // Unless it's KDE.
-+    if( mMode != modeOpen || !nsKDEUtils::kdeSupport())
-+      return NS_OK;
-   }
- 
-   nsAutoCString filter, name;
-@@ -357,6 +362,29 @@ nsFilePicker::Open(nsIFilePickerShownCal
-   // Can't show two dialogs concurrently with the same filepicker
-   if (mRunning) return NS_ERROR_NOT_AVAILABLE;
- 
-+  // KDE file picker is not handled via callback
-+  if( nsKDEUtils::kdeSupport()) {
-+    mCallback = aCallback;
-+    mRunning = true;
-+    NS_ADDREF_THIS();
-+    g_idle_add([](gpointer data) -> gboolean {
-+      nsFilePicker* queuedPicker = (nsFilePicker*) data;
-+      int16_t result;
-+      queuedPicker->kdeFileDialog(&result);
-+      if (queuedPicker->mCallback) {
-+        queuedPicker->mCallback->Done(result);
-+        queuedPicker->mCallback = nullptr;
-+      } else {
-+        queuedPicker->mResult = result;
-+      }
-+      queuedPicker->mRunning = false;
-+      NS_RELEASE(queuedPicker);
-+      return G_SOURCE_REMOVE;
-+    }, this);
-+
-+    return NS_OK;
-+  }
-+
-   NS_ConvertUTF16toUTF8 title(mTitle);
- 
-   GtkWindow* parent_widget =
-@@ -586,6 +614,234 @@ void nsFilePicker::Done(void* file_choos
-   NS_RELEASE_THIS();
- }
- 
-+nsCString nsFilePicker::kdeMakeFilter( int index )
-+    {
-+    nsCString buf = mFilters[ index ];
-+    for( PRUint32 i = 0;
-+         i < buf.Length();
-+         ++i )
-+        if( buf[ i ] == ';' ) // KDE separates just using spaces
-+            buf.SetCharAt( ' ', i );
-+    if (!mFilterNames[index].IsEmpty())
-+        {
-+        buf += "|";
-+        buf += mFilterNames[index].get();
-+        }
-+    return buf;
-+    }
-+
-+static PRInt32 windowToXid( nsIWidget* widget )
-+    {
-+    GtkWindow *parent_widget = GTK_WINDOW(widget->GetNativeData(NS_NATIVE_SHELLWIDGET));
-+    GdkWindow* gdk_window = gtk_widget_get_window( gtk_widget_get_toplevel( GTK_WIDGET( parent_widget )));
-+    return GDK_WINDOW_XID( gdk_window );
-+    }
-+
-+NS_IMETHODIMP nsFilePicker::kdeFileDialog(PRInt16 *aReturn)
-+    {
-+    NS_ENSURE_ARG_POINTER(aReturn);
-+
-+    if( mMode == modeOpen && mFilters.Length() == 1 && mFilters[ 0 ].EqualsLiteral( "..apps" ))
-+        return kdeAppsDialog( aReturn );
-+
-+    nsCString title;
-+    title.Adopt(ToNewUTF8String(mTitle));
-+
-+    const char* arg = NULL;
-+    if( mAllowURLs )
-+        {
-+        switch( mMode )
-+            {
-+            case nsIFilePicker::modeOpen:
-+            case nsIFilePicker::modeOpenMultiple:
-+                arg = "GETOPENURL";
-+                break;
-+            case nsIFilePicker::modeSave:
-+                arg = "GETSAVEURL";
-+                break;
-+            case nsIFilePicker::modeGetFolder:
-+                arg = "GETDIRECTORYURL";
-+                break;
-+            }
-+        }
-+    else
-+        {
-+        switch( mMode )
-+            {
-+            case nsIFilePicker::modeOpen:
-+            case nsIFilePicker::modeOpenMultiple:
-+                arg = "GETOPENFILENAME";
-+                break;
-+            case nsIFilePicker::modeSave:
-+                arg = "GETSAVEFILENAME";
-+                break;
-+            case nsIFilePicker::modeGetFolder:
-+                arg = "GETDIRECTORYFILENAME";
-+                break;
-+            }
-+        }
-+
-+  nsAutoCString directory;
-+  if (mDisplayDirectory) {
-+    mDisplayDirectory->GetNativePath(directory);
-+  } else if (mPrevDisplayDirectory) {
-+    mPrevDisplayDirectory->GetNativePath(directory);
-+  }
-+
-+    nsAutoCString startdir;
-+  if (!directory.IsEmpty()) {
-+    startdir = directory;
-+  }
-+  if (mMode == nsIFilePicker::modeSave) {
-+    if( !startdir.IsEmpty())
-+      {
-+      startdir += "/";
-+      startdir += ToNewUTF8String(mDefault);
-+      }
-+    else
-+      startdir = ToNewUTF8String(mDefault);
-+  }
-+
-+    nsAutoCString filters;
-+    PRInt32 count = mFilters.Length();
-+    if( count == 0 ) //just in case
-+        filters = "*";
-+    else
-+        {
-+        filters = kdeMakeFilter( 0 );
-+        for (PRInt32 i = 1; i < count; ++i)
-+            {
-+            filters += "\n";
-+            filters += kdeMakeFilter( i );
-+            }
-+        }
-+
-+    nsTArray<nsCString> command;
-+    command.AppendElement( nsAutoCString( arg ));
-+    command.AppendElement( startdir );
-+    if( mMode != nsIFilePicker::modeGetFolder )
-+        {
-+        command.AppendElement( filters );
-+        nsAutoCString selected;
-+        selected.AppendInt( mSelectedType );
-+        command.AppendElement( selected );
-+        }
-+    command.AppendElement( title );
-+    if( mMode == nsIFilePicker::modeOpenMultiple )
-+        command.AppendElement( "MULTIPLE"_ns );
-+    if( PRInt32 xid = windowToXid( mParentWidget ))
-+        {
-+        command.AppendElement( "PARENT"_ns );
-+        nsAutoCString parent;
-+        parent.AppendInt( xid );
-+        command.AppendElement( parent );
-+        }
-+
-+    nsTArray<nsCString> output;
-+    if( nsKDEUtils::commandBlockUi( command, GTK_WINDOW(mParentWidget->GetNativeData(NS_NATIVE_SHELLWIDGET)), &output ))
-+        {
-+        *aReturn = nsIFilePicker::returnOK;
-+        mFiles.Clear();
-+        if( mMode != nsIFilePicker::modeGetFolder )
-+            {
-+            mSelectedType = atoi( output[ 0 ].get());
-+            output.RemoveElementAt( 0 );
-+            }
-+        if (mMode == nsIFilePicker::modeOpenMultiple)
-+            {
-+            mFileURL.Truncate();
-+            PRUint32 count = output.Length();
-+            for( PRUint32 i = 0;
-+                 i < count;
-+                 ++i )
-+                {
-+                nsCOMPtr<nsIFile> localfile;
-+                nsresult rv = NS_NewNativeLocalFile( output[ i ],
-+                                      PR_FALSE,
-+                                      getter_AddRefs(localfile));
-+                if (NS_SUCCEEDED(rv))
-+                    mFiles.AppendObject(localfile);
-+                }
-+            }
-+        else
-+            {
-+            if( output.Length() == 0 )
-+                mFileURL = nsCString();
-+            else if( mAllowURLs )
-+                mFileURL = output[ 0 ];
-+            else // GetFile() actually requires it to be url even for local files :-/
-+                {
-+                nsCOMPtr<nsIFile> localfile;
-+                nsresult rv = NS_NewNativeLocalFile( output[ 0 ],
-+                                   PR_FALSE,
-+                                   getter_AddRefs(localfile));
-+                if (NS_SUCCEEDED(rv))
-+                  rv = net_GetURLSpecFromActualFile(localfile, mFileURL);
-+                }
-+            }
-+  // Remember last used directory.
-+  nsCOMPtr<nsIFile> file;
-+  GetFile(getter_AddRefs(file));
-+  if (file) {
-+    nsCOMPtr<nsIFile> dir;
-+    file->GetParent(getter_AddRefs(dir));
-+    nsCOMPtr<nsIFile> localDir(do_QueryInterface(dir));
-+    if (localDir) {
-+      localDir.swap(mPrevDisplayDirectory);
-+    }
-+  }
-+        if (mMode == nsIFilePicker::modeSave)
-+            {
-+            nsCOMPtr<nsIFile> file;
-+            GetFile(getter_AddRefs(file));
-+            if (file)
-+                {
-+                bool exists = false;
-+                file->Exists(&exists);
-+                if (exists) // TODO do overwrite check in the helper app
-+                    *aReturn = nsIFilePicker::returnReplace;
-+                }
-+            }
-+        }
-+    else
-+        {
-+        *aReturn = nsIFilePicker::returnCancel;
-+        }
-+    return NS_OK;
-+    }
-+
-+
-+NS_IMETHODIMP nsFilePicker::kdeAppsDialog(PRInt16 *aReturn)
-+    {
-+    NS_ENSURE_ARG_POINTER(aReturn);
-+
-+    nsCString title;
-+    title.Adopt(ToNewUTF8String(mTitle));
-+
-+    nsTArray<nsCString> command;
-+    command.AppendElement( "APPSDIALOG"_ns );
-+    command.AppendElement( title );
-+    if( PRInt32 xid = windowToXid( mParentWidget ))
-+        {
-+        command.AppendElement( "PARENT"_ns );
-+        nsAutoCString parent;
-+        parent.AppendInt( xid );
-+        command.AppendElement( parent );
-+        }
-+
-+    nsTArray<nsCString> output;
-+    if( nsKDEUtils::commandBlockUi( command, GTK_WINDOW(mParentWidget->GetNativeData(NS_NATIVE_SHELLWIDGET)), &output ))
-+        {
-+        *aReturn = nsIFilePicker::returnOK;
-+        mFileURL = output.Length() > 0 ? output[ 0 ] : nsCString();
-+        }
-+    else
-+        {
-+        *aReturn = nsIFilePicker::returnCancel;
-+        }
-+    return NS_OK;
-+    }
-+
- // All below functions available as of GTK 3.20+
- void* nsFilePicker::GtkFileChooserNew(const gchar* title, GtkWindow* parent,
-                                       GtkFileChooserAction action,
-diff -up firefox-96.0/widget/gtk/nsFilePicker.h.2~ firefox-96.0/widget/gtk/nsFilePicker.h
---- firefox-96.0/widget/gtk/nsFilePicker.h.2~	2022-01-06 16:57:48.000000000 +0100
-+++ firefox-96.0/widget/gtk/nsFilePicker.h	2022-01-10 21:34:48.661595265 +0100
-@@ -72,6 +72,12 @@ class nsFilePicker : public nsBaseFilePi
-  private:
-   static nsIFile* mPrevDisplayDirectory;
- 
-+  bool kdeRunning();
-+  bool getKdeRunning();
-+  NS_IMETHODIMP kdeFileDialog(PRInt16 *aReturn);
-+  NS_IMETHODIMP kdeAppsDialog(PRInt16 *aReturn);
-+  nsCString kdeMakeFilter( int index );
-+
-   void* GtkFileChooserNew(const gchar* title, GtkWindow* parent,
-                           GtkFileChooserAction action,
-                           const gchar* accept_label);
-diff -up firefox-96.0/xpcom/components/ManifestParser.cpp.2~ firefox-96.0/xpcom/components/ManifestParser.cpp
---- firefox-96.0/xpcom/components/ManifestParser.cpp.2~	2022-01-06 16:58:15.000000000 +0100
-+++ firefox-96.0/xpcom/components/ManifestParser.cpp	2022-01-10 21:34:48.661595265 +0100
-@@ -43,6 +43,7 @@
- #include "nsIScriptError.h"
- #include "nsIXULAppInfo.h"
- #include "nsIXULRuntime.h"
-+#include "nsKDEUtils.h"
- 
- using namespace mozilla;
- 
-@@ -402,6 +403,7 @@ void ParseManifest(NSLocationType aType,
-   constexpr auto kOs = u"os"_ns;
-   constexpr auto kOsVersion = u"osversion"_ns;
-   constexpr auto kABI = u"abi"_ns;
-+  constexpr auto kDesktop = u"desktop"_ns;
-   constexpr auto kProcess = u"process"_ns;
- #if defined(MOZ_WIDGET_ANDROID)
-   constexpr auto kTablet = u"tablet"_ns;
-@@ -461,6 +463,7 @@ void ParseManifest(NSLocationType aType,
-   }
- 
-   nsAutoString osVersion;
-+  nsAutoString desktop;
- #if defined(XP_WIN)
- #  pragma warning(push)
- #  pragma warning(disable : 4996)  // VC12+ deprecates GetVersionEx
-@@ -469,14 +472,17 @@ void ParseManifest(NSLocationType aType,
-     nsTextFormatter::ssprintf(osVersion, u"%ld.%ld", info.dwMajorVersion,
-                               info.dwMinorVersion);
-   }
-+  desktop = u"win"_ns;
- #  pragma warning(pop)
- #elif defined(MOZ_WIDGET_COCOA)
-   SInt32 majorVersion = nsCocoaFeatures::macOSVersionMajor();
-   SInt32 minorVersion = nsCocoaFeatures::macOSVersionMinor();
-   nsTextFormatter::ssprintf(osVersion, u"%ld.%ld", majorVersion, minorVersion);
-+  desktop = u"macosx"_ns);
- #elif defined(MOZ_WIDGET_GTK)
-   nsTextFormatter::ssprintf(osVersion, u"%ld.%ld", gtk_major_version,
-                             gtk_minor_version);
-+  desktop = nsKDEUtils::kdeSession() ? u"kde"_ns : u"gnome"_ns;
- #elif defined(MOZ_WIDGET_ANDROID)
-   bool isTablet = false;
-   if (mozilla::AndroidBridge::Bridge()) {
-@@ -484,6 +490,7 @@ void ParseManifest(NSLocationType aType,
-         "android/os/Build$VERSION", "RELEASE", osVersion);
-     isTablet = java::GeckoAppShell::IsTablet();
-   }
-+  desktop = u"android"_ns;
- #endif
- 
-   if (XRE_IsContentProcess()) {
-@@ -588,6 +595,7 @@ void ParseManifest(NSLocationType aType,
-                                     : eUnspecified;
- #endif
-     int flags = 0;
-+    TriState stDesktop = eUnspecified;
- 
-     while ((token = nsCRT::strtok(whitespace, kWhitespace, &whitespace)) &&
-            ok) {
-@@ -597,6 +605,7 @@ void ParseManifest(NSLocationType aType,
-       if (CheckStringFlag(kApplication, wtoken, appID, stApp) ||
-           CheckOsFlag(kOs, wtoken, osTarget, stOs) ||
-           CheckStringFlag(kABI, wtoken, abi, stABI) ||
-+          CheckStringFlag(kDesktop, wtoken, desktop, stDesktop) ||
-           CheckStringFlag(kProcess, wtoken, process, stProcess) ||
-           CheckVersionFlag(kOsVersion, wtoken, osVersion, stOsVersion) ||
-           CheckVersionFlag(kAppVersion, wtoken, appVersion, stAppVersion) ||
-@@ -655,7 +664,7 @@ void ParseManifest(NSLocationType aType,
-     }
- 
-     if (!ok || stApp == eBad || stAppVersion == eBad ||
--        stGeckoVersion == eBad || stOs == eBad || stOsVersion == eBad ||
-+        stGeckoVersion == eBad || stOs == eBad || stOsVersion == eBad || stDesktop == eBad ||
- #ifdef MOZ_WIDGET_ANDROID
-         stTablet == eBad ||
- #endif
-diff -up firefox-96.0/xpcom/components/moz.build.2~ firefox-96.0/xpcom/components/moz.build
---- firefox-96.0/xpcom/components/moz.build.2~	2022-01-06 19:33:05.000000000 +0100
-+++ firefox-96.0/xpcom/components/moz.build	2022-01-10 21:34:48.661595265 +0100
-@@ -71,6 +71,7 @@ LOCAL_INCLUDES += [
-     "/js/xpconnect/loader",
-     "/layout/build",
-     "/modules/libjar",
-+    "/toolkit/xre",
- ]
- 
- if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
-diff -up firefox-96.0/xpcom/io/nsLocalFileUnix.cpp.2~ firefox-96.0/xpcom/io/nsLocalFileUnix.cpp
---- firefox-96.0/xpcom/io/nsLocalFileUnix.cpp.2~	2022-01-06 19:33:05.000000000 +0100
-+++ firefox-96.0/xpcom/io/nsLocalFileUnix.cpp	2022-01-10 21:34:48.661595265 +0100
-@@ -58,6 +58,7 @@
- 
- #ifdef MOZ_WIDGET_GTK
- #  include "nsIGIOService.h"
-+#  include "nsKDEUtils.h"
- #endif
- 
- #ifdef MOZ_WIDGET_COCOA
-@@ -2030,18 +2031,16 @@ nsLocalFile::Reveal() {
-   }
- 
- #ifdef MOZ_WIDGET_GTK
--  nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
--  if (!giovfs) {
--    return NS_ERROR_FAILURE;
--  }
-+  nsAutoCString url;
- 
-   bool isDirectory;
-   if (NS_FAILED(IsDirectory(&isDirectory))) {
-     return NS_ERROR_FAILURE;
-   }
- 
-+  nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
-   if (isDirectory) {
--    return giovfs->ShowURIForInput(mPath);
-+    url = mPath;
-   }
-   if (NS_SUCCEEDED(giovfs->OrgFreedesktopFileManager1ShowItems(mPath))) {
-     return NS_OK;
-@@ -2055,7 +2054,7 @@ nsLocalFile::Reveal() {
-     return NS_ERROR_FAILURE;
-   }
- 
--  return giovfs->ShowURIForInput(dirPath);
-+  url = dirPath;
- #elif defined(MOZ_WIDGET_COCOA)
-   CFURLRef url;
-   if (NS_SUCCEEDED(GetCFURL(&url))) {
-@@ -2067,6 +2066,17 @@ nsLocalFile::Reveal() {
- #else
-   return NS_ERROR_FAILURE;
- #endif
-+  if(nsKDEUtils::kdeSupport()) {
-+    nsTArray<nsCString> command;
-+    command.AppendElement( "REVEAL"_ns );
-+    command.AppendElement( mPath );
-+    return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE;
-+  }
-+
-+  if (!giovfs)
-+    return NS_ERROR_FAILURE;
-+
-+  return giovfs->ShowURIForInput(url);
- }
- 
- NS_IMETHODIMP
-@@ -2076,6 +2086,12 @@ nsLocalFile::Launch() {
-   }
- 
- #ifdef MOZ_WIDGET_GTK
-+  if( nsKDEUtils::kdeSupport()) {
-+    nsTArray<nsCString> command;
-+    command.AppendElement( "OPEN"_ns );
-+    command.AppendElement( mPath );
-+    return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE;
-+  }
-   nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
-   if (!giovfs) {
-     return NS_ERROR_FAILURE;
diff --git a/mozilla-93.0-kde.patch b/mozilla-99.0-kde.patch
similarity index 97%
rename from mozilla-93.0-kde.patch
rename to mozilla-99.0-kde.patch
index 32e7fe4..5671dcc 100644
--- a/mozilla-93.0-kde.patch
+++ b/mozilla-99.0-kde.patch
@@ -3,7 +3,7 @@
 # Date 1559294891 -7200
 #      Fri May 31 11:28:11 2019 +0200
 # Node ID c2aa7198fb925e7fde96abf65b6f68b9b755f112
-# Parent  0dd1b6436342922d434e7c818875b2a02a73b5ed
+# Parent  8d1110b6918acc4e7d3f655d1e55f4b4ff630abe
 Description: Add KDE integration to Firefox (toolkit parts)
 Author: Wolfgang Rosenauer <wolfgang@rosenauer.org>
 Author: Lubos Lunak <lunak@suse.com>
@@ -147,7 +147,7 @@ diff --git a/python/mozbuild/mozpack/chrome/manifest.py b/python/mozbuild/mozpac
 diff --git a/toolkit/components/downloads/moz.build b/toolkit/components/downloads/moz.build
 --- a/toolkit/components/downloads/moz.build
 +++ b/toolkit/components/downloads/moz.build
-@@ -45,10 +45,14 @@ XPCOM_MANIFESTS += [
+@@ -46,10 +46,14 @@ XPCOM_MANIFESTS += [
  
  if CONFIG["MOZ_PLACES"]:
      EXTRA_JS_MODULES += [
@@ -165,7 +165,7 @@ diff --git a/toolkit/components/downloads/moz.build b/toolkit/components/downloa
 diff --git a/toolkit/mozapps/downloads/HelperAppDlg.jsm b/toolkit/mozapps/downloads/HelperAppDlg.jsm
 --- a/toolkit/mozapps/downloads/HelperAppDlg.jsm
 +++ b/toolkit/mozapps/downloads/HelperAppDlg.jsm
-@@ -1231,36 +1231,66 @@ nsUnknownContentTypeDialog.prototype = {
+@@ -1252,36 +1252,66 @@ nsUnknownContentTypeDialog.prototype = {
          params.handlerApp &&
          params.handlerApp.executable &&
          params.handlerApp.executable.isFile()
@@ -346,7 +346,7 @@ diff --git a/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp b/toolkit/sy
 diff --git a/toolkit/xre/moz.build b/toolkit/xre/moz.build
 --- a/toolkit/xre/moz.build
 +++ b/toolkit/xre/moz.build
-@@ -91,17 +91,19 @@ elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "co
+@@ -92,17 +92,19 @@ elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "co
          "../components/printingui",
      ]
  elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "uikit":
@@ -360,17 +360,17 @@ diff --git a/toolkit/xre/moz.build b/toolkit/xre/moz.build
 +        "nsKDEUtils.cpp",
          "nsNativeAppSupportUnix.cpp",
      ]
+     CXXFLAGS += CONFIG["MOZ_X11_SM_CFLAGS"]
  else:
      UNIFIED_SOURCES += [
          "nsNativeAppSupportDefault.cpp",
      ]
  
- if CONFIG["MOZ_HAS_REMOTE"]:
 diff --git a/toolkit/xre/nsKDEUtils.cpp b/toolkit/xre/nsKDEUtils.cpp
 new file mode 100644
 --- /dev/null
 +++ b/toolkit/xre/nsKDEUtils.cpp
-@@ -0,0 +1,344 @@
+@@ -0,0 +1,321 @@
 +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
 +/* 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
@@ -410,36 +410,13 @@ new file mode 100644
 +#define MAKE_STR( n ) MAKE_STR2( n )
 +
 +static bool getKdeSession()
++{
++    if (PR_GetEnv("KDE_FULL_SESSION"))
 +    {
-+    Display* dpy = XOpenDisplay( NULL );
-+    if( dpy == NULL )
-+        return false;
-+    Atom kde_full_session = XInternAtom( dpy, "KDE_FULL_SESSION", true );
-+    bool kde = false;
-+    if( kde_full_session != None )
-+        {
-+        int cnt;
-+        if( Atom* props = XListProperties( dpy, DefaultRootWindow( dpy ), &cnt ))
-+            {
-+            for( int i = 0;
-+                 i < cnt;
-+                 ++i )
-+                {
-+                if( props[ i ] == kde_full_session )
-+                    {
-+                    kde = true;
-+#ifdef DEBUG_KDE
-+                    fprintf( stderr, "KDE SESSION %d\n", kde );
-+#endif
-+                    break;
-+                    }
-+                }
-+            XFree( props );
-+            }
-+        }
-+    XCloseDisplay( dpy );
-+    return kde;
++      return true;
 +    }
++    return false;
++}
 +
 +static bool getKdeSupport()
 +    {
@@ -831,12 +808,12 @@ diff --git a/uriloader/exthandler/HandlerServiceParent.cpp b/uriloader/exthandle
 diff --git a/uriloader/exthandler/moz.build b/uriloader/exthandler/moz.build
 --- a/uriloader/exthandler/moz.build
 +++ b/uriloader/exthandler/moz.build
-@@ -80,17 +80,19 @@ else:
+@@ -78,17 +78,19 @@ elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "ui
+ else:
+     # These files can't be built in unified mode because they redefine LOG.
      SOURCES += [
          osdir + "/nsOSHelperAppService.cpp",
      ]
-     if CONFIG["CC_TYPE"] in ("clang", "gcc"):
-         CXXFLAGS += ["-Wno-error=shadow"]
  
  if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
      UNIFIED_SOURCES += [
@@ -851,7 +828,7 @@ diff --git a/uriloader/exthandler/moz.build b/uriloader/exthandler/moz.build
      ]
  elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "windows":
      UNIFIED_SOURCES += [
-@@ -128,16 +130,17 @@ include("/ipc/chromium/chromium-config.m
+@@ -126,16 +128,17 @@ include("/ipc/chromium/chromium-config.m
  FINAL_LIBRARY = "xul"
  
  LOCAL_INCLUDES += [
@@ -864,11 +841,11 @@ diff --git a/uriloader/exthandler/moz.build b/uriloader/exthandler/moz.build
  ]
  
  if CONFIG["MOZ_ENABLE_DBUS"]:
-     CXXFLAGS += CONFIG["TK_CFLAGS"]
      CXXFLAGS += CONFIG["MOZ_DBUS_CFLAGS"]
  
  if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
-     CXXFLAGS += CONFIG["TK_CFLAGS"]
+     CXXFLAGS += CONFIG["MOZ_GTK3_CFLAGS"]
+     CXXFLAGS += CONFIG["MOZ_DBUS_GLIB_CFLAGS"]
 diff --git a/uriloader/exthandler/unix/nsCommonRegistry.cpp b/uriloader/exthandler/unix/nsCommonRegistry.cpp
 new file mode 100644
 --- /dev/null
@@ -964,12 +941,13 @@ diff --git a/uriloader/exthandler/unix/nsKDERegistry.cpp b/uriloader/exthandler/
 new file mode 100644
 --- /dev/null
 +++ b/uriloader/exthandler/unix/nsKDERegistry.cpp
-@@ -0,0 +1,86 @@
+@@ -0,0 +1,89 @@
 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 +/* 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 "mozilla/StaticPrefs_browser.h"
 +#include "nsKDERegistry.h"
 +#include "prlink.h"
 +#include "prmem.h"
@@ -1045,8 +1023,10 @@ new file mode 100644
 +        nsCString description = output[ 1 ];
 +        mimeInfo->SetDescription(NS_ConvertUTF8toUTF16(description));
 +        nsCString handlerAppName = output[ 2 ];
++        mozilla::StaticPrefs::browser_download_improvements_to_download_panel()
++            ? mimeInfo->SetPreferredAction(nsIMIMEInfo::saveToDisk)
++            : mimeInfo->SetPreferredAction(nsIMIMEInfo::useSystemDefault);
 +        mimeInfo->SetDefaultDescription(NS_ConvertUTF8toUTF16(handlerAppName));
-+        mimeInfo->SetPreferredAction(nsIMIMEInfo::useSystemDefault);
 +        return mimeInfo.forget();
 +        }
 +    return nullptr;
@@ -1283,7 +1263,7 @@ diff --git a/uriloader/exthandler/unix/nsOSHelperAppService.cpp b/uriloader/exth
 diff --git a/widget/gtk/moz.build b/widget/gtk/moz.build
 --- a/widget/gtk/moz.build
 +++ b/widget/gtk/moz.build
-@@ -137,16 +137,17 @@ FINAL_LIBRARY = "xul"
+@@ -136,16 +136,17 @@ FINAL_LIBRARY = "xul"
  
  LOCAL_INCLUDES += [
      "/layout/base",
@@ -1340,7 +1320,7 @@ diff --git a/widget/gtk/nsFilePicker.cpp b/widget/gtk/nsFilePicker.cpp
  #  include "Units.h"
  extern mozilla::LazyLogModule gWidgetLog;
  #  define LOG(args) MOZ_LOG(gWidgetLog, mozilla::LogLevel::Debug, args)
-@@ -242,17 +245,19 @@ nsFilePicker::AppendFilters(int32_t aFil
+@@ -236,17 +239,19 @@ nsFilePicker::AppendFilters(int32_t aFil
    mAllowURLs = !!(aFilterMask & filterAllowURLs);
    return nsBaseFilePicker::AppendFilters(aFilterMask);
  }
@@ -1361,7 +1341,7 @@ diff --git a/widget/gtk/nsFilePicker.cpp b/widget/gtk/nsFilePicker.cpp
  
    mFilters.AppendElement(filter);
    mFilterNames.AppendElement(name);
-@@ -352,16 +357,39 @@ nsresult nsFilePicker::Show(int16_t* aRe
+@@ -346,16 +351,39 @@ nsresult nsFilePicker::Show(int16_t* aRe
    return NS_OK;
  }
  
@@ -1401,7 +1381,7 @@ diff --git a/widget/gtk/nsFilePicker.cpp b/widget/gtk/nsFilePicker.cpp
    GtkFileChooserAction action = GetGtkFileChooserAction(mMode);
  
    const gchar* accept_button;
-@@ -581,16 +609,244 @@ void nsFilePicker::Done(void* file_choos
+@@ -575,16 +603,244 @@ void nsFilePicker::Done(void* file_choos
      mCallback->Done(result);
      mCallback = nullptr;
    } else {
@@ -1819,7 +1799,7 @@ diff --git a/xpcom/components/moz.build b/xpcom/components/moz.build
  ]
  
  if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
-     CXXFLAGS += CONFIG["TK_CFLAGS"]
+     CXXFLAGS += CONFIG["MOZ_GTK3_CFLAGS"]
      if CONFIG["MOZ_ENABLE_DBUS"]:
          CXXFLAGS += CONFIG["MOZ_DBUS_GLIB_CFLAGS"]
  
@@ -1827,7 +1807,7 @@ diff --git a/xpcom/components/moz.build b/xpcom/components/moz.build
 diff --git a/xpcom/io/nsLocalFileUnix.cpp b/xpcom/io/nsLocalFileUnix.cpp
 --- a/xpcom/io/nsLocalFileUnix.cpp
 +++ b/xpcom/io/nsLocalFileUnix.cpp
-@@ -53,16 +53,17 @@
+@@ -54,16 +54,17 @@
  #include "prproces.h"
  #include "nsIDirectoryEnumerator.h"
  #include "nsSimpleEnumerator.h"
@@ -1845,7 +1825,7 @@ diff --git a/xpcom/io/nsLocalFileUnix.cpp b/xpcom/io/nsLocalFileUnix.cpp
  #  include "prmem.h"
  #  include "plbase64.h"
  
-@@ -2023,62 +2024,77 @@ nsLocalFile::SetPersistentDescriptor(con
+@@ -2071,62 +2072,77 @@ nsLocalFile::SetPersistentDescriptor(con
  
  NS_IMETHODIMP
  nsLocalFile::Reveal() {
Not Available

benbullard79 [@T] cox.netNo Comment.691d 04hrs
benbullard79 [@T] cox.netNo Comment.691d 04hrs