aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content_scripts/ui_component.coffee2
-rw-r--r--content_scripts/vimium_frontend.coffee3
-rw-r--r--content_scripts/vomnibar.coffee42
-rw-r--r--pages/vomnibar.coffee61
-rw-r--r--pages/vomnibar.html1
5 files changed, 30 insertions, 79 deletions
diff --git a/content_scripts/ui_component.coffee b/content_scripts/ui_component.coffee
index d89f0cc8..696cb42c 100644
--- a/content_scripts/ui_component.coffee
+++ b/content_scripts/ui_component.coffee
@@ -42,7 +42,7 @@ class UIComponent
@showing = true
@iframeElement.focus()
- hide: (focusWindow=true)->
+ hide: (focusWindow = true)->
if @showing
@iframeElement.setAttribute "style", @hideStyle
window.focus() if focusWindow
diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee
index 2de08c39..ae275f0c 100644
--- a/content_scripts/vimium_frontend.coffee
+++ b/content_scripts/vimium_frontend.coffee
@@ -139,8 +139,6 @@ initializePreDomReady = ->
getActiveState: -> { enabled: isEnabledForUrl, passKeys: passKeys }
setState: setState
currentKeyQueue: (request) -> keyQueue = request.keyQueue
- vomnibarShow: -> Vomnibar.show()
- vomnibarClose: -> Vomnibar.close()
chrome.runtime.onMessage.addListener (request, sender, sendResponse) ->
# In the options page, we will receive requests from both content and background scripts. ignore those
@@ -202,6 +200,7 @@ initializeOnDomReady = ->
# Tell the background page we're in the dom ready state.
chrome.runtime.connect({ name: "domReady" })
CursorHider.init()
+ Vomnibar.init()
registerFrame = ->
# Don't register frameset containers; focusing them is no use.
diff --git a/content_scripts/vomnibar.coffee b/content_scripts/vomnibar.coffee
index 10f75652..6b82d31c 100644
--- a/content_scripts/vomnibar.coffee
+++ b/content_scripts/vomnibar.coffee
@@ -2,7 +2,7 @@
# This wraps the vomnibar iframe, which we inject into the page to provide the vomnibar.
#
Vomnibar =
- vomnibarElement: null
+ vomnibarUI: null
activate: -> @open {completer:"omni"}
activateInNewTab: -> @open {
@@ -35,41 +35,23 @@ Vomnibar =
newTab: true
}
+ init: ->
+ unless @vomnibarUI?
+ @vomnibarUI = new UIComponent "pages/vomnibar.html", "vomnibarFrame", @handleMessage.bind this
+
+ handleMessage: (event) ->
+ if event.data == "hide"
+ @hide()
+
+
# This function opens the vomnibar. It accepts options, a map with the values:
# completer - The completer to fetch results from.
# query - Optional. Text to prefill the Vomnibar with.
# selectFirst - Optional, boolean. Whether to select the first entry.
# newTab - Optional, boolean. Whether to open the result in a new tab.
- open: (options) ->
- unless @vomnibarElement?
- @vomnibarElement = document.createElement "iframe"
- @vomnibarElement.className = "vomnibarFrame"
- @vomnibarElement.seamless = "seamless"
- @hide()
-
- options.frameId = frameId
-
- optionStrings = []
- for option of options
- if typeof options[option] == "boolean"
- optionStrings.push option if options[option]
- else
- optionStrings.push "#{option}=#{escape(options[option])}"
-
- @vomnibarElement.src = "#{chrome.runtime.getURL "pages/vomnibar.html"}?#{optionStrings.join "&"}"
- document.documentElement.appendChild @vomnibarElement
-
- @vomnibarElement.focus()
-
- close: ->
- @hide()
- @vomnibarElement?.remove()
-
- show: ->
- @vomnibarElement?.style.display = "block"
+ open: (options) -> @vomnibarUI.activate options
- hide: ->
- @vomnibarElement?.style.display = "none"
+ hide: -> @vomnibarUI?.hide()
root = exports ? window
root.Vomnibar = Vomnibar
diff --git a/pages/vomnibar.coffee b/pages/vomnibar.coffee
index 2b6980f7..2d5fdd1c 100644
--- a/pages/vomnibar.coffee
+++ b/pages/vomnibar.coffee
@@ -16,25 +16,13 @@ Vomnibar =
#
# Activate the Vomnibox.
#
- activate: (params = "") ->
+ activate: (userOptions) ->
options =
completer: "omni"
query: null
- frameId: -1
-
- booleanOptions = ["selectFirst", "newTab"]
-
- # Convert options/params in URL to options object.
- params
- .split(/[\?&]/)
- .map((option) ->
- [name, value] = option.split "="
- options[name] = if value? then unescape(value) else true
- )
-
- # Set boolean options.
- for option in booleanOptions
- options[option] = option of options and options[option] != "false"
+ newTab: false
+ selectFirst: false
+ extend options, userOptions
options.refreshInterval = switch options.completer
when "omni" then 100
@@ -47,11 +35,8 @@ Vomnibar =
@vomnibarUI.setCompleter(completer)
@vomnibarUI.setRefreshInterval(options.refreshInterval)
@vomnibarUI.setForceNewTab(options.newTab)
- @vomnibarUI.setFrameId(options.frameId)
- @vomnibarUI.show()
- if (options.query)
- @vomnibarUI.setQuery(options.query)
- @vomnibarUI.update()
+ @vomnibarUI.setQuery(options.query) if options.query
+ @vomnibarUI.update()
class VomnibarUI
constructor: ->
@@ -71,30 +56,14 @@ class VomnibarUI
setForceNewTab: (forceNewTab) -> @forceNewTab = forceNewTab
- setFrameId: (frameId) -> @frameId = frameId
-
- show: ->
- @box.style.display = "block"
- @input.focus()
- @input.addEventListener "keydown", @onKeydown
-
- chrome.runtime.sendMessage
- handler: "echo"
- name: "vomnibarShow"
- frameId: @frameId
-
hide: ->
- @box.style.display = "none"
- @completionList.style.display = "none"
@input.blur()
- @input.removeEventListener "keydown", @onKeydown
window.parent.focus()
- chrome.runtime.sendMessage
- handler: "echo"
- name: "vomnibarClose"
- frameId: @frameId
+ UIComponentServer.postMessage "hide"
+ @reset()
reset: ->
+ @completionList.style.display = "none"
@input.value = ""
@updateTimer = null
@completions = []
@@ -188,7 +157,7 @@ class VomnibarUI
@selection = Math.min(Math.max(@initialSelectionValue, @selection), @completions.length - 1)
@updateSelection()
- update: (updateSynchronously, callback) ->
+ update: (updateSynchronously, callback) =>
if (updateSynchronously)
# cancel scheduled update
if (@updateTimer != null)
@@ -205,11 +174,14 @@ class VomnibarUI
@updateTimer = null
@refreshInterval)
+ @input.focus()
+
initDom: ->
@box = document.getElementById("vomnibar")
@input = @box.querySelector("input")
- @input.addEventListener "input", => @update()
+ @input.addEventListener "input", @update
+ @input.addEventListener "keydown", @onKeydown
@completionList = @box.querySelector("ul")
@completionList.style.display = "none"
@@ -259,10 +231,7 @@ extend BackgroundCompleter,
switchToTab: (tabId) -> chrome.runtime.sendMessage({ handler: "selectSpecificTab", id: tabId })
-initializeOnDomReady = ->
- Vomnibar.activate document.location.search
-
-window.addEventListener "DOMContentLoaded", initializeOnDomReady
+UIComponentServer.registerHandler (event) -> Vomnibar.activate event.data
root = exports ? window
root.Vomnibar = Vomnibar
diff --git a/pages/vomnibar.html b/pages/vomnibar.html
index 6cba99e6..2ca463d0 100644
--- a/pages/vomnibar.html
+++ b/pages/vomnibar.html
@@ -6,6 +6,7 @@
<script type="text/javascript" src="../lib/dom_utils.js"></script>
<script type="text/javascript" src="../lib/handler_stack.js"></script>
<script type="text/javascript" src="../lib/clipboard.js"></script>
+ <script type="text/javascript" src="ui_component_server.js"></script>
<script type="text/javascript" src="vomnibar.js"></script>
<link rel="stylesheet" type="text/css" href="../content_scripts/vimium.css" />
<link rel="stylesheet" type="text/css" href="vomnibar.css" />