@cloudcare/browser-rum-slim 3.3.3
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/LICENSE +21 -0
- package/README.md +15 -0
- package/bundle/dataflux-rum-slim.js +1 -0
- package/cjs/boot/buildEnv.js +11 -0
- package/cjs/boot/buildEnv.js.map +1 -0
- package/cjs/boot/perStartRum.js +227 -0
- package/cjs/boot/perStartRum.js.map +1 -0
- package/cjs/boot/rum.js +180 -0
- package/cjs/boot/rum.js.map +1 -0
- package/cjs/boot/rum.slim.entry.js +13 -0
- package/cjs/boot/rum.slim.entry.js.map +1 -0
- package/cjs/boot/rumEntryFactory.js +15 -0
- package/cjs/boot/rumEntryFactory.js.map +1 -0
- package/cjs/boot/rumPublicApi.js +285 -0
- package/cjs/boot/rumPublicApi.js.map +1 -0
- package/cjs/boot/rumRecorderApiStub.js +19 -0
- package/cjs/boot/rumRecorderApiStub.js.map +1 -0
- package/cjs/boot/rumSlimConfiguration.js +16 -0
- package/cjs/boot/rumSlimConfiguration.js.map +1 -0
- package/cjs/constants.js +41 -0
- package/cjs/constants.js.map +1 -0
- package/cjs/domain/assembly.js +172 -0
- package/cjs/domain/assembly.js.map +1 -0
- package/cjs/domain/configuration.js +272 -0
- package/cjs/domain/configuration.js.map +1 -0
- package/cjs/domain/contexts/commonContext.js +14 -0
- package/cjs/domain/contexts/commonContext.js.map +1 -0
- package/cjs/domain/contexts/displayContext.js +22 -0
- package/cjs/domain/contexts/displayContext.js.map +1 -0
- package/cjs/domain/contexts/foregroundContexts.js +111 -0
- package/cjs/domain/contexts/foregroundContexts.js.map +1 -0
- package/cjs/domain/contexts/internalContext.js +47 -0
- package/cjs/domain/contexts/internalContext.js.map +1 -0
- package/cjs/domain/contexts/pageStateHistory.js +111 -0
- package/cjs/domain/contexts/pageStateHistory.js.map +1 -0
- package/cjs/domain/contexts/urlContexts.js +73 -0
- package/cjs/domain/contexts/urlContexts.js.map +1 -0
- package/cjs/domain/contexts/viewContexts.js +51 -0
- package/cjs/domain/contexts/viewContexts.js.map +1 -0
- package/cjs/domain/domMutationObservable.js +69 -0
- package/cjs/domain/domMutationObservable.js.map +1 -0
- package/cjs/domain/encoderStreamId.js +11 -0
- package/cjs/domain/encoderStreamId.js.map +1 -0
- package/cjs/domain/firstInputPolyfill.js +83 -0
- package/cjs/domain/firstInputPolyfill.js.map +1 -0
- package/cjs/domain/initViewportObservable.js +44 -0
- package/cjs/domain/initViewportObservable.js.map +1 -0
- package/cjs/domain/locationChangeObservable.js +57 -0
- package/cjs/domain/locationChangeObservable.js.map +1 -0
- package/cjs/domain/performanceObservable.js +124 -0
- package/cjs/domain/performanceObservable.js.map +1 -0
- package/cjs/domain/performanceUtils.js +47 -0
- package/cjs/domain/performanceUtils.js.map +1 -0
- package/cjs/domain/requestCollection.js +127 -0
- package/cjs/domain/requestCollection.js.map +1 -0
- package/cjs/domain/rumEventsCollection/actions/actionCollection.js +89 -0
- package/cjs/domain/rumEventsCollection/actions/actionCollection.js.map +1 -0
- package/cjs/domain/rumEventsCollection/actions/clickChain.js +69 -0
- package/cjs/domain/rumEventsCollection/actions/clickChain.js.map +1 -0
- package/cjs/domain/rumEventsCollection/actions/computeFrustration.js +75 -0
- package/cjs/domain/rumEventsCollection/actions/computeFrustration.js.map +1 -0
- package/cjs/domain/rumEventsCollection/actions/getActionNameFromElement.js +232 -0
- package/cjs/domain/rumEventsCollection/actions/getActionNameFromElement.js.map +1 -0
- package/cjs/domain/rumEventsCollection/actions/getSelectorsFromElement.js +220 -0
- package/cjs/domain/rumEventsCollection/actions/getSelectorsFromElement.js.map +1 -0
- package/cjs/domain/rumEventsCollection/actions/interactionSelectorCache.js +28 -0
- package/cjs/domain/rumEventsCollection/actions/interactionSelectorCache.js.map +1 -0
- package/cjs/domain/rumEventsCollection/actions/listenActionEvents.js +73 -0
- package/cjs/domain/rumEventsCollection/actions/listenActionEvents.js.map +1 -0
- package/cjs/domain/rumEventsCollection/actions/trackClickActions.js +253 -0
- package/cjs/domain/rumEventsCollection/actions/trackClickActions.js.map +1 -0
- package/cjs/domain/rumEventsCollection/error/errorCollection.js +90 -0
- package/cjs/domain/rumEventsCollection/error/errorCollection.js.map +1 -0
- package/cjs/domain/rumEventsCollection/error/trackConsoleError.js +18 -0
- package/cjs/domain/rumEventsCollection/error/trackConsoleError.js.map +1 -0
- package/cjs/domain/rumEventsCollection/error/trackReportError.js +25 -0
- package/cjs/domain/rumEventsCollection/error/trackReportError.js.map +1 -0
- package/cjs/domain/rumEventsCollection/longTask/longAnimationFrameCollection.js +61 -0
- package/cjs/domain/rumEventsCollection/longTask/longAnimationFrameCollection.js.map +1 -0
- package/cjs/domain/rumEventsCollection/longTask/longTaskCollection.js +44 -0
- package/cjs/domain/rumEventsCollection/longTask/longTaskCollection.js.map +1 -0
- package/cjs/domain/rumEventsCollection/resource/matchRequestResourceEntry.js +74 -0
- package/cjs/domain/rumEventsCollection/resource/matchRequestResourceEntry.js.map +1 -0
- package/cjs/domain/rumEventsCollection/resource/resourceCollection.js +239 -0
- package/cjs/domain/rumEventsCollection/resource/resourceCollection.js.map +1 -0
- package/cjs/domain/rumEventsCollection/resource/resourceTrackerManager.js +237 -0
- package/cjs/domain/rumEventsCollection/resource/resourceTrackerManager.js.map +1 -0
- package/cjs/domain/rumEventsCollection/resource/resourceUtils.js +240 -0
- package/cjs/domain/rumEventsCollection/resource/resourceUtils.js.map +1 -0
- package/cjs/domain/rumEventsCollection/resource/retrieveInitialDocumentResourceTiming.js +25 -0
- package/cjs/domain/rumEventsCollection/resource/retrieveInitialDocumentResourceTiming.js.map +1 -0
- package/cjs/domain/rumEventsCollection/view/interactionCountPolyfill.js +54 -0
- package/cjs/domain/rumEventsCollection/view/interactionCountPolyfill.js.map +1 -0
- package/cjs/domain/rumEventsCollection/view/trackCommonViewMetrics.js +48 -0
- package/cjs/domain/rumEventsCollection/view/trackCommonViewMetrics.js.map +1 -0
- package/cjs/domain/rumEventsCollection/view/trackCumulativeLayoutShift.js +125 -0
- package/cjs/domain/rumEventsCollection/view/trackCumulativeLayoutShift.js.map +1 -0
- package/cjs/domain/rumEventsCollection/view/trackFirstContentfulPaint.js +27 -0
- package/cjs/domain/rumEventsCollection/view/trackFirstContentfulPaint.js.map +1 -0
- package/cjs/domain/rumEventsCollection/view/trackFirstHidden.js +55 -0
- package/cjs/domain/rumEventsCollection/view/trackFirstHidden.js.map +1 -0
- package/cjs/domain/rumEventsCollection/view/trackFirstInput.js +47 -0
- package/cjs/domain/rumEventsCollection/view/trackFirstInput.js.map +1 -0
- package/cjs/domain/rumEventsCollection/view/trackInitialViewTimings.js +51 -0
- package/cjs/domain/rumEventsCollection/view/trackInitialViewTimings.js.map +1 -0
- package/cjs/domain/rumEventsCollection/view/trackInteractionToNextPaint.js +162 -0
- package/cjs/domain/rumEventsCollection/view/trackInteractionToNextPaint.js.map +1 -0
- package/cjs/domain/rumEventsCollection/view/trackLargestContentfulPaint.js +61 -0
- package/cjs/domain/rumEventsCollection/view/trackLargestContentfulPaint.js.map +1 -0
- package/cjs/domain/rumEventsCollection/view/trackLoadingTime.js +51 -0
- package/cjs/domain/rumEventsCollection/view/trackLoadingTime.js.map +1 -0
- package/cjs/domain/rumEventsCollection/view/trackNavigationTimings.js +57 -0
- package/cjs/domain/rumEventsCollection/view/trackNavigationTimings.js.map +1 -0
- package/cjs/domain/rumEventsCollection/view/trackScrollMetrics.js +92 -0
- package/cjs/domain/rumEventsCollection/view/trackScrollMetrics.js.map +1 -0
- package/cjs/domain/rumEventsCollection/view/trackViewEventCounts.js +21 -0
- package/cjs/domain/rumEventsCollection/view/trackViewEventCounts.js.map +1 -0
- package/cjs/domain/rumEventsCollection/view/trackViews.js +269 -0
- package/cjs/domain/rumEventsCollection/view/trackViews.js.map +1 -0
- package/cjs/domain/rumEventsCollection/view/viewCollection.js +131 -0
- package/cjs/domain/rumEventsCollection/view/viewCollection.js.map +1 -0
- package/cjs/domain/rumSessionManager.js +187 -0
- package/cjs/domain/rumSessionManager.js.map +1 -0
- package/cjs/domain/tracing/ddtraceTracer.js +46 -0
- package/cjs/domain/tracing/ddtraceTracer.js.map +1 -0
- package/cjs/domain/tracing/getDocumentTraceId.js +80 -0
- package/cjs/domain/tracing/getDocumentTraceId.js.map +1 -0
- package/cjs/domain/tracing/jaegerTracer.js +48 -0
- package/cjs/domain/tracing/jaegerTracer.js.map +1 -0
- package/cjs/domain/tracing/sampler.js +69 -0
- package/cjs/domain/tracing/sampler.js.map +1 -0
- package/cjs/domain/tracing/skywalkingTracer.js +96 -0
- package/cjs/domain/tracing/skywalkingTracer.js.map +1 -0
- package/cjs/domain/tracing/traceIdentifier.js +66 -0
- package/cjs/domain/tracing/traceIdentifier.js.map +1 -0
- package/cjs/domain/tracing/tracer.js +133 -0
- package/cjs/domain/tracing/tracer.js.map +1 -0
- package/cjs/domain/tracing/w3cTraceParentTracer.js +74 -0
- package/cjs/domain/tracing/w3cTraceParentTracer.js.map +1 -0
- package/cjs/domain/tracing/zipkinMultiTracer.js +48 -0
- package/cjs/domain/tracing/zipkinMultiTracer.js.map +1 -0
- package/cjs/domain/tracing/zipkinSingleTracer.js +47 -0
- package/cjs/domain/tracing/zipkinSingleTracer.js.map +1 -0
- package/cjs/domain/trackEventCounts.js +55 -0
- package/cjs/domain/trackEventCounts.js.map +1 -0
- package/cjs/domain/usr/index.js +44 -0
- package/cjs/domain/usr/index.js.map +1 -0
- package/cjs/domain/waitPageActivityEnd.js +151 -0
- package/cjs/domain/waitPageActivityEnd.js.map +1 -0
- package/cjs/index.js +13 -0
- package/cjs/index.js.map +1 -0
- package/cjs/transport/startRumBatch.js +26 -0
- package/cjs/transport/startRumBatch.js.map +1 -0
- package/cjs/transport/startRumEventBridge.js +15 -0
- package/cjs/transport/startRumEventBridge.js.map +1 -0
- package/esm/boot/buildEnv.js +5 -0
- package/esm/boot/buildEnv.js.map +1 -0
- package/esm/boot/perStartRum.js +221 -0
- package/esm/boot/perStartRum.js.map +1 -0
- package/esm/boot/rum.js +173 -0
- package/esm/boot/rum.js.map +1 -0
- package/esm/boot/rum.slim.entry.js +7 -0
- package/esm/boot/rum.slim.entry.js.map +1 -0
- package/esm/boot/rumEntryFactory.js +9 -0
- package/esm/boot/rumEntryFactory.js.map +1 -0
- package/esm/boot/rumPublicApi.js +279 -0
- package/esm/boot/rumPublicApi.js.map +1 -0
- package/esm/boot/rumRecorderApiStub.js +13 -0
- package/esm/boot/rumRecorderApiStub.js.map +1 -0
- package/esm/boot/rumSlimConfiguration.js +10 -0
- package/esm/boot/rumSlimConfiguration.js.map +1 -0
- package/esm/constants.js +35 -0
- package/esm/constants.js.map +1 -0
- package/esm/domain/assembly.js +166 -0
- package/esm/domain/assembly.js.map +1 -0
- package/esm/domain/configuration.js +266 -0
- package/esm/domain/configuration.js.map +1 -0
- package/esm/domain/contexts/commonContext.js +8 -0
- package/esm/domain/contexts/commonContext.js.map +1 -0
- package/esm/domain/contexts/displayContext.js +16 -0
- package/esm/domain/contexts/displayContext.js.map +1 -0
- package/esm/domain/contexts/foregroundContexts.js +103 -0
- package/esm/domain/contexts/foregroundContexts.js.map +1 -0
- package/esm/domain/contexts/internalContext.js +41 -0
- package/esm/domain/contexts/internalContext.js.map +1 -0
- package/esm/domain/contexts/pageStateHistory.js +104 -0
- package/esm/domain/contexts/pageStateHistory.js.map +1 -0
- package/esm/domain/contexts/urlContexts.js +67 -0
- package/esm/domain/contexts/urlContexts.js.map +1 -0
- package/esm/domain/contexts/viewContexts.js +44 -0
- package/esm/domain/contexts/viewContexts.js.map +1 -0
- package/esm/domain/domMutationObservable.js +62 -0
- package/esm/domain/domMutationObservable.js.map +1 -0
- package/esm/domain/encoderStreamId.js +5 -0
- package/esm/domain/encoderStreamId.js.map +1 -0
- package/esm/domain/firstInputPolyfill.js +77 -0
- package/esm/domain/firstInputPolyfill.js.map +1 -0
- package/esm/domain/initViewportObservable.js +36 -0
- package/esm/domain/initViewportObservable.js.map +1 -0
- package/esm/domain/locationChangeObservable.js +51 -0
- package/esm/domain/locationChangeObservable.js.map +1 -0
- package/esm/domain/performanceObservable.js +116 -0
- package/esm/domain/performanceObservable.js.map +1 -0
- package/esm/domain/performanceUtils.js +40 -0
- package/esm/domain/performanceUtils.js.map +1 -0
- package/esm/domain/requestCollection.js +119 -0
- package/esm/domain/requestCollection.js.map +1 -0
- package/esm/domain/rumEventsCollection/actions/actionCollection.js +83 -0
- package/esm/domain/rumEventsCollection/actions/actionCollection.js.map +1 -0
- package/esm/domain/rumEventsCollection/actions/clickChain.js +62 -0
- package/esm/domain/rumEventsCollection/actions/clickChain.js.map +1 -0
- package/esm/domain/rumEventsCollection/actions/computeFrustration.js +67 -0
- package/esm/domain/rumEventsCollection/actions/computeFrustration.js.map +1 -0
- package/esm/domain/rumEventsCollection/actions/getActionNameFromElement.js +225 -0
- package/esm/domain/rumEventsCollection/actions/getActionNameFromElement.js.map +1 -0
- package/esm/domain/rumEventsCollection/actions/getSelectorsFromElement.js +212 -0
- package/esm/domain/rumEventsCollection/actions/getSelectorsFromElement.js.map +1 -0
- package/esm/domain/rumEventsCollection/actions/interactionSelectorCache.js +20 -0
- package/esm/domain/rumEventsCollection/actions/interactionSelectorCache.js.map +1 -0
- package/esm/domain/rumEventsCollection/actions/listenActionEvents.js +67 -0
- package/esm/domain/rumEventsCollection/actions/listenActionEvents.js.map +1 -0
- package/esm/domain/rumEventsCollection/actions/trackClickActions.js +244 -0
- package/esm/domain/rumEventsCollection/actions/trackClickActions.js.map +1 -0
- package/esm/domain/rumEventsCollection/error/errorCollection.js +83 -0
- package/esm/domain/rumEventsCollection/error/errorCollection.js.map +1 -0
- package/esm/domain/rumEventsCollection/error/trackConsoleError.js +12 -0
- package/esm/domain/rumEventsCollection/error/trackConsoleError.js.map +1 -0
- package/esm/domain/rumEventsCollection/error/trackReportError.js +19 -0
- package/esm/domain/rumEventsCollection/error/trackReportError.js.map +1 -0
- package/esm/domain/rumEventsCollection/longTask/longAnimationFrameCollection.js +55 -0
- package/esm/domain/rumEventsCollection/longTask/longAnimationFrameCollection.js.map +1 -0
- package/esm/domain/rumEventsCollection/longTask/longTaskCollection.js +38 -0
- package/esm/domain/rumEventsCollection/longTask/longTaskCollection.js.map +1 -0
- package/esm/domain/rumEventsCollection/resource/matchRequestResourceEntry.js +69 -0
- package/esm/domain/rumEventsCollection/resource/matchRequestResourceEntry.js.map +1 -0
- package/esm/domain/rumEventsCollection/resource/resourceCollection.js +233 -0
- package/esm/domain/rumEventsCollection/resource/resourceCollection.js.map +1 -0
- package/esm/domain/rumEventsCollection/resource/resourceTrackerManager.js +231 -0
- package/esm/domain/rumEventsCollection/resource/resourceTrackerManager.js.map +1 -0
- package/esm/domain/rumEventsCollection/resource/resourceUtils.js +218 -0
- package/esm/domain/rumEventsCollection/resource/resourceUtils.js.map +1 -0
- package/esm/domain/rumEventsCollection/resource/retrieveInitialDocumentResourceTiming.js +19 -0
- package/esm/domain/rumEventsCollection/resource/retrieveInitialDocumentResourceTiming.js.map +1 -0
- package/esm/domain/rumEventsCollection/view/interactionCountPolyfill.js +47 -0
- package/esm/domain/rumEventsCollection/view/interactionCountPolyfill.js.map +1 -0
- package/esm/domain/rumEventsCollection/view/trackCommonViewMetrics.js +42 -0
- package/esm/domain/rumEventsCollection/view/trackCommonViewMetrics.js.map +1 -0
- package/esm/domain/rumEventsCollection/view/trackCumulativeLayoutShift.js +117 -0
- package/esm/domain/rumEventsCollection/view/trackCumulativeLayoutShift.js.map +1 -0
- package/esm/domain/rumEventsCollection/view/trackFirstContentfulPaint.js +20 -0
- package/esm/domain/rumEventsCollection/view/trackFirstContentfulPaint.js.map +1 -0
- package/esm/domain/rumEventsCollection/view/trackFirstHidden.js +49 -0
- package/esm/domain/rumEventsCollection/view/trackFirstHidden.js.map +1 -0
- package/esm/domain/rumEventsCollection/view/trackFirstInput.js +41 -0
- package/esm/domain/rumEventsCollection/view/trackFirstInput.js.map +1 -0
- package/esm/domain/rumEventsCollection/view/trackInitialViewTimings.js +44 -0
- package/esm/domain/rumEventsCollection/view/trackInitialViewTimings.js.map +1 -0
- package/esm/domain/rumEventsCollection/view/trackInteractionToNextPaint.js +153 -0
- package/esm/domain/rumEventsCollection/view/trackInteractionToNextPaint.js.map +1 -0
- package/esm/domain/rumEventsCollection/view/trackLargestContentfulPaint.js +54 -0
- package/esm/domain/rumEventsCollection/view/trackLargestContentfulPaint.js.map +1 -0
- package/esm/domain/rumEventsCollection/view/trackLoadingTime.js +45 -0
- package/esm/domain/rumEventsCollection/view/trackLoadingTime.js.map +1 -0
- package/esm/domain/rumEventsCollection/view/trackNavigationTimings.js +51 -0
- package/esm/domain/rumEventsCollection/view/trackNavigationTimings.js.map +1 -0
- package/esm/domain/rumEventsCollection/view/trackScrollMetrics.js +84 -0
- package/esm/domain/rumEventsCollection/view/trackScrollMetrics.js.map +1 -0
- package/esm/domain/rumEventsCollection/view/trackViewEventCounts.js +15 -0
- package/esm/domain/rumEventsCollection/view/trackViewEventCounts.js.map +1 -0
- package/esm/domain/rumEventsCollection/view/trackViews.js +262 -0
- package/esm/domain/rumEventsCollection/view/trackViews.js.map +1 -0
- package/esm/domain/rumEventsCollection/view/viewCollection.js +125 -0
- package/esm/domain/rumEventsCollection/view/viewCollection.js.map +1 -0
- package/esm/domain/rumSessionManager.js +179 -0
- package/esm/domain/rumSessionManager.js.map +1 -0
- package/esm/domain/tracing/ddtraceTracer.js +40 -0
- package/esm/domain/tracing/ddtraceTracer.js.map +1 -0
- package/esm/domain/tracing/getDocumentTraceId.js +69 -0
- package/esm/domain/tracing/getDocumentTraceId.js.map +1 -0
- package/esm/domain/tracing/jaegerTracer.js +42 -0
- package/esm/domain/tracing/jaegerTracer.js.map +1 -0
- package/esm/domain/tracing/sampler.js +61 -0
- package/esm/domain/tracing/sampler.js.map +1 -0
- package/esm/domain/tracing/skywalkingTracer.js +90 -0
- package/esm/domain/tracing/skywalkingTracer.js.map +1 -0
- package/esm/domain/tracing/traceIdentifier.js +57 -0
- package/esm/domain/tracing/traceIdentifier.js.map +1 -0
- package/esm/domain/tracing/tracer.js +124 -0
- package/esm/domain/tracing/tracer.js.map +1 -0
- package/esm/domain/tracing/w3cTraceParentTracer.js +69 -0
- package/esm/domain/tracing/w3cTraceParentTracer.js.map +1 -0
- package/esm/domain/tracing/zipkinMultiTracer.js +42 -0
- package/esm/domain/tracing/zipkinMultiTracer.js.map +1 -0
- package/esm/domain/tracing/zipkinSingleTracer.js +41 -0
- package/esm/domain/tracing/zipkinSingleTracer.js.map +1 -0
- package/esm/domain/trackEventCounts.js +49 -0
- package/esm/domain/trackEventCounts.js.map +1 -0
- package/esm/domain/usr/index.js +38 -0
- package/esm/domain/usr/index.js.map +1 -0
- package/esm/domain/waitPageActivityEnd.js +142 -0
- package/esm/domain/waitPageActivityEnd.js.map +1 -0
- package/esm/index.js +3 -0
- package/esm/index.js.map +1 -0
- package/esm/transport/startRumBatch.js +20 -0
- package/esm/transport/startRumBatch.js.map +1 -0
- package/esm/transport/startRumEventBridge.js +9 -0
- package/esm/transport/startRumEventBridge.js.map +1 -0
- package/package.json +39 -0
- package/types/index.d.ts +134 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.DEFAULT_PROGRAMMATIC_ACTION_NAME_ATTRIBUTE = void 0;
|
|
7
|
+
exports.getActionNameFromElement = getActionNameFromElement;
|
|
8
|
+
var _browserCore = require("@cloudcare/browser-core");
|
|
9
|
+
var DEFAULT_PROGRAMMATIC_ACTION_NAME_ATTRIBUTE = exports.DEFAULT_PROGRAMMATIC_ACTION_NAME_ATTRIBUTE = 'data-guance-action-name';
|
|
10
|
+
function getActionNameFromElement(element, userProgrammaticAttribute) {
|
|
11
|
+
// Proceed to get the action name in two steps:
|
|
12
|
+
// * first, get the name programmatically, explicitly defined by the user.
|
|
13
|
+
// * then, use strategies that are known to return good results. Those strategies will be used on
|
|
14
|
+
// the element and a few parents, but it's likely that they won't succeed at all.
|
|
15
|
+
// * if no name is found this way, use strategies returning less accurate names as a fallback.
|
|
16
|
+
// Those are much likely to succeed.
|
|
17
|
+
return getActionNameFromElementProgrammatically(element, DEFAULT_PROGRAMMATIC_ACTION_NAME_ATTRIBUTE) || userProgrammaticAttribute && getActionNameFromElementProgrammatically(element, userProgrammaticAttribute) || getActionNameFromElementForStrategies(element, userProgrammaticAttribute, priorityStrategies) || getActionNameFromElementForStrategies(element, userProgrammaticAttribute, fallbackStrategies) || '';
|
|
18
|
+
}
|
|
19
|
+
function getActionNameFromElementProgrammatically(targetElement, programmaticAttribute) {
|
|
20
|
+
var elementWithAttribute;
|
|
21
|
+
// We don't use getActionNameFromElementForStrategies here, because we want to consider all parents,
|
|
22
|
+
// without limit. It is up to the user to declare a relevant naming strategy.
|
|
23
|
+
// If available, use element.closest() to match get the attribute from the element or any of its
|
|
24
|
+
// parent. Else fallback to a more traditional implementation.
|
|
25
|
+
if (supportsElementClosest()) {
|
|
26
|
+
elementWithAttribute = targetElement.closest('[' + programmaticAttribute + ']');
|
|
27
|
+
} else {
|
|
28
|
+
var element = targetElement;
|
|
29
|
+
while (element) {
|
|
30
|
+
if (element.hasAttribute(programmaticAttribute)) {
|
|
31
|
+
elementWithAttribute = element;
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
element = element.parentElement;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (!elementWithAttribute) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
var name = elementWithAttribute.getAttribute(programmaticAttribute);
|
|
41
|
+
return truncate(normalizeWhitespace(name.trim()));
|
|
42
|
+
}
|
|
43
|
+
var priorityStrategies = [
|
|
44
|
+
// associated LABEL text
|
|
45
|
+
function (element, userProgrammaticAttribute) {
|
|
46
|
+
// IE does not support element.labels, so we fallback to a CSS selector based on the element id
|
|
47
|
+
// instead
|
|
48
|
+
if (supportsLabelProperty()) {
|
|
49
|
+
if ('labels' in element && element.labels && element.labels.length > 0) {
|
|
50
|
+
return getTextualContent(element.labels[0], userProgrammaticAttribute);
|
|
51
|
+
}
|
|
52
|
+
} else if (element.id) {
|
|
53
|
+
var label = element.ownerDocument && (0, _browserCore.find)(element.ownerDocument.querySelectorAll('label'), function (label) {
|
|
54
|
+
return label.htmlFor === element.id;
|
|
55
|
+
});
|
|
56
|
+
return label && getTextualContent(label, userProgrammaticAttribute);
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
// INPUT button (and associated) value
|
|
60
|
+
function (element) {
|
|
61
|
+
if (element.nodeName === 'INPUT') {
|
|
62
|
+
var input = element;
|
|
63
|
+
var type = input.getAttribute('type');
|
|
64
|
+
if (type === 'button' || type === 'submit' || type === 'reset') {
|
|
65
|
+
return input.value;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
// BUTTON, LABEL or button-like element text
|
|
70
|
+
function (element, userProgrammaticAttribute) {
|
|
71
|
+
if (element.nodeName === 'BUTTON' || element.nodeName === 'LABEL' || element.getAttribute('role') === 'button') {
|
|
72
|
+
return getTextualContent(element, userProgrammaticAttribute);
|
|
73
|
+
}
|
|
74
|
+
}, function (element) {
|
|
75
|
+
return element.getAttribute('aria-label');
|
|
76
|
+
},
|
|
77
|
+
// associated element text designated by the aria-labelledby attribute
|
|
78
|
+
function (element, userProgrammaticAttribute) {
|
|
79
|
+
var labelledByAttribute = element.getAttribute('aria-labelledby');
|
|
80
|
+
if (labelledByAttribute) {
|
|
81
|
+
labelledByAttribute = labelledByAttribute.split(/\s+/);
|
|
82
|
+
labelledByAttribute = (0, _browserCore.map)(labelledByAttribute, function (id) {
|
|
83
|
+
return getElementById(element, id);
|
|
84
|
+
});
|
|
85
|
+
labelledByAttribute = (0, _browserCore.filter)(labelledByAttribute, function (label) {
|
|
86
|
+
return Boolean(label);
|
|
87
|
+
});
|
|
88
|
+
labelledByAttribute = (0, _browserCore.map)(labelledByAttribute, function (ele) {
|
|
89
|
+
return getTextualContent(ele, userProgrammaticAttribute);
|
|
90
|
+
});
|
|
91
|
+
return labelledByAttribute.join(' ');
|
|
92
|
+
}
|
|
93
|
+
}, function (element) {
|
|
94
|
+
return element.getAttribute('alt');
|
|
95
|
+
}, function (element) {
|
|
96
|
+
return element.getAttribute('name');
|
|
97
|
+
}, function (element) {
|
|
98
|
+
return element.getAttribute('title');
|
|
99
|
+
}, function (element) {
|
|
100
|
+
return element.getAttribute('placeholder');
|
|
101
|
+
},
|
|
102
|
+
// SELECT first OPTION text
|
|
103
|
+
function (element, userProgrammaticAttribute) {
|
|
104
|
+
if ('options' in element && element.options.length > 0) {
|
|
105
|
+
return getTextualContent(element.options[0], userProgrammaticAttribute);
|
|
106
|
+
}
|
|
107
|
+
}];
|
|
108
|
+
var fallbackStrategies = [function (element, userProgrammaticAttribute) {
|
|
109
|
+
return getTextualContent(element, userProgrammaticAttribute);
|
|
110
|
+
}];
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Iterates over the target element and its parent, using the strategies list to get an action name.
|
|
114
|
+
* Each strategies are applied on each element, stopping as soon as a non-empty value is returned.
|
|
115
|
+
*/
|
|
116
|
+
var MAX_PARENTS_TO_CONSIDER = 10;
|
|
117
|
+
function getActionNameFromElementForStrategies(targetElement, userProgrammaticAttribute, strategies) {
|
|
118
|
+
var element = targetElement;
|
|
119
|
+
var recursionCounter = 0;
|
|
120
|
+
while (recursionCounter <= MAX_PARENTS_TO_CONSIDER && element && element.nodeName !== 'BODY' && element.nodeName !== 'HTML' && element.nodeName !== 'HEAD') {
|
|
121
|
+
for (var i = 0; i < strategies.length; i++) {
|
|
122
|
+
var strategy = strategies[i];
|
|
123
|
+
var name = strategy(element, userProgrammaticAttribute);
|
|
124
|
+
if (typeof name === 'string') {
|
|
125
|
+
var trimmedName = name.trim();
|
|
126
|
+
if (trimmedName) {
|
|
127
|
+
return truncate(normalizeWhitespace(trimmedName));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Consider a FORM as a contextual limit to get the action name. This is experimental and may
|
|
132
|
+
// be reconsidered in the future.
|
|
133
|
+
if (element.nodeName === 'FORM') {
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
element = element.parentElement;
|
|
137
|
+
recursionCounter += 1;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function normalizeWhitespace(s) {
|
|
141
|
+
return s.replace(/\s+/g, ' ');
|
|
142
|
+
}
|
|
143
|
+
function truncate(s) {
|
|
144
|
+
return s.length > 100 ? (0, _browserCore.safeTruncate)(s, 100) + ' [...]' : s;
|
|
145
|
+
}
|
|
146
|
+
function getElementById(refElement, id) {
|
|
147
|
+
// Use the element ownerDocument here, because tests are executed in an iframe, so
|
|
148
|
+
// document.getElementById won't work.
|
|
149
|
+
return refElement.ownerDocument ? refElement.ownerDocument.getElementById(id) : null;
|
|
150
|
+
}
|
|
151
|
+
function getTextualContent(element, userProgrammaticAttribute) {
|
|
152
|
+
if (element.isContentEditable) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if ('innerText' in element) {
|
|
156
|
+
var text = element.innerText;
|
|
157
|
+
var removeTextFromElements = function removeTextFromElements(query) {
|
|
158
|
+
var list = element.querySelectorAll(query);
|
|
159
|
+
for (var index = 0; index < list.length; index += 1) {
|
|
160
|
+
var _element = list[index];
|
|
161
|
+
if ('innerText' in _element) {
|
|
162
|
+
var textToReplace = _element.innerText;
|
|
163
|
+
if (textToReplace && textToReplace.trim().length > 0) {
|
|
164
|
+
text = text.replace(textToReplace, '');
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
if (!supportsInnerTextScriptAndStyleRemoval()) {
|
|
170
|
+
// remove the inner text of SCRIPT and STYLES from the result. This is a bit dirty, but should
|
|
171
|
+
// be relatively fast and work in most cases.
|
|
172
|
+
removeTextFromElements('script, style');
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// remove the text of elements with programmatic attribute value
|
|
176
|
+
removeTextFromElements('[' + DEFAULT_PROGRAMMATIC_ACTION_NAME_ATTRIBUTE + ']');
|
|
177
|
+
if (userProgrammaticAttribute) {
|
|
178
|
+
removeTextFromElements('[' + userProgrammaticAttribute + ']');
|
|
179
|
+
}
|
|
180
|
+
return text;
|
|
181
|
+
}
|
|
182
|
+
return element.textContent;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Returns true if element.innerText excludes the text from inline SCRIPT and STYLE element. This
|
|
187
|
+
* should be the case everywhere except on Internet Explorer 10 and 11 (see [1])
|
|
188
|
+
*
|
|
189
|
+
* The innerText property relies on what is actually rendered to compute its output, so to check if
|
|
190
|
+
* it actually excludes SCRIPT and STYLE content, a solution would be to create a style element, set
|
|
191
|
+
* its content to '*', inject it in the document body, and check if the style element innerText
|
|
192
|
+
* property returns '*'. Using a new `document` instance won't work as it is not rendered.
|
|
193
|
+
*
|
|
194
|
+
* This solution requires specific CSP rules (see [2]) to be set by the customer. We want to avoid
|
|
195
|
+
* this, so instead we rely on browser detection. In case of false negative, the impact should be
|
|
196
|
+
* low, since we rely on this result to remove the SCRIPT and STYLE innerText (which will be empty)
|
|
197
|
+
* from a parent element innerText.
|
|
198
|
+
*
|
|
199
|
+
* [1]: https://web.archive.org/web/20210602165716/http://perfectionkills.com/the-poor-misunderstood-innerText/#diff-with-textContent
|
|
200
|
+
*/
|
|
201
|
+
function supportsInnerTextScriptAndStyleRemoval() {
|
|
202
|
+
return !(0, _browserCore.isIE)();
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Returns true if the browser supports the element.labels property. This should be the case
|
|
207
|
+
* everywhere except on Internet Explorer.
|
|
208
|
+
* Note: The result is computed lazily, because we don't want any DOM access when the SDK is
|
|
209
|
+
* evaluated.
|
|
210
|
+
*/
|
|
211
|
+
var supportsLabelPropertyResult;
|
|
212
|
+
function supportsLabelProperty() {
|
|
213
|
+
if (supportsLabelPropertyResult === undefined) {
|
|
214
|
+
supportsLabelPropertyResult = 'labels' in HTMLInputElement.prototype;
|
|
215
|
+
}
|
|
216
|
+
return supportsLabelPropertyResult;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Returns true if the browser supports the element.closest method. This should be the case
|
|
221
|
+
* everywhere except on Internet Explorer.
|
|
222
|
+
* Note: The result is computed lazily, because we don't want any DOM access when the SDK is
|
|
223
|
+
* evaluated.
|
|
224
|
+
*/
|
|
225
|
+
var supportsElementClosestResult;
|
|
226
|
+
function supportsElementClosest() {
|
|
227
|
+
if (supportsElementClosestResult === undefined) {
|
|
228
|
+
supportsElementClosestResult = 'closest' in HTMLElement.prototype;
|
|
229
|
+
}
|
|
230
|
+
return supportsElementClosestResult;
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=getActionNameFromElement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getActionNameFromElement.js","names":["_browserCore","require","DEFAULT_PROGRAMMATIC_ACTION_NAME_ATTRIBUTE","exports","getActionNameFromElement","element","userProgrammaticAttribute","getActionNameFromElementProgrammatically","getActionNameFromElementForStrategies","priorityStrategies","fallbackStrategies","targetElement","programmaticAttribute","elementWithAttribute","supportsElementClosest","closest","hasAttribute","parentElement","name","getAttribute","truncate","normalizeWhitespace","trim","supportsLabelProperty","labels","length","getTextualContent","id","label","ownerDocument","find","querySelectorAll","htmlFor","nodeName","input","type","value","labelledByAttribute","split","map","getElementById","filter","Boolean","ele","join","options","MAX_PARENTS_TO_CONSIDER","strategies","recursionCounter","i","strategy","trimmedName","s","replace","safeTruncate","refElement","isContentEditable","text","innerText","removeTextFromElements","query","list","index","_element","textToReplace","supportsInnerTextScriptAndStyleRemoval","textContent","isIE","supportsLabelPropertyResult","undefined","HTMLInputElement","prototype","supportsElementClosestResult","HTMLElement"],"sources":["../../../../../rum/src/domain/rumEventsCollection/actions/getActionNameFromElement.js"],"sourcesContent":["import { safeTruncate, isIE, find, map, filter } from '@cloudcare/browser-core'\n\nexport var DEFAULT_PROGRAMMATIC_ACTION_NAME_ATTRIBUTE =\n 'data-guance-action-name'\n\nexport function getActionNameFromElement(element, userProgrammaticAttribute) {\n // Proceed to get the action name in two steps:\n // * first, get the name programmatically, explicitly defined by the user.\n // * then, use strategies that are known to return good results. Those strategies will be used on\n // the element and a few parents, but it's likely that they won't succeed at all.\n // * if no name is found this way, use strategies returning less accurate names as a fallback.\n // Those are much likely to succeed.\n return (\n getActionNameFromElementProgrammatically(\n element,\n DEFAULT_PROGRAMMATIC_ACTION_NAME_ATTRIBUTE\n ) ||\n (userProgrammaticAttribute &&\n getActionNameFromElementProgrammatically(\n element,\n userProgrammaticAttribute\n )) ||\n getActionNameFromElementForStrategies(\n element,\n userProgrammaticAttribute,\n priorityStrategies\n ) ||\n getActionNameFromElementForStrategies(\n element,\n userProgrammaticAttribute,\n fallbackStrategies\n ) ||\n ''\n )\n}\n\nfunction getActionNameFromElementProgrammatically(\n targetElement,\n programmaticAttribute\n) {\n var elementWithAttribute\n // We don't use getActionNameFromElementForStrategies here, because we want to consider all parents,\n // without limit. It is up to the user to declare a relevant naming strategy.\n // If available, use element.closest() to match get the attribute from the element or any of its\n // parent. Else fallback to a more traditional implementation.\n if (supportsElementClosest()) {\n elementWithAttribute = targetElement.closest(\n '[' + programmaticAttribute + ']'\n )\n } else {\n var element = targetElement\n while (element) {\n if (element.hasAttribute(programmaticAttribute)) {\n elementWithAttribute = element\n break\n }\n element = element.parentElement\n }\n }\n\n if (!elementWithAttribute) {\n return\n }\n var name = elementWithAttribute.getAttribute(programmaticAttribute)\n return truncate(normalizeWhitespace(name.trim()))\n}\n\nvar priorityStrategies = [\n // associated LABEL text\n function (element, userProgrammaticAttribute) {\n // IE does not support element.labels, so we fallback to a CSS selector based on the element id\n // instead\n if (supportsLabelProperty()) {\n if ('labels' in element && element.labels && element.labels.length > 0) {\n return getTextualContent(element.labels[0], userProgrammaticAttribute)\n }\n } else if (element.id) {\n var label =\n element.ownerDocument &&\n find(element.ownerDocument.querySelectorAll('label'), function (label) {\n return label.htmlFor === element.id\n })\n return label && getTextualContent(label, userProgrammaticAttribute)\n }\n },\n // INPUT button (and associated) value\n function (element) {\n if (element.nodeName === 'INPUT') {\n var input = element\n var type = input.getAttribute('type')\n if (type === 'button' || type === 'submit' || type === 'reset') {\n return input.value\n }\n }\n },\n // BUTTON, LABEL or button-like element text\n function (element, userProgrammaticAttribute) {\n if (\n element.nodeName === 'BUTTON' ||\n element.nodeName === 'LABEL' ||\n element.getAttribute('role') === 'button'\n ) {\n return getTextualContent(element, userProgrammaticAttribute)\n }\n },\n function (element) {\n return element.getAttribute('aria-label')\n },\n // associated element text designated by the aria-labelledby attribute\n function (element, userProgrammaticAttribute) {\n var labelledByAttribute = element.getAttribute('aria-labelledby')\n if (labelledByAttribute) {\n labelledByAttribute = labelledByAttribute.split(/\\s+/)\n labelledByAttribute = map(labelledByAttribute, function (id) {\n return getElementById(element, id)\n })\n labelledByAttribute = filter(labelledByAttribute, function (label) {\n return Boolean(label)\n })\n labelledByAttribute = map(labelledByAttribute, function (ele) {\n return getTextualContent(ele, userProgrammaticAttribute)\n })\n return labelledByAttribute.join(' ')\n }\n },\n function (element) {\n return element.getAttribute('alt')\n },\n function (element) {\n return element.getAttribute('name')\n },\n function (element) {\n return element.getAttribute('title')\n },\n function (element) {\n return element.getAttribute('placeholder')\n },\n // SELECT first OPTION text\n function (element, userProgrammaticAttribute) {\n if ('options' in element && element.options.length > 0) {\n return getTextualContent(element.options[0], userProgrammaticAttribute)\n }\n }\n]\n\nvar fallbackStrategies = [\n function (element, userProgrammaticAttribute) {\n return getTextualContent(element, userProgrammaticAttribute)\n }\n]\n\n/**\n * Iterates over the target element and its parent, using the strategies list to get an action name.\n * Each strategies are applied on each element, stopping as soon as a non-empty value is returned.\n */\nvar MAX_PARENTS_TO_CONSIDER = 10\nfunction getActionNameFromElementForStrategies(\n targetElement,\n userProgrammaticAttribute,\n strategies\n) {\n var element = targetElement\n var recursionCounter = 0\n while (\n recursionCounter <= MAX_PARENTS_TO_CONSIDER &&\n element &&\n element.nodeName !== 'BODY' &&\n element.nodeName !== 'HTML' &&\n element.nodeName !== 'HEAD'\n ) {\n for (var i = 0; i < strategies.length; i++) {\n var strategy = strategies[i]\n var name = strategy(element, userProgrammaticAttribute)\n if (typeof name === 'string') {\n var trimmedName = name.trim()\n if (trimmedName) {\n return truncate(normalizeWhitespace(trimmedName))\n }\n }\n }\n // Consider a FORM as a contextual limit to get the action name. This is experimental and may\n // be reconsidered in the future.\n if (element.nodeName === 'FORM') {\n break\n }\n element = element.parentElement\n recursionCounter += 1\n }\n}\n\nfunction normalizeWhitespace(s) {\n return s.replace(/\\s+/g, ' ')\n}\n\nfunction truncate(s) {\n return s.length > 100 ? safeTruncate(s, 100) + ' [...]' : s\n}\n\nfunction getElementById(refElement, id) {\n // Use the element ownerDocument here, because tests are executed in an iframe, so\n // document.getElementById won't work.\n return refElement.ownerDocument\n ? refElement.ownerDocument.getElementById(id)\n : null\n}\n\nfunction getTextualContent(element, userProgrammaticAttribute) {\n if (element.isContentEditable) {\n return\n }\n\n if ('innerText' in element) {\n var text = element.innerText\n\n var removeTextFromElements = function (query) {\n var list = element.querySelectorAll(query)\n for (var index = 0; index < list.length; index += 1) {\n var _element = list[index]\n if ('innerText' in _element) {\n var textToReplace = _element.innerText\n if (textToReplace && textToReplace.trim().length > 0) {\n text = text.replace(textToReplace, '')\n }\n }\n }\n }\n\n if (!supportsInnerTextScriptAndStyleRemoval()) {\n // remove the inner text of SCRIPT and STYLES from the result. This is a bit dirty, but should\n // be relatively fast and work in most cases.\n removeTextFromElements('script, style')\n }\n\n // remove the text of elements with programmatic attribute value\n removeTextFromElements(\n '[' + DEFAULT_PROGRAMMATIC_ACTION_NAME_ATTRIBUTE + ']'\n )\n\n if (userProgrammaticAttribute) {\n removeTextFromElements('[' + userProgrammaticAttribute + ']')\n }\n\n return text\n }\n\n return element.textContent\n}\n\n/**\n * Returns true if element.innerText excludes the text from inline SCRIPT and STYLE element. This\n * should be the case everywhere except on Internet Explorer 10 and 11 (see [1])\n *\n * The innerText property relies on what is actually rendered to compute its output, so to check if\n * it actually excludes SCRIPT and STYLE content, a solution would be to create a style element, set\n * its content to '*', inject it in the document body, and check if the style element innerText\n * property returns '*'. Using a new `document` instance won't work as it is not rendered.\n *\n * This solution requires specific CSP rules (see [2]) to be set by the customer. We want to avoid\n * this, so instead we rely on browser detection. In case of false negative, the impact should be\n * low, since we rely on this result to remove the SCRIPT and STYLE innerText (which will be empty)\n * from a parent element innerText.\n *\n * [1]: https://web.archive.org/web/20210602165716/http://perfectionkills.com/the-poor-misunderstood-innerText/#diff-with-textContent\n */\nfunction supportsInnerTextScriptAndStyleRemoval() {\n return !isIE()\n}\n\n/**\n * Returns true if the browser supports the element.labels property. This should be the case\n * everywhere except on Internet Explorer.\n * Note: The result is computed lazily, because we don't want any DOM access when the SDK is\n * evaluated.\n */\nvar supportsLabelPropertyResult\nfunction supportsLabelProperty() {\n if (supportsLabelPropertyResult === undefined) {\n supportsLabelPropertyResult = 'labels' in HTMLInputElement.prototype\n }\n return supportsLabelPropertyResult\n}\n\n/**\n * Returns true if the browser supports the element.closest method. This should be the case\n * everywhere except on Internet Explorer.\n * Note: The result is computed lazily, because we don't want any DOM access when the SDK is\n * evaluated.\n */\nvar supportsElementClosestResult\nfunction supportsElementClosest() {\n if (supportsElementClosestResult === undefined) {\n supportsElementClosestResult = 'closest' in HTMLElement.prototype\n }\n return supportsElementClosestResult\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.STABLE_ATTRIBUTES = void 0;
|
|
7
|
+
exports.getSelectorFromElement = getSelectorFromElement;
|
|
8
|
+
exports.supportScopeSelector = supportScopeSelector;
|
|
9
|
+
var _browserCore = require("@cloudcare/browser-core");
|
|
10
|
+
var _getActionNameFromElement = require("./getActionNameFromElement");
|
|
11
|
+
/**
|
|
12
|
+
* Stable attributes are attributes that are commonly used to identify parts of a UI (ex:
|
|
13
|
+
* component). Those attribute values should not be generated randomly (hardcoded most of the time)
|
|
14
|
+
* and stay the same across deploys. They are not necessarily unique across the document.
|
|
15
|
+
*/
|
|
16
|
+
var STABLE_ATTRIBUTES = exports.STABLE_ATTRIBUTES = [_getActionNameFromElement.DEFAULT_PROGRAMMATIC_ACTION_NAME_ATTRIBUTE,
|
|
17
|
+
// Common test attributes (list provided by google recorder)
|
|
18
|
+
'data-testid', 'data-test', 'data-qa', 'data-cy', 'data-test-id', 'data-qa-id', 'data-testing',
|
|
19
|
+
// FullStory decorator attributes:
|
|
20
|
+
'data-component', 'data-element', 'data-source-file'];
|
|
21
|
+
// Selectors to use if they target a single element on the whole document. Those selectors are
|
|
22
|
+
// considered as "stable" and uniquely identify an element regardless of the page state. If we find
|
|
23
|
+
// one, we should consider the selector "complete" and stop iterating over ancestors.
|
|
24
|
+
var GLOBALLY_UNIQUE_SELECTOR_GETTERS = [getStableAttributeSelector, getIDSelector];
|
|
25
|
+
|
|
26
|
+
// Selectors to use if they target a single element among an element descendants. Those selectors
|
|
27
|
+
// are more brittle than "globally unique" selectors and should be combined with ancestor selectors
|
|
28
|
+
// to improve specificity.
|
|
29
|
+
var UNIQUE_AMONG_CHILDREN_SELECTOR_GETTERS = [getStableAttributeSelector, getClassSelector, getTagNameSelector];
|
|
30
|
+
function getSelectorFromElement(targetElement, actionNameAttribute) {
|
|
31
|
+
if (!isConnected(targetElement)) {
|
|
32
|
+
// We cannot compute a selector for a detached element, as we don't have access to all of its
|
|
33
|
+
// parents, and we cannot determine if it's unique in the document.
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
var targetElementSelector;
|
|
37
|
+
var currentElement = targetElement;
|
|
38
|
+
while (currentElement && currentElement.nodeName !== 'HTML') {
|
|
39
|
+
var globallyUniqueSelector = findSelector(currentElement, GLOBALLY_UNIQUE_SELECTOR_GETTERS, isSelectorUniqueGlobally, actionNameAttribute, targetElementSelector);
|
|
40
|
+
if (globallyUniqueSelector) {
|
|
41
|
+
return globallyUniqueSelector;
|
|
42
|
+
}
|
|
43
|
+
var uniqueSelectorAmongChildren = findSelector(currentElement, UNIQUE_AMONG_CHILDREN_SELECTOR_GETTERS, isSelectorUniqueAmongSiblings, actionNameAttribute, targetElementSelector);
|
|
44
|
+
targetElementSelector = uniqueSelectorAmongChildren || combineSelector(getPositionSelector(currentElement), targetElementSelector);
|
|
45
|
+
currentElement = currentElement.parentElement;
|
|
46
|
+
}
|
|
47
|
+
// while (element && element.nodeName !== 'HTML') {
|
|
48
|
+
// var globallyUniqueSelector = findSelector(
|
|
49
|
+
// element,
|
|
50
|
+
// GLOBALLY_UNIQUE_SELECTOR_GETTERS,
|
|
51
|
+
// isSelectorUniqueGlobally,
|
|
52
|
+
// actionNameAttribute,
|
|
53
|
+
// targetElementSelector
|
|
54
|
+
// )
|
|
55
|
+
// if (globallyUniqueSelector) {
|
|
56
|
+
// return globallyUniqueSelector
|
|
57
|
+
// }
|
|
58
|
+
|
|
59
|
+
// var uniqueSelectorAmongChildren = findSelector(
|
|
60
|
+
// element,
|
|
61
|
+
// UNIQUE_AMONG_CHILDREN_SELECTOR_GETTERS,
|
|
62
|
+
// isSelectorUniqueAmongSiblings,
|
|
63
|
+
// actionNameAttribute,
|
|
64
|
+
// targetElementSelector
|
|
65
|
+
// )
|
|
66
|
+
// targetElementSelector =
|
|
67
|
+
// uniqueSelectorAmongChildren ||
|
|
68
|
+
// combineSelector(getPositionSelector(element), targetElementSelector)
|
|
69
|
+
|
|
70
|
+
// element = element.parentElement
|
|
71
|
+
// }
|
|
72
|
+
|
|
73
|
+
return targetElementSelector;
|
|
74
|
+
}
|
|
75
|
+
function isGeneratedValue(value) {
|
|
76
|
+
// To compute the "URL path group", the backend replaces every URL path parts as a question mark
|
|
77
|
+
// if it thinks the part is an identifier. The condition it uses is to checks whether a digit is
|
|
78
|
+
// present.
|
|
79
|
+
//
|
|
80
|
+
// Here, we use the same strategy: if a the value contains a digit, we consider it generated. This
|
|
81
|
+
// strategy might be a bit naive and fail in some cases, but there are many fallbacks to generate
|
|
82
|
+
// CSS selectors so it should be fine most of the time. We might want to allow customers to
|
|
83
|
+
// provide their own `isGeneratedValue` at some point.
|
|
84
|
+
return /[0-9]/.test(value);
|
|
85
|
+
}
|
|
86
|
+
function getIDSelector(element) {
|
|
87
|
+
if (element.id && !isGeneratedValue(element.id)) {
|
|
88
|
+
return '#' + (0, _browserCore.cssEscape)(element.id);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function getClassSelector(element) {
|
|
92
|
+
if (element.tagName === 'BODY') {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (element.classList.length > 0) {
|
|
96
|
+
for (var i = 0; i < element.classList.length; i += 1) {
|
|
97
|
+
var className = element.classList[i];
|
|
98
|
+
if (isGeneratedValue(className)) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
return (0, _browserCore.cssEscape)(element.tagName) + '.' + (0, _browserCore.cssEscape)(className);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function getTagNameSelector(element) {
|
|
106
|
+
return (0, _browserCore.cssEscape)(element.tagName);
|
|
107
|
+
}
|
|
108
|
+
function getStableAttributeSelector(element, actionNameAttribute) {
|
|
109
|
+
if (actionNameAttribute) {
|
|
110
|
+
var selector = getAttributeSelector(actionNameAttribute);
|
|
111
|
+
if (selector) {
|
|
112
|
+
return selector;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
for (var i = 0; i < STABLE_ATTRIBUTES.length; i++) {
|
|
116
|
+
var attributeName = STABLE_ATTRIBUTES[i];
|
|
117
|
+
var selector = getAttributeSelector(attributeName);
|
|
118
|
+
if (selector) {
|
|
119
|
+
return selector;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function getAttributeSelector(attributeName) {
|
|
123
|
+
if (element.hasAttribute(attributeName)) {
|
|
124
|
+
return (0, _browserCore.cssEscape)(element.tagName) + '[' + attributeName + '="' + (0, _browserCore.cssEscape)(element.getAttribute(attributeName)) + '"]';
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function getPositionSelector(element) {
|
|
129
|
+
var sibling = element.parentElement && element.parentElement.firstElementChild;
|
|
130
|
+
var elementIndex = 1;
|
|
131
|
+
while (sibling && sibling !== element) {
|
|
132
|
+
if (sibling.tagName === element.tagName) {
|
|
133
|
+
elementIndex += 1;
|
|
134
|
+
}
|
|
135
|
+
sibling = sibling.nextElementSibling;
|
|
136
|
+
}
|
|
137
|
+
var tagName = (0, _browserCore.cssEscape)(element.tagName);
|
|
138
|
+
if (/^::/.test(tagName)) {
|
|
139
|
+
return tagName;
|
|
140
|
+
}
|
|
141
|
+
return tagName + ':nth-of-type(' + elementIndex + ')';
|
|
142
|
+
}
|
|
143
|
+
function findSelector(element, selectorGetters, predicate, actionNameAttribute, childSelector) {
|
|
144
|
+
for (var i = 0; i < selectorGetters.length; i++) {
|
|
145
|
+
var selectorGetter = selectorGetters[i];
|
|
146
|
+
var elementSelector = selectorGetter(element, actionNameAttribute);
|
|
147
|
+
if (!elementSelector) {
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
if (predicate(element, elementSelector, childSelector)) {
|
|
151
|
+
return combineSelector(elementSelector, childSelector);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function isSelectorUniqueGlobally(element, elementSelector, childSelector) {
|
|
156
|
+
return element.ownerDocument.querySelectorAll(combineSelector(elementSelector, childSelector)).length === 1;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Check whether the selector is unique among the element siblings. In other words, it returns true
|
|
160
|
+
* if "ELEMENT_PARENT > SELECTOR" returns a single element.
|
|
161
|
+
*
|
|
162
|
+
* The result will be less accurate on browsers that don't support :scope (i. e. IE): it will check
|
|
163
|
+
* for any element matching the selector contained in the parent (in other words,
|
|
164
|
+
* "ELEMENT_PARENT SELECTOR" returns a single element), regardless of whether the selector is a
|
|
165
|
+
* direct descendent of the element parent. This should not impact results too much: if it
|
|
166
|
+
* inaccurately returns false, we'll just fall back to another strategy.
|
|
167
|
+
*/
|
|
168
|
+
function isSelectorUniqueAmongSiblings(currentElement, currentElementSelector, childSelector) {
|
|
169
|
+
var isSiblingMatching;
|
|
170
|
+
if (childSelector === undefined) {
|
|
171
|
+
// If the child selector is undefined (meaning `currentElement` is the target element, not one
|
|
172
|
+
// of its ancestor), we need to use `matches` to check if the sibling is matching the selector,
|
|
173
|
+
// as `querySelector` only returns a descendant of the element.
|
|
174
|
+
isSiblingMatching = function isSiblingMatching(sibling) {
|
|
175
|
+
return sibling.matches(currentElementSelector);
|
|
176
|
+
};
|
|
177
|
+
} else {
|
|
178
|
+
var scopedSelector = supportScopeSelector() ? combineSelector("".concat(currentElementSelector, ":scope"), childSelector) : combineSelector(currentElementSelector, childSelector);
|
|
179
|
+
isSiblingMatching = function isSiblingMatching(sibling) {
|
|
180
|
+
return sibling.querySelector(scopedSelector) !== null;
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
var parent = currentElement.parentElement;
|
|
184
|
+
var sibling = parent.firstElementChild;
|
|
185
|
+
while (sibling) {
|
|
186
|
+
if (sibling !== currentElement && isSiblingMatching(sibling)) {
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
sibling = sibling.nextElementSibling;
|
|
190
|
+
}
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
function combineSelector(parent, child) {
|
|
194
|
+
return child ? parent + '>' + child : parent;
|
|
195
|
+
}
|
|
196
|
+
var supportScopeSelectorCache;
|
|
197
|
+
function supportScopeSelector() {
|
|
198
|
+
if (supportScopeSelectorCache === undefined) {
|
|
199
|
+
try {
|
|
200
|
+
document.querySelector(':scope');
|
|
201
|
+
supportScopeSelectorCache = true;
|
|
202
|
+
} catch (_unused) {
|
|
203
|
+
supportScopeSelectorCache = false;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return supportScopeSelectorCache;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Polyfill-utility for the `isConnected` property not supported in IE11
|
|
211
|
+
*/
|
|
212
|
+
function isConnected(element) {
|
|
213
|
+
if ('isConnected' in element
|
|
214
|
+
// cast is to make sure `element` is not inferred as `never` after the check
|
|
215
|
+
) {
|
|
216
|
+
return element.isConnected;
|
|
217
|
+
}
|
|
218
|
+
return element.ownerDocument.documentElement.contains(element);
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=getSelectorsFromElement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getSelectorsFromElement.js","names":["_browserCore","require","_getActionNameFromElement","STABLE_ATTRIBUTES","exports","DEFAULT_PROGRAMMATIC_ACTION_NAME_ATTRIBUTE","GLOBALLY_UNIQUE_SELECTOR_GETTERS","getStableAttributeSelector","getIDSelector","UNIQUE_AMONG_CHILDREN_SELECTOR_GETTERS","getClassSelector","getTagNameSelector","getSelectorFromElement","targetElement","actionNameAttribute","isConnected","targetElementSelector","currentElement","nodeName","globallyUniqueSelector","findSelector","isSelectorUniqueGlobally","uniqueSelectorAmongChildren","isSelectorUniqueAmongSiblings","combineSelector","getPositionSelector","parentElement","isGeneratedValue","value","test","element","id","cssEscape","tagName","classList","length","i","className","selector","getAttributeSelector","attributeName","hasAttribute","getAttribute","sibling","firstElementChild","elementIndex","nextElementSibling","selectorGetters","predicate","childSelector","selectorGetter","elementSelector","ownerDocument","querySelectorAll","currentElementSelector","isSiblingMatching","undefined","matches","scopedSelector","supportScopeSelector","concat","querySelector","parent","child","supportScopeSelectorCache","document","_unused","documentElement","contains"],"sources":["../../../../../rum/src/domain/rumEventsCollection/actions/getSelectorsFromElement.js"],"sourcesContent":["import { cssEscape } from '@cloudcare/browser-core'\nimport { DEFAULT_PROGRAMMATIC_ACTION_NAME_ATTRIBUTE } from './getActionNameFromElement'\n/**\n * Stable attributes are attributes that are commonly used to identify parts of a UI (ex:\n * component). Those attribute values should not be generated randomly (hardcoded most of the time)\n * and stay the same across deploys. They are not necessarily unique across the document.\n */\nexport var STABLE_ATTRIBUTES = [\n DEFAULT_PROGRAMMATIC_ACTION_NAME_ATTRIBUTE,\n // Common test attributes (list provided by google recorder)\n 'data-testid',\n 'data-test',\n 'data-qa',\n 'data-cy',\n 'data-test-id',\n 'data-qa-id',\n 'data-testing',\n // FullStory decorator attributes:\n 'data-component',\n 'data-element',\n 'data-source-file'\n]\n// Selectors to use if they target a single element on the whole document. Those selectors are\n// considered as \"stable\" and uniquely identify an element regardless of the page state. If we find\n// one, we should consider the selector \"complete\" and stop iterating over ancestors.\nvar GLOBALLY_UNIQUE_SELECTOR_GETTERS = [\n getStableAttributeSelector,\n getIDSelector\n]\n\n// Selectors to use if they target a single element among an element descendants. Those selectors\n// are more brittle than \"globally unique\" selectors and should be combined with ancestor selectors\n// to improve specificity.\nvar UNIQUE_AMONG_CHILDREN_SELECTOR_GETTERS = [\n getStableAttributeSelector,\n getClassSelector,\n getTagNameSelector\n]\n\nexport function getSelectorFromElement(targetElement, actionNameAttribute) {\n if (!isConnected(targetElement)) {\n // We cannot compute a selector for a detached element, as we don't have access to all of its\n // parents, and we cannot determine if it's unique in the document.\n return\n }\n let targetElementSelector\n let currentElement = targetElement\n while (currentElement && currentElement.nodeName !== 'HTML') {\n const globallyUniqueSelector = findSelector(\n currentElement,\n GLOBALLY_UNIQUE_SELECTOR_GETTERS,\n isSelectorUniqueGlobally,\n actionNameAttribute,\n targetElementSelector\n )\n if (globallyUniqueSelector) {\n return globallyUniqueSelector\n }\n const uniqueSelectorAmongChildren = findSelector(\n currentElement,\n UNIQUE_AMONG_CHILDREN_SELECTOR_GETTERS,\n isSelectorUniqueAmongSiblings,\n actionNameAttribute,\n targetElementSelector\n )\n targetElementSelector =\n uniqueSelectorAmongChildren ||\n combineSelector(\n getPositionSelector(currentElement),\n targetElementSelector\n )\n\n currentElement = currentElement.parentElement\n }\n // while (element && element.nodeName !== 'HTML') {\n // var globallyUniqueSelector = findSelector(\n // element,\n // GLOBALLY_UNIQUE_SELECTOR_GETTERS,\n // isSelectorUniqueGlobally,\n // actionNameAttribute,\n // targetElementSelector\n // )\n // if (globallyUniqueSelector) {\n // return globallyUniqueSelector\n // }\n\n // var uniqueSelectorAmongChildren = findSelector(\n // element,\n // UNIQUE_AMONG_CHILDREN_SELECTOR_GETTERS,\n // isSelectorUniqueAmongSiblings,\n // actionNameAttribute,\n // targetElementSelector\n // )\n // targetElementSelector =\n // uniqueSelectorAmongChildren ||\n // combineSelector(getPositionSelector(element), targetElementSelector)\n\n // element = element.parentElement\n // }\n\n return targetElementSelector\n}\nfunction isGeneratedValue(value) {\n // To compute the \"URL path group\", the backend replaces every URL path parts as a question mark\n // if it thinks the part is an identifier. The condition it uses is to checks whether a digit is\n // present.\n //\n // Here, we use the same strategy: if a the value contains a digit, we consider it generated. This\n // strategy might be a bit naive and fail in some cases, but there are many fallbacks to generate\n // CSS selectors so it should be fine most of the time. We might want to allow customers to\n // provide their own `isGeneratedValue` at some point.\n return /[0-9]/.test(value)\n}\nfunction getIDSelector(element) {\n if (element.id && !isGeneratedValue(element.id)) {\n return '#' + cssEscape(element.id)\n }\n}\n\nfunction getClassSelector(element) {\n if (element.tagName === 'BODY') {\n return\n }\n if (element.classList.length > 0) {\n for (var i = 0; i < element.classList.length; i += 1) {\n var className = element.classList[i]\n if (isGeneratedValue(className)) {\n continue\n }\n\n return cssEscape(element.tagName) + '.' + cssEscape(className)\n }\n }\n}\nfunction getTagNameSelector(element) {\n return cssEscape(element.tagName)\n}\nfunction getStableAttributeSelector(element, actionNameAttribute) {\n if (actionNameAttribute) {\n var selector = getAttributeSelector(actionNameAttribute)\n if (selector) {\n return selector\n }\n }\n\n for (var i = 0; i < STABLE_ATTRIBUTES.length; i++) {\n var attributeName = STABLE_ATTRIBUTES[i]\n var selector = getAttributeSelector(attributeName)\n if (selector) {\n return selector\n }\n }\n\n function getAttributeSelector(attributeName) {\n if (element.hasAttribute(attributeName)) {\n return (\n cssEscape(element.tagName) +\n '[' +\n attributeName +\n '=\"' +\n cssEscape(element.getAttribute(attributeName)) +\n '\"]'\n )\n }\n }\n}\n\nfunction getPositionSelector(element) {\n var sibling = element.parentElement && element.parentElement.firstElementChild\n var elementIndex = 1\n\n while (sibling && sibling !== element) {\n if (sibling.tagName === element.tagName) {\n elementIndex += 1\n }\n sibling = sibling.nextElementSibling\n }\n var tagName = cssEscape(element.tagName)\n if (/^::/.test(tagName)) {\n return tagName\n }\n return tagName + ':nth-of-type(' + elementIndex + ')'\n}\n\nfunction findSelector(\n element,\n selectorGetters,\n predicate,\n actionNameAttribute,\n childSelector\n) {\n for (var i = 0; i < selectorGetters.length; i++) {\n var selectorGetter = selectorGetters[i]\n var elementSelector = selectorGetter(element, actionNameAttribute)\n if (!elementSelector) {\n continue\n }\n if (predicate(element, elementSelector, childSelector)) {\n return combineSelector(elementSelector, childSelector)\n }\n }\n}\n\nfunction isSelectorUniqueGlobally(element, elementSelector, childSelector) {\n return (\n element.ownerDocument.querySelectorAll(\n combineSelector(elementSelector, childSelector)\n ).length === 1\n )\n}\n/**\n * Check whether the selector is unique among the element siblings. In other words, it returns true\n * if \"ELEMENT_PARENT > SELECTOR\" returns a single element.\n *\n * The result will be less accurate on browsers that don't support :scope (i. e. IE): it will check\n * for any element matching the selector contained in the parent (in other words,\n * \"ELEMENT_PARENT SELECTOR\" returns a single element), regardless of whether the selector is a\n * direct descendent of the element parent. This should not impact results too much: if it\n * inaccurately returns false, we'll just fall back to another strategy.\n */\nfunction isSelectorUniqueAmongSiblings(\n currentElement,\n currentElementSelector,\n childSelector\n) {\n let isSiblingMatching\n\n if (childSelector === undefined) {\n // If the child selector is undefined (meaning `currentElement` is the target element, not one\n // of its ancestor), we need to use `matches` to check if the sibling is matching the selector,\n // as `querySelector` only returns a descendant of the element.\n isSiblingMatching = (sibling) => sibling.matches(currentElementSelector)\n } else {\n const scopedSelector = supportScopeSelector()\n ? combineSelector(`${currentElementSelector}:scope`, childSelector)\n : combineSelector(currentElementSelector, childSelector)\n isSiblingMatching = (sibling) =>\n sibling.querySelector(scopedSelector) !== null\n }\n\n const parent = currentElement.parentElement\n let sibling = parent.firstElementChild\n while (sibling) {\n if (sibling !== currentElement && isSiblingMatching(sibling)) {\n return false\n }\n sibling = sibling.nextElementSibling\n }\n\n return true\n}\nfunction combineSelector(parent, child) {\n return child ? parent + '>' + child : parent\n}\nvar supportScopeSelectorCache\nexport function supportScopeSelector() {\n if (supportScopeSelectorCache === undefined) {\n try {\n document.querySelector(':scope')\n supportScopeSelectorCache = true\n } catch {\n supportScopeSelectorCache = false\n }\n }\n return supportScopeSelectorCache\n}\n\n/**\n * Polyfill-utility for the `isConnected` property not supported in IE11\n */\nfunction isConnected(element) {\n if (\n 'isConnected' in element\n // cast is to make sure `element` is not inferred as `never` after the check\n ) {\n return element.isConnected\n }\n return element.ownerDocument.documentElement.contains(element)\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.CLICK_ACTION_MAX_DURATION = void 0;
|
|
7
|
+
exports.getInteractionSelector = getInteractionSelector;
|
|
8
|
+
exports.interactionSelectorCache = void 0;
|
|
9
|
+
exports.updateInteractionSelector = updateInteractionSelector;
|
|
10
|
+
var _browserCore = require("@cloudcare/browser-core");
|
|
11
|
+
// Maximum duration for click actions
|
|
12
|
+
var CLICK_ACTION_MAX_DURATION = exports.CLICK_ACTION_MAX_DURATION = 10 * _browserCore.ONE_SECOND;
|
|
13
|
+
var interactionSelectorCache = exports.interactionSelectorCache = new Map();
|
|
14
|
+
function getInteractionSelector(relativeTimestamp) {
|
|
15
|
+
var selector = interactionSelectorCache.get(relativeTimestamp);
|
|
16
|
+
interactionSelectorCache["delete"](relativeTimestamp);
|
|
17
|
+
return selector;
|
|
18
|
+
}
|
|
19
|
+
function updateInteractionSelector(relativeTimestamp, selector) {
|
|
20
|
+
var now = (0, _browserCore.relativeNow)();
|
|
21
|
+
interactionSelectorCache.set(relativeTimestamp, selector);
|
|
22
|
+
interactionSelectorCache.forEach(function (_, relativeTimestamp) {
|
|
23
|
+
if ((0, _browserCore.elapsed)(relativeTimestamp, now) > CLICK_ACTION_MAX_DURATION) {
|
|
24
|
+
interactionSelectorCache["delete"](relativeTimestamp);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=interactionSelectorCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactionSelectorCache.js","names":["_browserCore","require","CLICK_ACTION_MAX_DURATION","exports","ONE_SECOND","interactionSelectorCache","Map","getInteractionSelector","relativeTimestamp","selector","get","updateInteractionSelector","now","relativeNow","set","forEach","_","elapsed"],"sources":["../../../../../rum/src/domain/rumEventsCollection/actions/interactionSelectorCache.js"],"sourcesContent":["import { elapsed, ONE_SECOND, relativeNow } from '@cloudcare/browser-core'\n\n// Maximum duration for click actions\nexport const CLICK_ACTION_MAX_DURATION = 10 * ONE_SECOND\nexport const interactionSelectorCache = new Map()\n\nexport function getInteractionSelector(relativeTimestamp) {\n const selector = interactionSelectorCache.get(relativeTimestamp)\n interactionSelectorCache.delete(relativeTimestamp)\n return selector\n}\n\nexport function updateInteractionSelector(relativeTimestamp, selector) {\n var now = relativeNow()\n interactionSelectorCache.set(relativeTimestamp, selector)\n interactionSelectorCache.forEach(function (_, relativeTimestamp) {\n if (elapsed(relativeTimestamp, now) > CLICK_ACTION_MAX_DURATION) {\n interactionSelectorCache.delete(relativeTimestamp)\n }\n })\n}\n"],"mappings":";;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAEA;AACO,IAAMC,yBAAyB,GAAAC,OAAA,CAAAD,yBAAA,GAAG,EAAE,GAAGE,uBAAU;AACjD,IAAMC,wBAAwB,GAAAF,OAAA,CAAAE,wBAAA,GAAG,IAAIC,GAAG,CAAC,CAAC;AAE1C,SAASC,sBAAsBA,CAACC,iBAAiB,EAAE;EACxD,IAAMC,QAAQ,GAAGJ,wBAAwB,CAACK,GAAG,CAACF,iBAAiB,CAAC;EAChEH,wBAAwB,UAAO,CAACG,iBAAiB,CAAC;EAClD,OAAOC,QAAQ;AACjB;AAEO,SAASE,yBAAyBA,CAACH,iBAAiB,EAAEC,QAAQ,EAAE;EACrE,IAAIG,GAAG,GAAG,IAAAC,wBAAW,EAAC,CAAC;EACvBR,wBAAwB,CAACS,GAAG,CAACN,iBAAiB,EAAEC,QAAQ,CAAC;EACzDJ,wBAAwB,CAACU,OAAO,CAAC,UAAUC,CAAC,EAAER,iBAAiB,EAAE;IAC/D,IAAI,IAAAS,oBAAO,EAACT,iBAAiB,EAAEI,GAAG,CAAC,GAAGV,yBAAyB,EAAE;MAC/DG,wBAAwB,UAAO,CAACG,iBAAiB,CAAC;IACpD;EACF,CAAC,CAAC;AACJ","ignoreList":[]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.listenActionEvents = listenActionEvents;
|
|
7
|
+
var _browserCore = require("@cloudcare/browser-core");
|
|
8
|
+
function listenActionEvents(events) {
|
|
9
|
+
var selectionEmptyAtPointerDown;
|
|
10
|
+
var userActivity = {
|
|
11
|
+
selection: false,
|
|
12
|
+
input: false,
|
|
13
|
+
scroll: false
|
|
14
|
+
};
|
|
15
|
+
var clickContext;
|
|
16
|
+
var listeners = [(0, _browserCore.addEventListener)(window, _browserCore.DOM_EVENT.POINTER_DOWN, function (event) {
|
|
17
|
+
if (isValidPointerEvent(event)) {
|
|
18
|
+
selectionEmptyAtPointerDown = isSelectionEmpty();
|
|
19
|
+
userActivity = {
|
|
20
|
+
selection: false,
|
|
21
|
+
input: false,
|
|
22
|
+
scroll: false
|
|
23
|
+
};
|
|
24
|
+
clickContext = events.onPointerDown(event);
|
|
25
|
+
}
|
|
26
|
+
}, {
|
|
27
|
+
capture: true
|
|
28
|
+
}), (0, _browserCore.addEventListener)(window, _browserCore.DOM_EVENT.SELECTION_CHANGE, function () {
|
|
29
|
+
if (!selectionEmptyAtPointerDown || !isSelectionEmpty()) {
|
|
30
|
+
userActivity.selection = true;
|
|
31
|
+
}
|
|
32
|
+
}, {
|
|
33
|
+
capture: true
|
|
34
|
+
}), (0, _browserCore.addEventListener)(window, _browserCore.DOM_EVENT.POINTER_UP, function (event) {
|
|
35
|
+
if (isValidPointerEvent(event) && clickContext) {
|
|
36
|
+
// Use a scoped variable to make sure the value is not changed by other clicks
|
|
37
|
+
var localUserActivity = userActivity;
|
|
38
|
+
events.onPointerUp(clickContext, event, function () {
|
|
39
|
+
return localUserActivity;
|
|
40
|
+
});
|
|
41
|
+
clickContext = undefined;
|
|
42
|
+
}
|
|
43
|
+
}, {
|
|
44
|
+
capture: true
|
|
45
|
+
}), (0, _browserCore.addEventListener)(window, _browserCore.DOM_EVENT.SCROLL, function () {
|
|
46
|
+
userActivity.scroll = true;
|
|
47
|
+
}, {
|
|
48
|
+
capture: true,
|
|
49
|
+
passive: true
|
|
50
|
+
}), (0, _browserCore.addEventListener)(window, _browserCore.DOM_EVENT.INPUT, function () {
|
|
51
|
+
userActivity.input = true;
|
|
52
|
+
}, {
|
|
53
|
+
capture: true
|
|
54
|
+
})];
|
|
55
|
+
return {
|
|
56
|
+
stop: function stop() {
|
|
57
|
+
(0, _browserCore.each)(listeners, function (listener) {
|
|
58
|
+
return listener.stop();
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function isSelectionEmpty() {
|
|
64
|
+
var selection = window.getSelection();
|
|
65
|
+
return !selection || selection.isCollapsed;
|
|
66
|
+
}
|
|
67
|
+
function isValidPointerEvent(event) {
|
|
68
|
+
return event.target instanceof Element &&
|
|
69
|
+
// Only consider 'primary' pointer events for now. Multi-touch support could be implemented in
|
|
70
|
+
// the future.
|
|
71
|
+
event.isPrimary !== false;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=listenActionEvents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listenActionEvents.js","names":["_browserCore","require","listenActionEvents","events","selectionEmptyAtPointerDown","userActivity","selection","input","scroll","clickContext","listeners","addEventListener","window","DOM_EVENT","POINTER_DOWN","event","isValidPointerEvent","isSelectionEmpty","onPointerDown","capture","SELECTION_CHANGE","POINTER_UP","localUserActivity","onPointerUp","undefined","SCROLL","passive","INPUT","stop","each","listener","getSelection","isCollapsed","target","Element","isPrimary"],"sources":["../../../../../rum/src/domain/rumEventsCollection/actions/listenActionEvents.js"],"sourcesContent":["import { addEventListener, DOM_EVENT, each } from '@cloudcare/browser-core'\n\nexport function listenActionEvents(events) {\n var selectionEmptyAtPointerDown\n var userActivity = {\n selection: false,\n input: false,\n scroll: false\n }\n var clickContext\n var listeners = [\n addEventListener(\n window,\n DOM_EVENT.POINTER_DOWN,\n function (event) {\n if (isValidPointerEvent(event)) {\n selectionEmptyAtPointerDown = isSelectionEmpty()\n userActivity = {\n selection: false,\n input: false,\n scroll: false\n }\n clickContext = events.onPointerDown(event)\n }\n },\n { capture: true }\n ),\n\n addEventListener(\n window,\n DOM_EVENT.SELECTION_CHANGE,\n function () {\n if (!selectionEmptyAtPointerDown || !isSelectionEmpty()) {\n userActivity.selection = true\n }\n },\n { capture: true }\n ),\n\n addEventListener(\n window,\n DOM_EVENT.POINTER_UP,\n function (event) {\n if (isValidPointerEvent(event) && clickContext) {\n // Use a scoped variable to make sure the value is not changed by other clicks\n var localUserActivity = userActivity\n events.onPointerUp(clickContext, event, function () {\n return localUserActivity\n })\n clickContext = undefined\n }\n },\n { capture: true }\n ),\n addEventListener(\n window,\n DOM_EVENT.SCROLL,\n function () {\n userActivity.scroll = true\n },\n { capture: true, passive: true }\n ),\n addEventListener(\n window,\n DOM_EVENT.INPUT,\n function () {\n userActivity.input = true\n },\n { capture: true }\n )\n ]\n\n return {\n stop: function () {\n each(listeners, function (listener) {\n return listener.stop()\n })\n }\n }\n}\n\nfunction isSelectionEmpty() {\n var selection = window.getSelection()\n return !selection || selection.isCollapsed\n}\nfunction isValidPointerEvent(event) {\n return (\n event.target instanceof Element &&\n // Only consider 'primary' pointer events for now. Multi-touch support could be implemented in\n // the future.\n event.isPrimary !== false\n )\n}\n"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAEO,SAASC,kBAAkBA,CAACC,MAAM,EAAE;EACzC,IAAIC,2BAA2B;EAC/B,IAAIC,YAAY,GAAG;IACjBC,SAAS,EAAE,KAAK;IAChBC,KAAK,EAAE,KAAK;IACZC,MAAM,EAAE;EACV,CAAC;EACD,IAAIC,YAAY;EAChB,IAAIC,SAAS,GAAG,CACd,IAAAC,6BAAgB,EACdC,MAAM,EACNC,sBAAS,CAACC,YAAY,EACtB,UAAUC,KAAK,EAAE;IACf,IAAIC,mBAAmB,CAACD,KAAK,CAAC,EAAE;MAC9BX,2BAA2B,GAAGa,gBAAgB,CAAC,CAAC;MAChDZ,YAAY,GAAG;QACbC,SAAS,EAAE,KAAK;QAChBC,KAAK,EAAE,KAAK;QACZC,MAAM,EAAE;MACV,CAAC;MACDC,YAAY,GAAGN,MAAM,CAACe,aAAa,CAACH,KAAK,CAAC;IAC5C;EACF,CAAC,EACD;IAAEI,OAAO,EAAE;EAAK,CAClB,CAAC,EAED,IAAAR,6BAAgB,EACdC,MAAM,EACNC,sBAAS,CAACO,gBAAgB,EAC1B,YAAY;IACV,IAAI,CAAChB,2BAA2B,IAAI,CAACa,gBAAgB,CAAC,CAAC,EAAE;MACvDZ,YAAY,CAACC,SAAS,GAAG,IAAI;IAC/B;EACF,CAAC,EACD;IAAEa,OAAO,EAAE;EAAK,CAClB,CAAC,EAED,IAAAR,6BAAgB,EACdC,MAAM,EACNC,sBAAS,CAACQ,UAAU,EACpB,UAAUN,KAAK,EAAE;IACf,IAAIC,mBAAmB,CAACD,KAAK,CAAC,IAAIN,YAAY,EAAE;MAC9C;MACA,IAAIa,iBAAiB,GAAGjB,YAAY;MACpCF,MAAM,CAACoB,WAAW,CAACd,YAAY,EAAEM,KAAK,EAAE,YAAY;QAClD,OAAOO,iBAAiB;MAC1B,CAAC,CAAC;MACFb,YAAY,GAAGe,SAAS;IAC1B;EACF,CAAC,EACD;IAAEL,OAAO,EAAE;EAAK,CAClB,CAAC,EACD,IAAAR,6BAAgB,EACdC,MAAM,EACNC,sBAAS,CAACY,MAAM,EAChB,YAAY;IACVpB,YAAY,CAACG,MAAM,GAAG,IAAI;EAC5B,CAAC,EACD;IAAEW,OAAO,EAAE,IAAI;IAAEO,OAAO,EAAE;EAAK,CACjC,CAAC,EACD,IAAAf,6BAAgB,EACdC,MAAM,EACNC,sBAAS,CAACc,KAAK,EACf,YAAY;IACVtB,YAAY,CAACE,KAAK,GAAG,IAAI;EAC3B,CAAC,EACD;IAAEY,OAAO,EAAE;EAAK,CAClB,CAAC,CACF;EAED,OAAO;IACLS,IAAI,EAAE,SAANA,IAAIA,CAAA,EAAc;MAChB,IAAAC,iBAAI,EAACnB,SAAS,EAAE,UAAUoB,QAAQ,EAAE;QAClC,OAAOA,QAAQ,CAACF,IAAI,CAAC,CAAC;MACxB,CAAC,CAAC;IACJ;EACF,CAAC;AACH;AAEA,SAASX,gBAAgBA,CAAA,EAAG;EAC1B,IAAIX,SAAS,GAAGM,MAAM,CAACmB,YAAY,CAAC,CAAC;EACrC,OAAO,CAACzB,SAAS,IAAIA,SAAS,CAAC0B,WAAW;AAC5C;AACA,SAAShB,mBAAmBA,CAACD,KAAK,EAAE;EAClC,OACEA,KAAK,CAACkB,MAAM,YAAYC,OAAO;EAC/B;EACA;EACAnB,KAAK,CAACoB,SAAS,KAAK,KAAK;AAE7B","ignoreList":[]}
|