import { NodePrivacyLevel, shouldMaskNode } from '@datadog/browser-rum-core' import { isSafari } from '@datadog/browser-core' import { getElementInputValue, normalizedTagName, switchToAbsoluteUrl } from './serializationUtils' import { serializeAttribute } from './serializeAttribute' import type { ChangeSerializationTransaction } from './serializationTransaction' import { SerializationKind } from './serializationTransaction' import type { VirtualAttributes } from './serialization.types' export function serializeAttributes( element: Element, nodePrivacyLevel: NodePrivacyLevel, transaction: ChangeSerializationTransaction ): Record { return { ...serializeDOMAttributes(element, nodePrivacyLevel, transaction), ...serializeVirtualAttributes(element, nodePrivacyLevel, transaction), } } export function serializeDOMAttributes( element: Element, nodePrivacyLevel: NodePrivacyLevel, transaction: ChangeSerializationTransaction ): Record { if (nodePrivacyLevel === NodePrivacyLevel.HIDDEN) { return {} } const attrs: Record = {} const tagName = normalizedTagName(element) for (let i = 0; i < element.attributes.length; i += 1) { const attribute = element.attributes.item(i)! const attributeName = attribute.name const attributeValue = serializeAttribute(element, nodePrivacyLevel, attributeName, transaction.scope.configuration) if (attributeValue !== null) { attrs[attributeName] = attributeValue } } if ( (element as HTMLInputElement).value && (tagName === 'textarea' || tagName === 'select' || tagName === 'option' || tagName === 'input') ) { const formValue = getElementInputValue(element, nodePrivacyLevel) if (formValue !== undefined) { attrs.value = formValue } } /** *