diff options
| -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", -> + | 
