aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortoasted-nutbread <toasted-nutbread@users.noreply.github.com>2021-07-10 21:37:37 -0400
committertoasted-nutbread <toasted-nutbread@users.noreply.github.com>2021-07-10 23:19:58 -0400
commit2b2b74d70c8cbe1a48d5ded68aecc73615610818 (patch)
tree9a6da5fd9307011469ee02c0b96b7b3f7616ce84
parenta03ee0fd93d6636d8e4dae9fb9ac3a21bc525862 (diff)
Fix case where "ready" message is received before frame "load" event (#1822)
-rw-r--r--ext/js/templates/template-renderer-proxy.js18
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();