aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--background_scripts/completion.coffee9
-rw-r--r--background_scripts/search_engines.coffee46
-rw-r--r--lib/utils.coffee4
3 files changed, 33 insertions, 26 deletions
diff --git a/background_scripts/completion.coffee b/background_scripts/completion.coffee
index 40c0d119..d8cf1667 100644
--- a/background_scripts/completion.coffee
+++ b/background_scripts/completion.coffee
@@ -326,7 +326,6 @@ class SearchEngineCompleter
filter: (queryTerms, onComplete) ->
SearchEngines.complete Settings.get("searchUrl"), queryTerms, (suggestions = []) =>
- console.log suggestions.length
characterCount = queryTerms.join("").length
completions =
for suggestion in suggestions
@@ -335,11 +334,11 @@ class SearchEngineCompleter
onComplete completions
computeRelevancy: (suggestion) ->
- # We score search-engine completions by word relevancy, but weight increasingly as the number of
+ # We score search-engine completions by word relevancy, but weight the score increasingly as the number of
# characters in the query terms increases. The idea is that, the more the user has had to type, the less
- # likely it is that one of the other suggestion types has found what they're looking for, so the more
- # likely it is that this suggestion will be useful.
- # (1.0 - (1.0 / suggestion.characterCount)) *
+ # likely it is that one of the other suggestion types has proven useful, so the more likely it is that
+ # this suggestion will be useful.
+ # NOTE(smblott) This will require tweaking.
(Math.min(suggestion.extraRelevancyData, 12)/12) *
RankingUtils.wordRelevancy suggestion.queryTerms, suggestion.title, suggestion.title
diff --git a/background_scripts/search_engines.coffee b/background_scripts/search_engines.coffee
index 5d69d087..3dfea180 100644
--- a/background_scripts/search_engines.coffee
+++ b/background_scripts/search_engines.coffee
@@ -5,10 +5,14 @@
# getUrl: map these query terms to a completion URL.
# parse: extract suggestions from the resulting (successful) XMLHttpRequest.
#
-Google =
+class Google
+ constructor: ->
name: "Google"
match: (searchUrl) ->
- true # TBD.
+ return true if /^https?:\/\/[a-z]+.google.com\//.test searchUrl
+ # NOTE(smblott). A temporary hack, just for me, and just for development. Will be removed.
+ return true if /localhost\/.*\/booky/.test searchUrl
+ false
getUrl: (queryTerms) ->
"http://suggestqueries.google.com/complete/search?ss_protocol=legace&client=toolbar&q=#{Utils.createSearchQuery queryTerms}"
@@ -23,16 +27,17 @@ Google =
else
callback []
-# A dummy search engine which is guaranteed to match any search URL, but produces no completions. This allows
-# the rest of the logic to be written knowing that there will be a search engine match.
-DummySearchEngine =
+# A dummy search engine which is guaranteed to match any search URL, but never produces completions. This
+# allows the rest of the logic to be written knowing that there will be a search engine match.
+class DummySearchEngine
+ constructor: ->
name: "Dummy"
match: -> true
# We return a useless URL which we know will succeed, but which won't generate any network traffic.
getUrl: -> chrome.runtime.getURL "content_scripts/vimium.css"
parse: (_, callback) -> callback []
-CompletionEngines = [ Google, DummySearchEngine ]
+completionEngines = [ Google, DummySearchEngine ]
SearchEngines =
cancel: (searchUrl, callback = null) ->
@@ -40,16 +45,18 @@ SearchEngines =
delete @requests[searchUrl]
callback? null
- # Perform and HTTP GET.
- # searchUrl is the search engine's URL, e.g. Settings.get("searchUrl")
- # url is the URL to fetch
- # callback will be called a successful XMLHttpRequest object, or null.
+ # Perform an HTTP GET.
+ # searchUrl is the search engine's URL, e.g. Settings.get("searchUrl").
+ # url is the URL to fetch.
+ # callback will be called with a successful XMLHttpRequest object, or null.
get: (searchUrl, url, callback) ->
@requests ?= {} # Maps searchUrls to any outstanding HTTP request for that search engine.
@cancel searchUrl
- # We cache the results of recent requests (with a two-hour expiry).
- @requestCache ?= new SimpleCache 2 * 60 * 60 * 1000
+ # We cache the results of the most-recent 1000 requests (with a two-hour expiry).
+ # FIXME(smblott) Currently we're caching XMLHttpRequest objects, which is wasteful of memory. It would be
+ # better to handle caching at a higher level.
+ @requestCache ?= new SimpleCache 2 * 60 * 60 * 1000, 1000
if @requestCache.has url
callback @requestCache.get url
@@ -70,21 +77,22 @@ SearchEngines =
else
callback null
- # Look up the search engine for this search URL. Because of DummySearchEngine, above, we know there will
- # always be a match. Imagining that there may be many search engines, and knowing that this is called for
- # every character entered, we cache the result.
+ # Look up the search-completion engine for this search URL. Because of DummySearchEngine, above, we know
+ # there will always be a match. Imagining that there may be many search engines, and knowing that this is
+ # called for every character entered, we cache the result.
lookupEngine: (searchUrl) ->
@engineCache ?= new SimpleCache 24 * 60 * 60 * 1000
if @engineCache.has searchUrl
@engineCache.get searchUrl
else
- for engine in CompletionEngines
+ for engine in completionEngines
+ engine = new engine()
return @engineCache.set searchUrl, engine if engine.match searchUrl
# This is the main (actually, the only) entry point.
- # searchUrl is the search engine's URL, e.g. Settings.get("searchUrl")
- # queryTerms are the queryTerms
- # callback will be applied to a list of suggestion strings (which will be an empty list, if anything goes
+ # searchUrl is the search engine's URL, e.g. Settings.get("searchUrl").
+ # queryTerms are the queryTerms.
+ # callback will be applied to a list of suggestion strings (which may be an empty list, if anything goes
# wrong).
complete: (searchUrl, queryTerms, callback) ->
return callback [] unless 0 < queryTerms.length
diff --git a/lib/utils.coffee b/lib/utils.coffee
index 338e535d..88fe9e2c 100644
--- a/lib/utils.coffee
+++ b/lib/utils.coffee
@@ -202,7 +202,8 @@ class SimpleCache
constructor: (@expiry = 60 * 60 * 1000, @entries = 1000) ->
@cache = {}
@previous = {}
- setInterval (=> @rotate()), @expiry
+ rotate = => @rotate()
+ setInterval rotate, @expiry
rotate: ->
@previous = @cache
@@ -212,7 +213,6 @@ class SimpleCache
(key of @cache) or key of @previous
get: (key) ->
- console.log "get", key
if key of @cache
@cache[key]
else if key of @previous