From 6ae4e124efc22de093f67df1a2e3aa626f78e98d Mon Sep 17 00:00:00 2001 From: mrmr1993 Date: Fri, 28 Nov 2014 18:04:17 +0000 Subject: Clear all keydown events that correspond to a keyup event --- content_scripts/vimium_frontend.coffee | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index d5586bd8..487012dd 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -475,16 +475,13 @@ onKeyup = (event) -> 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 - DomUtils.suppressPropagation(event) - break + handledKeydownEvents = handledKeydownEvents.filter (keydown) -> + (event.metaKey != keydown.metaKey or + event.altKey != keydown.altKey or + event.ctrlKey != keydown.ctrlKey or + event.keyIdentifier != keydown.keyIdentifier or + event.keyCode != keydown.keyCode) and + DomUtils.suppressPropagation(event) # Suppress the event if we found a corresponding keydown checkIfEnabledForUrl = -> url = window.location.toString() -- cgit v1.2.3 From 87165885c0b32d9825cde2027af92a3191c3b096 Mon Sep 17 00:00:00 2001 From: mrmr1993 Date: Sat, 13 Dec 2014 18:01:22 +0000 Subject: Make keyup event suppression more readable --- content_scripts/vimium_frontend.coffee | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index 487012dd..55de9274 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -474,14 +474,20 @@ onKeyup = (event) -> return unless handlerStack.bubbleEvent("keyup", event) return if isInsertMode() - # Don't propagate the keyup to the underlying page if Vimium has handled it. See #733. + # Check whether we have handled a keydown for this keyup, and remove all matching keydowns from + # handledKeydownEvents. + # NOTE: There can be multiple keydown events for every keyup due to keys repeating when held. + hasHandledKeydown = false handledKeydownEvents = handledKeydownEvents.filter (keydown) -> (event.metaKey != keydown.metaKey or event.altKey != keydown.altKey or event.ctrlKey != keydown.ctrlKey or event.keyIdentifier != keydown.keyIdentifier or event.keyCode != keydown.keyCode) and - DomUtils.suppressPropagation(event) # Suppress the event if we found a corresponding keydown + hasHandledKeydown = true # We've found a matching keydown! + + # Don't propagate the keyup to the underlying page if Vimium has handled it. See #733. + DomUtils.suppressPropagation(event) if hasHandledKeydown checkIfEnabledForUrl = -> url = window.location.toString() -- cgit v1.2.3 From ff1e4a2c4b77b8872a6c14a2494666e39ea54a46 Mon Sep 17 00:00:00 2001 From: mrmr1993 Date: Sat, 13 Dec 2014 18:01:54 +0000 Subject: Remove insert mode check for keyup handling If we have handled a keydown then we should always handle its corresponding keyup, regardless of what mode we're in. This prevents us from passing the keyup event for `i` to the page when we enter insert mode. --- content_scripts/vimium_frontend.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index 55de9274..7ec34875 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -472,7 +472,6 @@ onKeydown = (event) -> onKeyup = (event) -> return unless handlerStack.bubbleEvent("keyup", event) - return if isInsertMode() # Check whether we have handled a keydown for this keyup, and remove all matching keydowns from # handledKeydownEvents. -- cgit v1.2.3 From 4e131fe4c6a2f043428c7478d81d5a291135a3f7 Mon Sep 17 00:00:00 2001 From: mrmr1993 Date: Sun, 14 Dec 2014 22:38:08 +0000 Subject: Only register events as handled once --- content_scripts/vimium_frontend.coffee | 45 +++++++++++++++++----------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index 7ec34875..44093cc3 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -342,7 +342,20 @@ extend window, isPassKey = ( keyChar ) -> return !keyQueue and passKeys and 0 <= passKeys.indexOf(keyChar) -handledKeydownEvents = [] +handledKeydownEvents = {} +eventDetailsString = (event) -> + JSON.stringify + metaKey: event.metaKey + altKey: event.altKey + ctrlKey: event.ctrlKey + keyIdentifier: event.keyIdentifier + keyCode: event.keyCode +pushHandledKeydownEvent = (event) -> handledKeydownEvents[eventDetailsString event] = true +hasHandledKeydownEvent = (event) -> + detailString = eventDetailsString event + value = handledKeydownEvents[detailString] + delete handledKeydownEvents[detailString] + value # # Sends everything except i & ESC to the handler in background_page. i & ESC are special because they control @@ -416,38 +429,38 @@ onKeydown = (event) -> event.srcElement.blur() exitInsertMode() DomUtils.suppressEvent event - handledKeydownEvents.push event + pushHandledKeydownEvent event else if (findMode) if (KeyboardUtils.isEscape(event)) handleEscapeForFindMode() DomUtils.suppressEvent event - handledKeydownEvents.push event + pushHandledKeydownEvent event else if (event.keyCode == keyCodes.backspace || event.keyCode == keyCodes.deleteKey) handleDeleteForFindMode() DomUtils.suppressEvent event - handledKeydownEvents.push event + pushHandledKeydownEvent event else if (event.keyCode == keyCodes.enter) handleEnterForFindMode() DomUtils.suppressEvent event - handledKeydownEvents.push event + pushHandledKeydownEvent event else if (!modifiers) DomUtils.suppressPropagation(event) - handledKeydownEvents.push event + pushHandledKeydownEvent event else if (isShowingHelpDialog && KeyboardUtils.isEscape(event)) hideHelpDialog() DomUtils.suppressEvent event - handledKeydownEvents.push event + pushHandledKeydownEvent event else if (!isInsertMode() && !findMode) if (keyChar) if (currentCompletionKeys.indexOf(keyChar) != -1 or isValidFirstKey(keyChar)) DomUtils.suppressEvent event - handledKeydownEvents.push event + pushHandledKeydownEvent event keyPort.postMessage({ keyChar:keyChar, frameId:frameId }) @@ -468,25 +481,13 @@ onKeydown = (event) -> (currentCompletionKeys.indexOf(KeyboardUtils.getKeyChar(event)) != -1 || isValidFirstKey(KeyboardUtils.getKeyChar(event)))) DomUtils.suppressPropagation(event) - handledKeydownEvents.push event + pushHandledKeydownEvent event onKeyup = (event) -> return unless handlerStack.bubbleEvent("keyup", event) - # Check whether we have handled a keydown for this keyup, and remove all matching keydowns from - # handledKeydownEvents. - # NOTE: There can be multiple keydown events for every keyup due to keys repeating when held. - hasHandledKeydown = false - handledKeydownEvents = handledKeydownEvents.filter (keydown) -> - (event.metaKey != keydown.metaKey or - event.altKey != keydown.altKey or - event.ctrlKey != keydown.ctrlKey or - event.keyIdentifier != keydown.keyIdentifier or - event.keyCode != keydown.keyCode) and - hasHandledKeydown = true # We've found a matching keydown! - # Don't propagate the keyup to the underlying page if Vimium has handled it. See #733. - DomUtils.suppressPropagation(event) if hasHandledKeydown + DomUtils.suppressPropagation(event) if hasHandledKeydownEvent event checkIfEnabledForUrl = -> url = window.location.toString() -- cgit v1.2.3