aboutsummaryrefslogtreecommitdiffstats
path: root/content_scripts/ui_component.coffee
diff options
context:
space:
mode:
authorStephen Blott2015-05-26 07:19:52 +0100
committerStephen Blott2015-05-26 07:19:52 +0100
commit6b49dd27cb20ef5f830b1107b39480201796885d (patch)
treee455d1fc3c2c5ef0fb6ea289c48dc8b63a5d521e /content_scripts/ui_component.coffee
parent8b57d179a1655dbce081b321445f34a4aad696f4 (diff)
downloadvimium-6b49dd27cb20ef5f830b1107b39480201796885d.tar.bz2
Refactor to avoid potential race condition.
I haven't seen this happen, but... It could be possible for the iframe's contents to load before this callback is called (on nextTick), in which case the "load" callback wouldn't be called. So we delay setting the iframe's source until nextTick has elapsed.
Diffstat (limited to 'content_scripts/ui_component.coffee')
-rw-r--r--content_scripts/ui_component.coffee6
1 files changed, 4 insertions, 2 deletions
diff --git a/content_scripts/ui_component.coffee b/content_scripts/ui_component.coffee
index 24982fa7..4e26f26a 100644
--- a/content_scripts/ui_component.coffee
+++ b/content_scripts/ui_component.coffee
@@ -15,7 +15,6 @@ class UIComponent
extend @iframeElement,
className: className
seamless: "seamless"
- src: chrome.runtime.getURL iframeUrl
shadowWrapper = document.createElement "div"
# PhantomJS doesn't support createShadowRoot, so guard against its non-existance.
@shadowDOM = shadowWrapper.createShadowRoot?() ? shadowWrapper
@@ -28,9 +27,12 @@ class UIComponent
@hide false
# Open a port and pass it to the iframe via window.postMessage. We use an AsyncDataFetcher to handle
- # requests which arrive before the frame (and its message handlers) have completed initialization. See
+ # requests which arrive before the iframe (and its message handlers) have completed initialization. See
# #1679.
@iframePort = new AsyncDataFetcher (setIframePort) =>
+ # We set the iframe source here (and not above) to avoid a potential race condition vis-a-vis the "load"
+ # event (because this callback runs on "nextTick").
+ @iframeElement.src = chrome.runtime.getURL iframeUrl
@iframeElement.addEventListener "load", =>
# Get vimiumSecret so the iframe can determine that our message isn't the page impersonating us.
chrome.storage.local.get "vimiumSecret", ({ vimiumSecret }) =>