aboutsummaryrefslogtreecommitdiffstats
path: root/content_scripts/vimium_frontend.coffee
diff options
context:
space:
mode:
authorStephen Blott2015-01-05 13:20:19 +0000
committerStephen Blott2015-01-05 13:20:19 +0000
commit308e4007814443955fa77a793da3cd2ec274686c (patch)
treeaaeab0bcb52010b15f33f046f34f3a64fb48c194 /content_scripts/vimium_frontend.coffee
parent73f66f25e6b8e5b5b8456074ad4fa79ba1d3ca4d (diff)
downloadvimium-308e4007814443955fa77a793da3cd2ec274686c.tar.bz2
Modes; fix findFocus.
Diffstat (limited to 'content_scripts/vimium_frontend.coffee')
-rw-r--r--content_scripts/vimium_frontend.coffee70
1 files changed, 47 insertions, 23 deletions
diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee
index 299cdcf2..cd717d5e 100644
--- a/content_scripts/vimium_frontend.coffee
+++ b/content_scripts/vimium_frontend.coffee
@@ -5,7 +5,6 @@
# "domReady".
#
-insertMode = null
passKeysMode = null
insertModeLock = null
findMode = false
@@ -362,15 +361,13 @@ extend window,
selectedInputIndex = Math.min(count - 1, visibleInputs.length - 1)
- # There's feature interference between PostFindMode, InsertMode and focusInput. PostFindMode prevents
- # InsertMode from triggering on focus events. Therefore, an input element can already be focused, but
- # InsertMode is not active. When that element is then (again) focused by focusInput, below, no new focus
- # event is generated, so we don't drop into InsertMode as expected.
- # Therefore we blur() the element before focussing it.
element = visibleInputs[selectedInputIndex].element
- element.blur() if document.activeElement == element
element.focus()
+ # If PostFindMode is was previously active, then element may already have had the focus. In this case,
+ # focus() does not generate a "focus" event. So we now force insert mode.
+ new InsertMode element
+
return if visibleInputs.length == 1
hints = for tuple in visibleInputs
@@ -390,23 +387,50 @@ extend window,
hintContainingDiv = DomUtils.addElementList(hints,
{ id: "vimiumInputMarkerContainer", className: "vimiumReset" })
- handlerStack.push keydown: (event) ->
- if event.keyCode == KeyboardUtils.keyCodes.tab
- hints[selectedInputIndex].classList.remove 'internalVimiumSelectedInputHint'
- if event.shiftKey
- if --selectedInputIndex == -1
- selectedInputIndex = hints.length - 1
- else
- if ++selectedInputIndex == hints.length
- selectedInputIndex = 0
- hints[selectedInputIndex].classList.add 'internalVimiumSelectedInputHint'
- visibleInputs[selectedInputIndex].element.focus()
- else unless event.keyCode == KeyboardUtils.keyCodes.shiftKey
- DomUtils.removeElement hintContainingDiv
- @remove()
- return true
+ class FocusSelector extends InsertModeBlocker
+ constructor: ->
+ super InsertModeBlocker, null,
+ name: "focus-selector"
+ badge: "?"
+ keydown: (event) =>
+ if event.keyCode == KeyboardUtils.keyCodes.tab
+ hints[selectedInputIndex].classList.remove 'internalVimiumSelectedInputHint'
+ if event.shiftKey
+ if --selectedInputIndex == -1
+ selectedInputIndex = hints.length - 1
+ else
+ if ++selectedInputIndex == hints.length
+ selectedInputIndex = 0
+ hints[selectedInputIndex].classList.add 'internalVimiumSelectedInputHint'
+ element = visibleInputs[selectedInputIndex].element
+ element.focus()
+ false
+ else unless event.keyCode == KeyboardUtils.keyCodes.shiftKey
+ DomUtils.removeElement hintContainingDiv
+ @exit()
+ new InsertMode element
+ return true
+ keypress: (event) -> false
+ keyup: (event) -> false
+
+ new FocusSelector()
+
+ # handlerStack.push keydown: (event) ->
+ # if event.keyCode == KeyboardUtils.keyCodes.tab
+ # hints[selectedInputIndex].classList.remove 'internalVimiumSelectedInputHint'
+ # if event.shiftKey
+ # if --selectedInputIndex == -1
+ # selectedInputIndex = hints.length - 1
+ # else
+ # if ++selectedInputIndex == hints.length
+ # selectedInputIndex = 0
+ # hints[selectedInputIndex].classList.add 'internalVimiumSelectedInputHint'
+ # visibleInputs[selectedInputIndex].element.focus()
+ # else unless event.keyCode == KeyboardUtils.keyCodes.shiftKey
+ # DomUtils.removeElement hintContainingDiv
+ # @remove()
+ # return true
- false
# Decide whether this keyChar should be passed to the underlying page.
# Keystrokes are *never* considered passKeys if the keyQueue is not empty. So, for example, if 't' is a