Commit Graph

70 Commits

Author SHA1 Message Date
dphuang2
d722554a07 Fix timeOffset on multiple stylesheet loads (#115)
In the case that the replayer triggers multiple FullSnapshot events, it
will call waitForStylesheetLoad multiple times. When the replayer
resumes, it could already have a timeoffset set from a previous
resume in a previous waitForStylesheetLoad call. In this case our new
timeoffset should be the value of our current time in the replay
(timer.timeOffset + getTimeOffset()). To solve this, I created a public
getCurrentTime function which correctly returns the time in the replay
and used that as our new timeoffset when resuming from a stylesheet
load.
2026-04-01 12:00:00 +08:00
Yanzhen Yu
be1d90ab1d fix#110 add NodeList forEach polyfill 2026-04-01 12:00:00 +08:00
dphuang2
469dbd5dee added 'pointer-events: none' for Replayer iframe (#96)
'pointer-events: none' prevents the user from interacting with the DOM
inside of the iframe. This prevents accidental tampering by a user when
watching replays such as link clicks or DOM manipulation.

pointer-events supported by 97.15% usage: https://caniuse.com/#feat=pointer-events
2026-04-01 12:00:00 +08:00
肉肉肉肉
338da11e35 new feature: add custom style in replayer (#87)
* new feature: add custom style in replayer

* concat style rules for loop
2026-04-01 12:00:00 +08:00
Yanzhen Yu
94ca07d45d fix#71 fix touch event listener and throttle touch move callback 2026-04-01 12:00:00 +08:00
Yanzhen Yu
57df28de2f remove mitt typings namesapce 2026-04-01 12:00:00 +08:00
Yanzhen Yu
eaf339ed79 Upgrade the DOM mutation observer
This is an important patch contains some crtical bug fixes for
the DOM mutation observer.
Previously the observer did not handle complex DOM movement very
well. So in this patch we optimized this by distinguishing moved
node better and added a resolving queue to avoid the error caused
by ordering.
2026-04-01 12:00:00 +08:00
Yanzhen Yu
7d4b2ad3e0 emit mouse interaction event during replay 2026-04-01 12:00:00 +08:00
yz-yu
689840d237 start to support live mode (#73)
1. add a liveMode flag to config, when liveMode is set, the timer
will keep running even though all the actions casted
2. add a public method addEvent, which will cast newly added event
in sync
3. move mouse in sync mode with the latest position info
2026-04-01 12:00:00 +08:00
Yanzhen Yu
f312ecbadc add the inline stylesheet option when recording 2026-04-01 12:00:00 +08:00
Yanzhen Yu
4f58cad48d resume with time offset when after wait stylesheet load 2026-04-01 12:00:00 +08:00
Yanzhen Yu
32c33f3ce8 move browser related APIs into runtime 2026-04-01 12:00:00 +08:00
Yanzhen Yu
d1b32e6e9d impl #23 add custom privacy selectors 2026-04-01 12:00:00 +08:00
Yanzhen Yu
da54061b53 check attribute is null instead of any falsy value 2026-04-01 12:00:00 +08:00
Yanzhen Yu
12fc5de3a7 check whether the removed node's ancestors has been removed 2026-04-01 12:00:00 +08:00
Yanzhen Yu
153035f4b0 turn some warning message into debug message 2026-04-01 12:00:00 +08:00
yz-yu
4a2c733583 improve mouse record and replay (#49)
Increase the throttle value of collecting mouse move and add a
transition time to the replayer's mouse. This may decrease the
size of mouse move data and make the replay movement more smooth.
Another change is to move and hover when click event is replayed.
This is to improve the replay of some programmatic click, such as
E2E tests.
2026-04-01 12:00:00 +08:00
Yanzhen Yu
e2bc867b2e move all events to an enum and update guide 2026-04-01 12:00:00 +08:00
Yanzhen Yu
34571ad708 resolve #47 update dependency 2026-04-01 12:00:00 +08:00
Yanzhen Yu
384227d0df resolve #48 check focus and blur before call since the target can be HTMLDocument in firefox 2026-04-01 12:00:00 +08:00
yz-yu
ca61d6b19e fix remove node observer and check on the result of getNode (#43)
* check removed node and its parent before collect

* add more more checks on the result of getNode
2026-04-01 12:00:00 +08:00
Yanzhen Yu
d72a15fd1b expose iframe as public property 2026-04-01 12:00:00 +08:00
Yanzhen Yu
21465e785f resolve #13 add warning messages when target is not found 2026-04-01 12:00:00 +08:00
Yanzhen Yu
21ba657653 resolve #28, init replayer config in the constructor 2026-04-01 12:00:00 +08:00
Daniël van de Giessen
8ee8bc24d5 Corrected value for scrollTo behaviour parameter (#18) 2026-04-01 12:00:00 +08:00
Yanzhen Yu
203122630c fix skip event logic when finding next active event 2026-04-01 12:00:00 +08:00
Yanzhen Yu
07cf74ca78 restore speed when finished 2026-04-01 12:00:00 +08:00
Yanzhen Yu
c99cea605c update rrweb-snapshot minor version and set max skip speed 2026-04-01 12:00:00 +08:00
Yanzhen Yu
e8fea1f93b export timer to public API 2026-04-01 12:00:00 +08:00
Yanzhen Yu
68abd28c0a emit speed with skip event 2026-04-01 12:00:00 +08:00
Yanzhen Yu
73983e7e78 add skipInactive option
Skip inactive time is an important and useful feature. We consider
user interaction events as active, and check next user interaction
event after apply incremental snapshot.
If next user interaction event has a time gap larger than the
threshold, we will set a dynamic speed value which will skip the
inactive time interval in about 5 seconds.
2026-04-01 12:00:00 +08:00
Yanzhen Yu
b093fa6015 fix some safari's scroll related issue 2026-04-01 12:00:00 +08:00
Yanzhen Yu
5794aa9481 update rrweb-snapshot 2026-04-01 12:00:00 +08:00
Yanzhen Yu
60dcaadd63 safely scroll element since its last event may fired after being removed 2026-04-01 12:00:00 +08:00
Yanzhen Yu
e5acc268fe fix resolve missing node when target has both previous and next missing node 2026-04-01 12:00:00 +08:00
Yanzhen Yu
9d7a75de7d Add missingNodeRetryMap
Use a global missing node retry map to handle missing node that
has not been resolved in the same round.
2026-04-01 12:00:00 +08:00
Yanzhen Yu
e5928fc311 fix resume to move baseline time by time offset 2026-04-01 12:00:00 +08:00
Yanzhen Yu
6f06b5e1e7 only add click animation when cast is not sync 2026-04-01 12:00:00 +08:00
Yanzhen Yu
a3757fc8cf fix timer requestAnimationFrame call may not stop after clear
Before this patch, the checker in the timer will stop only when
actions array is empty.
When we call play more than once, it will clear the timer first,
then  push filtered new actions and start the timer again. If
all of this happened in a frame, the checker which should be
cleared may found actions array is not empty and keep check.
So this patch we use timer.raf to hold raf's handle and cancel
it when clear was called.
2026-04-01 12:00:00 +08:00
Yanzhen Yu
97f1c30a37 add some unit tests to replayer 2026-04-01 12:00:00 +08:00
Yanzhen Yu
5f28a8d534 prevent scroll when dispatch focus 2026-04-01 12:00:00 +08:00
Yanzhen Yu
b2806d6f81 emit pause and resume events 2026-04-01 12:00:00 +08:00
Yanzhen Yu
f4596f5cea fix mouse move time offset may be mutated multiple times 2026-04-01 12:00:00 +08:00
Yanzhen Yu
86beabd2bb resolve #1 add ignore and block strategy for privacy purpose 2026-04-01 12:00:00 +08:00
Yanzhen Yu
efa7a8fa1b new sandbox strategy
In this commit we switched the sandbox strategy to use iframe's
sandbox attribute. Indeed we do not need delegate event anymore,
but need to add some styles into the iframe.
The details were documented in the sandbox part of internal design.
2026-04-01 12:00:00 +08:00
Yanzhen Yu
0995b7a6d3 basic impl of wait for stylesheet loaded 2026-04-01 12:00:00 +08:00
Yanzhen Yu
9a7f98402c check interaction target before apply 2026-04-01 12:00:00 +08:00
Yanzhen Yu
9ed7e09213 check parentNode when calling insertBefore
When add new nodes, we may use insertBefore API to insert node before
its next sibling. But the sibling may not in the DOM tree at that
moment if it was in the missing node map.
2026-04-01 12:00:00 +08:00
Yanzhen Yu
20f27a3822 improve prevent default event when replay 2026-04-01 12:00:00 +08:00
Yanzhen Yu
4e636e1b6e fix timer clear method with do not reassign actions pointer 2026-04-01 12:00:00 +08:00