@atlaskit/react-ufo 3.10.3 → 3.11.0

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 +16 -0
  2. package/dist/cjs/config/index.js +51 -5
  3. package/dist/cjs/create-experimental-interaction-metrics-payload/index.js +2 -1
  4. package/dist/cjs/create-payload/utils/get-vc-metrics.js +41 -20
  5. package/dist/cjs/interaction-metrics/index.js +2 -1
  6. package/dist/cjs/interaction-metrics/post-interaction-log.js +4 -2
  7. package/dist/cjs/vc/index.js +123 -35
  8. package/dist/cjs/vc/vc-observer/getVCRevisionsData.js +48 -23
  9. package/dist/cjs/vc/vc-observer/index.js +17 -6
  10. package/dist/cjs/vc/vc-observer-new/entries-timeline/index.js +1 -3
  11. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.js +25 -7
  12. package/dist/cjs/vc/vc-observer-new/viewport-observer/index.js +136 -115
  13. package/dist/es2019/config/index.js +49 -6
  14. package/dist/es2019/create-experimental-interaction-metrics-payload/index.js +2 -1
  15. package/dist/es2019/create-payload/utils/get-vc-metrics.js +36 -19
  16. package/dist/es2019/interaction-metrics/index.js +2 -1
  17. package/dist/es2019/interaction-metrics/post-interaction-log.js +2 -1
  18. package/dist/es2019/vc/index.js +98 -35
  19. package/dist/es2019/vc/vc-observer/getVCRevisionsData.js +52 -25
  20. package/dist/es2019/vc/vc-observer/index.js +18 -6
  21. package/dist/es2019/vc/vc-observer-new/entries-timeline/index.js +1 -3
  22. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.js +23 -7
  23. package/dist/es2019/vc/vc-observer-new/viewport-observer/index.js +122 -103
  24. package/dist/esm/config/index.js +49 -5
  25. package/dist/esm/create-experimental-interaction-metrics-payload/index.js +2 -1
  26. package/dist/esm/create-payload/utils/get-vc-metrics.js +42 -21
  27. package/dist/esm/interaction-metrics/index.js +2 -1
  28. package/dist/esm/interaction-metrics/post-interaction-log.js +4 -2
  29. package/dist/esm/vc/index.js +123 -35
  30. package/dist/esm/vc/vc-observer/getVCRevisionsData.js +48 -23
  31. package/dist/esm/vc/vc-observer/index.js +17 -6
  32. package/dist/esm/vc/vc-observer-new/entries-timeline/index.js +1 -3
  33. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.js +25 -7
  34. package/dist/esm/vc/vc-observer-new/viewport-observer/index.js +136 -115
  35. package/dist/types/config/index.d.ts +14 -3
  36. package/dist/types/create-post-interaction-log-payload/index.d.ts +2 -2
  37. package/dist/types/vc/types.d.ts +3 -1
  38. package/dist/types/vc/vc-observer/getVCRevisionsData.d.ts +5 -3
  39. package/dist/types/vc/vc-observer/index.d.ts +1 -1
  40. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.d.ts +8 -3
  41. package/dist/types/vc/vc-observer-new/viewport-observer/index.d.ts +8 -1
  42. package/dist/types-ts4.5/config/index.d.ts +14 -3
  43. package/dist/types-ts4.5/create-post-interaction-log-payload/index.d.ts +2 -2
  44. package/dist/types-ts4.5/vc/types.d.ts +3 -1
  45. package/dist/types-ts4.5/vc/vc-observer/getVCRevisionsData.d.ts +5 -3
  46. package/dist/types-ts4.5/vc/vc-observer/index.d.ts +1 -1
  47. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.d.ts +8 -3
  48. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/index.d.ts +8 -1
  49. package/package.json +7 -1
@@ -7,6 +7,7 @@ var _process;
7
7
  import _regeneratorRuntime from "@babel/runtime/regenerator";
8
8
  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; }
9
9
  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) { _defineProperty(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; }
10
+ import { fg } from '@atlaskit/platform-feature-flags';
10
11
  import { isVCRevisionEnabled } from '../config';
11
12
  import { VCObserverNOOP } from './no-op-vc-observer';
12
13
  import { VCObserver } from './vc-observer';
@@ -16,65 +17,152 @@ var VCObserverWrapper = /*#__PURE__*/function () {
16
17
  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
17
18
  _classCallCheck(this, VCObserverWrapper);
18
19
  this.newVCObserver = null;
19
- if (isVCRevisionEnabled('fy25.03')) {
20
- this.newVCObserver = new VCObserverNew({
21
- selectorConfig: opts.selectorConfig
22
- });
20
+ if (fg('platform_ufo_vc_enable_revisions_by_experience')) {
21
+ this.oldVCObserver = null;
22
+ if (isVCRevisionEnabled('fy25.03')) {
23
+ this.newVCObserver = new VCObserverNew({
24
+ selectorConfig: opts.selectorConfig
25
+ });
26
+ }
27
+ if (isVCRevisionEnabled('fy25.01') || isVCRevisionEnabled('fy25.02')) {
28
+ this.oldVCObserver = new VCObserver(opts);
29
+ }
30
+ } else {
31
+ if (isVCRevisionEnabled('fy25.03')) {
32
+ this.newVCObserver = new VCObserverNew({
33
+ selectorConfig: opts.selectorConfig
34
+ });
35
+ }
36
+ this.oldVCObserver = new VCObserver(opts);
23
37
  }
24
- this.oldVCObserver = new VCObserver(opts);
25
38
  }
26
39
  return _createClass(VCObserverWrapper, [{
27
40
  key: "start",
28
- value: function start(startArg) {
29
- var _this$oldVCObserver, _this$newVCObserver;
30
- (_this$oldVCObserver = this.oldVCObserver) === null || _this$oldVCObserver === void 0 || _this$oldVCObserver.start(startArg);
31
- (_this$newVCObserver = this.newVCObserver) === null || _this$newVCObserver === void 0 || _this$newVCObserver.start({
32
- startTime: startArg.startTime
33
- });
41
+ value: function start(_ref) {
42
+ var startTime = _ref.startTime,
43
+ experienceKey = _ref.experienceKey;
44
+ if (fg('platform_ufo_vc_enable_revisions_by_experience')) {
45
+ if (isVCRevisionEnabled('fy25.01', experienceKey) || isVCRevisionEnabled('fy25.02', experienceKey)) {
46
+ var _this$oldVCObserver;
47
+ (_this$oldVCObserver = this.oldVCObserver) === null || _this$oldVCObserver === void 0 || _this$oldVCObserver.start({
48
+ startTime: startTime
49
+ });
50
+ }
51
+ if (isVCRevisionEnabled('fy25.03', experienceKey)) {
52
+ var _this$newVCObserver;
53
+ (_this$newVCObserver = this.newVCObserver) === null || _this$newVCObserver === void 0 || _this$newVCObserver.start({
54
+ startTime: startTime
55
+ });
56
+ }
57
+ } else {
58
+ var _this$oldVCObserver2, _this$newVCObserver2;
59
+ (_this$oldVCObserver2 = this.oldVCObserver) === null || _this$oldVCObserver2 === void 0 || _this$oldVCObserver2.start({
60
+ startTime: startTime
61
+ });
62
+ (_this$newVCObserver2 = this.newVCObserver) === null || _this$newVCObserver2 === void 0 || _this$newVCObserver2.start({
63
+ startTime: startTime
64
+ });
65
+ }
34
66
  }
35
67
  }, {
36
68
  key: "stop",
37
- value: function stop() {
38
- var _this$oldVCObserver2, _this$newVCObserver2;
39
- (_this$oldVCObserver2 = this.oldVCObserver) === null || _this$oldVCObserver2 === void 0 || _this$oldVCObserver2.stop();
40
- (_this$newVCObserver2 = this.newVCObserver) === null || _this$newVCObserver2 === void 0 || _this$newVCObserver2.stop();
69
+ value: function stop(experienceKey) {
70
+ if (fg('platform_ufo_vc_enable_revisions_by_experience')) {
71
+ if (isVCRevisionEnabled('fy25.01', experienceKey) || isVCRevisionEnabled('fy25.02', experienceKey)) {
72
+ var _this$oldVCObserver3;
73
+ (_this$oldVCObserver3 = this.oldVCObserver) === null || _this$oldVCObserver3 === void 0 || _this$oldVCObserver3.stop();
74
+ }
75
+ if (isVCRevisionEnabled('fy25.03', experienceKey)) {
76
+ var _this$newVCObserver3;
77
+ (_this$newVCObserver3 = this.newVCObserver) === null || _this$newVCObserver3 === void 0 || _this$newVCObserver3.stop();
78
+ }
79
+ } else {
80
+ var _this$oldVCObserver4, _this$newVCObserver4;
81
+ (_this$oldVCObserver4 = this.oldVCObserver) === null || _this$oldVCObserver4 === void 0 || _this$oldVCObserver4.stop();
82
+ (_this$newVCObserver4 = this.newVCObserver) === null || _this$newVCObserver4 === void 0 || _this$newVCObserver4.stop();
83
+ }
41
84
  }
42
85
  }, {
43
86
  key: "getVCRawData",
44
87
  value: function getVCRawData() {
45
- var _this$oldVCObserver$g, _this$oldVCObserver3;
46
- return (_this$oldVCObserver$g = (_this$oldVCObserver3 = this.oldVCObserver) === null || _this$oldVCObserver3 === void 0 ? void 0 : _this$oldVCObserver3.getVCRawData()) !== null && _this$oldVCObserver$g !== void 0 ? _this$oldVCObserver$g : null;
88
+ var _this$oldVCObserver$g, _this$oldVCObserver5;
89
+ return (_this$oldVCObserver$g = (_this$oldVCObserver5 = this.oldVCObserver) === null || _this$oldVCObserver5 === void 0 ? void 0 : _this$oldVCObserver5.getVCRawData()) !== null && _this$oldVCObserver$g !== void 0 ? _this$oldVCObserver$g : null;
47
90
  }
48
91
  }, {
49
92
  key: "getVCResult",
50
93
  value: function () {
51
94
  var _getVCResult = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(param) {
52
- var _this$oldVCObserver4, _this$newVCObserver3, _ref;
53
- var oldResult, newResult;
95
+ var _this$oldVCObserver6, _this$newVCObserver5, _ref2, experienceKey, v1v2Result, v3Result, _this$oldVCObserver7, _this$newVCObserver6, _ref3, oldResult, newResult;
54
96
  return _regeneratorRuntime.wrap(function _callee$(_context) {
55
97
  while (1) switch (_context.prev = _context.next) {
56
98
  case 0:
57
- _context.next = 2;
58
- return (_this$oldVCObserver4 = this.oldVCObserver) === null || _this$oldVCObserver4 === void 0 ? void 0 : _this$oldVCObserver4.getVCResult(param);
59
- case 2:
60
- oldResult = _context.sent;
99
+ if (!fg('platform_ufo_vc_enable_revisions_by_experience')) {
100
+ _context.next = 23;
101
+ break;
102
+ }
103
+ experienceKey = param.experienceKey;
104
+ if (!(isVCRevisionEnabled('fy25.01', experienceKey) || isVCRevisionEnabled('fy25.02', experienceKey))) {
105
+ _context.next = 8;
106
+ break;
107
+ }
61
108
  _context.next = 5;
62
- return (_this$newVCObserver3 = this.newVCObserver) === null || _this$newVCObserver3 === void 0 ? void 0 : _this$newVCObserver3.getVCResult({
109
+ return (_this$oldVCObserver6 = this.oldVCObserver) === null || _this$oldVCObserver6 === void 0 ? void 0 : _this$oldVCObserver6.getVCResult(param);
110
+ case 5:
111
+ _context.t0 = _context.sent;
112
+ _context.next = 9;
113
+ break;
114
+ case 8:
115
+ _context.t0 = {};
116
+ case 9:
117
+ v1v2Result = _context.t0;
118
+ if (!isVCRevisionEnabled('fy25.03', experienceKey)) {
119
+ _context.next = 16;
120
+ break;
121
+ }
122
+ _context.next = 13;
123
+ return (_this$newVCObserver5 = this.newVCObserver) === null || _this$newVCObserver5 === void 0 ? void 0 : _this$newVCObserver5.getVCResult({
63
124
  start: param.start,
64
125
  stop: param.stop
65
126
  });
66
- case 5:
127
+ case 13:
128
+ _context.t1 = _context.sent;
129
+ _context.next = 17;
130
+ break;
131
+ case 16:
132
+ _context.t1 = [];
133
+ case 17:
134
+ v3Result = _context.t1;
135
+ if (v3Result) {
136
+ _context.next = 20;
137
+ break;
138
+ }
139
+ return _context.abrupt("return", v1v2Result !== null && v1v2Result !== void 0 ? v1v2Result : {});
140
+ case 20:
141
+ return _context.abrupt("return", _objectSpread(_objectSpread({}, v1v2Result), {}, {
142
+ 'ufo:vc:rev': [].concat(_toConsumableArray((_ref2 = v1v2Result === null || v1v2Result === void 0 ? void 0 : v1v2Result['ufo:vc:rev']) !== null && _ref2 !== void 0 ? _ref2 : []), _toConsumableArray(v3Result !== null && v3Result !== void 0 ? v3Result : []))
143
+ }));
144
+ case 23:
145
+ _context.next = 25;
146
+ return (_this$oldVCObserver7 = this.oldVCObserver) === null || _this$oldVCObserver7 === void 0 ? void 0 : _this$oldVCObserver7.getVCResult(param);
147
+ case 25:
148
+ oldResult = _context.sent;
149
+ _context.next = 28;
150
+ return (_this$newVCObserver6 = this.newVCObserver) === null || _this$newVCObserver6 === void 0 ? void 0 : _this$newVCObserver6.getVCResult({
151
+ start: param.start,
152
+ stop: param.stop
153
+ });
154
+ case 28:
67
155
  newResult = _context.sent;
68
156
  if (!(oldResult && !newResult)) {
69
- _context.next = 8;
157
+ _context.next = 31;
70
158
  break;
71
159
  }
72
160
  return _context.abrupt("return", oldResult);
73
- case 8:
161
+ case 31:
74
162
  return _context.abrupt("return", _objectSpread(_objectSpread({}, oldResult !== null && oldResult !== void 0 ? oldResult : {}), {}, {
75
- 'ufo:vc:rev': [].concat(_toConsumableArray((_ref = oldResult === null || oldResult === void 0 ? void 0 : oldResult['ufo:vc:rev']) !== null && _ref !== void 0 ? _ref : []), _toConsumableArray(newResult !== null && newResult !== void 0 ? newResult : []))
163
+ 'ufo:vc:rev': [].concat(_toConsumableArray((_ref3 = oldResult === null || oldResult === void 0 ? void 0 : oldResult['ufo:vc:rev']) !== null && _ref3 !== void 0 ? _ref3 : []), _toConsumableArray(newResult !== null && newResult !== void 0 ? newResult : []))
76
164
  }));
77
- case 9:
165
+ case 32:
78
166
  case "end":
79
167
  return _context.stop();
80
168
  }
@@ -88,20 +176,20 @@ var VCObserverWrapper = /*#__PURE__*/function () {
88
176
  }, {
89
177
  key: "setSSRElement",
90
178
  value: function setSSRElement(element) {
91
- var _this$oldVCObserver5;
92
- (_this$oldVCObserver5 = this.oldVCObserver) === null || _this$oldVCObserver5 === void 0 || _this$oldVCObserver5.setSSRElement(element);
179
+ var _this$oldVCObserver8;
180
+ (_this$oldVCObserver8 = this.oldVCObserver) === null || _this$oldVCObserver8 === void 0 || _this$oldVCObserver8.setSSRElement(element);
93
181
  }
94
182
  }, {
95
183
  key: "setReactRootRenderStart",
96
184
  value: function setReactRootRenderStart(startTime) {
97
- var _this$oldVCObserver6;
98
- (_this$oldVCObserver6 = this.oldVCObserver) === null || _this$oldVCObserver6 === void 0 || _this$oldVCObserver6.setReactRootRenderStart(startTime || performance.now());
185
+ var _this$oldVCObserver9;
186
+ (_this$oldVCObserver9 = this.oldVCObserver) === null || _this$oldVCObserver9 === void 0 || _this$oldVCObserver9.setReactRootRenderStart(startTime || performance.now());
99
187
  }
100
188
  }, {
101
189
  key: "setReactRootRenderStop",
102
190
  value: function setReactRootRenderStop(stopTime) {
103
- var _this$oldVCObserver7;
104
- (_this$oldVCObserver7 = this.oldVCObserver) === null || _this$oldVCObserver7 === void 0 || _this$oldVCObserver7.setReactRootRenderStop(stopTime || performance.now());
191
+ var _this$oldVCObserver10;
192
+ (_this$oldVCObserver10 = this.oldVCObserver) === null || _this$oldVCObserver10 === void 0 || _this$oldVCObserver10.setReactRootRenderStop(stopTime || performance.now());
105
193
  }
106
194
  }]);
107
195
  }(); // Some products set this variable to indicate it is running in SSR
@@ -2,6 +2,7 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  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; } } }; }
3
3
  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; } }
4
4
  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; }
5
+ import { fg } from '@atlaskit/platform-feature-flags';
5
6
  import { isVCRevisionEnabled } from '../../config';
6
7
  import { getPageVisibilityState } from '../../hidden-timing';
7
8
  import { getRevisions } from './revisions/revisions';
@@ -24,7 +25,7 @@ function createVCDetails(calculatedVC, shouldHaveVCmetric) {
24
25
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
25
26
  var key = _step.value;
26
27
  details[key] = {
27
- t: VC[key],
28
+ t: VC[key] || -1,
28
29
  e: VCBox[key] || READONLY_EMPTY_ARRAY
29
30
  };
30
31
  }
@@ -45,8 +46,13 @@ export function getVCRevisionsData(_ref) {
45
46
  multiHeatmap = _ref.multiHeatmap,
46
47
  ssr = _ref.ssr,
47
48
  calculatedVC = _ref.calculatedVC,
48
- calculatedVCNext = _ref.calculatedVCNext;
49
- if (!isVCRevisionEnabled('fy25.03')) {
49
+ calculatedVCNext = _ref.calculatedVCNext,
50
+ experienceKey = _ref.experienceKey;
51
+ var isTTVCv3Enabled = fg('platform_ufo_vc_enable_revisions_by_experience') ? isVCRevisionEnabled('fy25.03', experienceKey) : isVCRevisionEnabled('fy25.03');
52
+
53
+ // As part of `platform_ufo_vc_enable_revisions_by_experience`, we are looking to turn off the `multiHeatmap` branch of code
54
+ // for calculating TTVC, and instead rely on existing values already available, e.g. `calculatedVC` and `calculatedVCNext`
55
+ if (!isTTVCv3Enabled && !fg('platform_ufo_vc_enable_revisions_by_experience')) {
50
56
  if (!multiHeatmap) {
51
57
  return null;
52
58
  }
@@ -69,29 +75,48 @@ export function getVCRevisionsData(_ref) {
69
75
  clean: isVCClean
70
76
  }));
71
77
  }
72
-
73
- // Calculate these conditions once
74
78
  var pageVisibilityUpToTTAI = getPageVisibilityState(interaction.start, interaction.end);
75
79
  var isVisiblePageVisibleUpToTTAI = pageVisibilityUpToTTAI === 'visible';
76
80
  var shouldHaveVCmetric = isVCClean && !isEventAborted && isVisiblePageVisibleUpToTTAI;
81
+ if (fg('platform_ufo_vc_enable_revisions_by_experience')) {
82
+ var availableVCRevisionPayloads = [];
83
+ if (isVCRevisionEnabled('fy25.01', experienceKey)) {
84
+ availableVCRevisionPayloads.push({
85
+ revision: 'fy25.01',
86
+ clean: isVCClean,
87
+ 'metric:vc90': shouldHaveVCmetric ? calculatedVC.VC['90'] : null,
88
+ vcDetails: createVCDetails(calculatedVC, shouldHaveVCmetric)
89
+ });
90
+ }
91
+ if (isVCRevisionEnabled('fy25.02', experienceKey)) {
92
+ availableVCRevisionPayloads.push({
93
+ revision: 'fy25.02',
94
+ clean: isVCClean,
95
+ 'metric:vc90': shouldHaveVCmetric ? calculatedVCNext.VC['90'] : null,
96
+ vcDetails: createVCDetails(calculatedVCNext, shouldHaveVCmetric)
97
+ });
98
+ }
99
+ return _defineProperty({}, "".concat(fullPrefix, "vc:rev"), availableVCRevisionPayloads);
100
+ } else {
101
+ // Create the V2 revision object which is always needed
102
+ var ttvcV2Revision = {
103
+ revision: 'fy25.02',
104
+ clean: isVCClean,
105
+ 'metric:vc90': shouldHaveVCmetric ? calculatedVCNext.VC['90'] : null,
106
+ vcDetails: createVCDetails(calculatedVCNext, shouldHaveVCmetric)
107
+ };
108
+ var isTTVCv1Disabled = !isVCRevisionEnabled('fy25.01');
109
+ if (isTTVCv1Disabled) {
110
+ return _defineProperty({}, "".concat(fullPrefix, "vc:rev"), [ttvcV2Revision]);
111
+ }
77
112
 
78
- // Create the V2 revision object which is always needed
79
- var ttvcV2Revision = {
80
- revision: 'fy25.02',
81
- clean: isVCClean,
82
- 'metric:vc90': shouldHaveVCmetric ? calculatedVCNext.VC['90'] : null,
83
- vcDetails: createVCDetails(calculatedVCNext, shouldHaveVCmetric)
84
- };
85
- if (!isVCRevisionEnabled('fy25.01')) {
86
- return _defineProperty({}, "".concat(fullPrefix, "vc:rev"), [ttvcV2Revision]);
113
+ // Only create ttvcV1Revision when we're actually going to use it
114
+ var ttvcV1Revision = {
115
+ revision: 'fy25.01',
116
+ clean: isVCClean,
117
+ 'metric:vc90': shouldHaveVCmetric ? calculatedVC.VC['90'] : null,
118
+ vcDetails: createVCDetails(calculatedVC, shouldHaveVCmetric)
119
+ };
120
+ return _defineProperty({}, "".concat(fullPrefix, "vc:rev"), [ttvcV1Revision, ttvcV2Revision]);
87
121
  }
88
-
89
- // Only create ttvcV1Revision when we're actually going to use it
90
- var ttvcV1Revision = {
91
- revision: 'fy25.01',
92
- clean: isVCClean,
93
- 'metric:vc90': shouldHaveVCmetric ? calculatedVC.VC['90'] : null,
94
- vcDetails: createVCDetails(calculatedVC, shouldHaveVCmetric)
95
- };
96
- return _defineProperty({}, "".concat(fullPrefix, "vc:rev"), [ttvcV1Revision, ttvcV2Revision]);
97
122
  }
@@ -11,6 +11,7 @@ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbol
11
11
  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) { _defineProperty(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; }
12
12
  import { fg } from '@atlaskit/platform-feature-flags';
13
13
  import { isVCRevisionEnabled } from '../../config';
14
+ import { getActiveInteraction } from '../../interaction-metrics';
14
15
  import { attachAbortListeners } from './attachAbortListeners';
15
16
  import { getVCRevisionsData } from './getVCRevisionsData';
16
17
  import { getViewportHeight, getViewportWidth } from './getViewport';
@@ -98,11 +99,11 @@ export var VCObserver = /*#__PURE__*/function () {
98
99
  });
99
100
  _defineProperty(this, "getVCResult", /*#__PURE__*/function () {
100
101
  var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref3) {
101
- var start, stop, tti, prefix, ssr, vc, isEventAborted, startTime, fullPrefix, rawData, abortReason, abortReasonInfo, heatmap, heatmapNext, outOfBoundaryInfo, totalTime, componentsLog, viewport, devToolsEnabled, ratios, multiHeatmap, isTTVCv1Disabled, vcAbortedResultWithRevisions, ttvcV1Result, VC, VCBox, VCEntries, totalPainted, _componentsLog, vcNext, outOfBoundary, stopTime, ttvcV1DevToolInfo, ttvcV2DevToolInfo, isVCClean, revisionsData, speedIndex, isTTVCv3Enabled;
102
+ var start, stop, tti, prefix, ssr, vc, isEventAborted, experienceKey, startTime, fullPrefix, rawData, abortReason, abortReasonInfo, heatmap, heatmapNext, outOfBoundaryInfo, totalTime, componentsLog, viewport, devToolsEnabled, ratios, multiHeatmap, isTTVCv1Disabled, vcAbortedResultWithRevisions, ttvcV1Result, VC, VCBox, VCEntries, totalPainted, _componentsLog, vcNext, outOfBoundary, stopTime, ttvcV1DevToolInfo, ttvcV2DevToolInfo, isVCClean, revisionsData, speedIndex, isTTVCv3Enabled;
102
103
  return _regeneratorRuntime.wrap(function _callee$(_context) {
103
104
  while (1) switch (_context.prev = _context.next) {
104
105
  case 0:
105
- start = _ref3.start, stop = _ref3.stop, tti = _ref3.tti, prefix = _ref3.prefix, ssr = _ref3.ssr, vc = _ref3.vc, isEventAborted = _ref3.isEventAborted;
106
+ start = _ref3.start, stop = _ref3.stop, tti = _ref3.tti, prefix = _ref3.prefix, ssr = _ref3.ssr, vc = _ref3.vc, isEventAborted = _ref3.isEventAborted, experienceKey = _ref3.experienceKey;
106
107
  startTime = performance.now(); // add local measurement
107
108
  fullPrefix = prefix !== undefined && prefix !== '' ? "".concat(prefix, ":") : '';
108
109
  rawData = vc !== undefined ? vc : _this.getVCRawData();
@@ -113,7 +114,7 @@ export var VCObserver = /*#__PURE__*/function () {
113
114
  return _context.abrupt("return", {});
114
115
  case 6:
115
116
  abortReason = rawData.abortReason, abortReasonInfo = rawData.abortReasonInfo, heatmap = rawData.heatmap, heatmapNext = rawData.heatmapNext, outOfBoundaryInfo = rawData.outOfBoundaryInfo, totalTime = rawData.totalTime, componentsLog = rawData.componentsLog, viewport = rawData.viewport, devToolsEnabled = rawData.devToolsEnabled, ratios = rawData.ratios, multiHeatmap = rawData.multiHeatmap;
116
- isTTVCv1Disabled = !isVCRevisionEnabled('fy25.01'); // NOTE: as part of platform_ufo_add_vc_abort_reason_by_revisions feature,
117
+ isTTVCv1Disabled = fg('platform_ufo_vc_enable_revisions_by_experience') ? !isVCRevisionEnabled('fy25.01', experienceKey) : !isVCRevisionEnabled('fy25.01'); // NOTE: as part of platform_ufo_add_vc_abort_reason_by_revisions feature,
117
118
  // we want to report abort by scroll events the same way as other abort reasons
118
119
  // i.e. not have the concept of `abortReason.blocking` anymore
119
120
  if (!(abortReasonInfo !== null && fg('platform_ufo_add_vc_abort_reason_by_revisions'))) {
@@ -301,7 +302,8 @@ export var VCObserver = /*#__PURE__*/function () {
301
302
  VC: vcNext.VC,
302
303
  VCBox: vcNext.VCBox
303
304
  },
304
- isEventAborted: isEventAborted
305
+ isEventAborted: isEventAborted,
306
+ experienceKey: experienceKey
305
307
  });
306
308
  speedIndex = _defineProperty(_defineProperty({}, "ufo:speedIndex", isTTVCv1Disabled ? vcNext.VCEntries.speedIndex : VCEntries.speedIndex), "ufo:next:speedIndex", vcNext.VCEntries.speedIndex);
307
309
  if (!isTTVCv1Disabled) {
@@ -310,7 +312,7 @@ export var VCObserver = /*#__PURE__*/function () {
310
312
  }
311
313
  return _context.abrupt("return", _objectSpread(_objectSpread(_objectSpread(_defineProperty(_defineProperty(_defineProperty({}, "".concat(fullPrefix, "vc:size"), viewport), "".concat(fullPrefix, "vc:time"), Math.round(totalTime + (stopTime - startTime))), "".concat(fullPrefix, "vc:ratios"), ratios), outOfBoundary), {}, _defineProperty({}, "".concat(fullPrefix, "vc:ignored"), _this.getIgnoredElements(componentsLog)), revisionsData), speedIndex));
312
314
  case 32:
313
- isTTVCv3Enabled = isVCRevisionEnabled('fy25.03');
315
+ isTTVCv3Enabled = fg('platform_ufo_vc_enable_revisions_by_experience') ? isVCRevisionEnabled('fy25.03', experienceKey) : isVCRevisionEnabled('fy25.03');
314
316
  return _context.abrupt("return", _objectSpread(_objectSpread(_objectSpread(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({
315
317
  'metrics:vc': VC
316
318
  }, "".concat(fullPrefix, "vc:state"), true), "".concat(fullPrefix, "vc:clean"), isVCClean), "".concat(fullPrefix, "vc:dom"), VCBox), "".concat(fullPrefix, "vc:updates"), isTTVCv3Enabled ? undefined : VCEntries.rel.slice(0, 50)), "".concat(fullPrefix, "vc:size"), viewport), "".concat(fullPrefix, "vc:time"), Math.round(totalTime + (stopTime - startTime))), "".concat(fullPrefix, "vc:total"), totalPainted), "".concat(fullPrefix, "vc:ratios"), ratios), outOfBoundary), {}, _defineProperty(_defineProperty(_defineProperty(_defineProperty({}, "".concat(fullPrefix, "vc:next"), vcNext.VC), "".concat(fullPrefix, "vc:next:updates"), isTTVCv3Enabled ? undefined : vcNext.VCEntries.rel.slice(0, 50)), "".concat(fullPrefix, "vc:next:dom"), vcNext.VCBox), "".concat(fullPrefix, "vc:ignored"), _this.getIgnoredElements(componentsLog)), revisionsData), speedIndex));
@@ -327,7 +329,12 @@ export var VCObserver = /*#__PURE__*/function () {
327
329
  _defineProperty(this, "handleUpdate", function (rawTime, intersectionRect, targetName, element, type, ignoreReason, attributeName, oldValue, newValue) {
328
330
  _this.measureStart();
329
331
  _this.legacyHandleUpdate(rawTime, intersectionRect, targetName, element, type, ignoreReason, attributeName, oldValue, newValue);
330
- if (!isVCRevisionEnabled('fy25.03')) {
332
+ var isTTVCv3Disabled = !isVCRevisionEnabled('fy25.03');
333
+ if (fg('platform_ufo_vc_enable_revisions_by_experience')) {
334
+ var interaction = getActiveInteraction();
335
+ isTTVCv3Disabled = !isVCRevisionEnabled('fy25.03', interaction === null || interaction === void 0 ? void 0 : interaction.ufoName);
336
+ }
337
+ if (isTTVCv3Disabled) {
331
338
  _this.onViewportChangeDetected({
332
339
  timestamp: rawTime,
333
340
  intersectionRect: intersectionRect,
@@ -351,6 +358,10 @@ export var VCObserver = /*#__PURE__*/function () {
351
358
  _this.applyChangesToHeatMap(mappedValues, time, _this.heatmapNext);
352
359
  }
353
360
  var isTTVCv1Disabled = !isVCRevisionEnabled('fy25.01');
361
+ if (fg('platform_ufo_vc_enable_revisions_by_experience')) {
362
+ var interaction = getActiveInteraction();
363
+ isTTVCv1Disabled = !isVCRevisionEnabled('fy25.01', interaction === null || interaction === void 0 ? void 0 : interaction.ufoName);
364
+ }
354
365
  if (!isTTVCv1Disabled && (!ignoreReason || ignoreReason === 'not-visible') && type !== 'attr') {
355
366
  _this.applyChangesToHeatMap(mappedValues, time, _this.heatmap);
356
367
  }
@@ -1,12 +1,10 @@
1
1
  import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
2
2
  import _createClass from "@babel/runtime/helpers/createClass";
3
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
4
3
  var EntriesTimeline = /*#__PURE__*/function () {
5
4
  function EntriesTimeline() {
6
5
  _classCallCheck(this, EntriesTimeline);
7
- _defineProperty(this, "unorderedEntries", []);
8
- _defineProperty(this, "sortedEntriesCache", new Map());
9
6
  this.unorderedEntries = [];
7
+ this.sortedEntriesCache = new Map();
10
8
  }
11
9
  return _createClass(EntriesTimeline, [{
12
10
  key: "push",
@@ -2,17 +2,18 @@ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
2
  import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
3
3
  import _createClass from "@babel/runtime/helpers/createClass";
4
4
  import _regeneratorRuntime from "@babel/runtime/regenerator";
5
+ import { fg } from '@atlaskit/platform-feature-flags';
5
6
  import taskYield from '../../utils/task-yield';
6
7
 
7
8
  // 24-bit color value
8
9
 
9
10
  /**
10
11
  * Class responsible for managing a scaled canvas and tracking pixel drawing operations.
11
- * It uses an OffscreenCanvas for better performance and maintains a mapping between
12
- * colors and timestamps for pixel counting purposes.
12
+ * It uses either an OffscreenCanvas (if available) or a regular HTML Canvas for better performance
13
+ * and maintains a mapping between colors and timestamps for pixel counting purposes.
13
14
  */
14
15
  export var ViewportCanvas = /*#__PURE__*/function () {
15
- /** The underlying OffscreenCanvas instance */
16
+ /** The underlying Canvas instance (either OffscreenCanvas or HTMLCanvasElement) */
16
17
 
17
18
  /** The 2D rendering context of the canvas */
18
19
 
@@ -43,10 +44,8 @@ export var ViewportCanvas = /*#__PURE__*/function () {
43
44
  this.scaleX = this.scaledWidth / safeViewportWidth;
44
45
  this.scaleY = this.scaledHeight / safeViewportHeight;
45
46
 
46
- // Initialize OffscreenCanvas with scaled dimensions
47
- this.canvas = document.createElement('canvas');
48
- this.canvas.width = this.scaledWidth;
49
- this.canvas.height = this.scaledHeight;
47
+ // Initialize canvas with scaled dimensions
48
+ this.canvas = this.createCanvas(this.scaledWidth, this.scaledHeight);
50
49
  var ctx = this.canvas.getContext('2d', {
51
50
  alpha: false,
52
51
  // Disable alpha channel for better performance
@@ -59,9 +58,28 @@ export var ViewportCanvas = /*#__PURE__*/function () {
59
58
  }
60
59
  this.ctx = ctx;
61
60
  this.ctx.globalCompositeOperation = 'source-over';
61
+ if (fg('platform_ufo_use_offscreen_canvas')) {
62
+ this.ctx.imageSmoothingEnabled = false; // Disable image smoothing for better performance
63
+ }
62
64
  this.clear();
63
65
  }
66
+
67
+ /**
68
+ * Creates a canvas instance, falling back to HTMLCanvasElement if OffscreenCanvas is not available
69
+ * or if the feature flag is disabled
70
+ */
64
71
  return _createClass(ViewportCanvas, [{
72
+ key: "createCanvas",
73
+ value: function createCanvas(width, height) {
74
+ if (typeof OffscreenCanvas !== 'undefined' && fg('platform_ufo_use_offscreen_canvas')) {
75
+ return new OffscreenCanvas(width, height);
76
+ }
77
+ var canvas = document.createElement('canvas');
78
+ canvas.width = width;
79
+ canvas.height = height;
80
+ return canvas;
81
+ }
82
+ }, {
65
83
  key: "getScaledDimensions",
66
84
  value: function getScaledDimensions() {
67
85
  return {