diff --git a/common/content/completion.js b/common/content/completion.js index a21e098b..9bd745c8 100644 --- a/common/content/completion.js +++ b/common/content/completion.js @@ -112,6 +112,12 @@ function CompletionContext(editor, name, offset) //{{{ this.editor = editor; this.compare = function (a, b) String.localeCompare(a.text, b.text); + /** + * @property {function} This function is called when we close + * a completion window with Esc or Ctrl-c. Usually this callback + * is only needed for long, asynchronous completions + */ + this.cancelFunc = null; /** * @property {function} The function used to filter the results. * @default Selects all results which match every predicate in the @@ -151,7 +157,7 @@ function CompletionContext(editor, name, offset) //{{{ * Names are assigned when a context is forked, with its specified * name appended, after a '/', to its parent's name. */ - this.contexts = { name: this }; + this.contexts = { "/": this }; /** * @property {Object} A mapping of keys, for {@link #getKey}. Given * { key: value }, getKey(item, key) will return values as such: @@ -1549,13 +1555,15 @@ function Completion() //{{{ location: function location(context) { if (!services.get("autoCompleteSearch")) - return + return; + context.anchored = false; context.title = ["Smart Completions"]; context.keys.icon = 2; context.incomplete = true; context.hasItems = context.completions.length > 0; // XXX context.filterFunc = null; + context.cancelFunc = function () services.get("autoCompleteSearch").stopSearch(); context.compare = null; let timer = new Timer(50, 100, function (result) { context.incomplete = result.searchResult >= result.RESULT_NOMATCH_ONGOING; diff --git a/common/content/ui.js b/common/content/ui.js index 00c86428..c3f04fe6 100644 --- a/common/content/ui.js +++ b/common/content/ui.js @@ -936,6 +936,7 @@ function CommandLine() //{{{ if (history) history.save(); + this.resetCompletions(); // cancels any asynchronous completion still going on, must be before completions = null completions = null; history = null; @@ -1075,7 +1076,7 @@ function CommandLine() //{{{ } else if (event.type == "input") { - this.resetCompletions(); + //this.resetCompletions(); -> already handled by "keypress" below (hopefully), so don't do it twice liberator.triggerCallback("change", currentExtendedMode, command); } else if (event.type == "keypress") @@ -1432,8 +1433,15 @@ function CommandLine() //{{{ resetCompletions: function resetCompletions() { autocompleteTimer.reset(); + + // liberator.dump("Resetting completions..."); if (completions) { + // if any child context has a cancelFunc, call it + for (let [, context] in Iterator(completions.context.top.contexts)) + if (context.cancelFunc) + context.cancelFunc(); + completions.wildIndex = -1; completions.previewClear(); } diff --git a/common/modules/storage.jsm b/common/modules/storage.jsm index 1b6b19a1..c2f8705f 100644 --- a/common/modules/storage.jsm +++ b/common/modules/storage.jsm @@ -34,6 +34,7 @@ const Ci = Components.interfaces; const Cr = Components.results; const Cu = Components.utils; +// XXX: does not belong here function Timer(minInterval, maxInterval, callback) { let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); diff --git a/vimperator/regressions.js b/vimperator/regressions.js index 1885a932..2430322e 100644 --- a/vimperator/regressions.js +++ b/vimperator/regressions.js @@ -181,7 +181,7 @@ commands.addUserCommand(["regr[essions]"], } }; - liberator.echomsg("Running test " + currentTest + " of " + totalTests + ": " + testDescription, 0); + commandline.echo("Running test " + currentTest + " of " + totalTests + ": " + testDescription, "Filter", commandline.APPEND_TO_MESSAGES); resetEnvironment(); if ("init" in test) test.init(); @@ -206,7 +206,7 @@ commands.addUserCommand(["regr[essions]"], if (args.count >= 1 && currentTest != args.count) continue; - liberator.echomsg("Running test " + currentTest + " of " + totalTests + ": " + util.clip(func.toString().replace(/[\s\n]+/gm, " "), 80)); + commandline.echo("Running test " + currentTest + " of " + totalTests + ": " + util.clip(func.toString().replace(/[\s\n]+/gm, " "), 80), "Filter", commandline.APPEND_TO_MESSAGES); resetEnvironment(); if (!func())