@appsurify-testmap/rrweb-record 2.1.0-alpha.6 → 2.1.1-alpha.1
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/dist/rrweb-record.cjs +574 -186
- package/dist/rrweb-record.cjs.map +1 -1
- package/dist/rrweb-record.js +574 -186
- package/dist/rrweb-record.js.map +1 -1
- package/dist/rrweb-record.umd.cjs +577 -188
- package/dist/rrweb-record.umd.cjs.map +3 -3
- package/dist/rrweb-record.umd.min.cjs +26 -26
- package/dist/rrweb-record.umd.min.cjs.map +3 -3
- package/package.json +4 -4
package/dist/rrweb-record.cjs
CHANGED
|
@@ -170,6 +170,41 @@ function patch$1(source, name, replacement) {
|
|
|
170
170
|
};
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
|
+
function describeNode$1(el) {
|
|
174
|
+
const tag = el.tagName.toLowerCase();
|
|
175
|
+
const id = el.id ? `#${el.id}` : "";
|
|
176
|
+
const classes = el.classList.length ? "." + Array.from(el.classList).join(".") : "";
|
|
177
|
+
return `${tag}${id}${classes}`;
|
|
178
|
+
}
|
|
179
|
+
function getElementVisibility$1(el) {
|
|
180
|
+
var _a2, _b;
|
|
181
|
+
const win = ((_a2 = el.ownerDocument) == null ? void 0 : _a2.defaultView) ?? window;
|
|
182
|
+
const rect = el.getBoundingClientRect();
|
|
183
|
+
const viewportWidth = win.innerWidth || win.document.documentElement.clientWidth || 0;
|
|
184
|
+
const viewportHeight = win.innerHeight || win.document.documentElement.clientHeight || 0;
|
|
185
|
+
const isRectVisible = rect.width > 0 && rect.height > 0 && rect.bottom > 0 && rect.right > 0 && rect.top < viewportHeight && rect.left < viewportWidth;
|
|
186
|
+
const style = (_b = win.getComputedStyle) == null ? void 0 : _b.call(win, el);
|
|
187
|
+
const isStyleVisible2 = !!style && style.display !== "none" && style.visibility !== "hidden" && (parseFloat(style.opacity) || 0) > 0;
|
|
188
|
+
const isVisible = isStyleVisible2 && isRectVisible;
|
|
189
|
+
let ratio = 0;
|
|
190
|
+
if (isVisible) {
|
|
191
|
+
const xOverlap = Math.max(
|
|
192
|
+
0,
|
|
193
|
+
Math.min(rect.right, viewportWidth) - Math.max(rect.left, 0)
|
|
194
|
+
);
|
|
195
|
+
const yOverlap = Math.max(
|
|
196
|
+
0,
|
|
197
|
+
Math.min(rect.bottom, viewportHeight) - Math.max(rect.top, 0)
|
|
198
|
+
);
|
|
199
|
+
const intersectionArea = xOverlap * yOverlap;
|
|
200
|
+
const elementArea = rect.width * rect.height;
|
|
201
|
+
ratio = elementArea > 0 ? intersectionArea / elementArea : 0;
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
isVisible,
|
|
205
|
+
ratio
|
|
206
|
+
};
|
|
207
|
+
}
|
|
173
208
|
const index$1 = {
|
|
174
209
|
childNodes: childNodes$1,
|
|
175
210
|
parentNode: parentNode$1,
|
|
@@ -183,7 +218,9 @@ const index$1 = {
|
|
|
183
218
|
querySelector: querySelector$1,
|
|
184
219
|
querySelectorAll: querySelectorAll$1,
|
|
185
220
|
mutationObserver: mutationObserverCtor$1,
|
|
186
|
-
patch: patch$1
|
|
221
|
+
patch: patch$1,
|
|
222
|
+
describeNode: describeNode$1,
|
|
223
|
+
getElementVisibility: getElementVisibility$1
|
|
187
224
|
};
|
|
188
225
|
function isElement(n2) {
|
|
189
226
|
return n2.nodeType === n2.ELEMENT_NODE;
|
|
@@ -557,71 +594,95 @@ function splitCssText(cssText, style, _testNoPxNorm = false) {
|
|
|
557
594
|
function markCssSplits(cssText, style) {
|
|
558
595
|
return splitCssText(cssText, style).join("/* rr_split */");
|
|
559
596
|
}
|
|
560
|
-
function
|
|
561
|
-
|
|
562
|
-
|
|
597
|
+
function isSelectorUnique(selector, target) {
|
|
598
|
+
try {
|
|
599
|
+
const matches = document.querySelectorAll(selector);
|
|
600
|
+
return matches.length === 1 && matches[0] === target;
|
|
601
|
+
} catch {
|
|
602
|
+
return false;
|
|
563
603
|
}
|
|
564
|
-
|
|
565
|
-
|
|
604
|
+
}
|
|
605
|
+
function buildSelector(node2) {
|
|
606
|
+
if (!(node2 instanceof Element)) return null;
|
|
607
|
+
if (node2.id) {
|
|
608
|
+
return `#${CSS.escape(node2.id)}`;
|
|
566
609
|
}
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
}
|
|
572
|
-
if (element.tagName && element.tagName.toLowerCase() === "html") {
|
|
573
|
-
return "/html";
|
|
574
|
-
}
|
|
575
|
-
if (element === document.head) {
|
|
576
|
-
return "/html/head";
|
|
577
|
-
}
|
|
578
|
-
if (element === document.body) {
|
|
579
|
-
return "/html/body";
|
|
580
|
-
}
|
|
581
|
-
const parentNode2 = element.parentNode;
|
|
582
|
-
if (!parentNode2) {
|
|
583
|
-
return "";
|
|
584
|
-
}
|
|
585
|
-
const siblings = Array.from(parentNode2.children).filter(
|
|
586
|
-
(sibling) => sibling.tagName === element.tagName
|
|
587
|
-
);
|
|
588
|
-
const index2 = siblings.length > 1 ? `[${siblings.indexOf(element) + 1}]` : "";
|
|
589
|
-
return `${getXPath(parentNode2)}/${element.tagName.toLowerCase()}${index2}`;
|
|
610
|
+
const parts = [];
|
|
611
|
+
const tag = node2.tagName.toLowerCase();
|
|
612
|
+
if (node2.classList.length) {
|
|
613
|
+
parts.push(...Array.from(node2.classList).map((cls) => `.${CSS.escape(cls)}`));
|
|
590
614
|
}
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
return "";
|
|
615
|
+
Array.from(node2.attributes).forEach((attr) => {
|
|
616
|
+
if (attr.name.startsWith("data-")) {
|
|
617
|
+
parts.push(`[${attr.name}="${CSS.escape(attr.value)}"]`);
|
|
595
618
|
}
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
619
|
+
});
|
|
620
|
+
const shortSelector = `${tag}${parts.join("")}`;
|
|
621
|
+
if (isSelectorUnique(shortSelector, node2)) {
|
|
622
|
+
return shortSelector;
|
|
623
|
+
}
|
|
624
|
+
const pathParts = [];
|
|
625
|
+
let current = node2;
|
|
626
|
+
while (current && current.nodeType === Node.ELEMENT_NODE) {
|
|
627
|
+
const parent = current.parentElement;
|
|
628
|
+
const tagName = current.tagName.toLowerCase();
|
|
629
|
+
let nth = "";
|
|
630
|
+
if (parent) {
|
|
631
|
+
const siblings = Array.from(parent.children).filter(
|
|
632
|
+
(el) => el.tagName.toLowerCase() === tagName
|
|
633
|
+
);
|
|
634
|
+
if (siblings.length > 1) {
|
|
635
|
+
nth = `:nth-of-type(${siblings.indexOf(current) + 1})`;
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
pathParts.unshift(`${tagName}${nth}`);
|
|
639
|
+
current = parent;
|
|
640
|
+
}
|
|
641
|
+
return pathParts.join(" > ") || null;
|
|
642
|
+
}
|
|
643
|
+
function buildXPath(node2) {
|
|
644
|
+
switch (node2.nodeType) {
|
|
645
|
+
case Node.DOCUMENT_NODE:
|
|
646
|
+
return "/";
|
|
647
|
+
case Node.DOCUMENT_TYPE_NODE:
|
|
648
|
+
return "/html/doctype";
|
|
649
|
+
case Node.ELEMENT_NODE: {
|
|
650
|
+
const element = node2;
|
|
651
|
+
if (element.id) {
|
|
652
|
+
return `//*[@id="${CSS.escape(element.id)}"]`;
|
|
653
|
+
}
|
|
654
|
+
if (element.tagName.toLowerCase() === "html") return "/html";
|
|
655
|
+
if (element === document.head) return "/html/head";
|
|
656
|
+
if (element === document.body) return "/html/body";
|
|
657
|
+
const parent = element.parentNode;
|
|
658
|
+
if (!parent) return "";
|
|
659
|
+
const tag = element.tagName.toLowerCase();
|
|
660
|
+
const siblings = Array.from(parent.children).filter(
|
|
661
|
+
(el) => el.tagName.toLowerCase() === tag
|
|
662
|
+
);
|
|
663
|
+
const index2 = siblings.length > 1 ? `[${siblings.indexOf(element) + 1}]` : "";
|
|
664
|
+
return `${buildXPath(parent)}/${tag}${index2}`;
|
|
665
|
+
}
|
|
666
|
+
case Node.TEXT_NODE:
|
|
667
|
+
case Node.CDATA_SECTION_NODE:
|
|
668
|
+
case Node.COMMENT_NODE: {
|
|
669
|
+
const parent = node2.parentNode;
|
|
670
|
+
if (!parent) return "";
|
|
671
|
+
const typeMap = {
|
|
672
|
+
[Node.TEXT_NODE]: "text()",
|
|
673
|
+
[Node.CDATA_SECTION_NODE]: "text()",
|
|
674
|
+
// CDATA ≡ text() в XPath
|
|
675
|
+
[Node.COMMENT_NODE]: "comment()"
|
|
676
|
+
};
|
|
677
|
+
const sameTypeSiblings = Array.from(parent.childNodes).filter(
|
|
678
|
+
(sibling) => sibling.nodeType === node2.nodeType
|
|
679
|
+
);
|
|
680
|
+
const index2 = sameTypeSiblings.length > 1 ? `[${sameTypeSiblings.indexOf(node2)}]` : "";
|
|
681
|
+
return `${buildXPath(parent)}/${typeMap[node2.nodeType]}${index2}`;
|
|
606
682
|
}
|
|
607
|
-
|
|
608
|
-
(sibling) => sibling.nodeType === Node.CDATA_SECTION_NODE
|
|
609
|
-
);
|
|
610
|
-
const index2 = cdataSiblings.length > 1 ? `[${cdataSiblings.indexOf(node2) + 1}]` : "";
|
|
611
|
-
return `${getXPath(parent)}/text()${index2}`;
|
|
612
|
-
}
|
|
613
|
-
if (node2.nodeType === Node.COMMENT_NODE) {
|
|
614
|
-
const parent = node2.parentNode;
|
|
615
|
-
if (!parent) {
|
|
683
|
+
default:
|
|
616
684
|
return "";
|
|
617
|
-
}
|
|
618
|
-
const commentSiblings = Array.from(parent.childNodes).filter(
|
|
619
|
-
(sibling) => sibling.nodeType === Node.COMMENT_NODE
|
|
620
|
-
);
|
|
621
|
-
const index2 = commentSiblings.length > 1 ? `[${commentSiblings.indexOf(node2) + 1}]` : "";
|
|
622
|
-
return `${getXPath(parent)}/comment()${index2}`;
|
|
623
685
|
}
|
|
624
|
-
return "";
|
|
625
686
|
}
|
|
626
687
|
function isTextVisible(n2) {
|
|
627
688
|
var _a2;
|
|
@@ -637,20 +698,9 @@ function isTextVisible(n2) {
|
|
|
637
698
|
const textContent2 = (_a2 = n2.textContent) == null ? void 0 : _a2.trim();
|
|
638
699
|
return textContent2 !== "";
|
|
639
700
|
}
|
|
640
|
-
function isElementVisible(
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
const style = win ? win.getComputedStyle(n2) : null;
|
|
644
|
-
const isStyleVisible = style != null && style.display !== "none" && style.visibility !== "hidden" && parseFloat(style.opacity) !== 0;
|
|
645
|
-
const rect = n2.getBoundingClientRect();
|
|
646
|
-
const result2 = isStyleVisible && isRectVisible(rect);
|
|
647
|
-
return result2;
|
|
648
|
-
}
|
|
649
|
-
function isRectVisible(rect, win = window) {
|
|
650
|
-
var _a2, _b, _c, _d;
|
|
651
|
-
const height = (win == null ? void 0 : win.innerHeight) ?? ((_b = (_a2 = win == null ? void 0 : win.document) == null ? void 0 : _a2.documentElement) == null ? void 0 : _b.clientHeight) ?? 0;
|
|
652
|
-
const width = (win == null ? void 0 : win.innerWidth) ?? ((_d = (_c = win == null ? void 0 : win.document) == null ? void 0 : _c.documentElement) == null ? void 0 : _d.clientWidth) ?? 0;
|
|
653
|
-
return rect.width > 0 && rect.height > 0 && rect.top >= 0 && rect.left >= 0 && rect.bottom <= height && rect.right <= width;
|
|
701
|
+
function isElementVisible(el) {
|
|
702
|
+
const visibility = index$1.getElementVisibility(el);
|
|
703
|
+
return visibility.isVisible;
|
|
654
704
|
}
|
|
655
705
|
const interactiveEvents$1 = [
|
|
656
706
|
"change",
|
|
@@ -677,19 +727,6 @@ const interactiveEvents$1 = [
|
|
|
677
727
|
"touchend",
|
|
678
728
|
"touchcancel"
|
|
679
729
|
];
|
|
680
|
-
const interactiveTags = [
|
|
681
|
-
"a",
|
|
682
|
-
"button",
|
|
683
|
-
"input",
|
|
684
|
-
"select",
|
|
685
|
-
"textarea",
|
|
686
|
-
"label",
|
|
687
|
-
"details",
|
|
688
|
-
"summary",
|
|
689
|
-
"dialog",
|
|
690
|
-
"video",
|
|
691
|
-
"audio"
|
|
692
|
-
];
|
|
693
730
|
const inlineEventAttributes$1 = [
|
|
694
731
|
"onclick",
|
|
695
732
|
"ondblclick",
|
|
@@ -729,25 +766,6 @@ const originalRemoveEventListener$1 = EventTarget.prototype.removeEventListener;
|
|
|
729
766
|
EventTarget.prototype.removeEventListener = function(type, listener, options) {
|
|
730
767
|
originalRemoveEventListener$1.call(this, type, listener, options);
|
|
731
768
|
};
|
|
732
|
-
function hasEventListeners(n2) {
|
|
733
|
-
return n2 instanceof Element && interactiveElementsRegistry$1.has(n2);
|
|
734
|
-
}
|
|
735
|
-
function isElementInteractive(n2) {
|
|
736
|
-
if (n2.nodeType === Node.ELEMENT_NODE) {
|
|
737
|
-
const element = n2;
|
|
738
|
-
const tagName = element.tagName.toLowerCase();
|
|
739
|
-
if (interactiveTags.includes(tagName)) {
|
|
740
|
-
return true;
|
|
741
|
-
}
|
|
742
|
-
const hasTabIndex = element.hasAttribute("tabindex") && element.getAttribute("tabindex") !== "-1";
|
|
743
|
-
const hasRoleInteractive = ["button", "link", "checkbox", "switch", "menuitem"].includes(
|
|
744
|
-
element.getAttribute("role") || ""
|
|
745
|
-
);
|
|
746
|
-
const result2 = hasEventListeners(element) || hasTabIndex || hasRoleInteractive || element instanceof HTMLAnchorElement && element.hasAttribute("href") || element instanceof HTMLButtonElement && !element.disabled;
|
|
747
|
-
return result2;
|
|
748
|
-
}
|
|
749
|
-
return false;
|
|
750
|
-
}
|
|
751
769
|
function inspectInlineEventHandlers$1() {
|
|
752
770
|
const allElements = document.querySelectorAll("*");
|
|
753
771
|
allElements.forEach((el) => {
|
|
@@ -883,9 +901,6 @@ function transformAttribute(doc, tagName, name, value) {
|
|
|
883
901
|
function ignoreAttribute(tagName, name, _value) {
|
|
884
902
|
return (tagName === "video" || tagName === "audio") && name === "autoplay";
|
|
885
903
|
}
|
|
886
|
-
function isIncludeAttribute(name, include) {
|
|
887
|
-
return typeof include === "string" ? name.includes(include) : include.test(name);
|
|
888
|
-
}
|
|
889
904
|
function isExcludeAttribute(name, exclude) {
|
|
890
905
|
return typeof exclude === "string" ? name.includes(exclude) : exclude.test(name);
|
|
891
906
|
}
|
|
@@ -1019,7 +1034,6 @@ function serializeNode(n2, options) {
|
|
|
1019
1034
|
blockClass,
|
|
1020
1035
|
blockSelector,
|
|
1021
1036
|
excludeAttribute,
|
|
1022
|
-
includeAttribute,
|
|
1023
1037
|
needsMask,
|
|
1024
1038
|
inlineStylesheet,
|
|
1025
1039
|
maskInputOptions = {},
|
|
@@ -1033,22 +1047,19 @@ function serializeNode(n2, options) {
|
|
|
1033
1047
|
cssCaptured = false
|
|
1034
1048
|
} = options;
|
|
1035
1049
|
const rootId = getRootId(doc, mirror2);
|
|
1036
|
-
const xPath = getXPath(n2);
|
|
1037
1050
|
switch (n2.nodeType) {
|
|
1038
1051
|
case n2.DOCUMENT_NODE:
|
|
1039
1052
|
if (n2.compatMode !== "CSS1Compat") {
|
|
1040
1053
|
return {
|
|
1041
1054
|
type: NodeType$3.Document,
|
|
1042
1055
|
childNodes: [],
|
|
1043
|
-
xPath,
|
|
1044
1056
|
compatMode: n2.compatMode
|
|
1045
1057
|
// probably "BackCompat"
|
|
1046
1058
|
};
|
|
1047
1059
|
} else {
|
|
1048
1060
|
return {
|
|
1049
1061
|
type: NodeType$3.Document,
|
|
1050
|
-
childNodes: []
|
|
1051
|
-
xPath
|
|
1062
|
+
childNodes: []
|
|
1052
1063
|
};
|
|
1053
1064
|
}
|
|
1054
1065
|
case n2.DOCUMENT_TYPE_NODE:
|
|
@@ -1057,8 +1068,7 @@ function serializeNode(n2, options) {
|
|
|
1057
1068
|
name: n2.name,
|
|
1058
1069
|
publicId: n2.publicId,
|
|
1059
1070
|
systemId: n2.systemId,
|
|
1060
|
-
rootId
|
|
1061
|
-
xPath
|
|
1071
|
+
rootId
|
|
1062
1072
|
};
|
|
1063
1073
|
case n2.ELEMENT_NODE:
|
|
1064
1074
|
return serializeElementNode(n2, {
|
|
@@ -1066,7 +1076,6 @@ function serializeNode(n2, options) {
|
|
|
1066
1076
|
blockClass,
|
|
1067
1077
|
blockSelector,
|
|
1068
1078
|
excludeAttribute,
|
|
1069
|
-
includeAttribute,
|
|
1070
1079
|
inlineStylesheet,
|
|
1071
1080
|
maskInputOptions,
|
|
1072
1081
|
maskInputFn,
|
|
@@ -1075,8 +1084,7 @@ function serializeNode(n2, options) {
|
|
|
1075
1084
|
recordCanvas,
|
|
1076
1085
|
keepIframeSrcFn,
|
|
1077
1086
|
newlyAddedElement,
|
|
1078
|
-
rootId
|
|
1079
|
-
xPath
|
|
1087
|
+
rootId
|
|
1080
1088
|
});
|
|
1081
1089
|
case n2.TEXT_NODE:
|
|
1082
1090
|
return serializeTextNode(n2, {
|
|
@@ -1084,22 +1092,19 @@ function serializeNode(n2, options) {
|
|
|
1084
1092
|
needsMask,
|
|
1085
1093
|
maskTextFn,
|
|
1086
1094
|
rootId,
|
|
1087
|
-
cssCaptured
|
|
1088
|
-
xPath
|
|
1095
|
+
cssCaptured
|
|
1089
1096
|
});
|
|
1090
1097
|
case n2.CDATA_SECTION_NODE:
|
|
1091
1098
|
return {
|
|
1092
1099
|
type: NodeType$3.CDATA,
|
|
1093
1100
|
textContent: "",
|
|
1094
|
-
rootId
|
|
1095
|
-
xPath
|
|
1101
|
+
rootId
|
|
1096
1102
|
};
|
|
1097
1103
|
case n2.COMMENT_NODE:
|
|
1098
1104
|
return {
|
|
1099
1105
|
type: NodeType$3.Comment,
|
|
1100
1106
|
textContent: index$1.textContent(n2) || "",
|
|
1101
|
-
rootId
|
|
1102
|
-
xPath
|
|
1107
|
+
rootId
|
|
1103
1108
|
};
|
|
1104
1109
|
default:
|
|
1105
1110
|
return false;
|
|
@@ -1111,7 +1116,7 @@ function getRootId(doc, mirror2) {
|
|
|
1111
1116
|
return docId === 1 ? void 0 : docId;
|
|
1112
1117
|
}
|
|
1113
1118
|
function serializeTextNode(n2, options) {
|
|
1114
|
-
const { needsMask, maskTextFn, rootId, cssCaptured
|
|
1119
|
+
const { needsMask, maskTextFn, rootId, cssCaptured } = options;
|
|
1115
1120
|
const parent = index$1.parentNode(n2);
|
|
1116
1121
|
const parentTagName = parent && parent.tagName;
|
|
1117
1122
|
let textContent2 = "";
|
|
@@ -1128,15 +1133,10 @@ function serializeTextNode(n2, options) {
|
|
|
1128
1133
|
if (!isStyle && !isScript && textContent2 && needsMask) {
|
|
1129
1134
|
textContent2 = maskTextFn ? maskTextFn(textContent2, index$1.parentElement(n2)) : textContent2.replace(/[\S]/g, "*");
|
|
1130
1135
|
}
|
|
1131
|
-
const isVisible = isTextVisible(n2);
|
|
1132
|
-
const isInteractive = isElementInteractive(n2);
|
|
1133
1136
|
return {
|
|
1134
1137
|
type: NodeType$3.Text,
|
|
1135
1138
|
textContent: textContent2 || "",
|
|
1136
|
-
rootId
|
|
1137
|
-
isVisible,
|
|
1138
|
-
isInteractive,
|
|
1139
|
-
xPath
|
|
1139
|
+
rootId
|
|
1140
1140
|
};
|
|
1141
1141
|
}
|
|
1142
1142
|
function serializeElementNode(n2, options) {
|
|
@@ -1145,7 +1145,6 @@ function serializeElementNode(n2, options) {
|
|
|
1145
1145
|
blockClass,
|
|
1146
1146
|
blockSelector,
|
|
1147
1147
|
excludeAttribute,
|
|
1148
|
-
includeAttribute,
|
|
1149
1148
|
inlineStylesheet,
|
|
1150
1149
|
maskInputOptions = {},
|
|
1151
1150
|
maskInputFn,
|
|
@@ -1154,8 +1153,7 @@ function serializeElementNode(n2, options) {
|
|
|
1154
1153
|
recordCanvas,
|
|
1155
1154
|
keepIframeSrcFn,
|
|
1156
1155
|
newlyAddedElement = false,
|
|
1157
|
-
rootId
|
|
1158
|
-
xPath
|
|
1156
|
+
rootId
|
|
1159
1157
|
} = options;
|
|
1160
1158
|
const needBlock = _isBlockedElement(n2, blockClass, blockSelector);
|
|
1161
1159
|
const tagName = getValidTagName$1(n2);
|
|
@@ -1163,7 +1161,7 @@ function serializeElementNode(n2, options) {
|
|
|
1163
1161
|
const len = n2.attributes.length;
|
|
1164
1162
|
for (let i2 = 0; i2 < len; i2++) {
|
|
1165
1163
|
const attr = n2.attributes[i2];
|
|
1166
|
-
if (isExcludeAttribute(attr.name, excludeAttribute)
|
|
1164
|
+
if (isExcludeAttribute(attr.name, excludeAttribute)) {
|
|
1167
1165
|
continue;
|
|
1168
1166
|
}
|
|
1169
1167
|
if (!ignoreAttribute(tagName, attr.name, attr.value)) {
|
|
@@ -1325,8 +1323,6 @@ function serializeElementNode(n2, options) {
|
|
|
1325
1323
|
if (customElements.get(tagName)) isCustomElement = true;
|
|
1326
1324
|
} catch (e2) {
|
|
1327
1325
|
}
|
|
1328
|
-
const isVisible = isElementVisible(n2);
|
|
1329
|
-
const isInteractive = isElementInteractive(n2);
|
|
1330
1326
|
return {
|
|
1331
1327
|
type: NodeType$3.Element,
|
|
1332
1328
|
tagName,
|
|
@@ -1335,10 +1331,7 @@ function serializeElementNode(n2, options) {
|
|
|
1335
1331
|
isSVG: isSVGElement(n2) || void 0,
|
|
1336
1332
|
needBlock,
|
|
1337
1333
|
rootId,
|
|
1338
|
-
isCustom: isCustomElement
|
|
1339
|
-
isVisible,
|
|
1340
|
-
isInteractive,
|
|
1341
|
-
xPath
|
|
1334
|
+
isCustom: isCustomElement
|
|
1342
1335
|
};
|
|
1343
1336
|
}
|
|
1344
1337
|
function lowerIfExists(maybeAttr) {
|
|
@@ -1389,7 +1382,6 @@ function serializeNodeWithId(n2, options) {
|
|
|
1389
1382
|
maskTextClass,
|
|
1390
1383
|
maskTextSelector,
|
|
1391
1384
|
excludeAttribute,
|
|
1392
|
-
includeAttribute,
|
|
1393
1385
|
skipChild = false,
|
|
1394
1386
|
inlineStylesheet = true,
|
|
1395
1387
|
maskInputOptions = {},
|
|
@@ -1425,7 +1417,6 @@ function serializeNodeWithId(n2, options) {
|
|
|
1425
1417
|
blockClass,
|
|
1426
1418
|
blockSelector,
|
|
1427
1419
|
excludeAttribute,
|
|
1428
|
-
includeAttribute,
|
|
1429
1420
|
needsMask,
|
|
1430
1421
|
inlineStylesheet,
|
|
1431
1422
|
maskInputOptions,
|
|
@@ -1451,6 +1442,21 @@ function serializeNodeWithId(n2, options) {
|
|
|
1451
1442
|
id = genId();
|
|
1452
1443
|
}
|
|
1453
1444
|
const serializedNode = Object.assign(_serializedNode, { id });
|
|
1445
|
+
if (isElement(n2) || n2.nodeType === Node.TEXT_NODE) {
|
|
1446
|
+
serializedNode.xpath = buildXPath(n2);
|
|
1447
|
+
if (isElement(n2)) {
|
|
1448
|
+
const selector = buildSelector(n2);
|
|
1449
|
+
if (selector) {
|
|
1450
|
+
serializedNode.selector = selector;
|
|
1451
|
+
}
|
|
1452
|
+
}
|
|
1453
|
+
if (n2.nodeType === Node.TEXT_NODE) {
|
|
1454
|
+
serializedNode.isVisible = isTextVisible(n2);
|
|
1455
|
+
}
|
|
1456
|
+
if (n2.nodeType === Node.ELEMENT_NODE) {
|
|
1457
|
+
serializedNode.isVisible = isElementVisible(n2);
|
|
1458
|
+
}
|
|
1459
|
+
}
|
|
1454
1460
|
mirror2.add(n2, serializedNode);
|
|
1455
1461
|
if (id === IGNORED_NODE) {
|
|
1456
1462
|
return null;
|
|
@@ -1479,7 +1485,6 @@ function serializeNodeWithId(n2, options) {
|
|
|
1479
1485
|
maskTextClass,
|
|
1480
1486
|
maskTextSelector,
|
|
1481
1487
|
excludeAttribute,
|
|
1482
|
-
includeAttribute,
|
|
1483
1488
|
skipChild,
|
|
1484
1489
|
inlineStylesheet,
|
|
1485
1490
|
maskInputOptions,
|
|
@@ -1540,7 +1545,6 @@ function serializeNodeWithId(n2, options) {
|
|
|
1540
1545
|
maskTextClass,
|
|
1541
1546
|
maskTextSelector,
|
|
1542
1547
|
excludeAttribute,
|
|
1543
|
-
includeAttribute,
|
|
1544
1548
|
skipChild: false,
|
|
1545
1549
|
inlineStylesheet,
|
|
1546
1550
|
maskInputOptions,
|
|
@@ -1583,7 +1587,6 @@ function serializeNodeWithId(n2, options) {
|
|
|
1583
1587
|
maskTextClass,
|
|
1584
1588
|
maskTextSelector,
|
|
1585
1589
|
excludeAttribute,
|
|
1586
|
-
includeAttribute,
|
|
1587
1590
|
skipChild: false,
|
|
1588
1591
|
inlineStylesheet,
|
|
1589
1592
|
maskInputOptions,
|
|
@@ -1621,8 +1624,7 @@ function snapshot(n2, options) {
|
|
|
1621
1624
|
blockSelector = null,
|
|
1622
1625
|
maskTextClass = "rr-mask",
|
|
1623
1626
|
maskTextSelector = null,
|
|
1624
|
-
excludeAttribute =
|
|
1625
|
-
includeAttribute = /.+/i,
|
|
1627
|
+
excludeAttribute = /.^/,
|
|
1626
1628
|
inlineStylesheet = true,
|
|
1627
1629
|
inlineImages = false,
|
|
1628
1630
|
recordCanvas = false,
|
|
@@ -1683,7 +1685,6 @@ function snapshot(n2, options) {
|
|
|
1683
1685
|
maskTextClass,
|
|
1684
1686
|
maskTextSelector,
|
|
1685
1687
|
excludeAttribute,
|
|
1686
|
-
includeAttribute,
|
|
1687
1688
|
skipChild: false,
|
|
1688
1689
|
inlineStylesheet,
|
|
1689
1690
|
maskInputOptions,
|
|
@@ -9094,6 +9095,41 @@ function patch(source, name, replacement) {
|
|
|
9094
9095
|
};
|
|
9095
9096
|
}
|
|
9096
9097
|
}
|
|
9098
|
+
function describeNode(el) {
|
|
9099
|
+
const tag = el.tagName.toLowerCase();
|
|
9100
|
+
const id = el.id ? `#${el.id}` : "";
|
|
9101
|
+
const classes = el.classList.length ? "." + Array.from(el.classList).join(".") : "";
|
|
9102
|
+
return `${tag}${id}${classes}`;
|
|
9103
|
+
}
|
|
9104
|
+
function getElementVisibility(el) {
|
|
9105
|
+
var _a2, _b;
|
|
9106
|
+
const win = ((_a2 = el.ownerDocument) == null ? void 0 : _a2.defaultView) ?? window;
|
|
9107
|
+
const rect = el.getBoundingClientRect();
|
|
9108
|
+
const viewportWidth = win.innerWidth || win.document.documentElement.clientWidth || 0;
|
|
9109
|
+
const viewportHeight = win.innerHeight || win.document.documentElement.clientHeight || 0;
|
|
9110
|
+
const isRectVisible = rect.width > 0 && rect.height > 0 && rect.bottom > 0 && rect.right > 0 && rect.top < viewportHeight && rect.left < viewportWidth;
|
|
9111
|
+
const style = (_b = win.getComputedStyle) == null ? void 0 : _b.call(win, el);
|
|
9112
|
+
const isStyleVisible2 = !!style && style.display !== "none" && style.visibility !== "hidden" && (parseFloat(style.opacity) || 0) > 0;
|
|
9113
|
+
const isVisible = isStyleVisible2 && isRectVisible;
|
|
9114
|
+
let ratio = 0;
|
|
9115
|
+
if (isVisible) {
|
|
9116
|
+
const xOverlap = Math.max(
|
|
9117
|
+
0,
|
|
9118
|
+
Math.min(rect.right, viewportWidth) - Math.max(rect.left, 0)
|
|
9119
|
+
);
|
|
9120
|
+
const yOverlap = Math.max(
|
|
9121
|
+
0,
|
|
9122
|
+
Math.min(rect.bottom, viewportHeight) - Math.max(rect.top, 0)
|
|
9123
|
+
);
|
|
9124
|
+
const intersectionArea = xOverlap * yOverlap;
|
|
9125
|
+
const elementArea = rect.width * rect.height;
|
|
9126
|
+
ratio = elementArea > 0 ? intersectionArea / elementArea : 0;
|
|
9127
|
+
}
|
|
9128
|
+
return {
|
|
9129
|
+
isVisible,
|
|
9130
|
+
ratio
|
|
9131
|
+
};
|
|
9132
|
+
}
|
|
9097
9133
|
const index = {
|
|
9098
9134
|
childNodes,
|
|
9099
9135
|
parentNode,
|
|
@@ -9107,7 +9143,9 @@ const index = {
|
|
|
9107
9143
|
querySelector,
|
|
9108
9144
|
querySelectorAll,
|
|
9109
9145
|
mutationObserver: mutationObserverCtor,
|
|
9110
|
-
patch
|
|
9146
|
+
patch,
|
|
9147
|
+
describeNode,
|
|
9148
|
+
getElementVisibility
|
|
9111
9149
|
};
|
|
9112
9150
|
function on(type, fn, target = document) {
|
|
9113
9151
|
const options = { capture: true, passive: true };
|
|
@@ -9381,6 +9419,7 @@ var IncrementalSource = /* @__PURE__ */ ((IncrementalSource2) => {
|
|
|
9381
9419
|
IncrementalSource2[IncrementalSource2["Selection"] = 14] = "Selection";
|
|
9382
9420
|
IncrementalSource2[IncrementalSource2["AdoptedStyleSheet"] = 15] = "AdoptedStyleSheet";
|
|
9383
9421
|
IncrementalSource2[IncrementalSource2["CustomElement"] = 16] = "CustomElement";
|
|
9422
|
+
IncrementalSource2[IncrementalSource2["VisibilityMutation"] = 17] = "VisibilityMutation";
|
|
9384
9423
|
return IncrementalSource2;
|
|
9385
9424
|
})(IncrementalSource || {});
|
|
9386
9425
|
var MouseInteractions = /* @__PURE__ */ ((MouseInteractions2) => {
|
|
@@ -9527,7 +9566,6 @@ class MutationBuffer {
|
|
|
9527
9566
|
__publicField(this, "maskTextClass");
|
|
9528
9567
|
__publicField(this, "maskTextSelector");
|
|
9529
9568
|
__publicField(this, "excludeAttribute");
|
|
9530
|
-
__publicField(this, "includeAttribute");
|
|
9531
9569
|
__publicField(this, "inlineStylesheet");
|
|
9532
9570
|
__publicField(this, "maskInputOptions");
|
|
9533
9571
|
__publicField(this, "maskTextFn");
|
|
@@ -9543,6 +9581,7 @@ class MutationBuffer {
|
|
|
9543
9581
|
__publicField(this, "stylesheetManager");
|
|
9544
9582
|
__publicField(this, "shadowDomManager");
|
|
9545
9583
|
__publicField(this, "canvasManager");
|
|
9584
|
+
__publicField(this, "visibilityManager");
|
|
9546
9585
|
__publicField(this, "processedNodeManager");
|
|
9547
9586
|
__publicField(this, "unattachedDoc");
|
|
9548
9587
|
__publicField(this, "processMutations", (mutations) => {
|
|
@@ -9592,7 +9631,6 @@ class MutationBuffer {
|
|
|
9592
9631
|
maskTextClass: this.maskTextClass,
|
|
9593
9632
|
maskTextSelector: this.maskTextSelector,
|
|
9594
9633
|
excludeAttribute: this.excludeAttribute,
|
|
9595
|
-
includeAttribute: this.includeAttribute,
|
|
9596
9634
|
skipChild: true,
|
|
9597
9635
|
newlyAddedElement: true,
|
|
9598
9636
|
inlineStylesheet: this.inlineStylesheet,
|
|
@@ -9638,7 +9676,8 @@ class MutationBuffer {
|
|
|
9638
9676
|
this.mirror.removeNodeFromMap(this.mapRemoves.shift());
|
|
9639
9677
|
}
|
|
9640
9678
|
for (const n2 of this.movedSet) {
|
|
9641
|
-
if (isParentRemoved(this.removesSubTreeCache, n2, this.mirror) &&
|
|
9679
|
+
if (isParentRemoved(this.removesSubTreeCache, n2, this.mirror) && // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
9680
|
+
!this.movedSet.has(index.parentNode(n2))) {
|
|
9642
9681
|
continue;
|
|
9643
9682
|
}
|
|
9644
9683
|
pushAdd(n2);
|
|
@@ -9794,12 +9833,60 @@ class MutationBuffer {
|
|
|
9794
9833
|
const target = m.target;
|
|
9795
9834
|
let attributeName = m.attributeName;
|
|
9796
9835
|
let value = m.target.getAttribute(attributeName);
|
|
9797
|
-
const
|
|
9798
|
-
const
|
|
9799
|
-
|
|
9836
|
+
const attrKey = attributeName;
|
|
9837
|
+
const propValue = target[attrKey];
|
|
9838
|
+
const isBooleanAttr = typeof propValue === "boolean";
|
|
9839
|
+
const inDOM = document.contains(target);
|
|
9840
|
+
const isVisible = isElementVisible(target);
|
|
9841
|
+
const isExcludeAttributeName = isExcludeAttribute(attributeName, this.excludeAttribute);
|
|
9842
|
+
const isPhantomAttributeMutation = value === null && // текущего атрибута нет
|
|
9843
|
+
!target.hasAttribute(attributeName) && // явно подтверждаем отсутствие
|
|
9844
|
+
m.oldValue !== null && // раньше он был
|
|
9845
|
+
(propValue === "" || // свойство = пустая строка
|
|
9846
|
+
propValue === null || // или null
|
|
9847
|
+
typeof propValue === "undefined");
|
|
9848
|
+
if (isPhantomAttributeMutation) {
|
|
9849
|
+
console.debug(
|
|
9850
|
+
`[${nowTimestamp()}] [rrweb:record/mutation] ⛔ phantom attribute mutation ignored`,
|
|
9851
|
+
{
|
|
9852
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-call
|
|
9853
|
+
node: index.describeNode(target),
|
|
9854
|
+
tag: target.tagName,
|
|
9855
|
+
nodeType: target.nodeType,
|
|
9856
|
+
attribute: attributeName,
|
|
9857
|
+
value,
|
|
9858
|
+
oldValue: m.oldValue,
|
|
9859
|
+
excludeAttribute: this.excludeAttribute,
|
|
9860
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
9861
|
+
propValue,
|
|
9862
|
+
isBooleanAttr,
|
|
9863
|
+
inDOM,
|
|
9864
|
+
isVisible,
|
|
9865
|
+
isExcludeAttributeName
|
|
9866
|
+
}
|
|
9867
|
+
);
|
|
9800
9868
|
return;
|
|
9801
9869
|
}
|
|
9802
9870
|
if (isExcludeAttribute(attributeName, this.excludeAttribute)) {
|
|
9871
|
+
console.debug(
|
|
9872
|
+
`[${nowTimestamp()}] [rrweb:record/mutation] ⛔ excluded attribute mutation ignored`,
|
|
9873
|
+
{
|
|
9874
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-call
|
|
9875
|
+
node: index.describeNode(target),
|
|
9876
|
+
tag: target.tagName,
|
|
9877
|
+
nodeType: target.nodeType,
|
|
9878
|
+
attribute: attributeName,
|
|
9879
|
+
value,
|
|
9880
|
+
oldValue: m.oldValue,
|
|
9881
|
+
excludeAttribute: this.excludeAttribute,
|
|
9882
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
9883
|
+
propValue,
|
|
9884
|
+
isBooleanAttr,
|
|
9885
|
+
inDOM,
|
|
9886
|
+
isVisible,
|
|
9887
|
+
isExcludeAttributeName
|
|
9888
|
+
}
|
|
9889
|
+
);
|
|
9803
9890
|
return;
|
|
9804
9891
|
}
|
|
9805
9892
|
if (attributeName === "value") {
|
|
@@ -9844,13 +9931,35 @@ class MutationBuffer {
|
|
|
9844
9931
|
toLowerCase(attributeName),
|
|
9845
9932
|
value
|
|
9846
9933
|
);
|
|
9847
|
-
|
|
9848
|
-
|
|
9849
|
-
|
|
9850
|
-
|
|
9851
|
-
|
|
9852
|
-
|
|
9853
|
-
|
|
9934
|
+
const isSuspiciousClassMutation = attributeName !== "class" && (m.oldValue === null || // ранее не было класса
|
|
9935
|
+
value === "" || // класс удалён
|
|
9936
|
+
value !== m.oldValue);
|
|
9937
|
+
if (isSuspiciousClassMutation) {
|
|
9938
|
+
console.debug(
|
|
9939
|
+
`[${nowTimestamp()}] [rrweb:record/mutation] ⚠️ suspicious attribute mutation`,
|
|
9940
|
+
{
|
|
9941
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-call
|
|
9942
|
+
reason: [
|
|
9943
|
+
value === m.oldValue ? "no change in value" : null,
|
|
9944
|
+
value === propValue ? "mirrored in DOM property" : null,
|
|
9945
|
+
value === item.attributes[attributeName] ? "redundant assignment" : null
|
|
9946
|
+
].filter(Boolean).join(", ") || "uncategorized",
|
|
9947
|
+
node: index.describeNode(target),
|
|
9948
|
+
tag: target.tagName,
|
|
9949
|
+
nodeType: target.nodeType,
|
|
9950
|
+
attribute: attributeName,
|
|
9951
|
+
value,
|
|
9952
|
+
oldValue: m.oldValue,
|
|
9953
|
+
transformedValue: item.attributes[attributeName],
|
|
9954
|
+
excludeAttribute: this.excludeAttribute,
|
|
9955
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
9956
|
+
propValue,
|
|
9957
|
+
isBooleanAttr,
|
|
9958
|
+
inDOM,
|
|
9959
|
+
isVisible,
|
|
9960
|
+
isExcludeAttributeName
|
|
9961
|
+
}
|
|
9962
|
+
);
|
|
9854
9963
|
}
|
|
9855
9964
|
if (attributeName === "style") {
|
|
9856
9965
|
if (!this.unattachedDoc) {
|
|
@@ -9965,7 +10074,6 @@ class MutationBuffer {
|
|
|
9965
10074
|
"maskTextClass",
|
|
9966
10075
|
"maskTextSelector",
|
|
9967
10076
|
"excludeAttribute",
|
|
9968
|
-
"includeAttribute",
|
|
9969
10077
|
"inlineStylesheet",
|
|
9970
10078
|
"maskInputOptions",
|
|
9971
10079
|
"maskTextFn",
|
|
@@ -9981,6 +10089,7 @@ class MutationBuffer {
|
|
|
9981
10089
|
"stylesheetManager",
|
|
9982
10090
|
"shadowDomManager",
|
|
9983
10091
|
"canvasManager",
|
|
10092
|
+
"visibilityManager",
|
|
9984
10093
|
"processedNodeManager"
|
|
9985
10094
|
].forEach((key) => {
|
|
9986
10095
|
this[key] = options[key];
|
|
@@ -9989,10 +10098,12 @@ class MutationBuffer {
|
|
|
9989
10098
|
freeze() {
|
|
9990
10099
|
this.frozen = true;
|
|
9991
10100
|
this.canvasManager.freeze();
|
|
10101
|
+
this.visibilityManager.freeze();
|
|
9992
10102
|
}
|
|
9993
10103
|
unfreeze() {
|
|
9994
10104
|
this.frozen = false;
|
|
9995
10105
|
this.canvasManager.unfreeze();
|
|
10106
|
+
this.visibilityManager.unfreeze();
|
|
9996
10107
|
this.emit();
|
|
9997
10108
|
}
|
|
9998
10109
|
isFrozen() {
|
|
@@ -10001,15 +10112,18 @@ class MutationBuffer {
|
|
|
10001
10112
|
lock() {
|
|
10002
10113
|
this.locked = true;
|
|
10003
10114
|
this.canvasManager.lock();
|
|
10115
|
+
this.visibilityManager.lock();
|
|
10004
10116
|
}
|
|
10005
10117
|
unlock() {
|
|
10006
10118
|
this.locked = false;
|
|
10007
10119
|
this.canvasManager.unlock();
|
|
10120
|
+
this.visibilityManager.unlock();
|
|
10008
10121
|
this.emit();
|
|
10009
10122
|
}
|
|
10010
10123
|
reset() {
|
|
10011
10124
|
this.shadowDomManager.reset();
|
|
10012
10125
|
this.canvasManager.reset();
|
|
10126
|
+
this.visibilityManager.reset();
|
|
10013
10127
|
}
|
|
10014
10128
|
}
|
|
10015
10129
|
function deepDelete(addsSet, n2) {
|
|
@@ -10943,6 +11057,7 @@ function mergeHooks(o2, hooks) {
|
|
|
10943
11057
|
styleSheetRuleCb,
|
|
10944
11058
|
styleDeclarationCb,
|
|
10945
11059
|
canvasMutationCb,
|
|
11060
|
+
visibilityMutationCb,
|
|
10946
11061
|
fontCb,
|
|
10947
11062
|
selectionCb,
|
|
10948
11063
|
customElementCb
|
|
@@ -11007,6 +11122,12 @@ function mergeHooks(o2, hooks) {
|
|
|
11007
11122
|
}
|
|
11008
11123
|
canvasMutationCb(...p);
|
|
11009
11124
|
};
|
|
11125
|
+
o2.visibilityMutationCb = (...p) => {
|
|
11126
|
+
if (hooks.visibilityMutation) {
|
|
11127
|
+
hooks.visibilityMutation(...p);
|
|
11128
|
+
}
|
|
11129
|
+
visibilityMutationCb(...p);
|
|
11130
|
+
};
|
|
11010
11131
|
o2.fontCb = (...p) => {
|
|
11011
11132
|
if (hooks.font) {
|
|
11012
11133
|
hooks.font(...p);
|
|
@@ -12120,11 +12241,249 @@ class ProcessedNodeManager {
|
|
|
12120
12241
|
destroy() {
|
|
12121
12242
|
}
|
|
12122
12243
|
}
|
|
12244
|
+
function computeVisibility(elements, previous, options) {
|
|
12245
|
+
const root2 = (options == null ? void 0 : options.root) ?? null;
|
|
12246
|
+
const threshold = (options == null ? void 0 : options.threshold) ?? 0.5;
|
|
12247
|
+
const sensitivity = (options == null ? void 0 : options.sensitivity) ?? 0.05;
|
|
12248
|
+
const rootMarginFn = parseRootMargin((options == null ? void 0 : options.rootMargin) ?? "0px");
|
|
12249
|
+
const current = /* @__PURE__ */ new Map();
|
|
12250
|
+
const rootRect = getRootRect(root2);
|
|
12251
|
+
const expandedRoot = expandRootRect(rootRect, rootMarginFn);
|
|
12252
|
+
for (const el of elements) {
|
|
12253
|
+
const elRect = el.getBoundingClientRect();
|
|
12254
|
+
let intersectionRect = emptyRect();
|
|
12255
|
+
let intersectionRatio = 0;
|
|
12256
|
+
if (elRect.width > 0 && elRect.height > 0) {
|
|
12257
|
+
intersectionRect = computeIntersectionRect(elRect, expandedRoot);
|
|
12258
|
+
intersectionRatio = computeIntersectionRatio(elRect, intersectionRect);
|
|
12259
|
+
intersectionRatio = Math.round(intersectionRatio * 100) / 100;
|
|
12260
|
+
}
|
|
12261
|
+
const isStyle = isStyleVisible(el);
|
|
12262
|
+
const old = previous.get(el) ?? null;
|
|
12263
|
+
const prevRatio = (old == null ? void 0 : old.intersectionRatio) ?? 0;
|
|
12264
|
+
const currRatio = intersectionRatio;
|
|
12265
|
+
const wasVisible = (old == null ? void 0 : old.isStyleVisible) && prevRatio > threshold;
|
|
12266
|
+
const nowVisible = isStyle && currRatio > threshold;
|
|
12267
|
+
const changed = !old || wasVisible !== nowVisible || wasVisible !== nowVisible && Math.abs(currRatio - prevRatio) > sensitivity;
|
|
12268
|
+
if (changed) {
|
|
12269
|
+
current.set(el, {
|
|
12270
|
+
target: el,
|
|
12271
|
+
isVisible: nowVisible,
|
|
12272
|
+
isStyleVisible: isStyle,
|
|
12273
|
+
intersectionRatio: currRatio,
|
|
12274
|
+
intersectionRect,
|
|
12275
|
+
oldValue: old
|
|
12276
|
+
});
|
|
12277
|
+
} else {
|
|
12278
|
+
current.set(el, old);
|
|
12279
|
+
}
|
|
12280
|
+
}
|
|
12281
|
+
return current;
|
|
12282
|
+
}
|
|
12283
|
+
function parseRootMargin(marginStr) {
|
|
12284
|
+
const parts = marginStr.trim().split(/\s+/);
|
|
12285
|
+
const getValue = (val, size) => val.endsWith("%") ? parseFloat(val) / 100 * size : parseFloat(val) || 0;
|
|
12286
|
+
return function(rootRect) {
|
|
12287
|
+
const top = getValue(parts[0] || "0px", rootRect.height);
|
|
12288
|
+
const right = getValue(parts[1] || parts[0] || "0px", rootRect.width);
|
|
12289
|
+
const bottom = getValue(parts[2] || parts[0] || "0px", rootRect.height);
|
|
12290
|
+
const left = getValue(parts[3] || parts[1] || parts[0] || "0px", rootRect.width);
|
|
12291
|
+
return { top, right, bottom, left, width: 0, height: 0 };
|
|
12292
|
+
};
|
|
12293
|
+
}
|
|
12294
|
+
function getRootRect(root2) {
|
|
12295
|
+
return root2 ? root2.getBoundingClientRect() : new DOMRect(0, 0, window.innerWidth, window.innerHeight);
|
|
12296
|
+
}
|
|
12297
|
+
function expandRootRect(rect, marginFn) {
|
|
12298
|
+
const margin = marginFn(rect);
|
|
12299
|
+
return new DOMRect(
|
|
12300
|
+
rect.left - margin.left,
|
|
12301
|
+
rect.top - margin.top,
|
|
12302
|
+
rect.width + margin.left + margin.right,
|
|
12303
|
+
rect.height + margin.top + margin.bottom
|
|
12304
|
+
);
|
|
12305
|
+
}
|
|
12306
|
+
function computeIntersectionRect(a2, b) {
|
|
12307
|
+
const top = Math.max(a2.top, b.top);
|
|
12308
|
+
const left = Math.max(a2.left, b.left);
|
|
12309
|
+
const bottom = Math.min(a2.bottom, b.bottom);
|
|
12310
|
+
const right = Math.min(a2.right, b.right);
|
|
12311
|
+
const width = Math.max(0, right - left);
|
|
12312
|
+
const height = Math.max(0, bottom - top);
|
|
12313
|
+
return { top, left, bottom, right, width, height };
|
|
12314
|
+
}
|
|
12315
|
+
function computeIntersectionRatio(elRect, intersectionRect) {
|
|
12316
|
+
const elArea = elRect.width * elRect.height;
|
|
12317
|
+
const intArea = intersectionRect.width * intersectionRect.height;
|
|
12318
|
+
return elArea > 0 ? intArea / elArea : 0;
|
|
12319
|
+
}
|
|
12320
|
+
function emptyRect() {
|
|
12321
|
+
return { top: 0, left: 0, right: 0, bottom: 0, width: 0, height: 0 };
|
|
12322
|
+
}
|
|
12323
|
+
function isStyleVisible(el) {
|
|
12324
|
+
const style = getComputedStyle(el);
|
|
12325
|
+
return style && style.display !== "none" && style.visibility !== "hidden" && parseFloat(style.opacity || "1") > 0;
|
|
12326
|
+
}
|
|
12327
|
+
class VisibilityManager {
|
|
12328
|
+
constructor(options) {
|
|
12329
|
+
__publicField(this, "frozen", false);
|
|
12330
|
+
__publicField(this, "locked", false);
|
|
12331
|
+
__publicField(this, "pending", /* @__PURE__ */ new Map());
|
|
12332
|
+
__publicField(this, "mirror");
|
|
12333
|
+
__publicField(this, "mutationCb");
|
|
12334
|
+
__publicField(this, "rafId", null);
|
|
12335
|
+
__publicField(this, "rafThrottle");
|
|
12336
|
+
__publicField(this, "lastFlushTime", 0);
|
|
12337
|
+
__publicField(this, "elements", /* @__PURE__ */ new Set());
|
|
12338
|
+
__publicField(this, "previousState", /* @__PURE__ */ new Map());
|
|
12339
|
+
__publicField(this, "root", null);
|
|
12340
|
+
__publicField(this, "threshold");
|
|
12341
|
+
__publicField(this, "sensitivity");
|
|
12342
|
+
__publicField(this, "rootMargin");
|
|
12343
|
+
__publicField(this, "hasInitialized", false);
|
|
12344
|
+
__publicField(this, "mode", "none");
|
|
12345
|
+
__publicField(this, "debounce", 50);
|
|
12346
|
+
__publicField(this, "throttle", 100);
|
|
12347
|
+
__publicField(this, "buffer", /* @__PURE__ */ new Map());
|
|
12348
|
+
__publicField(this, "debounceTimer", null);
|
|
12349
|
+
__publicField(this, "lastThrottleTime", 0);
|
|
12350
|
+
__publicField(this, "disabled", false);
|
|
12351
|
+
__publicField(this, "notifyActivity");
|
|
12352
|
+
const { doc, mirror: mirror2, sampling, mutationCb, notifyActivity } = options;
|
|
12353
|
+
this.mirror = mirror2;
|
|
12354
|
+
this.mutationCb = mutationCb;
|
|
12355
|
+
this.notifyActivity = notifyActivity;
|
|
12356
|
+
this.rootMargin = "0px";
|
|
12357
|
+
if (sampling === false) {
|
|
12358
|
+
this.disabled = true;
|
|
12359
|
+
return;
|
|
12360
|
+
}
|
|
12361
|
+
const visibilitySampling = typeof sampling === "object" && sampling !== null ? sampling : {};
|
|
12362
|
+
this.mode = (visibilitySampling == null ? void 0 : visibilitySampling.mode) ?? "none";
|
|
12363
|
+
this.debounce = Number((visibilitySampling == null ? void 0 : visibilitySampling.debounce) ?? 100);
|
|
12364
|
+
this.throttle = Number((visibilitySampling == null ? void 0 : visibilitySampling.throttle) ?? 100);
|
|
12365
|
+
this.threshold = Number((visibilitySampling == null ? void 0 : visibilitySampling.threshold) ?? 0.5);
|
|
12366
|
+
this.sensitivity = Number((visibilitySampling == null ? void 0 : visibilitySampling.sensitivity) ?? 0.05);
|
|
12367
|
+
this.rafThrottle = Number((visibilitySampling == null ? void 0 : visibilitySampling.rafThrottle) ?? 100);
|
|
12368
|
+
doc.querySelectorAll("*").forEach((el) => this.observe(el));
|
|
12369
|
+
const mo = new MutationObserver((mutations) => {
|
|
12370
|
+
mutations.forEach((m) => {
|
|
12371
|
+
m.addedNodes.forEach((n2) => {
|
|
12372
|
+
if (n2.nodeType === Node.ELEMENT_NODE) {
|
|
12373
|
+
this.observe(n2);
|
|
12374
|
+
n2.querySelectorAll("*").forEach((el) => this.observe(el));
|
|
12375
|
+
}
|
|
12376
|
+
});
|
|
12377
|
+
m.removedNodes.forEach((n2) => {
|
|
12378
|
+
if (n2.nodeType === Node.ELEMENT_NODE) {
|
|
12379
|
+
this.unobserve(n2);
|
|
12380
|
+
}
|
|
12381
|
+
});
|
|
12382
|
+
});
|
|
12383
|
+
});
|
|
12384
|
+
mo.observe(doc.body, { childList: true, subtree: true });
|
|
12385
|
+
this.startPendingFlushLoop();
|
|
12386
|
+
}
|
|
12387
|
+
startPendingFlushLoop() {
|
|
12388
|
+
if (this.disabled) return;
|
|
12389
|
+
const loop = (timestamp) => {
|
|
12390
|
+
if (timestamp - this.lastFlushTime >= this.rafThrottle) {
|
|
12391
|
+
this.lastFlushTime = timestamp;
|
|
12392
|
+
this.flushPendingVisibilityMutations();
|
|
12393
|
+
}
|
|
12394
|
+
this.rafId = requestAnimationFrame(loop);
|
|
12395
|
+
};
|
|
12396
|
+
this.rafId = requestAnimationFrame(loop);
|
|
12397
|
+
}
|
|
12398
|
+
flushPendingVisibilityMutations() {
|
|
12399
|
+
if (this.disabled) return;
|
|
12400
|
+
if (this.frozen || this.locked || this.elements.size === 0) return;
|
|
12401
|
+
const state = computeVisibility(this.elements, this.previousState, {
|
|
12402
|
+
root: this.root,
|
|
12403
|
+
threshold: this.threshold,
|
|
12404
|
+
sensitivity: this.sensitivity,
|
|
12405
|
+
rootMargin: this.rootMargin
|
|
12406
|
+
});
|
|
12407
|
+
for (const [el, entry] of state.entries()) {
|
|
12408
|
+
const old = this.previousState.get(el);
|
|
12409
|
+
const changed = !old || old.isVisible !== entry.isVisible || Math.abs(old.intersectionRatio - entry.intersectionRatio) > this.sensitivity;
|
|
12410
|
+
if (changed) {
|
|
12411
|
+
const id = this.mirror.getId(el);
|
|
12412
|
+
if (id !== -1) {
|
|
12413
|
+
this.buffer.set(el, {
|
|
12414
|
+
id,
|
|
12415
|
+
isVisible: entry.isVisible,
|
|
12416
|
+
ratio: entry.intersectionRatio
|
|
12417
|
+
});
|
|
12418
|
+
}
|
|
12419
|
+
this.previousState.set(el, entry);
|
|
12420
|
+
}
|
|
12421
|
+
}
|
|
12422
|
+
this.previousState = state;
|
|
12423
|
+
if (!this.hasInitialized) {
|
|
12424
|
+
this.hasInitialized = true;
|
|
12425
|
+
this.buffer.clear();
|
|
12426
|
+
return;
|
|
12427
|
+
}
|
|
12428
|
+
this.scheduleEmit();
|
|
12429
|
+
}
|
|
12430
|
+
scheduleEmit() {
|
|
12431
|
+
if (this.mode === "debounce") {
|
|
12432
|
+
clearTimeout(this.debounceTimer);
|
|
12433
|
+
this.debounceTimer = setTimeout(() => this.flushBuffer(), this.debounce);
|
|
12434
|
+
} else if (this.mode === "throttle") {
|
|
12435
|
+
const now = performance.now();
|
|
12436
|
+
if (now - this.lastThrottleTime >= this.throttle) {
|
|
12437
|
+
this.lastThrottleTime = now;
|
|
12438
|
+
this.flushBuffer();
|
|
12439
|
+
}
|
|
12440
|
+
} else {
|
|
12441
|
+
this.flushBuffer();
|
|
12442
|
+
}
|
|
12443
|
+
}
|
|
12444
|
+
flushBuffer() {
|
|
12445
|
+
var _a2;
|
|
12446
|
+
if (this.buffer.size === 0) return;
|
|
12447
|
+
(_a2 = this.notifyActivity) == null ? void 0 : _a2.call(this, this.buffer.size);
|
|
12448
|
+
this.mutationCb({ mutations: Array.from(this.buffer.values()) });
|
|
12449
|
+
this.buffer.clear();
|
|
12450
|
+
}
|
|
12451
|
+
observe(el) {
|
|
12452
|
+
if (this.disabled) return;
|
|
12453
|
+
this.elements.add(el);
|
|
12454
|
+
}
|
|
12455
|
+
unobserve(el) {
|
|
12456
|
+
if (this.disabled) return;
|
|
12457
|
+
this.elements.delete(el);
|
|
12458
|
+
this.previousState.delete(el);
|
|
12459
|
+
this.pending.delete(el);
|
|
12460
|
+
}
|
|
12461
|
+
freeze() {
|
|
12462
|
+
this.frozen = true;
|
|
12463
|
+
}
|
|
12464
|
+
unfreeze() {
|
|
12465
|
+
this.frozen = false;
|
|
12466
|
+
}
|
|
12467
|
+
lock() {
|
|
12468
|
+
this.locked = true;
|
|
12469
|
+
}
|
|
12470
|
+
unlock() {
|
|
12471
|
+
this.locked = false;
|
|
12472
|
+
}
|
|
12473
|
+
reset() {
|
|
12474
|
+
this.elements.clear();
|
|
12475
|
+
this.previousState.clear();
|
|
12476
|
+
this.pending.clear();
|
|
12477
|
+
if (this.rafId) cancelAnimationFrame(this.rafId);
|
|
12478
|
+
}
|
|
12479
|
+
}
|
|
12123
12480
|
let wrappedEmit;
|
|
12124
12481
|
let takeFullSnapshot$1;
|
|
12125
12482
|
let canvasManager;
|
|
12483
|
+
let visibilityManager;
|
|
12126
12484
|
let recording = false;
|
|
12127
|
-
const
|
|
12485
|
+
const customEventQueue = [];
|
|
12486
|
+
let flushCustomEventQueue;
|
|
12128
12487
|
try {
|
|
12129
12488
|
if (Array.from([1], (x2) => x2 * 2)[0] !== 2) {
|
|
12130
12489
|
const cleanFrame = document.createElement("iframe");
|
|
@@ -12141,12 +12500,12 @@ function record(options = {}) {
|
|
|
12141
12500
|
emit,
|
|
12142
12501
|
checkoutEveryNms,
|
|
12143
12502
|
checkoutEveryNth,
|
|
12503
|
+
checkoutEveryNvm,
|
|
12144
12504
|
blockClass = "rr-block",
|
|
12145
12505
|
blockSelector = null,
|
|
12146
12506
|
ignoreClass = "rr-ignore",
|
|
12147
12507
|
ignoreSelector = null,
|
|
12148
12508
|
excludeAttribute: _excludeAttribute,
|
|
12149
|
-
includeAttribute: _includeAttribute,
|
|
12150
12509
|
maskTextClass = "rr-mask",
|
|
12151
12510
|
maskTextSelector = null,
|
|
12152
12511
|
inlineStylesheet = true,
|
|
@@ -12164,7 +12523,7 @@ function record(options = {}) {
|
|
|
12164
12523
|
recordCanvas = false,
|
|
12165
12524
|
recordCrossOriginIframes = false,
|
|
12166
12525
|
recordAfter = options.recordAfter === "DOMContentLoaded" ? options.recordAfter : "load",
|
|
12167
|
-
|
|
12526
|
+
flushCustomEvent = options.flushCustomEvent !== void 0 ? options.flushCustomEvent : "after",
|
|
12168
12527
|
userTriggeredOnInput = false,
|
|
12169
12528
|
collectFonts = false,
|
|
12170
12529
|
inlineImages = false,
|
|
@@ -12196,8 +12555,7 @@ function record(options = {}) {
|
|
|
12196
12555
|
sampling.mousemove = mousemoveWait;
|
|
12197
12556
|
}
|
|
12198
12557
|
mirror.reset();
|
|
12199
|
-
const excludeAttribute = _excludeAttribute === void 0 ?
|
|
12200
|
-
const includeAttribute = _includeAttribute === void 0 ? /.+/i : _includeAttribute;
|
|
12558
|
+
const excludeAttribute = _excludeAttribute === void 0 ? /.^/ : _excludeAttribute;
|
|
12201
12559
|
const maskInputOptions = maskAllInputs === true ? {
|
|
12202
12560
|
color: true,
|
|
12203
12561
|
date: true,
|
|
@@ -12234,6 +12592,10 @@ function record(options = {}) {
|
|
|
12234
12592
|
polyfill$1();
|
|
12235
12593
|
let lastFullSnapshotEvent;
|
|
12236
12594
|
let incrementalSnapshotCount = 0;
|
|
12595
|
+
let recentVisibilityChanges = 0;
|
|
12596
|
+
const onVisibilityActivity = (count) => {
|
|
12597
|
+
recentVisibilityChanges += count;
|
|
12598
|
+
};
|
|
12237
12599
|
const eventProcessor = (e2) => {
|
|
12238
12600
|
for (const plugin3 of plugins || []) {
|
|
12239
12601
|
if (plugin3.eventProcessor) {
|
|
@@ -12274,7 +12636,11 @@ function record(options = {}) {
|
|
|
12274
12636
|
incrementalSnapshotCount++;
|
|
12275
12637
|
const exceedCount = checkoutEveryNth && incrementalSnapshotCount >= checkoutEveryNth;
|
|
12276
12638
|
const exceedTime = checkoutEveryNms && e2.timestamp - lastFullSnapshotEvent.timestamp > checkoutEveryNms;
|
|
12277
|
-
|
|
12639
|
+
const exceedVisibility = checkoutEveryNvm && recentVisibilityChanges >= checkoutEveryNvm;
|
|
12640
|
+
if (exceedCount || exceedTime || exceedVisibility) {
|
|
12641
|
+
if (exceedVisibility) {
|
|
12642
|
+
recentVisibilityChanges = 0;
|
|
12643
|
+
}
|
|
12278
12644
|
takeFullSnapshot$1(true);
|
|
12279
12645
|
}
|
|
12280
12646
|
}
|
|
@@ -12302,6 +12668,17 @@ function record(options = {}) {
|
|
|
12302
12668
|
...p
|
|
12303
12669
|
}
|
|
12304
12670
|
});
|
|
12671
|
+
const wrappedVisibilityMutationEmit = (p) => {
|
|
12672
|
+
var _a2;
|
|
12673
|
+
(_a2 = hooks == null ? void 0 : hooks.visibilityMutation) == null ? void 0 : _a2.call(hooks, p);
|
|
12674
|
+
wrappedEmit({
|
|
12675
|
+
type: EventType.IncrementalSnapshot,
|
|
12676
|
+
data: {
|
|
12677
|
+
source: IncrementalSource.VisibilityMutation,
|
|
12678
|
+
...p
|
|
12679
|
+
}
|
|
12680
|
+
});
|
|
12681
|
+
};
|
|
12305
12682
|
const wrappedAdoptedStyleSheetEmit = (a2) => wrappedEmit({
|
|
12306
12683
|
type: EventType.IncrementalSnapshot,
|
|
12307
12684
|
data: {
|
|
@@ -12339,6 +12716,13 @@ function record(options = {}) {
|
|
|
12339
12716
|
sampling: sampling.canvas,
|
|
12340
12717
|
dataURLOptions
|
|
12341
12718
|
});
|
|
12719
|
+
visibilityManager = new VisibilityManager({
|
|
12720
|
+
doc: window.document,
|
|
12721
|
+
mirror,
|
|
12722
|
+
sampling: sampling.visibility,
|
|
12723
|
+
mutationCb: wrappedVisibilityMutationEmit,
|
|
12724
|
+
notifyActivity: onVisibilityActivity
|
|
12725
|
+
});
|
|
12342
12726
|
const shadowDomManager = new ShadowDomManager({
|
|
12343
12727
|
mutationCb: wrappedMutationEmit,
|
|
12344
12728
|
scrollCb: wrappedScrollEmit,
|
|
@@ -12348,7 +12732,6 @@ function record(options = {}) {
|
|
|
12348
12732
|
maskTextClass,
|
|
12349
12733
|
maskTextSelector,
|
|
12350
12734
|
excludeAttribute,
|
|
12351
|
-
includeAttribute,
|
|
12352
12735
|
inlineStylesheet,
|
|
12353
12736
|
maskInputOptions,
|
|
12354
12737
|
dataURLOptions,
|
|
@@ -12361,6 +12744,7 @@ function record(options = {}) {
|
|
|
12361
12744
|
iframeManager,
|
|
12362
12745
|
stylesheetManager,
|
|
12363
12746
|
canvasManager,
|
|
12747
|
+
visibilityManager,
|
|
12364
12748
|
keepIframeSrcFn,
|
|
12365
12749
|
processedNodeManager
|
|
12366
12750
|
},
|
|
@@ -12391,7 +12775,6 @@ function record(options = {}) {
|
|
|
12391
12775
|
maskTextClass,
|
|
12392
12776
|
maskTextSelector,
|
|
12393
12777
|
excludeAttribute,
|
|
12394
|
-
includeAttribute,
|
|
12395
12778
|
inlineStylesheet,
|
|
12396
12779
|
maskAllInputs: maskInputOptions,
|
|
12397
12780
|
maskTextFn,
|
|
@@ -12440,6 +12823,12 @@ function record(options = {}) {
|
|
|
12440
12823
|
mirror.getId(document)
|
|
12441
12824
|
);
|
|
12442
12825
|
};
|
|
12826
|
+
flushCustomEventQueue = () => {
|
|
12827
|
+
for (const e2 of customEventQueue) {
|
|
12828
|
+
wrappedEmit(e2);
|
|
12829
|
+
}
|
|
12830
|
+
customEventQueue.length = 0;
|
|
12831
|
+
};
|
|
12443
12832
|
try {
|
|
12444
12833
|
const handlers = [];
|
|
12445
12834
|
const observe = (doc) => {
|
|
@@ -12498,6 +12887,7 @@ function record(options = {}) {
|
|
|
12498
12887
|
}
|
|
12499
12888
|
}),
|
|
12500
12889
|
canvasMutationCb: wrappedCanvasMutationEmit,
|
|
12890
|
+
visibilityMutationCb: wrappedVisibilityMutationEmit,
|
|
12501
12891
|
fontCb: (p) => wrappedEmit({
|
|
12502
12892
|
type: EventType.IncrementalSnapshot,
|
|
12503
12893
|
data: {
|
|
@@ -12529,7 +12919,6 @@ function record(options = {}) {
|
|
|
12529
12919
|
maskTextClass,
|
|
12530
12920
|
maskTextSelector,
|
|
12531
12921
|
excludeAttribute,
|
|
12532
|
-
includeAttribute,
|
|
12533
12922
|
maskInputOptions,
|
|
12534
12923
|
inlineStylesheet,
|
|
12535
12924
|
sampling,
|
|
@@ -12551,6 +12940,7 @@ function record(options = {}) {
|
|
|
12551
12940
|
shadowDomManager,
|
|
12552
12941
|
processedNodeManager,
|
|
12553
12942
|
canvasManager,
|
|
12943
|
+
visibilityManager,
|
|
12554
12944
|
ignoreCSSAttributes,
|
|
12555
12945
|
plugins: ((_a2 = plugins == null ? void 0 : plugins.filter((p) => p.observer)) == null ? void 0 : _a2.map((p) => ({
|
|
12556
12946
|
observer: p.observer,
|
|
@@ -12575,14 +12965,14 @@ function record(options = {}) {
|
|
|
12575
12965
|
}
|
|
12576
12966
|
});
|
|
12577
12967
|
const init = () => {
|
|
12578
|
-
if (
|
|
12579
|
-
|
|
12968
|
+
if (flushCustomEvent === "before") {
|
|
12969
|
+
flushCustomEventQueue();
|
|
12580
12970
|
}
|
|
12581
12971
|
takeFullSnapshot$1();
|
|
12582
12972
|
handlers.push(observe(document));
|
|
12583
12973
|
recording = true;
|
|
12584
|
-
if (
|
|
12585
|
-
|
|
12974
|
+
if (flushCustomEvent === "after") {
|
|
12975
|
+
flushCustomEventQueue();
|
|
12586
12976
|
}
|
|
12587
12977
|
};
|
|
12588
12978
|
if (document.readyState === "interactive" || document.readyState === "complete") {
|
|
@@ -12612,7 +13002,7 @@ function record(options = {}) {
|
|
|
12612
13002
|
);
|
|
12613
13003
|
}
|
|
12614
13004
|
return () => {
|
|
12615
|
-
|
|
13005
|
+
flushCustomEventQueue();
|
|
12616
13006
|
handlers.forEach((h) => h());
|
|
12617
13007
|
processedNodeManager.destroy();
|
|
12618
13008
|
recording = false;
|
|
@@ -12622,12 +13012,10 @@ function record(options = {}) {
|
|
|
12622
13012
|
console.warn(error);
|
|
12623
13013
|
}
|
|
12624
13014
|
}
|
|
12625
|
-
|
|
12626
|
-
|
|
12627
|
-
|
|
12628
|
-
|
|
12629
|
-
preRecordingCustomEvents.length = 0;
|
|
12630
|
-
}
|
|
13015
|
+
record.flushCustomEventQueue = () => {
|
|
13016
|
+
console.warn(`[rrweb] CustomEvent flushing: ${customEventQueue.length} events`);
|
|
13017
|
+
flushCustomEventQueue();
|
|
13018
|
+
};
|
|
12631
13019
|
record.addCustomEvent = (tag, payload) => {
|
|
12632
13020
|
const customEvent = {
|
|
12633
13021
|
type: EventType.Custom,
|
|
@@ -12637,8 +13025,8 @@ record.addCustomEvent = (tag, payload) => {
|
|
|
12637
13025
|
}
|
|
12638
13026
|
};
|
|
12639
13027
|
if (!recording) {
|
|
12640
|
-
console.warn(`[rrweb] CustomEvent buffered before recording start: ${tag}`);
|
|
12641
|
-
|
|
13028
|
+
console.warn(`[rrweb] CustomEvent buffered before/after recording start: ${tag}`);
|
|
13029
|
+
customEventQueue.push(customEvent);
|
|
12642
13030
|
return;
|
|
12643
13031
|
}
|
|
12644
13032
|
wrappedEmit(customEvent);
|