/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* 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 ../../../toolkit/content/preferencesBindings.js */ var {Sanitizer} = ChromeUtils.import("resource:///modules/Sanitizer.jsm"); var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm"); Preferences.addAll([ { id: "privacy.cpd.history", type: "bool" }, { id: "privacy.cpd.formdata", type: "bool" }, { id: "privacy.cpd.downloads", type: "bool", disabled: true }, { id: "privacy.cpd.cookies", type: "bool" }, { id: "privacy.cpd.cache", type: "bool" }, { id: "privacy.cpd.sessions", type: "bool" }, { id: "privacy.cpd.offlineApps", type: "bool" }, { id: "privacy.cpd.siteSettings", type: "bool" }, { id: "privacy.sanitize.timeSpan", type: "int" }, ]); var gSanitizePromptDialog = { 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; let OKButton = document.documentElement.getButton("accept"); document.l10n.setAttributes(OKButton, "sanitize-button-ok"); if (this.selectedTimespan === Sanitizer.TIMESPAN_EVERYTHING) { this.prepareWarning(); this.warningBox.hidden = false; document.l10n.setAttributes(document.documentElement, "dialog-title-everything"); let warningDesc = document.getElementById("sanitizeEverythingWarning"); // Ensure we've translated and sized the warning. document.mozSubdialogReady = document.l10n.translateFragment(warningDesc).then(() => { // And then ensure we've run layout. let rootWin = window.docShell.rootTreeItem.QueryInterface(Ci.nsIDocShell).domWindow; return rootWin.promiseDocumentFlushed(() => {}); }); } 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.resizeBy(0, warningBox.boxObject.height); } document.l10n.setAttributes(document.documentElement, "dialog-title-everything"); return; } // If clearing a specific time range if (!warningBox.hidden) { window.resizeBy(0, -warningBox.boxObject.height); warningBox.hidden = true; } document.l10n.setAttributes(document.documentElement, "dialog-title"); }, sanitize() { // Update pref values before handing off to the sanitizer (bug 453440) this.updatePrefs(); // As the sanitize is async, we disable the buttons, update the label on // the 'accept' button to indicate things are happening and return false - // once the async operation completes (either with or without errors) // we close the window. let docElt = document.documentElement; let acceptButton = docElt.getButton("accept"); acceptButton.disabled = true; document.l10n.setAttributes(acceptButton, "sanitize-button-clearing"); docElt.getButton("cancel").disabled = true; try { let range = Sanitizer.getClearRange(this.selectedTimespan); let options = { ignoreTimespan: !range, range, }; Sanitizer.sanitize(null, options) .catch(Cu.reportError) .then(() => window.close()) .catch(Cu.reportError); return false; } catch (er) { Cu.reportError("Exception during sanitize: " + er); return true; // We *do* want to close immediately on error. } }, /** * 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 warningDesc = document.getElementById("sanitizeEverythingWarning"); if (this.hasNonSelectedItems()) { document.l10n.setAttributes(warningDesc, "sanitize-selected-warning"); } else { document.l10n.setAttributes(warningDesc, "sanitize-everything-warning"); } }, /** * Return the boolean prefs that enable/disable clearing of various kinds * of history. The only pref this excludes is privacy.sanitize.timeSpan. */ _getItemPrefs() { return Preferences.getAll().filter(p => p.id !== "privacy.sanitize.timeSpan"); }, /** * Called when the value of a preference element is synced from the actual * pref. Enables or disables the OK button appropriately. */ onReadGeneric() { // Find any other pref that's checked and enabled (except for // privacy.sanitize.timeSpan, which doesn't affect the button's status). var found = this._getItemPrefs().some(pref => !!pref.value && !pref.disabled); try { document.documentElement.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. We must therefore manually set the prefs * from their corresponding preference elements. */ updatePrefs() { Services.prefs.setIntPref(Sanitizer.PREF_TIMESPAN, this.selectedTimespan); // Keep the pref for the download history in sync with the history pref. Preferences.get("privacy.cpd.downloads").value = Preferences.get("privacy.cpd.history").value; // Now manually set the prefs from their corresponding preference // elements. var prefs = this._getItemPrefs(); for (let i = 0; i < prefs.length; ++i) { var p = prefs[i]; Services.prefs.setBoolPref(p.name, p.value); } }, /** * Check if all of the history items have been selected like the default status. */ hasNonSelectedItems() { let checkboxes = document.querySelectorAll("checkbox[preference]"); for (let i = 0; i < checkboxes.length; ++i) { let pref = Preferences.get(checkboxes[i].getAttribute("preference")); if (!pref.value) return true; } return false; }, };