From 52b17e1ebf2930b99a2ae27c8300f99fde84c58e Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Thu, 22 May 2025 11:08:33 +0200 Subject: [PATCH 1/4] feat: add onLoad and onClose to iframe custom tab --- .../src/components/common/IframeView.vue | 23 +++++++++++++------ packages/devtools-kit/src/types/tab.ts | 14 +++++++++++ 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/packages/client/src/components/common/IframeView.vue b/packages/client/src/components/common/IframeView.vue index 6a04e961e..2efd1ecde 100644 --- a/packages/client/src/components/common/IframeView.vue +++ b/packages/client/src/components/common/IframeView.vue @@ -8,6 +8,8 @@ const iframeCacheMap = new Map() const props = withDefaults(defineProps<{ src: string inline?: boolean + onLoad?: (iframeEl: HTMLIFrameElement) => void + onClose?: (iframeEl: HTMLIFrameElement) => void }>(), { inline: false, }) @@ -27,20 +29,27 @@ onMounted(() => { iframeLoaded.value = true } else { - iframeEl.value = document.createElement('iframe') - iframeCacheMap.set(key.value, iframeEl.value) - iframeEl.value.src = props.src + const iframe = document.createElement('iframe') + iframeEl.value = iframe + iframeCacheMap.set(key.value, iframe) + iframe.addEventListener('load', () => { + props.onLoad?.(iframe) + }) + iframe.addEventListener('close', () => { + props.onClose?.(iframe) + }) + iframe.src = props.src // CORS try { - iframeEl.value.style.opacity = '0.01' - iframeEl.value.onload = () => { + iframe.style.opacity = '0.01' + iframe.onload = () => { syncColorMode() - iframeEl.value!.style.opacity = '1' + iframe!.style.opacity = '1' iframeLoaded.value = true } } catch (e) { - iframeEl.value.style.opacity = '1' + iframe.style.opacity = '1' } document.body.appendChild(iframeEl.value) diff --git a/packages/devtools-kit/src/types/tab.ts b/packages/devtools-kit/src/types/tab.ts index f2d8aa1ac..044375b38 100644 --- a/packages/devtools-kit/src/types/tab.ts +++ b/packages/devtools-kit/src/types/tab.ts @@ -23,6 +23,20 @@ export interface ModuleIframeView { * @default true */ persistent?: boolean + + /** + * Triggered when the iframe is loaded + * + * @param iframe The iframe element + */ + onLoad?: (iframe: HTMLIFrameElement) => void + + /** + * Triggered when the iframe is closed if {@link persistent} is false + * + * @param iframe The iframe element + */ + onClose?: (iframe: HTMLIFrameElement) => void } export interface ModuleVNodeView { From a02a27bfdebbdc458ed885119687467737248ca6 Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Thu, 22 May 2025 11:25:55 +0200 Subject: [PATCH 2/4] chore: pass the events --- packages/client/src/components/CustomTabComponent.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/components/CustomTabComponent.vue b/packages/client/src/components/CustomTabComponent.vue index 0c6f34b63..375f8abdd 100644 --- a/packages/client/src/components/CustomTabComponent.vue +++ b/packages/client/src/components/CustomTabComponent.vue @@ -34,7 +34,7 @@ watch(() => tabName.value, () => {