diff --git a/content/completion.js b/content/completion.js index bd5eaa47..af1a4aeb 100644 --- a/content/completion.js +++ b/content/completion.js @@ -187,7 +187,6 @@ CompletionContext.prototype = { }, set generate(arg) { - let self = this; this.hasItems = true; this._generate = arg; if (this.background && this.regenerate) @@ -195,12 +194,14 @@ CompletionContext.prototype = { let lock = {}; this.cache.backgroundLock = lock; this.incomplete = true; - liberator.callFunctionInThread(null, function () { - let items = self.generate(); - if (self.cache.backgroundLock != lock) + liberator.dump({name: this.name, length: this.items.length}); + let now = Date.now(); + liberator.callAsync(this, function () { + let items = this.generate(); + if (this.cache.backgroundLock != lock) return; - self.incomplete = false; - self.completions = items; + this.incomplete = false; + this.completions = items; }); } }, @@ -231,7 +232,7 @@ CompletionContext.prototype = { return this.cache.filtered; this.cache.rows = []; let items = this.completions; - if (this.generate) + if (this.generate && !this.background) { // XXX let updateAsync = this.updateAsync; @@ -1230,6 +1231,7 @@ function Completion() //{{{ context.advance(dir.length); context.keys = { text: 0, description: 1, icon: 2 }; context.anchored = true; + context.background = true; context.key = dir; context.generate = function generate_file() { diff --git a/content/liberator.js b/content/liberator.js index d5d940e0..8e380205 100644 --- a/content/liberator.js +++ b/content/liberator.js @@ -26,6 +26,8 @@ the provisions above, a recipient may use your version of this file under the terms of any one of the MPL, the GPL or the LGPL. }}} ***** END LICENSE BLOCK *****/ +Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); + const plugins = {}; plugins.__proto__ = modules; @@ -37,6 +39,16 @@ const liberator = (function () //{{{ const threadManager = Components.classes["@mozilla.org/thread-manager;1"] .getService(Components.interfaces.nsIThreadManager); + function Runnable(self, func, args) + { + this.self = self; + this.func = func; + this.args = args; + } + Runnable.prototype = { + QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIRunnable]), + run: function () { this.func.apply(this.self, this.args); } + }; var callbacks = []; var observers = []; @@ -628,32 +640,20 @@ const liberator = (function () //{{{ return false; // so you can do: if (...) return liberator.beep(); }, + callAsync: function (self, func) + { + let thread = threadManager.newThread(0); + thread.dispatch(new Runnable(self, func, Array.slice(arguments, 2)), thread.DISPATCH_NORMAL); + }, + // be sure to call GUI related methods like alert() or dump() ONLY in the main thread callFunctionInThread: function (thread, func) { - function CallbackEvent(func, args) - { - return { - QueryInterface: function (iid) - { - if (iid.equals(Components.interfaces.nsIRunnable) || - iid.equals(Components.interfaces.nsISupports)) - return this; - throw Components.results.NS_ERROR_NO_INTERFACE; - }, - - run: function () - { - func.apply(window, args); - } - }; - } - if (!thread) thread = threadManager.newThread(0); // DISPATCH_SYNC is necessary, otherwise strange things will happen - thread.dispatch(new CallbackEvent(func, Array.slice(arguments, 2)), thread.DISPATCH_SYNC); + thread.dispatch(new Runnable(null, func, Array.slice(arguments, 2)), thread.DISPATCH_SYNC); }, // NOTE: "browser.dom.window.dump.enabled" preference needs to be set @@ -663,7 +663,7 @@ const liberator = (function () //{{{ message = util.objectToString(message); else message += "\n"; - dump(("config" in modules && config.name.toLowerCase()) + ": " + message); + window.dump(("config" in modules && config.name.toLowerCase()) + ": " + message); }, dumpStack: function (msg) diff --git a/content/style.js b/content/style.js index 8aa5be5a..c0d851a1 100644 --- a/content/style.js +++ b/content/style.js @@ -6,8 +6,6 @@ it under any or all of those licenseses. }}} ***** END LICENSE BLOCK *****/ -Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); - function Highlights(name, store, serial) { const highlightCSS =