$ 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="©URLFeedback.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