diff options
Diffstat (limited to 'content_scripts')
| -rw-r--r-- | content_scripts/link_hints.coffee | 26 | ||||
| -rw-r--r-- | content_scripts/vimium_frontend.coffee | 21 |
2 files changed, 24 insertions, 23 deletions
diff --git a/content_scripts/link_hints.coffee b/content_scripts/link_hints.coffee index e650463f..56cea78d 100644 --- a/content_scripts/link_hints.coffee +++ b/content_scripts/link_hints.coffee @@ -50,29 +50,25 @@ 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. - @suppressKeyboardEvents = new SuppressAllKeyboardEvents + @suppressKeyboardEvents = suppressKeyboardEvents = new SuppressAllKeyboardEvents name: "link-hints/suppress-keyboard-events" singleton: "link-hints-mode" indicator: "Collecting hints..." exitOnEscape: true # FIXME(smblott) Global link hints is currently insufficiently reliable. If the mode above is left in # place, then Vimium blocks. As a temporary measure, we install a timer to remove it. - unless @debug - Utils.setTimeout 1000, => @suppressKeyboardEvents.exit() if @suppressKeyboardEvents?.modeIsActive + Utils.setTimeout 1000, -> suppressKeyboardEvents.exit() if suppressKeyboardEvents?.modeIsActive @onExit = [onExit] @sendMessage "prepareToActivateMode", modeIndex: availableModes.indexOf mode @@ -82,12 +78,10 @@ HintCoordinator = # localIndex: the index in @localHints for the full hint descriptor for this hint # linkText: the link's text for filtered hints (this is null for alphabet hints) getHintDescriptors: ({modeIndex}) -> - console.log "getHintDescriptors", frameId if @debug - # Ensure that the settings are loaded. The request might have been initiated in another frame. - Settings.onLoaded => + # Ensure that the document is ready and that the settings are loaded. + DomUtils.documentReady => Settings.onLoaded => requireHref = availableModes[modeIndex] in [COPY_LINK_URL, OPEN_INCOGNITO] @localHints = LocalHints.getLocalHints requireHref - console.log "getHintDescriptors", frameId, "[#{@localHints.length}]" if @debug @sendMessage "postHintDescriptors", hintDescriptors: @localHints.map ({linkText}, localIndex) -> {frameId, localIndex, linkText} @@ -95,11 +89,10 @@ 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. - Settings.onLoaded => + # Ensure that the document is ready and that the settings are loaded. + DomUtils.documentReady => Settings.onLoaded => + @suppressKeyboardEvents.exit() if @suppressKeyboardEvents?.modeIsActive + @suppressKeyboardEvents = null @onExit = [] unless frameId == originatingFrameId @linkHintsMode = new LinkHintsMode hintDescriptors, availableModes[modeIndex] @@ -110,8 +103,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() + @linkHintsMode?.deactivateMode() @onExit.pop() isSuccess while 0 < @onExit.length @linkHintsMode = @localHints = null diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index d9fc363e..58cf6115 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -239,12 +239,21 @@ Frame = @port.onMessage.addListener (request) => (@listeners[request.handler] ? this[request.handler]) request - @port.onDisconnect.addListener -> - # We disable the content scripts when we lose contact with the background page. - isEnabledForUrl = false - window.removeEventListener "focus", onFocus - - window.addEventListener "unload", => @postMessage "unregsterFrame" + # We disable the content scripts when we lose contact with the background page, or on unload. + @port.onDisconnect.addListener disconnect = Utils.makeIdempotent => @disconnect() + window.addEventListener "unload", disconnect + + disconnect: -> + try @postMessage "unregisterFrame" + try @port.disconnect() + @postMessage = @disconnect = -> + @port = null + @listeners = {} + HintCoordinator.exit isSuccess: false + handlerStack.reset() + isEnabledForUrl = false + window.removeEventListener "focus", onFocus + window.removeEventListener "hashchange", onFocus setScrollPosition = ({ scrollX, scrollY }) -> if DomUtils.isTopFrame() |
