diff --git a/common/components/protocols.js b/common/components/protocols.js index 621403e4..6b4f9c7f 100644 --- a/common/components/protocols.js +++ b/common/components/protocols.js @@ -113,7 +113,7 @@ Dactyl.prototype = { contractID: "@mozilla.org/network/protocol;1?name=dactyl", classID: Components.ID("{9c8f2530-51c8-4d41-b356-319e0b155c44}"), classDescription: "Dactyl utility protocol", - QueryInterface: XPCOMUtils.generateQI([Ci.nsIProtocolHandler]), + QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsIProtocolHandler]), _xpcom_factory: Factory(Dactyl), init: function (obj) { @@ -163,6 +163,19 @@ Dactyl.prototype = { } catch (e) {} return fakeChannel(uri); + }, + + // FIXME: Belongs elsewhere + _xpcom_categories: [{ + category: "profile-after-change", + entry: "m-dactyl" + }], + + observe: function (subject, topic, data) { + if (topic === "profile-after-change") { + Cu.import("resource://dactyl/base.jsm"); + require(global, "overlay"); + } } }; diff --git a/common/modules/overlay.jsm b/common/modules/overlay.jsm index 4d528b28..cbf9a750 100644 --- a/common/modules/overlay.jsm +++ b/common/modules/overlay.jsm @@ -82,11 +82,17 @@ var Overlay = Module("Overlay", { Module.list = []; Module.constructors = {}; - const create = window.Object.create || function (proto) { - let res = window.Object(); - object.__proto__ = proto; - return object; - } + const BASE = "chrome://dactyl/content/"; + + const create = window.Object.create || (function () { + window.__dactyl_eval_string = "(function (proto) ({ __proto__: proto }))"; + services.subscriptLoader.loadSubScript(BASE + "eval.js", window); + + let res = window.__dactyl_eval_result; + delete window.__dactyl_eval_string; + delete window.__dactyl_eval_result; + return res; + })(); const jsmodules = {}; const modules = update(create(jsmodules), { @@ -133,8 +139,6 @@ var Overlay = Module("Overlay", { modules.modules = modules; window.dactyl = { modules: modules }; - const BASE = "chrome://dactyl/content/"; - let prefix = [BASE]; modules.load("util");