diff options
| -rw-r--r-- | content_scripts/mode.coffee | 9 | ||||
| -rw-r--r-- | tests/dom_tests/dom_tests.coffee | 28 | ||||
| -rw-r--r-- | tests/unit_tests/handler_stack_test.coffee | 23 | 
3 files changed, 48 insertions, 12 deletions
| diff --git a/content_scripts/mode.coffee b/content_scripts/mode.coffee index 84e3e75c..dd797c46 100644 --- a/content_scripts/mode.coffee +++ b/content_scripts/mode.coffee @@ -189,10 +189,9 @@ class Mode        # We're currently installing a new mode. So we'll be updating the badge shortly.  Therefore, we can        # suppress badge updates while exiting any existing active singleton.  This prevents the badge from        # flickering in some cases. -      Mode.badgeSuppressor.runSuppresed => -        if singletons[key] -          @log "singleton:", "deactivating #{singletons[key].id}" if @debug -          singletons[key].exit() +      if singletons[key] +        @log "singleton:", "deactivating #{singletons[key].id}" if @debug +        Mode.badgeSuppressor.runSuppresed -> singletons[key].exit()        singletons[key] = @        @onExit => delete singletons[key] if singletons[key] == @ @@ -216,7 +215,7 @@ new class BadgeMode extends Mode        name: "badge"        trackState: true -    # FIXME(smblott) BadgeMode is currently triggering and updateBadge event on every focus event.  That's a +    # FIXME(smblott) BadgeMode is currently triggering an updateBadge event on every focus event.  That's a      # lot, considerably more than is necessary.  Really, it only needs to trigger when we change frame, or      # when we change tab.      @push diff --git a/tests/dom_tests/dom_tests.coffee b/tests/dom_tests/dom_tests.coffee index c84d513d..d9e7775f 100644 --- a/tests/dom_tests/dom_tests.coffee +++ b/tests/dom_tests/dom_tests.coffee @@ -8,12 +8,12 @@ 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) -> @suppressed = true -  event.preventDefault = (event) -> @suppressed = true +  event.stopImmediatePropagation = -> @suppressed = true +  event.preventDefault = -> @suppressed = true    event  # Some of these tests have side effects on the handler stack and mode.  Therefore, we take backups and restore -# them later. +# them on tear down.  backupStackState = ->    Mode.backup = Mode.modes[..]    handlerStack.backup = handlerStack.stack[..] @@ -197,6 +197,21 @@ context "Input focus",      assert.equal "third", document.activeElement.id      handlerStack.bubbleEvent 'keydown', mockKeyboardEvent("A") +  # This is the same as above, but also verifies that focusInput activates insert mode. +  should "focus the right element, and activate insert mode", -> +    focusInput 1 +    assert.equal "first", document.activeElement.id +    # deactivate the tabbing mode and its overlays +    assert.isTrue Mode.modes[Mode.modes.length-1].name != "insert" +    handlerStack.bubbleEvent 'keydown', mockKeyboardEvent("A") +    assert.isTrue Mode.modes[Mode.modes.length-1].name == "insert" + +    focusInput 100 +    assert.equal "third", document.activeElement.id +    assert.isTrue Mode.modes[Mode.modes.length-1].name != "insert" +    handlerStack.bubbleEvent 'keydown', mockKeyboardEvent("A") +    assert.isTrue Mode.modes[Mode.modes.length-1].name == "insert" +  # TODO: these find prev/next link tests could be refactored into unit tests which invoke a function which has  # a tighter contract than goNext(), since they test minor aspects of goNext()'s link matching behavior, and we  # don't need to construct external state many times over just to test that. @@ -262,13 +277,12 @@ createLinks = (n) ->      link.textContent = "test"      document.getElementById("test-div").appendChild link -# For these tests, we use "m" as a mapped key, "p" ass a pass key, and "u" as an unmapped key. +# For these tests, we use "m" as a mapped key, "p" as a pass key, and "u" as an unmapped key.  context "Normal mode",    setup ->      backupStackState()      refreshCompletionKeys -      completionKeys: [ "m" ] -      validFirstKeys: {} +      completionKeys: "m"    tearDown ->      restoreStackState() @@ -616,7 +630,7 @@ context "PostFindMode",    should "enter insert mode on immediate escape", ->      new PostFindMode @element -    assert.isTrue Mode.modes[Mode.modes.length-1].name != "insert" +    assert.isTrue Mode.modes[Mode.modes.length-1].name == "post-find"      handlerStack.bubbleEvent "keydown", @escape      assert.isTrue Mode.modes[Mode.modes.length-1].name == "insert" diff --git a/tests/unit_tests/handler_stack_test.coffee b/tests/unit_tests/handler_stack_test.coffee index 0ed8f4c0..0ed85e63 100644 --- a/tests/unit_tests/handler_stack_test.coffee +++ b/tests/unit_tests/handler_stack_test.coffee @@ -23,6 +23,29 @@ context "handlerStack",      assert.isTrue @handler2Called      assert.isFalse @handler1Called +  should "terminate bubbling on stopBubblingAndTrue, and be true", -> +    @handlerStack.push { keydown: => @handler1Called = true } +    @handlerStack.push { keydown: => @handler2Called = true; @handlerStack.stopBubblingAndTrue  } +    assert.isTrue @handlerStack.bubbleEvent 'keydown', {} +    assert.isTrue @handler2Called +    assert.isFalse @handler1Called + +  should "terminate bubbling on stopBubblingAndTrue, and be false", -> +    @handlerStack.push { keydown: => @handler1Called = true } +    @handlerStack.push { keydown: => @handler2Called = true; @handlerStack.stopBubblingAndFalse  } +    assert.isFalse @handlerStack.bubbleEvent 'keydown', {} +    assert.isTrue @handler2Called +    assert.isFalse @handler1Called + +  should "restart bubbling on restartBubbling", -> +    @handler1Called = 0 +    @handler2Called = 0 +    id = @handlerStack.push { keydown: => @handler1Called++; @handlerStack.remove(id); @handlerStack.restartBubbling } +    @handlerStack.push { keydown: => @handler2Called++; true  } +    assert.isTrue @handlerStack.bubbleEvent 'keydown', {} +    assert.isTrue @handler1Called == 1 +    assert.isTrue @handler2Called == 2 +    should "remove handlers correctly", ->      @handlerStack.push { keydown: => @handler1Called = true }      handlerId = @handlerStack.push { keydown: => @handler2Called = true } | 
