diff options
| author | Stephen Blott | 2016-02-29 06:07:01 +0000 | 
|---|---|---|
| committer | Stephen Blott | 2016-03-05 05:39:33 +0000 | 
| commit | 9cfa00bc7db3e07c3abbeb09e483d9fdf20bbc17 (patch) | |
| tree | 36582874bbf16741cc097613527e55065328ae8a | |
| parent | f2bced459457dcc962d4bafe2fdf2e6245506ee3 (diff) | |
| download | vimium-9cfa00bc7db3e07c3abbeb09e483d9fdf20bbc17.tar.bz2 | |
Key bindings; refactor passKeys.
Previously, the key-handling logic (keyQueue, etc) was and the backend
whereas passKeys were handled in the content scripts - so they were a
long way apart.
Now that they're in the same place, it makes more sense to integrate
passKey handling into the regular key handling, because they depend upon
the same data structures.
| -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> | 
