diff --git a/packages/client/src/components/CustomTabComponent.vue b/packages/client/src/components/CustomTabComponent.vue
index 0c6f34b6..375f8abd 100644
--- a/packages/client/src/components/CustomTabComponent.vue
+++ b/packages/client/src/components/CustomTabComponent.vue
@@ -34,7 +34,7 @@ watch(() => tabName.value, () => {
-
+
diff --git a/packages/client/src/components/common/IframeView.vue b/packages/client/src/components/common/IframeView.vue
index 6a04e961..68e8e36c 100644
--- a/packages/client/src/components/common/IframeView.vue
+++ b/packages/client/src/components/common/IframeView.vue
@@ -12,6 +12,11 @@ const props = withDefaults(defineProps<{
inline: false,
})
+const emit = defineEmits<{
+ load: [iframeEl: HTMLIFrameElement]
+ close: [iframeEl: HTMLIFrameElement]
+}>()
+
const { colorMode } = useDevToolsColorMode()
const anchor = ref()
const key = computed(() => props.src)
@@ -27,20 +32,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', () => {
+ emit('load', iframe)
+ })
+ iframe.addEventListener('close', () => {
+ emit('close', 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 f2d8aa1a..044375b3 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 {
diff --git a/packages/vite/src/overlay.js b/packages/vite/src/overlay.js
index 95af450f..59435000 100644
--- a/packages/vite/src/overlay.js
+++ b/packages/vite/src/overlay.js
@@ -30,6 +30,12 @@ addCustomTab({
view: {
type: 'iframe',
src: normalizeUrl(`__inspect/`),
+ onLoad(iframe) {
+ console.log('iframe loaded', iframe)
+ },
+ onClose(iframe) {
+ console.log('iframe closed', iframe)
+ },
},
category: 'advanced',
})