aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content_scripts/mode_find.coffee8
-rw-r--r--content_scripts/mode_insert.coffee13
-rw-r--r--content_scripts/vimium_frontend.coffee22
3 files changed, 26 insertions, 17 deletions
diff --git a/content_scripts/mode_find.coffee b/content_scripts/mode_find.coffee
index 2ef74a89..40245d14 100644
--- a/content_scripts/mode_find.coffee
+++ b/content_scripts/mode_find.coffee
@@ -47,13 +47,5 @@ class PostFindMode extends InsertModeBlocker
blur: (event) => @alwaysContinueBubbling => @exit()
keydown: (event) => @alwaysContinueBubbling => @exit() if document.activeElement != element
- # If element is selectable, then it's already focused. If the user clicks on it, then there's no new
- # focus event, so InsertModeTrigger doesn't fire and we don't drop automatically into insert mode. So
- # we have to handle this case separately.
- click: (event) =>
- @alwaysContinueBubbling =>
- new InsertMode element if DomUtils.isDOMDescendant element, event.target
- @exit()
-
root = exports ? window
root.PostFindMode = PostFindMode
diff --git a/content_scripts/mode_insert.coffee b/content_scripts/mode_insert.coffee
index 7f1d5ddc..bfc79aa9 100644
--- a/content_scripts/mode_insert.coffee
+++ b/content_scripts/mode_insert.coffee
@@ -64,6 +64,19 @@ class InsertModeBlocker extends Mode
super options
@onExit -> triggerSuppressor.unsuppress()
+ @push
+ "click": (event) =>
+ @alwaysContinueBubbling =>
+ # The user knows best; so, if the user clicks on something, we get out of the way.
+ @exit event
+ # However, there's a corner case. If the active element is focusable, then we would have been in
+ # insert mode had we not been blocking the trigger. Now, clicking on the element will not generate
+ # a new focus event, so the insert-mode trigger will not fire. We have to handle this case
+ # specially.
+ if document.activeElement and
+ event.target == document.activeElement and DomUtils.isEditable document.activeElement
+ new InsertMode document.activeElement
+
root = exports ? window
root.InsertMode = InsertMode
root.InsertModeTrigger = InsertModeTrigger
diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee
index d67f57d0..97d4cd73 100644
--- a/content_scripts/vimium_frontend.coffee
+++ b/content_scripts/vimium_frontend.coffee
@@ -391,18 +391,21 @@ extend window,
visibleInputs[selectedInputIndex].element.focus()
@suppressEvent
else unless event.keyCode == KeyboardUtils.keyCodes.shiftKey
- @exit()
+ @exit event
@continueBubbling
visibleInputs[selectedInputIndex].element.focus()
- return @exit() if visibleInputs.length == 1
- hints[selectedInputIndex].classList.add 'internalVimiumSelectedInputHint'
+ if visibleInputs.length == 1
+ @exit()
+ else
+ hints[selectedInputIndex].classList.add 'internalVimiumSelectedInputHint'
exit: ->
- DomUtils.removeElement hintContainingDiv
- visibleInputs[selectedInputIndex].element.focus()
- new InsertMode visibleInputs[selectedInputIndex].element
super()
+ DomUtils.removeElement hintContainingDiv
+ if document.activeElement == visibleInputs[selectedInputIndex].element
+ # InsertModeBlocker handles the "click" case.
+ new InsertMode document.activeElement unless event?.type == "click"
# 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
@@ -733,7 +736,7 @@ handleEnterForFindMode = ->
document.body.classList.add("vimiumFindMode")
settings.set("findModeRawQuery", findModeQuery.rawQuery)
-class FindMode extends Mode
+class FindMode extends InsertModeBlocker
constructor: ->
super
name: "find"
@@ -762,8 +765,9 @@ class FindMode extends Mode
exit: (event) ->
super()
- handleEscapeForFindMode() if event and KeyboardUtils.isEscape event
- new PostFindMode findModeAnchorNode
+ handleEscapeForFindMode() if event?.type == "keydown" and KeyboardUtils.isEscape event
+ handleEscapeForFindMode() if event?.type == "click"
+ new PostFindMode findModeAnchorNode unless event?.type == "click"
performFindInPlace = ->
cachedScrollX = window.scrollX