diff --git a/common/content/autocommands.js b/common/content/autocommands.js index a60b64a5..5ff436f2 100644 --- a/common/content/autocommands.js +++ b/common/content/autocommands.js @@ -245,7 +245,7 @@ var AutoCommands = Module("autocommands", { }; }, javascript: function () { - JavaScript.setCompleter(this.get, [function () Iterator(config.autocommands)]); + JavaScript.setCompleter(autocommands.get, [function () Iterator(config.autocommands)]); }, options: function () { options.add(["eventignore", "ei"], diff --git a/common/content/buffer.js b/common/content/buffer.js index 62d5a69e..146daf9b 100644 --- a/common/content/buffer.js +++ b/common/content/buffer.js @@ -262,7 +262,7 @@ var Buffer = Module("buffer", { dactylLoadCount: 0, // XXX: function may later be needed to detect a canceled synchronous openURL() - onStateChange: function onStateChange(webProgress, request, flags, status) { + onStateChange: util.wrapCallback(function onStateChange(webProgress, request, flags, status) { onStateChange.superapply(this, arguments); // STATE_IS_DOCUMENT | STATE_IS_WINDOW is important, because we also // receive statechange events for loading images and other parts of the web page @@ -286,9 +286,9 @@ var Buffer = Module("buffer", { statusline.updateUrl(); } } - }, + }), // for notifying the user about secure web pages - onSecurityChange: function onSecurityChange(webProgress, request, state) { + onSecurityChange: util.wrapCallback(function onSecurityChange(webProgress, request, state) { onSecurityChange.superapply(this, arguments); if (state & Ci.nsIWebProgressListener.STATE_IS_BROKEN) statusline.security = "broken"; @@ -300,19 +300,19 @@ var Buffer = Module("buffer", { statusline.security = "insecure"; if (webProgress && webProgress.DOMWindow) webProgress.DOMWindow.document.dactylSecurity = statusline.security; - }, - onStatusChange: function onStatusChange(webProgress, request, status, message) { + }), + onStatusChange: util.wrapCallback(function onStatusChange(webProgress, request, status, message) { onStatusChange.superapply(this, arguments); statusline.updateUrl(message); - }, - onProgressChange: function onProgressChange(webProgress, request, curSelfProgress, maxSelfProgress, curTotalProgress, maxTotalProgress) { + }), + onProgressChange: util.wrapCallback(function onProgressChange(webProgress, request, curSelfProgress, maxSelfProgress, curTotalProgress, maxTotalProgress) { onProgressChange.superapply(this, arguments); - if (webProgress.DOMWindow) + if (webProgress && webProgress.DOMWindow) webProgress.DOMWindow.dactylProgress = curTotalProgress / maxTotalProgress; statusline.progress = curTotalProgress / maxTotalProgress; - }, + }), // happens when the users switches tabs - onLocationChange: function onLocationChange(webProgress, request, uri) { + onLocationChange: util.wrapCallback(function onLocationChange(webProgress, request, uri) { onLocationChange.superapply(this, arguments); delete mappings.hives; @@ -352,13 +352,13 @@ var Buffer = Module("buffer", { if (loaded.commandline) commandline.clear(); }, 500); - }, + }), // called at the very end of a page load - asyncUpdateUI: function asyncUpdateUI() { + asyncUpdateUI: util.wrapCallback(function asyncUpdateUI() { asyncUpdateUI.superapply(this, arguments); util.timeout(function () { statusline.updateUrl(); }, 100); - }, - setOverLink: function setOverLink(link, b) { + }), + setOverLink: util.wrapCallback(function setOverLink(link, b) { setOverLink.superapply(this, arguments); switch (options["showstatuslinks"]) { case "status": @@ -371,7 +371,7 @@ var Buffer = Module("buffer", { commandline.clear(); break; } - }, + }), }, /** diff --git a/common/content/commandline.js b/common/content/commandline.js index 4dd50eee..9898d77a 100644 --- a/common/content/commandline.js +++ b/common/content/commandline.js @@ -352,8 +352,8 @@ var CommandMode = Class("CommandMode", { if (this.history) this.history.save(); - commandline.hideCompletions(); this.resetCompletions(); + commandline.hideCompletions(); modes.delay(function () { if (!this.keepCommand || commandline.silent || commandline.quiet) @@ -504,11 +504,6 @@ var CommandLine = Module("commandline", { }, message)); } }; //}}} - - this._silent = false; - this._quiet = false; - this._lastEcho = null; - }, /** @@ -546,12 +541,14 @@ var CommandLine = Module("commandline", { get completionContext() this._completions.context, + _silent: false, get silent() this._silent, set silent(val) { this._silent = val; this.quiet = this.quiet; }, + _quite: false, get quiet() this._quiet, set quiet(val) { this._quiet = val; @@ -665,6 +662,8 @@ var CommandLine = Module("commandline", { } }, + _lastEcho: null, + /** * Output the given string onto the command line. With no flags, the * message will be shown in the status line if it's short enough to diff --git a/common/content/dactyl.js b/common/content/dactyl.js index 1defb6cf..90d88c87 100644 --- a/common/content/dactyl.js +++ b/common/content/dactyl.js @@ -12,7 +12,6 @@ default xml namespace = XHTML; XML.ignoreWhitespace = false; XML.prettyPrinting = false; -var plugins = { __proto__: modules }; var userContext = { __proto__: modules }; var _userContext = newContext(userContext); @@ -53,7 +52,6 @@ var Dactyl = Module("dactyl", XPCOM(Ci.nsISupportsWeakReference, ModuleBase), { destroy: function () { autocommands.trigger("LeavePre", {}); - storage.saveAll(); dactyl.triggerObserver("shutdown", null); util.dump("All dactyl modules destroyed\n"); autocommands.trigger("Leave", {}); @@ -337,7 +335,7 @@ var Dactyl = Module("dactyl", XPCOM(Ci.nsISupportsWeakReference, ModuleBase), { dactyl.reportError(str); if (typeof str == "object" && "echoerr" in str) str = str.echoerr; - else if (isinstance(str, ["Error"])) + else if (isinstance(str, ["Error"]) && str.fileName) str = <>{str.fileName.replace(/^.* -> /, "")}: {str.lineNumber}: {str}; if (options["errorbells"]) diff --git a/common/content/mappings.js b/common/content/mappings.js index dd19bda4..a69a64eb 100644 --- a/common/content/mappings.js +++ b/common/content/mappings.js @@ -862,7 +862,7 @@ var Mappings = Module("mappings", { }; }, javascript: function () { - JavaScript.setCompleter(this.get, + JavaScript.setCompleter(mappings.get, [ null, function (context, obj, args) { diff --git a/common/content/mow.js b/common/content/mow.js index 1cea5fb5..8a130fbb 100644 --- a/common/content/mow.js +++ b/common/content/mow.js @@ -4,6 +4,7 @@ // // This work is licensed for reuse under an MIT license. Details are // given in the LICENSE.txt file included with this file. +"use strict"; var MOW = Module("mow", { init: function () { @@ -71,7 +72,6 @@ var MOW = Module("mow", { if (!commandline.commandVisible) commandline.hide(); - this._startHints = false; if (modes.main != modes.OUTPUT_MULTILINE) { modes.push(modes.OUTPUT_MULTILINE, null, { onKeyPress: this.closure.onKeyPress, @@ -170,6 +170,7 @@ var MOW = Module("mow", { event.preventDefault(); } }, + contextEvents: { popupshowing: function (event) { let menu = commandline.widgets.contextMenu; @@ -261,8 +262,7 @@ var MOW = Module("mow", { if (!value && elem && elem.contentWindow == document.commandDispatcher.focusedWindow) document.commandDispatcher.focusedWindow = content; } - }), - + }) }, { }, { mappings: function () { @@ -277,7 +277,7 @@ var MOW = Module("mow", { mow.echo(mow.lastOutput, "Normal"); }); - bind = function bind(keys, description, action, test, default_) { + let bind = function bind(keys, description, action, test, default_) { mappings.add([modes.OUTPUT_MULTILINE], keys, description, function (command) { diff --git a/common/content/options.js b/common/content/options.js index de3a713c..5ac9218e 100644 --- a/common/content/options.js +++ b/common/content/options.js @@ -1295,7 +1295,7 @@ var Options = Module("options", { }; }, javascript: function () { - JavaScript.setCompleter(this.get, [function () ([o.name, o.description] for (o in options))]); + JavaScript.setCompleter(options.get, [function () ([o.name, o.description] for (o in options))]); }, sanitizer: function () { sanitizer.addItem("options", { diff --git a/common/modules/addons.jsm b/common/modules/addons.jsm index 9e0d04fb..3824f149 100644 --- a/common/modules/addons.jsm +++ b/common/modules/addons.jsm @@ -35,12 +35,12 @@ var AddonListener = Class("AddonListener", { onExternalInstall: function (addon, existingAddon, needsRestart) {}, onDownloadStarted: listener("download", "started"), onDownloadEnded: listener("download", "complete"), - onDownloadCancelled: listener("download", "cancelled"), + onDownloadCancelled: listener("download", "canceled"), onDownloadFailed: listener("download", "failed"), onDownloadProgress: function (install) {}, onInstallStarted: function (install) {}, onInstallEnded: listener("installation", "complete"), - onInstallCancelled: listener("installation", "cancelled"), + onInstallCancelled: listener("installation", "canceled"), onInstallFailed: listener("installation", "failed") }); diff --git a/common/modules/base.jsm b/common/modules/base.jsm index c3da6d2c..f147ebf1 100644 --- a/common/modules/base.jsm +++ b/common/modules/base.jsm @@ -616,12 +616,12 @@ function update(target) { if (desc.value instanceof Class.Property) desc = desc.value.init(k) || desc.value; if (typeof desc.value == "function" && Object.getPrototypeOf(target)) { - let func = desc.value; - desc.value.__defineGetter__("super", function () Object.getPrototypeOf(target)[k]); - desc.value.superapply = function superapply(self, args) + let func = desc.value.wrapped || desc.value; + func.__defineGetter__("super", function () Object.getPrototypeOf(target)[k]); + func.superapply = function superapply(self, args) let (meth = Object.getPrototypeOf(target)[k]) meth && meth.apply(self, args); - desc.value.supercall = function supercall(self) + func.supercall = function supercall(self) func.superapply(self, Array.slice(arguments, 1)); } Object.defineProperty(target, k, desc); @@ -663,7 +663,7 @@ function Class() { superclass = args.shift(); var Constructor = eval(String.replace(, - "constructor", (name || superclass.className).replace(/\W/g, "_"))); + "constructor", (name || superclass.className).replace(/\W/g, "_")) + .replace("PARAMS", /^function .*?\((.*?)\)/.exec(args[0] && args[0].init || Class.prototype.init)[1])); + Constructor.className = name || superclass.className || superclass.name; if ("init" in superclass.prototype) diff --git a/common/modules/overlay.jsm b/common/modules/overlay.jsm index 7b73be7c..411d7f43 100644 --- a/common/modules/overlay.jsm +++ b/common/modules/overlay.jsm @@ -144,6 +144,7 @@ var Overlay = Module("Overlay", { return sandbox; } }); + modules.plugins = create(modules); modules.modules = modules; window.dactyl = { modules: modules }; diff --git a/common/modules/storage.jsm b/common/modules/storage.jsm index b41e86cf..64a7d7f2 100644 --- a/common/modules/storage.jsm +++ b/common/modules/storage.jsm @@ -152,6 +152,8 @@ var Storage = Module("Storage", { }, cleanup: function () { + this.saveAll(); + for (let key in keys(this.keys)) { if (this[key].timer) this[key].timer.flush(); diff --git a/common/modules/util.jsm b/common/modules/util.jsm index 6b423c66..9bf6e2ee 100644 --- a/common/modules/util.jsm +++ b/common/modules/util.jsm @@ -32,8 +32,8 @@ memoize(this, "Commands", function () { var FailedAssertion = Class("FailedAssertion", ErrorBase); var Point = Struct("x", "y"); -var wrapCallback = function wrapCallback(fn) - fn.wrapper = (function wrappedCallback () { +var wrapCallback = function wrapCallback(fn) { + fn.wrapper = function wrappedCallback () { try { return fn.apply(this, arguments); } @@ -41,7 +41,10 @@ var wrapCallback = function wrapCallback(fn) util.reportError(e); return undefined; } - }) + }; + fn.wrapper.wrapped = fn; + return fn.wrapper; +} var getAttr = function getAttr(elem, ns, name) elem.hasAttributeNS(ns, name) ? elem.getAttributeNS(ns, name) : null; @@ -1585,6 +1588,8 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]), })(); }, + wrapCallback: wrapCallback, + /** * Traps errors in the called function, possibly reporting them. *