aboutsummaryrefslogtreecommitdiffstats
path: root/pages/vomnibar.coffee
diff options
context:
space:
mode:
Diffstat (limited to 'pages/vomnibar.coffee')
-rw-r--r--pages/vomnibar.coffee54
1 files changed, 28 insertions, 26 deletions
diff --git a/pages/vomnibar.coffee b/pages/vomnibar.coffee
index a20ae7f3..fd7fd3cc 100644
--- a/pages/vomnibar.coffee
+++ b/pages/vomnibar.coffee
@@ -67,22 +67,13 @@ class VomnibarUI
@completionList.style.display = ""
@input.value = ""
@completions = []
- @previousAutoSelect = null
@previousInputValue = null
@customSearchMode = null
@selection = @initialSelectionValue
@keywords = []
+ @seenTabToOpenCompletionList = false
updateSelection: ->
- # We retain global state here (previousAutoSelect) to tell if a search item (for which autoSelect is set)
- # has just appeared or disappeared. If that happens, we set @selection to 0 or -1.
- if 0 < @completions.length
- @selection = 0 if @completions[0].autoSelect and not @previousAutoSelect
- @selection = -1 if @previousAutoSelect and not @completions[0].autoSelect
- @previousAutoSelect = @completions[0].autoSelect
- else
- @previousAutoSelect = null
-
# For custom search engines, we suppress the leading term (e.g. the "w" of "w query terms") within the
# vomnibar input.
if @lastReponse.customSearchMode and not @customSearchMode?
@@ -95,7 +86,7 @@ class VomnibarUI
# typing.
if 0 <= @selection and @completions[@selection].insertText?
@previousInputValue ?= @input.value
- @input.value = @completions[@selection].insertText + (if @selection == 0 then "" else " ")
+ @input.value = @completions[@selection].insertText
else if @previousInputValue?
@input.value = @previousInputValue
@previousInputValue = null
@@ -135,9 +126,13 @@ class VomnibarUI
if (action == "dismiss")
@hide()
else if action in [ "tab", "down" ]
- @selection += 1
- @selection = @initialSelectionValue if @selection == @completions.length
- @updateSelection()
+ if @input.value.trim().length == 0 and action == "tab" and not @seenTabToOpenCompletionList
+ @seenTabToOpenCompletionList = true
+ @update true
+ else
+ @selection += 1
+ @selection = @initialSelectionValue if @selection == @completions.length
+ @updateSelection()
else if (action == "up")
@selection -= 1
@selection = @completions.length - 1 if @selection < @initialSelectionValue
@@ -160,12 +155,16 @@ class VomnibarUI
completion = @completions[@selection]
@hide -> completion.performAction openInNewTab
else if action == "delete"
- if @customSearchMode? and @input.value.length == 0
+ inputIsEmpty = @input.value.length == 0
+ if inputIsEmpty and @customSearchMode?
# Normally, with custom search engines, the keyword (e,g, the "w" of "w query terms") is suppressed.
# If the input is empty, then reinstate the keyword (the "w").
@input.value = @customSearchMode
@customSearchMode = null
- @updateCompletions()
+ @update true
+ else if inputIsEmpty and @seenTabToOpenCompletionList
+ @seenTabToOpenCompletionList = false
+ @update true
else
return true # Do not suppress event.
@@ -182,39 +181,43 @@ class VomnibarUI
updateCompletions: (callback = null) ->
@completer.filter
query: @getInputValueAsQuery()
+ seenTabToOpenCompletionList: @seenTabToOpenCompletionList
callback: (@lastReponse) =>
{ results } = @lastReponse
@completions = results
+ @selection = if @completions[0]?.autoSelect then 0 else @initialSelectionValue
# Update completion list with the new suggestions.
@completionList.innerHTML = @completions.map((completion) -> "<li>#{completion.html}</li>").join("")
@completionList.style.display = if @completions.length > 0 then "block" else ""
@selection = Math.min @completions.length - 1, Math.max @initialSelectionValue, @selection
- @previousAutoSelect = null if @completions[0]?.autoSelect and @completions[0]?.forceAutoSelect
@updateSelection()
callback?()
- updateOnInput: =>
+ onInput: =>
+ @seenTabToOpenCompletionList = false
@completer.cancel()
- # If the user types, then don't reset any previous text, and restart auto select.
+ if 0 <= @selection and @completions[@selection].customSearchMode and not @customSearchMode
+ @customSearchMode = @completions[@selection].customSearchMode
+ updateSynchronously = true
+ # If the user types, then don't reset any previous text, and reset the selection.
if @previousInputValue?
@previousInputValue = null
- @previousAutoSelect = null
@selection = -1
- @update false
+ @update updateSynchronously
clearUpdateTimer: ->
if @updateTimer?
window.clearTimeout @updateTimer
@updateTimer = null
- isCustomSearch: ->
+ shouldActivateCustomSearchMode: ->
queryTerms = @input.value.ltrim().split /\s+/
- 1 < queryTerms.length and queryTerms[0] in @keywords
+ 1 < queryTerms.length and queryTerms[0] in @keywords and not @customSearchMode
update: (updateSynchronously = false, callback = null) =>
# If the query text becomes a custom search (the user enters a search keyword), then we need to force a
# synchronous update (so that the state is updated immediately).
- updateSynchronously ||= @isCustomSearch() and not @customSearchMode?
+ updateSynchronously ||= @shouldActivateCustomSearchMode()
if updateSynchronously
@clearUpdateTimer()
@updateCompletions callback
@@ -231,7 +234,7 @@ class VomnibarUI
@box = document.getElementById("vomnibar")
@input = @box.querySelector("input")
- @input.addEventListener "input", @updateOnInput
+ @input.addEventListener "input", @onInput
@input.addEventListener "keydown", @onKeydown
@completionList = @box.querySelector("ul")
@completionList.style.display = ""
@@ -286,7 +289,6 @@ class BackgroundCompleter
queryTerms: query.trim().split(/\s+/).filter (s) -> 0 < s.length
# We don't send these keys.
callback: null
- mayUseVomnibarCache: null
reset: ->
@keywords = []