]> git.donarmstrong.com Git - dactyl.git/blobdiff - common/modules/contexts.jsm
finalize changelog for 7904
[dactyl.git] / common / modules / contexts.jsm
index 6d32fb8358074121eb8a7af5e77263e05f19d8a8..2a6e46ddf9c257cf84065121047074928aa0e56d 100644 (file)
@@ -1,23 +1,24 @@
-// Copyright (c) 2010-2011 by Kris Maglione <maglione.k@gmail.com>
+// Copyright (c) 2010-2014 Kris Maglione <maglione.k@gmail.com>
 //
 // 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";
 
-Components.utils.import("resource://dactyl/bootstrap.jsm");
 defineModule("contexts", {
     exports: ["Contexts", "Group", "contexts"],
     require: ["services", "util"]
-}, this);
+});
 
-this.lazyRequire("overlay", ["overlay"]);
+lazyRequire("commands", ["ArgType", "CommandOption", "commands"]);
+lazyRequire("options", ["Option"]);
+lazyRequire("overlay", ["overlay"]);
+lazyRequire("storage", ["File"]);
+lazyRequire("template", ["template"]);
 
 var Const = function Const(val) Class.Property({ enumerable: true, value: val });
 
 var Group = Class("Group", {
     init: function init(name, description, filter, persist) {
-        const self = this;
-
         this.name = name;
         this.description = description;
         this.filter = filter || this.constructor.defaultFilter;
@@ -42,14 +43,14 @@ var Group = Class("Group", {
             delete this[hive];
 
         if (reason != "shutdown")
-            this.children.splice(0).forEach(this.contexts.closure.removeGroup);
+            this.children.splice(0).forEach(this.contexts.bound.removeGroup);
     },
     destroy: function destroy(reason) {
         for (let hive in values(this.hives))
             util.trapErrors("destroy", hive);
 
         if (reason != "shutdown")
-            this.children.splice(0).forEach(this.contexts.closure.removeGroup);
+            this.children.splice(0).forEach(this.contexts.bound.removeGroup);
     },
 
     argsExtra: function argsExtra() ({}),
@@ -64,21 +65,21 @@ var Group = Class("Group", {
     get builtin() this.modules.contexts.builtinGroups.indexOf(this) >= 0,
 
 }, {
-    compileFilter: function (patterns, default_) {
-        if (arguments.length < 2)
-            default_ = false;
-
+    compileFilter: function (patterns, default_=false) {
         function siteFilter(uri)
-            let (match = array.nth(siteFilter.filters, function (f) f(uri), 0))
-                match ? match.result : default_;
+            let (match = siteFilter.filters.find(f => f(uri)))
+                match ? match.result
+                      : default_;
 
         return update(siteFilter, {
             toString: function () this.filters.join(","),
 
-            toXML: function (modules) let (uri = modules && modules.buffer.uri)
+            toJSONXML: function (modules) let (uri = modules && modules.buffer.uri)
                 template.map(this.filters,
-                             function (f) <span highlight={uri && f(uri) ? "Filter" : ""}>{f}</span>,
-                             <>,</>),
+                             f => ["span", { highlight: uri && f(uri) ? "Filter" : "" },
+                                       ("toJSONXML" in f ? f.toJSONXML()
+                                                         : String(f))],
+                             ","),
 
             filters: Option.parse.sitelist(patterns)
         });
@@ -138,22 +139,26 @@ var Contexts = Module("contexts", {
                 completer: function (context) modules.completion.group(context)
             });
 
-            memoize(modules, "userContext",  function () contexts.Context(modules.io.getRCFile("~", true), contexts.user, [modules, true]));
-            memoize(modules, "_userContext", function () contexts.Context(modules.io.getRCFile("~", true), contexts.user, [modules.userContext]));
+            memoize(modules, "userContext",  () => contexts.Context(modules.io.getRCFile("~", true), contexts.user, [modules, false]));
+            memoize(modules, "_userContext", () => modules.userContext);
         },
 
         cleanup: function () {
-            for each (let hive in this.groupList.slice())
+            for (let hive of this.groupList.slice())
                 util.trapErrors("cleanup", hive, "shutdown");
         },
 
         destroy: function () {
-            for each (let hive in values(this.groupList.slice()))
+            for (let hive of values(this.groupList.slice()))
                 util.trapErrors("destroy", hive, "shutdown");
 
-            for (let [name, plugin] in iter(this.modules.plugins.contexts))
+            for each (let plugin in this.modules.plugins.contexts) {
                 if (plugin && "onUnload" in plugin && callable(plugin.onUnload))
                     util.trapErrors("onUnload", plugin);
+
+                if (isinstance(plugin, ["Sandbox"]))
+                    util.trapErrors("nukeSandbox", Cu, plugin);
+            }
         },
 
         signals: {
@@ -167,13 +172,12 @@ var Contexts = Module("contexts", {
         Hives: Class("Hives", Class.Property, {
             init: function init(name, constructor) {
                 const { contexts } = modules;
-                const self = this;
 
                 if (this.Hive)
                     return {
                         enumerable: true,
 
-                        get: function () array(contexts.groups[self.name])
+                        get: () => array(contexts.groups[this.name])
                     };
 
                 this.Hive = constructor;
@@ -186,11 +190,13 @@ var Contexts = Module("contexts", {
                 });
 
                 memoize(contexts.hives, name,
-                        function () Object.create(Object.create(contexts.hiveProto,
-                                                                { _hive: { value: name } })));
+                        () => Object.create(Object.create(contexts.hiveProto,
+                                                          { _hive: { value: name } })));
 
                 memoize(contexts.groupsProto, name,
-                        function () [group[name] for (group in values(this.groups)) if (Set.has(group, name))]);
+                        function () [group[name]
+                                     for (group in values(this.groups))
+                                     if (hasOwnProperty(group, name))]);
             },
 
             get toStringParams() [this.name, this.Hive]
@@ -200,25 +206,23 @@ var Contexts = Module("contexts", {
     Context: function Context(file, group, args) {
         const { contexts, io, newContext, plugins, userContext } = this.modules;
 
-        let isPlugin = array.nth(io.getRuntimeDirectories("plugins"),
-                                 function (dir) dir.contains(file, true),
-                                 0);
-        let isRuntime = array.nth(io.getRuntimeDirectories(""),
-                                  function (dir) dir.contains(file, true),
-                                  0);
+        let isPlugin  = io.getRuntimeDirectories("plugins")
+                          .find(dir => dir.contains(file, true));
+        let isRuntime = io.getRuntimeDirectories("")
+                          .find(dir => dir.contains(file, true));
 
         let name = isPlugin ? file.getRelativeDescriptor(isPlugin).replace(File.PATH_SEP, "-")
                             : file.leafName;
         let id   = util.camelCase(name.replace(/\.[^.]*$/, ""));
 
         let contextPath = file.path;
-        let self = Set.has(plugins, contextPath) && plugins.contexts[contextPath];
+        let self = hasOwnProperty(plugins, contextPath) && plugins.contexts[contextPath];
 
         if (!self && isPlugin && false)
-            self = Set.has(plugins, id) && plugins[id];
+            self = hasOwnProperty(plugins, id) && plugins[id];
 
         if (self) {
-            if (Set.has(self, "onUnload"))
+            if (hasOwnProperty(self, "onUnload"))
                 util.trapErrors("onUnload", self);
         }
         else {
@@ -303,15 +307,14 @@ var Contexts = Module("contexts", {
         if (uri instanceof Ci.nsIFileURL)
             var file = File(uri.file);
 
-        let isPlugin = array.nth(io.getRuntimeDirectories("plugins"),
-                                 function (dir) dir.contains(file, true),
-                                 0);
+        let isPlugin = io.getRuntimeDirectories("plugins")
+                         .find(dir => dir.contains(file, true));
 
         let name = isPlugin && file && file.getRelativeDescriptor(isPlugin)
                                            .replace(File.PATH_SEP, "-");
         let id   = util.camelCase(name.replace(/\.[^.]*$/, ""));
 
-        let self = Set.has(this.pluginModules, canonical) && this.pluginModules[canonical];
+        let self = hasOwnProperty(this.pluginModules, canonical) && this.pluginModules[canonical];
 
         if (!self) {
             self = Object.create(jsmodules);
@@ -337,7 +340,7 @@ var Contexts = Module("contexts", {
                         delete contexts.pluginModules[canonical];
                     }
 
-                    for each (let { plugins } in overlay.modules)
+                    for (let { plugins } of overlay.modules)
                         if (plugins[this.NAME] == this)
                             delete plugins[this.name];
                 })
@@ -374,7 +377,7 @@ var Contexts = Module("contexts", {
            return {
                 __proto__: frame,
                 filename: this.context.file[0] == "[" ? this.context.file
-                                                      : services.io.newFileURI(File(this.context.file)).spec,
+                                                      : File(this.context.file).URI.spec,
                 lineNumber: this.context.line
             };
         return frame;
@@ -412,7 +415,7 @@ var Contexts = Module("contexts", {
 
     initializedGroups: function (hive)
         let (need = hive ? [hive] : Object.keys(this.hives))
-            this.groupList.filter(function (group) need.some(Set.has(group))),
+            this.groupList.filter(group => need.some(hasOwnProperty.bind(null, group))),
 
     addGroup: function addGroup(name, description, filter, persist, replace) {
         let group = this.getGroup(name);
@@ -469,7 +472,7 @@ var Contexts = Module("contexts", {
     getGroup: function getGroup(name, hive) {
         if (name === "default")
             var group = this.context && this.context.context && this.context.context.GROUP;
-        else if (Set.has(this.groupMap, name))
+        else if (hasOwnProperty(this.groupMap, name))
             group = this.groupMap[name];
 
         if (group && hive)
@@ -479,11 +482,7 @@ var Contexts = Module("contexts", {
 
     getDocs: function getDocs(context) {
         try {
-            if (isinstance(context, ["Sandbox"])) {
-                let info = "INFO" in context && Cu.evalInSandbox("this.INFO instanceof XML && INFO.toXMLString()", context);
-                return info && XML(info);
-            }
-            if (typeof context.INFO == "xml")
+            if (DOM.isJSONXML(context.INFO))
                 return context.INFO;
         }
         catch (e) {}
@@ -512,7 +511,7 @@ var Contexts = Module("contexts", {
                               for ([i, name] in Iterator(params)));
 
         let rhs = args.literalArg;
-        let type = ["-builtin", "-ex", "-javascript", "-keys"].reduce(function (a, b) args[b] ? b : a, default_);
+        let type = ["-builtin", "-ex", "-javascript", "-keys"].reduce((a, b) => args[b] ? b : a, default_);
 
         switch (type) {
         case "-builtin":
@@ -540,8 +539,8 @@ var Contexts = Module("contexts", {
             if (callable(params))
                 action = dactyl.userEval("(function action() { with (action.makeParams(this, arguments)) {" + args.literalArg + "} })");
             else
-                action = dactyl.userFunc.apply(dactyl, params.concat(args.literalArg).array);
-            process = function (param) isObject(param) && param.valueOf ? param.valueOf() : param;
+                action = dactyl.userFunc.apply(dactyl, params.concat(args.literalArg));
+            process = param => isObject(param) && param.valueOf ? param.valueOf() : param;
             action.params = params;
             action.makeParams = makeParams;
             break;
@@ -643,7 +642,7 @@ var Contexts = Module("contexts", {
 
                 util.assert(!group.builtin ||
                                 !["-description", "-locations", "-nopersist"]
-                                    .some(Set.has(args.explicitOpts)),
+                                    .some(hasOwnProperty.bind(null, args.explicitOpts)),
                             _("group.cantModifyBuiltin"));
             },
             {
@@ -663,12 +662,12 @@ var Contexts = Module("contexts", {
                     {
                         names: ["-description", "-desc", "-d"],
                         description: "A description of this group",
-                        default: ["User-defined group"],
+                        default: "User-defined group",
                         type: CommandOption.STRING
                     },
                     {
                         names: ["-locations", "-locs", "-loc", "-l"],
-                        description: ["The URLs for which this group should be active"],
+                        description: "The URLs for which this group should be active",
                         default: ["*"],
                         type: CommandOption.LIST
                     },
@@ -704,7 +703,7 @@ var Contexts = Module("contexts", {
                 util.assert(args.bang ^ !!args[0], _("error.argumentOrBang"));
 
                 if (args.bang)
-                    contexts.groupList = contexts.groupList.filter(function (g) g.builtin);
+                    contexts.groupList = contexts.groupList.filter(g => g.builtin);
                 else {
                     util.assert(contexts.getGroup(args[0]), _("group.noSuch", args[0]));
                     contexts.removeGroup(args[0]);
@@ -716,7 +715,7 @@ var Contexts = Module("contexts", {
                 completer: function (context, args) {
                     if (args.bang)
                         return;
-                    context.filters.push(function ({ item }) !item.builtin);
+                    context.filters.push(({ item }) => !item.builtin);
                     modules.completion.group(context);
                 }
             });
@@ -792,9 +791,9 @@ var Contexts = Module("contexts", {
             context.title = ["Group"];
             let uri = modules.buffer.uri;
             context.keys = {
-                active: function (group) group.filter(uri),
+                active: group => group.filter(uri),
                 text: "name",
-                description: function (g) <>{g.filter.toXML ? g.filter.toXML(modules) + <>&#xa0;</> : ""}{g.description || ""}</>
+                description: function (g) ["", g.filter.toJSONXML ? g.filter.toJSONXML(modules).concat("\u00a0") : "", g.description || ""]
             };
             context.completions = (active === undefined ? contexts.groupList : contexts.initializedGroups(active))
                                     .slice(0, -1);
@@ -802,7 +801,7 @@ var Contexts = Module("contexts", {
             iter({ Active: true, Inactive: false }).forEach(function ([name, active]) {
                 context.split(name, null, function (context) {
                     context.title[0] = name + " Groups";
-                    context.filters.push(function ({ item }) !!item.filter(modules.buffer.uri) == active);
+                    context.filters.push(({ item }) => !!item.filter(modules.buffer.uri) == active);
                 });
             });
         };
@@ -813,4 +812,4 @@ endModule();
 
 // catch(e){ if (!e.stack) e = Error(e); dump(e.fileName+":"+e.lineNumber+": "+e+"\n" + e.stack); }
 
-// vim: set fdm=marker sw=4 ts=4 et ft=javascript:
+// vim: set fdm=marker sw=4 sts=4 ts=8 et ft=javascript: