diff --git a/docs/website/layouts/_default/initializr.html b/docs/website/layouts/_default/initializr.html index 59020568bb..77a9ffc50d 100644 --- a/docs/website/layouts/_default/initializr.html +++ b/docs/website/layouts/_default/initializr.html @@ -212,8 +212,26 @@ } if (frame && loader) { - frame.addEventListener("load", function () { + var loaderHidden = false; + var hideLoader = function () { + if (loaderHidden) { + return; + } + loaderHidden = true; loader.classList.add("done"); + }; + + frame.addEventListener("load", function () { + window.setTimeout(hideLoader, 8000); + }); + + window.addEventListener("message", function (evt) { + if (evt.source !== frame.contentWindow || !evt.data || evt.data.type !== "cn1-initializr-ui-ready") { + return; + } + window.requestAnimationFrame(function () { + hideLoader(); + }); }); } })(); diff --git a/scripts/initializr/common/src/main/java/com/codename1/initializr/Initializr.java b/scripts/initializr/common/src/main/java/com/codename1/initializr/Initializr.java index 538dedf47e..8092772f86 100644 --- a/scripts/initializr/common/src/main/java/com/codename1/initializr/Initializr.java +++ b/scripts/initializr/common/src/main/java/com/codename1/initializr/Initializr.java @@ -150,6 +150,14 @@ public void run() { refresh.run(); initWebsiteThemeSync(form); form.show(); + notifyWebsiteUiReady(); + } + + private void notifyWebsiteUiReady() { + WebsiteThemeNative nativeBridge = NativeLookup.create(WebsiteThemeNative.class); + if (nativeBridge != null && nativeBridge.isSupported()) { + nativeBridge.notifyUiReady(); + } } private Container createLocalizationPanel(boolean[] includeLocalizationBundles, diff --git a/scripts/initializr/common/src/main/java/com/codename1/initializr/WebsiteThemeNative.java b/scripts/initializr/common/src/main/java/com/codename1/initializr/WebsiteThemeNative.java index 29f98d572c..607b4734d3 100644 --- a/scripts/initializr/common/src/main/java/com/codename1/initializr/WebsiteThemeNative.java +++ b/scripts/initializr/common/src/main/java/com/codename1/initializr/WebsiteThemeNative.java @@ -4,4 +4,5 @@ public interface WebsiteThemeNative extends NativeInterface { boolean isDarkMode(); + void notifyUiReady(); } diff --git a/scripts/initializr/javascript/src/main/javascript/com_codename1_initializr_WebsiteThemeNative.js b/scripts/initializr/javascript/src/main/javascript/com_codename1_initializr_WebsiteThemeNative.js index ca1014e911..6aae17d052 100644 --- a/scripts/initializr/javascript/src/main/javascript/com_codename1_initializr_WebsiteThemeNative.js +++ b/scripts/initializr/javascript/src/main/javascript/com_codename1_initializr_WebsiteThemeNative.js @@ -29,6 +29,28 @@ var o = {}; callback.complete(!!dark); }; + + o.notifyUiReady_ = function(callback) { + var sendReady = function() { + try { + if (window.parent && window.parent !== window && window.parent.postMessage) { + window.parent.postMessage({ type: "cn1-initializr-ui-ready" }, "*"); + } + } catch (ignored) { + // Ignore cross-origin or sandbox restrictions. + } + callback.complete(); + }; + + if (window.requestAnimationFrame) { + window.requestAnimationFrame(function() { + window.requestAnimationFrame(sendReady); + }); + } else { + window.setTimeout(sendReady, 48); + } + }; + o.isSupported_ = function(callback) { callback.complete(true); };