diff --git a/src/components/recorder/DOMBrowserRenderer.tsx b/src/components/recorder/DOMBrowserRenderer.tsx index 7e909854..7fcafdeb 100644 --- a/src/components/recorder/DOMBrowserRenderer.tsx +++ b/src/components/recorder/DOMBrowserRenderer.tsx @@ -167,7 +167,6 @@ export const DOMBrowserRenderer: React.FC = ({ const containerRef = useRef(null); const iframeRef = useRef(null); const [isRendered, setIsRendered] = useState(false); - const [renderError, setRenderError] = useState(null); const [lastMousePosition, setLastMousePosition] = useState({ x: 0, y: 0 }); const [currentHighlight, setCurrentHighlight] = useState<{ element: Element; @@ -342,7 +341,10 @@ export const DOMBrowserRenderer: React.FC = ({ const existingHandlers = (iframeDoc as any)._domRendererHandlers; if (existingHandlers) { Object.entries(existingHandlers).forEach(([event, handler]) => { - iframeDoc.removeEventListener(event, handler as EventListener, false); // Changed to false + const options: boolean | AddEventListenerOptions = ['wheel', 'touchstart', 'touchmove'].includes(event) + ? { passive: false } + : false; + iframeDoc.removeEventListener(event, handler as EventListener, options); }); } @@ -700,7 +702,11 @@ export const DOMBrowserRenderer: React.FC = ({ return; } - e.preventDefault(); + if (isInCaptureMode) { + e.preventDefault(); + e.stopPropagation(); + return; + } if (!isInCaptureMode) { const wheelEvent = e as WheelEvent; @@ -752,7 +758,10 @@ export const DOMBrowserRenderer: React.FC = ({ handlers.beforeunload = preventDefaults; Object.entries(handlers).forEach(([event, handler]) => { - iframeDoc.addEventListener(event, handler, false); + const options: boolean | AddEventListenerOptions = ['wheel', 'touchstart', 'touchmove'].includes(event) + ? { passive: false } + : false; + iframeDoc.addEventListener(event, handler, options); }); // Store handlers for cleanup @@ -795,11 +804,39 @@ export const DOMBrowserRenderer: React.FC = ({ } try { - setRenderError(null); setIsRendered(false); const iframe = iframeRef.current!; - const iframeDoc = iframe.contentDocument!; + let iframeDoc: Document; + + try { + iframeDoc = iframe.contentDocument!; + if (!iframeDoc) { + throw new Error("Cannot access iframe document"); + } + } catch (crossOriginError) { + console.warn("Cross-origin iframe access blocked, recreating iframe"); + + const newIframe = document.createElement('iframe'); + newIframe.style.cssText = iframe.style.cssText; + newIframe.sandbox = iframe.sandbox.value; + newIframe.title = iframe.title; + newIframe.tabIndex = iframe.tabIndex; + newIframe.id = iframe.id; + + iframe.parentNode?.replaceChild(newIframe, iframe); + Object.defineProperty(iframeRef, 'current', { + value: newIframe, + writable: false, + enumerable: true, + configurable: true + }); + + iframeDoc = newIframe.contentDocument!; + if (!iframeDoc) { + throw new Error("Cannot access new iframe document"); + } + } const styleTags = Array.from( document.querySelectorAll('link[rel="stylesheet"], style') @@ -897,8 +934,6 @@ export const DOMBrowserRenderer: React.FC = ({ setupIframeInteractions(iframeDoc); } catch (error) { console.error("Error rendering rrweb snapshot:", error); - setRenderError(error instanceof Error ? error.message : String(error)); - showErrorInIframe(error); } }, [setupIframeInteractions, isInCaptureMode, isCachingChildSelectors] @@ -919,89 +954,6 @@ export const DOMBrowserRenderer: React.FC = ({ } }, [getText, getList, listSelector, isRendered, setupIframeInteractions]); - /** - * Show error message in iframe - */ - const showErrorInIframe = (error: any) => { - if (!iframeRef.current) return; - - const iframe = iframeRef.current; - const iframeDoc = iframe.contentDocument || iframe.contentWindow?.document; - - if (iframeDoc) { - try { - iframeDoc.open(); - iframeDoc.write(` - - - - - -
-

Error Loading DOM Content

-

Failed to render the page in DOM mode.

-

Common causes:

-
    -
  • Page is still loading or navigating
  • -
  • Resource proxy timeouts or failures
  • -
  • Network connectivity issues
  • -
  • Invalid HTML structure
  • -
-

Solutions:

-
    -
  • Try switching back to Screenshot mode
  • -
  • Wait for the page to fully load and try again
  • -
  • Check your network connection
  • -
  • Refresh the browser page
  • -
- -
- Technical details -
${error.toString()}
-
-
- - - `); - iframeDoc.close(); - - window.addEventListener("message", (event) => { - if (event.data === "retry-dom-mode") { - if (socket) { - socket.emit("enable-dom-streaming"); - } - } - }); - } catch (e) { - console.error("Failed to write error message to iframe:", e); - } - } - }; - useEffect(() => { return () => { if (iframeRef.current) { @@ -1010,10 +962,13 @@ export const DOMBrowserRenderer: React.FC = ({ const handlers = (iframeDoc as any)._domRendererHandlers; if (handlers) { Object.entries(handlers).forEach(([event, handler]) => { + const options: boolean | AddEventListenerOptions = ['wheel', 'touchstart', 'touchmove'].includes(event) + ? { passive: false } + : false; iframeDoc.removeEventListener( event, handler as EventListener, - true + options ); }); } @@ -1051,7 +1006,7 @@ export const DOMBrowserRenderer: React.FC = ({ /> {/* Loading indicator */} - {!isRendered && !renderError && ( + {!isRendered && (
= ({
)} - {/* Error indicator */} - {renderError && ( -
- RENDER ERROR -
- )} - {/* Capture mode overlay */} {isInCaptureMode && (