X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=common%2Fmodules%2Fsanitizer.jsm;h=9b4eb547805e9b2e8a859bf8be683d9dde855715;hb=8b6fcae7eaa413bc62d645d2d0c99835c47265e6;hp=e240424dba36f7af3ee308008d01adbbc65670c8;hpb=70740024f9c028c1fd63e1a1850ab062ff956054;p=dactyl.git diff --git a/common/modules/sanitizer.jsm b/common/modules/sanitizer.jsm index e240424..9b4eb54 100644 --- a/common/modules/sanitizer.jsm +++ b/common/modules/sanitizer.jsm @@ -1,5 +1,5 @@ // Copyright (c) 2009 by Doug Kearns -// Copyright (c) 2009-2011 by Kris Maglione +// Copyright (c) 2009-2012 Kris Maglione // // This work is licensed for reuse under an MIT license. Details are // given in the LICENSE.txt file included with this file. @@ -12,16 +12,17 @@ // FIXME: // - finish 1.9.0 support if we're going to support sanitizing in Melodactyl -try { - -Components.utils.import("resource://dactyl/bootstrap.jsm"); defineModule("sanitizer", { exports: ["Range", "Sanitizer", "sanitizer"], - use: ["config"], - require: ["messages", "prefs", "services", "storage", "template", "util"] -}, this); + require: ["config", "prefs", "services", "util"] +}); + +lazyRequire("messages", ["_"]); +lazyRequire("overlay", ["overlay"]); +lazyRequire("storage", ["storage"]); +lazyRequire("template", ["template"]); -let tmp = {}; +let tmp = Object.create(this); JSMLoader.loadSubScript("chrome://browser/content/sanitize.js", tmp); tmp.Sanitizer.prototype.__proto__ = Class.prototype; @@ -56,7 +57,7 @@ var Item = Class("SanitizeItem", { shouldSanitize: function (shutdown) (!shutdown || this.builtin || this.persistent) && prefs.get(shutdown ? this.shutdownPref : this.pref) }, { - PREFIX: localPrefs.branch.root, + PREFIX: config.prefs.branch.root, BRANCH: "privacy.cpd.", SHUTDOWN_BRANCH: "privacy.clearOnShutdown." }); @@ -120,12 +121,16 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef }, override: true }); - if (services.has("privateBrowsing")) + try { + var { ForgetAboutSite } = Cu.import("resource://gre/modules/ForgetAboutSite.jsm", {}); + } + catch (e) {} + if (ForgetAboutSite) this.addItem("host", { description: "All data from the given host", action: function (range, host) { if (host) - services.privateBrowsing.removeDataFromDomain(host); + ForgetAboutSite.removeDataFromDomain(host); } }); this.addItem("sitesettings", { @@ -164,13 +169,12 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef ]; function prefOverlay(branch, persistent, local) update(Object.create(local), { - before: array.toObject([ - [branch.substr(Item.PREFIX.length) + "history", - { - template.map(ourItems(persistent), function (item) - ) - }.*::*] - ]), + before: [ + ["preferences", { id: branch.substr(Item.PREFIX.length) + "history", + xmlns: "xul" }, + template.map(ourItems(persistent), function (item) + ["preference", { type: "bool", id: branch + item.name, name: branch + item.name }])] + ], init: function init(win) { let pane = win.document.getElementById("SanitizeDialogPane"); for (let [, pref] in iter(pane.preferences)) @@ -179,60 +183,59 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef } }); - let (branch = Item.PREFIX + Item.SHUTDOWN_BRANCH) { - util.overlayWindow("chrome://browser/content/preferences/sanitize.xul", - function (win) prefOverlay(branch, true, { - append: { - SanitizeDialogPane: - - - - - { - let (items = ourItems(true)) - template.map(util.range(0, Math.ceil(items.length / 2)), function (i) - { - template.map(items.slice(i * 2, i * 2 + 2), function (item) - ) - }) - } - - - } - })); - } - let (branch = Item.PREFIX + Item.BRANCH) { - util.overlayWindow("chrome://browser/content/sanitize.xul", - function (win) prefOverlay(branch, false, { - append: { - itemList: <> - - { - template.map(ourItems(), function ([item, desc]) - ) - } - - }, - init: function (win) { - let elem = win.document.getElementById("itemList"); - elem.setAttribute("rows", elem.itemCount); - win.Sanitizer = Class("Sanitizer", win.Sanitizer, { - sanitize: function sanitize() { - self.withSavedValues(["sanitizing"], function () { - self.sanitizing = true; - sanitize.superapply(this, arguments); - sanitizer.sanitizeItems([item.name for (item in values(self.itemMap)) - if (item.shouldSanitize(false))], - Range.fromArray(this.range || [])); - }, this); - } - }); - } - })); - } + util.timeout(function () { // Load order issue... + + let (branch = Item.PREFIX + Item.SHUTDOWN_BRANCH) { + overlay.overlayWindow("chrome://browser/content/preferences/sanitize.xul", + function (win) prefOverlay(branch, true, { + append: { + SanitizeDialogPane: + ["groupbox", { orient: "horizontal", xmlns: "xul" }, + ["caption", { label: config.appName + /*L*/" (see :help privacy)" }], + ["grid", { flex: "1" }, + ["columns", {}, + ["column", { flex: "1" }], + ["column", { flex: "1" }]], + ["rows", {}, + let (items = ourItems(true)) + template.map(util.range(0, Math.ceil(items.length / 2)), function (i) + ["row", {}, + template.map(items.slice(i * 2, i * 2 + 2), function (item) + ["checkbox", { xmlns: XUL, label: item.description, preference: branch + item.name }])])]]], + } + })); + } + let (branch = Item.PREFIX + Item.BRANCH) { + overlay.overlayWindow("chrome://browser/content/sanitize.xul", + function (win) prefOverlay(branch, false, { + append: { + itemList: [ + ["listitem", { xmlns: "xul", label: /*L*/"See :help privacy for the following:", + disabled: "true", style: "font-style: italic; font-weight: bold;" }], + template.map(ourItems(), function ([item, desc]) + ["listitem", { xmlns: "xul", preference: branch + item, + type: "checkbox", label: config.appName + ", " + desc, + onsyncfrompreference: "return gSanitizePromptDialog.onReadGeneric();" }]), + ] + }, + ready: function ready(win) { + let elem = win.document.getElementById("itemList"); + elem.setAttribute("rows", elem.itemCount); + win.Sanitizer = Class("Sanitizer", win.Sanitizer, { + sanitize: function sanitize() { + self.withSavedValues(["sanitizing"], function () { + self.sanitizing = true; + sanitize.superapply(this, arguments); + sanitizer.sanitizeItems([item.name for (item in values(self.itemMap)) + if (item.shouldSanitize(false))], + Range.fromArray(this.range || [])); + }, this); + } + }); + } + })); + } + }); }, firstRun: 0, @@ -291,12 +294,32 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef } }, - get ranAtShutdown() localPrefs.get("didSanitizeOnShutdown"), - set ranAtShutdown(val) localPrefs.set("didSanitizeOnShutdown", Boolean(val)), + /** + * Returns a load context for the given thing, to be used with + * interfaces needing one for per-window private browsing support. + * + * @param {Window|Document|Node} thing The thing for which to return + * a load context. + */ + getContext: function getContext(thing) { + if (!Ci.nsILoadContext) + return null; + + if (thing instanceof Ci.nsIDOMNode && thing.ownerDocument) + thing = thing.ownerDocument; + if (thing instanceof Ci.nsIDOMDocument) + thing = thing.defaultView; + if (thing instanceof Ci.nsIInterfaceRequestor) + thing = thing.getInterface(Ci.nsIWebNavigation); + return thing.QueryInterface(Ci.nsILoadContext); + }, + + get ranAtShutdown() config.prefs.get("didSanitizeOnShutdown"), + set ranAtShutdown(val) config.prefs.set("didSanitizeOnShutdown", Boolean(val)), get runAtShutdown() prefs.get("privacy.sanitize.sanitizeOnShutdown"), set runAtShutdown(val) prefs.set("privacy.sanitize.sanitizeOnShutdown", Boolean(val)), - sanitize: function (items, range) + sanitize: function sanitize(items, range) this.withSavedValues(["sanitizing"], function () { this.sanitizing = true; let errors = this.sanitizeItems(items, range, null); @@ -320,7 +343,7 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef return errors; }), - sanitizeItems: function (items, range, host, key) + sanitizeItems: function sanitizeItems(items, range, host, key) this.withSavedValues(["sanitizing"], function () { this.sanitizing = true; if (items == null) @@ -348,7 +371,7 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef session: 8 }, - UNPERMS: Class.memoize(function () iter(this.PERMS).map(Array.reverse).toObject()), + UNPERMS: Class.Memoize(function () iter(this.PERMS).map(Array.reverse).toObject()), COMMANDS: { unset: /*L*/"Unset", @@ -369,44 +392,49 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef prefToArg: function (pref) pref.replace(/.*\./, "").toLowerCase(), iterCookies: function iterCookies(host) { - let iterator = host ? services.cookies.getCookiesFromHost(host) - : services.cookies; - for (let c in iter(iterator)) - yield c.QueryInterface(Ci.nsICookie2); + for (let c in iter(services.cookies, Ci.nsICookie2)) + if (!host || util.isSubdomain(c.rawHost, host) || + c.host[0] == "." && c.host.length < host.length + && host.indexOf(c.host) == host.length - c.host.length) + yield c; + }, iterPermissions: function iterPermissions(host) { - for (let p in iter(services.permissions)) { - p.QueryInterface(Ci.nsIPermission); + for (let p in iter(services.permissions, Ci.nsIPermission)) if (!host || util.isSubdomain(p.host, host)) yield p; - } } }, { - load: function (dactyl, modules, window) { + load: function initLoad(dactyl, modules, window) { if (!sanitizer.firstRun++ && sanitizer.runAtShutdown && !sanitizer.ranAtShutdown) sanitizer.sanitizeItems(null, Range(), null, "shutdown"); sanitizer.ranAtShutdown = false; }, - autocommands: function (dactyl, modules, window) { + autocommands: function initAutocommands(dactyl, modules, window) { + const { autocommands } = modules; + storage.addObserver("private-mode", function (key, event, value) { - modules.autocommands.trigger("PrivateMode", { state: value }); + autocommands.trigger("PrivateMode", { state: value }); }, window); storage.addObserver("sanitizer", function (key, event, value) { if (event == "domain") - modules.autocommands.trigger("SanitizeDomain", { domain: value }); + autocommands.trigger("SanitizeDomain", { domain: value }); else if (!value[1]) - modules.autocommands.trigger("Sanitize", { name: event.substr("clear-".length), domain: value[1] }); + autocommands.trigger("Sanitize", { name: event.substr("clear-".length), domain: value[1] }); }, window); }, - commands: function (dactyl, modules, window) { + commands: function initCommands(dactyl, modules, window) { const { commands } = modules; commands.add(["sa[nitize]"], "Clear private data", function (args) { dactyl.assert(!modules.options['private'], _("command.sanitize.privateMode")); + if (args["-host"] && !args.length && !args.bang) + args[0] = "all"; + let timespan = args["-timespan"] || modules.options["sanitizetimespan"]; let range = Range(); @@ -415,17 +443,15 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef match ? 1000 * (Date.now() - 1000 * parseInt(num, 10) * { m: 60, h: 3600, d: 3600 * 24, w: 3600 * 24 * 7 }[unit]) : (timespan[0] == "s" ? sanitizer.sessionStart : null); - let items = args.slice(); - if (args["-host"] && !args.length) - args[0] = "all"; - - if (args.bang) { + let opt = modules.options.get("sanitizeitems"); + if (args.bang) dactyl.assert(args.length == 0, _("error.trailingCharacters")); - items = Object.keys(sanitizer.itemMap).filter( - function (k) modules.options.get("sanitizeitems").has(k)); + else { + dactyl.assert(opt.validator(args), _("error.invalidArgument")); + opt = { __proto__: opt, value: args.slice() }; } - else - dactyl.assert(modules.options.get("sanitizeitems").validator(items), _("error.invalidArgument")); + + let items = Object.keys(sanitizer.itemMap).slice(1).filter(opt.has, opt); function sanitize(items) { sanitizer.range = range.native; @@ -441,13 +467,12 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef sanitizer.sanitize(items, range); } - if (items.indexOf("all") >= 0) + if (array.nth(opt.value, function (i) i == "all" || /^!/.test(i), 0) == "all" && !args["-host"]) modules.commandline.input(_("sanitize.prompt.deleteAll") + " ", function (resp) { if (resp.match(/^y(es)?$/i)) { - items = Object.keys(sanitizer.itemMap).filter(function (k) items.indexOf(k) === -1); sanitize(items); - dactyl.echo(_("command.sanitize.allDeleted")); + dactyl.echomsg(_("command.sanitize.allDeleted")); } else dactyl.echo(_("command.sanitize.noneDeleted")); @@ -497,7 +522,7 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef } function setPerms(host, perm) { let uri = util.createURI(host); - services.permissions.remove(uri, "cookie"); + services.permissions.remove(uri.host, "cookie"); services.permissions.add(uri, "cookie", Sanitizer.PERMS[perm]); } commands.add(["cookies", "ck"], @@ -527,7 +552,7 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef ["Host", "Expiry (UTC)", "Path", "Name", "Value"], ["padding-right: 1em", "padding-right: 1em", "padding-right: 1em", "max-width: 12em; overflow: hidden;", "padding-left: 1ex;"], ([c.host, - c.isSession ? session + c.isSession ? ["span", { highlight: "Enabled" }, "session"] : (new Date(c.expiry * 1000).toJSON() || "Never").replace(/:\d\d\.000Z/, "").replace("T", " ").replace(/-/g, "/"), c.path, c.name, @@ -549,7 +574,7 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef let count = [0, 0]; for (let c in Sanitizer.iterCookies(host)) count[c.isSession + 0]++; - return <>{Sanitizer.COMMANDS[getPerms(host)]} (session: {count[1]} persistent: {count[0]}); + return [Sanitizer.COMMANDS[getPerms(host)], " (session: ", count[1], " persistent: ", count[0], ")"].join(""); }; break; case 1: @@ -559,7 +584,7 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef }, }); }, - completion: function (dactyl, modules, window) { + completion: function initCompletion(dactyl, modules, window) { modules.completion.visibleHosts = function completeHosts(context) { let res = util.visibleHosts(window.content); if (context.filter && !res.some(function (host) host.indexOf(context.filter) >= 0)) @@ -572,9 +597,9 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef context.completions = res; }; }, - options: function (dactyl, modules) { + options: function initOptions(dactyl, modules) { const options = modules.options; - if (services.has("privateBrowsing")) + if (services.has("privateBrowsing") && "privateBrowsingEnabled" in services.privateBrowsing) options.add(["private", "pornmode"], "Set the 'private browsing' option", "boolean", false, @@ -593,9 +618,19 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef "stringlist", "all", { get values() values(sanitizer.itemMap).toArray(), - has: modules.Option.has.toggleAll, + + completer: function completer(context, extra) { + if (context.filter[0] == "!") + context.advance(1); + return completer.superapply(this, arguments); + }, + + has: function has(val) + let (res = array.nth(this.value, function (v) v == "all" || v.replace(/^!/, "") == val, 0)) + res && !/^!/.test(res), + validator: function (values) values.length && - values.every(function (val) val === "all" || Set.has(sanitizer.itemMap, val)) + values.every(function (val) val === "all" || Set.has(sanitizer.itemMap, val.replace(/^!/, ""))) }); options.add(["sanitizeshutdown", "ss"], @@ -638,13 +673,13 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef "1d": "Past day", "1w": "Past week" }, - validator: function (value) /^(a(ll)?|s(ession)|\d+[mhdw])$/.test(value) + validator: bind("test", /^(a(ll)?|s(ession)|\d+[mhdw])$/) }); options.add(["cookies", "ck"], "The default mode for newly added cookie permissions", "stringlist", "session", - { get values() iter(Sanitizer.COMMANDS) }); + { get values() Sanitizer.COMMANDS }); options.add(["cookieaccept", "ca"], "When to accept cookies", @@ -694,6 +729,6 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef endModule(); -} catch(e){dump(e.fileName+":"+e.lineNumber+": "+e+"\n" + e.stack);} +// catch(e){dump(e.fileName+":"+e.lineNumber+": "+e+"\n" + e.stack);} // vim: set fdm=marker sw=4 ts=4 et ft=javascript: