diff options
| author | jez | 2011-01-31 11:18:11 +0800 |
|---|---|---|
| committer | jez | 2011-01-31 15:24:08 +0800 |
| commit | ad57590c1d3c4f0ceb7ddc962054a21afddfa224 (patch) | |
| tree | 3941a2c76ac7dab3f8aa41211be69e606ef97fe5 | |
| parent | ca5c5350f75df115531dba22bf497fbf230f5bbe (diff) | |
| download | vimium-ad57590c1d3c4f0ceb7ddc962054a21afddfa224.tar.bz2 | |
Begin switch from inheritance to composition
| -rw-r--r-- | linkHints.js | 66 | ||||
| -rw-r--r-- | test_harnesses/automated.html | 7 | ||||
| -rw-r--r-- | vimiumFrontend.js | 2 |
3 files changed, 22 insertions, 53 deletions
diff --git a/linkHints.js b/linkHints.js index 6bd84826..36b682b8 100644 --- a/linkHints.js +++ b/linkHints.js @@ -11,23 +11,7 @@ * the range of possibilities by typing the text of the link itself. */ -var linkHints; -/* - * Create the instance of linkHints, specialized based on the user settings. - */ -function initializeLinkHints() { - if (settings.get('filterLinkHints') != "true") // the default hinting system - linkHints = utils.extendWithSuper(linkHintsBase, alphabetHints); - else - linkHints = utils.extendWithSuper(linkHintsBase, filterHints); - linkHints.init(); -} - -/* - * A set of common operations shared by any link-hinting system. Some methods - * are stubbed. - */ -var linkHintsBase = { +var linkHints = { hintMarkers: [], hintMarkerContainingDiv: null, // The characters that were typed in while in "link hints" mode. @@ -40,6 +24,9 @@ var linkHintsBase = { cssAdded: false, // While in delayMode, all keypresses have no effect. delayMode: false, + // Handle the link hinting marker generation and matching. Must be initialized after settings have been + // loaded. + markerMatcher: undefined, /* * To be called after linkHints has been generated from linkHintsBase. @@ -47,6 +34,7 @@ var linkHintsBase = { init: function() { this.onKeyDownInMode = this.onKeyDownInMode.bind(this); this.onKeyUpInMode = this.onKeyUpInMode.bind(this); + this.markerMatcher = settings.get('filterLinkHints') == "true" ? filterHints : alphabetHints; }, /* @@ -100,7 +88,7 @@ var linkHintsBase = { // Initialize the number used to generate the character hints to be as many digits as we need to // highlight all the links on the page; we don't want some link hints to have more chars than others. var linkHintNumber = 0; - this.initSetMarkerAttributes(visibleElements); + this.markerMatcher.initSetMarkerAttributes(visibleElements); for (var i = 0; i < visibleElements.length; i++) { this.hintMarkers.push(this.createMarkerFor(visibleElements[i], linkHintNumber)); linkHintNumber++; @@ -123,19 +111,6 @@ var linkHintsBase = { }, /* - * Sets the data attributes of the marker. Does not need to handle styling - * and positioning. MUST set the hintString and innerHTML properties. - */ - setMarkerAttributes: function(marker, linkHintNumber) {}, - - /* - * A hook for any necessary initialization for setMarkerAttributes. Takes an - * array of visible elements. Any return value is ignored. - */ - initSetMarkerAttributes: function(visibleElements) { - }, - - /* * Returns all clickable elements that are not hidden and are in the current viewport. * We prune invisible elements partly for performance reasons, but moreso it's to decrease the number * of digits needed to enumerate all of the links on screen. @@ -198,7 +173,7 @@ var linkHintsBase = { }, /* - * Handles shift and esc keys. The other keys are passed to normalKeyDownHandler. + * Handles shift and esc keys. The other keys are passed to markerMatcher.normalKeyDownHandler. */ onKeyDownInMode: function(event) { if (this.delayMode) @@ -214,7 +189,7 @@ var linkHintsBase = { if (isEscape(event)) { this.deactivateMode(); } else { - var keyResult = this.normalKeyDownHandler(event, this.hintMarkers); + var keyResult = this.markerMatcher.matchHintsByKey(event, this.hintMarkers); var linksMatched = keyResult.linksMatched; var delay = keyResult.delay !== undefined ? keyResult.delay : 0; if (linksMatched.length == 0) { @@ -233,11 +208,6 @@ var linkHintsBase = { event.preventDefault(); }, - /* - * Handle all keys other than shift and esc. Return value is ignored. - */ - normalKeyDownHandler: function(event) {}, - onKeyUpInMode: function(event) { if (event.keyCode == keyCodes.shiftKey && this.openLinkModeToggle) { // Revert toggle on whether to open link in new or current tab. @@ -325,6 +295,8 @@ var linkHintsBase = { deactivateMode: function(delay, callback) { var that = this; function deactivate() { + if (that.markerMatcher.deactivate) + that.markerMatcher.deactivate(); if (that.hintMarkerContainingDiv) that.hintMarkerContainingDiv.parentNode.removeChild(that.hintMarkerContainingDiv); that.hintMarkerContainingDiv = null; @@ -350,7 +322,7 @@ var linkHintsBase = { var marker = document.createElement("div"); marker.className = "internalVimiumHintMarker vimiumHintMarker"; marker.clickableItem = link.element; - this.setMarkerAttributes(marker, linkHintNumber); + this.markerMatcher.setMarkerAttributes(marker, linkHintNumber); // Note: this call will be expensive if we modify the DOM in between calls. var clientRect = link.rect; @@ -404,7 +376,7 @@ var alphabetHints = { return hintString.join(""); }, - normalKeyDownHandler: function (event, hintMarkers) { + matchHintsByKey: function (event, hintMarkers) { var keyChar = getKeyChar(event); if (!keyChar) return hintMarkers; @@ -484,7 +456,7 @@ var filterHints = { marker.setAttribute("linkText", linkText); }, - normalKeyDownHandler: function(event, hintMarkers) { + matchHintsByKey: function(event, hintMarkers) { var linksMatched; if (event.keyCode == keyCodes.backspace || event.keyCode == keyCodes.deleteKey) { if (this.linkTextKeystrokeQueue.length == 0 && this.hintKeystrokeQueue.length == 0) { @@ -522,8 +494,7 @@ var filterHints = { // should be rendered invalid (i.e. reset). this.hintKeystrokeQueue = []; this.linkTextKeystrokeQueue.push(keyChar); - matchString = this.linkTextKeystrokeQueue.join(""); - linksMatched = this.filterLinkHints(matchString); + linksMatched = this.filterLinkHints(hintMarkers); } if (linksMatched.length == 1 && !/[0-9]/.test(keyChar)) { @@ -542,12 +513,12 @@ var filterHints = { * only be called when there is a change in linkTextKeystrokeQueue, to * avoid undesired renumbering. */ - filterLinkHints: function(searchString) { + filterLinkHints: function(hintMarkers) { var linksMatched = []; var linkSearchString = this.linkTextKeystrokeQueue.join(""); - for (var i = 0; i < this.hintMarkers.length; i++) { - var linkMarker = this.hintMarkers[i]; + for (var i = 0; i < hintMarkers.length; i++) { + var linkMarker = hintMarkers[i]; var matchedLink = linkMarker.getAttribute("linkText").toLowerCase() .indexOf(linkSearchString.toLowerCase()) >= 0; @@ -562,10 +533,9 @@ var filterHints = { return linksMatched; }, - deactivateMode: function(delay, callback) { + deactivate: function(delay, callback) { this.linkTextKeystrokeQueue = []; this.labelMap = {}; - this._super('deactivateMode')(delay, callback); } }; diff --git a/test_harnesses/automated.html b/test_harnesses/automated.html index bbfa220f..9f1b8007 100644 --- a/test_harnesses/automated.html +++ b/test_harnesses/automated.html @@ -60,8 +60,7 @@ "<a>test</a>" + "<a>tress</a>"; document.getElementById("test-div").innerHTML = testContent; - settings.values.filterLinkHints = isFilteredMode ? "true" : "false"; - initializeLinkHints(); + linkHints.markerMatcher = alphabetHints; }), tearDown(function() { @@ -102,7 +101,7 @@ setup(function() { stub(settings.values, "filterLinkHints", "false"); - initializeLinkHints(); + linkHints.markerMatcher = alphabetHints; // we need at least 16 elements to have double-character link hints for (var i = 0; i < 16; i++) { var link = document.createElement("a"); @@ -135,7 +134,7 @@ setup(function() { stub(settings.values, "filterLinkHints", "true"); - initializeLinkHints(); + linkHints.markerMatcher = filterHints; }), context("Text hints", diff --git a/vimiumFrontend.js b/vimiumFrontend.js index c5b7bdf8..e0b6eb6a 100644 --- a/vimiumFrontend.js +++ b/vimiumFrontend.js @@ -60,7 +60,7 @@ var settings = { }, initializeOnReady: function () { - initializeLinkHints(); + linkHints.init(); } }; |
