@atlaskit/react-ufo 4.10.0 → 4.10.2

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.
Files changed (49) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/cjs/create-experimental-interaction-metrics-payload/index.js +10 -7
  3. package/dist/cjs/create-payload/utils/get-vc-metrics.js +13 -9
  4. package/dist/cjs/interaction-metrics/index.js +6 -4
  5. package/dist/cjs/interaction-metrics/post-interaction-log.js +13 -6
  6. package/dist/cjs/vc/index.js +4 -1
  7. package/dist/cjs/vc/vc-observer-new/index.js +10 -4
  8. package/dist/cjs/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +11 -18
  9. package/dist/cjs/vc/vc-observer-new/viewport-observer/index.js +14 -16
  10. package/dist/cjs/vc/vc-observer-new/viewport-observer/utils/get-mutated-elements.js +50 -0
  11. package/dist/es2019/create-experimental-interaction-metrics-payload/index.js +5 -2
  12. package/dist/es2019/create-payload/utils/get-vc-metrics.js +5 -2
  13. package/dist/es2019/interaction-metrics/index.js +6 -4
  14. package/dist/es2019/interaction-metrics/post-interaction-log.js +7 -1
  15. package/dist/es2019/vc/index.js +4 -1
  16. package/dist/es2019/vc/vc-observer-new/index.js +11 -2
  17. package/dist/es2019/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +10 -15
  18. package/dist/es2019/vc/vc-observer-new/viewport-observer/index.js +11 -11
  19. package/dist/es2019/vc/vc-observer-new/viewport-observer/utils/get-mutated-elements.js +27 -0
  20. package/dist/esm/create-experimental-interaction-metrics-payload/index.js +10 -7
  21. package/dist/esm/create-payload/utils/get-vc-metrics.js +13 -9
  22. package/dist/esm/interaction-metrics/index.js +6 -4
  23. package/dist/esm/interaction-metrics/post-interaction-log.js +13 -6
  24. package/dist/esm/vc/index.js +4 -1
  25. package/dist/esm/vc/vc-observer-new/index.js +10 -4
  26. package/dist/esm/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +11 -18
  27. package/dist/esm/vc/vc-observer-new/viewport-observer/index.js +14 -16
  28. package/dist/esm/vc/vc-observer-new/viewport-observer/utils/get-mutated-elements.js +43 -0
  29. package/dist/types/common/common/types.d.ts +1 -0
  30. package/dist/types/create-interaction-extra-metrics-payload/index.d.ts +1 -0
  31. package/dist/types/create-payload/index.d.ts +384 -0
  32. package/dist/types/interaction-metrics/index.d.ts +2 -2
  33. package/dist/types/vc/types.d.ts +4 -0
  34. package/dist/types/vc/vc-observer/getVCRevisionDebugDetails.d.ts +2 -0
  35. package/dist/types/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.d.ts +1 -1
  36. package/dist/types/vc/vc-observer-new/metric-calculator/types.d.ts +4 -0
  37. package/dist/types/vc/vc-observer-new/types.d.ts +4 -0
  38. package/dist/types/vc/vc-observer-new/viewport-observer/utils/get-mutated-elements.d.ts +6 -0
  39. package/dist/types-ts4.5/common/common/types.d.ts +1 -0
  40. package/dist/types-ts4.5/create-interaction-extra-metrics-payload/index.d.ts +1 -0
  41. package/dist/types-ts4.5/create-payload/index.d.ts +384 -0
  42. package/dist/types-ts4.5/interaction-metrics/index.d.ts +2 -2
  43. package/dist/types-ts4.5/vc/types.d.ts +4 -0
  44. package/dist/types-ts4.5/vc/vc-observer/getVCRevisionDebugDetails.d.ts +2 -0
  45. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.d.ts +1 -1
  46. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/types.d.ts +4 -0
  47. package/dist/types-ts4.5/vc/vc-observer-new/types.d.ts +4 -0
  48. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/utils/get-mutated-elements.d.ts +6 -0
  49. package/package.json +1 -4
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @atlaskit/ufo-interaction-ignore
2
2
 
3
+ ## 4.10.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [`4b8df6fc79b12`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/4b8df6fc79b12) -
8
+ Add interactionType to VC debugData
9
+ - [`4b8df6fc79b12`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/4b8df6fc79b12) -
10
+ bugfixes on VC debug data
11
+
12
+ ## 4.10.1
13
+
14
+ ### Patch Changes
15
+
16
+ - [`092ad737a2396`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/092ad737a2396) -
17
+ handle nested display contents elements in TTVC v4
18
+ - [`63743e34fad29`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/63743e34fad29) -
19
+ Add an optional arg to func addError and addErrorToAll so that to error hash can be included in
20
+ UFO messages
21
+
3
22
  ## 4.10.0
4
23
 
5
24
  ### Minor Changes
@@ -95,18 +95,19 @@ function getExperimentalVCMetrics(_x) {
95
95
  }
96
96
  function _getExperimentalVCMetrics() {
97
97
  _getExperimentalVCMetrics = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(interaction) {
98
- var vcObserver, _interaction$apdex, prefix, result, VC, pageVisibilityUpToTTAI;
98
+ var vcObserver, pageVisibilityUpToTTAI, _interaction$apdex, prefix, result, VC;
99
99
  return _regenerator.default.wrap(function _callee$(_context) {
100
100
  while (1) switch (_context.prev = _context.next) {
101
101
  case 0:
102
102
  // Use per-interaction VC observer if available, otherwise fall back to global experimentalVC
103
103
  vcObserver = interaction.experimentalVCObserver || experimentalVC.vcObserver;
104
+ pageVisibilityUpToTTAI = (0, _hiddenTiming.getPageVisibilityState)(interaction.start, interaction.end);
104
105
  if (!vcObserver) {
105
106
  _context.next = 13;
106
107
  break;
107
108
  }
108
109
  prefix = 'ufo-experimental';
109
- _context.next = 5;
110
+ _context.next = 6;
110
111
  return vcObserver.getVCResult({
111
112
  start: interaction.start,
112
113
  stop: interaction.end,
@@ -115,18 +116,20 @@ function _getExperimentalVCMetrics() {
115
116
  prefix: prefix,
116
117
  vc: interaction.vc,
117
118
  experienceKey: interaction.ufoName,
118
- interactionId: interaction.id
119
+ interactionId: interaction.id,
120
+ interactionType: interaction.type,
121
+ isPageVisible: pageVisibilityUpToTTAI === 'visible',
122
+ interactionAbortReason: interaction.abortReason
119
123
  });
120
- case 5:
124
+ case 6:
121
125
  result = _context.sent;
122
126
  VC = result === null || result === void 0 ? void 0 : result['metrics:vc'];
123
127
  if (!(!VC || !(result !== null && result !== void 0 && result["".concat(prefix, ":vc:clean")]))) {
124
- _context.next = 9;
128
+ _context.next = 10;
125
129
  break;
126
130
  }
127
131
  return _context.abrupt("return", result);
128
- case 9:
129
- pageVisibilityUpToTTAI = (0, _hiddenTiming.getPageVisibilityState)(interaction.start, interaction.end);
132
+ case 10:
130
133
  if (!(interaction.abortReason || pageVisibilityUpToTTAI !== 'visible')) {
131
134
  _context.next = 12;
132
135
  break;
@@ -26,6 +26,7 @@ function _getVCMetrics() {
26
26
  config,
27
27
  interactionStatus,
28
28
  pageVisibilityUpToTTAI,
29
+ isPageVisible,
29
30
  shouldReportVCMetrics,
30
31
  observer,
31
32
  isSSREnabled,
@@ -56,14 +57,15 @@ function _getVCMetrics() {
56
57
  case 7:
57
58
  interactionStatus = (0, _getInteractionStatus.default)(interaction);
58
59
  pageVisibilityUpToTTAI = (0, _getPageVisibilityUpToTtai.default)(interaction);
59
- shouldReportVCMetrics = interactionStatus.originalInteractionStatus === 'SUCCEEDED' && pageVisibilityUpToTTAI === 'visible'; // Use per-interaction VC observer if available, otherwise fall back to global
60
+ isPageVisible = pageVisibilityUpToTTAI === 'visible';
61
+ shouldReportVCMetrics = interactionStatus.originalInteractionStatus === 'SUCCEEDED' && isPageVisible; // Use per-interaction VC observer if available, otherwise fall back to global
60
62
  observer = interaction.vcObserver;
61
63
  if (observer) {
62
- _context.next = 13;
64
+ _context.next = 14;
63
65
  break;
64
66
  }
65
67
  return _context.abrupt("return", {});
66
- case 13:
68
+ case 14:
67
69
  isSSREnabled = interaction.type === 'page_load' && ((config === null || config === void 0 ? void 0 : config.ssr) || (config === null || config === void 0 || (_config$vc$ssrWhiteli = config.vc.ssrWhitelist) === null || _config$vc$ssrWhiteli === void 0 ? void 0 : _config$vc$ssrWhiteli.includes(interaction.ufoName)));
68
70
  ssr = interaction.type === 'page_load' && isSSREnabled ? {
69
71
  ssr: (0, _getSsrDoneTimeValue.default)(config)
@@ -71,7 +73,7 @@ function _getVCMetrics() {
71
73
  _interactionMetrics.postInteractionLog.setVCObserverSSRConfig(ssr);
72
74
  tti = (_interaction$apdex = interaction.apdex) === null || _interaction$apdex === void 0 || (_interaction$apdex = _interaction$apdex[0]) === null || _interaction$apdex === void 0 ? void 0 : _interaction$apdex.stopTime;
73
75
  prefix = 'ufo';
74
- _context.next = 20;
76
+ _context.next = 21;
75
77
  return observer.getVCResult(_objectSpread(_objectSpread({
76
78
  start: interaction.start,
77
79
  stop: interaction.end,
@@ -85,9 +87,11 @@ function _getVCMetrics() {
85
87
  includeSSRRatio: (_config$vc3 = config.vc) === null || _config$vc3 === void 0 ? void 0 : _config$vc3.includeSSRRatio
86
88
  }, ssr), {}, {
87
89
  include3p: include3p,
88
- excludeSmartAnswersInSearch: excludeSmartAnswersInSearch
90
+ excludeSmartAnswersInSearch: excludeSmartAnswersInSearch,
91
+ interactionType: interaction.type,
92
+ isPageVisible: isPageVisible
89
93
  }));
90
- case 20:
94
+ case 21:
91
95
  result = _context.sent;
92
96
  observer.stop(interaction.ufoName);
93
97
  if (!include3p) {
@@ -100,15 +104,15 @@ function _getVCMetrics() {
100
104
  return revision === mostRecentVCRevision;
101
105
  });
102
106
  if (!(!shouldReportVCMetrics || !(mostRecentVCRevisionPayload !== null && mostRecentVCRevisionPayload !== void 0 && mostRecentVCRevisionPayload.clean))) {
103
- _context.next = 27;
107
+ _context.next = 28;
104
108
  break;
105
109
  }
106
110
  return _context.abrupt("return", result);
107
- case 27:
111
+ case 28:
108
112
  return _context.abrupt("return", _objectSpread(_objectSpread({}, result), {}, {
109
113
  'metric:vc90': mostRecentVCRevisionPayload['metric:vc90']
110
114
  }));
111
- case 28:
115
+ case 29:
112
116
  case "end":
113
117
  return _context.stop();
114
118
  }
@@ -588,7 +588,7 @@ var ModuleLoadingProfiler = exports.ModuleLoadingProfiler = {
588
588
  removeHoldByID(currentInteractionId, id);
589
589
  }
590
590
  };
591
- function addError(interactionId, name, labelStack, errorType, errorMessage, errorStack, forcedError) {
591
+ function addError(interactionId, name, labelStack, errorType, errorMessage, errorStack, forcedError, errorHash) {
592
592
  var interaction = _constants.interactions.get(interactionId);
593
593
  if (interaction != null) {
594
594
  interaction.errors.push({
@@ -597,18 +597,20 @@ function addError(interactionId, name, labelStack, errorType, errorMessage, erro
597
597
  errorType: errorType,
598
598
  errorMessage: errorMessage,
599
599
  errorStack: errorStack,
600
- forcedError: forcedError
600
+ forcedError: forcedError,
601
+ errorHash: errorHash
601
602
  });
602
603
  }
603
604
  }
604
- function addErrorToAll(name, labelStack, errorType, errorMessage, errorStack) {
605
+ function addErrorToAll(name, labelStack, errorType, errorMessage, errorStack, errorHash) {
605
606
  _constants.interactions.forEach(function (interaction) {
606
607
  interaction.errors.push({
607
608
  name: name,
608
609
  labelStack: labelStack,
609
610
  errorType: errorType,
610
611
  errorMessage: errorMessage,
611
- errorStack: errorStack
612
+ errorStack: errorStack,
613
+ errorHash: errorHash
612
614
  });
613
615
  });
614
616
  }
@@ -12,6 +12,7 @@ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/creat
12
12
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
13
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
14
14
  var _config = require("../config");
15
+ var _hiddenTiming = require("../hidden-timing");
15
16
  var _vc = require("../vc");
16
17
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
17
18
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
@@ -122,7 +123,7 @@ var PostInteractionLog = exports.default = /*#__PURE__*/function () {
122
123
  value: (function () {
123
124
  var _sendPostInteractionLog = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
124
125
  var _this$vcObserver4, _config$vc, _config$vc2, _this$vcObserver5;
125
- var _this$vcObserver3, config, postInteractionFinishVCResult;
126
+ var _this$vcObserver3, pageVisibilityState, isPageVisible, config, postInteractionFinishVCResult;
126
127
  return _regenerator.default.wrap(function _callee$(_context) {
127
128
  while (1) switch (_context.prev = _context.next) {
128
129
  case 0:
@@ -134,9 +135,11 @@ var PostInteractionLog = exports.default = /*#__PURE__*/function () {
134
135
  (_this$vcObserver3 = this.vcObserver) === null || _this$vcObserver3 === void 0 || _this$vcObserver3.stop();
135
136
  return _context.abrupt("return");
136
137
  case 4:
138
+ pageVisibilityState = (0, _hiddenTiming.getPageVisibilityState)(this.lastInteractionFinish.start, this.lastInteractionFinish.end);
139
+ isPageVisible = pageVisibilityState === 'visible';
137
140
  config = (0, _config.getConfig)();
138
- _context.next = 7;
139
- return (_this$vcObserver4 = this.vcObserver) === null || _this$vcObserver4 === void 0 ? void 0 : _this$vcObserver4.getVCResult(_objectSpread({
141
+ _context.next = 9;
142
+ return (_this$vcObserver4 = this.vcObserver) === null || _this$vcObserver4 === void 0 ? void 0 : _this$vcObserver4.getVCResult(_objectSpread(_objectSpread({
140
143
  start: this.lastInteractionFinish.start,
141
144
  stop: performance.now(),
142
145
  tti: -1,
@@ -147,8 +150,12 @@ var PostInteractionLog = exports.default = /*#__PURE__*/function () {
147
150
  interactionId: this.lastInteractionFinish.id,
148
151
  includeSSRInV3: config === null || config === void 0 || (_config$vc = config.vc) === null || _config$vc === void 0 ? void 0 : _config$vc.includeSSRInV3,
149
152
  includeSSRRatio: config === null || config === void 0 || (_config$vc2 = config.vc) === null || _config$vc2 === void 0 ? void 0 : _config$vc2.includeSSRRatio
150
- }, this.vcObserverSSRConfig));
151
- case 7:
153
+ }, this.vcObserverSSRConfig), {}, {
154
+ interactionType: this.lastInteractionFinish.type,
155
+ isPageVisible: isPageVisible,
156
+ interactionAbortReason: this.lastInteractionFinish.abortReason
157
+ }));
158
+ case 9:
152
159
  postInteractionFinishVCResult = _context.sent;
153
160
  (_this$vcObserver5 = this.vcObserver) === null || _this$vcObserver5 === void 0 || _this$vcObserver5.stop();
154
161
  this.sinkHandlerFn({
@@ -158,7 +165,7 @@ var PostInteractionLog = exports.default = /*#__PURE__*/function () {
158
165
  lastInteractionFinishVCResult: this.lastInteractionFinishVCResult
159
166
  });
160
167
  this.reset();
161
- case 11:
168
+ case 13:
162
169
  case "end":
163
170
  return _context.stop();
164
171
  }
@@ -152,7 +152,10 @@ var VCObserverWrapper = exports.VCObserverWrapper = /*#__PURE__*/function () {
152
152
  interactionId: param.interactionId,
153
153
  ssr: param.includeSSRInV3 ? param.ssr : undefined,
154
154
  include3p: include3p,
155
- excludeSmartAnswersInSearch: excludeSmartAnswersInSearch
155
+ excludeSmartAnswersInSearch: excludeSmartAnswersInSearch,
156
+ interactionType: param.interactionType,
157
+ isPageVisible: param.isPageVisible,
158
+ interactionAbortReason: param.interactionAbortReason
156
159
  });
157
160
  case 12:
158
161
  _context.t1 = _context.sent;
@@ -238,11 +238,11 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
238
238
  key: "getVCResult",
239
239
  value: function () {
240
240
  var _getVCResult = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(param) {
241
- var start, stop, interactionId, include3p, excludeSmartAnswersInSearch, results, calculator_fy25_03, orderedEntries, fy25_03, calculator_next, vcNext;
241
+ var start, stop, interactionId, interactionType, interactionAbortReason, isPageVisible, include3p, excludeSmartAnswersInSearch, results, calculator_fy25_03, orderedEntries, fy25_03, calculator_next, vcNext;
242
242
  return _regenerator.default.wrap(function _callee$(_context) {
243
243
  while (1) switch (_context.prev = _context.next) {
244
244
  case 0:
245
- start = param.start, stop = param.stop, interactionId = param.interactionId, include3p = param.include3p, excludeSmartAnswersInSearch = param.excludeSmartAnswersInSearch;
245
+ start = param.start, stop = param.stop, interactionId = param.interactionId, interactionType = param.interactionType, interactionAbortReason = param.interactionAbortReason, isPageVisible = param.isPageVisible, include3p = param.include3p, excludeSmartAnswersInSearch = param.excludeSmartAnswersInSearch;
246
246
  results = [];
247
247
  this.addStartEntry(start);
248
248
  calculator_fy25_03 = new _fy25_.default();
@@ -259,9 +259,12 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
259
259
  startTime: start,
260
260
  stopTime: stop,
261
261
  interactionId: interactionId,
262
+ interactionType: interactionType,
262
263
  isPostInteraction: this.isPostInteraction,
263
264
  include3p: include3p,
264
- excludeSmartAnswersInSearch: excludeSmartAnswersInSearch
265
+ excludeSmartAnswersInSearch: excludeSmartAnswersInSearch,
266
+ isPageVisible: isPageVisible,
267
+ interactionAbortReason: interactionAbortReason
265
268
  });
266
269
  case 8:
267
270
  fy25_03 = _context.sent;
@@ -281,8 +284,11 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
281
284
  startTime: start,
282
285
  stopTime: stop,
283
286
  interactionId: interactionId,
287
+ interactionType: interactionType,
284
288
  isPostInteraction: this.isPostInteraction,
285
- include3p: include3p
289
+ include3p: include3p,
290
+ isPageVisible: isPageVisible,
291
+ interactionAbortReason: interactionAbortReason
286
292
  });
287
293
  case 14:
288
294
  vcNext = _context.sent;
@@ -13,9 +13,6 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
13
13
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
14
14
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
15
15
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
16
- var _getPageVisibilityUpToTtai = _interopRequireDefault(require("../../../create-payload/utils/get-page-visibility-up-to-ttai"));
17
- var _interactionIdContext = require("../../../interaction-id-context");
18
- var _constants = require("../../../interaction-metrics/common/constants");
19
16
  var _trackDisplayContentOccurrence = require("../viewport-observer/utils/track-display-content-occurrence");
20
17
  var _percentileCalc = require("./percentile-calc");
21
18
  var _getViewportHeight = _interopRequireDefault(require("./utils/get-viewport-height"));
@@ -111,9 +108,9 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
111
108
  }, {
112
109
  key: "calculateWithDebugInfo",
113
110
  value: function () {
114
- var _calculateWithDebugInfo = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(filteredEntries, startTime, stopTime, isPostInteraction, isVCClean, interactionId, dirtyReason, allEntries, include3p, excludeSmartAnswersInSearch) {
111
+ var _calculateWithDebugInfo = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(filteredEntries, startTime, stopTime, isPostInteraction, isVCClean, interactionType, isPageVisible, interactionId, dirtyReason, allEntries, include3p, excludeSmartAnswersInSearch, interactionAbortReason) {
115
112
  var _window, _window2, _window6, _window8;
116
- var percentiles, viewportEntries, vcLogs, vcDetails, percentileIndex, entryDataBuffer, _iterator4, _step4, _entry3, time, viewportPercentage, entries, elementNames, previousResult, i, percentile, enhancedVcLogs, shouldCalculate3p, shouldCalculateDebugDetails, _window3, _window4, _window5, sortedVcLogs, maxViewportPercentageAtTime, maxSoFar, _iterator5, _step5, log, getBiggestPreviousViewportPercentage, ignoredEntriesByTime, _iterator6, _step6, _entry4, _ignoredEntriesByTime, _viewportData$rect, _viewportData$previou, viewportData, timestamp, additionalVcLogs, _iterator7, _step7, _step7$value, _timestamp, ignoredEntries, _viewportPercentage, v3RevisionDebugDetails, _activeInteractionId$, activeInteractionId, activeInteraction, pageVisibilityUpToTTAI, isBackgrounded, _window7, _window7$__ufo_devtoo, _window9, _window9$__on_ufo_vc_;
113
+ var percentiles, viewportEntries, vcLogs, vcDetails, percentileIndex, entryDataBuffer, _iterator4, _step4, _entry3, time, viewportPercentage, entries, elementNames, previousResult, i, percentile, enhancedVcLogs, shouldCalculate3p, shouldCalculateDebugDetails, _window3, _window4, _window5, sortedVcLogs, maxViewportPercentageAtTime, maxSoFar, _iterator5, _step5, log, getBiggestPreviousViewportPercentage, ignoredEntriesByTime, _iterator6, _step6, _entry4, _ignoredEntriesByTime, _viewportData$rect, _viewportData$previou, viewportData, timestamp, additionalVcLogs, _iterator7, _step7, _step7$value, _timestamp, ignoredEntries, _viewportPercentage, v3RevisionDebugDetails, _window7, _window7$__ufo_devtoo, _window9, _window9$__on_ufo_vc_;
117
114
  return _regenerator.default.wrap(function _callee$(_context) {
118
115
  while (1) switch (_context.prev = _context.next) {
119
116
  case 0:
@@ -314,17 +311,13 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
314
311
  v3RevisionDebugDetails = null;
315
312
  if (shouldCalculateDebugDetails) {
316
313
  if ((0, _platformFeatureFlags.fg)('platform_ufo_unify_abort_status_in_ttvc_debug_data')) {
317
- // NOTE: using this instead of directly calling `getActiveInteraction()` to get around circular dependencies
318
- activeInteractionId = (0, _interactionIdContext.getInteractionId)();
319
- activeInteraction = _constants.interactions.get((_activeInteractionId$ = activeInteractionId.current) !== null && _activeInteractionId$ !== void 0 ? _activeInteractionId$ : '');
320
- pageVisibilityUpToTTAI = activeInteraction ? (0, _getPageVisibilityUpToTtai.default)(activeInteraction) : null;
321
- isBackgrounded = pageVisibilityUpToTTAI !== 'visible';
322
314
  v3RevisionDebugDetails = {
323
315
  revision: this.revisionNo,
324
- isClean: isVCClean && !(activeInteraction !== null && activeInteraction !== void 0 && activeInteraction.abortReason) && !isBackgrounded,
325
- abortReason: isBackgrounded ? 'browser_backgrounded' : dirtyReason !== null && dirtyReason !== void 0 ? dirtyReason : activeInteraction === null || activeInteraction === void 0 ? void 0 : activeInteraction.abortReason,
316
+ isClean: isVCClean && !interactionAbortReason && isPageVisible,
317
+ abortReason: !isPageVisible ? 'browser_backgrounded' : dirtyReason !== null && dirtyReason !== void 0 ? dirtyReason : interactionAbortReason,
326
318
  vcLogs: enhancedVcLogs,
327
- interactionId: interactionId
319
+ interactionId: interactionId,
320
+ interactionType: interactionType
328
321
  };
329
322
  } else {
330
323
  v3RevisionDebugDetails = {
@@ -371,7 +364,7 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
371
364
  }
372
365
  }, _callee, this, [[10, 22, 25, 28]]);
373
366
  }));
374
- function calculateWithDebugInfo(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8, _x9, _x0) {
367
+ function calculateWithDebugInfo(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8, _x9, _x0, _x1, _x10, _x11) {
375
368
  return _calculateWithDebugInfo.apply(this, arguments);
376
369
  }
377
370
  return calculateWithDebugInfo;
@@ -383,11 +376,11 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
383
376
  var _this = this,
384
377
  _vcDetails$90$t,
385
378
  _vcDetails$;
386
- var startTime, stopTime, orderedEntries, interactionId, isPostInteraction, include3p, excludeSmartAnswersInSearch, filteredEntries, isVCClean, dirtyReason, getVCCleanStatusResult, vcDetails, result;
379
+ var startTime, stopTime, orderedEntries, interactionId, isPostInteraction, include3p, excludeSmartAnswersInSearch, interactionType, isPageVisible, interactionAbortReason, filteredEntries, isVCClean, dirtyReason, getVCCleanStatusResult, vcDetails, result;
387
380
  return _regenerator.default.wrap(function _callee2$(_context2) {
388
381
  while (1) switch (_context2.prev = _context2.next) {
389
382
  case 0:
390
- startTime = _ref.startTime, stopTime = _ref.stopTime, orderedEntries = _ref.orderedEntries, interactionId = _ref.interactionId, isPostInteraction = _ref.isPostInteraction, include3p = _ref.include3p, excludeSmartAnswersInSearch = _ref.excludeSmartAnswersInSearch;
383
+ startTime = _ref.startTime, stopTime = _ref.stopTime, orderedEntries = _ref.orderedEntries, interactionId = _ref.interactionId, isPostInteraction = _ref.isPostInteraction, include3p = _ref.include3p, excludeSmartAnswersInSearch = _ref.excludeSmartAnswersInSearch, interactionType = _ref.interactionType, isPageVisible = _ref.isPageVisible, interactionAbortReason = _ref.interactionAbortReason;
391
384
  filteredEntries = orderedEntries.filter(function (entry) {
392
385
  return _this.isEntryIncluded(entry, include3p, excludeSmartAnswersInSearch);
393
386
  });
@@ -407,7 +400,7 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
407
400
  });
408
401
  case 7:
409
402
  _context2.next = 9;
410
- return this.calculateWithDebugInfo(filteredEntries, startTime, stopTime, isPostInteraction, isVCClean, interactionId, dirtyReason, orderedEntries, include3p, excludeSmartAnswersInSearch);
403
+ return this.calculateWithDebugInfo(filteredEntries, startTime, stopTime, isPostInteraction, isVCClean, interactionType, isPageVisible, interactionId, dirtyReason, orderedEntries, include3p, excludeSmartAnswersInSearch, interactionAbortReason);
411
404
  case 9:
412
405
  vcDetails = _context2.sent;
413
406
  result = {
@@ -430,7 +423,7 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
430
423
  }
431
424
  }, _callee2, this);
432
425
  }));
433
- function calculate(_x1) {
426
+ function calculate(_x12) {
434
427
  return _calculate.apply(this, arguments);
435
428
  }
436
429
  return calculate;
@@ -21,6 +21,7 @@ var _mutationObserver = _interopRequireDefault(require("./mutation-observer"));
21
21
  var _performanceObserver = _interopRequireDefault(require("./performance-observer"));
22
22
  var _checkDisplayContent = _interopRequireDefault(require("./utils/check-display-content"));
23
23
  var _checkWithinComponent2 = _interopRequireWildcard(require("./utils/check-within-component"));
24
+ var _getMutatedElements = require("./utils/get-mutated-elements");
24
25
  var _isInVcIgnoreIfNoLayoutShiftMarker = _interopRequireDefault(require("./utils/is-in-vc-ignore-if-no-layout-shift-marker"));
25
26
  var _trackDisplayContentOccurrence = _interopRequireDefault(require("./utils/track-display-content-occurrence"));
26
27
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
@@ -126,7 +127,7 @@ var ViewportObserver = exports.default = /*#__PURE__*/function () {
126
127
  _iterator = _createForOfIteratorHelper(addedNodes);
127
128
  _context2.prev = 4;
128
129
  _loop = /*#__PURE__*/_regenerator.default.mark(function _loop() {
129
- var addedNodeRef, addedNode, ssrState, SSRStateEnum, _this$intersectionObs, _this$intersectionObs2, ssrPlaceholderHandler, _this$intersectionObs3, result, _this$intersectionObs4, sameDeletedNode, isInIgnoreLsMarker, _this$intersectionObs5, _this$intersectionObs6, _checkWithinComponent, isWithinThirdPartySegment, _this$intersectionObs7, _window, _iterator2, _step2, child, _this$intersectionObs8, _this$intersectionObs9, validTargets, _iterator3, _step3, _this$intersectionObs0, validTarget, _this$intersectionObs1;
130
+ var addedNodeRef, addedNode, ssrState, SSRStateEnum, _this$intersectionObs, _this$intersectionObs2, ssrPlaceholderHandler, _this$intersectionObs3, result, _this$intersectionObs4, sameDeletedNode, isInIgnoreLsMarker, _this$intersectionObs5, _this$intersectionObs6, _checkWithinComponent, isWithinThirdPartySegment, _this$intersectionObs7, _iterator2, _step2, _step2$value, isDisplayContentsElementChildren, element, _this$intersectionObs8, _this$intersectionObs9, validTargets, _iterator3, _step3, _this$intersectionObs0, validTarget, _this$intersectionObs1;
130
131
  return _regenerator.default.wrap(function _loop$(_context) {
131
132
  while (1) switch (_context.prev = _context.next) {
132
133
  case 0:
@@ -239,22 +240,20 @@ var ViewportObserver = exports.default = /*#__PURE__*/function () {
239
240
  return _context.abrupt("return", 0);
240
241
  case 45:
241
242
  if ((0, _platformFeatureFlags.fg)('platform_ufo_vcnext_v4_enabled')) {
242
- if (((_window = window) === null || _window === void 0 || (_window = _window.getComputedStyle(addedNode)) === null || _window === void 0 ? void 0 : _window.display) === 'contents') {
243
- _iterator2 = _createForOfIteratorHelper(addedNode.children);
244
- try {
245
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
246
- child = _step2.value;
247
- if (child instanceof HTMLElement) {
248
- (_this$intersectionObs8 = _this.intersectionObserver) === null || _this$intersectionObs8 === void 0 || _this$intersectionObs8.watchAndTag(child, 'mutation:display-contents-children-element');
249
- }
243
+ _iterator2 = _createForOfIteratorHelper((0, _getMutatedElements.getMutatedElements)(addedNode));
244
+ try {
245
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
246
+ _step2$value = _step2.value, isDisplayContentsElementChildren = _step2$value.isDisplayContentsElementChildren, element = _step2$value.element;
247
+ if (isDisplayContentsElementChildren) {
248
+ (_this$intersectionObs8 = _this.intersectionObserver) === null || _this$intersectionObs8 === void 0 || _this$intersectionObs8.watchAndTag(element, 'mutation:display-contents-children-element');
249
+ } else {
250
+ (_this$intersectionObs9 = _this.intersectionObserver) === null || _this$intersectionObs9 === void 0 || _this$intersectionObs9.watchAndTag(element, createElementMutationsWatcher(removedNodeRects));
250
251
  }
251
- } catch (err) {
252
- _iterator2.e(err);
253
- } finally {
254
- _iterator2.f();
255
252
  }
256
- } else {
257
- (_this$intersectionObs9 = _this.intersectionObserver) === null || _this$intersectionObs9 === void 0 || _this$intersectionObs9.watchAndTag(addedNode, createElementMutationsWatcher(removedNodeRects));
253
+ } catch (err) {
254
+ _iterator2.e(err);
255
+ } finally {
256
+ _iterator2.f();
258
257
  }
259
258
  } else {
260
259
  if ((0, _platformFeatureFlags.fg)('platform_ufo_display_content_resolution_ttvc_v3')) {
@@ -401,7 +400,6 @@ var ViewportObserver = exports.default = /*#__PURE__*/function () {
401
400
  }
402
401
  };
403
402
  });
404
- // }
405
403
  });
406
404
  (0, _defineProperty2.default)(this, "handleLayoutShift", function (_ref8) {
407
405
  var time = _ref8.time,
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.getMutatedElements = getMutatedElements;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
10
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
11
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
12
+ var MAX_NESTED_LEVELS_OF_DISPLAY_CONTENT_ELEMENTS_HANDLED = 3;
13
+ function getMutatedElements(element) {
14
+ var _window;
15
+ var depthLevel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
16
+ if (((_window = window) === null || _window === void 0 || (_window = _window.getComputedStyle(element)) === null || _window === void 0 ? void 0 : _window.display) === 'contents') {
17
+ var mutatedElements = [];
18
+ var nestedDisplayContentsElementChildren = [];
19
+ var _iterator = _createForOfIteratorHelper(element.children),
20
+ _step;
21
+ try {
22
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
23
+ var _window2;
24
+ var child = _step.value;
25
+ if (((_window2 = window) === null || _window2 === void 0 || (_window2 = _window2.getComputedStyle(child)) === null || _window2 === void 0 ? void 0 : _window2.display) === 'contents') {
26
+ nestedDisplayContentsElementChildren.push(child);
27
+ }
28
+ mutatedElements.push({
29
+ element: child,
30
+ isDisplayContentsElementChildren: true
31
+ });
32
+ }
33
+ } catch (err) {
34
+ _iterator.e(err);
35
+ } finally {
36
+ _iterator.f();
37
+ }
38
+ if (depthLevel < MAX_NESTED_LEVELS_OF_DISPLAY_CONTENT_ELEMENTS_HANDLED && nestedDisplayContentsElementChildren.length > 0) {
39
+ return [].concat(mutatedElements, (0, _toConsumableArray2.default)(nestedDisplayContentsElementChildren.map(function (element) {
40
+ return getMutatedElements(element, depthLevel + 1);
41
+ }).flat()));
42
+ }
43
+ return mutatedElements;
44
+ } else {
45
+ return [{
46
+ element: element,
47
+ isDisplayContentsElementChildren: false
48
+ }];
49
+ }
50
+ }
@@ -60,6 +60,7 @@ export const experimentalVC = new ExperimentalVCMetrics();
60
60
  export async function getExperimentalVCMetrics(interaction) {
61
61
  // Use per-interaction VC observer if available, otherwise fall back to global experimentalVC
62
62
  const vcObserver = interaction.experimentalVCObserver || experimentalVC.vcObserver;
63
+ const pageVisibilityUpToTTAI = getPageVisibilityState(interaction.start, interaction.end);
63
64
  if (vcObserver) {
64
65
  var _interaction$apdex, _interaction$apdex$;
65
66
  const prefix = 'ufo-experimental';
@@ -71,13 +72,15 @@ export async function getExperimentalVCMetrics(interaction) {
71
72
  prefix,
72
73
  vc: interaction.vc,
73
74
  experienceKey: interaction.ufoName,
74
- interactionId: interaction.id
75
+ interactionId: interaction.id,
76
+ interactionType: interaction.type,
77
+ isPageVisible: pageVisibilityUpToTTAI === 'visible',
78
+ interactionAbortReason: interaction.abortReason
75
79
  });
76
80
  const VC = result === null || result === void 0 ? void 0 : result['metrics:vc'];
77
81
  if (!VC || !(result !== null && result !== void 0 && result[`${prefix}:vc:clean`])) {
78
82
  return result;
79
83
  }
80
- const pageVisibilityUpToTTAI = getPageVisibilityState(interaction.start, interaction.end);
81
84
  if (interaction.abortReason || pageVisibilityUpToTTAI !== 'visible') {
82
85
  return result;
83
86
  }
@@ -14,7 +14,8 @@ async function getVCMetrics(interaction, include3p = false, excludeSmartAnswersI
14
14
  }
15
15
  const interactionStatus = getInteractionStatus(interaction);
16
16
  const pageVisibilityUpToTTAI = getPageVisibilityUpToTTAI(interaction);
17
- const shouldReportVCMetrics = interactionStatus.originalInteractionStatus === 'SUCCEEDED' && pageVisibilityUpToTTAI === 'visible';
17
+ const isPageVisible = pageVisibilityUpToTTAI === 'visible';
18
+ const shouldReportVCMetrics = interactionStatus.originalInteractionStatus === 'SUCCEEDED' && isPageVisible;
18
19
 
19
20
  // Use per-interaction VC observer if available, otherwise fall back to global
20
21
  const observer = interaction.vcObserver;
@@ -41,7 +42,9 @@ async function getVCMetrics(interaction, include3p = false, excludeSmartAnswersI
41
42
  includeSSRRatio: (_config$vc3 = config.vc) === null || _config$vc3 === void 0 ? void 0 : _config$vc3.includeSSRRatio,
42
43
  ...ssr,
43
44
  include3p,
44
- excludeSmartAnswersInSearch
45
+ excludeSmartAnswersInSearch,
46
+ interactionType: interaction.type,
47
+ isPageVisible
45
48
  });
46
49
  observer.stop(interaction.ufoName);
47
50
  if (!include3p) {
@@ -507,7 +507,7 @@ export const ModuleLoadingProfiler = {
507
507
  removeHoldByID(currentInteractionId, id);
508
508
  }
509
509
  };
510
- export function addError(interactionId, name, labelStack, errorType, errorMessage, errorStack, forcedError) {
510
+ export function addError(interactionId, name, labelStack, errorType, errorMessage, errorStack, forcedError, errorHash) {
511
511
  const interaction = interactions.get(interactionId);
512
512
  if (interaction != null) {
513
513
  interaction.errors.push({
@@ -516,18 +516,20 @@ export function addError(interactionId, name, labelStack, errorType, errorMessag
516
516
  errorType,
517
517
  errorMessage,
518
518
  errorStack,
519
- forcedError
519
+ forcedError,
520
+ errorHash
520
521
  });
521
522
  }
522
523
  }
523
- export function addErrorToAll(name, labelStack, errorType, errorMessage, errorStack) {
524
+ export function addErrorToAll(name, labelStack, errorType, errorMessage, errorStack, errorHash) {
524
525
  interactions.forEach(interaction => {
525
526
  interaction.errors.push({
526
527
  name,
527
528
  labelStack,
528
529
  errorType,
529
530
  errorMessage,
530
- errorStack
531
+ errorStack,
532
+ errorHash
531
533
  });
532
534
  });
533
535
  }
@@ -1,6 +1,7 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  import { fg } from '@atlaskit/platform-feature-flags';
3
3
  import { getConfig } from '../config';
4
+ import { getPageVisibilityState } from '../hidden-timing';
4
5
  import { VCObserverWrapper } from '../vc';
5
6
  const POST_INTERACTION_LOG_SEND_DEFAULT_TIMEOUT = 3000;
6
7
  export default class PostInteractionLog {
@@ -96,6 +97,8 @@ export default class PostInteractionLog {
96
97
  (_this$vcObserver3 = this.vcObserver) === null || _this$vcObserver3 === void 0 ? void 0 : _this$vcObserver3.stop();
97
98
  return;
98
99
  }
100
+ const pageVisibilityState = getPageVisibilityState(this.lastInteractionFinish.start, this.lastInteractionFinish.end);
101
+ const isPageVisible = pageVisibilityState === 'visible';
99
102
  const config = getConfig();
100
103
  const postInteractionFinishVCResult = await ((_this$vcObserver4 = this.vcObserver) === null || _this$vcObserver4 === void 0 ? void 0 : _this$vcObserver4.getVCResult({
101
104
  start: this.lastInteractionFinish.start,
@@ -108,7 +111,10 @@ export default class PostInteractionLog {
108
111
  interactionId: this.lastInteractionFinish.id,
109
112
  includeSSRInV3: config === null || config === void 0 ? void 0 : (_config$vc = config.vc) === null || _config$vc === void 0 ? void 0 : _config$vc.includeSSRInV3,
110
113
  includeSSRRatio: config === null || config === void 0 ? void 0 : (_config$vc2 = config.vc) === null || _config$vc2 === void 0 ? void 0 : _config$vc2.includeSSRRatio,
111
- ...this.vcObserverSSRConfig
114
+ ...this.vcObserverSSRConfig,
115
+ interactionType: this.lastInteractionFinish.type,
116
+ isPageVisible,
117
+ interactionAbortReason: this.lastInteractionFinish.abortReason
112
118
  }));
113
119
  (_this$vcObserver5 = this.vcObserver) === null || _this$vcObserver5 === void 0 ? void 0 : _this$vcObserver5.stop();
114
120
  this.sinkHandlerFn({
@@ -105,7 +105,10 @@ export class VCObserverWrapper {
105
105
  interactionId: param.interactionId,
106
106
  ssr: param.includeSSRInV3 ? param.ssr : undefined,
107
107
  include3p,
108
- excludeSmartAnswersInSearch
108
+ excludeSmartAnswersInSearch,
109
+ interactionType: param.interactionType,
110
+ isPageVisible: param.isPageVisible,
111
+ interactionAbortReason: param.interactionAbortReason
109
112
  })) : [];
110
113
  if (!v3Result) {
111
114
  return v1v2Result !== null && v1v2Result !== void 0 ? v1v2Result : {};