From 44555e7863a66b906c47f0c94507d9e055922d3e Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Tue, 11 Apr 2017 15:44:42 +0100 Subject: Move keyboard utils to keydown and migrate normal/visual modes. --- content_scripts/mode_key_handler.coffee | 37 +++------------------------------ 1 file changed, 3 insertions(+), 34 deletions(-) (limited to 'content_scripts/mode_key_handler.coffee') diff --git a/content_scripts/mode_key_handler.coffee b/content_scripts/mode_key_handler.coffee index e206dbc6..914eeb6c 100644 --- a/content_scripts/mode_key_handler.coffee +++ b/content_scripts/mode_key_handler.coffee @@ -12,7 +12,6 @@ # consists of a (non-empty) list of such mappings. class KeyHandlerMode extends Mode - keydownEvents: {} setKeyMapping: (@keyMapping) -> @reset() setPassKeys: (@passKeys) -> @reset() # Only for tests. @@ -28,8 +27,6 @@ class KeyHandlerMode extends Mode super extend options, keydown: @onKeydown.bind this - keypress: @onKeypress.bind this - keyup: @onKeyup.bind this # We cannot track keyup events if we lose the focus. blur: (event) => @alwaysContinueBubbling => @keydownEvents = {} if event.target == window @@ -49,45 +46,17 @@ class KeyHandlerMode extends Mode keyChar = KeyboardUtils.getKeyCharString event isEscape = KeyboardUtils.isEscape event if isEscape and (@countPrefix != 0 or @keyState.length != 1) - @keydownEvents[event.keyCode] = true - @reset() - @suppressEvent + DomUtils.consumeKeyup event, => @reset() # If the help dialog loses the focus, then Escape should hide it; see point 2 in #2045. else if isEscape and HelpDialog?.isShowing() - @keydownEvents[event.keyCode] = true - HelpDialog.toggle() - @suppressEvent + DomUtils.consumeKeyup event, -> HelpDialog.toggle() else if isEscape @continueBubbling else if @isMappedKey keyChar - @keydownEvents[event.keyCode] = true - @handleKeyChar keyChar - else if not keyChar and (keyChar = KeyboardUtils.getKeyChar event) and - (@isMappedKey(keyChar) or @isCountKey keyChar) - # We will possibly be handling a subsequent keypress event, so suppress propagation of this event to - # prevent triggering page event listeners (e.g. Google instant Search). - @keydownEvents[event.keyCode] = true - @suppressPropagation + DomUtils.consumeKeyup event, => @handleKeyChar keyChar else @continueBubbling - onKeypress: (event) -> - keyChar = KeyboardUtils.getKeyCharString event - if @isMappedKey keyChar - @handleKeyChar keyChar - else if @isCountKey keyChar - digit = parseInt keyChar - @reset if @keyState.length == 1 then @countPrefix * 10 + digit else digit - @suppressEvent - else - @reset() - @continueBubbling - - onKeyup: (event) -> - return @continueBubbling unless event.keyCode of @keydownEvents - delete @keydownEvents[event.keyCode] - @suppressPropagation - # This tests whether there is a mapping of keyChar in the current key state (and accounts for pass keys). isMappedKey: (keyChar) -> (mapping for mapping in @keyState when keyChar of mapping)[0]? and not @isPassKey keyChar -- cgit v1.2.3 From 8e4119f84bbde748eb595e6766dbb47a6cd0133c Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Thu, 13 Apr 2017 14:09:14 +0100 Subject: Rework tests for all key handling on keydown. --- content_scripts/mode_key_handler.coffee | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'content_scripts/mode_key_handler.coffee') diff --git a/content_scripts/mode_key_handler.coffee b/content_scripts/mode_key_handler.coffee index 914eeb6c..82fdc0e6 100644 --- a/content_scripts/mode_key_handler.coffee +++ b/content_scripts/mode_key_handler.coffee @@ -54,7 +54,12 @@ class KeyHandlerMode extends Mode @continueBubbling else if @isMappedKey keyChar DomUtils.consumeKeyup event, => @handleKeyChar keyChar + else if @isCountKey keyChar + digit = parseInt keyChar + @reset if @keyState.length == 1 then @countPrefix * 10 + digit else digit + @suppressEvent else + @reset() @continueBubbling # This tests whether there is a mapping of keyChar in the current key state (and accounts for pass keys). -- cgit v1.2.3 From 95cd386ce3ae09c45df8fbf7bda78cf8146b0b3d Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Thu, 13 Apr 2017 16:10:46 +0100 Subject: Do not reset key state for modifiers. --- content_scripts/mode_key_handler.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'content_scripts/mode_key_handler.coffee') diff --git a/content_scripts/mode_key_handler.coffee b/content_scripts/mode_key_handler.coffee index 82fdc0e6..d3e0d8fb 100644 --- a/content_scripts/mode_key_handler.coffee +++ b/content_scripts/mode_key_handler.coffee @@ -58,7 +58,7 @@ class KeyHandlerMode extends Mode digit = parseInt keyChar @reset if @keyState.length == 1 then @countPrefix * 10 + digit else digit @suppressEvent - else + else if keyChar @reset() @continueBubbling -- cgit v1.2.3 From 40ece51a53ee4042caad7854e415de56c0c69cab Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Thu, 13 Apr 2017 16:15:12 +0100 Subject: Continue bubbling unmapped events. --- content_scripts/mode_key_handler.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'content_scripts/mode_key_handler.coffee') diff --git a/content_scripts/mode_key_handler.coffee b/content_scripts/mode_key_handler.coffee index d3e0d8fb..f306ea06 100644 --- a/content_scripts/mode_key_handler.coffee +++ b/content_scripts/mode_key_handler.coffee @@ -58,8 +58,8 @@ class KeyHandlerMode extends Mode digit = parseInt keyChar @reset if @keyState.length == 1 then @countPrefix * 10 + digit else digit @suppressEvent - else if keyChar - @reset() + else + @reset() if keyChar @continueBubbling # This tests whether there is a mapping of keyChar in the current key state (and accounts for pass keys). -- cgit v1.2.3 From 4c32c0383964e178e0196a87df7fc7a4ad7f8f27 Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Fri, 14 Apr 2017 07:48:56 +0100 Subject: Use event.code to detect/suppress keyup events. This avoids the possibility of leaking keyup events if the keys a released in a different order from that in which they were pressed. Also, replace suppressKeyupAfterEscape with this same mechanism. This fixes a bug (in master/1.59) whereby we leak the keyup event for `i` when entering insert mode. TODO: - `/`, `` leaks a keyup event - `i` leaks a keyup event --- content_scripts/mode_key_handler.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'content_scripts/mode_key_handler.coffee') diff --git a/content_scripts/mode_key_handler.coffee b/content_scripts/mode_key_handler.coffee index f306ea06..1b3b21e7 100644 --- a/content_scripts/mode_key_handler.coffee +++ b/content_scripts/mode_key_handler.coffee @@ -38,7 +38,7 @@ class KeyHandlerMode extends Mode keydown: (event) => if KeyboardUtils.isEscape(event) and not @isInResetState() @reset() - DomUtils.suppressKeyupAfterEscape handlerStack + DomUtils.consumeKeyup event else @continueBubbling -- cgit v1.2.3