diff options
| author | mrmr1993 | 2015-05-01 06:26:09 +0100 |
|---|---|---|
| committer | mrmr1993 | 2015-05-01 07:06:38 +0100 |
| commit | f35341f42db93b5fde6712c2bc4bb767f5b9cc07 (patch) | |
| tree | cf6c7b2a82a653c2db88dff1ef75ae115dde6b8d | |
| parent | f5a7f83f06d39bda32883c6c527ae76f16395063 (diff) | |
| download | vimium-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.coffee | 18 |
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 |
