@openreplay/tracker 3.5.3 → 3.5.5
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/cjs/app/context.js +37 -14
- package/cjs/app/index.js +4 -3
- package/cjs/app/observer/observer.d.ts +2 -3
- package/cjs/app/observer/observer.js +5 -4
- package/cjs/app/observer/top_observer.js +14 -13
- package/cjs/index.js +1 -1
- package/cjs/modules/input.js +15 -6
- package/cjs/modules/mouse.js +19 -15
- package/cjs/modules/scroll.js +6 -3
- package/lib/app/context.js +37 -14
- package/lib/app/index.js +4 -3
- package/lib/app/observer/observer.d.ts +2 -3
- package/lib/app/observer/observer.js +5 -4
- package/lib/app/observer/top_observer.js +15 -14
- package/lib/index.js +1 -1
- package/lib/modules/input.js +16 -7
- package/lib/modules/mouse.js +20 -16
- package/lib/modules/scroll.js +6 -3
- package/package.json +1 -1
package/cjs/app/context.js
CHANGED
|
@@ -12,37 +12,60 @@ function isInstance(node, constr) {
|
|
|
12
12
|
// @ts-ignore (for EI, Safary)
|
|
13
13
|
doc.parentWindow ||
|
|
14
14
|
doc.defaultView; // TODO: smart global typing for Window object
|
|
15
|
-
while (context
|
|
15
|
+
while (context !== window) {
|
|
16
16
|
// @ts-ignore
|
|
17
17
|
if (node instanceof context[constr.name]) {
|
|
18
18
|
return true;
|
|
19
19
|
}
|
|
20
20
|
// @ts-ignore
|
|
21
|
-
context = context.parent;
|
|
21
|
+
context = context.parent || window;
|
|
22
22
|
}
|
|
23
23
|
// @ts-ignore
|
|
24
24
|
return node instanceof context[constr.name];
|
|
25
25
|
}
|
|
26
26
|
exports.isInstance = isInstance;
|
|
27
|
+
// TODO: ensure 1. it works in every cases (iframes/detached nodes) and 2. the most efficient
|
|
27
28
|
function inDocument(node) {
|
|
28
29
|
const doc = node.ownerDocument;
|
|
29
30
|
if (!doc) {
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
if (doc.contains(node)) {
|
|
33
31
|
return true;
|
|
34
|
-
}
|
|
35
|
-
let
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
doc.defaultView;
|
|
39
|
-
while (context.parent && context.parent !== context) {
|
|
40
|
-
if (context.document.contains(node)) {
|
|
32
|
+
} // Document
|
|
33
|
+
let current = node;
|
|
34
|
+
while (current) {
|
|
35
|
+
if (current === doc) {
|
|
41
36
|
return true;
|
|
42
37
|
}
|
|
43
|
-
|
|
44
|
-
|
|
38
|
+
else if (isInstance(current, ShadowRoot)) {
|
|
39
|
+
current = current.host;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
current = current.parentNode;
|
|
43
|
+
}
|
|
45
44
|
}
|
|
46
45
|
return false;
|
|
47
46
|
}
|
|
48
47
|
exports.inDocument = inDocument;
|
|
48
|
+
// export function inDocument(node: Node): boolean {
|
|
49
|
+
// // @ts-ignore compatability
|
|
50
|
+
// if (node.getRootNode) {
|
|
51
|
+
// let root: Node
|
|
52
|
+
// while ((root = node.getRootNode()) !== node) {
|
|
53
|
+
// ////
|
|
54
|
+
// }
|
|
55
|
+
// }
|
|
56
|
+
// const doc = node.ownerDocument
|
|
57
|
+
// if (!doc) { return false }
|
|
58
|
+
// if (doc.contains(node)) { return true }
|
|
59
|
+
// let context: Window =
|
|
60
|
+
// // @ts-ignore (for EI, Safary)
|
|
61
|
+
// doc.parentWindow ||
|
|
62
|
+
// doc.defaultView;
|
|
63
|
+
// while(context.parent && context.parent !== context) {
|
|
64
|
+
// if (context.document.contains(node)) {
|
|
65
|
+
// return true
|
|
66
|
+
// }
|
|
67
|
+
// // @ts-ignore
|
|
68
|
+
// context = context.parent
|
|
69
|
+
// }
|
|
70
|
+
// return false;
|
|
71
|
+
// }
|
package/cjs/app/index.js
CHANGED
|
@@ -29,7 +29,7 @@ class App {
|
|
|
29
29
|
this.stopCallbacks = [];
|
|
30
30
|
this.commitCallbacks = [];
|
|
31
31
|
this.activityState = ActivityState.NotActive;
|
|
32
|
-
this.version = '3.5.
|
|
32
|
+
this.version = '3.5.5'; // TODO: version compatability check inside each plugin.
|
|
33
33
|
this.preStartMessages = [];
|
|
34
34
|
this.projectKey = projectKey;
|
|
35
35
|
this.options = Object.assign({
|
|
@@ -58,7 +58,7 @@ class App {
|
|
|
58
58
|
this.notify = new logger_js_1.default(this.options.verbose ? logger_js_1.LogLevel.Warnings : logger_js_1.LogLevel.Silent);
|
|
59
59
|
this.session = new session_js_1.default(this);
|
|
60
60
|
try {
|
|
61
|
-
this.worker = new Worker(URL.createObjectURL(new Blob([`"use strict";function t(t){function s(...s){return new t(...s)}return s.prototype=t.prototype,s}const s=new Map;const i=t(class{constructor(t,s,i){this.pageNo=t,this.firstIndex=s,this.timestamp=i,this._id=80}encode(t){return t.uint(80)&&t.uint(this.pageNo)&&t.uint(this.firstIndex)&&t.int(this.timestamp)}});s.set(80,i);const n=t(class{constructor(t){this.timestamp=t,this._id=0}encode(t){return t.uint(0)&&t.uint(this.timestamp)}});s.set(0,n);const e=t(class{constructor(t,s,i){this.url=t,this.referrer=s,this.navigationStart=i,this._id=4}encode(t){return t.uint(4)&&t.string(this.url)&&t.string(this.referrer)&&t.uint(this.navigationStart)}});s.set(4,e);const r=t(class{constructor(t,s){this.width=t,this.height=s,this._id=5}encode(t){return t.uint(5)&&t.uint(this.width)&&t.uint(this.height)}});s.set(5,r);const o=t(class{constructor(t,s){this.x=t,this.y=s,this._id=6}encode(t){return t.uint(6)&&t.int(this.x)&&t.int(this.y)}});s.set(6,o);const h=t(class{constructor(){this._id=7}encode(t){return t.uint(7)}});s.set(7,h);const c=t(class{constructor(t,s,i,n,e){this.id=t,this.parentID=s,this.index=i,this.tag=n,this.svg=e,this._id=8}encode(t){return t.uint(8)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)&&t.string(this.tag)&&t.boolean(this.svg)}});s.set(8,c);const u=t(class{constructor(t,s,i){this.id=t,this.parentID=s,this.index=i,this._id=9}encode(t){return t.uint(9)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});s.set(9,u);const a=t(class{constructor(t,s,i){this.id=t,this.parentID=s,this.index=i,this._id=10}encode(t){return t.uint(10)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});s.set(10,a);const d=t(class{constructor(t){this.id=t,this._id=11}encode(t){return t.uint(11)&&t.uint(this.id)}});s.set(11,d);const l=t(class{constructor(t,s,i){this.id=t,this.name=s,this.value=i,this._id=12}encode(t){return t.uint(12)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)}});s.set(12,l);const g=t(class{constructor(t,s){this.id=t,this.name=s,this._id=13}encode(t){return t.uint(13)&&t.uint(this.id)&&t.string(this.name)}});s.set(13,g);const f=t(class{constructor(t,s){this.id=t,this.data=s,this._id=14}encode(t){return t.uint(14)&&t.uint(this.id)&&t.string(this.data)}});s.set(14,f);const p=t(class{constructor(t,s,i){this.id=t,this.x=s,this.y=i,this._id=16}encode(t){return t.uint(16)&&t.uint(this.id)&&t.int(this.x)&&t.int(this.y)}});s.set(16,p);const m=t(class{constructor(t,s){this.id=t,this.label=s,this._id=17}encode(t){return t.uint(17)&&t.uint(this.id)&&t.string(this.label)}});s.set(17,m);const _=t(class{constructor(t,s,i){this.id=t,this.value=s,this.mask=i,this._id=18}encode(t){return t.uint(18)&&t.uint(this.id)&&t.string(this.value)&&t.int(this.mask)}});s.set(18,_);const y=t(class{constructor(t,s){this.id=t,this.checked=s,this._id=19}encode(t){return t.uint(19)&&t.uint(this.id)&&t.boolean(this.checked)}});s.set(19,y);const v=t(class{constructor(t,s){this.x=t,this.y=s,this._id=20}encode(t){return t.uint(20)&&t.uint(this.x)&&t.uint(this.y)}});s.set(20,v);const S=t(class{constructor(t,s){this.level=t,this.value=s,this._id=22}encode(t){return t.uint(22)&&t.string(this.level)&&t.string(this.value)}});s.set(22,S);const b=t(class{constructor(t,s,i,n,e,r,o,h,c){this.requestStart=t,this.responseStart=s,this.responseEnd=i,this.domContentLoadedEventStart=n,this.domContentLoadedEventEnd=e,this.loadEventStart=r,this.loadEventEnd=o,this.firstPaint=h,this.firstContentfulPaint=c,this._id=23}encode(t){return t.uint(23)&&t.uint(this.requestStart)&&t.uint(this.responseStart)&&t.uint(this.responseEnd)&&t.uint(this.domContentLoadedEventStart)&&t.uint(this.domContentLoadedEventEnd)&&t.uint(this.loadEventStart)&&t.uint(this.loadEventEnd)&&t.uint(this.firstPaint)&&t.uint(this.firstContentfulPaint)}});s.set(23,b);const x=t(class{constructor(t,s,i){this.speedIndex=t,this.visuallyComplete=s,this.timeToInteractive=i,this._id=24}encode(t){return t.uint(24)&&t.uint(this.speedIndex)&&t.uint(this.visuallyComplete)&&t.uint(this.timeToInteractive)}});s.set(24,x);const E=t(class{constructor(t,s,i){this.name=t,this.message=s,this.payload=i,this._id=25}encode(t){return t.uint(25)&&t.string(this.name)&&t.string(this.message)&&t.string(this.payload)}});s.set(25,E);const k=t(class{constructor(t,s){this.name=t,this.payload=s,this._id=27}encode(t){return t.uint(27)&&t.string(this.name)&&t.string(this.payload)}});s.set(27,k);const I=t(class{constructor(t){this.id=t,this._id=28}encode(t){return t.uint(28)&&t.string(this.id)}});s.set(28,I);const z=t(class{constructor(t){this.id=t,this._id=29}encode(t){return t.uint(29)&&t.string(this.id)}});s.set(29,z);const w=t(class{constructor(t,s){this.key=t,this.value=s,this._id=30}encode(t){return t.uint(30)&&t.string(this.key)&&t.string(this.value)}});s.set(30,w);const T=t(class{constructor(t,s,i){this.id=t,this.rule=s,this.index=i,this._id=37}encode(t){return t.uint(37)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)}});s.set(37,T);const L=t(class{constructor(t,s){this.id=t,this.index=s,this._id=38}encode(t){return t.uint(38)&&t.uint(this.id)&&t.uint(this.index)}});s.set(38,L);const A=t(class{constructor(t,s,i,n,e,r,o){this.method=t,this.url=s,this.request=i,this.response=n,this.status=e,this.timestamp=r,this.duration=o,this._id=39}encode(t){return t.uint(39)&&t.string(this.method)&&t.string(this.url)&&t.string(this.request)&&t.string(this.response)&&t.uint(this.status)&&t.uint(this.timestamp)&&t.uint(this.duration)}});s.set(39,A);const C=t(class{constructor(t,s,i,n){this.name=t,this.duration=s,this.args=i,this.result=n,this._id=40}encode(t){return t.uint(40)&&t.string(this.name)&&t.uint(this.duration)&&t.string(this.args)&&t.string(this.result)}});s.set(40,C);const M=t(class{constructor(t,s){this.key=t,this.value=s,this._id=41}encode(t){return t.uint(41)&&t.string(this.key)&&t.string(this.value)}});s.set(41,M);const R=t(class{constructor(t){this.type=t,this._id=42}encode(t){return t.uint(42)&&t.string(this.type)}});s.set(42,R);const N=t(class{constructor(t,s,i){this.action=t,this.state=s,this.duration=i,this._id=44}encode(t){return t.uint(44)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});s.set(44,N);const D=t(class{constructor(t,s){this.mutation=t,this.state=s,this._id=45}encode(t){return t.uint(45)&&t.string(this.mutation)&&t.string(this.state)}});s.set(45,D);const U=t(class{constructor(t,s){this.type=t,this.payload=s,this._id=46}encode(t){return t.uint(46)&&t.string(this.type)&&t.string(this.payload)}});s.set(46,U);const O=t(class{constructor(t,s,i){this.action=t,this.state=s,this.duration=i,this._id=47}encode(t){return t.uint(47)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});s.set(47,O);const q=t(class{constructor(t,s,i,n){this.operationKind=t,this.operationName=s,this.variables=i,this.response=n,this._id=48}encode(t){return t.uint(48)&&t.string(this.operationKind)&&t.string(this.operationName)&&t.string(this.variables)&&t.string(this.response)}});s.set(48,q);const H=t(class{constructor(t,s,i,n){this.frames=t,this.ticks=s,this.totalJSHeapSize=i,this.usedJSHeapSize=n,this._id=49}encode(t){return t.uint(49)&&t.int(this.frames)&&t.int(this.ticks)&&t.uint(this.totalJSHeapSize)&&t.uint(this.usedJSHeapSize)}});s.set(49,H);const P=t(class{constructor(t,s,i,n,e,r,o,h){this.timestamp=t,this.duration=s,this.ttfb=i,this.headerSize=n,this.encodedBodySize=e,this.decodedBodySize=r,this.url=o,this.initiator=h,this._id=53}encode(t){return t.uint(53)&&t.uint(this.timestamp)&&t.uint(this.duration)&&t.uint(this.ttfb)&&t.uint(this.headerSize)&&t.uint(this.encodedBodySize)&&t.uint(this.decodedBodySize)&&t.string(this.url)&&t.string(this.initiator)}});s.set(53,P);const B=t(class{constructor(t,s){this.downlink=t,this.type=s,this._id=54}encode(t){return t.uint(54)&&t.uint(this.downlink)&&t.string(this.type)}});s.set(54,B);const J=t(class{constructor(t){this.hidden=t,this._id=55}encode(t){return t.uint(55)&&t.boolean(this.hidden)}});s.set(55,J);const j=t(class{constructor(t,s,i,n,e,r,o){this.timestamp=t,this.duration=s,this.context=i,this.containerType=n,this.containerSrc=e,this.containerId=r,this.containerName=o,this._id=59}encode(t){return t.uint(59)&&t.uint(this.timestamp)&&t.uint(this.duration)&&t.uint(this.context)&&t.uint(this.containerType)&&t.string(this.containerSrc)&&t.string(this.containerId)&&t.string(this.containerName)}});s.set(59,j);const G=t(class{constructor(t,s,i,n){this.id=t,this.name=s,this.value=i,this.baseURL=n,this._id=60}encode(t){return t.uint(60)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)&&t.string(this.baseURL)}});s.set(60,G);const K=t(class{constructor(t,s,i){this.id=t,this.data=s,this.baseURL=i,this._id=61}encode(t){return t.uint(61)&&t.uint(this.id)&&t.string(this.data)&&t.string(this.baseURL)}});s.set(61,K);const X=t(class{constructor(t,s){this.type=t,this.value=s,this._id=63}encode(t){return t.uint(63)&&t.string(this.type)&&t.string(this.value)}});s.set(63,X);const F=t(class{constructor(t,s){this.name=t,this.payload=s,this._id=64}encode(t){return t.uint(64)&&t.string(this.name)&&t.string(this.payload)}});s.set(64,F);const Q=t(class{constructor(){this._id=65}encode(t){return t.uint(65)}});s.set(65,Q);const V=t(class{constructor(t,s,i,n){this.id=t,this.rule=s,this.index=i,this.baseURL=n,this._id=67}encode(t){return t.uint(67)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)&&t.string(this.baseURL)}});s.set(67,V);const W=t(class{constructor(t,s,i,n){this.id=t,this.hesitationTime=s,this.label=i,this.selector=n,this._id=69}encode(t){return t.uint(69)&&t.uint(this.id)&&t.uint(this.hesitationTime)&&t.string(this.label)&&t.string(this.selector)}});s.set(69,W);const Y=t(class{constructor(t,s){this.frameID=t,this.id=s,this._id=70}encode(t){return t.uint(70)&&t.uint(this.frameID)&&t.uint(this.id)}});s.set(70,Y);const Z="function"==typeof TextEncoder?new TextEncoder:{encode(t){const s=t.length,i=new Uint8Array(3*s);let n=-1;for(var e=0,r=0,o=0;o!==s;){if(e=t.charCodeAt(o),o+=1,e>=55296&&e<=56319){if(o===s){i[n+=1]=239,i[n+=1]=191,i[n+=1]=189;break}if(!((r=t.charCodeAt(o))>=56320&&r<=57343)){i[n+=1]=239,i[n+=1]=191,i[n+=1]=189;continue}if(o+=1,(e=1024*(e-55296)+r-56320+65536)>65535){i[n+=1]=240|e>>>18,i[n+=1]=128|e>>>12&63,i[n+=1]=128|e>>>6&63,i[n+=1]=128|63&e;continue}}e<=127?i[n+=1]=0|e:e<=2047?(i[n+=1]=192|e>>>6,i[n+=1]=128|63&e):(i[n+=1]=224|e>>>12,i[n+=1]=128|e>>>6&63,i[n+=1]=128|63&e)}return i.subarray(0,n+1)}};class tt{constructor(t){this.size=t,this.offset=0,this.checkpointOffset=0,this.data=new Uint8Array(t)}checkpoint(){this.checkpointOffset=this.offset}isEmpty(){return 0===this.offset}boolean(t){return this.data[this.offset++]=+t,this.offset<=this.size}uint(t){for((t<0||t>Number.MAX_SAFE_INTEGER)&&(t=0);t>=128;)this.data[this.offset++]=t%256|128,t=Math.floor(t/128);return this.data[this.offset++]=t,this.offset<=this.size}int(t){return t=Math.round(t),this.uint(t>=0?2*t:-2*t-1)}string(t){const s=Z.encode(t),i=s.byteLength;return!(!this.uint(i)||this.offset+i>this.size)&&(this.data.set(s,this.offset),this.offset+=i,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}let st=1e6,it=2e5,nt=new tt(it),et="",rt="",ot=0,ht=0,ct=0,ut=0,at=!0;function dt(){return new i(ot,ut,ht).encode(nt)}let lt=null;const gt=[];let ft,pt=!1,mt=0,_t=8e3,yt=10;function vt(){if(at||""===rt||""===et)return;const t=nt.flush();pt?gt.push(t):(pt=!0,function t(s){const i=new XMLHttpRequest;i.open("POST",et+"/v1/web/i",!1),i.setRequestHeader("Authorization","Bearer "+rt),i.onreadystatechange=function(){if(4===this.readyState){if(0==this.status)return;if(this.status>=400)return pt=!1,St(),gt.length=0,401===this.status?void self.postMessage("restart"):void self.postMessage(null);const s=gt.shift();s?t(s):pt=!1}},i.onerror=function(i){if(mt>=yt)return St(),void self.postMessage(null);mt++,setTimeout(()=>t(s),_t)},i.send(s.buffer)}(t)),at=!0,dt()}function St(){et="",rt="",null!==lt&&(clearInterval(lt),lt=null),nt.reset()}self.onmessage=({data:t})=>{if(null!==t)return"stop"===t?(vt(),void St()):Array.isArray(t)?void t.forEach(t=>{const i=new(s.get(t._id));if(Object.assign(i,t),i instanceof n?ht=i.timestamp:i instanceof J&&(i.hidden?ft=setTimeout(()=>self.postMessage("restart"),18e5):clearTimeout(ft)),nt.checkpoint(),!i.encode(nt)&&(vt(),!i.encode(nt)))for(;!i.encode(nt);){if(it===st)return console.warn("OpenReplay: beacon size overflow."),nt.reset(),void dt();it=Math.min(2*it,st),nt=new tt(it),dt()}ut++,at=!1}):(et=t.ingestPoint||et,rt=t.token||rt,ot=t.pageNo||ot,ht=t.startTimestamp||ht,ct=t.timeAdjustment||ct,yt=t.connAttemptCount||yt,_t=t.connAttemptGap||_t,st=t.beaconSizeLimit||st,it=Math.min(st,t.beaconSize||it),nt.isEmpty()&&dt(),void(null===lt&&(lt=setInterval(vt,1e4))));vt()};
|
|
61
|
+
this.worker = new Worker(URL.createObjectURL(new Blob([`"use strict";function t(t){function s(...s){return new t(...s)}return s.prototype=t.prototype,s}const s=new Map;const i=t(class{constructor(t,s,i){this.pageNo=t,this.firstIndex=s,this.timestamp=i,this._id=80}encode(t){return t.uint(80)&&t.uint(this.pageNo)&&t.uint(this.firstIndex)&&t.int(this.timestamp)}});s.set(80,i);const n=t(class{constructor(t){this.timestamp=t,this._id=0}encode(t){return t.uint(0)&&t.uint(this.timestamp)}});s.set(0,n);const e=t(class{constructor(t,s,i){this.url=t,this.referrer=s,this.navigationStart=i,this._id=4}encode(t){return t.uint(4)&&t.string(this.url)&&t.string(this.referrer)&&t.uint(this.navigationStart)}});s.set(4,e);const r=t(class{constructor(t,s){this.width=t,this.height=s,this._id=5}encode(t){return t.uint(5)&&t.uint(this.width)&&t.uint(this.height)}});s.set(5,r);const o=t(class{constructor(t,s){this.x=t,this.y=s,this._id=6}encode(t){return t.uint(6)&&t.int(this.x)&&t.int(this.y)}});s.set(6,o);const h=t(class{constructor(){this._id=7}encode(t){return t.uint(7)}});s.set(7,h);const c=t(class{constructor(t,s,i,n,e){this.id=t,this.parentID=s,this.index=i,this.tag=n,this.svg=e,this._id=8}encode(t){return t.uint(8)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)&&t.string(this.tag)&&t.boolean(this.svg)}});s.set(8,c);const u=t(class{constructor(t,s,i){this.id=t,this.parentID=s,this.index=i,this._id=9}encode(t){return t.uint(9)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});s.set(9,u);const a=t(class{constructor(t,s,i){this.id=t,this.parentID=s,this.index=i,this._id=10}encode(t){return t.uint(10)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});s.set(10,a);const d=t(class{constructor(t){this.id=t,this._id=11}encode(t){return t.uint(11)&&t.uint(this.id)}});s.set(11,d);const l=t(class{constructor(t,s,i){this.id=t,this.name=s,this.value=i,this._id=12}encode(t){return t.uint(12)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)}});s.set(12,l);const g=t(class{constructor(t,s){this.id=t,this.name=s,this._id=13}encode(t){return t.uint(13)&&t.uint(this.id)&&t.string(this.name)}});s.set(13,g);const f=t(class{constructor(t,s){this.id=t,this.data=s,this._id=14}encode(t){return t.uint(14)&&t.uint(this.id)&&t.string(this.data)}});s.set(14,f);const p=t(class{constructor(t,s,i){this.id=t,this.x=s,this.y=i,this._id=16}encode(t){return t.uint(16)&&t.uint(this.id)&&t.int(this.x)&&t.int(this.y)}});s.set(16,p);const m=t(class{constructor(t,s){this.id=t,this.label=s,this._id=17}encode(t){return t.uint(17)&&t.uint(this.id)&&t.string(this.label)}});s.set(17,m);const _=t(class{constructor(t,s,i){this.id=t,this.value=s,this.mask=i,this._id=18}encode(t){return t.uint(18)&&t.uint(this.id)&&t.string(this.value)&&t.int(this.mask)}});s.set(18,_);const y=t(class{constructor(t,s){this.id=t,this.checked=s,this._id=19}encode(t){return t.uint(19)&&t.uint(this.id)&&t.boolean(this.checked)}});s.set(19,y);const v=t(class{constructor(t,s){this.x=t,this.y=s,this._id=20}encode(t){return t.uint(20)&&t.uint(this.x)&&t.uint(this.y)}});s.set(20,v);const S=t(class{constructor(t,s){this.level=t,this.value=s,this._id=22}encode(t){return t.uint(22)&&t.string(this.level)&&t.string(this.value)}});s.set(22,S);const b=t(class{constructor(t,s,i,n,e,r,o,h,c){this.requestStart=t,this.responseStart=s,this.responseEnd=i,this.domContentLoadedEventStart=n,this.domContentLoadedEventEnd=e,this.loadEventStart=r,this.loadEventEnd=o,this.firstPaint=h,this.firstContentfulPaint=c,this._id=23}encode(t){return t.uint(23)&&t.uint(this.requestStart)&&t.uint(this.responseStart)&&t.uint(this.responseEnd)&&t.uint(this.domContentLoadedEventStart)&&t.uint(this.domContentLoadedEventEnd)&&t.uint(this.loadEventStart)&&t.uint(this.loadEventEnd)&&t.uint(this.firstPaint)&&t.uint(this.firstContentfulPaint)}});s.set(23,b);const x=t(class{constructor(t,s,i){this.speedIndex=t,this.visuallyComplete=s,this.timeToInteractive=i,this._id=24}encode(t){return t.uint(24)&&t.uint(this.speedIndex)&&t.uint(this.visuallyComplete)&&t.uint(this.timeToInteractive)}});s.set(24,x);const E=t(class{constructor(t,s,i){this.name=t,this.message=s,this.payload=i,this._id=25}encode(t){return t.uint(25)&&t.string(this.name)&&t.string(this.message)&&t.string(this.payload)}});s.set(25,E);const k=t(class{constructor(t,s){this.name=t,this.payload=s,this._id=27}encode(t){return t.uint(27)&&t.string(this.name)&&t.string(this.payload)}});s.set(27,k);const I=t(class{constructor(t){this.id=t,this._id=28}encode(t){return t.uint(28)&&t.string(this.id)}});s.set(28,I);const z=t(class{constructor(t){this.id=t,this._id=29}encode(t){return t.uint(29)&&t.string(this.id)}});s.set(29,z);const w=t(class{constructor(t,s){this.key=t,this.value=s,this._id=30}encode(t){return t.uint(30)&&t.string(this.key)&&t.string(this.value)}});s.set(30,w);const T=t(class{constructor(t,s,i){this.id=t,this.rule=s,this.index=i,this._id=37}encode(t){return t.uint(37)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)}});s.set(37,T);const L=t(class{constructor(t,s){this.id=t,this.index=s,this._id=38}encode(t){return t.uint(38)&&t.uint(this.id)&&t.uint(this.index)}});s.set(38,L);const A=t(class{constructor(t,s,i,n,e,r,o){this.method=t,this.url=s,this.request=i,this.response=n,this.status=e,this.timestamp=r,this.duration=o,this._id=39}encode(t){return t.uint(39)&&t.string(this.method)&&t.string(this.url)&&t.string(this.request)&&t.string(this.response)&&t.uint(this.status)&&t.uint(this.timestamp)&&t.uint(this.duration)}});s.set(39,A);const C=t(class{constructor(t,s,i,n){this.name=t,this.duration=s,this.args=i,this.result=n,this._id=40}encode(t){return t.uint(40)&&t.string(this.name)&&t.uint(this.duration)&&t.string(this.args)&&t.string(this.result)}});s.set(40,C);const M=t(class{constructor(t,s){this.key=t,this.value=s,this._id=41}encode(t){return t.uint(41)&&t.string(this.key)&&t.string(this.value)}});s.set(41,M);const R=t(class{constructor(t){this.type=t,this._id=42}encode(t){return t.uint(42)&&t.string(this.type)}});s.set(42,R);const N=t(class{constructor(t,s,i){this.action=t,this.state=s,this.duration=i,this._id=44}encode(t){return t.uint(44)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});s.set(44,N);const D=t(class{constructor(t,s){this.mutation=t,this.state=s,this._id=45}encode(t){return t.uint(45)&&t.string(this.mutation)&&t.string(this.state)}});s.set(45,D);const U=t(class{constructor(t,s){this.type=t,this.payload=s,this._id=46}encode(t){return t.uint(46)&&t.string(this.type)&&t.string(this.payload)}});s.set(46,U);const O=t(class{constructor(t,s,i){this.action=t,this.state=s,this.duration=i,this._id=47}encode(t){return t.uint(47)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});s.set(47,O);const q=t(class{constructor(t,s,i,n){this.operationKind=t,this.operationName=s,this.variables=i,this.response=n,this._id=48}encode(t){return t.uint(48)&&t.string(this.operationKind)&&t.string(this.operationName)&&t.string(this.variables)&&t.string(this.response)}});s.set(48,q);const H=t(class{constructor(t,s,i,n){this.frames=t,this.ticks=s,this.totalJSHeapSize=i,this.usedJSHeapSize=n,this._id=49}encode(t){return t.uint(49)&&t.int(this.frames)&&t.int(this.ticks)&&t.uint(this.totalJSHeapSize)&&t.uint(this.usedJSHeapSize)}});s.set(49,H);const P=t(class{constructor(t,s,i,n,e,r,o,h){this.timestamp=t,this.duration=s,this.ttfb=i,this.headerSize=n,this.encodedBodySize=e,this.decodedBodySize=r,this.url=o,this.initiator=h,this._id=53}encode(t){return t.uint(53)&&t.uint(this.timestamp)&&t.uint(this.duration)&&t.uint(this.ttfb)&&t.uint(this.headerSize)&&t.uint(this.encodedBodySize)&&t.uint(this.decodedBodySize)&&t.string(this.url)&&t.string(this.initiator)}});s.set(53,P);const B=t(class{constructor(t,s){this.downlink=t,this.type=s,this._id=54}encode(t){return t.uint(54)&&t.uint(this.downlink)&&t.string(this.type)}});s.set(54,B);const J=t(class{constructor(t){this.hidden=t,this._id=55}encode(t){return t.uint(55)&&t.boolean(this.hidden)}});s.set(55,J);const j=t(class{constructor(t,s,i,n,e,r,o){this.timestamp=t,this.duration=s,this.context=i,this.containerType=n,this.containerSrc=e,this.containerId=r,this.containerName=o,this._id=59}encode(t){return t.uint(59)&&t.uint(this.timestamp)&&t.uint(this.duration)&&t.uint(this.context)&&t.uint(this.containerType)&&t.string(this.containerSrc)&&t.string(this.containerId)&&t.string(this.containerName)}});s.set(59,j);const G=t(class{constructor(t,s,i,n){this.id=t,this.name=s,this.value=i,this.baseURL=n,this._id=60}encode(t){return t.uint(60)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)&&t.string(this.baseURL)}});s.set(60,G);const K=t(class{constructor(t,s,i){this.id=t,this.data=s,this.baseURL=i,this._id=61}encode(t){return t.uint(61)&&t.uint(this.id)&&t.string(this.data)&&t.string(this.baseURL)}});s.set(61,K);const X=t(class{constructor(t,s){this.type=t,this.value=s,this._id=63}encode(t){return t.uint(63)&&t.string(this.type)&&t.string(this.value)}});s.set(63,X);const F=t(class{constructor(t,s){this.name=t,this.payload=s,this._id=64}encode(t){return t.uint(64)&&t.string(this.name)&&t.string(this.payload)}});s.set(64,F);const Q=t(class{constructor(){this._id=65}encode(t){return t.uint(65)}});s.set(65,Q);const V=t(class{constructor(t,s,i,n){this.id=t,this.rule=s,this.index=i,this.baseURL=n,this._id=67}encode(t){return t.uint(67)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)&&t.string(this.baseURL)}});s.set(67,V);const W=t(class{constructor(t,s,i,n){this.id=t,this.hesitationTime=s,this.label=i,this.selector=n,this._id=69}encode(t){return t.uint(69)&&t.uint(this.id)&&t.uint(this.hesitationTime)&&t.string(this.label)&&t.string(this.selector)}});s.set(69,W);const Y=t(class{constructor(t,s){this.frameID=t,this.id=s,this._id=70}encode(t){return t.uint(70)&&t.uint(this.frameID)&&t.uint(this.id)}});s.set(70,Y);const Z="function"==typeof TextEncoder?new TextEncoder:{encode(t){const s=t.length,i=new Uint8Array(3*s);let n=-1;for(var e=0,r=0,o=0;o!==s;){if(e=t.charCodeAt(o),o+=1,e>=55296&&e<=56319){if(o===s){i[n+=1]=239,i[n+=1]=191,i[n+=1]=189;break}if(!((r=t.charCodeAt(o))>=56320&&r<=57343)){i[n+=1]=239,i[n+=1]=191,i[n+=1]=189;continue}if(o+=1,(e=1024*(e-55296)+r-56320+65536)>65535){i[n+=1]=240|e>>>18,i[n+=1]=128|e>>>12&63,i[n+=1]=128|e>>>6&63,i[n+=1]=128|63&e;continue}}e<=127?i[n+=1]=0|e:e<=2047?(i[n+=1]=192|e>>>6,i[n+=1]=128|63&e):(i[n+=1]=224|e>>>12,i[n+=1]=128|e>>>6&63,i[n+=1]=128|63&e)}return i.subarray(0,n+1)}};class tt{constructor(t){this.size=t,this.offset=0,this.checkpointOffset=0,this.data=new Uint8Array(t)}checkpoint(){this.checkpointOffset=this.offset}isEmpty(){return 0===this.offset}boolean(t){return this.data[this.offset++]=+t,this.offset<=this.size}uint(t){for((t<0||t>Number.MAX_SAFE_INTEGER)&&(t=0);t>=128;)this.data[this.offset++]=t%256|128,t=Math.floor(t/128);return this.data[this.offset++]=t,this.offset<=this.size}int(t){return t=Math.round(t),this.uint(t>=0?2*t:-2*t-1)}string(t){const s=Z.encode(t),i=s.byteLength;return!(!this.uint(i)||this.offset+i>this.size)&&(this.data.set(s,this.offset),this.offset+=i,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}let st=1e6,it=2e5,nt=new tt(it),et="",rt="",ot=0,ht=0,ct=0,ut=0,at=!0;function dt(){return new i(ot,ut,ht).encode(nt)}let lt=null;const gt=[];let ft,pt=!1,mt=0,_t=3e3,yt=10;function vt(){if(at||""===rt||""===et)return;const t=nt.flush();pt?gt.push(t):(pt=!0,function t(s){const i=new XMLHttpRequest;function n(){if(mt>=yt)return St(),void self.postMessage(null);mt++,setTimeout(()=>t(s),_t)}i.open("POST",et+"/v1/web/i",!1),i.setRequestHeader("Authorization","Bearer "+rt),i.onreadystatechange=function(){if(4===this.readyState){if(0==this.status)return;if(401===this.status)return pt=!1,void self.postMessage("restart");if(this.status>=400)return void n();mt=0;const s=gt.shift();s?t(s):pt=!1}},i.onerror=n,i.send(s.buffer)}(t)),at=!0,dt()}function St(){et="",rt="",null!==lt&&(clearInterval(lt),lt=null),gt.length=0,nt.reset()}self.onmessage=({data:t})=>{if(null!==t)return"stop"===t?(vt(),void St()):Array.isArray(t)?void t.forEach(t=>{const i=new(s.get(t._id));if(Object.assign(i,t),i instanceof n?ht=i.timestamp:i instanceof J&&(i.hidden?ft=setTimeout(()=>self.postMessage("restart"),18e5):clearTimeout(ft)),nt.checkpoint(),!i.encode(nt)&&(vt(),!i.encode(nt)))for(;!i.encode(nt);){if(it===st)return console.warn("OpenReplay: beacon size overflow."),nt.reset(),void dt();it=Math.min(2*it,st),nt=new tt(it),dt()}ut++,at=!1}):(et=t.ingestPoint||et,rt=t.token||rt,ot=t.pageNo||ot,ht=t.startTimestamp||ht,ct=t.timeAdjustment||ct,yt=t.connAttemptCount||yt,_t=t.connAttemptGap||_t,st=t.beaconSizeLimit||st,it=Math.min(st,t.beaconSize||it),nt.isEmpty()&&dt(),void(null===lt&&(lt=setInterval(vt,1e4))));vt()};
|
|
62
62
|
`], { type: 'text/javascript' })));
|
|
63
63
|
this.worker.onerror = e => {
|
|
64
64
|
this._debug("webworker_error", e);
|
|
@@ -154,10 +154,11 @@ class App {
|
|
|
154
154
|
this.attachStartCallback(() => target.addEventListener(type, listener, useCapture));
|
|
155
155
|
this.attachStopCallback(() => target.removeEventListener(type, listener, useCapture));
|
|
156
156
|
}
|
|
157
|
+
// TODO: full correct semantic
|
|
157
158
|
checkRequiredVersion(version) {
|
|
158
159
|
const reqVer = version.split('.');
|
|
159
160
|
const ver = this.version.split('.');
|
|
160
|
-
for (let i = 0; i <
|
|
161
|
+
for (let i = 0; i < 3; i++) {
|
|
161
162
|
if (Number(ver[i]) < Number(reqVer[i]) || isNaN(Number(ver[i])) || isNaN(Number(reqVer[i]))) {
|
|
162
163
|
return false;
|
|
163
164
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import App from "../index.js";
|
|
2
2
|
export default abstract class Observer {
|
|
3
3
|
protected readonly app: App;
|
|
4
|
-
protected readonly
|
|
4
|
+
protected readonly isTopContext: boolean;
|
|
5
5
|
private readonly observer;
|
|
6
6
|
private readonly commited;
|
|
7
7
|
private readonly recents;
|
|
@@ -9,8 +9,7 @@ export default abstract class Observer {
|
|
|
9
9
|
private readonly indexes;
|
|
10
10
|
private readonly attributesList;
|
|
11
11
|
private readonly textSet;
|
|
12
|
-
|
|
13
|
-
constructor(app: App, context?: Window);
|
|
12
|
+
constructor(app: App, isTopContext?: boolean);
|
|
14
13
|
private clear;
|
|
15
14
|
private sendNodeAttribute;
|
|
16
15
|
private sendNodeData;
|
|
@@ -34,16 +34,15 @@ function isObservable(node) {
|
|
|
34
34
|
return !isIgnored(node);
|
|
35
35
|
}
|
|
36
36
|
class Observer {
|
|
37
|
-
constructor(app,
|
|
37
|
+
constructor(app, isTopContext = false) {
|
|
38
38
|
this.app = app;
|
|
39
|
-
this.
|
|
39
|
+
this.isTopContext = isTopContext;
|
|
40
40
|
this.commited = [];
|
|
41
41
|
this.recents = [];
|
|
42
42
|
this.myNodes = [];
|
|
43
43
|
this.indexes = [];
|
|
44
44
|
this.attributesList = [];
|
|
45
45
|
this.textSet = new Set();
|
|
46
|
-
this.inUpperContext = context.parent === context; //TODO: get rid of context here
|
|
47
46
|
this.observer = new MutationObserver(this.app.safe((mutations) => {
|
|
48
47
|
for (const mutation of mutations) {
|
|
49
48
|
const target = mutation.target;
|
|
@@ -186,7 +185,7 @@ class Observer {
|
|
|
186
185
|
// Disable parent check for the upper context HTMLHtmlElement, because it is root there... (before)
|
|
187
186
|
// TODO: get rid of "special" cases (there is an issue with CreateDocument altered behaviour though)
|
|
188
187
|
// TODO: Clean the logic (though now it workd fine)
|
|
189
|
-
if (!(0, context_js_1.isInstance)(node, HTMLHtmlElement) || !this.
|
|
188
|
+
if (!(0, context_js_1.isInstance)(node, HTMLHtmlElement) || !this.isTopContext) {
|
|
190
189
|
if (parent === null) {
|
|
191
190
|
this.unbindNode(node);
|
|
192
191
|
return false;
|
|
@@ -274,6 +273,8 @@ class Observer {
|
|
|
274
273
|
for (let id = 0; id < this.recents.length; id++) {
|
|
275
274
|
// TODO: make things/logic nice here.
|
|
276
275
|
// commit required in any case if recents[id] true or false (in case of unbinding) or undefined (in case of attr change).
|
|
276
|
+
// Possible solution: separate new node commit (recents) and new attribute/move node commit
|
|
277
|
+
// Otherwise commitNode is called on each node, which might be a lot
|
|
277
278
|
if (!this.myNodes[id]) {
|
|
278
279
|
continue;
|
|
279
280
|
}
|
|
@@ -9,16 +9,17 @@ const utils_js_1 = require("../../utils.js");
|
|
|
9
9
|
const attachShadowNativeFn = utils_js_1.IN_BROWSER ? Element.prototype.attachShadow : () => new ShadowRoot();
|
|
10
10
|
class TopObserver extends observer_js_1.default {
|
|
11
11
|
constructor(app, options) {
|
|
12
|
-
super(app);
|
|
12
|
+
super(app, true);
|
|
13
13
|
this.iframeObservers = [];
|
|
14
14
|
this.shadowRootObservers = [];
|
|
15
15
|
this.options = Object.assign({
|
|
16
|
-
captureIFrames:
|
|
16
|
+
captureIFrames: true
|
|
17
17
|
}, options);
|
|
18
18
|
// IFrames
|
|
19
19
|
this.app.nodes.attachNodeCallback(node => {
|
|
20
20
|
if ((0, context_js_1.isInstance)(node, HTMLIFrameElement) &&
|
|
21
|
-
(this.options.captureIFrames
|
|
21
|
+
((this.options.captureIFrames && !(0, utils_js_1.hasOpenreplayAttribute)(node, "obscured"))
|
|
22
|
+
|| (0, utils_js_1.hasOpenreplayAttribute)(node, "capture"))) {
|
|
22
23
|
this.handleIframe(node);
|
|
23
24
|
}
|
|
24
25
|
});
|
|
@@ -30,28 +31,28 @@ class TopObserver extends observer_js_1.default {
|
|
|
30
31
|
});
|
|
31
32
|
}
|
|
32
33
|
handleIframe(iframe) {
|
|
33
|
-
let
|
|
34
|
+
let doc = null;
|
|
34
35
|
const handle = this.app.safe(() => {
|
|
35
36
|
const id = this.app.nodes.getID(iframe);
|
|
36
37
|
if (id === undefined) {
|
|
37
38
|
return;
|
|
38
39
|
} //log
|
|
39
|
-
if (iframe.
|
|
40
|
+
if (iframe.contentDocument === doc) {
|
|
40
41
|
return;
|
|
41
|
-
} //
|
|
42
|
-
|
|
43
|
-
if (!
|
|
42
|
+
} // How frequently can it happen?
|
|
43
|
+
doc = iframe.contentDocument;
|
|
44
|
+
if (!doc || !iframe.contentWindow) {
|
|
44
45
|
return;
|
|
45
46
|
}
|
|
46
|
-
const observer = new iframe_observer_js_1.default(this.app
|
|
47
|
+
const observer = new iframe_observer_js_1.default(this.app);
|
|
47
48
|
this.iframeObservers.push(observer);
|
|
48
49
|
observer.observe(iframe);
|
|
49
50
|
});
|
|
50
|
-
|
|
51
|
+
iframe.addEventListener("load", handle); // why app.attachEventListener not working?
|
|
51
52
|
handle();
|
|
52
53
|
}
|
|
53
54
|
handleShadowRoot(shRoot) {
|
|
54
|
-
const observer = new shadow_root_observer_js_1.default(this.app
|
|
55
|
+
const observer = new shadow_root_observer_js_1.default(this.app);
|
|
55
56
|
this.shadowRootObservers.push(observer);
|
|
56
57
|
observer.observe(shRoot.host);
|
|
57
58
|
}
|
|
@@ -69,9 +70,9 @@ class TopObserver extends observer_js_1.default {
|
|
|
69
70
|
// the change in the re-player behaviour caused by CreateDocument message:
|
|
70
71
|
// the 0-node ("fRoot") will become #document rather than documentElement as it is now.
|
|
71
72
|
// Alternatively - observe(#document) then bindNode(documentElement)
|
|
72
|
-
this.observeRoot(
|
|
73
|
+
this.observeRoot(window.document, () => {
|
|
73
74
|
this.app.send(new index_js_1.CreateDocument());
|
|
74
|
-
},
|
|
75
|
+
}, window.document.documentElement);
|
|
75
76
|
}
|
|
76
77
|
disconnect() {
|
|
77
78
|
Element.prototype.attachShadow = attachShadowNativeFn;
|
package/cjs/index.js
CHANGED
|
@@ -127,7 +127,7 @@ class API {
|
|
|
127
127
|
// no-cors issue only with text/plain or not-set Content-Type
|
|
128
128
|
// req.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
|
|
129
129
|
req.send(JSON.stringify({
|
|
130
|
-
trackerVersion: '3.5.
|
|
130
|
+
trackerVersion: '3.5.5',
|
|
131
131
|
projectKey: options.projectKey,
|
|
132
132
|
doNotTrack,
|
|
133
133
|
// TODO: add precise reason (an exact API missing)
|
package/cjs/modules/input.js
CHANGED
|
@@ -29,7 +29,7 @@ const labelElementFor = utils_js_1.IN_BROWSER && 'labels' in HTMLInputElement.pr
|
|
|
29
29
|
? (node) => {
|
|
30
30
|
let p = node;
|
|
31
31
|
while ((p = p.parentNode) !== null) {
|
|
32
|
-
if (p
|
|
32
|
+
if (p instanceof HTMLLabelElement) {
|
|
33
33
|
return p;
|
|
34
34
|
}
|
|
35
35
|
}
|
|
@@ -41,7 +41,7 @@ const labelElementFor = utils_js_1.IN_BROWSER && 'labels' in HTMLInputElement.pr
|
|
|
41
41
|
: (node) => {
|
|
42
42
|
let p = node;
|
|
43
43
|
while ((p = p.parentNode) !== null) {
|
|
44
|
-
if (p
|
|
44
|
+
if (p instanceof HTMLLabelElement) {
|
|
45
45
|
return p;
|
|
46
46
|
}
|
|
47
47
|
}
|
|
@@ -57,10 +57,12 @@ function getInputLabel(node) {
|
|
|
57
57
|
let label = (0, utils_js_1.getLabelAttribute)(node);
|
|
58
58
|
if (label === null) {
|
|
59
59
|
const labelElement = labelElementFor(node);
|
|
60
|
-
label =
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
60
|
+
label = (labelElement && labelElement.innerText)
|
|
61
|
+
|| node.placeholder
|
|
62
|
+
|| node.name
|
|
63
|
+
|| node.id
|
|
64
|
+
|| node.className
|
|
65
|
+
|| node.type;
|
|
64
66
|
}
|
|
65
67
|
return (0, utils_js_1.normSpaces)(label).slice(0, 100);
|
|
66
68
|
}
|
|
@@ -145,6 +147,13 @@ function default_1(app, opts) {
|
|
|
145
147
|
if (id === undefined) {
|
|
146
148
|
return;
|
|
147
149
|
}
|
|
150
|
+
// TODO: support multiple select (?): use selectedOptions; Need send target?
|
|
151
|
+
if (node instanceof HTMLSelectElement) {
|
|
152
|
+
sendInputValue(id, node);
|
|
153
|
+
app.attachEventListener(node, "change", () => {
|
|
154
|
+
sendInputValue(id, node);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
148
157
|
if (isTextEditable(node)) {
|
|
149
158
|
inputValues.set(id, node.value);
|
|
150
159
|
sendInputValue(id, node);
|
package/cjs/modules/mouse.js
CHANGED
|
@@ -23,6 +23,17 @@ function _getSelector(target) {
|
|
|
23
23
|
} while (el !== document.body && el !== null);
|
|
24
24
|
return selector;
|
|
25
25
|
}
|
|
26
|
+
function isClickable(element) {
|
|
27
|
+
const tag = element.tagName.toUpperCase();
|
|
28
|
+
return tag === 'BUTTON' ||
|
|
29
|
+
tag === 'A' ||
|
|
30
|
+
tag === 'LI' ||
|
|
31
|
+
tag === 'SELECT' ||
|
|
32
|
+
element.onclick != null ||
|
|
33
|
+
element.getAttribute('role') === 'button';
|
|
34
|
+
//|| element.className.includes("btn")
|
|
35
|
+
// MBTODO: intersect addEventListener
|
|
36
|
+
}
|
|
26
37
|
//TODO: fix (typescript doesn't allow work when the guard is inside the function)
|
|
27
38
|
function getTarget(target) {
|
|
28
39
|
if (target instanceof Element) {
|
|
@@ -54,12 +65,7 @@ function _getTarget(target) {
|
|
|
54
65
|
if (tag === 'INPUT') {
|
|
55
66
|
return element;
|
|
56
67
|
}
|
|
57
|
-
if (
|
|
58
|
-
tag === 'A' ||
|
|
59
|
-
tag === 'LI' ||
|
|
60
|
-
tag === 'SELECT' ||
|
|
61
|
-
element.onclick != null ||
|
|
62
|
-
element.getAttribute('role') === 'button' ||
|
|
68
|
+
if (isClickable(element) ||
|
|
63
69
|
(0, utils_js_1.getLabelAttribute)(element) !== null) {
|
|
64
70
|
return element;
|
|
65
71
|
}
|
|
@@ -77,17 +83,15 @@ function default_1(app) {
|
|
|
77
83
|
if (dl !== null) {
|
|
78
84
|
return dl;
|
|
79
85
|
}
|
|
80
|
-
|
|
81
|
-
if (tag === 'INPUT') {
|
|
86
|
+
if (target instanceof HTMLInputElement) {
|
|
82
87
|
return (0, input_js_1.getInputLabel)(target);
|
|
83
88
|
}
|
|
84
|
-
if (
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
target.
|
|
90
|
-
const label = app.sanitizer.getInnerTextSecure(target);
|
|
89
|
+
if (isClickable(target)) {
|
|
90
|
+
let label = '';
|
|
91
|
+
if (target instanceof HTMLElement) {
|
|
92
|
+
label = app.sanitizer.getInnerTextSecure(target);
|
|
93
|
+
}
|
|
94
|
+
label = label || target.id || target.className;
|
|
91
95
|
return (0, utils_js_1.normSpaces)(label).slice(0, 100);
|
|
92
96
|
}
|
|
93
97
|
return '';
|
package/cjs/modules/scroll.js
CHANGED
|
@@ -22,6 +22,11 @@ function default_1(app) {
|
|
|
22
22
|
documentScroll = false;
|
|
23
23
|
nodeScroll.clear();
|
|
24
24
|
});
|
|
25
|
+
app.nodes.attachNodeCallback(node => {
|
|
26
|
+
if (node instanceof Element && node.scrollLeft + node.scrollTop > 0) {
|
|
27
|
+
nodeScroll.set(node, [node.scrollLeft, node.scrollTop]);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
25
30
|
app.attachEventListener(window, 'scroll', (e) => {
|
|
26
31
|
const target = e.target;
|
|
27
32
|
if (target === document) {
|
|
@@ -29,9 +34,7 @@ function default_1(app) {
|
|
|
29
34
|
return;
|
|
30
35
|
}
|
|
31
36
|
if (target instanceof Element) {
|
|
32
|
-
|
|
33
|
-
nodeScroll.set(target, [target.scrollLeft, target.scrollTop]);
|
|
34
|
-
}
|
|
37
|
+
nodeScroll.set(target, [target.scrollLeft, target.scrollTop]);
|
|
35
38
|
}
|
|
36
39
|
});
|
|
37
40
|
app.ticker.attach(() => {
|
package/lib/app/context.js
CHANGED
|
@@ -9,35 +9,58 @@ export function isInstance(node, constr) {
|
|
|
9
9
|
// @ts-ignore (for EI, Safary)
|
|
10
10
|
doc.parentWindow ||
|
|
11
11
|
doc.defaultView; // TODO: smart global typing for Window object
|
|
12
|
-
while (context
|
|
12
|
+
while (context !== window) {
|
|
13
13
|
// @ts-ignore
|
|
14
14
|
if (node instanceof context[constr.name]) {
|
|
15
15
|
return true;
|
|
16
16
|
}
|
|
17
17
|
// @ts-ignore
|
|
18
|
-
context = context.parent;
|
|
18
|
+
context = context.parent || window;
|
|
19
19
|
}
|
|
20
20
|
// @ts-ignore
|
|
21
21
|
return node instanceof context[constr.name];
|
|
22
22
|
}
|
|
23
|
+
// TODO: ensure 1. it works in every cases (iframes/detached nodes) and 2. the most efficient
|
|
23
24
|
export function inDocument(node) {
|
|
24
25
|
const doc = node.ownerDocument;
|
|
25
26
|
if (!doc) {
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
if (doc.contains(node)) {
|
|
29
27
|
return true;
|
|
30
|
-
}
|
|
31
|
-
let
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
doc.defaultView;
|
|
35
|
-
while (context.parent && context.parent !== context) {
|
|
36
|
-
if (context.document.contains(node)) {
|
|
28
|
+
} // Document
|
|
29
|
+
let current = node;
|
|
30
|
+
while (current) {
|
|
31
|
+
if (current === doc) {
|
|
37
32
|
return true;
|
|
38
33
|
}
|
|
39
|
-
|
|
40
|
-
|
|
34
|
+
else if (isInstance(current, ShadowRoot)) {
|
|
35
|
+
current = current.host;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
current = current.parentNode;
|
|
39
|
+
}
|
|
41
40
|
}
|
|
42
41
|
return false;
|
|
43
42
|
}
|
|
43
|
+
// export function inDocument(node: Node): boolean {
|
|
44
|
+
// // @ts-ignore compatability
|
|
45
|
+
// if (node.getRootNode) {
|
|
46
|
+
// let root: Node
|
|
47
|
+
// while ((root = node.getRootNode()) !== node) {
|
|
48
|
+
// ////
|
|
49
|
+
// }
|
|
50
|
+
// }
|
|
51
|
+
// const doc = node.ownerDocument
|
|
52
|
+
// if (!doc) { return false }
|
|
53
|
+
// if (doc.contains(node)) { return true }
|
|
54
|
+
// let context: Window =
|
|
55
|
+
// // @ts-ignore (for EI, Safary)
|
|
56
|
+
// doc.parentWindow ||
|
|
57
|
+
// doc.defaultView;
|
|
58
|
+
// while(context.parent && context.parent !== context) {
|
|
59
|
+
// if (context.document.contains(node)) {
|
|
60
|
+
// return true
|
|
61
|
+
// }
|
|
62
|
+
// // @ts-ignore
|
|
63
|
+
// context = context.parent
|
|
64
|
+
// }
|
|
65
|
+
// return false;
|
|
66
|
+
// }
|
package/lib/app/index.js
CHANGED
|
@@ -26,7 +26,7 @@ export default class App {
|
|
|
26
26
|
this.stopCallbacks = [];
|
|
27
27
|
this.commitCallbacks = [];
|
|
28
28
|
this.activityState = ActivityState.NotActive;
|
|
29
|
-
this.version = '3.5.
|
|
29
|
+
this.version = '3.5.5'; // TODO: version compatability check inside each plugin.
|
|
30
30
|
this.preStartMessages = [];
|
|
31
31
|
this.projectKey = projectKey;
|
|
32
32
|
this.options = Object.assign({
|
|
@@ -55,7 +55,7 @@ export default class App {
|
|
|
55
55
|
this.notify = new Logger(this.options.verbose ? LogLevel.Warnings : LogLevel.Silent);
|
|
56
56
|
this.session = new Session(this);
|
|
57
57
|
try {
|
|
58
|
-
this.worker = new Worker(URL.createObjectURL(new Blob([`"use strict";function t(t){function s(...s){return new t(...s)}return s.prototype=t.prototype,s}const s=new Map;const i=t(class{constructor(t,s,i){this.pageNo=t,this.firstIndex=s,this.timestamp=i,this._id=80}encode(t){return t.uint(80)&&t.uint(this.pageNo)&&t.uint(this.firstIndex)&&t.int(this.timestamp)}});s.set(80,i);const n=t(class{constructor(t){this.timestamp=t,this._id=0}encode(t){return t.uint(0)&&t.uint(this.timestamp)}});s.set(0,n);const e=t(class{constructor(t,s,i){this.url=t,this.referrer=s,this.navigationStart=i,this._id=4}encode(t){return t.uint(4)&&t.string(this.url)&&t.string(this.referrer)&&t.uint(this.navigationStart)}});s.set(4,e);const r=t(class{constructor(t,s){this.width=t,this.height=s,this._id=5}encode(t){return t.uint(5)&&t.uint(this.width)&&t.uint(this.height)}});s.set(5,r);const o=t(class{constructor(t,s){this.x=t,this.y=s,this._id=6}encode(t){return t.uint(6)&&t.int(this.x)&&t.int(this.y)}});s.set(6,o);const h=t(class{constructor(){this._id=7}encode(t){return t.uint(7)}});s.set(7,h);const c=t(class{constructor(t,s,i,n,e){this.id=t,this.parentID=s,this.index=i,this.tag=n,this.svg=e,this._id=8}encode(t){return t.uint(8)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)&&t.string(this.tag)&&t.boolean(this.svg)}});s.set(8,c);const u=t(class{constructor(t,s,i){this.id=t,this.parentID=s,this.index=i,this._id=9}encode(t){return t.uint(9)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});s.set(9,u);const a=t(class{constructor(t,s,i){this.id=t,this.parentID=s,this.index=i,this._id=10}encode(t){return t.uint(10)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});s.set(10,a);const d=t(class{constructor(t){this.id=t,this._id=11}encode(t){return t.uint(11)&&t.uint(this.id)}});s.set(11,d);const l=t(class{constructor(t,s,i){this.id=t,this.name=s,this.value=i,this._id=12}encode(t){return t.uint(12)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)}});s.set(12,l);const g=t(class{constructor(t,s){this.id=t,this.name=s,this._id=13}encode(t){return t.uint(13)&&t.uint(this.id)&&t.string(this.name)}});s.set(13,g);const f=t(class{constructor(t,s){this.id=t,this.data=s,this._id=14}encode(t){return t.uint(14)&&t.uint(this.id)&&t.string(this.data)}});s.set(14,f);const p=t(class{constructor(t,s,i){this.id=t,this.x=s,this.y=i,this._id=16}encode(t){return t.uint(16)&&t.uint(this.id)&&t.int(this.x)&&t.int(this.y)}});s.set(16,p);const m=t(class{constructor(t,s){this.id=t,this.label=s,this._id=17}encode(t){return t.uint(17)&&t.uint(this.id)&&t.string(this.label)}});s.set(17,m);const _=t(class{constructor(t,s,i){this.id=t,this.value=s,this.mask=i,this._id=18}encode(t){return t.uint(18)&&t.uint(this.id)&&t.string(this.value)&&t.int(this.mask)}});s.set(18,_);const y=t(class{constructor(t,s){this.id=t,this.checked=s,this._id=19}encode(t){return t.uint(19)&&t.uint(this.id)&&t.boolean(this.checked)}});s.set(19,y);const v=t(class{constructor(t,s){this.x=t,this.y=s,this._id=20}encode(t){return t.uint(20)&&t.uint(this.x)&&t.uint(this.y)}});s.set(20,v);const S=t(class{constructor(t,s){this.level=t,this.value=s,this._id=22}encode(t){return t.uint(22)&&t.string(this.level)&&t.string(this.value)}});s.set(22,S);const b=t(class{constructor(t,s,i,n,e,r,o,h,c){this.requestStart=t,this.responseStart=s,this.responseEnd=i,this.domContentLoadedEventStart=n,this.domContentLoadedEventEnd=e,this.loadEventStart=r,this.loadEventEnd=o,this.firstPaint=h,this.firstContentfulPaint=c,this._id=23}encode(t){return t.uint(23)&&t.uint(this.requestStart)&&t.uint(this.responseStart)&&t.uint(this.responseEnd)&&t.uint(this.domContentLoadedEventStart)&&t.uint(this.domContentLoadedEventEnd)&&t.uint(this.loadEventStart)&&t.uint(this.loadEventEnd)&&t.uint(this.firstPaint)&&t.uint(this.firstContentfulPaint)}});s.set(23,b);const x=t(class{constructor(t,s,i){this.speedIndex=t,this.visuallyComplete=s,this.timeToInteractive=i,this._id=24}encode(t){return t.uint(24)&&t.uint(this.speedIndex)&&t.uint(this.visuallyComplete)&&t.uint(this.timeToInteractive)}});s.set(24,x);const E=t(class{constructor(t,s,i){this.name=t,this.message=s,this.payload=i,this._id=25}encode(t){return t.uint(25)&&t.string(this.name)&&t.string(this.message)&&t.string(this.payload)}});s.set(25,E);const k=t(class{constructor(t,s){this.name=t,this.payload=s,this._id=27}encode(t){return t.uint(27)&&t.string(this.name)&&t.string(this.payload)}});s.set(27,k);const I=t(class{constructor(t){this.id=t,this._id=28}encode(t){return t.uint(28)&&t.string(this.id)}});s.set(28,I);const z=t(class{constructor(t){this.id=t,this._id=29}encode(t){return t.uint(29)&&t.string(this.id)}});s.set(29,z);const w=t(class{constructor(t,s){this.key=t,this.value=s,this._id=30}encode(t){return t.uint(30)&&t.string(this.key)&&t.string(this.value)}});s.set(30,w);const T=t(class{constructor(t,s,i){this.id=t,this.rule=s,this.index=i,this._id=37}encode(t){return t.uint(37)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)}});s.set(37,T);const L=t(class{constructor(t,s){this.id=t,this.index=s,this._id=38}encode(t){return t.uint(38)&&t.uint(this.id)&&t.uint(this.index)}});s.set(38,L);const A=t(class{constructor(t,s,i,n,e,r,o){this.method=t,this.url=s,this.request=i,this.response=n,this.status=e,this.timestamp=r,this.duration=o,this._id=39}encode(t){return t.uint(39)&&t.string(this.method)&&t.string(this.url)&&t.string(this.request)&&t.string(this.response)&&t.uint(this.status)&&t.uint(this.timestamp)&&t.uint(this.duration)}});s.set(39,A);const C=t(class{constructor(t,s,i,n){this.name=t,this.duration=s,this.args=i,this.result=n,this._id=40}encode(t){return t.uint(40)&&t.string(this.name)&&t.uint(this.duration)&&t.string(this.args)&&t.string(this.result)}});s.set(40,C);const M=t(class{constructor(t,s){this.key=t,this.value=s,this._id=41}encode(t){return t.uint(41)&&t.string(this.key)&&t.string(this.value)}});s.set(41,M);const R=t(class{constructor(t){this.type=t,this._id=42}encode(t){return t.uint(42)&&t.string(this.type)}});s.set(42,R);const N=t(class{constructor(t,s,i){this.action=t,this.state=s,this.duration=i,this._id=44}encode(t){return t.uint(44)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});s.set(44,N);const D=t(class{constructor(t,s){this.mutation=t,this.state=s,this._id=45}encode(t){return t.uint(45)&&t.string(this.mutation)&&t.string(this.state)}});s.set(45,D);const U=t(class{constructor(t,s){this.type=t,this.payload=s,this._id=46}encode(t){return t.uint(46)&&t.string(this.type)&&t.string(this.payload)}});s.set(46,U);const O=t(class{constructor(t,s,i){this.action=t,this.state=s,this.duration=i,this._id=47}encode(t){return t.uint(47)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});s.set(47,O);const q=t(class{constructor(t,s,i,n){this.operationKind=t,this.operationName=s,this.variables=i,this.response=n,this._id=48}encode(t){return t.uint(48)&&t.string(this.operationKind)&&t.string(this.operationName)&&t.string(this.variables)&&t.string(this.response)}});s.set(48,q);const H=t(class{constructor(t,s,i,n){this.frames=t,this.ticks=s,this.totalJSHeapSize=i,this.usedJSHeapSize=n,this._id=49}encode(t){return t.uint(49)&&t.int(this.frames)&&t.int(this.ticks)&&t.uint(this.totalJSHeapSize)&&t.uint(this.usedJSHeapSize)}});s.set(49,H);const P=t(class{constructor(t,s,i,n,e,r,o,h){this.timestamp=t,this.duration=s,this.ttfb=i,this.headerSize=n,this.encodedBodySize=e,this.decodedBodySize=r,this.url=o,this.initiator=h,this._id=53}encode(t){return t.uint(53)&&t.uint(this.timestamp)&&t.uint(this.duration)&&t.uint(this.ttfb)&&t.uint(this.headerSize)&&t.uint(this.encodedBodySize)&&t.uint(this.decodedBodySize)&&t.string(this.url)&&t.string(this.initiator)}});s.set(53,P);const B=t(class{constructor(t,s){this.downlink=t,this.type=s,this._id=54}encode(t){return t.uint(54)&&t.uint(this.downlink)&&t.string(this.type)}});s.set(54,B);const J=t(class{constructor(t){this.hidden=t,this._id=55}encode(t){return t.uint(55)&&t.boolean(this.hidden)}});s.set(55,J);const j=t(class{constructor(t,s,i,n,e,r,o){this.timestamp=t,this.duration=s,this.context=i,this.containerType=n,this.containerSrc=e,this.containerId=r,this.containerName=o,this._id=59}encode(t){return t.uint(59)&&t.uint(this.timestamp)&&t.uint(this.duration)&&t.uint(this.context)&&t.uint(this.containerType)&&t.string(this.containerSrc)&&t.string(this.containerId)&&t.string(this.containerName)}});s.set(59,j);const G=t(class{constructor(t,s,i,n){this.id=t,this.name=s,this.value=i,this.baseURL=n,this._id=60}encode(t){return t.uint(60)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)&&t.string(this.baseURL)}});s.set(60,G);const K=t(class{constructor(t,s,i){this.id=t,this.data=s,this.baseURL=i,this._id=61}encode(t){return t.uint(61)&&t.uint(this.id)&&t.string(this.data)&&t.string(this.baseURL)}});s.set(61,K);const X=t(class{constructor(t,s){this.type=t,this.value=s,this._id=63}encode(t){return t.uint(63)&&t.string(this.type)&&t.string(this.value)}});s.set(63,X);const F=t(class{constructor(t,s){this.name=t,this.payload=s,this._id=64}encode(t){return t.uint(64)&&t.string(this.name)&&t.string(this.payload)}});s.set(64,F);const Q=t(class{constructor(){this._id=65}encode(t){return t.uint(65)}});s.set(65,Q);const V=t(class{constructor(t,s,i,n){this.id=t,this.rule=s,this.index=i,this.baseURL=n,this._id=67}encode(t){return t.uint(67)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)&&t.string(this.baseURL)}});s.set(67,V);const W=t(class{constructor(t,s,i,n){this.id=t,this.hesitationTime=s,this.label=i,this.selector=n,this._id=69}encode(t){return t.uint(69)&&t.uint(this.id)&&t.uint(this.hesitationTime)&&t.string(this.label)&&t.string(this.selector)}});s.set(69,W);const Y=t(class{constructor(t,s){this.frameID=t,this.id=s,this._id=70}encode(t){return t.uint(70)&&t.uint(this.frameID)&&t.uint(this.id)}});s.set(70,Y);const Z="function"==typeof TextEncoder?new TextEncoder:{encode(t){const s=t.length,i=new Uint8Array(3*s);let n=-1;for(var e=0,r=0,o=0;o!==s;){if(e=t.charCodeAt(o),o+=1,e>=55296&&e<=56319){if(o===s){i[n+=1]=239,i[n+=1]=191,i[n+=1]=189;break}if(!((r=t.charCodeAt(o))>=56320&&r<=57343)){i[n+=1]=239,i[n+=1]=191,i[n+=1]=189;continue}if(o+=1,(e=1024*(e-55296)+r-56320+65536)>65535){i[n+=1]=240|e>>>18,i[n+=1]=128|e>>>12&63,i[n+=1]=128|e>>>6&63,i[n+=1]=128|63&e;continue}}e<=127?i[n+=1]=0|e:e<=2047?(i[n+=1]=192|e>>>6,i[n+=1]=128|63&e):(i[n+=1]=224|e>>>12,i[n+=1]=128|e>>>6&63,i[n+=1]=128|63&e)}return i.subarray(0,n+1)}};class tt{constructor(t){this.size=t,this.offset=0,this.checkpointOffset=0,this.data=new Uint8Array(t)}checkpoint(){this.checkpointOffset=this.offset}isEmpty(){return 0===this.offset}boolean(t){return this.data[this.offset++]=+t,this.offset<=this.size}uint(t){for((t<0||t>Number.MAX_SAFE_INTEGER)&&(t=0);t>=128;)this.data[this.offset++]=t%256|128,t=Math.floor(t/128);return this.data[this.offset++]=t,this.offset<=this.size}int(t){return t=Math.round(t),this.uint(t>=0?2*t:-2*t-1)}string(t){const s=Z.encode(t),i=s.byteLength;return!(!this.uint(i)||this.offset+i>this.size)&&(this.data.set(s,this.offset),this.offset+=i,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}let st=1e6,it=2e5,nt=new tt(it),et="",rt="",ot=0,ht=0,ct=0,ut=0,at=!0;function dt(){return new i(ot,ut,ht).encode(nt)}let lt=null;const gt=[];let ft,pt=!1,mt=0,_t=8e3,yt=10;function vt(){if(at||""===rt||""===et)return;const t=nt.flush();pt?gt.push(t):(pt=!0,function t(s){const i=new XMLHttpRequest;i.open("POST",et+"/v1/web/i",!1),i.setRequestHeader("Authorization","Bearer "+rt),i.onreadystatechange=function(){if(4===this.readyState){if(0==this.status)return;if(this.status>=400)return pt=!1,St(),gt.length=0,401===this.status?void self.postMessage("restart"):void self.postMessage(null);const s=gt.shift();s?t(s):pt=!1}},i.onerror=function(i){if(mt>=yt)return St(),void self.postMessage(null);mt++,setTimeout(()=>t(s),_t)},i.send(s.buffer)}(t)),at=!0,dt()}function St(){et="",rt="",null!==lt&&(clearInterval(lt),lt=null),nt.reset()}self.onmessage=({data:t})=>{if(null!==t)return"stop"===t?(vt(),void St()):Array.isArray(t)?void t.forEach(t=>{const i=new(s.get(t._id));if(Object.assign(i,t),i instanceof n?ht=i.timestamp:i instanceof J&&(i.hidden?ft=setTimeout(()=>self.postMessage("restart"),18e5):clearTimeout(ft)),nt.checkpoint(),!i.encode(nt)&&(vt(),!i.encode(nt)))for(;!i.encode(nt);){if(it===st)return console.warn("OpenReplay: beacon size overflow."),nt.reset(),void dt();it=Math.min(2*it,st),nt=new tt(it),dt()}ut++,at=!1}):(et=t.ingestPoint||et,rt=t.token||rt,ot=t.pageNo||ot,ht=t.startTimestamp||ht,ct=t.timeAdjustment||ct,yt=t.connAttemptCount||yt,_t=t.connAttemptGap||_t,st=t.beaconSizeLimit||st,it=Math.min(st,t.beaconSize||it),nt.isEmpty()&&dt(),void(null===lt&&(lt=setInterval(vt,1e4))));vt()};
|
|
58
|
+
this.worker = new Worker(URL.createObjectURL(new Blob([`"use strict";function t(t){function s(...s){return new t(...s)}return s.prototype=t.prototype,s}const s=new Map;const i=t(class{constructor(t,s,i){this.pageNo=t,this.firstIndex=s,this.timestamp=i,this._id=80}encode(t){return t.uint(80)&&t.uint(this.pageNo)&&t.uint(this.firstIndex)&&t.int(this.timestamp)}});s.set(80,i);const n=t(class{constructor(t){this.timestamp=t,this._id=0}encode(t){return t.uint(0)&&t.uint(this.timestamp)}});s.set(0,n);const e=t(class{constructor(t,s,i){this.url=t,this.referrer=s,this.navigationStart=i,this._id=4}encode(t){return t.uint(4)&&t.string(this.url)&&t.string(this.referrer)&&t.uint(this.navigationStart)}});s.set(4,e);const r=t(class{constructor(t,s){this.width=t,this.height=s,this._id=5}encode(t){return t.uint(5)&&t.uint(this.width)&&t.uint(this.height)}});s.set(5,r);const o=t(class{constructor(t,s){this.x=t,this.y=s,this._id=6}encode(t){return t.uint(6)&&t.int(this.x)&&t.int(this.y)}});s.set(6,o);const h=t(class{constructor(){this._id=7}encode(t){return t.uint(7)}});s.set(7,h);const c=t(class{constructor(t,s,i,n,e){this.id=t,this.parentID=s,this.index=i,this.tag=n,this.svg=e,this._id=8}encode(t){return t.uint(8)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)&&t.string(this.tag)&&t.boolean(this.svg)}});s.set(8,c);const u=t(class{constructor(t,s,i){this.id=t,this.parentID=s,this.index=i,this._id=9}encode(t){return t.uint(9)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});s.set(9,u);const a=t(class{constructor(t,s,i){this.id=t,this.parentID=s,this.index=i,this._id=10}encode(t){return t.uint(10)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});s.set(10,a);const d=t(class{constructor(t){this.id=t,this._id=11}encode(t){return t.uint(11)&&t.uint(this.id)}});s.set(11,d);const l=t(class{constructor(t,s,i){this.id=t,this.name=s,this.value=i,this._id=12}encode(t){return t.uint(12)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)}});s.set(12,l);const g=t(class{constructor(t,s){this.id=t,this.name=s,this._id=13}encode(t){return t.uint(13)&&t.uint(this.id)&&t.string(this.name)}});s.set(13,g);const f=t(class{constructor(t,s){this.id=t,this.data=s,this._id=14}encode(t){return t.uint(14)&&t.uint(this.id)&&t.string(this.data)}});s.set(14,f);const p=t(class{constructor(t,s,i){this.id=t,this.x=s,this.y=i,this._id=16}encode(t){return t.uint(16)&&t.uint(this.id)&&t.int(this.x)&&t.int(this.y)}});s.set(16,p);const m=t(class{constructor(t,s){this.id=t,this.label=s,this._id=17}encode(t){return t.uint(17)&&t.uint(this.id)&&t.string(this.label)}});s.set(17,m);const _=t(class{constructor(t,s,i){this.id=t,this.value=s,this.mask=i,this._id=18}encode(t){return t.uint(18)&&t.uint(this.id)&&t.string(this.value)&&t.int(this.mask)}});s.set(18,_);const y=t(class{constructor(t,s){this.id=t,this.checked=s,this._id=19}encode(t){return t.uint(19)&&t.uint(this.id)&&t.boolean(this.checked)}});s.set(19,y);const v=t(class{constructor(t,s){this.x=t,this.y=s,this._id=20}encode(t){return t.uint(20)&&t.uint(this.x)&&t.uint(this.y)}});s.set(20,v);const S=t(class{constructor(t,s){this.level=t,this.value=s,this._id=22}encode(t){return t.uint(22)&&t.string(this.level)&&t.string(this.value)}});s.set(22,S);const b=t(class{constructor(t,s,i,n,e,r,o,h,c){this.requestStart=t,this.responseStart=s,this.responseEnd=i,this.domContentLoadedEventStart=n,this.domContentLoadedEventEnd=e,this.loadEventStart=r,this.loadEventEnd=o,this.firstPaint=h,this.firstContentfulPaint=c,this._id=23}encode(t){return t.uint(23)&&t.uint(this.requestStart)&&t.uint(this.responseStart)&&t.uint(this.responseEnd)&&t.uint(this.domContentLoadedEventStart)&&t.uint(this.domContentLoadedEventEnd)&&t.uint(this.loadEventStart)&&t.uint(this.loadEventEnd)&&t.uint(this.firstPaint)&&t.uint(this.firstContentfulPaint)}});s.set(23,b);const x=t(class{constructor(t,s,i){this.speedIndex=t,this.visuallyComplete=s,this.timeToInteractive=i,this._id=24}encode(t){return t.uint(24)&&t.uint(this.speedIndex)&&t.uint(this.visuallyComplete)&&t.uint(this.timeToInteractive)}});s.set(24,x);const E=t(class{constructor(t,s,i){this.name=t,this.message=s,this.payload=i,this._id=25}encode(t){return t.uint(25)&&t.string(this.name)&&t.string(this.message)&&t.string(this.payload)}});s.set(25,E);const k=t(class{constructor(t,s){this.name=t,this.payload=s,this._id=27}encode(t){return t.uint(27)&&t.string(this.name)&&t.string(this.payload)}});s.set(27,k);const I=t(class{constructor(t){this.id=t,this._id=28}encode(t){return t.uint(28)&&t.string(this.id)}});s.set(28,I);const z=t(class{constructor(t){this.id=t,this._id=29}encode(t){return t.uint(29)&&t.string(this.id)}});s.set(29,z);const w=t(class{constructor(t,s){this.key=t,this.value=s,this._id=30}encode(t){return t.uint(30)&&t.string(this.key)&&t.string(this.value)}});s.set(30,w);const T=t(class{constructor(t,s,i){this.id=t,this.rule=s,this.index=i,this._id=37}encode(t){return t.uint(37)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)}});s.set(37,T);const L=t(class{constructor(t,s){this.id=t,this.index=s,this._id=38}encode(t){return t.uint(38)&&t.uint(this.id)&&t.uint(this.index)}});s.set(38,L);const A=t(class{constructor(t,s,i,n,e,r,o){this.method=t,this.url=s,this.request=i,this.response=n,this.status=e,this.timestamp=r,this.duration=o,this._id=39}encode(t){return t.uint(39)&&t.string(this.method)&&t.string(this.url)&&t.string(this.request)&&t.string(this.response)&&t.uint(this.status)&&t.uint(this.timestamp)&&t.uint(this.duration)}});s.set(39,A);const C=t(class{constructor(t,s,i,n){this.name=t,this.duration=s,this.args=i,this.result=n,this._id=40}encode(t){return t.uint(40)&&t.string(this.name)&&t.uint(this.duration)&&t.string(this.args)&&t.string(this.result)}});s.set(40,C);const M=t(class{constructor(t,s){this.key=t,this.value=s,this._id=41}encode(t){return t.uint(41)&&t.string(this.key)&&t.string(this.value)}});s.set(41,M);const R=t(class{constructor(t){this.type=t,this._id=42}encode(t){return t.uint(42)&&t.string(this.type)}});s.set(42,R);const N=t(class{constructor(t,s,i){this.action=t,this.state=s,this.duration=i,this._id=44}encode(t){return t.uint(44)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});s.set(44,N);const D=t(class{constructor(t,s){this.mutation=t,this.state=s,this._id=45}encode(t){return t.uint(45)&&t.string(this.mutation)&&t.string(this.state)}});s.set(45,D);const U=t(class{constructor(t,s){this.type=t,this.payload=s,this._id=46}encode(t){return t.uint(46)&&t.string(this.type)&&t.string(this.payload)}});s.set(46,U);const O=t(class{constructor(t,s,i){this.action=t,this.state=s,this.duration=i,this._id=47}encode(t){return t.uint(47)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});s.set(47,O);const q=t(class{constructor(t,s,i,n){this.operationKind=t,this.operationName=s,this.variables=i,this.response=n,this._id=48}encode(t){return t.uint(48)&&t.string(this.operationKind)&&t.string(this.operationName)&&t.string(this.variables)&&t.string(this.response)}});s.set(48,q);const H=t(class{constructor(t,s,i,n){this.frames=t,this.ticks=s,this.totalJSHeapSize=i,this.usedJSHeapSize=n,this._id=49}encode(t){return t.uint(49)&&t.int(this.frames)&&t.int(this.ticks)&&t.uint(this.totalJSHeapSize)&&t.uint(this.usedJSHeapSize)}});s.set(49,H);const P=t(class{constructor(t,s,i,n,e,r,o,h){this.timestamp=t,this.duration=s,this.ttfb=i,this.headerSize=n,this.encodedBodySize=e,this.decodedBodySize=r,this.url=o,this.initiator=h,this._id=53}encode(t){return t.uint(53)&&t.uint(this.timestamp)&&t.uint(this.duration)&&t.uint(this.ttfb)&&t.uint(this.headerSize)&&t.uint(this.encodedBodySize)&&t.uint(this.decodedBodySize)&&t.string(this.url)&&t.string(this.initiator)}});s.set(53,P);const B=t(class{constructor(t,s){this.downlink=t,this.type=s,this._id=54}encode(t){return t.uint(54)&&t.uint(this.downlink)&&t.string(this.type)}});s.set(54,B);const J=t(class{constructor(t){this.hidden=t,this._id=55}encode(t){return t.uint(55)&&t.boolean(this.hidden)}});s.set(55,J);const j=t(class{constructor(t,s,i,n,e,r,o){this.timestamp=t,this.duration=s,this.context=i,this.containerType=n,this.containerSrc=e,this.containerId=r,this.containerName=o,this._id=59}encode(t){return t.uint(59)&&t.uint(this.timestamp)&&t.uint(this.duration)&&t.uint(this.context)&&t.uint(this.containerType)&&t.string(this.containerSrc)&&t.string(this.containerId)&&t.string(this.containerName)}});s.set(59,j);const G=t(class{constructor(t,s,i,n){this.id=t,this.name=s,this.value=i,this.baseURL=n,this._id=60}encode(t){return t.uint(60)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)&&t.string(this.baseURL)}});s.set(60,G);const K=t(class{constructor(t,s,i){this.id=t,this.data=s,this.baseURL=i,this._id=61}encode(t){return t.uint(61)&&t.uint(this.id)&&t.string(this.data)&&t.string(this.baseURL)}});s.set(61,K);const X=t(class{constructor(t,s){this.type=t,this.value=s,this._id=63}encode(t){return t.uint(63)&&t.string(this.type)&&t.string(this.value)}});s.set(63,X);const F=t(class{constructor(t,s){this.name=t,this.payload=s,this._id=64}encode(t){return t.uint(64)&&t.string(this.name)&&t.string(this.payload)}});s.set(64,F);const Q=t(class{constructor(){this._id=65}encode(t){return t.uint(65)}});s.set(65,Q);const V=t(class{constructor(t,s,i,n){this.id=t,this.rule=s,this.index=i,this.baseURL=n,this._id=67}encode(t){return t.uint(67)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)&&t.string(this.baseURL)}});s.set(67,V);const W=t(class{constructor(t,s,i,n){this.id=t,this.hesitationTime=s,this.label=i,this.selector=n,this._id=69}encode(t){return t.uint(69)&&t.uint(this.id)&&t.uint(this.hesitationTime)&&t.string(this.label)&&t.string(this.selector)}});s.set(69,W);const Y=t(class{constructor(t,s){this.frameID=t,this.id=s,this._id=70}encode(t){return t.uint(70)&&t.uint(this.frameID)&&t.uint(this.id)}});s.set(70,Y);const Z="function"==typeof TextEncoder?new TextEncoder:{encode(t){const s=t.length,i=new Uint8Array(3*s);let n=-1;for(var e=0,r=0,o=0;o!==s;){if(e=t.charCodeAt(o),o+=1,e>=55296&&e<=56319){if(o===s){i[n+=1]=239,i[n+=1]=191,i[n+=1]=189;break}if(!((r=t.charCodeAt(o))>=56320&&r<=57343)){i[n+=1]=239,i[n+=1]=191,i[n+=1]=189;continue}if(o+=1,(e=1024*(e-55296)+r-56320+65536)>65535){i[n+=1]=240|e>>>18,i[n+=1]=128|e>>>12&63,i[n+=1]=128|e>>>6&63,i[n+=1]=128|63&e;continue}}e<=127?i[n+=1]=0|e:e<=2047?(i[n+=1]=192|e>>>6,i[n+=1]=128|63&e):(i[n+=1]=224|e>>>12,i[n+=1]=128|e>>>6&63,i[n+=1]=128|63&e)}return i.subarray(0,n+1)}};class tt{constructor(t){this.size=t,this.offset=0,this.checkpointOffset=0,this.data=new Uint8Array(t)}checkpoint(){this.checkpointOffset=this.offset}isEmpty(){return 0===this.offset}boolean(t){return this.data[this.offset++]=+t,this.offset<=this.size}uint(t){for((t<0||t>Number.MAX_SAFE_INTEGER)&&(t=0);t>=128;)this.data[this.offset++]=t%256|128,t=Math.floor(t/128);return this.data[this.offset++]=t,this.offset<=this.size}int(t){return t=Math.round(t),this.uint(t>=0?2*t:-2*t-1)}string(t){const s=Z.encode(t),i=s.byteLength;return!(!this.uint(i)||this.offset+i>this.size)&&(this.data.set(s,this.offset),this.offset+=i,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}let st=1e6,it=2e5,nt=new tt(it),et="",rt="",ot=0,ht=0,ct=0,ut=0,at=!0;function dt(){return new i(ot,ut,ht).encode(nt)}let lt=null;const gt=[];let ft,pt=!1,mt=0,_t=3e3,yt=10;function vt(){if(at||""===rt||""===et)return;const t=nt.flush();pt?gt.push(t):(pt=!0,function t(s){const i=new XMLHttpRequest;function n(){if(mt>=yt)return St(),void self.postMessage(null);mt++,setTimeout(()=>t(s),_t)}i.open("POST",et+"/v1/web/i",!1),i.setRequestHeader("Authorization","Bearer "+rt),i.onreadystatechange=function(){if(4===this.readyState){if(0==this.status)return;if(401===this.status)return pt=!1,void self.postMessage("restart");if(this.status>=400)return void n();mt=0;const s=gt.shift();s?t(s):pt=!1}},i.onerror=n,i.send(s.buffer)}(t)),at=!0,dt()}function St(){et="",rt="",null!==lt&&(clearInterval(lt),lt=null),gt.length=0,nt.reset()}self.onmessage=({data:t})=>{if(null!==t)return"stop"===t?(vt(),void St()):Array.isArray(t)?void t.forEach(t=>{const i=new(s.get(t._id));if(Object.assign(i,t),i instanceof n?ht=i.timestamp:i instanceof J&&(i.hidden?ft=setTimeout(()=>self.postMessage("restart"),18e5):clearTimeout(ft)),nt.checkpoint(),!i.encode(nt)&&(vt(),!i.encode(nt)))for(;!i.encode(nt);){if(it===st)return console.warn("OpenReplay: beacon size overflow."),nt.reset(),void dt();it=Math.min(2*it,st),nt=new tt(it),dt()}ut++,at=!1}):(et=t.ingestPoint||et,rt=t.token||rt,ot=t.pageNo||ot,ht=t.startTimestamp||ht,ct=t.timeAdjustment||ct,yt=t.connAttemptCount||yt,_t=t.connAttemptGap||_t,st=t.beaconSizeLimit||st,it=Math.min(st,t.beaconSize||it),nt.isEmpty()&&dt(),void(null===lt&&(lt=setInterval(vt,1e4))));vt()};
|
|
59
59
|
`], { type: 'text/javascript' })));
|
|
60
60
|
this.worker.onerror = e => {
|
|
61
61
|
this._debug("webworker_error", e);
|
|
@@ -151,10 +151,11 @@ export default class App {
|
|
|
151
151
|
this.attachStartCallback(() => target.addEventListener(type, listener, useCapture));
|
|
152
152
|
this.attachStopCallback(() => target.removeEventListener(type, listener, useCapture));
|
|
153
153
|
}
|
|
154
|
+
// TODO: full correct semantic
|
|
154
155
|
checkRequiredVersion(version) {
|
|
155
156
|
const reqVer = version.split('.');
|
|
156
157
|
const ver = this.version.split('.');
|
|
157
|
-
for (let i = 0; i <
|
|
158
|
+
for (let i = 0; i < 3; i++) {
|
|
158
159
|
if (Number(ver[i]) < Number(reqVer[i]) || isNaN(Number(ver[i])) || isNaN(Number(reqVer[i]))) {
|
|
159
160
|
return false;
|
|
160
161
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import App from "../index.js";
|
|
2
2
|
export default abstract class Observer {
|
|
3
3
|
protected readonly app: App;
|
|
4
|
-
protected readonly
|
|
4
|
+
protected readonly isTopContext: boolean;
|
|
5
5
|
private readonly observer;
|
|
6
6
|
private readonly commited;
|
|
7
7
|
private readonly recents;
|
|
@@ -9,8 +9,7 @@ export default abstract class Observer {
|
|
|
9
9
|
private readonly indexes;
|
|
10
10
|
private readonly attributesList;
|
|
11
11
|
private readonly textSet;
|
|
12
|
-
|
|
13
|
-
constructor(app: App, context?: Window);
|
|
12
|
+
constructor(app: App, isTopContext?: boolean);
|
|
14
13
|
private clear;
|
|
15
14
|
private sendNodeAttribute;
|
|
16
15
|
private sendNodeData;
|
|
@@ -32,16 +32,15 @@ function isObservable(node) {
|
|
|
32
32
|
return !isIgnored(node);
|
|
33
33
|
}
|
|
34
34
|
export default class Observer {
|
|
35
|
-
constructor(app,
|
|
35
|
+
constructor(app, isTopContext = false) {
|
|
36
36
|
this.app = app;
|
|
37
|
-
this.
|
|
37
|
+
this.isTopContext = isTopContext;
|
|
38
38
|
this.commited = [];
|
|
39
39
|
this.recents = [];
|
|
40
40
|
this.myNodes = [];
|
|
41
41
|
this.indexes = [];
|
|
42
42
|
this.attributesList = [];
|
|
43
43
|
this.textSet = new Set();
|
|
44
|
-
this.inUpperContext = context.parent === context; //TODO: get rid of context here
|
|
45
44
|
this.observer = new MutationObserver(this.app.safe((mutations) => {
|
|
46
45
|
for (const mutation of mutations) {
|
|
47
46
|
const target = mutation.target;
|
|
@@ -184,7 +183,7 @@ export default class Observer {
|
|
|
184
183
|
// Disable parent check for the upper context HTMLHtmlElement, because it is root there... (before)
|
|
185
184
|
// TODO: get rid of "special" cases (there is an issue with CreateDocument altered behaviour though)
|
|
186
185
|
// TODO: Clean the logic (though now it workd fine)
|
|
187
|
-
if (!isInstance(node, HTMLHtmlElement) || !this.
|
|
186
|
+
if (!isInstance(node, HTMLHtmlElement) || !this.isTopContext) {
|
|
188
187
|
if (parent === null) {
|
|
189
188
|
this.unbindNode(node);
|
|
190
189
|
return false;
|
|
@@ -272,6 +271,8 @@ export default class Observer {
|
|
|
272
271
|
for (let id = 0; id < this.recents.length; id++) {
|
|
273
272
|
// TODO: make things/logic nice here.
|
|
274
273
|
// commit required in any case if recents[id] true or false (in case of unbinding) or undefined (in case of attr change).
|
|
274
|
+
// Possible solution: separate new node commit (recents) and new attribute/move node commit
|
|
275
|
+
// Otherwise commitNode is called on each node, which might be a lot
|
|
275
276
|
if (!this.myNodes[id]) {
|
|
276
277
|
continue;
|
|
277
278
|
}
|
|
@@ -3,20 +3,21 @@ import { isInstance } from "../context.js";
|
|
|
3
3
|
import IFrameObserver from "./iframe_observer.js";
|
|
4
4
|
import ShadowRootObserver from "./shadow_root_observer.js";
|
|
5
5
|
import { CreateDocument } from "../../messages/index.js";
|
|
6
|
-
import { IN_BROWSER } from '../../utils.js';
|
|
6
|
+
import { IN_BROWSER, hasOpenreplayAttribute } from '../../utils.js';
|
|
7
7
|
const attachShadowNativeFn = IN_BROWSER ? Element.prototype.attachShadow : () => new ShadowRoot();
|
|
8
8
|
export default class TopObserver extends Observer {
|
|
9
9
|
constructor(app, options) {
|
|
10
|
-
super(app);
|
|
10
|
+
super(app, true);
|
|
11
11
|
this.iframeObservers = [];
|
|
12
12
|
this.shadowRootObservers = [];
|
|
13
13
|
this.options = Object.assign({
|
|
14
|
-
captureIFrames:
|
|
14
|
+
captureIFrames: true
|
|
15
15
|
}, options);
|
|
16
16
|
// IFrames
|
|
17
17
|
this.app.nodes.attachNodeCallback(node => {
|
|
18
18
|
if (isInstance(node, HTMLIFrameElement) &&
|
|
19
|
-
(this.options.captureIFrames
|
|
19
|
+
((this.options.captureIFrames && !hasOpenreplayAttribute(node, "obscured"))
|
|
20
|
+
|| hasOpenreplayAttribute(node, "capture"))) {
|
|
20
21
|
this.handleIframe(node);
|
|
21
22
|
}
|
|
22
23
|
});
|
|
@@ -28,28 +29,28 @@ export default class TopObserver extends Observer {
|
|
|
28
29
|
});
|
|
29
30
|
}
|
|
30
31
|
handleIframe(iframe) {
|
|
31
|
-
let
|
|
32
|
+
let doc = null;
|
|
32
33
|
const handle = this.app.safe(() => {
|
|
33
34
|
const id = this.app.nodes.getID(iframe);
|
|
34
35
|
if (id === undefined) {
|
|
35
36
|
return;
|
|
36
37
|
} //log
|
|
37
|
-
if (iframe.
|
|
38
|
+
if (iframe.contentDocument === doc) {
|
|
38
39
|
return;
|
|
39
|
-
} //
|
|
40
|
-
|
|
41
|
-
if (!
|
|
40
|
+
} // How frequently can it happen?
|
|
41
|
+
doc = iframe.contentDocument;
|
|
42
|
+
if (!doc || !iframe.contentWindow) {
|
|
42
43
|
return;
|
|
43
44
|
}
|
|
44
|
-
const observer = new IFrameObserver(this.app
|
|
45
|
+
const observer = new IFrameObserver(this.app);
|
|
45
46
|
this.iframeObservers.push(observer);
|
|
46
47
|
observer.observe(iframe);
|
|
47
48
|
});
|
|
48
|
-
|
|
49
|
+
iframe.addEventListener("load", handle); // why app.attachEventListener not working?
|
|
49
50
|
handle();
|
|
50
51
|
}
|
|
51
52
|
handleShadowRoot(shRoot) {
|
|
52
|
-
const observer = new ShadowRootObserver(this.app
|
|
53
|
+
const observer = new ShadowRootObserver(this.app);
|
|
53
54
|
this.shadowRootObservers.push(observer);
|
|
54
55
|
observer.observe(shRoot.host);
|
|
55
56
|
}
|
|
@@ -67,9 +68,9 @@ export default class TopObserver extends Observer {
|
|
|
67
68
|
// the change in the re-player behaviour caused by CreateDocument message:
|
|
68
69
|
// the 0-node ("fRoot") will become #document rather than documentElement as it is now.
|
|
69
70
|
// Alternatively - observe(#document) then bindNode(documentElement)
|
|
70
|
-
this.observeRoot(
|
|
71
|
+
this.observeRoot(window.document, () => {
|
|
71
72
|
this.app.send(new CreateDocument());
|
|
72
|
-
},
|
|
73
|
+
}, window.document.documentElement);
|
|
73
74
|
}
|
|
74
75
|
disconnect() {
|
|
75
76
|
Element.prototype.attachShadow = attachShadowNativeFn;
|
package/lib/index.js
CHANGED
|
@@ -123,7 +123,7 @@ export default class API {
|
|
|
123
123
|
// no-cors issue only with text/plain or not-set Content-Type
|
|
124
124
|
// req.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
|
|
125
125
|
req.send(JSON.stringify({
|
|
126
|
-
trackerVersion: '3.5.
|
|
126
|
+
trackerVersion: '3.5.5',
|
|
127
127
|
projectKey: options.projectKey,
|
|
128
128
|
doNotTrack,
|
|
129
129
|
// TODO: add precise reason (an exact API missing)
|
package/lib/modules/input.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { normSpaces, IN_BROWSER, getLabelAttribute, hasOpenreplayAttribute } from "../utils.js";
|
|
1
|
+
import { normSpaces, IN_BROWSER, getLabelAttribute, hasOpenreplayAttribute, } from "../utils.js";
|
|
2
2
|
import { SetInputTarget, SetInputValue, SetInputChecked } from "../messages/index.js";
|
|
3
3
|
function isTextEditable(node) {
|
|
4
4
|
if (node instanceof HTMLTextAreaElement) {
|
|
@@ -26,7 +26,7 @@ const labelElementFor = IN_BROWSER && 'labels' in HTMLInputElement.prototype
|
|
|
26
26
|
? (node) => {
|
|
27
27
|
let p = node;
|
|
28
28
|
while ((p = p.parentNode) !== null) {
|
|
29
|
-
if (p
|
|
29
|
+
if (p instanceof HTMLLabelElement) {
|
|
30
30
|
return p;
|
|
31
31
|
}
|
|
32
32
|
}
|
|
@@ -38,7 +38,7 @@ const labelElementFor = IN_BROWSER && 'labels' in HTMLInputElement.prototype
|
|
|
38
38
|
: (node) => {
|
|
39
39
|
let p = node;
|
|
40
40
|
while ((p = p.parentNode) !== null) {
|
|
41
|
-
if (p
|
|
41
|
+
if (p instanceof HTMLLabelElement) {
|
|
42
42
|
return p;
|
|
43
43
|
}
|
|
44
44
|
}
|
|
@@ -54,10 +54,12 @@ export function getInputLabel(node) {
|
|
|
54
54
|
let label = getLabelAttribute(node);
|
|
55
55
|
if (label === null) {
|
|
56
56
|
const labelElement = labelElementFor(node);
|
|
57
|
-
label =
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
57
|
+
label = (labelElement && labelElement.innerText)
|
|
58
|
+
|| node.placeholder
|
|
59
|
+
|| node.name
|
|
60
|
+
|| node.id
|
|
61
|
+
|| node.className
|
|
62
|
+
|| node.type;
|
|
61
63
|
}
|
|
62
64
|
return normSpaces(label).slice(0, 100);
|
|
63
65
|
}
|
|
@@ -141,6 +143,13 @@ export default function (app, opts) {
|
|
|
141
143
|
if (id === undefined) {
|
|
142
144
|
return;
|
|
143
145
|
}
|
|
146
|
+
// TODO: support multiple select (?): use selectedOptions; Need send target?
|
|
147
|
+
if (node instanceof HTMLSelectElement) {
|
|
148
|
+
sendInputValue(id, node);
|
|
149
|
+
app.attachEventListener(node, "change", () => {
|
|
150
|
+
sendInputValue(id, node);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
144
153
|
if (isTextEditable(node)) {
|
|
145
154
|
inputValues.set(id, node.value);
|
|
146
155
|
sendInputValue(id, node);
|
package/lib/modules/mouse.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { normSpaces, hasOpenreplayAttribute, getLabelAttribute } from "../utils.js";
|
|
1
|
+
import { normSpaces, hasOpenreplayAttribute, getLabelAttribute, } from "../utils.js";
|
|
2
2
|
import { MouseMove, MouseClick } from "../messages/index.js";
|
|
3
3
|
import { getInputLabel } from "./input.js";
|
|
4
4
|
function _getSelector(target) {
|
|
@@ -21,6 +21,17 @@ function _getSelector(target) {
|
|
|
21
21
|
} while (el !== document.body && el !== null);
|
|
22
22
|
return selector;
|
|
23
23
|
}
|
|
24
|
+
function isClickable(element) {
|
|
25
|
+
const tag = element.tagName.toUpperCase();
|
|
26
|
+
return tag === 'BUTTON' ||
|
|
27
|
+
tag === 'A' ||
|
|
28
|
+
tag === 'LI' ||
|
|
29
|
+
tag === 'SELECT' ||
|
|
30
|
+
element.onclick != null ||
|
|
31
|
+
element.getAttribute('role') === 'button';
|
|
32
|
+
//|| element.className.includes("btn")
|
|
33
|
+
// MBTODO: intersect addEventListener
|
|
34
|
+
}
|
|
24
35
|
//TODO: fix (typescript doesn't allow work when the guard is inside the function)
|
|
25
36
|
function getTarget(target) {
|
|
26
37
|
if (target instanceof Element) {
|
|
@@ -52,12 +63,7 @@ function _getTarget(target) {
|
|
|
52
63
|
if (tag === 'INPUT') {
|
|
53
64
|
return element;
|
|
54
65
|
}
|
|
55
|
-
if (
|
|
56
|
-
tag === 'A' ||
|
|
57
|
-
tag === 'LI' ||
|
|
58
|
-
tag === 'SELECT' ||
|
|
59
|
-
element.onclick != null ||
|
|
60
|
-
element.getAttribute('role') === 'button' ||
|
|
66
|
+
if (isClickable(element) ||
|
|
61
67
|
getLabelAttribute(element) !== null) {
|
|
62
68
|
return element;
|
|
63
69
|
}
|
|
@@ -75,17 +81,15 @@ export default function (app) {
|
|
|
75
81
|
if (dl !== null) {
|
|
76
82
|
return dl;
|
|
77
83
|
}
|
|
78
|
-
|
|
79
|
-
if (tag === 'INPUT') {
|
|
84
|
+
if (target instanceof HTMLInputElement) {
|
|
80
85
|
return getInputLabel(target);
|
|
81
86
|
}
|
|
82
|
-
if (
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
target.
|
|
88
|
-
const label = app.sanitizer.getInnerTextSecure(target);
|
|
87
|
+
if (isClickable(target)) {
|
|
88
|
+
let label = '';
|
|
89
|
+
if (target instanceof HTMLElement) {
|
|
90
|
+
label = app.sanitizer.getInnerTextSecure(target);
|
|
91
|
+
}
|
|
92
|
+
label = label || target.id || target.className;
|
|
89
93
|
return normSpaces(label).slice(0, 100);
|
|
90
94
|
}
|
|
91
95
|
return '';
|
package/lib/modules/scroll.js
CHANGED
|
@@ -20,6 +20,11 @@ export default function (app) {
|
|
|
20
20
|
documentScroll = false;
|
|
21
21
|
nodeScroll.clear();
|
|
22
22
|
});
|
|
23
|
+
app.nodes.attachNodeCallback(node => {
|
|
24
|
+
if (node instanceof Element && node.scrollLeft + node.scrollTop > 0) {
|
|
25
|
+
nodeScroll.set(node, [node.scrollLeft, node.scrollTop]);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
23
28
|
app.attachEventListener(window, 'scroll', (e) => {
|
|
24
29
|
const target = e.target;
|
|
25
30
|
if (target === document) {
|
|
@@ -27,9 +32,7 @@ export default function (app) {
|
|
|
27
32
|
return;
|
|
28
33
|
}
|
|
29
34
|
if (target instanceof Element) {
|
|
30
|
-
|
|
31
|
-
nodeScroll.set(target, [target.scrollLeft, target.scrollTop]);
|
|
32
|
-
}
|
|
35
|
+
nodeScroll.set(target, [target.scrollLeft, target.scrollTop]);
|
|
33
36
|
}
|
|
34
37
|
});
|
|
35
38
|
app.ticker.attach(() => {
|