aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bookmarks.js64
-rw-r--r--completionDialog.js67
-rw-r--r--lib/keyboardUtils.js22
-rw-r--r--linkHints.js12
-rw-r--r--vimiumFrontend.js28
5 files changed, 93 insertions, 100 deletions
diff --git a/bookmarks.js b/bookmarks.js
index 1ec0c3d1..d5ff7cc7 100644
--- a/bookmarks.js
+++ b/bookmarks.js
@@ -34,15 +34,18 @@ function activateBookmarkFindMode() {
initialize.call(this)
}
+ handlerStack.push({
+ keydown: this.onKeydown,
+ keyup: this.onKeyup
+ });
+
this.renderHUD();
this.completionDialog.show();
-
- this.keyPressListener.enable();
},
disable: function() {
this.enabled = false;
- this.keyPressListener.disable();
- this.completionDialog.hide()
+ this.completionDialog.hide();
+ handlerStack.pop();
HUD.hide();
},
renderHUD: function() {
@@ -89,37 +92,36 @@ function activateBookmarkFindMode() {
initialSearchText: "Type a bookmark name or URL"
})
- this.keyPressListener = new KeyPressListener({
- keyDown: function(event) {
- // shift key will toggle between new tab/same tab
- if (event.keyCode == keyCodes.shiftKey) {
- self.invertNewTabSetting();
- shiftWasPressedWhileToggled = true
- return
- }
+ self.onKeydown = function(event) {
+ // shift key will toggle between new tab/same tab
+ if (event.keyCode == keyCodes.shiftKey) {
+ self.invertNewTabSetting();
+ shiftWasPressedWhileToggled = true
+ return
+ }
- var keyChar = getKeyChar(event);
- if (!keyChar)
- return;
+ var keyChar = getKeyChar(event);
+ if (!keyChar)
+ return;
- // TODO(philc): Ignore keys that have modifiers.
- if (isEscape(event)) {
- self.disable();
- }
+ // TODO(philc): Ignore keys that have modifiers.
+ if (isEscape(event)) {
+ self.disable();
+ }
- event.stopPropagation();
- event.preventDefault();
- },
- keyUp: function(event) {
- // shift key will toggle between new tab/same tab
- if (event.keyCode == keyCodes.shiftKey && shiftWasPressedWhileToggled) {
- self.invertNewTabSetting();
- shiftWasPressedWhileToggled = false
- }
- event.stopPropagation();
- event.preventDefault();
+ event.stopPropagation();
+ event.preventDefault();
+ };
+
+ self.onKeyup = function(event) {
+ // shift key will toggle between new tab/same tab
+ if (event.keyCode == keyCodes.shiftKey && shiftWasPressedWhileToggled) {
+ self.invertNewTabSetting();
+ shiftWasPressedWhileToggled = false
}
- })
+ event.stopPropagation();
+ event.preventDefault();
+ };
}
var findBookmarks = function(searchString, callback) {
diff --git a/completionDialog.js b/completionDialog.js
index c96ce92c..fbe83ec0 100644
--- a/completionDialog.js
+++ b/completionDialog.js
@@ -13,7 +13,7 @@
initialize.call(this);
this.initialized=true;
}
- this.keyPressListener.enable();
+ handlerStack.push({ keydown: this.onKeydown });
render.call(this)
clearInterval(this._tweenId);
this._tweenId = Tween.fade(this.container, 1.0, 150);
@@ -21,7 +21,7 @@
},
hide: function() {
if(this.isShown) {
- this.keyPressListener.disable();
+ handlerStack.pop();
this.isShown=false;
this.currentSelection=0;
clearInterval(this._tweenId);
@@ -45,43 +45,42 @@
self.currentSelection=0;
- self.keyPressListener = new KeyPressListener({
- keyDown: function(event) {
- var keyChar = getKeyChar(event);
- if(keyChar==="up") {
- if(self.currentSelection>0) {
- self.currentSelection-=1;
- }
- render.call(self,self.getQueryString(), self.completions)
- }
- else if(keyChar==="down") {
- if(self.currentSelection<self.completions.length-1) {
- self.currentSelection+=1;
- }
- render.call(self,self.getQueryString(), self.completions)
+ self.onKeydown = function(event) {
+ var keyChar = getKeyChar(event);
+ if(keyChar==="up") {
+ if(self.currentSelection>0) {
+ self.currentSelection-=1;
}
- else if(event.keyCode == keyCodes.enter) {
- self.options.onSelect(self.completions[self.currentSelection])
+ render.call(self,self.getQueryString(), self.completions)
+ }
+ else if(keyChar==="down") {
+ if(self.currentSelection<self.completions.length-1) {
+ self.currentSelection+=1;
}
- else if (event.keyCode == keyCodes.backspace || event.keyCode == keyCodes.deleteKey) {
- if (self.query.length > 0) {
- self.query.pop();
- self.options.source(self.getQueryString(), function(completions) {
- render.call(self, self.getQueryString(), completions)
- })
- }
- }
- else if(keyChar!=="left" && keyChar!="right") {
- self.query.push(keyChar);
+ render.call(self,self.getQueryString(), self.completions)
+ }
+ else if(event.keyCode == keyCodes.enter) {
+ self.options.onSelect(self.completions[self.currentSelection])
+ }
+ else if (event.keyCode == keyCodes.backspace || event.keyCode == keyCodes.deleteKey) {
+ if (self.query.length > 0) {
+ self.query.pop();
self.options.source(self.getQueryString(), function(completions) {
render.call(self, self.getQueryString(), completions)
})
- }
-
- event.stopPropagation();
- event.preventDefault();
- }
- })
+ }
+ }
+ else if(keyChar!=="left" && keyChar!="right") {
+ self.query.push(keyChar);
+ self.options.source(self.getQueryString(), function(completions) {
+ render.call(self, self.getQueryString(), completions)
+ })
+ }
+
+ event.stopPropagation();
+ event.preventDefault();
+ return true;
+ }
}
var render = function(searchString, completions) {
diff --git a/lib/keyboardUtils.js b/lib/keyboardUtils.js
index 5b8b4c84..fe3dcd59 100644
--- a/lib/keyboardUtils.js
+++ b/lib/keyboardUtils.js
@@ -61,25 +61,3 @@ function isEscape(event) {
return event.keyCode == keyCodes.ESC ||
(event.ctrlKey && getKeyChar(event) == '['); // c-[ is mapped to ESC in Vim by default.
}
-
-var KeyPressListener = function(handlers) {
- this.handlers = handlers;
-}
-
-KeyPressListener.prototype = {
- enable: function() {
- var handlers = this.handlers;
- var wrapper = function(callback){
- return function(event) {
- callback(event)
- }
- }
- (handlers.keyDown && document.addEventListener("keydown", handlers.keyDown, true));
- (handlers.keyUp && document.addEventListener("keyup", handlers.keyUp, true));
- },
- disable: function() {
- var handlers = this.handlers;
- (handlers.keyDown && document.removeEventListener("keydown", handlers.keyDown, true));
- (handlers.keyUp && document.removeEventListener("keyup", handlers.keyUp, true));
- }
-}
diff --git a/linkHints.js b/linkHints.js
index e1889a47..ccd43cb6 100644
--- a/linkHints.js
+++ b/linkHints.js
@@ -15,7 +15,6 @@ var linkHints = {
hintMarkers: [],
hintMarkerContainingDiv: null,
// The characters that were typed in while in "link hints" mode.
- modeActivated: false,
shouldOpenInNewTab: false,
shouldOpenWithQueue: false,
// Whether link hint's "open in current/new tab" setting is currently toggled
@@ -59,11 +58,12 @@ var linkHints = {
if (!this.cssAdded)
addCssToPage(linkHintCss); // linkHintCss is declared by vimiumFrontend.js
this.linkHintCssAdded = true;
- this.modeActivated = true;
this.setOpenLinkMode(openInNewTab, withQueue);
this.buildLinkHints();
- document.addEventListener("keydown", this.onKeyDownInMode, true);
- document.addEventListener("keyup", this.onKeyUpInMode, true);
+ handlerStack.push({ // modeKeyHandler is declared by vimiumFrontend.js
+ keydown: this.onKeyDownInMode,
+ keyup: this.onKeyUpInMode
+ });
},
setOpenLinkMode: function(openInNewTab, withQueue) {
@@ -300,9 +300,7 @@ var linkHints = {
that.hintMarkerContainingDiv.parentNode.removeChild(that.hintMarkerContainingDiv);
that.hintMarkerContainingDiv = null;
that.hintMarkers = [];
- document.removeEventListener("keydown", that.onKeyDownInMode, true);
- document.removeEventListener("keyup", that.onKeyUpInMode, true);
- that.modeActivated = false;
+ handlerStack.pop();
HUD.hide();
}
// we invoke the deactivate() function directly instead of using setTimeout(callback, 0) so that
diff --git a/vimiumFrontend.js b/vimiumFrontend.js
index e0b6eb6a..7b43f4c2 100644
--- a/vimiumFrontend.js
+++ b/vimiumFrontend.js
@@ -12,6 +12,7 @@ var findMode = false;
var findModeQuery = "";
var findModeQueryHasResults = false;
var isShowingHelpDialog = false;
+var handlerStack = [];
var keyPort;
var settingPort;
var saveZoomLevelPort;
@@ -339,11 +340,11 @@ function toggleViewSourceCallback(url) {
* Note that some keys will only register keydown events and not keystroke events, e.g. ESC.
*/
function onKeypress(event) {
- var keyChar = "";
-
- if (linkHints.modeActivated)
+ if (!bubbleEvent('keypress', event))
return;
+ var keyChar = "";
+
// Ignore modifier keys by themselves.
if (event.keyCode > 31) {
keyChar = String.fromCharCode(event.charCode);
@@ -373,12 +374,22 @@ function onKeypress(event) {
}
}
-function onKeydown(event) {
- var keyChar = "";
+function bubbleEvent(type, event) {
+ for (var i = handlerStack.length-1; i >= 0; i--) {
+ // We need to check for existence of handler because the last function call may have caused the release of
+ // more than one handler.
+ if (handlerStack[i] && handlerStack[i][type] && !handlerStack[i][type](event))
+ return false;
+ }
+ return true;
+}
- if (linkHints.modeActivated)
+function onKeydown(event) {
+ if (!bubbleEvent('keydown', event))
return;
+ var keyChar = "";
+
// handle modifiers being pressed.don't handle shiftKey alone (to avoid / being interpreted as ?
if (event.metaKey && event.keyCode > 31 || event.ctrlKey && event.keyCode > 31 || event.altKey && event.keyCode > 31) {
keyChar = getKeyChar(event);
@@ -459,6 +470,11 @@ function onKeydown(event) {
event.stopPropagation();
}
+function onKeyup() {
+ if (!bubbleEvent('keyup', event))
+ return;
+}
+
function checkIfEnabledForUrl() {
var url = window.location.toString();