aboutsummaryrefslogtreecommitdiffstats
path: root/pages/ui_component_server.coffee
diff options
context:
space:
mode:
authorStephen Blott2014-12-29 14:22:53 +0000
committerStephen Blott2014-12-29 14:35:21 +0000
commit0524bdc3f76279e8930bfe4b1b42d93e0e9bf6e4 (patch)
tree6f01a27708c2ba8c085ef093df58814715441b08 /pages/ui_component_server.coffee
parenta6dc63fd7c49926e6ad32174621b32eeb3fd9283 (diff)
downloadvimium-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.coffee44
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