diff options
| -rw-r--r-- | background_scripts/main.coffee | 2 | ||||
| -rw-r--r-- | content_scripts/link_hints.coffee | 23 | ||||
| -rw-r--r-- | tests/dom_tests/dom_tests.coffee | 2 |
3 files changed, 11 insertions, 16 deletions
diff --git a/background_scripts/main.coffee b/background_scripts/main.coffee index 68e108fd..b9840757 100644 --- a/background_scripts/main.coffee +++ b/background_scripts/main.coffee @@ -378,7 +378,7 @@ HintCoordinator = 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 + @sendMessage "getHintDescriptors", tabId, {modeIndex} # Receive hint descriptors from all frames and activate link-hints mode when we have them all. postHintDescriptors: (tabId, frameId, {hintDescriptors}) -> diff --git a/content_scripts/link_hints.coffee b/content_scripts/link_hints.coffee index ab13e4a4..92efcc7a 100644 --- a/content_scripts/link_hints.coffee +++ b/content_scripts/link_hints.coffee @@ -76,16 +76,16 @@ HintCoordinator = # whether and when a hint from *any* frame is selected. They include the following properties: # frameId: the frame id of this hint's local frame # localIndex: the index in @localHints for the full hint descriptor for this hint - # linkText: the link's text for filtered hints (this is empty for alphabet hints) - # hasHref: boolean indicating whether this hint has an href property - getHintDescriptors: -> + # 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 => - @localHints = LocalHints.getLocalHints() + 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, hasHref}, localIndex) -> {frameId, localIndex, linkText, hasHref} + @localHints.map ({linkText}, localIndex) -> {frameId, localIndex, linkText} # We activate LinkHintsMode() in every frame and provide every frame with exactly the same hint descriptors. # We also propagate the key state between frames. Therefore, the hint-selection process proceeds in lock @@ -142,11 +142,6 @@ class LinkHintsMode # We need documentElement to be ready in order to append links. return unless document.documentElement - if mode in [COPY_LINK_URL, OPEN_INCOGNITO] - # For these modes, we filter out those descriptors which don't have an HREF (since there's nothing we - # can do with them). - hintDescriptors = (desc for desc in hintDescriptors when desc.hasHref) - if hintDescriptors.length == 0 HUD.showForDuration "No links to select.", 2000 return @@ -639,7 +634,7 @@ LocalHints = # Because of this, the rects returned will frequently *NOT* be equivalent to the rects for the whole # element. # - getLocalHints: -> + getLocalHints: (requireHref) -> # We need documentElement to be ready in order to find links. return [] unless document.documentElement elements = document.documentElement.getElementsByTagName "*" @@ -651,8 +646,9 @@ LocalHints = # NOTE(mrmr1993): Our previous method (combined XPath and DOM traversal for jsaction) couldn't provide # this, so it's necessary to check whether elements are clickable in order, as we do below. for element in elements - visibleElement = @getVisibleClickable element - visibleElements.push visibleElement... + unless requireHref and not element.href + visibleElement = @getVisibleClickable element + visibleElements.push visibleElement... # Traverse the DOM from descendants to ancestors, so later elements show above earlier elements. visibleElements = visibleElements.reverse() @@ -704,7 +700,6 @@ LocalHints = # click some elements that we could click before. nonOverlappingElements.push visibleElement unless visibleElement.secondClassCitizen - hint.hasHref = hint.element.href? for hint in localHints if Settings.get "filterLinkHints" @withLabelMap (labelMap) => extend hint, @generateLinkText labelMap, hint for hint in localHints diff --git a/tests/dom_tests/dom_tests.coffee b/tests/dom_tests/dom_tests.coffee index ccb84fe0..3977d046 100644 --- a/tests/dom_tests/dom_tests.coffee +++ b/tests/dom_tests/dom_tests.coffee @@ -64,7 +64,7 @@ getHintMarkers = -> stubSettings = (key, value) -> stub Settings.cache, key, JSON.stringify value HintCoordinator.sendMessage = (name, request = {}) -> HintCoordinator[name]? request; request -activateLinkHintsMode = -> HintCoordinator.activateMode HintCoordinator.getHintDescriptors() +activateLinkHintsMode = -> HintCoordinator.activateMode HintCoordinator.getHintDescriptors {modeIndex: 0} # # Generate tests that are common to both default and filtered |
