Avoid hub iframe overlay on embed shell tab switches.

Use in-shell content loading state instead of parent postMessage so tab changes do not trigger the full instance-frame loading mask.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-24 01:23:40 +08:00
parent 4ad335ca84
commit bced61b9d7
4 changed files with 13 additions and 15 deletions
+2 -2
View File
@@ -6,7 +6,7 @@
<script src="/static/instance_theme.js?v=17"></script> <script src="/static/instance_theme.js?v=17"></script>
<link rel="stylesheet" href="/static/instance_theme_early.css?v=4"> <link rel="stylesheet" href="/static/instance_theme_early.css?v=4">
<link rel="stylesheet" href="/static/account_risk_badge.css?v=3"> <link rel="stylesheet" href="/static/account_risk_badge.css?v=3">
<link rel="stylesheet" href="/static/instance_page.css?v=1"> <link rel="stylesheet" href="/static/instance_page.css?v=2">
<link rel="stylesheet" href="/static/instance_theme.css?v=18"> <link rel="stylesheet" href="/static/instance_theme.css?v=18">
<script src="/static/account_risk_badge.js?v=3"></script> <script src="/static/account_risk_badge.js?v=3"></script>
<meta name="theme-color" content="#0b0d14"> <meta name="theme-color" content="#0b0d14">
@@ -115,6 +115,6 @@
<script src="/static/manual_order_rr_preview.js?v=3"></script> <script src="/static/manual_order_rr_preview.js?v=3"></script>
<script src="/static/key_monitor_form.js?v=1"></script> <script src="/static/key_monitor_form.js?v=1"></script>
{% include 'embed_boot_scripts.html' %} {% include 'embed_boot_scripts.html' %}
<script src="/static/instance_embed.js?v=1"></script> <script src="/static/instance_embed.js?v=2"></script>
</body> </body>
</html> </html>
+1
View File
@@ -3368,6 +3368,7 @@
const d = ev.data; const d = ev.data;
if (!d || typeof d !== "object") return; if (!d || typeof d !== "object") return;
if (d.type === "instance-frame-navigating") { if (d.type === "instance-frame-navigating") {
if (d.embedShellTab) return;
setInstanceFrameNavLoading(true); setInstanceFrameNavLoading(true);
} else if (d.type === "instance-frame-ready") { } else if (d.type === "instance-frame-ready") {
setInstanceFrameNavLoading(false); setInstanceFrameNavLoading(false);
+8 -13
View File
@@ -33,16 +33,9 @@
return ""; return "";
} }
function notifyParentNavStart() { function setRootLoading(on) {
try { const root = document.getElementById("embed-page-root");
window.parent.postMessage({ type: "instance-frame-navigating" }, "*"); if (root) root.classList.toggle("is-embed-tab-loading", !!on);
} catch (_) {}
}
function notifyParentReady() {
try {
window.parent.postMessage({ type: "instance-frame-ready" }, "*");
} catch (_) {}
} }
function setNavActive(tab) { function setNavActive(tab) {
@@ -99,7 +92,7 @@
if (!tab || loadingTab) return; if (!tab || loadingTab) return;
const token = ++navToken; const token = ++navToken;
loadingTab = true; loadingTab = true;
notifyParentNavStart(); setRootLoading(true);
try { try {
const qs = listWindowQueryString(); const qs = listWindowQueryString();
const url = "/api/embed/page/" + encodeURIComponent(tab) + (qs ? "?" + qs : ""); const url = "/api/embed/page/" + encodeURIComponent(tab) + (qs ? "?" + qs : "");
@@ -122,7 +115,7 @@
} finally { } finally {
if (token === navToken) { if (token === navToken) {
loadingTab = false; loadingTab = false;
notifyParentReady(); setRootLoading(false);
} }
} }
} }
@@ -214,7 +207,9 @@
patchHardNavigations(); patchHardNavigations();
bindNav(); bindNav();
runPageInit(getTab()); runPageInit(getTab());
notifyParentReady(); try {
window.parent.postMessage({ type: "instance-frame-ready" }, "*");
} catch (_) {}
} }
global.InstanceEmbed = { global.InstanceEmbed = {
+2
View File
@@ -218,3 +218,5 @@
.stats-period-block:last-child{border-bottom:none;margin-bottom:0;padding-bottom:0} .stats-period-block:last-child{border-bottom:none;margin-bottom:0;padding-bottom:0}
.stats-period-block h3{font-size:1rem;color:#dbe4ff;margin-bottom:4px} .stats-period-block h3{font-size:1rem;color:#dbe4ff;margin-bottom:4px}
.stats-period-block .sub{font-size:.78rem;color:#8892b0;margin-bottom:10px;line-height:1.4} .stats-period-block .sub{font-size:.78rem;color:#8892b0;margin-bottom:10px;line-height:1.4}
#embed-page-root{transition:opacity .12s ease}
#embed-page-root.is-embed-tab-loading{opacity:.55;pointer-events:none}