aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--background_scripts/main.coffee22
-rw-r--r--content_scripts/link_hints.coffee7
2 files changed, 25 insertions, 4 deletions
diff --git a/background_scripts/main.coffee b/background_scripts/main.coffee
index 2a5b738e..68e108fd 100644
--- a/background_scripts/main.coffee
+++ b/background_scripts/main.coffee
@@ -349,9 +349,11 @@ cycleToFrame = (frames, frameId, count = 0) ->
[frames[count..]..., frames[0...count]...]
HintCoordinator =
+ debug: false
tabState: {}
onMessage: (tabId, frameId, request) ->
+ console.log "onMessage", tabId, frameId, "[#{request.messageType}]" if @debug
if request.messageType of this
this[request.messageType] tabId, frameId, request
else
@@ -359,20 +361,32 @@ HintCoordinator =
@sendMessage request.messageType, tabId, request
sendMessage: (messageType, tabId, request = {}) ->
+ console.log "sendMessage", tabId, "[#{messageType}] [#{@tabState[tabId].ports.length}]" if @debug
extend request, {handler: "linkHintsMessage", messageType}
- port.postMessage request for own frameId, port of portsForTab[tabId]
+ for own frameId, port of @tabState[tabId].ports
+ try
+ port.postMessage request
+ catch
+ # If a frame has gone away, then we remove it from consideration.
+ tabState[tabId].frameIds = tabState[tabId].frameIds.filter (fId) -> fId != frameId
+ delete @tabState[tabId].ports[frameId]
+ # We can delete the tab state when we see an "exit" message, that's the last message in the sequence.
+ delete @tabState[tabId] if messageType == "exit"
prepareToActivateMode: (tabId, originatingFrameId, {modeIndex}) ->
- @tabState[tabId] = {frameIds: frameIdsForTab[tabId], hintDescriptors: [], originatingFrameId, modeIndex}
+ console.log "" if @debug
+ console.log "prepareToActivateMode", tabId, "[#{frameIdsForTab[tabId].length}]" if @debug
+ @tabState[tabId] = {frameIds: frameIdsForTab[tabId][..], hintDescriptors: [], originatingFrameId, modeIndex}
+ @tabState[tabId].ports = extend {}, portsForTab[tabId]
@sendMessage "getHintDescriptors", tabId
# Receive hint descriptors from all frames and activate link-hints mode when we have them all.
postHintDescriptors: (tabId, frameId, {hintDescriptors}) ->
@tabState[tabId].hintDescriptors.push hintDescriptors...
@tabState[tabId].frameIds = @tabState[tabId].frameIds.filter (fId) -> fId != frameId
+ console.log "postHintDescriptors", tabId, frameId, "[#{@tabState[tabId].frameIds.length}]" if @debug
if @tabState[tabId].frameIds.length == 0
@sendMessage "activateMode", tabId, @tabState[tabId]
- delete @tabState[tabId] # We won't be needing this any more.
# Port handler mapping
portHandlers =
@@ -409,7 +423,7 @@ chrome.storage.local.remove "findModeRawQueryListIncognito"
# there are no remaining incognito-mode windows. Since the common case is that there are none to begin with,
# we first check whether the key is set at all.
chrome.tabs.onRemoved.addListener (tabId) ->
- delete cache[tabId] for cache in [frameIdsForTab, urlForTab, portsForTab]
+ delete cache[tabId] for cache in [frameIdsForTab, urlForTab, portsForTab, HintCoordinator.tabState]
chrome.storage.local.get "findModeRawQueryListIncognito", (items) ->
if items.findModeRawQueryListIncognito
chrome.windows.getAll null, (windows) ->
diff --git a/content_scripts/link_hints.coffee b/content_scripts/link_hints.coffee
index 910e65f1..adbd758c 100644
--- a/content_scripts/link_hints.coffee
+++ b/content_scripts/link_hints.coffee
@@ -50,14 +50,17 @@ availableModes = [OPEN_IN_CURRENT_TAB, OPEN_IN_NEW_BG_TAB, OPEN_IN_NEW_FG_TAB, O
OPEN_INCOGNITO, DOWNLOAD_LINK_URL]
HintCoordinator =
+ debug: false
onExit: []
localHints: null
suppressKeyboardEvents: null
sendMessage: (messageType, request = {}) ->
+ console.log "sendMessage", frameId, "[#{messageType}]" if @debug
Frame.postMessage "linkHintsMessage", extend request, {messageType}
prepareToActivateMode: (mode, onExit) ->
+ console.log "prepareToActivateMode", frameId if @debug
# We need to communicate with the background page (and other frames) to initiate link-hints mode. To
# prevent other Vimium commands from being triggered before link-hints mode is launched, we install a
# temporary mode to block keyboard events.
@@ -70,9 +73,11 @@ HintCoordinator =
@sendMessage "prepareToActivateMode", modeIndex: availableModes.indexOf mode
getHintDescriptors: ->
+ console.log "getHintDescriptors", frameId if @debug
# Ensure that the settings are loaded. The request might have been initiated in another frame.
Settings.onLoaded =>
@localHints = LocalHints.getLocalHints()
+ console.log "getHintDescriptors", frameId, "[#{@localHints.length}]" if @debug
@sendMessage "postHintDescriptors", hintDescriptors:
@localHints.map ({rect, linkText, showLinkText, hasHref, reason}, localIndex) ->
{rect, linkText, showLinkText, hasHref, reason, frameId, localIndex}
@@ -81,6 +86,7 @@ HintCoordinator =
# We also propagate the key state between frames. Therefore, the hint-selection process proceeds in lock
# step in every frame, and @linkHintsMode is in the same state in every frame.
activateMode: ({hintDescriptors, modeIndex, originatingFrameId}) ->
+ console.log "activateMode", frameId if @debug
@suppressKeyboardEvents?.exit() if @suppressKeyboardEvents?.modeIsActive
@suppressKeyboardEvents = null
# Ensure that the settings are loaded. The request might have been initiated in another frame.
@@ -95,6 +101,7 @@ HintCoordinator =
getLocalHintMarker: (hint) -> if hint.frameId == frameId then @localHints[hint.localIndex] else null
exit: ({isSuccess}) ->
+ console.log "exit", frameId, "[#{isSuccess}]" if @debug
@linkHintsMode.deactivateMode()
@onExit.pop() isSuccess while 0 < @onExit.length
@linkHintsMode = @localHints = null