]> git.donarmstrong.com Git - dactyl.git/blobdiff - common/modules/main.jsm
Import 1.0 supporting Firefox up to 14.*
[dactyl.git] / common / modules / main.jsm
index 2740b66d612d65afadf9abb85a2f7de4a3e1a043..ffc89ee8e5d25f643bc291a79fa4ca12c4d37ea0 100644 (file)
@@ -28,6 +28,8 @@ var ModuleBase = Class("ModuleBase", {
     toString: function () "[module " + this.constructor.className + "]"
 });
 
+var _id = 0;
+
 var Modules = function Modules(window) {
     /**
      * @constructor Module
@@ -136,7 +138,7 @@ var Modules = function Modules(window) {
             }
         },
 
-        newContext: function newContext(proto, normal) {
+        newContext: function newContext(proto, normal, name) {
             if (normal)
                 return create(proto);
 
@@ -144,6 +146,7 @@ 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:
@@ -197,13 +200,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,28 +304,38 @@ 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;
 
+        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); });
+        });
+
         Module.list.forEach(function frobModule(mod) {
             if (!mod.frobbed) {
                 modules.__defineGetter__(mod.className, function () {