@atlaskit/react-ufo 3.3.2 → 3.3.3

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 (53) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/cjs/create-payload/index.js +43 -15
  3. package/dist/cjs/interaction-metrics-init/index.js +11 -9
  4. package/dist/cjs/vc/index.js +6 -2
  5. package/dist/cjs/vc/vc-observer-new/get-element-name.js +19 -6
  6. package/dist/cjs/vc/vc-observer-new/index.js +6 -3
  7. package/dist/cjs/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +4 -2
  8. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.js +10 -11
  9. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js +23 -30
  10. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.js +7 -7
  11. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.js +3 -3
  12. package/dist/cjs/vc/vc-observer-new/window-event-observer/index.js +5 -1
  13. package/dist/es2019/create-payload/index.js +3 -2
  14. package/dist/es2019/interaction-metrics-init/index.js +11 -9
  15. package/dist/es2019/vc/index.js +6 -2
  16. package/dist/es2019/vc/vc-observer-new/get-element-name.js +19 -6
  17. package/dist/es2019/vc/vc-observer-new/index.js +7 -3
  18. package/dist/es2019/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +4 -0
  19. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.js +1 -2
  20. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js +15 -12
  21. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.js +5 -4
  22. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.js +3 -2
  23. package/dist/es2019/vc/vc-observer-new/window-event-observer/index.js +5 -1
  24. package/dist/esm/create-payload/index.js +43 -15
  25. package/dist/esm/interaction-metrics-init/index.js +11 -9
  26. package/dist/esm/vc/index.js +6 -2
  27. package/dist/esm/vc/vc-observer-new/get-element-name.js +19 -6
  28. package/dist/esm/vc/vc-observer-new/index.js +6 -3
  29. package/dist/esm/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +4 -2
  30. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.js +10 -11
  31. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js +23 -30
  32. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.js +7 -7
  33. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.js +3 -3
  34. package/dist/esm/vc/vc-observer-new/window-event-observer/index.js +5 -1
  35. package/dist/types/config/index.d.ts +1 -0
  36. package/dist/types/create-payload/index.d.ts +1 -1
  37. package/dist/types/vc/vc-observer-new/index.d.ts +3 -2
  38. package/dist/types/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.d.ts +1 -1
  39. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.d.ts +2 -2
  40. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.d.ts +2 -1
  41. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.d.ts +2 -1
  42. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/types.d.ts +2 -0
  43. package/dist/types/vc/vc-observer-new/metric-calculator/types.d.ts +2 -0
  44. package/dist/types-ts4.5/config/index.d.ts +1 -0
  45. package/dist/types-ts4.5/create-payload/index.d.ts +1 -1
  46. package/dist/types-ts4.5/vc/vc-observer-new/index.d.ts +3 -2
  47. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.d.ts +1 -1
  48. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.d.ts +2 -2
  49. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.d.ts +2 -1
  50. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.d.ts +2 -1
  51. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/types.d.ts +2 -0
  52. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/types.d.ts +2 -0
  53. package/package.json +2 -2
@@ -14,7 +14,6 @@ const DEFAULT_SELECTOR_CONFIG = {
14
14
  export default class VCObserverNew {
15
15
  constructor(config) {
16
16
  var _config$selectorConfi;
17
- _defineProperty(this, "startTime", 0);
18
17
  _defineProperty(this, "viewportObserver", null);
19
18
  _defineProperty(this, "windowEventObserver", null);
20
19
  this.entriesTimeline = new EntriesTimeline();
@@ -63,10 +62,13 @@ export default class VCObserverNew {
63
62
  }
64
63
  });
65
64
  }
66
- start() {
65
+ start({
66
+ startTime
67
+ }) {
67
68
  var _this$viewportObserve, _this$windowEventObse;
68
69
  (_this$viewportObserve = this.viewportObserver) === null || _this$viewportObserve === void 0 ? void 0 : _this$viewportObserve.start();
69
70
  (_this$windowEventObse = this.windowEventObserver) === null || _this$windowEventObse === void 0 ? void 0 : _this$windowEventObse.start();
71
+ this.entriesTimeline.clear();
70
72
  }
71
73
  stop() {
72
74
  var _this$viewportObserve2, _this$windowEventObse2;
@@ -85,7 +87,9 @@ export default class VCObserverNew {
85
87
  stop
86
88
  });
87
89
  const fy25_03 = await calculator_fy25_03.calculate({
88
- orderedEntries
90
+ orderedEntries,
91
+ startTime: start,
92
+ stopTime: stop
89
93
  });
90
94
  if (fy25_03) {
91
95
  results.push(fy25_03);
@@ -6,6 +6,8 @@ export default class AbstractVCCalculatorBase {
6
6
  this.revisionNo = revisionNo;
7
7
  }
8
8
  async calculate({
9
+ startTime,
10
+ stopTime,
9
11
  orderedEntries
10
12
  }) {
11
13
  var _vcDetails$90$t, _vcDetails$;
@@ -25,6 +27,8 @@ export default class AbstractVCCalculatorBase {
25
27
  width: getViewportWidth(),
26
28
  height: getViewportHeight()
27
29
  },
30
+ startTime,
31
+ stopTime,
28
32
  orderedEntries: filteredEntries,
29
33
  percentiles: [25, 50, 75, 80, 85, 90, 95, 98, 99]
30
34
  });
@@ -172,7 +172,6 @@ export function getRGBComponents(n) {
172
172
  */
173
173
  export async function calculateDrawnPixelsRaw(imageData, scaleFactor, arraySize) {
174
174
  const data = imageData.data;
175
- const scaleCompensation = Math.round(1 / (scaleFactor * scaleFactor));
176
175
  const arr = new Uint32Array(arraySize);
177
176
  for (let i = 0; i < data.length; i += 4) {
178
177
  // Check alpha
@@ -184,7 +183,7 @@ export async function calculateDrawnPixelsRaw(imageData, scaleFactor, arraySize)
184
183
  // The | operator combines all bits together
185
184
  const color = data[i] << 16 | data[i + 1] << 8 | data[i + 2];
186
185
  const colorIndex = color - 1;
187
- arr[colorIndex] = (arr[colorIndex] || 0) + scaleCompensation;
186
+ arr[colorIndex] = (arr[colorIndex] || 0) + 1;
188
187
  }
189
188
  if (i % 10000 === 0) {
190
189
  await taskYield();
@@ -3,7 +3,8 @@ import { ViewportCanvas } from './canvas-pixel';
3
3
  export default async function calculateTTVCPercentiles({
4
4
  viewport,
5
5
  orderedEntries,
6
- percentiles
6
+ percentiles,
7
+ startTime
7
8
  }) {
8
9
  const canvas = new ViewportCanvas(viewport, fg('platform_ufo_canvas_heatmap_full_precision') ? 1 : 0.25);
9
10
  const elementMap = new Map();
@@ -22,10 +23,11 @@ export default async function calculateTTVCPercentiles({
22
23
 
23
24
  // Get pixel counts
24
25
  const timePixelCounts = await canvas.getPixelCounts();
25
- const viewportTotalPixels = viewport.width * viewport.height;
26
- return calculatePercentiles(timePixelCounts, elementMap, percentiles, viewportTotalPixels);
26
+ const canvasDimenstions = canvas.getScaledDimensions();
27
+ const totalPixels = canvasDimenstions.width * canvasDimenstions.height;
28
+ return calculatePercentiles(timePixelCounts, elementMap, percentiles, totalPixels, startTime);
27
29
  }
28
- export function calculatePercentiles(timePixelCounts, elementMap, unorderedPercentiles, totalPixels) {
30
+ export function calculatePercentiles(timePixelCounts, elementMap, unorderedPercentiles, totalPixels, startTime) {
29
31
  const results = {};
30
32
  let cumulativePixels = 0;
31
33
  const percentiles = unorderedPercentiles.sort((a, b) => a - b);
@@ -42,7 +44,7 @@ export function calculatePercentiles(timePixelCounts, elementMap, unorderedPerce
42
44
  let matchesAnyCheckpoints = false;
43
45
  while (percentileIndex < percentiles.length && percentCovered >= percentiles[percentileIndex]) {
44
46
  results[`${percentiles[percentileIndex]}`] = {
45
- t: Number(time),
47
+ t: Math.round(Number(time - startTime)),
46
48
  e: Array.from(domElementsBuffer)
47
49
  };
48
50
  percentileIndex++;
@@ -55,15 +57,16 @@ export function calculatePercentiles(timePixelCounts, elementMap, unorderedPerce
55
57
  break;
56
58
  }
57
59
  }
58
-
59
- // Fill in any missing percentiles
60
- for (const percentile of percentiles) {
60
+ let previousResult = {
61
+ t: 0,
62
+ e: []
63
+ };
64
+ for (let i = 0; i < percentiles.length; i++) {
65
+ const percentile = percentiles[i];
61
66
  if (!(percentile in results)) {
62
- results[`${percentile}`] = {
63
- t: 0,
64
- e: []
65
- };
67
+ results[`${percentile}`] = previousResult;
66
68
  }
69
+ previousResult = results[`${percentile}`];
67
70
  }
68
71
  return results;
69
72
  }
@@ -175,7 +175,7 @@ class Heatmap {
175
175
  }
176
176
  }
177
177
  }
178
- async getVCPercentMetrics(vcPercentCheckpoint) {
178
+ async getVCPercentMetrics(vcPercentCheckpoint, startTime) {
179
179
  const sortedCheckpoints = [...vcPercentCheckpoint].sort((a, b) => a - b);
180
180
  const flattenHeatmap = this.map.flat();
181
181
  const totalCells = flattenHeatmap.length;
@@ -232,7 +232,7 @@ class Heatmap {
232
232
  }
233
233
  matchesAnyCheckpoints = true;
234
234
  result[checkpoint.toString()] = {
235
- t: timestamp,
235
+ t: Math.round(timestamp - startTime),
236
236
  e: domElements
237
237
  };
238
238
  }
@@ -249,13 +249,14 @@ class Heatmap {
249
249
  export default async function calculateTTVCPercentiles({
250
250
  orderedEntries,
251
251
  viewport,
252
- percentiles
252
+ percentiles,
253
+ startTime
253
254
  }) {
254
255
  const heatmap = new Heatmap({
255
256
  viewport,
256
257
  heatmapSize: 200
257
258
  });
258
259
  await heatmap.applyEntriesToHeatmap(orderedEntries);
259
- const vcDetails = await heatmap.getVCPercentMetrics(percentiles);
260
+ const vcDetails = await heatmap.getVCPercentMetrics(percentiles, startTime);
260
261
  return vcDetails;
261
262
  }
@@ -4,7 +4,8 @@ import calculateUnionArea from './calc-union-area';
4
4
  export default async function calculateTTVCPercentiles({
5
5
  orderedEntries,
6
6
  viewport,
7
- percentiles
7
+ percentiles,
8
+ startTime
8
9
  }) {
9
10
  const sortedPercentiles = [...percentiles].sort((a, b) => a - b);
10
11
  const viewportArea = viewport.width * viewport.height;
@@ -43,7 +44,7 @@ export default async function calculateTTVCPercentiles({
43
44
  }
44
45
  matchesAnyCheckpoints = true;
45
46
  checkpoints[checkpoint.toString()] = {
46
- t: iEntry.time,
47
+ t: Math.round(iEntry.time - startTime),
47
48
  e: domElements
48
49
  };
49
50
  }
@@ -9,6 +9,9 @@ export default class WindowEventObserver {
9
9
  const unbindCallback = bind(window, {
10
10
  type,
11
11
  listener: event => {
12
+ if (!event.isTrusted) {
13
+ return;
14
+ }
12
15
  this.onEvent({
13
16
  time: event.timeStamp,
14
17
  type,
@@ -16,7 +19,8 @@ export default class WindowEventObserver {
16
19
  });
17
20
  },
18
21
  options: {
19
- passive: true
22
+ passive: true,
23
+ once: true
20
24
  }
21
25
  });
22
26
  this.unbindFns.push(unbindCallback);
@@ -827,19 +827,47 @@ function _createPayloads() {
827
827
  }));
828
828
  return _createPayloads.apply(this, arguments);
829
829
  }
830
- export function createExperimentalMetricsPayload(interactionId, interaction) {
831
- var config = getConfig();
832
- if (!config) {
833
- throw Error('UFO Configuration not provided');
834
- }
835
- var ufoName = sanitizeUfoName(interaction.ufoName);
836
- var rate = getExperimentalInteractionRate(ufoName, interaction.type);
837
- if (!coinflip(rate)) {
838
- return null;
839
- }
840
- var pageVisibilityState = getPageVisibilityState(interaction.start, interaction.end);
841
- if (pageVisibilityState !== 'visible') {
842
- return null;
843
- }
844
- return createInteractionMetricsPayload(interaction, interactionId, true);
830
+ export function createExperimentalMetricsPayload(_x6, _x7) {
831
+ return _createExperimentalMetricsPayload.apply(this, arguments);
832
+ }
833
+ function _createExperimentalMetricsPayload() {
834
+ _createExperimentalMetricsPayload = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(interactionId, interaction) {
835
+ var config, ufoName, rate, pageVisibilityState, result;
836
+ return _regeneratorRuntime.wrap(function _callee3$(_context3) {
837
+ while (1) switch (_context3.prev = _context3.next) {
838
+ case 0:
839
+ config = getConfig();
840
+ if (config) {
841
+ _context3.next = 3;
842
+ break;
843
+ }
844
+ throw Error('UFO Configuration not provided');
845
+ case 3:
846
+ ufoName = sanitizeUfoName(interaction.ufoName);
847
+ rate = getExperimentalInteractionRate(ufoName, interaction.type);
848
+ if (coinflip(rate)) {
849
+ _context3.next = 7;
850
+ break;
851
+ }
852
+ return _context3.abrupt("return", null);
853
+ case 7:
854
+ pageVisibilityState = getPageVisibilityState(interaction.start, interaction.end);
855
+ if (!(pageVisibilityState !== 'visible')) {
856
+ _context3.next = 10;
857
+ break;
858
+ }
859
+ return _context3.abrupt("return", null);
860
+ case 10:
861
+ _context3.next = 12;
862
+ return createInteractionMetricsPayload(interaction, interactionId, true);
863
+ case 12:
864
+ result = _context3.sent;
865
+ return _context3.abrupt("return", result);
866
+ case 14:
867
+ case "end":
868
+ return _context3.stop();
869
+ }
870
+ }, _callee3);
871
+ }));
872
+ return _createExperimentalMetricsPayload.apply(this, arguments);
845
873
  }
@@ -29,17 +29,19 @@ function sinkInteraction(instance, payloadPackage) {
29
29
  function sinkExperimentalInteractionMetrics(instance, payloadPackage) {
30
30
  sinkExperimentalHandler(function (interactionId, interaction) {
31
31
  scheduleCallback(idlePriority, function () {
32
- var payload = payloadPackage.createExperimentalMetricsPayload(interactionId, interaction);
33
- if (payload) {
34
- if (fg('enable_ufo_devtools_api_for_extra_events')) {
35
- // NOTE: This API is used by the UFO DevTool Chrome Extension and Criterion
36
- var devToolObserver = globalThis.__ufo_devtool_onUfoPayload;
37
- if (typeof devToolObserver === 'function') {
38
- devToolObserver === null || devToolObserver === void 0 || devToolObserver(payload);
32
+ var payloadPromise = payloadPackage.createExperimentalMetricsPayload(interactionId, interaction);
33
+ payloadPromise.then(function (payload) {
34
+ if (payload) {
35
+ if (fg('enable_ufo_devtools_api_for_extra_events')) {
36
+ // NOTE: This API is used by the UFO DevTool Chrome Extension and Criterion
37
+ var devToolObserver = globalThis.__ufo_devtool_onUfoPayload;
38
+ if (typeof devToolObserver === 'function') {
39
+ devToolObserver === null || devToolObserver === void 0 || devToolObserver(payload);
40
+ }
39
41
  }
42
+ instance.sendOperationalEvent(payload);
40
43
  }
41
- instance.sendOperationalEvent(payload);
42
- }
44
+ });
43
45
  });
44
46
  });
45
47
  }
@@ -7,15 +7,17 @@ import _regeneratorRuntime from "@babel/runtime/regenerator";
7
7
  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; }
8
8
  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; }
9
9
  import { fg } from '@atlaskit/platform-feature-flags';
10
+ import { getConfig } from '../config';
10
11
  import { VCObserver } from './vc-observer';
11
12
  import VCObserverNew from './vc-observer-new';
12
13
  var VCObserverWrapper = /*#__PURE__*/function () {
13
14
  function VCObserverWrapper() {
15
+ var _getConfig;
14
16
  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
15
17
  _classCallCheck(this, VCObserverWrapper);
16
18
  this.oldVCObserver = new VCObserver(opts);
17
19
  this.newVCObserver = null;
18
- var isNewVCObserverEnabled = fg('platform_ufo_vc_observer_new');
20
+ var isNewVCObserverEnabled = fg('platform_ufo_vc_observer_new') || ((_getConfig = getConfig()) === null || _getConfig === void 0 || (_getConfig = _getConfig.vc) === null || _getConfig === void 0 ? void 0 : _getConfig.enableVCObserverNew);
19
21
  if (isNewVCObserverEnabled) {
20
22
  this.newVCObserver = new VCObserverNew({
21
23
  selectorConfig: opts.selectorConfig
@@ -27,7 +29,9 @@ var VCObserverWrapper = /*#__PURE__*/function () {
27
29
  value: function start(startArg) {
28
30
  var _this$oldVCObserver, _this$newVCObserver;
29
31
  (_this$oldVCObserver = this.oldVCObserver) === null || _this$oldVCObserver === void 0 || _this$oldVCObserver.start(startArg);
30
- (_this$newVCObserver = this.newVCObserver) === null || _this$newVCObserver === void 0 || _this$newVCObserver.start();
32
+ (_this$newVCObserver = this.newVCObserver) === null || _this$newVCObserver === void 0 || _this$newVCObserver.start({
33
+ startTime: startArg.startTime
34
+ });
31
35
  }
32
36
  }, {
33
37
  key: "stop",
@@ -4,7 +4,15 @@ function getAttributeSelector(element, attributeName) {
4
4
  if (!attrValue) {
5
5
  return '';
6
6
  }
7
- return "[".concat(attributeName, "=\"").concat(encodeURIComponent(attrValue), "\"]");
7
+ return "[".concat(attributeName, "=\"").concat(attrValue, "\"]");
8
+ }
9
+ function isValidSelector(selector) {
10
+ try {
11
+ document.querySelector(selector);
12
+ return true;
13
+ } catch (err) {
14
+ return false;
15
+ }
8
16
  }
9
17
  function isSelectorUnique(selector) {
10
18
  return document.querySelectorAll(selector).length === 1;
@@ -12,11 +20,13 @@ function isSelectorUnique(selector) {
12
20
  function getUniqueSelector(selectorConfig, element) {
13
21
  var currentElement = element;
14
22
  var parts = [];
15
- while (currentElement && currentElement.localName !== 'body') {
23
+ var MAX_DEPTH = 3;
24
+ var currentDepth = 0;
25
+ while (currentElement && currentElement.localName !== 'body' && currentDepth <= MAX_DEPTH) {
16
26
  var tagName = currentElement.localName;
17
27
  var selectorPart = tagName;
18
- if (selectorConfig.id && currentElement.id) {
19
- selectorPart += "#".concat(encodeURIComponent(currentElement.id));
28
+ if (selectorConfig.id && currentElement.id && isValidSelector("#".concat(currentElement.id))) {
29
+ selectorPart += "#".concat(currentElement.id);
20
30
  } else if (selectorConfig.dataVC) {
21
31
  selectorPart += getAttributeSelector(currentElement, 'data-vc');
22
32
  } else if (selectorConfig.testId) {
@@ -24,9 +34,11 @@ function getUniqueSelector(selectorConfig, element) {
24
34
  } else if (selectorConfig.role) {
25
35
  selectorPart += getAttributeSelector(currentElement, 'role');
26
36
  } else if (selectorConfig.className && currentElement.className) {
27
- var classNames = Array.from(currentElement.classList).map(encodeURIComponent).join('.');
37
+ var classNames = Array.from(currentElement.classList).join('.');
28
38
  if (classNames) {
29
- selectorPart += ".".concat(classNames);
39
+ if (isValidSelector(".".concat(classNames))) {
40
+ selectorPart += ".".concat(classNames);
41
+ }
30
42
  }
31
43
  }
32
44
  parts.unshift(selectorPart);
@@ -35,6 +47,7 @@ function getUniqueSelector(selectorConfig, element) {
35
47
  return _potentialSelector;
36
48
  }
37
49
  currentElement = currentElement.parentElement;
50
+ currentDepth++;
38
51
  }
39
52
  var potentialSelector = parts.join(' > ').trim();
40
53
  if (!potentialSelector) {
@@ -20,7 +20,6 @@ var VCObserverNew = /*#__PURE__*/function () {
20
20
  var _config$selectorConfi,
21
21
  _this = this;
22
22
  _classCallCheck(this, VCObserverNew);
23
- _defineProperty(this, "startTime", 0);
24
23
  _defineProperty(this, "viewportObserver", null);
25
24
  _defineProperty(this, "windowEventObserver", null);
26
25
  this.entriesTimeline = new EntriesTimeline();
@@ -68,10 +67,12 @@ var VCObserverNew = /*#__PURE__*/function () {
68
67
  }
69
68
  return _createClass(VCObserverNew, [{
70
69
  key: "start",
71
- value: function start() {
70
+ value: function start(_ref2) {
72
71
  var _this$viewportObserve, _this$windowEventObse;
72
+ var startTime = _ref2.startTime;
73
73
  (_this$viewportObserve = this.viewportObserver) === null || _this$viewportObserve === void 0 || _this$viewportObserve.start();
74
74
  (_this$windowEventObse = this.windowEventObserver) === null || _this$windowEventObse === void 0 || _this$windowEventObse.start();
75
+ this.entriesTimeline.clear();
75
76
  }
76
77
  }, {
77
78
  key: "stop",
@@ -97,7 +98,9 @@ var VCObserverNew = /*#__PURE__*/function () {
97
98
  });
98
99
  _context.next = 6;
99
100
  return calculator_fy25_03.calculate({
100
- orderedEntries: orderedEntries
101
+ orderedEntries: orderedEntries,
102
+ startTime: start,
103
+ stopTime: stop
101
104
  });
102
105
  case 6:
103
106
  fy25_03 = _context.sent;
@@ -17,11 +17,11 @@ var AbstractVCCalculatorBase = /*#__PURE__*/function () {
17
17
  var _this = this,
18
18
  _vcDetails$90$t,
19
19
  _vcDetails$;
20
- var orderedEntries, filteredEntries, isVCClean, vcDetails;
20
+ var startTime, stopTime, orderedEntries, filteredEntries, isVCClean, vcDetails;
21
21
  return _regeneratorRuntime.wrap(function _callee$(_context) {
22
22
  while (1) switch (_context.prev = _context.next) {
23
23
  case 0:
24
- orderedEntries = _ref.orderedEntries;
24
+ startTime = _ref.startTime, stopTime = _ref.stopTime, orderedEntries = _ref.orderedEntries;
25
25
  filteredEntries = orderedEntries.filter(function (entry) {
26
26
  return _this.isEntryIncluded(entry);
27
27
  });
@@ -42,6 +42,8 @@ var AbstractVCCalculatorBase = /*#__PURE__*/function () {
42
42
  width: getViewportWidth(),
43
43
  height: getViewportHeight()
44
44
  },
45
+ startTime: startTime,
46
+ stopTime: stopTime,
45
47
  orderedEntries: filteredEntries,
46
48
  percentiles: [25, 50, 75, 80, 85, 90, 95, 98, 99]
47
49
  });
@@ -222,17 +222,16 @@ export function calculateDrawnPixelsRaw(_x, _x2, _x3) {
222
222
  }
223
223
  function _calculateDrawnPixelsRaw() {
224
224
  _calculateDrawnPixelsRaw = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(imageData, scaleFactor, arraySize) {
225
- var data, scaleCompensation, arr, i, color, colorIndex;
225
+ var data, arr, i, color, colorIndex;
226
226
  return _regeneratorRuntime.wrap(function _callee2$(_context2) {
227
227
  while (1) switch (_context2.prev = _context2.next) {
228
228
  case 0:
229
229
  data = imageData.data;
230
- scaleCompensation = Math.round(1 / (scaleFactor * scaleFactor));
231
230
  arr = new Uint32Array(arraySize);
232
231
  i = 0;
233
- case 4:
232
+ case 3:
234
233
  if (!(i < data.length)) {
235
- _context2.next = 12;
234
+ _context2.next = 11;
236
235
  break;
237
236
  }
238
237
  // Check alpha
@@ -244,21 +243,21 @@ function _calculateDrawnPixelsRaw() {
244
243
  // The | operator combines all bits together
245
244
  color = data[i] << 16 | data[i + 1] << 8 | data[i + 2];
246
245
  colorIndex = color - 1;
247
- arr[colorIndex] = (arr[colorIndex] || 0) + scaleCompensation;
246
+ arr[colorIndex] = (arr[colorIndex] || 0) + 1;
248
247
  }
249
248
  if (!(i % 10000 === 0)) {
250
- _context2.next = 9;
249
+ _context2.next = 8;
251
250
  break;
252
251
  }
253
- _context2.next = 9;
252
+ _context2.next = 8;
254
253
  return taskYield();
255
- case 9:
254
+ case 8:
256
255
  i += 4;
257
- _context2.next = 4;
256
+ _context2.next = 3;
258
257
  break;
259
- case 12:
258
+ case 11:
260
259
  return _context2.abrupt("return", arr);
261
- case 13:
260
+ case 12:
262
261
  case "end":
263
262
  return _context2.stop();
264
263
  }
@@ -11,22 +11,22 @@ export default function calculateTTVCPercentiles(_x) {
11
11
  }
12
12
  function _calculateTTVCPercentiles() {
13
13
  _calculateTTVCPercentiles = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref) {
14
- var viewport, orderedEntries, percentiles, canvas, elementMap, _iterator3, _step3, entry, rect, elementName, timePixelCounts, viewportTotalPixels;
14
+ var viewport, orderedEntries, percentiles, startTime, canvas, elementMap, _iterator2, _step2, entry, rect, elementName, timePixelCounts, canvasDimenstions, totalPixels;
15
15
  return _regeneratorRuntime.wrap(function _callee$(_context) {
16
16
  while (1) switch (_context.prev = _context.next) {
17
17
  case 0:
18
- viewport = _ref.viewport, orderedEntries = _ref.orderedEntries, percentiles = _ref.percentiles;
18
+ viewport = _ref.viewport, orderedEntries = _ref.orderedEntries, percentiles = _ref.percentiles, startTime = _ref.startTime;
19
19
  canvas = new ViewportCanvas(viewport, fg('platform_ufo_canvas_heatmap_full_precision') ? 1 : 0.25);
20
20
  elementMap = new Map();
21
- _iterator3 = _createForOfIteratorHelper(orderedEntries);
21
+ _iterator2 = _createForOfIteratorHelper(orderedEntries);
22
22
  _context.prev = 4;
23
- _iterator3.s();
23
+ _iterator2.s();
24
24
  case 6:
25
- if ((_step3 = _iterator3.n()).done) {
25
+ if ((_step2 = _iterator2.n()).done) {
26
26
  _context.next = 17;
27
27
  break;
28
28
  }
29
- entry = _step3.value;
29
+ entry = _step2.value;
30
30
  if ('rect' in entry.data) {
31
31
  _context.next = 10;
32
32
  break;
@@ -49,19 +49,20 @@ function _calculateTTVCPercentiles() {
49
49
  case 19:
50
50
  _context.prev = 19;
51
51
  _context.t0 = _context["catch"](4);
52
- _iterator3.e(_context.t0);
52
+ _iterator2.e(_context.t0);
53
53
  case 22:
54
54
  _context.prev = 22;
55
- _iterator3.f();
55
+ _iterator2.f();
56
56
  return _context.finish(22);
57
57
  case 25:
58
58
  _context.next = 27;
59
59
  return canvas.getPixelCounts();
60
60
  case 27:
61
61
  timePixelCounts = _context.sent;
62
- viewportTotalPixels = viewport.width * viewport.height;
63
- return _context.abrupt("return", calculatePercentiles(timePixelCounts, elementMap, percentiles, viewportTotalPixels));
64
- case 30:
62
+ canvasDimenstions = canvas.getScaledDimensions();
63
+ totalPixels = canvasDimenstions.width * canvasDimenstions.height;
64
+ return _context.abrupt("return", calculatePercentiles(timePixelCounts, elementMap, percentiles, totalPixels, startTime));
65
+ case 31:
65
66
  case "end":
66
67
  return _context.stop();
67
68
  }
@@ -69,7 +70,7 @@ function _calculateTTVCPercentiles() {
69
70
  }));
70
71
  return _calculateTTVCPercentiles.apply(this, arguments);
71
72
  }
72
- export function calculatePercentiles(timePixelCounts, elementMap, unorderedPercentiles, totalPixels) {
73
+ export function calculatePercentiles(timePixelCounts, elementMap, unorderedPercentiles, totalPixels, startTime) {
73
74
  var results = {};
74
75
  var cumulativePixels = 0;
75
76
  var percentiles = unorderedPercentiles.sort(function (a, b) {
@@ -102,7 +103,7 @@ export function calculatePercentiles(timePixelCounts, elementMap, unorderedPerce
102
103
  var matchesAnyCheckpoints = false;
103
104
  while (percentileIndex < percentiles.length && percentCovered >= percentiles[percentileIndex]) {
104
105
  results["".concat(percentiles[percentileIndex])] = {
105
- t: Number(time),
106
+ t: Math.round(Number(time - startTime)),
106
107
  e: Array.from(domElementsBuffer)
107
108
  };
108
109
  percentileIndex++;
@@ -115,29 +116,21 @@ export function calculatePercentiles(timePixelCounts, elementMap, unorderedPerce
115
116
  break;
116
117
  }
117
118
  }
118
-
119
- // Fill in any missing percentiles
120
119
  } catch (err) {
121
120
  _iterator.e(err);
122
121
  } finally {
123
122
  _iterator.f();
124
123
  }
125
- var _iterator2 = _createForOfIteratorHelper(percentiles),
126
- _step2;
127
- try {
128
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
129
- var percentile = _step2.value;
130
- if (!(percentile in results)) {
131
- results["".concat(percentile)] = {
132
- t: 0,
133
- e: []
134
- };
135
- }
124
+ var previousResult = {
125
+ t: 0,
126
+ e: []
127
+ };
128
+ for (var i = 0; i < percentiles.length; i++) {
129
+ var percentile = percentiles[i];
130
+ if (!(percentile in results)) {
131
+ results["".concat(percentile)] = previousResult;
136
132
  }
137
- } catch (err) {
138
- _iterator2.e(err);
139
- } finally {
140
- _iterator2.f();
133
+ previousResult = results["".concat(percentile)];
141
134
  }
142
135
  return results;
143
136
  }
@@ -236,7 +236,7 @@ var Heatmap = /*#__PURE__*/function () {
236
236
  }, {
237
237
  key: "getVCPercentMetrics",
238
238
  value: function () {
239
- var _getVCPercentMetrics = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(vcPercentCheckpoint) {
239
+ var _getVCPercentMetrics = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(vcPercentCheckpoint, startTime) {
240
240
  var sortedCheckpoints, flattenHeatmap, totalCells, timestampMap, i, _cellHead$time, _timestampMap$get, cell, cellHead, timestamp, elementName, curr, sortedTimings, totalCellPainted, result, domElementsBuffer, _i, _timestamp, timestampInfo, cellCount, domElements, currVCRatio, currVCPercent, matchesAnyCheckpoints, checkpoint, _domElements;
241
241
  return _regeneratorRuntime.wrap(function _callee2$(_context2) {
242
242
  while (1) switch (_context2.prev = _context2.next) {
@@ -324,7 +324,7 @@ var Heatmap = /*#__PURE__*/function () {
324
324
  case 41:
325
325
  matchesAnyCheckpoints = true;
326
326
  result[checkpoint.toString()] = {
327
- t: _timestamp,
327
+ t: Math.round(_timestamp - startTime),
328
328
  e: _domElements
329
329
  };
330
330
  _context2.next = 36;
@@ -351,23 +351,23 @@ var Heatmap = /*#__PURE__*/function () {
351
351
  }
352
352
  }, _callee2, this);
353
353
  }));
354
- function getVCPercentMetrics(_x2) {
354
+ function getVCPercentMetrics(_x2, _x3) {
355
355
  return _getVCPercentMetrics.apply(this, arguments);
356
356
  }
357
357
  return getVCPercentMetrics;
358
358
  }()
359
359
  }]);
360
360
  }();
361
- export default function calculateTTVCPercentiles(_x3) {
361
+ export default function calculateTTVCPercentiles(_x4) {
362
362
  return _calculateTTVCPercentiles.apply(this, arguments);
363
363
  }
364
364
  function _calculateTTVCPercentiles() {
365
365
  _calculateTTVCPercentiles = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(_ref2) {
366
- var orderedEntries, viewport, percentiles, heatmap, vcDetails;
366
+ var orderedEntries, viewport, percentiles, startTime, heatmap, vcDetails;
367
367
  return _regeneratorRuntime.wrap(function _callee3$(_context3) {
368
368
  while (1) switch (_context3.prev = _context3.next) {
369
369
  case 0:
370
- orderedEntries = _ref2.orderedEntries, viewport = _ref2.viewport, percentiles = _ref2.percentiles;
370
+ orderedEntries = _ref2.orderedEntries, viewport = _ref2.viewport, percentiles = _ref2.percentiles, startTime = _ref2.startTime;
371
371
  heatmap = new Heatmap({
372
372
  viewport: viewport,
373
373
  heatmapSize: 200
@@ -376,7 +376,7 @@ function _calculateTTVCPercentiles() {
376
376
  return heatmap.applyEntriesToHeatmap(orderedEntries);
377
377
  case 4:
378
378
  _context3.next = 6;
379
- return heatmap.getVCPercentMetrics(percentiles);
379
+ return heatmap.getVCPercentMetrics(percentiles, startTime);
380
380
  case 6:
381
381
  vcDetails = _context3.sent;
382
382
  return _context3.abrupt("return", vcDetails);