diff options
| author | Stephen Blott | 2015-01-26 11:30:21 +0000 |
|---|---|---|
| committer | Stephen Blott | 2015-01-26 11:32:18 +0000 |
| commit | d57b08232513b285360b220dbb4de91bc6b61765 (patch) | |
| tree | 7cd5ee0f8dd50de6811fa7321b573ab6dc0327c7 /content_scripts | |
| parent | f644d622ffd7b8ce332d4c2470cd52772abadb2a (diff) | |
| download | vimium-d57b08232513b285360b220dbb4de91bc6b61765.tar.bz2 | |
Visual/edit modes: fix problem resuming insert mode.
Diffstat (limited to 'content_scripts')
| -rw-r--r-- | content_scripts/mode.coffee | 6 | ||||
| -rw-r--r-- | content_scripts/mode_insert.coffee | 9 | ||||
| -rw-r--r-- | content_scripts/mode_visual_edit.coffee | 11 | ||||
| -rw-r--r-- | content_scripts/vimium_frontend.coffee | 1 |
4 files changed, 19 insertions, 8 deletions
diff --git a/content_scripts/mode.coffee b/content_scripts/mode.coffee index e80df69c..8178a140 100644 --- a/content_scripts/mode.coffee +++ b/content_scripts/mode.coffee @@ -160,6 +160,12 @@ class Mode handler: "setBadge" badge: badge.badge + # Activate a mode, but first remove any keyboard-event handlers which may be in its options. This allows us + # to re-activate (or clone) a previously-active mode. + @cloneMode: (mode, options) -> + delete options[type] for type in [ "keydown", "keypress", "keyup" ] + new mode options + # Debugging routines. logModes: -> if @debug diff --git a/content_scripts/mode_insert.coffee b/content_scripts/mode_insert.coffee index bee2ce58..79043be9 100644 --- a/content_scripts/mode_insert.coffee +++ b/content_scripts/mode_insert.coffee @@ -13,7 +13,7 @@ class InsertMode extends Mode return @stopBubblingAndTrue unless event.type == 'keydown' and KeyboardUtils.isEscape event DomUtils.suppressKeyupAfterEscape handlerStack target = event.srcElement - if target and DomUtils.isFocusable(target) and @options.blurOnEscape + if target and DomUtils.isFocusable target # Remove the focus, so the user can't just get back into insert mode by typing in the same input box. # NOTE(smblott, 2014/12/22) Including embeds for .blur() etc. here is experimental. It appears to be # the right thing to do for most common use cases. However, it could also cripple flash-based sites and @@ -27,12 +27,14 @@ class InsertMode extends Mode keypress: handleKeyEvent keyup: handleKeyEvent keydown: handleKeyEvent - blurOnEscape: true super extend defaults, options @insertModeLock = - if document.activeElement and DomUtils.isEditable document.activeElement + if options.targetElement and DomUtils.isEditable options.targetElement + # The caller has told us which element to activate on. + options.targetElement + else if document.activeElement and DomUtils.isEditable document.activeElement # An input element is already active, so use it. document.activeElement else @@ -69,7 +71,6 @@ class InsertMode extends Mode Mode.updateBadge() exit: (_, target) -> - # Note: target == undefined, here, is required only for tests. if (target and target == @insertModeLock) or @global or target == undefined @log "#{@id}: deactivating (permanent)" if @debug and @permanent and @insertModeLock @insertModeLock = null diff --git a/content_scripts/mode_visual_edit.coffee b/content_scripts/mode_visual_edit.coffee index 1271a7fe..ff9114e9 100644 --- a/content_scripts/mode_visual_edit.coffee +++ b/content_scripts/mode_visual_edit.coffee @@ -456,12 +456,14 @@ class EditMode extends Movement @launchSubMode VisualMode, extend defaults, options enterInsertMode: () -> - @launchSubMode InsertMode, badge: "I", blurOnEscape: false + @launchSubMode InsertMode, + exitOnEscape: true + targetElement: @options.targetElement launchSubMode: (mode, options = {}) -> @lastSubMode = mode: mode - instance: new mode extend options, editModeParent: @ + instance: Mode.cloneMode mode, extend options, editModeParent: @ pasteClipboard: (direction) -> @paste (text) => @@ -521,8 +523,9 @@ class SuspendedEditMode extends Mode @alwaysContinueBubbling => if event?.target == editModeOptions.singleton console.log "#{@id}: reactivating edit mode" if @debug - editMode = new EditMode editModeOptions - editMode.launchSubMode lastSubMode.mode, lastSubMode.instance.options if lastSubMode + editMode = Mode.cloneMode EditMode, editModeOptions + if lastSubMode + editMode.launchSubMode lastSubMode.mode, lastSubMode.instance.options keypress: (event) => @alwaysContinueBubbling => @exit() unless event.metaKey or event.ctrlKey or event.altKey diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index afc15362..55237fe5 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -419,6 +419,7 @@ extend window, if mode and document.activeElement and DomUtils.isEditable document.activeElement new mode singleton: document.activeElement + targetElement: document.activeElement # 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 |
