aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Blott2015-06-10 16:39:02 +0100
committerStephen Blott2015-06-10 16:52:16 +0100
commit61764d812a37ca2c29b3b7ddde878f25250abf81 (patch)
tree66b50410a1d968618cb63bb8c9c42f80290b9888
parente516bae3a3374780d2cb1b6c32e5fd1f2c13a408 (diff)
downloadvimium-61764d812a37ca2c29b3b7ddde878f25250abf81.tar.bz2
Fix bug relating to duplicate hint strings.
(Not sure when this crept in.) We need to ensure that we always generate the same hint strings for the same filter state. Here, we do this by always using the same mechanism (@filterLinkHints) to set the hint strings.
-rw-r--r--content_scripts/link_hints.coffee15
-rw-r--r--tests/dom_tests/dom_tests.coffee27
2 files changed, 24 insertions, 18 deletions
diff --git a/content_scripts/link_hints.coffee b/content_scripts/link_hints.coffee
index 144400b6..15af15c5 100644
--- a/content_scripts/link_hints.coffee
+++ b/content_scripts/link_hints.coffee
@@ -478,7 +478,7 @@ class FilterHints
@labelMap[forElement] = labelText
generateHintString: (linkHintNumber) ->
- numberToHintString linkHintNumber + 1, @linkHintNumbers.toUpperCase()
+ numberToHintString linkHintNumber, @linkHintNumbers.toUpperCase()
generateLinkText: (element) ->
linkText = ""
@@ -512,8 +512,7 @@ class FilterHints
fillInMarkers: (hintMarkers) ->
@generateLabelMap()
DomUtils.textContent.reset()
- for marker, idx in hintMarkers
- marker.hintString = @generateHintString(idx)
+ for marker in hintMarkers
linkTextObject = @generateLinkText(marker.clickableItem)
marker.linkText = linkTextObject.text
marker.showLinkText = linkTextObject.show
@@ -522,7 +521,9 @@ class FilterHints
@activeHintMarker = hintMarkers[0]
@activeHintMarker?.classList.add "vimiumActiveHintMarker"
- hintMarkers
+ # We use @filterLinkHints() here (although we know that all of the hints will match) to fill in the hint
+ # strings. This ensures that we always get hint strings in the same order.
+ @filterLinkHints hintMarkers
getMatchingHints: (hintMarkers, tabCount = 0) ->
delay = 0
@@ -563,10 +564,7 @@ class FilterHints
# Filter link hints by search string, renumbering the hints as necessary.
filterLinkHints: (hintMarkers) ->
- idx = 0
linkSearchString = @linkTextKeystrokeQueue.join("").trim().toLowerCase()
- return hintMarkers unless 0 < linkSearchString.length
-
do (scoreFunction = @scoreLinkHint linkSearchString) ->
linkMarker.score = scoreFunction linkMarker for linkMarker in hintMarkers
# The Javascript sort() method is known not to be stable. Nevertheless, we require (and assume, here)
@@ -575,9 +573,10 @@ class FilterHints
# filtering here).
hintMarkers = hintMarkers[..].sort (a,b) -> b.score - a.score
+ linkHintNumber = 1
for linkMarker in hintMarkers
continue unless 0 < linkMarker.score
- linkMarker.hintString = @generateHintString idx++
+ linkMarker.hintString = @generateHintString linkHintNumber++
@renderMarker linkMarker
linkMarker
diff --git a/tests/dom_tests/dom_tests.coffee b/tests/dom_tests/dom_tests.coffee
index dd2f5a5d..a79735ae 100644
--- a/tests/dom_tests/dom_tests.coffee
+++ b/tests/dom_tests/dom_tests.coffee
@@ -212,11 +212,14 @@ context "Filtered link hints",
@linkHints.deactivateMode()
should "label the images", ->
- hintMarkers = getHintMarkers()
- assert.equal "1: alt text", hintMarkers[0].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()
+ hintMarkers = getHintMarkers().map (marker) -> marker.textContent.toLowerCase()
+ # We don't know the actual hint numbers which will be assigned, so we replace them with "N".
+ hintMarkers = hintMarkers.map (str) -> str.replace /^[1-4]/, "N"
+ assert.equal 4, hintMarkers.length
+ assert.isTrue "N: alt text" in hintMarkers
+ assert.isTrue "N: some title" in hintMarkers
+ assert.isTrue "N: alt text" in hintMarkers
+ assert.isTrue "N" in hintMarkers
context "Input hints",
@@ -235,11 +238,15 @@ context "Filtered link hints",
should "label the input elements", ->
hintMarkers = getHintMarkers()
- assert.equal "1", hintMarkers[0].textContent.toLowerCase()
- assert.equal "2", hintMarkers[1].textContent.toLowerCase()
- assert.equal "3: a label", hintMarkers[2].textContent.toLowerCase()
- assert.equal "4: a label", hintMarkers[3].textContent.toLowerCase()
- assert.equal "5", hintMarkers[4].textContent.toLowerCase()
+ hintMarkers = getHintMarkers().map (marker) -> marker.textContent.toLowerCase()
+ # We don't know the actual hint numbers which will be assigned, so we replace them with "N".
+ hintMarkers = hintMarkers.map (str) -> str.replace /^[1-5]/, "N"
+ assert.equal 5, hintMarkers.length
+ assert.isTrue "N" in hintMarkers
+ assert.isTrue "N" in hintMarkers
+ assert.isTrue "N: a label" in hintMarkers
+ assert.isTrue "N: a label" in hintMarkers
+ assert.isTrue "N" in hintMarkers
context "Input focus",