aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content_scripts/mode_key_handler.coffee42
-rw-r--r--content_scripts/mode_passkeys.coffee23
-rw-r--r--content_scripts/vimium_frontend.coffee4
-rw-r--r--manifest.json1
-rw-r--r--tests/dom_tests/dom_tests.html1
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>