@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.
- package/CHANGELOG.md +17 -0
- package/dist/cjs/create-payload/index.js +2 -2
- package/dist/cjs/interaction-id-context/index.js +2 -2
- package/dist/cjs/interaction-metrics/index.js +7 -1
- package/dist/cjs/typing-performance-tracing/index.js +29 -6
- package/dist/cjs/vc/index.js +2 -1
- package/dist/cjs/vc/vc-observer-new/index.js +3 -1
- package/dist/cjs/vc/vc-observer-new/metric-calculator/fy25_03/index.js +7 -3
- package/dist/cjs/vc/vc-observer-new/metric-calculator/fy26_04/index.js +2 -2
- package/dist/cjs/vc/vc-observer-new/viewport-observer/index.js +26 -5
- package/dist/cjs/vc/vc-observer-new/viewport-observer/utils/is-contained-within-smart-answers.js +20 -0
- package/dist/es2019/create-payload/index.js +2 -2
- package/dist/es2019/interaction-id-context/index.js +2 -2
- package/dist/es2019/interaction-metrics/index.js +7 -1
- package/dist/es2019/typing-performance-tracing/index.js +27 -6
- package/dist/es2019/vc/index.js +2 -1
- package/dist/es2019/vc/vc-observer-new/index.js +3 -1
- package/dist/es2019/vc/vc-observer-new/metric-calculator/fy25_03/index.js +7 -3
- package/dist/es2019/vc/vc-observer-new/metric-calculator/fy26_04/index.js +2 -2
- package/dist/es2019/vc/vc-observer-new/viewport-observer/index.js +24 -3
- package/dist/es2019/vc/vc-observer-new/viewport-observer/utils/is-contained-within-smart-answers.js +14 -0
- package/dist/esm/create-payload/index.js +2 -2
- package/dist/esm/interaction-id-context/index.js +2 -2
- package/dist/esm/interaction-metrics/index.js +7 -1
- package/dist/esm/typing-performance-tracing/index.js +29 -6
- package/dist/esm/vc/index.js +2 -1
- package/dist/esm/vc/vc-observer-new/index.js +3 -1
- package/dist/esm/vc/vc-observer-new/metric-calculator/fy25_03/index.js +7 -3
- package/dist/esm/vc/vc-observer-new/metric-calculator/fy26_04/index.js +2 -2
- package/dist/esm/vc/vc-observer-new/viewport-observer/index.js +26 -5
- package/dist/esm/vc/vc-observer-new/viewport-observer/utils/is-contained-within-smart-answers.js +14 -0
- package/dist/types/config/index.d.ts +1 -0
- package/dist/types/interaction-id-context/index.d.ts +2 -2
- package/dist/types/vc/types.d.ts +14 -0
- package/dist/types/vc/vc-observer/observers/index.d.ts +2 -0
- package/dist/types/vc/vc-observer-new/index.d.ts +2 -0
- package/dist/types/vc/vc-observer-new/metric-calculator/fy26_04/index.d.ts +1 -1
- package/dist/types/vc/vc-observer-new/types.d.ts +1 -1
- package/dist/types/vc/vc-observer-new/viewport-observer/index.d.ts +5 -1
- package/dist/types/vc/vc-observer-new/viewport-observer/utils/is-contained-within-smart-answers.d.ts +1 -0
- package/dist/types-ts4.5/config/index.d.ts +1 -0
- package/dist/types-ts4.5/interaction-id-context/index.d.ts +2 -2
- package/dist/types-ts4.5/vc/types.d.ts +14 -0
- package/dist/types-ts4.5/vc/vc-observer/observers/index.d.ts +2 -0
- package/dist/types-ts4.5/vc/vc-observer-new/index.d.ts +2 -0
- package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/fy26_04/index.d.ts +1 -1
- package/dist/types-ts4.5/vc/vc-observer-new/types.d.ts +1 -1
- package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/index.d.ts +5 -1
- package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/utils/is-contained-within-smart-answers.d.ts +1 -0
- 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);}
|
|
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=
|
|
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
|
|
73
|
-
var _default = exports.default =
|
|
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
|
-
|
|
248
|
-
|
|
249
|
-
|
|
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 = {
|
package/dist/cjs/vc/index.js
CHANGED
|
@@ -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
|
|
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",
|
package/dist/cjs/vc/vc-observer-new/viewport-observer/utils/is-contained-within-smart-answers.js
ADDED
|
@@ -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);}
|
|
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;}}
|
|
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
|
|
62
|
-
export default
|
|
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
|
-
|
|
240
|
-
|
|
241
|
-
|
|
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 = {
|
package/dist/es2019/vc/index.js
CHANGED
|
@@ -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
|
}
|