diff options
author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2021-07-10 21:37:37 -0400 |
---|---|---|
committer | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2021-07-10 23:19:58 -0400 |
commit | 2b2b74d70c8cbe1a48d5ded68aecc73615610818 (patch) | |
tree | 9a6da5fd9307011469ee02c0b96b7b3f7616ce84 | |
parent | a03ee0fd93d6636d8e4dae9fb9ac3a21bc525862 (diff) |
Fix case where "ready" message is received before frame "load" event (#1822)
-rw-r--r-- | ext/js/templates/template-renderer-proxy.js | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/ext/js/templates/template-renderer-proxy.js b/ext/js/templates/template-renderer-proxy.js index b93fdd6b..a1648963 100644 --- a/ext/js/templates/template-renderer-proxy.js +++ b/ext/js/templates/template-renderer-proxy.js @@ -67,20 +67,32 @@ class TemplateRendererProxy { _loadFrame(frame, url, timeout=5000) { return new Promise((resolve, reject) => { + let state = 0x0; // 0x1 = frame added; 0x2 = frame loaded; 0x4 = frame ready const cleanup = () => { + frame.removeEventListener('load', onLoad, false); window.removeEventListener('message', onWindowMessage, false); if (timer !== null) { clearTimeout(timer); timer = null; } }; + const updateState = (flags) => { + state |= flags; + if (state !== 0x7) { return; } + cleanup(); + resolve(); + }; + const onLoad = () => { + if ((state & 0x3) !== 0x1) { return; } + updateState(0x2); + }; const onWindowMessage = (e) => { + if ((state & 0x5) !== 0x1) { return; } const frameWindow = frame.contentWindow; if (frameWindow === null || frameWindow !== e.source) { return; } const {data} = e; if (!(typeof data === 'object' && data !== null && data.action === 'ready')) { return; } - cleanup(); - resolve(); + updateState(0x4); }; let timer = setTimeout(() => { @@ -91,9 +103,11 @@ class TemplateRendererProxy { frame.removeAttribute('src'); frame.removeAttribute('srcdoc'); + frame.addEventListener('load', onLoad, false); window.addEventListener('message', onWindowMessage, false); try { document.body.appendChild(frame); + state = 0x1; frame.contentDocument.location.href = url; } catch (e) { cleanup(); |