aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content_scripts/mode.coffee2
-rw-r--r--content_scripts/vimium_frontend.coffee3
-rw-r--r--lib/handler_stack.coffee13
-rw-r--r--tests/dom_tests/dom_tests.coffee111
4 files changed, 119 insertions, 10 deletions
diff --git a/content_scripts/mode.coffee b/content_scripts/mode.coffee
index a56a3215..46f5c3b7 100644
--- a/content_scripts/mode.coffee
+++ b/content_scripts/mode.coffee
@@ -44,7 +44,7 @@ count = 0
class Mode
# If Mode.debug is true, then we generate a trace of modes being activated and deactivated on the console, along
# with a list of the currently active modes.
- debug: true
+ debug: false
@modes: []
# Constants; short, readable names for handlerStack event-handler return values.
diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee
index 1406b1e7..ed5844dc 100644
--- a/content_scripts/vimium_frontend.coffee
+++ b/content_scripts/vimium_frontend.coffee
@@ -612,7 +612,8 @@ checkIfEnabledForUrl = ->
enabled: response.isEnabledForUrl
passKeys: response.passKeys
-refreshCompletionKeys = (response) ->
+# Exported to window, but only for DOM tests.
+window.refreshCompletionKeys = (response) ->
if (response)
currentCompletionKeys = response.completionKeys
diff --git a/lib/handler_stack.coffee b/lib/handler_stack.coffee
index 22d04941..c21ba8a8 100644
--- a/lib/handler_stack.coffee
+++ b/lib/handler_stack.coffee
@@ -98,14 +98,17 @@ class HandlerStack
label ||= if result then "continue/truthy" else "suppress"
@log @eventNumber, type, handler._name, label
- logRecords: []
log: (args...) ->
line = args.join " "
- @logRecords.push line
console.log line
- clipLog: ->
- Clipboard.copy logRecords.join "\n"
+ # Used by tests to get a duplicate copy of the initialized handler stack.
+ duplicate: ->
+ dup = new HandlerStack()
+ dup.stack = @stack[..]
+ for prop in [ "stopBubblingAndTrue", "stopBubblingAndFalse", "restartBubbling" ]
+ dup[prop] = @[prop]
+ dup
root.HandlerStack = HandlerStack
-root.handlerStack = new HandlerStack
+root.handlerStack = new HandlerStack()
diff --git a/tests/dom_tests/dom_tests.coffee b/tests/dom_tests/dom_tests.coffee
index 4a61877c..ce54190a 100644
--- a/tests/dom_tests/dom_tests.coffee
+++ b/tests/dom_tests/dom_tests.coffee
@@ -8,10 +8,15 @@ mockKeyboardEvent = (keyChar) ->
event.charCode = (if keyCodes[keyChar] isnt undefined then keyCodes[keyChar] else keyChar.charCodeAt(0))
event.keyIdentifier = "U+00" + event.charCode.toString(16)
event.keyCode = event.charCode
- event.stopImmediatePropagation = ->
- event.preventDefault = ->
+ event.stopImmediatePropagation = (event) -> @suppressed = true
+ event.preventDefault = (event) -> @suppressed = true
event
+# Some of these tests have side effects on the handler stack. Therefore, we take backups of the stack, and
+# restore them later.
+backupHandlerStack = -> handlerStack.backup = handlerStack.stack
+restoreHandlerStack = -> handlerStack.stack = handlerStack.backup
+
#
# Retrieve the hint markers as an array object.
#
@@ -170,9 +175,11 @@ context "Input focus",
testContent = "<input type='text' id='first'/><input style='display:none;' id='second'/>
<input type='password' id='third' value='some value'/>"
document.getElementById("test-div").innerHTML = testContent
+ backupHandlerStack()
tearDown ->
document.getElementById("test-div").innerHTML = ""
+ restoreHandlerStack()
should "focus the right element", ->
focusInput 1
@@ -243,9 +250,107 @@ context "Find prev / next links",
goNext()
assert.equal '#first', window.location.hash
-
createLinks = (n) ->
for i in [0...n] by 1
link = document.createElement("a")
link.textContent = "test"
document.getElementById("test-div").appendChild link
+
+context "Normal mode",
+ setup ->
+ backupHandlerStack()
+ refreshCompletionKeys
+ completionKeys: "o"
+ validFirstKeys: "o"
+
+ tearDown ->
+ restoreHandlerStack()
+
+ should "suppress mapped keys", ->
+ for event in [ "keydown", "keypress", "keyup" ]
+ key = mockKeyboardEvent "o"
+ handlerStack.bubbleEvent event, key
+ assert.isTrue key.suppressed
+
+ should "not suppress unmapped keys", ->
+ for event in [ "keydown", "keypress", "keyup" ]
+ key = mockKeyboardEvent "a"
+ handlerStack.bubbleEvent event, key
+ assert.isFalse key.suppressed
+
+context "Passkeys mode",
+ setup ->
+ backupHandlerStack()
+ refreshCompletionKeys
+ completionKeys: "oj"
+ validFirstKeys: "oj"
+
+ handlerStack.bubbleEvent "registerStateChange",
+ enabled: true
+ passKeys: "j"
+
+ tearDown ->
+ restoreHandlerStack()
+ handlerStack.bubbleEvent "registerStateChange",
+ enabled: true
+ passKeys: ""
+
+ should "not suppress passKeys", ->
+ # First check normal-mode key (just to verify the framework).
+ for event in [ "keydown", "keypress", "keyup" ]
+ key = mockKeyboardEvent "o"
+ handlerStack.bubbleEvent event, key
+ assert.isTrue key.suppressed
+
+ # Then check passKey.
+ for event in [ "keydown", "keypress", "keyup" ]
+ key = mockKeyboardEvent "j"
+ handlerStack.bubbleEvent event, key
+ assert.isFalse key.suppressed
+
+context "Insert mode",
+ setup ->
+ backupHandlerStack()
+ refreshCompletionKeys
+ completionKeys: "o"
+ validFirstKeys: "o"
+
+ tearDown ->
+ backupHandlerStack()
+
+ should "not suppress mapped keys in insert mode", ->
+ # First check normal-mode key (just to verify the framework).
+ for event in [ "keydown", "keypress", "keyup" ]
+ key = mockKeyboardEvent "o"
+ handlerStack.bubbleEvent event, key
+ assert.isTrue key.suppressed
+
+ # Install insert mode.
+ insertMode = new InsertMode()
+
+ # Then verify insert mode.
+ for event in [ "keydown", "keypress", "keyup" ]
+ key = mockKeyboardEvent "o"
+ handlerStack.bubbleEvent event, key
+ assert.isFalse key.suppressed
+
+ insertMode.exit()
+
+ # Then check insert mode has been successfully removed.
+ for event in [ "keydown", "keypress", "keyup" ]
+ key = mockKeyboardEvent "o"
+ handlerStack.bubbleEvent event, key
+ assert.isTrue key.suppressed
+
+context "Insert mode trigger",
+ setup ->
+ backupHandlerStack()
+ refreshCompletionKeys
+ completionKeys: "o"
+ validFirstKeys: "o"
+
+ tearDown ->
+ backupHandlerStack()
+
+ should "trigger insert mode on input-focus events", ->
+