diff options
| -rw-r--r-- | content_scripts/mode_key_handler.coffee | 42 | ||||
| -rw-r--r-- | content_scripts/mode_passkeys.coffee | 23 | ||||
| -rw-r--r-- | content_scripts/vimium_frontend.coffee | 4 | ||||
| -rw-r--r-- | manifest.json | 1 | ||||
| -rw-r--r-- | tests/dom_tests/dom_tests.html | 1 |
5 files changed, 27 insertions, 44 deletions
diff --git a/content_scripts/mode_key_handler.coffee b/content_scripts/mode_key_handler.coffee index 567552c0..60633895 100644 --- a/content_scripts/mode_key_handler.coffee +++ b/content_scripts/mode_key_handler.coffee @@ -24,30 +24,33 @@ class KeyHandlerMode extends Mode @reset() false # Suppress event. else if keyChar and @mappingForKeyChar keyChar - @keydownEvents[event.keyCode] = true - @handleKeyChar event, keyChar + @unlessKeyCharIsPassKey keyChar, => + @keydownEvents[event.keyCode] = true + @handleKeyChar event, keyChar else if keyChar @continueBubbling else if (keyChar = KeyboardUtils.getKeyChar event) and (@mappingForKeyChar(keyChar) or @isCountKey keyChar) # We will probably 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 - DomUtils.suppressPropagation event - @stopBubblingAndTrue + @unlessKeyCharIsPassKey keyChar, => + @keydownEvents[event.keyCode] = true + DomUtils.suppressPropagation event + @stopBubblingAndTrue else @continueBubbling onKeypress: (event) -> keyChar = KeyboardUtils.getKeyCharString event - if keyChar and @mappingForKeyChar keyChar - @handleKeyChar event, keyChar - else if keyChar and @isCountKey keyChar - digit = parseInt keyChar - @reset if @keyState.length == 1 then @countPrefix * 10 + digit else digit - false # Suppress event. - else - @reset() - @continueBubbling + @unlessKeyCharIsPassKey keyChar, => + if keyChar and @mappingForKeyChar keyChar + @handleKeyChar event, keyChar + else if keyChar and @isCountKey keyChar + digit = parseInt keyChar + @reset if @keyState.length == 1 then @countPrefix * 10 + digit else digit + false # Suppress event. + else + @reset() + @continueBubbling onKeyup: (event) -> if event.keyCode of @keydownEvents @@ -87,9 +90,14 @@ class KeyHandlerMode extends Mode isCountKey: (keyChar) -> keyChar.length == 1 and (if 0 < @countPrefix then '0' else '1') <= keyChar <= '9' - # This tests whether keyChar would be the very first character of a command mapping. - isFirstKeyChar: (keyChar) -> - @countPrefix == 0 and (@mappingForKeyChar(keyChar) == @keyMapping or @isCountKey keyChar) + # Keystrokes are *never* considered passKeys if the user has begun entering a command. So, for example, if + # 't' is a passKey, then 'gt' and '99t' are neverthless handled as regular keys. + unlessKeyCharIsPassKey: (keyChar, nonPassKeyCallback) -> + if (@passKeys? and keyChar?.length == 1 and 0 <= @passKeys.indexOf(keyChar) and + @countPrefix == 0 and @keyState.length == 1) + @stopBubblingAndTrue + else + nonPassKeyCallback() root = exports ? window root.KeyHandlerMode = KeyHandlerMode diff --git a/content_scripts/mode_passkeys.coffee b/content_scripts/mode_passkeys.coffee deleted file mode 100644 index 7efa559c..00000000 --- a/content_scripts/mode_passkeys.coffee +++ /dev/null @@ -1,23 +0,0 @@ - -class PassKeysMode extends Mode - constructor: (@normalMode) -> - @nextKeyup = @continueBubbling - super - name: "passkeys" - trackState: true # Maintain @passKeys. - keydown: (event) => @handleKeyChar event, KeyboardUtils.getKeyChar event - keypress: (event) => @handleKeyChar event, String.fromCharCode event.charCode - keyup: => ([_, @nextKeyup] = [@nextKeyup, @continueBubbling])[0] - # We cannot track keyup events if we lose the focus. - blur: (event) => @alwaysContinueBubbling => @nextKeyup = @continueBubbling if event.target == window - - # Keystrokes are *never* considered passKeys if the user has begun entering a command. So, for example, if - # 't' is a passKey, then 'gt' and '99t' are neverthless be handled by Vimium. - handleKeyChar: (event, keyChar) -> - return @continueBubbling if event.altKey or event.ctrlKey or event.metaKey - return @continueBubbling unless keyChar and @normalMode.isFirstKeyChar keyChar - return @continueBubbling unless keyChar.length == 1 and 0 <= @passKeys.indexOf keyChar - @nextKeyup = @stopBubblingAndTrue - -root = exports ? window -root.PassKeysMode = PassKeysMode diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index ec666a23..46b21ed0 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -98,6 +98,7 @@ class NormalMode extends KeyHandlerMode super extend options, name: "normal" indicator: false # There is no mode indicator in normal mode. + trackState: true # Maintain @passKeys. commandHandler: @commandHandler.bind this chrome.storage.local.get "normalModeKeyStateMapping", (items) => @@ -127,8 +128,7 @@ class NormalMode extends KeyHandlerMode window.initializeModes = (args...) -> # Install the permanent modes. The permanently-installed insert mode tracks focus/blur events, and # activates/deactivates itself accordingly. - normalMode = new NormalMode args... - new PassKeysMode normalMode + new NormalMode args... new InsertMode permanent: true Scroller.init() diff --git a/manifest.json b/manifest.json index ae50d995..07647da5 100644 --- a/manifest.json +++ b/manifest.json @@ -50,7 +50,6 @@ "content_scripts/scroller.js", "content_scripts/marks.js", "content_scripts/mode_insert.js", - "content_scripts/mode_passkeys.js", "content_scripts/mode_find.js", "content_scripts/mode_visual_edit.js", "content_scripts/mode_key_handler.js", diff --git a/tests/dom_tests/dom_tests.html b/tests/dom_tests/dom_tests.html index 8c914d3c..9aa804d1 100644 --- a/tests/dom_tests/dom_tests.html +++ b/tests/dom_tests/dom_tests.html @@ -42,7 +42,6 @@ <script type="text/javascript" src="../../content_scripts/link_hints.js"></script> <script type="text/javascript" src="../../content_scripts/vomnibar.js"></script> <script type="text/javascript" src="../../content_scripts/scroller.js"></script> - <script type="text/javascript" src="../../content_scripts/mode_passkeys.js"></script> <script type="text/javascript" src="../../content_scripts/mode_insert.js"></script> <script type="text/javascript" src="../../content_scripts/mode_find.js"></script> <script type="text/javascript" src="../../content_scripts/mode_visual_edit.js"></script> |
