aboutsummaryrefslogtreecommitdiffstats
path: root/content_scripts/vimium_frontend.coffee
diff options
context:
space:
mode:
Diffstat (limited to 'content_scripts/vimium_frontend.coffee')
-rw-r--r--content_scripts/vimium_frontend.coffee21
1 files changed, 17 insertions, 4 deletions
diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee
index 2e57ee1a..5acabcfc 100644
--- a/content_scripts/vimium_frontend.coffee
+++ b/content_scripts/vimium_frontend.coffee
@@ -149,6 +149,7 @@ initializePreDomReady = ->
# A frame has received the focus. We don't care here (the Vomnibar/UI-component handles this).
frameFocused: ->
checkEnabledAfterURLChange: checkEnabledAfterURLChange
+ initializeTopFrame: initializeTopFrame
runInTopFrame: ({sourceFrameId, registryEntry}) ->
Utils.invokeCommandString registryEntry.command, [sourceFrameId, registryEntry] if DomUtils.isTopFrame()
@@ -218,9 +219,6 @@ initializeOnDomReady = ->
isEnabledForUrl = false
chrome.runtime.sendMessage = ->
window.removeEventListener "focus", onFocus
- # We only initialize the vomnibar in the tab's main frame, because it's only ever opened there.
- Vomnibar.init() if DomUtils.isTopFrame()
- HUD.init()
registerFrame = ->
# Don't register frameset containers; focusing them is no use.
@@ -436,6 +434,17 @@ extend window,
indicator: false
+initializeTopFrame = (request = null) ->
+ initializeTopFrame = -> # Only do this initialization once.
+ # We only initialize the vomnibar in the tab's top/main frame, because it's only ever opened there.
+ if DomUtils.isTopFrame()
+ Vomnibar.init()
+ else
+ # Ignore requests from other frames (if we're not the top frame).
+ unless request?
+ # Tell the top frame to initialize the Vomnibar.
+ chrome.runtime.sendMessage handler: "sendMessageToFrames", message: name: "initializeTopFrame"
+
# Checks if Vimium should be enabled or not in this frame. As a side effect, it also informs the background
# page whether this frame has the focus, allowing the background page to track the active frame's URL.
checkIfEnabledForUrl = (frameIsFocused = windowIsFocused()) ->
@@ -443,7 +452,11 @@ checkIfEnabledForUrl = (frameIsFocused = windowIsFocused()) ->
chrome.runtime.sendMessage { handler: "isEnabledForUrl", url: url, frameIsFocused: frameIsFocused }, (response) ->
{ isEnabledForUrl, passKeys } = response
installListeners() # But only if they have not been installed already.
- if HUD.isReady() and not isEnabledForUrl
+ # Initialize UI components. We only initialize these once we know that Vimium is enabled; see #1838.
+ if isEnabledForUrl
+ initializeTopFrame()
+ HUD.init() if frameIsFocused
+ else if HUD.isReady()
# Quickly hide any HUD we might already be showing, e.g. if we entered insert mode on page load.
HUD.hide()
normalMode?.setPassKeys passKeys