diff options
| author | Stephen Blott | 2016-03-14 11:42:27 +0000 | 
|---|---|---|
| committer | Stephen Blott | 2016-03-17 11:17:03 +0000 | 
| commit | 8be6acd660be212926bff495c8e8f83d3f5917be (patch) | |
| tree | 1d116650666191d8afb0966552adb81557f47a1b | |
| parent | 6653fa0e588d9fb777b627c947b377fa0518bfc8 (diff) | |
| download | vimium-8be6acd660be212926bff495c8e8f83d3f5917be.tar.bz2 | |
Use Chrome frameIds.
| -rw-r--r-- | background_scripts/main.coffee | 31 | ||||
| -rw-r--r-- | content_scripts/vimium_frontend.coffee | 37 | ||||
| -rw-r--r-- | tests/dom_tests/dom_tests.coffee | 1 | 
3 files changed, 34 insertions, 35 deletions
| diff --git a/background_scripts/main.coffee b/background_scripts/main.coffee index 2e0330ee..6fddb6e3 100644 --- a/background_scripts/main.coffee +++ b/background_scripts/main.coffee @@ -76,7 +76,7 @@ chrome.runtime.onConnect.addListener (port, name) ->        toCall.call()    if (portHandlers[port.name]) -    port.onMessage.addListener portHandlers[port.name] sender +    port.onMessage.addListener portHandlers[port.name] sender, port  chrome.runtime.onMessage.addListener((request, sender, sendResponse) ->    if (sendRequestHandlers[request.handler]) @@ -378,31 +378,28 @@ openOptionsPageInNewTab = ->      chrome.tabs.create({ url: chrome.runtime.getURL("pages/options.html"), index: tab.index + 1 }))  Frames = -  onConnect: (sender) -> -    (request, port) => -      this[request.handler] request, sender, port +  onConnect: (sender, port) -> +    [tabId, frameId] = [sender.tab.id, sender.frameId] +    (frameIdsForTab[tabId] ?= []).push frameId +    port.postMessage name: "registerFrameId", chromeFrameId: frameId -  registerFrame: (request, sender, port) -> -    (frameIdsForTab[sender.tab.id] ?= []).push request.frameId - -    [tabId, frameId, isTopFrame] = [sender.tab.id, request.frameId, request.isTopFrame]      port.onDisconnect.addListener -> -      if isTopFrame +      if frameId == 0 # This is the top frame in the tab.          delete frameIdsForTab[tabId]        else          if tabId of frameIdsForTab            frameIdsForTab[tabId] = frameIdsForTab[tabId].filter (fId) -> fId != frameId +          # Sub-frames can connect before the top frame; so we can't rely on seeing the top frame at all. +          delete frameIdsForTab[tabId] if frameIdsForTab[tabId].length == 0  handleFrameFocused = (request, sender) -> -  tabId = sender.tab.id -  # Cycle frameIdsForTab to the focused frame.  However, also ensure that we don't inadvertently register a -  # frame which wasn't previously registered (such as a frameset). -  if frameIdsForTab[tabId]? -    frameIdsForTab[tabId] = cycleToFrame frameIdsForTab[tabId], request.frameId +  [tabId, frameId] = [sender.tab.id, sender.frameId] +  # This might be the first time we've heard from this tab. +  frameIdsForTab[tabId] ?= [] +  # Cycle frameIdsForTab to the focused frame. +  frameIdsForTab[tabId] = cycleToFrame frameIdsForTab[tabId], frameId    # Inform all frames that a frame has received the focus. -  chrome.tabs.sendMessage sender.tab.id, -    name: "frameFocused" -    focusFrameId: request.frameId +  chrome.tabs.sendMessage tabId, name: "frameFocused", focusFrameId: frameId  # Rotate through frames to the frame count places after frameId.  cycleToFrame = (frames, frameId, count = 0) -> diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index c948f843..ce01695a 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -30,10 +30,8 @@ textInputXPath = (->    DomUtils.makeXPath(inputElements)  )() -# -# Give this frame a unique (non-zero) id. -# -frameId = 1 + Math.floor(Math.random()*999999999) +# This is set by Frame.registerFrameId(). A frameId of 0 indicates that this is the top frame in the tab. +frameId = null  # For debugging only. This logs to the console on the background page.  bgLog = (args...) -> @@ -170,7 +168,7 @@ initializePreDomReady = ->  # Wrapper to install event listeners.  Syntactic sugar.  installListener = (element, event, callback) ->    element.addEventListener(event, -> -    if isEnabledForUrl then callback.apply(this, arguments) else true +    if isEnabledForUrl and frameId? then callback.apply(this, arguments) else true    , true)  # @@ -209,18 +207,20 @@ onFocus = (event) ->  window.addEventListener "focus", onFocus  window.addEventListener "hashchange", onFocus -# -# Initialization tasks that must wait for the document to be ready. -# -initializeOnDomReady = -> -  # Tell the background page we're in the dom ready state. -  port = chrome.runtime.connect name: "domReady" -  port.postMessage handler: "registerFrame", frameId: frameId, isTopFrame: DomUtils.isTopFrame() -  port.onDisconnect.addListener -> -    # We disable content scripts when we lose contact with the background page. -    isEnabledForUrl = false -    chrome.runtime.sendMessage = -> -    window.removeEventListener "focus", onFocus +Frame = +  port: null + +  init: -> +    # Tell the background page we're in the domReady state. +    @port = chrome.runtime.connect name: "domReady" +    @port.onMessage.addListener (request) => this[request.name] request +    @port.onDisconnect.addListener -> +      # We disable content scripts when we lose contact with the background page. +      isEnabledForUrl = false +      chrome.runtime.sendMessage = -> +      window.removeEventListener "focus", onFocus + +  registerFrameId: ({chromeFrameId}) -> frameId = window.frameId = chromeFrameId  handleShowHUDforDuration = ({ text, duration }) ->    if DomUtils.isTopFrame() @@ -649,10 +649,11 @@ window.HelpDialog ?=      if @showing then @hide() else @show html  initializePreDomReady() -DomUtils.documentReady initializeOnDomReady +DomUtils.documentReady Frame.init.bind Frame  root = exports ? window  root.handlerStack = handlerStack  root.frameId = frameId +root.Frame = Frame  root.windowIsFocused = windowIsFocused  root.bgLog = bgLog diff --git a/tests/dom_tests/dom_tests.coffee b/tests/dom_tests/dom_tests.coffee index c58d75d6..53e76fc3 100644 --- a/tests/dom_tests/dom_tests.coffee +++ b/tests/dom_tests/dom_tests.coffee @@ -2,6 +2,7 @@  # Install frontend event handlers.  installListeners()  HUD.init() +Frame.registerFrameId chromeFrameId: 0  installListener = (element, event, callback) ->    element.addEventListener event, (-> callback.apply(this, arguments)), true | 
