diff options
| author | Stephen Blott | 2014-12-29 14:22:53 +0000 | 
|---|---|---|
| committer | Stephen Blott | 2014-12-29 14:35:21 +0000 | 
| commit | 0524bdc3f76279e8930bfe4b1b42d93e0e9bf6e4 (patch) | |
| tree | 6f01a27708c2ba8c085ef093df58814715441b08 /pages/ui_component_server.coffee | |
| parent | a6dc63fd7c49926e6ad32174621b32eeb3fd9283 (diff) | |
| download | vimium-0524bdc3f76279e8930bfe4b1b42d93e0e9bf6e4.tar.bz2 | |
Refactor UIComponent, etc., and demo.
- Simplify component API.
- Iframe flashes on re-focus.
- Probably some other stuff which I've forgotten.
Diffstat (limited to 'pages/ui_component_server.coffee')
| -rw-r--r-- | pages/ui_component_server.coffee | 44 | 
1 files changed, 15 insertions, 29 deletions
| diff --git a/pages/ui_component_server.coffee b/pages/ui_component_server.coffee index ccbb9e2b..8b43095b 100644 --- a/pages/ui_component_server.coffee +++ b/pages/ui_component_server.coffee @@ -1,41 +1,27 @@ -# Register the port recieved from the parent window, and stop listening for messages on the window object. -window.addEventListener "message", (event) -> -  return unless event.source == window.parent -  currentFunction = arguments.callee -  # Check event.data against iframeMessageSecret so we can determine that this message hasn't been spoofed. -  chrome.storage.local.get "iframeMessageSecret", ({iframeMessageSecret: secret}) -> -    return unless event.data == secret +# 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 +# malicious host page trying to register its own port can do no better than guessing. +registerPort = (event) -> +  chrome.storage.local.get "vimiumSecret", ({vimiumSecret: secret}) -> +    return unless event.source == window.parent and event.data == secret      UIComponentServer.portOpen event.ports[0] -    window.removeEventListener "message", currentFunction # Stop listening for message events. +    window.removeEventListener "message", registerPort + +window.addEventListener "message", registerPort  UIComponentServer =    ownerPagePort: null -  messageEventListeners: [] -  exitOnEsc: true +  handleMessage: null    portOpen: (@ownerPagePort) -> -    @ownerPagePort.onmessage = (event) => @handleMessage event - -  postMessage: (message) -> @ownerPagePort.postMessage message - -  # Execute each event listener on the current event until we get a non-null falsy return value. -  handleMessage: (event) -> -    for listener in @messageEventListeners -      retVal = listener.call this, event -      retVal ?= true -      return false unless retVal -    true +    @ownerPagePort.onmessage = (event) => +      @handleMessage event if @handleMessage -  addEventListener: (type, listener) -> -    if type == "message" -      @messageEventListeners.push listener -    undefined +  registerHandler: (@handleMessage) -> -  removeEventListener: (type, listener) -> -    if type == "message" -      @messageEventListeners = @messageEventListeners.filter (f) -> f != listener -    undefined +  postMessage: (message) -> +    @ownerPagePort.postMessage message if @ownerPagePort  root = exports ? window  root.UIComponentServer = UIComponentServer | 
