diff options
| author | Stephen Blott | 2015-05-09 09:50:13 +0100 | 
|---|---|---|
| committer | Stephen Blott | 2015-05-09 09:50:13 +0100 | 
| commit | 75051d53536ddb9f247501b4509306cae1734184 (patch) | |
| tree | 3d70d47a5b05d2ce506650f9d22516b2991eccfa | |
| parent | 3bc555eb02b228f35647884575189eed40625c52 (diff) | |
| download | vimium-75051d53536ddb9f247501b4509306cae1734184.tar.bz2 | |
Search completion; reintroduce vomnibar cache.
| -rw-r--r-- | background_scripts/completion.coffee | 4 | ||||
| -rw-r--r-- | pages/vomnibar.coffee | 47 | 
2 files changed, 37 insertions, 14 deletions
diff --git a/background_scripts/completion.coffee b/background_scripts/completion.coffee index f800c818..8c73c658 100644 --- a/background_scripts/completion.coffee +++ b/background_scripts/completion.coffee @@ -547,7 +547,7 @@ class MultiCompleter                unless suggestions.length == 0 and shouldRunContinuations                  onComplete                    results: @prepareSuggestions queryTerms, suggestions -                  expectMoreResults: shouldRunContinuations +                  mayCacheResult: continuations.length == 0                # Run any continuations, unless there's a pending query.                if shouldRunContinuations @@ -560,7 +560,7 @@ class MultiCompleter                        results: @prepareSuggestions queryTerms, suggestions                        # FIXME(smblott) This currently assumes that there is at most one continuation.  We                        # should really be counting pending/completed continuations. -                      expectMoreResults: false +                      mayCacheResult: true                # Admit subsequent queries, and launch any pending query.                @filterInProgress = false diff --git a/pages/vomnibar.coffee b/pages/vomnibar.coffee index bc773909..bb7720e9 100644 --- a/pages/vomnibar.coffee +++ b/pages/vomnibar.coffee @@ -244,12 +244,17 @@ class BackgroundCompleter    constructor: (@name) ->      @port = chrome.runtime.connect name: "completions"      @messageId = null +    # @keywords and @cache are both reset in @reset(). +    # We only cache for the duration of a single vomnibar activation. +    @keywords = [] +    @cache = {}      @reset()      @port.onMessage.addListener (msg) =>        switch msg.handler          when "customSearchEngineKeywords" -          @lastUI.setKeywords msg.keywords +          @keywords = msg.keywords +          @lastUI.setKeywords @keywords          when "completions"            # The result objects coming from the background page will be of the form:            #   { html: "", type: "", url: "" } @@ -261,26 +266,44 @@ class BackgroundCompleter                else                  @completionActions.navigateToUrl.curry result.url -          # We ignore messages which arrive too late. -          if msg.id == @messageId -            @mostRecentCallback msg.results +          # Cache the result -- if we have been told it's ok to do so (it could be that more results will be +          # posted shortly).  We cache the result even if it arrives late. +          if msg.mayCacheResult +            console.log "cache set:", "-#{msg.cacheKey}-" if @debug +            @cache[msg.cacheKey] = msg.results +          else +            console.log "not setting cache:", "-#{msg.cacheKey}-" if @debug + +          # Handle the message, but only if it hasn't arrived too late. +          @mostRecentCallback msg.results if msg.id == @messageId    filter: (query, @mostRecentCallback) ->      queryTerms = query.trim().split(/\s+/).filter (s) -> 0 < s.length -    @port.postMessage -      handler: "filter" -      name: @name -      id: @messageId = Utils.createUniqueId() -      queryTerms: queryTerms -      query: query +    cacheKey = queryTerms.join " " +    cacheKey += " " if 0 < queryTerms.length and queryTerms[0] in @keywords and /\s$/.test query + +    if cacheKey of @cache +      console.log "cache hit:", "-#{cacheKey}-" if @debug +      @mostRecentCallback @cache[cacheKey] +    else +      console.log "cache miss:", "-#{cacheKey}-" if @debug +      @port.postMessage +        handler: "filter" +        name: @name +        id: @messageId = Utils.createUniqueId() +        queryTerms: queryTerms +        query: query +        cacheKey: cacheKey + +  reset: -> +    @keywords = [] +    @cache = {}    refresh: (@lastUI) ->      @reset()      # Inform the background completer that we have a new vomnibar activation.      @port.postMessage name: @name, handler: "refresh" -  reset: -> -    cancel: ->      # Inform the background completer that it may (should it choose to do so) abandon any pending query      # (because the user is typing, and there'll be another query along soon).  | 
