{"version":3,"file":"htmlTreeAsString.js","sources":["../../src/htmlTreeAsString.ts"],"sourcesContent":["import { isString } from '@sentry/core';\n\nconst DEFAULT_MAX_STRING_LENGTH = 80;\n\ntype SimpleNode = {\n parentNode: SimpleNode;\n} | null;\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nexport function htmlTreeAsString(\n elem: unknown,\n options: string[] | { keyAttrs?: string[]; maxStringLength?: number } = {},\n): string {\n if (!elem) {\n return '';\n }\n\n // try/catch both:\n // - accessing event.target (see getsentry/raven-js#838, #768)\n // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n // - can throw an exception in some circumstances.\n try {\n let currentElem = elem as SimpleNode;\n const MAX_TRAVERSE_HEIGHT = 5;\n const out = [];\n let height = 0;\n let len = 0;\n const separator = ' > ';\n const sepLength = separator.length;\n let nextStr;\n const keyAttrs = Array.isArray(options) ? options : options.keyAttrs;\n const maxStringLength = (!Array.isArray(options) && options.maxStringLength) || DEFAULT_MAX_STRING_LENGTH;\n\n while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = _htmlElementAsString(currentElem, keyAttrs);\n // bail out if\n // - nextStr is the 'html' element\n // - the length of the string that would be created exceeds maxStringLength\n // (ignore this limit if we are on the first iteration)\n if (nextStr === 'html' || (height > 1 && len + out.length * sepLength + nextStr.length >= maxStringLength)) {\n break;\n }\n\n out.push(nextStr);\n\n len += nextStr.length;\n currentElem = currentElem.parentNode;\n }\n\n return out.reverse().join(separator);\n } catch {\n return '';\n }\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nfunction _htmlElementAsString(el: unknown, keyAttrs?: string[]): string {\n const elem = el as {\n tagName?: string;\n id?: string;\n className?: string;\n getAttribute(key: string): string;\n };\n\n const out = [];\n\n if (!elem?.tagName) {\n return '';\n }\n\n if (typeof HTMLElement !== 'undefined') {\n // If using the component name annotation plugin, this value may be available on the DOM node\n if (elem instanceof HTMLElement && elem.dataset) {\n if (elem.dataset['sentryComponent']) {\n return elem.dataset['sentryComponent'];\n }\n if (elem.dataset['sentryElement']) {\n return elem.dataset['sentryElement'];\n }\n }\n }\n\n out.push(elem.tagName.toLowerCase());\n\n // Pairs of attribute keys defined in `serializeAttribute` and their values on element.\n const keyAttrPairs = keyAttrs?.length\n ? keyAttrs.filter(keyAttr => elem.getAttribute(keyAttr)).map(keyAttr => [keyAttr, elem.getAttribute(keyAttr)])\n : null;\n\n if (keyAttrPairs?.length) {\n keyAttrPairs.forEach(keyAttrPair => {\n out.push(`[${keyAttrPair[0]}=\"${keyAttrPair[1]}\"]`);\n });\n } else {\n if (elem.id) {\n out.push(`#${elem.id}`);\n }\n\n const className = elem.className;\n if (className && isString(className)) {\n const classes = className.split(/\\s+/);\n for (const c of classes) {\n out.push(`.${c}`);\n }\n }\n }\n for (const k of ['aria-label', 'type', 'name', 'title', 'alt']) {\n const attr = elem.getAttribute(k);\n if (attr) {\n out.push(`[${k}=\"${attr}\"]`);\n }\n }\n\n return out.join('');\n}\n"],"names":[],"mappings":"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"}