* Fix serialization and mutation of <textarea> elements taking account the duality that the value can be set in either the child node, or in the value _parameter_ (not attribute)
* Backwards compatibility: Bug fix and regression test for #112
- this is to fix up 'historical' recordings, as duplicate textarea content should no longer be being created at record time
- new test shows what the snapshot generated by previous versions of rrweb used to look like, hence 'bad'
- original 0efe23f04a fix either didn't work or no longer works due to childNodes being appended subsequent to this part of the code
- during review, we also verified that the `_cssText` case should still be handled okay, as there's currently no scenario where csstext is present with css child nodes of a <style>
* Masking: Fix that textarea values were being missed by the masking system if the value was recorded as a child node
- I didn't notice that form.html was used in other tests, so lucky that I noticed that those tests also should have the 'pre value' masked out
* Simplify by always storing the textarea value in the `.value` attribute (from it's DOM property) and not as a childNode. It should still be rebuilt as a childNode rather than a property
---------
Authored-by: eoghanmurray <eoghan@getthere.ie>
* masking performance: avoid the repeated calls to `closest` when recursing through the DOM
- needsMask===true means that an ancestor has tested positively for masking, and so this node and all descendents should be masked
- needsMask===false means that no ancestors have tested positively for masking, we should check each node encountered
- needsMask===undefined means that we don't know whether ancestors are masked or not (e.g. after a mutation) and should look up the tree
* Add tests including an explicit characterData mutation tests
* Further performance improvement: avoid calls to `el.matches` when on a leaf node, e.g. a `<br/>`
---------
Authored-by: eoghanmurray <eoghan@getthere.ie>
Based on initial PR #1338 by Alexey Babik <alexey.babik@noibu.com>
* Perf: don't run the regex replace unless the selectorText contains a colon (rules generally contain colons)
* Need to check type before querying selectorText property - also good as it means we only try to fix colons at the leaf level
---------
Authored-by: eoghan murray <eoghan@getthere.ie>
* Extend to run fixBrowserCompatibilityIssuesInCSS over styles in inline style sheets
* Apply formatting changes
---------
Co-authored-by: eoghanmurray <eoghanmurray@users.noreply.github.com>
* fix: Fix input.type check
Actually I noticed that `el.type` returns `text` when type is not explicitly set, so this is slightly incorrect.
* fix linting
* Apply formatting changes
* feat: Ensure password inputs are masked when switching type
Apply formatting changes
use data- attribute
ref: Ensure type is always lowercased
add changeset
* extract into util
* Apply formatting changes
* feat: Ignore `autoplay` attribute on video/auto elements
This element leads to weird issues when replaying, so it's better to strip this out.
* add changeset
* fix check
fix typo
* Apply formatting changes
---------
Co-authored-by: mydea <mydea@users.noreply.github.com>
* fix: Explicitly handle removed attributes
The attribute `value` can be null when a mutation observer triggers due to a removed attribute. This is currently not reflected by types and code.
* Apply formatting changes
* fix
* add changeset
* fix: Exclude `modulepreload` as well
We were only excluding `<link rel="preload" as="script" />` but we should include `rel="modulepreload"` as well
* Apply formatting changes
* Add `recordCrossOriginIframe` setting
* Set up messaging between iframes
* should emit full snapshot event from iframe as mutation event
* this.mirror was dropped on attachIframe
* should use unique id for child of iframe
* Cross origin iframe recording in `yarn live-stream`
* Root iframe check thats supported by firefox
* Live stream: Inject script in all frames
* Record same origin and cross origin iframes differently
* Should map Input events correctly
* Turn on other tests
* Fix compatibility with newer puppeteer
* puppeteer vs 12 seems stable without to many changes needed
* normalize port numbers in snapshots
* Handle scroll and ViewportResize events in cross origin iframe
* Correctly map cross origin mutations
* Map selection events for cross origin iframes
* Map canvas mutations for cross origin iframes
* Update snapshot to include canvas events
* Skip all meta events
* Support custom events as best we can in cross origin iframes
* Use earliest version of puppeteer that works with cross origin live-stream
* Map mouse/touch interaction events
* Update snapshots for correctly mapped click events
* Tweak tests for new puppeteer version
* Map MediaInteraction correctly for cross origin iframes
* Make tests consistent between high and low dpi devices
* Make test less flaky
* Make test less flaky
* Make test less flaky
* Make test less flaky
* Add support for styles in cross origin iframes
* Map traditional stylesheet mutations on cross origin iframes
* Add todo
* Add iframe mirror
* Get iframe manager to use iframe mirrors internally
* Rename `IframeMirror` to `CrossOriginIframeMirror`
* Setup basic cross origin canvas webrtc streaming
* Clean up removed canvas elements
* reset style mirror on new full snapshot
* Fix cross origin canvas webrtc streaming
* Make emit optional
* Run tests on github actions
* Upload image artifacts from failed tests
* Use newer github actions
* Test: hopefully adding more wait will fix it
* add extra wait
* Fix image snapshot tests
* Make tests run with new puppeteer version
* upgrade eslint-plugin-jest
* Chore: Remove travis ci as ci's running on github actions
* Chore: Support recording cross origin iframe in repl
* Force developers to update the cross origin iframe mapping when adding new events
https://github.com/rrweb-io/rrweb/pull/1035#discussion_r1012516277
* Document cross origin iframe recording
* Docs: cross origin iframes recording methods
* Docs: AI translated, cross origin iframe recording
* rename getParentId to getId
* Migrate to @rrweb/types
* Run on pull request
* doc: improve Chinese doc
* Rename `parentId` to `Id`
Co-authored-by: Mark-Fenng <f18846188605@gmail.com>
* fix: bug when inlined link elements
* test: update snapshot for test cases
* apply Justin's review suggestions
1. make Mirror's replace function act the same with the original one when there's no existed node to get replaced.
2. when replacing with the link/style elements, keep their existing attributes to prevent potential bugs
* test(recording side): add test case for adopted stylesheets in shadow doms and iframe
* add type definition for adopted StyleSheets
* create a StyleSheet Mirror
* enable to record the outermost document's adoptedStyleSheet
* enable to serialize all stylesheets in documents (iframe) and shadow roots
* enable to record adopted stylesheets while building full snapshot
* test: add test case for mutations on adoptedStyleSheets
* defer to record adoptedStyleSheets to avoid create events before full snapshot
* feat: enable to track the mutation of AdoptedStyleSheets
* Merge branch 'fix-shadowdom-record' into construct-style
* fix: incorrect id conditional judgement
* test: add a test case for replaying side
* tweak the style mirror for replayer
* feat: enable to replay adoptedStyleSheet events
* fix: rule index wasn't recorded when serializing the adoptedStyleSheets
* add test case for mutation of stylesheet objects and add support for replace & replaceSync
* refactor: improve the code quality
* feat: monkey patch adoptedStyleSheet API to track its modification
* feat: add support for checkouting fullsnapshot
* CI: fix failed type checks
* test: add test case for nested shadow doms and iframe elements
* feat: add support for adoptedStyleSheets in VirtualDom mode
* style: format files
* test: improve the robustness of the test case
* CI: fix an eslint error
* test: improve the robustness of the test case
* fix: adoptedStyleSheets not applied in fast-forward mode (virtual dom optimization not used)
* refactor the data structure of adoptedStyleSheet event to make it more efficient and robust
* improve the robustness in the live mode
In the live mode where events are transferred over network without strict order guarantee, some newer events are applied before some old events and adopted stylesheets may haven't been created.
Added a retry mechanism to solve this problem.
* apply Yanzhen's review suggestion
* update action name
* test: make the test case more robust for travis CI
* Update packages/rrweb/src/record/constructableStyleSheets.d.ts
Co-authored-by: Justin Halsall <Juice10@users.noreply.github.com>
* Update packages/rrweb/src/record/constructableStyleSheets.d.ts
Co-authored-by: Justin Halsall <Juice10@users.noreply.github.com>
* apply Justin's review suggestions
add more browser compatibility checks
* add eslint-plugin-compat and config
* fix record test type errors
* make Mirror's replace function act the same with the original one when there's no existed node to replace
* test: increase the robustness of test cases
* remove eslint disable in favor of feature detection
Early returns aren't supported yet unfortunately, otherwise this code would be cleaner https://github.com/amilajack/eslint-plugin-compat/issues/523
* Remove eslint-disable-next-line compat/compat
* Standardize browserslist and remove lint exceptions (#1010)
* test: revert deleting virtual style tests and rewrite them to fit the current code base
Co-authored-by: Justin Halsall <Juice10@users.noreply.github.com>
* Sort attributes to make `rr_*` attributes handled last
`rr_dataURL` overwrites `src` attribute, because of this we need to evaluate `rr_dataURL` last so it doesn't accidentally get overwritten again.
* Update packages/rrweb-snapshot/src/rebuild.ts
* Refactor handling of rr_* attributes
Be a little more strict when it comes attribute types
* inline stylesheets when loaded
* set empty link elements to loaded by default
* Clean up stylesheet manager
* Remove attribute mutation code
* Update packages/rrweb/test/record.test.ts
* Update packages/rrweb/test/record.test.ts
* Update packages/rrweb/test/record.test.ts
* Update packages/rrweb/scripts/repl.js
* Update packages/rrweb/test/record.test.ts
* Update packages/rrweb/src/record/index.ts
* Add todo
* Move require out of time sensitive assert
* Add waitForRAF, its more reliable than waitForTimeout
* Remove flaky tests
* Add recording stylesheets in iframes
* Remove variability from flaky test
* Make test more robust
* Fix naming
* Add test cases for inlineImages
* Add test cases for inlineImages
* Record iframe mutations cross page
* Test: should record images inside iframe with blob url after iframe was reloaded
* Handle negative ids in rrdom correctly
When iframes get inserted they create untracked elements, both on the dom and rrdom side.
Because they are untracked they generate negative numbers when fetching the id from mirror.
This creates a problem when comparing and fetching ids across mirrors.
This commit tries to get away from using negative ids as much as possible in rrdom's comparisons
* Update packages/rrdom/src/diff.ts
Co-authored-by: Yun Feng <yun.feng@anu.edu.au>
* Start unserialized nodes at -2
This way we don't accidentally think of them as mirror misses
* Set unserialized id starting number at -2
* Remove duplication
Co-authored-by: Yun Feng <yun.feng@anu.edu.au>
* fix: style not applied to polyfillled shadow dom
* test: add integration test for shadydom and @lwc/synthetic-shadow
* improve the implementation of function isNativeShadowDom
* apply lele0108's review suggestion
* refactor: eliminate eslint errors as many as I can
* refactor: fix more eslint errors in the record module
* LINT: fix @typescript-eslint/unbound-method
* LINT: fix all eslint errors in source code
* LINT: fix as many eslint warnings as possible
Co-authored-by: Justin Halsall <Juice10@users.noreply.github.com>
* inline stylesheets when loaded
* set empty link elements to loaded by default
* Clean up stylesheet manager
* Remove attribute mutation code
* Update packages/rrweb/test/record.test.ts
* Update packages/rrweb/test/record.test.ts
* Update packages/rrweb/test/record.test.ts
* Update packages/rrweb/scripts/repl.js
* Update packages/rrweb/test/record.test.ts
* Update packages/rrweb/src/record/index.ts
* Add todo
* Move require out of time sensitive assert
* Add waitForRAF, its more reliable than waitForTimeout
* Remove flaky tests
* Add recording stylesheets in iframes
* Remove variability from flaky test
* Make test more robust
* Fix naming
* Speed up snapshotting of many new dom nodes
By avoiding reflow we shave about 15-25% off our snapshotting time
* Improve newlyAddedElement docs
* Optimize needMaskingText by using el.closest and less recursion
* Serve all rrweb dist files
* Split serializeNode into smaller functions
Makes it easier to profile
* Slow down cpu enhance tracing on fast machines
* Increase timeout
* Perf: only loop through ancestors when they have something to compare to
* Perf: `hasNode` is cheaper than `getMeta`
* Perf: If parents where already checked, no need to do it again
* Perf: reverse for loops are faster
Because they only do the .lenght check once. In this case I don't think we'll see much performance gains if any
* Clean up code
* Perf: check ancestors once with isBlocked
* guessing this might fixes canvas test
* Update packages/rrweb/src/record/observers/canvas/webgl.ts
Co-authored-by: yz-yu <yanzhen@smartx.com>
* Fix#904 (#906)
Properly remove crossorigin attribute
* Bump minimist from 1.2.5 to 1.2.6 (#902)
Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6.
- [Release notes](https://github.com/substack/minimist/releases)
- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6)
---
updated-dependencies:
- dependency-name: minimist
dependency-type: indirect
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: yz-yu <yanzhen@smartx.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* fix: can't record shadow host and shadow dom in incremental mutations
* enable to record newly added shadow dom
* Revert "enable to record newly added shadow dom"
This reverts commit cf7c0ad551ac457f00e3f754702c1464314f6a86.
* Revert "fix: can't record shadow host and shadow dom in incremental mutations"
This reverts commit 8b25cc97f83cbc333702c0ba73684e54eeadaabe.
* fix: can't record shadow host and shadow dom in incremental mutations
* add support for nested shadow root and add integration test
* fix test error
* enable to record shadow-dom in iframes
* add an integration test case for nested iframes and shadow-doms
* use the patch function
* Add very basic webgl support
* document the default
* only capture rr_dataURL in 2d canvas contexts
* rr_dataURL no longer part of webgl snapshot
* ignore __diff_output__ from jest-image-snapshot
* Rename generic "Monorepo" to "RRWeb Monorepo"
* Serialize WebGL variables
* Move rrweb test port number to unique port
rrweb-snapshot uses 3030, rrweb uses 3031
* Prepare for WebGL2
* Split up canvas replay and record webgl vars
* fix typo
* fix typo part 2
* fix typo
* Handle non-variables too
* provide correct context for warning
* (De)Serialize a lot of different objects
* monorepo root should be the first in the list
* Upgrade puppeteer to 11.x
* Correctly de-serialize webgl variables
* Encode arrayBuffers contents to base64
* rename contents to base64
* add webgl2 support and serialize HTMLImageElements
* Support serializing ImageData
* Correctly classify WebGL2 events
* Serialize format changed
* check if canvas has contents before we save the dataURL
* Remove blank dataURL
* reference original file not type defintion file
* update types
* rename code worspace
* update dependencies
* add spector to inspect webgl
* remove live server settings from code workspace
* Save canvas context in the node
Prevents from saving webgl canvases as 2d dataUrls
* remove extra braces
* add ICanvas type
* use ICanvas from rrweb-snapshot in rrweb instead of OgmentedCanvas
* add snapshots and webgl 2 tests
* Upgrade to puppeteer 12.0.1
* Revert back to puppeteer 9.1.1
* Keep index order consistent between replay and record
* keep correct index order in webgl2
* fixed forgotten import
* buffer up pending canvas mutations
* unify the way webgl and webgl2 get patched
* fix parsing error
* Add types for serialize-args
* Add debugging for webgl replay
* Move start-server to utils
* turn off debug mode by default
* Move pendingCanvasMutations to local object and fix if/else statement
* Always save pending mutations
* only use assert snapshot as it's clearer whats going on
* Ugly fix for now
* Making the tests more DRY
* flush at the end of each request animation frame
* Looks like the promise made this test more predictable
* add waitForRAF
* Make nested iframe recording robust no matter the test speed
* mute noisy error in test
* force a requestAnimationFrame
* Bundle events within one frame together as much as possible
WebGL events need to be bundled together as much as possible so they don't accidentally get split over multiple animation frames.
`newFrame: true` is used to indicate the start of an new animation frame in the recording, and that the event shouldn't be bundled with the previous events.
* Rename RafStamps
* Override event.delay
* cleanup
* Add tests for addDelay
* Add webgl e2e test
* Remove settimeout
* DRY-up test
* Preload images in webgl
* Add e2e test for webgl image preloading
* don't turn on devtools by default!
* Remove spector
* close server after use
* Add imageMap parameter
* Make e2e image test more robust
* document debug mode
* cleanup
* WebGL recording in iframes & Safari 14 support
* fix tests
* don't save null objects as WebGLVar
* group (de)serialized webgl variables by context
* Fix test
* fix tests
* bundle webgl mutations on request animation frame
Instead of fixing it on the replay side we buffer up webgl canvas mutations and wait for a new RAF to flush them. This allows us to remove `newFrame` from the events and simplify things a little
* Add canvas element to mutation observer file
* Add Canvas (Mutation) Manager
Allows you to do `record.freezePage()` and canvas events will get paused.
Based on https://github.com/rrweb-io/rrweb/pull/756#issuecomment-1007566907
* cleanup
* Make sure the correct </body> gets replaced
* Perf: Speed up check to see if canvas is blank
* Access unpatched getImageData
* Use is2DCanvasBlank only for 2d context
* Implemented image restore from rr_dataURL
* Implement saving images in the snapshot
* Fixed image saving, added a test
* Rename data-src to data-rrweb-src
* Updated the guide
* Rename recordImages to inlineImages and try catch
* A fix, some tweaks and 2 new log warnings
* Handle CORS errors when reading CSS rules
* Fix after merge
* Improve try catch for the inline image
* PR comments tweaks
* Fix typescript lint
* Small tweaks
* Fix a log warning
* Implemented image restore from rr_dataURL
* Implement saving images in the snapshot
* Fixed image saving, added a test
* Rename data-src to data-rrweb-src
* Updated the guide
* Rename recordImages to inlineImages and try catch