@@ -200,14 +200,26 @@ export function _isBlockedElement(
200
200
function onceIframeLoaded(
201
201
iframeEl: HTMLIFrameElement,
202
202
listener: () => unknown,
203
+ iframeLoadTimeout: number,
203
204
) {
204
205
const win = iframeEl.contentWindow;
205
206
if (!win) {
206
207
return;
207
208
}
208
209
// document is loading
210
+ let fired = false;
209
211
if (win.document.readyState !== 'complete') {
210
- iframeEl.addEventListener('load', listener);
212
+ const timer = setTimeout(() => {
213
+ if (!fired) {
214
+ listener();
215
+ fired = true;
216
+ }
217
+ }, iframeLoadTimeout);
218
+ iframeEl.addEventListener('load', () => {
219
+ clearTimeout(timer);
220
+ fired = true;
221
+ listener();
222
+ });
211
223
return;
212
224
}
213
225
// check blank frame for Chrome
@@ -519,6 +531,7 @@ export function serializeNodeWithId(
519
531
preserveWhiteSpace?: boolean;
520
532
onSerialize?: (n: INode) => unknown;
521
533
onIframeLoad?: (iframeINode: INode, node: serializedNodeWithId) => unknown;
534
+ iframeLoadTimeout?: number;
522
535
},
523
536
): serializedNodeWithId | null {
524
537
const {
@@ -533,6 +546,7 @@ export function serializeNodeWithId(
533
546
recordCanvas = false,
534
547
onSerialize,
535
548
onIframeLoad,
549
+ iframeLoadTimeout = 5000,
536
550
} = options;
537
551
let { preserveWhiteSpace = true } = options;
538
552
const _serializedNode = serializeNode(n, {
@@ -606,6 +620,7 @@ export function serializeNodeWithId(
606
620
preserveWhiteSpace,
607
621
onSerialize,
608
622
onIframeLoad,
623
+ iframeLoadTimeout,
609
624
});
610
625
if (serializedChildNode) {
611
626
serializedNode.childNodes.push(serializedChildNode);
@@ -617,29 +632,34 @@ export function serializeNodeWithId(
617
632
serializedNode.type === NodeType.Element &&
618
633
serializedNode.tagName === 'iframe'
619
634
) {
620
- onceIframeLoaded(n as HTMLIFrameElement, () => {
621
- const iframeDoc = (n as HTMLIFrameElement).contentDocument;
622
- if (iframeDoc && onIframeLoad) {
623
- const serializedIframeNode = serializeNodeWithId(iframeDoc, {
624
- doc: iframeDoc,
625
- map,
626
- blockClass,
627
- blockSelector,
628
- skipChild: false,
629
- inlineStylesheet,
630
- maskInputOptions,
631
- slimDOMOptions,
632
- recordCanvas,
633
- preserveWhiteSpace,
634
- onSerialize,
635
- onIframeLoad,
636
- });
637
-
638
- if (serializedIframeNode) {
639
- onIframeLoad(n as INode, serializedIframeNode);
635
+ onceIframeLoaded(
636
+ n as HTMLIFrameElement,
637
+ () => {
638
+ const iframeDoc = (n as HTMLIFrameElement).contentDocument;
639
+ if (iframeDoc && onIframeLoad) {
640
+ const serializedIframeNode = serializeNodeWithId(iframeDoc, {
641
+ doc: iframeDoc,
642
+ map,
643
+ blockClass,
644
+ blockSelector,
645
+ skipChild: false,
646
+ inlineStylesheet,
647
+ maskInputOptions,
648
+ slimDOMOptions,
649
+ recordCanvas,
650
+ preserveWhiteSpace,
651
+ onSerialize,
652
+ onIframeLoad,
653
+ iframeLoadTimeout,
654
+ });
655
+
656
+ if (serializedIframeNode) {
657
+ onIframeLoad(n as INode, serializedIframeNode);
658
+ }
640
659
}
641
- }
642
- });
660
+ },
661
+ iframeLoadTimeout,
662
+ );
643
663
}
644
664
645
665
return serializedNode;
@@ -657,6 +677,7 @@ function snapshot(
657
677
preserveWhiteSpace?: boolean;
658
678
onSerialize?: (n: INode) => unknown;
659
679
onIframeLoad?: (iframeINode: INode, node: serializedNodeWithId) => unknown;
680
+ iframeLoadTimeout?: number;
660
681
},
661
682
): [serializedNodeWithId | null, idNodeMap] {
662
683
const {
@@ -669,6 +690,7 @@ function snapshot(
669
690
preserveWhiteSpace,
670
691
onSerialize,
671
692
onIframeLoad,
693
+ iframeLoadTimeout,
672
694
} = options || {};
673
695
const idNodeMap: idNodeMap = {};
674
696
const maskInputOptions: MaskInputOptions =
@@ -725,6 +747,7 @@ function snapshot(
725
747
preserveWhiteSpace,
726
748
onSerialize,
727
749
onIframeLoad,
750
+ iframeLoadTimeout,
728
751
}),
729
752
idNodeMap,
730
753
];
0 commit comments