@microsoft/applicationinsights-clickanalytics-js 2.7.1-nightly.202110-05 → 2.7.1-nightly.202110-14
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/browser/{ai.clck.2.7.1-nightly.202110-05.cjs.js → ai.clck.2.7.1-nightly.202110-14.cjs.js} +110 -109
- package/browser/ai.clck.2.7.1-nightly.202110-14.cjs.js.map +1 -0
- package/browser/ai.clck.2.7.1-nightly.202110-14.cjs.min.js +6 -0
- package/browser/ai.clck.2.7.1-nightly.202110-14.cjs.min.js.map +1 -0
- package/browser/{ai.clck.2.7.1-nightly.202110-05.gbl.js → ai.clck.2.7.1-nightly.202110-14.gbl.js} +110 -109
- package/browser/ai.clck.2.7.1-nightly.202110-14.gbl.js.map +1 -0
- package/browser/ai.clck.2.7.1-nightly.202110-14.gbl.min.js +6 -0
- package/browser/ai.clck.2.7.1-nightly.202110-14.gbl.min.js.map +1 -0
- package/browser/ai.clck.2.7.1-nightly.202110-14.integrity.json +66 -0
- package/browser/{ai.clck.2.7.1-nightly.202110-05.js → ai.clck.2.7.1-nightly.202110-14.js} +110 -109
- package/browser/ai.clck.2.7.1-nightly.202110-14.js.map +1 -0
- package/browser/ai.clck.2.7.1-nightly.202110-14.min.js +6 -0
- package/browser/ai.clck.2.7.1-nightly.202110-14.min.js.map +1 -0
- package/browser/ai.clck.2.cjs.js +109 -108
- package/browser/ai.clck.2.cjs.js.map +1 -1
- package/browser/ai.clck.2.cjs.min.js +2 -2
- package/browser/ai.clck.2.cjs.min.js.map +1 -1
- package/browser/ai.clck.2.gbl.js +109 -108
- package/browser/ai.clck.2.gbl.js.map +1 -1
- package/browser/ai.clck.2.gbl.min.js +2 -2
- package/browser/ai.clck.2.gbl.min.js.map +1 -1
- package/browser/ai.clck.2.js +109 -108
- package/browser/ai.clck.2.js.map +1 -1
- package/browser/ai.clck.2.min.js +2 -2
- package/browser/ai.clck.2.min.js.map +1 -1
- package/dist/applicationinsights-clickanalytics-js.d.ts +1 -1
- package/dist/applicationinsights-clickanalytics-js.js +109 -108
- package/dist/applicationinsights-clickanalytics-js.js.map +1 -1
- package/dist/applicationinsights-clickanalytics-js.min.js +2 -2
- package/dist/applicationinsights-clickanalytics-js.min.js.map +1 -1
- package/dist/applicationinsights-clickanalytics-js.rollup.d.ts +1 -1
- package/dist-esm/Behaviours.js +1 -1
- package/dist-esm/ClickAnalyticsPlugin.js +5 -5
- package/dist-esm/ClickAnalyticsPlugin.js.map +1 -1
- package/dist-esm/DataCollector.js +16 -16
- package/dist-esm/DataCollector.js.map +1 -1
- package/dist-esm/Enums.js +10 -10
- package/dist-esm/Enums.js.map +1 -1
- package/dist-esm/Interfaces/Datamodel.js +1 -1
- package/dist-esm/applicationinsights-clickanalytics-js.js +1 -1
- package/dist-esm/common/Utils.js +25 -25
- package/dist-esm/common/Utils.js.map +1 -1
- package/dist-esm/events/PageAction.js +24 -24
- package/dist-esm/events/PageAction.js.map +1 -1
- package/dist-esm/events/WebEvent.js +8 -8
- package/dist-esm/events/WebEvent.js.map +1 -1
- package/dist-esm/handlers/AutoCaptureHandler.js +8 -8
- package/dist-esm/handlers/AutoCaptureHandler.js.map +1 -1
- package/dist-esm/handlers/DomContentHandler.js +26 -26
- package/dist-esm/handlers/DomContentHandler.js.map +1 -1
- package/package.json +4 -4
- package/src/ClickAnalyticsPlugin.ts +5 -5
- package/src/DataCollector.ts +16 -16
- package/src/Enums.ts +9 -9
- package/src/common/Utils.ts +25 -25
- package/src/events/PageAction.ts +25 -25
- package/src/events/WebEvent.ts +9 -9
- package/src/handlers/AutoCaptureHandler.ts +9 -9
- package/src/handlers/DomContentHandler.ts +26 -26
- package/types/ClickAnalyticsPlugin.d.ts +2 -2
- package/types/DataCollector.d.ts +1 -1
- package/types/common/Utils.d.ts +2 -1
- package/types/events/PageAction.d.ts +2 -2
- package/types/events/WebEvent.d.ts +3 -3
- package/types/handlers/AutoCaptureHandler.d.ts +2 -2
- package/types/handlers/DomContentHandler.d.ts +1 -1
- package/browser/ai.clck.2.7.1-nightly.202110-05.cjs.js.map +0 -1
- package/browser/ai.clck.2.7.1-nightly.202110-05.cjs.min.js +0 -6
- package/browser/ai.clck.2.7.1-nightly.202110-05.cjs.min.js.map +0 -1
- package/browser/ai.clck.2.7.1-nightly.202110-05.gbl.js.map +0 -1
- package/browser/ai.clck.2.7.1-nightly.202110-05.gbl.min.js +0 -6
- package/browser/ai.clck.2.7.1-nightly.202110-05.gbl.min.js.map +0 -1
- package/browser/ai.clck.2.7.1-nightly.202110-05.integrity.json +0 -66
- package/browser/ai.clck.2.7.1-nightly.202110-05.js.map +0 -1
- package/browser/ai.clck.2.7.1-nightly.202110-05.min.js +0 -6
- package/browser/ai.clck.2.7.1-nightly.202110-05.min.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageAction.js.map","sources":["PageAction.js"],"sourcesContent":["/**\r\n * @copyright Microsoft 2020\r\n */\r\nimport { __extends } from \"tslib\";\r\nimport { WebEvent } from
|
|
1
|
+
{"version":3,"file":"PageAction.js.map","sources":["PageAction.js"],"sourcesContent":["/**\r\n * @copyright Microsoft 2020\r\n */\r\nimport { __extends } from \"tslib\";\r\nimport { WebEvent } from \"./WebEvent\";\r\nimport * as DataCollector from \"../DataCollector\";\r\nimport { getPerformance, LoggingSeverity, objForEachKey } from \"@microsoft/applicationinsights-core-js\";\r\nimport { extractFieldFromObject, bracketIt, isValueAssigned, extend, _ExtendedInternalMessageId } from \"../common/Utils\";\r\nimport { strNotSpecified } from \"@microsoft/applicationinsights-common\";\r\nvar PageAction = /** @class */ (function (_super) {\r\n __extends(PageAction, _super);\r\n function PageAction() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n /**\r\n * API to send pageAction event\r\n * @param pageActionEvent - PageAction event\r\n * @param properties - PageAction properties(Part C)\r\n */\r\n PageAction.prototype.trackPageAction = function (pageActionEvent, properties) {\r\n var _this = this;\r\n // Get part A properties\r\n var ext = {};\r\n ext[\"web\"] = {};\r\n var event = {\r\n name: \"Microsoft.ApplicationInsights.{0}.Event\",\r\n baseType: \"EventData\",\r\n ext: ext,\r\n data: {},\r\n baseData: {}\r\n };\r\n this._populateEventDataIfPresent(event.baseData, \"name\", pageActionEvent.name);\r\n this._populateEventDataIfPresent(event.data, \"baseTypeSource\", \"ClickEvent\");\r\n this._populateEventDataIfPresent(event.data, \"uri\", pageActionEvent.uri);\r\n this._populateEventDataIfPresent(event.data, \"pageType\", pageActionEvent.pageType);\r\n this._populateEventDataIfPresent(event.data, \"properties\", pageActionEvent.properties);\r\n this._populateEventDataIfPresent(event.data, \"actionType\", pageActionEvent.actionType);\r\n this._populateEventDataIfPresent(event.data, \"behavior\", pageActionEvent.behavior);\r\n this._populateEventDataIfPresent(event.data, \"clickCoordinates\", pageActionEvent.clickCoordinates);\r\n this._populateEventDataIfPresent(event.data, \"content\", pageActionEvent.content);\r\n this._populateEventDataIfPresent(event.data, \"targetUri\", pageActionEvent.targetUri);\r\n this._populateEventDataIfPresent(event.data, \"timeToAction\", pageActionEvent.timeToAction);\r\n this._populateEventDataIfPresent(event.data, \"refUri\", pageActionEvent.refUri);\r\n this._populateEventDataIfPresent(event.data, \"pageName\", pageActionEvent.pageName);\r\n this._populateEventDataIfPresent(event.data, \"parentId\", pageActionEvent.parentId);\r\n if (properties) {\r\n objForEachKey(properties, function (property, value) {\r\n if (!event.data[property]) {\r\n _this._populateEventDataIfPresent(event.data, property, value);\r\n }\r\n });\r\n }\r\n this._clickAnalyticsPlugin.core.track(event);\r\n };\r\n /**\r\n * API to create and send a populated PageAction event\r\n * @param element - DOM element\r\n * @param overrideValues - PageAction overrides\r\n * @param customProperties - Custom properties(Part C)\r\n * @param isRightClick - Flag for mouse right clicks\r\n */\r\n PageAction.prototype.capturePageAction = function (element, overrideValues, customProperties, isRightClick) {\r\n overrideValues = !isValueAssigned(overrideValues) ? {} : overrideValues;\r\n var pageActionEvent = { name: \"\" };\r\n var pageActionProperties = isValueAssigned(customProperties) ? customProperties : {};\r\n this.setCommonProperties(pageActionEvent, overrideValues);\r\n pageActionEvent.behavior = this._getBehavior(overrideValues);\r\n // element in scope is needed for below properties. We cannot pass element into the plugin call chain.\r\n // process them here.\r\n var elementContent = {};\r\n if (isRightClick) {\r\n // Default behavior for righ click\r\n pageActionEvent.behavior = this._config.defaultRightClickBhvr;\r\n }\r\n // Fill PartB\r\n if (element) {\r\n pageActionEvent.targetUri = DataCollector.getClickTarget(element);\r\n elementContent = this._contentHandler.getElementContent(element); // collect id,cn tags\r\n // if the element has a data-*-bhvr attrib defined, use it.\r\n if (elementContent.bhvr && !isValueAssigned(overrideValues.behavior)) {\r\n var currentBehavior = extractFieldFromObject(elementContent, \"bhvr\");\r\n pageActionEvent.behavior = this._getValidBehavior(currentBehavior);\r\n }\r\n // Validate to ensure the minimum required field 'contentName' or 'id' is present. However,\r\n // requiring these fields would result in majority of adopter's content from being collected.\r\n // Just throw a warning and continue collection.\r\n if (!isValueAssigned(elementContent.id) && !isValueAssigned(elementContent.contentName)) {\r\n this._traceLogger.throwInternal(LoggingSeverity.WARNING, _ExtendedInternalMessageId.InvalidContentBlob, \"Missing attributes id or contentName in click event. Click event information will still be collected!\");\r\n }\r\n }\r\n pageActionEvent.name = elementContent.id || elementContent.contentName || strNotSpecified;\r\n pageActionEvent.parentId = elementContent.parentid || elementContent.parentName || strNotSpecified;\r\n if (isValueAssigned(overrideValues.actionType)) {\r\n pageActionEvent.actionType = overrideValues.actionType;\r\n }\r\n if (isValueAssigned(overrideValues.clickCoordinateX) && isValueAssigned(overrideValues.clickCoordinateY)) {\r\n pageActionEvent.clickCoordinates = overrideValues.clickCoordinateX + \"X\" + overrideValues.clickCoordinateY;\r\n }\r\n this._sanitizePageActionEventContent(elementContent);\r\n pageActionEvent.content = bracketIt(JSON.stringify(extend(elementContent, overrideValues && overrideValues.contentTags ? overrideValues.contentTags : {})));\r\n pageActionEvent.timeToAction = this._getTimeToClick();\r\n pageActionEvent.refUri = isValueAssigned(overrideValues.refUri) ? overrideValues.refUri : this._config.coreData.referrerUri;\r\n if (this._isUndefinedEvent(pageActionEvent))\r\n return;\r\n this.trackPageAction(pageActionEvent, pageActionProperties);\r\n };\r\n // capture performance data into PageTags\r\n PageAction.prototype._getTimeToClick = function () {\r\n var perf = getPerformance();\r\n if (perf && perf.timing) {\r\n var isNavigationStart = perf.timing.navigationStart;\r\n if (isNavigationStart && isNavigationStart !== 0) {\r\n return new Date().getTime() - isNavigationStart;\r\n }\r\n }\r\n return -1;\r\n };\r\n PageAction.prototype._populateEventDataIfPresent = function (obj, property, value) {\r\n if (isValueAssigned(value)) {\r\n obj[property] = value;\r\n }\r\n };\r\n PageAction.prototype._sanitizePageActionEventContent = function (pageActionContent) {\r\n if (pageActionContent) {\r\n delete pageActionContent.id;\r\n delete pageActionContent.parentid;\r\n delete pageActionContent.parentname;\r\n if (this._config && this._config.dataTags && isValueAssigned(this._config.dataTags.parentDataTag)) {\r\n delete pageActionContent[this._config.dataTags.parentDataTag];\r\n }\r\n }\r\n };\r\n PageAction.prototype._isUndefinedEvent = function (pageActionEvent) {\r\n if (this._config.dropInvalidEvents) {\r\n if (pageActionEvent.name === strNotSpecified\r\n && pageActionEvent.parentId === strNotSpecified\r\n && pageActionEvent.content === \"[{}]\")\r\n return true;\r\n }\r\n return false;\r\n };\r\n return PageAction;\r\n}(WebEvent));\r\nexport { PageAction };\r\n//# sourceMappingURL=PageAction.js.map"],"names":[],"mappings":";;;;AAAA;AACA;AACA;AACA,gFAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Application Insights JavaScript SDK - Click Analytics, 2.7.1-nightly.202110-
|
|
2
|
+
* Application Insights JavaScript SDK - Click Analytics, 2.7.1-nightly.202110-14
|
|
3
3
|
* Copyright (c) Microsoft and contributors. All rights reserved.
|
|
4
4
|
*/
|
|
5
5
|
/**
|
|
6
6
|
* @copyright Microsoft 2020
|
|
7
7
|
*/
|
|
8
|
-
import { isValueAssigned, extend } from
|
|
9
|
-
import * as DataCollector from
|
|
10
|
-
import { getLocation, hasWindow } from
|
|
8
|
+
import { isValueAssigned, extend } from "../common/Utils";
|
|
9
|
+
import * as DataCollector from "../DataCollector";
|
|
10
|
+
import { getLocation, hasWindow } from "@microsoft/applicationinsights-core-js";
|
|
11
11
|
var WebEvent = /** @class */ (function () {
|
|
12
12
|
/**
|
|
13
13
|
* @param clickAnalyticsPlugin - Click Analytics plugin instance
|
|
@@ -45,8 +45,8 @@ var WebEvent = /** @class */ (function () {
|
|
|
45
45
|
this._setPageTags(event, overrideValues);
|
|
46
46
|
// extract specific meta tags out of the pageTags.metaTags collection. These will go into assigned first class fields in the event.
|
|
47
47
|
// the rest will go into pageTags.metaTags collection as is.
|
|
48
|
-
this._pageTypeMetaTag = this._getMetaData(this._metaTags, this._config.coreData,
|
|
49
|
-
this._behaviorMetaTag = this._getMetaData(this._metaTags, this._config.coreData,
|
|
48
|
+
this._pageTypeMetaTag = this._getMetaData(this._metaTags, this._config.coreData, "pageType");
|
|
49
|
+
this._behaviorMetaTag = this._getMetaData(this._metaTags, this._config.coreData, "behavior");
|
|
50
50
|
if (isValueAssigned(overrideValues.pageType)) {
|
|
51
51
|
event.pageType = overrideValues.pageType;
|
|
52
52
|
}
|
|
@@ -72,14 +72,14 @@ var WebEvent = /** @class */ (function () {
|
|
|
72
72
|
this._pageTags.metaTags = {};
|
|
73
73
|
// Remove not supported meta data in pageTags.metaTags
|
|
74
74
|
for (var metaTag in this._metaTags) {
|
|
75
|
-
if (metaTag !=
|
|
75
|
+
if (metaTag != "behavior" && metaTag != "market" && metaTag != "pageType") {
|
|
76
76
|
this._pageTags.metaTags[metaTag] = this._metaTags[metaTag];
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
// All metadata tags that must be saved as properties have been extracted at this point. Assign pageTags as is.
|
|
81
81
|
event.properties = event.properties || {};
|
|
82
|
-
event.properties[
|
|
82
|
+
event.properties["pageTags"] = this._pageTags;
|
|
83
83
|
};
|
|
84
84
|
WebEvent.prototype._getBehavior = function (overrideValues) {
|
|
85
85
|
var behavior;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebEvent.js.map","sources":["WebEvent.js"],"sourcesContent":["/**\r\n * @copyright Microsoft 2020\r\n */\r\nimport { isValueAssigned, extend } from
|
|
1
|
+
{"version":3,"file":"WebEvent.js.map","sources":["WebEvent.js"],"sourcesContent":["/**\r\n * @copyright Microsoft 2020\r\n */\r\nimport { isValueAssigned, extend } from \"../common/Utils\";\r\nimport * as DataCollector from \"../DataCollector\";\r\nimport { getLocation, hasWindow } from \"@microsoft/applicationinsights-core-js\";\r\nvar WebEvent = /** @class */ (function () {\r\n /**\r\n * @param clickAnalyticsPlugin - Click Analytics plugin instance\r\n * @param config - ClickAnalytics configuration object\r\n * @param contentHandler - Content handler\r\n * @param id - Id object\r\n * @param pageTagsCallback - callback methods to get pageTags value\r\n * @param metaTags - Meta tags\r\n * @param traceLogger - Trace logger to log to console.\r\n */\r\n function WebEvent(_clickAnalyticsPlugin, _config, _contentHandler, _pageTagsCallback, _metaTags, _traceLogger) {\r\n this._clickAnalyticsPlugin = _clickAnalyticsPlugin;\r\n this._config = _config;\r\n this._contentHandler = _contentHandler;\r\n this._pageTagsCallback = _pageTagsCallback;\r\n this._metaTags = _metaTags;\r\n this._traceLogger = _traceLogger;\r\n this._pageTags = {};\r\n }\r\n // Fill common PartB fields\r\n WebEvent.prototype.setBasicProperties = function (event, overrideValues) {\r\n if (!isValueAssigned(event.name)) {\r\n event.pageName = DataCollector.getPageName(this._config, overrideValues);\r\n }\r\n if (!isValueAssigned(event.uri) && hasWindow) {\r\n event.uri = DataCollector.getUri(this._config, getLocation());\r\n }\r\n };\r\n /**\r\n * Sets common properties for events that are based on the WebEvent schema.\r\n * @param event - The event\r\n */\r\n WebEvent.prototype.setCommonProperties = function (event, overrideValues) {\r\n this.setBasicProperties(event, overrideValues);\r\n this._setPageTags(event, overrideValues);\r\n // extract specific meta tags out of the pageTags.metaTags collection. These will go into assigned first class fields in the event.\r\n // the rest will go into pageTags.metaTags collection as is.\r\n this._pageTypeMetaTag = this._getMetaData(this._metaTags, this._config.coreData, \"pageType\");\r\n this._behaviorMetaTag = this._getMetaData(this._metaTags, this._config.coreData, \"behavior\");\r\n if (isValueAssigned(overrideValues.pageType)) {\r\n event.pageType = overrideValues.pageType;\r\n }\r\n // Only assign if not overriden and meta data is available\r\n if (isValueAssigned(this._pageTypeMetaTag) && !isValueAssigned(event.pageType)) {\r\n event.pageType = this._pageTypeMetaTag;\r\n }\r\n };\r\n /**\r\n * Sets pageTags.\r\n * @param event - The event\r\n */\r\n WebEvent.prototype._setPageTags = function (event, overrideValues) {\r\n // Prepare the pageTags object that is mostly the same for all events. Event specific pageTags will be added inside event constructors.\r\n if (this._pageTagsCallback) {\r\n this._pageTags = extend(true, this._pageTags, this._pageTagsCallback());\r\n }\r\n if (isValueAssigned(overrideValues.pageTags)) {\r\n this._pageTags = extend(true, this._pageTags, overrideValues.pageTags);\r\n }\r\n // If metadata is present add it to pageTags property\r\n if (this._metaTags) {\r\n this._pageTags.metaTags = {};\r\n // Remove not supported meta data in pageTags.metaTags\r\n for (var metaTag in this._metaTags) {\r\n if (metaTag != \"behavior\" && metaTag != \"market\" && metaTag != \"pageType\") {\r\n this._pageTags.metaTags[metaTag] = this._metaTags[metaTag];\r\n }\r\n }\r\n }\r\n // All metadata tags that must be saved as properties have been extracted at this point. Assign pageTags as is.\r\n event.properties = event.properties || {};\r\n event.properties[\"pageTags\"] = this._pageTags;\r\n };\r\n WebEvent.prototype._getBehavior = function (overrideValues) {\r\n var behavior;\r\n // If override specified\r\n if (overrideValues && isValueAssigned(overrideValues.behavior)) {\r\n behavior = overrideValues.behavior;\r\n }\r\n // If behavior meta tag available\r\n else if (isValueAssigned(this._behaviorMetaTag)) {\r\n behavior = this._behaviorMetaTag;\r\n }\r\n return this._getValidBehavior(behavior);\r\n };\r\n WebEvent.prototype._getValidBehavior = function (behavior) {\r\n return this._config.behaviorValidator(behavior);\r\n };\r\n /**\r\n * Get the specified metadata value from the collection\r\n * If overrideValue is specified in the config that takes precedence.\r\n * @param metaTags - Meta data.\r\n * @param coreData - Coredata values from configuration.\r\n * @param metaTagName - Name of the metaTag to get.\r\n * @returns Meta data value\r\n */\r\n WebEvent.prototype._getMetaData = function (metaTags, coreData, metaTagName) {\r\n if (coreData && coreData[metaTagName]) {\r\n return coreData[metaTagName];\r\n }\r\n else if (metaTags) {\r\n return metaTags[metaTagName];\r\n }\r\n return \"\";\r\n };\r\n return WebEvent;\r\n}());\r\nexport { WebEvent };\r\n//# sourceMappingURL=WebEvent.js.map"],"names":[],"mappings":";;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Application Insights JavaScript SDK - Click Analytics, 2.7.1-nightly.202110-
|
|
2
|
+
* Application Insights JavaScript SDK - Click Analytics, 2.7.1-nightly.202110-14
|
|
3
3
|
* Copyright (c) Microsoft and contributors. All rights reserved.
|
|
4
4
|
*/
|
|
5
5
|
/**
|
|
6
6
|
* @copyright Microsoft 2020
|
|
7
7
|
*/
|
|
8
8
|
import { getWindow, getDocument, isNullOrUndefined, attachEvent } from "@microsoft/applicationinsights-core-js";
|
|
9
|
-
import { isRightClick, isLeftClick, isKeyboardEnter, isKeyboardSpace, isMiddleClick, isElementDnt } from
|
|
10
|
-
import { ActionType } from
|
|
9
|
+
import { isRightClick, isLeftClick, isKeyboardEnter, isKeyboardSpace, isMiddleClick, isElementDnt } from "../common/Utils";
|
|
10
|
+
import { ActionType } from "../Enums";
|
|
11
11
|
var clickCaptureInputTypes = { BUTTON: true, CHECKBOX: true, RADIO: true, RESET: true, SUBMIT: true };
|
|
12
12
|
var AutoCaptureHandler = /** @class */ (function () {
|
|
13
13
|
/**
|
|
@@ -27,15 +27,15 @@ var AutoCaptureHandler = /** @class */ (function () {
|
|
|
27
27
|
var doc = getDocument();
|
|
28
28
|
if (win) {
|
|
29
29
|
// IE9 onwards addEventListener is available, 'click' event captures mouse click. mousedown works on other browsers
|
|
30
|
-
var event_1 = (navigator.appVersion.indexOf(
|
|
30
|
+
var event_1 = (navigator.appVersion.indexOf("MSIE") !== -1) ? "click" : "mousedown";
|
|
31
31
|
attachEvent(win, event_1, function (evt) { _this._processClick(evt); });
|
|
32
|
-
attachEvent(win,
|
|
32
|
+
attachEvent(win, "keyup", function (evt) { _this._processClick(evt); });
|
|
33
33
|
}
|
|
34
34
|
else if (doc) {
|
|
35
35
|
// IE8 and below doesn't have addEventListener so it will use attachEvent
|
|
36
36
|
// attaching to window does not work in IE8
|
|
37
|
-
attachEvent(doc,
|
|
38
|
-
attachEvent(doc,
|
|
37
|
+
attachEvent(doc, "click", function (evt) { _this._processClick(evt); });
|
|
38
|
+
attachEvent(doc, "keyup", function (evt) { _this._processClick(evt); });
|
|
39
39
|
}
|
|
40
40
|
};
|
|
41
41
|
/**
|
|
@@ -97,7 +97,7 @@ var AutoCaptureHandler = /** @class */ (function () {
|
|
|
97
97
|
}
|
|
98
98
|
else {
|
|
99
99
|
// Check allowed INPUT types
|
|
100
|
-
var sendEvent = tagNameUpperCased ===
|
|
100
|
+
var sendEvent = tagNameUpperCased === "INPUT" ? clickCaptureInputTypes[element.type.toUpperCase()] : true;
|
|
101
101
|
if (sendEvent) {
|
|
102
102
|
this.capturePageAction(element, overrideValues, {}, isRightClickObj);
|
|
103
103
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutoCaptureHandler.js.map","sources":["AutoCaptureHandler.js"],"sourcesContent":["/**\r\n * @copyright Microsoft 2020\r\n */\r\nimport { getWindow, getDocument, isNullOrUndefined, attachEvent } from \"@microsoft/applicationinsights-core-js\";\r\nimport { isRightClick, isLeftClick, isKeyboardEnter, isKeyboardSpace, isMiddleClick, isElementDnt } from
|
|
1
|
+
{"version":3,"file":"AutoCaptureHandler.js.map","sources":["AutoCaptureHandler.js"],"sourcesContent":["/**\r\n * @copyright Microsoft 2020\r\n */\r\nimport { getWindow, getDocument, isNullOrUndefined, attachEvent } from \"@microsoft/applicationinsights-core-js\";\r\nimport { isRightClick, isLeftClick, isKeyboardEnter, isKeyboardSpace, isMiddleClick, isElementDnt } from \"../common/Utils\";\r\nimport { ActionType } from \"../Enums\";\r\nvar clickCaptureInputTypes = { BUTTON: true, CHECKBOX: true, RADIO: true, RESET: true, SUBMIT: true };\r\nvar AutoCaptureHandler = /** @class */ (function () {\r\n /**\r\n * @param analyticsPlugin - WebAnalytics plugin\r\n * @param traceLogger - Trace logger to log to console.\r\n */\r\n function AutoCaptureHandler(_analyticsPlugin, _config, _pageAction, _traceLogger) {\r\n this._analyticsPlugin = _analyticsPlugin;\r\n this._config = _config;\r\n this._pageAction = _pageAction;\r\n this._traceLogger = _traceLogger;\r\n }\r\n // handle automatic event firing on user click\r\n AutoCaptureHandler.prototype.click = function () {\r\n var _this = this;\r\n var win = getWindow();\r\n var doc = getDocument();\r\n if (win) {\r\n // IE9 onwards addEventListener is available, 'click' event captures mouse click. mousedown works on other browsers\r\n var event_1 = (navigator.appVersion.indexOf(\"MSIE\") !== -1) ? \"click\" : \"mousedown\";\r\n attachEvent(win, event_1, function (evt) { _this._processClick(evt); });\r\n attachEvent(win, \"keyup\", function (evt) { _this._processClick(evt); });\r\n }\r\n else if (doc) {\r\n // IE8 and below doesn't have addEventListener so it will use attachEvent\r\n // attaching to window does not work in IE8\r\n attachEvent(doc, \"click\", function (evt) { _this._processClick(evt); });\r\n attachEvent(doc, \"keyup\", function (evt) { _this._processClick(evt); });\r\n }\r\n };\r\n /**\r\n * API to create and send a populated PageAction event\r\n * @param element - DOM element\r\n * @param overrideValues - PageAction overrides\r\n * @param customProperties - Custom properties(Part C)\r\n * @param isRightClick - Flag for mouse right clicks\r\n */\r\n AutoCaptureHandler.prototype.capturePageAction = function (element, overrideValues, customProperties, isRightClick) {\r\n var donotTrackTag = this._config.dataTags.customDataPrefix + this._config.dataTags.dntDataTag;\r\n if (!isElementDnt(element, donotTrackTag)) {\r\n this._pageAction.capturePageAction(element, overrideValues, customProperties, isRightClick);\r\n }\r\n };\r\n // Process click event\r\n AutoCaptureHandler.prototype._processClick = function (clickEvent) {\r\n var clickCaptureElements = { A: true, BUTTON: true, AREA: true, INPUT: true };\r\n var win = getWindow();\r\n if (isNullOrUndefined(clickEvent) && win) {\r\n clickEvent = win.event; // IE 8 does not pass the event\r\n }\r\n if (clickEvent) {\r\n var element = clickEvent.srcElement || clickEvent.target;\r\n // populate overrideValues\r\n var overrideValues = {\r\n clickCoordinateX: clickEvent.pageX,\r\n clickCoordinateY: clickEvent.pageY\r\n };\r\n var isRightClickObj = isRightClick(clickEvent);\r\n if (isRightClickObj) {\r\n overrideValues.actionType = ActionType.CLICKRIGHT;\r\n }\r\n else if (isLeftClick(clickEvent)) {\r\n overrideValues.actionType = ActionType.CLICKLEFT;\r\n }\r\n else if (isKeyboardEnter(clickEvent)) {\r\n overrideValues.actionType = ActionType.KEYBOARDENTER;\r\n }\r\n else if (isKeyboardSpace(clickEvent)) {\r\n overrideValues.actionType = ActionType.KEYBOARDSPACE;\r\n }\r\n else if (isMiddleClick(clickEvent)) {\r\n overrideValues.actionType = ActionType.CLICKMIDDLE;\r\n }\r\n else {\r\n return;\r\n }\r\n while (element && element.tagName) {\r\n // control property will be available for <label> elements with 'for' attribute, only use it when is a\r\n // valid JSLL capture element to avoid infinite loops\r\n if (element.control && clickCaptureElements[element.control.tagName.toUpperCase()]) {\r\n element = element.control;\r\n }\r\n var tagNameUpperCased = element.tagName.toUpperCase();\r\n if (!clickCaptureElements[tagNameUpperCased]) {\r\n element = element.parentElement || element.parentNode;\r\n continue;\r\n }\r\n else {\r\n // Check allowed INPUT types\r\n var sendEvent = tagNameUpperCased === \"INPUT\" ? clickCaptureInputTypes[element.type.toUpperCase()] : true;\r\n if (sendEvent) {\r\n this.capturePageAction(element, overrideValues, {}, isRightClickObj);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n return AutoCaptureHandler;\r\n}());\r\nexport { AutoCaptureHandler };\r\n//# sourceMappingURL=AutoCaptureHandler.js.map"],"names":[],"mappings":";;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Application Insights JavaScript SDK - Click Analytics, 2.7.1-nightly.202110-
|
|
2
|
+
* Application Insights JavaScript SDK - Click Analytics, 2.7.1-nightly.202110-14
|
|
3
3
|
* Copyright (c) Microsoft and contributors. All rights reserved.
|
|
4
4
|
*/
|
|
5
5
|
/**
|
|
6
6
|
* @copyright Microsoft 2020
|
|
7
7
|
*/
|
|
8
|
-
import { removeInvalidElements, walkUpDomChainWithElementValidation, extend, _ExtendedInternalMessageId, isValueAssigned } from
|
|
8
|
+
import { removeInvalidElements, walkUpDomChainWithElementValidation, extend, _ExtendedInternalMessageId, isValueAssigned } from "../common/Utils";
|
|
9
9
|
import { LoggingSeverity, getDocument, isNullOrUndefined, hasDocument } from "@microsoft/applicationinsights-core-js";
|
|
10
10
|
var MAX_CONTENTNAME_LENGTH = 200;
|
|
11
11
|
var DomContentHandler = /** @class */ (function () {
|
|
@@ -26,7 +26,7 @@ var DomContentHandler = /** @class */ (function () {
|
|
|
26
26
|
var metaTags = {};
|
|
27
27
|
if (hasDocument) {
|
|
28
28
|
metaTags = isValueAssigned(this._config.dataTags.metaDataPrefix) ? this._getMetaDataFromDOM(this._config.dataTags.captureAllMetaDataContent, this._config.dataTags.metaDataPrefix, false) :
|
|
29
|
-
this._getMetaDataFromDOM(this._config.dataTags.captureAllMetaDataContent,
|
|
29
|
+
this._getMetaDataFromDOM(this._config.dataTags.captureAllMetaDataContent, "", false);
|
|
30
30
|
}
|
|
31
31
|
return metaTags;
|
|
32
32
|
};
|
|
@@ -83,7 +83,7 @@ var DomContentHandler = /** @class */ (function () {
|
|
|
83
83
|
if (attrib.name.indexOf(dataTagPrefix) !== 0) {
|
|
84
84
|
continue;
|
|
85
85
|
}
|
|
86
|
-
var attribName = attrib.name.replace(dataTagPrefix,
|
|
86
|
+
var attribName = attrib.name.replace(dataTagPrefix, "");
|
|
87
87
|
elementContent[attribName] = attrib.value;
|
|
88
88
|
}
|
|
89
89
|
};
|
|
@@ -108,8 +108,8 @@ var DomContentHandler = /** @class */ (function () {
|
|
|
108
108
|
if (attrib.name.indexOf(aiBlobAttributeTag) === 0) {
|
|
109
109
|
continue;
|
|
110
110
|
}
|
|
111
|
-
var attribName = attrib.name.replace(dataTagPrefix,
|
|
112
|
-
if (elementLevelFlag && attribName ===
|
|
111
|
+
var attribName = attrib.name.replace(dataTagPrefix, "");
|
|
112
|
+
if (elementLevelFlag && attribName === "id")
|
|
113
113
|
continue; // skip capturing id if not at the first level.
|
|
114
114
|
if (!isValueAssigned(elementContent[attribName])) {
|
|
115
115
|
elementContent[attribName] = attrib.value;
|
|
@@ -132,8 +132,8 @@ var DomContentHandler = /** @class */ (function () {
|
|
|
132
132
|
return elementContent;
|
|
133
133
|
var htmlContent = this._getHtmlIdAndContentName(element);
|
|
134
134
|
elementContent = {
|
|
135
|
-
id: htmlContent.id ||
|
|
136
|
-
contentName: htmlContent.contentName ||
|
|
135
|
+
id: htmlContent.id || "",
|
|
136
|
+
contentName: htmlContent.contentName || ""
|
|
137
137
|
};
|
|
138
138
|
if (isValueAssigned(parentDataTagPrefix)) {
|
|
139
139
|
this._walkUpDomChainCaptureData(element, elementContent, dataTagPrefix, parentDataTagPrefix, aiBlobAttributeTag);
|
|
@@ -143,8 +143,8 @@ var DomContentHandler = /** @class */ (function () {
|
|
|
143
143
|
// requiring these fields would result in majority of adopter's content from being collected.
|
|
144
144
|
// Just throw a warning and continue collection.
|
|
145
145
|
if (!elementContent.id && !elementContent.contentName) {
|
|
146
|
-
this._traceLogger.throwInternal(LoggingSeverity.WARNING, _ExtendedInternalMessageId.InvalidContentBlob,
|
|
147
|
-
|
|
146
|
+
this._traceLogger.throwInternal(LoggingSeverity.WARNING, _ExtendedInternalMessageId.InvalidContentBlob, "Invalid content blob. Missing required attributes (id, contentName. " +
|
|
147
|
+
" Content information will still be collected!");
|
|
148
148
|
}
|
|
149
149
|
return elementContent;
|
|
150
150
|
};
|
|
@@ -164,17 +164,17 @@ var DomContentHandler = /** @class */ (function () {
|
|
|
164
164
|
}
|
|
165
165
|
if (this._config.dataTags.useDefaultContentNameOrId) {
|
|
166
166
|
if (!isValueAssigned(elementContent.id)) {
|
|
167
|
-
elementContent.id = htmlContent.id ||
|
|
167
|
+
elementContent.id = htmlContent.id || "";
|
|
168
168
|
}
|
|
169
|
-
elementContent.contentName = htmlContent.contentName ||
|
|
169
|
+
elementContent.contentName = htmlContent.contentName || "";
|
|
170
170
|
}
|
|
171
171
|
// Validate to ensure the minimum required field 'id' or 'contentName' is present.
|
|
172
172
|
// The content schema defines id, aN and sN as required fields. However,
|
|
173
173
|
// requiring these fields would result in majority of adopter's content from being collected.
|
|
174
174
|
// Just throw a warning and continue collection.
|
|
175
175
|
if (!elementContent.id && !elementContent.contentName) {
|
|
176
|
-
this._traceLogger.throwInternal(LoggingSeverity.WARNING, _ExtendedInternalMessageId.InvalidContentBlob,
|
|
177
|
-
|
|
176
|
+
this._traceLogger.throwInternal(LoggingSeverity.WARNING, _ExtendedInternalMessageId.InvalidContentBlob, "Invalid content blob. Missing required attributes (id, contentName. " +
|
|
177
|
+
" Content information will still be collected!");
|
|
178
178
|
}
|
|
179
179
|
return elementContent;
|
|
180
180
|
};
|
|
@@ -189,12 +189,12 @@ var DomContentHandler = /** @class */ (function () {
|
|
|
189
189
|
var metaElements;
|
|
190
190
|
var metaData = {};
|
|
191
191
|
if (hasDocument) {
|
|
192
|
-
metaElements = document.querySelectorAll(
|
|
192
|
+
metaElements = document.querySelectorAll("meta");
|
|
193
193
|
for (var i = 0; i < metaElements.length; i++) {
|
|
194
194
|
var meta = metaElements[i];
|
|
195
195
|
if (meta.name) {
|
|
196
196
|
if (captureAllMetaDataContent || meta.name.indexOf(prefix) === 0) {
|
|
197
|
-
var name_1 = removePrefix ? meta.name.replace(prefix,
|
|
197
|
+
var name_1 = removePrefix ? meta.name.replace(prefix, "") : meta.name;
|
|
198
198
|
metaData[name_1] = meta.content;
|
|
199
199
|
}
|
|
200
200
|
}
|
|
@@ -210,16 +210,16 @@ var DomContentHandler = /** @class */ (function () {
|
|
|
210
210
|
*/
|
|
211
211
|
DomContentHandler.prototype._getDefaultContentName = function (element, useDefaultContentName) {
|
|
212
212
|
if (useDefaultContentName === false || !element.tagName) {
|
|
213
|
-
return
|
|
213
|
+
return "";
|
|
214
214
|
}
|
|
215
215
|
var doc = getDocument() || {};
|
|
216
216
|
var contentName;
|
|
217
217
|
switch (element.tagName) {
|
|
218
|
-
case
|
|
218
|
+
case "A":
|
|
219
219
|
contentName = doc.all ? element.innerText || element.innerHTML : element.text || element.innerHTML;
|
|
220
220
|
break;
|
|
221
|
-
case
|
|
222
|
-
case
|
|
221
|
+
case "IMG":
|
|
222
|
+
case "AREA":
|
|
223
223
|
contentName = element.alt;
|
|
224
224
|
break;
|
|
225
225
|
default:
|
|
@@ -256,7 +256,7 @@ var DomContentHandler = /** @class */ (function () {
|
|
|
256
256
|
var defaultContentName = this._getDefaultContentName(element, this._config.dataTags.useDefaultContentNameOrId);
|
|
257
257
|
htmlContent = {
|
|
258
258
|
id: element.id,
|
|
259
|
-
contentName: customizedContentName || defaultContentName || element.getAttribute(
|
|
259
|
+
contentName: customizedContentName || defaultContentName || element.getAttribute("alt")
|
|
260
260
|
};
|
|
261
261
|
}
|
|
262
262
|
return htmlContent;
|
|
@@ -267,8 +267,8 @@ var DomContentHandler = /** @class */ (function () {
|
|
|
267
267
|
* @returns An object containing the closest parentId , can be empty if nothing was found
|
|
268
268
|
*/
|
|
269
269
|
DomContentHandler.prototype._getParentDetails = function (element, elementContent, dataTagPrefix, aiBlobAttributeTag) {
|
|
270
|
-
var parentId = elementContent[
|
|
271
|
-
var parentName = elementContent[
|
|
270
|
+
var parentId = elementContent["parentid"];
|
|
271
|
+
var parentName = elementContent["parentname"];
|
|
272
272
|
var parentInfo = {};
|
|
273
273
|
if (parentId || parentName || !element) {
|
|
274
274
|
return parentInfo;
|
|
@@ -303,12 +303,12 @@ var DomContentHandler = /** @class */ (function () {
|
|
|
303
303
|
}
|
|
304
304
|
}
|
|
305
305
|
if (parentId) {
|
|
306
|
-
parentInfo[
|
|
306
|
+
parentInfo["parentid"] = parentId;
|
|
307
307
|
}
|
|
308
308
|
else {
|
|
309
309
|
var htmlContent = this._getHtmlIdAndContentName(element.parentElement);
|
|
310
|
-
parentInfo[
|
|
311
|
-
parentInfo[
|
|
310
|
+
parentInfo["parentid"] = htmlContent.id;
|
|
311
|
+
parentInfo["parentname"] = htmlContent.contentName;
|
|
312
312
|
}
|
|
313
313
|
return parentInfo;
|
|
314
314
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DomContentHandler.js.map","sources":["DomContentHandler.js"],"sourcesContent":["/**\r\n * @copyright Microsoft 2020\r\n */\r\nimport { removeInvalidElements, walkUpDomChainWithElementValidation, extend, _ExtendedInternalMessageId, isValueAssigned } from '../common/Utils';\r\nimport { LoggingSeverity, getDocument, isNullOrUndefined, hasDocument } from \"@microsoft/applicationinsights-core-js\";\r\nvar MAX_CONTENTNAME_LENGTH = 200;\r\nvar DomContentHandler = /** @class */ (function () {\r\n /**\r\n * @param config - ClickAnalytics configuration object\r\n * @param traceLogger - Trace logger to log to console.\r\n */\r\n function DomContentHandler(_config, _traceLogger) {\r\n this._config = _config;\r\n this._traceLogger = _traceLogger;\r\n }\r\n /**\r\n * Collect metatags from DOM.\r\n * Collect data from meta tags.\r\n * @returns {object} - Metatags collection/property bag\r\n */\r\n DomContentHandler.prototype.getMetadata = function () {\r\n var metaTags = {};\r\n if (hasDocument) {\r\n metaTags = isValueAssigned(this._config.dataTags.metaDataPrefix) ? this._getMetaDataFromDOM(this._config.dataTags.captureAllMetaDataContent, this._config.dataTags.metaDataPrefix, false) :\r\n this._getMetaDataFromDOM(this._config.dataTags.captureAllMetaDataContent, '', false);\r\n }\r\n return metaTags;\r\n };\r\n /**\r\n * Collect data-* attributes for the given element.\r\n * All attributes with data-* prefix or user provided customDataPrefix are collected.'data-*' prefix is removed from the key name.\r\n * @param element - The element from which attributes need to be collected.\r\n * @returns String representation of the Json array of element attributes\r\n */\r\n DomContentHandler.prototype.getElementContent = function (element) {\r\n if (!element) {\r\n return {};\r\n }\r\n var elementContent = {};\r\n var biBlobValue;\r\n var parentDataTagPrefix;\r\n var dataTagPrefix = this._config.dataTags.customDataPrefix;\r\n var aiBlobAttributeTag = dataTagPrefix + this._config.dataTags.aiBlobAttributeTag;\r\n if (isValueAssigned(this._config.dataTags.parentDataTag)) {\r\n parentDataTagPrefix = dataTagPrefix + this._config.dataTags.parentDataTag;\r\n }\r\n if (!this._isTracked(element, dataTagPrefix, aiBlobAttributeTag)) {\r\n // capture blob from element or hierarchy\r\n biBlobValue = element.getAttribute(aiBlobAttributeTag);\r\n if (biBlobValue) {\r\n try {\r\n elementContent = JSON.parse(biBlobValue);\r\n }\r\n catch (e) {\r\n this._traceLogger.throwInternal(LoggingSeverity.CRITICAL, _ExtendedInternalMessageId.CannotParseAiBlobValue, \"Can not parse \" + biBlobValue);\r\n }\r\n }\r\n else {\r\n // traverse up the DOM to find the closest parent with data-* tag defined\r\n //contentElement = walkUpDomChainWithElementValidation(element, this._isTracked, dataTagPrefix);\r\n elementContent = extend(elementContent, this._populateElementContent(element, dataTagPrefix, parentDataTagPrefix, aiBlobAttributeTag));\r\n }\r\n }\r\n else {\r\n elementContent = extend(elementContent, this._populateElementContentwithDataTag(element, dataTagPrefix, parentDataTagPrefix, aiBlobAttributeTag));\r\n }\r\n removeInvalidElements(elementContent);\r\n if (parentDataTagPrefix) {\r\n elementContent = extend(elementContent, this._getParentDetails(element, elementContent, dataTagPrefix, aiBlobAttributeTag));\r\n }\r\n return elementContent;\r\n };\r\n /**\r\n * Capture current level Element content\r\n */\r\n DomContentHandler.prototype._captureElementContentWithDataTag = function (contentElement, elementContent, dataTagPrefix) {\r\n for (var i = 0, attrib; i < contentElement.attributes.length; i++) {\r\n attrib = contentElement.attributes[i];\r\n if (attrib.name.indexOf(dataTagPrefix) !== 0) {\r\n continue;\r\n }\r\n var attribName = attrib.name.replace(dataTagPrefix, '');\r\n elementContent[attribName] = attrib.value;\r\n }\r\n };\r\n /**\r\n * Walk Up the DOM to capture Element content\r\n */\r\n DomContentHandler.prototype._walkUpDomChainCaptureData = function (el, elementContent, dataTagPrefix, parentDataTagPrefix, aiBlobAttributeTag) {\r\n var element = el;\r\n var parentDataTagFound = false;\r\n var elementLevelFlag = false; // Use this flag to capture 'id' only at the incoming html element level.\r\n while (!isNullOrUndefined(element) && !isNullOrUndefined(element.attributes)) {\r\n var attributes = element.attributes;\r\n for (var i = 0; i < attributes.length; i++) {\r\n var attrib = attributes[i];\r\n if (attrib.name.indexOf(dataTagPrefix) !== 0) {\r\n continue;\r\n }\r\n if (attrib.name.indexOf(parentDataTagPrefix) === 0) {\r\n parentDataTagFound = true;\r\n }\r\n // Todo handle blob data\r\n if (attrib.name.indexOf(aiBlobAttributeTag) === 0) {\r\n continue;\r\n }\r\n var attribName = attrib.name.replace(dataTagPrefix, '');\r\n if (elementLevelFlag && attribName === 'id')\r\n continue; // skip capturing id if not at the first level.\r\n if (!isValueAssigned(elementContent[attribName])) {\r\n elementContent[attribName] = attrib.value;\r\n }\r\n }\r\n // break after current level;\r\n if (parentDataTagFound) {\r\n break;\r\n }\r\n elementLevelFlag = true; // after the initial level set this flag to true.\r\n element = element.parentNode;\r\n }\r\n };\r\n /**\r\n * Capture Element content along with Data Tag attributes and values\r\n */\r\n DomContentHandler.prototype._populateElementContent = function (element, dataTagPrefix, parentDataTagPrefix, aiBlobAttributeTag) {\r\n var elementContent = {};\r\n if (!element)\r\n return elementContent;\r\n var htmlContent = this._getHtmlIdAndContentName(element);\r\n elementContent = {\r\n id: htmlContent.id || '',\r\n contentName: htmlContent.contentName || ''\r\n };\r\n if (isValueAssigned(parentDataTagPrefix)) {\r\n this._walkUpDomChainCaptureData(element, elementContent, dataTagPrefix, parentDataTagPrefix, aiBlobAttributeTag);\r\n }\r\n // Validate to ensure the minimum required field 'id' or 'contentName' is present.\r\n // The content schema defines id, aN and sN as required fields. However,\r\n // requiring these fields would result in majority of adopter's content from being collected.\r\n // Just throw a warning and continue collection.\r\n if (!elementContent.id && !elementContent.contentName) {\r\n this._traceLogger.throwInternal(LoggingSeverity.WARNING, _ExtendedInternalMessageId.InvalidContentBlob, 'Invalid content blob. Missing required attributes (id, contentName. ' +\r\n ' Content information will still be collected!');\r\n }\r\n return elementContent;\r\n };\r\n /**\r\n * Capture Element content along with Data Tag attributes and values\r\n */\r\n DomContentHandler.prototype._populateElementContentwithDataTag = function (element, dataTagPrefix, parentDataTagPrefix, aiBlobAttributeTag) {\r\n var elementContent = {};\r\n if (!element)\r\n return elementContent;\r\n var htmlContent = this._getHtmlIdAndContentName(element);\r\n if (isValueAssigned(parentDataTagPrefix)) {\r\n this._walkUpDomChainCaptureData(element, elementContent, dataTagPrefix, parentDataTagPrefix, aiBlobAttributeTag);\r\n }\r\n else {\r\n this._captureElementContentWithDataTag(element, elementContent, dataTagPrefix);\r\n }\r\n if (this._config.dataTags.useDefaultContentNameOrId) {\r\n if (!isValueAssigned(elementContent.id)) {\r\n elementContent.id = htmlContent.id || '';\r\n }\r\n elementContent.contentName = htmlContent.contentName || '';\r\n }\r\n // Validate to ensure the minimum required field 'id' or 'contentName' is present.\r\n // The content schema defines id, aN and sN as required fields. However,\r\n // requiring these fields would result in majority of adopter's content from being collected.\r\n // Just throw a warning and continue collection.\r\n if (!elementContent.id && !elementContent.contentName) {\r\n this._traceLogger.throwInternal(LoggingSeverity.WARNING, _ExtendedInternalMessageId.InvalidContentBlob, 'Invalid content blob. Missing required attributes (id, contentName. ' +\r\n ' Content information will still be collected!');\r\n }\r\n return elementContent;\r\n };\r\n /**\r\n * Retrieve a specified metadata tag value from the DOM.\r\n * @param captureAllMetaDataContent - Flag to capture all metadata content\r\n * @param prefix - Prefix to search the metatags with.\r\n * @param removePrefix - Specifies if the prefix must be excluded from key names in the returned collection.\r\n * @returns Metadata collection/property bag\r\n */\r\n DomContentHandler.prototype._getMetaDataFromDOM = function (captureAllMetaDataContent, prefix, removePrefix) {\r\n var metaElements;\r\n var metaData = {};\r\n if (hasDocument) {\r\n metaElements = document.querySelectorAll('meta');\r\n for (var i = 0; i < metaElements.length; i++) {\r\n var meta = metaElements[i];\r\n if (meta.name) {\r\n if (captureAllMetaDataContent || meta.name.indexOf(prefix) === 0) {\r\n var name_1 = removePrefix ? meta.name.replace(prefix, '') : meta.name;\r\n metaData[name_1] = meta.content;\r\n }\r\n }\r\n }\r\n }\r\n return metaData;\r\n };\r\n /**\r\n * Gets the default content name.\r\n * @param element - An html element\r\n * @param useDefaultContentNameOrId -Flag indicating if an element is market PII.\r\n * @returns Content name\r\n */\r\n DomContentHandler.prototype._getDefaultContentName = function (element, useDefaultContentName) {\r\n if (useDefaultContentName === false || !element.tagName) {\r\n return '';\r\n }\r\n var doc = getDocument() || {};\r\n var contentName;\r\n switch (element.tagName) {\r\n case 'A':\r\n contentName = doc.all ? element.innerText || element.innerHTML : element.text || element.innerHTML;\r\n break;\r\n case 'IMG':\r\n case 'AREA':\r\n contentName = element.alt;\r\n break;\r\n default:\r\n contentName = element.value || element.name || element.alt || element.innerText || element.id;\r\n }\r\n return contentName.substring(0, MAX_CONTENTNAME_LENGTH);\r\n };\r\n /**\r\n * Check if the user wants to track the element, which means if the element has any tags with data-* or customDataPrefix\r\n * @param element - An html element\r\n * @returns true if any data-* exist, otherwise return false\r\n */\r\n DomContentHandler.prototype._isTracked = function (element, dataTag, aiBlobAttributeTag) {\r\n var attrs = element.attributes;\r\n var dataTagFound = false;\r\n for (var i = 0; i < attrs.length; i++) {\r\n var attributeName = attrs[i].name;\r\n if (attributeName === aiBlobAttributeTag) {\r\n // ignore if the attribute name is equal to aiBlobAttributeTag\r\n return false;\r\n }\r\n else if (attributeName.indexOf(dataTag) === 0) {\r\n dataTagFound = true;\r\n }\r\n }\r\n return dataTagFound;\r\n };\r\n DomContentHandler.prototype._getHtmlIdAndContentName = function (element) {\r\n var htmlContent = {};\r\n if (!element)\r\n return htmlContent;\r\n if (this._config.dataTags.useDefaultContentNameOrId) {\r\n var customizedContentName = this._config.callback.contentName ? this._config.callback.contentName(element, this._config.dataTags.useDefaultContentNameOrId) : \"\";\r\n var defaultContentName = this._getDefaultContentName(element, this._config.dataTags.useDefaultContentNameOrId);\r\n htmlContent = {\r\n id: element.id,\r\n contentName: customizedContentName || defaultContentName || element.getAttribute('alt')\r\n };\r\n }\r\n return htmlContent;\r\n };\r\n /**\r\n * Computes the parentId of a given element.\r\n * @param element - An html element\r\n * @returns An object containing the closest parentId , can be empty if nothing was found\r\n */\r\n DomContentHandler.prototype._getParentDetails = function (element, elementContent, dataTagPrefix, aiBlobAttributeTag) {\r\n var parentId = elementContent['parentid'];\r\n var parentName = elementContent['parentname'];\r\n var parentInfo = {};\r\n if (parentId || parentName || !element) {\r\n return parentInfo;\r\n }\r\n return this._populateParentInfo(element, dataTagPrefix, aiBlobAttributeTag);\r\n };\r\n /**\r\n * Check if parent info already set up, if so take and put into content, if not walk up the DOM to find correct info\r\n * @param element - An html element that the user wants to track\r\n * @returns An object containing the parent info, can be empty if nothing was found\r\n */\r\n DomContentHandler.prototype._populateParentInfo = function (element, dataTagPrefix, aiBlobAttributeTag) {\r\n var parentInfo = {};\r\n var parentId;\r\n // if the user does not set up parent info, walk to the DOM, find the closest parent element (with tags) and populate the info\r\n var closestParentElement = walkUpDomChainWithElementValidation(element.parentElement, this._isTracked, dataTagPrefix);\r\n if (closestParentElement) {\r\n var dataAttr = closestParentElement.getAttribute(aiBlobAttributeTag) || element[aiBlobAttributeTag];\r\n if (dataAttr) {\r\n try {\r\n var telemetryObject = JSON.parse(dataAttr);\r\n }\r\n catch (e) {\r\n this._traceLogger.throwInternal(LoggingSeverity.CRITICAL, _ExtendedInternalMessageId.CannotParseAiBlobValue, \"Can not parse \" + dataAttr);\r\n }\r\n if (telemetryObject) {\r\n parentId = telemetryObject.id;\r\n }\r\n }\r\n else {\r\n parentId = closestParentElement.getAttribute(dataTagPrefix + \"id\");\r\n }\r\n }\r\n if (parentId) {\r\n parentInfo['parentid'] = parentId;\r\n }\r\n else {\r\n var htmlContent = this._getHtmlIdAndContentName(element.parentElement);\r\n parentInfo['parentid'] = htmlContent.id;\r\n parentInfo['parentname'] = htmlContent.contentName;\r\n }\r\n return parentInfo;\r\n };\r\n return DomContentHandler;\r\n}());\r\nexport { DomContentHandler };\r\n//# sourceMappingURL=DomContentHandler.js.map"],"names":[],"mappings":";;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
|
1
|
+
{"version":3,"file":"DomContentHandler.js.map","sources":["DomContentHandler.js"],"sourcesContent":["/**\r\n * @copyright Microsoft 2020\r\n */\r\nimport { removeInvalidElements, walkUpDomChainWithElementValidation, extend, _ExtendedInternalMessageId, isValueAssigned } from \"../common/Utils\";\r\nimport { LoggingSeverity, getDocument, isNullOrUndefined, hasDocument } from \"@microsoft/applicationinsights-core-js\";\r\nvar MAX_CONTENTNAME_LENGTH = 200;\r\nvar DomContentHandler = /** @class */ (function () {\r\n /**\r\n * @param config - ClickAnalytics configuration object\r\n * @param traceLogger - Trace logger to log to console.\r\n */\r\n function DomContentHandler(_config, _traceLogger) {\r\n this._config = _config;\r\n this._traceLogger = _traceLogger;\r\n }\r\n /**\r\n * Collect metatags from DOM.\r\n * Collect data from meta tags.\r\n * @returns {object} - Metatags collection/property bag\r\n */\r\n DomContentHandler.prototype.getMetadata = function () {\r\n var metaTags = {};\r\n if (hasDocument) {\r\n metaTags = isValueAssigned(this._config.dataTags.metaDataPrefix) ? this._getMetaDataFromDOM(this._config.dataTags.captureAllMetaDataContent, this._config.dataTags.metaDataPrefix, false) :\r\n this._getMetaDataFromDOM(this._config.dataTags.captureAllMetaDataContent, \"\", false);\r\n }\r\n return metaTags;\r\n };\r\n /**\r\n * Collect data-* attributes for the given element.\r\n * All attributes with data-* prefix or user provided customDataPrefix are collected.'data-*' prefix is removed from the key name.\r\n * @param element - The element from which attributes need to be collected.\r\n * @returns String representation of the Json array of element attributes\r\n */\r\n DomContentHandler.prototype.getElementContent = function (element) {\r\n if (!element) {\r\n return {};\r\n }\r\n var elementContent = {};\r\n var biBlobValue;\r\n var parentDataTagPrefix;\r\n var dataTagPrefix = this._config.dataTags.customDataPrefix;\r\n var aiBlobAttributeTag = dataTagPrefix + this._config.dataTags.aiBlobAttributeTag;\r\n if (isValueAssigned(this._config.dataTags.parentDataTag)) {\r\n parentDataTagPrefix = dataTagPrefix + this._config.dataTags.parentDataTag;\r\n }\r\n if (!this._isTracked(element, dataTagPrefix, aiBlobAttributeTag)) {\r\n // capture blob from element or hierarchy\r\n biBlobValue = element.getAttribute(aiBlobAttributeTag);\r\n if (biBlobValue) {\r\n try {\r\n elementContent = JSON.parse(biBlobValue);\r\n }\r\n catch (e) {\r\n this._traceLogger.throwInternal(LoggingSeverity.CRITICAL, _ExtendedInternalMessageId.CannotParseAiBlobValue, \"Can not parse \" + biBlobValue);\r\n }\r\n }\r\n else {\r\n // traverse up the DOM to find the closest parent with data-* tag defined\r\n //contentElement = walkUpDomChainWithElementValidation(element, this._isTracked, dataTagPrefix);\r\n elementContent = extend(elementContent, this._populateElementContent(element, dataTagPrefix, parentDataTagPrefix, aiBlobAttributeTag));\r\n }\r\n }\r\n else {\r\n elementContent = extend(elementContent, this._populateElementContentwithDataTag(element, dataTagPrefix, parentDataTagPrefix, aiBlobAttributeTag));\r\n }\r\n removeInvalidElements(elementContent);\r\n if (parentDataTagPrefix) {\r\n elementContent = extend(elementContent, this._getParentDetails(element, elementContent, dataTagPrefix, aiBlobAttributeTag));\r\n }\r\n return elementContent;\r\n };\r\n /**\r\n * Capture current level Element content\r\n */\r\n DomContentHandler.prototype._captureElementContentWithDataTag = function (contentElement, elementContent, dataTagPrefix) {\r\n for (var i = 0, attrib; i < contentElement.attributes.length; i++) {\r\n attrib = contentElement.attributes[i];\r\n if (attrib.name.indexOf(dataTagPrefix) !== 0) {\r\n continue;\r\n }\r\n var attribName = attrib.name.replace(dataTagPrefix, \"\");\r\n elementContent[attribName] = attrib.value;\r\n }\r\n };\r\n /**\r\n * Walk Up the DOM to capture Element content\r\n */\r\n DomContentHandler.prototype._walkUpDomChainCaptureData = function (el, elementContent, dataTagPrefix, parentDataTagPrefix, aiBlobAttributeTag) {\r\n var element = el;\r\n var parentDataTagFound = false;\r\n var elementLevelFlag = false; // Use this flag to capture 'id' only at the incoming html element level.\r\n while (!isNullOrUndefined(element) && !isNullOrUndefined(element.attributes)) {\r\n var attributes = element.attributes;\r\n for (var i = 0; i < attributes.length; i++) {\r\n var attrib = attributes[i];\r\n if (attrib.name.indexOf(dataTagPrefix) !== 0) {\r\n continue;\r\n }\r\n if (attrib.name.indexOf(parentDataTagPrefix) === 0) {\r\n parentDataTagFound = true;\r\n }\r\n // Todo handle blob data\r\n if (attrib.name.indexOf(aiBlobAttributeTag) === 0) {\r\n continue;\r\n }\r\n var attribName = attrib.name.replace(dataTagPrefix, \"\");\r\n if (elementLevelFlag && attribName === \"id\")\r\n continue; // skip capturing id if not at the first level.\r\n if (!isValueAssigned(elementContent[attribName])) {\r\n elementContent[attribName] = attrib.value;\r\n }\r\n }\r\n // break after current level;\r\n if (parentDataTagFound) {\r\n break;\r\n }\r\n elementLevelFlag = true; // after the initial level set this flag to true.\r\n element = element.parentNode;\r\n }\r\n };\r\n /**\r\n * Capture Element content along with Data Tag attributes and values\r\n */\r\n DomContentHandler.prototype._populateElementContent = function (element, dataTagPrefix, parentDataTagPrefix, aiBlobAttributeTag) {\r\n var elementContent = {};\r\n if (!element)\r\n return elementContent;\r\n var htmlContent = this._getHtmlIdAndContentName(element);\r\n elementContent = {\r\n id: htmlContent.id || \"\",\r\n contentName: htmlContent.contentName || \"\"\r\n };\r\n if (isValueAssigned(parentDataTagPrefix)) {\r\n this._walkUpDomChainCaptureData(element, elementContent, dataTagPrefix, parentDataTagPrefix, aiBlobAttributeTag);\r\n }\r\n // Validate to ensure the minimum required field 'id' or 'contentName' is present.\r\n // The content schema defines id, aN and sN as required fields. However,\r\n // requiring these fields would result in majority of adopter's content from being collected.\r\n // Just throw a warning and continue collection.\r\n if (!elementContent.id && !elementContent.contentName) {\r\n this._traceLogger.throwInternal(LoggingSeverity.WARNING, _ExtendedInternalMessageId.InvalidContentBlob, \"Invalid content blob. Missing required attributes (id, contentName. \" +\r\n \" Content information will still be collected!\");\r\n }\r\n return elementContent;\r\n };\r\n /**\r\n * Capture Element content along with Data Tag attributes and values\r\n */\r\n DomContentHandler.prototype._populateElementContentwithDataTag = function (element, dataTagPrefix, parentDataTagPrefix, aiBlobAttributeTag) {\r\n var elementContent = {};\r\n if (!element)\r\n return elementContent;\r\n var htmlContent = this._getHtmlIdAndContentName(element);\r\n if (isValueAssigned(parentDataTagPrefix)) {\r\n this._walkUpDomChainCaptureData(element, elementContent, dataTagPrefix, parentDataTagPrefix, aiBlobAttributeTag);\r\n }\r\n else {\r\n this._captureElementContentWithDataTag(element, elementContent, dataTagPrefix);\r\n }\r\n if (this._config.dataTags.useDefaultContentNameOrId) {\r\n if (!isValueAssigned(elementContent.id)) {\r\n elementContent.id = htmlContent.id || \"\";\r\n }\r\n elementContent.contentName = htmlContent.contentName || \"\";\r\n }\r\n // Validate to ensure the minimum required field 'id' or 'contentName' is present.\r\n // The content schema defines id, aN and sN as required fields. However,\r\n // requiring these fields would result in majority of adopter's content from being collected.\r\n // Just throw a warning and continue collection.\r\n if (!elementContent.id && !elementContent.contentName) {\r\n this._traceLogger.throwInternal(LoggingSeverity.WARNING, _ExtendedInternalMessageId.InvalidContentBlob, \"Invalid content blob. Missing required attributes (id, contentName. \" +\r\n \" Content information will still be collected!\");\r\n }\r\n return elementContent;\r\n };\r\n /**\r\n * Retrieve a specified metadata tag value from the DOM.\r\n * @param captureAllMetaDataContent - Flag to capture all metadata content\r\n * @param prefix - Prefix to search the metatags with.\r\n * @param removePrefix - Specifies if the prefix must be excluded from key names in the returned collection.\r\n * @returns Metadata collection/property bag\r\n */\r\n DomContentHandler.prototype._getMetaDataFromDOM = function (captureAllMetaDataContent, prefix, removePrefix) {\r\n var metaElements;\r\n var metaData = {};\r\n if (hasDocument) {\r\n metaElements = document.querySelectorAll(\"meta\");\r\n for (var i = 0; i < metaElements.length; i++) {\r\n var meta = metaElements[i];\r\n if (meta.name) {\r\n if (captureAllMetaDataContent || meta.name.indexOf(prefix) === 0) {\r\n var name_1 = removePrefix ? meta.name.replace(prefix, \"\") : meta.name;\r\n metaData[name_1] = meta.content;\r\n }\r\n }\r\n }\r\n }\r\n return metaData;\r\n };\r\n /**\r\n * Gets the default content name.\r\n * @param element - An html element\r\n * @param useDefaultContentNameOrId -Flag indicating if an element is market PII.\r\n * @returns Content name\r\n */\r\n DomContentHandler.prototype._getDefaultContentName = function (element, useDefaultContentName) {\r\n if (useDefaultContentName === false || !element.tagName) {\r\n return \"\";\r\n }\r\n var doc = getDocument() || {};\r\n var contentName;\r\n switch (element.tagName) {\r\n case \"A\":\r\n contentName = doc.all ? element.innerText || element.innerHTML : element.text || element.innerHTML;\r\n break;\r\n case \"IMG\":\r\n case \"AREA\":\r\n contentName = element.alt;\r\n break;\r\n default:\r\n contentName = element.value || element.name || element.alt || element.innerText || element.id;\r\n }\r\n return contentName.substring(0, MAX_CONTENTNAME_LENGTH);\r\n };\r\n /**\r\n * Check if the user wants to track the element, which means if the element has any tags with data-* or customDataPrefix\r\n * @param element - An html element\r\n * @returns true if any data-* exist, otherwise return false\r\n */\r\n DomContentHandler.prototype._isTracked = function (element, dataTag, aiBlobAttributeTag) {\r\n var attrs = element.attributes;\r\n var dataTagFound = false;\r\n for (var i = 0; i < attrs.length; i++) {\r\n var attributeName = attrs[i].name;\r\n if (attributeName === aiBlobAttributeTag) {\r\n // ignore if the attribute name is equal to aiBlobAttributeTag\r\n return false;\r\n }\r\n else if (attributeName.indexOf(dataTag) === 0) {\r\n dataTagFound = true;\r\n }\r\n }\r\n return dataTagFound;\r\n };\r\n DomContentHandler.prototype._getHtmlIdAndContentName = function (element) {\r\n var htmlContent = {};\r\n if (!element)\r\n return htmlContent;\r\n if (this._config.dataTags.useDefaultContentNameOrId) {\r\n var customizedContentName = this._config.callback.contentName ? this._config.callback.contentName(element, this._config.dataTags.useDefaultContentNameOrId) : \"\";\r\n var defaultContentName = this._getDefaultContentName(element, this._config.dataTags.useDefaultContentNameOrId);\r\n htmlContent = {\r\n id: element.id,\r\n contentName: customizedContentName || defaultContentName || element.getAttribute(\"alt\")\r\n };\r\n }\r\n return htmlContent;\r\n };\r\n /**\r\n * Computes the parentId of a given element.\r\n * @param element - An html element\r\n * @returns An object containing the closest parentId , can be empty if nothing was found\r\n */\r\n DomContentHandler.prototype._getParentDetails = function (element, elementContent, dataTagPrefix, aiBlobAttributeTag) {\r\n var parentId = elementContent[\"parentid\"];\r\n var parentName = elementContent[\"parentname\"];\r\n var parentInfo = {};\r\n if (parentId || parentName || !element) {\r\n return parentInfo;\r\n }\r\n return this._populateParentInfo(element, dataTagPrefix, aiBlobAttributeTag);\r\n };\r\n /**\r\n * Check if parent info already set up, if so take and put into content, if not walk up the DOM to find correct info\r\n * @param element - An html element that the user wants to track\r\n * @returns An object containing the parent info, can be empty if nothing was found\r\n */\r\n DomContentHandler.prototype._populateParentInfo = function (element, dataTagPrefix, aiBlobAttributeTag) {\r\n var parentInfo = {};\r\n var parentId;\r\n // if the user does not set up parent info, walk to the DOM, find the closest parent element (with tags) and populate the info\r\n var closestParentElement = walkUpDomChainWithElementValidation(element.parentElement, this._isTracked, dataTagPrefix);\r\n if (closestParentElement) {\r\n var dataAttr = closestParentElement.getAttribute(aiBlobAttributeTag) || element[aiBlobAttributeTag];\r\n if (dataAttr) {\r\n try {\r\n var telemetryObject = JSON.parse(dataAttr);\r\n }\r\n catch (e) {\r\n this._traceLogger.throwInternal(LoggingSeverity.CRITICAL, _ExtendedInternalMessageId.CannotParseAiBlobValue, \"Can not parse \" + dataAttr);\r\n }\r\n if (telemetryObject) {\r\n parentId = telemetryObject.id;\r\n }\r\n }\r\n else {\r\n parentId = closestParentElement.getAttribute(dataTagPrefix + \"id\");\r\n }\r\n }\r\n if (parentId) {\r\n parentInfo[\"parentid\"] = parentId;\r\n }\r\n else {\r\n var htmlContent = this._getHtmlIdAndContentName(element.parentElement);\r\n parentInfo[\"parentid\"] = htmlContent.id;\r\n parentInfo[\"parentname\"] = htmlContent.contentName;\r\n }\r\n return parentInfo;\r\n };\r\n return DomContentHandler;\r\n}());\r\nexport { DomContentHandler };\r\n//# sourceMappingURL=DomContentHandler.js.map"],"names":[],"mappings":";;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@microsoft/applicationinsights-clickanalytics-js",
|
|
3
|
-
"version": "2.7.1-nightly.202110-
|
|
3
|
+
"version": "2.7.1-nightly.202110-14",
|
|
4
4
|
"description": "Microsoft Application Insights Click Analytics extension",
|
|
5
5
|
"homepage": "https://github.com/microsoft/ApplicationInsights-JS#readme",
|
|
6
6
|
"author": "Microsoft Application Insights Team",
|
|
@@ -45,9 +45,9 @@
|
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"@microsoft/dynamicproto-js": "^1.1.4",
|
|
47
47
|
"@microsoft/applicationinsights-shims": "2.0.0",
|
|
48
|
-
"@microsoft/applicationinsights-core-js": "2.7.1-nightly.202110-
|
|
49
|
-
"@microsoft/applicationinsights-common": "2.7.1-nightly.202110-
|
|
50
|
-
"@microsoft/applicationinsights-properties-js": "2.7.1-nightly.202110-
|
|
48
|
+
"@microsoft/applicationinsights-core-js": "2.7.1-nightly.202110-14",
|
|
49
|
+
"@microsoft/applicationinsights-common": "2.7.1-nightly.202110-14",
|
|
50
|
+
"@microsoft/applicationinsights-properties-js": "2.7.1-nightly.202110-14"
|
|
51
51
|
},
|
|
52
52
|
"repository": {
|
|
53
53
|
"type": "git",
|
|
@@ -13,21 +13,21 @@ import { IConfig, IPropertiesPlugin, PropertiesPluginIdentifier } from "@microso
|
|
|
13
13
|
import {
|
|
14
14
|
IClickAnalyticsConfiguration, IContentHandler,
|
|
15
15
|
IAutoCaptureHandler, IPageActionTelemetry
|
|
16
|
-
} from
|
|
16
|
+
} from "./Interfaces/Datamodel";
|
|
17
17
|
import {
|
|
18
18
|
mergeConfig, BehaviorMapValidator,
|
|
19
19
|
BehaviorValueValidator, BehaviorEnumValidator, _ExtendedInternalMessageId
|
|
20
|
-
} from
|
|
21
|
-
import { PageAction } from
|
|
20
|
+
} from "./common/Utils";
|
|
21
|
+
import { PageAction } from "./events/PageAction";
|
|
22
22
|
import { AutoCaptureHandler } from "./handlers/AutoCaptureHandler";
|
|
23
23
|
import { DomContentHandler } from "./handlers/DomContentHandler";
|
|
24
24
|
import { PropertiesPlugin } from "@microsoft/applicationinsights-properties-js";
|
|
25
25
|
export { BehaviorMapValidator, BehaviorValueValidator, BehaviorEnumValidator }
|
|
26
26
|
|
|
27
27
|
export class ClickAnalyticsPlugin extends BaseTelemetryPlugin {
|
|
28
|
-
public identifier: string =
|
|
28
|
+
public identifier: string = "ClickAnalyticsPlugin";
|
|
29
29
|
public priority: number = 181;
|
|
30
|
-
public static Version = "2.7.1-nightly.202110-
|
|
30
|
+
public static Version = "2.7.1-nightly.202110-14";
|
|
31
31
|
private _config: IClickAnalyticsConfiguration;
|
|
32
32
|
private pageAction: PageAction;
|
|
33
33
|
private _autoCaptureHandler: IAutoCaptureHandler;
|
package/src/DataCollector.ts
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
import {
|
|
6
6
|
getLocation, getDocument, getWindow, hasDocument, isFunction
|
|
7
|
-
} from
|
|
8
|
-
import { findClosestAnchor, isValueAssigned } from
|
|
9
|
-
import { IClickAnalyticsConfiguration, IOverrideValues } from
|
|
7
|
+
} from "@microsoft/applicationinsights-core-js";
|
|
8
|
+
import { findClosestAnchor, isValueAssigned } from "./common/Utils";
|
|
9
|
+
import { IClickAnalyticsConfiguration, IOverrideValues } from "./Interfaces/Datamodel";
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
var clickCaptureInputTypes = { BUTTON: true, CHECKBOX: true, RADIO: true, RESET: true, SUBMIT: true };
|
|
@@ -30,7 +30,7 @@ export function getImageHref(element: HTMLImageElement): string {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
-
return
|
|
33
|
+
return "";
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
|
|
@@ -39,16 +39,16 @@ export function getImageHref(element: HTMLImageElement): string {
|
|
|
39
39
|
* @returns Click target URI
|
|
40
40
|
*/
|
|
41
41
|
export function getClickTarget(element: any) {
|
|
42
|
-
var clickTarget =
|
|
42
|
+
var clickTarget = "";
|
|
43
43
|
switch (element.tagName) {
|
|
44
|
-
case
|
|
45
|
-
case
|
|
46
|
-
clickTarget = element.href ||
|
|
44
|
+
case "A":
|
|
45
|
+
case "AREA":
|
|
46
|
+
clickTarget = element.href || "";
|
|
47
47
|
break;
|
|
48
|
-
case
|
|
48
|
+
case "IMG":
|
|
49
49
|
clickTarget = getImageHref(element as HTMLImageElement);
|
|
50
50
|
break;
|
|
51
|
-
case
|
|
51
|
+
case "INPUT":
|
|
52
52
|
var type = element.type;
|
|
53
53
|
if (type && (clickCaptureInputTypes[type.toUpperCase()])) {
|
|
54
54
|
let loc = getLocation() || ({} as Location);
|
|
@@ -70,17 +70,17 @@ export function getClickTarget(element: any) {
|
|
|
70
70
|
*/
|
|
71
71
|
export function onDomLoaded(callback: () => void) {
|
|
72
72
|
onDomReadyDo(() => {
|
|
73
|
-
if (hasDocument && document.readyState ===
|
|
73
|
+
if (hasDocument && document.readyState === "complete") {
|
|
74
74
|
callback();
|
|
75
75
|
} else {
|
|
76
76
|
let win = getWindow();
|
|
77
77
|
if (win) {
|
|
78
78
|
if (win.addEventListener) {
|
|
79
|
-
win.addEventListener(
|
|
79
|
+
win.addEventListener("load", () => {
|
|
80
80
|
callback();
|
|
81
81
|
}); // NB **not** 'onload'
|
|
82
82
|
} else if ((win as any).attachEvent) {
|
|
83
|
-
(win as any).attachEvent(
|
|
83
|
+
(win as any).attachEvent("onload", () => {
|
|
84
84
|
callback();
|
|
85
85
|
}); // IE8
|
|
86
86
|
}
|
|
@@ -130,8 +130,8 @@ export function sanitizeUrl(config: IClickAnalyticsConfiguration, location: Loca
|
|
|
130
130
|
if (!location) {
|
|
131
131
|
return null;
|
|
132
132
|
}
|
|
133
|
-
var url = location.protocol +
|
|
134
|
-
(isValueAssigned(location.port) ?
|
|
133
|
+
var url = location.protocol + "//" + (location.hostname || location.host) + // location.hostname is not supported on Opera and Opera for Android
|
|
134
|
+
(isValueAssigned(location.port) ? ":" + location.port : "") +
|
|
135
135
|
location.pathname;
|
|
136
136
|
return url;
|
|
137
137
|
}
|
|
@@ -143,7 +143,7 @@ export function sanitizeUrl(config: IClickAnalyticsConfiguration, location: Loca
|
|
|
143
143
|
* @returns Flag indicating if an element is market PII.
|
|
144
144
|
*/
|
|
145
145
|
export function getUri(config: IClickAnalyticsConfiguration, location: any): string {
|
|
146
|
-
if (config.coreData && config.coreData.requestUri && config.coreData.requestUri !==
|
|
146
|
+
if (config.coreData && config.coreData.requestUri && config.coreData.requestUri !== "") {
|
|
147
147
|
return config.coreData.requestUri;
|
|
148
148
|
}
|
|
149
149
|
return sanitizeUrl(config, location);
|
package/src/Enums.ts
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
export const ActionType = {
|
|
6
|
-
CLICKLEFT:
|
|
7
|
-
CLICKRIGHT:
|
|
8
|
-
CLICKMIDDLE:
|
|
9
|
-
SCROLL:
|
|
10
|
-
ZOOM:
|
|
11
|
-
RESIZE:
|
|
12
|
-
KEYBOARDENTER:
|
|
13
|
-
KEYBOARDSPACE:
|
|
14
|
-
OTHER:
|
|
6
|
+
CLICKLEFT: "CL",
|
|
7
|
+
CLICKRIGHT: "CR",
|
|
8
|
+
CLICKMIDDLE: "CM",
|
|
9
|
+
SCROLL: "S",
|
|
10
|
+
ZOOM: "Z",
|
|
11
|
+
RESIZE: "R",
|
|
12
|
+
KEYBOARDENTER: "KE",
|
|
13
|
+
KEYBOARDSPACE: "KS",
|
|
14
|
+
OTHER: "O"
|
|
15
15
|
};
|