]> git.donarmstrong.com Git - dactyl.git/blobdiff - common/modules/main.jsm
New upstream version 1.0+hg6948
[dactyl.git] / common / modules / main.jsm
index 2740b66d612d65afadf9abb85a2f7de4a3e1a043..ae6926d003589188bc6c1e821076575c24428bb4 100644 (file)
@@ -1,16 +1,15 @@
-// Copyright (c) 2009-2011 by Kris Maglione <maglione.k@gmail.com>
+// Copyright (c) 2009-2013 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";
 
 try {
 
-Components.utils.import("resource://dactyl/bootstrap.jsm");
 defineModule("main", {
     exports: ["ModuleBase"],
     require: ["config", "overlay", "services", "util"]
-}, this);
+});
 
 var BASE = "resource://dactyl-content/";
 
@@ -28,6 +27,8 @@ var ModuleBase = Class("ModuleBase", {
     toString: function () "[module " + this.constructor.className + "]"
 });
 
+var _id = 0;
+
 var Modules = function Modules(window) {
     /**
      * @constructor Module
@@ -64,14 +65,13 @@ var Modules = function Modules(window) {
      *
      * @returns {function} The constructor for the resulting module.
      */
-    function Module(name) {
-        let args = Array.slice(arguments);
+    function Module(name, ...args) {
 
         var base = ModuleBase;
-        if (callable(args[1]))
-            base = args.splice(1, 1)[0];
+        if (callable(args[0]))
+            base = args.shift();
 
-        let [prototype, classProperties, moduleInit] = args;
+        let [prototype, classProperties, moduleInit] = args;
         prototype._metaInit_ = function () {
             delete module.prototype._metaInit_;
             Class.replaceProperty(modules, module.className, this);
@@ -89,20 +89,12 @@ var Modules = function Modules(window) {
     Module.list = [];
     Module.constructors = {};
 
-    const create = window.Object.create || (function () {
-        window.__dactyl_eval_string = "(function (proto) ({ __proto__: proto }))";
-        JSMLoader.loadSubScript(BASE + "eval.js", window);
-
-        let res = window.__dactyl_eval_result;
-        delete window.__dactyl_eval_string;
-        delete window.__dactyl_eval_result;
-        return res;
-    })();
-
+    const create = window.Object.create.bind(window.Object);
 
     const BASES = [BASE, "resource://dactyl-local-content/"];
 
-    const jsmodules = { NAME: "jsmodules" };
+    jsmodules = Cu.createObjectIn(window);
+    jsmodules.NAME = "jsmodules";
     const modules = update(create(jsmodules), {
         yes_i_know_i_should_not_report_errors_in_these_branches_thanks: [],
 
@@ -128,7 +120,7 @@ var Modules = function Modules(window) {
                 }
             }
             try {
-                require(jsmodules, script);
+                require(script, jsmodules);
             }
             catch (e) {
                 util.dump("Loading script " + script + ":");
@@ -136,7 +128,7 @@ var Modules = function Modules(window) {
             }
         },
 
-        newContext: function newContext(proto, normal) {
+        newContext: function newContext(proto, normal, name) {
             if (normal)
                 return create(proto);
 
@@ -144,10 +136,11 @@ var Modules = function Modules(window) {
                 var sandbox = services.dactyl.createGlobal();
             else
                 sandbox = Components.utils.Sandbox(window, { sandboxPrototype: proto || modules,
+                                                             sandboxName: name || ("Dactyl Sandbox " + ++_id),
                                                              wantXrays: false });
 
             // Hack:
-            sandbox.Object = jsmodules.Object;
+            // sandbox.Object = jsmodules.Object;
             sandbox.File = jsmodules.File;
             sandbox.Math = jsmodules.Math;
             sandbox.__proto__ = proto || modules;
@@ -178,7 +171,12 @@ overlay.overlayWindow(Object.keys(config.overlays), function _overlay(window) ({
 
         defineModule.time("load", null, function _load() {
             config.modules.global
-                  .forEach(function (name) defineModule.time("load", name, require, null, modules.jsmodules, name));
+                  .forEach(function (name) {
+                      if (!isArray(name))
+                          defineModule.time("load", name, require, null, name, modules.jsmodules);
+                      else
+                          lazyRequire(name[0], name.slice(1), modules.jsmodules);
+                  });
 
             config.modules.window
                   .forEach(function (name) defineModule.time("load", name, modules.load, modules, name));
@@ -197,13 +195,6 @@ overlay.overlayWindow(Object.keys(config.overlays), function _overlay(window) ({
         this.loaded = {};
         modules.loaded = this.loaded;
 
-        defineModule.modules.forEach(function defModule(mod) {
-            let names = Set(Object.keys(mod.INIT));
-            if ("init" in mod.INIT)
-                Set.add(names, "init");
-
-            keys(names).forEach(function (name) { self.deferInit(name, mod.INIT, mod); });
-        });
         this.modules = modules;
 
         this.scanModules();
@@ -308,36 +299,45 @@ overlay.overlayWindow(Object.keys(config.overlays), function _overlay(window) ({
 
         let className = mod.className || mod.constructor.className;
 
-        init[className] = function callee() {
-            function finish() {
-                this.currentDependency = className;
-                defineModule.time(className, name, INIT[name], mod,
-                                  modules.dactyl, modules, window);
-            }
-            if (!callee.frobbed) {
-                callee.frobbed = true;
-                if (modules[name] instanceof Class)
-                    modules[name].withSavedValues(["currentDependency"], finish);
-                else
-                    finish.call({});
-            }
-        };
+        if (!Set.has(init, className)) {
+            init[className] = function callee() {
+                function finish() {
+                    this.currentDependency = className;
+                    defineModule.time(className, name, INIT[name], mod,
+                                      modules.dactyl, modules, window);
+                }
+                if (!callee.frobbed) {
+                    callee.frobbed = true;
+                    if (modules[name] instanceof Class)
+                        modules[name].withSavedValues(["currentDependency"], finish);
+                    else
+                        finish.call({});
+                }
+            };
 
-        INIT[name].require = function (name) { init[name](); };
+            INIT[name].require = function (name) { init[name](); };
+        }
     },
 
     scanModules: function scanModules() {
-        let self = this;
         let { Module, modules } = this.modules;
 
-        Module.list.forEach(function frobModule(mod) {
+        defineModule.modules.forEach((mod) => {
+            let names = Set(Object.keys(mod.INIT));
+            if ("init" in mod.INIT)
+                Set.add(names, "init");
+
+            keys(names).forEach((name) => { this.deferInit(name, mod.INIT, mod); });
+        });
+
+        Module.list.forEach((mod) => {
             if (!mod.frobbed) {
-                modules.__defineGetter__(mod.className, function () {
+                modules.__defineGetter__(mod.className, () => {
                     delete modules[mod.className];
-                    return self.loadModule(mod.className, null, Components.stack.caller);
+                    return this.loadModule(mod.className, null, Components.stack.caller);
                 });
                 Object.keys(mod.prototype.INIT)
-                      .forEach(function (name) { self.deferInit(name, mod.prototype.INIT, mod); });
+                      .forEach((name) => { this.deferInit(name, mod.prototype.INIT, mod); });
             }
             mod.frobbed = true;
         });
@@ -354,4 +354,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: