@pendo/agent 2.297.2 → 2.298.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/dist/dom.esm.js +2 -2
- package/dist/pendo.module.js +216 -42
- 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.1_';
|
|
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.1_';
|
|
3908
|
+
let PACKAGE_VERSION = '2.298.1';
|
|
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) {
|
|
@@ -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);
|
|
@@ -26477,15 +26598,15 @@ class NetworkRequestIntercept {
|
|
|
26477
26598
|
const $stringLength = 8;
|
|
26478
26599
|
return 'req_' + Date.now() + '_' + pendo$1.randomString($stringLength);
|
|
26479
26600
|
}
|
|
26480
|
-
|
|
26601
|
+
safelyReadBody(config, type) {
|
|
26481
26602
|
return __awaiter(this, void 0, void 0, function* () {
|
|
26482
26603
|
try {
|
|
26483
|
-
const contentType =
|
|
26604
|
+
const contentType = config.headers.get('content-type') || '';
|
|
26484
26605
|
if (contentType.indexOf('application/json') !== -1) {
|
|
26485
|
-
return yield
|
|
26606
|
+
return yield config.json();
|
|
26486
26607
|
}
|
|
26487
26608
|
else if (contentType.indexOf('text/') !== -1) {
|
|
26488
|
-
return yield
|
|
26609
|
+
return yield config.text();
|
|
26489
26610
|
}
|
|
26490
26611
|
else {
|
|
26491
26612
|
// For binary or unknown content types, just capture metadata
|
|
@@ -26493,14 +26614,14 @@ class NetworkRequestIntercept {
|
|
|
26493
26614
|
}
|
|
26494
26615
|
}
|
|
26495
26616
|
catch (e) {
|
|
26496
|
-
return
|
|
26617
|
+
return `[Unable to read ${type} body]`;
|
|
26497
26618
|
}
|
|
26498
26619
|
});
|
|
26499
26620
|
}
|
|
26500
|
-
|
|
26621
|
+
extractConfigHeaders(config) {
|
|
26501
26622
|
let headers = {};
|
|
26502
|
-
if (
|
|
26503
|
-
const headerEntries = Array.from(
|
|
26623
|
+
if (config.headers) {
|
|
26624
|
+
const headerEntries = Array.from(config.headers.entries());
|
|
26504
26625
|
headers = this.entriesToObject(headerEntries);
|
|
26505
26626
|
}
|
|
26506
26627
|
return headers;
|
|
@@ -26518,19 +26639,44 @@ class NetworkRequestIntercept {
|
|
|
26518
26639
|
});
|
|
26519
26640
|
return headers;
|
|
26520
26641
|
}
|
|
26642
|
+
safelyReadRequestBody(request, isRequestObject) {
|
|
26643
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
26644
|
+
if (!request)
|
|
26645
|
+
return '';
|
|
26646
|
+
const networkInterceptor = this;
|
|
26647
|
+
if (isRequestObject) {
|
|
26648
|
+
return networkInterceptor.safelyReadBody(request, 'request');
|
|
26649
|
+
}
|
|
26650
|
+
return networkInterceptor.safelySerializeBody(request.body);
|
|
26651
|
+
});
|
|
26652
|
+
}
|
|
26653
|
+
extractRequestHeaders(request, isRequestObject) {
|
|
26654
|
+
const networkInterceptor = this;
|
|
26655
|
+
if (isRequestObject) {
|
|
26656
|
+
return networkInterceptor.extractConfigHeaders(request);
|
|
26657
|
+
}
|
|
26658
|
+
return networkInterceptor.extractHeaders(request.headers);
|
|
26659
|
+
}
|
|
26521
26660
|
patchFetch() {
|
|
26522
26661
|
const networkInterceptor = this;
|
|
26523
26662
|
networkInterceptor._originalFetch = window.fetch;
|
|
26524
26663
|
window.fetch = function (...args) {
|
|
26525
26664
|
return __awaiter(this, void 0, void 0, function* () {
|
|
26526
|
-
|
|
26665
|
+
let [url, config = {}] = args;
|
|
26666
|
+
let isRequestObject = false;
|
|
26667
|
+
if (_.isObject(args[0])) {
|
|
26668
|
+
isRequestObject = true;
|
|
26669
|
+
url = args[0].url;
|
|
26670
|
+
// Clone the Request object to avoid consuming the body
|
|
26671
|
+
config = args[0].clone();
|
|
26672
|
+
}
|
|
26527
26673
|
const transformedUrl = getTransformedUrl(url);
|
|
26528
26674
|
const method = config.method || 'GET';
|
|
26529
26675
|
const requestId = networkInterceptor.generateRequestId();
|
|
26530
26676
|
// Capture request data
|
|
26531
26677
|
try {
|
|
26532
|
-
const headers = networkInterceptor.
|
|
26533
|
-
const body = networkInterceptor.
|
|
26678
|
+
const headers = networkInterceptor.extractRequestHeaders(config, isRequestObject);
|
|
26679
|
+
const body = yield networkInterceptor.safelyReadRequestBody(config, isRequestObject);
|
|
26534
26680
|
_.each(networkInterceptor.callbackFns, ({ request }) => {
|
|
26535
26681
|
if (_.isFunction(request))
|
|
26536
26682
|
request({ requestId, method, url: transformedUrl, body, headers });
|
|
@@ -26549,9 +26695,9 @@ class NetworkRequestIntercept {
|
|
|
26549
26695
|
const responseClone = res.clone();
|
|
26550
26696
|
try {
|
|
26551
26697
|
// Capture response data
|
|
26552
|
-
const responseBody = yield networkInterceptor.
|
|
26698
|
+
const responseBody = yield networkInterceptor.safelyReadBody(responseClone, 'response');
|
|
26553
26699
|
const { status, statusText } = res;
|
|
26554
|
-
const headers = networkInterceptor.
|
|
26700
|
+
const headers = networkInterceptor.extractConfigHeaders(res);
|
|
26555
26701
|
_.each(networkInterceptor.callbackFns, ({ response }) => {
|
|
26556
26702
|
if (_.isFunction(response)) {
|
|
26557
26703
|
response({
|
|
@@ -39203,6 +39349,8 @@ class DOMPrompt {
|
|
|
39203
39349
|
constructor(pendo, PluginAPI, id, privacyFilters, inputCssSelectors, submitCssSelectors) {
|
|
39204
39350
|
this.listeners = [];
|
|
39205
39351
|
this.latestPromptValue = '';
|
|
39352
|
+
this.isActive = true;
|
|
39353
|
+
this.lastSubmitTime = 0;
|
|
39206
39354
|
this.dom = pendo.dom;
|
|
39207
39355
|
this._ = pendo._;
|
|
39208
39356
|
this.api = PluginAPI;
|
|
@@ -39293,9 +39441,15 @@ class DOMPrompt {
|
|
|
39293
39441
|
return candidateValue.replace(filtersToUse, 'redacted');
|
|
39294
39442
|
}
|
|
39295
39443
|
submit(origVal) {
|
|
39296
|
-
if (!origVal) {
|
|
39444
|
+
if (!origVal || !this.isActive) {
|
|
39445
|
+
return;
|
|
39446
|
+
}
|
|
39447
|
+
// Prevent duplicate submissions within 2ms
|
|
39448
|
+
const now = Date.now();
|
|
39449
|
+
if (now - this.lastSubmitTime < 2) {
|
|
39297
39450
|
return;
|
|
39298
39451
|
}
|
|
39452
|
+
this.lastSubmitTime = now;
|
|
39299
39453
|
const val = this.applyPrivacyFilter(origVal);
|
|
39300
39454
|
const payload = {
|
|
39301
39455
|
agentId: this.id,
|
|
@@ -39341,6 +39495,22 @@ class DOMPrompt {
|
|
|
39341
39495
|
onSubmit(callback) {
|
|
39342
39496
|
this.listeners.push(callback);
|
|
39343
39497
|
}
|
|
39498
|
+
suspend() {
|
|
39499
|
+
this.isActive = false;
|
|
39500
|
+
}
|
|
39501
|
+
resume() {
|
|
39502
|
+
this.isActive = true;
|
|
39503
|
+
this._.each(this.inputEls, (inputEl) => {
|
|
39504
|
+
if (inputEl) {
|
|
39505
|
+
inputEl.get();
|
|
39506
|
+
}
|
|
39507
|
+
});
|
|
39508
|
+
this._.each(this.submitEls, (submitEl) => {
|
|
39509
|
+
if (submitEl) {
|
|
39510
|
+
submitEl.get();
|
|
39511
|
+
}
|
|
39512
|
+
});
|
|
39513
|
+
}
|
|
39344
39514
|
teardown() {
|
|
39345
39515
|
if (this.promptContainer) {
|
|
39346
39516
|
this.promptContainer.teardown();
|
|
@@ -39429,13 +39599,17 @@ class PromptPlugin {
|
|
|
39429
39599
|
reEvaluatePageRules() {
|
|
39430
39600
|
const currentUrl = getNormalizedUrl();
|
|
39431
39601
|
const allAgents = this.api.ConfigReader.get(this.configName) || [];
|
|
39432
|
-
|
|
39433
|
-
// Remove agents that no longer match from active tracking
|
|
39434
|
-
this.prompts = this._.filter(this.prompts, prompt => {
|
|
39602
|
+
this._.each(this.prompts, prompt => {
|
|
39435
39603
|
const agent = this.findAgentById(prompt.id);
|
|
39436
|
-
|
|
39604
|
+
const shouldBeActive = agent && this.testPageRule(agent.pageRule, currentUrl, agent.id);
|
|
39605
|
+
if (shouldBeActive) {
|
|
39606
|
+
prompt.resume();
|
|
39607
|
+
}
|
|
39608
|
+
else {
|
|
39609
|
+
prompt.suspend();
|
|
39610
|
+
}
|
|
39437
39611
|
});
|
|
39438
|
-
|
|
39612
|
+
const currentlyActiveIds = this._.map(this._.filter(this.prompts, prompt => prompt.isActive), prompt => prompt.id);
|
|
39439
39613
|
this._.each(allAgents, aiAgent => {
|
|
39440
39614
|
const isCurrentlyActive = this._.contains(currentlyActiveIds, aiAgent.id);
|
|
39441
39615
|
const shouldBeActive = this.testPageRule(aiAgent.pageRule, currentUrl, aiAgent.id);
|
|
@@ -39534,14 +39708,14 @@ class PromptPlugin {
|
|
|
39534
39708
|
return selectors;
|
|
39535
39709
|
}
|
|
39536
39710
|
sendEvent(promptEvent) {
|
|
39537
|
-
|
|
39538
|
-
const
|
|
39539
|
-
|
|
39540
|
-
if (agent && !this.testPageRule(agent.pageRule, currentUrl, agent.id)) {
|
|
39711
|
+
// Block event if the prompt is suspended
|
|
39712
|
+
const prompt = this._.find(this.prompts, p => p.id === promptEvent.agentId);
|
|
39713
|
+
if (prompt && !prompt.isActive) {
|
|
39541
39714
|
return;
|
|
39542
39715
|
}
|
|
39543
39716
|
const event = this._.extend({
|
|
39544
|
-
promptType: 'request'
|
|
39717
|
+
promptType: 'request',
|
|
39718
|
+
agentType: 'prompt'
|
|
39545
39719
|
}, promptEvent);
|
|
39546
39720
|
this.api.analytics.collectEvent('prompt', event);
|
|
39547
39721
|
}
|