]> git.donarmstrong.com Git - dactyl.git/blobdiff - common/modules/sanitizer.jsm
Import 1.0rc1 supporting Firefox up to 11.*
[dactyl.git] / common / modules / sanitizer.jsm
index e240424dba36f7af3ee308008d01adbbc65670c8..efc0f2de61dca23b76a4ad8ed6ba81de5c59df51 100644 (file)
@@ -3,7 +3,7 @@
 //
 // This work is licensed for reuse under an MIT license. Details are
 // given in the LICENSE.txt file included with this file.
-"use strict";
+/* use strict */
 
 // TODO:
 //   - fix Sanitize autocommand
 // 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"]
+    require: ["config", "prefs", "services", "util"]
 }, this);
 
+this.lazyRequire("messages", ["_"]);
+this.lazyRequire("storage", ["storage"]);
+this.lazyRequire("template", ["teplate"]);
+
 let tmp = {};
 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."
 });
@@ -216,7 +217,7 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef
                         }
                     </>
                 },
-                init: function (win) {
+                ready: function ready(win) {
                     let elem =  win.document.getElementById("itemList");
                     elem.setAttribute("rows", elem.itemCount);
                     win.Sanitizer = Class("Sanitizer", win.Sanitizer, {
@@ -291,8 +292,8 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef
         }
     },
 
-    get ranAtShutdown()    localPrefs.get("didSanitizeOnShutdown"),
-    set ranAtShutdown(val) localPrefs.set("didSanitizeOnShutdown", Boolean(val)),
+    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)),
 
@@ -348,7 +349,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,17 +370,17 @@ 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) {
@@ -388,16 +389,18 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef
         sanitizer.ranAtShutdown = false;
     },
     autocommands: function (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) {
@@ -407,6 +410,9 @@ var Sanitizer = Module("sanitizer", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakRef
             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 +421,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 +445,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"));
@@ -593,9 +596,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 +651,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 +707,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: