diff --git a/browser/components/preferences/privacy.js b/browser/components/preferences/privacy.js
index 2315c9a33666..d04c8302735d 100644
--- a/browser/components/preferences/privacy.js
+++ b/browser/components/preferences/privacy.js
@@ -47,17 +47,7 @@ var gPrivacyPane = {
*/
init: function ()
{
- this.historyDaysPrefChanged();
-
- var self = this;
- function checkboxChanged() {
- self.onchangeHistoryDaysCheckbox();
- }
- var historyDaysCheckbox = document.getElementById("rememberHistoryDays");
- historyDaysCheckbox.addEventListener("CheckboxStateChange",
- checkboxChanged,
- false);
-
+ this._updateHistoryDaysUI();
this.updateClearNowButtonLabel();
},
@@ -68,6 +58,9 @@ var gPrivacyPane = {
*
* browser.history_expire_days
* - the number of days of history to remember
+ * browser.history_expire_days.mirror
+ * - a preference whose value mirrors that of browser.history_expire_days, to
+ * make the "days of history" checkbox easier to code
* browser.formfill.enable
* - true if entries in forms and the search bar should be saved, false
* otherwise
@@ -80,55 +73,59 @@ var gPrivacyPane = {
* 2 means never remove downloads
*/
- // XXXjwalden the UI for days of history to remember is totally broken -- I blame beltzner
-
/**
- * Enables/disables the history days textbox based on the state of the
- * associated checkbox.
+ * Initializes the days-of-history mirror preference and connects it to the
+ * days-of-history checkbox so that updates to the textbox are transmitted to
+ * the real days-of-history preference.
*/
- historyDaysPrefChanged: function ()
+ _updateHistoryDaysUI: function ()
{
var pref = document.getElementById("browser.history_expire_days");
+ var mirror = document.getElementById("browser.history_expire_days.mirror");
var textbox = document.getElementById("historyDays");
var checkbox = document.getElementById("rememberHistoryDays");
- var prefVal = pref.value;
- textbox.disabled = (prefVal == 0);
- textbox.value = prefVal;
- checkbox.checked = (prefVal != 0);
- },
-
- /**
- * Handles enabling/disabling the "days of history" textbox based on the state
- * of the associated checkbox.
- */
- onchangeHistoryDaysCheckbox: function (event)
- {
- var textbox = document.getElementById("historyDays");
- var checkbox = document.getElementById("rememberHistoryDays");
+ // handle mirror non-existence or mirror/pref unsync
+ if (mirror.value === null || mirror.value != pref.value)
+ mirror.value = pref.value ? pref.value : pref.defaultValue;
+ checkbox.checked = (pref.value > 0);
textbox.disabled = !checkbox.checked;
- if (!checkbox.checked) {
- var pref = document.getElementById("browser.history_expire_days");
- pref.value = 0;
- }
+
+ // hook up textbox to mirror preference and force a preference read
+ textbox.setAttribute("onsynctopreference", "return gPrivacyPane._writeHistoryDaysMirror();");
+ textbox.setAttribute("preference", "browser.history_expire_days.mirror");
+ mirror.updateElements();
},
/**
- * Sets the value of browser.history_expire_days appropriately based on the
- * value displayed in UI.
+ * Stores the days of history to the actual days-of-history preference and
+ * returns that value, to be stored in the mirror preference.
*/
- changeHistoryDays: function ()
+ _writeHistoryDaysMirror: function ()
{
var pref = document.getElementById("browser.history_expire_days");
- var historyDays = document.getElementById("historyDays");
+ var textbox = document.getElementById("historyDays");
+ pref.value = textbox.value;
- // allow deletion of everything before typing a new value
- if (historyDays.value == "")
- return;
+ // don't override the value in the textbox
+ return undefined;
+ },
- var uiValue = parseInt(historyDays.value, 10);
- pref.value = isNaN(uiValue) ? 0 : uiValue;
+ /**
+ * Responds to the checking or unchecking of the days-of-history UI, storing
+ * the appropriate value to the days-of-history preference and enabling or
+ * disabling the number textbox as appropriate.
+ */
+ onchangeHistoryDaysCheck: function ()
+ {
+ var pref = document.getElementById("browser.history_expire_days");
+ var mirror = document.getElementById("browser.history_expire_days.mirror");
+ var textbox = document.getElementById("historyDays");
+ var checkbox = document.getElementById("rememberHistoryDays");
+
+ pref.value = checkbox.checked ? mirror.value : 0;
+ textbox.disabled = !checkbox.checked;
},
/**
diff --git a/browser/components/preferences/privacy.xul b/browser/components/preferences/privacy.xul
index de4c83a525d2..5afa7303c1ff 100644
--- a/browser/components/preferences/privacy.xul
+++ b/browser/components/preferences/privacy.xul
@@ -65,8 +65,10 @@
+ type="int"/>
+
@@ -96,9 +98,8 @@
-
+ oncommand="gPrivacyPane.onchangeHistoryDaysCheck();"/>
+
-
-