@pendo/agent 2.325.0 → 2.326.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/debugger-plugin.min.js +1 -1
- package/dist/dom.esm.js +11 -3
- package/dist/pendo.module.js +118 -80
- package/dist/pendo.module.min.js +7 -5
- package/dist/servers.json +7 -7
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*
|
|
2
2
|
@license https://agent.pendo.io/licenses
|
|
3
3
|
*/
|
|
4
|
-
!function(){"use strict";class L{constructor(e,t){this.path=e,this.handler=t}}class G{routes={};addRoute(e,t){this.routes[e]||(this.routes[e]=[]),this.routes[e].unshift(new L(e,t))}removeRoute(e){this.routes[e].shift()}lookupRouteProvider(){return e=>this.routes[e]?this.routes[e][0].handler:undefined}}const u=(...e)=>s=>{return[].concat(e).reduce((e,t,i,n)=>{e=t(e,s);return e||n.splice(i,n.length-i),e},s)};let W=0;const i=(e,t,i)=>{if(!e||"string"!=typeof t)return i;let n=e;for(const s of t.split(".")){if(null==n)return i;n=n[s]}return n===undefined?i:n};const t=(t,i)=>{if(t&&i)if(Array.isArray(t))for(let e=0;e<t.length;e++)i(t[e],e,t);else if("object"==typeof t)for(const e in t)t.hasOwnProperty(e)&&i(t[e],e,t);return t},h=e=>"function"==typeof e,O=e=>!(null==e),d=()=>Date.now();class e{app=null;router=null;destination=window.parent||window.top;origin="*";constructor(e,t={}){this.app=e,this.router=e.router,this.config=t,this.events=e.PluginAPI.getEventable()}getConfig(e,t){return i(this.config,e,t)}getDestinationProvider(){return()=>this.destination}getOriginProvider(){return()=>this.origin}triggerOpened(){this.events.trigger("opened",{containerType:this.type})}triggerClosed(){this.events.trigger("closed",{containerType:this.type})}}var a={padding:"0 !important",margin:"0 !important","box-sizing":"border-box !important",border:"none !important",display:"block !important",visibility:"visible !important"},c=2147483647,p={WINDOW_MARGIN:10,HEADER_HEIGHT:50,TOP:100,LEFT:100,HEIGHT:700,WIDTH:500,MIN_HEIGHT:500,MIN_WIDTH:500};const{MIN_HEIGHT:g,MIN_WIDTH:l,WINDOW_MARGIN:f}=p;function s(t,i,n,s,o){let r=0,a=0,d=0,c=0;function u(e){e.preventDefault(),i.css({visibility:"hidden"}),t.releasePointerCapture(e.pointerId),t.removeEventListener("pointermove",h),o()}function h(e){-1!==e.button||0===e.buttons?u(e):(e.preventDefault(),d=r-e.clientX,c=a-e.clientY,r=e.clientX,a=e.clientY,s(d,c))}t.addEventListener("pointerdown",function(e){0===e.button&&(e.preventDefault(),i.css({visibility:"visible"}),r=e.clientX,a=e.clientY,t.setPointerCapture(e.pointerId),t.addEventListener("pointermove",h),n())}),t.addEventListener("pointerup",u),t.addEventListener("pointerout",u)}function U(e,t){const i=e.handle[0],n=e.container[0];s(i,e.blockout,function(){i.style.cursor="grabbing"},function(e,t){n.style.left=m(n,e)+"px",n.style.top=v(n,t)+"px"},function(){i.style.cursor="grab",t()})}function m(e,t){t=e.offsetLeft-t,e=window.innerWidth-e.offsetWidth-f;return t<f||e<f?f:e<t?e:t}function v(e,t){t=e.offsetTop-t,e=window.innerHeight-e.offsetHeight-f;return t<f||e<f?f:e<t?e:t}function _(e,t){var i=e.resizeHandle[0];const n=e.container[0];s(i,e.blockout,()=>{},function(e,t){n.style.width=b(n,e)+"px",n.style.height=w(n,t)+"px"},t)}function b(e,t){t=e.offsetWidth-t,e=window.innerWidth-e.offsetLeft-f;return e<t?e:t<l?l:t}function w(e,t){t=e.offsetHeight-t,e=window.innerHeight-e.offsetTop-f;return e<t?e:t<g?g:t}class F extends e{type="frame";destination=window.parent||window.top;origin=/^https?:/.test(window.location.protocol)?window.location.origin:"*";constructor(n,e){super(n,e);const{pendo:s,PluginAPI:o}=n;e=this.getConfig("containerId","pendo-client-app");this.container=s.dom(`<div id="${e}" class="pendo-ignore">`).css({...a,height:n.state.height,width:n.state.width,"z-index":c-1,"background-color":"#FFFFFF",position:"fixed","box-shadow":"rgb(136, 136, 136) 0px 0px 20px 0px",overflow:"hidden"}),this.handle=s.dom('<div id="pendo-app-draggable-handle">').css({...a,"z-index":c,height:p.HEADER_HEIGHT,width:"calc(100% - 100px)",position:"absolute",cursor:"grab"}).on("dblclick",()=>{n.state.minimized||(this.container.css({height:p.HEIGHT,width:p.WIDTH,transition:"all 250ms linear"}),setTimeout(()=>{this.container&&(this.container.css({transition:"none"}),this.saveSize())},250))}).appendTo(this.container),this.resizeHandle=s.dom('<div id="pendo-app-resize-handle">').css({...a,"z-index":c,visibility:this.app.state.minimized?"hidden":"visible",height:0,width:0,"border-left":"10px solid transparent","border-bottom":"10px solid rgb(136, 136, 136)",cursor:"nwse-resize",position:"absolute",bottom:0,right:0}).appendTo(this.container),this.frame=s.dom('<iframe id="pendo-agent-application" src="about:blank">').css({...a,height:"100%",width:"100%"}).on("load",()=>{if(o.ConfigReader.get("inlineStyleNonce")){const i=this.frame[0].contentDocument.createElement.bind(this.frame[0].contentDocument);this.frame[0].contentDocument.createElement=(e,...t)=>{t=i(e,...t);return"style"===e&&(e=o.ConfigReader.get("inlineStyleNonce"))&&t.setAttribute("nonce",e),t}}var e,t=document.createElement("script");t.src=((e=s)&&e.trustedTypesPolicy?e.trustedTypesPolicy:{createScriptURL(e){return e}}).createScriptURL(o.getAssetUrl(n.assetName)),this.frame[0].contentDocument.body.appendChild(t),this.frame[0].contentWindow.ignoreIframeMonitor=!0,this.triggerOpened()}).appendTo(this.container),this.blockout=s.dom('<div id="pendo-app-dragging-blockout">').css({"z-index":c-2,position:"absolute",height:"100%",width:"100%",top:0,left:0,visibility:"hidden"}).appendTo(s.dom.getBody()),this.elements=[this.container,this.blockout],this.positionFrame=e=>{var{left:t,top:i,height:n}=e,{minimized:e,width:s}=e,t=t||p.LEFT,i=i||p.TOP,n=e?p.HEADER_HEIGHT:n;t=m({offsetLeft:t,offsetWidth:s},0),i=v({offsetTop:i,offsetHeight:n},0),this.container.css({left:t,top:i,height:n}),this.savePosition()},this.saveSize=()=>{var{offsetHeight:e,offsetWidth:t}=this.container[0];e&&t&&this.app.setProperties({height:e,width:t})},this.savePosition=()=>{var{offsetLeft:e,offsetTop:t}=this.container[0];e&&t&&this.app.setProperties({left:e,top:t})},this.toggleMinimize=()=>{this.app.setProperties({minimized:!this.app.state.minimized}),this.resizeHandle.css({visibility:this.app.state.minimized?"hidden":"visible"}),this.positionFrame(this.app.state)},this.positionFrame(this.app.state),U(this,this.savePosition),_(this,this.saveSize),window.addEventListener("resize",r),this.listeners=[["resize",r]];const t=s._.throttle(()=>{return e=this.container[0],0<(t=e.offsetLeft+e.offsetWidth+f-window.innerWidth)&&(e.style.left=m(e,t)+"px",e.offsetWidth>l)&&(e.style.width=b(e,t)+"px"),void(0<(t=e.offsetTop+e.offsetHeight+f-window.innerHeight)&&(e.style.top=v(e,t)+"px",e.offsetHeight>g)&&(e.style.height=w(e,t)+"px"));var e,t},10),i=s._.debounce(()=>{this.savePosition(),this.saveSize()},1e3);function r(){t(),i()}}open(){return this.router.addRoute("app::toggleMinimize",this.toggleMinimize),this.container.appendTo(this.app.pendo.dom.getBody()),Promise.resolve()}close(){this.router.removeRoute("app::toggleMinimize"),this.listeners.forEach(([e,t])=>window.removeEventListener(e,t)),this.elements.forEach(e=>e.remove()),this.triggerClosed()}}const y="promise";function T(e,t,i){this.name=e,this.type=t,this.data=i}T.prototype.toString=function(){return`Message.${this.type} - `+this.name};const $=(e,t,i)=>{e=new T(e,t,i);return t===y&&(e.requestId=""+(W+=1)),e},C=e=>{try{var{name:t,type:i,isResponse:n,data:s,requestId:o,sender:r}=e.data||{},a=new T(t,i,O(s)?JSON.parse(s):undefined);return a.requestId=o,a.sender=r,a.destination=e.source,a.isResponse=n,a}catch(d){return!1}},q=e=>{var t=((e,t)=>{if(!e||"object"!=typeof e)return{};var i=Array.isArray(t)?t:[t],n={};for(const s in e)e.hasOwnProperty(s)&&!i.includes(s)&&(n[s]=e[s]);return n})(e,["destination","toString","data"]);return t.data=JSON.stringify(e.data,(e,t)=>"function"==typeof t||t instanceof RegExp?t.toString?t.toString():undefined:t),t},n=e=>(e.isResponse=!0,e),o="disconnected",P={lastMessageReceivedAt:0,currentConnectionQuality:o,changeCallbacks:{},evalCallbacks:{}},r=e=>{e!==P.currentConnectionQuality&&(P.currentConnectionQuality=e,t(P.changeCallbacks,e=>{e(P.currentConnectionQuality)}))},B=()=>{var e;0===P.lastMessageReceivedAt?r(o):((e=d()-P.lastMessageReceivedAt)<1e4?r("connected"):1e4<e&&(3e4<e?r("dead_connection"):r(o)),t(P.evalCallbacks,e=>{e(P.currentConnectionQuality)}))};let I;let R=0;const j=()=>{P.currentConnectionQuality=o,P.lastMessageReceivedAt=0},E={appName:undefined,connectionName:undefined,frameId:undefined,pendingRequests:{},topics:{},senderIds:{},originProvider:undefined,destinationProvider:undefined},S=()=>""+E.appName+E.connectionName+`(${E.frameId})`,H=e=>{e.sender||(e.sender=S());var t=e.destination||E.destinationProvider(),i=q(e),n=Q(e.sender),s=K(e.sender);n||s?n?n.postMessage(i):t.postMessage(i,E.originProvider()):(s=new MessageChannel,ee(s.port1,e.sender),t.postMessage(i,E.originProvider(),[s.port2]))},D=(s,o,r=1e3)=>new Promise((e,t)=>{const i=$(s,y,o),n=setTimeout(()=>{t(s+" timeout"),A(i),ie(i)},r);X(i,()=>clearTimeout(n),e,t),H(i)}),z=e=>{var t;return E.senderIds[e]||(t=e,E.senderIds[t])||(E.senderIds[t]={port:undefined,hasTriedToUpgradeToMessageChannel:!1}),E.senderIds[e]},Q=e=>z(e).port,K=e=>z(e).hasTriedToUpgradeToMessageChannel,X=(e,t,i,n)=>{E.pendingRequests[e.requestId]={message:e,clearTimeoutfn:t,resolve:i,reject:n}};const A=e=>{var t=e["requestId"];return E.pendingRequests[t].clearTimeoutfn(),delete E.pendingRequests[t],e};const k="message::ping";var Y;const J=u(e=>{var t=E.pendingRequests[e.requestId];return t&&(t.resolve(e.data),A(e)),e},t=>{var e=E.topics[t.name];return e&&e.forEach(e=>e(t.data)),t},t=>{var e;return t&&!t.isResponse&&(t.name===k?H(n(t)):(e=E.routeHandlerLookup(t.name))?e(t,e=>{t.data=e,H(n(t))}):console.log(S(),"No route handler for "+t.name,t)),t},(Y=()=>{var e;e=d(),P.lastMessageReceivedAt=e},(e,...t)=>(Y(e,...t),e))),V=e=>("*"===E.originProvider()||e.origin===E.originProvider())&&e,Z=e=>{var t=i(e,"data.sender");return!(!t||"string"!=typeof t||!t.includes(E.appName))&&e},ee=(e,t)=>{t=z(t);t.port=e,t.hasTriedToUpgradeToMessageChannel=!0,t.port.onmessage=u(C,J)},te=(e,t)=>{return!z(e.sender).hasTriedToUpgradeToMessageChannel&&t.ports&&t.ports[0]&&ee(t.ports[0],e.sender),e},ie=e=>{e=e.sender;(e=z(e)).port=undefined,e.hasTriedToUpgradeToMessageChannel=!1};let N=()=>{};const ne=()=>{N(),N=()=>{},I&&I(),j()},se=((n,s)=>{let o,r=0,a;return function(...e){var t=d(),i=s-(t-r);return i<=0||s<i?(o&&(clearTimeout(o),o=null),r=t,a=n.apply(this,e)):!o&&0<s&&(o=setTimeout(()=>{r=d(),o=null,a=n.apply(this,e)},i)),a}})(e=>{"connected"!==e&&E.usePingAutoReconnect&&D(k)["catch"](()=>{})},1e3),oe=(e,t,i,n,s,o=!1,r)=>{if(window.addEventListener){E.appName=e,E.frameId=t,E.routeHandlerLookup=i,E.usePingAutoReconnect=o,E.connectionName=r||"",E.originProvider=n||(()=>window.location.origin||"*"),E.destinationProvider=s||(()=>window.parent||window.top);{const d=setInterval(B,100);I=()=>clearInterval(d)}e=se;if(h(e)){const c=R++;P.evalCallbacks[c]=e}const a=u(V,Z,C,te,J);window.addEventListener("message",a),N=()=>window.removeEventListener("message",a)}},re=e=>{if(h(e)){const t=R++;P.changeCallbacks[t]=e}};class ae extends e{type="window";testUrl="";realUrl=undefined;getTitle(){return this.getConfig("title",this.getName())}getName(){return this.getConfig("name","Agent_Application")}open(){return this.router.addRoute("app::windowClosed",()=>{this.app.setProperties({containerType:"frame"}),this.app.stop()}),this.testConnection().then(()=>{this.triggerOpened()})["catch"](()=>{return this.createWindow(),s=this.app,o=1e3,new Promise((e,t)=>{const i=d(),n=()=>{s.getConnectionStatus()?e():d()-i>o?t():setTimeout(n,50)};n()});var s,o})}testConnection(){return this.destination=window.open(this.testUrl,this.getName(),`width=${this.app.state.width},height=${this.app.state.height},resizable=yes,scrollbars=yes,status=yes,location=no`),D("app::reconnect")}createWindow(){this.realUrl&&(this.destination=window.open(this.realUrl,this.getName(),`width=${this.app.state.width},height=${this.app.state.height},resizable=yes,scrollbars=yes,status=yes,location=no`));var e=document.createElement("script");e.src=this.app.PluginAPI.getAssetUrl(this.app.assetName),this.destination.document.body.appendChild(e),this.destination.document.title=this.getTitle()}close(){this.router.removeRoute("app::windowClosed"),this.destination.close(),this.triggerClosed()}}const de=()=>({});class ce{defaultState={containerType:"frame",minimized:!1,height:p.HEIGHT,width:p.WIDTH,left:p.LEFT,top:p.TOP};state={};containerClosedCallbacks=[];container=null;isConnected=!1;constructor(e,t,i,n,s,o=de,r=de){this.appName=e,this.assetName=t,this.assetStorageKey=i,this.connectionName=n,this.frameConfigProvider=o,this.windowConfigProvider=r,s&&Object.assign(this.defaultState,s),this.router=new G}init(e,t){this.pendo=e,this.PluginAPI=t,this.events=t.getEventable(),this.router.addRoute("app::ping",(e,t)=>{t()}),this.router.addRoute("app::setProperties",({data:e})=>{this.setProperties(e)}),this.router.addRoute("app::toggleContainer",()=>{this.setProperties({minimized:!1}),this.toggleContainerType()}),this.router.addRoute("app::windowClosed",()=>{}),this.loadState(),this.prepContainer(),this.start()}prepContainer(){this.container="window"===this.state.containerType?new ae(this,this.windowConfigProvider()):new F(this,this.frameConfigProvider())}setConnectionStatus(e){this.isConnected="connected"===e}getConnectionStatus(){return this.isConnected}setProperties(e){Object.assign(this.state,e),this.writeState()}getDefaultState(){return this.defaultState||{}}loadState(){try{var e=this.PluginAPI.agentStorage.read(this.assetStorageKey);this.state=Object.assign({},this.getDefaultState(),this.state,e)}catch(t){this.PluginAPI.log.error(t),this.state=Object.assign({},this.getDefaultState(),this.state)}}writeState(){this.PluginAPI.agentStorage.write(this.assetStorageKey,this.state)}toggleContainerType(){var e="frame"===this.state.containerType?"window":"frame";this.setProperties({containerType:e}),this.stop(),this.start()}start(){this.container||this.prepContainer();var e=this.PluginAPI.EventTracer.addTracerIds({})["frameId"];oe(this.appName,e,this.router.lookupRouteProvider(),this.container.getOriginProvider(),this.container.getDestinationProvider(),!0,this.connectionName),re(e=>{this.setConnectionStatus(e)}),this.container.open().then(()=>{this.events.trigger("mounted")})["catch"](()=>{"window"===this.state.containerType?(this.setProperties({containerType:"frame"}),this.prepContainer(),this.start()):(this.PluginAPI.log(`Failed to start ${this.appName} in either window or frame.`),this.stop())})}stop(){this.container.close(),this.container=null,this.events.trigger("unmounted"),ne()}}const ue=()=>{try{return performance.getEntries()}catch(e){return[{failedGetEntries:!0,message:e.message,stack:e.stack}]}};class he extends ce{constructor(){super("Debugger","pendo.debugger.min.js","debug-enabled","AgentPlugin",null,()=>({containerId:"pendo-client-debugger"}),()=>({title:"Pendo Debugger"}))}initialize(s,o){o.restartDebugger=this.start.bind(this),super.init(s,o),this.router.addRoute("debugger::connect",(e,t)=>{var i;t({config:o.ConfigReader.audit(),env:{apiKey:(i=s).apiKey,environment:i.debugging.isStagingServer()?"staging":"production",device:i.debugging.isMobileUserAgent()?"mobile":"desktop",browserCookies:window.navigator.cookieEnabled,guideStatus:i.areGuidesDisabled()?"off":i.areGuidesDelayed()?"delayed":"on",foundShadowRoot:!!(i=i.debugging.observer.shadowDom).foundShadowRoots||(i.findShadowRoots(document,Infinity,()=>{}),i.foundShadowRoots)},container:this.state,events:o.store.state["debugger"].eventsCaptured,timeOrigin:performance.timeOrigin})}),this.router.addRoute("debugger::stop",()=>{s.disableDebugging()}),this.router.addRoute("debugger::showGuideById",(e,t)=>{t(s.showGuideById(e.data))}),this.router.addRoute("debugger::toggleGuideLoop",e=>{e.data?s.startGuides():s.stopGuides()}),this.router.addRoute("debugger::tombstoneGuide",e=>{e=s.findGuideById(e.data);o.Tombstone.addGuide(e)}),this.router.addRoute("debugger::openGuidePage",e=>{e=e.data,n=s,t=o.hosts.SERVER;var t,i,n=(i=n.findGuideById(e))&&n._.get(i,"attributes.resourceCenter")?i.attributes.resourceCenter.isTopLevel?`${t}/resource-center/${i.id}/draft`:(n=n.BuildingBlocks.BuildingBlockResourceCenter.getResourceCenter())&&n.id?`${t}/resource-center/${n.id}/module/`+i.id:"":t+"/guides/"+e;n&&window.open(n,"_blank")}),this.router.addRoute("debugger::restore",({data:e})=>{if(e&&e.length){const t=document.createElement("iframe");t.sandbox="allow-same-origin",t.src="about:blank",t.hidden=!0,document.body.appendChild(t),t.contentWindow.ignoreIframeMonitor=!0,e.forEach(e=>{e.id.split(".").reduce((e,t,i,n)=>i===n.length-1?(e.destination[t]=e.source[t],e.destination[t]):(e.destination=e.destination[t],e.source=e.source[t],e),{destination:window,source:t.contentWindow})}),document.body.removeChild(t)}}),this.router.addRoute("debugger::sync",(e,i)=>{const t=o.store.subscribe((e,t)=>{"debugger/eventsCaptured"===e.type&&i({action:"events/eventsCaptured",data:t["debugger"].eventsCaptured})}),n=setInterval(()=>{i({action:"agent/sync",data:o.store.state}),i({action:"environment/validateEnvironment",data:s.validateEnvironment(!0)}),i({action:"performance/sync",data:ue()})},500);this.events.on("unmounted",()=>{clearInterval(n),t()})}),this.router.addRoute("debugger::enableEventLogging",({data:e})=>{this.setProperties({enableEventLogging:e}),o.store.dispatch("debugger/enableEventLogging",e)}),this.router.addRoute("debugger::clearEventsCaptured",()=>{o.store.dispatch("debugger/clearEventsCaptured")}),this.router.addRoute("debugger::checkGuideEligibility",({data:e},t)=>{o.store.dispatch("debugger/checkGuideEligibility",{guideId:e,response:t})}),this.router.addRoute("debugger::testSelector",({data:e},t)=>{o.store.dispatch("debugger/testSelector",{selector:e,response:t})})}teardown(){super.stop(),this.setProperties({enabled:!1,containerType:"frame"})}}var x=new he,pe={initialize(e,t){x.initialize(e,t);const i=e.disableDebugging;e.disableDebugging=()=>{x.teardown(),i(),e.disableDebugging=i}},teardown(){x.teardown()}},ge=document.getElementById("pendo-debugger-plugin");let M="pendo";ge&&(M=ge.getAttribute("data-pendo-global-key")||"pendo"),window[M].addExtension&&window[M].addExtension({name:"Debugger",version:"1.0.0",type:"agent",use:"plugin",uri:pe})}();
|
|
4
|
+
!function(){"use strict";class L{constructor(e,t){this.path=e,this.handler=t}}class G{routes={};addRoute(e,t){this.routes[e]||(this.routes[e]=[]),this.routes[e].unshift(new L(e,t))}removeRoute(e){this.routes[e].shift()}lookupRouteProvider(){return e=>this.routes[e]?this.routes[e][0].handler:undefined}}const u=(...e)=>s=>{return[].concat(e).reduce((e,t,i,n)=>{e=t(e,s);return e||n.splice(i,n.length-i),e},s)};let W=0;const i=(e,t,i)=>{if(!e||"string"!=typeof t)return i;let n=e;for(const s of t.split(".")){if(null==n)return i;n=n[s]}return n===undefined?i:n};const t=(t,i)=>{if(t&&i)if(Array.isArray(t))for(let e=0;e<t.length;e++)i(t[e],e,t);else if("object"==typeof t)for(const e in t)t.hasOwnProperty(e)&&i(t[e],e,t);return t},h=e=>"function"==typeof e,O=e=>!(null==e),d=()=>Date.now();class e{app=null;router=null;destination=window.parent||window.top;origin="*";constructor(e,t={}){this.app=e,this.router=e.router,this.config=t,this.events=e.PluginAPI.getEventable()}getConfig(e,t){return i(this.config,e,t)}getDestinationProvider(){return()=>this.destination}getOriginProvider(){return()=>this.origin}triggerOpened(){this.events.trigger("opened",{containerType:this.type})}triggerClosed(){this.events.trigger("closed",{containerType:this.type})}}var a={padding:"0 !important",margin:"0 !important","box-sizing":"border-box !important",border:"none !important",display:"block !important",visibility:"visible !important"},c=2147483647,p={WINDOW_MARGIN:10,HEADER_HEIGHT:50,TOP:100,LEFT:100,HEIGHT:700,WIDTH:500,MIN_HEIGHT:500,MIN_WIDTH:500};const{MIN_HEIGHT:g,MIN_WIDTH:l,WINDOW_MARGIN:f}=p;function s(t,i,n,s,o){let r=0,a=0,d=0,c=0;function u(e){e.preventDefault(),i.css({visibility:"hidden"}),t.releasePointerCapture(e.pointerId),t.removeEventListener("pointermove",h),o()}function h(e){-1!==e.button||0===e.buttons?u(e):(e.preventDefault(),d=r-e.clientX,c=a-e.clientY,r=e.clientX,a=e.clientY,s(d,c))}t.addEventListener("pointerdown",function(e){0===e.button&&(e.preventDefault(),i.css({visibility:"visible"}),r=e.clientX,a=e.clientY,t.setPointerCapture(e.pointerId),t.addEventListener("pointermove",h),n())}),t.addEventListener("pointerup",u),t.addEventListener("pointerout",u)}function U(e,t){const i=e.handle[0],n=e.container[0];s(i,e.blockout,function(){i.style.cursor="grabbing"},function(e,t){n.style.left=m(n,e)+"px",n.style.top=v(n,t)+"px"},function(){i.style.cursor="grab",t()})}function m(e,t){t=e.offsetLeft-t,e=window.innerWidth-e.offsetWidth-f;return t<f||e<f?f:e<t?e:t}function v(e,t){t=e.offsetTop-t,e=window.innerHeight-e.offsetHeight-f;return t<f||e<f?f:e<t?e:t}function _(e,t){var i=e.resizeHandle[0];const n=e.container[0];s(i,e.blockout,()=>{},function(e,t){n.style.width=b(n,e)+"px",n.style.height=w(n,t)+"px"},t)}function b(e,t){t=e.offsetWidth-t,e=window.innerWidth-e.offsetLeft-f;return e<t?e:t<l?l:t}function w(e,t){t=e.offsetHeight-t,e=window.innerHeight-e.offsetTop-f;return e<t?e:t<g?g:t}class F extends e{type="frame";destination=window.parent||window.top;origin=/^https?:/.test(window.location.protocol)?window.location.origin:"*";constructor(n,e){super(n,e);const{pendo:s,PluginAPI:o}=n;e=this.getConfig("containerId","pendo-client-app");this.container=s.dom(`<div id="${e}" class="pendo-ignore">`).css({...a,height:n.state.height,width:n.state.width,"z-index":c-1,"background-color":"#FFFFFF",position:"fixed","box-shadow":"rgb(136, 136, 136) 0px 0px 20px 0px",overflow:"hidden"}),this.handle=s.dom('<div id="pendo-app-draggable-handle">').css({...a,"z-index":c,height:p.HEADER_HEIGHT,width:"calc(100% - 100px)",position:"absolute",cursor:"grab"}).on("dblclick",()=>{n.state.minimized||(this.container.css({height:p.HEIGHT,width:p.WIDTH,transition:"all 250ms linear"}),setTimeout(()=>{this.container&&(this.container.css({transition:"none"}),this.saveSize())},250))}).appendTo(this.container),this.resizeHandle=s.dom('<div id="pendo-app-resize-handle">').css({...a,"z-index":c,visibility:this.app.state.minimized?"hidden":"visible",height:0,width:0,"border-left":"10px solid transparent","border-bottom":"10px solid rgb(136, 136, 136)",cursor:"nwse-resize",position:"absolute",bottom:0,right:0}).appendTo(this.container),this.frame=s.dom('<iframe id="pendo-agent-application" src="about:blank">').css({...a,height:"100%",width:"100%"}).on("load",()=>{if(o.ConfigReader.get("inlineStyleNonce")){const i=this.frame[0].contentDocument.createElement.bind(this.frame[0].contentDocument);this.frame[0].contentDocument.createElement=(e,...t)=>{t=i(e,...t);return"style"===e&&(e=o.ConfigReader.get("inlineStyleNonce"))&&t.setAttribute("nonce",e),t}}var e,t=document.createElement("script");t.src=((e=s)&&e.trustedTypesPolicy?e.trustedTypesPolicy:{createScriptURL(e){return e}}).createScriptURL(o.hosts.getAssetUrl(n.assetName)),this.frame[0].contentDocument.body.appendChild(t),this.frame[0].contentWindow.ignoreIframeMonitor=!0,this.triggerOpened()}).appendTo(this.container),this.blockout=s.dom('<div id="pendo-app-dragging-blockout">').css({"z-index":c-2,position:"absolute",height:"100%",width:"100%",top:0,left:0,visibility:"hidden"}).appendTo(s.dom.getBody()),this.elements=[this.container,this.blockout],this.positionFrame=e=>{var{left:t,top:i,height:n}=e,{minimized:e,width:s}=e,t=t||p.LEFT,i=i||p.TOP,n=e?p.HEADER_HEIGHT:n;t=m({offsetLeft:t,offsetWidth:s},0),i=v({offsetTop:i,offsetHeight:n},0),this.container.css({left:t,top:i,height:n}),this.savePosition()},this.saveSize=()=>{var{offsetHeight:e,offsetWidth:t}=this.container[0];e&&t&&this.app.setProperties({height:e,width:t})},this.savePosition=()=>{var{offsetLeft:e,offsetTop:t}=this.container[0];e&&t&&this.app.setProperties({left:e,top:t})},this.toggleMinimize=()=>{this.app.setProperties({minimized:!this.app.state.minimized}),this.resizeHandle.css({visibility:this.app.state.minimized?"hidden":"visible"}),this.positionFrame(this.app.state)},this.positionFrame(this.app.state),U(this,this.savePosition),_(this,this.saveSize),window.addEventListener("resize",r),this.listeners=[["resize",r]];const t=s._.throttle(()=>{return e=this.container[0],0<(t=e.offsetLeft+e.offsetWidth+f-window.innerWidth)&&(e.style.left=m(e,t)+"px",e.offsetWidth>l)&&(e.style.width=b(e,t)+"px"),void(0<(t=e.offsetTop+e.offsetHeight+f-window.innerHeight)&&(e.style.top=v(e,t)+"px",e.offsetHeight>g)&&(e.style.height=w(e,t)+"px"));var e,t},10),i=s._.debounce(()=>{this.savePosition(),this.saveSize()},1e3);function r(){t(),i()}}open(){return this.router.addRoute("app::toggleMinimize",this.toggleMinimize),this.container.appendTo(this.app.pendo.dom.getBody()),Promise.resolve()}close(){this.router.removeRoute("app::toggleMinimize"),this.listeners.forEach(([e,t])=>window.removeEventListener(e,t)),this.elements.forEach(e=>e.remove()),this.triggerClosed()}}const y="promise";function T(e,t,i){this.name=e,this.type=t,this.data=i}T.prototype.toString=function(){return`Message.${this.type} - `+this.name};const $=(e,t,i)=>{e=new T(e,t,i);return t===y&&(e.requestId=""+(W+=1)),e},C=e=>{try{var{name:t,type:i,isResponse:n,data:s,requestId:o,sender:r}=e.data||{},a=new T(t,i,O(s)?JSON.parse(s):undefined);return a.requestId=o,a.sender=r,a.destination=e.source,a.isResponse=n,a}catch(d){return!1}},q=e=>{var t=((e,t)=>{if(!e||"object"!=typeof e)return{};var i=Array.isArray(t)?t:[t],n={};for(const s in e)e.hasOwnProperty(s)&&!i.includes(s)&&(n[s]=e[s]);return n})(e,["destination","toString","data"]);return t.data=JSON.stringify(e.data,(e,t)=>"function"==typeof t||t instanceof RegExp?t.toString?t.toString():undefined:t),t},n=e=>(e.isResponse=!0,e),o="disconnected",P={lastMessageReceivedAt:0,currentConnectionQuality:o,changeCallbacks:{},evalCallbacks:{}},r=e=>{e!==P.currentConnectionQuality&&(P.currentConnectionQuality=e,t(P.changeCallbacks,e=>{e(P.currentConnectionQuality)}))},B=()=>{var e;0===P.lastMessageReceivedAt?r(o):((e=d()-P.lastMessageReceivedAt)<1e4?r("connected"):1e4<e&&(3e4<e?r("dead_connection"):r(o)),t(P.evalCallbacks,e=>{e(P.currentConnectionQuality)}))};let I;let R=0;const j=()=>{P.currentConnectionQuality=o,P.lastMessageReceivedAt=0},E={appName:undefined,connectionName:undefined,frameId:undefined,pendingRequests:{},topics:{},senderIds:{},originProvider:undefined,destinationProvider:undefined},S=()=>""+E.appName+E.connectionName+`(${E.frameId})`,H=e=>{e.sender||(e.sender=S());var t=e.destination||E.destinationProvider(),i=q(e),n=Q(e.sender),s=K(e.sender);n||s?n?n.postMessage(i):t.postMessage(i,E.originProvider()):(s=new MessageChannel,ee(s.port1,e.sender),t.postMessage(i,E.originProvider(),[s.port2]))},D=(s,o,r=1e3)=>new Promise((e,t)=>{const i=$(s,y,o),n=setTimeout(()=>{t(s+" timeout"),A(i),ie(i)},r);X(i,()=>clearTimeout(n),e,t),H(i)}),z=e=>{var t;return E.senderIds[e]||(t=e,E.senderIds[t])||(E.senderIds[t]={port:undefined,hasTriedToUpgradeToMessageChannel:!1}),E.senderIds[e]},Q=e=>z(e).port,K=e=>z(e).hasTriedToUpgradeToMessageChannel,X=(e,t,i,n)=>{E.pendingRequests[e.requestId]={message:e,clearTimeoutfn:t,resolve:i,reject:n}};const A=e=>{var t=e["requestId"];return E.pendingRequests[t].clearTimeoutfn(),delete E.pendingRequests[t],e};const k="message::ping";var Y;const J=u(e=>{var t=E.pendingRequests[e.requestId];return t&&(t.resolve(e.data),A(e)),e},t=>{var e=E.topics[t.name];return e&&e.forEach(e=>e(t.data)),t},t=>{var e;return t&&!t.isResponse&&(t.name===k?H(n(t)):(e=E.routeHandlerLookup(t.name))?e(t,e=>{t.data=e,H(n(t))}):console.log(S(),"No route handler for "+t.name,t)),t},(Y=()=>{var e;e=d(),P.lastMessageReceivedAt=e},(e,...t)=>(Y(e,...t),e))),V=e=>("*"===E.originProvider()||e.origin===E.originProvider())&&e,Z=e=>{var t=i(e,"data.sender");return!(!t||"string"!=typeof t||!t.includes(E.appName))&&e},ee=(e,t)=>{t=z(t);t.port=e,t.hasTriedToUpgradeToMessageChannel=!0,t.port.onmessage=u(C,J)},te=(e,t)=>{return!z(e.sender).hasTriedToUpgradeToMessageChannel&&t.ports&&t.ports[0]&&ee(t.ports[0],e.sender),e},ie=e=>{e=e.sender;(e=z(e)).port=undefined,e.hasTriedToUpgradeToMessageChannel=!1};let N=()=>{};const ne=()=>{N(),N=()=>{},I&&I(),j()},se=((n,s)=>{let o,r=0,a;return function(...e){var t=d(),i=s-(t-r);return i<=0||s<i?(o&&(clearTimeout(o),o=null),r=t,a=n.apply(this,e)):!o&&0<s&&(o=setTimeout(()=>{r=d(),o=null,a=n.apply(this,e)},i)),a}})(e=>{"connected"!==e&&E.usePingAutoReconnect&&D(k)["catch"](()=>{})},1e3),oe=(e,t,i,n,s,o=!1,r)=>{if(window.addEventListener){E.appName=e,E.frameId=t,E.routeHandlerLookup=i,E.usePingAutoReconnect=o,E.connectionName=r||"",E.originProvider=n||(()=>window.location.origin||"*"),E.destinationProvider=s||(()=>window.parent||window.top);{const d=setInterval(B,100);I=()=>clearInterval(d)}e=se;if(h(e)){const c=R++;P.evalCallbacks[c]=e}const a=u(V,Z,C,te,J);window.addEventListener("message",a),N=()=>window.removeEventListener("message",a)}},re=e=>{if(h(e)){const t=R++;P.changeCallbacks[t]=e}};class ae extends e{type="window";testUrl="";realUrl=undefined;getTitle(){return this.getConfig("title",this.getName())}getName(){return this.getConfig("name","Agent_Application")}open(){return this.router.addRoute("app::windowClosed",()=>{this.app.setProperties({containerType:"frame"}),this.app.stop()}),this.testConnection().then(()=>{this.triggerOpened()})["catch"](()=>{return this.createWindow(),s=this.app,o=1e3,new Promise((e,t)=>{const i=d(),n=()=>{s.getConnectionStatus()?e():d()-i>o?t():setTimeout(n,50)};n()});var s,o})}testConnection(){return this.destination=window.open(this.testUrl,this.getName(),`width=${this.app.state.width},height=${this.app.state.height},resizable=yes,scrollbars=yes,status=yes,location=no`),D("app::reconnect")}createWindow(){this.realUrl&&(this.destination=window.open(this.realUrl,this.getName(),`width=${this.app.state.width},height=${this.app.state.height},resizable=yes,scrollbars=yes,status=yes,location=no`));var e=document.createElement("script");e.src=this.app.PluginAPI.hosts.getAssetUrl(this.app.assetName),this.destination.document.body.appendChild(e),this.destination.document.title=this.getTitle()}close(){this.router.removeRoute("app::windowClosed"),this.destination.close(),this.triggerClosed()}}const de=()=>({});class ce{defaultState={containerType:"frame",minimized:!1,height:p.HEIGHT,width:p.WIDTH,left:p.LEFT,top:p.TOP};state={};containerClosedCallbacks=[];container=null;isConnected=!1;constructor(e,t,i,n,s,o=de,r=de){this.appName=e,this.assetName=t,this.assetStorageKey=i,this.connectionName=n,this.frameConfigProvider=o,this.windowConfigProvider=r,s&&Object.assign(this.defaultState,s),this.router=new G}init(e,t){this.pendo=e,this.PluginAPI=t,this.events=t.getEventable(),this.router.addRoute("app::ping",(e,t)=>{t()}),this.router.addRoute("app::setProperties",({data:e})=>{this.setProperties(e)}),this.router.addRoute("app::toggleContainer",()=>{this.setProperties({minimized:!1}),this.toggleContainerType()}),this.router.addRoute("app::windowClosed",()=>{}),this.loadState(),this.prepContainer(),this.start()}prepContainer(){this.container="window"===this.state.containerType?new ae(this,this.windowConfigProvider()):new F(this,this.frameConfigProvider())}setConnectionStatus(e){this.isConnected="connected"===e}getConnectionStatus(){return this.isConnected}setProperties(e){Object.assign(this.state,e),this.writeState()}getDefaultState(){return this.defaultState||{}}loadState(){try{var e=this.PluginAPI.agentStorage.read(this.assetStorageKey);this.state=Object.assign({},this.getDefaultState(),this.state,e)}catch(t){this.PluginAPI.log.error(t),this.state=Object.assign({},this.getDefaultState(),this.state)}}writeState(){this.PluginAPI.agentStorage.write(this.assetStorageKey,this.state)}toggleContainerType(){var e="frame"===this.state.containerType?"window":"frame";this.setProperties({containerType:e}),this.stop(),this.start()}start(){this.container||this.prepContainer();var e=this.PluginAPI.EventTracer.addTracerIds({})["frameId"];oe(this.appName,e,this.router.lookupRouteProvider(),this.container.getOriginProvider(),this.container.getDestinationProvider(),!0,this.connectionName),re(e=>{this.setConnectionStatus(e)}),this.container.open().then(()=>{this.events.trigger("mounted")})["catch"](()=>{"window"===this.state.containerType?(this.setProperties({containerType:"frame"}),this.prepContainer(),this.start()):(this.PluginAPI.log(`Failed to start ${this.appName} in either window or frame.`),this.stop())})}stop(){this.container.close(),this.container=null,this.events.trigger("unmounted"),ne()}}const ue=()=>{try{return performance.getEntries()}catch(e){return[{failedGetEntries:!0,message:e.message,stack:e.stack}]}};class he extends ce{constructor(){super("Debugger","pendo.debugger.min.js","debug-enabled","AgentPlugin",null,()=>({containerId:"pendo-client-debugger"}),()=>({title:"Pendo Debugger"}))}initialize(s,o){o.restartDebugger=this.start.bind(this),super.init(s,o),this.router.addRoute("debugger::connect",(e,t)=>{var i;t({config:o.ConfigReader.audit(),env:{apiKey:(i=s).apiKey,environment:i.debugging.isStagingServer()?"staging":"production",device:i.debugging.isMobileUserAgent()?"mobile":"desktop",browserCookies:window.navigator.cookieEnabled,guideStatus:i.areGuidesDisabled()?"off":i.areGuidesDelayed()?"delayed":"on",foundShadowRoot:!!(i=i.debugging.observer.shadowDom).foundShadowRoots||(i.findShadowRoots(document,Infinity,()=>{}),i.foundShadowRoots)},container:this.state,events:o.store.state["debugger"].eventsCaptured,timeOrigin:performance.timeOrigin})}),this.router.addRoute("debugger::stop",()=>{s.disableDebugging()}),this.router.addRoute("debugger::showGuideById",(e,t)=>{t(s.showGuideById(e.data))}),this.router.addRoute("debugger::toggleGuideLoop",e=>{e.data?s.startGuides():s.stopGuides()}),this.router.addRoute("debugger::tombstoneGuide",e=>{e=s.findGuideById(e.data);o.Tombstone.addGuide(e)}),this.router.addRoute("debugger::openGuidePage",e=>{e=e.data,n=s,t=o.hosts.SERVER;var t,i,n=(i=n.findGuideById(e))&&n._.get(i,"attributes.resourceCenter")?i.attributes.resourceCenter.isTopLevel?`${t}/resource-center/${i.id}/draft`:(n=n.BuildingBlocks.BuildingBlockResourceCenter.getResourceCenter())&&n.id?`${t}/resource-center/${n.id}/module/`+i.id:"":t+"/guides/"+e;n&&window.open(n,"_blank")}),this.router.addRoute("debugger::restore",({data:e})=>{if(e&&e.length){const t=document.createElement("iframe");t.sandbox="allow-same-origin",t.src="about:blank",t.hidden=!0,document.body.appendChild(t),t.contentWindow.ignoreIframeMonitor=!0,e.forEach(e=>{e.id.split(".").reduce((e,t,i,n)=>i===n.length-1?(e.destination[t]=e.source[t],e.destination[t]):(e.destination=e.destination[t],e.source=e.source[t],e),{destination:window,source:t.contentWindow})}),document.body.removeChild(t)}}),this.router.addRoute("debugger::sync",(e,i)=>{const t=o.store.subscribe((e,t)=>{"debugger/eventsCaptured"===e.type&&i({action:"events/eventsCaptured",data:t["debugger"].eventsCaptured})}),n=setInterval(()=>{i({action:"agent/sync",data:o.store.state}),i({action:"environment/validateEnvironment",data:s.validateEnvironment(!0)}),i({action:"performance/sync",data:ue()})},500);this.events.on("unmounted",()=>{clearInterval(n),t()})}),this.router.addRoute("debugger::enableEventLogging",({data:e})=>{this.setProperties({enableEventLogging:e}),o.store.dispatch("debugger/enableEventLogging",e)}),this.router.addRoute("debugger::clearEventsCaptured",()=>{o.store.dispatch("debugger/clearEventsCaptured")}),this.router.addRoute("debugger::checkGuideEligibility",({data:e},t)=>{o.store.dispatch("debugger/checkGuideEligibility",{guideId:e,response:t})}),this.router.addRoute("debugger::testSelector",({data:e},t)=>{o.store.dispatch("debugger/testSelector",{selector:e,response:t})})}teardown(){super.stop(),this.setProperties({enabled:!1,containerType:"frame"})}}var x=new he,pe={initialize(e,t){x.initialize(e,t);const i=e.disableDebugging;e.disableDebugging=()=>{x.teardown(),i(),e.disableDebugging=i}},teardown(){x.teardown()}},ge=document.getElementById("pendo-debugger-plugin");let M="pendo";ge&&(M=ge.getAttribute("data-pendo-global-key")||"pendo"),window[M].addExtension&&window[M].addExtension({name:"Debugger",version:"1.0.0",type:"agent",use:"plugin",uri:pe})}();
|
package/dist/dom.esm.js
CHANGED
|
@@ -7496,7 +7496,7 @@ function applyMatrix2dRect(matrix2d, rect) {
|
|
|
7496
7496
|
return transformedRect;
|
|
7497
7497
|
}
|
|
7498
7498
|
|
|
7499
|
-
var VERSION = '2.
|
|
7499
|
+
var VERSION = '2.326.0_';
|
|
7500
7500
|
|
|
7501
7501
|
var decodeURIComponent = _.isFunction(window.decodeURIComponent) ? window.decodeURIComponent : _.identity;
|
|
7502
7502
|
|
|
@@ -8404,6 +8404,7 @@ Eventable.clear = function (events) {
|
|
|
8404
8404
|
new EventType('eventCaptured', [DEBUG]),
|
|
8405
8405
|
new EventType('error', [DEBUG, LIFECYCLE]),
|
|
8406
8406
|
new EventType('onClickCaptured', [DEBUG]),
|
|
8407
|
+
new EventType('onEventCaptured', [DEBUG]),
|
|
8407
8408
|
new EventType('urlChanged', [LIFECYCLE]),
|
|
8408
8409
|
new EventType('leaderChanged', [LIFECYCLE, FRAMES]),
|
|
8409
8410
|
new EventType('transmit:locked', [LIFECYCLE]),
|
|
@@ -9489,8 +9490,15 @@ function scrollElementIntoParentRect(element, scrollParent) {
|
|
|
9489
9490
|
clientRect.left += diff;
|
|
9490
9491
|
clientRect.right += diff;
|
|
9491
9492
|
}
|
|
9492
|
-
|
|
9493
|
-
|
|
9493
|
+
var isScrollByAFunction = _.isFunction(scrollParent.scrollBy);
|
|
9494
|
+
var isScrollByNative = isScrollByAFunction && isNativeCode(scrollParent.scrollBy);
|
|
9495
|
+
if (isScrollByAFunction) {
|
|
9496
|
+
if (isScrollByNative) {
|
|
9497
|
+
scrollParent.scrollBy(xScrollAmount, yScrollAmount);
|
|
9498
|
+
}
|
|
9499
|
+
else {
|
|
9500
|
+
scrollParent.scrollTo(scrollParent.scrollX + xScrollAmount, scrollParent.scrollY + yScrollAmount);
|
|
9501
|
+
}
|
|
9494
9502
|
}
|
|
9495
9503
|
else {
|
|
9496
9504
|
scrollParent.scrollTop += yScrollAmount;
|
package/dist/pendo.module.js
CHANGED
|
@@ -3979,8 +3979,8 @@ let SERVER = '';
|
|
|
3979
3979
|
let ASSET_HOST = '';
|
|
3980
3980
|
let ASSET_PATH = '';
|
|
3981
3981
|
let DESIGNER_SERVER = '';
|
|
3982
|
-
let VERSION = '2.
|
|
3983
|
-
let PACKAGE_VERSION = '2.
|
|
3982
|
+
let VERSION = '2.326.0_';
|
|
3983
|
+
let PACKAGE_VERSION = '2.326.0';
|
|
3984
3984
|
let LOADER = 'xhr';
|
|
3985
3985
|
/* eslint-enable web-sdk-eslint-rules/no-gulp-env-references */
|
|
3986
3986
|
/**
|
|
@@ -5694,6 +5694,7 @@ var Events = (function () {
|
|
|
5694
5694
|
new EventType('eventCaptured', [DEBUG]),
|
|
5695
5695
|
new EventType('error', [DEBUG, LIFECYCLE]),
|
|
5696
5696
|
new EventType('onClickCaptured', [DEBUG]),
|
|
5697
|
+
new EventType('onEventCaptured', [DEBUG]),
|
|
5697
5698
|
new EventType('urlChanged', [LIFECYCLE]),
|
|
5698
5699
|
new EventType('leaderChanged', [LIFECYCLE, FRAMES]),
|
|
5699
5700
|
new EventType('transmit:locked', [LIFECYCLE]),
|
|
@@ -10976,8 +10977,15 @@ function scrollElementIntoParentRect(element, scrollParent) {
|
|
|
10976
10977
|
clientRect.left += diff;
|
|
10977
10978
|
clientRect.right += diff;
|
|
10978
10979
|
}
|
|
10979
|
-
|
|
10980
|
-
|
|
10980
|
+
const isScrollByAFunction = _.isFunction(scrollParent.scrollBy);
|
|
10981
|
+
const isScrollByNative = isScrollByAFunction && isNativeCode(scrollParent.scrollBy);
|
|
10982
|
+
if (isScrollByAFunction) {
|
|
10983
|
+
if (isScrollByNative) {
|
|
10984
|
+
scrollParent.scrollBy(xScrollAmount, yScrollAmount);
|
|
10985
|
+
}
|
|
10986
|
+
else {
|
|
10987
|
+
scrollParent.scrollTo(scrollParent.scrollX + xScrollAmount, scrollParent.scrollY + yScrollAmount);
|
|
10988
|
+
}
|
|
10981
10989
|
}
|
|
10982
10990
|
else {
|
|
10983
10991
|
scrollParent.scrollTop += yScrollAmount;
|
|
@@ -13857,6 +13865,7 @@ const internalEvents = {
|
|
|
13857
13865
|
guidesFailed: 1,
|
|
13858
13866
|
guidesLoaded: 1,
|
|
13859
13867
|
onClickCaptured: 1,
|
|
13868
|
+
onEventCaptured: 1,
|
|
13860
13869
|
segmentFlagsUpdated: 1,
|
|
13861
13870
|
segmentFlagsReady: 1,
|
|
13862
13871
|
segmentFlagsError: 1
|
|
@@ -13870,6 +13879,7 @@ const browserEvents = {
|
|
|
13870
13879
|
const supportedPublicEvents = [
|
|
13871
13880
|
'ready',
|
|
13872
13881
|
'onClickCaptured',
|
|
13882
|
+
'onEventCaptured',
|
|
13873
13883
|
'deliverablesLoaded',
|
|
13874
13884
|
'guidesFailed',
|
|
13875
13885
|
'guidesLoaded',
|
|
@@ -21678,11 +21688,7 @@ var handle_event = function (evt) {
|
|
|
21678
21688
|
}
|
|
21679
21689
|
if (data.ignore)
|
|
21680
21690
|
return;
|
|
21681
|
-
|
|
21682
|
-
if (type === 'click') {
|
|
21683
|
-
eventProperties = getClickEventProperties(target);
|
|
21684
|
-
}
|
|
21685
|
-
collectEvent(type, { target: data }, undefined, undefined, eventProperties, evt);
|
|
21691
|
+
collectEvent(type, { target: data }, undefined, undefined, undefined, evt);
|
|
21686
21692
|
Events.trigger('appUsage', data, evt);
|
|
21687
21693
|
}
|
|
21688
21694
|
catch (e) {
|
|
@@ -21692,33 +21698,6 @@ var handle_event = function (evt) {
|
|
|
21692
21698
|
performanceMonitor.stopTimer(EVENT_CAPTURED_TIMER);
|
|
21693
21699
|
}
|
|
21694
21700
|
};
|
|
21695
|
-
function getClickEventProperties(target) {
|
|
21696
|
-
const eventPropertyHandler = getEventPropertyHandler(target);
|
|
21697
|
-
Events.onClickCaptured.trigger(eventPropertyHandler);
|
|
21698
|
-
const eventProperties = eventPropertyHandler.getEventProperties();
|
|
21699
|
-
// create event expects undefined
|
|
21700
|
-
if (_.isEmpty(eventProperties)) {
|
|
21701
|
-
return;
|
|
21702
|
-
}
|
|
21703
|
-
return eventProperties;
|
|
21704
|
-
}
|
|
21705
|
-
function getEventPropertyHandler(target) {
|
|
21706
|
-
const eventProperties = {};
|
|
21707
|
-
return {
|
|
21708
|
-
getEventProperties() {
|
|
21709
|
-
return eventProperties;
|
|
21710
|
-
},
|
|
21711
|
-
addEventProperty(key, value) {
|
|
21712
|
-
if (_.isString(key) && !_.isUndefined(value)) {
|
|
21713
|
-
eventProperties[key] = value;
|
|
21714
|
-
}
|
|
21715
|
-
else {
|
|
21716
|
-
log.error('Failed to add click event property');
|
|
21717
|
-
}
|
|
21718
|
-
},
|
|
21719
|
-
target
|
|
21720
|
-
};
|
|
21721
|
-
}
|
|
21722
21701
|
/*
|
|
21723
21702
|
* Adds listeners to the DOM for user events
|
|
21724
21703
|
* like click and focus.
|
|
@@ -28443,8 +28422,6 @@ const PluginAPI = {
|
|
|
28443
28422
|
frames: {
|
|
28444
28423
|
getChannel: () => channel
|
|
28445
28424
|
},
|
|
28446
|
-
getAssetHost,
|
|
28447
|
-
getAssetUrl,
|
|
28448
28425
|
getEventable: () => Eventable.call({}),
|
|
28449
28426
|
getScreenPosition,
|
|
28450
28427
|
GlobalRuntime: {
|
|
@@ -28466,6 +28443,9 @@ const PluginAPI = {
|
|
|
28466
28443
|
getElementForGuideStep
|
|
28467
28444
|
},
|
|
28468
28445
|
hosts: {
|
|
28446
|
+
getAssetHost,
|
|
28447
|
+
getAssetUrl,
|
|
28448
|
+
getDataHost,
|
|
28469
28449
|
SERVER
|
|
28470
28450
|
},
|
|
28471
28451
|
NodeSerializer,
|
|
@@ -40681,6 +40661,69 @@ class WebAnalytics {
|
|
|
40681
40661
|
}
|
|
40682
40662
|
var WebAnalytics$1 = new WebAnalytics();
|
|
40683
40663
|
|
|
40664
|
+
function mergeEventProperties(capturedEvent, properties) {
|
|
40665
|
+
if (_.isEmpty(properties)) {
|
|
40666
|
+
return;
|
|
40667
|
+
}
|
|
40668
|
+
capturedEvent.eventProperties = _.extend({}, capturedEvent.eventProperties, properties);
|
|
40669
|
+
}
|
|
40670
|
+
function collectClickCapturedProperties(target) {
|
|
40671
|
+
const clickPropertyHandler = getEventPropertyHandler({ target });
|
|
40672
|
+
Events.onClickCaptured.trigger(clickPropertyHandler);
|
|
40673
|
+
return clickPropertyHandler.getEventProperties();
|
|
40674
|
+
}
|
|
40675
|
+
function collectEventCapturedProperties(target, capturedEvent) {
|
|
40676
|
+
const eventPropertyHandler = getEventPropertyHandler({ event: capturedEvent, target });
|
|
40677
|
+
Events.onEventCaptured.trigger(eventPropertyHandler);
|
|
40678
|
+
return eventPropertyHandler.getEventProperties();
|
|
40679
|
+
}
|
|
40680
|
+
function getEventPropertyHandler(obj) {
|
|
40681
|
+
const eventProperties = {};
|
|
40682
|
+
return _.extend({
|
|
40683
|
+
getEventProperties() {
|
|
40684
|
+
return eventProperties;
|
|
40685
|
+
},
|
|
40686
|
+
addEventProperty(key, value) {
|
|
40687
|
+
if (_.isString(key) && !_.isUndefined(value)) {
|
|
40688
|
+
eventProperties[key] = value;
|
|
40689
|
+
}
|
|
40690
|
+
else {
|
|
40691
|
+
log.error('Failed to add click event property');
|
|
40692
|
+
}
|
|
40693
|
+
}
|
|
40694
|
+
}, obj);
|
|
40695
|
+
}
|
|
40696
|
+
class EventCaptured {
|
|
40697
|
+
constructor() {
|
|
40698
|
+
this.name = 'EventCaptured';
|
|
40699
|
+
}
|
|
40700
|
+
initialize(pendo, PluginAPI) {
|
|
40701
|
+
this.api = PluginAPI;
|
|
40702
|
+
this.pendo = pendo;
|
|
40703
|
+
this.subscriptions = [
|
|
40704
|
+
this.api.attachEvent(this.api.Events, 'eventCaptured', _.bind(this.eventCaptured, this))
|
|
40705
|
+
];
|
|
40706
|
+
}
|
|
40707
|
+
teardown() {
|
|
40708
|
+
_.each(this.subscriptions, function (unsubscribe) {
|
|
40709
|
+
unsubscribe();
|
|
40710
|
+
});
|
|
40711
|
+
this.subscriptions.length = 0;
|
|
40712
|
+
}
|
|
40713
|
+
eventCaptured(event) {
|
|
40714
|
+
if (!event || !event.data || !event.data.length)
|
|
40715
|
+
return;
|
|
40716
|
+
const capturedEvent = event.data[0];
|
|
40717
|
+
const context = event.data[1];
|
|
40718
|
+
const target = context && context.target;
|
|
40719
|
+
if (capturedEvent.type === 'click') {
|
|
40720
|
+
mergeEventProperties(capturedEvent, collectClickCapturedProperties(target));
|
|
40721
|
+
}
|
|
40722
|
+
mergeEventProperties(capturedEvent, collectEventCapturedProperties(target, capturedEvent));
|
|
40723
|
+
}
|
|
40724
|
+
}
|
|
40725
|
+
var eventCapturedPlugin = new EventCaptured();
|
|
40726
|
+
|
|
40684
40727
|
function registerBuiltInPlugins() {
|
|
40685
40728
|
registerPlugin(ActionAutomation);
|
|
40686
40729
|
registerPlugin(Branding);
|
|
@@ -40701,6 +40744,7 @@ function registerBuiltInPlugins() {
|
|
|
40701
40744
|
registerPlugin(SessionManager$1);
|
|
40702
40745
|
registerPlugin(StepTimeoutMonitor);
|
|
40703
40746
|
registerPlugin(WebAnalytics$1);
|
|
40747
|
+
registerPlugin(eventCapturedPlugin);
|
|
40704
40748
|
}
|
|
40705
40749
|
|
|
40706
40750
|
/*
|
|
@@ -51210,7 +51254,7 @@ function includes(str, substring) {
|
|
|
51210
51254
|
function getResourceType(blockedURI, directive) {
|
|
51211
51255
|
if (!directive || typeof directive !== 'string')
|
|
51212
51256
|
return 'resource';
|
|
51213
|
-
|
|
51257
|
+
const d = directive.toLowerCase();
|
|
51214
51258
|
if (blockedURI === 'inline') {
|
|
51215
51259
|
if (includes(d, 'script-src-attr')) {
|
|
51216
51260
|
return 'inline event handler';
|
|
@@ -51269,12 +51313,11 @@ function getResourceType(blockedURI, directive) {
|
|
|
51269
51313
|
function getDirective(policy, directiveName) {
|
|
51270
51314
|
if (!policy || !directiveName)
|
|
51271
51315
|
return '';
|
|
51272
|
-
|
|
51273
|
-
for (
|
|
51274
|
-
|
|
51275
|
-
|
|
51276
|
-
|
|
51277
|
-
if (lower === needle || lower.startsWith("".concat(needle, " "))) {
|
|
51316
|
+
const needle = directiveName.toLowerCase();
|
|
51317
|
+
for (const directive of policy.split(';')) {
|
|
51318
|
+
const trimmed = directive.trim();
|
|
51319
|
+
const lower = trimmed.toLowerCase();
|
|
51320
|
+
if (lower === needle || lower.startsWith(`${needle} `)) {
|
|
51278
51321
|
return trimmed;
|
|
51279
51322
|
}
|
|
51280
51323
|
}
|
|
@@ -51296,7 +51339,7 @@ function getDirective(policy, directiveName) {
|
|
|
51296
51339
|
function getArticle(phrase) {
|
|
51297
51340
|
if (!phrase || typeof phrase !== 'string')
|
|
51298
51341
|
return 'A';
|
|
51299
|
-
|
|
51342
|
+
const c = phrase.trim().charAt(0).toLowerCase();
|
|
51300
51343
|
return includes('aeiou', c) ? 'An' : 'A';
|
|
51301
51344
|
}
|
|
51302
51345
|
/**
|
|
@@ -51339,47 +51382,46 @@ function createCspViolationMessage(blockedURI, directive, isReportOnly, original
|
|
|
51339
51382
|
return 'Content Security Policy: Unknown violation occurred.';
|
|
51340
51383
|
}
|
|
51341
51384
|
try {
|
|
51342
|
-
|
|
51385
|
+
const reportOnlyText = isReportOnly ? ' (Report-Only)' : '';
|
|
51343
51386
|
// special case for frame-ancestors since it doesn't fit our template at all
|
|
51344
51387
|
if ((directive === null || directive === void 0 ? void 0 : directive.toLowerCase()) === 'frame-ancestors') {
|
|
51345
|
-
return
|
|
51388
|
+
return `Content Security Policy${reportOnlyText}: The display of ${blockedURI} in a frame was blocked because an ancestor violates your site's frame-ancestors policy.\nCurrent CSP: "${originalPolicy}".`;
|
|
51346
51389
|
}
|
|
51347
|
-
|
|
51348
|
-
|
|
51349
|
-
|
|
51350
|
-
|
|
51351
|
-
|
|
51352
|
-
|
|
51353
|
-
return
|
|
51390
|
+
const resourceType = getResourceType(blockedURI, directive);
|
|
51391
|
+
const article = getArticle(resourceType);
|
|
51392
|
+
const source = formatBlockedUri(blockedURI);
|
|
51393
|
+
const directiveValue = getDirective(originalPolicy, directive);
|
|
51394
|
+
const policyDisplay = directiveValue || directive;
|
|
51395
|
+
const resourceDescription = `${article} ${resourceType}${source ? ` from ${source}` : ''}`;
|
|
51396
|
+
return `Content Security Policy${reportOnlyText}: ${resourceDescription} was blocked by your site's \`${policyDisplay}\` policy.\nCurrent CSP: "${originalPolicy}".`;
|
|
51354
51397
|
}
|
|
51355
51398
|
catch (error) {
|
|
51356
|
-
return
|
|
51399
|
+
return `Content Security Policy: Error formatting violation message: ${error.message}`;
|
|
51357
51400
|
}
|
|
51358
51401
|
}
|
|
51359
51402
|
|
|
51360
|
-
|
|
51361
|
-
|
|
51403
|
+
const MAX_LENGTH = 1000;
|
|
51404
|
+
const PII_PATTERN = {
|
|
51362
51405
|
ip: /\b(?:\d{1,3}\.){3}\d{1,3}\b/g,
|
|
51363
51406
|
ssn: /\b\d{3}-\d{2}-\d{4}\b/g,
|
|
51364
51407
|
creditCard: /\b(?:\d[ -]?){12,18}\d\b/g,
|
|
51365
51408
|
httpsUrls: /https:\/\/[^\s]+/g,
|
|
51366
51409
|
email: /[\w._+-]+@[\w.-]+\.\w+/g
|
|
51367
51410
|
};
|
|
51368
|
-
|
|
51369
|
-
|
|
51370
|
-
|
|
51371
|
-
|
|
51372
|
-
|
|
51411
|
+
const PII_REPLACEMENT = '*'.repeat(10);
|
|
51412
|
+
const JSON_PII_KEYS = ['password', 'email', 'key', 'token', 'auth', 'authentication', 'phone', 'address', 'ssn'];
|
|
51413
|
+
const UNABLE_TO_DISPLAY_BODY = '[Unable to display body: detected PII could not be redacted]';
|
|
51414
|
+
const joinedKeys = JSON_PII_KEYS.join('|');
|
|
51415
|
+
const keyPattern = `"([^"]*(?:${joinedKeys})[^"]*)"`;
|
|
51373
51416
|
// only scrub strings, numbers, and booleans
|
|
51374
|
-
|
|
51417
|
+
const acceptedValues = '("([^"\\\\]*(?:\\\\.[^"\\\\]*)*")|(\\d+)|(true|false))';
|
|
51375
51418
|
/**
|
|
51376
51419
|
* Truncates a string to the max length
|
|
51377
51420
|
* @access private
|
|
51378
51421
|
* @param {String} string
|
|
51379
51422
|
* @returns {String}
|
|
51380
51423
|
*/
|
|
51381
|
-
function truncate(string, includeEllipsis) {
|
|
51382
|
-
if (includeEllipsis === void 0) { includeEllipsis = false; }
|
|
51424
|
+
function truncate(string, includeEllipsis = false) {
|
|
51383
51425
|
if (string.length <= MAX_LENGTH)
|
|
51384
51426
|
return string;
|
|
51385
51427
|
if (includeEllipsis) {
|
|
@@ -51396,7 +51438,7 @@ function truncate(string, includeEllipsis) {
|
|
|
51396
51438
|
* @returns {String}
|
|
51397
51439
|
*/
|
|
51398
51440
|
function generateLogKey(methodName, message, stackTrace) {
|
|
51399
|
-
return
|
|
51441
|
+
return `${methodName}|${message}|${stackTrace}`;
|
|
51400
51442
|
}
|
|
51401
51443
|
/**
|
|
51402
51444
|
* Checks if a string has 2 or more digits, a https URL, or an email address
|
|
@@ -51413,13 +51455,12 @@ function mightContainPII(string) {
|
|
|
51413
51455
|
* @param {String} string
|
|
51414
51456
|
* @returns {String}
|
|
51415
51457
|
*/
|
|
51416
|
-
function scrubPII(
|
|
51417
|
-
var string = _a.string, _ = _a._;
|
|
51458
|
+
function scrubPII({ string, _ }) {
|
|
51418
51459
|
if (!string || typeof string !== 'string')
|
|
51419
51460
|
return string;
|
|
51420
51461
|
if (!mightContainPII(string))
|
|
51421
51462
|
return string;
|
|
51422
|
-
return _.reduce(_.values(PII_PATTERN),
|
|
51463
|
+
return _.reduce(_.values(PII_PATTERN), (str, pattern) => str.replace(pattern, PII_REPLACEMENT), string);
|
|
51423
51464
|
}
|
|
51424
51465
|
/**
|
|
51425
51466
|
* Scrub PII from a stringified JSON object
|
|
@@ -51428,14 +51469,12 @@ function scrubPII(_a) {
|
|
|
51428
51469
|
* @returns {String}
|
|
51429
51470
|
*/
|
|
51430
51471
|
function scrubJsonPII(string) {
|
|
51431
|
-
|
|
51472
|
+
const fullScrubRegex = new RegExp(`${keyPattern}\\s*:\\s*[\\{\\[]`, 'i');
|
|
51432
51473
|
if (fullScrubRegex.test(string)) {
|
|
51433
51474
|
return UNABLE_TO_DISPLAY_BODY;
|
|
51434
51475
|
}
|
|
51435
|
-
|
|
51436
|
-
return string.replace(keyValueScrubRegex,
|
|
51437
|
-
return "\"".concat(key, "\":\"").concat(PII_REPLACEMENT, "\"");
|
|
51438
|
-
});
|
|
51476
|
+
const keyValueScrubRegex = new RegExp(`${keyPattern}\\s*:\\s*${acceptedValues}`, 'gi');
|
|
51477
|
+
return string.replace(keyValueScrubRegex, (match, key) => `"${key}":"${PII_REPLACEMENT}"`);
|
|
51439
51478
|
}
|
|
51440
51479
|
/**
|
|
51441
51480
|
* Checks if a string is a JSON object
|
|
@@ -51447,7 +51486,7 @@ function scrubJsonPII(string) {
|
|
|
51447
51486
|
function mightContainJson(string, contentType) {
|
|
51448
51487
|
if (!string || typeof string !== 'string')
|
|
51449
51488
|
return false;
|
|
51450
|
-
|
|
51489
|
+
const firstChar = string.charAt(0);
|
|
51451
51490
|
if (contentType && contentType.indexOf('application/json') !== -1) {
|
|
51452
51491
|
return true;
|
|
51453
51492
|
}
|
|
@@ -51460,20 +51499,19 @@ function mightContainJson(string, contentType) {
|
|
|
51460
51499
|
* @param {String} contentType
|
|
51461
51500
|
* @returns {String}
|
|
51462
51501
|
*/
|
|
51463
|
-
function maskSensitiveFields(
|
|
51464
|
-
var string = _a.string, contentType = _a.contentType, _ = _a._;
|
|
51502
|
+
function maskSensitiveFields({ string, contentType, _ }) {
|
|
51465
51503
|
if (!string || typeof string !== 'string')
|
|
51466
51504
|
return string;
|
|
51467
51505
|
if (mightContainJson(string, contentType)) {
|
|
51468
51506
|
string = scrubJsonPII(string);
|
|
51469
51507
|
}
|
|
51470
51508
|
if (mightContainPII(string)) {
|
|
51471
|
-
string = scrubPII({ string
|
|
51509
|
+
string = scrubPII({ string, _ });
|
|
51472
51510
|
}
|
|
51473
51511
|
return string;
|
|
51474
51512
|
}
|
|
51475
51513
|
|
|
51476
|
-
|
|
51514
|
+
const DEV_LOG_TYPE = 'devlog';
|
|
51477
51515
|
function createDevLogEnvelope(pluginAPI, globalPendo) {
|
|
51478
51516
|
return {
|
|
51479
51517
|
browser_time: pluginAPI.util.getNow(),
|