{"version":3,"file":"ClicksInstrumentation.cjs","names":["EmbraceInstrumentationBase","getHTMLElementFriendlyName"],"sources":["../../../../src/instrumentations/clicks/ClicksInstrumentation/ClicksInstrumentation.ts"],"sourcesContent":["/*\n  This instrumentation is taking code from here as a starting point:\n    https://github.com/open-telemetry/opentelemetry-js-contrib/blob/main/plugins/web/opentelemetry-instrumentation-user-interaction/src/instrumentation.ts\n\n  But not using that instrumentation directly because:\n\n    1) We want to record clicks as span events on the Session span\n    2) There is a bug with the instrumentation that causes a large number of spans to be created for a single click\n      when zone context isn't available. To avoid the bug we take a simpler approach here and add a listener directly\n      to `document` rather than trying to patch the `addEventListener` method on the prototype, this does mean we miss\n      recording click events for which `stopPropagation` is called. See https://github.com/open-telemetry/opentelemetry-js-contrib/issues/1368\n */\n\nimport { EmbraceInstrumentationBase } from '../../EmbraceInstrumentationBase/index.ts';\nimport type { ClicksInstrumentationArgs } from './types.ts';\n\nimport { getHTMLElementFriendlyName } from './utils.ts';\n\nexport class ClicksInstrumentation extends EmbraceInstrumentationBase {\n  private readonly _onClickHandler: (event: MouseEvent) => void;\n\n  public constructor({\n    diag,\n    perf,\n    shouldTrack,\n    innerTextForElement,\n  }: ClicksInstrumentationArgs = {}) {\n    super({\n      instrumentationName: 'ClicksInstrumentation',\n      instrumentationVersion: '1.0.0',\n      diag,\n      perf,\n      config: {},\n    });\n\n    this._onClickHandler = (event: MouseEvent) => {\n      const element = event.target;\n\n      if (!(element instanceof HTMLElement)) {\n        return;\n      }\n      if (element.hasAttribute('disabled')) {\n        return;\n      }\n\n      if (shouldTrack && !shouldTrack(element)) {\n        return;\n      }\n\n      try {\n        const currentSessionSpan = this.sessionManager.getSessionSpan();\n        if (currentSessionSpan) {\n          currentSessionSpan.addEvent(\n            'click',\n            {\n              'emb.type': 'ux.tap',\n              'view.name': getHTMLElementFriendlyName(\n                element,\n                innerTextForElement\n                  ? innerTextForElement(element)\n                  : element.innerText,\n              ),\n              'tap.coords': `${event.x.toString()},${event.y.toString()}`,\n            },\n            this.perf.epochMillisFromOriginOffset(event.timeStamp),\n          );\n        }\n      } catch (e) {\n        this._diag.error('failed to create new user interaction span event', e);\n      }\n    };\n\n    if (this._config.enabled) {\n      this.enable();\n    }\n  }\n\n  public disable(): void {\n    document.removeEventListener('click', this._onClickHandler);\n  }\n\n  public enable(): void {\n    document.addEventListener('click', this._onClickHandler);\n  }\n}\n"],"mappings":";;;;AAkBA,IAAa,wBAAb,cAA2CA,+EAAAA,2BAA2B;CACpE;CAEA,YAAmB,EACjB,MACA,MACA,aACA,wBAC6B,EAAE,EAAE;AACjC,QAAM;GACJ,qBAAqB;GACrB,wBAAwB;GACxB;GACA;GACA,QAAQ,EAAE;GACX,CAAC;AAEF,OAAK,mBAAmB,UAAsB;GAC5C,MAAM,UAAU,MAAM;AAEtB,OAAI,EAAE,mBAAmB,aACvB;AAEF,OAAI,QAAQ,aAAa,WAAW,CAClC;AAGF,OAAI,eAAe,CAAC,YAAY,QAAQ,CACtC;AAGF,OAAI;IACF,MAAM,qBAAqB,KAAK,eAAe,gBAAgB;AAC/D,QAAI,mBACF,oBAAmB,SACjB,SACA;KACE,YAAY;KACZ,aAAaC,4DAAAA,2BACX,SACA,sBACI,oBAAoB,QAAQ,GAC5B,QAAQ,UACb;KACD,cAAc,GAAG,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,EAAE,UAAU;KAC1D,EACD,KAAK,KAAK,4BAA4B,MAAM,UAAU,CACvD;YAEI,GAAG;AACV,SAAK,MAAM,MAAM,oDAAoD,EAAE;;;AAI3E,MAAI,KAAK,QAAQ,QACf,MAAK,QAAQ;;CAIjB,UAAuB;AACrB,WAAS,oBAAoB,SAAS,KAAK,gBAAgB;;CAG7D,SAAsB;AACpB,WAAS,iBAAiB,SAAS,KAAK,gBAAgB"}