@open-iframe-resizer/core 1.0.0-rc1 → 1.0.0-rc4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE.md ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012-2024 Scott Chacon and others
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,18 @@
1
+ # Open Iframe Resizer
2
+
3
+ ## Overview
4
+
5
+ `iframe-resizer` is a modern, lightweight library for resizing iframes dynamically. It is shipped under the MIT license, making it usable in commercial projects.
6
+
7
+ ## Getting Started
8
+
9
+ ### Browser
10
+ #### ES6 Modules
11
+
12
+ ```html
13
+ <script type="module">
14
+ import { initialize } from "/dist/index.js";
15
+
16
+ initialize({}, "#iframe-id");
17
+ </script>
18
+ ```
package/dist/index.js CHANGED
@@ -109,4 +109,3 @@ export {
109
109
  S as initialize,
110
110
  R as initializeChildListener
111
111
  };
112
- //# sourceMappingURL=index.js.map
@@ -1,2 +1 @@
1
1
  (function(o,d){typeof exports=="object"&&typeof module<"u"?d(exports):typeof define=="function"&&define.amd?define(["exports"],d):(o=typeof globalThis<"u"?globalThis:o||self,d(o.iframeResizer={}))})(this,function(o){"use strict";const d=()=>window&&window.self!==window.top,f=e=>e instanceof HTMLIFrameElement,y=()=>({offsetSize:0,checkOrigin:!0}),O=e=>{try{return new URL(e.src,window.location.origin).origin===window.location.origin}catch{return!1}};function m(e,i){let n;return(...t)=>{clearTimeout(n),n=setTimeout(()=>e.apply(void 0,t),i)}}const g=S(),l=[],z=(e,i)=>{const n={...y(),...e},t=p(i),r=v(n,t);return t.map(a=>{const s=l.push({iframe:a,settings:n}),c=E(a,n,r);return{unsubscribe:()=>{c(),l.splice(s-1,1)}}})};function p(e){return typeof e=="string"?Array.from(document.querySelectorAll(e)).filter(f):e?f(e)?[e]:[]:Array.from(document.getElementsByTagName("iframe"))}function v(e,i){if(Array.isArray(e.checkOrigin))return e.checkOrigin;if(!e.checkOrigin)return[];const n=[];for(const t of i){const r=L(t);r&&n.push(r)}return n}function L(e){try{const i=new URL(e.src).origin;if(i!=="about:blank")return i}catch{}return null}function E(e,i,n){return O(e)?I(e):R(e,i,n)}function R(e,i,n){const t=r=>{var s;if((!i.checkOrigin||n.includes(r.origin))&&((s=r.data)==null?void 0:s.type)==="iframe-resized"&&e.contentWindow===r.source){const{width:c,height:u}=r.data;h({width:c,height:u,iframe:e,settings:i})}};return window.addEventListener("message",t,!1),()=>window.removeEventListener("message",t,!1)}function I(e){const i=()=>{var t;const n=(t=e.contentDocument)==null?void 0:t.body;if(!n){console.error("Unable to observe the iframe content document body");return}g.observe(n)};return e.addEventListener("load",i),()=>{var n;(n=e.contentDocument)!=null&&n.body&&g.unobserve(e.contentDocument.body),e.removeEventListener("load",i)}}function S(){const e=({target:n})=>{var u;const t=l.find(k=>{var w;return((w=k.iframe.contentDocument)==null?void 0:w.body)===n});if(!t)return;const{iframe:r,settings:a}=t,{scrollHeight:s,scrollWidth:c}=((u=r.contentDocument)==null?void 0:u.documentElement)??{};s!==void 0&&c!==void 0&&h({width:c,height:s,iframe:r,settings:a})},i=m(n=>n.forEach(e),10);return new ResizeObserver(i)}function h({width:e,height:i,iframe:n,settings:t}){n.style.width=`${e}px`,n.style.height=`${i+t.offsetSize}px`}d()&&b();function b(){window.addEventListener("load",()=>{const e=m(()=>{const n={type:"iframe-resized",width:document.documentElement.scrollWidth,height:document.documentElement.scrollHeight};window.parent.postMessage(n,"*")},10);new ResizeObserver(e).observe(document.body)})}o.initialize=z,o.initializeChildListener=b,Object.defineProperty(o,Symbol.toStringTag,{value:"Module"})});
2
- //# sourceMappingURL=index.umd.cjs.map
package/package.json CHANGED
@@ -1,18 +1,17 @@
1
1
  {
2
2
  "name": "@open-iframe-resizer/core",
3
3
  "private": false,
4
- "version": "1.0.0-rc1",
5
- "description": "An open iframe resizer library",
4
+ "version": "1.0.0-rc4",
5
+ "description": "Open-source modern iframe resizer",
6
6
  "license": "MIT",
7
- "keywords": [
8
- "iframe-resizer",
9
- "iframe",
10
- "resize"
11
- ],
12
7
  "repository": {
13
8
  "type": "git",
14
9
  "url": "git+https://github.com/Lemick/open-iframe-resizer.git"
15
10
  },
11
+ "engines": {
12
+ "node": ">=20.0.0"
13
+ },
14
+ "keywords": ["iframe", "Resizing", "Resizer", "resize", "cross", "same", "domain", "width", "height", "responsive"],
16
15
  "type": "module",
17
16
  "main": "./dist/index.cjs",
18
17
  "module": "./dist/index.js",
@@ -24,9 +23,7 @@
24
23
  "require": "./dist/index.cjs"
25
24
  }
26
25
  },
27
- "files": [
28
- "dist"
29
- ],
26
+ "files": ["dist", "README.md", "LICENSE.md"],
30
27
  "scripts": {
31
28
  "docs": "npm run typedoc",
32
29
  "lint": "biome lint ./src",
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../src/common.ts","../src/parent.ts","../src/child.ts"],"sourcesContent":["import type { Settings } from \"~/type\";\n\nconst isInIframe = () => window && window.self !== window.top;\n\nconst isSameOriginIframe = (iframe: HTMLIFrameElement): iframe is HTMLIFrameElement & { contentDocument: Document } => !!iframe.contentDocument;\n\nconst isHtmlIframeElement = (element: Element): element is HTMLIFrameElement => element instanceof HTMLIFrameElement;\n\nconst deferWhenDomContentIsLoaded = (document: Document, executable: () => void) => {\n\tdocument.readyState === \"loading\" ? document.addEventListener(\"DOMContentLoaded\", executable) : executable();\n};\n\nconst deferWhenPageIsLoaded = (document: Document, executable: () => void) => {\n\tdocument.readyState !== \"complete\" ? document.addEventListener(\"load\", executable) : executable();\n};\n\nconst getDefaultSettings: () => Settings = () => ({ offsetSize: 0, checkOrigin: true });\n\nconst isIframeSameOrigin = (iframe: HTMLIFrameElement) => {\n\ttry {\n\t\tconst iframeSrc = new URL(iframe.src, window.location.origin);\n\t\treturn iframeSrc.origin === window.location.origin;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n\n// biome-ignore lint/suspicious/noExplicitAny:\nfunction debounce<T extends (...args: any[]) => any>(f: T, delay: number) {\n\tlet timer: NodeJS.Timeout;\n\treturn (...args: unknown[]) => {\n\t\tclearTimeout(timer);\n\t\ttimer = setTimeout(() => f.apply(undefined, args), delay);\n\t};\n}\n\nexport {\n\tisInIframe,\n\tisSameOriginIframe,\n\tdeferWhenDomContentIsLoaded,\n\tisHtmlIframeElement,\n\tdeferWhenPageIsLoaded,\n\tisIframeSameOrigin,\n\tdebounce,\n\tgetDefaultSettings,\n};\n","import { debounce, getDefaultSettings, isHtmlIframeElement, isIframeSameOrigin } from \"~/common\";\nimport type { IframeResizeEvent, InitializeFunction, Settings } from \"./type\";\n\nconst resizeObserver = createResizeObserver();\nconst registeredIframes: Array<{ iframe: HTMLIFrameElement; settings: Settings }> = [];\n\nconst initialize: InitializeFunction = (clientSettings, selector) => {\n\tconst finalSettings = { ...getDefaultSettings(), ...clientSettings };\n\tconst iframes = resolveIframesToRegister(selector);\n\tconst allowedOrigins = registerIframesAllowOrigins(finalSettings, iframes);\n\n\treturn iframes.map((iframe) => {\n\t\tconst length = registeredIframes.push({ iframe, settings: finalSettings });\n\t\tconst unsubscribeResizeListener = addChildResizeListener(iframe, finalSettings, allowedOrigins);\n\t\treturn {\n\t\t\tunsubscribe: () => {\n\t\t\t\tunsubscribeResizeListener();\n\t\t\t\tregisteredIframes.splice(length - 1, 1);\n\t\t\t},\n\t\t};\n\t});\n};\n\nfunction resolveIframesToRegister(selector?: string | HTMLIFrameElement): HTMLIFrameElement[] {\n\tif (typeof selector === \"string\") {\n\t\treturn Array.from(document.querySelectorAll<HTMLElement>(selector)).filter(isHtmlIframeElement);\n\t}\n\tif (selector) {\n\t\treturn isHtmlIframeElement(selector) ? [selector] : [];\n\t}\n\treturn Array.from(document.getElementsByTagName(\"iframe\"));\n}\n\nfunction registerIframesAllowOrigins(settings: Settings, iframes: HTMLIFrameElement[]) {\n\tif (Array.isArray(settings.checkOrigin)) {\n\t\treturn settings.checkOrigin;\n\t}\n\n\tif (!settings.checkOrigin) {\n\t\treturn [];\n\t}\n\n\tconst allowedOrigins: string[] = [];\n\tfor (const iframe of iframes) {\n\t\tconst origin = extractIframeOrigin(iframe);\n\t\tif (origin) {\n\t\t\tallowedOrigins.push(origin);\n\t\t}\n\t}\n\treturn allowedOrigins;\n}\n\nfunction extractIframeOrigin(iframe: HTMLIFrameElement): string | null {\n\ttry {\n\t\tconst origin = new URL(iframe.src).origin;\n\t\tif (origin !== \"about:blank\") {\n\t\t\treturn origin;\n\t\t}\n\t} catch (error) {}\n\treturn null;\n}\n\nfunction addChildResizeListener(iframe: HTMLIFrameElement, settings: Settings, allowedOrigins: string[]) {\n\tif (isIframeSameOrigin(iframe)) {\n\t\treturn addSameOriginChildResizeListener(iframe);\n\t}\n\treturn addCrossOriginChildResizeListener(iframe, settings, allowedOrigins);\n}\n\nfunction addCrossOriginChildResizeListener(iframe: HTMLIFrameElement, settings: Settings, allowedOrigins: string[]) {\n\tconst handleIframeResizedMessage = (event: MessageEvent) => {\n\t\tconst isOriginValid = !settings.checkOrigin || allowedOrigins.includes(event.origin);\n\n\t\tif (isOriginValid && event.data?.type === \"iframe-resized\" && iframe.contentWindow === event.source) {\n\t\t\tconst { width, height } = (event as IframeResizeEvent).data;\n\t\t\tupdateIframeDimensions({ width, height, iframe, settings });\n\t\t}\n\t};\n\n\twindow.addEventListener(\"message\", handleIframeResizedMessage, false);\n\n\treturn () => window.removeEventListener(\"message\", handleIframeResizedMessage, false);\n}\n\nfunction addSameOriginChildResizeListener(iframe: HTMLIFrameElement) {\n\tconst startListener = () => {\n\t\tconst contentBody = iframe.contentDocument?.body;\n\n\t\tif (!contentBody) {\n\t\t\tconsole.error(\"Unable to observe the iframe content document body\");\n\t\t\treturn;\n\t\t}\n\n\t\tresizeObserver.observe(contentBody);\n\t};\n\n\tiframe.addEventListener(\"load\", startListener);\n\n\treturn () => {\n\t\tif (iframe.contentDocument?.body) {\n\t\t\tresizeObserver.unobserve(iframe.contentDocument.body);\n\t\t}\n\t\tiframe.removeEventListener(\"load\", startListener);\n\t};\n}\n\nfunction createResizeObserver() {\n\tconst handleEntry = ({ target }: ResizeObserverEntry) => {\n\t\tconst matchingRegisteredIframe = registeredIframes.find((value) => value.iframe.contentDocument?.body === target);\n\t\tif (!matchingRegisteredIframe) {\n\t\t\treturn;\n\t\t}\n\t\tconst { iframe, settings } = matchingRegisteredIframe;\n\t\tconst { scrollHeight, scrollWidth } = iframe.contentDocument?.documentElement ?? {};\n\t\tif (scrollHeight !== undefined && scrollWidth !== undefined) {\n\t\t\tupdateIframeDimensions({ width: scrollWidth, height: scrollHeight, iframe, settings });\n\t\t}\n\t};\n\n\tconst resizeObserverCallback = debounce<ResizeObserverCallback>((entries) => entries.forEach(handleEntry), 10);\n\treturn new ResizeObserver(resizeObserverCallback);\n}\n\nfunction updateIframeDimensions({ width, height, iframe, settings }: { iframe: HTMLIFrameElement; width: number; height: number; settings: Settings }) {\n\tiframe.style.width = `${width}px`;\n\tiframe.style.height = `${height + settings.offsetSize}px`;\n}\n\nexport { initialize };\n","import { debounce, isInIframe } from \"~/common\";\nimport type { IframeResizeEventData } from \"./type\";\n\nif (isInIframe()) {\n\tinitializeChildListener();\n}\n\nfunction initializeChildListener() {\n\twindow.addEventListener(\"load\", () => {\n\t\tconst resizeObserverCallback = debounce<ResizeObserverCallback>(() => {\n\t\t\tconst data: IframeResizeEventData = {\n\t\t\t\ttype: \"iframe-resized\",\n\t\t\t\twidth: document.documentElement.scrollWidth,\n\t\t\t\theight: document.documentElement.scrollHeight,\n\t\t\t};\n\t\t\twindow.parent.postMessage(data, \"*\");\n\t\t}, 10);\n\n\t\tconst resizeObserver = new ResizeObserver(resizeObserverCallback);\n\t\tresizeObserver.observe(document.body);\n\t});\n}\n\nexport { initializeChildListener };\n"],"names":["isInIframe","isHtmlIframeElement","element","getDefaultSettings","isIframeSameOrigin","iframe","debounce","f","delay","timer","args","resizeObserver","createResizeObserver","registeredIframes","initialize","clientSettings","selector","finalSettings","iframes","resolveIframesToRegister","allowedOrigins","registerIframesAllowOrigins","length","unsubscribeResizeListener","addChildResizeListener","settings","origin","extractIframeOrigin","addSameOriginChildResizeListener","addCrossOriginChildResizeListener","handleIframeResizedMessage","event","_a","width","height","updateIframeDimensions","startListener","contentBody","handleEntry","target","matchingRegisteredIframe","value","scrollHeight","scrollWidth","resizeObserverCallback","entries","initializeChildListener","data"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.umd.cjs","sources":["../src/common.ts","../src/parent.ts","../src/child.ts"],"sourcesContent":["import type { Settings } from \"~/type\";\n\nconst isInIframe = () => window && window.self !== window.top;\n\nconst isSameOriginIframe = (iframe: HTMLIFrameElement): iframe is HTMLIFrameElement & { contentDocument: Document } => !!iframe.contentDocument;\n\nconst isHtmlIframeElement = (element: Element): element is HTMLIFrameElement => element instanceof HTMLIFrameElement;\n\nconst deferWhenDomContentIsLoaded = (document: Document, executable: () => void) => {\n\tdocument.readyState === \"loading\" ? document.addEventListener(\"DOMContentLoaded\", executable) : executable();\n};\n\nconst deferWhenPageIsLoaded = (document: Document, executable: () => void) => {\n\tdocument.readyState !== \"complete\" ? document.addEventListener(\"load\", executable) : executable();\n};\n\nconst getDefaultSettings: () => Settings = () => ({ offsetSize: 0, checkOrigin: true });\n\nconst isIframeSameOrigin = (iframe: HTMLIFrameElement) => {\n\ttry {\n\t\tconst iframeSrc = new URL(iframe.src, window.location.origin);\n\t\treturn iframeSrc.origin === window.location.origin;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\n\n// biome-ignore lint/suspicious/noExplicitAny:\nfunction debounce<T extends (...args: any[]) => any>(f: T, delay: number) {\n\tlet timer: NodeJS.Timeout;\n\treturn (...args: unknown[]) => {\n\t\tclearTimeout(timer);\n\t\ttimer = setTimeout(() => f.apply(undefined, args), delay);\n\t};\n}\n\nexport {\n\tisInIframe,\n\tisSameOriginIframe,\n\tdeferWhenDomContentIsLoaded,\n\tisHtmlIframeElement,\n\tdeferWhenPageIsLoaded,\n\tisIframeSameOrigin,\n\tdebounce,\n\tgetDefaultSettings,\n};\n","import { debounce, getDefaultSettings, isHtmlIframeElement, isIframeSameOrigin } from \"~/common\";\nimport type { IframeResizeEvent, InitializeFunction, Settings } from \"./type\";\n\nconst resizeObserver = createResizeObserver();\nconst registeredIframes: Array<{ iframe: HTMLIFrameElement; settings: Settings }> = [];\n\nconst initialize: InitializeFunction = (clientSettings, selector) => {\n\tconst finalSettings = { ...getDefaultSettings(), ...clientSettings };\n\tconst iframes = resolveIframesToRegister(selector);\n\tconst allowedOrigins = registerIframesAllowOrigins(finalSettings, iframes);\n\n\treturn iframes.map((iframe) => {\n\t\tconst length = registeredIframes.push({ iframe, settings: finalSettings });\n\t\tconst unsubscribeResizeListener = addChildResizeListener(iframe, finalSettings, allowedOrigins);\n\t\treturn {\n\t\t\tunsubscribe: () => {\n\t\t\t\tunsubscribeResizeListener();\n\t\t\t\tregisteredIframes.splice(length - 1, 1);\n\t\t\t},\n\t\t};\n\t});\n};\n\nfunction resolveIframesToRegister(selector?: string | HTMLIFrameElement): HTMLIFrameElement[] {\n\tif (typeof selector === \"string\") {\n\t\treturn Array.from(document.querySelectorAll<HTMLElement>(selector)).filter(isHtmlIframeElement);\n\t}\n\tif (selector) {\n\t\treturn isHtmlIframeElement(selector) ? [selector] : [];\n\t}\n\treturn Array.from(document.getElementsByTagName(\"iframe\"));\n}\n\nfunction registerIframesAllowOrigins(settings: Settings, iframes: HTMLIFrameElement[]) {\n\tif (Array.isArray(settings.checkOrigin)) {\n\t\treturn settings.checkOrigin;\n\t}\n\n\tif (!settings.checkOrigin) {\n\t\treturn [];\n\t}\n\n\tconst allowedOrigins: string[] = [];\n\tfor (const iframe of iframes) {\n\t\tconst origin = extractIframeOrigin(iframe);\n\t\tif (origin) {\n\t\t\tallowedOrigins.push(origin);\n\t\t}\n\t}\n\treturn allowedOrigins;\n}\n\nfunction extractIframeOrigin(iframe: HTMLIFrameElement): string | null {\n\ttry {\n\t\tconst origin = new URL(iframe.src).origin;\n\t\tif (origin !== \"about:blank\") {\n\t\t\treturn origin;\n\t\t}\n\t} catch (error) {}\n\treturn null;\n}\n\nfunction addChildResizeListener(iframe: HTMLIFrameElement, settings: Settings, allowedOrigins: string[]) {\n\tif (isIframeSameOrigin(iframe)) {\n\t\treturn addSameOriginChildResizeListener(iframe);\n\t}\n\treturn addCrossOriginChildResizeListener(iframe, settings, allowedOrigins);\n}\n\nfunction addCrossOriginChildResizeListener(iframe: HTMLIFrameElement, settings: Settings, allowedOrigins: string[]) {\n\tconst handleIframeResizedMessage = (event: MessageEvent) => {\n\t\tconst isOriginValid = !settings.checkOrigin || allowedOrigins.includes(event.origin);\n\n\t\tif (isOriginValid && event.data?.type === \"iframe-resized\" && iframe.contentWindow === event.source) {\n\t\t\tconst { width, height } = (event as IframeResizeEvent).data;\n\t\t\tupdateIframeDimensions({ width, height, iframe, settings });\n\t\t}\n\t};\n\n\twindow.addEventListener(\"message\", handleIframeResizedMessage, false);\n\n\treturn () => window.removeEventListener(\"message\", handleIframeResizedMessage, false);\n}\n\nfunction addSameOriginChildResizeListener(iframe: HTMLIFrameElement) {\n\tconst startListener = () => {\n\t\tconst contentBody = iframe.contentDocument?.body;\n\n\t\tif (!contentBody) {\n\t\t\tconsole.error(\"Unable to observe the iframe content document body\");\n\t\t\treturn;\n\t\t}\n\n\t\tresizeObserver.observe(contentBody);\n\t};\n\n\tiframe.addEventListener(\"load\", startListener);\n\n\treturn () => {\n\t\tif (iframe.contentDocument?.body) {\n\t\t\tresizeObserver.unobserve(iframe.contentDocument.body);\n\t\t}\n\t\tiframe.removeEventListener(\"load\", startListener);\n\t};\n}\n\nfunction createResizeObserver() {\n\tconst handleEntry = ({ target }: ResizeObserverEntry) => {\n\t\tconst matchingRegisteredIframe = registeredIframes.find((value) => value.iframe.contentDocument?.body === target);\n\t\tif (!matchingRegisteredIframe) {\n\t\t\treturn;\n\t\t}\n\t\tconst { iframe, settings } = matchingRegisteredIframe;\n\t\tconst { scrollHeight, scrollWidth } = iframe.contentDocument?.documentElement ?? {};\n\t\tif (scrollHeight !== undefined && scrollWidth !== undefined) {\n\t\t\tupdateIframeDimensions({ width: scrollWidth, height: scrollHeight, iframe, settings });\n\t\t}\n\t};\n\n\tconst resizeObserverCallback = debounce<ResizeObserverCallback>((entries) => entries.forEach(handleEntry), 10);\n\treturn new ResizeObserver(resizeObserverCallback);\n}\n\nfunction updateIframeDimensions({ width, height, iframe, settings }: { iframe: HTMLIFrameElement; width: number; height: number; settings: Settings }) {\n\tiframe.style.width = `${width}px`;\n\tiframe.style.height = `${height + settings.offsetSize}px`;\n}\n\nexport { initialize };\n","import { debounce, isInIframe } from \"~/common\";\nimport type { IframeResizeEventData } from \"./type\";\n\nif (isInIframe()) {\n\tinitializeChildListener();\n}\n\nfunction initializeChildListener() {\n\twindow.addEventListener(\"load\", () => {\n\t\tconst resizeObserverCallback = debounce<ResizeObserverCallback>(() => {\n\t\t\tconst data: IframeResizeEventData = {\n\t\t\t\ttype: \"iframe-resized\",\n\t\t\t\twidth: document.documentElement.scrollWidth,\n\t\t\t\theight: document.documentElement.scrollHeight,\n\t\t\t};\n\t\t\twindow.parent.postMessage(data, \"*\");\n\t\t}, 10);\n\n\t\tconst resizeObserver = new ResizeObserver(resizeObserverCallback);\n\t\tresizeObserver.observe(document.body);\n\t});\n}\n\nexport { initializeChildListener };\n"],"names":["isInIframe","isHtmlIframeElement","element","getDefaultSettings","isIframeSameOrigin","iframe","debounce","f","delay","timer","args","resizeObserver","createResizeObserver","registeredIframes","initialize","clientSettings","selector","finalSettings","iframes","resolveIframesToRegister","allowedOrigins","registerIframesAllowOrigins","length","unsubscribeResizeListener","addChildResizeListener","settings","origin","extractIframeOrigin","addSameOriginChildResizeListener","addCrossOriginChildResizeListener","handleIframeResizedMessage","event","_a","width","height","updateIframeDimensions","startListener","contentBody","handleEntry","target","matchingRegisteredIframe","value","scrollHeight","scrollWidth","resizeObserverCallback","entries","initializeChildListener","data"],"mappings":"qOAEA,MAAMA,EAAa,IAAM,QAAU,OAAO,OAAS,OAAO,IAIpDC,EAAuBC,GAAmDA,aAAmB,kBAU7FC,EAAqC,KAAO,CAAE,WAAY,EAAG,YAAa,EAAK,GAE/EC,EAAsBC,GAA8B,CACrD,GAAA,CAEI,OADW,IAAI,IAAIA,EAAO,IAAK,OAAO,SAAS,MAAM,EAC3C,SAAW,OAAO,SAAS,YACjC,CACJ,MAAA,EACR,CACD,EAGA,SAASC,EAA4CC,EAAMC,EAAe,CACrE,IAAAC,EACJ,MAAO,IAAIC,IAAoB,CAC9B,aAAaD,CAAK,EAClBA,EAAQ,WAAW,IAAMF,EAAE,MAAM,OAAWG,CAAI,EAAGF,CAAK,CAAA,CAE1D,CC/BA,MAAMG,EAAiBC,EAAqB,EACtCC,EAA8E,CAAA,EAE9EC,EAAiC,CAACC,EAAgBC,IAAa,CACpE,MAAMC,EAAgB,CAAE,GAAGd,EAAmB,EAAG,GAAGY,CAAe,EAC7DG,EAAUC,EAAyBH,CAAQ,EAC3CI,EAAiBC,EAA4BJ,EAAeC,CAAO,EAElE,OAAAA,EAAQ,IAAKb,GAAW,CAC9B,MAAMiB,EAAST,EAAkB,KAAK,CAAE,OAAAR,EAAQ,SAAUY,EAAe,EACnEM,EAA4BC,EAAuBnB,EAAQY,EAAeG,CAAc,EACvF,MAAA,CACN,YAAa,IAAM,CACQG,IACRV,EAAA,OAAOS,EAAS,EAAG,CAAC,CACvC,CAAA,CACD,CACA,CACF,EAEA,SAASH,EAAyBH,EAA4D,CACzF,OAAA,OAAOA,GAAa,SAChB,MAAM,KAAK,SAAS,iBAA8BA,CAAQ,CAAC,EAAE,OAAOf,CAAmB,EAE3Fe,EACIf,EAAoBe,CAAQ,EAAI,CAACA,CAAQ,EAAI,CAAA,EAE9C,MAAM,KAAK,SAAS,qBAAqB,QAAQ,CAAC,CAC1D,CAEA,SAASK,EAA4BI,EAAoBP,EAA8B,CACtF,GAAI,MAAM,QAAQO,EAAS,WAAW,EACrC,OAAOA,EAAS,YAGb,GAAA,CAACA,EAAS,YACb,MAAO,GAGR,MAAML,EAA2B,CAAA,EACjC,UAAWf,KAAUa,EAAS,CACvB,MAAAQ,EAASC,EAAoBtB,CAAM,EACrCqB,GACHN,EAAe,KAAKM,CAAM,CAE5B,CACO,OAAAN,CACR,CAEA,SAASO,EAAoBtB,EAA0C,CAClE,GAAA,CACH,MAAMqB,EAAS,IAAI,IAAIrB,EAAO,GAAG,EAAE,OACnC,GAAIqB,IAAW,cACP,OAAAA,OAEO,CAAC,CACV,OAAA,IACR,CAEA,SAASF,EAAuBnB,EAA2BoB,EAAoBL,EAA0B,CACpG,OAAAhB,EAAmBC,CAAM,EACrBuB,EAAiCvB,CAAM,EAExCwB,EAAkCxB,EAAQoB,EAAUL,CAAc,CAC1E,CAEA,SAASS,EAAkCxB,EAA2BoB,EAAoBL,EAA0B,CAC7G,MAAAU,EAA8BC,GAAwB,OAGvD,IAFkB,CAACN,EAAS,aAAeL,EAAe,SAASW,EAAM,MAAM,MAE9DC,EAAAD,EAAM,OAAN,YAAAC,EAAY,QAAS,kBAAoB3B,EAAO,gBAAkB0B,EAAM,OAAQ,CACpG,KAAM,CAAE,MAAAE,EAAO,OAAAC,GAAYH,EAA4B,KACvDI,EAAuB,CAAE,MAAAF,EAAO,OAAAC,EAAQ,OAAA7B,EAAQ,SAAAoB,CAAU,CAAA,CAC3D,CAAA,EAGM,cAAA,iBAAiB,UAAWK,EAA4B,EAAK,EAE7D,IAAM,OAAO,oBAAoB,UAAWA,EAA4B,EAAK,CACrF,CAEA,SAASF,EAAiCvB,EAA2B,CACpE,MAAM+B,EAAgB,IAAM,OACrB,MAAAC,GAAcL,EAAA3B,EAAO,kBAAP,YAAA2B,EAAwB,KAE5C,GAAI,CAACK,EAAa,CACjB,QAAQ,MAAM,oDAAoD,EAClE,MACD,CAEA1B,EAAe,QAAQ0B,CAAW,CAAA,EAG5B,OAAAhC,EAAA,iBAAiB,OAAQ+B,CAAa,EAEtC,IAAM,QACRJ,EAAA3B,EAAO,kBAAP,MAAA2B,EAAwB,MACZrB,EAAA,UAAUN,EAAO,gBAAgB,IAAI,EAE9CA,EAAA,oBAAoB,OAAQ+B,CAAa,CAAA,CAElD,CAEA,SAASxB,GAAuB,CAC/B,MAAM0B,EAAc,CAAC,CAAE,OAAAC,KAAkC,OAClD,MAAAC,EAA2B3B,EAAkB,KAAM4B,UAAU,QAAAT,EAAAS,EAAM,OAAO,kBAAb,YAAAT,EAA8B,QAASO,EAAM,EAChH,GAAI,CAACC,EACJ,OAEK,KAAA,CAAE,OAAAnC,EAAQ,SAAAoB,CAAa,EAAAe,EACvB,CAAE,aAAAE,EAAc,YAAAC,KAAgBX,EAAA3B,EAAO,kBAAP,YAAA2B,EAAwB,kBAAmB,GAC7EU,IAAiB,QAAaC,IAAgB,QACjDR,EAAuB,CAAE,MAAOQ,EAAa,OAAQD,EAAc,OAAArC,EAAQ,SAAAoB,EAAU,CACtF,EAGKmB,EAAyBtC,EAAkCuC,GAAYA,EAAQ,QAAQP,CAAW,EAAG,EAAE,EACtG,OAAA,IAAI,eAAeM,CAAsB,CACjD,CAEA,SAAST,EAAuB,CAAE,MAAAF,EAAO,OAAAC,EAAQ,OAAA7B,EAAQ,SAAAoB,GAA8F,CAC/IpB,EAAA,MAAM,MAAQ,GAAG4B,CAAK,KAC7B5B,EAAO,MAAM,OAAS,GAAG6B,EAAST,EAAS,UAAU,IACtD,CC3HIzB,KACqB8C,IAGzB,SAASA,GAA0B,CAC3B,OAAA,iBAAiB,OAAQ,IAAM,CAC/B,MAAAF,EAAyBtC,EAAiC,IAAM,CACrE,MAAMyC,EAA8B,CACnC,KAAM,iBACN,MAAO,SAAS,gBAAgB,YAChC,OAAQ,SAAS,gBAAgB,YAAA,EAE3B,OAAA,OAAO,YAAYA,EAAM,GAAG,GACjC,EAAE,EAEkB,IAAI,eAAeH,CAAsB,EACjD,QAAQ,SAAS,IAAI,CAAA,CACpC,CACF"}