@atlaskit/react-ufo 2.14.3 → 2.15.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 (50) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cjs/create-payload/index.js +10 -0
  3. package/dist/cjs/experience-trace-id-context/index.js +5 -1
  4. package/dist/cjs/segment/segment.js +7 -1
  5. package/dist/cjs/vc/vc-observer/heatmap/heatmap.js +275 -0
  6. package/dist/cjs/vc/vc-observer/index.js +115 -26
  7. package/dist/cjs/vc/vc-observer/revisions/ViewportUpdateClassifier.js +52 -0
  8. package/dist/cjs/vc/vc-observer/revisions/fy24_01.js +39 -0
  9. package/dist/cjs/vc/vc-observer/revisions/fy25_01.js +39 -0
  10. package/dist/cjs/vc/vc-observer/revisions/revisions.js +23 -0
  11. package/dist/cjs/vc/vc-observer/revisions/types.js +5 -0
  12. package/dist/es2019/create-payload/index.js +10 -0
  13. package/dist/es2019/experience-trace-id-context/index.js +4 -0
  14. package/dist/es2019/segment/segment.js +11 -3
  15. package/dist/es2019/vc/vc-observer/heatmap/heatmap.js +238 -0
  16. package/dist/es2019/vc/vc-observer/index.js +94 -3
  17. package/dist/es2019/vc/vc-observer/revisions/ViewportUpdateClassifier.js +35 -0
  18. package/dist/es2019/vc/vc-observer/revisions/fy24_01.js +21 -0
  19. package/dist/es2019/vc/vc-observer/revisions/fy25_01.js +21 -0
  20. package/dist/es2019/vc/vc-observer/revisions/revisions.js +19 -0
  21. package/dist/es2019/vc/vc-observer/revisions/types.js +1 -0
  22. package/dist/esm/create-payload/index.js +10 -0
  23. package/dist/esm/experience-trace-id-context/index.js +4 -0
  24. package/dist/esm/segment/segment.js +7 -1
  25. package/dist/esm/vc/vc-observer/heatmap/heatmap.js +268 -0
  26. package/dist/esm/vc/vc-observer/index.js +115 -26
  27. package/dist/esm/vc/vc-observer/revisions/ViewportUpdateClassifier.js +45 -0
  28. package/dist/esm/vc/vc-observer/revisions/fy24_01.js +32 -0
  29. package/dist/esm/vc/vc-observer/revisions/fy25_01.js +32 -0
  30. package/dist/esm/vc/vc-observer/revisions/revisions.js +17 -0
  31. package/dist/esm/vc/vc-observer/revisions/types.js +1 -0
  32. package/dist/types/common/vc/types.d.ts +27 -8
  33. package/dist/types/experience-trace-id-context/index.d.ts +1 -0
  34. package/dist/types/vc/vc-observer/heatmap/heatmap.d.ts +75 -0
  35. package/dist/types/vc/vc-observer/index.d.ts +5 -1
  36. package/dist/types/vc/vc-observer/revisions/ViewportUpdateClassifier.d.ts +25 -0
  37. package/dist/types/vc/vc-observer/revisions/fy24_01.d.ts +11 -0
  38. package/dist/types/vc/vc-observer/revisions/fy25_01.d.ts +13 -0
  39. package/dist/types/vc/vc-observer/revisions/revisions.d.ts +2 -0
  40. package/dist/types/vc/vc-observer/revisions/types.d.ts +5 -0
  41. package/dist/types-ts4.5/common/vc/types.d.ts +27 -8
  42. package/dist/types-ts4.5/experience-trace-id-context/index.d.ts +1 -0
  43. package/dist/types-ts4.5/vc/vc-observer/heatmap/heatmap.d.ts +75 -0
  44. package/dist/types-ts4.5/vc/vc-observer/index.d.ts +15 -1
  45. package/dist/types-ts4.5/vc/vc-observer/revisions/ViewportUpdateClassifier.d.ts +25 -0
  46. package/dist/types-ts4.5/vc/vc-observer/revisions/fy24_01.d.ts +11 -0
  47. package/dist/types-ts4.5/vc/vc-observer/revisions/fy25_01.d.ts +13 -0
  48. package/dist/types-ts4.5/vc/vc-observer/revisions/revisions.d.ts +2 -0
  49. package/dist/types-ts4.5/vc/vc-observer/revisions/types.d.ts +5 -0
  50. package/package.json +8 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @atlaskit/ufo-interaction-ignore
2
2
 
3
+ ## 2.15.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#115462](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/115462)
8
+ [`17a3ace9d5f67`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/17a3ace9d5f67) -
9
+ Moved addSegment to useEffect to prevent it added multiple times when running on concurrent mode
10
+
11
+ ### Patch Changes
12
+
13
+ - Updated dependencies
14
+
3
15
  ## 2.14.3
4
16
 
5
17
  ### Patch Changes
@@ -222,6 +222,16 @@ var getVCMetrics = function getVCMetrics(interaction) {
222
222
  if (interactionStatus.originalInteractionStatus !== 'SUCCEEDED' || pageVisibilityUpToTTAI !== 'visible') {
223
223
  return result;
224
224
  }
225
+ if ((0, _platformFeatureFlags.fg)('ufo_vc_multiheatmap')) {
226
+ var _result;
227
+ (_result = result["".concat(prefix, ":vc:rev")]) === null || _result === void 0 || _result.forEach(function (element) {
228
+ var _element$vcDetails;
229
+ if ((_element$vcDetails = element.vcDetails) !== null && _element$vcDetails !== void 0 && (_element$vcDetails = _element$vcDetails['90']) !== null && _element$vcDetails !== void 0 && _element$vcDetails.t) {
230
+ var _element$vcDetails$;
231
+ element['metric:vc90'] = (_element$vcDetails$ = element.vcDetails['90']) === null || _element$vcDetails$ === void 0 ? void 0 : _element$vcDetails$.t;
232
+ }
233
+ });
234
+ }
225
235
  return _objectSpread(_objectSpread({}, result), {}, {
226
236
  'metric:vc90': VC['90']
227
237
  });
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.setInteractionActiveTrace = exports.setActiveTrace = exports.getActiveTraceHttpRequestHeaders = exports.getActiveTrace = exports.generateSpanId = exports.clearActiveTrace = void 0;
6
+ exports.setInteractionActiveTrace = exports.setActiveTrace = exports.getActiveTraceHttpRequestHeaders = exports.getActiveTraceAsQueryParams = exports.getActiveTrace = exports.generateSpanId = exports.clearActiveTrace = void 0;
7
7
  var _makeTraceHttpRequestHeaders = require("./utils/make-trace-http-request-headers");
8
8
  var state = {
9
9
  context: null
@@ -37,4 +37,8 @@ var getActiveTraceHttpRequestHeaders = exports.getActiveTraceHttpRequestHeaders
37
37
  traceId = _state$context.traceId,
38
38
  spanId = _state$context.spanId;
39
39
  return (0, _makeTraceHttpRequestHeaders.makeTraceHttpRequestHeaders)(traceId, spanId);
40
+ };
41
+ var getActiveTraceAsQueryParams = exports.getActiveTraceAsQueryParams = function getActiveTraceAsQueryParams(_url) {
42
+ var traceHeaders = getActiveTraceHttpRequestHeaders(_url);
43
+ return traceHeaders ? new URLSearchParams(traceHeaders).toString().toLowerCase() : null;
40
44
  };
@@ -11,6 +11,7 @@ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers
11
11
  var _react = _interopRequireWildcard(require("react"));
12
12
  var _scheduler = require("scheduler");
13
13
  var _uuid = require("uuid");
14
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
14
15
  var _coinflip = _interopRequireDefault(require("../coinflip"));
15
16
  var _config = require("../config");
16
17
  var _experienceTraceIdContext = require("../experience-trace-id-context");
@@ -54,7 +55,9 @@ function UFOSegment(_ref) {
54
55
  }, [parentContext, segmentName, segmentId]);
55
56
  var interactionId = (0, _react.useContext)(_interactionIdContext.default);
56
57
  var interactionContext = (0, _react.useMemo)(function () {
57
- (0, _interactionMetrics.addSegment)(labelStack);
58
+ if (!(0, _platformFeatureFlags.fg)('platform-ufo-add-segment-use-effect')) {
59
+ (0, _interactionMetrics.addSegment)(labelStack);
60
+ }
58
61
  var lastCompleteEndTime = 0;
59
62
  function complete() {
60
63
  var endTime = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : performance.now();
@@ -233,6 +236,9 @@ function UFOSegment(_ref) {
233
236
  }
234
237
  }, [interactionContext]);
235
238
  (0, _react.useEffect)(function () {
239
+ if ((0, _platformFeatureFlags.fg)('platform-ufo-add-segment-use-effect')) {
240
+ (0, _interactionMetrics.addSegment)(labelStack);
241
+ }
236
242
  return function () {
237
243
  (0, _interactionMetrics.removeSegment)(labelStack);
238
244
  };
@@ -0,0 +1,275 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.MultiRevisionHeatmap = void 0;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
+ var _objectDestructuringEmpty2 = _interopRequireDefault(require("@babel/runtime/helpers/objectDestructuringEmpty"));
10
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
12
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
+ var UNUSED_SECTOR = 0;
14
+ var MultiRevisionHeatmap = exports.MultiRevisionHeatmap = /*#__PURE__*/function () {
15
+ function MultiRevisionHeatmap(_ref) {
16
+ var _this = this;
17
+ var viewport = _ref.viewport,
18
+ revisions = _ref.revisions,
19
+ arraySize = _ref.arraySize,
20
+ devToolsEnabled = _ref.devToolsEnabled;
21
+ (0, _classCallCheck2.default)(this, MultiRevisionHeatmap);
22
+ (0, _defineProperty2.default)(this, "arraySize", {
23
+ w: 200,
24
+ h: 200
25
+ });
26
+ (0, _defineProperty2.default)(this, "mapPixelsToHeatmap", function (left, top, width, height) {
27
+ var _this$viewport = _this.viewport,
28
+ w = _this$viewport.w,
29
+ h = _this$viewport.h;
30
+ var l = Math.floor(left / w * _this.arraySize.w);
31
+ var t = Math.floor(top / h * _this.arraySize.h);
32
+ var r = Math.ceil((left + width) / w * _this.arraySize.w);
33
+ var b = Math.ceil((top + height) / h * _this.arraySize.h);
34
+
35
+ // correct values to min - 0, max - arraySize
36
+ var result = {
37
+ l: Math.max(0, l),
38
+ t: Math.max(0, t),
39
+ r: Math.min(_this.arraySize.w, r),
40
+ b: Math.min(_this.arraySize.h, b)
41
+ };
42
+ return result;
43
+ });
44
+ (0, _defineProperty2.default)(this, "getElementRatio", function (mappedValues) {
45
+ var r = mappedValues.r,
46
+ l = mappedValues.l,
47
+ b = mappedValues.b,
48
+ t = mappedValues.t;
49
+ return (r - l) * (b - t) / (_this.arraySize.w * _this.arraySize.h);
50
+ });
51
+ this.viewport = viewport;
52
+ this.revisions = revisions;
53
+ if (arraySize) {
54
+ this.arraySize = arraySize;
55
+ }
56
+ this.heatmaps = new Array(revisions.length);
57
+ this.componentsLogs = new Array(revisions.length);
58
+ this.vcRatios = new Array(revisions.length);
59
+ this.devToolsEnabled = devToolsEnabled || false;
60
+ revisions.forEach(function (_ref2, i) {
61
+ (0, _objectDestructuringEmpty2.default)(_ref2);
62
+ _this.heatmaps[i] = _this.getCleanHeatmap();
63
+ _this.componentsLogs[i] = {};
64
+ _this.vcRatios[i] = {};
65
+ });
66
+ }
67
+ return (0, _createClass2.default)(MultiRevisionHeatmap, [{
68
+ key: "handleUpdate",
69
+ value: function handleUpdate(_ref3) {
70
+ var _this2 = this;
71
+ var time = _ref3.time,
72
+ type = _ref3.type,
73
+ classification = _ref3.classification,
74
+ intersectionRect = _ref3.intersectionRect,
75
+ element = _ref3.element,
76
+ targetName = _ref3.targetName,
77
+ ignoreReason = _ref3.ignoreReason,
78
+ onError = _ref3.onError;
79
+ var mappedValues = this.mapPixelsToHeatmap(intersectionRect.left, intersectionRect.top, intersectionRect.width, intersectionRect.height);
80
+ var result = this.applyChangesToHeatMap(mappedValues, time, classification);
81
+ if (result !== true) {
82
+ onError(result);
83
+ }
84
+ var componentRatio = this.getElementRatio(mappedValues);
85
+ this.revisions.forEach(function (_, i) {
86
+ if (classification[i]) {
87
+ _this2.vcRatios[i][targetName] = componentRatio;
88
+ }
89
+ if (!_this2.componentsLogs[i][time]) {
90
+ _this2.componentsLogs[i][time] = [];
91
+ }
92
+ _this2.componentsLogs[i][time].push({
93
+ __debug__element: _this2.devToolsEnabled ? new WeakRef(element) : null,
94
+ intersectionRect: intersectionRect,
95
+ targetName: targetName,
96
+ ignoreReason: ignoreReason
97
+ });
98
+ });
99
+ }
100
+ }, {
101
+ key: "getData",
102
+ value: function getData() {
103
+ return {
104
+ heatmaps: this.heatmaps
105
+ };
106
+ }
107
+ }, {
108
+ key: "getPayloadShapedData",
109
+ value: function getPayloadShapedData(args) {
110
+ var result = this.processData(args);
111
+ var payload = this.revisions.map(function (rev, i) {
112
+ var vcDetails = {};
113
+ args.VCParts.forEach(function (VCPart) {
114
+ vcDetails[VCPart] = {
115
+ t: result[i].VC[VCPart] || 0,
116
+ e: Array.from(result[i].VCBox[VCPart] || [])
117
+ };
118
+ });
119
+ return {
120
+ revision: rev.name,
121
+ vcDetails: vcDetails,
122
+ clean: args.clean,
123
+ 'metric:vc90': null // will be set or not in the payload generator
124
+ };
125
+ });
126
+ return payload;
127
+ }
128
+ }, {
129
+ key: "processData",
130
+ value: function processData(_ref4) {
131
+ var _this3 = this;
132
+ var VCParts = _ref4.VCParts,
133
+ _ref4$ssr = _ref4.ssr,
134
+ ssr = _ref4$ssr === void 0 ? UNUSED_SECTOR : _ref4$ssr;
135
+ return this.heatmaps.map(function (heatmap, i) {
136
+ var lastUpdate = {};
137
+ var totalPainted = 0;
138
+ var componentsLog = _this3.componentsLogs[i];
139
+ if (ssr !== UNUSED_SECTOR) {
140
+ var _window$document;
141
+ var element = {
142
+ __debug__element: new WeakRef((_window$document = window.document) === null || _window$document === void 0 ? void 0 : _window$document.body),
143
+ intersectionRect: {
144
+ top: 0,
145
+ left: 0,
146
+ right: 0,
147
+ bottom: 0,
148
+ x: 0,
149
+ y: 0,
150
+ width: _this3.viewport.w,
151
+ height: _this3.viewport.h,
152
+ toJSON: function toJSON() {
153
+ return {};
154
+ }
155
+ },
156
+ targetName: 'SSR'
157
+ };
158
+ if (!componentsLog[ssr]) {
159
+ componentsLog[ssr] = [];
160
+ }
161
+ componentsLog[ssr].push(element);
162
+ }
163
+ for (var _i = 0; _i < heatmap.length; _i++) {
164
+ var rounded = Math.floor(heatmap[_i] === UNUSED_SECTOR && ssr !== UNUSED_SECTOR ? ssr : heatmap[_i]);
165
+ totalPainted += rounded !== UNUSED_SECTOR ? 1 : 0;
166
+ if (rounded !== UNUSED_SECTOR) {
167
+ lastUpdate[rounded] = lastUpdate[rounded] ? lastUpdate[rounded] + 1 : 1;
168
+ }
169
+ }
170
+ var entries = Object.entries(lastUpdate).map(function (a) {
171
+ return [parseInt(a[0], 10), a[1]];
172
+ }).sort(function (a, b) {
173
+ return a[0] > b[0] ? 1 : -1;
174
+ });
175
+ var VC = MultiRevisionHeatmap.makeVCReturnObj(VCParts);
176
+ var VCBox = MultiRevisionHeatmap.makeVCReturnObj(VCParts);
177
+ entries.reduce(function () {
178
+ var acc = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
179
+ var v = arguments.length > 1 ? arguments[1] : undefined;
180
+ var VCRatio = v[1] / totalPainted + acc;
181
+ var time = v[0];
182
+ VCParts.forEach(function (value) {
183
+ if ((VC[value] === null || VC[value] === undefined) && VCRatio >= value / 100) {
184
+ var _componentsLog$time;
185
+ VC[value] = time;
186
+ VCBox[value] = new Set();
187
+ (_componentsLog$time = componentsLog[time]) === null || _componentsLog$time === void 0 || _componentsLog$time.forEach(function (v) {
188
+ var _VCBox$value;
189
+ return (_VCBox$value = VCBox[value]) === null || _VCBox$value === void 0 ? void 0 : _VCBox$value.add(v.targetName);
190
+ });
191
+ }
192
+ });
193
+ return VCRatio;
194
+ }, 0);
195
+ var VCEntries = entries.reduce(function (acc, _ref5, i) {
196
+ var _acc$abs, _componentsLog$timest;
197
+ var _ref6 = (0, _slicedToArray2.default)(_ref5, 2),
198
+ timestamp = _ref6[0],
199
+ entryPainted = _ref6[1];
200
+ var currentlyPainted = entryPainted + (((_acc$abs = acc.abs[i - 1]) === null || _acc$abs === void 0 ? void 0 : _acc$abs[1]) || 0);
201
+ var currentlyPaintedRatio = Math.round(currentlyPainted / totalPainted * 1000) / 10;
202
+ var logEntry = (_componentsLog$timest = componentsLog[timestamp]) === null || _componentsLog$timest === void 0 ? void 0 : _componentsLog$timest.map(function (v) {
203
+ return v.targetName;
204
+ });
205
+ acc.abs.push([timestamp, currentlyPainted]);
206
+ acc.rel.push({
207
+ time: timestamp,
208
+ vc: currentlyPaintedRatio,
209
+ elements: logEntry
210
+ });
211
+ return acc;
212
+ }, {
213
+ abs: [],
214
+ rel: []
215
+ });
216
+ return {
217
+ VC: VC,
218
+ VCBox: VCBox,
219
+ VCEntries: VCEntries,
220
+ totalPainted: totalPainted
221
+ };
222
+ });
223
+ }
224
+ }, {
225
+ key: "applyChangesToHeatMap",
226
+ value: function applyChangesToHeatMap(a, time, classification) {
227
+ var l = a.l,
228
+ t = a.t,
229
+ r = a.r,
230
+ b = a.b;
231
+ var size = classification.length;
232
+ for (var row = t; row < b; row++) {
233
+ if (this.heatmaps[0][row] === undefined) {
234
+ try {
235
+ return {
236
+ error: "index - ".concat(row),
237
+ time: time
238
+ };
239
+ } catch (e) {
240
+ return {
241
+ error: 'row error',
242
+ time: time
243
+ };
244
+ }
245
+ } else {
246
+ for (var heatmapIndex = 0; heatmapIndex < size; heatmapIndex++) {
247
+ if (classification[heatmapIndex]) {
248
+ this.heatmaps[heatmapIndex].fill(time, this.getIndex(l, row), this.getIndex(r, row));
249
+ }
250
+ }
251
+ }
252
+ }
253
+ return true;
254
+ }
255
+ }, {
256
+ key: "getIndex",
257
+ value: function getIndex(x, y) {
258
+ return x + this.arraySize.w * y;
259
+ }
260
+ }, {
261
+ key: "getCleanHeatmap",
262
+ value: function getCleanHeatmap() {
263
+ return new Uint32Array(this.arraySize.w * this.arraySize.h);
264
+ }
265
+ }], [{
266
+ key: "makeVCReturnObj",
267
+ value: function makeVCReturnObj(VCParts) {
268
+ var vc = {};
269
+ VCParts.forEach(function (v) {
270
+ vc[v] = null;
271
+ });
272
+ return vc;
273
+ }
274
+ }]);
275
+ }();
@@ -13,7 +13,9 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
13
13
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
14
14
  var _attachAbortListeners = require("./attachAbortListeners");
15
15
  var _getViewport = require("./getViewport");
16
+ var _heatmap = require("./heatmap/heatmap");
16
17
  var _observers = require("./observers");
18
+ var _revisions = require("./revisions/revisions");
17
19
  var _excluded = ["__debug__element"];
18
20
  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; }
19
21
  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; }
@@ -54,6 +56,7 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
54
56
  });
55
57
  /* heatmap */
56
58
  (0, _defineProperty2.default)(this, "arraySize", 0);
59
+ (0, _defineProperty2.default)(this, "multiHeatmap", null);
57
60
  (0, _defineProperty2.default)(this, "componentsLog", {});
58
61
  (0, _defineProperty2.default)(this, "vcRatios", {});
59
62
  (0, _defineProperty2.default)(this, "active", false);
@@ -85,6 +88,7 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
85
88
  abortReason: _objectSpread({}, _this.abortReason),
86
89
  heatmap: _this.heatmap,
87
90
  heatmapNext: _this.heatmapNext,
91
+ multiHeatmap: _this.multiHeatmap,
88
92
  outOfBoundaryInfo: _this.outOfBoundaryInfo,
89
93
  totalTime: Math.round(_this.totalTime + _this.observers.getTotalTime()),
90
94
  componentsLog: _objectSpread({}, _this.componentsLog),
@@ -117,7 +121,8 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
117
121
  componentsLog = rawData.componentsLog,
118
122
  viewport = rawData.viewport,
119
123
  devToolsEnabled = rawData.devToolsEnabled,
120
- ratios = rawData.ratios;
124
+ ratios = rawData.ratios,
125
+ multiHeatmap = rawData.multiHeatmap;
121
126
  if (abortReasonInfo !== null && abortReason.blocking) {
122
127
  // exposing data to devtools
123
128
  try {
@@ -153,6 +158,7 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
153
158
  /* empty */
154
159
  }
155
160
  var _componentsLog = {};
161
+ // eslint-disable-next-line @atlaskit/platform/ensure-feature-flag-prefix
156
162
  if ((0, _platformFeatureFlags.fg)('ufo-remove-vc-component-observations-after-ttai')) {
157
163
  Object.entries(_this.componentsLog).forEach(function (_ref5) {
158
164
  var _ref6 = (0, _slicedToArray2.default)(_ref5, 2),
@@ -209,9 +215,30 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
209
215
  tti: tti,
210
216
  ttai: stop - start
211
217
  },
218
+ start: start,
219
+ stop: stop,
212
220
  heatmap: heatmap,
213
221
  ratios: ratios
214
222
  };
223
+ window.__vcNext = {
224
+ entries: vcNext.VCEntries.rel,
225
+ log: componentsLog,
226
+ metrics: {
227
+ '75': vcNext.VC['75'],
228
+ '80': vcNext.VC['80'],
229
+ '85': vcNext.VC['85'],
230
+ '90': vcNext.VC['90'],
231
+ '95': vcNext.VC['95'],
232
+ '98': vcNext.VC['98'],
233
+ '99': vcNext.VC['99'],
234
+ tti: tti,
235
+ ttai: stop - start
236
+ },
237
+ start: start,
238
+ stop: stop,
239
+ heatmap: heatmapNext,
240
+ ratios: ratios
241
+ };
215
242
 
216
243
  // Emitting a custom event to make it available in the Chrome extension
217
244
  window.dispatchEvent(new CustomEvent('vcReady', {
@@ -224,13 +251,36 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
224
251
  } catch (e) {
225
252
  /* do nothing */
226
253
  }
254
+ var isMultiHeatmapEnabled = (0, _platformFeatureFlags.fg)('ufo_vc_multiheatmap');
255
+ var revisionsData = isMultiHeatmapEnabled && multiHeatmap !== null ? (0, _defineProperty2.default)({}, "".concat(fullPrefix, "vc:rev"), multiHeatmap.getPayloadShapedData({
256
+ VCParts: VCObserver.VCParts.map(function (v) {
257
+ return parseInt(v);
258
+ }),
259
+ ssr: ssr,
260
+ clean: !abortReasonInfo
261
+ })) : null;
262
+ // eslint-disable-next-line @atlaskit/platform/ensure-feature-flag-prefix
227
263
  var isCalcSpeedIndexEnabled = (0, _platformFeatureFlags.fg)('ufo-calc-speed-index');
228
- return _objectSpread(_objectSpread((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({
264
+ return _objectSpread(_objectSpread(_objectSpread((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({
229
265
  'metrics:vc': VC
230
- }, "".concat(fullPrefix, "vc:state"), true), "".concat(fullPrefix, "vc:clean"), !abortReasonInfo), "".concat(fullPrefix, "vc:dom"), VCBox), "".concat(fullPrefix, "vc:updates"), 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), {}, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(fullPrefix, "vc:next"), vcNext.VC), "".concat(fullPrefix, "vc:next:updates"), vcNext.VCEntries.rel.slice(0, 50)), "".concat(fullPrefix, "vc:next:dom"), vcNext.VCBox), "".concat(fullPrefix, "vc:ignored"), _this.getIgnoredElements(componentsLog)), "ufo:speedIndex", isCalcSpeedIndexEnabled ? VCEntries.speedIndex : undefined), "ufo:next:speedIndex", isCalcSpeedIndexEnabled ? vcNext.VCEntries.speedIndex : undefined));
266
+ }, "".concat(fullPrefix, "vc:state"), true), "".concat(fullPrefix, "vc:clean"), !abortReasonInfo), "".concat(fullPrefix, "vc:dom"), VCBox), "".concat(fullPrefix, "vc:updates"), 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), {}, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(fullPrefix, "vc:next"), vcNext.VC), "".concat(fullPrefix, "vc:next:updates"), vcNext.VCEntries.rel.slice(0, 50)), "".concat(fullPrefix, "vc:next:dom"), vcNext.VCBox), "".concat(fullPrefix, "vc:ignored"), _this.getIgnoredElements(componentsLog)), revisionsData), {}, (0, _defineProperty2.default)((0, _defineProperty2.default)({}, "ufo:speedIndex", isCalcSpeedIndexEnabled ? VCEntries.speedIndex : undefined), "ufo:next:speedIndex", isCalcSpeedIndexEnabled ? vcNext.VCEntries.speedIndex : undefined));
231
267
  });
232
268
  (0, _defineProperty2.default)(this, "handleUpdate", function (rawTime, intersectionRect, targetName, element, type, ignoreReason) {
233
269
  _this.measureStart();
270
+ _this.legacyHandleUpdate(rawTime, intersectionRect, targetName, element, type, ignoreReason);
271
+ if ((0, _platformFeatureFlags.fg)('ufo_vc_multiheatmap')) {
272
+ _this.onViewportChangeDetected({
273
+ timestamp: rawTime,
274
+ intersectionRect: intersectionRect,
275
+ targetName: targetName,
276
+ element: element,
277
+ type: type,
278
+ ignoreReason: ignoreReason
279
+ });
280
+ }
281
+ _this.measureStop();
282
+ });
283
+ (0, _defineProperty2.default)(this, "legacyHandleUpdate", function (rawTime, intersectionRect, targetName, element, type, ignoreReason) {
234
284
  if (_this.abortReason.reason === null || _this.abortReason.blocking === false) {
235
285
  var time = Math.round(rawTime - _this.startTime);
236
286
  var mappedValues = _this.mapPixelsToHeatmap(intersectionRect.left, intersectionRect.top, intersectionRect.width, intersectionRect.height);
@@ -251,8 +301,38 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
251
301
  ignoreReason: ignoreReason
252
302
  });
253
303
  }
254
- // devtools export
255
- _this.measureStop();
304
+ });
305
+ (0, _defineProperty2.default)(this, "onViewportChangeDetected", function (_ref9) {
306
+ var element = _ref9.element,
307
+ type = _ref9.type,
308
+ ignoreReason = _ref9.ignoreReason,
309
+ timestamp = _ref9.timestamp,
310
+ targetName = _ref9.targetName,
311
+ intersectionRect = _ref9.intersectionRect;
312
+ if (_this.multiHeatmap === null) {
313
+ return;
314
+ }
315
+ // @todo add abort reason handling
316
+ var time = Math.round(timestamp - _this.startTime);
317
+ var revisions = (0, _revisions.getRevisions)();
318
+ var revisionsClassification = revisions.map(function (revision) {
319
+ return revision.classifier.classifyUpdate({
320
+ element: element,
321
+ type: type,
322
+ ignoreReason: ignoreReason
323
+ });
324
+ }, []);
325
+ _this.multiHeatmap.handleUpdate({
326
+ time: time,
327
+ targetName: targetName,
328
+ intersectionRect: intersectionRect,
329
+ type: type,
330
+ element: element,
331
+ classification: revisionsClassification,
332
+ onError: function onError(error) {
333
+ _this.setAbortReason(abortReason.error, error.time, error.error);
334
+ }
335
+ });
256
336
  });
257
337
  (0, _defineProperty2.default)(this, "mapPixelsToHeatmap", function (left, top, width, height) {
258
338
  var _this$viewport = _this.viewport,
@@ -310,10 +390,10 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
310
390
  var unbinds = (0, _attachAbortListeners.attachAbortListeners)(window, _this.viewport, _this.abortReasonCallback);
311
391
  if ((_window = window) !== null && _window !== void 0 && _window.__SSR_ABORT_LISTENERS__) {
312
392
  var _window2;
313
- Object.entries(window.__SSR_ABORT_LISTENERS__.aborts).forEach(function (_ref8) {
314
- var _ref9 = (0, _slicedToArray2.default)(_ref8, 2),
315
- key = _ref9[0],
316
- time = _ref9[1];
393
+ Object.entries(window.__SSR_ABORT_LISTENERS__.aborts).forEach(function (_ref10) {
394
+ var _ref11 = (0, _slicedToArray2.default)(_ref10, 2),
395
+ key = _ref11[0],
396
+ time = _ref11[1];
317
397
  if (time) {
318
398
  _this.abortReasonCallback(key, time);
319
399
  }
@@ -337,12 +417,19 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
337
417
  });
338
418
  this.heatmap = this.getCleanHeatmap();
339
419
  this.heatmapNext = this.getCleanHeatmap();
420
+ if ((0, _platformFeatureFlags.fg)('ufo_vc_multiheatmap')) {
421
+ this.multiHeatmap = new _heatmap.MultiRevisionHeatmap({
422
+ viewport: this.viewport,
423
+ revisions: (0, _revisions.getRevisions)(),
424
+ devToolsEnabled: this.devToolsEnabled
425
+ });
426
+ }
340
427
  this.isPostInteraction = options.isPostInteraction || false;
341
428
  }
342
429
  return (0, _createClass2.default)(VCObserver, [{
343
430
  key: "start",
344
- value: function start(_ref10) {
345
- var startTime = _ref10.startTime;
431
+ value: function start(_ref12) {
432
+ var startTime = _ref12.startTime;
346
433
  this.active = true;
347
434
  if (this.observers.isBrowserSupported()) {
348
435
  this.setViewportSize();
@@ -364,12 +451,12 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
364
451
  }, {
365
452
  key: "getIgnoredElements",
366
453
  value: function getIgnoredElements(componentsLog) {
367
- return Object.values(componentsLog).flat().filter(function (_ref11) {
368
- var ignoreReason = _ref11.ignoreReason;
454
+ return Object.values(componentsLog).flat().filter(function (_ref13) {
455
+ var ignoreReason = _ref13.ignoreReason;
369
456
  return Boolean(ignoreReason);
370
- }).map(function (_ref12) {
371
- var targetName = _ref12.targetName,
372
- ignoreReason = _ref12.ignoreReason;
457
+ }).map(function (_ref14) {
458
+ var targetName = _ref14.targetName,
459
+ ignoreReason = _ref14.ignoreReason;
373
460
  return {
374
461
  targetName: targetName,
375
462
  ignoreReason: ignoreReason
@@ -490,12 +577,12 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
490
577
  }
491
578
  }], [{
492
579
  key: "calculateVC",
493
- value: function calculateVC(_ref13) {
494
- var heatmap = _ref13.heatmap,
495
- _ref13$ssr = _ref13.ssr,
496
- ssr = _ref13$ssr === void 0 ? UNUSED_SECTOR : _ref13$ssr,
497
- componentsLog = _ref13.componentsLog,
498
- viewport = _ref13.viewport;
580
+ value: function calculateVC(_ref15) {
581
+ var heatmap = _ref15.heatmap,
582
+ _ref15$ssr = _ref15.ssr,
583
+ ssr = _ref15$ssr === void 0 ? UNUSED_SECTOR : _ref15$ssr,
584
+ componentsLog = _ref15.componentsLog,
585
+ viewport = _ref15.viewport;
499
586
  var lastUpdate = {};
500
587
  var totalPainted = 0;
501
588
  if (ssr !== UNUSED_SECTOR) {
@@ -538,6 +625,8 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
538
625
  });
539
626
  var VC = VCObserver.makeVCReturnObj();
540
627
  var VCBox = VCObserver.makeVCReturnObj();
628
+
629
+ // eslint-disable-next-line @atlaskit/platform/ensure-feature-flag-prefix
541
630
  var isCalcSpeedIndexEnabled = (0, _platformFeatureFlags.fg)('ufo-calc-speed-index');
542
631
  entries.reduce(function () {
543
632
  var acc = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
@@ -562,11 +651,11 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
562
651
  });
563
652
  return VCRatio;
564
653
  }, 0);
565
- var VCEntries = entries.reduce(function (acc, _ref14, i) {
654
+ var VCEntries = entries.reduce(function (acc, _ref16, i) {
566
655
  var _acc$abs, _componentsLog$timest, _acc$rel$vc, _acc$rel;
567
- var _ref15 = (0, _slicedToArray2.default)(_ref14, 2),
568
- timestamp = _ref15[0],
569
- entryPainted = _ref15[1];
656
+ var _ref17 = (0, _slicedToArray2.default)(_ref16, 2),
657
+ timestamp = _ref17[0],
658
+ entryPainted = _ref17[1];
570
659
  var currentlyPainted = entryPainted + (((_acc$abs = acc.abs[i - 1]) === null || _acc$abs === void 0 ? void 0 : _acc$abs[1]) || 0);
571
660
  var currentlyPaintedRatio = Math.round(currentlyPainted / totalPainted * 1000) / 10;
572
661
  var logEntry = (_componentsLog$timest = componentsLog[timestamp]) === null || _componentsLog$timest === void 0 ? void 0 : _componentsLog$timest.map(function (v) {
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.ViewportUpdateClassifier = void 0;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
11
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
+ var ViewportUpdateClassifier = exports.ViewportUpdateClassifier = /*#__PURE__*/function () {
13
+ function ViewportUpdateClassifier() {
14
+ (0, _classCallCheck2.default)(this, ViewportUpdateClassifier);
15
+ (0, _defineProperty2.default)(this, "types", []);
16
+ (0, _defineProperty2.default)(this, "filters", []);
17
+ (0, _defineProperty2.default)(this, "removedFilters", []);
18
+ (0, _defineProperty2.default)(this, "__combinedTypes", []);
19
+ (0, _defineProperty2.default)(this, "__combinedFilters", []);
20
+ }
21
+ return (0, _createClass2.default)(ViewportUpdateClassifier, [{
22
+ key: "mergeConfig",
23
+ value: function mergeConfig() {
24
+ var _this = this;
25
+ this.__combinedTypes = [].concat((0, _toConsumableArray2.default)(this.types), (0, _toConsumableArray2.default)((this === null || this === void 0 ? void 0 : this.__combinedTypes) || []));
26
+ var previousFilters = this.removedFilters.length === 0 ? this.__combinedFilters : this.__combinedFilters.filter(function (filter) {
27
+ return !_this.removedFilters.includes(filter.name);
28
+ });
29
+ this.__combinedFilters = [].concat((0, _toConsumableArray2.default)(this.filters), (0, _toConsumableArray2.default)(previousFilters));
30
+ }
31
+ }, {
32
+ key: "classifyUpdate",
33
+ value: function classifyUpdate(_ref) {
34
+ var element = _ref.element,
35
+ type = _ref.type,
36
+ tags = _ref.tags,
37
+ ignoreReason = _ref.ignoreReason;
38
+ if (!this.__combinedTypes.includes(type)) {
39
+ return false;
40
+ }
41
+ return this.__combinedFilters.every(function (_ref2) {
42
+ var filter = _ref2.filter,
43
+ name = _ref2.name;
44
+ return filter({
45
+ type: type,
46
+ tags: tags,
47
+ ignoreReason: ignoreReason
48
+ });
49
+ });
50
+ }
51
+ }]);
52
+ }();