From a11f9d9c1bb418db586a457d97c2b2c8142605cd Mon Sep 17 00:00:00 2001 From: mrmr1993 Date: Sun, 17 Aug 2014 18:40:58 +0100 Subject: Only block keyup for keys where we have handled a keyup/press event Fixes the issue of Vimium indiscriminately capturing keyup events, introduced in PR #978. --- content_scripts/vimium_frontend.coffee | 36 +++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index c7e5f2ef..565c9e61 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -321,6 +321,8 @@ extend window, false +handledKeydownEvents = [] + # # Sends everything except i & ESC to the handler in background_page. i & ESC are special because they control # insert mode which is local state to the page. The key will be are either a single ascii letter or a @@ -390,31 +392,39 @@ onKeydown = (event) -> if (isEditable(event.srcElement)) event.srcElement.blur() exitInsertMode() - DomUtils.suppressEvent(event) + DomUtils.suppressEvent event + handledKeydownEvents.push event else if (findMode) if (KeyboardUtils.isEscape(event)) handleEscapeForFindMode() - DomUtils.suppressEvent(event) + DomUtils.suppressEvent event + handledKeydownEvents.push event else if (event.keyCode == keyCodes.backspace || event.keyCode == keyCodes.deleteKey) handleDeleteForFindMode() - DomUtils.suppressEvent(event) + DomUtils.suppressEvent event + handledKeydownEvents.push event else if (event.keyCode == keyCodes.enter) handleEnterForFindMode() - DomUtils.suppressEvent(event) + DomUtils.suppressEvent event + handledKeydownEvents.push event else if (!modifiers) event.stopPropagation() + handledKeydownEvents.push event else if (isShowingHelpDialog && KeyboardUtils.isEscape(event)) hideHelpDialog() + DomUtils.suppressEvent event + handledKeydownEvents.push event else if (!isInsertMode() && !findMode) if (keyChar) if (currentCompletionKeys.indexOf(keyChar) != -1) - DomUtils.suppressEvent(event) + DomUtils.suppressEvent event + handledKeydownEvents.push event keyPort.postMessage({ keyChar:keyChar, frameId:frameId }) @@ -432,11 +442,23 @@ onKeydown = (event) -> (currentCompletionKeys.indexOf(KeyboardUtils.getKeyChar(event)) != -1 || isValidFirstKey(KeyboardUtils.getKeyChar(event)))) event.stopPropagation() + handledKeydownEvents.push event onKeyup = (event) -> return unless handlerStack.bubbleEvent("keyup", event) - # Don't propagate the keyup to the underlying page, since Vimium has handled it. See #733. - event.stopPropagation() unless isInsertMode() + return if isInsertMode() + + # Don't propagate the keyup to the underlying page if Vimium has handled it. See #733. + for keydown, i in handledKeydownEvents + if event.metaKey == keydown.metaKey and + event.altKey == keydown.altKey and + event.ctrlKey == keydown.ctrlKey and + event.keyIdentifier == keydown.keyIdentifier and + event.keyCode == keydown.keyCode + + handledKeydownEvents.splice i, 1 + event.stopPropagation() + break checkIfEnabledForUrl = -> url = window.location.toString() -- cgit v1.2.3