@atlaskit/react-ufo 2.14.2 → 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 (71) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cjs/create-payload/index.js +11 -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 +133 -29
  7. package/dist/cjs/vc/vc-observer/observers/ssr-placeholders/index.js +16 -27
  8. package/dist/cjs/vc/vc-observer/revisions/ViewportUpdateClassifier.js +52 -0
  9. package/dist/cjs/vc/vc-observer/revisions/fy24_01.js +39 -0
  10. package/dist/cjs/vc/vc-observer/revisions/fy25_01.js +39 -0
  11. package/dist/cjs/vc/vc-observer/revisions/revisions.js +23 -0
  12. package/dist/cjs/vc/vc-observer/revisions/types.js +5 -0
  13. package/dist/es2019/create-payload/index.js +11 -0
  14. package/dist/es2019/experience-trace-id-context/index.js +4 -0
  15. package/dist/es2019/segment/segment.js +11 -3
  16. package/dist/es2019/vc/vc-observer/heatmap/heatmap.js +238 -0
  17. package/dist/es2019/vc/vc-observer/index.js +115 -7
  18. package/dist/es2019/vc/vc-observer/observers/ssr-placeholders/index.js +16 -27
  19. package/dist/es2019/vc/vc-observer/revisions/ViewportUpdateClassifier.js +35 -0
  20. package/dist/es2019/vc/vc-observer/revisions/fy24_01.js +21 -0
  21. package/dist/es2019/vc/vc-observer/revisions/fy25_01.js +21 -0
  22. package/dist/es2019/vc/vc-observer/revisions/revisions.js +19 -0
  23. package/dist/es2019/vc/vc-observer/revisions/types.js +1 -0
  24. package/dist/esm/create-payload/index.js +11 -0
  25. package/dist/esm/experience-trace-id-context/index.js +4 -0
  26. package/dist/esm/segment/segment.js +7 -1
  27. package/dist/esm/vc/vc-observer/heatmap/heatmap.js +268 -0
  28. package/dist/esm/vc/vc-observer/index.js +133 -29
  29. package/dist/esm/vc/vc-observer/observers/ssr-placeholders/index.js +16 -27
  30. package/dist/esm/vc/vc-observer/revisions/ViewportUpdateClassifier.js +45 -0
  31. package/dist/esm/vc/vc-observer/revisions/fy24_01.js +32 -0
  32. package/dist/esm/vc/vc-observer/revisions/fy25_01.js +32 -0
  33. package/dist/esm/vc/vc-observer/revisions/revisions.js +17 -0
  34. package/dist/esm/vc/vc-observer/revisions/types.js +1 -0
  35. package/dist/types/common/vc/types.d.ts +28 -9
  36. package/dist/types/create-payload/index.d.ts +16 -0
  37. package/dist/types/experience-trace-id-context/index.d.ts +1 -0
  38. package/dist/types/interaction-ignore/ufo-interaction-ignore.d.ts +2 -2
  39. package/dist/types/label/UFOLabel.d.ts +2 -2
  40. package/dist/types/load-hold/UFOLoadHold.d.ts +2 -2
  41. package/dist/types/placeholder/Placeholder.d.ts +2 -2
  42. package/dist/types/placeholder/loosely-lazy/lazy-suspense.d.ts +2 -2
  43. package/dist/types/segment/segment-highlight.d.ts +2 -2
  44. package/dist/types/segment/segment.d.ts +2 -2
  45. package/dist/types/vc/vc-observer/heatmap/heatmap.d.ts +75 -0
  46. package/dist/types/vc/vc-observer/index.d.ts +6 -1
  47. package/dist/types/vc/vc-observer/media-wrapper/MediaWrapper.d.ts +1 -1
  48. package/dist/types/vc/vc-observer/revisions/ViewportUpdateClassifier.d.ts +25 -0
  49. package/dist/types/vc/vc-observer/revisions/fy24_01.d.ts +11 -0
  50. package/dist/types/vc/vc-observer/revisions/fy25_01.d.ts +13 -0
  51. package/dist/types/vc/vc-observer/revisions/revisions.d.ts +2 -0
  52. package/dist/types/vc/vc-observer/revisions/types.d.ts +5 -0
  53. package/dist/types-ts4.5/common/vc/types.d.ts +28 -9
  54. package/dist/types-ts4.5/create-payload/index.d.ts +16 -0
  55. package/dist/types-ts4.5/experience-trace-id-context/index.d.ts +1 -0
  56. package/dist/types-ts4.5/interaction-ignore/ufo-interaction-ignore.d.ts +2 -2
  57. package/dist/types-ts4.5/label/UFOLabel.d.ts +2 -2
  58. package/dist/types-ts4.5/load-hold/UFOLoadHold.d.ts +2 -2
  59. package/dist/types-ts4.5/placeholder/Placeholder.d.ts +2 -2
  60. package/dist/types-ts4.5/placeholder/loosely-lazy/lazy-suspense.d.ts +2 -2
  61. package/dist/types-ts4.5/segment/segment-highlight.d.ts +2 -2
  62. package/dist/types-ts4.5/segment/segment.d.ts +2 -2
  63. package/dist/types-ts4.5/vc/vc-observer/heatmap/heatmap.d.ts +75 -0
  64. package/dist/types-ts4.5/vc/vc-observer/index.d.ts +16 -1
  65. package/dist/types-ts4.5/vc/vc-observer/media-wrapper/MediaWrapper.d.ts +1 -1
  66. package/dist/types-ts4.5/vc/vc-observer/revisions/ViewportUpdateClassifier.d.ts +25 -0
  67. package/dist/types-ts4.5/vc/vc-observer/revisions/fy24_01.d.ts +11 -0
  68. package/dist/types-ts4.5/vc/vc-observer/revisions/fy25_01.d.ts +13 -0
  69. package/dist/types-ts4.5/vc/vc-observer/revisions/revisions.d.ts +2 -0
  70. package/dist/types-ts4.5/vc/vc-observer/revisions/types.d.ts +5 -0
  71. package/package.json +17 -6
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
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
+
15
+ ## 2.14.3
16
+
17
+ ### Patch Changes
18
+
19
+ - [#112416](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/112416)
20
+ [`7bc761ae449f4`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/7bc761ae449f4) -
21
+ VC ratio calculation precision fix
22
+
3
23
  ## 2.14.2
4
24
 
5
25
  ### 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
  });
@@ -622,6 +632,7 @@ function getPayloadSize(payload) {
622
632
  return Math.round(new TextEncoder().encode(JSON.stringify(payload)).length / 1024);
623
633
  }
624
634
  function getStylesheetMetrics() {
635
+ // eslint-disable-next-line @atlaskit/platform/ensure-feature-flag-prefix
625
636
  if (!(0, _platformFeatureFlags.fg)('ufo_capture_stylesheet_metrics')) {
626
637
  return {};
627
638
  }
@@ -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,12 +251,36 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
224
251
  } catch (e) {
225
252
  /* do nothing */
226
253
  }
227
- 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)({
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
263
+ var isCalcSpeedIndexEnabled = (0, _platformFeatureFlags.fg)('ufo-calc-speed-index');
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)({
228
265
  'metrics:vc': VC
229
- }, "".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)));
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));
230
267
  });
231
268
  (0, _defineProperty2.default)(this, "handleUpdate", function (rawTime, intersectionRect, targetName, element, type, ignoreReason) {
232
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) {
233
284
  if (_this.abortReason.reason === null || _this.abortReason.blocking === false) {
234
285
  var time = Math.round(rawTime - _this.startTime);
235
286
  var mappedValues = _this.mapPixelsToHeatmap(intersectionRect.left, intersectionRect.top, intersectionRect.width, intersectionRect.height);
@@ -250,8 +301,38 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
250
301
  ignoreReason: ignoreReason
251
302
  });
252
303
  }
253
- // devtools export
254
- _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
+ });
255
336
  });
256
337
  (0, _defineProperty2.default)(this, "mapPixelsToHeatmap", function (left, top, width, height) {
257
338
  var _this$viewport = _this.viewport,
@@ -309,10 +390,10 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
309
390
  var unbinds = (0, _attachAbortListeners.attachAbortListeners)(window, _this.viewport, _this.abortReasonCallback);
310
391
  if ((_window = window) !== null && _window !== void 0 && _window.__SSR_ABORT_LISTENERS__) {
311
392
  var _window2;
312
- Object.entries(window.__SSR_ABORT_LISTENERS__.aborts).forEach(function (_ref8) {
313
- var _ref9 = (0, _slicedToArray2.default)(_ref8, 2),
314
- key = _ref9[0],
315
- 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];
316
397
  if (time) {
317
398
  _this.abortReasonCallback(key, time);
318
399
  }
@@ -336,12 +417,19 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
336
417
  });
337
418
  this.heatmap = this.getCleanHeatmap();
338
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
+ }
339
427
  this.isPostInteraction = options.isPostInteraction || false;
340
428
  }
341
429
  return (0, _createClass2.default)(VCObserver, [{
342
430
  key: "start",
343
- value: function start(_ref10) {
344
- var startTime = _ref10.startTime;
431
+ value: function start(_ref12) {
432
+ var startTime = _ref12.startTime;
345
433
  this.active = true;
346
434
  if (this.observers.isBrowserSupported()) {
347
435
  this.setViewportSize();
@@ -363,12 +451,12 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
363
451
  }, {
364
452
  key: "getIgnoredElements",
365
453
  value: function getIgnoredElements(componentsLog) {
366
- return Object.values(componentsLog).flat().filter(function (_ref11) {
367
- var ignoreReason = _ref11.ignoreReason;
454
+ return Object.values(componentsLog).flat().filter(function (_ref13) {
455
+ var ignoreReason = _ref13.ignoreReason;
368
456
  return Boolean(ignoreReason);
369
- }).map(function (_ref12) {
370
- var targetName = _ref12.targetName,
371
- ignoreReason = _ref12.ignoreReason;
457
+ }).map(function (_ref14) {
458
+ var targetName = _ref14.targetName,
459
+ ignoreReason = _ref14.ignoreReason;
372
460
  return {
373
461
  targetName: targetName,
374
462
  ignoreReason: ignoreReason
@@ -489,12 +577,12 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
489
577
  }
490
578
  }], [{
491
579
  key: "calculateVC",
492
- value: function calculateVC(_ref13) {
493
- var heatmap = _ref13.heatmap,
494
- _ref13$ssr = _ref13.ssr,
495
- ssr = _ref13$ssr === void 0 ? UNUSED_SECTOR : _ref13$ssr,
496
- componentsLog = _ref13.componentsLog,
497
- 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;
498
586
  var lastUpdate = {};
499
587
  var totalPainted = 0;
500
588
  if (ssr !== UNUSED_SECTOR) {
@@ -537,10 +625,19 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
537
625
  });
538
626
  var VC = VCObserver.makeVCReturnObj();
539
627
  var VCBox = VCObserver.makeVCReturnObj();
628
+
629
+ // eslint-disable-next-line @atlaskit/platform/ensure-feature-flag-prefix
630
+ var isCalcSpeedIndexEnabled = (0, _platformFeatureFlags.fg)('ufo-calc-speed-index');
540
631
  entries.reduce(function () {
541
632
  var acc = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
542
633
  var v = arguments.length > 1 ? arguments[1] : undefined;
543
- var VCRatio = v[1] / totalPainted + acc;
634
+ var currRatio = v[1] / totalPainted;
635
+ var VCRatio = currRatio + acc;
636
+ if ((0, _platformFeatureFlags.fg)('platform_ufo_fix_vc_observer_rounding_error')) {
637
+ var preciseCurrRatio = Math.round(100 * (v[1] / totalPainted));
638
+ var preciseAccRatio = Math.round(acc * 100);
639
+ VCRatio = (preciseCurrRatio + preciseAccRatio) / 100;
640
+ }
544
641
  var time = v[0];
545
642
  VCObserver.VCParts.forEach(function (key) {
546
643
  var value = parseInt(key, 10);
@@ -554,16 +651,21 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
554
651
  });
555
652
  return VCRatio;
556
653
  }, 0);
557
- var VCEntries = entries.reduce(function (acc, _ref14, i) {
558
- var _acc$abs, _componentsLog$timest;
559
- var _ref15 = (0, _slicedToArray2.default)(_ref14, 2),
560
- timestamp = _ref15[0],
561
- entryPainted = _ref15[1];
654
+ var VCEntries = entries.reduce(function (acc, _ref16, i) {
655
+ var _acc$abs, _componentsLog$timest, _acc$rel$vc, _acc$rel;
656
+ var _ref17 = (0, _slicedToArray2.default)(_ref16, 2),
657
+ timestamp = _ref17[0],
658
+ entryPainted = _ref17[1];
562
659
  var currentlyPainted = entryPainted + (((_acc$abs = acc.abs[i - 1]) === null || _acc$abs === void 0 ? void 0 : _acc$abs[1]) || 0);
563
660
  var currentlyPaintedRatio = Math.round(currentlyPainted / totalPainted * 1000) / 10;
564
661
  var logEntry = (_componentsLog$timest = componentsLog[timestamp]) === null || _componentsLog$timest === void 0 ? void 0 : _componentsLog$timest.map(function (v) {
565
662
  return v.targetName;
566
663
  });
664
+ var ratioDelta = (currentlyPaintedRatio - ((_acc$rel$vc = (_acc$rel = acc.rel[i - 1]) === null || _acc$rel === void 0 ? void 0 : _acc$rel.vc) !== null && _acc$rel$vc !== void 0 ? _acc$rel$vc : 0)) / 100;
665
+ if (isCalcSpeedIndexEnabled) {
666
+ var speedIndex = timestamp * ratioDelta;
667
+ acc.speedIndex += speedIndex;
668
+ }
567
669
  acc.abs.push([timestamp, currentlyPainted]);
568
670
  acc.rel.push({
569
671
  time: timestamp,
@@ -573,8 +675,10 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
573
675
  return acc;
574
676
  }, {
575
677
  abs: [],
576
- rel: []
678
+ rel: [],
679
+ speedIndex: 0
577
680
  });
681
+ VCEntries.speedIndex = Math.round(VCEntries.speedIndex);
578
682
  return {
579
683
  VC: VC,
580
684
  VCBox: VCBox,