diff options
| author | Stephen Blott | 2016-04-17 11:13:27 +0100 |
|---|---|---|
| committer | Stephen Blott | 2016-04-17 11:43:18 +0100 |
| commit | d43f18bd5ce7c39e8e663a657027b233707e2926 (patch) | |
| tree | 6f2dd003f5f17f3eae9921da24d1c11cd84ba9ee | |
| parent | 025b7f930205e9dfbae5f2dff5c7c1fd4a45e4c1 (diff) | |
| download | vimium-d43f18bd5ce7c39e8e663a657027b233707e2926.tar.bz2 | |
More code review of UI-component focus handling.
| -rw-r--r-- | content_scripts/ui_component.coffee | 33 | ||||
| -rw-r--r-- | content_scripts/vimium_frontend.coffee | 10 | ||||
| -rw-r--r-- | pages/help_dialog.coffee | 2 |
3 files changed, 21 insertions, 24 deletions
diff --git a/content_scripts/ui_component.coffee b/content_scripts/ui_component.coffee index 7792bfba..0989bbc9 100644 --- a/content_scripts/ui_component.coffee +++ b/content_scripts/ui_component.coffee @@ -8,6 +8,10 @@ class UIComponent shadowDOM: null styleSheetGetter: null + toggleIframeElementClasses: (removeClass, addClass) -> + @iframeElement.classList.remove removeClass + @iframeElement.classList.add addClass + constructor: (iframeUrl, className, @handleMessage) -> styleSheet = DomUtils.createElement "style" styleSheet.type = "text/css" @@ -28,8 +32,7 @@ class UIComponent @shadowDOM = shadowWrapper.createShadowRoot?() ? shadowWrapper @shadowDOM.appendChild styleSheet @shadowDOM.appendChild @iframeElement - @iframeElement.classList.remove "vimiumUIComponentVisible" - @iframeElement.classList.add "vimiumUIComponentHidden" + @toggleIframeElementClasses "vimiumUIComponentVisible", "vimiumUIComponentHidden" # Open a port and pass it to the iframe via window.postMessage. We use an AsyncDataFetcher to handle # requests which arrive before the iframe (and its message handlers) have completed initialization. See @@ -45,7 +48,6 @@ class UIComponent chrome.storage.local.get "vimiumSecret", ({ vimiumSecret }) => { port1, port2 } = new MessageChannel @iframeElement.contentWindow.postMessage vimiumSecret, chrome.runtime.getURL(""), [ port2 ] - port1.onmessage = (event) => switch event?.data?.name ? event?.data when "uiComponentIsReady" @@ -54,16 +56,14 @@ class UIComponent if name == "frameFocused" and @options?.focus and focusFrameId not in [frameId, @iframeFrameId] @hide false false # We will not be calling sendResponse. - # If this frame receives the focus, then hide the UI component. window.addEventListener "focus", (event) => if event.target == window and @options?.focus and not @options?.allowBlur @hide false true # Continue propagating the event. - + # Register the UI component as ready and post its iframe port. @uiComponentIsReady = true setIframePort port1 - when "setIframeFrameId" then @iframeFrameId = event.data.iframeFrameId when "hide" then @hide() else @handleMessage event @@ -76,24 +76,23 @@ class UIComponent activate: (@options = null) -> @postMessage @options, => - @iframeElement.classList.remove "vimiumUIComponentHidden" - @iframeElement.classList.add "vimiumUIComponentVisible" + @toggleIframeElementClasses "vimiumUIComponentHidden", "vimiumUIComponentVisible" @iframeElement.focus() if @options?.focus @showing = true hide: (shouldRefocusOriginalFrame = true) -> if @showing @showing = false - @iframeElement.classList.remove "vimiumUIComponentVisible" - @iframeElement.classList.add "vimiumUIComponentHidden" - if @options?.focus and shouldRefocusOriginalFrame + @toggleIframeElementClasses "vimiumUIComponentVisible", "vimiumUIComponentHidden" + if @options?.focus @iframeElement.blur() - if @options?.sourceFrameId? - chrome.runtime.sendMessage - handler: "sendMessageToFrames", - message: name: "focusFrame", frameId: @options.sourceFrameId, forceFocusThisFrame: true - else - window.focus() + if shouldRefocusOriginalFrame + if @options?.sourceFrameId? + chrome.runtime.sendMessage + handler: "sendMessageToFrames", + message: name: "focusFrame", frameId: @options.sourceFrameId, forceFocusThisFrame: true + else + window.focus() @options = null @postMessage "hidden" # Inform the UI component that it is hidden. diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index 3c429115..7d6fa9a0 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -159,8 +159,7 @@ initializePreDomReady = -> getScrollPosition: (ignoredA, ignoredB, sendResponse) -> sendResponse scrollX: window.scrollX, scrollY: window.scrollY if frameId == 0 setScrollPosition: setScrollPosition - # A frame has received the focus. We don't care here (UI components handle this). - frameFocused: -> + frameFocused: -> # A frame has received the focus; we don't care here (UI components handle this). checkEnabledAfterURLChange: checkEnabledAfterURLChange runInTopFrame: ({sourceFrameId, registryEntry}) -> Utils.invokeCommandString registryEntry.command, sourceFrameId, registryEntry if DomUtils.isTopFrame() @@ -291,10 +290,9 @@ DomUtils.documentReady -> # focusThisFrame = (request) -> unless request.forceFocusThisFrame - skipThisFrame = DomUtils.windowIsTooSmall() # Frame is too small; see #1317. - skipThisFrame ||= document.body?.tagName.toLowerCase() == "frameset" - if skipThisFrame - # Cancel and tell the background page to focus the next frame instead. + if DomUtils.windowIsTooSmall() or document.body?.tagName.toLowerCase() == "frameset" + # This frame is too small to focus or it's a frameset. Cancel and tell the background page to focus the + # next frame instead. This affects sites like Google Inbox, which have many tiny iframes. See #1317. chrome.runtime.sendMessage handler: "nextFrame" return window.focus() diff --git a/pages/help_dialog.coffee b/pages/help_dialog.coffee index 111ef73e..990fa063 100644 --- a/pages/help_dialog.coffee +++ b/pages/help_dialog.coffee @@ -74,7 +74,7 @@ UIComponentServer.registerHandler (event) -> HelpDialog.show event.data Frame.postMessage "registerFrame" when "hidden" - # Unregister the frame, so that it's not available for `gf` or linkk hints. + # Unregister the frame, so that it's not available for `gf` or link hints. Frame.postMessage "unregisterFrame" root = exports ? window |
