aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Blott2015-03-17 11:42:58 +0000
committerStephen Blott2015-03-17 11:42:58 +0000
commit8bc811aae1118e28faa7c17e67b039c67f637274 (patch)
tree702f28f1d88fef438a717895ede5107409df54be
parent9461d30b0d19fd65dc43e18bebec1fe0fd3ee818 (diff)
downloadvimium-8bc811aae1118e28faa7c17e67b039c67f637274.tar.bz2
Activate vomnibar in window.top; hide on focus, fixed.
-rw-r--r--background_scripts/main.coffee5
-rw-r--r--content_scripts/ui_component.coffee14
-rw-r--r--content_scripts/vimium_frontend.coffee20
3 files changed, 30 insertions, 9 deletions
diff --git a/background_scripts/main.coffee b/background_scripts/main.coffee
index 0b19ce4a..07e89e08 100644
--- a/background_scripts/main.coffee
+++ b/background_scripts/main.coffee
@@ -666,6 +666,10 @@ handleFrameFocused = (request, sender) ->
sendMessageToFrames = (request, sender) ->
chrome.tabs.sendMessage sender.tab.id, request.message
+# For debugging only. This allows content scripts to log messages to the background page's console.
+bgLog = (request, sender) ->
+ console.log "#{sender.tab.id}/#{request.frameId}", request.message
+
# Port handler mapping
portHandlers =
keyDown: handleKeyDown,
@@ -694,6 +698,7 @@ sendRequestHandlers =
gotoMark: Marks.goto.bind(Marks)
setBadge: setBadge
sendMessageToFrames: sendMessageToFrames
+ log: bgLog
# We always remove chrome.storage.local/findModeRawQueryListIncognito on startup.
chrome.storage.local.remove "findModeRawQueryListIncognito"
diff --git a/content_scripts/ui_component.coffee b/content_scripts/ui_component.coffee
index 64dddf67..3d8cef29 100644
--- a/content_scripts/ui_component.coffee
+++ b/content_scripts/ui_component.coffee
@@ -15,9 +15,9 @@ class UIComponent
# Hide the iframe, but don't interfere with the focus.
@hide false
- # If any frame in the current tab receives the focus, then we hide the vomnibar.
+ # If any other frame in the current tab receives the focus, then we hide the vomnibar.
chrome.runtime.onMessage.addListener (request) =>
- @hide false if @showing and request.name == "frameFocused"
+ @hide false if @showing and request.name == "frameFocused" and request.frameId != frameId
false # Free up response handler.
# Open a port and pass it to the iframe via window.postMessage.
@@ -42,11 +42,21 @@ class UIComponent
@postMessage message if message?
@iframeElement.classList.remove "vimiumUIComponentHidden"
@iframeElement.classList.add "vimiumUIComponentShowing"
+ # The window may not have the focus. We focus it now, to prevent the "focus" listener below from firing
+ # immediately.
+ window.focus()
+ window.addEventListener "focus", @onFocus = (event) =>
+ if event.target == window
+ window.removeEventListener "focus", @onFocus
+ @onFocus = null
+ @postMessage "hide"
@showing = true
hide: (focusWindow = true)->
@iframeElement.classList.remove "vimiumUIComponentShowing"
@iframeElement.classList.add "vimiumUIComponentHidden"
+ window.removeEventListener "focus", @onFocus if @onFocus
+ @onFocus = null
if focusWindow and @options?.frameId?
chrome.runtime.sendMessage
handler: "sendMessageToFrames"
diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee
index 941b2bc2..90b25a40 100644
--- a/content_scripts/vimium_frontend.coffee
+++ b/content_scripts/vimium_frontend.coffee
@@ -94,7 +94,12 @@ settings =
#
# Give this frame a unique id.
#
-frameId = Math.floor(Math.random()*999999999)
+window.frameId = Math.floor(Math.random()*999999999)
+
+# For debugging only. This logs to the console on the background page.
+window.bgLog = (args...) ->
+ args = (arg.toString() for arg in args)
+ chrome.runtime.sendMessage handler: "log", frameId: frameId, message: args.join " "
# If an input grabs the focus before the user has interacted with the page, then grab it back (if the
# grabBackFocus option is set).
@@ -230,12 +235,13 @@ getActiveState = ->
#
# The backend needs to know which frame has focus.
#
-registerFocus = ->
- # settings may have changed since the frame last had focus
- settings.load()
- # Don't register frameset containers; focusing them is no use.
- unless document.body?.tagName.toLowerCase() == "frameset"
- chrome.runtime.sendMessage({ handler: "frameFocused", frameId: frameId })
+registerFocus = (event) ->
+ if event.target == window
+ # settings may have changed since the frame last had focus
+ settings.load()
+ # Don't register frameset containers; focusing them is no use.
+ unless document.body?.tagName.toLowerCase() == "frameset"
+ chrome.runtime.sendMessage({ handler: "frameFocused", frameId: frameId })
#
# Initialization tasks that must wait for the document to be ready.