@atlaskit/react-ufo 3.1.4 → 3.3.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 (179) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +11 -0
  3. package/dist/cjs/create-experimental-interaction-metrics-payload/index.js +52 -25
  4. package/dist/cjs/create-payload/index.js +290 -231
  5. package/dist/cjs/interaction-metrics/index.js +61 -23
  6. package/dist/cjs/interaction-metrics/post-interaction-log.js +63 -34
  7. package/dist/cjs/interaction-metrics-init/index.js +26 -7
  8. package/dist/cjs/segment/schedule-on-paint.js +35 -0
  9. package/dist/cjs/segment/segment.js +10 -1
  10. package/dist/cjs/vc/index.js +105 -1
  11. package/dist/cjs/vc/types.js +5 -0
  12. package/dist/cjs/vc/vc-observer/index.js +198 -208
  13. package/dist/cjs/vc/vc-observer-new/entries-timeline/index.js +56 -0
  14. package/dist/cjs/vc/vc-observer-new/get-element-name.js +68 -0
  15. package/dist/cjs/vc/vc-observer-new/index.js +132 -0
  16. package/dist/cjs/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +75 -0
  17. package/dist/cjs/vc/vc-observer-new/metric-calculator/fy25_03/index.js +60 -0
  18. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.js +274 -0
  19. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js +151 -0
  20. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.js +367 -0
  21. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.js +397 -0
  22. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.js +5 -0
  23. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/index.js +61 -0
  24. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.js +151 -0
  25. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.js +107 -0
  26. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/types.js +5 -0
  27. package/dist/cjs/vc/vc-observer-new/metric-calculator/types.js +5 -0
  28. package/dist/cjs/vc/vc-observer-new/metric-calculator/utils/get-viewport-height.js +16 -0
  29. package/dist/cjs/vc/vc-observer-new/metric-calculator/utils/get-viewport-width.js +16 -0
  30. package/dist/cjs/vc/vc-observer-new/metric-calculator/utils/is-viewport-entry-data.js +16 -0
  31. package/dist/cjs/vc/vc-observer-new/metric-calculator/utils/task-yield.js +45 -0
  32. package/dist/cjs/vc/vc-observer-new/types.js +5 -0
  33. package/dist/cjs/vc/vc-observer-new/viewport-observer/index.js +195 -0
  34. package/dist/cjs/vc/vc-observer-new/viewport-observer/intersection-observer/index.js +71 -0
  35. package/dist/cjs/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +65 -0
  36. package/dist/cjs/vc/vc-observer-new/viewport-observer/performance-observer/index.js +58 -0
  37. package/dist/cjs/vc/vc-observer-new/viewport-observer/types.js +1 -0
  38. package/dist/cjs/vc/vc-observer-new/window-event-observer/index.js +54 -0
  39. package/dist/es2019/create-experimental-interaction-metrics-payload/index.js +2 -2
  40. package/dist/es2019/create-payload/index.js +8 -7
  41. package/dist/es2019/interaction-metrics/index.js +3 -3
  42. package/dist/es2019/interaction-metrics/post-interaction-log.js +5 -5
  43. package/dist/es2019/interaction-metrics-init/index.js +26 -7
  44. package/dist/es2019/segment/schedule-on-paint.js +29 -0
  45. package/dist/es2019/segment/segment.js +9 -1
  46. package/dist/es2019/vc/index.js +56 -1
  47. package/dist/es2019/vc/types.js +1 -0
  48. package/dist/es2019/vc/vc-observer/index.js +1 -4
  49. package/dist/es2019/vc/vc-observer-new/entries-timeline/index.js +34 -0
  50. package/dist/es2019/vc/vc-observer-new/get-element-name.js +62 -0
  51. package/dist/es2019/vc/vc-observer-new/index.js +98 -0
  52. package/dist/es2019/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +38 -0
  53. package/dist/es2019/vc/vc-observer-new/metric-calculator/fy25_03/index.js +39 -0
  54. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.js +194 -0
  55. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js +69 -0
  56. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.js +248 -0
  57. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.js +261 -0
  58. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.js +1 -0
  59. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/index.js +19 -0
  60. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.js +98 -0
  61. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.js +58 -0
  62. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/types.js +1 -0
  63. package/dist/es2019/vc/vc-observer-new/metric-calculator/types.js +1 -0
  64. package/dist/es2019/vc/vc-observer-new/metric-calculator/utils/get-viewport-height.js +9 -0
  65. package/dist/es2019/vc/vc-observer-new/metric-calculator/utils/get-viewport-width.js +9 -0
  66. package/dist/es2019/vc/vc-observer-new/metric-calculator/utils/is-viewport-entry-data.js +10 -0
  67. package/dist/es2019/vc/vc-observer-new/metric-calculator/utils/task-yield.js +17 -0
  68. package/dist/es2019/vc/vc-observer-new/types.js +1 -0
  69. package/dist/es2019/vc/vc-observer-new/viewport-observer/index.js +168 -0
  70. package/dist/es2019/vc/vc-observer-new/viewport-observer/intersection-observer/index.js +65 -0
  71. package/dist/es2019/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +48 -0
  72. package/dist/es2019/vc/vc-observer-new/viewport-observer/performance-observer/index.js +41 -0
  73. package/dist/es2019/vc/vc-observer-new/viewport-observer/types.js +0 -0
  74. package/dist/es2019/vc/vc-observer-new/window-event-observer/index.js +36 -0
  75. package/dist/esm/create-experimental-interaction-metrics-payload/index.js +52 -25
  76. package/dist/esm/create-payload/index.js +290 -231
  77. package/dist/esm/interaction-metrics/index.js +61 -23
  78. package/dist/esm/interaction-metrics/post-interaction-log.js +63 -34
  79. package/dist/esm/interaction-metrics-init/index.js +26 -7
  80. package/dist/esm/segment/schedule-on-paint.js +29 -0
  81. package/dist/esm/segment/segment.js +10 -1
  82. package/dist/esm/vc/index.js +104 -1
  83. package/dist/esm/vc/types.js +1 -0
  84. package/dist/esm/vc/vc-observer/index.js +198 -208
  85. package/dist/esm/vc/vc-observer-new/entries-timeline/index.js +50 -0
  86. package/dist/esm/vc/vc-observer-new/get-element-name.js +62 -0
  87. package/dist/esm/vc/vc-observer-new/index.js +126 -0
  88. package/dist/esm/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +69 -0
  89. package/dist/esm/vc/vc-observer-new/metric-calculator/fy25_03/index.js +54 -0
  90. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.js +268 -0
  91. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js +143 -0
  92. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.js +361 -0
  93. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.js +390 -0
  94. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.js +1 -0
  95. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/index.js +54 -0
  96. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.js +144 -0
  97. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.js +100 -0
  98. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/types.js +1 -0
  99. package/dist/esm/vc/vc-observer-new/metric-calculator/types.js +1 -0
  100. package/dist/esm/vc/vc-observer-new/metric-calculator/utils/get-viewport-height.js +10 -0
  101. package/dist/esm/vc/vc-observer-new/metric-calculator/utils/get-viewport-width.js +10 -0
  102. package/dist/esm/vc/vc-observer-new/metric-calculator/utils/is-viewport-entry-data.js +10 -0
  103. package/dist/esm/vc/vc-observer-new/metric-calculator/utils/task-yield.js +38 -0
  104. package/dist/esm/vc/vc-observer-new/types.js +1 -0
  105. package/dist/esm/vc/vc-observer-new/viewport-observer/index.js +189 -0
  106. package/dist/esm/vc/vc-observer-new/viewport-observer/intersection-observer/index.js +65 -0
  107. package/dist/esm/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +59 -0
  108. package/dist/esm/vc/vc-observer-new/viewport-observer/performance-observer/index.js +51 -0
  109. package/dist/esm/vc/vc-observer-new/viewport-observer/types.js +0 -0
  110. package/dist/esm/vc/vc-observer-new/window-event-observer/index.js +48 -0
  111. package/dist/types/common/index.d.ts +1 -0
  112. package/dist/types/create-experimental-interaction-metrics-payload/index.d.ts +3 -2
  113. package/dist/types/create-payload/index.d.ts +4 -4
  114. package/dist/types/interaction-metrics/post-interaction-log.d.ts +3 -2
  115. package/dist/types/segment/schedule-on-paint.d.ts +2 -0
  116. package/dist/types/vc/index.d.ts +3 -3
  117. package/dist/types/vc/types.d.ts +34 -0
  118. package/dist/types/vc/vc-observer/index.d.ts +5 -21
  119. package/dist/types/vc/vc-observer-new/entries-timeline/index.d.ts +13 -0
  120. package/dist/types/vc/vc-observer-new/get-element-name.d.ts +8 -0
  121. package/dist/types/vc/vc-observer-new/index.d.ts +18 -0
  122. package/dist/types/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.d.ts +9 -0
  123. package/dist/types/vc/vc-observer-new/metric-calculator/fy25_03/index.d.ts +7 -0
  124. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.d.ts +91 -0
  125. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.d.ts +4 -0
  126. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.d.ts +39 -0
  127. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.d.ts +8 -0
  128. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.d.ts +43 -0
  129. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/index.d.ts +3 -0
  130. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.d.ts +11 -0
  131. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.d.ts +23 -0
  132. package/dist/types/vc/vc-observer-new/metric-calculator/percentile-calc/types.d.ts +9 -0
  133. package/dist/types/vc/vc-observer-new/metric-calculator/types.d.ts +20 -0
  134. package/dist/types/vc/vc-observer-new/metric-calculator/utils/get-viewport-height.d.ts +1 -0
  135. package/dist/types/vc/vc-observer-new/metric-calculator/utils/get-viewport-width.d.ts +1 -0
  136. package/dist/types/vc/vc-observer-new/metric-calculator/utils/is-viewport-entry-data.d.ts +2 -0
  137. package/dist/types/vc/vc-observer-new/metric-calculator/utils/task-yield.d.ts +1 -0
  138. package/dist/types/vc/vc-observer-new/types.d.ts +21 -0
  139. package/dist/types/vc/vc-observer-new/viewport-observer/index.d.ts +22 -0
  140. package/dist/types/vc/vc-observer-new/viewport-observer/intersection-observer/index.d.ts +30 -0
  141. package/dist/types/vc/vc-observer-new/viewport-observer/mutation-observer/index.d.ts +14 -0
  142. package/dist/types/vc/vc-observer-new/viewport-observer/performance-observer/index.d.ts +14 -0
  143. package/dist/types/vc/vc-observer-new/viewport-observer/types.d.ts +10 -0
  144. package/dist/types/vc/vc-observer-new/window-event-observer/index.d.ts +17 -0
  145. package/dist/types-ts4.5/common/index.d.ts +1 -0
  146. package/dist/types-ts4.5/create-experimental-interaction-metrics-payload/index.d.ts +3 -2
  147. package/dist/types-ts4.5/create-payload/index.d.ts +4 -4
  148. package/dist/types-ts4.5/interaction-metrics/post-interaction-log.d.ts +3 -2
  149. package/dist/types-ts4.5/segment/schedule-on-paint.d.ts +2 -0
  150. package/dist/types-ts4.5/vc/index.d.ts +3 -3
  151. package/dist/types-ts4.5/vc/types.d.ts +34 -0
  152. package/dist/types-ts4.5/vc/vc-observer/index.d.ts +5 -21
  153. package/dist/types-ts4.5/vc/vc-observer-new/entries-timeline/index.d.ts +13 -0
  154. package/dist/types-ts4.5/vc/vc-observer-new/get-element-name.d.ts +8 -0
  155. package/dist/types-ts4.5/vc/vc-observer-new/index.d.ts +18 -0
  156. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.d.ts +9 -0
  157. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/fy25_03/index.d.ts +7 -0
  158. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.d.ts +91 -0
  159. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.d.ts +4 -0
  160. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/heatmap.d.ts +39 -0
  161. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/index.d.ts +8 -0
  162. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/heatmap/types.d.ts +43 -0
  163. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/index.d.ts +3 -0
  164. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/calc-union-area.d.ts +11 -0
  165. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/rect-sweeping-line/index.d.ts +23 -0
  166. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/percentile-calc/types.d.ts +9 -0
  167. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/types.d.ts +20 -0
  168. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/utils/get-viewport-height.d.ts +1 -0
  169. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/utils/get-viewport-width.d.ts +1 -0
  170. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/utils/is-viewport-entry-data.d.ts +2 -0
  171. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/utils/task-yield.d.ts +1 -0
  172. package/dist/types-ts4.5/vc/vc-observer-new/types.d.ts +21 -0
  173. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/index.d.ts +22 -0
  174. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/intersection-observer/index.d.ts +30 -0
  175. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/mutation-observer/index.d.ts +14 -0
  176. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/performance-observer/index.d.ts +14 -0
  177. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/types.d.ts +10 -0
  178. package/dist/types-ts4.5/vc/vc-observer-new/window-event-observer/index.d.ts +17 -0
  179. package/package.json +13 -1
@@ -57,11 +57,11 @@ export class ExperimentalVCMetrics {
57
57
  }
58
58
  }
59
59
  export const experimentalVC = new ExperimentalVCMetrics();
60
- export const getExperimentalVCMetrics = interaction => {
60
+ export const getExperimentalVCMetrics = async interaction => {
61
61
  if (experimentalVC.vcObserver) {
62
62
  var _interaction$apdex, _interaction$apdex$;
63
63
  const prefix = 'ufo-experimental';
64
- const result = experimentalVC.vcObserver.getVCResult({
64
+ const result = await experimentalVC.vcObserver.getVCResult({
65
65
  start: interaction.start,
66
66
  stop: interaction.end,
67
67
  tti: (_interaction$apdex = interaction.apdex) === null || _interaction$apdex === void 0 ? void 0 : (_interaction$apdex$ = _interaction$apdex[0]) === null || _interaction$apdex$ === void 0 ? void 0 : _interaction$apdex$.stopTime,
@@ -165,7 +165,7 @@ const getTTAI = interaction => {
165
165
  const pageVisibilityUpToTTAI = getPageVisibilityUpToTTAI(interaction);
166
166
  return !interaction.abortReason && pageVisibilityUpToTTAI === 'visible' ? Math.round(end - start) : undefined;
167
167
  };
168
- const getVCMetrics = interaction => {
168
+ const getVCMetrics = async interaction => {
169
169
  var _config$vc, _config$vc$ssrWhiteli, _interaction$apdex, _interaction$apdex$, _config$experimentalI;
170
170
  const config = getConfig();
171
171
  if (!(config !== null && config !== void 0 && (_config$vc = config.vc) !== null && _config$vc !== void 0 && _config$vc.enabled)) {
@@ -181,7 +181,7 @@ const getVCMetrics = interaction => {
181
181
  postInteractionLog.setVCObserverSSRConfig(ssr);
182
182
  const tti = (_interaction$apdex = interaction.apdex) === null || _interaction$apdex === void 0 ? void 0 : (_interaction$apdex$ = _interaction$apdex[0]) === null || _interaction$apdex$ === void 0 ? void 0 : _interaction$apdex$.stopTime;
183
183
  const prefix = 'ufo';
184
- const result = getVCObserver().getVCResult({
184
+ const result = await getVCObserver().getVCResult({
185
185
  start: interaction.start,
186
186
  stop: interaction.end,
187
187
  tti,
@@ -699,7 +699,7 @@ function getErrorCounts(interaction) {
699
699
  'ufo:errors:count': interaction.errors.length
700
700
  };
701
701
  }
702
- function createInteractionMetricsPayload(interaction, interactionId, experimental) {
702
+ async function createInteractionMetricsPayload(interaction, interactionId, experimental) {
703
703
  var _window$location, _config$additionalPay;
704
704
  const interactionPayloadStart = performance.now();
705
705
  const config = getConfig();
@@ -793,6 +793,7 @@ function createInteractionMetricsPayload(interaction, interactionId, experimenta
793
793
  }
794
794
  const newUFOName = sanitizeUfoName(ufoName);
795
795
  const resourceTimings = getResourceTimings(start, end);
796
+ const [vcMetrics, experimentalMetrics] = await Promise.all([getVCMetrics(interaction), experimental ? getExperimentalVCMetrics(interaction) : Promise.resolve(undefined)]);
796
797
  const payload = {
797
798
  actionSubject: 'experience',
798
799
  action: 'measured',
@@ -820,8 +821,8 @@ function createInteractionMetricsPayload(interaction, interactionId, experimenta
820
821
  ...getPPSMetrics(interaction),
821
822
  ...getPaintMetrics(type),
822
823
  ...getNavigationMetrics(type),
823
- ...getVCMetrics(interaction),
824
- ...(experimental ? getExperimentalVCMetrics(interaction) : undefined),
824
+ ...vcMetrics,
825
+ ...experimentalMetrics,
825
826
  ...((_config$additionalPay = config.additionalPayloadData) === null || _config$additionalPay === void 0 ? void 0 : _config$additionalPay.call(config, interaction)),
826
827
  ...getTracingContextData(interaction),
827
828
  ...getStylesheetMetrics(),
@@ -876,13 +877,13 @@ function createInteractionMetricsPayload(interaction, interactionId, experimenta
876
877
  payload.attributes.properties['event:sizeInKb'] = getPayloadSize(payload.attributes.properties);
877
878
  return payload;
878
879
  }
879
- export function createPayloads(interactionId, interaction) {
880
+ export async function createPayloads(interactionId, interaction) {
880
881
  const ufoNameOverride = getUfoNameOverride(interaction);
881
882
  const modifiedInteraction = {
882
883
  ...interaction,
883
884
  ufoName: ufoNameOverride
884
885
  };
885
- const interactionMetricsPayload = createInteractionMetricsPayload(modifiedInteraction, interactionId);
886
+ const interactionMetricsPayload = await createInteractionMetricsPayload(modifiedInteraction, interactionId);
886
887
  return [interactionMetricsPayload];
887
888
  }
888
889
  export function createExperimentalMetricsPayload(interactionId, interaction) {
@@ -502,15 +502,15 @@ export function tryComplete(interactionId, endTime) {
502
502
  if (interaction != null) {
503
503
  const noMoreActiveHolds = interaction.holdActive.size === 0;
504
504
  const noMoreExpHolds = interaction.holdExpActive.size === 0;
505
- const postInteraction = () => {
505
+ const postInteraction = async () => {
506
506
  var _getConfig6, _getConfig6$postInter, _getConfig8, _getConfig8$experimen;
507
507
  if ((_getConfig6 = getConfig()) !== null && _getConfig6 !== void 0 && (_getConfig6$postInter = _getConfig6.postInteractionLog) !== null && _getConfig6$postInter !== void 0 && _getConfig6$postInter.enabled) {
508
508
  var _getConfig7, _getConfig7$experimen;
509
509
  let experimentalVC90;
510
510
  let experimentalTTAI;
511
511
  if ((_getConfig7 = getConfig()) !== null && _getConfig7 !== void 0 && (_getConfig7$experimen = _getConfig7.experimentalInteractionMetrics) !== null && _getConfig7$experimen !== void 0 && _getConfig7$experimen.enabled) {
512
- var _getExperimentalVCMet;
513
- experimentalVC90 = (_getExperimentalVCMet = getExperimentalVCMetrics(interaction)) === null || _getExperimentalVCMet === void 0 ? void 0 : _getExperimentalVCMet['metric:experimental:vc90'];
512
+ var _await$getExperimenta;
513
+ experimentalVC90 = (_await$getExperimenta = await getExperimentalVCMetrics(interaction)) === null || _await$getExperimenta === void 0 ? void 0 : _await$getExperimenta['metric:experimental:vc90'];
514
514
  const {
515
515
  start,
516
516
  end
@@ -85,7 +85,7 @@ export default class PostInteractionLog {
85
85
  /**
86
86
  * Send the log if there is data
87
87
  */
88
- sendPostInteractionLog() {
88
+ async sendPostInteractionLog() {
89
89
  var _this$vcObserver3, _getConfig2, _getConfig2$experimen;
90
90
  if (!this.hasData() || !this.lastInteractionFinish || !this.sinkHandlerFn) {
91
91
  var _getConfig, _getConfig$experiment;
@@ -96,14 +96,14 @@ export default class PostInteractionLog {
96
96
  }
97
97
  return;
98
98
  }
99
- const postInteractionFinishVCResult = (_this$vcObserver3 = this.vcObserver) === null || _this$vcObserver3 === void 0 ? void 0 : _this$vcObserver3.getVCResult({
99
+ const postInteractionFinishVCResult = await ((_this$vcObserver3 = this.vcObserver) === null || _this$vcObserver3 === void 0 ? void 0 : _this$vcObserver3.getVCResult({
100
100
  start: this.lastInteractionFinish.start,
101
101
  stop: performance.now(),
102
102
  tti: -1,
103
103
  // no need for TTI value here
104
104
  prefix: 'ufo',
105
105
  ...this.vcObserverSSRConfig
106
- });
106
+ }));
107
107
  if ((_getConfig2 = getConfig()) !== null && _getConfig2 !== void 0 && (_getConfig2$experimen = _getConfig2.experimentalInteractionMetrics) !== null && _getConfig2$experimen !== void 0 && _getConfig2$experimen.enabled) {
108
108
  var _this$vcObserver4;
109
109
  (_this$vcObserver4 = this.vcObserver) === null || _this$vcObserver4 === void 0 ? void 0 : _this$vcObserver4.stop();
@@ -149,8 +149,8 @@ export default class PostInteractionLog {
149
149
  experimentalVC90
150
150
  };
151
151
  const timeout = ((_getConfig3 = getConfig()) === null || _getConfig3 === void 0 ? void 0 : _getConfig3.timeWindowForLateMutationsInMilliseconds) || POST_INTERACTION_LOG_SEND_DEFAULT_TIMEOUT;
152
- this.sinkTimeoutId = window.setTimeout(() => {
153
- this.sendPostInteractionLog();
152
+ this.sinkTimeoutId = window.setTimeout(async () => {
153
+ await this.sendPostInteractionLog();
154
154
  }, timeout);
155
155
  }
156
156
 
@@ -1,4 +1,5 @@
1
1
  import { unstable_IdlePriority as idlePriority, unstable_scheduleCallback as scheduleCallback } from 'scheduler';
2
+ import { fg } from '@atlaskit/platform-feature-flags';
2
3
  import { startLighthouseObserver } from '../additional-payload';
3
4
  import { setUFOConfig } from '../config';
4
5
  import { experimentalVC, sinkExperimentalHandler } from '../create-experimental-interaction-metrics-payload';
@@ -9,13 +10,17 @@ let initialized = false;
9
10
  function sinkInteraction(instance, payloadPackage) {
10
11
  sinkInteractionHandler((interactionId, interaction) => {
11
12
  scheduleCallback(idlePriority, () => {
12
- const payloads = payloadPackage.createPayloads(interactionId, interaction);
13
- const devToolObserver = globalThis.__ufo_devtool_onUfoPayload;
14
- payloads === null || payloads === void 0 ? void 0 : payloads.forEach(payload => {
15
- if (typeof devToolObserver === 'function') {
16
- devToolObserver === null || devToolObserver === void 0 ? void 0 : devToolObserver(payload);
17
- }
18
- instance.sendOperationalEvent(payload);
13
+ payloadPackage.createPayloads(interactionId, interaction).then(payloads => {
14
+ // NOTE: This API is used by the UFO DevTool Chrome Extension and Criterion
15
+ const devToolObserver = globalThis.__ufo_devtool_onUfoPayload;
16
+ payloads === null || payloads === void 0 ? void 0 : payloads.forEach(payload => {
17
+ if (typeof devToolObserver === 'function') {
18
+ devToolObserver === null || devToolObserver === void 0 ? void 0 : devToolObserver(payload);
19
+ }
20
+ instance.sendOperationalEvent(payload);
21
+ });
22
+ }).catch(error => {
23
+ throw error;
19
24
  });
20
25
  });
21
26
  });
@@ -25,6 +30,13 @@ function sinkExperimentalInteractionMetrics(instance, payloadPackage) {
25
30
  scheduleCallback(idlePriority, () => {
26
31
  const payload = payloadPackage.createExperimentalMetricsPayload(interactionId, interaction);
27
32
  if (payload) {
33
+ if (fg('enable_ufo_devtools_api_for_extra_events')) {
34
+ // NOTE: This API is used by the UFO DevTool Chrome Extension and Criterion
35
+ const devToolObserver = globalThis.__ufo_devtool_onUfoPayload;
36
+ if (typeof devToolObserver === 'function') {
37
+ devToolObserver === null || devToolObserver === void 0 ? void 0 : devToolObserver(payload);
38
+ }
39
+ }
28
40
  instance.sendOperationalEvent(payload);
29
41
  }
30
42
  });
@@ -35,6 +47,13 @@ function sinkPostInteractionLog(instance, createPostInteractionLogPayload) {
35
47
  scheduleCallback(idlePriority, () => {
36
48
  const payload = createPostInteractionLogPayload(logOutput);
37
49
  if (payload) {
50
+ // NOTE: This API is used by the UFO DevTool Chrome Extension and also by Criterion
51
+ if (fg('enable_ufo_devtools_api_for_extra_events')) {
52
+ const devToolObserver = globalThis.__ufo_devtool_onUfoPayload;
53
+ if (typeof devToolObserver === 'function') {
54
+ devToolObserver === null || devToolObserver === void 0 ? void 0 : devToolObserver(payload);
55
+ }
56
+ }
38
57
  instance.sendOperationalEvent(payload);
39
58
  }
40
59
  });
@@ -0,0 +1,29 @@
1
+ export default function scheduleOnPaint(callback) {
2
+ var _document;
3
+ if (((_document = document) === null || _document === void 0 ? void 0 : _document.visibilityState) !== 'visible') {
4
+ // last resort fallback
5
+ setTimeout(callback, 100);
6
+ return;
7
+ }
8
+
9
+ // Check if the Scheduler API is available
10
+ if (typeof window.scheduler !== 'undefined' && typeof window.scheduler.postTask === 'function') {
11
+ // Use scheduler.postTask if available
12
+ // https://developer.mozilla.org/en-US/docs/Web/API/Prioritized_Task_Scheduling_API
13
+ // Make sure we are scheduling this task before the browser paint the next frame
14
+ requestAnimationFrame(() => {
15
+ window.scheduler.postTask(callback, {
16
+ priority: 'user-visible'
17
+ });
18
+ });
19
+ }
20
+ // if active tab, and can do requestAnimationFrame
21
+ else if (typeof requestAnimationFrame !== 'undefined') {
22
+ // Fallback to using double requestAnimationFrame
23
+ requestAnimationFrame(() => {
24
+ requestAnimationFrame(() => {
25
+ callback();
26
+ });
27
+ });
28
+ }
29
+ }
@@ -10,6 +10,7 @@ import UFOInteractionIDContext from '../interaction-id-context';
10
10
  import { abortByNewInteraction, addApdex, addCustomData, addCustomTiming, addHold, addHoldByID, addMark, addNewInteraction, addProfilerTimings, addRequestInfo, addSegment, addSpan, removeHoldByID, removeSegment, tryComplete } from '../interaction-metrics';
11
11
  import UFORouteName from '../route-name-context';
12
12
  import generateId from '../short-id';
13
+ import scheduleOnPaint from './schedule-on-paint';
13
14
  let tryCompleteHandle;
14
15
  const AsyncSegmentHighlight = /*#__PURE__*/lazy(() => import( /* webpackChunkName: "@atlaskit-internal_ufo-segment-highlight" */'./segment-highlight').then(module => ({
15
16
  default: module.SegmentHighlight
@@ -189,7 +190,14 @@ export default function UFOSegment({
189
190
  onRender(phase, actualDuration, baseDuration, startTime, commitTime) {
190
191
  if (interactionId.current !== null) {
191
192
  addProfilerTimings(interactionId.current, this.labelStack, phase, actualDuration, baseDuration, startTime, commitTime);
192
- this.complete(commitTime);
193
+ if (fg('platform_ufo_vc_ttai_on_paint')) {
194
+ scheduleOnPaint(() => {
195
+ const paintedTime = performance.now();
196
+ this.complete(paintedTime);
197
+ });
198
+ } else {
199
+ this.complete(commitTime);
200
+ }
193
201
  }
194
202
  },
195
203
  _internalHold,
@@ -1,7 +1,62 @@
1
+ import { fg } from '@atlaskit/platform-feature-flags';
1
2
  import { VCObserver } from './vc-observer';
3
+ import VCObserverNew from './vc-observer-new';
4
+ class VCObserverWrapper {
5
+ constructor(opts = {}) {
6
+ this.oldVCObserver = new VCObserver(opts);
7
+ this.newVCObserver = null;
8
+ const isNewVCObserverEnabled = fg('platform_ufo_vc_observer_new');
9
+ if (isNewVCObserverEnabled) {
10
+ this.newVCObserver = new VCObserverNew({
11
+ selectorConfig: opts.selectorConfig
12
+ });
13
+ }
14
+ }
15
+ start(startArg) {
16
+ var _this$oldVCObserver, _this$newVCObserver;
17
+ (_this$oldVCObserver = this.oldVCObserver) === null || _this$oldVCObserver === void 0 ? void 0 : _this$oldVCObserver.start(startArg);
18
+ (_this$newVCObserver = this.newVCObserver) === null || _this$newVCObserver === void 0 ? void 0 : _this$newVCObserver.start();
19
+ }
20
+ stop() {
21
+ var _this$oldVCObserver2, _this$newVCObserver2;
22
+ (_this$oldVCObserver2 = this.oldVCObserver) === null || _this$oldVCObserver2 === void 0 ? void 0 : _this$oldVCObserver2.stop();
23
+ (_this$newVCObserver2 = this.newVCObserver) === null || _this$newVCObserver2 === void 0 ? void 0 : _this$newVCObserver2.stop();
24
+ }
25
+ getVCRawData() {
26
+ var _this$oldVCObserver$g, _this$oldVCObserver3;
27
+ return (_this$oldVCObserver$g = (_this$oldVCObserver3 = this.oldVCObserver) === null || _this$oldVCObserver3 === void 0 ? void 0 : _this$oldVCObserver3.getVCRawData()) !== null && _this$oldVCObserver$g !== void 0 ? _this$oldVCObserver$g : null;
28
+ }
29
+ async getVCResult(param) {
30
+ var _this$oldVCObserver4, _this$newVCObserver3, _ref;
31
+ const oldResult = await ((_this$oldVCObserver4 = this.oldVCObserver) === null || _this$oldVCObserver4 === void 0 ? void 0 : _this$oldVCObserver4.getVCResult(param));
32
+ const newResult = await ((_this$newVCObserver3 = this.newVCObserver) === null || _this$newVCObserver3 === void 0 ? void 0 : _this$newVCObserver3.getVCResult({
33
+ start: param.start,
34
+ stop: fg('platform_ufo_vc_ttai_on_paint') ? param.stop : performance.now()
35
+ }));
36
+ if (oldResult && !newResult) {
37
+ return oldResult;
38
+ }
39
+ return {
40
+ ...(oldResult !== null && oldResult !== void 0 ? oldResult : {}),
41
+ 'ufo:vc:rev': [...((_ref = oldResult === null || oldResult === void 0 ? void 0 : oldResult['ufo:vc:rev']) !== null && _ref !== void 0 ? _ref : []), ...(newResult !== null && newResult !== void 0 ? newResult : [])]
42
+ };
43
+ }
44
+ setSSRElement(element) {
45
+ var _this$oldVCObserver5;
46
+ (_this$oldVCObserver5 = this.oldVCObserver) === null || _this$oldVCObserver5 === void 0 ? void 0 : _this$oldVCObserver5.setSSRElement(element);
47
+ }
48
+ setReactRootRenderStart(startTime) {
49
+ var _this$oldVCObserver6;
50
+ (_this$oldVCObserver6 = this.oldVCObserver) === null || _this$oldVCObserver6 === void 0 ? void 0 : _this$oldVCObserver6.setReactRootRenderStart(startTime || performance.now());
51
+ }
52
+ setReactRootRenderStop(stopTime) {
53
+ var _this$oldVCObserver7;
54
+ (_this$oldVCObserver7 = this.oldVCObserver) === null || _this$oldVCObserver7 === void 0 ? void 0 : _this$oldVCObserver7.setReactRootRenderStop(stopTime || performance.now());
55
+ }
56
+ }
2
57
  export const getVCObserver = (opts = {}) => {
3
58
  if (!globalThis.__vcObserver) {
4
- globalThis.__vcObserver = new VCObserver(opts);
59
+ globalThis.__vcObserver = new VCObserverWrapper(opts);
5
60
  }
6
61
  return globalThis.__vcObserver;
7
62
  };
@@ -0,0 +1 @@
1
+ export {};
@@ -85,7 +85,7 @@ export class VCObserver {
85
85
  ratios: this.vcRatios
86
86
  };
87
87
  });
88
- _defineProperty(this, "getVCResult", ({
88
+ _defineProperty(this, "getVCResult", async ({
89
89
  start,
90
90
  stop,
91
91
  tti,
@@ -585,9 +585,6 @@ export class VCObserver {
585
585
  setReactRootRenderStop(stopTime = performance.now()) {
586
586
  this.observers.setReactRootRenderStop(stopTime);
587
587
  }
588
- abortObservation(abortReason = 'custom') {
589
- this.setAbortReason(abortReason, performance.now());
590
- }
591
588
  setAbortReason(abort, timestamp, info = '') {
592
589
  if (this.abortReason.reason === null || this.abortReason.blocking === false) {
593
590
  this.abortReason.reason = abort;
@@ -0,0 +1,34 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ export default class EntriesTimeline {
3
+ constructor() {
4
+ _defineProperty(this, "unorderedEntries", []);
5
+ _defineProperty(this, "sortedEntriesCache", new Map());
6
+ this.unorderedEntries = [];
7
+ }
8
+ push(entry) {
9
+ this.unorderedEntries.push(entry);
10
+ this.sortedEntriesCache.clear();
11
+ }
12
+ getCacheKey(start, stop) {
13
+ return `${start !== null && start !== void 0 ? start : 'null'}_${stop !== null && stop !== void 0 ? stop : 'null'}`;
14
+ }
15
+ getOrderedEntries({
16
+ start,
17
+ stop
18
+ }) {
19
+ var _this$sortedEntriesCa;
20
+ const cacheKey = this.getCacheKey(start, stop);
21
+ const cachedSortedEntries = (_this$sortedEntriesCa = this.sortedEntriesCache.get(cacheKey)) === null || _this$sortedEntriesCa === void 0 ? void 0 : _this$sortedEntriesCa.deref();
22
+ if (cachedSortedEntries) {
23
+ return cachedSortedEntries;
24
+ }
25
+ const filteredEntries = this.unorderedEntries.filter(e => e.time >= (start !== null && start !== void 0 ? start : 0) && e.time <= (stop !== null && stop !== void 0 ? stop : performance.now()));
26
+ const sortedEntries = filteredEntries.sort((a, b) => a.time - b.time);
27
+ this.sortedEntriesCache.set(cacheKey, new WeakRef(sortedEntries));
28
+ return sortedEntries;
29
+ }
30
+ clear() {
31
+ this.unorderedEntries = [];
32
+ this.sortedEntriesCache.clear();
33
+ }
34
+ }
@@ -0,0 +1,62 @@
1
+ const nameCache = new WeakMap();
2
+ function getAttributeSelector(element, attributeName) {
3
+ const attrValue = element.getAttribute(attributeName);
4
+ if (!attrValue) {
5
+ return '';
6
+ }
7
+ return `[${attributeName}="${encodeURIComponent(attrValue)}"]`;
8
+ }
9
+ function isSelectorUnique(selector) {
10
+ return document.querySelectorAll(selector).length === 1;
11
+ }
12
+ function getUniqueSelector(selectorConfig, element) {
13
+ let currentElement = element;
14
+ const parts = [];
15
+ while (currentElement && currentElement.localName !== 'body') {
16
+ const tagName = currentElement.localName;
17
+ let selectorPart = tagName;
18
+ if (selectorConfig.id && currentElement.id) {
19
+ selectorPart += `#${encodeURIComponent(currentElement.id)}`;
20
+ } else if (selectorConfig.dataVC) {
21
+ selectorPart += getAttributeSelector(currentElement, 'data-vc');
22
+ } else if (selectorConfig.testId) {
23
+ selectorPart += getAttributeSelector(currentElement, 'data-testid') || getAttributeSelector(currentElement, 'data-test-id');
24
+ } else if (selectorConfig.role) {
25
+ selectorPart += getAttributeSelector(currentElement, 'role');
26
+ } else if (selectorConfig.className && currentElement.className) {
27
+ const classNames = Array.from(currentElement.classList).map(encodeURIComponent).join('.');
28
+ if (classNames) {
29
+ selectorPart += `.${classNames}`;
30
+ }
31
+ }
32
+ parts.unshift(selectorPart);
33
+ const potentialSelector = parts.join(' > ').trim();
34
+ if (potentialSelector && isSelectorUnique(potentialSelector)) {
35
+ return potentialSelector;
36
+ }
37
+ currentElement = currentElement.parentElement;
38
+ }
39
+ const potentialSelector = parts.join(' > ').trim();
40
+ if (!potentialSelector) {
41
+ return 'unknown';
42
+ } else if (!isSelectorUnique(potentialSelector)) {
43
+ const parentElement = element.parentElement;
44
+ if (parentElement) {
45
+ const siblingIndex = Array.from(parentElement.children).indexOf(element) + 1;
46
+ return `${potentialSelector}:nth-child(${siblingIndex})`;
47
+ }
48
+ }
49
+ return potentialSelector;
50
+ }
51
+ export default function getElementName(selectorConfig, element) {
52
+ if (!(element instanceof HTMLElement)) {
53
+ return 'error';
54
+ }
55
+ const cachedName = nameCache.get(element);
56
+ if (cachedName) {
57
+ return cachedName;
58
+ }
59
+ const uniqueSelector = getUniqueSelector(selectorConfig, element);
60
+ nameCache.set(element, uniqueSelector);
61
+ return uniqueSelector;
62
+ }
@@ -0,0 +1,98 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import EntriesTimeline from './entries-timeline';
3
+ import getElementName from './get-element-name';
4
+ import VCCalculator_FY25_03 from './metric-calculator/fy25_03';
5
+ import ViewportObserver from './viewport-observer';
6
+ import WindowEventObserver from './window-event-observer';
7
+ const DEFAULT_SELECTOR_CONFIG = {
8
+ id: false,
9
+ testId: true,
10
+ role: false,
11
+ className: false,
12
+ dataVC: true
13
+ };
14
+ export default class VCObserverNew {
15
+ constructor(config) {
16
+ var _config$selectorConfi;
17
+ _defineProperty(this, "startTime", 0);
18
+ _defineProperty(this, "viewportObserver", null);
19
+ _defineProperty(this, "windowEventObserver", null);
20
+ this.entriesTimeline = new EntriesTimeline();
21
+ this.selectorConfig = (_config$selectorConfi = config.selectorConfig) !== null && _config$selectorConfi !== void 0 ? _config$selectorConfi : DEFAULT_SELECTOR_CONFIG;
22
+ this.viewportObserver = new ViewportObserver({
23
+ onChange: onChangeArg => {
24
+ const {
25
+ time,
26
+ type,
27
+ elementRef,
28
+ visible,
29
+ rect,
30
+ previousRect,
31
+ mutationData
32
+ } = onChangeArg;
33
+ let elementName = 'unknown';
34
+ const element = elementRef.deref();
35
+ if (element) {
36
+ elementName = this.getElementName(element);
37
+ }
38
+ this.entriesTimeline.push({
39
+ time,
40
+ type,
41
+ data: {
42
+ elementName,
43
+ rect,
44
+ previousRect,
45
+ visible,
46
+ attributeName: mutationData === null || mutationData === void 0 ? void 0 : mutationData.attributeName
47
+ }
48
+ });
49
+ }
50
+ });
51
+ this.windowEventObserver = new WindowEventObserver({
52
+ onEvent: ({
53
+ time,
54
+ type
55
+ }) => {
56
+ this.entriesTimeline.push({
57
+ time,
58
+ type: 'window:event',
59
+ data: {
60
+ eventType: type
61
+ }
62
+ });
63
+ }
64
+ });
65
+ }
66
+ start() {
67
+ var _this$viewportObserve, _this$windowEventObse;
68
+ (_this$viewportObserve = this.viewportObserver) === null || _this$viewportObserve === void 0 ? void 0 : _this$viewportObserve.start();
69
+ (_this$windowEventObse = this.windowEventObserver) === null || _this$windowEventObse === void 0 ? void 0 : _this$windowEventObse.start();
70
+ }
71
+ stop() {
72
+ var _this$viewportObserve2, _this$windowEventObse2;
73
+ (_this$viewportObserve2 = this.viewportObserver) === null || _this$viewportObserve2 === void 0 ? void 0 : _this$viewportObserve2.stop();
74
+ (_this$windowEventObse2 = this.windowEventObserver) === null || _this$windowEventObse2 === void 0 ? void 0 : _this$windowEventObse2.stop();
75
+ }
76
+ async getVCResult(param) {
77
+ const {
78
+ start,
79
+ stop
80
+ } = param;
81
+ const results = [];
82
+ const calculator_fy25_03 = new VCCalculator_FY25_03();
83
+ const orderedEntries = this.entriesTimeline.getOrderedEntries({
84
+ start,
85
+ stop
86
+ });
87
+ const fy25_03 = await calculator_fy25_03.calculate({
88
+ orderedEntries
89
+ });
90
+ if (fy25_03) {
91
+ results.push(fy25_03);
92
+ }
93
+ return results;
94
+ }
95
+ getElementName(element) {
96
+ return getElementName(this.selectorConfig, element);
97
+ }
98
+ }
@@ -0,0 +1,38 @@
1
+ import calculateTTVCPercentiles from './percentile-calc';
2
+ import getViewportHeight from './utils/get-viewport-height';
3
+ import getViewportWidth from './utils/get-viewport-width';
4
+ export default class AbstractVCCalculatorBase {
5
+ constructor(revisionNo) {
6
+ this.revisionNo = revisionNo;
7
+ }
8
+ async calculate({
9
+ orderedEntries
10
+ }) {
11
+ var _vcDetails$90$t, _vcDetails$;
12
+ const filteredEntries = orderedEntries.filter(entry => {
13
+ return this.isEntryIncluded(entry);
14
+ });
15
+ const isVCClean = this.isVCClean(filteredEntries);
16
+ if (!isVCClean) {
17
+ return {
18
+ revision: this.revisionNo,
19
+ 'metric:vc90': null,
20
+ clean: false
21
+ };
22
+ }
23
+ const vcDetails = await calculateTTVCPercentiles({
24
+ viewport: {
25
+ width: getViewportWidth(),
26
+ height: getViewportHeight()
27
+ },
28
+ orderedEntries: filteredEntries,
29
+ percentiles: [25, 50, 75, 80, 85, 90, 95, 98, 99]
30
+ });
31
+ return {
32
+ revision: this.revisionNo,
33
+ vcDetails: vcDetails !== null && vcDetails !== void 0 ? vcDetails : undefined,
34
+ clean: isVCClean,
35
+ 'metric:vc90': (_vcDetails$90$t = vcDetails === null || vcDetails === void 0 ? void 0 : (_vcDetails$ = vcDetails['90']) === null || _vcDetails$ === void 0 ? void 0 : _vcDetails$.t) !== null && _vcDetails$90$t !== void 0 ? _vcDetails$90$t : null
36
+ };
37
+ }
38
+ }
@@ -0,0 +1,39 @@
1
+ import AbstractVCCalculatorBase from '../abstract-base-vc-calculator';
2
+ import isViewportEntryData from '../utils/is-viewport-entry-data';
3
+ const ABORTING_WINDOW_EVENT = ['wheel', 'scroll', 'keydown', 'resize'];
4
+ const REVISION_NO = 'fy25.03';
5
+ const CONSIDERED_ENTRY_TYPE = ['mutation:child-element', 'mutation:element', 'mutation:attribute', 'layout-shift', 'window:event'];
6
+ export default class VCCalculator_FY25_03 extends AbstractVCCalculatorBase {
7
+ constructor() {
8
+ super(REVISION_NO);
9
+ }
10
+ isEntryIncluded(entry) {
11
+ if (!CONSIDERED_ENTRY_TYPE.includes(entry.type)) {
12
+ return false;
13
+ }
14
+ if (entry.type === 'mutation:attribute') {
15
+ const entryData = entry.data;
16
+ const attributeName = entryData.attributeName;
17
+ if (!attributeName) {
18
+ return false;
19
+ }
20
+ return true;
21
+ }
22
+ if (isViewportEntryData(entry.data) && !entry.data.visible) {
23
+ return false;
24
+ }
25
+ return true;
26
+ }
27
+ isVCClean(filteredEntries) {
28
+ const hasAbortEvent = filteredEntries.some(entry => {
29
+ if (entry.type === 'window:event') {
30
+ const data = entry.data;
31
+ if (ABORTING_WINDOW_EVENT.includes(data.eventType)) {
32
+ return true;
33
+ }
34
+ }
35
+ return false;
36
+ });
37
+ return !hasAbortEvent;
38
+ }
39
+ }