Template renderer init update (#1772)

* Update TemplateRendererFrameApi to post a 'ready' message

* Wait for 'ready' message rather than using 'load' event
This commit is contained in:
toasted-nutbread 2021-06-27 18:16:21 -04:00 committed by GitHub
parent 002da9fba8
commit 32d5fccc36
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 7 deletions

View File

@ -27,6 +27,7 @@ class TemplateRendererFrameApi {
prepare() {
window.addEventListener('message', this._onWindowMessage.bind(this), false);
this._postMessage(window.parent, 'ready', {}, null);
}
// Private
@ -52,7 +53,7 @@ class TemplateRendererFrameApi {
}
if (typeof id === 'undefined') { return; }
source.postMessage({action: `${action}.response`, params: response, id}, '*');
this._postMessage(source, `${action}.response`, response, id);
}
_onRender({template, data, type}) {
@ -101,4 +102,8 @@ class TemplateRendererFrameApi {
_clone(value) {
return JSON.parse(JSON.stringify(value));
}
_postMessage(target, action, params, id) {
return target.postMessage({action, params, id}, '*');
}
}

View File

@ -67,31 +67,33 @@ class TemplateRendererProxy {
_loadFrame(frame, url, timeout=5000) {
return new Promise((resolve, reject) => {
let ready = false;
const cleanup = () => {
frame.removeEventListener('load', onLoad, false);
window.removeEventListener('message', onWindowMessage, false);
if (timer !== null) {
clearTimeout(timer);
timer = null;
}
};
const onLoad = () => {
if (!ready) { return; }
const onWindowMessage = (e) => {
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();
};
let timer = setTimeout(() => {
timer = null;
cleanup();
reject(new Error('Timeout'));
}, timeout);
frame.removeAttribute('src');
frame.removeAttribute('srcdoc');
frame.addEventListener('load', onLoad, false);
window.addEventListener('message', onWindowMessage, false);
try {
document.body.appendChild(frame);
ready = true;
frame.contentDocument.location.href = url;
} catch (e) {
cleanup();