@atlaskit/react-ufo 4.16.8 → 4.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cjs/create-payload/index.js +2 -2
  3. package/dist/cjs/interaction-id-context/index.js +2 -2
  4. package/dist/cjs/interaction-metrics/index.js +7 -1
  5. package/dist/cjs/typing-performance-tracing/index.js +29 -6
  6. package/dist/cjs/vc/index.js +2 -1
  7. package/dist/cjs/vc/vc-observer-new/index.js +3 -1
  8. package/dist/cjs/vc/vc-observer-new/metric-calculator/fy25_03/index.js +7 -3
  9. package/dist/cjs/vc/vc-observer-new/metric-calculator/fy26_04/index.js +2 -2
  10. package/dist/cjs/vc/vc-observer-new/viewport-observer/index.js +26 -5
  11. package/dist/cjs/vc/vc-observer-new/viewport-observer/utils/is-contained-within-smart-answers.js +20 -0
  12. package/dist/es2019/create-payload/index.js +2 -2
  13. package/dist/es2019/interaction-id-context/index.js +2 -2
  14. package/dist/es2019/interaction-metrics/index.js +7 -1
  15. package/dist/es2019/typing-performance-tracing/index.js +27 -6
  16. package/dist/es2019/vc/index.js +2 -1
  17. package/dist/es2019/vc/vc-observer-new/index.js +3 -1
  18. package/dist/es2019/vc/vc-observer-new/metric-calculator/fy25_03/index.js +7 -3
  19. package/dist/es2019/vc/vc-observer-new/metric-calculator/fy26_04/index.js +2 -2
  20. package/dist/es2019/vc/vc-observer-new/viewport-observer/index.js +24 -3
  21. package/dist/es2019/vc/vc-observer-new/viewport-observer/utils/is-contained-within-smart-answers.js +14 -0
  22. package/dist/esm/create-payload/index.js +2 -2
  23. package/dist/esm/interaction-id-context/index.js +2 -2
  24. package/dist/esm/interaction-metrics/index.js +7 -1
  25. package/dist/esm/typing-performance-tracing/index.js +29 -6
  26. package/dist/esm/vc/index.js +2 -1
  27. package/dist/esm/vc/vc-observer-new/index.js +3 -1
  28. package/dist/esm/vc/vc-observer-new/metric-calculator/fy25_03/index.js +7 -3
  29. package/dist/esm/vc/vc-observer-new/metric-calculator/fy26_04/index.js +2 -2
  30. package/dist/esm/vc/vc-observer-new/viewport-observer/index.js +26 -5
  31. package/dist/esm/vc/vc-observer-new/viewport-observer/utils/is-contained-within-smart-answers.js +14 -0
  32. package/dist/types/config/index.d.ts +1 -0
  33. package/dist/types/interaction-id-context/index.d.ts +2 -2
  34. package/dist/types/vc/types.d.ts +14 -0
  35. package/dist/types/vc/vc-observer/observers/index.d.ts +2 -0
  36. package/dist/types/vc/vc-observer-new/index.d.ts +2 -0
  37. package/dist/types/vc/vc-observer-new/metric-calculator/fy26_04/index.d.ts +1 -1
  38. package/dist/types/vc/vc-observer-new/types.d.ts +1 -1
  39. package/dist/types/vc/vc-observer-new/viewport-observer/index.d.ts +5 -1
  40. package/dist/types/vc/vc-observer-new/viewport-observer/utils/is-contained-within-smart-answers.d.ts +1 -0
  41. package/dist/types-ts4.5/config/index.d.ts +1 -0
  42. package/dist/types-ts4.5/interaction-id-context/index.d.ts +2 -2
  43. package/dist/types-ts4.5/vc/types.d.ts +14 -0
  44. package/dist/types-ts4.5/vc/vc-observer/observers/index.d.ts +2 -0
  45. package/dist/types-ts4.5/vc/vc-observer-new/index.d.ts +2 -0
  46. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/fy26_04/index.d.ts +1 -1
  47. package/dist/types-ts4.5/vc/vc-observer-new/types.d.ts +1 -1
  48. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/index.d.ts +5 -1
  49. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/utils/is-contained-within-smart-answers.d.ts +1 -0
  50. package/package.json +7 -4
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @atlaskit/ufo-interaction-ignore
2
2
 
3
+ ## 4.17.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [`0310b1753d4b1`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/0310b1753d4b1) -
8
+ FG cleanup - platform_ufo_enable_trimmed_payload
9
+
10
+ ## 4.17.0
11
+
12
+ ### Minor Changes
13
+
14
+ - [`9f645244e3aba`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/9f645244e3aba) -
15
+ Fixed two related problems:
16
+ - The additional metric which fires on the search page was not correctly ignoring smart answer
17
+ mutations
18
+ - fy26.04 metric was not propagating argument to exclude smart answer mutations
19
+
3
20
  ## 4.16.8
4
21
 
5
22
  ### Patch Changes
@@ -13,9 +13,9 @@ getPageLoadDetailedInteractionMetrics=function getPageLoadDetailedInteractionMet
13
13
  'event:hostname':((_window$location=window.location)===null||_window$location===void 0?void 0:_window$location.hostname)||'unknown','event:product':config.product,'event:population':config.population,'event:schema':'1.0.0','event:sizeInKb':0,'event:source':{name:'react-ufo/web',version:(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)},'event:region':config.region||'unknown','experience:key':experimental?'custom.experimental-interaction-metrics':'custom.interaction-metrics','experience:name':newUFOName,// Include CPU usage monitoring data
14
14
  'event:cpu:usage':(0,_machineUtilisation.createPressureStateReport)(interaction.start,interaction.end),'event:memory:usage':(0,_machineUtilisation.createMemoryStateReport)(interaction.start,interaction.end)},criticalPayloadCount!==undefined?{'ufo:multipayload':true,'ufo:criticalPayloadCount':criticalPayloadCount}:{}),(0,_getBrowserMetadata.getBrowserMetadataToLegacyFormat)()),batteryInfo),getSSRProperties(type)),getAssetsMetrics(interaction,pageLoadInteractionMetrics===null||pageLoadInteractionMetrics===void 0?void 0:pageLoadInteractionMetrics.SSRDoneTime)),getPPSMetrics(interaction)),paintMetrics),(0,_getNavigationMetrics.getNavigationMetricsToLegacyFormat)(type)),finalVCMetrics),experimentalMetrics),(_config$additionalPay=config.additionalPayloadData)===null||_config$additionalPay===void 0?void 0:_config$additionalPay.call(config,interaction)),getTracingContextData(interaction)),getStylesheetMetrics()),getErrorCounts(interaction)),getReactHydrationStats()),{},{interactionMetrics:_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({namePrefix:config.namePrefix||'',segmentPrefix:config.segmentPrefix||'',interactionId:interactionId,pageVisibilityAtTTI:pageVisibilityAtTTI,pageVisibilityAtTTAI:pageVisibilityAtTTAI,experimental__pageVisibilityAtTTI:moreAccuratePageVisibilityAtTTI,experimental__pageVisibilityAtTTAI:moreAccuratePageVisibilityAtTTAI,// raw interaction metrics
15
15
  rate:rate,routeName:routeName,type:type,abortReason:abortReason,featureFlags:featureFlags,previousInteractionName:previousInteractionName,isPreviousInteractionAborted:isPreviousInteractionAborted,abortedByInteractionName:abortedByInteractionName,// performance
16
- apdex:(0,_optimizeApdex.optimizeApdex)(interaction.apdex,(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)),end:Math.round(end)},interaction.end3p?{end3p:Math.round(interaction.end3p)}:{}),{},{start:Math.round(start),segments:(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)==='2.0.0'?segmentTree:(0,_utils.getOldSegmentsLabelStack)(segments,interaction.type),marks:(0,_optimizeMarks.optimizeMarks)(interaction.marks,(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)),customData:optimizeCustomData(interaction),reactProfilerTimings:(0,_optimizeReactProfilerTimings.optimizeReactProfilerTimings)(interaction.reactProfilerTimings,start,(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)),minorInteractions:interaction.minorInteractions},responsiveness?{responsiveness:responsiveness}:{}),labelStack),pageLoadInteractionMetrics),getDetailedInteractionMetrics(resourceTimings)),getPageLoadDetailedInteractionMetrics()),getBm3TrackerTimings(interaction)),{},{'metric:ttai':experimental?regularTTAI||expTTAI:undefined,'metric:experimental:ttai':expTTAI},unknownElementName?{unknownElementName:unknownElementName}:{}),unknownElementHierarchy?{unknownElementHierarchy:unknownElementHierarchy}:{}),'ufo:payloadTime':(0,_roundNumber.roundEpsilon)(performance.now()-interactionPayloadStart)})}};if(experimental){regularTTAI=undefined;expTTAI=undefined;}if((0,_platformFeatureFlags.fg)('platform_ufo_enable_vc_raw_data')){size=(0,_getPayloadSize.default)(payload.attributes.properties);vcRev=payload.attributes.properties['ufo:vc:rev'];rawData=vcRev.find(function(item){return item.revision==='raw-handler';});if(rawData){rawDataSize=(0,_getPayloadSize.default)(rawData);payload.attributes.properties['ufo:vc:raw:size']=rawDataSize;if(size>MAX_PAYLOAD_SIZE&&Array.isArray(vcRev)&&vcRev.length>0){payload.attributes.properties['ufo:vc:rev']=vcRev.filter(function(item){return item.revision!=='raw-handler';});payload.attributes.properties['ufo:vc:raw:removed']=true;}}payload.attributes.properties['event:sizeInKb']=(0,_getPayloadSize.default)(payload.attributes.properties);}else{payload.attributes.properties['event:sizeInKb']=(0,_getPayloadSize.default)(payload.attributes.properties);}if(!(0,_platformFeatureFlags.fg)('platform_ufo_enable_trimmed_payload')){_context.next=75;break;}// in order of importance, first one being least important
16
+ apdex:(0,_optimizeApdex.optimizeApdex)(interaction.apdex,(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)),end:Math.round(end)},interaction.end3p?{end3p:Math.round(interaction.end3p)}:{}),{},{start:Math.round(start),segments:(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)==='2.0.0'?segmentTree:(0,_utils.getOldSegmentsLabelStack)(segments,interaction.type),marks:(0,_optimizeMarks.optimizeMarks)(interaction.marks,(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)),customData:optimizeCustomData(interaction),reactProfilerTimings:(0,_optimizeReactProfilerTimings.optimizeReactProfilerTimings)(interaction.reactProfilerTimings,start,(0,_getReactUfoPayloadVersion.getReactUFOPayloadVersion)(interaction.type)),minorInteractions:interaction.minorInteractions},responsiveness?{responsiveness:responsiveness}:{}),labelStack),pageLoadInteractionMetrics),getDetailedInteractionMetrics(resourceTimings)),getPageLoadDetailedInteractionMetrics()),getBm3TrackerTimings(interaction)),{},{'metric:ttai':experimental?regularTTAI||expTTAI:undefined,'metric:experimental:ttai':expTTAI},unknownElementName?{unknownElementName:unknownElementName}:{}),unknownElementHierarchy?{unknownElementHierarchy:unknownElementHierarchy}:{}),'ufo:payloadTime':(0,_roundNumber.roundEpsilon)(performance.now()-interactionPayloadStart)})}};if(experimental){regularTTAI=undefined;expTTAI=undefined;}if((0,_platformFeatureFlags.fg)('platform_ufo_enable_vc_raw_data')){size=(0,_getPayloadSize.default)(payload.attributes.properties);vcRev=payload.attributes.properties['ufo:vc:rev'];rawData=vcRev.find(function(item){return item.revision==='raw-handler';});if(rawData){rawDataSize=(0,_getPayloadSize.default)(rawData);payload.attributes.properties['ufo:vc:raw:size']=rawDataSize;if(size>MAX_PAYLOAD_SIZE&&Array.isArray(vcRev)&&vcRev.length>0){payload.attributes.properties['ufo:vc:rev']=vcRev.filter(function(item){return item.revision!=='raw-handler';});payload.attributes.properties['ufo:vc:raw:removed']=true;}}payload.attributes.properties['event:sizeInKb']=(0,_getPayloadSize.default)(payload.attributes.properties);}else{payload.attributes.properties['event:sizeInKb']=(0,_getPayloadSize.default)(payload.attributes.properties);}// in order of importance, first one being least important
17
17
  // we can add more fields as necessary
18
- interactionMetricsFieldsToTrim=['requestInfo','featureFlags','resourceTimings'];properties=payload.attributes.properties;interactionMetrics=properties.interactionMetrics;if(!interactionMetrics){_context.next=75;break;}_iterator=_createForOfIteratorHelper(interactionMetricsFieldsToTrim);_context.prev=53;_iterator.s();case 55:if((_step=_iterator.n()).done){_context.next=67;break;}field=_step.value;if(!((0,_getPayloadSize.default)(properties)<=MAX_PAYLOAD_SIZE)){_context.next=59;break;}return _context.abrupt("continue",65);case 59:interactionMetrics[field]=undefined;properties['event:isTrimmed']=true;trimmedFields=properties['event:trimmedFields'];if(!Array.isArray(trimmedFields)){trimmedFields=[];}trimmedFields.push("interactionMetrics.".concat(field));properties['event:trimmedFields']=trimmedFields;case 65:_context.next=55;break;case 67:_context.next=72;break;case 69:_context.prev=69;_context.t7=_context["catch"](53);_iterator.e(_context.t7);case 72:_context.prev=72;_iterator.f();return _context.finish(72);case 75:return _context.abrupt("return",payload);case 76:case"end":return _context.stop();}},_callee,null,[[53,69,72,75]]);}));return _createInteractionMetricsPayload.apply(this,arguments);}function createPayloads(_x6,_x7){return _createPayloads.apply(this,arguments);}function _createPayloads(){_createPayloads=(0,_asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee2(interactionId,interaction){var ufoNameOverride,modifiedInteraction,payloads,isCriticalMetricsEnabled,vcMetrics,criticalMetricsPayloads,criticalPayloadCount,interactionMetricsPayload;return _regenerator.default.wrap(function _callee2$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:ufoNameOverride=getUfoNameOverride(interaction);modifiedInteraction=_objectSpread(_objectSpread({},interaction),{},{ufoName:ufoNameOverride});payloads=[];isCriticalMetricsEnabled=(0,_platformFeatureFlags.fg)('platform_ufo_critical_metrics_payload');// Calculate VC metrics once to avoid duplicate expensive calculations
18
+ interactionMetricsFieldsToTrim=['requestInfo','featureFlags','resourceTimings'];properties=payload.attributes.properties;interactionMetrics=properties.interactionMetrics;if(!interactionMetrics){_context.next=74;break;}_iterator=_createForOfIteratorHelper(interactionMetricsFieldsToTrim);_context.prev=52;_iterator.s();case 54:if((_step=_iterator.n()).done){_context.next=66;break;}field=_step.value;if(!((0,_getPayloadSize.default)(properties)<=MAX_PAYLOAD_SIZE)){_context.next=58;break;}return _context.abrupt("continue",64);case 58:interactionMetrics[field]=undefined;properties['event:isTrimmed']=true;trimmedFields=properties['event:trimmedFields'];if(!Array.isArray(trimmedFields)){trimmedFields=[];}trimmedFields.push("interactionMetrics.".concat(field));properties['event:trimmedFields']=trimmedFields;case 64:_context.next=54;break;case 66:_context.next=71;break;case 68:_context.prev=68;_context.t7=_context["catch"](52);_iterator.e(_context.t7);case 71:_context.prev=71;_iterator.f();return _context.finish(71);case 74:return _context.abrupt("return",payload);case 75:case"end":return _context.stop();}},_callee,null,[[52,68,71,74]]);}));return _createInteractionMetricsPayload.apply(this,arguments);}function createPayloads(_x6,_x7){return _createPayloads.apply(this,arguments);}function _createPayloads(){_createPayloads=(0,_asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee2(interactionId,interaction){var ufoNameOverride,modifiedInteraction,payloads,isCriticalMetricsEnabled,vcMetrics,criticalMetricsPayloads,criticalPayloadCount,interactionMetricsPayload;return _regenerator.default.wrap(function _callee2$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:ufoNameOverride=getUfoNameOverride(interaction);modifiedInteraction=_objectSpread(_objectSpread({},interaction),{},{ufoName:ufoNameOverride});payloads=[];isCriticalMetricsEnabled=(0,_platformFeatureFlags.fg)('platform_ufo_critical_metrics_payload');// Calculate VC metrics once to avoid duplicate expensive calculations
19
19
  _context2.next=6;return(0,_getVcMetrics.default)(interaction);case 6:vcMetrics=_context2.sent;if(!isCriticalMetricsEnabled){_context2.next=13;break;}_context2.next=10;return(0,_criticalMetricsPayload.createCriticalMetricsPayloads)(interactionId,interaction,vcMetrics);case 10:_context2.t0=_context2.sent;_context2.next=14;break;case 13:_context2.t0=[];case 14:criticalMetricsPayloads=_context2.t0;payloads.push.apply(payloads,(0,_toConsumableArray2.default)(criticalMetricsPayloads));criticalPayloadCount=isCriticalMetricsEnabled?criticalMetricsPayloads.length:undefined;_context2.next=19;return createInteractionMetricsPayload(modifiedInteraction,interactionId,undefined,criticalPayloadCount,vcMetrics);case 19:interactionMetricsPayload=_context2.sent;payloads.push(interactionMetricsPayload);return _context2.abrupt("return",payloads.filter(Boolean));case 22:case"end":return _context2.stop();}},_callee2);}));return _createPayloads.apply(this,arguments);}function createExperimentalMetricsPayload(_x8,_x9){return _createExperimentalMetricsPayload.apply(this,arguments);}function _createExperimentalMetricsPayload(){_createExperimentalMetricsPayload=(0,_asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee3(interactionId,interaction){var config,ufoName,rate,pageVisibilityState,result;return _regenerator.default.wrap(function _callee3$(_context3){while(1)switch(_context3.prev=_context3.next){case 0:config=(0,_config.getConfig)();if(config){_context3.next=3;break;}throw Error('UFO Configuration not provided');case 3:ufoName=(0,_utils.sanitizeUfoName)(interaction.ufoName);rate=(0,_config.getExperimentalInteractionRate)(ufoName,interaction.type);if((0,_coinflip.default)(rate)){_context3.next=7;break;}return _context3.abrupt("return",null);case 7:pageVisibilityState=(0,_hiddenTiming.getPageVisibilityState)(interaction.start,interaction.end);if(!(pageVisibilityState!=='visible')){_context3.next=10;break;}return _context3.abrupt("return",null);case 10:_context3.next=12;return createInteractionMetricsPayload(interaction,interactionId,true);case 12:result=_context3.sent;return _context3.abrupt("return",result);case 14:case"end":return _context3.stop();}},_callee3);}));return _createExperimentalMetricsPayload.apply(this,arguments);}function createExtraSearchPageInteractionPayload(_x0,_x1){return _createExtraSearchPageInteractionPayload.apply(this,arguments);}function _createExtraSearchPageInteractionPayload(){_createExtraSearchPageInteractionPayload=(0,_asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee4(interactionId,interaction){var SAIN_HOLD_NAMES,NAME_OVERRIDE,SEARCH_PAGE_SMART_ANSWERS_SEGMENT_LABEL,newInteractionId,newEnd,holdInfo,reactProfilerTimings,lastHold,isLastHoldSAIN,lastFilteredTime,filteredReactProfilerTimings,lastTiming,modifiedInteraction,payloads,vcMetrics,interactionMetricsPayload;return _regenerator.default.wrap(function _callee4$(_context4){while(1)switch(_context4.prev=_context4.next){case 0:SAIN_HOLD_NAMES=['search-ai-dialog-visible-text-loading','search-ai-dialog-all-text-loading'];NAME_OVERRIDE='search-page-ignoring-smart-answers';SEARCH_PAGE_SMART_ANSWERS_SEGMENT_LABEL='search-page-smart-answers';newInteractionId="".concat(interactionId,"-ignoring-smart-answers");// Calculate a new end time which excludes SAIN holds
20
20
  holdInfo=interaction.holdInfo,reactProfilerTimings=interaction.reactProfilerTimings;lastHold=holdInfo.at(-1);isLastHoldSAIN=Boolean(lastHold&&SAIN_HOLD_NAMES.includes(lastHold.name));// A new end time is only calculated if the last hold is a SAIN hold
21
21
  if(isLastHoldSAIN){lastFilteredTime=null;filteredReactProfilerTimings=reactProfilerTimings.filter(function(timing){if(timing.commitTime===lastFilteredTime){return false;}var isTimingSmartAnswersInSearch=timing.labelStack.some(function(label){return label.name===SEARCH_PAGE_SMART_ANSWERS_SEGMENT_LABEL;});if(isTimingSmartAnswersInSearch){lastFilteredTime=timing.commitTime;return false;}return true;});lastTiming=filteredReactProfilerTimings.at(-1);if(lastTiming){newEnd=lastTiming.commitTime;}}modifiedInteraction=_objectSpread(_objectSpread({},interaction),{},{end:newEnd!==null&&newEnd!==void 0?newEnd:interaction.end,holdInfo:[],knownSegments:[],reactProfilerTimings:[],ufoName:NAME_OVERRIDE});payloads=[];_context4.next=12;return(0,_getVcMetrics.default)(interaction,false,true);case 12:vcMetrics=_context4.sent;_context4.next=15;return createInteractionMetricsPayload(modifiedInteraction,newInteractionId,undefined,undefined,vcMetrics);case 15:interactionMetricsPayload=_context4.sent;payloads.push(interactionMetricsPayload);return _context4.abrupt("return",payloads.filter(Boolean));case 18:case"end":return _context4.stop();}},_callee4);}));return _createExtraSearchPageInteractionPayload.apply(this,arguments);}
@@ -69,8 +69,8 @@ var subscribeToInteractionIdChanges = exports.subscribeToInteractionIdChanges =
69
69
  };
70
70
 
71
71
  // We use a context to allow modals to have their own lifecycle
72
- var _default_1 = /*#__PURE__*/(0, _react.createContext)(DefaultInteractionID);
73
- var _default = exports.default = _default_1;
72
+ var interactionContext = /*#__PURE__*/(0, _react.createContext)(DefaultInteractionID);
73
+ var _default = exports.default = interactionContext;
74
74
  var getInteractionId = exports.getInteractionId = function getInteractionId() {
75
75
  return DefaultInteractionID;
76
76
  };
@@ -1147,6 +1147,7 @@ function addOnCancelCallback(id, cancelCallback) {
1147
1147
  interaction === null || interaction === void 0 || interaction.cancelCallbacks.push(cancelCallback);
1148
1148
  }
1149
1149
  function addNewInteraction(interactionId, ufoName, type, startTime, rate, labelStack, routeName) {
1150
+ var _config$extraSearchPa, _config$extraSearchPa2;
1150
1151
  var trace = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
1151
1152
  interactionExtraMetrics.reset();
1152
1153
  postInteractionLog.reset();
@@ -1174,13 +1175,18 @@ function addNewInteraction(interactionId, ufoName, type, startTime, rate, labelS
1174
1175
  }
1175
1176
  var addFeatureFlagsToInteraction = (0, _coinflip.default)((0, _config.getCapabilityRate)('feature_flag_access'));
1176
1177
  var config = (0, _config.getConfig)();
1178
+ var searchPageConfig = (0, _platformFeatureFlags.fg)('rovo_search_page_ttvc_ignoring_smart_answers_fix') ? {
1179
+ enableSmartAnswersMutations: config === null || config === void 0 || (_config$extraSearchPa = config.extraSearchPageInteraction) === null || _config$extraSearchPa === void 0 ? void 0 : _config$extraSearchPa.enabled,
1180
+ searchPageRoute: config === null || config === void 0 || (_config$extraSearchPa2 = config.extraSearchPageInteraction) === null || _config$extraSearchPa2 === void 0 ? void 0 : _config$extraSearchPa2.searchPageRoute
1181
+ } : undefined;
1177
1182
  if (config && config.vc) {
1178
1183
  var vcOptions = {
1179
1184
  heatmapSize: config.vc.heatmapSize,
1180
1185
  oldDomUpdates: config.vc.oldDomUpdates,
1181
1186
  devToolsEnabled: config.vc.devToolsEnabled,
1182
1187
  selectorConfig: config.vc.selectorConfig,
1183
- ssrEnablePageLayoutPlaceholder: config.vc.ssrEnablePageLayoutPlaceholder
1188
+ ssrEnablePageLayoutPlaceholder: config.vc.ssrEnablePageLayoutPlaceholder,
1189
+ searchPageConfig: searchPageConfig
1184
1190
  };
1185
1191
  vcObserver = (0, _vc.newVCObserver)(vcOptions);
1186
1192
  }
@@ -8,6 +8,7 @@ exports.default = useUFOTypingPerformanceTracing;
8
8
  var _react = require("react");
9
9
  var _scheduler = require("scheduler");
10
10
  var _uuid = require("uuid");
11
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
11
12
  var _coinflip = _interopRequireDefault(require("../coinflip"));
12
13
  var _config = require("../config");
13
14
  var _interactionMetrics = require("../interaction-metrics");
@@ -80,10 +81,15 @@ function typingPerformanceTracingTimeout(element, name, rate) {
80
81
  tsubmit = setTimeout(end, 2000); // debounce
81
82
  }, 0);
82
83
  };
83
-
84
+ if (typeof (element === null || element === void 0 ? void 0 : element.addEventListener) !== 'function' && (0, _platformFeatureFlags.fg)('jfp-magma-ufo-event-listener-error')) {
85
+ return;
86
+ }
84
87
  // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
85
88
  element.addEventListener('keypress', onKeyPressHandler);
86
89
  return function () {
90
+ if (typeof (element === null || element === void 0 ? void 0 : element.removeEventListener) !== 'function' && (0, _platformFeatureFlags.fg)('jfp-magma-ufo-event-listener-error')) {
91
+ return;
92
+ }
87
93
  // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
88
94
  element.removeEventListener('keypress', onKeyPressHandler);
89
95
  };
@@ -152,10 +158,15 @@ function typingPerformanceTracingTimeoutNoAlloc(element, name, rate) {
152
158
  tsubmit = setTimeout(end, 2000); // debounce
153
159
  }, 0);
154
160
  };
155
-
161
+ if (typeof (element === null || element === void 0 ? void 0 : element.addEventListener) !== 'function' && (0, _platformFeatureFlags.fg)('jfp-magma-ufo-event-listener-error')) {
162
+ return;
163
+ }
156
164
  // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
157
165
  element.addEventListener('keypress', onKeyPressHandler);
158
166
  return function () {
167
+ if (typeof (element === null || element === void 0 ? void 0 : element.removeEventListener) !== 'function' && (0, _platformFeatureFlags.fg)('jfp-magma-ufo-event-listener-error')) {
168
+ return;
169
+ }
159
170
  // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
160
171
  element.removeEventListener('keypress', onKeyPressHandler);
161
172
  };
@@ -240,13 +251,25 @@ function typingPerformanceTracingMutationObserver(element, name, rate) {
240
251
  childList: true,
241
252
  subtree: true
242
253
  });
243
-
254
+ if (typeof (element === null || element === void 0 ? void 0 : element.addEventListener) !== 'function' && (0, _platformFeatureFlags.fg)('jfp-magma-ufo-event-listener-error')) {
255
+ return function () {
256
+ return mo.disconnect();
257
+ };
258
+ }
244
259
  // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
245
260
  element.addEventListener('keypress', onKeyPressHandler);
246
261
  return function () {
247
- // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
248
- element.removeEventListener('keypress', onKeyPressHandler);
249
- mo.disconnect();
262
+ if ((0, _platformFeatureFlags.fg)('jfp-magma-ufo-event-listener-error')) {
263
+ if (typeof (element === null || element === void 0 ? void 0 : element.removeEventListener) === 'function') {
264
+ // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
265
+ element.removeEventListener('keypress', onKeyPressHandler);
266
+ }
267
+ mo.disconnect();
268
+ } else {
269
+ // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
270
+ element.removeEventListener('keypress', onKeyPressHandler);
271
+ mo.disconnect();
272
+ }
250
273
  };
251
274
  }
252
275
  var typingPerformanceTracingMethods = {
@@ -45,7 +45,8 @@ var VCObserverWrapper = exports.VCObserverWrapper = /*#__PURE__*/function () {
45
45
  SSRConfig: {
46
46
  enablePageLayoutPlaceholder: (_opts$ssrEnablePageLa2 = opts.ssrEnablePageLayoutPlaceholder) !== null && _opts$ssrEnablePageLa2 !== void 0 ? _opts$ssrEnablePageLa2 : false
47
47
  },
48
- ssrPlaceholderHandler: this.ssrPlaceholderHandler
48
+ ssrPlaceholderHandler: this.ssrPlaceholderHandler,
49
+ searchPageConfig: opts.searchPageConfig
49
50
  });
50
51
  }
51
52
  if ((0, _config.isVCRevisionEnabled)('fy25.01') || (0, _config.isVCRevisionEnabled)('fy25.02')) {
@@ -109,7 +109,8 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
109
109
  },
110
110
  getSSRPlaceholderHandler: function getSSRPlaceholderHandler() {
111
111
  return _this.getSSRPlaceholderHandler();
112
- }
112
+ },
113
+ searchPageConfig: config.searchPageConfig
113
114
  });
114
115
  this.windowEventObserver = new _windowEventObserver.default({
115
116
  onEvent: function onEvent(_ref) {
@@ -318,6 +319,7 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
318
319
  interactionType: interactionType,
319
320
  isPostInteraction: this.isPostInteraction,
320
321
  include3p: include3p,
322
+ excludeSmartAnswersInSearch: excludeSmartAnswersInSearch,
321
323
  includeSSRRatio: includeSSRRatio,
322
324
  isPageVisible: isPageVisible,
323
325
  interactionAbortReason: interactionAbortReason
@@ -21,7 +21,7 @@ function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0,
21
21
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
22
22
  var ABORTING_WINDOW_EVENT = ['wheel', 'scroll', 'keydown', 'resize'];
23
23
  var REVISION_NO = 'fy25.03';
24
- var getConsideredEntryTypes = function getConsideredEntryTypes(include3p) {
24
+ var getConsideredEntryTypes = function getConsideredEntryTypes(include3p, excludeSmartAnswersInSearch) {
25
25
  var entryTypes = ['mutation:child-element', 'mutation:element', 'mutation:attribute', 'layout-shift', 'layout-shift:same-rect', 'window:event'];
26
26
 
27
27
  // If not exclude 3p elements from ttvc,
@@ -30,6 +30,10 @@ var getConsideredEntryTypes = function getConsideredEntryTypes(include3p) {
30
30
  entryTypes.push('mutation:third-party-element');
31
31
  entryTypes.push('mutation:third-party-attribute');
32
32
  }
33
+ if (!excludeSmartAnswersInSearch && (0, _platformFeatureFlags.fg)('rovo_search_page_ttvc_ignoring_smart_answers_fix')) {
34
+ entryTypes.push('mutation:smart-answers-element');
35
+ entryTypes.push('mutation:smart-answers-attribute');
36
+ }
33
37
  if ((0, _platformFeatureFlags.fg)('platform_ufo_enable_media_for_ttvc_v3')) {
34
38
  entryTypes.push('mutation:media');
35
39
  }
@@ -47,10 +51,10 @@ var VCCalculator_FY25_03 = exports.default = /*#__PURE__*/function (_AbstractVCC
47
51
  return (0, _createClass2.default)(VCCalculator_FY25_03, [{
48
52
  key: "isEntryIncluded",
49
53
  value: function isEntryIncluded(entry, include3p, excludeSmartAnswersInSearch) {
50
- if (!getConsideredEntryTypes(include3p).includes(entry.data.type)) {
54
+ if (!getConsideredEntryTypes(include3p, excludeSmartAnswersInSearch).includes(entry.data.type)) {
51
55
  return false;
52
56
  }
53
- if (excludeSmartAnswersInSearch && (0, _isEntrySmartAnswersInSearch.isEntrySmartAnswersInSearch)(entry)) {
57
+ if (excludeSmartAnswersInSearch && (0, _isEntrySmartAnswersInSearch.isEntrySmartAnswersInSearch)(entry) && !(0, _platformFeatureFlags.fg)('rovo_search_page_ttvc_ignoring_smart_answers_fix')) {
54
58
  return false;
55
59
  }
56
60
  if (entry.data.type === 'mutation:media' && (0, _platformFeatureFlags.fg)('media-perf-uplift-mutation-fix')) {
@@ -39,8 +39,8 @@ var VCCalculator_FY26_04 = exports.default = /*#__PURE__*/function (_VCCalculato
39
39
  (0, _inherits2.default)(VCCalculator_FY26_04, _VCCalculator_FY25_);
40
40
  return (0, _createClass2.default)(VCCalculator_FY26_04, [{
41
41
  key: "isEntryIncluded",
42
- value: function isEntryIncluded(entry, include3p) {
43
- var isEntryIncludedInV3 = _superPropGet(VCCalculator_FY26_04, "isEntryIncluded", this, 3)([entry, include3p]);
42
+ value: function isEntryIncluded(entry, include3p, excludeSmartAnswersInSearch) {
43
+ var isEntryIncludedInV3 = _superPropGet(VCCalculator_FY26_04, "isEntryIncluded", this, 3)([entry, include3p, excludeSmartAnswersInSearch]);
44
44
  if (isEntryIncludedInV3 && !getExcludedEntryTypes().includes(entry.data.type)) {
45
45
  return true;
46
46
  }
@@ -20,6 +20,7 @@ var _intersectionObserver = require("./intersection-observer");
20
20
  var _mutationObserver = _interopRequireDefault(require("./mutation-observer"));
21
21
  var _performanceObserver = _interopRequireDefault(require("./performance-observer"));
22
22
  var _checkWithinComponent3 = _interopRequireWildcard(require("./utils/check-within-component"));
23
+ var _isContainedWithinSmartAnswers = require("./utils/is-contained-within-smart-answers");
23
24
  var _isElementVisible = require("./utils/is-element-visible");
24
25
  var _isInVcIgnoreIfNoLayoutShiftMarker = _interopRequireDefault(require("./utils/is-in-vc-ignore-if-no-layout-shift-marker"));
25
26
  var _isInputNameMutation = require("./utils/is-input-name-mutation");
@@ -29,7 +30,7 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
29
30
  function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
30
31
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
31
32
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
32
- var createElementMutationsWatcher = function createElementMutationsWatcher(removedNodeRects, isWithinThirdPartySegment, hasSameDeletedNode, timestamp, isTargetReactRoot, getSSRState, getSSRPlaceholderHandler) {
33
+ var createElementMutationsWatcher = function createElementMutationsWatcher(removedNodeRects, isWithinThirdPartySegment, isWithinSmartAnswersSegment, hasSameDeletedNode, timestamp, isTargetReactRoot, getSSRState, getSSRPlaceholderHandler) {
33
34
  return function (_ref) {
34
35
  var target = _ref.target,
35
36
  rect = _ref.rect;
@@ -76,6 +77,9 @@ var createElementMutationsWatcher = function createElementMutationsWatcher(remov
76
77
  if (isWithinThirdPartySegment) {
77
78
  return 'mutation:third-party-element';
78
79
  }
80
+ if (isWithinSmartAnswersSegment) {
81
+ return 'mutation:smart-answers-element';
82
+ }
79
83
  var isInIgnoreLsMarker = (0, _isInVcIgnoreIfNoLayoutShiftMarker.default)(target);
80
84
  if (!isInIgnoreLsMarker) {
81
85
  return 'mutation:element';
@@ -100,7 +104,8 @@ var ViewportObserver = exports.default = /*#__PURE__*/function () {
100
104
  var _this = this;
101
105
  var onChange = _ref2.onChange,
102
106
  getSSRState = _ref2.getSSRState,
103
- getSSRPlaceholderHandler = _ref2.getSSRPlaceholderHandler;
107
+ getSSRPlaceholderHandler = _ref2.getSSRPlaceholderHandler,
108
+ searchPageConfig = _ref2.searchPageConfig;
104
109
  (0, _classCallCheck2.default)(this, ViewportObserver);
105
110
  (0, _defineProperty2.default)(this, "handleIntersectionEntry", function (_ref3) {
106
111
  var target = _ref3.target,
@@ -143,7 +148,7 @@ var ViewportObserver = exports.default = /*#__PURE__*/function () {
143
148
  _context2.prev = 4;
144
149
  _loop = /*#__PURE__*/_regenerator.default.mark(function _loop() {
145
150
  var _this$getSSRState, _this$intersectionObs;
146
- var addedNodeRef, addedNode, hasSameDeletedNode, _checkWithinComponent, isWithinThirdPartySegment, isTargetReactRoot;
151
+ var addedNodeRef, addedNode, hasSameDeletedNode, _checkWithinComponent, isWithinThirdPartySegment, isWithinSmartAnswersSegment, isTargetReactRoot;
147
152
  return _regenerator.default.wrap(function _loop$(_context) {
148
153
  while (1) switch (_context.prev = _context.next) {
149
154
  case 0:
@@ -163,9 +168,10 @@ var ViewportObserver = exports.default = /*#__PURE__*/function () {
163
168
  return n.isEqualNode(addedNode);
164
169
  });
165
170
  _checkWithinComponent = (0, _checkWithinComponent3.default)(addedNode, 'UFOThirdPartySegment', _this.mapIs3pResult), isWithinThirdPartySegment = _checkWithinComponent.isWithin;
171
+ isWithinSmartAnswersSegment = Boolean(_this.shouldCheckSmartAnswersMutations() && (0, _isContainedWithinSmartAnswers.isContainedWithinSmartAnswers)(addedNode));
166
172
  isTargetReactRoot = targetNode === ((_this$getSSRState = _this.getSSRState) === null || _this$getSSRState === void 0 || (_this$getSSRState = _this$getSSRState.call(_this)) === null || _this$getSSRState === void 0 ? void 0 : _this$getSSRState.reactRootElement);
167
- (_this$intersectionObs = _this.intersectionObserver) === null || _this$intersectionObs === void 0 || _this$intersectionObs.watchAndTag(addedNode, createElementMutationsWatcher(removedNodeRects, isWithinThirdPartySegment, !!hasSameDeletedNode, timestamp, isTargetReactRoot, _this.getSSRState, _this.getSSRPlaceholderHandler));
168
- case 8:
173
+ (_this$intersectionObs = _this.intersectionObserver) === null || _this$intersectionObs === void 0 || _this$intersectionObs.watchAndTag(addedNode, createElementMutationsWatcher(removedNodeRects, isWithinThirdPartySegment, isWithinSmartAnswersSegment, !!hasSameDeletedNode, timestamp, isTargetReactRoot, _this.getSSRState, _this.getSSRPlaceholderHandler));
174
+ case 9:
169
175
  case "end":
170
176
  return _context.stop();
171
177
  }
@@ -241,6 +247,16 @@ var ViewportObserver = exports.default = /*#__PURE__*/function () {
241
247
  };
242
248
  }
243
249
  }
250
+ if (_this.shouldCheckSmartAnswersMutations() && (0, _isContainedWithinSmartAnswers.isContainedWithinSmartAnswers)(target)) {
251
+ return {
252
+ type: 'mutation:smart-answers-attribute',
253
+ mutationData: {
254
+ attributeName: attributeName,
255
+ oldValue: oldValue,
256
+ newValue: newValue
257
+ }
258
+ };
259
+ }
244
260
  if ((0, _isDndStyleMutation.default)({
245
261
  target: target,
246
262
  attributeName: attributeName,
@@ -344,6 +360,10 @@ var ViewportObserver = exports.default = /*#__PURE__*/function () {
344
360
  _iterator2.f();
345
361
  }
346
362
  });
363
+ (0, _defineProperty2.default)(this, "shouldCheckSmartAnswersMutations", function () {
364
+ var _this$searchPageConfi, _this$searchPageConfi2, _window;
365
+ return ((_this$searchPageConfi = _this.searchPageConfig) === null || _this$searchPageConfi === void 0 ? void 0 : _this$searchPageConfi.enableSmartAnswersMutations) && ((_this$searchPageConfi2 = _this.searchPageConfig) === null || _this$searchPageConfi2 === void 0 ? void 0 : _this$searchPageConfi2.searchPageRoute) && ((_window = window) === null || _window === void 0 || (_window = _window.location) === null || _window === void 0 ? void 0 : _window.pathname) && window.location.pathname === _this.searchPageConfig.searchPageRoute && (0, _platformFeatureFlags.fg)('rovo_search_page_ttvc_ignoring_smart_answers_fix');
366
+ });
347
367
  this.mapVisibleNodeRects = new WeakMap();
348
368
  this.mapIs3pResult = new WeakMap();
349
369
  this.onChange = onChange;
@@ -355,6 +375,7 @@ var ViewportObserver = exports.default = /*#__PURE__*/function () {
355
375
  // Initialize SSR context functions
356
376
  this.getSSRState = getSSRState;
357
377
  this.getSSRPlaceholderHandler = getSSRPlaceholderHandler;
378
+ this.searchPageConfig = searchPageConfig;
358
379
  }
359
380
  return (0, _createClass2.default)(ViewportObserver, [{
360
381
  key: "initializeObservers",
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isContainedWithinSmartAnswers = isContainedWithinSmartAnswers;
7
+ var _browserApis = require("@atlaskit/browser-apis");
8
+ function isContainedWithinSmartAnswers(node) {
9
+ var doc = (0, _browserApis.getDocument)();
10
+ if (!doc) {
11
+ return false;
12
+ }
13
+ var smartAnswersElement = doc.getElementById('search-page-smart-answers');
14
+ if (!smartAnswersElement) {
15
+ return false;
16
+ }
17
+
18
+ // When the node is the smart answer element, .contains() still returns true
19
+ return smartAnswersElement.contains(node);
20
+ }
@@ -14,9 +14,9 @@ const getPageLoadDetailedInteractionMetrics=()=>{var _config$ssr2,_config$ssr2$g
14
14
  'event:cpu:usage':createPressureStateReport(interaction.start,interaction.end),'event:memory:usage':createMemoryStateReport(interaction.start,interaction.end),...(criticalPayloadCount!==undefined?{'ufo:multipayload':true,'ufo:criticalPayloadCount':criticalPayloadCount}:{}),// root
15
15
  ...getBrowserMetadataToLegacyFormat(),...batteryInfo,...getSSRProperties(type),...getAssetsMetrics(interaction,pageLoadInteractionMetrics===null||pageLoadInteractionMetrics===void 0?void 0:pageLoadInteractionMetrics.SSRDoneTime),...getPPSMetrics(interaction),...paintMetrics,...getNavigationMetricsToLegacyFormat(type),...finalVCMetrics,...experimentalMetrics,...((_config$additionalPay=config.additionalPayloadData)===null||_config$additionalPay===void 0?void 0:_config$additionalPay.call(config,interaction)),...getTracingContextData(interaction),...getStylesheetMetrics(),...getErrorCounts(interaction),...getReactHydrationStats(),interactionMetrics:{namePrefix:config.namePrefix||'',segmentPrefix:config.segmentPrefix||'',interactionId,pageVisibilityAtTTI,pageVisibilityAtTTAI,experimental__pageVisibilityAtTTI:moreAccuratePageVisibilityAtTTI,experimental__pageVisibilityAtTTAI:moreAccuratePageVisibilityAtTTAI,// raw interaction metrics
16
16
  rate,routeName,type,abortReason,featureFlags,previousInteractionName,isPreviousInteractionAborted,abortedByInteractionName,// performance
17
- apdex:optimizeApdex(interaction.apdex,getReactUFOPayloadVersion(interaction.type)),end:Math.round(end),...(interaction.end3p?{end3p:Math.round(interaction.end3p)}:{}),start:Math.round(start),segments:getReactUFOPayloadVersion(interaction.type)==='2.0.0'?segmentTree:getOldSegmentsLabelStack(segments,interaction.type),marks:optimizeMarks(interaction.marks,getReactUFOPayloadVersion(interaction.type)),customData:optimizeCustomData(interaction),reactProfilerTimings:optimizeReactProfilerTimings(interaction.reactProfilerTimings,start,getReactUFOPayloadVersion(interaction.type)),minorInteractions:interaction.minorInteractions,...(responsiveness?{responsiveness}:{}),...labelStack,...pageLoadInteractionMetrics,...getDetailedInteractionMetrics(resourceTimings),...getPageLoadDetailedInteractionMetrics(),...getBm3TrackerTimings(interaction),'metric:ttai':experimental?regularTTAI||expTTAI:undefined,'metric:experimental:ttai':expTTAI,...(unknownElementName?{unknownElementName}:{}),...(unknownElementHierarchy?{unknownElementHierarchy}:{})},'ufo:payloadTime':roundEpsilon(performance.now()-interactionPayloadStart)}}};if(experimental){regularTTAI=undefined;expTTAI=undefined;}if(fg('platform_ufo_enable_vc_raw_data')){const size=getPayloadSize(payload.attributes.properties);const vcRev=payload.attributes.properties['ufo:vc:rev'];const rawData=vcRev.find(item=>item.revision==='raw-handler');if(rawData){const rawDataSize=getPayloadSize(rawData);payload.attributes.properties['ufo:vc:raw:size']=rawDataSize;if(size>MAX_PAYLOAD_SIZE&&Array.isArray(vcRev)&&vcRev.length>0){payload.attributes.properties['ufo:vc:rev']=vcRev.filter(item=>item.revision!=='raw-handler');payload.attributes.properties['ufo:vc:raw:removed']=true;}}payload.attributes.properties['event:sizeInKb']=getPayloadSize(payload.attributes.properties);}else{payload.attributes.properties['event:sizeInKb']=getPayloadSize(payload.attributes.properties);}if(fg('platform_ufo_enable_trimmed_payload')){// in order of importance, first one being least important
17
+ apdex:optimizeApdex(interaction.apdex,getReactUFOPayloadVersion(interaction.type)),end:Math.round(end),...(interaction.end3p?{end3p:Math.round(interaction.end3p)}:{}),start:Math.round(start),segments:getReactUFOPayloadVersion(interaction.type)==='2.0.0'?segmentTree:getOldSegmentsLabelStack(segments,interaction.type),marks:optimizeMarks(interaction.marks,getReactUFOPayloadVersion(interaction.type)),customData:optimizeCustomData(interaction),reactProfilerTimings:optimizeReactProfilerTimings(interaction.reactProfilerTimings,start,getReactUFOPayloadVersion(interaction.type)),minorInteractions:interaction.minorInteractions,...(responsiveness?{responsiveness}:{}),...labelStack,...pageLoadInteractionMetrics,...getDetailedInteractionMetrics(resourceTimings),...getPageLoadDetailedInteractionMetrics(),...getBm3TrackerTimings(interaction),'metric:ttai':experimental?regularTTAI||expTTAI:undefined,'metric:experimental:ttai':expTTAI,...(unknownElementName?{unknownElementName}:{}),...(unknownElementHierarchy?{unknownElementHierarchy}:{})},'ufo:payloadTime':roundEpsilon(performance.now()-interactionPayloadStart)}}};if(experimental){regularTTAI=undefined;expTTAI=undefined;}if(fg('platform_ufo_enable_vc_raw_data')){const size=getPayloadSize(payload.attributes.properties);const vcRev=payload.attributes.properties['ufo:vc:rev'];const rawData=vcRev.find(item=>item.revision==='raw-handler');if(rawData){const rawDataSize=getPayloadSize(rawData);payload.attributes.properties['ufo:vc:raw:size']=rawDataSize;if(size>MAX_PAYLOAD_SIZE&&Array.isArray(vcRev)&&vcRev.length>0){payload.attributes.properties['ufo:vc:rev']=vcRev.filter(item=>item.revision!=='raw-handler');payload.attributes.properties['ufo:vc:raw:removed']=true;}}payload.attributes.properties['event:sizeInKb']=getPayloadSize(payload.attributes.properties);}else{payload.attributes.properties['event:sizeInKb']=getPayloadSize(payload.attributes.properties);}// in order of importance, first one being least important
18
18
  // we can add more fields as necessary
19
- const interactionMetricsFieldsToTrim=['requestInfo','featureFlags','resourceTimings'];const properties=payload.attributes.properties;const interactionMetrics=properties.interactionMetrics;if(interactionMetrics){for(const field of interactionMetricsFieldsToTrim){if(getPayloadSize(properties)<=MAX_PAYLOAD_SIZE){continue;}interactionMetrics[field]=undefined;properties['event:isTrimmed']=true;let trimmedFields=properties['event:trimmedFields'];if(!Array.isArray(trimmedFields)){trimmedFields=[];}trimmedFields.push(`interactionMetrics.${field}`);properties['event:trimmedFields']=trimmedFields;}}}return payload;}export async function createPayloads(interactionId,interaction){const ufoNameOverride=getUfoNameOverride(interaction);const modifiedInteraction={...interaction,ufoName:ufoNameOverride};const payloads=[];const isCriticalMetricsEnabled=fg('platform_ufo_critical_metrics_payload');// Calculate VC metrics once to avoid duplicate expensive calculations
19
+ const interactionMetricsFieldsToTrim=['requestInfo','featureFlags','resourceTimings'];const properties=payload.attributes.properties;const interactionMetrics=properties.interactionMetrics;if(interactionMetrics){for(const field of interactionMetricsFieldsToTrim){if(getPayloadSize(properties)<=MAX_PAYLOAD_SIZE){continue;}interactionMetrics[field]=undefined;properties['event:isTrimmed']=true;let trimmedFields=properties['event:trimmedFields'];if(!Array.isArray(trimmedFields)){trimmedFields=[];}trimmedFields.push(`interactionMetrics.${field}`);properties['event:trimmedFields']=trimmedFields;}}return payload;}export async function createPayloads(interactionId,interaction){const ufoNameOverride=getUfoNameOverride(interaction);const modifiedInteraction={...interaction,ufoName:ufoNameOverride};const payloads=[];const isCriticalMetricsEnabled=fg('platform_ufo_critical_metrics_payload');// Calculate VC metrics once to avoid duplicate expensive calculations
20
20
  const vcMetrics=await getVCMetrics(interaction);// typeof Promise<CriticalMetricsPayload[]>
21
21
  const criticalMetricsPayloads=isCriticalMetricsEnabled?await createCriticalMetricsPayloads(interactionId,interaction,vcMetrics):[];payloads.push(...criticalMetricsPayloads);const criticalPayloadCount=isCriticalMetricsEnabled?criticalMetricsPayloads.length:undefined;const interactionMetricsPayload=await createInteractionMetricsPayload(modifiedInteraction,interactionId,undefined,criticalPayloadCount,vcMetrics);payloads.push(interactionMetricsPayload);return payloads.filter(Boolean);}export async function createExperimentalMetricsPayload(interactionId,interaction){const config=getConfig();if(!config){throw Error('UFO Configuration not provided');}const ufoName=sanitizeUfoName(interaction.ufoName);const rate=getExperimentalInteractionRate(ufoName,interaction.type);if(!coinflip(rate)){return null;}const pageVisibilityState=getPageVisibilityState(interaction.start,interaction.end);if(pageVisibilityState!=='visible'){return null;}const result=await createInteractionMetricsPayload(interaction,interactionId,true);return result;}export async function createExtraSearchPageInteractionPayload(interactionId,interaction){var _newEnd;const SAIN_HOLD_NAMES=['search-ai-dialog-visible-text-loading','search-ai-dialog-all-text-loading'];const NAME_OVERRIDE='search-page-ignoring-smart-answers';const SEARCH_PAGE_SMART_ANSWERS_SEGMENT_LABEL='search-page-smart-answers';const newInteractionId=`${interactionId}-ignoring-smart-answers`;// Calculate a new end time which excludes SAIN holds
22
22
  let newEnd;const{holdInfo,reactProfilerTimings}=interaction;const lastHold=holdInfo.at(-1);const isLastHoldSAIN=Boolean(lastHold&&SAIN_HOLD_NAMES.includes(lastHold.name));// A new end time is only calculated if the last hold is a SAIN hold
@@ -58,7 +58,7 @@ export const subscribeToInteractionIdChanges = listener => {
58
58
  };
59
59
 
60
60
  // We use a context to allow modals to have their own lifecycle
61
- const _default_1 = /*#__PURE__*/createContext(DefaultInteractionID);
62
- export default _default_1;
61
+ const interactionContext = /*#__PURE__*/createContext(DefaultInteractionID);
62
+ export default interactionContext;
63
63
  export const getInteractionId = () => DefaultInteractionID;
64
64
  export const useInteractionId = () => DefaultInteractionID;
@@ -1026,6 +1026,7 @@ export function addOnCancelCallback(id, cancelCallback) {
1026
1026
  interaction === null || interaction === void 0 ? void 0 : interaction.cancelCallbacks.push(cancelCallback);
1027
1027
  }
1028
1028
  export function addNewInteraction(interactionId, ufoName, type, startTime, rate, labelStack, routeName, trace = null) {
1029
+ var _config$extraSearchPa, _config$extraSearchPa2;
1029
1030
  interactionExtraMetrics.reset();
1030
1031
  postInteractionLog.reset();
1031
1032
  let vcObserver;
@@ -1052,13 +1053,18 @@ export function addNewInteraction(interactionId, ufoName, type, startTime, rate,
1052
1053
  }
1053
1054
  const addFeatureFlagsToInteraction = coinflip(getCapabilityRate('feature_flag_access'));
1054
1055
  const config = getConfig();
1056
+ const searchPageConfig = fg('rovo_search_page_ttvc_ignoring_smart_answers_fix') ? {
1057
+ enableSmartAnswersMutations: config === null || config === void 0 ? void 0 : (_config$extraSearchPa = config.extraSearchPageInteraction) === null || _config$extraSearchPa === void 0 ? void 0 : _config$extraSearchPa.enabled,
1058
+ searchPageRoute: config === null || config === void 0 ? void 0 : (_config$extraSearchPa2 = config.extraSearchPageInteraction) === null || _config$extraSearchPa2 === void 0 ? void 0 : _config$extraSearchPa2.searchPageRoute
1059
+ } : undefined;
1055
1060
  if (config && config.vc) {
1056
1061
  const vcOptions = {
1057
1062
  heatmapSize: config.vc.heatmapSize,
1058
1063
  oldDomUpdates: config.vc.oldDomUpdates,
1059
1064
  devToolsEnabled: config.vc.devToolsEnabled,
1060
1065
  selectorConfig: config.vc.selectorConfig,
1061
- ssrEnablePageLayoutPlaceholder: config.vc.ssrEnablePageLayoutPlaceholder
1066
+ ssrEnablePageLayoutPlaceholder: config.vc.ssrEnablePageLayoutPlaceholder,
1067
+ searchPageConfig
1062
1068
  };
1063
1069
  vcObserver = newVCObserver(vcOptions);
1064
1070
  }
@@ -2,6 +2,7 @@ import { useEffect, useRef } from 'react';
2
2
  import { unstable_IdlePriority as idlePriority, unstable_scheduleCallback as scheduleCallback } from 'scheduler';
3
3
  // eslint-disable-next-line @atlaskit/platform/prefer-crypto-random-uuid -- Use crypto.randomUUID instead
4
4
  import { v4 as createUUID } from 'uuid';
5
+ import { fg } from '@atlaskit/platform-feature-flags';
5
6
  import coinflip from '../coinflip';
6
7
  import { getInteractionRate, getTypingPerformanceTracingMethod } from '../config';
7
8
  import { addMetadata, addNewInteraction, tryComplete } from '../interaction-metrics';
@@ -72,10 +73,15 @@ function typingPerformanceTracingTimeout(element, name, rate) {
72
73
  tsubmit = setTimeout(end, 2000); // debounce
73
74
  }, 0);
74
75
  };
75
-
76
+ if (typeof (element === null || element === void 0 ? void 0 : element.addEventListener) !== 'function' && fg('jfp-magma-ufo-event-listener-error')) {
77
+ return;
78
+ }
76
79
  // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
77
80
  element.addEventListener('keypress', onKeyPressHandler);
78
81
  return () => {
82
+ if (typeof (element === null || element === void 0 ? void 0 : element.removeEventListener) !== 'function' && fg('jfp-magma-ufo-event-listener-error')) {
83
+ return;
84
+ }
79
85
  // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
80
86
  element.removeEventListener('keypress', onKeyPressHandler);
81
87
  };
@@ -144,10 +150,15 @@ function typingPerformanceTracingTimeoutNoAlloc(element, name, rate) {
144
150
  tsubmit = setTimeout(end, 2000); // debounce
145
151
  }, 0);
146
152
  };
147
-
153
+ if (typeof (element === null || element === void 0 ? void 0 : element.addEventListener) !== 'function' && fg('jfp-magma-ufo-event-listener-error')) {
154
+ return;
155
+ }
148
156
  // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
149
157
  element.addEventListener('keypress', onKeyPressHandler);
150
158
  return () => {
159
+ if (typeof (element === null || element === void 0 ? void 0 : element.removeEventListener) !== 'function' && fg('jfp-magma-ufo-event-listener-error')) {
160
+ return;
161
+ }
151
162
  // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
152
163
  element.removeEventListener('keypress', onKeyPressHandler);
153
164
  };
@@ -232,13 +243,23 @@ function typingPerformanceTracingMutationObserver(element, name, rate) {
232
243
  childList: true,
233
244
  subtree: true
234
245
  });
235
-
246
+ if (typeof (element === null || element === void 0 ? void 0 : element.addEventListener) !== 'function' && fg('jfp-magma-ufo-event-listener-error')) {
247
+ return () => mo.disconnect();
248
+ }
236
249
  // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
237
250
  element.addEventListener('keypress', onKeyPressHandler);
238
251
  return () => {
239
- // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
240
- element.removeEventListener('keypress', onKeyPressHandler);
241
- mo.disconnect();
252
+ if (fg('jfp-magma-ufo-event-listener-error')) {
253
+ if (typeof (element === null || element === void 0 ? void 0 : element.removeEventListener) === 'function') {
254
+ // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
255
+ element.removeEventListener('keypress', onKeyPressHandler);
256
+ }
257
+ mo.disconnect();
258
+ } else {
259
+ // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
260
+ element.removeEventListener('keypress', onKeyPressHandler);
261
+ mo.disconnect();
262
+ }
242
263
  };
243
264
  }
244
265
  const typingPerformanceTracingMethods = {
@@ -25,7 +25,8 @@ export class VCObserverWrapper {
25
25
  SSRConfig: {
26
26
  enablePageLayoutPlaceholder: (_opts$ssrEnablePageLa2 = opts.ssrEnablePageLayoutPlaceholder) !== null && _opts$ssrEnablePageLa2 !== void 0 ? _opts$ssrEnablePageLa2 : false
27
27
  },
28
- ssrPlaceholderHandler: this.ssrPlaceholderHandler
28
+ ssrPlaceholderHandler: this.ssrPlaceholderHandler,
29
+ searchPageConfig: opts.searchPageConfig
29
30
  });
30
31
  }
31
32
  if (isVCRevisionEnabled('fy25.01') || isVCRevisionEnabled('fy25.02')) {
@@ -91,7 +91,8 @@ export default class VCObserverNew {
91
91
  },
92
92
  // Pass SSR context to ViewportObserver
93
93
  getSSRState: () => this.getSSRState(),
94
- getSSRPlaceholderHandler: () => this.getSSRPlaceholderHandler()
94
+ getSSRPlaceholderHandler: () => this.getSSRPlaceholderHandler(),
95
+ searchPageConfig: config.searchPageConfig
95
96
  });
96
97
  this.windowEventObserver = new WindowEventObserver({
97
98
  onEvent: ({
@@ -259,6 +260,7 @@ export default class VCObserverNew {
259
260
  interactionType,
260
261
  isPostInteraction: this.isPostInteraction,
261
262
  include3p,
263
+ excludeSmartAnswersInSearch,
262
264
  includeSSRRatio,
263
265
  isPageVisible,
264
266
  interactionAbortReason
@@ -7,7 +7,7 @@ import { isEntrySmartAnswersInSearch } from '../utils/is-entry-smart-answers-in-
7
7
  import isViewportEntryData from '../utils/is-viewport-entry-data';
8
8
  const ABORTING_WINDOW_EVENT = ['wheel', 'scroll', 'keydown', 'resize'];
9
9
  const REVISION_NO = 'fy25.03';
10
- const getConsideredEntryTypes = include3p => {
10
+ const getConsideredEntryTypes = (include3p, excludeSmartAnswersInSearch) => {
11
11
  const entryTypes = ['mutation:child-element', 'mutation:element', 'mutation:attribute', 'layout-shift', 'layout-shift:same-rect', 'window:event'];
12
12
 
13
13
  // If not exclude 3p elements from ttvc,
@@ -16,6 +16,10 @@ const getConsideredEntryTypes = include3p => {
16
16
  entryTypes.push('mutation:third-party-element');
17
17
  entryTypes.push('mutation:third-party-attribute');
18
18
  }
19
+ if (!excludeSmartAnswersInSearch && fg('rovo_search_page_ttvc_ignoring_smart_answers_fix')) {
20
+ entryTypes.push('mutation:smart-answers-element');
21
+ entryTypes.push('mutation:smart-answers-attribute');
22
+ }
19
23
  if (fg('platform_ufo_enable_media_for_ttvc_v3')) {
20
24
  entryTypes.push('mutation:media');
21
25
  }
@@ -29,10 +33,10 @@ export default class VCCalculator_FY25_03 extends AbstractVCCalculatorBase {
29
33
  super(revisionNo !== null && revisionNo !== void 0 ? revisionNo : REVISION_NO);
30
34
  }
31
35
  isEntryIncluded(entry, include3p, excludeSmartAnswersInSearch) {
32
- if (!getConsideredEntryTypes(include3p).includes(entry.data.type)) {
36
+ if (!getConsideredEntryTypes(include3p, excludeSmartAnswersInSearch).includes(entry.data.type)) {
33
37
  return false;
34
38
  }
35
- if (excludeSmartAnswersInSearch && isEntrySmartAnswersInSearch(entry)) {
39
+ if (excludeSmartAnswersInSearch && isEntrySmartAnswersInSearch(entry) && !fg('rovo_search_page_ttvc_ignoring_smart_answers_fix')) {
36
40
  return false;
37
41
  }
38
42
  if (entry.data.type === 'mutation:media' && fg('media-perf-uplift-mutation-fix')) {
@@ -19,8 +19,8 @@ export default class VCCalculator_FY26_04 extends VCCalculator_FY25_03 {
19
19
  constructor() {
20
20
  super('fy26.04');
21
21
  }
22
- isEntryIncluded(entry, include3p) {
23
- const isEntryIncludedInV3 = super.isEntryIncluded(entry, include3p);
22
+ isEntryIncluded(entry, include3p, excludeSmartAnswersInSearch) {
23
+ const isEntryIncludedInV3 = super.isEntryIncluded(entry, include3p, excludeSmartAnswersInSearch);
24
24
  if (isEntryIncludedInV3 && !getExcludedEntryTypes().includes(entry.data.type)) {
25
25
  return true;
26
26
  }