feat: shadow dom support

This commit is contained in:
Rohit
2025-07-16 00:27:07 +05:30
parent 16c788f955
commit 8cdb4f0bfd

View File

@@ -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",