aboutsummaryrefslogtreecommitdiffstats
path: root/linkHints.js
diff options
context:
space:
mode:
Diffstat (limited to 'linkHints.js')
-rw-r--r--linkHints.js37
1 files changed, 31 insertions, 6 deletions
diff --git a/linkHints.js b/linkHints.js
index 16d6fcbf..e7795e2a 100644
--- a/linkHints.js
+++ b/linkHints.js
@@ -11,6 +11,7 @@ var hintMarkers = [];
var hintMarkerContainingDiv = null;
// The characters that were typed in while in "link hints" mode.
var hintKeystrokeQueue = [];
+var linkTextKeystrokeQueue = [];
var linkHintsModeActivated = false;
var shouldOpenLinkHintInNewTab = false;
var shouldOpenLinkHintWithQueue = false;
@@ -32,6 +33,10 @@ var clickableElementsXPath = (function() {
return xpath.join(" | ")
})();
+function isNarrowMode() {
+ return true;
+}
+
// We need this as a top-level function because our command system doesn't yet support arguments.
function activateLinkHintsModeToOpenInNewTab() { activateLinkHintsMode(true, false); }
@@ -169,6 +174,7 @@ function onKeyDownInLinkHintsMode(event) {
if (hintKeystrokeQueue.length == 0) {
deactivateLinkHintsMode();
} else {
+ linkTextKeystrokeQueue.pop();
hintKeystrokeQueue.pop();
updateLinkHints();
}
@@ -176,7 +182,8 @@ function onKeyDownInLinkHintsMode(event) {
hintKeystrokeQueue.push(keyChar);
updateLinkHints();
} else {
- return;
+ linkTextKeystrokeQueue.push(keyChar);
+ updateLinkHints();
}
event.stopPropagation();
@@ -243,17 +250,30 @@ function isSelectable(element) {
*/
function highlightLinkMatches(searchString) {
var linksMatched = [];
+ var linkSearchString = linkTextKeystrokeQueue.join("");
+ var emptySearchString = searchString.length == 0;
+ var narrowMode = isNarrowMode();
for (var i = 0; i < hintMarkers.length; i++) {
var linkMarker = hintMarkers[i];
- if (linkMarker.getAttribute("hintString").indexOf(searchString) == 0) {
- if (linkMarker.style.display == "none")
- linkMarker.style.display = "";
+ var matchedLink = linkMarker.getAttribute("linkText").indexOf(linkSearchString) >= 0;
+ var matchedHintStart = !emptySearchString &&
+ linkMarker.getAttribute("hintString").indexOf(searchString) == 0;
+ var shouldRemoveMatch = (!matchedLink && !matchedHintStart) ||
+ (matchedLink && !matchedHintStart && !emptySearchString)
+
+ if (matchedHintStart) {
for (var j = 0; j < linkMarker.childNodes.length; j++)
linkMarker.childNodes[j].className = (j >= searchString.length) ? "" : "matchingCharacter";
- linksMatched.push(linkMarker.clickableItem);
- } else {
+ }
+
+ if (shouldRemoveMatch) {
linkMarker.style.display = "none";
+ } else {
+ if (linkMarker.style.display == "none")
+ linkMarker.style.display = "";
+ linksMatched.push(linkMarker.clickableItem);
}
+
}
return linksMatched;
}
@@ -299,6 +319,7 @@ function deactivateLinkHintsMode() {
hintMarkerContainingDiv = null;
hintMarkers = [];
hintKeystrokeQueue = [];
+ linkTextKeystrokeQueue = [];
document.removeEventListener("keydown", onKeyDownInLinkHintsMode, true);
document.removeEventListener("keyup", onKeyUpInLinkHintsMode, true);
linkHintsModeActivated = false;
@@ -315,6 +336,9 @@ function resetLinkHintsMode() {
*/
function createMarkerFor(link, linkHintNumber, linkHintDigits) {
var hintString = numberToHintString(linkHintNumber, linkHintDigits);
+ var linkText = link.element.innerHTML.toLowerCase();
+ if (linkText == undefined)
+ linkText = "";
var marker = document.createElement("div");
marker.className = "internalVimiumHintMarker vimiumHintMarker";
var innerHTML = [];
@@ -323,6 +347,7 @@ function createMarkerFor(link, linkHintNumber, linkHintDigits) {
innerHTML.push("<span>" + hintString[i].toUpperCase() + "</span>");
marker.innerHTML = innerHTML.join("");
marker.setAttribute("hintString", hintString);
+ marker.setAttribute("linkText", linkText);
// Note: this call will be expensive if we modify the DOM in between calls.
var clientRect = link.rect;