diff options
| author | Jez Ng | 2012-01-22 00:11:22 +0800 | 
|---|---|---|
| committer | Jez Ng | 2012-01-22 05:20:41 +0800 | 
| commit | c227184d57f097f861123e7ebccc28815f9b8943 (patch) | |
| tree | 92e6f96331d104b27466b70fcf8153bbb983129b | |
| parent | 8548fcc5b31526706afb89712804c60cf8d91fbf (diff) | |
| download | vimium-c227184d57f097f861123e7ebccc28815f9b8943.tar.bz2 | |
Refactor and optimize filter link hints.
Don't regenerate all hints when the user is typing the hint string.
Use native object properties rather than getAttribute() -- it's less
awkard.
| -rw-r--r-- | linkHints.js | 50 | ||||
| -rw-r--r-- | test_harnesses/automated.html | 6 | 
2 files changed, 32 insertions, 24 deletions
| diff --git a/linkHints.js b/linkHints.js index c400f70c..e72c3f7f 100644 --- a/linkHints.js +++ b/linkHints.js @@ -317,10 +317,9 @@ var alphabetHints = {      var hintStrings = this.hintStrings(visibleElements.length);      var hintMarkers = [];      for (var i = 0, count = visibleElements.length; i < count; i++) { -      var hintString = hintStrings[i];        var marker = hintUtils.createMarkerFor(visibleElements[i]); -      marker.innerHTML = hintUtils.spanWrap(hintString.toUpperCase()); -      marker.setAttribute("hintString", hintString); +      marker.hintString = hintStrings[i]; +      marker.innerHTML = hintUtils.spanWrap(marker.hintString.toUpperCase());        hintMarkers.push(marker);      } @@ -407,7 +406,7 @@ var alphabetHints = {      var matchString = this.hintKeystrokeQueue.join("");      var linksMatched = hintMarkers.filter(function(linkMarker) { -      return linkMarker.getAttribute("hintString").indexOf(matchString) == 0; +      return linkMarker.hintString.indexOf(matchString) == 0;      });      return { linksMatched: linksMatched };    }, @@ -440,11 +439,13 @@ var filterHints = {      }    }, -  setMarkerAttributes: function(marker, linkHintNumber) { -    var hintString = (linkHintNumber + 1).toString(); +  generateHintString: function(linkHintNumber) { +    return (linkHintNumber + 1).toString(); +  }, + +  generateLinkText: function(element) {      var linkText = "";      var showLinkText = false; -    var element = marker.clickableItem;      // toLowerCase is necessary as html documents return 'IMG'      // and xhtml documents return 'img'      var nodeName = element.nodeName.toLowerCase(); @@ -466,10 +467,12 @@ var filterHints = {      } else {        linkText = element.textContent || element.innerHTML;      } -    linkText = linkText.trim().toLowerCase(); -    marker.setAttribute("hintString", hintString); -    marker.innerHTML = hintUtils.spanWrap(hintString + (showLinkText ? ": " + linkText : "")); -    marker.setAttribute("linkText", linkText); +    return { text: linkText, show: showLinkText }; +  }, + +  renderMarker: function(marker) { +    marker.innerHTML = hintUtils.spanWrap(marker.hintString + +                                          (marker.showLinkText ? ": " + marker.linkText : ""));    },    getHintMarkers: function(visibleElements) { @@ -477,7 +480,11 @@ var filterHints = {      var hintMarkers = [];      for (var i = 0, count = visibleElements.length; i < count; i++) {        var marker = hintUtils.createMarkerFor(visibleElements[i]); -      this.setMarkerAttributes(marker, i); +      marker.hintString = this.generateHintString(i); +      var linkTextObject = this.generateLinkText(marker.clickableItem); +      marker.linkText = linkTextObject.text; +      marker.showLinkText = linkTextObject.show; +      this.renderMarker(marker);        hintMarkers.push(marker);      }      return hintMarkers; @@ -516,8 +523,7 @@ var filterHints = {      var linksMatched = this.filterLinkHints(hintMarkers);      var matchString = this.hintKeystrokeQueue.join("");      linksMatched = linksMatched.filter(function(linkMarker) { -      return linkMarker.getAttribute('filtered') != 'true' -        && linkMarker.getAttribute("hintString").indexOf(matchString) == 0; +      return !linkMarker.filtered && linkMarker.hintString.indexOf(matchString) == 0;      });      if (linksMatched.length == 1 && userIsTypingLinkText) { @@ -531,8 +537,8 @@ var filterHints = {    },    /* -   * Hides the links that do not match the linkText search string and marks them with the 'filtered' DOM -   * property. Renumbers the remainder. +   * Marks the links that do not match the linkText search string with the 'filtered' DOM property. Renumbers +   * the remainder if necessary.     */    filterLinkHints: function(hintMarkers) {      var linksMatched = []; @@ -540,14 +546,16 @@ var filterHints = {      for (var i = 0; i < hintMarkers.length; i++) {        var linkMarker = hintMarkers[i]; -      var matchedLink = linkMarker.getAttribute("linkText").toLowerCase() -                                  .indexOf(linkSearchString.toLowerCase()) >= 0; +      var matchedLink = linkMarker.linkText.toLowerCase().indexOf(linkSearchString.toLowerCase()) >= 0;        if (!matchedLink) { -        linkMarker.setAttribute("filtered", "true"); +        linkMarker.filtered = true;        } else { -        this.setMarkerAttributes(linkMarker, linksMatched.length); -        linkMarker.setAttribute("filtered", "false"); +        linkMarker.filtered = false; +        var oldHintString = linkMarker.hintString; +        linkMarker.hintString = this.generateHintString(linksMatched.length); +        if (linkMarker.hintString != oldHintString) +          this.renderMarker(linkMarker);          linksMatched.push(linkMarker);        }      } diff --git a/test_harnesses/automated.html b/test_harnesses/automated.html index e57f1513..28af7c0e 100644 --- a/test_harnesses/automated.html +++ b/test_harnesses/automated.html @@ -120,7 +120,7 @@          should("label the hints correctly", function() {            var hintStrings = ["ss", "as", "ds"];            for (var i = 0; i < 3; i++) -          assert.equal(hintStrings[i], linkHints.hintMarkers[i].getAttribute("hintString")); +          assert.equal(hintStrings[i], linkHints.hintMarkers[i].hintString);          }),          should("narrow the hints", function() { @@ -164,10 +164,10 @@              linkHints.onKeyDownInMode(mockKeyboardEvent("T"));              linkHints.onKeyDownInMode(mockKeyboardEvent("R"));              assert.equal("none", linkHints.hintMarkers[0].style.display); -            assert.equal("1", linkHints.hintMarkers[1].getAttribute("hintString")); +            assert.equal("1", linkHints.hintMarkers[1].hintString);              assert.equal("", linkHints.hintMarkers[1].style.display);              linkHints.onKeyDownInMode(mockKeyboardEvent("A")); -            assert.equal("2", linkHints.hintMarkers[3].getAttribute("hintString")); +            assert.equal("2", linkHints.hintMarkers[3].hintString);            })          ), | 
