diff options
| -rw-r--r-- | bookmarks.js | 64 | ||||
| -rw-r--r-- | completionDialog.js | 67 | ||||
| -rw-r--r-- | lib/keyboardUtils.js | 22 | ||||
| -rw-r--r-- | linkHints.js | 12 | ||||
| -rw-r--r-- | vimiumFrontend.js | 28 |
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(); |
