@posthog/rrweb-snapshot 0.0.41 → 0.0.42
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/record-B2nV9UFB.js +995 -0
- package/dist/record-B2nV9UFB.js.map +1 -0
- package/dist/record-oACzRSl-.cjs +994 -0
- package/dist/record-oACzRSl-.cjs.map +1 -0
- package/dist/record-oACzRSl-.umd.cjs +1569 -0
- package/dist/record-oACzRSl-.umd.cjs.map +7 -0
- package/dist/record-oACzRSl-.umd.min.cjs +20 -0
- package/dist/record-oACzRSl-.umd.min.cjs.map +7 -0
- package/dist/record.cjs +13 -986
- package/dist/record.cjs.map +1 -1
- package/dist/record.js +29 -1003
- package/dist/record.js.map +1 -1
- package/dist/record.umd.cjs +955 -929
- package/dist/record.umd.cjs.map +3 -3
- package/dist/record.umd.min.cjs +1 -1
- package/dist/record.umd.min.cjs.map +4 -4
- package/dist/rrweb-snapshot.cjs +2 -1
- package/dist/rrweb-snapshot.cjs.map +1 -1
- package/dist/rrweb-snapshot.d.cts +2 -0
- package/dist/rrweb-snapshot.d.ts +2 -0
- package/dist/rrweb-snapshot.js +24 -23
- package/dist/rrweb-snapshot.umd.cjs +10 -26
- package/dist/rrweb-snapshot.umd.cjs.map +2 -2
- package/dist/rrweb-snapshot.umd.min.cjs +11 -11
- package/dist/rrweb-snapshot.umd.min.cjs.map +3 -3
- package/package.json +3 -3
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../types/dist/rrweb-types.js", "../../utils/dist/rrweb-utils.js", "../src/utils.ts", "../src/types.ts", "../src/snapshot.ts"],
|
|
4
|
+
"sourcesContent": ["var EventType = /* @__PURE__ */ ((EventType2) => {\n EventType2[EventType2[\"DomContentLoaded\"] = 0] = \"DomContentLoaded\";\n EventType2[EventType2[\"Load\"] = 1] = \"Load\";\n EventType2[EventType2[\"FullSnapshot\"] = 2] = \"FullSnapshot\";\n EventType2[EventType2[\"IncrementalSnapshot\"] = 3] = \"IncrementalSnapshot\";\n EventType2[EventType2[\"Meta\"] = 4] = \"Meta\";\n EventType2[EventType2[\"Custom\"] = 5] = \"Custom\";\n EventType2[EventType2[\"Plugin\"] = 6] = \"Plugin\";\n return EventType2;\n})(EventType || {});\nvar IncrementalSource = /* @__PURE__ */ ((IncrementalSource2) => {\n IncrementalSource2[IncrementalSource2[\"Mutation\"] = 0] = \"Mutation\";\n IncrementalSource2[IncrementalSource2[\"MouseMove\"] = 1] = \"MouseMove\";\n IncrementalSource2[IncrementalSource2[\"MouseInteraction\"] = 2] = \"MouseInteraction\";\n IncrementalSource2[IncrementalSource2[\"Scroll\"] = 3] = \"Scroll\";\n IncrementalSource2[IncrementalSource2[\"ViewportResize\"] = 4] = \"ViewportResize\";\n IncrementalSource2[IncrementalSource2[\"Input\"] = 5] = \"Input\";\n IncrementalSource2[IncrementalSource2[\"TouchMove\"] = 6] = \"TouchMove\";\n IncrementalSource2[IncrementalSource2[\"MediaInteraction\"] = 7] = \"MediaInteraction\";\n IncrementalSource2[IncrementalSource2[\"StyleSheetRule\"] = 8] = \"StyleSheetRule\";\n IncrementalSource2[IncrementalSource2[\"CanvasMutation\"] = 9] = \"CanvasMutation\";\n IncrementalSource2[IncrementalSource2[\"Font\"] = 10] = \"Font\";\n IncrementalSource2[IncrementalSource2[\"Log\"] = 11] = \"Log\";\n IncrementalSource2[IncrementalSource2[\"Drag\"] = 12] = \"Drag\";\n IncrementalSource2[IncrementalSource2[\"StyleDeclaration\"] = 13] = \"StyleDeclaration\";\n IncrementalSource2[IncrementalSource2[\"Selection\"] = 14] = \"Selection\";\n IncrementalSource2[IncrementalSource2[\"AdoptedStyleSheet\"] = 15] = \"AdoptedStyleSheet\";\n IncrementalSource2[IncrementalSource2[\"CustomElement\"] = 16] = \"CustomElement\";\n return IncrementalSource2;\n})(IncrementalSource || {});\nvar MouseInteractions = /* @__PURE__ */ ((MouseInteractions2) => {\n MouseInteractions2[MouseInteractions2[\"MouseUp\"] = 0] = \"MouseUp\";\n MouseInteractions2[MouseInteractions2[\"MouseDown\"] = 1] = \"MouseDown\";\n MouseInteractions2[MouseInteractions2[\"Click\"] = 2] = \"Click\";\n MouseInteractions2[MouseInteractions2[\"ContextMenu\"] = 3] = \"ContextMenu\";\n MouseInteractions2[MouseInteractions2[\"DblClick\"] = 4] = \"DblClick\";\n MouseInteractions2[MouseInteractions2[\"Focus\"] = 5] = \"Focus\";\n MouseInteractions2[MouseInteractions2[\"Blur\"] = 6] = \"Blur\";\n MouseInteractions2[MouseInteractions2[\"TouchStart\"] = 7] = \"TouchStart\";\n MouseInteractions2[MouseInteractions2[\"TouchMove_Departed\"] = 8] = \"TouchMove_Departed\";\n MouseInteractions2[MouseInteractions2[\"TouchEnd\"] = 9] = \"TouchEnd\";\n MouseInteractions2[MouseInteractions2[\"TouchCancel\"] = 10] = \"TouchCancel\";\n return MouseInteractions2;\n})(MouseInteractions || {});\nvar PointerTypes = /* @__PURE__ */ ((PointerTypes2) => {\n PointerTypes2[PointerTypes2[\"Mouse\"] = 0] = \"Mouse\";\n PointerTypes2[PointerTypes2[\"Pen\"] = 1] = \"Pen\";\n PointerTypes2[PointerTypes2[\"Touch\"] = 2] = \"Touch\";\n return PointerTypes2;\n})(PointerTypes || {});\nvar CanvasContext = /* @__PURE__ */ ((CanvasContext2) => {\n CanvasContext2[CanvasContext2[\"2D\"] = 0] = \"2D\";\n CanvasContext2[CanvasContext2[\"WebGL\"] = 1] = \"WebGL\";\n CanvasContext2[CanvasContext2[\"WebGL2\"] = 2] = \"WebGL2\";\n return CanvasContext2;\n})(CanvasContext || {});\nvar MediaInteractions = /* @__PURE__ */ ((MediaInteractions2) => {\n MediaInteractions2[MediaInteractions2[\"Play\"] = 0] = \"Play\";\n MediaInteractions2[MediaInteractions2[\"Pause\"] = 1] = \"Pause\";\n MediaInteractions2[MediaInteractions2[\"Seeked\"] = 2] = \"Seeked\";\n MediaInteractions2[MediaInteractions2[\"VolumeChange\"] = 3] = \"VolumeChange\";\n MediaInteractions2[MediaInteractions2[\"RateChange\"] = 4] = \"RateChange\";\n return MediaInteractions2;\n})(MediaInteractions || {});\nvar ReplayerEvents = /* @__PURE__ */ ((ReplayerEvents2) => {\n ReplayerEvents2[\"Start\"] = \"start\";\n ReplayerEvents2[\"Pause\"] = \"pause\";\n ReplayerEvents2[\"Resume\"] = \"resume\";\n ReplayerEvents2[\"Resize\"] = \"resize\";\n ReplayerEvents2[\"Finish\"] = \"finish\";\n ReplayerEvents2[\"FullsnapshotRebuilded\"] = \"fullsnapshot-rebuilded\";\n ReplayerEvents2[\"LoadStylesheetStart\"] = \"load-stylesheet-start\";\n ReplayerEvents2[\"LoadStylesheetEnd\"] = \"load-stylesheet-end\";\n ReplayerEvents2[\"SkipStart\"] = \"skip-start\";\n ReplayerEvents2[\"SkipEnd\"] = \"skip-end\";\n ReplayerEvents2[\"MouseInteraction\"] = \"mouse-interaction\";\n ReplayerEvents2[\"EventCast\"] = \"event-cast\";\n ReplayerEvents2[\"CustomEvent\"] = \"custom-event\";\n ReplayerEvents2[\"Flush\"] = \"flush\";\n ReplayerEvents2[\"StateChange\"] = \"state-change\";\n ReplayerEvents2[\"PlayBack\"] = \"play-back\";\n ReplayerEvents2[\"Destroy\"] = \"destroy\";\n return ReplayerEvents2;\n})(ReplayerEvents || {});\nvar NodeType = /* @__PURE__ */ ((NodeType2) => {\n NodeType2[NodeType2[\"Document\"] = 0] = \"Document\";\n NodeType2[NodeType2[\"DocumentType\"] = 1] = \"DocumentType\";\n NodeType2[NodeType2[\"Element\"] = 2] = \"Element\";\n NodeType2[NodeType2[\"Text\"] = 3] = \"Text\";\n NodeType2[NodeType2[\"CDATA\"] = 4] = \"CDATA\";\n NodeType2[NodeType2[\"Comment\"] = 5] = \"Comment\";\n return NodeType2;\n})(NodeType || {});\nexport {\n CanvasContext,\n EventType,\n IncrementalSource,\n MediaInteractions,\n MouseInteractions,\n NodeType,\n PointerTypes,\n ReplayerEvents\n};\n//# sourceMappingURL=rrweb-types.js.map\n", "const testableAccessors = {\n Node: [\"childNodes\", \"parentNode\", \"parentElement\", \"textContent\"],\n ShadowRoot: [\"host\", \"styleSheets\"],\n Element: [\"shadowRoot\", \"querySelector\", \"querySelectorAll\"],\n MutationObserver: []\n};\nconst testableMethods = {\n Node: [\"contains\", \"getRootNode\"],\n ShadowRoot: [\"getSelection\"],\n Element: [],\n MutationObserver: [\"constructor\"]\n};\nconst untaintedBasePrototype = {};\nfunction angularZoneUnpatchedAlternative(key) {\n var _a, _b;\n const angularUnpatchedVersionSymbol = (_b = (_a = globalThis == null ? void 0 : globalThis.Zone) == null ? void 0 : _a.__symbol__) == null ? void 0 : _b.call(_a, key);\n if (angularUnpatchedVersionSymbol && globalThis[angularUnpatchedVersionSymbol]) {\n return globalThis[angularUnpatchedVersionSymbol];\n } else {\n return void 0;\n }\n}\nfunction getUntaintedPrototype(key) {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key];\n const candidate = angularZoneUnpatchedAlternative(key) || globalThis[key];\n const defaultPrototype = candidate.prototype;\n const accessorNames = key in testableAccessors ? testableAccessors[key] : void 0;\n const isUntaintedAccessors = Boolean(\n accessorNames && // @ts-expect-error 2345\n accessorNames.every(\n (accessor) => {\n var _a, _b;\n return Boolean(\n (_b = (_a = Object.getOwnPropertyDescriptor(defaultPrototype, accessor)) == null ? void 0 : _a.get) == null ? void 0 : _b.toString().includes(\"[native code]\")\n );\n }\n )\n );\n const methodNames = key in testableMethods ? testableMethods[key] : void 0;\n const isUntaintedMethods = Boolean(\n methodNames && methodNames.every(\n // @ts-expect-error 2345\n (method) => {\n var _a;\n return typeof defaultPrototype[method] === \"function\" && ((_a = defaultPrototype[method]) == null ? void 0 : _a.toString().includes(\"[native code]\"));\n }\n )\n );\n if (isUntaintedAccessors && isUntaintedMethods) {\n untaintedBasePrototype[key] = candidate.prototype;\n return candidate.prototype;\n }\n try {\n const iframeEl = document.createElement(\"iframe\");\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return candidate.prototype;\n const untaintedObject = win[key].prototype;\n document.body.removeChild(iframeEl);\n if (!untaintedObject) return defaultPrototype;\n return untaintedBasePrototype[key] = untaintedObject;\n } catch {\n return defaultPrototype;\n }\n}\nconst untaintedAccessorCache = {};\nfunction getUntaintedAccessor(key, instance, accessor) {\n var _a;\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedAccessor = (_a = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor\n )) == null ? void 0 : _a.get;\n if (!untaintedAccessor) return instance[accessor];\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n return untaintedAccessor.call(instance);\n}\nconst untaintedMethodCache = {};\nfunction getUntaintedMethod(key, instance, method) {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n if (typeof untaintedMethod !== \"function\") return instance[method];\n untaintedMethodCache[cacheKey] = untaintedMethod;\n return untaintedMethod.bind(instance);\n}\nfunction childNodes(n) {\n return getUntaintedAccessor(\"Node\", n, \"childNodes\");\n}\nfunction parentNode(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentNode\");\n}\nfunction parentElement(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentElement\");\n}\nfunction textContent(n) {\n return getUntaintedAccessor(\"Node\", n, \"textContent\");\n}\nfunction contains(n, other) {\n return getUntaintedMethod(\"Node\", n, \"contains\")(other);\n}\nfunction getRootNode(n) {\n return getUntaintedMethod(\"Node\", n, \"getRootNode\")();\n}\nfunction host(n) {\n if (!n || !(\"host\" in n)) return null;\n return getUntaintedAccessor(\"ShadowRoot\", n, \"host\");\n}\nfunction styleSheets(n) {\n return n.styleSheets;\n}\nfunction shadowRoot(n) {\n if (!n || !(\"shadowRoot\" in n)) return null;\n return getUntaintedAccessor(\"Element\", n, \"shadowRoot\");\n}\nfunction querySelector(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelector\")(selectors);\n}\nfunction querySelectorAll(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelectorAll\")(selectors);\n}\nfunction mutationObserverCtor() {\n return getUntaintedPrototype(\"MutationObserver\").constructor;\n}\nfunction patch(source, name, replacement) {\n try {\n if (!(name in source)) {\n return () => {\n };\n }\n const original = source[name];\n const wrapped = replacement(original);\n if (typeof wrapped === \"function\") {\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original\n }\n });\n }\n source[name] = wrapped;\n return () => {\n source[name] = original;\n };\n } catch {\n return () => {\n };\n }\n}\nconst index = {\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n mutationObserver: mutationObserverCtor,\n patch\n};\nexport {\n childNodes,\n contains,\n index as default,\n getRootNode,\n getUntaintedAccessor,\n getUntaintedMethod,\n getUntaintedPrototype,\n host,\n mutationObserverCtor,\n parentElement,\n parentNode,\n patch,\n querySelector,\n querySelectorAll,\n shadowRoot,\n styleSheets,\n textContent\n};\n//# sourceMappingURL=rrweb-utils.js.map\n", "import type {\n idNodeMap,\n MaskInputFn,\n MaskInputOptions,\n nodeMetaMap,\n} from './types';\n\nimport { NodeType } from '@posthog/rrweb-types';\nimport type {\n IMirror,\n serializedNodeWithId,\n serializedNode,\n documentNode,\n documentTypeNode,\n textNode,\n elementNode,\n} from '@posthog/rrweb-types';\nimport dom from '@posthog/rrweb-utils';\n\nexport function isElement(n: Node): n is Element {\n return n.nodeType === n.ELEMENT_NODE;\n}\n\nexport function isShadowRoot(n: Node): n is ShadowRoot {\n const hostEl: Element | null =\n // anchor and textarea elements also have a `host` property\n // but only shadow roots have a `mode` property\n (n && 'host' in n && 'mode' in n && dom.host(n as ShadowRoot)) || null;\n return Boolean(\n hostEl && 'shadowRoot' in hostEl && dom.shadowRoot(hostEl) === n,\n );\n}\n\n/**\n * To fix the issue https://github.com/rrweb-io/rrweb/issues/933.\n * Some websites use polyfilled shadow dom and this function is used to detect this situation.\n */\nexport function isNativeShadowDom(shadowRoot: ShadowRoot): boolean {\n return Object.prototype.toString.call(shadowRoot) === '[object ShadowRoot]';\n}\n\n/**\n * Browsers sometimes destructively modify the css rules they receive.\n * This function tries to rectify the modifications the browser made to make it more cross platform compatible.\n * @param cssText - output of `CSSStyleRule.cssText`\n * @returns `cssText` with browser inconsistencies fixed.\n */\nfunction fixBrowserCompatibilityIssuesInCSS(cssText: string): string {\n /**\n * Chrome outputs `-webkit-background-clip` as `background-clip` in `CSSStyleRule.cssText`.\n * But then Chrome ignores `background-clip` as css input.\n * Re-introduce `-webkit-background-clip` to fix this issue.\n */\n if (\n cssText.includes(' background-clip: text;') &&\n !cssText.includes(' -webkit-background-clip: text;')\n ) {\n cssText = cssText.replace(\n /\\sbackground-clip:\\s*text;/g,\n ' -webkit-background-clip: text; background-clip: text;',\n );\n }\n return cssText;\n}\n\n// Remove this declaration once typescript has added `CSSImportRule.supportsText` to the lib.\ndeclare interface CSSImportRule extends CSSRule {\n readonly href: string;\n readonly layerName: string | null;\n readonly media: MediaList;\n readonly styleSheet: CSSStyleSheet;\n /**\n * experimental API, currently only supported in firefox\n * https://developer.mozilla.org/en-US/docs/Web/API/CSSImportRule/supportsText\n */\n readonly supportsText?: string | null;\n}\n\n/**\n * Browsers sometimes incorrectly escape `@import` on `.cssText` statements.\n * This function tries to correct the escaping.\n * more info: https://bugs.chromium.org/p/chromium/issues/detail?id=1472259\n * @param cssImportRule\n * @returns `cssText` with browser inconsistencies fixed, or null if not applicable.\n */\nexport function escapeImportStatement(rule: CSSImportRule): string {\n const { cssText } = rule;\n if (cssText.split('\"').length < 3) return cssText;\n\n const statement = ['@import', `url(${JSON.stringify(rule.href)})`];\n if (rule.layerName === '') {\n statement.push(`layer`);\n } else if (rule.layerName) {\n statement.push(`layer(${rule.layerName})`);\n }\n if (rule.supportsText) {\n statement.push(`supports(${rule.supportsText})`);\n }\n if (rule.media.length) {\n statement.push(rule.media.mediaText);\n }\n return statement.join(' ') + ';';\n}\n\nexport function stringifyStylesheet(s: CSSStyleSheet): string | null {\n try {\n const rules = s.rules || s.cssRules;\n if (!rules) {\n return null;\n }\n let sheetHref = s.href;\n if (!sheetHref && s.ownerNode) {\n // an inline <style> element\n sheetHref = s.ownerNode.baseURI;\n }\n const stringifiedRules = Array.from(rules, (rule: CSSRule) =>\n stringifyRule(rule, sheetHref),\n ).join('');\n return fixBrowserCompatibilityIssuesInCSS(stringifiedRules);\n } catch (error) {\n return null;\n }\n}\n\nexport function stringifyRule(rule: CSSRule, sheetHref: string | null): string {\n if (isCSSImportRule(rule)) {\n let importStringified;\n try {\n importStringified =\n // for same-origin stylesheets,\n // we can access the imported stylesheet rules directly\n stringifyStylesheet(rule.styleSheet) ||\n // work around browser issues with the raw string `@import url(...)` statement\n escapeImportStatement(rule);\n } catch (error) {\n importStringified = rule.cssText;\n }\n // if importStringified is not null,\n // there should be a stylesheet and a rule here,\n // but we avoid errors in this method by checking for null\n // see https://github.com/rrweb-io/rrweb/pull/1686\n try {\n if (importStringified && rule.styleSheet?.href) {\n // url()s within the imported stylesheet are relative to _that_ sheet's href\n return absolutifyURLs(importStringified, rule.styleSheet.href);\n }\n } catch {\n // swallow this, we'll return null\n }\n return importStringified;\n } else {\n let ruleStringified = rule.cssText;\n if (isCSSStyleRule(rule) && rule.selectorText.includes(':')) {\n // Safari does not escape selectors with : properly\n // see https://bugs.webkit.org/show_bug.cgi?id=184604\n ruleStringified = fixSafariColons(ruleStringified);\n }\n if (sheetHref) {\n return absolutifyURLs(ruleStringified, sheetHref);\n }\n return ruleStringified;\n }\n}\n\nexport function fixSafariColons(cssStringified: string): string {\n // Replace e.g. [aa:bb] with [aa\\\\:bb]\n const regex = /(\\[(?:[\\w-]+)[^\\\\])(:(?:[\\w-]+)\\])/gm;\n return cssStringified.replace(regex, '$1\\\\$2');\n}\n\nexport function isCSSImportRule(rule: CSSRule): rule is CSSImportRule {\n return 'styleSheet' in rule;\n}\n\nexport function isCSSStyleRule(rule: CSSRule): rule is CSSStyleRule {\n return 'selectorText' in rule;\n}\n\nexport class Mirror implements IMirror<Node> {\n private idNodeMap: idNodeMap = new Map();\n private nodeMetaMap: nodeMetaMap = new WeakMap();\n\n getId(n: Node | undefined | null): number {\n if (!n) return -1;\n\n const id = this.getMeta(n)?.id;\n\n // if n is not a serialized Node, use -1 as its id.\n return id ?? -1;\n }\n\n getNode(id: number): Node | null {\n return this.idNodeMap.get(id) || null;\n }\n\n getIds(): number[] {\n return Array.from(this.idNodeMap.keys());\n }\n\n getMeta(n: Node): serializedNodeWithId | null {\n return this.nodeMetaMap.get(n) || null;\n }\n\n // removes the node from idNodeMap\n // doesn't remove the node from nodeMetaMap\n removeNodeFromMap(n: Node) {\n const id = this.getId(n);\n this.idNodeMap.delete(id);\n\n if (n.childNodes) {\n n.childNodes.forEach((childNode) =>\n this.removeNodeFromMap(childNode as unknown as Node),\n );\n }\n\n if (isElement(n)) {\n const shadowRootEl = dom.shadowRoot(n);\n if (shadowRootEl) {\n this.removeNodeFromMap(shadowRootEl as unknown as Node);\n }\n\n if (n.nodeName === 'IFRAME' && (n as HTMLIFrameElement).contentDocument) {\n this.removeNodeFromMap(\n (n as HTMLIFrameElement).contentDocument as unknown as Node,\n );\n }\n }\n }\n has(id: number): boolean {\n return this.idNodeMap.has(id);\n }\n\n hasNode(node: Node): boolean {\n return this.nodeMetaMap.has(node);\n }\n\n add(n: Node, meta: serializedNodeWithId) {\n const id = meta.id;\n this.idNodeMap.set(id, n);\n this.nodeMetaMap.set(n, meta);\n }\n\n replace(id: number, n: Node) {\n const oldNode = this.getNode(id);\n if (oldNode) {\n const meta = this.nodeMetaMap.get(oldNode);\n if (meta) this.nodeMetaMap.set(n, meta);\n }\n this.idNodeMap.set(id, n);\n }\n\n reset() {\n this.idNodeMap = new Map();\n this.nodeMetaMap = new WeakMap();\n }\n}\n\nexport function createMirror(): Mirror {\n return new Mirror();\n}\n\nexport function maskInputValue({\n element,\n maskInputOptions,\n tagName,\n type,\n value,\n maskInputFn,\n}: {\n element: HTMLElement;\n maskInputOptions: MaskInputOptions;\n tagName: string;\n type: string | null;\n value: string | null;\n maskInputFn?: MaskInputFn;\n}): string {\n let text = value || '';\n const actualType = type && toLowerCase(type);\n\n if (\n maskInputOptions[tagName.toLowerCase() as keyof MaskInputOptions] ||\n (actualType && maskInputOptions[actualType as keyof MaskInputOptions])\n ) {\n if (maskInputFn) {\n text = maskInputFn(text, element);\n } else {\n text = '*'.repeat(text.length);\n }\n }\n return text;\n}\n\nexport function toLowerCase<T extends string>(str: T): Lowercase<T> {\n return str.toLowerCase() as unknown as Lowercase<T>;\n}\n\nconst ORIGINAL_ATTRIBUTE_NAME = '__rrweb_original__';\ntype PatchedGetImageData = {\n [ORIGINAL_ATTRIBUTE_NAME]: CanvasImageData['getImageData'];\n} & CanvasImageData['getImageData'];\n\nexport function is2DCanvasBlank(canvas: HTMLCanvasElement): boolean {\n const ctx = canvas.getContext('2d');\n if (!ctx) return true;\n\n const chunkSize = 50;\n\n // get chunks of the canvas and check if it is blank\n for (let x = 0; x < canvas.width; x += chunkSize) {\n for (let y = 0; y < canvas.height; y += chunkSize) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const getImageData = ctx.getImageData as PatchedGetImageData;\n const originalGetImageData =\n ORIGINAL_ATTRIBUTE_NAME in getImageData\n ? getImageData[ORIGINAL_ATTRIBUTE_NAME]\n : getImageData;\n // by getting the canvas in chunks we avoid an expensive\n // `getImageData` call that retrieves everything\n // even if we can already tell from the first chunk(s) that\n // the canvas isn't blank\n const pixelBuffer = new Uint32Array(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n originalGetImageData.call(\n ctx,\n x,\n y,\n Math.min(chunkSize, canvas.width - x),\n Math.min(chunkSize, canvas.height - y),\n ).data.buffer,\n );\n if (pixelBuffer.some((pixel) => pixel !== 0)) return false;\n }\n }\n return true;\n}\n\nexport function isNodeMetaEqual(a: serializedNode, b: serializedNode): boolean {\n if (!a || !b || a.type !== b.type) return false;\n if (a.type === NodeType.Document)\n return a.compatMode === (b as documentNode).compatMode;\n else if (a.type === NodeType.DocumentType)\n return (\n a.name === (b as documentTypeNode).name &&\n a.publicId === (b as documentTypeNode).publicId &&\n a.systemId === (b as documentTypeNode).systemId\n );\n else if (\n a.type === NodeType.Comment ||\n a.type === NodeType.Text ||\n a.type === NodeType.CDATA\n )\n return a.textContent === (b as textNode).textContent;\n else if (a.type === NodeType.Element)\n return (\n a.tagName === (b as elementNode).tagName &&\n JSON.stringify(a.attributes) ===\n JSON.stringify((b as elementNode).attributes) &&\n a.isSVG === (b as elementNode).isSVG &&\n a.needBlock === (b as elementNode).needBlock\n );\n return false;\n}\n\n/**\n * Get the type of an input element.\n * This takes care of the case where a password input is changed to a text input.\n * In this case, we continue to consider this of type password, in order to avoid leaking sensitive data\n * where passwords should be masked.\n */\nexport function getInputType(element: HTMLElement): Lowercase<string> | null {\n // when omitting the type of input element(e.g. <input />), the type is treated as text\n const type = (element as HTMLInputElement).type;\n\n return element.hasAttribute('data-rr-is-password')\n ? 'password'\n : type\n ? // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n toLowerCase(type)\n : null;\n}\n\n/**\n * Extracts the file extension from an a path, considering search parameters and fragments.\n * @param path - Path to file\n * @param baseURL - [optional] Base URL of the page, used to resolve relative paths. Defaults to current page URL.\n */\nexport function extractFileExtension(\n path: string,\n baseURL?: string,\n): string | null {\n let url;\n try {\n url = new URL(path, baseURL ?? window.location.href);\n } catch (err) {\n return null;\n }\n const regex = /\\.([0-9a-z]+)(?:$)/i;\n const match = url.pathname.match(regex);\n return match?.[1] ?? null;\n}\n\nfunction extractOrigin(url: string): string {\n let origin = '';\n if (url.indexOf('//') > -1) {\n origin = url.split('/').slice(0, 3).join('/');\n } else {\n origin = url.split('/')[0];\n }\n origin = origin.split('?')[0];\n return origin;\n}\n\nconst URL_IN_CSS_REF = /url\\((?:(')([^']*)'|(\")(.*?)\"|([^)]*))\\)/gm;\nconst URL_PROTOCOL_MATCH = /^(?:[a-z+]+:)?\\/\\//i;\nconst URL_WWW_MATCH = /^www\\..*/i;\nconst DATA_URI = /^(data:)([^,]*),(.*)/i;\nexport function absolutifyURLs(cssText: string | null, href: string): string {\n return (cssText || '').replace(\n URL_IN_CSS_REF,\n (\n origin: string,\n quote1: string,\n path1: string,\n quote2: string,\n path2: string,\n path3: string,\n ) => {\n const filePath = path1 || path2 || path3;\n const maybeQuote = quote1 || quote2 || '';\n if (!filePath) {\n return origin;\n }\n if (URL_PROTOCOL_MATCH.test(filePath) || URL_WWW_MATCH.test(filePath)) {\n return `url(${maybeQuote}${filePath}${maybeQuote})`;\n }\n if (DATA_URI.test(filePath)) {\n return `url(${maybeQuote}${filePath}${maybeQuote})`;\n }\n if (filePath[0] === '/') {\n return `url(${maybeQuote}${\n extractOrigin(href) + filePath\n }${maybeQuote})`;\n }\n const stack = href.split('/');\n const parts = filePath.split('/');\n stack.pop();\n for (const part of parts) {\n if (part === '.') {\n continue;\n } else if (part === '..') {\n stack.pop();\n } else {\n stack.push(part);\n }\n }\n return `url(${maybeQuote}${stack.join('/')}${maybeQuote})`;\n },\n );\n}\n\nconst STRIPED_PLACEHOLDER_SVG =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxkZWZzPgogICAgPHBhdHRlcm4gaWQ9InN0cmlwZXMiIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+CiAgICAgIDxyZWN0IHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0iYmxhY2siLz4KICAgICAgPHBhdGggZD0iTTggMEgxNkwwIDE2VjhMOCAwWiIgZmlsbD0iIzJEMkQyRCIvPgogICAgICA8cGF0aCBkPSJNMTYgOFYxNkg4TDE2IDhaIiBmaWxsPSIjMkQyRDJEIi8+CiAgICA8L3BhdHRlcm4+CiAgPC9kZWZzPgogIDxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjc3RyaXBlcykiLz4KPC9zdmc+Cg==';\n\nconst MAX_IMAGE_DIMENSION_FOR_RECOMPRESSION = 4096;\n\nexport function recompressBase64Image(\n img: HTMLImageElement,\n dataURL: string,\n type?: string,\n quality?: number,\n): string {\n if (!img.complete || img.naturalWidth === 0) {\n return dataURL;\n }\n\n // don't recompress very large images to avoid performance issues\n if (\n img.naturalWidth > MAX_IMAGE_DIMENSION_FOR_RECOMPRESSION ||\n img.naturalHeight > MAX_IMAGE_DIMENSION_FOR_RECOMPRESSION\n ) {\n return dataURL;\n }\n\n try {\n const canvas = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n return dataURL;\n }\n\n ctx.drawImage(img, 0, 0);\n const recompressed = canvas.toDataURL(type || 'image/webp', quality ?? 0.4);\n\n return recompressed;\n } catch (err) {\n return dataURL;\n }\n}\n\nexport function checkDataURLSize(\n dataURL: string,\n maxLength: number | undefined,\n): string {\n if (!maxLength || dataURL.length <= maxLength) {\n return dataURL;\n }\n\n return STRIPED_PLACEHOLDER_SVG;\n}\n", "export enum NodeType {\n Document,\n DocumentType,\n Element,\n Text,\n CDATA,\n Comment,\n}\n\nexport type documentNode = {\n type: NodeType.Document;\n childNodes: serializedNodeWithId[];\n compatMode?: string;\n};\n\nexport type documentTypeNode = {\n type: NodeType.DocumentType;\n name: string;\n publicId: string;\n systemId: string;\n};\n\nexport type attributes = {\n [key: string]: string | number | true | null;\n};\nexport type legacyAttributes = {\n /**\n * @deprecated old bug in rrweb was causing these to always be set\n * @see https://github.com/rrweb-io/rrweb/pull/651\n */\n selected: false;\n};\n\nexport type elementNode = {\n type: NodeType.Element;\n tagName: string;\n attributes: attributes;\n childNodes: serializedNodeWithId[];\n isSVG?: true;\n needBlock?: boolean;\n // This is a custom element or not.\n isCustom?: true;\n};\n\nexport type textNode = {\n type: NodeType.Text;\n textContent: string;\n isStyle?: true;\n};\n\nexport type cdataNode = {\n type: NodeType.CDATA;\n textContent: '';\n};\n\nexport type commentNode = {\n type: NodeType.Comment;\n textContent: string;\n};\n\nexport type serializedNode = (\n | documentNode\n | documentTypeNode\n | elementNode\n | textNode\n | cdataNode\n | commentNode\n) & {\n rootId?: number;\n isShadowHost?: boolean;\n isShadow?: boolean;\n};\n\nimport type { serializedNodeWithId } from '@posthog/rrweb-types';\n\nexport type serializedElementNodeWithId = Extract<\n serializedNodeWithId,\n Record<'type', NodeType.Element>\n>;\n\nexport type tagMap = {\n [key: string]: string;\n};\n\nexport type DialogAttributes = {\n open: string;\n /**\n * Represents the dialog's open mode.\n * `modal` means the dialog is opened with `showModal()`.\n * `non-modal` means the dialog is opened with `show()` or\n * by adding an `open` attribute.\n */\n rr_open_mode: 'modal' | 'non-modal';\n /**\n * Currently unimplemented, but in future can be used to:\n * Represents the order of which of the dialog was opened.\n * This is useful for replaying the dialog `.showModal()` in the correct order.\n */\n // rr_open_mode_index?: number;\n};\n\nexport interface ICanvas extends HTMLCanvasElement {\n __context: string;\n}\n\nexport type idNodeMap = Map<number, Node>;\n\nexport type nodeMetaMap = WeakMap<Node, serializedNodeWithId>;\n\nexport type MaskInputOptions = Partial<{\n color: boolean;\n date: boolean;\n 'datetime-local': boolean;\n email: boolean;\n month: boolean;\n number: boolean;\n range: boolean;\n search: boolean;\n tel: boolean;\n text: boolean;\n time: boolean;\n url: boolean;\n week: boolean;\n // unify textarea and select element with text input\n textarea: boolean;\n select: boolean;\n password: boolean;\n}>;\n\nexport type SlimDOMOptions = Partial<{\n script: boolean;\n comment: boolean;\n headFavicon: boolean;\n headWhitespace: boolean;\n headMetaDescKeywords: boolean;\n headMetaSocial: boolean;\n headMetaRobots: boolean;\n headMetaHttpEquiv: boolean;\n headMetaAuthorship: boolean;\n headMetaVerification: boolean;\n /**\n * blocks title tag 'animations' which can generate a lot of mutations that aren't usually displayed in replayers\n **/\n headTitleMutations: boolean;\n}>;\n\nexport type MaskTextFn = (text: string, element: HTMLElement | null) => string;\nexport type MaskInputFn = (text: string, element: HTMLElement) => string;\n\nexport type KeepIframeSrcFn = (src: string) => boolean;\n\nexport type BuildCache = {\n stylesWithHoverClass: Map<string, string>;\n};\n", "import type {\n MaskInputOptions,\n SlimDOMOptions,\n MaskTextFn,\n MaskInputFn,\n KeepIframeSrcFn,\n ICanvas,\n DialogAttributes,\n} from './types';\nimport { NodeType } from '@posthog/rrweb-types';\nimport type {\n serializedNode,\n serializedNodeWithId,\n serializedElementNodeWithId,\n elementNode,\n attributes,\n mediaAttributes,\n DataURLOptions,\n} from '@posthog/rrweb-types';\nimport {\n Mirror,\n is2DCanvasBlank,\n isElement,\n isShadowRoot,\n maskInputValue,\n isNativeShadowDom,\n stringifyStylesheet,\n getInputType,\n toLowerCase,\n extractFileExtension,\n checkDataURLSize,\n recompressBase64Image,\n absolutifyURLs,\n} from './utils';\nimport dom from '@posthog/rrweb-utils';\n\nlet _id = 1;\nconst tagNameRegex = new RegExp('[^a-z0-9-_:]');\n\nexport const IGNORED_NODE = -2;\n\nexport function genId(): number {\n return _id++;\n}\n\nfunction getValidTagName(element: HTMLElement): Lowercase<string> {\n if (element instanceof HTMLFormElement) {\n return 'form';\n }\n\n const processedTagName = toLowerCase(element.tagName);\n\n if (tagNameRegex.test(processedTagName)) {\n // if the tag name is odd and we cannot extract\n // anything from the string, then we return a\n // generic div\n return 'div';\n }\n\n return processedTagName;\n}\n\nlet canvasService: HTMLCanvasElement | null;\nlet canvasCtx: CanvasRenderingContext2D | null;\n\n// eslint-disable-next-line no-control-regex\nconst SRCSET_NOT_SPACES = /^[^ \\t\\n\\r\\u000c]+/; // Don't use \\s, to avoid matching non-breaking space\n// eslint-disable-next-line no-control-regex\nconst SRCSET_COMMAS_OR_SPACES = /^[, \\t\\n\\r\\u000c]+/;\n\nfunction getAbsoluteSrcsetString(doc: Document, attributeValue: string) {\n /*\n run absoluteToDoc over every url in the srcset\n\n this is adapted from https://github.com/albell/parse-srcset/\n without the parsing of the descriptors (we return these as-is)\n parce-srcset is in turn based on\n https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-srcset-attribute\n */\n if (attributeValue.trim() === '') {\n return attributeValue;\n }\n\n let pos = 0;\n\n function collectCharacters(regEx: RegExp) {\n let chars: string;\n const match = regEx.exec(attributeValue.substring(pos));\n if (match) {\n chars = match[0];\n pos += chars.length;\n return chars;\n }\n return '';\n }\n\n const output = [];\n // eslint-disable-next-line no-constant-condition\n while (true) {\n collectCharacters(SRCSET_COMMAS_OR_SPACES);\n if (pos >= attributeValue.length) {\n break;\n }\n // don't split on commas within urls\n let url = collectCharacters(SRCSET_NOT_SPACES);\n if (url.slice(-1) === ',') {\n // aside: according to spec more than one comma at the end is a parse error, but we ignore that\n url = absoluteToDoc(doc, url.substring(0, url.length - 1));\n // the trailing comma splits the srcset, so the interpretion is that\n // another url will follow, and the descriptor is empty\n output.push(url);\n } else {\n let descriptorsStr = '';\n url = absoluteToDoc(doc, url);\n let inParens = false;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const c = attributeValue.charAt(pos);\n if (c === '') {\n output.push((url + descriptorsStr).trim());\n break;\n } else if (!inParens) {\n if (c === ',') {\n pos += 1;\n output.push((url + descriptorsStr).trim());\n break; // parse the next url\n } else if (c === '(') {\n inParens = true;\n }\n } else {\n // in parenthesis; ignore commas\n // (parenthesis may be supported by future additions to spec)\n if (c === ')') {\n inParens = false;\n }\n }\n descriptorsStr += c;\n pos += 1;\n }\n }\n }\n return output.join(', ');\n}\n\nconst cachedDocument = new WeakMap<Document, HTMLAnchorElement>();\n\nexport function absoluteToDoc(doc: Document, attributeValue: string): string {\n if (!attributeValue || attributeValue.trim() === '') {\n return attributeValue;\n }\n\n return getHref(doc, attributeValue);\n}\n\nfunction isSVGElement(el: Element): boolean {\n return Boolean(el.tagName === 'svg' || (el as SVGElement).ownerSVGElement);\n}\n\nfunction getHref(doc: Document, customHref?: string) {\n let a = cachedDocument.get(doc);\n if (!a) {\n a = doc.createElement('a');\n cachedDocument.set(doc, a);\n }\n if (!customHref) {\n customHref = '';\n } else if (customHref.startsWith('blob:') || customHref.startsWith('data:')) {\n return customHref;\n }\n // note: using `new URL` is slower. See #1434 or https://jsbench.me/uqlud17rxo/1\n a.setAttribute('href', customHref);\n return a.href;\n}\n\nexport function transformAttribute(\n doc: Document,\n tagName: Lowercase<string>,\n name: Lowercase<string>,\n value: string | null,\n element?: HTMLElement,\n dataURLOptions?: DataURLOptions,\n): string | null {\n if (!value) {\n return value;\n }\n\n // relative path in attribute\n if (\n name === 'src' ||\n (name === 'href' && !(tagName === 'use' && value[0] === '#'))\n ) {\n // href starts with a # is an id pointer for svg\n const transformedValue = absoluteToDoc(doc, value);\n\n if (tagName === 'img' && transformedValue.startsWith('data:') && element) {\n const img = element as HTMLImageElement;\n\n let processedDataURL = transformedValue;\n\n if (dataURLOptions?.type || dataURLOptions?.quality !== undefined) {\n processedDataURL = recompressBase64Image(\n img,\n transformedValue,\n dataURLOptions.type,\n dataURLOptions.quality,\n );\n }\n\n if (dataURLOptions?.maxBase64ImageLength) {\n processedDataURL = checkDataURLSize(\n processedDataURL,\n dataURLOptions.maxBase64ImageLength,\n );\n }\n\n return processedDataURL;\n }\n\n return transformedValue;\n } else if (name === 'xlink:href' && value[0] !== '#') {\n // xlink:href starts with # is an id pointer\n return absoluteToDoc(doc, value);\n } else if (\n name === 'background' &&\n (tagName === 'table' || tagName === 'td' || tagName === 'th')\n ) {\n return absoluteToDoc(doc, value);\n } else if (name === 'srcset') {\n return getAbsoluteSrcsetString(doc, value);\n } else if (name === 'style') {\n return absolutifyURLs(value, getHref(doc));\n } else if (tagName === 'object' && name === 'data') {\n return absoluteToDoc(doc, value);\n }\n\n return value;\n}\n\nexport function ignoreAttribute(\n tagName: string,\n name: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _value: unknown,\n): boolean {\n return (tagName === 'video' || tagName === 'audio') && name === 'autoplay';\n}\n\nexport function _isBlockedElement(\n element: HTMLElement,\n blockClass: string | RegExp,\n blockSelector: string | null,\n): boolean {\n try {\n if (typeof blockClass === 'string') {\n if (element.classList.contains(blockClass)) {\n return true;\n }\n } else {\n for (let eIndex = element.classList.length; eIndex--; ) {\n const className = element.classList[eIndex];\n if (blockClass.test(className)) {\n return true;\n }\n }\n }\n if (blockSelector) {\n return element.matches(blockSelector);\n }\n } catch (e) {\n //\n }\n\n return false;\n}\n\nexport function classMatchesRegex(\n node: Node | null,\n regex: RegExp,\n checkAncestors: boolean,\n): boolean {\n if (!node) return false;\n if (node.nodeType !== node.ELEMENT_NODE) {\n if (!checkAncestors) return false;\n return classMatchesRegex(dom.parentNode(node), regex, checkAncestors);\n }\n\n for (let eIndex = (node as HTMLElement).classList.length; eIndex--; ) {\n const className = (node as HTMLElement).classList[eIndex];\n if (regex.test(className)) {\n return true;\n }\n }\n if (!checkAncestors) return false;\n return classMatchesRegex(dom.parentNode(node), regex, checkAncestors);\n}\n\nexport function needMaskingText(\n node: Node,\n maskTextClass: string | RegExp,\n maskTextSelector: string | null,\n checkAncestors: boolean,\n): boolean {\n let el: Element;\n if (isElement(node)) {\n el = node;\n if (!dom.childNodes(el).length) {\n // optimisation: we can avoid any of the below checks on leaf elements\n // as masking is applied to child text nodes only\n return false;\n }\n } else if (dom.parentElement(node) === null) {\n // should warn? maybe a text node isn't attached to a parent node yet?\n return false;\n } else {\n el = dom.parentElement(node)!;\n }\n try {\n if (typeof maskTextClass === 'string') {\n if (checkAncestors) {\n if (el.closest(`.${maskTextClass}`)) return true;\n } else {\n if (el.classList.contains(maskTextClass)) return true;\n }\n } else {\n if (classMatchesRegex(el, maskTextClass, checkAncestors)) return true;\n }\n if (maskTextSelector) {\n if (checkAncestors) {\n if (el.closest(maskTextSelector)) return true;\n } else {\n if (el.matches(maskTextSelector)) return true;\n }\n }\n } catch (e) {\n //\n }\n return false;\n}\n\n// https://stackoverflow.com/a/36155560\nfunction onceIframeLoaded(\n iframeEl: HTMLIFrameElement,\n listener: () => unknown,\n iframeLoadTimeout: number,\n) {\n const win = iframeEl.contentWindow;\n if (!win) {\n return;\n }\n // document is loading\n let fired = false;\n\n let readyState: DocumentReadyState;\n try {\n readyState = win.document.readyState;\n } catch (error) {\n return;\n }\n if (readyState !== 'complete') {\n const timer = setTimeout(() => {\n if (!fired) {\n listener();\n fired = true;\n }\n }, iframeLoadTimeout);\n iframeEl.addEventListener('load', () => {\n clearTimeout(timer);\n fired = true;\n listener();\n });\n return;\n }\n // check blank frame for Chrome\n const blankUrl = 'about:blank';\n if (\n win.location.href !== blankUrl ||\n iframeEl.src === blankUrl ||\n iframeEl.src === ''\n ) {\n // iframe was already loaded, make sure we wait to trigger the listener\n // till _after_ the mutation that found this iframe has had time to process\n setTimeout(listener, 0);\n\n return iframeEl.addEventListener('load', listener); // keep listing for future loads\n }\n // use default listener\n iframeEl.addEventListener('load', listener);\n}\n\nfunction onceStylesheetLoaded(\n link: HTMLLinkElement,\n listener: () => unknown,\n styleSheetLoadTimeout: number,\n) {\n let fired = false;\n let styleSheetLoaded: StyleSheet | null;\n try {\n styleSheetLoaded = link.sheet;\n } catch (error) {\n return;\n }\n\n if (styleSheetLoaded) return;\n\n const timer = setTimeout(() => {\n if (!fired) {\n listener();\n fired = true;\n }\n }, styleSheetLoadTimeout);\n\n link.addEventListener('load', () => {\n clearTimeout(timer);\n fired = true;\n listener();\n });\n}\n\nfunction serializeNode(\n n: Node,\n options: {\n doc: Document;\n mirror: Mirror;\n blockClass: string | RegExp;\n blockSelector: string | null;\n needsMask: boolean;\n inlineStylesheet: boolean;\n maskInputOptions: MaskInputOptions;\n maskTextFn: MaskTextFn | undefined;\n maskInputFn: MaskInputFn | undefined;\n dataURLOptions?: DataURLOptions;\n inlineImages: boolean;\n recordCanvas: boolean;\n keepIframeSrcFn: KeepIframeSrcFn;\n /**\n * `newlyAddedElement: true` skips scrollTop and scrollLeft check\n */\n newlyAddedElement?: boolean;\n },\n): serializedNode | false {\n const {\n doc,\n mirror,\n blockClass,\n blockSelector,\n needsMask,\n inlineStylesheet,\n maskInputOptions = {},\n maskTextFn,\n maskInputFn,\n dataURLOptions = {},\n inlineImages,\n recordCanvas,\n keepIframeSrcFn,\n newlyAddedElement = false,\n } = options;\n // Only record root id when document object is not the base document\n const rootId = getRootId(doc, mirror);\n switch (n.nodeType) {\n case n.DOCUMENT_NODE:\n if ((n as Document).compatMode !== 'CSS1Compat') {\n return {\n type: NodeType.Document,\n childNodes: [],\n compatMode: (n as Document).compatMode, // probably \"BackCompat\"\n };\n } else {\n return {\n type: NodeType.Document,\n childNodes: [],\n };\n }\n case n.DOCUMENT_TYPE_NODE:\n return {\n type: NodeType.DocumentType,\n name: (n as DocumentType).name,\n publicId: (n as DocumentType).publicId,\n systemId: (n as DocumentType).systemId,\n rootId,\n };\n case n.ELEMENT_NODE:\n return serializeElementNode(n as HTMLElement, {\n doc,\n blockClass,\n blockSelector,\n inlineStylesheet,\n maskInputOptions,\n maskInputFn,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n keepIframeSrcFn,\n newlyAddedElement,\n rootId,\n });\n case n.TEXT_NODE:\n return serializeTextNode(n as Text, {\n doc,\n needsMask,\n maskTextFn,\n rootId,\n });\n case n.CDATA_SECTION_NODE:\n return {\n type: NodeType.CDATA,\n textContent: '',\n rootId,\n };\n case n.COMMENT_NODE:\n return {\n type: NodeType.Comment,\n textContent: dom.textContent(n as Comment) || '',\n rootId,\n };\n default:\n return false;\n }\n}\n\nfunction getRootId(doc: Document, mirror: Mirror): number | undefined {\n if (!mirror.hasNode(doc)) return undefined;\n const docId = mirror.getId(doc);\n return docId === 1 ? undefined : docId;\n}\n\nfunction serializeTextNode(\n n: Text,\n options: {\n doc: Document;\n needsMask: boolean;\n maskTextFn: MaskTextFn | undefined;\n rootId: number | undefined;\n },\n): serializedNode {\n const { needsMask, maskTextFn, rootId } = options;\n // The parent node may not be a html element which has a tagName attribute.\n // So just let it be undefined which is ok in this use case.\n const parent = dom.parentNode(n);\n const parentTagName = parent && (parent as HTMLElement).tagName;\n let text = dom.textContent(n);\n const isStyle = parentTagName === 'STYLE' ? true : undefined;\n const isScript = parentTagName === 'SCRIPT' ? true : undefined;\n if (isStyle && text) {\n try {\n // try to read style sheet\n if (n.nextSibling || n.previousSibling) {\n // This is not the only child of the stylesheet.\n // We can't read all of the sheet's .cssRules and expect them\n // to _only_ include the current rule(s) added by the text node.\n // So we'll be conservative and keep textContent as-is.\n } else if ((parent as HTMLStyleElement).sheet?.cssRules) {\n text = stringifyStylesheet((parent as HTMLStyleElement).sheet!);\n }\n } catch (err) {\n console.warn(\n `Cannot get CSS styles from text's parentNode. Error: ${err as string}`,\n n,\n );\n }\n text = absolutifyURLs(text, getHref(options.doc));\n }\n if (isScript) {\n text = 'SCRIPT_PLACEHOLDER';\n }\n if (!isStyle && !isScript && text && needsMask) {\n text = maskTextFn\n ? maskTextFn(text, dom.parentElement(n))\n : text.replace(/[\\S]/g, '*');\n }\n\n return {\n type: NodeType.Text,\n textContent: text || '',\n isStyle,\n rootId,\n };\n}\n\nfunction findStylesheet(doc: Document, href: string) {\n return Array.from(doc.styleSheets).find((s) => s.href === href);\n}\n\n/**\n * in production, we've seen elements like\n * `<link type=\"text/css\" rel=\"stylesheet\" id=\"dark-mode-custom-link\"></link>`\n * while HTMLLinkElement suggests an href is always present\n * the w3c spec is less specific\n * and regardless we've seen at least one instance of this in the wild\n * let's be defensive and make sure this is typed as possibly undefined\n */\nfunction hrefFrom(n: unknown): string | undefined {\n return (n as HTMLLinkElement).href;\n}\n\nfunction serializeElementNode(\n n: HTMLElement,\n options: {\n doc: Document;\n blockClass: string | RegExp;\n blockSelector: string | null;\n inlineStylesheet: boolean;\n maskInputOptions: MaskInputOptions;\n maskInputFn: MaskInputFn | undefined;\n dataURLOptions?: DataURLOptions;\n inlineImages: boolean;\n recordCanvas: boolean;\n keepIframeSrcFn: KeepIframeSrcFn;\n /**\n * `newlyAddedElement: true` skips scrollTop and scrollLeft check\n */\n newlyAddedElement?: boolean;\n rootId: number | undefined;\n },\n): serializedNode | false {\n const {\n doc,\n blockClass,\n blockSelector,\n inlineStylesheet,\n maskInputOptions = {},\n maskInputFn,\n dataURLOptions = {},\n inlineImages,\n recordCanvas,\n keepIframeSrcFn,\n newlyAddedElement = false,\n rootId,\n } = options;\n const needBlock = _isBlockedElement(n, blockClass, blockSelector);\n const tagName = getValidTagName(n);\n let attributes: attributes = {};\n const len = n.attributes.length;\n for (let i = 0; i < len; i++) {\n const attr = n.attributes[i];\n if (!ignoreAttribute(tagName, attr.name, attr.value)) {\n attributes[attr.name] = transformAttribute(\n doc,\n tagName,\n toLowerCase(attr.name),\n attr.value,\n n,\n dataURLOptions,\n );\n }\n }\n // remote css\n if (tagName === 'link' && inlineStylesheet) {\n //TODO: maybe replace this `.styleSheets` with original one\n const href: string | undefined = hrefFrom(n);\n if (href) {\n let stylesheet = findStylesheet(doc, href);\n if (!stylesheet && href.includes('.css')) {\n const rootDomain = window.location.origin;\n const stylesheetPath = href.replace(window.location.href, '');\n const potentialStylesheetHref = rootDomain + '/' + stylesheetPath;\n stylesheet = findStylesheet(doc, potentialStylesheetHref);\n }\n let cssText: string | null = null;\n if (stylesheet) {\n cssText = stringifyStylesheet(stylesheet);\n }\n if (cssText) {\n delete attributes.rel;\n delete attributes.href;\n attributes._cssText = cssText;\n }\n }\n }\n // dynamic stylesheet\n if (\n tagName === 'style' &&\n (n as HTMLStyleElement).sheet &&\n // TODO: Currently we only try to get dynamic stylesheet when it is an empty style element\n !(n.innerText || dom.textContent(n) || '').trim().length\n ) {\n const cssText = stringifyStylesheet(\n (n as HTMLStyleElement).sheet as CSSStyleSheet,\n );\n if (cssText) {\n attributes._cssText = cssText;\n }\n }\n // form fields\n if (tagName === 'input' || tagName === 'textarea' || tagName === 'select') {\n const value = (n as HTMLInputElement | HTMLTextAreaElement).value;\n const checked = (n as HTMLInputElement).checked;\n if (\n attributes.type !== 'radio' &&\n attributes.type !== 'checkbox' &&\n attributes.type !== 'submit' &&\n attributes.type !== 'button' &&\n value\n ) {\n attributes.value = maskInputValue({\n element: n,\n type: getInputType(n),\n tagName,\n value,\n maskInputOptions,\n maskInputFn,\n });\n } else if (checked) {\n attributes.checked = checked;\n }\n }\n if (tagName === 'option') {\n if ((n as HTMLOptionElement).selected && !maskInputOptions['select']) {\n attributes.selected = true;\n } else {\n // ignore the html attribute (which corresponds to DOM (n as HTMLOptionElement).defaultSelected)\n // if it's already been changed\n delete attributes.selected;\n }\n }\n\n if (tagName === 'dialog' && (n as HTMLDialogElement).open) {\n // register what type of dialog is this\n // `modal` or `non-modal`\n // this is used to trigger `showModal()` or `show()` on replay (outside of rrweb-snapshot, in rrweb)\n try {\n (attributes as DialogAttributes).rr_open_mode = n.matches('dialog:modal')\n ? 'modal'\n : 'non-modal';\n } catch {\n // likely this is safari not able to deal with the `:modal` selector\n // we can't detect whether the dialog is modal or non-modal open, so have to guess\n // hopefully this is only safari 15.4 and 15.5\n attributes.rr_open_mode = 'modal';\n attributes.ph_rr_could_not_detect_modal = true;\n }\n }\n\n // canvas image data\n if (tagName === 'canvas' && recordCanvas) {\n if ((n as ICanvas).__context === '2d') {\n // only record this on 2d canvas\n if (!is2DCanvasBlank(n as HTMLCanvasElement)) {\n attributes.rr_dataURL = (n as HTMLCanvasElement).toDataURL(\n dataURLOptions.type,\n dataURLOptions.quality,\n );\n }\n } else if (!('__context' in n)) {\n // context is unknown, better not call getContext to trigger it\n const canvasDataURL = (n as HTMLCanvasElement).toDataURL(\n dataURLOptions.type,\n dataURLOptions.quality,\n );\n\n // create blank canvas of same dimensions\n const blankCanvas = doc.createElement('canvas');\n blankCanvas.width = (n as HTMLCanvasElement).width;\n blankCanvas.height = (n as HTMLCanvasElement).height;\n const blankCanvasDataURL = blankCanvas.toDataURL(\n dataURLOptions.type,\n dataURLOptions.quality,\n );\n\n // no need to save dataURL if it's the same as blank canvas\n if (canvasDataURL !== blankCanvasDataURL) {\n attributes.rr_dataURL = canvasDataURL;\n }\n }\n }\n // save image offline\n if (tagName === 'img' && inlineImages) {\n if (!canvasService) {\n canvasService = doc.createElement('canvas');\n canvasCtx = canvasService.getContext('2d');\n }\n const image = n as HTMLImageElement;\n const imageSrc: string =\n image.currentSrc || image.getAttribute('src') || '<unknown-src>';\n const priorCrossOrigin = image.crossOrigin;\n const recordInlineImage = () => {\n image.removeEventListener('load', recordInlineImage);\n try {\n canvasService!.width = image.naturalWidth;\n canvasService!.height = image.naturalHeight;\n canvasCtx!.drawImage(image, 0, 0);\n attributes.rr_dataURL = canvasService!.toDataURL(\n dataURLOptions.type,\n dataURLOptions.quality,\n );\n } catch (err) {\n if (image.crossOrigin !== 'anonymous') {\n image.crossOrigin = 'anonymous';\n if (image.complete && image.naturalWidth !== 0)\n recordInlineImage(); // too early due to image reload\n else image.addEventListener('load', recordInlineImage);\n return;\n } else {\n console.warn(\n `Cannot inline img src=${imageSrc}! Error: ${err as string}`,\n );\n }\n }\n if (image.crossOrigin === 'anonymous') {\n priorCrossOrigin\n ? (attributes.crossOrigin = priorCrossOrigin)\n : image.removeAttribute('crossorigin');\n }\n };\n // The image content may not have finished loading yet.\n if (image.complete && image.naturalWidth !== 0) recordInlineImage();\n else image.addEventListener('load', recordInlineImage);\n }\n // media elements\n if (tagName === 'audio' || tagName === 'video') {\n const mediaAttributes = attributes as mediaAttributes;\n mediaAttributes.rr_mediaState = (n as HTMLMediaElement).paused\n ? 'paused'\n : 'played';\n mediaAttributes.rr_mediaCurrentTime = (n as HTMLMediaElement).currentTime;\n mediaAttributes.rr_mediaPlaybackRate = (n as HTMLMediaElement).playbackRate;\n mediaAttributes.rr_mediaMuted = (n as HTMLMediaElement).muted;\n mediaAttributes.rr_mediaLoop = (n as HTMLMediaElement).loop;\n mediaAttributes.rr_mediaVolume = (n as HTMLMediaElement).volume;\n }\n // Scroll\n if (!newlyAddedElement) {\n // `scrollTop` and `scrollLeft` are expensive calls because they trigger reflow.\n // Since `scrollTop` & `scrollLeft` are always 0 when an element is added to the DOM.\n // And scrolls also get picked up by rrweb's ScrollObserver\n // So we can safely skip the `scrollTop/Left` calls for newly added elements\n if (n.scrollLeft) {\n attributes.rr_scrollLeft = n.scrollLeft;\n }\n if (n.scrollTop) {\n attributes.rr_scrollTop = n.scrollTop;\n }\n }\n // block element\n if (needBlock) {\n const { width, height, left, top } = n.getBoundingClientRect();\n attributes = {\n class: attributes.class,\n rr_width: `${width}px`,\n rr_height: `${height}px`,\n rr_left: `${Math.floor(left + (doc.defaultView?.scrollX || 0))}px`,\n rr_top: `${Math.floor(top + (doc.defaultView?.scrollY || 0))}px`,\n };\n }\n // iframe\n if (tagName === 'iframe' && !keepIframeSrcFn(attributes.src as string)) {\n if (!(n as HTMLIFrameElement).contentDocument) {\n // we can't record it directly as we can't see into it\n // preserve the src attribute so a decision can be taken at replay time\n attributes.rr_src = attributes.src;\n }\n delete attributes.src; // prevent auto loading\n }\n\n let isCustomElement: true | undefined;\n try {\n if (customElements.get(tagName)) isCustomElement = true;\n } catch (e) {\n // In case old browsers don't support customElements\n }\n\n return {\n type: NodeType.Element,\n tagName,\n attributes,\n childNodes: [],\n isSVG: isSVGElement(n as Element) || undefined,\n needBlock,\n rootId,\n isCustom: isCustomElement,\n };\n}\n\nfunction lowerIfExists(\n maybeAttr: string | number | boolean | undefined | null,\n): string {\n if (maybeAttr === undefined || maybeAttr === null) {\n return '';\n } else {\n return (maybeAttr as string).toLowerCase();\n }\n}\n\nfunction slimDOMExcluded(\n sn: serializedNode,\n slimDOMOptions: SlimDOMOptions,\n): boolean {\n if (slimDOMOptions.comment && sn.type === NodeType.Comment) {\n // TODO: convert IE conditional comments to real nodes\n return true;\n } else if (sn.type === NodeType.Element) {\n if (\n slimDOMOptions.script &&\n // script tag\n (sn.tagName === 'script' ||\n // (module)preload link\n (sn.tagName === 'link' &&\n ((sn.attributes.rel === 'preload' && sn.attributes.as === 'script') ||\n sn.attributes.rel === 'modulepreload')) ||\n // prefetch link\n (sn.tagName === 'link' &&\n sn.attributes.rel === 'prefetch' &&\n typeof sn.attributes.href === 'string' &&\n extractFileExtension(sn.attributes.href) === 'js'))\n ) {\n return true;\n } else if (\n slimDOMOptions.headFavicon &&\n ((sn.tagName === 'link' && sn.attributes.rel === 'shortcut icon') ||\n (sn.tagName === 'meta' &&\n (lowerIfExists(sn.attributes.name).match(\n /^msapplication-tile(image|color)$/,\n ) ||\n lowerIfExists(sn.attributes.name) === 'application-name' ||\n lowerIfExists(sn.attributes.rel) === 'icon' ||\n lowerIfExists(sn.attributes.rel) === 'apple-touch-icon' ||\n lowerIfExists(sn.attributes.rel) === 'shortcut icon')))\n ) {\n return true;\n } else if (sn.tagName === 'meta') {\n if (\n slimDOMOptions.headMetaDescKeywords &&\n lowerIfExists(sn.attributes.name).match(/^description|keywords$/)\n ) {\n return true;\n } else if (\n slimDOMOptions.headMetaSocial &&\n (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) || // og = opengraph (facebook)\n lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) ||\n lowerIfExists(sn.attributes.name) === 'pinterest')\n ) {\n return true;\n } else if (\n slimDOMOptions.headMetaRobots &&\n (lowerIfExists(sn.attributes.name) === 'robots' ||\n lowerIfExists(sn.attributes.name) === 'googlebot' ||\n lowerIfExists(sn.attributes.name) === 'bingbot')\n ) {\n return true;\n } else if (\n slimDOMOptions.headMetaHttpEquiv &&\n sn.attributes['http-equiv'] !== undefined\n ) {\n // e.g. X-UA-Compatible, Content-Type, Content-Language,\n // cache-control, X-Translated-By\n return true;\n } else if (\n slimDOMOptions.headMetaAuthorship &&\n (lowerIfExists(sn.attributes.name) === 'author' ||\n lowerIfExists(sn.attributes.name) === 'generator' ||\n lowerIfExists(sn.attributes.name) === 'framework' ||\n lowerIfExists(sn.attributes.name) === 'publisher' ||\n lowerIfExists(sn.attributes.name) === 'progid' ||\n lowerIfExists(sn.attributes.property).match(/^article:/) ||\n lowerIfExists(sn.attributes.property).match(/^product:/))\n ) {\n return true;\n } else if (\n slimDOMOptions.headMetaVerification &&\n (lowerIfExists(sn.attributes.name) === 'google-site-verification' ||\n lowerIfExists(sn.attributes.name) === 'yandex-verification' ||\n lowerIfExists(sn.attributes.name) === 'csrf-token' ||\n lowerIfExists(sn.attributes.name) === 'p:domain_verify' ||\n lowerIfExists(sn.attributes.name) === 'verify-v1' ||\n lowerIfExists(sn.attributes.name) === 'verification' ||\n lowerIfExists(sn.attributes.name) === 'shopify-checkout-api-token')\n ) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport const DEFAULT_MAX_DEPTH = 50;\n\nlet _maxDepthWarned = false;\nlet _maxDepthReached = false;\n\nexport function wasMaxDepthReached(): boolean {\n return _maxDepthReached;\n}\n\nexport function resetMaxDepthState(): void {\n _maxDepthReached = false;\n _maxDepthWarned = false;\n}\n\nexport function serializeNodeWithId(\n n: Node,\n options: {\n doc: Document;\n mirror: Mirror;\n blockClass: string | RegExp;\n blockSelector: string | null;\n maskTextClass: string | RegExp;\n maskTextSelector: string | null;\n skipChild: boolean;\n inlineStylesheet: boolean;\n newlyAddedElement?: boolean;\n maskInputOptions?: MaskInputOptions;\n needsMask?: boolean;\n maskTextFn: MaskTextFn | undefined;\n maskInputFn: MaskInputFn | undefined;\n slimDOMOptions: SlimDOMOptions;\n dataURLOptions?: DataURLOptions;\n keepIframeSrcFn?: KeepIframeSrcFn;\n inlineImages?: boolean;\n recordCanvas?: boolean;\n preserveWhiteSpace?: boolean;\n onSerialize?: (n: Node) => unknown;\n onIframeLoad?: (\n iframeNode: HTMLIFrameElement,\n node: serializedElementNodeWithId,\n ) => unknown;\n iframeLoadTimeout?: number;\n onStylesheetLoad?: (\n linkNode: HTMLLinkElement,\n node: serializedElementNodeWithId,\n ) => unknown;\n stylesheetLoadTimeout?: number;\n depth?: number;\n maxDepth?: number;\n onMaxDepthReached?: () => void;\n },\n): serializedNodeWithId | null {\n const {\n doc,\n mirror,\n blockClass,\n blockSelector,\n maskTextClass,\n maskTextSelector,\n skipChild = false,\n inlineStylesheet = true,\n maskInputOptions = {},\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions = {},\n inlineImages = false,\n recordCanvas = false,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout = 5000,\n onStylesheetLoad,\n stylesheetLoadTimeout = 5000,\n keepIframeSrcFn = () => false,\n newlyAddedElement = false,\n depth = 0,\n maxDepth = DEFAULT_MAX_DEPTH,\n } = options;\n let { needsMask } = options;\n let { preserveWhiteSpace = true } = options;\n\n if (depth >= maxDepth) {\n _maxDepthReached = true;\n if (!_maxDepthWarned) {\n _maxDepthWarned = true;\n console.warn(\n `[rrweb-snapshot] DOM tree depth exceeded max depth of ${maxDepth}. ` +\n `Children beyond this depth will not be recorded. ` +\n `This may indicate deeply nested DOM structures.`,\n );\n }\n return null;\n }\n\n if (!needsMask) {\n // perf: if needsMask = true, children won't also need to check\n const checkAncestors = needsMask === undefined; // if false, we've already checked ancestors\n needsMask = needMaskingText(\n n as Element,\n maskTextClass,\n maskTextSelector,\n checkAncestors,\n );\n }\n\n const _serializedNode = serializeNode(n, {\n doc,\n mirror,\n blockClass,\n blockSelector,\n needsMask,\n inlineStylesheet,\n maskInputOptions,\n maskTextFn,\n maskInputFn,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n keepIframeSrcFn,\n newlyAddedElement,\n });\n if (!_serializedNode) {\n // TODO: dev only\n console.warn(n, 'not serialized');\n return null;\n }\n\n let id: number | undefined;\n if (mirror.hasNode(n)) {\n // Reuse the previous id\n id = mirror.getId(n);\n } else if (\n slimDOMExcluded(_serializedNode, slimDOMOptions) ||\n (!preserveWhiteSpace &&\n _serializedNode.type === NodeType.Text &&\n !_serializedNode.isStyle &&\n !_serializedNode.textContent.replace(/^\\s+|\\s+$/gm, '').length)\n ) {\n id = IGNORED_NODE;\n } else {\n id = genId();\n }\n\n const serializedNode = Object.assign(_serializedNode, { id });\n // add IGNORED_NODE to mirror to track nextSiblings\n mirror.add(n, serializedNode);\n\n if (id === IGNORED_NODE) {\n return null; // slimDOM\n }\n\n if (onSerialize) {\n onSerialize(n);\n }\n let recordChild = !skipChild;\n if (serializedNode.type === NodeType.Element) {\n recordChild = recordChild && !serializedNode.needBlock;\n // this property was not needed in replay side\n delete serializedNode.needBlock;\n const shadowRootEl = dom.shadowRoot(n);\n if (shadowRootEl && isNativeShadowDom(shadowRootEl))\n serializedNode.isShadowHost = true;\n }\n if (\n (serializedNode.type === NodeType.Document ||\n serializedNode.type === NodeType.Element) &&\n recordChild\n ) {\n if (\n slimDOMOptions.headWhitespace &&\n serializedNode.type === NodeType.Element &&\n serializedNode.tagName === 'head'\n // would impede performance: || getComputedStyle(n)['white-space'] === 'normal'\n ) {\n preserveWhiteSpace = false;\n }\n const bypassOptions = {\n doc,\n mirror,\n blockClass,\n blockSelector,\n needsMask,\n maskTextClass,\n maskTextSelector,\n skipChild,\n inlineStylesheet,\n maskInputOptions,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn,\n depth: depth + 1,\n maxDepth,\n };\n\n if (\n serializedNode.type === NodeType.Element &&\n serializedNode.tagName === 'textarea' &&\n (serializedNode as elementNode).attributes.value !== undefined\n ) {\n // value parameter in DOM reflects the correct value, so ignore childNode\n } else {\n for (const childN of Array.from(dom.childNodes(n))) {\n const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\n if (serializedChildNode) {\n serializedNode.childNodes.push(serializedChildNode);\n }\n }\n }\n\n let shadowRootEl: ShadowRoot | null = null;\n if (isElement(n) && (shadowRootEl = dom.shadowRoot(n))) {\n for (const childN of Array.from(dom.childNodes(shadowRootEl))) {\n const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\n if (serializedChildNode) {\n isNativeShadowDom(shadowRootEl) &&\n (serializedChildNode.isShadow = true);\n serializedNode.childNodes.push(serializedChildNode);\n }\n }\n }\n }\n\n const parent = dom.parentNode(n);\n if (parent && isShadowRoot(parent) && isNativeShadowDom(parent)) {\n serializedNode.isShadow = true;\n }\n\n if (\n serializedNode.type === NodeType.Element &&\n serializedNode.tagName === 'iframe'\n ) {\n onceIframeLoaded(\n n as HTMLIFrameElement,\n () => {\n const iframeDoc = (n as HTMLIFrameElement).contentDocument;\n if (iframeDoc && onIframeLoad) {\n const serializedIframeNode = serializeNodeWithId(iframeDoc, {\n doc: iframeDoc,\n mirror,\n blockClass,\n blockSelector,\n needsMask,\n maskTextClass,\n maskTextSelector,\n skipChild: false,\n inlineStylesheet,\n maskInputOptions,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn,\n depth: depth + 1,\n maxDepth,\n });\n\n if (serializedIframeNode) {\n onIframeLoad(\n n as HTMLIFrameElement,\n serializedIframeNode as serializedElementNodeWithId,\n );\n }\n }\n },\n iframeLoadTimeout,\n );\n }\n\n // <link rel=stylesheet href=...>\n if (\n serializedNode.type === NodeType.Element &&\n serializedNode.tagName === 'link' &&\n typeof serializedNode.attributes.rel === 'string' &&\n (serializedNode.attributes.rel === 'stylesheet' ||\n (serializedNode.attributes.rel === 'preload' &&\n typeof serializedNode.attributes.href === 'string' &&\n extractFileExtension(serializedNode.attributes.href) === 'css'))\n ) {\n onceStylesheetLoaded(\n n as HTMLLinkElement,\n () => {\n if (onStylesheetLoad) {\n const serializedLinkNode = serializeNodeWithId(n, {\n doc,\n mirror,\n blockClass,\n blockSelector,\n needsMask,\n maskTextClass,\n maskTextSelector,\n skipChild: false,\n inlineStylesheet,\n maskInputOptions,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn,\n depth,\n maxDepth,\n });\n\n if (serializedLinkNode) {\n onStylesheetLoad(\n n as HTMLLinkElement,\n serializedLinkNode as serializedElementNodeWithId,\n );\n }\n }\n },\n stylesheetLoadTimeout,\n );\n }\n\n return serializedNode;\n}\n\nfunction snapshot(\n n: Document,\n options?: {\n mirror?: Mirror;\n blockClass?: string | RegExp;\n blockSelector?: string | null;\n maskTextClass?: string | RegExp;\n maskTextSelector?: string | null;\n inlineStylesheet?: boolean;\n maskAllInputs?: boolean | MaskInputOptions;\n maskTextFn?: MaskTextFn;\n maskInputFn?: MaskInputFn;\n slimDOM?: 'all' | boolean | SlimDOMOptions;\n dataURLOptions?: DataURLOptions;\n inlineImages?: boolean;\n recordCanvas?: boolean;\n preserveWhiteSpace?: boolean;\n onSerialize?: (n: Node) => unknown;\n onIframeLoad?: (\n iframeNode: HTMLIFrameElement,\n node: serializedElementNodeWithId,\n ) => unknown;\n iframeLoadTimeout?: number;\n onStylesheetLoad?: (\n linkNode: HTMLLinkElement,\n node: serializedElementNodeWithId,\n ) => unknown;\n stylesheetLoadTimeout?: number;\n keepIframeSrcFn?: KeepIframeSrcFn;\n maxDepth?: number;\n },\n): serializedNodeWithId | null {\n const {\n mirror = new Mirror(),\n blockClass = 'rr-block',\n blockSelector = null,\n maskTextClass = 'rr-mask',\n maskTextSelector = null,\n inlineStylesheet = true,\n inlineImages = false,\n recordCanvas = false,\n maskAllInputs = false,\n maskTextFn,\n maskInputFn,\n slimDOM = false,\n dataURLOptions,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn = () => false,\n maxDepth,\n } = options || {};\n const maskInputOptions: MaskInputOptions =\n maskAllInputs === true\n ? {\n color: true,\n date: true,\n 'datetime-local': true,\n email: true,\n month: true,\n number: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true,\n textarea: true,\n select: true,\n password: true,\n }\n : maskAllInputs === false\n ? {\n password: true,\n }\n : maskAllInputs;\n const slimDOMOptions: SlimDOMOptions =\n slimDOM === true || slimDOM === 'all'\n ? // if true: set of sensible options that should not throw away any information\n {\n script: true,\n comment: true,\n headFavicon: true,\n headWhitespace: true,\n headMetaDescKeywords: slimDOM === 'all', // destructive\n headMetaSocial: true,\n headMetaRobots: true,\n headMetaHttpEquiv: true,\n headMetaAuthorship: true,\n headMetaVerification: true,\n }\n : slimDOM === false\n ? {}\n : slimDOM;\n return serializeNodeWithId(n, {\n doc: n,\n mirror,\n blockClass,\n blockSelector,\n maskTextClass,\n maskTextSelector,\n skipChild: false,\n inlineStylesheet,\n maskInputOptions,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn,\n newlyAddedElement: false,\n maxDepth,\n });\n}\n\nexport function visitSnapshot(\n node: serializedNodeWithId,\n onVisit: (node: serializedNodeWithId) => unknown,\n) {\n function walk(current: serializedNodeWithId) {\n onVisit(current);\n if (\n current.type === NodeType.Document ||\n current.type === NodeType.Element\n ) {\n current.childNodes.forEach(walk);\n }\n }\n\n walk(node);\n}\n\nexport function cleanupSnapshot() {\n // allow a new recording to start numbering nodes from scratch\n _id = 1;\n}\n\nexport default snapshot;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["NodeType", "NodeType2", "testableAccessors", "testableMethods", "untaintedBasePrototype", "angularZoneUnpatchedAlternative", "key", "_a", "_b", "angularUnpatchedVersionSymbol", "getUntaintedPrototype", "candidate", "defaultPrototype", "accessorNames", "isUntaintedAccessors", "accessor", "methodNames", "isUntaintedMethods", "method", "iframeEl", "win", "untaintedObject", "e", "untaintedAccessorCache", "getUntaintedAccessor", "instance", "cacheKey", "untaintedPrototype", "untaintedAccessor", "untaintedMethodCache", "getUntaintedMethod", "untaintedMethod", "childNodes", "n", "parentNode", "parentElement", "textContent", "contains", "other", "getRootNode", "host", "styleSheets", "shadowRoot", "querySelector", "selectors", "querySelectorAll", "mutationObserverCtor", "patch", "source", "name", "replacement", "original", "wrapped", "index", "isElement", "isShadowRoot", "hostEl", "dom", "isNativeShadowDom", "fixBrowserCompatibilityIssuesInCSS", "cssText", "escapeImportStatement", "rule", "statement", "stringifyStylesheet", "s", "rules", "sheetHref", "stringifiedRules", "stringifyRule", "error", "isCSSImportRule", "importStringified", "absolutifyURLs", "ruleStringified", "isCSSStyleRule", "fixSafariColons", "cssStringified", "regex", "Mirror", "__publicField", "id", "childNode", "shadowRootEl", "node", "meta", "oldNode", "createMirror", "maskInputValue", "element", "maskInputOptions", "tagName", "type", "value", "maskInputFn", "text", "actualType", "toLowerCase", "str", "ORIGINAL_ATTRIBUTE_NAME", "is2DCanvasBlank", "canvas", "ctx", "chunkSize", "x", "y", "getImageData", "originalGetImageData", "pixel", "isNodeMetaEqual", "a", "b", "getInputType", "extractFileExtension", "path", "baseURL", "url", "err", "match", "extractOrigin", "origin", "URL_IN_CSS_REF", "URL_PROTOCOL_MATCH", "URL_WWW_MATCH", "DATA_URI", "href", "quote1", "path1", "quote2", "path2", "path3", "filePath", "maybeQuote", "stack", "parts", "part", "STRIPED_PLACEHOLDER_SVG", "MAX_IMAGE_DIMENSION_FOR_RECOMPRESSION", "recompressBase64Image", "img", "dataURL", "quality", "checkDataURLSize", "maxLength", "_id", "tagNameRegex", "IGNORED_NODE", "genId", "getValidTagName", "element", "processedTagName", "toLowerCase", "canvasService", "canvasCtx", "SRCSET_NOT_SPACES", "SRCSET_COMMAS_OR_SPACES", "getAbsoluteSrcsetString", "doc", "attributeValue", "pos", "collectCharacters", "regEx", "chars", "match", "output", "url", "absoluteToDoc", "descriptorsStr", "inParens", "c", "cachedDocument", "getHref", "isSVGElement", "el", "customHref", "a", "transformAttribute", "tagName", "name", "value", "dataURLOptions", "transformedValue", "img", "processedDataURL", "recompressBase64Image", "checkDataURLSize", "absolutifyURLs", "ignoreAttribute", "_value", "_isBlockedElement", "blockClass", "blockSelector", "eIndex", "className", "e", "classMatchesRegex", "node", "regex", "checkAncestors", "dom", "needMaskingText", "maskTextClass", "maskTextSelector", "isElement", "onceIframeLoaded", "iframeEl", "listener", "iframeLoadTimeout", "win", "fired", "readyState", "error", "timer", "blankUrl", "onceStylesheetLoaded", "link", "styleSheetLoadTimeout", "styleSheetLoaded", "serializeNode", "n", "options", "mirror", "needsMask", "inlineStylesheet", "maskInputOptions", "maskTextFn", "maskInputFn", "inlineImages", "recordCanvas", "keepIframeSrcFn", "newlyAddedElement", "rootId", "getRootId", "NodeType", "serializeElementNode", "serializeTextNode", "docId", "parent", "parentTagName", "text", "isStyle", "isScript", "_a", "stringifyStylesheet", "err", "findStylesheet", "href", "s", "hrefFrom", "needBlock", "attributes", "len", "i", "attr", "stylesheet", "rootDomain", "stylesheetPath", "potentialStylesheetHref", "cssText", "checked", "maskInputValue", "getInputType", "is2DCanvasBlank", "canvasDataURL", "blankCanvas", "blankCanvasDataURL", "image", "imageSrc", "priorCrossOrigin", "recordInlineImage", "mediaAttributes", "width", "height", "left", "top", "_b", "isCustomElement", "lowerIfExists", "maybeAttr", "slimDOMExcluded", "sn", "slimDOMOptions", "extractFileExtension", "DEFAULT_MAX_DEPTH", "_maxDepthWarned", "_maxDepthReached", "wasMaxDepthReached", "resetMaxDepthState", "serializeNodeWithId", "skipChild", "onSerialize", "onIframeLoad", "onStylesheetLoad", "stylesheetLoadTimeout", "depth", "maxDepth", "preserveWhiteSpace", "_serializedNode", "id", "serializedNode", "recordChild", "shadowRootEl", "isNativeShadowDom", "bypassOptions", "childN", "serializedChildNode", "isShadowRoot", "iframeDoc", "serializedIframeNode", "serializedLinkNode", "snapshot", "Mirror", "maskAllInputs", "slimDOM", "visitSnapshot", "onVisit", "walk", "current", "cleanupSnapshot"]
|
|
7
|
+
}
|