diff options
| -rw-r--r-- | content_scripts/link_hints.coffee | 5 | ||||
| -rw-r--r-- | content_scripts/mode_key_handler.coffee | 5 | ||||
| -rw-r--r-- | content_scripts/vimium_frontend.coffee | 2 | ||||
| -rw-r--r-- | tests/dom_tests/dom_tests.coffee | 157 | ||||
| -rw-r--r-- | tests/dom_tests/phantom_runner.coffee | 24 | 
5 files changed, 57 insertions, 136 deletions
| diff --git a/content_scripts/link_hints.coffee b/content_scripts/link_hints.coffee index e5c8b57b..4d9bbd1f 100644 --- a/content_scripts/link_hints.coffee +++ b/content_scripts/link_hints.coffee @@ -292,8 +292,11 @@ class LinkHintsMode        if keyChar = KeyboardUtils.getKeyChar event          @markerMatcher.pushKeyChar keyChar          @updateVisibleMarkers() +        DomUtils.consumeKeyup event +        return -    DomUtils.consumeKeyup event +    # We've handled the event, so suppress it and update the mode indicator. +    DomUtils.suppressEvent event    updateVisibleMarkers: (tabCount = 0) ->      {hintKeystrokeQueue, linkTextKeystrokeQueue} = @markerMatcher diff --git a/content_scripts/mode_key_handler.coffee b/content_scripts/mode_key_handler.coffee index 914eeb6c..82fdc0e6 100644 --- a/content_scripts/mode_key_handler.coffee +++ b/content_scripts/mode_key_handler.coffee @@ -54,7 +54,12 @@ class KeyHandlerMode extends Mode        @continueBubbling      else if @isMappedKey keyChar        DomUtils.consumeKeyup event, => @handleKeyChar keyChar +    else if @isCountKey keyChar +      digit = parseInt keyChar +      @reset if @keyState.length == 1 then @countPrefix * 10 + digit else digit +      @suppressEvent      else +      @reset()        @continueBubbling    # This tests whether there is a mapping of keyChar in the current key state (and accounts for pass keys). diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index 2331a8cf..b3a85bfb 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -687,4 +687,4 @@ root.bgLog = bgLog  extend root, {handleEscapeForFindMode, handleEnterForFindMode, performFind, performBackwardsFind,    enterFindMode, focusThisFrame}  # These are exported only for the tests. -extend root, {installModes, installListeners} +extend root, {installModes} diff --git a/tests/dom_tests/dom_tests.coffee b/tests/dom_tests/dom_tests.coffee index 9088fe30..cbf60532 100644 --- a/tests/dom_tests/dom_tests.coffee +++ b/tests/dom_tests/dom_tests.coffee @@ -1,33 +1,11 @@  window.vimiumDomTestsAreRunning = true  # Install frontend event handlers. -installListeners()  HUD.init()  Frame.registerFrameId chromeFrameId: 0 -installListener = (element, event, callback) -> -  element.addEventListener event, (-> callback.apply(this, arguments)), true -  getSelection = -> -    window.getSelection().toString() - -# A count of the number of keyboard events received by the page (for the most recently-sent keystroke).  E.g., -# we expect 3 if the keystroke is passed through (keydown, keypress, keyup), and 0 if it is suppressed. -pageKeyboardEventCount = 0 - -sendKeyboardEvent = (key) -> -  pageKeyboardEventCount = 0 -  response = window.callPhantom -    request: "keyboard" -    key: key - -sendKeyboardEvents = (keys) -> -  sendKeyboardEvent ch for ch in keys.split() - -# These listeners receive events after the main frontend listeners, and do not receive suppressed events. -for type in [ "keydown", "keypress", "keyup" ] -  installListener window, type, (event) -> -    pageKeyboardEventCount += 1 +  window.getSelection().toString()  commandName = commandCount = null @@ -163,6 +141,16 @@ context "jsaction matching",        linkHints.deactivateMode()        assert.equal 0, hintMarkers.length +sendKeyboardEvent = (key, type="keydown", extra={}) -> +  handlerStack.bubbleEvent type, extend extra, +    type: type +    key: key +    preventDefault: -> +    stopImmediatePropagation: -> + +sendKeyboardEvents = (keys) -> +  sendKeyboardEvent key for key in keys.split "" +  inputs = []  context "Test link hints for focusing input elements correctly", @@ -227,16 +215,16 @@ context "Test link hints for changing mode",    should "change mode on shift", ->      assert.equal "curr-tab", @linkHints.mode.name -    sendKeyboardEvent "shift-down" +    sendKeyboardEvent "Shift", "keydown", keyCode: keyCodes.shiftKey      assert.equal "bg-tab", @linkHints.mode.name -    sendKeyboardEvent "shift-up" +    sendKeyboardEvent "Shift", "keyup", keyCode: keyCodes.shiftKey      assert.equal "curr-tab", @linkHints.mode.name    should "change mode on ctrl", ->      assert.equal "curr-tab", @linkHints.mode.name -    sendKeyboardEvent "ctrl-down" +    sendKeyboardEvent "Control", "keydown", keyCode: keyCodes.ctrlKey      assert.equal "fg-tab", @linkHints.mode.name -    sendKeyboardEvent "ctrl-up" +    sendKeyboardEvent "Control", "keyup", keyCode: keyCodes.ctrlKey      assert.equal "curr-tab", @linkHints.mode.name  context "Alphabetical link hints", @@ -247,6 +235,7 @@ context "Alphabetical link hints",      stubSettings "linkHintCharacters", "ab"      stub window, "windowIsFocused", -> true +    document.getElementById("test-div").innerHTML = ""      # Three hints will trigger double hint chars.      createLinks 3      @linkHints = activateLinkHintsMode() @@ -258,12 +247,13 @@ context "Alphabetical link hints",    should "label the hints correctly", ->      hintMarkers = getHintMarkers()      expectedHints = ["aa", "b", "ab"] +    assert.equal 3, hintMarkers.length      for hint, i in expectedHints        assert.equal hint, hintMarkers[i].hintString    should "narrow the hints", ->      hintMarkers = getHintMarkers() -    sendKeyboardEvent "A" +    sendKeyboardEvent "a"      assert.equal "none", hintMarkers[1].style.display      assert.equal "", hintMarkers[0].style.display @@ -314,24 +304,25 @@ context "Filtered link hints",      should "narrow the hints", ->        hintMarkers = getHintMarkers() -      sendKeyboardEvent "T" -      sendKeyboardEvent "R" +      sendKeyboardEvent "t" +      sendKeyboardEvent "r"        assert.equal "none", hintMarkers[0].style.display        assert.equal "3", hintMarkers[1].hintString        assert.equal "", hintMarkers[1].style.display -      sendKeyboardEvent "A" +      sendKeyboardEvent "a"        assert.equal "1", hintMarkers[3].hintString -    # This test is the same as above, but with an extra non-matching character. +    # This test is the same as above, but with an extra non-matching character.  The effect should be the +    # same.      should "narrow the hints and ignore typing mistakes", ->        hintMarkers = getHintMarkers() -      sendKeyboardEvent "T" -      sendKeyboardEvent "R" -      sendKeyboardEvent "X" +      sendKeyboardEvent "t" +      sendKeyboardEvent "r" +      sendKeyboardEvent "x"        assert.equal "none", hintMarkers[0].style.display        assert.equal "3", hintMarkers[1].hintString        assert.equal "", hintMarkers[1].style.display -      sendKeyboardEvent "A" +      sendKeyboardEvent "a"        assert.equal "1", hintMarkers[3].hintString    context "Image hints", @@ -428,9 +419,9 @@ context "Filtered link hints",      should "use tab to select the active hint", ->        sendKeyboardEvents "abc"        assert.equal "8", @getActiveHintMarker() -      sendKeyboardEvent "tab" +      sendKeyboardEvent "Tab", "keydown", keyCode: keyCodes.tab        assert.equal "7", @getActiveHintMarker() -      sendKeyboardEvent "tab" +      sendKeyboardEvent "Tab", "keydown", keyCode: keyCodes.tab        assert.equal "9", @getActiveHintMarker()  context "Input focus", @@ -576,93 +567,55 @@ context "Key mapping",    should "set and call command handler", ->      sendKeyboardEvent "m"      assert.isTrue @handlerCalled -    assert.equal 0, pageKeyboardEventCount    should "not call command handler for pass keys", ->      sendKeyboardEvent "p"      assert.isFalse @handlerCalled -    assert.equal 3, pageKeyboardEventCount    should "accept a count prefix with a single digit", ->      sendKeyboardEvent "2"      sendKeyboardEvent "m"      assert.equal 2, @handlerCalledCount -    assert.equal 0, pageKeyboardEventCount    should "accept a count prefix with multiple digits", ->      sendKeyboardEvent "2"      sendKeyboardEvent "0"      sendKeyboardEvent "m"      assert.equal 20, @handlerCalledCount -    assert.equal 0, pageKeyboardEventCount    should "cancel a count prefix", ->      sendKeyboardEvent "2"      sendKeyboardEvent "z"      sendKeyboardEvent "m"      assert.equal 1, @handlerCalledCount -    assert.equal 0, pageKeyboardEventCount    should "accept a count prefix for multi-key command mappings", -> -    sendKeyboardEvent "2" +    sendKeyboardEvent "5"      sendKeyboardEvent "z"      sendKeyboardEvent "p" -    assert.equal 2, @handlerCalledCount -    assert.equal 0, pageKeyboardEventCount +    assert.equal 5, @handlerCalledCount    should "cancel a key prefix", ->      sendKeyboardEvent "z"      sendKeyboardEvent "m"      assert.equal 1, @handlerCalledCount -    assert.equal 0, pageKeyboardEventCount    should "cancel a count prefix after a prefix key", ->      sendKeyboardEvent "2"      sendKeyboardEvent "z"      sendKeyboardEvent "m"      assert.equal 1, @handlerCalledCount -    assert.equal 0, pageKeyboardEventCount    should "cancel a prefix key on escape", ->      sendKeyboardEvent "z" -    sendKeyboardEvent "escape" +    sendKeyboardEvent "Escape", "keydown", keyCode: keyCodes.ESC      sendKeyboardEvent "p"      assert.equal 0, @handlerCalledCount -  should "not handle escape on its own", -> -    sendKeyboardEvent "escape" -    assert.equal 2, pageKeyboardEventCount -  context "Normal mode",    setup ->      initializeModeState() -  should "suppress mapped keys", -> -    sendKeyboardEvent "m" -    assert.equal 0, pageKeyboardEventCount - -  should "not suppress unmapped keys", -> -    sendKeyboardEvent "u" -    assert.equal 3, pageKeyboardEventCount - -  should "not suppress escape", -> -    sendKeyboardEvent "escape" -    assert.equal 2, pageKeyboardEventCount - -  should "not suppress passKeys", -> -    sendKeyboardEvent "p" -    assert.equal 3, pageKeyboardEventCount - -  should "suppress passKeys with a non-empty key state (a count)", -> -    sendKeyboardEvent "5" -    sendKeyboardEvent "p" -    assert.equal 0, pageKeyboardEventCount - -  should "suppress passKeys with a non-empty key state (a key)", -> -    sendKeyboardEvent "z" -    sendKeyboardEvent "p" -    assert.equal 0, pageKeyboardEventCount -    should "invoke commands for mapped keys", ->      sendKeyboardEvent "m"      assert.equal "m", commandName @@ -706,7 +659,7 @@ context "Normal mode",      assert.equal 2, commandCount    should "accept count prefixes of length 2", -> -    sendKeyboardEvent "12" +    sendKeyboardEvents "12"      sendKeyboardEvent "m"      assert.equal 12, commandCount @@ -763,19 +716,16 @@ context "Insert mode",      initializeModeState()      @insertMode = new InsertMode global: true -  should "not suppress mapped keys in insert mode", -> -    sendKeyboardEvent "m" -    assert.equal 3, pageKeyboardEventCount -    should "exit on escape", ->      assert.isTrue @insertMode.modeIsActive -    sendKeyboardEvent "escape" +    sendKeyboardEvent "Escape", "keydown", keyCode: keyCodes.ESC      assert.isFalse @insertMode.modeIsActive    should "resume normal mode after leaving insert mode", -> +    assert.equal null, commandCount      @insertMode.exit()      sendKeyboardEvent "m" -    assert.equal 0, pageKeyboardEventCount +    assert.equal 1, commandCount  context "Triggering insert mode",    setup -> @@ -833,7 +783,7 @@ context "Caret mode",      assert.equal "I", getSelection()    should "exit caret mode on escape", -> -    sendKeyboardEvent "escape" +    sendKeyboardEvent "Escape", "keydown", keyCode: keyCodes.ESC      assert.equal "", getSelection()    should "move caret with l and h", -> @@ -868,7 +818,7 @@ context "Caret mode",      assert.equal "I", getSelection()      sendKeyboardEvents "ww"      assert.equal "a", getSelection() -    sendKeyboardEvent "escape" +    sendKeyboardEvent "Escape", "keydown", keyCode: keyCodes.ESC      new VisualMode      assert.equal "a", getSelection() @@ -983,16 +933,14 @@ context "Mode utilities",      test = new Mode exitOnEscape: true      assert.isTrue test.modeIsActive -    sendKeyboardEvent "escape" -    assert.equal 0, pageKeyboardEventCount +    sendKeyboardEvent "Escape", "keydown", keyCode: keyCodes.ESC      assert.isFalse test.modeIsActive    should "not exit on escape if not enabled", ->      test = new Mode exitOnEscape: false      assert.isTrue test.modeIsActive -    sendKeyboardEvent "escape" -    assert.equal 2, pageKeyboardEventCount +    sendKeyboardEvent "Escape", "keydown", keyCode: keyCodes.ESC      assert.isTrue test.modeIsActive    should "exit on blur", -> @@ -1031,21 +979,21 @@ context "PostFindMode",      assert.isFalse @postFindMode.modeIsActive    should "suppress unmapped printable keys", -> -    sendKeyboardEvent "m" -    assert.equal 0, pageKeyboardEventCount +    sendKeyboardEvent "a" +    assert.equal null, commandCount    should "be deactivated on click events", ->      handlerStack.bubbleEvent "click", target: document.activeElement      assert.isFalse @postFindMode.modeIsActive    should "enter insert mode on immediate escape", -> -    sendKeyboardEvent "escape" -    assert.equal 0, pageKeyboardEventCount +    sendKeyboardEvent "Escape", "keydown", keyCode: keyCodes.ESC +    assert.equal null, commandCount      assert.isFalse @postFindMode.modeIsActive    should "not enter insert mode on subsequent escapes", ->      sendKeyboardEvent "a" -    sendKeyboardEvent "escape" +    sendKeyboardEvent "Escape", "keydown", keyCode: keyCodes.ESC      assert.isTrue @postFindMode.modeIsActive  context "WaitForEnter", @@ -1057,14 +1005,14 @@ context "WaitForEnter",    should "exit with success on Enter", ->      assert.isTrue @waitForEnter.modeIsActive      assert.isFalse @isSuccess? -    sendKeyboardEvent "enter" +    sendKeyboardEvent "Enter", "keydown", keyCode: keyCodes.enter      assert.isFalse @waitForEnter.modeIsActive      assert.isTrue @isSuccess? and @isSuccess == true    should "exit without success on Escape", ->      assert.isTrue @waitForEnter.modeIsActive      assert.isFalse @isSuccess? -    sendKeyboardEvent "escape" +    sendKeyboardEvent "Escape", "keydown", keyCode: keyCodes.ESC      assert.isFalse @waitForEnter.modeIsActive      assert.isTrue @isSuccess? and @isSuccess == false @@ -1075,17 +1023,6 @@ context "WaitForEnter",      assert.isTrue @waitForEnter.modeIsActive      assert.isFalse @isSuccess? -context "SuppressAllKeyboardEvents", -  setup -> -    initializeModeState() - -  should "supress keyboard events", -> -    sendKeyboardEvent "a" -    assert.equal 3, pageKeyboardEventCount -    new SuppressAllKeyboardEvents -    sendKeyboardEvent "a" -    assert.equal 0, pageKeyboardEventCount -  context "GrabBackFocus",    setup ->      testContent = "<input type='text' value='some value' id='input'/>" diff --git a/tests/dom_tests/phantom_runner.coffee b/tests/dom_tests/phantom_runner.coffee index 09d7d584..b91919bb 100644 --- a/tests/dom_tests/phantom_runner.coffee +++ b/tests/dom_tests/phantom_runner.coffee @@ -21,30 +21,6 @@ page.onError = (msg, trace) ->  page.onResourceError = (resourceError) ->    console.log(resourceError.errorString) -page.onCallback = (request) -> -  switch request.request -    when "keyboard" -      switch request.key -        when "escape" -          page.sendEvent "keydown", page.event.key.Escape -          page.sendEvent "keyup", page.event.key.Escape -        when "enter" -          page.sendEvent "keydown", page.event.key.Enter -          page.sendEvent "keyup", page.event.key.Enter -        when "tab" -          page.sendEvent "keydown", page.event.key.Tab -          page.sendEvent "keyup", page.event.key.Tab -        when "shift-down" -          page.sendEvent "keydown", page.event.key.Shift -        when "shift-up" -          page.sendEvent "keyup", page.event.key.Shift -        when "ctrl-down" -          page.sendEvent "keydown", page.event.key.Control -        when "ctrl-up" -          page.sendEvent "keyup", page.event.key.Control -        else -          page.sendEvent "keypress", request.key -  testfile = path.join(path.dirname(system.args[0]), 'dom_tests.html')  page.open testfile, (status) ->    if status != 'success' | 
