From 3511db5846ef4db6bca087fb4b484a7d48ea1398 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 27 Jul 2020 23:00:14 -0700 Subject: [PATCH] Add polling based loading check for iframe On safari in iframes with scripts disabled, the `DOMContentLoaded` never seems to be fired. Use polling to check if the load has happened instead --- .../contrib/webview/browser/pre/main.js | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index 6d525c43935..630d5d93422 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -496,21 +496,45 @@ newFrame.contentDocument.open(); } - newFrame.contentWindow.addEventListener('DOMContentLoaded', e => { + /** + * @param {Document} contentDocument + */ + function onFrameLoaded(contentDocument) { // Workaround for https://bugs.chromium.org/p/chromium/issues/detail?id=978325 setTimeout(() => { if (host.fakeLoad) { - newFrame.contentDocument.open(); - newFrame.contentDocument.write(newDocument); - newFrame.contentDocument.close(); + contentDocument.open(); + contentDocument.write(newDocument); + contentDocument.close(); hookupOnLoadHandlers(newFrame); } - const contentDocument = e.target ? (/** @type {HTMLDocument} */ (e.target)) : undefined; if (contentDocument) { applyStyles(contentDocument, contentDocument.body); } }, 0); - }); + } + + if (host.fakeLoad) { + // On Safari for iframes with scripts disabled, the `DOMContentLoaded` never seems to be fired. + // Use polling instead. + const interval = setInterval(() => { + // If the frame is no longer mounted, loading has stopped + if (!newFrame.parentElement) { + clearInterval(interval); + return; + } + + if (newFrame.contentDocument.readyState === 'complete') { + clearInterval(interval); + onFrameLoaded(newFrame.contentDocument); + } + }, 10); + } else { + newFrame.contentWindow.addEventListener('DOMContentLoaded', e => { + const contentDocument = e.target ? (/** @type {HTMLDocument} */ (e.target)) : undefined; + onFrameLoaded(contentDocument); + }); + } /** * @param {Document} contentDocument -- GitLab