aboutsummaryrefslogtreecommitdiffstats
path: root/content_scripts/mode_find.coffee
diff options
context:
space:
mode:
Diffstat (limited to 'content_scripts/mode_find.coffee')
-rw-r--r--content_scripts/mode_find.coffee22
1 files changed, 15 insertions, 7 deletions
diff --git a/content_scripts/mode_find.coffee b/content_scripts/mode_find.coffee
index f9766e3a..837606f3 100644
--- a/content_scripts/mode_find.coffee
+++ b/content_scripts/mode_find.coffee
@@ -1,26 +1,33 @@
# NOTE(smblott). Ultimately, all of the FindMode-related code should be moved to this file.
# When we use find mode, the selection/focus can end up in a focusable/editable element. In this situation,
-# PostFindMode handles two special cases:
-# 1. Be an InsertModeBlocker. This prevents keyboard events from dropping us unintentionaly into insert
+# PostFindMode handles three special cases:
+# 1. Be an InsertModeBlocker. This prevents keyboard events from dropping us unintentionally into insert
# mode. This is achieved by inheriting from InsertModeBlocker.
-# 2. If the very-next keystroke is Escape, then drop immediately into insert mode.
+# 2. Prevent all keyboard events on the active element from propagating. This is achieved by setting the
+# trapAllKeyboardEvents option. There's some controversy as to whether this is the right thing to do.
+# See discussion in #1415. This implements option 2 from there, although option 3 would be a reasonable
+# alternative.
+# 3. If the very-next keystroke is Escape, then drop immediately into insert mode.
#
class PostFindMode extends InsertModeBlocker
constructor: (findModeAnchorNode) ->
+ element = document.activeElement
+
super
name: "post-find"
singleton: PostFindMode
+ trapAllKeyboardEvents: element
- element = document.activeElement
return @exit() unless element and findModeAnchorNode
- # Special cases only arise if the active element can take input. So, exit immediately if it cannot not.
+ # Special cases only arise if the active element can take input. So, exit immediately if it cannot.
canTakeInput = DomUtils.isSelectable(element) and DomUtils.isDOMDescendant findModeAnchorNode, element
canTakeInput ||= element.isContentEditable
canTakeInput ||= findModeAnchorNode.parentElement?.isContentEditable
return @exit() unless canTakeInput
+ self = @
@push
keydown: (event) ->
if element == document.activeElement and KeyboardUtils.isEscape event
@@ -38,10 +45,11 @@ class PostFindMode extends InsertModeBlocker
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.
+ # 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 event.target if DomUtils.isDOMDescendant element, event.target
+ new InsertMode element if DomUtils.isDOMDescendant element, event.target
@exit()
root = exports ? window