releases-comm-central/mail/base/content/sanitizeDialog.js

211 строки
6.1 KiB
JavaScript

/* 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/. */
/* import-globals-from sanitize.js */
window.addEventListener("load", () => {
gSanitizePromptDialog.init();
});
var gSanitizePromptDialog = {
get bundleBrowser() {
if (!this._bundleBrowser) {
this._bundleBrowser = document.getElementById("bundleBrowser");
}
return this._bundleBrowser;
},
get selectedTimespan() {
var durList = document.getElementById("sanitizeDurationChoice");
return parseInt(durList.value);
},
get warningBox() {
return document.getElementById("sanitizeEverythingWarningBox");
},
init() {
// This is used by selectByTimespan() to determine if the window has loaded.
this._inited = true;
var s = new Sanitizer();
s.prefDomain = "privacy.cpd.";
document.getElementById("sanitizeDurationChoice").value =
Services.prefs.getIntPref("privacy.sanitize.timeSpan");
const sanitizeItemList = document.querySelectorAll(
"#historyGroup > [preference]"
);
for (const prefItem of sanitizeItemList) {
const name = s.getNameFromPreference(prefItem.getAttribute("preference"));
if (!s.canClearItem(name)) {
prefItem.preference = null;
prefItem.checked = false;
prefItem.disabled = true;
} else {
prefItem.checked = Services.prefs.getBoolPref(
prefItem.getAttribute("preference")
);
}
}
this.onReadGeneric();
document.querySelector("dialog").getButton("accept").label =
this.bundleBrowser.getString("sanitizeButtonOK");
const warningIcon = document.getElementById(
"sanitizeEverythingWarningIcon"
);
warningIcon.setAttribute(
"src",
"chrome://messenger/skin/icons/new/activity/warning.svg"
);
if (this.selectedTimespan === Sanitizer.TIMESPAN_EVERYTHING) {
this.prepareWarning();
this.warningBox.hidden = false;
document.title = this.bundleBrowser.getString(
"sanitizeDialog2.everything.title"
);
} else {
this.warningBox.hidden = true;
}
},
selectByTimespan() {
// This method is the onselect handler for the duration dropdown. As a
// result it's called a couple of times before onload calls init().
if (!this._inited) {
return;
}
var warningBox = this.warningBox;
// If clearing everything
if (this.selectedTimespan === Sanitizer.TIMESPAN_EVERYTHING) {
this.prepareWarning();
if (warningBox.hidden) {
warningBox.hidden = false;
}
window.sizeToContent();
window.document.title = this.bundleBrowser.getString(
"sanitizeDialog2.everything.title"
);
return;
}
// If clearing a specific time range
if (!warningBox.hidden) {
window.resizeBy(0, -warningBox.getBoundingClientRect().height);
warningBox.hidden = true;
}
},
sanitize() {
// Update pref values before handing off to the sanitizer (bug 453440)
this.updatePrefs();
var s = new Sanitizer();
s.prefDomain = "privacy.cpd.";
s.range = Sanitizer.getClearRange(this.selectedTimespan);
s.ignoreTimespan = !s.range;
try {
s.sanitize();
} catch (er) {
console.error("Exception during sanitize: " + er);
}
},
/**
* If the panel that displays a warning when the duration is "Everything" is
* not set up, sets it up. Otherwise does nothing.
*/
prepareWarning() {
// If the date and time-aware locale warning string is ever used again,
// initialize it here. Currently we use the no-visits warning string,
// which does not include date and time. See bug 480169 comment 48.
var warningStringID;
if (this.hasNonSelectedItems()) {
warningStringID = "sanitizeSelectedWarning";
} else {
warningStringID = "sanitizeEverythingWarning2";
}
var warningDesc = document.getElementById("sanitizeEverythingWarning");
warningDesc.textContent = this.bundleBrowser.getString(warningStringID);
},
/**
* Called when the value of a preference element is synced from the actual
* pref. Enables or disables the OK button appropriately.
*/
onReadGeneric() {
var found = false;
// Find any other pref that's checked and enabled.
const sanitizeItemList = document.querySelectorAll(
"#historyGroup > [preference]"
);
for (const prefItem of sanitizeItemList) {
found = !prefItem.disabled && prefItem.checked;
if (found) {
break;
}
}
try {
document.querySelector("dialog").getButton("accept").disabled = !found;
} catch (e) {}
// Update the warning prompt if needed
this.prepareWarning();
return undefined;
},
/**
* Sanitizer.prototype.sanitize() requires the prefs to be up-to-date.
* Because the type of this prefwindow is "child" -- and that's needed because
* without it the dialog has no OK and Cancel buttons -- the prefs are not
* updated on dialogaccept on platforms that don't support instant-apply
* (i.e., Windows). We must therefore manually set the prefs from their
* corresponding preference elements.
*/
updatePrefs() {
Sanitizer.prefs.setIntPref("timeSpan", this.selectedTimespan);
// Now manually set the prefs from their corresponding preference elements.
const sanitizeItemList = document.querySelectorAll(
"#historyGroup > [preference]"
);
for (const prefItem of sanitizeItemList) {
const prefName = prefItem.getAttribute("preference");
Services.prefs.setBoolPref(prefName, prefItem.checked);
}
},
/**
* Check if all of the history items have been selected like the default status.
*/
hasNonSelectedItems() {
const sanitizeItemList = document.querySelectorAll(
"#historyGroup > [preference]"
);
for (const prefItem of sanitizeItemList) {
if (!prefItem.checked) {
return true;
}
}
return false;
},
};
document.addEventListener("dialogaccept", () =>
gSanitizePromptDialog.sanitize()
);