aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormrmr19932015-05-01 06:26:09 +0100
committermrmr19932015-05-01 07:06:38 +0100
commitf35341f42db93b5fde6712c2bc4bb767f5b9cc07 (patch)
treecf6c7b2a82a653c2db88dff1ef75ae115dde6b8d
parentf5a7f83f06d39bda32883c6c527ae76f16395063 (diff)
downloadvimium-f35341f42db93b5fde6712c2bc4bb767f5b9cc07.tar.bz2
Enter insert mode if an input inside a shadow DOM is focused
This fixes issue #853.
-rw-r--r--content_scripts/mode_insert.coffee18
1 files changed, 18 insertions, 0 deletions
diff --git a/content_scripts/mode_insert.coffee b/content_scripts/mode_insert.coffee
index 7ca2e561..4d68b12d 100644
--- a/content_scripts/mode_insert.coffee
+++ b/content_scripts/mode_insert.coffee
@@ -19,6 +19,9 @@ class InsertMode extends Mode
# the right thing to do for most common use cases. However, it could also cripple flash-based sites and
# games. See discussion in #1211 and #1194.
target.blur()
+ else if target.shadowRoot and @insertModeLock
+ # An editable element in a shadow DOM is focused; blur it.
+ @insertModeLock.blur()
@exit event, event.srcElement
@suppressEvent
@@ -53,6 +56,21 @@ class InsertMode extends Mode
"focus": (event) => @alwaysContinueBubbling =>
if @insertModeLock != event.target and DomUtils.isFocusable event.target
@activateOnElement event.target
+ else if event.target.shadowRoot
+ # A focusable element inside the shadow DOM might have been selected. If so, we can catch the focus
+ # event inside the shadow DOM. This fixes #853.
+ shadowRoot = event.target.shadowRoot
+ eventListeners = {}
+ for type in ["focus", "blur"]
+ eventListeners[type] = do (type) ->
+ (event) ->
+ handlerStack.bubbleEvent type, event
+ if type == "blur"
+ # Unregister the event listeners.
+ for ltype, listener of eventListeners
+ shadowRoot.removeEventListener ltype, listener, true
+
+ shadowRoot.addEventListener type, eventListeners[type], true
# Only for tests. This gives us a hook to test the status of the permanently-installed instance.
InsertMode.permanentInstance = @ if @permanent