firefox 59.0-1 (x86_64;i586) 2018-4164
-9997

Status rejected
Submitter cris [@T] beebgames.com
Platform 3.0
Repository main
URL https://abf.openmandriva.org/build_lists/155398
Packages
firefox-59.0-1.x86_64.binary
firefox-59.0-1.x86_64.source
firefox-af-59.0-1.x86_64.binary
firefox-ar-59.0-1.x86_64.binary
firefox-as-59.0-1.x86_64.binary
firefox-ast-59.0-1.x86_64.binary
firefox-bg-59.0-1.x86_64.binary
firefox-bn_BD-59.0-1.x86_64.binary
firefox-bn_IN-59.0-1.x86_64.binary
firefox-br-59.0-1.x86_64.binary
firefox-bs-59.0-1.x86_64.binary
firefox-ca-59.0-1.x86_64.binary
firefox-cs-59.0-1.x86_64.binary
firefox-cy-59.0-1.x86_64.binary
firefox-da-59.0-1.x86_64.binary
firefox-de-59.0-1.x86_64.binary
firefox-devel-59.0-1.x86_64.binary
firefox-el-59.0-1.x86_64.binary
firefox-en_GB-59.0-1.x86_64.binary
firefox-en_ZA-59.0-1.x86_64.binary
firefox-eo-59.0-1.x86_64.binary
firefox-es_AR-59.0-1.x86_64.binary
firefox-es_CL-59.0-1.x86_64.binary
firefox-es_ES-59.0-1.x86_64.binary
firefox-es_MX-59.0-1.x86_64.binary
firefox-et-59.0-1.x86_64.binary
firefox-eu-59.0-1.x86_64.binary
firefox-fa-59.0-1.x86_64.binary
firefox-fi-59.0-1.x86_64.binary
firefox-fr-59.0-1.x86_64.binary
firefox-fy-59.0-1.x86_64.binary
firefox-ga_IE-59.0-1.x86_64.binary
firefox-gd-59.0-1.x86_64.binary
firefox-gl-59.0-1.x86_64.binary
firefox-gu_IN-59.0-1.x86_64.binary
firefox-he-59.0-1.x86_64.binary
firefox-hi-59.0-1.x86_64.binary
firefox-hr-59.0-1.x86_64.binary
firefox-hu-59.0-1.x86_64.binary
firefox-hy-59.0-1.x86_64.binary
firefox-id-59.0-1.x86_64.binary
firefox-is-59.0-1.x86_64.binary
firefox-it-59.0-1.x86_64.binary
firefox-ja-59.0-1.x86_64.binary
firefox-kk-59.0-1.x86_64.binary
firefox-km-59.0-1.x86_64.binary
firefox-kn-59.0-1.x86_64.binary
firefox-ko-59.0-1.x86_64.binary
firefox-lt-59.0-1.x86_64.binary
firefox-lv-59.0-1.x86_64.binary
firefox-mai-59.0-1.x86_64.binary
firefox-mk-59.0-1.x86_64.binary
firefox-ml-59.0-1.x86_64.binary
firefox-mr-59.0-1.x86_64.binary
firefox-nb_NO-59.0-1.x86_64.binary
firefox-nl-59.0-1.x86_64.binary
firefox-nn_NO-59.0-1.x86_64.binary
firefox-or-59.0-1.x86_64.binary
firefox-pa_IN-59.0-1.x86_64.binary
firefox-pl-59.0-1.x86_64.binary
firefox-pt_BR-59.0-1.x86_64.binary
firefox-pt_PT-59.0-1.x86_64.binary
firefox-ro-59.0-1.x86_64.binary
firefox-ru-59.0-1.x86_64.binary
firefox-si-59.0-1.x86_64.binary
firefox-sk-59.0-1.x86_64.binary
firefox-sl-59.0-1.x86_64.binary
firefox-sq-59.0-1.x86_64.binary
firefox-sr-59.0-1.x86_64.binary
firefox-sv_SE-59.0-1.x86_64.binary
firefox-ta-59.0-1.x86_64.binary
firefox-te-59.0-1.x86_64.binary
firefox-th-59.0-1.x86_64.binary
firefox-tr-59.0-1.x86_64.binary
firefox-uk-59.0-1.x86_64.binary
firefox-vi-59.0-1.x86_64.binary
firefox-zh_CN-59.0-1.x86_64.binary
firefox-zh_TW-59.0-1.x86_64.binary
firefox-59.0-1.i586.binary
firefox-59.0-1.i586.source
firefox-af-59.0-1.i586.binary
firefox-ar-59.0-1.i586.binary
firefox-as-59.0-1.i586.binary
firefox-ast-59.0-1.i586.binary
firefox-bg-59.0-1.i586.binary
firefox-bn_BD-59.0-1.i586.binary
firefox-bn_IN-59.0-1.i586.binary
firefox-br-59.0-1.i586.binary
firefox-bs-59.0-1.i586.binary
firefox-ca-59.0-1.i586.binary
firefox-cs-59.0-1.i586.binary
firefox-cy-59.0-1.i586.binary
firefox-da-59.0-1.i586.binary
firefox-de-59.0-1.i586.binary
firefox-devel-59.0-1.i586.binary
firefox-el-59.0-1.i586.binary
firefox-en_GB-59.0-1.i586.binary
firefox-en_ZA-59.0-1.i586.binary
firefox-eo-59.0-1.i586.binary
firefox-es_AR-59.0-1.i586.binary
firefox-es_CL-59.0-1.i586.binary
firefox-es_ES-59.0-1.i586.binary
firefox-es_MX-59.0-1.i586.binary
firefox-et-59.0-1.i586.binary
firefox-eu-59.0-1.i586.binary
firefox-fa-59.0-1.i586.binary
firefox-fi-59.0-1.i586.binary
firefox-fr-59.0-1.i586.binary
firefox-fy-59.0-1.i586.binary
firefox-ga_IE-59.0-1.i586.binary
firefox-gd-59.0-1.i586.binary
firefox-gl-59.0-1.i586.binary
firefox-gu_IN-59.0-1.i586.binary
firefox-he-59.0-1.i586.binary
firefox-hi-59.0-1.i586.binary
firefox-hr-59.0-1.i586.binary
firefox-hu-59.0-1.i586.binary
firefox-hy-59.0-1.i586.binary
firefox-id-59.0-1.i586.binary
firefox-is-59.0-1.i586.binary
firefox-it-59.0-1.i586.binary
firefox-ja-59.0-1.i586.binary
firefox-kk-59.0-1.i586.binary
firefox-km-59.0-1.i586.binary
firefox-kn-59.0-1.i586.binary
firefox-ko-59.0-1.i586.binary
firefox-lt-59.0-1.i586.binary
firefox-lv-59.0-1.i586.binary
firefox-mai-59.0-1.i586.binary
firefox-mk-59.0-1.i586.binary
firefox-ml-59.0-1.i586.binary
firefox-mr-59.0-1.i586.binary
firefox-nb_NO-59.0-1.i586.binary
firefox-nl-59.0-1.i586.binary
firefox-nn_NO-59.0-1.i586.binary
firefox-or-59.0-1.i586.binary
firefox-pa_IN-59.0-1.i586.binary
firefox-pl-59.0-1.i586.binary
firefox-pt_BR-59.0-1.i586.binary
firefox-pt_PT-59.0-1.i586.binary
firefox-ro-59.0-1.i586.binary
firefox-ru-59.0-1.i586.binary
firefox-si-59.0-1.i586.binary
firefox-sk-59.0-1.i586.binary
firefox-sl-59.0-1.i586.binary
firefox-sq-59.0-1.i586.binary
firefox-sr-59.0-1.i586.binary
firefox-sv_SE-59.0-1.i586.binary
firefox-ta-59.0-1.i586.binary
firefox-te-59.0-1.i586.binary
firefox-th-59.0-1.i586.binary
firefox-tr-59.0-1.i586.binary
firefox-uk-59.0-1.i586.binary
firefox-vi-59.0-1.i586.binary
firefox-zh_CN-59.0-1.i586.binary
firefox-zh_TW-59.0-1.i586.binary
Build Date 2018-03-14 09:47:47 +0000 UTC
Last Updated 2018-03-18 11:56:38.267033179 +0000 UTC
$ git diff --patch-with-stat --summary 1c7c09a448f35e7120de62f4fd5d5ec4d1e9c257..fcd046735a60369795756afd5b86aafdb9b59cf6

 .abf.yml                                         |  152 +-
 firefox-58.0-kde.patch => firefox-59.0-kde.patch |   64 +-
 firefox.spec                                     |   22 +-
 mozilla-58.0-kde.patch => mozilla-59.0-kde.patch | 1834 +++-------------------
 4 files changed, 308 insertions(+), 1764 deletions(-)
 rename firefox-58.0-kde.patch => firefox-59.0-kde.patch (98%)
 rename mozilla-58.0-kde.patch => mozilla-59.0-kde.patch (57%)

diff --git a/.abf.yml b/.abf.yml
index 8126c6b..3c79ad2 100644
--- a/.abf.yml
+++ b/.abf.yml
@@ -1,78 +1,78 @@
 sources:
-  af.xpi: 1361bf2a9c4e3cca18b652032fa3f6fac874a42c
-  ar.xpi: 4ba80a8109603d1a2fa9ff881fbf2ef27722f17c
-  as.xpi: cedab81cace82e6880f0f217c24f7e30433ad79e
-  ast.xpi: babee025abff9e0a2800d1938860e2b16afc506a
+  af.xpi: ad516a4ebd8876e6fb65125d51ab0e5dd72f9515
+  ar.xpi: dde778b5c744814fc4666e69677ca168a405ecc9
+  as.xpi: fa6ef92d975a1d77ba6fdde5fabcfc434db732e1
+  ast.xpi: fdca45d4c85182e8a3957fb9f27090457441a862
   autoconf-2.13.tar.gz: e4826c8bd85325067818f19b2b2ad2b625da66fc
-  bg.xpi: 1be93af63b23dd0cdd9cacb47cf5d05c00c7efca
-  bn-BD.xpi: 6b974688d46453692967cad0a5fcc64b16f78931
-  bn-IN.xpi: 376c7f0255c61e86f62488a06fe45faefa7c4534
-  br.xpi: b29e0ae590183d6803bf2c5e3cd07f4d1f43c8d4
-  bs.xpi: 52f68914042d1f67367209551f70a4b4bee16dc8
-  ca.xpi: 5623dc4517d6f442d656824807aa54caad0c09ad
-  cs.xpi: 81299eb35adb63d3d3f46fc21bf2e057d02d4a58
-  cy.xpi: 620edf6c56d881049115c51182049e5f77fcbd46
-  da.xpi: 7cc6e64efe6f71e457b50edd8757ada691b9e1e4
-  de.xpi: a5ab4ad1eb4db2068538fb253cf9783afaf1783f
-  el.xpi: 83c1656c032cdbe7b821088215040d7ebf458796
-  en-GB.xpi: 0279c53f5e53cfab4e87fae9f428599a330c5598
-  en-ZA.xpi: 336160a04438d9ad8fdac3e392c4a7b890b31c45
-  eo.xpi: 250547d744800ab557c15eb7b63ec3cb13d2050b
-  es-AR.xpi: 984896243d78526b9d5998437f6a768e51516311
-  es-CL.xpi: 7bec7d7f9523a2b174526fc87c6467ee2b430cbb
-  es-ES.xpi: 6d6f86c0efe7d580b9bc17038e4015333ab1d9d3
-  es-MX.xpi: edbbb3d289993f0192352da673526e29bfdeaad5
-  et.xpi: 38d22e17b5b79b856bb5a1be63401f1207fc5c3b
-  eu.xpi: d96ff928da651ac8ae6c0146119b241c9efac7da
-  fa.xpi: 2cc8a34495372803b3bef693f8c228d1acd8bc99
-  fi.xpi: ee0d9805be62045be61341cf1c1551edab88a26e
-  firefox-58.0.1.source.tar.xz: 33dde117cef998eadb8fe53e2d045ae8dd27c8bf
-  fr.xpi: dbc61ae2a4a00ebbb29ed87485e6f4351ede394e
-  fy-NL.xpi: ff3846c8549bd2cf74fa150dfde6eed60f2717a3
-  ga-IE.xpi: ab4a4c13045ad631facdd94bb1f04840fa335d89
-  gd.xpi: 84c18b243a5bd624c5bb6e0057a5e30fd9d90ac8
-  gl.xpi: ba7d471cdeba2e85ff070e6e2372c86156cb3e1e
-  gu-IN.xpi: ac3e7a372d4c0633a69b48425af81d040ad878cd
-  he.xpi: 0c955db3655d567e7f0d207d5bfca155d38885b9
-  hi-IN.xpi: d9fd6d194e71c7075fc488db6d8f9bd5590af625
-  hr.xpi: ca2cfcfed3801ef45b6779f181225a28de824847
-  hu.xpi: 87dced4bbab9f1bff499271c59a3e16806d796bc
-  hy-AM.xpi: 556614c6f63936390cfc6a2f5e7e40495f4cb198
-  id.xpi: 103241b7d7e7c95a26e25efa65896bd8d8e17e98
-  is.xpi: 494d50c358151f9c458033981afbe3223953a351
-  it.xpi: ccc25fe03f16697dbe3c219f222e59515892fe34
-  ja.xpi: 1168e8b507e5e99e706650193b5cadb43a01f82a
-  kk.xpi: 4961eaaf18b5a029c2160ccddcac7cccd0529186
-  km.xpi: cee62fc618dce992ced4976d76b89e9fe4eb879a
-  kn.xpi: 0ccd53e77b3542a74713c364b7630f080a89aca8
-  ko.xpi: 0c2ebb43a1cab8614a7129f005fcff8ebff0b5f4
-  lt.xpi: a9f633e86ace8703691d835cf166e118d870c761
-  lv.xpi: 8563a6b16078609b31e8cbd0ff06d901c572acd2
-  mai.xpi: 1681e8b887aa85d2d2efd65204622eb945b924ed
-  mk.xpi: cd1064471ded6802521774efff96e8253971703c
-  ml.xpi: 08c6606922cf65f045f69ed4d2e8960d1af76b9a
-  mr.xpi: 29889575de7cd29fda4bcaf973834054812cf23b
-  nb-NO.xpi: bec010e6e8fd182acccb8213f8e7723eb186bf93
-  nl.xpi: 011ab6908e4ccbeb764a8ba013efedd0c4f2a8b8
-  nn-NO.xpi: 58976028eeb091317d4962b467b3a732ebe38921
-  or.xpi: 4c62852e224d424e99c091240cc8a73d49037b53
-  pa-IN.xpi: 3e4cf6c91149109f90506a30c6699637b6d309c7
-  pl.xpi: 3ebb592680e8cee823e622fc82608b36a56bc873
-  pt-BR.xpi: 92a2ff774c4fa0333cfca94d5e9defcc689ff87c
-  pt-PT.xpi: 268029c5b52e616f95900719c5800d2ed6ac573f
-  ro.xpi: 04b0e197865f2319ffefbe9d5f3a01123eaa7b24
-  ru.xpi: d7b7d9acf234d3226c6403846e0f6cc93c8ff502
-  si.xpi: 8b5f37d387ca23cc47f1cc9f70ade74727d9e68d
-  sk.xpi: 0fe9cc017c6ceaee1f4b7fe76a1c3c28b70792f3
-  sl.xpi: 7151f65f53406749e20df1f06561bd9f55791150
-  sq.xpi: ce98c2986ea6db97e965aee2620797292beda170
-  sr.xpi: 6dca1e11968c6e3ca7c09ba576bb23ddee4b7772
-  sv-SE.xpi: b05db577c30c2017ebb29726573d5442355353fb
-  ta.xpi: 50415b0a700c7b726ac6b139d5afbc4c6e69c68f
-  te.xpi: 224f5060045bb64f36149332b4672c418143e1a5
-  th.xpi: 5170dc0d1db0a2e876dbdcadc1b32f00347902b6
-  tr.xpi: 971a62e65cf4cf44be56f8cf788c1d7249bdfbdd
-  uk.xpi: acecf26fbb4e22104a9accbc61e4165d1d78ebec
-  vi.xpi: ae28fb3564da54556e77d733c3e5a378fcf66685
-  zh-CN.xpi: 00b467e94ef9bf5d86a0fa0ab1d602d6d359e3a7
-  zh-TW.xpi: a1b6575ee8fa417ead5f7546b67aa83e373dc065
+  bg.xpi: 423062a20d4ae4a201707e24a894bd6d51318c71
+  bn-BD.xpi: 0949d527bd4d0a596283bceae3177ba0600a14a6
+  bn-IN.xpi: 0e8a02132ff406cca2c79c05a7458d7d82caa1f1
+  br.xpi: 683094cdcf53aaffa9b903fa34f3fef60eee95c4
+  bs.xpi: 14c276171b75f109cfb3f56eceb4851f8030f4d6
+  c61f5f5ead48c78a80c80db5c489bdc7cfaf8175.tar.bz2: 037b9444fb87484a65b2a0123a2f87c90fdfa93b
+  ca.xpi: 4ad4769323d5ca0d7b7143122ca3c002610981d5
+  cs.xpi: 5e0929f0cfebc063278ac13c1d983c8ec90f6e5d
+  cy.xpi: a4a686ca43110a69b92b7345a10ef46681b6d2e7
+  da.xpi: e7181cfff0b382735749d38e84192b901866f223
+  de.xpi: f9882b3d6849946359c9267ba2733530c28159c1
+  el.xpi: bbef2797ba3cddd6de1864fae7f8a84da674c54f
+  en-GB.xpi: 3c999d4275189ac2a951e90a8fcd0a3b14fd52b6
+  en-ZA.xpi: f914602d4244c4189dd02637c229f10c9114881e
+  eo.xpi: d8506bc792cfb72bec34f8f6ae87ea09d08137e0
+  es-AR.xpi: 4110d2e714192858e56e575dcb179bc19cfd5a70
+  es-CL.xpi: 7928db24a7ea36ca3b9530de29ba6f2bcbf562c2
+  es-ES.xpi: 0ea8c312cf7af93ce4b9267b829153de315063e6
+  es-MX.xpi: 1372f4c1e154477149886d47fe0973ce7a2f07e1
+  et.xpi: e3de87910bd4a5cf0124eb0e87ffe5cd2f14a4c1
+  eu.xpi: 40fa3fb9d9625a661bf2358d5aca5b61ef4c8baa
+  fa.xpi: b7127aec9282aa2465e2a9be706483961930a2b7
+  fi.xpi: 4af5e84875798d0a05a0a7f6e44c5d54ec6eff91
+  fr.xpi: f72047e9823efca7c7ba2cc68c87cc8cf64858b6
+  fy-NL.xpi: 34517c197be8690eb6c8d55524a9e2f4779083d2
+  ga-IE.xpi: fcc9b971c4204fa5f0c6b3f63b1e5d0c9f49981a
+  gd.xpi: 1ad2fa65074cdd0e14408b2d0c7cc65d41605853
+  gl.xpi: 839bbab71b9872e1901fc25a7630d89062804b88
+  gu-IN.xpi: 73ccd9fb12a50cca8a205c4c6743330eaf91fd03
+  he.xpi: bb2f09b7a29f99ebe1b464d63531a579d2456f35
+  hi-IN.xpi: b6d8139b016e86b3f06775a6ab83312d1a7ed89c
+  hr.xpi: cff5494b86fc8bc1a2f7ea1aeb1c74e7bd0756da
+  hu.xpi: 06293ea7d168725509b9f00fadc82e744929ab4e
+  hy-AM.xpi: e400d7110164a36cd1c0d55a8f3c7e1436de2342
+  id.xpi: 53c314bd9cc1fc37182a4e1bee62d0e8776cab8e
+  is.xpi: 859029a23a1a5bb6ba303eb327909b47825febea
+  it.xpi: ae3c8f1d933ed19ef506eba6db6990a10e0aa1b4
+  ja.xpi: 82b0349afdb034c476f74163963e09e7a9868776
+  kk.xpi: 9ccef9d9850c978962e42665028b28de359a5af0
+  km.xpi: 945210486ab9ce4776bce60bb5fd929e49d01582
+  kn.xpi: bfa3c6f4dd8315c4a28f62a6838ec6465539ac8c
+  ko.xpi: 6c28bda96973098df05a9b12d8c4f4d8f85cda41
+  lt.xpi: 9b24c65933e85039d8c645c0207f58a1b9680a42
+  lv.xpi: bcaef3e5490159bf989b576ad892ef1c0b7d2043
+  mai.xpi: 9c63420cec86adbf7f7784fd25cbb8fa117710fb
+  mk.xpi: 11bf4a4c7520b7c4c7c44175e9e7efca85ab60fc
+  ml.xpi: 6a7324c9e1145c08eb88a8afe68adffd0268ec40
+  mr.xpi: 99eb4279ec123cda322460de4b82aefc65aa1198
+  nb-NO.xpi: 5f74e6ed73bf3fc2bf9eb8baea12256f9c740896
+  nl.xpi: 2f806acd9656bb9ee203167b2fd01423554a87a3
+  nn-NO.xpi: f117a65570a69a1151e1bb7fda85844bdf434509
+  or.xpi: d1957e1ac5715de4738be9c36dd127cb2a6287ee
+  pa-IN.xpi: 574deeee0f6a29c3320e7b1adbc22b414796ec2f
+  pl.xpi: e083ca05020647fcbf419a078596ec59df690593
+  pt-BR.xpi: d49cd038648b07b431765080c8034b0e6119dae9
+  pt-PT.xpi: 64e45bfee41cd9ef2c0253485f4646ab9ea8848f
+  ro.xpi: 4886b3793cec0840910c1ed613abbbb42c727b1d
+  ru.xpi: 2b2c356c6b439c71e2a577629fb7f14004570acf
+  si.xpi: 6ed71bbac63250cb84067fc4bb30928a6a6dd125
+  sk.xpi: d39f105eebcb2a7b17f3bf15ac2f5f505ee67eab
+  sl.xpi: 15c87d7e610dd181d25f8810d081d49d34d900f1
+  sq.xpi: b7e6c9db418d60f3c1b6fc96115a2ee3622f1818
+  sr.xpi: 816a082fd753dca3bc0a33723823d076f6a9d10c
+  sv-SE.xpi: 87dcaddda1bda49ad68805791e763875d9bd0c55
+  ta.xpi: f177cfe8fb15765376fc540eb485fa21207696fc
+  te.xpi: 9497bd67a0a9436ae59893ade7196f2fdf70645c
+  th.xpi: 5aec803ed07e8d1cee22934f2d93bfb1603bb5ec
+  tr.xpi: 68dc04cab88293e2a5732eadda59557a14e4bae5
+  uk.xpi: 3fe8e72077651d156b83c91737e9562a638ebfbb
+  vi.xpi: ec8feb96e74c7033f7825835c8b97febb2b5fb1e
+  zh-CN.xpi: 056f9712d33d0b5d6507df8f6c2d51827fcf8acc
+  zh-TW.xpi: 06a3777f6af749ee421515d12632dca82493ebf6
diff --git a/firefox-58.0-kde.patch b/firefox-59.0-kde.patch
similarity index 98%
rename from firefox-58.0-kde.patch
rename to firefox-59.0-kde.patch
index b1cd893..2e12338 100644
--- a/firefox-58.0-kde.patch
+++ b/firefox-59.0-kde.patch
@@ -1,11 +1,11 @@
 # HG changeset patch
-# Parent  89cbe8c49d05965b87815143d1944ab6964f12c7
+# Parent  ffcd96e120857e207bd357b2005f0b5bc776e375
 
 diff --git a/browser/base/content/browser-kde.xul b/browser/base/content/browser-kde.xul
 new file mode 100644
 --- /dev/null
 +++ b/browser/base/content/browser-kde.xul
-@@ -0,0 +1,1248 @@
+@@ -0,0 +1,1238 @@
 +#filter substitution
 +<?xml version="1.0"?>
 +# -*- Mode: HTML -*-
@@ -286,26 +286,26 @@ new file mode 100644
 +                     key="viewBookmarksSidebarKb"
 +                     observes="viewBookmarksSidebar"
 +                     oncommand="SidebarUI.show('viewBookmarksSidebar');">
-+         <observes element="viewBookmarksSidebar" attribute="checked"/>
-+       </toolbarbutton>
++        <observes element="viewBookmarksSidebar" attribute="checked"/>
++      </toolbarbutton>
 +      <toolbarbutton id="sidebar-switcher-history"
 +                     label="&historyButton.label;"
 +                     class="subviewbutton subviewbutton-iconic"
 +                     key="key_gotoHistory"
 +                     observes="viewHistorySidebar"
 +                     oncommand="SidebarUI.show('viewHistorySidebar');">
-+         <observes element="viewHistorySidebar" attribute="checked"/>
-+       </toolbarbutton>
++        <observes element="viewHistorySidebar" attribute="checked"/>
++      </toolbarbutton>
 +      <toolbarbutton id="sidebar-switcher-tabs"
 +                     label="&syncedTabs.sidebar.label;"
 +                     class="subviewbutton subviewbutton-iconic"
 +                     observes="viewTabsSidebar"
 +                     oncommand="SidebarUI.show('viewTabsSidebar');">
-+         <observes element="viewTabsSidebar" attribute="checked"/>
-+       </toolbarbutton>
-+      <toolbarseparator/>
-+      <vbox id="sidebar-extensions"></vbox>
++        <observes element="viewTabsSidebar" attribute="checked"/>
++      </toolbarbutton>
 +      <toolbarseparator/>
++      <!-- Extension toolbarbuttons go here. -->
++      <toolbarseparator id="sidebar-extensions-separator"/>
 +      <toolbarbutton id="sidebar-reverse-position"
 +                     class="subviewbutton"
 +                     oncommand="SidebarUI.reversePosition()"/>
@@ -425,15 +425,15 @@ new file mode 100644
 +           emailLink-title="&emailPageCmd.label;"
 +           sendToDevice-title="&pageAction.sendTabToDevice.label;"
 +           sendToDevice-notReadyTitle="&sendToDevice.syncNotReady.label;">
-+      <photonpanelmultiview id="pageActionPanelMultiView"
-+                            mainViewId="pageActionPanelMainView"
-+                            viewCacheId="appMenu-viewCache">
++      <panelmultiview id="pageActionPanelMultiView"
++                      mainViewId="pageActionPanelMainView"
++                      viewCacheId="appMenu-viewCache">
 +        <panelview id="pageActionPanelMainView"
 +                   context="pageActionContextMenu"
 +                   class="PanelUI-subView">
 +          <vbox class="panel-subview-body"/>
 +        </panelview>
-+      </photonpanelmultiview>
++      </panelmultiview>
 +    </panel>
 +    <panel id="pageActionFeedback"
 +           role="alert"
@@ -444,7 +444,8 @@ new file mode 100644
 +           tabspecific="true"
 +           noautofocus="true"
 +           copyURLFeedback="&copyURLFeedback.label;"
-+           sendToDeviceFeedback="&sendToDeviceFeedback.label;">
++           sendToDeviceFeedback="&sendToDeviceFeedback.label;"
++           sendToDeviceOfflineFeedback="&sendToDeviceOfflineFeedback.label;">
 +      <hbox id="pageActionFeedbackAnimatableBox">
 +        <image id="pageActionFeedbackAnimatableImage"/>
 +      </hbox>
@@ -603,13 +604,10 @@ new file mode 100644
 +</vbox>
 +#endif
 +
-+<deck flex="1" id="tab-view-deck">
-+<vbox flex="1" id="browser-panel">
-+
-+  <toolbox id="navigator-toolbox" mode="icons">
++  <toolbox id="navigator-toolbox">
 +    <!-- Menu -->
 +    <toolbar type="menubar" id="toolbar-menubar" class="chromeclass-menubar" customizable="true"
-+             mode="icons" iconsize="small"
++             mode="icons"
 +#ifdef MENUBAR_CAN_AUTOHIDE
 +             toolbarname="&menubarCmd.label;"
 +             accesskey="&menubarCmd.accesskey;"
@@ -635,7 +633,6 @@ new file mode 100644
 +             fullscreentoolbar="true"
 +             customizable="true"
 +             mode="icons"
-+             iconsize="small"
 +             aria-label="&tabsToolbar.label;"
 +             context="toolbar-context-menu"
 +             collapsed="true">
@@ -718,7 +715,6 @@ new file mode 100644
 +    <toolbar id="nav-bar"
 +             aria-label="&navbarCmd.label;"
 +             fullscreentoolbar="true" mode="icons" customizable="true"
-+             iconsize="small"
 +             customizationtarget="nav-bar-customization-target"
 +             overflowable="true"
 +             overflowbutton="nav-bar-overflow-button"
@@ -822,6 +818,8 @@ new file mode 100644
 +                         tooltiptext="&urlbar.persistentStorageBlocked.tooltip;"/>
 +                  <image data-permission-id="popup" class="blocked-permission-icon popup-icon" role="button"
 +                         tooltiptext="&urlbar.popupBlocked.tooltip;"/>
++                  <image data-permission-id="canvas" class="blocked-permission-icon canvas-icon" role="button"
++                         tooltiptext="&urlbar.canvasBlocked.tooltip;"/>
 +                </box>
 +                <box id="notification-popup-box"
 +                     hidden="true"
@@ -936,7 +934,7 @@ new file mode 100644
 +
 +        <toolbarbutton id="library-button" class="toolbarbutton-1 chromeclass-toolbar-additional subviewbutton-nav"
 +                       removable="true"
-+                       onmousedown="PanelUI.showSubView('appMenu-libraryView', this, null, event);"
++                       onmousedown="PanelUI.showSubView('appMenu-libraryView', this, event);"
 +                       closemenu="none"
 +                       cui-areatype="toolbar"
 +                       tooltiptext="&libraryButton.tooltip;"
@@ -983,10 +981,8 @@ new file mode 100644
 +      </hbox>
 +    </toolbar>
 +
-+    <toolbarset id="customToolbars" context="toolbar-context-menu"/>
-+
 +    <toolbar id="PersonalToolbar"
-+             mode="icons" iconsize="small"
++             mode="icons"
 +             class="chromeclass-directories"
 +             context="toolbar-context-menu"
 +             toolbarname="&personalbarCmd.label;" accesskey="&personalbarCmd.accesskey;"
@@ -1160,7 +1156,7 @@ new file mode 100644
 +      </toolbarbutton>
 +
 +      <toolbaritem id="search-container"
-+                   class="chromeclass-toolbar-additional panel-wide-item"
++                   class="chromeclass-toolbar-additional"
 +                   title="&searchItem.title;"
 +                   align="center"
 +                   flex="100"
@@ -1247,17 +1243,11 @@ new file mode 100644
 +    <notificationbox id="global-notificationbox" notificationside="bottom"/>
 +  </vbox>
 +
-+</vbox>
-+# <iframe id="tab-view"> is dynamically appended as the 2nd child of #tab-view-deck.
-+#     Introducing the iframe dynamically, as needed, was found to be better than
-+#     starting with an empty iframe here in browser.xul from a Ts standpoint.
-+</deck>
-+
 +</window>
 diff --git a/browser/base/jar.mn b/browser/base/jar.mn
 --- a/browser/base/jar.mn
 +++ b/browser/base/jar.mn
-@@ -52,16 +52,18 @@ browser.jar:
+@@ -45,16 +45,18 @@ browser.jar:
          content/browser/aboutRobots-icon.png          (content/aboutRobots-icon.png)
          content/browser/aboutRobots-widget-left.png   (content/aboutRobots-widget-left.png)
          content/browser/aboutTabCrashed.css           (content/aboutTabCrashed.css)
@@ -1339,7 +1329,7 @@ diff --git a/browser/components/build/nsModule.cpp b/browser/components/build/ns
 diff --git a/browser/components/preferences/in-content/main.js b/browser/components/preferences/in-content/main.js
 --- a/browser/components/preferences/in-content/main.js
 +++ b/browser/components/preferences/in-content/main.js
-@@ -193,16 +193,23 @@ var gMainPane = {
+@@ -330,16 +330,23 @@ var gMainPane = {
            this._backoffIndex++ : backoffTimes.length - 1]);
        };
  
@@ -1363,7 +1353,7 @@ diff --git a/browser/components/preferences/in-content/main.js b/browser/compone
      performanceSettingsLink.setAttribute("href", performanceSettingsUrl);
  
      this.updateDefaultPerformanceSettingsPref();
-@@ -898,16 +905,27 @@ var gMainPane = {
+@@ -1035,16 +1042,27 @@ var gMainPane = {
        // Reset exponential backoff delay time in order to do visual update in pollForDefaultBrowser.
        this._backoffIndex = 0;
  
@@ -1707,7 +1697,7 @@ new file mode 100644
 diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
 --- a/browser/installer/package-manifest.in
 +++ b/browser/installer/package-manifest.in
-@@ -657,16 +657,18 @@
+@@ -649,16 +649,18 @@
  @RESPATH@/browser/defaults/blocklists
  @RESPATH@/browser/defaults/pinning
  
diff --git a/firefox.spec b/firefox.spec
index 5bd3c1a..d56900f 100644
--- a/firefox.spec
+++ b/firefox.spec
@@ -24,11 +24,7 @@
 %define pluginsdir %{_libdir}/mozilla/plugins
 
 # libxul.so is provided by libxulrunnner2.0.
-%if %{_use_internal_dependency_generator}
 %define __noautoreq 'libxul.so'
-%else
-%define _requires_exceptions libxul.so
-%endif
 
 # Use Qt instead of GTK -- long term goal, but as of 48.0.1,
 # doesn't even compile yet
@@ -240,15 +236,17 @@ Name:		firefox
 Epoch:		0
 # IMPORTANT: When updating, you MUST also update the l10n files by running
 # download.sh after editing the version number
-Version:	58.0.1
-Release:	2
+Version:	59.0
+Release:	1
 License:	MPLv1+
 Group:		Networking/WWW
 Url:		http://www.mozilla.com/firefox/
 %if 0%{?prel}
 Source0:	http://ftp.mozilla.org/pub/%{name}/releases/%{version}/source/%{name}-%{version}%{prel}.source.tar.xz
 %else
-Source0:	http://ftp.mozilla.org/pub/%{name}/releases/%{version}/source/%{name}-%{version}.source.tar.xz
+#Source0:	http://ftp.mozilla.org/pub/%{name}/releases/%{version}/source/%{name}-%{version}.source.tar.xz
+%define hashver c61f5f5ead48c78a80c80db5c489bdc7cfaf8175
+Source0:	https://hg.mozilla.org/releases/mozilla-release/archive/%{hashver}.tar.bz2
 %endif
 Source4:	%{name}.desktop
 Source5:	firefox-searchengines-jamendo.xml
@@ -271,8 +269,8 @@ Source100:      firefox.rpmlintrc
 }
 Patch1:		firefox-6.0-lang.patch
 # Patches for kde integration of FF  from http://www.rosenauer.org/hg/mozilla/
-Patch11:	firefox-58.0-kde.patch
-Patch12:	mozilla-58.0-kde.patch
+Patch11:	firefox-59.0-kde.patch
+Patch12:	mozilla-59.0-kde.patch
 Patch42:	mozilla-42.0-libproxy.patch
 
 # from fedora - fix for app chooser
@@ -410,7 +408,7 @@ Files and macros mainly for building Firefox extensions.
 }
 
 %prep
-%setup -q -a 20
+%setup -qn mozilla-release-%{hashver} -a 20
 %apply_patches
 
 TOP="$(pwd)"
@@ -455,7 +453,7 @@ export CC=gcc
 echo -n "%google_api_key" > google-api-key
 echo -n "%google_default_client_id %google_default_client_secret" > google-oauth-api-key
 
-sed -i -e 's,\$QTDIR/include,%_includedir/qt5,g' configure.in configure
+#sed -i -e 's,\$QTDIR/include,%_includedir/qt5,g' configure.in configure
 export MOZCONFIG=`pwd`/mozconfig
 cat << EOF > $MOZCONFIG
 %if %{with qt}
@@ -513,7 +511,9 @@ ac_add_options --with-system-jpeg
 ac_add_options --with-system-png
 ac_add_options --enable-system-sqlite
 %endif
+%if %mdvver > 3000000
 ac_add_options --enable-system-cairo
+%endif
 ac_add_options --enable-startup-notification
 #ac_add_options --with-system-ply
 ac_add_options --with-distribution-id=org.openmandriva
diff --git a/mozilla-58.0-kde.patch b/mozilla-59.0-kde.patch
similarity index 57%
rename from mozilla-58.0-kde.patch
rename to mozilla-59.0-kde.patch
index 711ed08..06550b6 100644
--- a/mozilla-58.0-kde.patch
+++ b/mozilla-59.0-kde.patch
@@ -1,5 +1,5 @@
 # HG changeset patch
-# Parent  5be2231eadfb6de978e93c0ba95469e8a4d54cb0
+# Parent  97234138e3aafe66fc7f17c8f530e7c534af2fc2
 Description: Add KDE integration to Firefox (toolkit parts)
 Author: Wolfgang Rosenauer <wolfgang@rosenauer.org>
 Author: Lubos Lunak <lunak@suse.com>
@@ -9,7 +9,7 @@ Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=140751
 diff --git a/modules/libpref/Preferences.cpp b/modules/libpref/Preferences.cpp
 --- a/modules/libpref/Preferences.cpp
 +++ b/modules/libpref/Preferences.cpp
-@@ -75,16 +75,17 @@
+@@ -76,16 +76,17 @@
  #include "nsXPCOMCID.h"
  #include "nsXPCOM.h"
  #include "nsXULAppAPI.h"
@@ -20,68 +20,14 @@ diff --git a/modules/libpref/Preferences.cpp b/modules/libpref/Preferences.cpp
  #include "prlink.h"
 +#include "nsKDEUtils.h"
  
- #ifdef MOZ_CRASHREPORTER
- #include "nsICrashReporter.h"
- #endif
- 
  #ifdef XP_WIN
  #include "windows.h"
  #endif
-@@ -4324,16 +4325,34 @@ pref_LoadPrefsInDirList(const char* aLis
- {
-   nsresult rv;
-   nsCOMPtr<nsIProperties> dirSvc(
-     do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv));
-   if (NS_FAILED(rv)) {
-     return rv;
-   }
- 
-+  // make sure we load these special files after all the others
-+  static const char* specialFiles[] = {
-+#if defined(XP_UNIX)
-+    ""
-+#endif
-+  };
-+
-+  if (nsKDEUtils::kdeSession()) {
-+    for(int i = 0;
-+        i < MOZ_ARRAY_LENGTH(specialFiles);
-+        ++i ) {
-+      if (*specialFiles[ i ] == '\0') {
-+        specialFiles[ i ] = "kde.js";
-+        break;
-+      }
-+    }
-+  }
-+
-   nsCOMPtr<nsISimpleEnumerator> list;
-   dirSvc->Get(aListId, NS_GET_IID(nsISimpleEnumerator), getter_AddRefs(list));
-   if (!list) {
-     return NS_OK;
-   }
- 
-   bool hasMore;
-   while (NS_SUCCEEDED(list->HasMoreElements(&hasMore)) && hasMore) {
-@@ -4344,17 +4363,17 @@ pref_LoadPrefsInDirList(const char* aLis
-     }
- 
-     nsCOMPtr<nsIFile> path = do_QueryInterface(elem);
-     if (!path) {
-       continue;
-     }
- 
-     // Do we care if a file provided by this process fails to load?
--    pref_LoadPrefsInDir(path, nullptr, 0);
-+    pref_LoadPrefsInDir(path, specialFiles, ArrayLength(specialFiles));
-   }
  
-   return NS_OK;
- }
+ using namespace mozilla;
  
- static nsresult
- pref_ReadPrefFromJar(nsZipArchive* aJarReader, const char* aName)
- {
-@@ -4461,25 +4480,37 @@ pref_InitInitialObjects()
+ #ifdef DEBUG
+@@ -4235,25 +4236,37 @@ Preferences::InitInitialObjects()
    // application pref files for backwards compatibility.
    static const char* specialFiles[] = {
  #if defined(XP_MACOSX)
@@ -119,6 +65,25 @@ diff --git a/modules/libpref/Preferences.cpp b/modules/libpref/Preferences.cpp
  
    // Load jar:$app/omni.jar!/defaults/preferences/*.js
    // or jar:$gre/omni.jar!/defaults/preferences/*.js.
+@@ -4302,17 +4315,17 @@ Preferences::InitInitialObjects()
+       }
+ 
+       nsCOMPtr<nsIFile> path = do_QueryInterface(elem);
+       if (!path) {
+         continue;
+       }
+ 
+       // Do we care if a file provided by this process fails to load?
+-      pref_LoadPrefsInDir(path, nullptr, 0);
++      pref_LoadPrefsInDir(path, specialFiles, ArrayLength(specialFiles));
+     }
+   }
+ 
+ #ifdef MOZ_WIDGET_ANDROID
+   // Set up the correct default for toolkit.telemetry.enabled. If this build
+   // has MOZ_TELEMETRY_ON_BY_DEFAULT *or* we're on the beta channel, telemetry
+   // is on by default, otherwise not. This is necessary so that beta users who
+   // are testing final release builds don't flipflop defaults.
 diff --git a/modules/libpref/moz.build b/modules/libpref/moz.build
 --- a/modules/libpref/moz.build
 +++ b/modules/libpref/moz.build
@@ -205,11 +170,11 @@ diff --git a/toolkit/components/downloads/moz.build b/toolkit/components/downloa
 diff --git a/toolkit/content/jar.mn b/toolkit/content/jar.mn
 --- a/toolkit/content/jar.mn
 +++ b/toolkit/content/jar.mn
-@@ -75,29 +75,33 @@ toolkit.jar:
+@@ -67,16 +67,18 @@ toolkit.jar:
+    content/global/bindings/checkbox.xml        (widgets/checkbox.xml)
     content/global/bindings/colorpicker.xml     (widgets/colorpicker.xml)
     content/global/bindings/datekeeper.js       (widgets/datekeeper.js)
     content/global/bindings/datepicker.js       (widgets/datepicker.js)
-    content/global/bindings/datetimepicker.xml  (widgets/datetimepicker.xml)
     content/global/bindings/datetimepopup.xml   (widgets/datetimepopup.xml)
     content/global/bindings/datetimebox.xml     (widgets/datetimebox.xml)
     content/global/bindings/datetimebox.css     (widgets/datetimebox.css)
@@ -217,7 +182,6 @@ diff --git a/toolkit/content/jar.mn b/toolkit/content/jar.mn
 +*  content/global/bindings/dialog-kde.xml      (widgets/dialog-kde.xml)
 +% override chrome://global/content/bindings/dialog.xml chrome://global/content/bindings/dialog-kde.xml desktop=kde
     content/global/bindings/editor.xml          (widgets/editor.xml)
-    content/global/bindings/expander.xml        (widgets/expander.xml)
     content/global/bindings/filefield.xml       (widgets/filefield.xml)
  *  content/global/bindings/findbar.xml         (widgets/findbar.xml)
     content/global/bindings/general.xml         (widgets/general.xml)
@@ -225,30 +189,20 @@ diff --git a/toolkit/content/jar.mn b/toolkit/content/jar.mn
     content/global/bindings/listbox.xml         (widgets/listbox.xml)
     content/global/bindings/menu.xml            (widgets/menu.xml)
     content/global/bindings/menulist.xml        (widgets/menulist.xml)
-    content/global/bindings/notification.xml    (widgets/notification.xml)
-    content/global/bindings/numberbox.xml       (widgets/numberbox.xml)
-    content/global/bindings/popup.xml           (widgets/popup.xml)
- *  content/global/bindings/preferences.xml     (widgets/preferences.xml)
-+*  content/global/bindings/preferences-kde.xml (widgets/preferences-kde.xml)
-+% override chrome://global/content/bindings/preferences.xml chrome://global/content/bindings/preferences-kde.xml desktop=kde
-    content/global/bindings/progressmeter.xml   (widgets/progressmeter.xml)
-    content/global/bindings/radio.xml           (widgets/radio.xml)
-    content/global/bindings/remote-browser.xml  (widgets/remote-browser.xml)
-    content/global/bindings/resizer.xml         (widgets/resizer.xml)
-    content/global/bindings/richlistbox.xml     (widgets/richlistbox.xml)
-    content/global/bindings/scale.xml           (widgets/scale.xml)
-    content/global/bindings/scrollbar.xml       (widgets/scrollbar.xml)
-    content/global/bindings/scrollbox.xml       (widgets/scrollbox.xml)
 diff --git a/toolkit/content/widgets/dialog-kde.xml b/toolkit/content/widgets/dialog-kde.xml
 new file mode 100644
 --- /dev/null
 +++ b/toolkit/content/widgets/dialog-kde.xml
-@@ -0,0 +1,459 @@
+@@ -0,0 +1,477 @@
 +<?xml version="1.0"?>
 +<!-- 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/. -->
 +
++<!DOCTYPE bindings [
++  <!ENTITY % globalKeysDTD SYSTEM "chrome://global/locale/globalKeys.dtd">
++  %globalKeysDTD;
++]>
 +
 +<bindings id="dialogBindings"
 +          xmlns="http://www.mozilla.org/xbl"
@@ -295,6 +249,16 @@ new file mode 100644
 +        <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/>
 +#endif
 +      </xul:hbox>
++
++    <xul:keyset>
++      <xul:key phase="capturing" oncommand="document.documentElement.openHelp(event)"
++#ifdef XP_MACOSX
++           key="&openHelpMac.commandkey;" modifiers="accel"/>
++#else
++           keycode="&openHelp.commandkey;"/>
++#endif
++    </xul:keyset>
++
 +    </content>
 +
 +    <implementation>
@@ -313,7 +277,7 @@ new file mode 100644
 +        <![CDATA[
 +          if (this.hasAttribute("defaultButton"))
 +            return this.getAttribute("defaultButton");
-+          return "accept";  // default to the accept button
++          return "accept"; // default to the accept button
 +        ]]>
 +        </getter>
 +        <setter>
@@ -464,6 +428,20 @@ new file mode 100644
 +        </body>
 +      </method>
 +
++      <method name="openHelp">
++        <parameter name="event"/>
++        <body>
++        <![CDATA[
++          var helpButton = document.documentElement.getButton("help");
++          if (helpButton.disabled || helpButton.hidden)
++            return;
++          this._fireButtonEvent("help");
++          event.stopPropagation();
++          event.preventDefault();
++        ]]>
++        </body>
++      </method>
++
 +      <property name="mStrBundle">
 +        <getter>
 +        <![CDATA[
@@ -514,1609 +492,185 @@ new file mode 100644
 +                button.setAttribute("label", this.getAttribute("buttonlabel" + dlgtype));
 +                if (this.hasAttribute("buttonaccesskey" + dlgtype))
 +                  button.setAttribute("accesskey", this.getAttribute("buttonaccesskey" + dlgtype));
-+              } else if (dlgtype != "extra1" && dlgtype != "extra2") {
-+                button.setAttribute("label", this.mStrBundle.GetStringFromName("button-" + dlgtype));
-+                var accessKey = this.mStrBundle.GetStringFromName("accesskey-" + dlgtype);
-+                if (accessKey)
-+                  button.setAttribute("accesskey", accessKey);
-+              }
-+            }
-+            // allow specifying alternate icons in the dialog header
-+            if (!button.hasAttribute("icon")) {
-+              // if there's an icon specified, use that
-+              if (this.hasAttribute("buttonicon" + dlgtype))
-+                button.setAttribute("icon", this.getAttribute("buttonicon" + dlgtype));
-+              // otherwise set defaults
-+              else
-+                switch (dlgtype) {
-+                  case "accept":
-+                    button.setAttribute("icon", "accept");
-+                    break;
-+                  case "cancel":
-+                    button.setAttribute("icon", "cancel");
-+                    break;
-+                  case "disclosure":
-+                    button.setAttribute("icon", "properties");
-+                    break;
-+                  case "help":
-+                    button.setAttribute("icon", "help");
-+                    break;
-+                  default:
-+                    break;
-+                }
-+            }
-+          }
-+
-+          // ensure that hitting enter triggers the default button command
-+          this.defaultButton = this.defaultButton;
-+
-+          // if there is a special button configuration, use it
-+          if (aButtons) {
-+            // expect a comma delimited list of dlgtype values
-+            var list = aButtons.split(",");
-+
-+            // mark shown dlgtypes as true
-+            var shown = { accept: false, cancel: false, help: false,
-+                          disclosure: false, extra1: false, extra2: false };
-+            for (i = 0; i < list.length; ++i)
-+              shown[list[i].replace(/ /g, "")] = true;
-+
-+            // hide/show the buttons we want
-+            for (dlgtype in buttons)
-+              buttons[dlgtype].hidden = !shown[dlgtype];
-+
-+            // show the spacer on Windows only when the extra2 button is present
-+            if (/Win/.test(navigator.platform)) {
-+              var spacer = document.getAnonymousElementByAttribute(this, "anonid", "spacer");
-+              spacer.removeAttribute("hidden");
-+              spacer.setAttribute("flex", shown.extra2 ? "1" : "0");
-+            }
-+          }
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="_setDefaultButton">
-+        <parameter name="aNewDefault"/>
-+        <body>
-+        <![CDATA[
-+          // remove the default attribute from the previous default button, if any
-+          var oldDefaultButton = this.getButton(this.defaultButton);
-+          if (oldDefaultButton)
-+            oldDefaultButton.removeAttribute("default");
-+
-+          var newDefaultButton = this.getButton(aNewDefault);
-+          if (newDefaultButton) {
-+            this.setAttribute("defaultButton", aNewDefault);
-+            newDefaultButton.setAttribute("default", "true");
-+          } else {
-+            this.setAttribute("defaultButton", "none");
-+            if (aNewDefault != "none")
-+              dump("invalid new default button: " + aNewDefault + ", assuming: none\n");
-+          }
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="_handleButtonCommand">
-+        <parameter name="aEvent"/>
-+        <body>
-+        <![CDATA[
-+          return document.documentElement._doButtonCommand(
-+                                        aEvent.target.getAttribute("dlgtype"));
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="_doButtonCommand">
-+        <parameter name="aDlgType"/>
-+        <body>
-+        <![CDATA[
-+          var button = this.getButton(aDlgType);
-+          if (!button.disabled) {
-+            var noCancel = this._fireButtonEvent(aDlgType);
-+            if (noCancel) {
-+              if (aDlgType == "accept" || aDlgType == "cancel") {
-+                var closingEvent = new CustomEvent("dialogclosing", {
-+                  bubbles: true,
-+                  detail: { button: aDlgType },
-+                });
-+                this.dispatchEvent(closingEvent);
-+                window.close();
-+              }
-+            }
-+            return noCancel;
-+          }
-+          return true;
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="_fireButtonEvent">
-+        <parameter name="aDlgType"/>
-+        <body>
-+        <![CDATA[
-+          var event = document.createEvent("Events");
-+          event.initEvent("dialog" + aDlgType, true, true);
-+
-+          // handle dom event handlers
-+          var noCancel = this.dispatchEvent(event);
-+
-+          // handle any xml attribute event handlers
-+          var handler = this.getAttribute("ondialog" + aDlgType);
-+          if (handler != "") {
-+            var fn = new Function("event", handler);
-+            var returned = fn(event);
-+            if (returned == false)
-+              noCancel = false;
-+          }
-+
-+          return noCancel;
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="_hitEnter">
-+        <parameter name="evt"/>
-+        <body>
-+        <![CDATA[
-+          if (evt.defaultPrevented)
-+            return;
-+
-+          var btn = this.getButton(this.defaultButton);
-+          if (btn)
-+            this._doButtonCommand(this.defaultButton);
-+        ]]>
-+        </body>
-+      </method>
-+
-+    </implementation>
-+
-+    <handlers>
-+      <handler event="keypress" keycode="VK_RETURN"
-+               group="system" action="this._hitEnter(event);"/>
-+      <handler event="keypress" keycode="VK_ESCAPE" group="system">
-+        if (!event.defaultPrevented)
-+          this.cancelDialog();
-+      </handler>
-+#ifdef XP_MACOSX
-+      <handler event="keypress" key="." modifiers="meta" phase="capturing" action="this.cancelDialog();"/>
-+#else
-+      <handler event="focus" phase="capturing">
-+        var btn = this.getButton(this.defaultButton);
-+        if (btn)
-+          btn.setAttribute("default", event.originalTarget == btn || !(event.originalTarget instanceof Components.interfaces.nsIDOMXULButtonElement));
-+      </handler>
-+#endif
-+    </handlers>
-+
-+  </binding>
-+
-+  <binding id="dialogheader">
-+    <resources>
-+      <stylesheet src="chrome://global/skin/dialog.css"/>
-+    </resources>
-+    <content>
-+      <xul:label class="dialogheader-title" xbl:inherits="value=title,crop" crop="right" flex="1"/>
-+      <xul:label class="dialogheader-description" xbl:inherits="value=description"/>
-+    </content>
-+  </binding>
-+
-+</bindings>
-diff --git a/toolkit/content/widgets/preferences-kde.xml b/toolkit/content/widgets/preferences-kde.xml
-new file mode 100644
---- /dev/null
-+++ b/toolkit/content/widgets/preferences-kde.xml
-@@ -0,0 +1,1409 @@
-+<?xml version="1.0"?>
-+
-+<!DOCTYPE bindings [
-+  <!ENTITY % preferencesDTD SYSTEM "chrome://global/locale/preferences.dtd">
-+  %preferencesDTD;
-+  <!ENTITY % globalKeysDTD SYSTEM "chrome://global/locale/globalKeys.dtd">
-+  %globalKeysDTD;
-+]>
-+
-+<bindings id="preferencesBindings"
-+          xmlns="http://www.mozilla.org/xbl"
-+          xmlns:xbl="http://www.mozilla.org/xbl"
-+          xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-+
-+#
-+# = Preferences Window Framework
-+#
-+#   The syntax for use looks something like:
-+#
-+#   <prefwindow>
-+#     <prefpane id="prefPaneA">
-+#       <preferences>
-+#         <preference id="preference1" name="app.preference1" type="bool" onchange="foo();"/>
-+#         <preference id="preference2" name="app.preference2" type="bool" useDefault="true"/>
-+#       </preferences>
-+#       <checkbox label="Preference" preference="preference1"/>
-+#     </prefpane>
-+#   </prefwindow>
-+#
-+
-+  <binding id="preferences">
-+    <implementation implements="nsIObserver">
-+      <method name="_constructAfterChildren">
-+      <body>
-+      <![CDATA[
-+      // This method will be called after the last of the child
-+      // <preference> elements is constructed. Its purpose is to propagate
-+      // the values to the associated form elements. Sometimes the code for
-+      // some <preference> initializers depend on other <preference> elements
-+      // being initialized so we wait and call updateElements on all of them
-+      // once the last one has been constructed. See bugs 997570 and 992185.
-+
-+      var elements = this.getElementsByTagName("preference");
-+      for (let element of elements) {
-+        element.updateElements();
-+      }
-+
-+      this._constructAfterChildrenCalled = true;
-+      ]]>
-+      </body>
-+      </method>
-+      <method name="observe">
-+        <parameter name="aSubject"/>
-+        <parameter name="aTopic"/>
-+        <parameter name="aData"/>
-+        <body>
-+        <![CDATA[
-+          for (var i = 0; i < this.childNodes.length; ++i) {
-+            var preference = this.childNodes[i];
-+            if (preference.name == aData) {
-+              preference.value = preference.valueFromPreferences;
-+            }
-+          }
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="fireChangedEvent">
-+        <parameter name="aPreference"/>
-+        <body>
-+        <![CDATA[
-+          // Value changed, synthesize an event
-+          try {
-+            var event = document.createEvent("Events");
-+            event.initEvent("change", true, true);
-+            aPreference.dispatchEvent(event);
-+          } catch (e) {
-+            Components.utils.reportError(e);
-+          }
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <field name="service">
-+        Components.classes["@mozilla.org/preferences-service;1"]
-+                  .getService(Components.interfaces.nsIPrefService);
-+      </field>
-+      <field name="rootBranch">
-+        Components.classes["@mozilla.org/preferences-service;1"]
-+                  .getService(Components.interfaces.nsIPrefBranch);
-+      </field>
-+      <field name="defaultBranch">
-+        this.service.getDefaultBranch("");
-+      </field>
-+      <field name="rootBranchInternal">
-+        Components.classes["@mozilla.org/preferences-service;1"]
-+                  .getService(Components.interfaces.nsIPrefBranch);
-+      </field>
-+      <property name="type" readonly="true">
-+        <getter>
-+          <![CDATA[
-+            return document.documentElement.type || "";
-+          ]]>
-+        </getter>
-+      </property>
-+      <property name="instantApply" readonly="true">
-+        <getter>
-+          <![CDATA[
-+            var doc = document.documentElement;
-+            return this.type == "child" ? doc.instantApply
-+                                        : doc.instantApply || this.rootBranch.getBoolPref("browser.preferences.instantApply");
-+          ]]>
-+        </getter>
-+      </property>
-+
-+      <!-- We want to call _constructAfterChildren after all child
-+           <preference> elements have been constructed. To do this, we get
-+           and store the node list of all child <preference> elements in the
-+           constructor, and maintain a count which is incremented in the
-+           constructor of <preference>. _constructAfterChildren is called
-+           when the count matches the length of the list. -->
-+      <field name="_constructedChildrenCount">0</field>
-+      <field name="_preferenceChildren">null</field>
-+      <!-- Some <preference> elements are added dynamically after
-+           _constructAfterChildren has already been called - we want to
-+           avoid looping over all of them again in this case so we remember
-+           if we already called it. -->
-+      <field name="_constructAfterChildrenCalled">false</field>
-+      <constructor>
-+      <![CDATA[
-+        this._preferenceChildren = this.getElementsByTagName("preference");
-+      ]]>
-+      </constructor>
-+    </implementation>
-+  </binding>
-+
-+  <binding id="preference">
-+    <implementation>
-+      <constructor>
-+      <![CDATA[
-+        // if the element has been inserted without the name attribute set,
-+        // we have nothing to do here
-+        if (!this.name)
-+          return;
-+
-+        this.preferences.rootBranchInternal
-+            .addObserver(this.name, this.preferences);
-+        // In non-instant apply mode, we must try and use the last saved state
-+        // from any previous opens of a child dialog instead of the value from
-+        // preferences, to pick up any edits a user may have made.
-+
-+        var secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"]
-+                    .getService(Components.interfaces.nsIScriptSecurityManager);
-+        if (this.preferences.type == "child" &&
-+            !this.instantApply && window.opener &&
-+            secMan.isSystemPrincipal(window.opener.document.nodePrincipal)) {
-+          var pdoc = window.opener.document;
-+
-+          // Try to find a preference element for the same preference.
-+          var preference = null;
-+          var parentPreferences = pdoc.getElementsByTagName("preferences");
-+          for (var k = 0; (k < parentPreferences.length && !preference); ++k) {
-+            var parentPrefs = parentPreferences[k]
-+                                    .getElementsByAttribute("name", this.name);
-+            for (var l = 0; (l < parentPrefs.length && !preference); ++l) {
-+              if (parentPrefs[l].localName == "preference")
-+                preference = parentPrefs[l];
-+            }
-+          }
-+
-+          // Don't use the value setter here, we don't want updateElements to be prematurely fired.
-+          this._value = preference ? preference.value : this.valueFromPreferences;
-+        } else {
-+          this._value = this.valueFromPreferences;
-+        }
-+        if (this.preferences._constructAfterChildrenCalled) {
-+          // This <preference> was added after _constructAfterChildren() was already called.
-+          // We can directly call updateElements().
-+          this.updateElements();
-+          return;
-+        }
-+        this.preferences._constructedChildrenCount++;
-+        if (this.preferences._constructedChildrenCount ==
-+            this.preferences._preferenceChildren.length) {
-+          // This is the last <preference>, time to updateElements() on all of them.
-+          this.preferences._constructAfterChildren();
-+        }
-+      ]]>
-+      </constructor>
-+      <destructor>
-+        this.preferences.rootBranchInternal
-+            .removeObserver(this.name, this.preferences);
-+      </destructor>
-+      <field name="_constructed">false</field>
-+      <property name="instantApply">
-+        <getter>
-+          if (this.getAttribute("instantApply") == "false")
-+            return false;
-+          return this.getAttribute("instantApply") == "true" || this.preferences.instantApply;
-+        </getter>
-+      </property>
-+
-+      <property name="preferences" onget="return this.parentNode"/>
-+      <property name="name" onget="return this.getAttribute('name');">
-+        <setter>
-+          if (val == this.name)
-+            return val;
-+
-+          this.preferences.rootBranchInternal
-+              .removeObserver(this.name, this.preferences);
-+          this.setAttribute("name", val);
-+          this.preferences.rootBranchInternal
-+              .addObserver(val, this.preferences);
-+
-+          return val;
-+        </setter>
-+      </property>
-+      <property name="type" onget="return this.getAttribute('type');"
-+                            onset="this.setAttribute('type', val); return val;"/>
-+      <property name="inverted" onget="return this.getAttribute('inverted') == 'true';"
-+                                onset="this.setAttribute('inverted', val); return val;"/>
-+      <property name="readonly" onget="return this.getAttribute('readonly') == 'true';"
-+                                onset="this.setAttribute('readonly', val); return val;"/>
-+
-+      <field name="_value">null</field>
-+      <method name="_setValue">
-+        <parameter name="aValue"/>
-+        <body>
-+        <![CDATA[
-+          if (this.value !== aValue) {
-+            this._value = aValue;
-+            if (this.instantApply)
-+              this.valueFromPreferences = aValue;
-+            this.preferences.fireChangedEvent(this);
-+          }
-+          return aValue;
-+        ]]>
-+        </body>
-+      </method>
-+      <property name="value" onget="return this._value" onset="return this._setValue(val);"/>
-+
-+      <property name="locked">
-+        <getter>
-+          return this.preferences.rootBranch.prefIsLocked(this.name);
-+        </getter>
-+      </property>
-+
-+      <property name="disabled">
-+        <getter>
-+          return this.getAttribute("disabled") == "true";
-+        </getter>
-+        <setter>
-+        <![CDATA[
-+          if (val)
-+            this.setAttribute("disabled", "true");
-+          else
-+            this.removeAttribute("disabled");
-+
-+          if (!this.id)
-+            return val;
-+
-+          var elements = document.getElementsByAttribute("preference", this.id);
-+          for (var i = 0; i < elements.length; ++i) {
-+            elements[i].disabled = val;
-+
-+            var labels = document.getElementsByAttribute("control", elements[i].id);
-+            for (var j = 0; j < labels.length; ++j)
-+              labels[j].disabled = val;
-+          }
-+
-+          return val;
-+        ]]>
-+        </setter>
-+      </property>
-+
-+      <property name="tabIndex">
-+        <getter>
-+          return parseInt(this.getAttribute("tabindex"));
-+        </getter>
-+        <setter>
-+        <![CDATA[
-+          if (val)
-+            this.setAttribute("tabindex", val);
-+          else
-+            this.removeAttribute("tabindex");
-+
-+          if (!this.id)
-+            return val;
-+
-+          var elements = document.getElementsByAttribute("preference", this.id);
-+          for (var i = 0; i < elements.length; ++i) {
-+            elements[i].tabIndex = val;
-+
-+            var labels = document.getElementsByAttribute("control", elements[i].id);
-+            for (var j = 0; j < labels.length; ++j)
-+              labels[j].tabIndex = val;
-+          }
-+
-+          return val;
-+        ]]>
-+        </setter>
-+      </property>
-+
-+      <property name="hasUserValue">
-+        <getter>
-+        <![CDATA[
-+          return this.preferences.rootBranch.prefHasUserValue(this.name) &&
-+                 this.value !== undefined;
-+        ]]>
-+        </getter>
-+      </property>
-+
-+      <method name="reset">
-+        <body>
-+          // defer reset until preference update
-+          this.value = undefined;
-+        </body>
-+      </method>
-+
-+      <field name="_useDefault">false</field>
-+      <property name="defaultValue">
-+        <getter>
-+        <![CDATA[
-+          this._useDefault = true;
-+          var val = this.valueFromPreferences;
-+          this._useDefault = false;
-+          return val;
-+        ]]>
-+        </getter>
-+      </property>
-+
-+      <property name="_branch">
-+        <getter>
-+          return this._useDefault ? this.preferences.defaultBranch : this.preferences.rootBranch;
-+        </getter>
-+      </property>
-+
-+      <field name="batching">false</field>
-+
-+      <method name="_reportUnknownType">
-+        <body>
-+        <![CDATA[
-+          var consoleService = Components.classes["@mozilla.org/consoleservice;1"]
-+                                         .getService(Components.interfaces.nsIConsoleService);
-+          var msg = "<preference> with id='" + this.id + "' and name='" +
-+                    this.name + "' has unknown type '" + this.type + "'.";
-+          consoleService.logStringMessage(msg);
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <property name="valueFromPreferences">
-+        <getter>
-+        <![CDATA[
-+          try {
-+            // Force a resync of value with preferences.
-+            switch (this.type) {
-+            case "int":
-+              return this._branch.getIntPref(this.name);
-+            case "bool":
-+              var val = this._branch.getBoolPref(this.name);
-+              return this.inverted ? !val : val;
-+            case "wstring":
-+              return this._branch
-+                         .getComplexValue(this.name, Components.interfaces.nsIPrefLocalizedString)
-+                         .data;
-+            case "string":
-+            case "unichar":
-+              return this._branch.getStringPref(this.name);
-+            case "fontname":
-+              var family = this._branch.getStringPref(this.name);
-+              var fontEnumerator = Components.classes["@mozilla.org/gfx/fontenumerator;1"]
-+                                             .createInstance(Components.interfaces.nsIFontEnumerator);
-+              return fontEnumerator.getStandardFamilyName(family);
-+            case "file":
-+              var f = this._branch
-+                          .getComplexValue(this.name, Components.interfaces.nsIFile);
-+              return f;
-+            default:
-+              this._reportUnknownType();
-+            }
-+          } catch (e) { }
-+          return null;
-+        ]]>
-+        </getter>
-+        <setter>
-+        <![CDATA[
-+          // Exit early if nothing to do.
-+          if (this.readonly || this.valueFromPreferences == val)
-+            return val;
-+
-+          // The special value undefined means 'reset preference to default'.
-+          if (val === undefined) {
-+            this.preferences.rootBranch.clearUserPref(this.name);
-+            return val;
-+          }
-+
-+          // Force a resync of preferences with value.
-+          switch (this.type) {
-+          case "int":
-+            this.preferences.rootBranch.setIntPref(this.name, val);
-+            break;
-+          case "bool":
-+            this.preferences.rootBranch.setBoolPref(this.name, this.inverted ? !val : val);
-+            break;
-+          case "wstring":
-+            var pls = Components.classes["@mozilla.org/pref-localizedstring;1"]
-+                                .createInstance(Components.interfaces.nsIPrefLocalizedString);
-+            pls.data = val;
-+            this.preferences.rootBranch
-+                .setComplexValue(this.name, Components.interfaces.nsIPrefLocalizedString, pls);
-+            break;
-+          case "string":
-+          case "unichar":
-+          case "fontname":
-+            this.preferences.rootBranch.setStringPref(this.name, val);
-+            break;
-+          case "file":
-+            var lf;
-+            if (typeof(val) == "string") {
-+              lf = Components.classes["@mozilla.org/file/local;1"]
-+                             .createInstance(Components.interfaces.nsIFile);
-+              lf.persistentDescriptor = val;
-+              if (!lf.exists())
-+                lf.initWithPath(val);
-+            } else
-+              lf = val.QueryInterface(Components.interfaces.nsIFile);
-+            this.preferences.rootBranch
-+                .setComplexValue(this.name, Components.interfaces.nsIFile, lf);
-+            break;
-+          default:
-+            this._reportUnknownType();
-+          }
-+          if (!this.batching)
-+            this.preferences.service.savePrefFile(null);
-+          return val;
-+        ]]>
-+        </setter>
-+      </property>
-+
-+      <method name="setElementValue">
-+        <parameter name="aElement"/>
-+        <body>
-+        <![CDATA[
-+          if (this.locked)
-+            aElement.disabled = true;
-+
-+          if (!this.isElementEditable(aElement))
-+            return;
-+
-+          var rv = undefined;
-+          if (aElement.hasAttribute("onsyncfrompreference")) {
-+            // Value changed, synthesize an event
-+            try {
-+              var event = document.createEvent("Events");
-+              event.initEvent("syncfrompreference", true, true);
-+              var f = new Function("event",
-+                                   aElement.getAttribute("onsyncfrompreference"));
-+              rv = f.call(aElement, event);
-+            } catch (e) {
-+              Components.utils.reportError(e);
-+            }
-+          }
-+          var val = rv;
-+          if (val === undefined)
-+            val = this.instantApply ? this.valueFromPreferences : this.value;
-+          // if the preference is marked for reset, show default value in UI
-+          if (val === undefined)
-+            val = this.defaultValue;
-+
-+          /**
-+           * Initialize a UI element property with a value. Handles the case
-+           * where an element has not yet had a XBL binding attached for it and
-+           * the property setter does not yet exist by setting the same attribute
-+           * on the XUL element using DOM apis and assuming the element's
-+           * constructor or property getters appropriately handle this state.
-+           */
-+          function setValue(element, attribute, value) {
-+            if (attribute in element)
-+              element[attribute] = value;
-+            else
-+              element.setAttribute(attribute, value);
-+          }
-+          if (aElement.localName == "checkbox" ||
-+              aElement.localName == "listitem")
-+            setValue(aElement, "checked", val);
-+          else if (aElement.localName == "colorpicker")
-+            setValue(aElement, "color", val);
-+          else if (aElement.localName == "textbox") {
-+            // XXXmano Bug 303998: Avoid a caret placement issue if either the
-+            // preference observer or its setter calls updateElements as a result
-+            // of the input event handler.
-+            if (aElement.value !== val)
-+              setValue(aElement, "value", val);
-+          } else
-+            setValue(aElement, "value", val);
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="getElementValue">
-+        <parameter name="aElement"/>
-+        <body>
-+        <![CDATA[
-+          if (aElement.hasAttribute("onsynctopreference")) {
-+            // Value changed, synthesize an event
-+            try {
-+              var event = document.createEvent("Events");
-+              event.initEvent("synctopreference", true, true);
-+              var f = new Function("event",
-+                                   aElement.getAttribute("onsynctopreference"));
-+              var rv = f.call(aElement, event);
-+              if (rv !== undefined)
-+                return rv;
-+            } catch (e) {
-+              Components.utils.reportError(e);
-+            }
-+          }
-+
-+          /**
-+           * Read the value of an attribute from an element, assuming the
-+           * attribute is a property on the element's node API. If the property
-+           * is not present in the API, then assume its value is contained in
-+           * an attribute, as is the case before a binding has been attached.
-+           */
-+          function getValue(element, attribute) {
-+            if (attribute in element)
-+              return element[attribute];
-+            return element.getAttribute(attribute);
-+          }
-+          if (aElement.localName == "checkbox" ||
-+              aElement.localName == "listitem")
-+            var value = getValue(aElement, "checked");
-+          else if (aElement.localName == "colorpicker")
-+            value = getValue(aElement, "color");
-+          else
-+            value = getValue(aElement, "value");
-+
-+          switch (this.type) {
-+          case "int":
-+            return parseInt(value, 10) || 0;
-+          case "bool":
-+            return typeof(value) == "boolean" ? value : value == "true";
-+          }
-+          return value;
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="isElementEditable">
-+        <parameter name="aElement"/>
-+        <body>
-+        <![CDATA[
-+          switch (aElement.localName) {
-+          case "checkbox":
-+          case "colorpicker":
-+          case "radiogroup":
-+          case "textbox":
-+          case "listitem":
-+          case "listbox":
-+          case "menulist":
-+            return true;
-+          }
-+          return aElement.getAttribute("preference-editable") == "true";
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="updateElements">
-+        <body>
-+        <![CDATA[
-+          if (!this.id)
-+            return;
-+
-+          // This "change" event handler tracks changes made to preferences by
-+          // sources other than the user in this window.
-+          var elements = document.getElementsByAttribute("preference", this.id);
-+          for (var i = 0; i < elements.length; ++i)
-+            this.setElementValue(elements[i]);
-+        ]]>
-+        </body>
-+      </method>
-+    </implementation>
-+
-+    <handlers>
-+      <handler event="change">
-+        this.updateElements();
-+      </handler>
-+    </handlers>
-+  </binding>
-+
-+  <binding id="prefwindow"
-+           extends="chrome://global/content/bindings/dialog.xml#dialog">
-+    <resources>
-+      <stylesheet src="chrome://global/skin/preferences.css"/>
-+    </resources>
-+    <content dlgbuttons="accept,cancel" persist="lastSelected screenX screenY"
-+             closebuttonlabel="&preferencesCloseButton.label;"
-+             closebuttonaccesskey="&preferencesCloseButton.accesskey;"
-+             role="dialog"
-+#ifdef XP_WIN
-+             title="&preferencesDefaultTitleWin.title;">
-+#else
-+             title="&preferencesDefaultTitleMac.title;">
-+#endif
-+      <xul:windowdragbox orient="vertical">
-+        <xul:radiogroup anonid="selector" orient="horizontal" class="paneSelector chromeclass-toolbar"
-+                        role="listbox"/> <!-- Expose to accessibility APIs as a listbox -->
-+      </xul:windowdragbox>
-+      <xul:hbox flex="1" class="paneDeckContainer">
-+        <xul:deck anonid="paneDeck" flex="1">
-+          <children includes="prefpane"/>
-+        </xul:deck>
-+      </xul:hbox>
-+      <xul:hbox anonid="dlg-buttons" class="prefWindow-dlgbuttons" pack="end">
-+#ifndef XP_UNIX
-+        <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/>
-+        <xul:button dlgtype="help" class="dialog-button" hidden="true" icon="help"/>
-+        <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/>
-+        <xul:button dlgtype="extra1" class="dialog-button" hidden="true"/>
-+        <xul:spacer anonid="spacer" flex="1"/>
-+        <xul:button dlgtype="cancel" class="dialog-button" icon="cancel"/>
-+        <xul:button dlgtype="accept" class="dialog-button" icon="accept"/>
-+#else
-+        <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/>
-+        <xul:spacer anonid="spacer" flex="1"/>
-+        <xul:button dlgtype="accept" class="dialog-button" icon="accept"/>
-+        <xul:button dlgtype="extra1" class="dialog-button" hidden="true"/>
-+        <xul:button dlgtype="cancel" class="dialog-button" icon="cancel"/>
-+        <xul:button dlgtype="help" class="dialog-button" hidden="true" icon="help"/>
-+        <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/>
-+#endif
-+      </xul:hbox>
-+      <xul:hbox>
-+        <children/>
-+      </xul:hbox>
-+    </content>
-+    <implementation implements="nsITimerCallback">
-+      <constructor>
-+      <![CDATA[
-+        if (this.type != "child") {
-+          if (!this._instantApplyInitialized) {
-+            let psvc = Components.classes["@mozilla.org/preferences-service;1"]
-+                                 .getService(Components.interfaces.nsIPrefBranch);
-+            this.instantApply = psvc.getBoolPref("browser.preferences.instantApply");
-+          }
-+          if (this.instantApply) {
-+            var docElt = document.documentElement;
-+            var acceptButton = docElt.getButton("accept");
-+            acceptButton.hidden = true;
-+            var cancelButton  = docElt.getButton("cancel");
-+            if (/Mac/.test(navigator.platform)) {
-+              // no buttons on Mac except Help
-+              cancelButton.hidden = true;
-+              // Move Help button to the end
-+              document.getAnonymousElementByAttribute(this, "anonid", "spacer").hidden = true;
-+              // Also, don't fire onDialogAccept on enter
-+              acceptButton.disabled = true;
-+            } else {
-+              // morph the Cancel button into the Close button
-+              cancelButton.setAttribute("icon", "close");
-+              cancelButton.label = docElt.getAttribute("closebuttonlabel");
-+              cancelButton.accesskey = docElt.getAttribute("closebuttonaccesskey");
-+            }
-+          }
-+        }
-+        this.setAttribute("animated", this._shouldAnimate ? "true" : "false");
-+        var panes = this.preferencePanes;
-+
-+        var lastPane = null;
-+        if (this.lastSelected) {
-+          lastPane = document.getElementById(this.lastSelected);
-+          if (!lastPane) {
-+            this.lastSelected = "";
-+          }
-+        }
-+
-+        var paneToLoad;
-+        if ("arguments" in window && window.arguments[0] && document.getElementById(window.arguments[0]) && document.getElementById(window.arguments[0]).nodeName == "prefpane") {
-+          paneToLoad = document.getElementById(window.arguments[0]);
-+          this.lastSelected = paneToLoad.id;
-+        } else if (lastPane)
-+          paneToLoad = lastPane;
-+        else
-+          paneToLoad = panes[0];
-+
-+        for (var i = 0; i < panes.length; ++i) {
-+          this._makePaneButton(panes[i]);
-+          if (panes[i].loaded) {
-+            // Inline pane content, fire load event to force initialization.
-+            this._fireEvent("paneload", panes[i]);
-+          }
-+        }
-+        this.showPane(paneToLoad);
-+
-+        if (panes.length == 1)
-+          this._selector.setAttribute("collapsed", "true");
-+      ]]>
-+      </constructor>
-+
-+      <destructor>
-+      <![CDATA[
-+        // Release timers to avoid reference cycles.
-+        if (this._animateTimer) {
-+          this._animateTimer.cancel();
-+          this._animateTimer = null;
-+        }
-+        if (this._fadeTimer) {
-+          this._fadeTimer.cancel();
-+          this._fadeTimer = null;
-+        }
-+      ]]>
-+      </destructor>
-+
-+      <!-- Derived bindings can set this to true to cause us to skip
-+           reading the browser.preferences.instantApply pref in the constructor.
-+           Then they can set instantApply to their wished value. -->
-+      <field name="_instantApplyInitialized">false</field>
-+      <!-- Controls whether changed pref values take effect immediately. -->
-+      <field name="instantApply">false</field>
-+
-+      <property name="preferencePanes"
-+                onget="return this.getElementsByTagName('prefpane');"/>
-+
-+      <property name="type" onget="return this.getAttribute('type');"/>
-+      <property name="_paneDeck"
-+                onget="return document.getAnonymousElementByAttribute(this, 'anonid', 'paneDeck');"/>
-+      <property name="_paneDeckContainer"
-+                onget="return document.getAnonymousElementByAttribute(this, 'class', 'paneDeckContainer');"/>
-+      <property name="_selector"
-+                onget="return document.getAnonymousElementByAttribute(this, 'anonid', 'selector');"/>
-+      <property name="lastSelected"
-+                onget="return this.getAttribute('lastSelected');">
-+        <setter>
-+          this.setAttribute("lastSelected", val);
-+          document.persist(this.id, "lastSelected");
-+          return val;
-+        </setter>
-+      </property>
-+      <property name="currentPane"
-+                onset="return this._currentPane = val;">
-+        <getter>
-+          if (!this._currentPane)
-+            this._currentPane = this.preferencePanes[0];
-+
-+          return this._currentPane;
-+        </getter>
-+      </property>
-+      <field name="_currentPane">null</field>
-+
-+
-+      <method name="_makePaneButton">
-+        <parameter name="aPaneElement"/>
-+        <body>
-+        <![CDATA[
-+          var radio = document.createElement("radio");
-+          radio.setAttribute("pane", aPaneElement.id);
-+          radio.setAttribute("label", aPaneElement.label);
-+          // Expose preference group choice to accessibility APIs as an unchecked list item
-+          // The parent group is exposed to accessibility APIs as a list
-+          if (aPaneElement.image)
-+            radio.setAttribute("src", aPaneElement.image);
-+          radio.style.listStyleImage = aPaneElement.style.listStyleImage;
-+          this._selector.appendChild(radio);
-+          return radio;
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="showPane">
-+        <parameter name="aPaneElement"/>
-+        <body>
-+        <![CDATA[
-+          if (!aPaneElement)
-+            return;
-+
-+          this._selector.selectedItem = document.getAnonymousElementByAttribute(this, "pane", aPaneElement.id);
-+          if (!aPaneElement.loaded) {
-+            let OverlayLoadObserver = function(aPane) {
-+              this._pane = aPane;
-+            }
-+            OverlayLoadObserver.prototype = {
-+              _outer: this,
-+              observe(aSubject, aTopic, aData) {
-+                this._pane.loaded = true;
-+                this._outer._fireEvent("paneload", this._pane);
-+                this._outer._selectPane(this._pane);
-+              }
-+            };
-+
-+            var obs = new OverlayLoadObserver(aPaneElement);
-+            document.loadOverlay(aPaneElement.src, obs);
-+          } else
-+            this._selectPane(aPaneElement);
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="_fireEvent">
-+        <parameter name="aEventName"/>
-+        <parameter name="aTarget"/>
-+        <body>
-+        <![CDATA[
-+          // Panel loaded, synthesize a load event.
-+          try {
-+            var event = document.createEvent("Events");
-+            event.initEvent(aEventName, true, true);
-+            var cancel = !aTarget.dispatchEvent(event);
-+            if (aTarget.hasAttribute("on" + aEventName)) {
-+              var fn = new Function("event", aTarget.getAttribute("on" + aEventName));
-+              var rv = fn.call(aTarget, event);
-+              if (rv == false)
-+                cancel = true;
-+            }
-+            return !cancel;
-+          } catch (e) {
-+            Components.utils.reportError(e);
-+          }
-+          return false;
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <field name="_initialized">false</field>
-+      <method name="_selectPane">
-+        <parameter name="aPaneElement"/>
-+        <body>
-+        <![CDATA[
-+          if (/Mac/.test(navigator.platform)) {
-+            var paneTitle = aPaneElement.label;
-+            if (paneTitle != "")
-+              document.title = paneTitle;
-+          }
-+          var helpButton = document.documentElement.getButton("help");
-+          if (aPaneElement.helpTopic)
-+            helpButton.hidden = false;
-+          else
-+            helpButton.hidden = true;
-+
-+          // Find this pane's index in the deck and set the deck's
-+          // selectedIndex to that value to switch to it.
-+          var prefpanes = this.preferencePanes;
-+          for (var i = 0; i < prefpanes.length; ++i) {
-+            if (prefpanes[i] == aPaneElement) {
-+              this._paneDeck.selectedIndex = i;
-+
-+              if (this.type != "child") {
-+                if (aPaneElement.hasAttribute("flex") && this._shouldAnimate &&
-+                    prefpanes.length > 1)
-+                  aPaneElement.removeAttribute("flex");
-+                // Calling sizeToContent after the first prefpane is loaded
-+                // will size the windows contents so style information is
-+                // available to calculate correct sizing.
-+                if (!this._initialized && prefpanes.length > 1) {
-+                  if (this._shouldAnimate)
-+                    this.style.minHeight = 0;
-+                  window.sizeToContent();
-+                }
-+
-+                var oldPane = this.lastSelected ? document.getElementById(this.lastSelected) : this.preferencePanes[0];
-+                oldPane.selected = !(aPaneElement.selected = true);
-+                this.lastSelected = aPaneElement.id;
-+                this.currentPane = aPaneElement;
-+                this._initialized = true;
-+
-+                // Only animate if we've switched between prefpanes
-+                if (this._shouldAnimate && oldPane.id != aPaneElement.id) {
-+                  aPaneElement.style.opacity = 0.0;
-+                  this.animate(oldPane, aPaneElement);
-+                } else if (!this._shouldAnimate && prefpanes.length > 1) {
-+                  var targetHeight = parseInt(window.getComputedStyle(this._paneDeckContainer).height);
-+                  var verticalPadding = parseInt(window.getComputedStyle(aPaneElement).paddingTop);
-+                  verticalPadding += parseInt(window.getComputedStyle(aPaneElement).paddingBottom);
-+                  if (aPaneElement.contentHeight > targetHeight - verticalPadding) {
-+                    // To workaround the bottom border of a groupbox from being
-+                    // cutoff an hbox with a class of bottomBox may enclose it.
-+                    // This needs to include its padding to resize properly.
-+                    // See bug 394433
-+                    var bottomPadding = 0;
-+                    var bottomBox = aPaneElement.getElementsByAttribute("class", "bottomBox")[0];
-+                    if (bottomBox)
-+                      bottomPadding = parseInt(window.getComputedStyle(bottomBox).paddingBottom);
-+                    window.innerHeight += bottomPadding + verticalPadding + aPaneElement.contentHeight - targetHeight;
-+                  }
-+
-+                  // XXX rstrong - extend the contents of the prefpane to
-+                  // prevent elements from being cutoff (see bug 349098).
-+                  if (aPaneElement.contentHeight + verticalPadding < targetHeight)
-+                    aPaneElement._content.style.height = targetHeight - verticalPadding + "px";
-+                }
++              } else if (dlgtype != "extra1" && dlgtype != "extra2") {
++                button.setAttribute("label", this.mStrBundle.GetStringFromName("button-" + dlgtype));
++                var accessKey = this.mStrBundle.GetStringFromName("accesskey-" + dlgtype);
++                if (accessKey)
++                  button.setAttribute("accesskey", accessKey);
 +              }
-+              break;
++            }
++            // allow specifying alternate icons in the dialog header
++            if (!button.hasAttribute("icon")) {
++              // if there's an icon specified, use that
++              if (this.hasAttribute("buttonicon" + dlgtype))
++                button.setAttribute("icon", this.getAttribute("buttonicon" + dlgtype));
++              // otherwise set defaults
++              else
++                switch (dlgtype) {
++                  case "accept":
++                    button.setAttribute("icon", "accept");
++                    break;
++                  case "cancel":
++                    button.setAttribute("icon", "cancel");
++                    break;
++                  case "disclosure":
++                    button.setAttribute("icon", "properties");
++                    break;
++                  case "help":
++                    button.setAttribute("icon", "help");
++                    break;
++                  default:
++                    break;
++                }
 +            }
 +          }
-+        ]]>
-+        </body>
-+      </method>
 +
-+      <property name="_shouldAnimate">
-+        <getter>
-+        <![CDATA[
-+          var psvc = Components.classes["@mozilla.org/preferences-service;1"]
-+                               .getService(Components.interfaces.nsIPrefBranch);
-+          return psvc.getBoolPref("browser.preferences.animateFadeIn",
-+                                  /Mac/.test(navigator.platform));
-+        ]]>
-+        </getter>
-+      </property>
-+
-+      <method name="animate">
-+        <parameter name="aOldPane"/>
-+        <parameter name="aNewPane"/>
-+        <body>
-+        <![CDATA[
-+          // if we are already resizing, use currentHeight
-+          var oldHeight = this._currentHeight ? this._currentHeight : aOldPane.contentHeight;
++          // ensure that hitting enter triggers the default button command
++          this.defaultButton = this.defaultButton;
 +
-+          this._multiplier = aNewPane.contentHeight > oldHeight ? 1 : -1;
-+          var sizeDelta = Math.abs(oldHeight - aNewPane.contentHeight);
-+          this._animateRemainder = sizeDelta % this._animateIncrement;
++          // if there is a special button configuration, use it
++          if (aButtons) {
++            // expect a comma delimited list of dlgtype values
++            var list = aButtons.split(",");
 +
-+          this._setUpAnimationTimer(oldHeight);
-+        ]]>
-+        </body>
-+      </method>
++            // mark shown dlgtypes as true
++            var shown = { accept: false, cancel: false, help: false,
++                          disclosure: false, extra1: false, extra2: false };
++            for (i = 0; i < list.length; ++i)
++              shown[list[i].replace(/ /g, "")] = true;
 +
-+      <property name="_sizeIncrement">
-+        <getter>
-+        <![CDATA[
-+          var lastSelectedPane = document.getElementById(this.lastSelected);
-+          var increment = this._animateIncrement * this._multiplier;
-+          var newHeight = this._currentHeight + increment;
-+          if ((this._multiplier > 0 && this._currentHeight >= lastSelectedPane.contentHeight) ||
-+              (this._multiplier < 0 && this._currentHeight <= lastSelectedPane.contentHeight))
-+            return 0;
-+
-+          if ((this._multiplier > 0 && newHeight > lastSelectedPane.contentHeight) ||
-+              (this._multiplier < 0 && newHeight < lastSelectedPane.contentHeight))
-+            increment = this._animateRemainder * this._multiplier;
-+          return increment;
-+        ]]>
-+        </getter>
-+      </property>
++            // hide/show the buttons we want
++            for (dlgtype in buttons)
++              buttons[dlgtype].hidden = !shown[dlgtype];
 +
-+      <method name="notify">
-+        <parameter name="aTimer"/>
-+        <body>
-+        <![CDATA[
-+          if (!document)
-+            aTimer.cancel();
-+
-+          if (aTimer == this._animateTimer) {
-+            var increment = this._sizeIncrement;
-+            if (increment != 0) {
-+              window.innerHeight += increment;
-+              this._currentHeight += increment;
-+            } else {
-+              aTimer.cancel();
-+              this._setUpFadeTimer();
-+            }
-+          } else if (aTimer == this._fadeTimer) {
-+            var elt = document.getElementById(this.lastSelected);
-+            var newOpacity = parseFloat(window.getComputedStyle(elt).opacity) + this._fadeIncrement;
-+            if (newOpacity < 1.0)
-+              elt.style.opacity = newOpacity;
-+            else {
-+              aTimer.cancel();
-+              elt.style.opacity = 1.0;
++            // show the spacer on Windows only when the extra2 button is present
++            if (/Win/.test(navigator.platform)) {
++              var spacer = document.getAnonymousElementByAttribute(this, "anonid", "spacer");
++              spacer.removeAttribute("hidden");
++              spacer.setAttribute("flex", shown.extra2 ? "1" : "0");
 +            }
 +          }
 +        ]]>
 +        </body>
 +      </method>
 +
-+      <method name="_setUpAnimationTimer">
-+        <parameter name="aStartHeight"/>
++      <method name="_setDefaultButton">
++        <parameter name="aNewDefault"/>
 +        <body>
 +        <![CDATA[
-+          if (!this._animateTimer)
-+            this._animateTimer = Components.classes["@mozilla.org/timer;1"]
-+                                           .createInstance(Components.interfaces.nsITimer);
-+          else
-+            this._animateTimer.cancel();
-+          this._currentHeight = aStartHeight;
-+
-+          this._animateTimer.initWithCallback(this, this._animateDelay,
-+                                              Components.interfaces.nsITimer.TYPE_REPEATING_SLACK);
-+        ]]>
-+        </body>
-+      </method>
++          // remove the default attribute from the previous default button, if any
++          var oldDefaultButton = this.getButton(this.defaultButton);
++          if (oldDefaultButton)
++            oldDefaultButton.removeAttribute("default");
 +
-+      <method name="_setUpFadeTimer">
-+        <body>
-+        <![CDATA[
-+          if (!this._fadeTimer)
-+            this._fadeTimer = Components.classes["@mozilla.org/timer;1"]
-+                                        .createInstance(Components.interfaces.nsITimer);
-+          else
-+            this._fadeTimer.cancel();
-+
-+          this._fadeTimer.initWithCallback(this, this._fadeDelay,
-+                                           Components.interfaces.nsITimer.TYPE_REPEATING_SLACK);
++          var newDefaultButton = this.getButton(aNewDefault);
++          if (newDefaultButton) {
++            this.setAttribute("defaultButton", aNewDefault);
++            newDefaultButton.setAttribute("default", "true");
++          } else {
++            this.setAttribute("defaultButton", "none");
++            if (aNewDefault != "none")
++              dump("invalid new default button: " + aNewDefault + ", assuming: none\n");
++          }
 +        ]]>
 +        </body>
 +      </method>
 +
-+      <field name="_animateTimer">null</field>
-+      <field name="_fadeTimer">null</field>
-+      <field name="_animateDelay">15</field>
-+      <field name="_animateIncrement">40</field>
-+      <field name="_fadeDelay">5</field>
-+      <field name="_fadeIncrement">0.40</field>
-+      <field name="_animateRemainder">0</field>
-+      <field name="_currentHeight">0</field>
-+      <field name="_multiplier">0</field>
-+
-+      <method name="addPane">
-+        <parameter name="aPaneElement"/>
++      <method name="_handleButtonCommand">
++        <parameter name="aEvent"/>
 +        <body>
 +        <![CDATA[
-+          this.appendChild(aPaneElement);
-+
-+          // Set up pane button
-+          this._makePaneButton(aPaneElement);
++          return document.documentElement._doButtonCommand(
++                                        aEvent.target.getAttribute("dlgtype"));
 +        ]]>
 +        </body>
 +      </method>
 +
-+      <method name="openSubDialog">
-+        <parameter name="aURL"/>
-+        <parameter name="aFeatures"/>
-+        <parameter name="aParams"/>
-+        <body>
-+          return openDialog(aURL, "", "modal,centerscreen,resizable=no" + (aFeatures != "" ? ("," + aFeatures) : ""), aParams);
-+        </body>
-+      </method>
-+
-+      <method name="openWindow">
-+        <parameter name="aWindowType"/>
-+        <parameter name="aURL"/>
-+        <parameter name="aFeatures"/>
-+        <parameter name="aParams"/>
++      <method name="_doButtonCommand">
++        <parameter name="aDlgType"/>
 +        <body>
 +        <![CDATA[
-+          var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
-+                             .getService(Components.interfaces.nsIWindowMediator);
-+          var win = aWindowType ? wm.getMostRecentWindow(aWindowType) : null;
-+          if (win) {
-+            if ("initWithParams" in win)
-+              win.initWithParams(aParams);
-+            win.focus();
-+          } else {
-+            var features = "resizable,dialog=no,centerscreen" + (aFeatures != "" ? ("," + aFeatures) : "");
-+            var parentWindow = (this.instantApply || !window.opener || window.opener.closed) ? window : window.opener;
-+            win = parentWindow.openDialog(aURL, "_blank", features, aParams);
++          var button = this.getButton(aDlgType);
++          if (!button.disabled) {
++            var noCancel = this._fireButtonEvent(aDlgType);
++            if (noCancel) {
++              if (aDlgType == "accept" || aDlgType == "cancel") {
++                var closingEvent = new CustomEvent("dialogclosing", {
++                  bubbles: true,
++                  detail: { button: aDlgType },
++                });
++                this.dispatchEvent(closingEvent);
++                window.close();
++              }
++            }
++            return noCancel;
 +          }
-+          return win;
++          return true;
 +        ]]>
 +        </body>
 +      </method>
-+    </implementation>
-+    <handlers>
-+      <handler event="dialogaccept">
-+      <![CDATA[
-+        if (!this._fireEvent("beforeaccept", this)) {
-+          return false;
-+        }
-+
-+        var secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"]
-+                    .getService(Components.interfaces.nsIScriptSecurityManager);
-+        if (this.type == "child" && window.opener &&
-+            secMan.isSystemPrincipal(window.opener.document.nodePrincipal)) {
-+          var pdocEl = window.opener.document.documentElement;
-+          if (pdocEl.instantApply) {
-+            let panes = this.preferencePanes;
-+            for (let i = 0; i < panes.length; ++i)
-+              panes[i].writePreferences(true);
-+          } else {
-+            // Clone all the preferences elements from the child document and
-+            // insert them into the pane collection of the parent.
-+            var pdoc = window.opener.document;
-+            if (pdoc.documentElement.localName == "prefwindow") {
-+              var currentPane = pdoc.documentElement.currentPane;
-+              var id = window.location.href + "#childprefs";
-+              var childPrefs = pdoc.getElementById(id);
-+              if (!childPrefs) {
-+                childPrefs = pdoc.createElement("preferences");
-+                currentPane.appendChild(childPrefs);
-+                childPrefs.id = id;
-+              }
-+              let panes = this.preferencePanes;
-+              for (let i = 0; i < panes.length; ++i) {
-+                var preferences = panes[i].preferences;
-+                for (var j = 0; j < preferences.length; ++j) {
-+                  // Try to find a preference element for the same preference.
-+                  var preference = null;
-+                  var parentPreferences = pdoc.getElementsByTagName("preferences");
-+                  for (var k = 0; (k < parentPreferences.length && !preference); ++k) {
-+                    var parentPrefs = parentPreferences[k]
-+                                         .getElementsByAttribute("name", preferences[j].name);
-+                    for (var l = 0; (l < parentPrefs.length && !preference); ++l) {
-+                      if (parentPrefs[l].localName == "preference")
-+                        preference = parentPrefs[l];
-+                    }
-+                  }
-+                  if (!preference) {
-+                    // No matching preference in the parent window.
-+                    preference = pdoc.createElement("preference");
-+                    childPrefs.appendChild(preference);
-+                    preference.name     = preferences[j].name;
-+                    preference.type     = preferences[j].type;
-+                    preference.inverted = preferences[j].inverted;
-+                    preference.readonly = preferences[j].readonly;
-+                    preference.disabled = preferences[j].disabled;
-+                  }
-+                  preference.value = preferences[j].value;
-+                }
-+              }
-+            }
-+          }
-+        } else {
-+          let panes = this.preferencePanes;
-+          for (var i = 0; i < panes.length; ++i)
-+            panes[i].writePreferences(false);
-+
-+          let psvc = Components.classes["@mozilla.org/preferences-service;1"]
-+                               .getService(Components.interfaces.nsIPrefService);
-+          psvc.savePrefFile(null);
-+        }
-+
-+        return true;
-+      ]]>
-+      </handler>
-+      <handler event="command">
-+        if (event.originalTarget.hasAttribute("pane")) {
-+          var pane = document.getElementById(event.originalTarget.getAttribute("pane"));
-+          this.showPane(pane);
-+        }
-+      </handler>
-+
-+      <handler event="keypress" key="&windowClose.key;" modifiers="accel" phase="capturing">
-+      <![CDATA[
-+        if (this.instantApply)
-+          window.close();
-+        event.stopPropagation();
-+        event.preventDefault();
-+      ]]>
-+      </handler>
-+
-+      <handler event="keypress"
-+#ifdef XP_MACOSX
-+               key="&openHelpMac.commandkey;" modifiers="accel"
-+#else
-+               keycode="&openHelp.commandkey;"
-+#endif
-+               phase="capturing">
-+      <![CDATA[
-+        var helpButton = this.getButton("help");
-+        if (helpButton.disabled || helpButton.hidden)
-+          return;
-+        this._fireEvent("dialoghelp", this);
-+        event.stopPropagation();
-+        event.preventDefault();
-+      ]]>
-+      </handler>
-+    </handlers>
-+  </binding>
 +
-+  <binding id="prefpane">
-+    <resources>
-+      <stylesheet src="chrome://global/skin/preferences.css"/>
-+    </resources>
-+    <content>
-+      <xul:vbox class="content-box" xbl:inherits="flex">
-+        <children/>
-+      </xul:vbox>
-+    </content>
-+    <implementation>
-+      <method name="writePreferences">
-+        <parameter name="aFlushToDisk"/>
++      <method name="_fireButtonEvent">
++        <parameter name="aDlgType"/>
 +        <body>
 +        <![CDATA[
-+          // Write all values to preferences.
-+          if (this._deferredValueUpdateElements.size) {
-+            this._finalizeDeferredElements();
-+          }
++          var event = document.createEvent("Events");
++          event.initEvent("dialog" + aDlgType, true, true);
 +
-+          var preferences = this.preferences;
-+          for (var i = 0; i < preferences.length; ++i) {
-+            var preference = preferences[i];
-+            preference.batching = true;
-+            preference.valueFromPreferences = preference.value;
-+            preference.batching = false;
-+          }
-+          if (aFlushToDisk) {
-+            var psvc = Components.classes["@mozilla.org/preferences-service;1"]
-+                                 .getService(Components.interfaces.nsIPrefService);
-+            psvc.savePrefFile(null);
-+          }
-+        ]]>
-+        </body>
-+      </method>
++          // handle dom event handlers
++          var noCancel = this.dispatchEvent(event);
 +
-+      <property name="src"
-+                onget="return this.getAttribute('src');"
-+                onset="this.setAttribute('src', val); return val;"/>
-+      <property name="selected"
-+                onget="return this.getAttribute('selected') == 'true';"
-+                onset="this.setAttribute('selected', val); return val;"/>
-+      <property name="image"
-+                onget="return this.getAttribute('image');"
-+                onset="this.setAttribute('image', val); return val;"/>
-+      <property name="label"
-+                onget="return this.getAttribute('label');"
-+                onset="this.setAttribute('label', val); return val;"/>
-+
-+      <property name="preferenceElements"
-+                onget="return this.getElementsByAttribute('preference', '*');"/>
-+      <property name="preferences"
-+                onget="return this.getElementsByTagName('preference');"/>
-+
-+      <property name="helpTopic">
-+        <getter>
-+        <![CDATA[
-+          // if there are tabs, and the selected tab provides a helpTopic, return that
-+          var box = this.getElementsByTagName("tabbox");
-+          if (box[0]) {
-+            var tab = box[0].selectedTab;
-+            if (tab && tab.hasAttribute("helpTopic"))
-+              return tab.getAttribute("helpTopic");
++          // handle any xml attribute event handlers
++          var handler = this.getAttribute("ondialog" + aDlgType);
++          if (handler != "") {
++            var fn = new Function("event", handler);
++            var returned = fn(event);
++            if (returned == false)
++              noCancel = false;
 +          }
 +
-+          // otherwise, return the helpTopic of the current panel
-+          return this.getAttribute("helpTopic");
++          return noCancel;
 +        ]]>
-+        </getter>
-+      </property>
-+
-+      <field name="_loaded">false</field>
-+      <property name="loaded"
-+                onget="return !this.src ? true : this._loaded;"
-+                onset="this._loaded = val; return val;"/>
-+
-+      <method name="preferenceForElement">
-+        <parameter name="aElement"/>
-+        <body>
-+          return document.getElementById(aElement.getAttribute("preference"));
 +        </body>
 +      </method>
 +
-+      <method name="getPreferenceElement">
-+        <parameter name="aStartElement"/>
++      <method name="_hitEnter">
++        <parameter name="evt"/>
 +        <body>
 +        <![CDATA[
-+          var temp = aStartElement;
-+          while (temp && temp.nodeType == Node.ELEMENT_NODE &&
-+                 !temp.hasAttribute("preference"))
-+            temp = temp.parentNode;
-+          return temp && temp.nodeType == Node.ELEMENT_NODE ?
-+                 temp : aStartElement;
-+        ]]>
-+        </body>
-+      </method>
++          if (evt.defaultPrevented)
++            return;
 +
-+      <property name="DeferredTask" readonly="true">
-+        <getter><![CDATA[
-+          let module = {};
-+          Components.utils.import("resource://gre/modules/DeferredTask.jsm", module);
-+          Object.defineProperty(this, "DeferredTask", {
-+            configurable: true,
-+            enumerable: true,
-+            writable: true,
-+            value: module.DeferredTask
-+          });
-+          return module.DeferredTask;
-+        ]]></getter>
-+      </property>
-+      <method name="_deferredValueUpdate">
-+        <parameter name="aElement"/>
-+        <body>
-+        <![CDATA[
-+          delete aElement._deferredValueUpdateTask;
-+          let preference = document.getElementById(aElement.getAttribute("preference"));
-+          let prefVal = preference.getElementValue(aElement);
-+          preference.value = prefVal;
-+          this._deferredValueUpdateElements.delete(aElement);
-+        ]]>
-+        </body>
-+      </method>
-+      <field name="_deferredValueUpdateElements">
-+        new Set();
-+      </field>
-+      <method name="_finalizeDeferredElements">
-+        <body>
-+        <![CDATA[
-+          for (let el of this._deferredValueUpdateElements) {
-+            if (el._deferredValueUpdateTask) {
-+              el._deferredValueUpdateTask.finalize();
-+            }
-+          }
-+        ]]>
-+        </body>
-+      </method>
-+      <method name="userChangedValue">
-+        <parameter name="aElement"/>
-+        <body>
-+        <![CDATA[
-+          let element = this.getPreferenceElement(aElement);
-+          if (element.hasAttribute("preference")) {
-+            if (element.getAttribute("delayprefsave") != "true") {
-+              var preference = document.getElementById(element.getAttribute("preference"));
-+              var prefVal = preference.getElementValue(element);
-+              preference.value = prefVal;
-+            } else {
-+              if (!element._deferredValueUpdateTask) {
-+                element._deferredValueUpdateTask = new this.DeferredTask(this._deferredValueUpdate.bind(this, element), 1000);
-+                this._deferredValueUpdateElements.add(element);
-+              } else {
-+                // Each time the preference is changed, restart the delay.
-+                element._deferredValueUpdateTask.disarm();
-+              }
-+              element._deferredValueUpdateTask.arm();
-+            }
-+          }
++          var btn = this.getButton(this.defaultButton);
++          if (btn)
++            this._doButtonCommand(this.defaultButton);
 +        ]]>
 +        </body>
 +      </method>
 +
-+      <property name="contentHeight">
-+        <getter>
-+          var targetHeight = parseInt(window.getComputedStyle(this._content).height);
-+          targetHeight += parseInt(window.getComputedStyle(this._content).marginTop);
-+          targetHeight += parseInt(window.getComputedStyle(this._content).marginBottom);
-+          return targetHeight;
-+        </getter>
-+      </property>
-+      <field name="_content">
-+        document.getAnonymousElementByAttribute(this, "class", "content-box");
-+      </field>
 +    </implementation>
++
 +    <handlers>
-+      <handler event="command">
-+        // This "command" event handler tracks changes made to preferences by
-+        // the user in this window.
-+        if (event.sourceEvent)
-+          event = event.sourceEvent;
-+        this.userChangedValue(event.target);
-+      </handler>
-+      <handler event="select">
-+        // This "select" event handler tracks changes made to colorpicker
-+        // preferences by the user in this window.
-+        if (event.target.localName == "colorpicker")
-+          this.userChangedValue(event.target);
-+      </handler>
-+      <handler event="change">
-+        // This "change" event handler tracks changes made to preferences by
-+        // the user in this window.
-+        this.userChangedValue(event.target);
-+      </handler>
-+      <handler event="input">
-+        // This "input" event handler tracks changes made to preferences by
-+        // the user in this window.
-+        this.userChangedValue(event.target);
++      <handler event="keypress" keycode="VK_RETURN"
++               group="system" action="this._hitEnter(event);"/>
++      <handler event="keypress" keycode="VK_ESCAPE" group="system">
++        if (!event.defaultPrevented)
++          this.cancelDialog();
 +      </handler>
-+      <handler event="paneload">
-+      <![CDATA[
-+        // Initialize all values from preferences.
-+        var elements = this.preferenceElements;
-+        for (var i = 0; i < elements.length; ++i) {
-+          try {
-+            var preference = this.preferenceForElement(elements[i]);
-+            preference.setElementValue(elements[i]);
-+          } catch (e) {
-+            dump("*** No preference found for " + elements[i].getAttribute("preference") + "\n");
-+          }
-+        }
-+      ]]>
++#ifdef XP_MACOSX
++      <handler event="keypress" key="." modifiers="meta" phase="capturing" action="this.cancelDialog();"/>
++#else
++      <handler event="focus" phase="capturing">
++        var btn = this.getButton(this.defaultButton);
++        if (btn)
++          btn.setAttribute("default", event.originalTarget == btn || !(event.originalTarget instanceof Components.interfaces.nsIDOMXULButtonElement));
 +      </handler>
++#endif
 +    </handlers>
-+  </binding>
 +
-+  <binding id="panebutton" role="xul:listitem"
-+           extends="chrome://global/content/bindings/radio.xml#radio">
-+    <resources>
-+      <stylesheet src="chrome://global/skin/preferences.css"/>
-+    </resources>
-+    <content>
-+      <xul:image class="paneButtonIcon" xbl:inherits="src"/>
-+      <xul:label class="paneButtonLabel" xbl:inherits="value=label"/>
-+    </content>
 +  </binding>
 +
 +</bindings>
-+
-+# -*- Mode: Java; 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/.
-+
-+#
-+# This is PrefWindow 6. The Code Could Well Be Ready, Are You?
-+#
-+#    Historical References:
-+#    PrefWindow V   (February 1, 2003)
-+#    PrefWindow IV  (April 24, 2000)
-+#    PrefWindow III (January 6, 2000)
-+#    PrefWindow II  (???)
-+#    PrefWindow I   (June 4, 1999)
-+#
 diff --git a/toolkit/mozapps/downloads/nsHelperAppDlg.js b/toolkit/mozapps/downloads/nsHelperAppDlg.js
 --- a/toolkit/mozapps/downloads/nsHelperAppDlg.js
 +++ b/toolkit/mozapps/downloads/nsHelperAppDlg.js
@@ -2327,7 +881,7 @@ diff --git a/toolkit/xre/moz.build b/toolkit/xre/moz.build
 --- a/toolkit/xre/moz.build
 +++ b/toolkit/xre/moz.build
 @@ -61,17 +61,19 @@ elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'co
-         '../components/printingui/mac',
+         '../components/printingui',
      ]
  elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'uikit':
      UNIFIED_SOURCES += [
@@ -2708,7 +1262,7 @@ new file mode 100644
 +#ifndef nsKDEUtils_h__
 +#define nsKDEUtils_h__
 +
-+#include "nsStringGlue.h"
++#include "nsString.h"
 +#include "nsTArray.h"
 +#include <stdio.h>
 +
@@ -2755,14 +1309,14 @@ diff --git a/uriloader/exthandler/moz.build b/uriloader/exthandler/moz.build
      SOURCES += [
          osdir + '/nsOSHelperAppService.cpp',
      ]
-     if CONFIG['GNU_CXX']:
+     if CONFIG['CC_TYPE'] in ('clang', 'gcc'):
          CXXFLAGS += ['-Wno-error=shadow']
  
  if 'gtk' in CONFIG['MOZ_WIDGET_TOOLKIT']:
      UNIFIED_SOURCES += [
 +        'unix/nsCommonRegistry.cpp',
          'unix/nsGNOMERegistry.cpp',
-+	'unix/nsKDERegistry.cpp',
++        'unix/nsKDERegistry.cpp',
          'unix/nsMIMEInfoUnix.cpp',
      ]
  elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
@@ -2771,7 +1325,7 @@ diff --git a/uriloader/exthandler/moz.build b/uriloader/exthandler/moz.build
          'android/nsExternalSharingAppService.cpp',
          'android/nsExternalURLHandlerService.cpp',
          'android/nsMIMEInfoAndroid.cpp',
-@@ -129,16 +131,17 @@ include('/ipc/chromium/chromium-config.m
+@@ -124,16 +126,17 @@ include('/ipc/chromium/chromium-config.m
  FINAL_LIBRARY = 'xul'
  
  LOCAL_INCLUDES += [
@@ -2787,7 +1341,7 @@ diff --git a/uriloader/exthandler/moz.build b/uriloader/exthandler/moz.build
      CXXFLAGS += CONFIG['TK_CFLAGS']
      CXXFLAGS += CONFIG['MOZ_DBUS_CFLAGS']
  
- if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('gtk2', 'gtk3'):
+ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gtk3':
      CXXFLAGS += CONFIG['TK_CFLAGS']
 diff --git a/uriloader/exthandler/unix/nsCommonRegistry.cpp b/uriloader/exthandler/unix/nsCommonRegistry.cpp
 new file mode 100644
@@ -3073,14 +1627,14 @@ diff --git a/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp b/uriloader/exthandler
  
    if (*_retval)
      return NS_OK;
-@@ -79,16 +82,33 @@ nsMIMEInfoUnix::LaunchDefaultWithFile(ns
-     ContentAction::Action::defaultActionForFile(uri, QString(mSchemeOrType.get()));
-   if (action.isValid()) {
-     action.trigger();
-     return NS_OK;
-   }
-   return NS_ERROR_FAILURE;
- #endif
+@@ -59,16 +62,33 @@ nsMIMEInfoUnix::LaunchDefaultWithFile(ns
+   // either /etc/mailcap or ${HOME}/.mailcap, in which case we don't want to
+   // give the GNOME answer.
+   if (mDefaultApplication)
+     return nsMIMEInfoImpl::LaunchDefaultWithFile(aFile);
+ 
+   nsAutoCString nativePath;
+   aFile->GetNativePath(nativePath);
  
 +  if( nsKDEUtils::kdeSupport()) {
 +    bool supports;
@@ -3208,7 +1762,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
-@@ -109,16 +109,17 @@ else:
+@@ -121,16 +121,17 @@ else:
  include('/ipc/chromium/chromium-config.mozbuild')
  
  FINAL_LIBRARY = 'xul'
@@ -3577,7 +2131,7 @@ diff --git a/widget/gtk/nsFilePicker.h b/widget/gtk/nsFilePicker.h
 +  NS_IMETHODIMP kdeAppsDialog(PRInt16 *aReturn);
 +  nsCString kdeMakeFilter( int index );
 +
- #if (MOZ_WIDGET_GTK == 3)
+ #ifdef MOZ_WIDGET_GTK
    GtkFileChooserWidget *mFileChooserDelegate;
  #endif
  };
@@ -3756,7 +2310,7 @@ diff --git a/xpcom/io/nsLocalFileUnix.cpp b/xpcom/io/nsLocalFileUnix.cpp
  #include "prmem.h"
  #include "plbase64.h"
  
-@@ -1938,59 +1939,74 @@ nsLocalFile::SetPersistentDescriptor(con
+@@ -1934,59 +1935,74 @@ nsLocalFile::SetPersistentDescriptor(con
    return InitWithNativePath(aPersistentDescriptor);
  #endif
  }
@@ -3835,5 +2389,5 @@ diff --git a/xpcom/io/nsLocalFileUnix.cpp b/xpcom/io/nsLocalFileUnix.cpp
    }
  
    return giovfs->ShowURIForInput(mPath);
- #elif defined(MOZ_ENABLE_CONTENTACTION)
-   QUrl uri = QUrl::fromLocalFile(QString::fromUtf8(mPath.get()));
+ #elif defined(MOZ_WIDGET_ANDROID)
+   // Try to get a mimetype, if this fails just use the file uri alone
Not Available

benbullard79 [@T] cox.netWorks as well as 58 here.2449d 19hrs
cris [@T] beebgames.comNo Comment.2449d 03hrs
itchka [@T] compuserve.comNo Comment.2447d 04hrs
itchka [@T] compuserve.comNo Comment.2447d 04hrs