feat: shadow dom support
This commit is contained in:
@@ -102,16 +102,20 @@ interface RRWebDOMBrowserRendererProps {
|
|||||||
paginationMode?: boolean;
|
paginationMode?: boolean;
|
||||||
paginationType?: string;
|
paginationType?: string;
|
||||||
limitMode?: boolean;
|
limitMode?: boolean;
|
||||||
|
isCachingChildSelectors?: boolean;
|
||||||
onHighlight?: (data: {
|
onHighlight?: (data: {
|
||||||
rect: DOMRect;
|
rect: DOMRect;
|
||||||
selector: string;
|
selector: string;
|
||||||
|
isShadow?: boolean;
|
||||||
elementInfo: ElementInfo | null;
|
elementInfo: ElementInfo | null;
|
||||||
childSelectors?: string[];
|
childSelectors?: string[];
|
||||||
groupInfo?: any;
|
groupInfo?: any;
|
||||||
|
similarElements?: any;
|
||||||
}) => void;
|
}) => void;
|
||||||
onElementSelect?: (data: {
|
onElementSelect?: (data: {
|
||||||
rect: DOMRect;
|
rect: DOMRect;
|
||||||
selector: string;
|
selector: string;
|
||||||
|
isShadow?: boolean;
|
||||||
elementInfo: ElementInfo | null;
|
elementInfo: ElementInfo | null;
|
||||||
childSelectors?: string[];
|
childSelectors?: string[];
|
||||||
groupInfo?: any;
|
groupInfo?: any;
|
||||||
@@ -151,6 +155,7 @@ export const DOMBrowserRenderer: React.FC<RRWebDOMBrowserRendererProps> = ({
|
|||||||
paginationMode = false,
|
paginationMode = false,
|
||||||
paginationType = "",
|
paginationType = "",
|
||||||
limitMode = false,
|
limitMode = false,
|
||||||
|
isCachingChildSelectors = false,
|
||||||
onHighlight,
|
onHighlight,
|
||||||
onElementSelect,
|
onElementSelect,
|
||||||
onShowDatePicker,
|
onShowDatePicker,
|
||||||
@@ -241,17 +246,15 @@ export const DOMBrowserRenderer: React.FC<RRWebDOMBrowserRendererProps> = ({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { rect, selector, elementInfo, childSelectors, groupInfo } =
|
const { rect, selector, elementInfo, childSelectors, groupInfo, similarElements, isShadow } =
|
||||||
highlighterData;
|
highlighterData;
|
||||||
|
|
||||||
let shouldHighlight = false;
|
let shouldHighlight = false;
|
||||||
|
|
||||||
if (getList) {
|
if (getList) {
|
||||||
// First phase: Allow any group to be highlighted for selection
|
|
||||||
if (!listSelector && groupInfo?.isGroupElement) {
|
if (!listSelector && groupInfo?.isGroupElement) {
|
||||||
shouldHighlight = true;
|
shouldHighlight = true;
|
||||||
}
|
}
|
||||||
// Second phase: Show valid children within selected group
|
|
||||||
else if (listSelector) {
|
else if (listSelector) {
|
||||||
if (limitMode) {
|
if (limitMode) {
|
||||||
shouldHighlight = false;
|
shouldHighlight = false;
|
||||||
@@ -262,19 +265,15 @@ export const DOMBrowserRenderer: React.FC<RRWebDOMBrowserRendererProps> = ({
|
|||||||
) {
|
) {
|
||||||
shouldHighlight = true;
|
shouldHighlight = true;
|
||||||
} else if (childSelectors && childSelectors.length > 0) {
|
} else if (childSelectors && childSelectors.length > 0) {
|
||||||
console.log("✅ Child selectors present, highlighting enabled");
|
|
||||||
shouldHighlight = true;
|
shouldHighlight = true;
|
||||||
} else {
|
} else {
|
||||||
console.log("❌ No child selectors available");
|
|
||||||
shouldHighlight = false;
|
shouldHighlight = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// No list selector - show regular highlighting
|
|
||||||
else {
|
else {
|
||||||
shouldHighlight = true;
|
shouldHighlight = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// getText mode - always highlight
|
|
||||||
shouldHighlight = true;
|
shouldHighlight = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -302,8 +301,10 @@ export const DOMBrowserRenderer: React.FC<RRWebDOMBrowserRendererProps> = ({
|
|||||||
isDOMMode: true,
|
isDOMMode: true,
|
||||||
},
|
},
|
||||||
selector,
|
selector,
|
||||||
|
isShadow,
|
||||||
childSelectors,
|
childSelectors,
|
||||||
groupInfo,
|
groupInfo,
|
||||||
|
similarElements, // Pass similar elements data
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -333,7 +334,6 @@ export const DOMBrowserRenderer: React.FC<RRWebDOMBrowserRendererProps> = ({
|
|||||||
onHighlight,
|
onHighlight,
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set up enhanced interaction handlers for DOM mode
|
* Set up enhanced interaction handlers for DOM mode
|
||||||
*/
|
*/
|
||||||
@@ -408,6 +408,7 @@ export const DOMBrowserRenderer: React.FC<RRWebDOMBrowserRendererProps> = ({
|
|||||||
rect: currentHighlight.rect,
|
rect: currentHighlight.rect,
|
||||||
selector: currentHighlight.selector,
|
selector: currentHighlight.selector,
|
||||||
elementInfo: currentHighlight.elementInfo,
|
elementInfo: currentHighlight.elementInfo,
|
||||||
|
isShadow: highlighterData?.isShadow,
|
||||||
childSelectors:
|
childSelectors:
|
||||||
cachedChildSelectors.length > 0
|
cachedChildSelectors.length > 0
|
||||||
? cachedChildSelectors
|
? cachedChildSelectors
|
||||||
@@ -756,7 +757,7 @@ export const DOMBrowserRenderer: React.FC<RRWebDOMBrowserRendererProps> = ({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isInCaptureMode) {
|
if (isInCaptureMode || isCachingChildSelectors) {
|
||||||
return; // Skip rendering in capture mode
|
return; // Skip rendering in capture mode
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -867,7 +868,7 @@ export const DOMBrowserRenderer: React.FC<RRWebDOMBrowserRendererProps> = ({
|
|||||||
showErrorInIframe(error);
|
showErrorInIframe(error);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[setupIframeInteractions, isInCaptureMode]
|
[setupIframeInteractions, isInCaptureMode, isCachingChildSelectors]
|
||||||
);
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -1083,7 +1084,7 @@ export const DOMBrowserRenderer: React.FC<RRWebDOMBrowserRendererProps> = ({
|
|||||||
left: 0,
|
left: 0,
|
||||||
right: 0,
|
right: 0,
|
||||||
bottom: 0,
|
bottom: 0,
|
||||||
cursor: "pointer !important",
|
cursor: "pointer",
|
||||||
pointerEvents: "none",
|
pointerEvents: "none",
|
||||||
zIndex: 999,
|
zIndex: 999,
|
||||||
borderRadius: "0px 0px 5px 5px",
|
borderRadius: "0px 0px 5px 5px",
|
||||||
|
|||||||
Reference in New Issue
Block a user