diff --git a/content/bookmarks.js b/content/bookmarks.js index c043b0bd..af85db6b 100644 --- a/content/bookmarks.js +++ b/content/bookmarks.js @@ -316,7 +316,7 @@ liberator.Bookmarks = function () //{{{ { if (bypassCache) // Is this really necessary anymore? cache.load(); - return liberator.completion.cached(cache.bookmarks, filter, function () cache.bookmarks, + return liberator.completion.cached("bookmarks", filter, function () cache.bookmarks, "filterURLArray", tags); }, diff --git a/content/completion.js b/content/completion.js index d8cc3666..04a6f2ed 100644 --- a/content/completion.js +++ b/content/completion.js @@ -543,10 +543,14 @@ liberator.Completion = function () //{{{ cached: function (key, filter, generate, method) { - if (!filter || filter.indexOf(cacheFilter[key]) != 0) + if (!filter && cacheFilter[key] || filter.indexOf(cacheFilter[key]) != 0) cacheResults[key] = generate(filter); + if (key == "searches") + liberator.dump({keyword: key, cacheFilter: cacheFilter[key], filter: filter, searches: {toString: function() json.encode(cacheResults[key])}}); cacheFilter[key] = filter; - return cacheResults[key] = this[method].apply(this, [cacheResults[key], filter].concat(Array.splice(arguments, 4))); + if (cacheResults[key].length) + return cacheResults[key] = this[method].apply(this, [cacheResults[key], filter].concat(Array.splice(arguments, 4))); + return []; }, // discard all entries in the 'urls' array, which don't match 'filter @@ -728,6 +732,13 @@ liberator.Completion = function () //{{{ ex: function (str) { substrings = []; + if (str.indexOf(cacheFilter["ex"]) != 0) + { + cacheFilter = {}; + cacheResults = {}; + } + cacheFilter["ex"] = str; + var [count, cmd, special, args] = liberator.commands.parseCommand(str); var completions = []; var start = 0; @@ -841,29 +852,29 @@ liberator.Completion = function () //{{{ let keywords = liberator.bookmarks.getKeywords().map(function (k) [k[0], k[1], k[3], k[2]]); let engines = this.filter(keywords.concat(liberator.bookmarks.getSearchEngines()), filter, false, true); - let history = liberator.history.get(); - let searches = []; - for (let [, k] in Iterator(keywords)) - { - if (k[0].toLowerCase() != keyword.toLowerCase() || k[3].indexOf("%s") == -1) - continue; - let [begin, end] = k[3].split("%s"); - for (let [, h] in Iterator(history)) + let generate = function () { + let history = liberator.history.get(); + let searches = []; + for (let [, k] in Iterator(keywords)) { - if (h[0].indexOf(begin) == 0 && (!end.length || h[0].substr(-end.length) == end)) + if (k[0].toLowerCase() != keyword.toLowerCase() || k[3].indexOf("%s") == -1) + continue; + let [begin, end] = k[3].split("%s"); + for (let [, h] in Iterator(history)) { - let query = h[0].substr(begin.length, h[0].length - end.length); - searches.push([decodeURIComponent(query), - <>{begin}{query}{end}, - k[2]]); + if (h[0].indexOf(begin) == 0 && (!end.length || h[0].substr(-end.length) == end)) + { + let query = h[0].substr(begin.length, h[0].length - end.length); + searches.push([decodeURIComponent(query), + <>{begin}{query}{end}, + k[2]]); + } } } + return searches; } - if (searches.length) - { - searches = this.filter(searches, args, false, true); - searches.forEach(function (a) a[0] = keyword + " " + a[0]); - } + let searches = this.cached("searches-" + keyword, args, generate, "filter", [false, true]); + searches = searches.map(function (a) (a = a.concat(), a[0] = keyword + " " + a[0], a)); return [0, searches.concat(engines)]; },