aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content_scripts/link_hints.coffee8
-rw-r--r--tests/dom_tests/dom_tests.coffee11
2 files changed, 13 insertions, 6 deletions
diff --git a/content_scripts/link_hints.coffee b/content_scripts/link_hints.coffee
index 440e6598..3cebac4c 100644
--- a/content_scripts/link_hints.coffee
+++ b/content_scripts/link_hints.coffee
@@ -60,6 +60,12 @@ LinkHints =
# For these modes, we filter out those elements which don't have an HREF (since there's nothing we can do
# with them).
elements = (el for el in elements when el.element.href?) if mode in [ COPY_LINK_URL, OPEN_INCOGNITO ]
+ if settings.get "filterLinkHints"
+ # When using text filtering, we sort the elements such that we visit descendants before their ancestors.
+ # This allows us to exclude the text used for matching descendants from that used for matching their
+ # ancestors.
+ length = (el) -> el.element.innerHTML?.length ? 0
+ elements.sort (a,b) -> length(a) - length b
hintMarkers = (@createMarkerFor(el) for el in elements)
@getMarkerMatcher().fillInMarkers(hintMarkers)
@@ -238,8 +244,6 @@ LinkHints =
# Remove rects from elements where another clickable element lies above it.
nonOverlappingElements = []
# Traverse the DOM from first to last, since later elements show above earlier elements.
- # NOTE(smblott). filterHints.generateLinkText also assumes this order when generating the content text for
- # each hint. Specifically, we consider descendents before we consider their ancestors.
visibleElements = visibleElements.reverse()
while visibleElement = visibleElements.pop()
rects = [visibleElement.rect]
diff --git a/tests/dom_tests/dom_tests.coffee b/tests/dom_tests/dom_tests.coffee
index bb09a0a8..8c2b73c3 100644
--- a/tests/dom_tests/dom_tests.coffee
+++ b/tests/dom_tests/dom_tests.coffee
@@ -156,6 +156,9 @@ context "Alphabetical link hints",
assert.equal "", hintMarkers[0].style.display
context "Filtered link hints",
+ # Note. In all of these tests, the order of the elements returned by getHintMarkers() may be different from
+ # the order they are listed in the test HTML content. This is because LinkHints.activateMode() sorts the
+ # elements.
setup ->
stub settings.values, "filterLinkHints", true
@@ -205,8 +208,8 @@ context "Filtered link hints",
should "label the images", ->
hintMarkers = getHintMarkers()
assert.equal "1: alt text", hintMarkers[0].textContent.toLowerCase()
- assert.equal "2: alt text", hintMarkers[1].textContent.toLowerCase()
- assert.equal "3: some title", hintMarkers[2].textContent.toLowerCase()
+ assert.equal "2: some title", hintMarkers[1].textContent.toLowerCase()
+ assert.equal "3: alt text", hintMarkers[2].textContent.toLowerCase()
assert.equal "4", hintMarkers[3].textContent.toLowerCase()
context "Input hints",
@@ -228,9 +231,9 @@ context "Filtered link hints",
hintMarkers = getHintMarkers()
assert.equal "1", hintMarkers[0].textContent.toLowerCase()
assert.equal "2", hintMarkers[1].textContent.toLowerCase()
- assert.equal "3", hintMarkers[2].textContent.toLowerCase()
+ assert.equal "3: a label", hintMarkers[2].textContent.toLowerCase()
assert.equal "4: a label", hintMarkers[3].textContent.toLowerCase()
- assert.equal "5: a label", hintMarkers[4].textContent.toLowerCase()
+ assert.equal "5", hintMarkers[4].textContent.toLowerCase()
context "Input focus",