diff options
Diffstat (limited to 'pages')
| -rw-r--r-- | pages/ui_component_server.coffee | 23 | 
1 files changed, 18 insertions, 5 deletions
| diff --git a/pages/ui_component_server.coffee b/pages/ui_component_server.coffee index 8b43095b..4210a60e 100644 --- a/pages/ui_component_server.coffee +++ b/pages/ui_component_server.coffee @@ -1,6 +1,6 @@ -# Fetch the Vimium secret, register the port recieved from the parent window, and stop listening for messages -# on the window object. vimiumSecret is accessible only within the current instantion of Vimium.  So a +# Fetch the Vimium secret, register the port received from the parent window, and stop listening for messages +# on the window object. vimiumSecret is accessible only within the current instance of Vimium.  So a  # malicious host page trying to register its own port can do no better than guessing.  registerPort = (event) ->    chrome.storage.local.get "vimiumSecret", ({vimiumSecret: secret}) -> @@ -15,13 +15,26 @@ UIComponentServer =    handleMessage: null    portOpen: (@ownerPagePort) -> -    @ownerPagePort.onmessage = (event) => -      @handleMessage event if @handleMessage +    @ownerPagePort.onmessage = (event) => @handleMessage? event +    @registerIsReady()    registerHandler: (@handleMessage) ->    postMessage: (message) -> -    @ownerPagePort.postMessage message if @ownerPagePort +    @ownerPagePort?.postMessage message + +  # We require both that the DOM is ready and that the port has been opened before the UI component is ready. +  # These events can happen in either order.  We count them, and notify the content script when we've seen +  # both. +  registerIsReady: do -> +    uiComponentIsReadyCount = +      if document.readyState == "loading" +        window.addEventListener "DOMContentLoaded", -> UIComponentServer.registerIsReady() +        0 +      else +        1 + +    -> @postMessage "uiComponentIsReady" if ++uiComponentIsReadyCount == 2  root = exports ? window  root.UIComponentServer = UIComponentServer | 
