aboutsummaryrefslogtreecommitdiffstats
path: root/pages/ui_component_server.coffee
diff options
context:
space:
mode:
authormrmr19932014-12-28 19:41:30 +0000
committermrmr19932014-12-28 19:41:30 +0000
commit020331fd8e120eee1fcb80ad05f7fcde33f3e981 (patch)
treecbb4ac4d997f198659626bc93e8376fa17d72089 /pages/ui_component_server.coffee
parentb26f4aed8585418d18dfc43262070c8c8741e5e3 (diff)
downloadvimium-020331fd8e120eee1fcb80ad05f7fcde33f3e981.tar.bz2
Create a script for connecting UIComponent iframes with their parents
Diffstat (limited to 'pages/ui_component_server.coffee')
-rw-r--r--pages/ui_component_server.coffee41
1 files changed, 41 insertions, 0 deletions
diff --git a/pages/ui_component_server.coffee b/pages/ui_component_server.coffee
new file mode 100644
index 00000000..240233ed
--- /dev/null
+++ b/pages/ui_component_server.coffee
@@ -0,0 +1,41 @@
+# 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
+ UIComponentServer.portOpen event.ports[0]
+ window.removeEventListener "message", currentFunction # Stop listening for message events.
+
+UIComponentServer =
+ ownerPagePort: null
+ messageEventListeners: []
+
+ portOpen: (@ownerPagePort) ->
+ @ownerPagePort.onmessage = (event) => @handleMessage event
+
+ postMessage: (data) -> @ownerPagePort.postMessage data
+
+ # Execute each event listener on the current event until we get a falsy return value.
+ handleMessage: (event) ->
+ for listener in @messageEventListeners
+ retVal = listener.call this, event
+ return false unless retVal
+ true
+
+ addEventListener: (type, listener) ->
+ if type == "message"
+ @messageEventListeners.push listener
+ undefined
+
+ removeEventListener: (type, listener) ->
+ if type == "message"
+ listenerIndex = @messageEventListeners.indexOf listener
+ if listenerIndex > -1
+ @messageEventListeners = @messageEventListeners.splice listenerIndex, 1
+ undefined
+
+root = exports ? window
+root.UIComponentServer = UIComponentServer