aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content_scripts/link_hints.coffee20
-rw-r--r--tests/dom_tests/dom_tests.coffee12
2 files changed, 25 insertions, 7 deletions
diff --git a/content_scripts/link_hints.coffee b/content_scripts/link_hints.coffee
index 56cea78d..56edf22f 100644
--- a/content_scripts/link_hints.coffee
+++ b/content_scripts/link_hints.coffee
@@ -465,15 +465,21 @@ class FilterHints
linkSearchString = @linkTextKeystrokeQueue.join("").trim().toLowerCase()
do (scoreFunction = @scoreLinkHint linkSearchString) ->
linkMarker.score = scoreFunction linkMarker for linkMarker in hintMarkers
- hintMarkers = hintMarkers[..].sort (a,b) ->
+ matchingHintMarkers = hintMarkers[..].sort (a,b) ->
if b.score == a.score then b.stableSortCount - a.stableSortCount else b.score - a.score
- linkHintNumber = 1
- for linkMarker in hintMarkers
- continue unless 0 < linkMarker.score
- linkMarker.hintString = @generateHintString linkHintNumber++
- @renderMarker linkMarker
- linkMarker
+ matchingHintMarkers = (linkMarker for linkMarker in matchingHintMarkers when 0 < linkMarker.score)
+
+ if matchingHintMarkers.length == 0 and @hintKeystrokeQueue.length == 0 and 0 < @linkTextKeystrokeQueue.length
+ # We don't accept typed text which doesn't match any hints.
+ @linkTextKeystrokeQueue.pop()
+ @filterLinkHints hintMarkers
+ else
+ linkHintNumber = 1
+ for linkMarker in matchingHintMarkers
+ linkMarker.hintString = @generateHintString linkHintNumber++
+ @renderMarker linkMarker
+ linkMarker
# Assign a score to a filter match (higher is better). We assign a higher score for matches at the start of
# a word, and a considerably higher score still for matches which are whole words.
diff --git a/tests/dom_tests/dom_tests.coffee b/tests/dom_tests/dom_tests.coffee
index 3977d046..96d95902 100644
--- a/tests/dom_tests/dom_tests.coffee
+++ b/tests/dom_tests/dom_tests.coffee
@@ -282,6 +282,18 @@ context "Filtered link hints",
sendKeyboardEvent "A"
assert.equal "1", hintMarkers[3].hintString
+ # This test is the same as above, but with an extra non-matching character.
+ should "narrow the hints and ignore typing mistakes", ->
+ hintMarkers = getHintMarkers()
+ sendKeyboardEvent "T"
+ sendKeyboardEvent "R"
+ sendKeyboardEvent "X"
+ assert.equal "none", hintMarkers[0].style.display
+ assert.equal "3", hintMarkers[1].hintString
+ assert.equal "", hintMarkers[1].style.display
+ sendKeyboardEvent "A"
+ assert.equal "1", hintMarkers[3].hintString
+
context "Image hints",
setup ->