diff --git a/common/content/bookmarks.js b/common/content/bookmarks.js index f7174707..89ee37cc 100644 --- a/common/content/bookmarks.js +++ b/common/content/bookmarks.js @@ -62,7 +62,7 @@ var Bookmarks = Module("bookmarks", { try { let uri = util.createURI(url); - if (!force && this.isBookmarked(uri)) + if (!force && bookmarkcache.isBookmarked(uri)) for (var bmark in bookmarkcache) if (bmark.url == uri.spec) { if (title) @@ -146,26 +146,7 @@ var Bookmarks = Module("bookmarks", { } }, - /** - * Returns true if the given URL is bookmarked and that bookmark is - * not a Live Bookmark. - * - * @param {nsIURI|string} url The URL of which to check the bookmarked - * state. - * @returns {boolean} - */ - isBookmarked: function isBookmarked(uri) { - if (isString(uri)) - uri = util.newURI(uri); - try { - return services.bookmarks - .getBookmarkIdsForURI(uri, {}) - .some(bookmarkcache.closure.isRegularBookmark); - } - catch (e) { - return false; - } - }, + isBookmarked: deprecated("bookmarkcache.isBookmarked", { get: function isBookmarked() bookmarkcache.closure.isBookmarked }), /** * Remove a bookmark or bookmarks. If *ids* is an array, removes the diff --git a/common/content/buffer.js b/common/content/buffer.js index 9c5f3031..a84c3bd0 100644 --- a/common/content/buffer.js +++ b/common/content/buffer.js @@ -1008,7 +1008,7 @@ var Buffer = Module("buffer", { function (opt) template.map(buffer.pageInfo[opt][0](), util.identity, ", "), ", "); - if (bookmarks.isBookmarked(this.URL)) + if (bookmarkcache.isBookmarked(this.URL)) info += ", bookmarked"; let pageInfoText = <>{file.quote()} [{info}] {title}; @@ -1640,9 +1640,9 @@ var Buffer = Module("buffer", { }; }, events: function () { - events.addSessionListener(config.browser, "DOMContentLoaded", this.closure.onDOMContentLoaded, true); - events.addSessionListener(config.browser, "load", this.closure.onPageLoad, true); - events.addSessionListener(config.browser, "scroll", this.closure._updateBufferPosition, false); + events.addSessionListener(config.browser, "DOMContentLoaded", buffer.closure.onDOMContentLoaded, true); + events.addSessionListener(config.browser, "load", buffer.closure.onPageLoad, true); + events.addSessionListener(config.browser, "scroll", buffer.closure._updateBufferPosition, false); }, mappings: function () { var myModes = config.browserModes; diff --git a/common/content/commands.js b/common/content/commands.js index 095f9e4b..d8831b95 100644 --- a/common/content/commands.js +++ b/common/content/commands.js @@ -468,7 +468,7 @@ var Commands = Module("commands", { _addCommand: function (args, replace) { if (!args[3]) args[3] = {}; - args[3].definedAt = commands.getCaller(Components.stack.caller.caller); + args[3].definedAt = Commands.getCaller(Components.stack.caller.caller); let names = array.flatten(Command.parseSpecs(args[0])); args.parsedSpecs = names; @@ -659,23 +659,6 @@ var Commands = Module("commands", { return this._exCommands.filter(function (cmd) cmd.user); }, - /** - * Returns a frame object describing the currently executing - * command, if applicable, otherwise returns the passed frame. - * - * @param {nsIStackFrame} frame - */ - getCaller: function (frame) { - if (io.sourcing) - return { - __proto__: frame, - filename: io.sourcing.file[0] == "[" ? io.sourcing.file : - services.io.newFileURI(File(io.sourcing.file)).spec, - lineNumber: io.sourcing.line - }; - return frame; - }, - /** * Returns true if a command invocation contains a URL referring to the * domain *host*. @@ -1179,6 +1162,23 @@ var Commands = Module("commands", { delete this._exMap[name]; } }, { + /** + * Returns a frame object describing the currently executing + * command, if applicable, otherwise returns the passed frame. + * + * @param {nsIStackFrame} frame + */ + getCaller: function (frame) { + if (io.sourcing) + return { + __proto__: frame, + filename: io.sourcing.file[0] == "[" ? io.sourcing.file : + services.io.newFileURI(File(io.sourcing.file)).spec, + lineNumber: io.sourcing.line + }; + return frame; + }, + // returns [count, parsed_argument] parseArg: function parseArg(str, sep, keepQuotes) { let arg = ""; @@ -1552,7 +1552,7 @@ var Commands = Module("commands", { }); }, javascript: function () { - JavaScript.setCompleter([this.get, this.removeUserCommand], + JavaScript.setCompleter([commands.get, commands.removeUserCommand], [function () ([c.name, c.description] for (c in commands))]); }, mappings: function () { diff --git a/common/content/dactyl.js b/common/content/dactyl.js index c273ca1f..843d438e 100644 --- a/common/content/dactyl.js +++ b/common/content/dactyl.js @@ -2023,52 +2023,51 @@ var Dactyl = Module("dactyl", XPCOM(Ci.nsISupportsWeakReference, ModuleBase), { dactyl.log("All modules loaded", 3); - try { - var args = services.fuel && services.fuel.storage.get("dactyl.commandlineArgs", null) - || services.commandLineHandler.optionValue; - if (isString(args)) - args = dactyl.parseCommandLine(args); + dactyl.timeout(function () { + try { + var args = services.fuel && services.fuel.storage.get("dactyl.commandlineArgs", null) + || services.commandLineHandler.optionValue; + if (isString(args)) + args = dactyl.parseCommandLine(args); - if (args) { - dactyl.commandLineOptions.rcFile = args["+u"]; - dactyl.commandLineOptions.noPlugins = "++noplugin" in args; - dactyl.commandLineOptions.postCommands = args["+c"]; - dactyl.commandLineOptions.preCommands = args["++cmd"]; - util.dump("Processing command-line option: " + args.string); + if (args) { + dactyl.commandLineOptions.rcFile = args["+u"]; + dactyl.commandLineOptions.noPlugins = "++noplugin" in args; + dactyl.commandLineOptions.postCommands = args["+c"]; + dactyl.commandLineOptions.preCommands = args["++cmd"]; + util.dump("Processing command-line option: " + args.string); + } + } + catch (e) { + dactyl.echoerr("Parsing command line options: " + e); } - } - catch (e) { - dactyl.echoerr("Parsing command line options: " + e); - } - dactyl.log("Command-line options: " + util.objectToString(dactyl.commandLineOptions), 3); + dactyl.log("Command-line options: " + util.objectToString(dactyl.commandLineOptions), 3); - // first time intro message - const firstTime = "extensions." + config.name + ".firsttime"; - if (prefs.get(firstTime, true)) { - dactyl.timeout(function () { - this.withSavedValues(["forceNewTab"], function () { - this.forceNewTab = true; - this.help(); - prefs.set(firstTime, false); + // first time intro message + const firstTime = "extensions." + config.name + ".firsttime"; + if (prefs.get(firstTime, true)) { + dactyl.timeout(function () { + this.withSavedValues(["forceNewTab"], function () { + this.forceNewTab = true; + this.help(); + prefs.set(firstTime, false); + }); + }, 1000); + } + + // TODO: we should have some class where all this guioptions stuff fits well + // Dactyl.hideGUI(); + + if (dactyl.userEval("typeof document", null, "test.js") === "undefined") + jsmodules.__proto__ = XPCSafeJSObjectWrapper(window); + + if (dactyl.commandLineOptions.preCommands) + dactyl.commandLineOptions.preCommands.forEach(function (cmd) { + dactyl.execute(cmd); }); - }, 1000); - } - // TODO: we should have some class where all this guioptions stuff fits well - // Dactyl.hideGUI(); - - if (dactyl.userEval("typeof document", null, "test.js") === "undefined") - jsmodules.__proto__ = XPCSafeJSObjectWrapper(window); - - if (dactyl.commandLineOptions.preCommands) - dactyl.commandLineOptions.preCommands.forEach(function (cmd) { - dactyl.execute(cmd); - }); - - // finally, read the RC file and source plugins - // make sourcing asynchronous, otherwise commands that open new tabs won't work - util.timeout(function () { + // finally, read the RC file and source plugins let init = services.environment.get(config.idName + "_INIT"); let rcFile = io.getRCFile("~"); @@ -2121,7 +2120,7 @@ var Dactyl = Module("dactyl", XPCOM(Ci.nsISupportsWeakReference, ModuleBase), { dactyl.fullyInitialized = true; dactyl.triggerObserver("enter", null); autocommands.trigger("Enter", {}); - }, 0); + }, 100); statusline.update(); dactyl.log(config.appName + " fully initialized", 0); diff --git a/common/content/mappings.js b/common/content/mappings.js index 02bd1847..dd19bda4 100644 --- a/common/content/mappings.js +++ b/common/content/mappings.js @@ -172,7 +172,7 @@ var MapHive = Class("MapHive", { extra = extra || {}; let map = Map(modes, keys, description, action, extra); - map.definedAt = commands.getCaller(Components.stack.caller); + map.definedAt = Commands.getCaller(Components.stack.caller); map.hive = this; if (this.name !== "builtin") @@ -344,7 +344,7 @@ var Mappings = Module("mappings", { */ add: function () { let map = this.builtin.add.apply(this.builtin, arguments); - map.definedAt = commands.getCaller(Components.stack.caller); + map.definedAt = Commands.getCaller(Components.stack.caller); return map; }, @@ -361,7 +361,7 @@ var Mappings = Module("mappings", { */ addUserMap: function () { let map = this.user.add.apply(this.user, arguments); - map.definedAt = commands.getCaller(Components.stack.caller); + map.definedAt = Commands.getCaller(Components.stack.caller); return map; }, diff --git a/common/content/marks.js b/common/content/marks.js index 30dcedbb..729e23ac 100644 --- a/common/content/marks.js +++ b/common/content/marks.js @@ -208,7 +208,7 @@ var Marks = Module("marks", { events: function () { let appContent = document.getElementById("appcontent"); if (appContent) - events.addSessionListener(appContent, "load", this.closure._onPageLoad, true); + events.addSessionListener(appContent, "load", marks.closure._onPageLoad, true); }, mappings: function () { var myModes = config.browserModes; diff --git a/common/content/options.js b/common/content/options.js index 9c691d5a..18aa4097 100644 --- a/common/content/options.js +++ b/common/content/options.js @@ -660,7 +660,7 @@ var Options = Module("options", { if (!extraInfo) extraInfo = {}; - extraInfo.definedAt = commands.getCaller(Components.stack.caller); + extraInfo.definedAt = Commands.getCaller(Components.stack.caller); let name = names[0]; if (name in this._optionMap) { @@ -973,7 +973,7 @@ var Options = Module("options", { } if (res) dactyl.echoerr(res); - option.setFrom = commands.getCaller(null); + option.setFrom = Commands.getCaller(null); } } flushList(); diff --git a/common/content/statusline.js b/common/content/statusline.js index 46b9b624..87a89b60 100644 --- a/common/content/statusline.js +++ b/common/content/statusline.js @@ -168,8 +168,8 @@ var StatusLine = Module("statusline", { if (sh && sh.index < sh.count - 1) modified += "-"; } - if (modules.bookmarks) { - if (bookmarks.isBookmarked(buffer.uri)) + if (modules.bookmarkcache) { + if (bookmarkcache.isBookmarked(buffer.uri)) modified += UTF8("❤"); //modified += UTF8("♥"); } diff --git a/common/content/tabs.js b/common/content/tabs.js index 49add59a..b366c51e 100644 --- a/common/content/tabs.js +++ b/common/content/tabs.js @@ -875,7 +875,7 @@ var Tabs = Module("tabs", { } for (let event in values(["TabMove", "TabOpen", "TabClose"])) events.addSessionListener(tabContainer, event, callback, false); - events.addSessionListener(tabContainer, "TabSelect", this.closure._onTabSelect, false); + events.addSessionListener(tabContainer, "TabSelect", tabs.closure._onTabSelect, false); }, mappings: function () { mappings.add([modes.NORMAL], ["g0", "g^"], diff --git a/common/modules/base.jsm b/common/modules/base.jsm index 92f8655a..c3da6d2c 100644 --- a/common/modules/base.jsm +++ b/common/modules/base.jsm @@ -147,6 +147,9 @@ defineModule.modules = []; defineModule.times = { all: 0 }; defineModule.time = function time(major, minor, func, self) { let time = Date.now(); + if (typeof func !== "function") + func = self[func]; + try { var res = func.apply(self, Array.slice(arguments, 4)); } @@ -913,7 +916,7 @@ Module.INIT = { for (let i in locals) module = objs[i] = Object.create(module); - modules[this.constructor.className] = module; + modules.jsmodules[this.constructor.className] = module; locals.reverse().forEach(function (fn, i) update(objs[i], fn.apply(module, args))) module.instance = module; module.init(); diff --git a/common/modules/bookmarkcache.jsm b/common/modules/bookmarkcache.jsm index 264f8e61..89de5164 100644 --- a/common/modules/bookmarkcache.jsm +++ b/common/modules/bookmarkcache.jsm @@ -117,6 +117,28 @@ var BookmarkCache = Module("BookmarkCache", XPCOM(Ci.nsINavBookmarkObserver), { isBookmark: function (id) this.rootFolders.indexOf(this.findRoot(id)) >= 0, + /** + * Returns true if the given URL is bookmarked and that bookmark is + * not a Live Bookmark. + * + * @param {nsIURI|string} url The URL of which to check the bookmarked + * state. + * @returns {boolean} + */ + isBookmarked: function isBookmarked(uri) { + if (isString(uri)) + uri = util.newURI(uri); + + try { + return services.bookmarks + .getBookmarkIdsForURI(uri, {}) + .some(this.closure.isRegularBookmark); + } + catch (e) { + return false; + } + }, + isRegularBookmark: function isRegularBookmark(id) { do { var root = id; diff --git a/common/modules/completion.jsm b/common/modules/completion.jsm index ab2a8a74..1b788d4d 100644 --- a/common/modules/completion.jsm +++ b/common/modules/completion.jsm @@ -844,7 +844,7 @@ var Completion = Module("completion", { get setFunctionCompleter() JavaScript.setCompleter, // Backward compatibility Local: function (dactyl, modules, window) ({ - options: modules.options, + get options() modules.options, // FIXME _runCompleter: function _runCompleter(name, filter, maxItems) { diff --git a/common/modules/finder.jsm b/common/modules/finder.jsm index 45d98e24..a5b9280d 100644 --- a/common/modules/finder.jsm +++ b/common/modules/finder.jsm @@ -162,7 +162,7 @@ var RangeFinder = Module("rangefinder", { }, { }, { modes: function (dactyl, modules, window) { - const { commandline, modes } = modules; + const { modes } = modules; modes.addMode("FIND", { extended: true, description: "Find mode, active when typing search input", diff --git a/common/modules/javascript.jsm b/common/modules/javascript.jsm index 9f1d64ed..d66f0323 100644 --- a/common/modules/javascript.jsm +++ b/common/modules/javascript.jsm @@ -679,9 +679,11 @@ var JavaScript = Module("javascript", { init.superapply(this, arguments); }, completion: function (dactyl, modules, window) { - const { completion, javascript } = modules; - completion.javascript = javascript.closure.complete; - completion.javascriptCompleter = JavaScript; // Backwards compatibility. + const { completion } = modules; + update(modules.completion, { + get javascript() modules.javascript.closure.complete, + javascriptCompleter: JavaScript // Backwards compatibility + }); }, options: function (dactyl, modules, window) { modules.options.add(["jsdebugger", "jsd"], diff --git a/common/modules/overlay.jsm b/common/modules/overlay.jsm index d9165085..b3bbf863 100644 --- a/common/modules/overlay.jsm +++ b/common/modules/overlay.jsm @@ -246,9 +246,11 @@ var Overlay = Module("Overlay", { defineModule.loadLog.push(" from: " + util.fixURI(frame.filename) + ":" + frame.lineNumber); delete modules[module.className]; + // util.dump("INIT: " + module.className); modules[module.className] = defineModule.time(module.className, "init", module); + frob(module.className); - init(modules[module.className]); + // init(modules[module.className]); } catch (e) { util.dump("Loading " + (module && module.className) + ":"); @@ -257,16 +259,45 @@ var Overlay = Module("Overlay", { return modules[module.className]; } - for each (let module in defineModule.modules) - if (module.INIT.init) - defineModule.time(module.constructor.className, "init", - module.INIT.init, module, - modules.dactyl, modules, window); + Module.list.forEach(function (mod) { + Object.keys(mod.prototype.INIT).forEach(function (name) { + deferredInit[name] = deferredInit[name] || []; + deferredInit[name].push(function () { + // util.dump("INIT: " + mod.className + ":" + name); + defineModule.time(mod.className, name, + name, mod.prototype.INIT, + modules.dactyl, modules, window); + }); + }); + }); + defineModule.modules.forEach(function (mod) { + Object.keys(mod.INIT).forEach(function (name) { + deferredInit[name] = deferredInit[name] || []; + deferredInit[name].push(function () { + // util.dump("INIT: " + mod.constructor.className + ":" + name); + defineModule.time(mod.constructor.className, name, + mod.INIT[name], mod, + modules.dactyl, modules, window); + }); + }); + }); - defineModule.modules.map(init); + function frob(name) { + // util.dump(" ======================== FROB " + name + " ======================== "); + (deferredInit[name] || []).forEach(call); + } - Module.list.forEach(load); - deferredInit["load"].forEach(call); + frob("init"); + defineModule.modules.forEach(function ({ constructor: { className } }) { + modules.__defineGetter__(className, function () { + delete modules[className]; + frob(className); + return modules[className]; + }); + }); + + // Module.list.forEach(load); + frob("load"); modules.times = update({}, defineModule.times); defineModule.loadLog.push("Loaded in " + (Date.now() - start) + "ms"); diff --git a/pentadactyl/content/config.js b/pentadactyl/content/config.js index 75e13d4c..e07b6f98 100644 --- a/pentadactyl/content/config.js +++ b/pentadactyl/content/config.js @@ -278,7 +278,7 @@ var Config = Module("config", ConfigBase, { }); }, completion: function (dactyl, modules, window) { - const { CompletionContext, bookmarkcache, bookmarks, completion } = modules; + const { CompletionContext, bookmarkcache, completion } = modules; const { document } = window; var searchRunning = null; // only until Firefox fixes https://bugzilla.mozilla.org/show_bug.cgi?id=510589 @@ -297,7 +297,7 @@ var Config = Module("config", ConfigBase, { context.hasItems = context.completions.length > 0; // XXX context.incomplete = true; - context.format = bookmarks.format; + context.format = modules.bookmarks.format; context.keys.extra = function (item) (bookmarkcache.get(item.url) || {}).extra; context.title = ["Smart Completions"];