diff options
| -rw-r--r-- | content_scripts/ui_component.coffee | 66 | ||||
| -rw-r--r-- | manifest.json | 1 | 
2 files changed, 67 insertions, 0 deletions
diff --git a/content_scripts/ui_component.coffee b/content_scripts/ui_component.coffee new file mode 100644 index 00000000..c0889e7f --- /dev/null +++ b/content_scripts/ui_component.coffee @@ -0,0 +1,66 @@ +class UIComponent +  iframeElement: null +  iframePort: null +  messageEventListeners: [] +  showStyle: "" +  hideStyle: "" + +  constructor: (iframeUrl, className) -> +    @iframeElement = document.createElement "iframe" +    @iframeElement.className = className +    @iframeElement.seamless = "seamless" +    @iframeElement.src = chrome.runtime.getURL iframeUrl +    @iframeElement.addEventListener "load", => @openPort() +    document.documentElement.appendChild @iframeElement +    @hide() + +  # Open a port and pass it to the iframe via window.postMessage. +  openPort: -> +    messageChannel = new MessageChannel() +    @iframePort = messageChannel.port1 +    @iframePort.onmessage = (event) => @handleMessage event + +    # Get iframeMessageSecret so the iframe can determine that our message isn't the page impersonating us. +    chrome.storage.local.get "iframeMessageSecret", ({iframeMessageSecret: secret}) => +      @iframeElement.contentWindow.postMessage secret, chrome.runtime.getURL(""), [messageChannel.port2] + +  postMessage: (data) -> @iframePort.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 + +  setHideStyle: (@hideStyle) -> +    @hide() if @showing == false + +  setShowStyle: (@showStyle) -> +    @show() if @showing == true + +  show: -> +    return unless @iframeElement? +    @iframeElement.setAttribute "style", @showStyle +    @iframeElement.focus() +    @showing = true + +  hide: -> +    return unless @iframeElement? +    @iframeElement.setAttribute "style", @hideStyle +    @showing = false + +root = exports ? window +root.UIComponent = UIComponent diff --git a/manifest.json b/manifest.json index 3cd88d1e..a92ed0da 100644 --- a/manifest.json +++ b/manifest.json @@ -37,6 +37,7 @@               "lib/dom_utils.js",               "lib/handler_stack.js",               "lib/clipboard.js", +             "content_scripts/ui_component.js",               "content_scripts/link_hints.js",               "content_scripts/vomnibar.js",               "content_scripts/scroller.js",  | 
