From ff615efa9a41f1de5df1a6eea0e8a3c809f91b4b Mon Sep 17 00:00:00 2001 From: mrmr1993 Date: Sat, 2 Dec 2017 18:38:53 +0000 Subject: Ensure that a port can only unregister its frameId if it's associated This is a more complete fix for issue #2125. --- background_scripts/main.coffee | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'background_scripts') diff --git a/background_scripts/main.coffee b/background_scripts/main.coffee index 2c7b13ba..d87109f4 100644 --- a/background_scripts/main.coffee +++ b/background_scripts/main.coffee @@ -301,7 +301,7 @@ for icon in [ENABLED_ICON, DISABLED_ICON, PARTIAL_ICON] Frames = onConnect: (sender, port) -> [tabId, frameId] = [sender.tab.id, sender.frameId] - port.onDisconnect.addListener -> Frames.unregisterFrame {tabId, frameId} + port.onDisconnect.addListener -> Frames.unregisterFrame {tabId, frameId, port} port.postMessage handler: "registerFrameId", chromeFrameId: frameId (portsForTab[tabId] ?= {})[frameId] = port @@ -312,11 +312,11 @@ Frames = registerFrame: ({tabId, frameId, port}) -> frameIdsForTab[tabId].push frameId unless frameId in frameIdsForTab[tabId] ?= [] - unregisterFrame: ({tabId, frameId}) -> - # FrameId 0 is the top/main frame. We never unregister that frame. If the tab is closing, then we tidy - # up elsewhere. If the tab is navigating to a new page, then a new top frame will be along soon. - # This mitigates against the unregister and register messages arriving out of order. See #2125. - if 0 < frameId + unregisterFrame: ({tabId, frameId, port}) -> + # Check that the port trying to unregister the frame hasn't already been replaced by a new frame + # registering. See #2125. + registeredPort = portsForTab[tabId]?[frameId] + if registeredPort == port or not registeredPort if tabId of frameIdsForTab frameIdsForTab[tabId] = (fId for fId in frameIdsForTab[tabId] when fId != frameId) if tabId of portsForTab -- cgit v1.2.3 From f32dfbfc650a873d1f91ac3fb21383fb02423c7f Mon Sep 17 00:00:00 2001 From: mrmr1993 Date: Sat, 2 Dec 2017 18:49:42 +0000 Subject: Only send link hints messages to frames which have registered This puts link hints frame behaviour back to matching fb00eaa6bd4ee8889d10a9ef9d976fefd3be7879 In particular, we go back to not sending link hints messages to frames that are too small (according to DomUtils.windowIsTooSmall). --- background_scripts/main.coffee | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'background_scripts') diff --git a/background_scripts/main.coffee b/background_scripts/main.coffee index d87109f4..e3188a26 100644 --- a/background_scripts/main.coffee +++ b/background_scripts/main.coffee @@ -389,7 +389,8 @@ HintCoordinator = prepareToActivateMode: (tabId, originatingFrameId, {modeIndex, isVimiumHelpDialog}) -> @tabState[tabId] = {frameIds: frameIdsForTab[tabId][..], hintDescriptors: {}, originatingFrameId, modeIndex} - @tabState[tabId].ports = extend {}, portsForTab[tabId] + @tabState[tabId].ports = {} + frameIdsForTab[tabId].map (frameId) => @tabState[tabId].ports[frameId] = portsForTab[tabId][frameId] @sendMessage "getHintDescriptors", tabId, {modeIndex, isVimiumHelpDialog} # Receive hint descriptors from all frames and activate link-hints mode when we have them all. -- cgit v1.2.3