Commit Graph

64 Commits

Author SHA1 Message Date
Yanzhen Yu
e4cb91e1e6 fix block strategy
If an element was blocked, its child nodes should also be blocked.
The interactions and mutations on the element and its child nodes
also need to be blocked.
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
56aca3c2b7 check is dropped and is removed by ancestors instead of only check parent 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
09f30d2a81 return stopper function as the result of record 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
edwardwu
05530551df resolve #4 Improve timer's performance by storing all callbacks in an array (#5) 2026-04-01 12:00:00 +08:00
Yanzhen Yu
b6d8a7dc95 extract css by rollup plugin 2026-04-01 12:00:00 +08:00
Yanzhen Yu
fdcf1d0bb2 update dependencies
In this commit, we updated rrweb-snapshot to 0.6.0 which including
a breaking change in data structure.
2026-04-01 12:00:00 +08:00
Yanzhen Yu
68daa2d029 prevent form and a tag default behaviour 2026-04-01 12:00:00 +08:00
Yanzhen Yu
cbe80dbd2e also resolve missing previous node 2026-04-01 12:00:00 +08:00
Yanzhen Yu
b7bf5f5fe3 Fix add node logic with missingNextNodeMap
This patch include a breaking change to the recorder's event data.

We used to consider mirror.getId will always return the id of the
target node because we keep serialize every node. But if we call
mirror.getId before serialization then bug happened. This could
happen when we get nextId of newly added nodes if its next sibling
was also newly added.
So we have to return -1 as the id of node which was not serialized
and when we building added nodes in the replayer we should handle
this.

For example, nodes el1, el2 were added together and el1's nextId
will be -1 since el2 was not serialized at that moment. Now we
call el1 as a 'missing next node' and not append it into the DOM
tree after building, instead we store it in a missingNextNodeMap.
After a added node in the same mutation was successfully appened
we will check whether it has a previous id and the id was pointed
to some nodes in the map, if so, we will insert that node before
it and delete the node from map.
2026-04-01 12:00:00 +08:00
Yanzhen Yu
4c0ced2ba1 fix the add node condition 2026-04-01 12:00:00 +08:00
Yanzhen Yu
d5b89558e1 fix order of continuous append 2026-04-01 12:00:00 +08:00
Yanzhen Yu
7a57784daf Implement #2: simulate hover event 2026-04-01 12:00:00 +08:00
Yanzhen Yu
97ed5eb229 implement pause which has a better performance than play at some time offset 2026-04-01 12:00:00 +08:00
Yanzhen Yu
c18626bf5a fix mutation filter in recorder and change the order of apply mutations in replayer
This change include two critical fix for both recorder and replayer.

In the recorder, previously we filter text and attribute mutations by check its target id,
but this was a wrong approach because removed node also has id at the callback moment.
We corrected this by checking whether the mirror map still has the target id in its keys.

In the replayer side, the issue was we got exceptions when calling insertBefore which says
the ref node was not the child node of the caller node. This will happen when the previous
or next sibling has been removed in the same callback but the previousId or nextId was
recorded.
After apply remove node mutations before add node mutations, we can make sure the removed
siblings will not exist in the mirror map when apply add node mutations. When we get node
from mirror map with an removed id, we will get null and pass it to insertBefore which
is valid.
As a side note, this apply order is safe because we ensured all the remove node mutations
do not include removing newly added nodes in the same callback.
2026-04-01 12:00:00 +08:00
Yanzhen Yu
609f51a26a add a has method to mirror for checking whether an id is in the map 2026-04-01 12:00:00 +08:00
Yanzhen Yu
6ce32f7994 filter text and attributes mutations which target tot a removed node 2026-04-01 12:00:00 +08:00
Yanzhen Yu
7c35cb2f49 check added nodes from removed nodes and dropped nodes 2026-04-01 12:00:00 +08:00
Yanzhen Yu
aa3e2f02ed rewrite mutation observer handler with lazy child list calculation 2026-04-01 12:00:00 +08:00
Yanzhen Yu
487f1d0c9a add meta event and fix childList observer, also update related replayer 2026-04-01 12:00:00 +08:00
Yanzhen Yu
cd0889e9c5 implemented the play any offset feature 2026-04-01 12:00:00 +08:00
Yanzhen Yu
eb56afa59f export more props of replayer to the UI 2026-04-01 12:00:00 +08:00
Yanzhen Yu
f75748674f impl dynamic config and pause. Bump 0.3.0 2026-04-01 12:00:00 +08:00
Yanzhen Yu
e040ae76c5 align id map by skip extra added nodes 2026-04-01 12:00:00 +08:00
Yanzhen Yu
c9bb0e6557 update id map when DOM changed and handle element scroll event 2026-04-01 12:00:00 +08:00