aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjez2011-01-31 11:18:11 +0800
committerjez2011-01-31 15:24:08 +0800
commitad57590c1d3c4f0ceb7ddc962054a21afddfa224 (patch)
tree3941a2c76ac7dab3f8aa41211be69e606ef97fe5
parentca5c5350f75df115531dba22bf497fbf230f5bbe (diff)
downloadvimium-ad57590c1d3c4f0ceb7ddc962054a21afddfa224.tar.bz2
Begin switch from inheritance to composition
-rw-r--r--linkHints.js66
-rw-r--r--test_harnesses/automated.html7
-rw-r--r--vimiumFrontend.js2
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();
}
};