aboutsummaryrefslogtreecommitdiffstats
path: root/content_scripts
diff options
context:
space:
mode:
authorStephen Blott2015-01-26 11:30:21 +0000
committerStephen Blott2015-01-26 11:32:18 +0000
commitd57b08232513b285360b220dbb4de91bc6b61765 (patch)
tree7cd5ee0f8dd50de6811fa7321b573ab6dc0327c7 /content_scripts
parentf644d622ffd7b8ce332d4c2470cd52772abadb2a (diff)
downloadvimium-d57b08232513b285360b220dbb4de91bc6b61765.tar.bz2
Visual/edit modes: fix problem resuming insert mode.
Diffstat (limited to 'content_scripts')
-rw-r--r--content_scripts/mode.coffee6
-rw-r--r--content_scripts/mode_insert.coffee9
-rw-r--r--content_scripts/mode_visual_edit.coffee11
-rw-r--r--content_scripts/vimium_frontend.coffee1
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