diff options
| -rw-r--r-- | content_scripts/mode_find.coffee | 8 | ||||
| -rw-r--r-- | content_scripts/mode_insert.coffee | 13 | ||||
| -rw-r--r-- | content_scripts/vimium_frontend.coffee | 22 |
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 |
