aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content_scripts/mode.coffee9
-rw-r--r--tests/dom_tests/dom_tests.coffee28
-rw-r--r--tests/unit_tests/handler_stack_test.coffee23
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 }