@pendo/agent 2.297.0 → 2.298.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dom.esm.js +2 -2
- package/dist/pendo.module.js +217 -43
- package/dist/pendo.module.min.js +8 -8
- package/dist/servers.json +7 -7
- package/package.json +1 -1
package/dist/dom.esm.js
CHANGED
|
@@ -7314,7 +7314,7 @@ function getScreenPosition(element) {
|
|
|
7314
7314
|
};
|
|
7315
7315
|
}
|
|
7316
7316
|
|
|
7317
|
-
var VERSION = '2.
|
|
7317
|
+
var VERSION = '2.298.0_';
|
|
7318
7318
|
|
|
7319
7319
|
var decodeURIComponent = _.isFunction(window.decodeURIComponent) ? window.decodeURIComponent : _.identity;
|
|
7320
7320
|
|
|
@@ -7334,7 +7334,7 @@ function allowKey(storageKey) {
|
|
|
7334
7334
|
// Handles cases where localStorage is either not defined or inaccessible
|
|
7335
7335
|
// by providing a do-nothing implementation
|
|
7336
7336
|
// NOTE: Recently added a LocalStorage preference over cookies that is implemented
|
|
7337
|
-
// `agentStorage` in `
|
|
7337
|
+
// `agentStorage` in `browser-storage.js`. These two should be reconciled but for
|
|
7338
7338
|
// now this shim was only used from Designer related parts of the Agent so the
|
|
7339
7339
|
// separation was an easy thing to maintain.
|
|
7340
7340
|
function wrapStorageMethod(storage, storageMethod, errorReturnValue) {
|
package/dist/pendo.module.js
CHANGED
|
@@ -3904,8 +3904,8 @@ let SERVER = '';
|
|
|
3904
3904
|
let ASSET_HOST = '';
|
|
3905
3905
|
let ASSET_PATH = '';
|
|
3906
3906
|
let DESIGNER_SERVER = '';
|
|
3907
|
-
let VERSION = '2.
|
|
3908
|
-
let PACKAGE_VERSION = '2.
|
|
3907
|
+
let VERSION = '2.298.0_';
|
|
3908
|
+
let PACKAGE_VERSION = '2.298.0';
|
|
3909
3909
|
let LOADER = 'xhr';
|
|
3910
3910
|
/* eslint-enable agent-eslint-rules/no-gulp-env-references */
|
|
3911
3911
|
/**
|
|
@@ -4336,7 +4336,7 @@ function allowKey(storageKey) {
|
|
|
4336
4336
|
// Handles cases where localStorage is either not defined or inaccessible
|
|
4337
4337
|
// by providing a do-nothing implementation
|
|
4338
4338
|
// NOTE: Recently added a LocalStorage preference over cookies that is implemented
|
|
4339
|
-
// `agentStorage` in `
|
|
4339
|
+
// `agentStorage` in `browser-storage.js`. These two should be reconciled but for
|
|
4340
4340
|
// now this shim was only used from Designer related parts of the Agent so the
|
|
4341
4341
|
// separation was an easy thing to maintain.
|
|
4342
4342
|
function wrapStorageMethod(storage, storageMethod, errorReturnValue) {
|
|
@@ -12841,7 +12841,7 @@ function createSendQueue(options, send, guaranteedSend) {
|
|
|
12841
12841
|
}
|
|
12842
12842
|
});
|
|
12843
12843
|
queue.onTimeout = function () {
|
|
12844
|
-
_PerformanceMonitor.
|
|
12844
|
+
_PerformanceMonitor.count(`${options.beacon}-gif-failure`);
|
|
12845
12845
|
};
|
|
12846
12846
|
queue.retryPending = true;
|
|
12847
12847
|
return queue;
|
|
@@ -15351,6 +15351,8 @@ function addInlineStyles(config, id, styles, element = document.head) {
|
|
|
15351
15351
|
}
|
|
15352
15352
|
|
|
15353
15353
|
var BuildingBlockTemplates = (function () {
|
|
15354
|
+
var textElementTypes = ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'span', 'div',
|
|
15355
|
+
'li', 'ul', 'ol', 'strong', 'em', 'b', 'i', 'small', 'label'];
|
|
15354
15356
|
return {
|
|
15355
15357
|
buildNodesFromTemplate,
|
|
15356
15358
|
generateUnreadAnnouncementMiniBubble,
|
|
@@ -15482,6 +15484,21 @@ var BuildingBlockTemplates = (function () {
|
|
|
15482
15484
|
var notificationBubbleConfig = _.get(homeView, 'attributes.notificationBubble');
|
|
15483
15485
|
var notificationsObj = _.get(homeView, 'attributes.notifications');
|
|
15484
15486
|
if (notificationBubbleConfig && notificationsObj) {
|
|
15487
|
+
// Check for dark mode and use dark mode colors if available
|
|
15488
|
+
if (homeView.steps && homeView.steps[0] && homeView.steps[0].isDarkMode) {
|
|
15489
|
+
var darkModeBackgroundColor = _.get(homeView, 'attributes.darkMode.notificationBubble.background-color');
|
|
15490
|
+
var darkModeTextColor = _.get(homeView, 'attributes.darkMode.notificationBubble.color');
|
|
15491
|
+
if (darkModeBackgroundColor || darkModeTextColor) {
|
|
15492
|
+
// Create a copy of the config with dark mode colors
|
|
15493
|
+
notificationBubbleConfig = _.clone(notificationBubbleConfig);
|
|
15494
|
+
if (darkModeBackgroundColor) {
|
|
15495
|
+
notificationBubbleConfig['background-color'] = darkModeBackgroundColor;
|
|
15496
|
+
}
|
|
15497
|
+
if (darkModeTextColor) {
|
|
15498
|
+
notificationBubbleConfig.color = darkModeTextColor;
|
|
15499
|
+
}
|
|
15500
|
+
}
|
|
15501
|
+
}
|
|
15485
15502
|
var notificationId;
|
|
15486
15503
|
if (_.get(guide, 'attributes.resourceCenter.moduleId') === 'AnnouncementsModule') {
|
|
15487
15504
|
notificationId = guide.id;
|
|
@@ -15720,6 +15737,7 @@ var BuildingBlockTemplates = (function () {
|
|
|
15720
15737
|
bubbleConfig.dir = 'rtl';
|
|
15721
15738
|
}
|
|
15722
15739
|
}
|
|
15740
|
+
var announcementsModule = step.getGuide();
|
|
15723
15741
|
return _.map(announcementGuides, function (guide, index) {
|
|
15724
15742
|
var isP1WhatsNewGuide = _.get(guide, 'attributes.type') === 'whatsnew';
|
|
15725
15743
|
var listItem = JSON.parse(JSON.stringify(templateJson)); // underscore doesn't have deep clone
|
|
@@ -15729,15 +15747,54 @@ var BuildingBlockTemplates = (function () {
|
|
|
15729
15747
|
if (isP1WhatsNewGuide) {
|
|
15730
15748
|
return renderWhatsNew(guide, listItem, bubbleConfig, buildNodeFromJSON);
|
|
15731
15749
|
}
|
|
15732
|
-
return renderAnnouncement(guide, listItem, bubbleConfig, buildNodeFromJSON);
|
|
15750
|
+
return renderAnnouncement(guide, listItem, bubbleConfig, buildNodeFromJSON, announcementsModule);
|
|
15733
15751
|
});
|
|
15734
15752
|
}
|
|
15735
|
-
function renderAnnouncement(guide, listItem, bubbleConfig, buildNodeFromJSON) {
|
|
15753
|
+
function renderAnnouncement(guide, listItem, bubbleConfig, buildNodeFromJSON, announcementsModule) {
|
|
15736
15754
|
var miniBubble;
|
|
15737
15755
|
var processedGuide = GuideFactory(guide);
|
|
15738
15756
|
var announcementStep = guide.steps[0];
|
|
15739
15757
|
GuideRuntime.runCustomScripts(announcementStep, processedGuide);
|
|
15740
15758
|
var announcementDomJson = JSON.parse(JSON.stringify(announcementStep.domJson)); // underscore doesn't have deep clone
|
|
15759
|
+
// Apply dark mode color overrides if enabled
|
|
15760
|
+
var darkModeOverrides = _.get(announcementsModule, 'attributes.darkModeColorOverrides');
|
|
15761
|
+
if (darkModeOverrides && darkModeOverrides.enabled) {
|
|
15762
|
+
// Cache frequently accessed objects
|
|
15763
|
+
var announcementStepAttrs = announcementStep.attributes;
|
|
15764
|
+
var announcementStepDarkMode = _.get(announcementStepAttrs, 'darkMode');
|
|
15765
|
+
var announcementsModuleDarkMode = _.get(announcementsModule, 'attributes.darkMode');
|
|
15766
|
+
var darkModeSelector = _.get(announcementsModuleDarkMode, 'selector', '');
|
|
15767
|
+
// Cascade dark mode selector from announcements module to announcement guide
|
|
15768
|
+
if (darkModeSelector && announcementStepAttrs) {
|
|
15769
|
+
if (!announcementStepDarkMode) {
|
|
15770
|
+
announcementStepAttrs.darkMode = { selector: '' };
|
|
15771
|
+
announcementStepDarkMode = announcementStepAttrs.darkMode;
|
|
15772
|
+
}
|
|
15773
|
+
announcementStepDarkMode.selector = darkModeSelector;
|
|
15774
|
+
}
|
|
15775
|
+
// Determine if dark mode is active
|
|
15776
|
+
var isDarkModeActive = false;
|
|
15777
|
+
var effectiveSelector = _.get(announcementStepDarkMode, 'selector', '') || darkModeSelector;
|
|
15778
|
+
if (pendo$1.designerEnabled) {
|
|
15779
|
+
// In designer mode, check override values
|
|
15780
|
+
isDarkModeActive = _.get(announcementStepDarkMode, 'override') ||
|
|
15781
|
+
_.get(announcementsModule, 'steps.0.attributes.darkMode.override', false);
|
|
15782
|
+
}
|
|
15783
|
+
else if (effectiveSelector) {
|
|
15784
|
+
// In client mode, detect based on selector
|
|
15785
|
+
isDarkModeActive = pendo$1.Sizzle(effectiveSelector).length > 0;
|
|
15786
|
+
}
|
|
15787
|
+
if (isDarkModeActive) {
|
|
15788
|
+
// Only apply overrides if we have actual color values to apply
|
|
15789
|
+
var hasValidOverrides = darkModeOverrides.guideBackground ||
|
|
15790
|
+
darkModeOverrides.textColor ||
|
|
15791
|
+
darkModeOverrides.linkColor ||
|
|
15792
|
+
darkModeOverrides.borderColor;
|
|
15793
|
+
if (hasValidOverrides) {
|
|
15794
|
+
applyDarkModeColorOverrides(announcementDomJson, darkModeOverrides);
|
|
15795
|
+
}
|
|
15796
|
+
}
|
|
15797
|
+
}
|
|
15741
15798
|
listItem.children = [announcementDomJson];
|
|
15742
15799
|
if (bubbleConfig) {
|
|
15743
15800
|
miniBubble = generateUnreadAnnouncementMiniBubble(bubbleConfig);
|
|
@@ -15874,6 +15931,41 @@ var BuildingBlockTemplates = (function () {
|
|
|
15874
15931
|
};
|
|
15875
15932
|
listItemRow.children.splice(textContainerIndex + 1, 0, notificationBubble);
|
|
15876
15933
|
}
|
|
15934
|
+
function applyDarkModeColorOverrides(domJson, overrides) {
|
|
15935
|
+
var props = _.get(domJson, 'props');
|
|
15936
|
+
if (!domJson || !props)
|
|
15937
|
+
return;
|
|
15938
|
+
if (!props.style)
|
|
15939
|
+
props.style = {};
|
|
15940
|
+
var style = props.style;
|
|
15941
|
+
var elementId = _.get(props, 'id', '');
|
|
15942
|
+
if (elementId.indexOf('pendo-guide-container') !== -1) {
|
|
15943
|
+
if (overrides.guideBackground) {
|
|
15944
|
+
style['background-color'] = overrides.guideBackground;
|
|
15945
|
+
}
|
|
15946
|
+
if (overrides.borderColor) {
|
|
15947
|
+
style['border-color'] = overrides.borderColor;
|
|
15948
|
+
}
|
|
15949
|
+
}
|
|
15950
|
+
var isLink = domJson.type === 'a';
|
|
15951
|
+
if (isLink && overrides.linkColor) {
|
|
15952
|
+
style.color = overrides.linkColor;
|
|
15953
|
+
}
|
|
15954
|
+
var textColor = overrides.textColor;
|
|
15955
|
+
if (!isLink && textColor) {
|
|
15956
|
+
var content = _.get(domJson, 'content', '');
|
|
15957
|
+
var hasTextContent = content && typeof content === 'string' && content.trim().length > 0;
|
|
15958
|
+
if (textElementTypes.indexOf(domJson.type) !== -1 || hasTextContent) {
|
|
15959
|
+
style.color = textColor;
|
|
15960
|
+
}
|
|
15961
|
+
}
|
|
15962
|
+
var children = _.get(domJson, 'children', []);
|
|
15963
|
+
if (_.isArray(children)) {
|
|
15964
|
+
_.each(children, function (child) {
|
|
15965
|
+
applyDarkModeColorOverrides(child, overrides);
|
|
15966
|
+
});
|
|
15967
|
+
}
|
|
15968
|
+
}
|
|
15877
15969
|
})();
|
|
15878
15970
|
|
|
15879
15971
|
var BuildingBlockSvgs = (function () {
|
|
@@ -15881,18 +15973,18 @@ var BuildingBlockSvgs = (function () {
|
|
|
15881
15973
|
buildSvgNode,
|
|
15882
15974
|
createProgressCircleSvg
|
|
15883
15975
|
};
|
|
15884
|
-
function buildSvgNode(widgetId, json) {
|
|
15976
|
+
function buildSvgNode(widgetId, json, isDarkMode) {
|
|
15885
15977
|
// eslint-disable-next-line default-case
|
|
15886
15978
|
switch (widgetId) {
|
|
15887
15979
|
case 'onboardingProgressCircle':
|
|
15888
15980
|
case 'taskListProgressCircle':
|
|
15889
|
-
return createProgressCircleSvg(json);
|
|
15981
|
+
return createProgressCircleSvg(json, isDarkMode);
|
|
15890
15982
|
}
|
|
15891
15983
|
}
|
|
15892
|
-
function createProgressCircleSvg(bbJson) {
|
|
15984
|
+
function createProgressCircleSvg(bbJson, isDarkMode) {
|
|
15893
15985
|
if (isOldIE(9))
|
|
15894
|
-
return createProgressCircleIEFallback(bbJson);
|
|
15895
|
-
var svgAttributes = bbJson
|
|
15986
|
+
return createProgressCircleIEFallback(bbJson, isDarkMode);
|
|
15987
|
+
var svgAttributes = getSvgAttributes(bbJson, isDarkMode);
|
|
15896
15988
|
var percentComplete = svgAttributes.fillCircle.percentComplete || 0;
|
|
15897
15989
|
var isComplete = percentComplete >= 100;
|
|
15898
15990
|
if (isComplete) {
|
|
@@ -15936,8 +16028,8 @@ var BuildingBlockSvgs = (function () {
|
|
|
15936
16028
|
}
|
|
15937
16029
|
return svgElement;
|
|
15938
16030
|
}
|
|
15939
|
-
function createProgressCircleIEFallback(bbJson) {
|
|
15940
|
-
var svgAttributes = bbJson
|
|
16031
|
+
function createProgressCircleIEFallback(bbJson, isDarkMode) {
|
|
16032
|
+
var svgAttributes = getSvgAttributes(bbJson, isDarkMode);
|
|
15941
16033
|
var fillColor = svgAttributes.fillCircle.stroke;
|
|
15942
16034
|
var backgroundColor = svgAttributes.backgroundCircle.stroke;
|
|
15943
16035
|
var percentComplete = svgAttributes.fillCircle.percentComplete || 0;
|
|
@@ -15963,6 +16055,22 @@ var BuildingBlockSvgs = (function () {
|
|
|
15963
16055
|
}
|
|
15964
16056
|
return fallbackSquare;
|
|
15965
16057
|
}
|
|
16058
|
+
function getSvgAttributes(bbJson, isDarkMode) {
|
|
16059
|
+
// Always start with the regular SVG attributes
|
|
16060
|
+
var svgAttributes = _.clone(bbJson.svgAttributes);
|
|
16061
|
+
// If dark mode is active and dark mode attributes exist, override only the stroke colors
|
|
16062
|
+
if (isDarkMode && bbJson.darkModeSvgAttributes) {
|
|
16063
|
+
var backgroundCircleStroke = _.get(bbJson.darkModeSvgAttributes, 'backgroundCircle.stroke');
|
|
16064
|
+
if (backgroundCircleStroke) {
|
|
16065
|
+
svgAttributes.backgroundCircle.stroke = backgroundCircleStroke;
|
|
16066
|
+
}
|
|
16067
|
+
var fillCircleStroke = _.get(bbJson.darkModeSvgAttributes, 'fillCircle.stroke');
|
|
16068
|
+
if (fillCircleStroke) {
|
|
16069
|
+
svgAttributes.fillCircle.stroke = fillCircleStroke;
|
|
16070
|
+
}
|
|
16071
|
+
}
|
|
16072
|
+
return svgAttributes;
|
|
16073
|
+
}
|
|
15966
16074
|
})();
|
|
15967
16075
|
|
|
15968
16076
|
var isLessThan = function (x, y) { return x < y; };
|
|
@@ -16187,7 +16295,11 @@ function addStylesToBackdrops(backdrops, step) {
|
|
|
16187
16295
|
_.each(originalBackdrop.props, function (propValue, propKey) {
|
|
16188
16296
|
_.each(backdrops, function (backdrop, index) {
|
|
16189
16297
|
if (propKey === 'style') {
|
|
16190
|
-
|
|
16298
|
+
let nodeStyle = originalBackdrop.props.style;
|
|
16299
|
+
if (step.isDarkMode && originalBackdrop.darkModeProps) {
|
|
16300
|
+
nodeStyle = Object.assign(Object.assign({}, originalBackdrop.props.style), originalBackdrop.darkModeProps.style);
|
|
16301
|
+
}
|
|
16302
|
+
backdrop.css(nodeStyle);
|
|
16191
16303
|
}
|
|
16192
16304
|
else if (propKey === 'class') {
|
|
16193
16305
|
backdrop.addClass(propValue);
|
|
@@ -18021,7 +18133,7 @@ function buildNodeFromJSON(json, step, guides) {
|
|
|
18021
18133
|
}
|
|
18022
18134
|
}
|
|
18023
18135
|
if (json.svgWidgetId) {
|
|
18024
|
-
var svg = BuildingBlockSvgs.buildSvgNode(json.svgWidgetId, json);
|
|
18136
|
+
var svg = BuildingBlockSvgs.buildSvgNode(json.svgWidgetId, json, step.isDarkMode);
|
|
18025
18137
|
svg.appendTo(curNode);
|
|
18026
18138
|
}
|
|
18027
18139
|
if (json.actions && json.actions.length) {
|
|
@@ -20719,10 +20831,19 @@ function syncColorMode(step, rerender = false) {
|
|
|
20719
20831
|
const darkModeSelector = _.get(step, 'attributes.darkMode.selector', '');
|
|
20720
20832
|
if (!darkModeSelector)
|
|
20721
20833
|
return;
|
|
20722
|
-
|
|
20723
|
-
|
|
20724
|
-
if (
|
|
20725
|
-
|
|
20834
|
+
// Determine the target dark mode state
|
|
20835
|
+
let targetDarkMode;
|
|
20836
|
+
if (pendo$1.designerEnabled && _.has(step, 'attributes.darkMode.override')) {
|
|
20837
|
+
// In designer mode, use the override value
|
|
20838
|
+
targetDarkMode = step.attributes.darkMode.override;
|
|
20839
|
+
}
|
|
20840
|
+
else {
|
|
20841
|
+
// In client mode, detect based on selector
|
|
20842
|
+
targetDarkMode = pendo$1.Sizzle(darkModeSelector).length > 0;
|
|
20843
|
+
}
|
|
20844
|
+
// Update and rerender if the state changed
|
|
20845
|
+
if (step.isDarkMode !== targetDarkMode) {
|
|
20846
|
+
step.isDarkMode = targetDarkMode;
|
|
20726
20847
|
if (rerender) {
|
|
20727
20848
|
step.hide();
|
|
20728
20849
|
step.show(step.seenReason);
|
|
@@ -26474,15 +26595,15 @@ class NetworkRequestIntercept {
|
|
|
26474
26595
|
const $stringLength = 8;
|
|
26475
26596
|
return 'req_' + Date.now() + '_' + pendo$1.randomString($stringLength);
|
|
26476
26597
|
}
|
|
26477
|
-
|
|
26598
|
+
safelyReadBody(config, type) {
|
|
26478
26599
|
return __awaiter(this, void 0, void 0, function* () {
|
|
26479
26600
|
try {
|
|
26480
|
-
const contentType =
|
|
26601
|
+
const contentType = config.headers.get('content-type') || '';
|
|
26481
26602
|
if (contentType.indexOf('application/json') !== -1) {
|
|
26482
|
-
return yield
|
|
26603
|
+
return yield config.json();
|
|
26483
26604
|
}
|
|
26484
26605
|
else if (contentType.indexOf('text/') !== -1) {
|
|
26485
|
-
return yield
|
|
26606
|
+
return yield config.text();
|
|
26486
26607
|
}
|
|
26487
26608
|
else {
|
|
26488
26609
|
// For binary or unknown content types, just capture metadata
|
|
@@ -26490,14 +26611,14 @@ class NetworkRequestIntercept {
|
|
|
26490
26611
|
}
|
|
26491
26612
|
}
|
|
26492
26613
|
catch (e) {
|
|
26493
|
-
return
|
|
26614
|
+
return `[Unable to read ${type} body]`;
|
|
26494
26615
|
}
|
|
26495
26616
|
});
|
|
26496
26617
|
}
|
|
26497
|
-
|
|
26618
|
+
extractConfigHeaders(config) {
|
|
26498
26619
|
let headers = {};
|
|
26499
|
-
if (
|
|
26500
|
-
const headerEntries = Array.from(
|
|
26620
|
+
if (config.headers) {
|
|
26621
|
+
const headerEntries = Array.from(config.headers.entries());
|
|
26501
26622
|
headers = this.entriesToObject(headerEntries);
|
|
26502
26623
|
}
|
|
26503
26624
|
return headers;
|
|
@@ -26515,19 +26636,44 @@ class NetworkRequestIntercept {
|
|
|
26515
26636
|
});
|
|
26516
26637
|
return headers;
|
|
26517
26638
|
}
|
|
26639
|
+
safelyReadRequestBody(request, isRequestObject) {
|
|
26640
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
26641
|
+
if (!request)
|
|
26642
|
+
return '';
|
|
26643
|
+
const networkInterceptor = this;
|
|
26644
|
+
if (isRequestObject) {
|
|
26645
|
+
return networkInterceptor.safelyReadBody(request, 'request');
|
|
26646
|
+
}
|
|
26647
|
+
return networkInterceptor.safelySerializeBody(request.body);
|
|
26648
|
+
});
|
|
26649
|
+
}
|
|
26650
|
+
extractRequestHeaders(request, isRequestObject) {
|
|
26651
|
+
const networkInterceptor = this;
|
|
26652
|
+
if (isRequestObject) {
|
|
26653
|
+
return networkInterceptor.extractConfigHeaders(request);
|
|
26654
|
+
}
|
|
26655
|
+
return networkInterceptor.extractHeaders(request.headers);
|
|
26656
|
+
}
|
|
26518
26657
|
patchFetch() {
|
|
26519
26658
|
const networkInterceptor = this;
|
|
26520
26659
|
networkInterceptor._originalFetch = window.fetch;
|
|
26521
26660
|
window.fetch = function (...args) {
|
|
26522
26661
|
return __awaiter(this, void 0, void 0, function* () {
|
|
26523
|
-
|
|
26662
|
+
let [url, config = {}] = args;
|
|
26663
|
+
let isRequestObject = false;
|
|
26664
|
+
if (_.isObject(args[0])) {
|
|
26665
|
+
isRequestObject = true;
|
|
26666
|
+
url = args[0].url;
|
|
26667
|
+
// Clone the Request object to avoid consuming the body
|
|
26668
|
+
config = args[0].clone();
|
|
26669
|
+
}
|
|
26524
26670
|
const transformedUrl = getTransformedUrl(url);
|
|
26525
26671
|
const method = config.method || 'GET';
|
|
26526
26672
|
const requestId = networkInterceptor.generateRequestId();
|
|
26527
26673
|
// Capture request data
|
|
26528
26674
|
try {
|
|
26529
|
-
const headers = networkInterceptor.
|
|
26530
|
-
const body = networkInterceptor.
|
|
26675
|
+
const headers = networkInterceptor.extractRequestHeaders(config, isRequestObject);
|
|
26676
|
+
const body = yield networkInterceptor.safelyReadRequestBody(config, isRequestObject);
|
|
26531
26677
|
_.each(networkInterceptor.callbackFns, ({ request }) => {
|
|
26532
26678
|
if (_.isFunction(request))
|
|
26533
26679
|
request({ requestId, method, url: transformedUrl, body, headers });
|
|
@@ -26546,9 +26692,9 @@ class NetworkRequestIntercept {
|
|
|
26546
26692
|
const responseClone = res.clone();
|
|
26547
26693
|
try {
|
|
26548
26694
|
// Capture response data
|
|
26549
|
-
const responseBody = yield networkInterceptor.
|
|
26695
|
+
const responseBody = yield networkInterceptor.safelyReadBody(responseClone, 'response');
|
|
26550
26696
|
const { status, statusText } = res;
|
|
26551
|
-
const headers = networkInterceptor.
|
|
26697
|
+
const headers = networkInterceptor.extractConfigHeaders(res);
|
|
26552
26698
|
_.each(networkInterceptor.callbackFns, ({ response }) => {
|
|
26553
26699
|
if (_.isFunction(response)) {
|
|
26554
26700
|
response({
|
|
@@ -39200,6 +39346,8 @@ class DOMPrompt {
|
|
|
39200
39346
|
constructor(pendo, PluginAPI, id, privacyFilters, inputCssSelectors, submitCssSelectors) {
|
|
39201
39347
|
this.listeners = [];
|
|
39202
39348
|
this.latestPromptValue = '';
|
|
39349
|
+
this.isActive = true;
|
|
39350
|
+
this.lastSubmitTime = 0;
|
|
39203
39351
|
this.dom = pendo.dom;
|
|
39204
39352
|
this._ = pendo._;
|
|
39205
39353
|
this.api = PluginAPI;
|
|
@@ -39290,9 +39438,15 @@ class DOMPrompt {
|
|
|
39290
39438
|
return candidateValue.replace(filtersToUse, 'redacted');
|
|
39291
39439
|
}
|
|
39292
39440
|
submit(origVal) {
|
|
39293
|
-
if (!origVal) {
|
|
39441
|
+
if (!origVal || !this.isActive) {
|
|
39442
|
+
return;
|
|
39443
|
+
}
|
|
39444
|
+
// Prevent duplicate submissions within 2ms
|
|
39445
|
+
const now = Date.now();
|
|
39446
|
+
if (now - this.lastSubmitTime < 2) {
|
|
39294
39447
|
return;
|
|
39295
39448
|
}
|
|
39449
|
+
this.lastSubmitTime = now;
|
|
39296
39450
|
const val = this.applyPrivacyFilter(origVal);
|
|
39297
39451
|
const payload = {
|
|
39298
39452
|
agentId: this.id,
|
|
@@ -39338,6 +39492,22 @@ class DOMPrompt {
|
|
|
39338
39492
|
onSubmit(callback) {
|
|
39339
39493
|
this.listeners.push(callback);
|
|
39340
39494
|
}
|
|
39495
|
+
suspend() {
|
|
39496
|
+
this.isActive = false;
|
|
39497
|
+
}
|
|
39498
|
+
resume() {
|
|
39499
|
+
this.isActive = true;
|
|
39500
|
+
this._.each(this.inputEls, (inputEl) => {
|
|
39501
|
+
if (inputEl) {
|
|
39502
|
+
inputEl.get();
|
|
39503
|
+
}
|
|
39504
|
+
});
|
|
39505
|
+
this._.each(this.submitEls, (submitEl) => {
|
|
39506
|
+
if (submitEl) {
|
|
39507
|
+
submitEl.get();
|
|
39508
|
+
}
|
|
39509
|
+
});
|
|
39510
|
+
}
|
|
39341
39511
|
teardown() {
|
|
39342
39512
|
if (this.promptContainer) {
|
|
39343
39513
|
this.promptContainer.teardown();
|
|
@@ -39426,13 +39596,17 @@ class PromptPlugin {
|
|
|
39426
39596
|
reEvaluatePageRules() {
|
|
39427
39597
|
const currentUrl = getNormalizedUrl();
|
|
39428
39598
|
const allAgents = this.api.ConfigReader.get(this.configName) || [];
|
|
39429
|
-
|
|
39430
|
-
// Remove agents that no longer match from active tracking
|
|
39431
|
-
this.prompts = this._.filter(this.prompts, prompt => {
|
|
39599
|
+
this._.each(this.prompts, prompt => {
|
|
39432
39600
|
const agent = this.findAgentById(prompt.id);
|
|
39433
|
-
|
|
39601
|
+
const shouldBeActive = agent && this.testPageRule(agent.pageRule, currentUrl, agent.id);
|
|
39602
|
+
if (shouldBeActive) {
|
|
39603
|
+
prompt.resume();
|
|
39604
|
+
}
|
|
39605
|
+
else {
|
|
39606
|
+
prompt.suspend();
|
|
39607
|
+
}
|
|
39434
39608
|
});
|
|
39435
|
-
|
|
39609
|
+
const currentlyActiveIds = this._.map(this._.filter(this.prompts, prompt => prompt.isActive), prompt => prompt.id);
|
|
39436
39610
|
this._.each(allAgents, aiAgent => {
|
|
39437
39611
|
const isCurrentlyActive = this._.contains(currentlyActiveIds, aiAgent.id);
|
|
39438
39612
|
const shouldBeActive = this.testPageRule(aiAgent.pageRule, currentUrl, aiAgent.id);
|
|
@@ -39531,14 +39705,14 @@ class PromptPlugin {
|
|
|
39531
39705
|
return selectors;
|
|
39532
39706
|
}
|
|
39533
39707
|
sendEvent(promptEvent) {
|
|
39534
|
-
|
|
39535
|
-
const
|
|
39536
|
-
|
|
39537
|
-
if (agent && !this.testPageRule(agent.pageRule, currentUrl, agent.id)) {
|
|
39708
|
+
// Block event if the prompt is suspended
|
|
39709
|
+
const prompt = this._.find(this.prompts, p => p.id === promptEvent.agentId);
|
|
39710
|
+
if (prompt && !prompt.isActive) {
|
|
39538
39711
|
return;
|
|
39539
39712
|
}
|
|
39540
39713
|
const event = this._.extend({
|
|
39541
|
-
promptType: 'request'
|
|
39714
|
+
promptType: 'request',
|
|
39715
|
+
agentType: 'prompt'
|
|
39542
39716
|
}, promptEvent);
|
|
39543
39717
|
this.api.analytics.collectEvent('prompt', event);
|
|
39544
39718
|
}
|