diff options
| author | Stephen Blott | 2015-01-11 07:15:06 +0000 |
|---|---|---|
| committer | Stephen Blott | 2015-01-11 07:15:06 +0000 |
| commit | d65075a3b66fae93a10b849162fa907d0eb99846 (patch) | |
| tree | 721de43d14028cea46b53b792eaf907912c044c8 | |
| parent | 06a2ea5ccdef3703df23fe4233921bd2a6af3abf (diff) | |
| download | vimium-d65075a3b66fae93a10b849162fa907d0eb99846.tar.bz2 | |
Modes; add DOM tests.
| -rw-r--r-- | content_scripts/mode.coffee | 2 | ||||
| -rw-r--r-- | content_scripts/vimium_frontend.coffee | 3 | ||||
| -rw-r--r-- | lib/handler_stack.coffee | 13 | ||||
| -rw-r--r-- | tests/dom_tests/dom_tests.coffee | 111 |
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", -> + |
