diff options
Diffstat (limited to 'pages/vomnibar.coffee')
| -rw-r--r-- | pages/vomnibar.coffee | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/pages/vomnibar.coffee b/pages/vomnibar.coffee index 18a72a37..06ec9ee9 100644 --- a/pages/vomnibar.coffee +++ b/pages/vomnibar.coffee @@ -38,9 +38,13 @@ Vomnibar = @vomnibarUI.setQuery(options.query) @vomnibarUI.update() + hide: -> @vomnibarUI?.hide() + onHidden: -> @vomnibarUI?.onHidden() + class VomnibarUI constructor: -> @refreshInterval = 0 + @postHideCallback = null @initDom() setQuery: (query) -> @input.value = query @@ -57,9 +61,20 @@ class VomnibarUI setForceNewTab: (forceNewTab) -> @forceNewTab = forceNewTab - hide: -> + # The sequence of events when the vomnibar is hidden is as follows: + # 1. Post a "hide" message to the host page. + # 2. The host page hides the vomnibar and posts back a "hidden" message. + # 3. Only once "hidden" message is received here is any required action (callback) invoked (in onHidden). + # This ensures that the vomnibar is actually hidden, and avoids flicker after opening a link in a new tab + # (see #1485). + hide: (callback = null) -> UIComponentServer.postMessage "hide" @reset() + @postHideCallback = callback + + onHidden: -> + @postHideCallback?() + @postHideCallback = null reset: -> @completionList.style.display = "" @@ -121,15 +136,15 @@ class VomnibarUI query = @input.value.trim() # <Enter> on an empty vomnibar is a no-op. return unless 0 < query.length - @hide() - chrome.runtime.sendMessage({ - handler: if openInNewTab then "openUrlInNewTab" else "openUrlInCurrentTab" - url: query }) + @hide -> + chrome.runtime.sendMessage + handler: if openInNewTab then "openUrlInNewTab" else "openUrlInCurrentTab" + url: query else @update true, => # Shift+Enter will open the result in a new tab instead of the current tab. - @completions[@selection].performAction(openInNewTab) - @hide() + completion = @completions[@selection] + @hide -> completion.performAction openInNewTab # It seems like we have to manually suppress the event here and still return true. event.stopImmediatePropagation() @@ -180,6 +195,12 @@ class VomnibarUI @completionList.style.display = "" window.addEventListener "focus", => @input.focus() + # A click in the vomnibar itself refocuses the input. + @box.addEventListener "click", (event) => + @input.focus() + event.stopImmediatePropagation() + # A click anywhere else hides the vomnibar. + document.body.addEventListener "click", => @hide() # # Sends filter and refresh requests to a Vomnibox completer on the background page. @@ -225,7 +246,11 @@ extend BackgroundCompleter, switchToTab: (tabId) -> chrome.runtime.sendMessage({ handler: "selectSpecificTab", id: tabId }) -UIComponentServer.registerHandler (event) -> Vomnibar.activate event.data +UIComponentServer.registerHandler (event) -> + switch event.data + when "hide" then Vomnibar.hide() + when "hidden" then Vomnibar.onHidden() + else Vomnibar.activate event.data root = exports ? window root.Vomnibar = Vomnibar |
