1 # HG changeset patch |
1 # HG changeset patch |
2 # Parent 61cdc9af8ceaf75083e751e0d6497feddc26f7ba |
2 # Parent f2726ebfae7cdded8e7ca6030829b0a3fae4e438 |
3 Description: Add KDE integration to Firefox (toolkit parts) |
3 Description: Add KDE integration to Firefox (toolkit parts) |
4 Author: Wolfgang Rosenauer <wolfgang@rosenauer.org> |
4 Author: Wolfgang Rosenauer <wolfgang@rosenauer.org> |
5 Author: Lubos Lunak <lunak@suse.com> |
5 Author: Lubos Lunak <lunak@suse.com> |
6 Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=140751 |
6 Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=140751 |
7 https://bugzilla.novell.com/show_bug.cgi?id=170055 |
7 https://bugzilla.novell.com/show_bug.cgi?id=170055 |
25 |
25 |
26 #include "prefapi.h" |
26 #include "prefapi.h" |
27 #include "prefread.h" |
27 #include "prefread.h" |
28 #include "prefapi_private_data.h" |
28 #include "prefapi_private_data.h" |
29 |
29 |
30 @@ -1135,16 +1136,34 @@ pref_LoadPrefsInDir(nsIFile* aDir, char |
30 @@ -1138,16 +1139,34 @@ pref_LoadPrefsInDir(nsIFile* aDir, char |
31 |
31 |
32 static nsresult pref_LoadPrefsInDirList(const char *listId) |
32 static nsresult pref_LoadPrefsInDirList(const char *listId) |
33 { |
33 { |
34 nsresult rv; |
34 nsresult rv; |
35 nsCOMPtr<nsIProperties> dirSvc(do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv)); |
35 nsCOMPtr<nsIProperties> dirSvc(do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv)); |
79 |
79 |
80 static nsresult pref_ReadPrefFromJar(nsZipArchive* jarReader, const char *name) |
80 static nsresult pref_ReadPrefFromJar(nsZipArchive* jarReader, const char *name) |
81 { |
81 { |
82 nsZipItemPtr<char> manifest(jarReader, name, true); |
82 nsZipItemPtr<char> manifest(jarReader, name, true); |
83 NS_ENSURE_TRUE(manifest.Buffer(), NS_ERROR_NOT_AVAILABLE); |
83 NS_ENSURE_TRUE(manifest.Buffer(), NS_ERROR_NOT_AVAILABLE); |
84 @@ -1264,24 +1283,36 @@ static nsresult pref_InitInitialObjects( |
84 @@ -1267,24 +1286,36 @@ static nsresult pref_InitInitialObjects( |
85 /* these pref file names should not be used: we process them after all other application pref files for backwards compatibility */ |
85 /* these pref file names should not be used: we process them after all other application pref files for backwards compatibility */ |
86 static const char* specialFiles[] = { |
86 static const char* specialFiles[] = { |
87 #if defined(XP_MACOSX) |
87 #if defined(XP_MACOSX) |
88 "macprefs.js" |
88 "macprefs.js" |
89 #elif defined(XP_WIN) |
89 #elif defined(XP_WIN) |
323 + |
323 + |
324 +<bindings id="dialogBindings" |
324 +<bindings id="dialogBindings" |
325 + xmlns="http://www.mozilla.org/xbl" |
325 + xmlns="http://www.mozilla.org/xbl" |
326 + xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" |
326 + xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" |
327 + xmlns:xbl="http://www.mozilla.org/xbl"> |
327 + xmlns:xbl="http://www.mozilla.org/xbl"> |
328 + |
328 + |
329 + <binding id="dialog" extends="chrome://global/content/bindings/general.xml#root-element"> |
329 + <binding id="dialog" extends="chrome://global/content/bindings/general.xml#root-element"> |
330 + <resources> |
330 + <resources> |
331 + <stylesheet src="chrome://global/skin/dialog.css"/> |
331 + <stylesheet src="chrome://global/skin/dialog.css"/> |
332 + </resources> |
332 + </resources> |
333 + <content> |
333 + <content> |
334 + <xul:vbox class="box-inherit dialog-content-box" flex="1"> |
334 + <xul:vbox class="box-inherit dialog-content-box" flex="1"> |
335 + <children/> |
335 + <children/> |
336 + </xul:vbox> |
336 + </xul:vbox> |
337 + |
337 + |
338 + <xul:hbox class="dialog-button-box" anonid="buttons" |
338 + <xul:hbox class="dialog-button-box" anonid="buttons" |
339 + xbl:inherits="pack=buttonpack,align=buttonalign,dir=buttondir,orient=buttonorient" |
339 + xbl:inherits="pack=buttonpack,align=buttonalign,dir=buttondir,orient=buttonorient" |
340 +#ifdef XP_UNIX_GNOME |
340 +#ifdef XP_UNIX |
341 + > |
341 + > |
342 + <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/> |
342 + <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/> |
343 + <xul:button dlgtype="help" class="dialog-button" hidden="true"/> |
343 + <xul:button dlgtype="help" class="dialog-button" hidden="true"/> |
344 + <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/> |
344 + <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/> |
345 + <xul:button dlgtype="extra1" class="dialog-button" hidden="true"/> |
345 + <xul:button dlgtype="extra1" class="dialog-button" hidden="true"/> |
347 + <xul:button dlgtype="cancel" class="dialog-button"/> |
347 + <xul:button dlgtype="cancel" class="dialog-button"/> |
348 + <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/> |
348 + <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/> |
349 +#elif XP_UNIX |
349 +#elif XP_UNIX |
350 + > |
350 + > |
351 + <xul:button dlgtype="help" class="dialog-button" hidden="true"/> |
351 + <xul:button dlgtype="help" class="dialog-button" hidden="true"/> |
352 + <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/> |
352 + <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/> |
353 + <xul:spacer anonid="spacer" flex="1"/> |
353 + <xul:spacer anonid="spacer" flex="1"/> |
354 + <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/> |
354 + <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/> |
355 + <xul:button dlgtype="extra1" class="dialog-button" hidden="true"/> |
355 + <xul:button dlgtype="extra1" class="dialog-button" hidden="true"/> |
356 + <xul:button dlgtype="cancel" class="dialog-button"/> |
356 + <xul:button dlgtype="cancel" class="dialog-button"/> |
357 + <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/> |
357 + <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/> |
358 +#else |
358 +#else |
359 + pack="end"> |
359 + pack="end"> |
360 + <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/> |
360 + <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/> |
361 + <xul:spacer anonid="spacer" flex="1" hidden="true"/> |
361 + <xul:spacer anonid="spacer" flex="1" hidden="true"/> |
362 + <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/> |
362 + <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/> |
460 + <method name="centerWindowOnScreen"> |
460 + <method name="centerWindowOnScreen"> |
461 + <body> |
461 + <body> |
462 + <![CDATA[ |
462 + <![CDATA[ |
463 + var xOffset = screen.availWidth/2 - window.outerWidth/2; |
463 + var xOffset = screen.availWidth/2 - window.outerWidth/2; |
464 + var yOffset = screen.availHeight/2 - window.outerHeight/2; //(opener.outerHeight *2)/10; |
464 + var yOffset = screen.availHeight/2 - window.outerHeight/2; //(opener.outerHeight *2)/10; |
465 + |
465 + |
466 + xOffset = xOffset > 0 ? xOffset : 0; |
466 + xOffset = xOffset > 0 ? xOffset : 0; |
467 + yOffset = yOffset > 0 ? yOffset : 0; |
467 + yOffset = yOffset > 0 ? yOffset : 0; |
468 + window.moveTo(xOffset, yOffset); |
468 + window.moveTo(xOffset, yOffset); |
469 + ]]> |
469 + ]]> |
470 + </body> |
470 + </body> |
632 + disclosure: false, extra1: false, extra2: false }; |
632 + disclosure: false, extra1: false, extra2: false }; |
633 + for (i = 0; i < list.length; ++i) |
633 + for (i = 0; i < list.length; ++i) |
634 + shown[list[i].replace(/ /g, "")] = true; |
634 + shown[list[i].replace(/ /g, "")] = true; |
635 + |
635 + |
636 + // hide/show the buttons we want |
636 + // hide/show the buttons we want |
637 + for (dlgtype in buttons) |
637 + for (dlgtype in buttons) |
638 + buttons[dlgtype].hidden = !shown[dlgtype]; |
638 + buttons[dlgtype].hidden = !shown[dlgtype]; |
639 + |
639 + |
640 + let { AppConstants } = |
640 + let { AppConstants } = |
641 + Components.utils.import("resource://gre/modules/AppConstants.jsm", {}); |
641 + Components.utils.import("resource://gre/modules/AppConstants.jsm", {}); |
642 + // show the spacer on Windows only when the extra2 button is present |
642 + // show the spacer on Windows only when the extra2 button is present |
704 + } |
704 + } |
705 + return true; |
705 + return true; |
706 + ]]> |
706 + ]]> |
707 + </body> |
707 + </body> |
708 + </method> |
708 + </method> |
709 + |
709 + |
710 + <method name="_fireButtonEvent"> |
710 + <method name="_fireButtonEvent"> |
711 + <parameter name="aDlgType"/> |
711 + <parameter name="aDlgType"/> |
712 + <body> |
712 + <body> |
713 + <![CDATA[ |
713 + <![CDATA[ |
714 + var event = document.createEvent("Events"); |
714 + var event = document.createEvent("Events"); |
715 + event.initEvent("dialog"+aDlgType, true, true); |
715 + event.initEvent("dialog"+aDlgType, true, true); |
716 + |
716 + |
717 + // handle dom event handlers |
717 + // handle dom event handlers |
718 + var noCancel = this.dispatchEvent(event); |
718 + var noCancel = this.dispatchEvent(event); |
719 + |
719 + |
720 + // handle any xml attribute event handlers |
720 + // handle any xml attribute event handlers |
721 + var handler = this.getAttribute("ondialog"+aDlgType); |
721 + var handler = this.getAttribute("ondialog"+aDlgType); |
722 + if (handler != "") { |
722 + if (handler != "") { |
723 + var fn = new Function("event", handler); |
723 + var fn = new Function("event", handler); |
724 + var returned = fn(event); |
724 + var returned = fn(event); |
725 + if (returned == false) |
725 + if (returned == false) |
726 + noCancel = false; |
726 + noCancel = false; |
727 + } |
727 + } |
728 + |
728 + |
729 + return noCancel; |
729 + return noCancel; |
730 + ]]> |
730 + ]]> |
731 + </body> |
731 + </body> |
732 + </method> |
732 + </method> |
733 + |
733 + |
914 + |
914 + |
915 + this.preferences.rootBranchInternal |
915 + this.preferences.rootBranchInternal |
916 + .addObserver(this.name, this.preferences, false); |
916 + .addObserver(this.name, this.preferences, false); |
917 + // In non-instant apply mode, we must try and use the last saved state |
917 + // In non-instant apply mode, we must try and use the last saved state |
918 + // from any previous opens of a child dialog instead of the value from |
918 + // from any previous opens of a child dialog instead of the value from |
919 + // preferences, to pick up any edits a user may have made. |
919 + // preferences, to pick up any edits a user may have made. |
920 + |
920 + |
921 + var secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"] |
921 + var secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"] |
922 + .getService(Components.interfaces.nsIScriptSecurityManager); |
922 + .getService(Components.interfaces.nsIScriptSecurityManager); |
923 + if (this.preferences.type == "child" && |
923 + if (this.preferences.type == "child" && |
924 + !this.instantApply && window.opener && |
924 + !this.instantApply && window.opener && |
925 + secMan.isSystemPrincipal(window.opener.document.nodePrincipal)) { |
925 + secMan.isSystemPrincipal(window.opener.document.nodePrincipal)) { |
926 + var pdoc = window.opener.document; |
926 + var pdoc = window.opener.document; |
927 + |
927 + |
928 + // Try to find a preference element for the same preference. |
928 + // Try to find a preference element for the same preference. |
959 + <property name="preferences" onget="return this.parentNode"/> |
959 + <property name="preferences" onget="return this.parentNode"/> |
960 + <property name="name" onget="return this.getAttribute('name');"> |
960 + <property name="name" onget="return this.getAttribute('name');"> |
961 + <setter> |
961 + <setter> |
962 + if (val == this.name) |
962 + if (val == this.name) |
963 + return val; |
963 + return val; |
964 + |
964 + |
965 + this.preferences.rootBranchInternal |
965 + this.preferences.rootBranchInternal |
966 + .removeObserver(this.name, this.preferences); |
966 + .removeObserver(this.name, this.preferences); |
967 + this.setAttribute('name', val); |
967 + this.setAttribute('name', val); |
968 + this.preferences.rootBranchInternal |
968 + this.preferences.rootBranchInternal |
969 + .addObserver(val, this.preferences, false); |
969 + .addObserver(val, this.preferences, false); |
970 + |
970 + |
971 + return val; |
971 + return val; |
972 + </setter> |
972 + </setter> |
973 + </property> |
973 + </property> |
974 + <property name="type" onget="return this.getAttribute('type');" |
974 + <property name="type" onget="return this.getAttribute('type');" |
975 + onset="this.setAttribute('type', val); return val;"/> |
975 + onset="this.setAttribute('type', val); return val;"/> |
992 + return aValue; |
992 + return aValue; |
993 + ]]> |
993 + ]]> |
994 + </body> |
994 + </body> |
995 + </method> |
995 + </method> |
996 + <property name="value" onget="return this._value" onset="return this._setValue(val);"/> |
996 + <property name="value" onget="return this._value" onset="return this._setValue(val);"/> |
997 + |
997 + |
998 + <property name="locked"> |
998 + <property name="locked"> |
999 + <getter> |
999 + <getter> |
1000 + return this.preferences.rootBranch.prefIsLocked(this.name); |
1000 + return this.preferences.rootBranch.prefIsLocked(this.name); |
1001 + </getter> |
1001 + </getter> |
1002 + </property> |
1002 + </property> |
1003 + |
1003 + |
1004 + <property name="disabled"> |
1004 + <property name="disabled"> |
1005 + <getter> |
1005 + <getter> |
1006 + return this.getAttribute("disabled") == "true"; |
1006 + return this.getAttribute("disabled") == "true"; |
1007 + </getter> |
1007 + </getter> |
1008 + <setter> |
1008 + <setter> |
1009 + <![CDATA[ |
1009 + <![CDATA[ |
1010 + if (val) |
1010 + if (val) |
1011 + this.setAttribute("disabled", "true"); |
1011 + this.setAttribute("disabled", "true"); |
1012 + else |
1012 + else |
1013 + this.removeAttribute("disabled"); |
1013 + this.removeAttribute("disabled"); |
1014 + |
1014 + |
1015 + if (!this.id) |
1015 + if (!this.id) |
1016 + return val; |
1016 + return val; |
1017 + |
1017 + |
1018 + var elements = document.getElementsByAttribute("preference", this.id); |
1018 + var elements = document.getElementsByAttribute("preference", this.id); |
1019 + for (var i = 0; i < elements.length; ++i) { |
1019 + for (var i = 0; i < elements.length; ++i) { |
1020 + elements[i].disabled = val; |
1020 + elements[i].disabled = val; |
1021 + |
1021 + |
1022 + var labels = document.getElementsByAttribute("control", elements[i].id); |
1022 + var labels = document.getElementsByAttribute("control", elements[i].id); |
1023 + for (var j = 0; j < labels.length; ++j) |
1023 + for (var j = 0; j < labels.length; ++j) |
1024 + labels[j].disabled = val; |
1024 + labels[j].disabled = val; |
1025 + } |
1025 + } |
1026 + |
1026 + |
1027 + return val; |
1027 + return val; |
1028 + ]]> |
1028 + ]]> |
1029 + </setter> |
1029 + </setter> |
1030 + </property> |
1030 + </property> |
1031 + |
1031 + |
1032 + <property name="tabIndex"> |
1032 + <property name="tabIndex"> |
1033 + <getter> |
1033 + <getter> |
1034 + return parseInt(this.getAttribute("tabindex")); |
1034 + return parseInt(this.getAttribute("tabindex")); |
1035 + </getter> |
1035 + </getter> |
1036 + <setter> |
1036 + <setter> |
1037 + <![CDATA[ |
1037 + <![CDATA[ |
1038 + if (val) |
1038 + if (val) |
1039 + this.setAttribute("tabindex", val); |
1039 + this.setAttribute("tabindex", val); |
1040 + else |
1040 + else |
1041 + this.removeAttribute("tabindex"); |
1041 + this.removeAttribute("tabindex"); |
1042 + |
1042 + |
1043 + if (!this.id) |
1043 + if (!this.id) |
1044 + return val; |
1044 + return val; |
1045 + |
1045 + |
1046 + var elements = document.getElementsByAttribute("preference", this.id); |
1046 + var elements = document.getElementsByAttribute("preference", this.id); |
1047 + for (var i = 0; i < elements.length; ++i) { |
1047 + for (var i = 0; i < elements.length; ++i) { |
1048 + elements[i].tabIndex = val; |
1048 + elements[i].tabIndex = val; |
1049 + |
1049 + |
1050 + var labels = document.getElementsByAttribute("control", elements[i].id); |
1050 + var labels = document.getElementsByAttribute("control", elements[i].id); |
1051 + for (var j = 0; j < labels.length; ++j) |
1051 + for (var j = 0; j < labels.length; ++j) |
1052 + labels[j].tabIndex = val; |
1052 + labels[j].tabIndex = val; |
1053 + } |
1053 + } |
1054 + |
1054 + |
1055 + return val; |
1055 + return val; |
1056 + ]]> |
1056 + ]]> |
1057 + </setter> |
1057 + </setter> |
1058 + </property> |
1058 + </property> |
1059 + |
1059 + |
1063 + return this.preferences.rootBranch.prefHasUserValue(this.name) && |
1063 + return this.preferences.rootBranch.prefHasUserValue(this.name) && |
1064 + this.value !== undefined; |
1064 + this.value !== undefined; |
1065 + ]]> |
1065 + ]]> |
1066 + </getter> |
1066 + </getter> |
1067 + </property> |
1067 + </property> |
1068 + |
1068 + |
1069 + <method name="reset"> |
1069 + <method name="reset"> |
1070 + <body> |
1070 + <body> |
1071 + // defer reset until preference update |
1071 + // defer reset until preference update |
1072 + this.value = undefined; |
1072 + this.value = undefined; |
1073 + </body> |
1073 + </body> |
1074 + </method> |
1074 + </method> |
1075 + |
1075 + |
1076 + <field name="_useDefault">false</field> |
1076 + <field name="_useDefault">false</field> |
1077 + <property name="defaultValue"> |
1077 + <property name="defaultValue"> |
1078 + <getter> |
1078 + <getter> |
1079 + <![CDATA[ |
1079 + <![CDATA[ |
1080 + this._useDefault = true; |
1080 + this._useDefault = true; |
1081 + var val = this.valueFromPreferences; |
1081 + var val = this.valueFromPreferences; |
1082 + this._useDefault = false; |
1082 + this._useDefault = false; |
1083 + return val; |
1083 + return val; |
1084 + ]]> |
1084 + ]]> |
1085 + </getter> |
1085 + </getter> |
1086 + </property> |
1086 + </property> |
1087 + |
1087 + |
1088 + <property name="_branch"> |
1088 + <property name="_branch"> |
1089 + <getter> |
1089 + <getter> |
1090 + return this._useDefault ? this.preferences.defaultBranch : this.preferences.rootBranch; |
1090 + return this._useDefault ? this.preferences.defaultBranch : this.preferences.rootBranch; |
1091 + </getter> |
1091 + </getter> |
1092 + </property> |
1092 + </property> |
1093 + |
1093 + |
1094 + <field name="batching">false</field> |
1094 + <field name="batching">false</field> |
1095 + |
1095 + |
1096 + <method name="_reportUnknownType"> |
1096 + <method name="_reportUnknownType"> |
1097 + <body> |
1097 + <body> |
1098 + <![CDATA[ |
1098 + <![CDATA[ |
1099 + var consoleService = Components.classes["@mozilla.org/consoleservice;1"] |
1099 + var consoleService = Components.classes["@mozilla.org/consoleservice;1"] |
1100 + .getService(Components.interfaces.nsIConsoleService); |
1100 + .getService(Components.interfaces.nsIConsoleService); |
1101 + var msg = "<preference> with id='" + this.id + "' and name='" + |
1101 + var msg = "<preference> with id='" + this.id + "' and name='" + |
1102 + this.name + "' has unknown type '" + this.type + "'."; |
1102 + this.name + "' has unknown type '" + this.type + "'."; |
1103 + consoleService.logStringMessage(msg); |
1103 + consoleService.logStringMessage(msg); |
1104 + ]]> |
1104 + ]]> |
1105 + </body> |
1105 + </body> |
1106 + </method> |
1106 + </method> |
1107 + |
1107 + |
1108 + <property name="valueFromPreferences"> |
1108 + <property name="valueFromPreferences"> |
1109 + <getter> |
1109 + <getter> |
1110 + <![CDATA[ |
1110 + <![CDATA[ |
1111 + try { |
1111 + try { |
1112 + // Force a resync of value with preferences. |
1112 + // Force a resync of value with preferences. |
1187 + .createInstance(Components.interfaces.nsILocalFile); |
1187 + .createInstance(Components.interfaces.nsILocalFile); |
1188 + lf.persistentDescriptor = val; |
1188 + lf.persistentDescriptor = val; |
1189 + if (!lf.exists()) |
1189 + if (!lf.exists()) |
1190 + lf.initWithPath(val); |
1190 + lf.initWithPath(val); |
1191 + } |
1191 + } |
1192 + else |
1192 + else |
1193 + lf = val.QueryInterface(Components.interfaces.nsILocalFile); |
1193 + lf = val.QueryInterface(Components.interfaces.nsILocalFile); |
1194 + this.preferences.rootBranch |
1194 + this.preferences.rootBranch |
1195 + .setComplexValue(this.name, Components.interfaces.nsILocalFile, lf); |
1195 + .setComplexValue(this.name, Components.interfaces.nsILocalFile, lf); |
1196 + break; |
1196 + break; |
1197 + default: |
1197 + default: |
1218 + if (aElement.hasAttribute("onsyncfrompreference")) { |
1218 + if (aElement.hasAttribute("onsyncfrompreference")) { |
1219 + // Value changed, synthesize an event |
1219 + // Value changed, synthesize an event |
1220 + try { |
1220 + try { |
1221 + var event = document.createEvent("Events"); |
1221 + var event = document.createEvent("Events"); |
1222 + event.initEvent("syncfrompreference", true, true); |
1222 + event.initEvent("syncfrompreference", true, true); |
1223 + var f = new Function ("event", |
1223 + var f = new Function ("event", |
1224 + aElement.getAttribute("onsyncfrompreference")); |
1224 + aElement.getAttribute("onsyncfrompreference")); |
1225 + rv = f.call(aElement, event); |
1225 + rv = f.call(aElement, event); |
1226 + } |
1226 + } |
1227 + catch (e) { |
1227 + catch (e) { |
1228 + Components.utils.reportError(e); |
1228 + Components.utils.reportError(e); |
1229 + } |
1229 + } |
1230 + } |
1230 + } |
1231 + var val = rv !== undefined ? rv : (this.instantApply ? this.valueFromPreferences : this.value); |
1231 + var val = rv; |
|
1232 + if (val === undefined) |
|
1233 + val = this.instantApply ? this.valueFromPreferences : this.value; |
1232 + // if the preference is marked for reset, show default value in UI |
1234 + // if the preference is marked for reset, show default value in UI |
1233 + if (val === undefined) |
1235 + if (val === undefined) |
1234 + val = this.defaultValue; |
1236 + val = this.defaultValue; |
1235 + |
1237 + |
1236 + /** |
1238 + /** |
1237 + * Initialize a UI element property with a value. Handles the case |
1239 + * Initialize a UI element property with a value. Handles the case |
1238 + * where an element has not yet had a XBL binding attached for it and |
1240 + * where an element has not yet had a XBL binding attached for it and |
1239 + * the property setter does not yet exist by setting the same attribute |
1241 + * the property setter does not yet exist by setting the same attribute |
1240 + * on the XUL element using DOM apis and assuming the element's |
1242 + * on the XUL element using DOM apis and assuming the element's |
1241 + * constructor or property getters appropriately handle this state. |
1243 + * constructor or property getters appropriately handle this state. |
1242 + */ |
1244 + */ |
1243 + function setValue(element, attribute, value) { |
1245 + function setValue(element, attribute, value) { |
1244 + if (attribute in element) |
1246 + if (attribute in element) |
1245 + element[attribute] = value; |
1247 + element[attribute] = value; |
1246 + else |
1248 + else |
1247 + element.setAttribute(attribute, value); |
1249 + element.setAttribute(attribute, value); |
1248 + } |
1250 + } |
1249 + if (aElement.localName == "checkbox" || |
1251 + if (aElement.localName == "checkbox" || |
1271 + if (aElement.hasAttribute("onsynctopreference")) { |
1273 + if (aElement.hasAttribute("onsynctopreference")) { |
1272 + // Value changed, synthesize an event |
1274 + // Value changed, synthesize an event |
1273 + try { |
1275 + try { |
1274 + var event = document.createEvent("Events"); |
1276 + var event = document.createEvent("Events"); |
1275 + event.initEvent("synctopreference", true, true); |
1277 + event.initEvent("synctopreference", true, true); |
1276 + var f = new Function ("event", |
1278 + var f = new Function ("event", |
1277 + aElement.getAttribute("onsynctopreference")); |
1279 + aElement.getAttribute("onsynctopreference")); |
1278 + var rv = f.call(aElement, event); |
1280 + var rv = f.call(aElement, event); |
1279 + if (rv !== undefined) |
1281 + if (rv !== undefined) |
1280 + return rv; |
1282 + return rv; |
1281 + } |
1283 + } |
1282 + catch (e) { |
1284 + catch (e) { |
1283 + Components.utils.reportError(e); |
1285 + Components.utils.reportError(e); |
1284 + } |
1286 + } |
1285 + } |
1287 + } |
1286 + |
1288 + |
1287 + /** |
1289 + /** |
1288 + * Read the value of an attribute from an element, assuming the |
1290 + * Read the value of an attribute from an element, assuming the |
1289 + * attribute is a property on the element's node API. If the property |
1291 + * attribute is a property on the element's node API. If the property |
1290 + * is not present in the API, then assume its value is contained in |
1292 + * is not present in the API, then assume its value is contained in |
1291 + * an attribute, as is the case before a binding has been attached. |
1293 + * an attribute, as is the case before a binding has been attached. |
1292 + */ |
1294 + */ |
1293 + function getValue(element, attribute) { |
1295 + function getValue(element, attribute) { |
1327 + case "listbox": |
1329 + case "listbox": |
1328 + case "menulist": |
1330 + case "menulist": |
1329 + return true; |
1331 + return true; |
1330 + } |
1332 + } |
1331 + return aElement.getAttribute("preference-editable") == "true"; |
1333 + return aElement.getAttribute("preference-editable") == "true"; |
1332 + ]]> |
1334 + ]]> |
1333 + </body> |
1335 + </body> |
1334 + </method> |
1336 + </method> |
1335 + |
1337 + |
1336 + <method name="updateElements"> |
1338 + <method name="updateElements"> |
1337 + <body> |
1339 + <body> |
1338 + <![CDATA[ |
1340 + <![CDATA[ |
1339 + if (!this.id) |
1341 + if (!this.id) |
1340 + return; |
1342 + return; |
1341 + |
1343 + |
1342 + // This "change" event handler tracks changes made to preferences by |
1344 + // This "change" event handler tracks changes made to preferences by |
1343 + // sources other than the user in this window. |
1345 + // sources other than the user in this window. |
1344 + var elements = document.getElementsByAttribute("preference", this.id); |
1346 + var elements = document.getElementsByAttribute("preference", this.id); |
1345 + for (var i = 0; i < elements.length; ++i) |
1347 + for (var i = 0; i < elements.length; ++i) |
1346 + this.setElementValue(elements[i]); |
1348 + this.setElementValue(elements[i]); |
1347 + ]]> |
1349 + ]]> |
1348 + </body> |
1350 + </body> |
1349 + </method> |
1351 + </method> |
1350 + </implementation> |
1352 + </implementation> |
1351 + |
1353 + |
1352 + <handlers> |
1354 + <handlers> |
1353 + <handler event="change"> |
1355 + <handler event="change"> |
1354 + this.updateElements(); |
1356 + this.updateElements(); |
1355 + </handler> |
1357 + </handler> |
1356 + </handlers> |
1358 + </handlers> |
1421 + Components.utils.import("resource://gre/modules/AppConstants.jsm", {}); |
1423 + Components.utils.import("resource://gre/modules/AppConstants.jsm", {}); |
1422 + if (AppConstants.platform == "macosx") { |
1424 + if (AppConstants.platform == "macosx") { |
1423 + // no buttons on Mac except Help |
1425 + // no buttons on Mac except Help |
1424 + cancelButton.hidden = true; |
1426 + cancelButton.hidden = true; |
1425 + // Move Help button to the end |
1427 + // Move Help button to the end |
1426 + document.getAnonymousElementByAttribute(this, "anonid", "spacer").hidden = true; |
1428 + document.getAnonymousElementByAttribute(this, "anonid", "spacer").hidden = true; |
1427 + // Also, don't fire onDialogAccept on enter |
1429 + // Also, don't fire onDialogAccept on enter |
1428 + acceptButton.disabled = true; |
1430 + acceptButton.disabled = true; |
1429 + } else { |
1431 + } else { |
1430 + // morph the Cancel button into the Close button |
1432 + // morph the Cancel button into the Close button |
1431 + cancelButton.setAttribute ("icon", "close"); |
1433 + cancelButton.setAttribute ("icon", "close"); |
1498 + onget="return document.getAnonymousElementByAttribute(this, 'anonid', 'paneDeck');"/> |
1500 + onget="return document.getAnonymousElementByAttribute(this, 'anonid', 'paneDeck');"/> |
1499 + <property name="_paneDeckContainer" |
1501 + <property name="_paneDeckContainer" |
1500 + onget="return document.getAnonymousElementByAttribute(this, 'class', 'paneDeckContainer');"/> |
1502 + onget="return document.getAnonymousElementByAttribute(this, 'class', 'paneDeckContainer');"/> |
1501 + <property name="_selector" |
1503 + <property name="_selector" |
1502 + onget="return document.getAnonymousElementByAttribute(this, 'anonid', 'selector');"/> |
1504 + onget="return document.getAnonymousElementByAttribute(this, 'anonid', 'selector');"/> |
1503 + <property name="lastSelected" |
1505 + <property name="lastSelected" |
1504 + onget="return this.getAttribute('lastSelected');"> |
1506 + onget="return this.getAttribute('lastSelected');"> |
1505 + <setter> |
1507 + <setter> |
1506 + this.setAttribute("lastSelected", val); |
1508 + this.setAttribute("lastSelected", val); |
1507 + document.persist(this.id, "lastSelected"); |
1509 + document.persist(this.id, "lastSelected"); |
1508 + return val; |
1510 + return val; |
1509 + </setter> |
1511 + </setter> |
1510 + </property> |
1512 + </property> |
1511 + <property name="currentPane" |
1513 + <property name="currentPane" |
1512 + onset="return this._currentPane = val;"> |
1514 + onset="return this._currentPane = val;"> |
1513 + <getter> |
1515 + <getter> |
1514 + if (!this._currentPane) |
1516 + if (!this._currentPane) |
1515 + this._currentPane = this.preferencePanes[0]; |
1517 + this._currentPane = this.preferencePanes[0]; |
1516 + |
1518 + |
1517 + return this._currentPane; |
1519 + return this._currentPane; |
1518 + </getter> |
1520 + </getter> |
1519 + </property> |
1521 + </property> |
1520 + <field name="_currentPane">null</field> |
1522 + <field name="_currentPane">null</field> |
1521 + |
1523 + |
1522 + |
1524 + |
1523 + <method name="_makePaneButton"> |
1525 + <method name="_makePaneButton"> |
1524 + <parameter name="aPaneElement"/> |
1526 + <parameter name="aPaneElement"/> |
1525 + <body> |
1527 + <body> |
1526 + <![CDATA[ |
1528 + <![CDATA[ |
1527 + var radio = document.createElement("radio"); |
1529 + var radio = document.createElement("radio"); |
1549 + if (!aPaneElement.loaded) { |
1551 + if (!aPaneElement.loaded) { |
1550 + let OverlayLoadObserver = function(aPane) |
1552 + let OverlayLoadObserver = function(aPane) |
1551 + { |
1553 + { |
1552 + this._pane = aPane; |
1554 + this._pane = aPane; |
1553 + } |
1555 + } |
1554 + OverlayLoadObserver.prototype = { |
1556 + OverlayLoadObserver.prototype = { |
1555 + _outer: this, |
1557 + _outer: this, |
1556 + observe: function (aSubject, aTopic, aData) |
1558 + observe: function (aSubject, aTopic, aData) |
1557 + { |
1559 + { |
1558 + this._pane.loaded = true; |
1560 + this._pane.loaded = true; |
1559 + this._outer._fireEvent("paneload", this._pane); |
1561 + this._outer._fireEvent("paneload", this._pane); |
1560 + this._outer._selectPane(this._pane); |
1562 + this._outer._selectPane(this._pane); |
1561 + } |
1563 + } |
1562 + }; |
1564 + }; |
1563 + |
1565 + |
1564 + var obs = new OverlayLoadObserver(aPaneElement); |
1566 + var obs = new OverlayLoadObserver(aPaneElement); |
1565 + document.loadOverlay(aPaneElement.src, obs); |
1567 + document.loadOverlay(aPaneElement.src, obs); |
1566 + } |
1568 + } |
1567 + else |
1569 + else |
1568 + this._selectPane(aPaneElement); |
1570 + this._selectPane(aPaneElement); |
1569 + ]]> |
1571 + ]]> |
1570 + </body> |
1572 + </body> |
1571 + </method> |
1573 + </method> |
1572 + |
1574 + |
1573 + <method name="_fireEvent"> |
1575 + <method name="_fireEvent"> |
1574 + <parameter name="aEventName"/> |
1576 + <parameter name="aEventName"/> |
1575 + <parameter name="aTarget"/> |
1577 + <parameter name="aTarget"/> |
1576 + <body> |
1578 + <body> |
1577 + <![CDATA[ |
1579 + <![CDATA[ |
1578 + // Panel loaded, synthesize a load event. |
1580 + // Panel loaded, synthesize a load event. |
1579 + try { |
1581 + try { |
1580 + var event = document.createEvent("Events"); |
1582 + var event = document.createEvent("Events"); |
1581 + event.initEvent(aEventName, true, true); |
1583 + event.initEvent(aEventName, true, true); |
1582 + var cancel = !aTarget.dispatchEvent(event); |
1584 + var cancel = !aTarget.dispatchEvent(event); |
1583 + if (aTarget.hasAttribute("on" + aEventName)) { |
1585 + if (aTarget.hasAttribute("on" + aEventName)) { |
1584 + var fn = new Function ("event", aTarget.getAttribute("on" + aEventName)); |
1586 + var fn = new Function ("event", aTarget.getAttribute("on" + aEventName)); |
1585 + var rv = fn.call(aTarget, event); |
1587 + var rv = fn.call(aTarget, event); |
1586 + if (rv == false) |
1588 + if (rv == false) |
1587 + cancel = true; |
1589 + cancel = true; |
1588 + } |
1590 + } |
1589 + return !cancel; |
1591 + return !cancel; |
1590 + } |
1592 + } |
1591 + catch (e) { |
1593 + catch (e) { |
1592 + Components.utils.reportError(e); |
1594 + Components.utils.reportError(e); |
1593 + } |
1595 + } |
1594 + return false; |
1596 + return false; |
1595 + ]]> |
1597 + ]]> |
1596 + </body> |
1598 + </body> |
1597 + </method> |
1599 + </method> |
1598 + |
1600 + |
1599 + <field name="_initialized">false</field> |
1601 + <field name="_initialized">false</field> |
1600 + <method name="_selectPane"> |
1602 + <method name="_selectPane"> |
1601 + <parameter name="aPaneElement"/> |
1603 + <parameter name="aPaneElement"/> |
1602 + <body> |
1604 + <body> |
1603 + <![CDATA[ |
1605 + <![CDATA[ |
1612 + if (aPaneElement.helpTopic) |
1614 + if (aPaneElement.helpTopic) |
1613 + helpButton.hidden = false; |
1615 + helpButton.hidden = false; |
1614 + else |
1616 + else |
1615 + helpButton.hidden = true; |
1617 + helpButton.hidden = true; |
1616 + |
1618 + |
1617 + // Find this pane's index in the deck and set the deck's |
1619 + // Find this pane's index in the deck and set the deck's |
1618 + // selectedIndex to that value to switch to it. |
1620 + // selectedIndex to that value to switch to it. |
1619 + var prefpanes = this.preferencePanes; |
1621 + var prefpanes = this.preferencePanes; |
1620 + for (var i = 0; i < prefpanes.length; ++i) { |
1622 + for (var i = 0; i < prefpanes.length; ++i) { |
1621 + if (prefpanes[i] == aPaneElement) { |
1623 + if (prefpanes[i] == aPaneElement) { |
1622 + this._paneDeck.selectedIndex = i; |
1624 + this._paneDeck.selectedIndex = i; |
1623 + |
1625 + |
1624 + if (this.type != "child") { |
1626 + if (this.type != "child") { |
1625 + if (aPaneElement.hasAttribute("flex") && this._shouldAnimate && |
1627 + if (aPaneElement.hasAttribute("flex") && this._shouldAnimate && |
1626 + prefpanes.length > 1) |
1628 + prefpanes.length > 1) |
1627 + aPaneElement.removeAttribute("flex"); |
1629 + aPaneElement.removeAttribute("flex"); |
1628 + // Calling sizeToContent after the first prefpane is loaded |
1630 + // Calling sizeToContent after the first prefpane is loaded |
1688 + catch (e) { } |
1690 + catch (e) { } |
1689 + return animate; |
1691 + return animate; |
1690 + ]]> |
1692 + ]]> |
1691 + </getter> |
1693 + </getter> |
1692 + </property> |
1694 + </property> |
1693 + |
1695 + |
1694 + <method name="animate"> |
1696 + <method name="animate"> |
1695 + <parameter name="aOldPane"/> |
1697 + <parameter name="aOldPane"/> |
1696 + <parameter name="aNewPane"/> |
1698 + <parameter name="aNewPane"/> |
1697 + <body> |
1699 + <body> |
1698 + <![CDATA[ |
1700 + <![CDATA[ |
1699 + // if we are already resizing, use currentHeight |
1701 + // if we are already resizing, use currentHeight |
1700 + var oldHeight = this._currentHeight ? this._currentHeight : aOldPane.contentHeight; |
1702 + var oldHeight = this._currentHeight ? this._currentHeight : aOldPane.contentHeight; |
1701 + |
1703 + |
1702 + this._multiplier = aNewPane.contentHeight > oldHeight ? 1 : -1; |
1704 + this._multiplier = aNewPane.contentHeight > oldHeight ? 1 : -1; |
1703 + var sizeDelta = Math.abs(oldHeight - aNewPane.contentHeight); |
1705 + var sizeDelta = Math.abs(oldHeight - aNewPane.contentHeight); |
1704 + this._animateRemainder = sizeDelta % this._animateIncrement; |
1706 + this._animateRemainder = sizeDelta % this._animateIncrement; |
1705 + |
1707 + |
1706 + this._setUpAnimationTimer(oldHeight); |
1708 + this._setUpAnimationTimer(oldHeight); |
1707 + ]]> |
1709 + ]]> |
1708 + </body> |
1710 + </body> |
1709 + </method> |
1711 + </method> |
1710 + |
1712 + |
1711 + <property name="_sizeIncrement"> |
1713 + <property name="_sizeIncrement"> |
1712 + <getter> |
1714 + <getter> |
1713 + <![CDATA[ |
1715 + <![CDATA[ |
1714 + var lastSelectedPane = document.getElementById(this.lastSelected); |
1716 + var lastSelectedPane = document.getElementById(this.lastSelected); |
1715 + var increment = this._animateIncrement * this._multiplier; |
1717 + var increment = this._animateIncrement * this._multiplier; |
1716 + var newHeight = this._currentHeight + increment; |
1718 + var newHeight = this._currentHeight + increment; |
1717 + if ((this._multiplier > 0 && this._currentHeight >= lastSelectedPane.contentHeight) || |
1719 + if ((this._multiplier > 0 && this._currentHeight >= lastSelectedPane.contentHeight) || |
1718 + (this._multiplier < 0 && this._currentHeight <= lastSelectedPane.contentHeight)) |
1720 + (this._multiplier < 0 && this._currentHeight <= lastSelectedPane.contentHeight)) |
1719 + return 0; |
1721 + return 0; |
1720 + |
1722 + |
1721 + if ((this._multiplier > 0 && newHeight > lastSelectedPane.contentHeight) || |
1723 + if ((this._multiplier > 0 && newHeight > lastSelectedPane.contentHeight) || |
1722 + (this._multiplier < 0 && newHeight < lastSelectedPane.contentHeight)) |
1724 + (this._multiplier < 0 && newHeight < lastSelectedPane.contentHeight)) |
1723 + increment = this._animateRemainder * this._multiplier; |
1725 + increment = this._animateRemainder * this._multiplier; |
1724 + return increment; |
1726 + return increment; |
1725 + ]]> |
1727 + ]]> |
1726 + </getter> |
1728 + </getter> |
1727 + </property> |
1729 + </property> |
1728 + |
1730 + |
1729 + <method name="notify"> |
1731 + <method name="notify"> |
1730 + <parameter name="aTimer"/> |
1732 + <parameter name="aTimer"/> |
1731 + <body> |
1733 + <body> |
1732 + <![CDATA[ |
1734 + <![CDATA[ |
1733 + if (!document) |
1735 + if (!document) |
1734 + aTimer.cancel(); |
1736 + aTimer.cancel(); |
1735 + |
1737 + |
1736 + if (aTimer == this._animateTimer) { |
1738 + if (aTimer == this._animateTimer) { |
1737 + var increment = this._sizeIncrement; |
1739 + var increment = this._sizeIncrement; |
1738 + if (increment != 0) { |
1740 + if (increment != 0) { |
1739 + window.innerHeight += increment; |
1741 + window.innerHeight += increment; |
1740 + this._currentHeight += increment; |
1742 + this._currentHeight += increment; |
1754 + } |
1756 + } |
1755 + } |
1757 + } |
1756 + ]]> |
1758 + ]]> |
1757 + </body> |
1759 + </body> |
1758 + </method> |
1760 + </method> |
1759 + |
1761 + |
1760 + <method name="_setUpAnimationTimer"> |
1762 + <method name="_setUpAnimationTimer"> |
1761 + <parameter name="aStartHeight"/> |
1763 + <parameter name="aStartHeight"/> |
1762 + <body> |
1764 + <body> |
1763 + <![CDATA[ |
1765 + <![CDATA[ |
1764 + if (!this._animateTimer) |
1766 + if (!this._animateTimer) |
1765 + this._animateTimer = Components.classes["@mozilla.org/timer;1"] |
1767 + this._animateTimer = Components.classes["@mozilla.org/timer;1"] |
1766 + .createInstance(Components.interfaces.nsITimer); |
1768 + .createInstance(Components.interfaces.nsITimer); |
1767 + else |
1769 + else |
1768 + this._animateTimer.cancel(); |
1770 + this._animateTimer.cancel(); |
1769 + this._currentHeight = aStartHeight; |
1771 + this._currentHeight = aStartHeight; |
1770 + |
1772 + |
1771 + this._animateTimer.initWithCallback(this, this._animateDelay, |
1773 + this._animateTimer.initWithCallback(this, this._animateDelay, |
1772 + Components.interfaces.nsITimer.TYPE_REPEATING_SLACK); |
1774 + Components.interfaces.nsITimer.TYPE_REPEATING_SLACK); |
1773 + ]]> |
1775 + ]]> |
1774 + </body> |
1776 + </body> |
1775 + </method> |
1777 + </method> |
1776 + |
1778 + |
1777 + <method name="_setUpFadeTimer"> |
1779 + <method name="_setUpFadeTimer"> |
1778 + <body> |
1780 + <body> |
1779 + <![CDATA[ |
1781 + <![CDATA[ |
1780 + if (!this._fadeTimer) |
1782 + if (!this._fadeTimer) |
1781 + this._fadeTimer = Components.classes["@mozilla.org/timer;1"] |
1783 + this._fadeTimer = Components.classes["@mozilla.org/timer;1"] |
1782 + .createInstance(Components.interfaces.nsITimer); |
1784 + .createInstance(Components.interfaces.nsITimer); |
1783 + else |
1785 + else |
1784 + this._fadeTimer.cancel(); |
1786 + this._fadeTimer.cancel(); |
1785 + |
1787 + |
1786 + this._fadeTimer.initWithCallback(this, this._fadeDelay, |
1788 + this._fadeTimer.initWithCallback(this, this._fadeDelay, |
1787 + Components.interfaces.nsITimer.TYPE_REPEATING_SLACK); |
1789 + Components.interfaces.nsITimer.TYPE_REPEATING_SLACK); |
1788 + ]]> |
1790 + ]]> |
1789 + </body> |
1791 + </body> |
1790 + </method> |
1792 + </method> |
1791 + |
1793 + |
1792 + <field name="_animateTimer">null</field> |
1794 + <field name="_animateTimer">null</field> |
1793 + <field name="_fadeTimer">null</field> |
1795 + <field name="_fadeTimer">null</field> |
1794 + <field name="_animateDelay">15</field> |
1796 + <field name="_animateDelay">15</field> |
1795 + <field name="_animateIncrement">40</field> |
1797 + <field name="_animateIncrement">40</field> |
1796 + <field name="_fadeDelay">5</field> |
1798 + <field name="_fadeDelay">5</field> |
1802 + <method name="addPane"> |
1804 + <method name="addPane"> |
1803 + <parameter name="aPaneElement"/> |
1805 + <parameter name="aPaneElement"/> |
1804 + <body> |
1806 + <body> |
1805 + <![CDATA[ |
1807 + <![CDATA[ |
1806 + this.appendChild(aPaneElement); |
1808 + this.appendChild(aPaneElement); |
1807 + |
1809 + |
1808 + // Set up pane button |
1810 + // Set up pane button |
1809 + this._makePaneButton(aPaneElement); |
1811 + this._makePaneButton(aPaneElement); |
1810 + ]]> |
1812 + ]]> |
1811 + </body> |
1813 + </body> |
1812 + </method> |
1814 + </method> |
1813 + |
1815 + |
1814 + <method name="openSubDialog"> |
1816 + <method name="openSubDialog"> |
1815 + <parameter name="aURL"/> |
1817 + <parameter name="aURL"/> |
1816 + <parameter name="aFeatures"/> |
1818 + <parameter name="aFeatures"/> |
1817 + <parameter name="aParams"/> |
1819 + <parameter name="aParams"/> |
1818 + <body> |
1820 + <body> |
1819 + return openDialog(aURL, "", "modal,centerscreen,resizable=no" + (aFeatures != "" ? ("," + aFeatures) : ""), aParams); |
1821 + return openDialog(aURL, "", "modal,centerscreen,resizable=no" + (aFeatures != "" ? ("," + aFeatures) : ""), aParams); |
1820 + </body> |
1822 + </body> |
1821 + </method> |
1823 + </method> |
1822 + |
1824 + |
1823 + <method name="openWindow"> |
1825 + <method name="openWindow"> |
1824 + <parameter name="aWindowType"/> |
1826 + <parameter name="aWindowType"/> |
1825 + <parameter name="aURL"/> |
1827 + <parameter name="aURL"/> |
1826 + <parameter name="aFeatures"/> |
1828 + <parameter name="aFeatures"/> |
1827 + <parameter name="aParams"/> |
1829 + <parameter name="aParams"/> |
1854 + |
1856 + |
1855 + var secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"] |
1857 + var secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"] |
1856 + .getService(Components.interfaces.nsIScriptSecurityManager); |
1858 + .getService(Components.interfaces.nsIScriptSecurityManager); |
1857 + if (this.type == "child" && window.opener && |
1859 + if (this.type == "child" && window.opener && |
1858 + secMan.isSystemPrincipal(window.opener.document.nodePrincipal)) { |
1860 + secMan.isSystemPrincipal(window.opener.document.nodePrincipal)) { |
1859 + var psvc = Components.classes["@mozilla.org/preferences-service;1"] |
1861 + let psvc = Components.classes["@mozilla.org/preferences-service;1"] |
1860 + .getService(Components.interfaces.nsIPrefBranch); |
1862 + .getService(Components.interfaces.nsIPrefBranch); |
1861 + var pdocEl = window.opener.document.documentElement; |
1863 + var pdocEl = window.opener.document.documentElement; |
1862 + if (pdocEl.instantApply) { |
1864 + if (pdocEl.instantApply) { |
1863 + var panes = this.preferencePanes; |
1865 + let panes = this.preferencePanes; |
1864 + for (var i = 0; i < panes.length; ++i) |
1866 + for (let i = 0; i < panes.length; ++i) |
1865 + panes[i].writePreferences(true); |
1867 + panes[i].writePreferences(true); |
1866 + } |
1868 + } |
1867 + else { |
1869 + else { |
1868 + // Clone all the preferences elements from the child document and |
1870 + // Clone all the preferences elements from the child document and |
1869 + // insert them into the pane collection of the parent. |
1871 + // insert them into the pane collection of the parent. |
1870 + var pdoc = window.opener.document; |
1872 + var pdoc = window.opener.document; |
1871 + if (pdoc.documentElement.localName == "prefwindow") { |
1873 + if (pdoc.documentElement.localName == "prefwindow") { |
1872 + var currentPane = pdoc.documentElement.currentPane; |
1874 + var currentPane = pdoc.documentElement.currentPane; |
1873 + var id = window.location.href + "#childprefs"; |
1875 + var id = window.location.href + "#childprefs"; |
1874 + var childPrefs = pdoc.getElementById(id); |
1876 + var childPrefs = pdoc.getElementById(id); |
1875 + if (!childPrefs) { |
1877 + if (!childPrefs) { |
1876 + var childPrefs = pdoc.createElement("preferences"); |
1878 + childPrefs = pdoc.createElement("preferences"); |
1877 + currentPane.appendChild(childPrefs); |
1879 + currentPane.appendChild(childPrefs); |
1878 + childPrefs.id = id; |
1880 + childPrefs.id = id; |
1879 + } |
1881 + } |
1880 + var panes = this.preferencePanes; |
1882 + let panes = this.preferencePanes; |
1881 + for (var i = 0; i < panes.length; ++i) { |
1883 + for (let i = 0; i < panes.length; ++i) { |
1882 + var preferences = panes[i].preferences; |
1884 + var preferences = panes[i].preferences; |
1883 + for (var j = 0; j < preferences.length; ++j) { |
1885 + for (var j = 0; j < preferences.length; ++j) { |
1884 + // Try to find a preference element for the same preference. |
1886 + // Try to find a preference element for the same preference. |
1885 + var preference = null; |
1887 + var preference = null; |
1886 + var parentPreferences = pdoc.getElementsByTagName("preferences"); |
1888 + var parentPreferences = pdoc.getElementsByTagName("preferences"); |
1988 + psvc.savePrefFile(null); |
1990 + psvc.savePrefFile(null); |
1989 + } |
1991 + } |
1990 + ]]> |
1992 + ]]> |
1991 + </body> |
1993 + </body> |
1992 + </method> |
1994 + </method> |
1993 + |
1995 + |
1994 + <property name="src" |
1996 + <property name="src" |
1995 + onget="return this.getAttribute('src');" |
1997 + onget="return this.getAttribute('src');" |
1996 + onset="this.setAttribute('src', val); return val;"/> |
1998 + onset="this.setAttribute('src', val); return val;"/> |
1997 + <property name="selected" |
1999 + <property name="selected" |
1998 + onget="return this.getAttribute('selected') == 'true';" |
2000 + onget="return this.getAttribute('selected') == 'true';" |
1999 + onset="this.setAttribute('selected', val); return val;"/> |
2001 + onset="this.setAttribute('selected', val); return val;"/> |
2000 + <property name="image" |
2002 + <property name="image" |
2001 + onget="return this.getAttribute('image');" |
2003 + onget="return this.getAttribute('image');" |
2002 + onset="this.setAttribute('image', val); return val;"/> |
2004 + onset="this.setAttribute('image', val); return val;"/> |
2003 + <property name="label" |
2005 + <property name="label" |
2004 + onget="return this.getAttribute('label');" |
2006 + onget="return this.getAttribute('label');" |
2005 + onset="this.setAttribute('label', val); return val;"/> |
2007 + onset="this.setAttribute('label', val); return val;"/> |
2006 + |
2008 + |
2007 + <property name="preferenceElements" |
2009 + <property name="preferenceElements" |
2008 + onget="return this.getElementsByAttribute('preference', '*');"/> |
2010 + onget="return this.getElementsByAttribute('preference', '*');"/> |
2009 + <property name="preferences" |
2011 + <property name="preferences" |
2010 + onget="return this.getElementsByTagName('preference');"/> |
2012 + onget="return this.getElementsByTagName('preference');"/> |
2011 + |
2013 + |
2025 + ]]> |
2027 + ]]> |
2026 + </getter> |
2028 + </getter> |
2027 + </property> |
2029 + </property> |
2028 + |
2030 + |
2029 + <field name="_loaded">false</field> |
2031 + <field name="_loaded">false</field> |
2030 + <property name="loaded" |
2032 + <property name="loaded" |
2031 + onget="return !this.src ? true : this._loaded;" |
2033 + onget="return !this.src ? true : this._loaded;" |
2032 + onset="this._loaded = val; return val;"/> |
2034 + onset="this._loaded = val; return val;"/> |
2033 + |
2035 + |
2034 + <method name="preferenceForElement"> |
2036 + <method name="preferenceForElement"> |
2035 + <parameter name="aElement"/> |
2037 + <parameter name="aElement"/> |
2036 + <body> |
2038 + <body> |
2037 + return document.getElementById(aElement.getAttribute("preference")); |
2039 + return document.getElementById(aElement.getAttribute("preference")); |
2038 + </body> |
2040 + </body> |
2039 + </method> |
2041 + </method> |
2040 + |
2042 + |
2041 + <method name="getPreferenceElement"> |
2043 + <method name="getPreferenceElement"> |
2042 + <parameter name="aStartElement"/> |
2044 + <parameter name="aStartElement"/> |
2043 + <body> |
2045 + <body> |
2044 + <![CDATA[ |
2046 + <![CDATA[ |
2045 + var temp = aStartElement; |
2047 + var temp = aStartElement; |
2046 + while (temp && temp.nodeType == Node.ELEMENT_NODE && |
2048 + while (temp && temp.nodeType == Node.ELEMENT_NODE && |
2047 + !temp.hasAttribute("preference")) |
2049 + !temp.hasAttribute("preference")) |
2048 + temp = temp.parentNode; |
2050 + temp = temp.parentNode; |
2049 + return temp.nodeType == Node.ELEMENT_NODE ? temp : aStartElement; |
2051 + return temp.nodeType == Node.ELEMENT_NODE ? temp : aStartElement; |
2050 + ]]> |
2052 + ]]> |
2051 + </body> |
2053 + </body> |
2052 + </method> |
2054 + </method> |
2053 + |
2055 + |
2054 + <field name="DeferredTask" readonly="true"> |
2056 + <field name="DeferredTask" readonly="true"> |
2055 + let targetObj = {}; |
2057 + let targetObj = {}; |
2056 + Components.utils.import("resource://gre/modules/DeferredTask.jsm", targetObj); |
2058 + Components.utils.import("resource://gre/modules/DeferredTask.jsm", targetObj); |
2057 + targetObj.DeferredTask; |
2059 + targetObj.DeferredTask; |
2058 + </field> |
2060 + </field> |
2119 + document.getAnonymousElementByAttribute(this, "class", "content-box"); |
2121 + document.getAnonymousElementByAttribute(this, "class", "content-box"); |
2120 + </field> |
2122 + </field> |
2121 + </implementation> |
2123 + </implementation> |
2122 + <handlers> |
2124 + <handlers> |
2123 + <handler event="command"> |
2125 + <handler event="command"> |
2124 + // This "command" event handler tracks changes made to preferences by |
2126 + // This "command" event handler tracks changes made to preferences by |
2125 + // the user in this window. |
2127 + // the user in this window. |
2126 + if (event.sourceEvent) |
2128 + if (event.sourceEvent) |
2127 + event = event.sourceEvent; |
2129 + event = event.sourceEvent; |
2128 + this.userChangedValue(event.target); |
2130 + this.userChangedValue(event.target); |
2129 + </handler> |
2131 + </handler> |
2130 + <handler event="select"> |
2132 + <handler event="select"> |
2131 + // This "select" event handler tracks changes made to colorpicker |
2133 + // This "select" event handler tracks changes made to colorpicker |
2132 + // preferences by the user in this window. |
2134 + // preferences by the user in this window. |
2133 + if (event.target.localName == "colorpicker") |
2135 + if (event.target.localName == "colorpicker") |
2134 + this.userChangedValue(event.target); |
2136 + this.userChangedValue(event.target); |
2135 + </handler> |
2137 + </handler> |
2136 + <handler event="change"> |
2138 + <handler event="change"> |
2137 + // This "change" event handler tracks changes made to preferences by |
2139 + // This "change" event handler tracks changes made to preferences by |
2138 + // the user in this window. |
2140 + // the user in this window. |
2139 + this.userChangedValue(event.target); |
2141 + this.userChangedValue(event.target); |
2140 + </handler> |
2142 + </handler> |
2141 + <handler event="input"> |
2143 + <handler event="input"> |
2142 + // This "input" event handler tracks changes made to preferences by |
2144 + // This "input" event handler tracks changes made to preferences by |
2143 + // the user in this window. |
2145 + // the user in this window. |
2144 + this.userChangedValue(event.target); |
2146 + this.userChangedValue(event.target); |
2145 + </handler> |
2147 + </handler> |
2146 + <handler event="paneload"> |
2148 + <handler event="paneload"> |
2147 + <![CDATA[ |
2149 + <![CDATA[ |