aboutsummaryrefslogtreecommitdiffstats
path: root/content_scripts/vimium_frontend.coffee
diff options
context:
space:
mode:
Diffstat (limited to 'content_scripts/vimium_frontend.coffee')
-rw-r--r--content_scripts/vimium_frontend.coffee35
1 files changed, 20 insertions, 15 deletions
diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee
index 75b4172f..299cdcf2 100644
--- a/content_scripts/vimium_frontend.coffee
+++ b/content_scripts/vimium_frontend.coffee
@@ -134,7 +134,7 @@ initializePreDomReady = ->
# Install passKeys and insert modes. These too are permanently on the stack (although not always active).
passKeysMode = new PassKeysMode()
- insertMode = new InsertMode()
+ new InsertModeTrigger()
Mode.updateBadge()
checkIfEnabledForUrl()
@@ -339,12 +339,14 @@ extend window,
HUD.showForDuration("Yanked URL", 1000)
enterInsertMode: ->
- insertMode?.activate()
+ new InsertMode()
enterVisualMode: =>
new VisualMode()
focusInput: (count) ->
+ SingletonMode.kill PostFindMode
+
# Focus the first input element on the page, and create overlays to highlight all the input elements, with
# the currently-focused element highlighted specially. Tabbing will shift focus to the next input element.
# Pressing any other key will remove the overlays and the special tab behavior.
@@ -360,10 +362,14 @@ extend window,
selectedInputIndex = Math.min(count - 1, visibleInputs.length - 1)
- # See the definition of PostFindMode.exitModeAndEnterInsert for an explanation of why this is needed.
- PostFindMode.exitModeAndEnterInsert insertMode, visibleInputs[selectedInputIndex].element
-
- visibleInputs[selectedInputIndex].element.focus()
+ # 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()
return if visibleInputs.length == 1
@@ -730,14 +736,12 @@ handleEnterForFindMode = ->
focusFoundLink()
document.body.classList.add("vimiumFindMode")
settings.set("findModeRawQuery", findModeQuery.rawQuery)
- # If we have found an input element, the pressing <esc> immediately afterwards sends us into insert mode.
- new PostFindMode insertMode, findModeAnchorNode
class FindMode extends ExitOnEscapeMode
- constructor: (badge="F") ->
- super
+ constructor: ->
+ super FindMode,
name: "find"
- badge: badge
+ badge: "/"
keydown: (event) =>
if event.keyCode == keyCodes.backspace || event.keyCode == keyCodes.deleteKey
@@ -761,9 +765,10 @@ class FindMode extends ExitOnEscapeMode
Mode.updateBadge()
- exit: (event) ->
- handleEscapeForFindMode() if event?.source == ExitOnEscapeMode
+ exit: (extra) ->
+ handleEscapeForFindMode() if extra?.source == ExitOnEscapeMode
super()
+ new PostFindMode findModeAnchorNode
performFindInPlace = ->
cachedScrollX = window.scrollX
@@ -792,7 +797,7 @@ executeFind = (query, options) ->
HUD.hide(true)
# ignore the selectionchange event generated by find()
document.removeEventListener("selectionchange",restoreDefaultSelectionHighlight, true)
- Mode.runIn InsertModeSuppressFocusTrigger, ->
+ Mode.runIn InsertModeBlocker, ->
result = window.find(query, options.caseSensitive, options.backwards, true, false, true, false)
setTimeout(
-> document.addEventListener("selectionchange", restoreDefaultSelectionHighlight, true)
@@ -854,7 +859,7 @@ findAndFocus = (backwards) ->
# if we have found an input element via 'n', pressing <esc> immediately afterwards sends us into insert
# mode
- new PostFindMode insertMode, findModeAnchorNode
+ new PostFindMode findModeAnchorNode
focusFoundLink()