aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--background_scripts/main.coffee8
-rw-r--r--content_scripts/vimium_frontend.coffee29
2 files changed, 24 insertions, 13 deletions
diff --git a/background_scripts/main.coffee b/background_scripts/main.coffee
index 241c809b..dea436ef 100644
--- a/background_scripts/main.coffee
+++ b/background_scripts/main.coffee
@@ -291,6 +291,8 @@ Frames =
onConnect: (sender, port) ->
[tabId, frameId] = [sender.tab.id, sender.frameId]
port.postMessage handler: "registerFrameId", chromeFrameId: frameId
+ # We only register the top frame automatically; other frames request registration via "registerFrame".
+ @registerFrame {tabId, frameId, port} if frameId == 0
port.onDisconnect.addListener listener = ->
# Unregister the frame. However, we never unregister the main/top frame. If the tab is navigating to
@@ -307,10 +309,8 @@ Frames =
this[request.handler] {request, tabId, frameId, port}
registerFrame: ({tabId, frameId, port}) ->
- frameIdsForTab[tabId] ?= []
- frameIdsForTab[tabId].push frameId unless frameId in frameIdsForTab[tabId]
- portsForTab[tabId] ?= {}
- portsForTab[tabId][frameId] = port
+ frameIdsForTab[tabId].push frameId unless frameId in frameIdsForTab[tabId] ?= []
+ (portsForTab[tabId] ?= {})[frameId] = port
isEnabledForUrl: ({request, tabId, port}) ->
urlForTab[tabId] = request.url if request.frameIsFocused
diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee
index fb8742e0..f14c5d07 100644
--- a/content_scripts/vimium_frontend.coffee
+++ b/content_scripts/vimium_frontend.coffee
@@ -138,15 +138,12 @@ installModes = ->
initializeOnEnabledStateKnown = Utils.makeIdempotent ->
installModes()
-registerFrame = ->
- Frame.postMessage "registerFrame"
-
#
-# Complete initialization work that sould be done prior to DOMReady.
+# Complete initialization work that should be done prior to DOMReady.
#
initializePreDomReady = ->
installListeners()
- Frame.init registerFrame
+ Frame.init()
checkIfEnabledForUrl()
requestHandlers =
@@ -214,10 +211,26 @@ Frame =
addEventListener: (handler, callback) -> @listeners[handler] = callback
postMessage: (handler, request = {}) -> @port.postMessage extend request, {handler}
- registerFrameId: ({chromeFrameId}) -> frameId = window.frameId = chromeFrameId
linkHintsMessage: (request) -> HintCoordinator[request.messageType] request
+ registerFrameId: ({chromeFrameId}) ->
+ frameId = window.frameId = chromeFrameId
+ unless frameId == 0
+ # The background page registers the top frame automatically. We register any other frame immediately if
+ # it is focused or its window isn't tiny. We register tiny frames later, when necessary. This affects
+ # focusFrame() and link hints.
+ if windowIsFocused() or not DomUtils.windowIsTooSmall()
+ Frame.postMessage "registerFrame"
+ else
+ postRegisterFrame = ->
+ window.removeEventListener "focus", focusHandler
+ window.removeEventListener "resize", resizeHandler
+ Frame.postMessage "registerFrame"
+ window.addEventListener "focus", focusHandler = ->
+ postRegisterFrame() if event.target == window
+ window.addEventListener "resize", resizeHandler = ->
+ postRegisterFrame() unless DomUtils.windowIsTooSmall()
- init: (callback = null) ->
+ init: ->
@port = chrome.runtime.connect name: "frames"
@port.onMessage.addListener (request) =>
@@ -228,8 +241,6 @@ Frame =
isEnabledForUrl = false
window.removeEventListener "focus", onFocus
- callback?()
-
setScrollPosition = ({ scrollX, scrollY }) ->
if DomUtils.isTopFrame()
DomUtils.documentReady ->