* Don't allow video autoplay to automatically unfreeze page. If it's a 'real' playback, there should be a mount or a keyboard event which will serve to unfreeze the page. Also add other non-user events to the list (we really should have an `isUserEvent` function)
* Apply formatting changes
* Create a new `umd` folder alongside `dist` for output of UMD files with a plain `.js` instead of `.cjs` extension, as the latter won't be served with the correct mime type by jsdelivr
- #1687 (just rename `.cjs` to `.js`) was rejected due to the the 'dual package hazard' [1], and produces a warning when run through publint.dev (which was the original motivation for changing to \.cjs)
- jsdelivr won't be serving `.cjs` with the correct mime type: https://github.com/jsdelivr/jsdelivr/issues/18584
[1] https://nodejs.org/en/learn/modules/publishing-a-package#the-dual-package-hazard
* Update to point to alpha.19 as presumably that's when the umd folder will be available after the changes in this PR
* Apply formatting changes
* Don't try to create the same directory twice (was failing on packages/packer/umd)
* Create thirty-shirts-grow.md
* Revert something that shouldn't have gotten into the UMD branch folder
* Apply formatting changes
* Update vite.config.default.ts
* Apply formatting changes
* build: include umd builds in published packages
Add umd directory to the files array in package.json for all packages to include UMD builds in npm publications. Also update .gitignore to exclude
umd folders from version control.
* Docs: point to correct file
* Remove unused code
* docs: update rrweb cdn urls to umd bundles
Align README and guide examples with published UMD file locations for
rrweb, @rrweb/record, and @rrweb/replay.
Update versioned rrweb script examples from 2.0.0-alpha.19 to
2.0.0-alpha.21 in both English and Chinese guides.
* build(all): include umd folder in package files
---------
Co-authored-by: eoghanmurray <eoghanmurray@users.noreply.github.com>
Co-authored-by: Justin Halsall <Juice10@users.noreply.github.com>
* chore: maintain CSS output file name in vite@6.0.1
Without this change, build would fail because the produced stylesheet assumes
the `package.json['name']` i.e., `styles/rrweb.css`. To maintain the existing
behavior, these changes are required.
See https://vite.dev/guide/migration.html#customize-css-output-file-name-in-library-mode
* build(rrvideo): upgrade playwright from 1.32.1 to 1.56.1
Update playwright dependency to latest version and refactor test execution options to use a shared configuration with increased timeout for stability.
* debug(rrvideo): add comprehensive logging to video transformation process
Add detailed console.log statements throughout the transformToVideo function to track execution flow and debug potential issues. Logging covers browser launch, context creation, page navigation, replay progress, and video file operations.
* ci(rrvideo): install playwright browsers and improve test output visibility
- Add Playwright Chromium installation step to CI workflow
- Change test execution stdio from 'pipe' to 'inherit' for better debugging
* fix(rrvideo): prevent autoplay and manually start playback after event listeners
Set autoPlay to false in replayer configuration and manually call play() after all event listeners are attached. This ensures event handlers are properly registered before playback begins, preventing potential race conditions.
Also refactor test execution options to separate stdio configuration from timeout settings for better control over test output visibility.
* fix(rrvideo): add timeout and error handling to replay process
Add comprehensive error handling to prevent hanging during video transformation:
- Add 2-minute timeout for replay finish event
- Add console and error listeners for better debugging
- Improve promise chain with proper error catching
- Clear timeout on successful completion or error
This prevents the process from hanging indefinitely when the replay finish event never fires.
* fix(rrvideo): add error handling and restructure replayer initialization
Wrap replayer initialization in try-catch block to handle potential errors gracefully. Restructure Player instantiation to use rrwebPlayer directly instead of rrwebPlayer.Player, and move width/height into props object for correct API usage. On error, log to console and trigger onReplayFinish callback to prevent hanging state.
* build(umd): rename record and replay globals
Update UMD build globals for recorder and replayer and
refresh documentation accordingly.
BREAKING CHANGE: UMD global names changed to rrwebRecord
and rrwebReplay.
* fix(rrvideo): adjust replay timeout to duration
* docs: update rrweb-player CDN script path
* Update vite.config.default.ts
Co-authored-by: Eoghan Murray <eoghan@getthere.ie>
---------
Co-authored-by: Rui <rui@conti.sh>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Eoghan Murray <eoghan@getthere.ie>
* Prefer `includes` formulation for brevity and as it composes better (easier to understand) in longer boolean expressions with &&
* Noticed two different interpretations of `headMetaAuthorship` under slimDOMOptions; take the opportunity to cleanup and merge code
* `link[rel="modulepreload"]` doesn't require `as="script"` which is tied to rel="preload" only
* extract file extension properly when examining `rel="prefetch"` to disregard URL parameters correctly
Co-authored-by: Eoghan Murray <eoghan@getthere.ie>
Fixes a browser 'lock up' at record time due to a presence of large amounts of css in <style> elements, which are split over multiple text nodes, which triggers the new code added in #1437 (see that PR for full explanation of why this all exists). #1437 was not written with performance in mind as it was believed to be an edge case, but things like Grammarly browser extension (#1603) among other scenarios were triggering pathological behavior, some of which was solved in #1615.
See also https://github.com/rrweb-io/rrweb/pull/1640#issuecomment-2633505804 for further discussion.
* Fix the case when there are multiple matches and we end up not finding a unique one - just go with the best guess when there are many splits by looking at the previous chunk's size
* Also add '0px' -> '0' stylesheet normalization, which also fixes the sample problem in a different way
* Add new test and modify it so that it can trigger a failure in the absence of the '0px' normalization; there may be other unknown ways of triggering a similar bug, so ensure that the primary 'best guess' method doesn't suffer a regression
* Leverage the 'best guess' method so that we can quit after 100 iterations trying to find a unique substring; hopefully this bit along with the `iterLimit` already added will prevent any future pathological cases.
Failing example extracted from large files identified by Paul D'Ambra (Posthog) ... see comment from MartinWorkfully: https://github.com/PostHog/posthog-js/issues/1668
* postcss was introduced in #1458 for use within adaptCssForReplay
* #1600 fixes the main case where invalid css could be introduced when if valid css from the output of `sheet.cssRules` was split according to how it was split across text nodes of the <style>
* the guard introduced here is still useful as we likely in future will switch to capturing the raw stylesheet contents (both <style> and <link>), at which point we will be much less confident of getting valid css
Fix for #1575 where postcss was raising an exception
* adapt the entire CSS as a whole in one pass with postcss, rather than adapting each split part separately
* break up the postcss output again and assign to individual text nodes (kind of inverse of splitCssText at record side)
* impose an upper bound of 30 iterations on the substring searches to preempt possible pathological behavior
* add tests to demonstrate the scenario and prevent regression
More technical details:
* Fix algorithm; checks against `ix_end` within loop were incorrect when `ix_start` was bigger than zero.
* Fix that length check against wrong array was causing 'should record style mutations with multiple child nodes and replay them correctly' test to fail.
Note on last point: I haven't looked into things more deeply than that the test was complaining about missing .length after `replayer.pause(1000);`
- Fix bug where the right split point was not being picked for the 3rd section onwards
- Fix that it wasn't able to find a split when both halves were identical
- Add test to put splitCssText through it's paces with a large file
- Introduce a limit on the iteration which causes the 'efficiently' test to fail
- Fix poor 'crawling' performance in the 'matching' algorithm for large css texts - e.g. for a (doubled) benchmark.css, we were running `normalizeCssText` 9480 times before `k` got to the right place
- Further algorithm efficiency: need to take larger jumps; use the scaling factor to make better guess at how big a jump to make
fix for replay of a blocked element when using 'fast forward' (rrdom)
- Dimensions were not being properly applied when you seek to a position in the replay. Need to use `setProperty` rather than trying to set the width/height directly
Simplify the hover replacement function, which has been borrowed from postcss-pseudo-classes
Note: 'parses nested commas in selectors correctly' was failing after this PR, however I don't think that the previous behaviour was desirable, so have added a new test to formalize this expectation
Support a contrived/rare case where a <style> element has multiple text node children (this is usually only possible to recreate via javascript append) ... this PR fixes cases where there are subsequent text mutations to these nodes; previously these would have been lost
* In this scenario, a new CSS comment may now be inserted into the captured `_cssText` for a <style> element to show where it should be broken up into text elements upon replay: `/* rr_split */`
* The new 'can record and replay style mutations' test is the principal way to the problematic scenarios, and is a detailed 'catch-all' test with many checks to cover most of the ways things can fail
* There are new tests for splitting/rebuilding the css using the rr_split marker
* The prior 'dynamic stylesheet' route is now the main route for serializing a stylesheet; dynamic stylesheet were missed out in #1533 but that case is now covered with this PR
This PR was originally extracted from #1475 so the initial motivation was to change the approach on stringifying <style> elements to do so in a single place. This is also the motivating factor for always serializing <style> elements via the `_cssText` attribute rather than in it's childNodes; in #1475 we will be delaying populating `_cssText` for performance and instead recorrding them as assets.
Thanks for the detailed review to Justin Halsall <Juice10@users.noreply.github.com> & Yun Feng <https://github.com/YunFeng0817>
* Get around monkey patched Nodes
* inlineImages: Setting of `image.crossOrigin` is not always necessary (#1468)
Setting of the `crossorigin` attribute is not necessary for same-origin images, and causes an immediate image reload (albeit from cache) necessitating the use of a load event listener which subsequently mutates the snapshot. This change allows us to avoid the mutation of the snapshot for the same-origin case.
* Modify inlineImages test to remove delay and show that we can inline images without mutation
* Add an explicit test for when the `image.crossOrigin = 'anonymous';` method is necessary. Uses a combination of about:blank and our test server to simulate a cross-origin context
* Other test changes: there were some spurious rrweb mutations being generated by the addition of the crossorigin attribute that are now elimnated from the rrweb/__snapshots__/integration.test.ts.snap after this PR - this is good
* Move `childNodes` to @rrweb/utils
* Use non-monkey patched versions of the `childNodes`, `parentNode` `parentElement` `textContent` accessors
* Add getRootNode and contains, and add comprehensive todo list
* chore: Update turbo.json tasks for better build process
* Update caniuse-lite
* chore: Update eslint-plugin-compat to version 5.0.0
* chore: Bump @rrweb/utils version to 2.0.0-alpha.15
* delete unused yarn.lock files
* Set correct @rrweb/utils version in package.json
* Migrate over some accessors to reverse-monkey-patched version
* Add missing functions
* Fix illegal invocation error
* Revert closer to what it was.
This feels incorrect to me (Justin Halsall), but some of the tests break without it so I'm restoring this to be closer to its original here:
cfd686d488/packages/rrweb-snapshot/src/snapshot.ts (L1011)
* Reverse monkey patch all methods LWC hijacks
* Make tests more stable
* Safely handle rrdom nodes in hasShadowRoot
* Remove duplicated test
* Use variable `serverURL` in test
* Use monorepo default browserlist
* Fix typing issue for new typescript
* Remove unused package
* Remove unused code
* Add prefix to reverse-monkey-patched methods to make them more explicit
* Add default exports to @rrweb/utils
---------
Co-authored-by: Eoghan Murray <eoghan@getthere.ie>
* chore: its important to run `yarn build:all` before running `yarn dev`
* feat: trigger showModal from rrdom and rrweb
* feat: Add support for replaying modal and non modal dialog elements
* chore: Update dev script to remove CLEAR_DIST_DIR flag
* Get modal recording and replay working
* DRY up dialog test and dedupe snapshot images
* feat: Refactor dialog test to use updated attribute name
* feat: Update dialog test to include rr_open attribute
* chore: Add npm dependency happy-dom@14.12.0
* Add more test cases for dialog
* Clean up naming
* Refactor dialog open code
* Revert changed code that doesn't do anything
* Add documentation for unimplemented type
* chore: Remove unnecessary comments in dialog.test.ts
* rename rr_open to rr_openMode
* Replace todo with a skipped test
* Add better logging for CI
* Rename rr_openMode to rr_open_mode
rrdom downcases all attribute names which made `rr_openMode` tricky to deal with
* Remove unused images
* Move after iframe append based on @YunFeng0817's comment
https://github.com/rrweb-io/rrweb/pull/1503#discussion_r1666363931
* Remove redundant dialog handling from rrdom.
rrdom already handles dialog element creation it's self
* Rename variables for dialog handling in rrweb replay module
* Update packages/rrdom/src/document.ts
---------
Co-authored-by: Eoghan Murray <eoghan@getthere.ie>
* Replace relative URLs with absolute URLs when stringifying stylesheets
* Add test to show desired behavior for imported stylesheets from seperate directory
* Rename `absoluteToStylesheet` to `absolutifyURLs` and call it once after stringifying imported stylesheet
* Don't create the intermediary array of the spread operator
* Formalize that `stringifyRule` should expect a sheet href
* Ensure a <style> element can also import and gets it's url absolutized
* Handle case where non imported stylesheet has relative urls that need to be absolutified
* Clarify in test files where jpegs are expected to appear in absolutified urls
* Move absolutifyURLs call for import rules out of trycatch
* Add a benchmarking test for stringifyStylesheet
* Avoid the duplication on how to fall back
---------
Co-authored-by: Eoghan Murray <eoghan@getthere.ie>
Co-authored-by: eoghanmurray <eoghanmurray@users.noreply.github.com>
fix style element corner case
- historically we have recorded duplicated css content in certain cases (demonstrated by the attached replayer test). This fix ensures that the replayer doesn't doubly add the content, which can cause problems when further mutations occur
---------
Review and further tests contributed by: Eoghan Murray <eoghan@getthere.ie>
* feat: add new css parser
* make selectors change
* selectors and tests
* media changes
* remove old css references
* better variable name
* use postcss and port tests
* fix media test
* inline plugins
* fix failing multiline selector
* correct test result
* move tests to correct file
* cleanup all tests
* remove unused css-tree
* update bundle
* cleanup dependencies
* revert config files to master
* remove d.ts files
* update snapshot
* reset rebuilt test
* apply fuzzy css matching
* remove extra test
* Fix imports
* Newer versions of nswapi break rrdom-nodejs tests.
Example:
FAIL test/document-nodejs.test.ts > RRDocument for nodejs environment > RRDocument API > querySelectorAll
TypeError: e[api] is not a function
❯ byTag ../../node_modules/nwsapi/src/nwsapi.js:390:37
❯ Array.<anonymous> ../../node_modules/nwsapi/src/nwsapi.js:327:113
❯ collect ../../node_modules/nwsapi/src/nwsapi.js:1578:32
❯ Object._querySelectorAll [as select] ../../node_modules/nwsapi/src/nwsapi.js:1533:36
❯ RRDocument.querySelectorAll src/document-nodejs.ts:96:24
* Migrate from jest to vitest
* Order of selectors has changed with postcss
* Remove unused eslint
---------
Co-authored-by: Justin Halsall <Juice10@users.noreply.github.com>
- Running `yarn build` in a `packages/*/` directory will trigger build of all dependencies too, and cache them if possible.
- Fix for `yarn dev` breaking for `rrweb` package whenever changing files in `rrweb` package
- Update typescript, turbo, vite and vite-plugin-dts
- Require `workspaces-to-typescript-project-references` from `prepublish`
* all references to jest should have been removed in #1033
* clarify that `cross-env` is used to ensure that environmental variables get applied on Windows (previous usage of cross-env was removed in #1033)
* Minor fixup for #1349; the 'we can avoid the check on leaf elements' optimisation wasn't being applied as `n.childNodes` was always truthy even when there were no childNodes.
Changing it to `n.childNodes.length` directly there (see #1402) actually caused a bug as during a mutation, we serialize the text node directly, and need to jump to the parentElement to do the check.
This is why I've reimplemented this optimisation inside `needMaskingText` where we are already had an `isElement` test
Thanks to @Paulhejia (https://github.com/Paulhejia/rrweb/) for spotting that `Boolean(n.childNodes)` is aways true.
* Add option to block animation on <title> tag which can generate massive recordings on some websites (think scrolling title tag)
* Add new option to slimDOMOptions type with tsdoc as suggested by Justin
* Chore: Add move most types from rrweb to @rrweb/types package
* Split off type imports
* Split off type import to its own line
* Get vite to generate type definitions
* Apply formatting changes
* noEmit not allowed in tsconfig, moved it to build step
* Migrate rrdom-nodejs build to vite
* Apply formatting changes
* Migrate rrweb-snapshot to vite
* Unify configs
* Chore: Migrate rrdom to vite
Turns out what we where doing by overwriting `public textContent: string | undefined` as a getter in a subclass is something that isn't allowed in typescript. Because we where using `// @ts-ignore` to hide this error our bundler chose to allow the overwrite. Vite choses to disallow the overwrite making all subclasses' `textContent` undefined.
To mitigate this we're using an abstract class, which does allow sub classes to decide if they wan't to use getters or not.
* Chore: Migrate rrweb to vite WIP
* build:browser was removed (for now)
* BREAKING: moved rrweb-plugin-console to its own npm module
This removes console from rrweb-all.js
* Support cjs files in startServer
* Move canvas-webrtc plugin to its own package
* Chore: move sequential-id plugin to its own package
* Chore: Configure rrweb's vite bundling
* `Id` had lowercase `d` before, making it lowercase again
* Test: Move console tests to their own package
* remove unused utils from rrdom
* pull in latest version of master
something when wrong earlier when resolving merge conflicts, this should be correct
* Fix type casting issue in diff.ts
* Fix typo
* Fix duplicate entries in package.json and tsconfig.json
* Apply formatting changes
* Update dependencies in package.json files
* Update dependencies to use Vite 5.2.8 in package.json files
* Get tests passing for rrdom
`apply virtual style rules to node` tests need to be moved to rrweb to avoid circular dependencies
* Fix image loading issue in integration tests
* Move pack/unpack to its own @rrweb/packer module
* Get tests to work in rrdom-nodejs
* Port tests in rrweb-snapshot to vitest and fix them
* Fix tests for rrweb-plugin-console-record
* Add @rrweb/all package
* Fix publint and attw errors for rrdom and @rrweb/types
* Use shared vitest.config.ts in rrweb-snapshot package
* Fix publint and attw issues for rrweb-snapshot
* Export `ReplayPlugin` type directly from rrweb
* Fix publint and attw issues for packages
* Fix publint & attw issue.
I was bumping into this issue: 3729bc2a3c/docs/problems/NoResolution.md
And had to choose one of these three methods described here:
https://github.com/andrewbranch/example-subpath-exports-ts-compat?tab=readme-ov-file#typescript-friendly-strategies-for-packagejson-subpath-exports-compatibility
And I ended up going for the method described here:
1ffe3425b0/examples/node_modules/package-json-redirects (package-json-redirects)
The redirect method seemed the least invasive and most effective.
* Fix publint & attw issue.
I was bumping into this issue: 3729bc2a3c/docs/problems/NoResolution.md
And had to choose one of these three methods described here:
https://github.com/andrewbranch/example-subpath-exports-ts-compat?tab=readme-ov-file#typescript-friendly-strategies-for-packagejson-subpath-exports-compatibility
And I ended up going for the method described here:
1ffe3425b0/examples/node_modules/package-json-redirects (package-json-redirects)
The redirect method seemed the least invasive and most effective.
* move some rrdom tests that require rrweb to rrweb package
* Use pre-jest 29 syntax for snapshotting
* get rrweb passing publint and attw
* const enum does not work with isolated modules flag
* Fix script tag type in webgl.test.ts.snap and update rrweb.umd.cjs path in webgl.test.ts
* Fix paths
* Move tests for console record plugin and fix bundle path
* Fix tests for rrweb
* pack integration tests were moved to @rrweb/all
* Update rrweb bundle path in test files
* Fix flaky scroll emit from test
* Migrate rrweb's tests over to vitest and make them pass
* Make sure benchmarks & updating tests work
* Remove jest from rrweb
* Fix paths
* always use rrweb's own cssom
* Update tsconfig.json for rrweb-plugin-sequential-id-record
Fixes this error:
Error: @rrweb/rrweb-plugin-sequential-id-record:prepublish: tsconfig.json(9,5): error TS6377: Cannot write file '/home/runner/work/rrweb/rrweb/tsconfig.tsbuildinfo' because it will overwrite '.tsbuildinfo' file generated by referenced project '/home/runner/work/rrweb/rrweb/packages/rrweb'
* Add tsbuildinfo config to extended tsconfig files
* Move rrdom over to vitest
* Apply formatting changes
* Update rrweb imports to use the new package structure
* extend rrweb-snapshot's tsconfig from monorepo base config
* extend @rrweb/types's tsconfig from monorepo base config
* extend rrdom's tsconfig from monorepo base config
* extend rrdom-nodejs's tsconfig from monorepo base config
* extend web-extension's tsconfig from monorepo base config
* unify tsconfigs
* Continue when tests fail
* Add stricter type checking
* Add check-types global command
* remove jest
* Remove unused code
* Add check-types command to build script
* Fix linting issues
* Add setup Chrome action for CI/CD workflow
* Update puppeteer version in package.json for rrweb
* Update Chrome setup in CI/CD workflow
* Update Chrome setup in CI/CD workflow
* Add Chrome setup and test cache location
* Update CI/CD workflow to test chrome cache location
* Add chrome installation step to CI/CD workflow
* Update Puppeteer configuration for headless testing
* Update dependencies and workflow configuration
* Use same version of chrome on CI as is run locally
* Use version of chrome that seems to work with rrdom tests
* Try using puppeteerrc to define chrome version
* Add .cache directory to .gitignore
* Move global flag to vitest config
* Update puppeteer version to 20.9.0
* Update console log messages in rrweb-plugin-console-record for new puppeteer version
* Remove redundant Chrome setup from CI/CD workflow
* Add minification and umd for all built files
* Update import paths for rrweb dist files
* Add @rrweb/replay and @rrweb/record
* Add script to lint packages
* Apply formatting changes
* exclude styles export from typescript package type checking
* WIP Move rrweb-player over to vite
* Apply formatting changes
* chore: Update rrweb plugin import paths
* Remove rollup from rrweb-player
* Fix typing issues
* Fix typing issues
* chore: Update rrweb-player to use vite for build process
* Apply formatting changes
* chore: Export Player class in rrweb-player/src/main.ts
Makes attw happy
* Apply formatting changes
* Gets wiped by yarn workspaces-to-typescript-project-references
* Add .eslintignore and .eslintrc.cjs files for rrweb-player package
* Apply formatting changes
* Update dependencies in rrweb-player/package.json
* Apply formatting changes
* chore: Update eslint configuration for rrweb-player package
* Apply formatting changes
* chore: Remove unused files from rrweb-player package
* Apply formatting changes
* chore: Update rrweb-player import path to use rrweb-player.cjs
* chore: Update addEventListener signature in rrweb-player
* Apply formatting changes
* Add .eslintignore and update .gitignore files for to root
* Apply formatting changes
* Update documentation
* Update @rrweb/types package description
* Apply formatting changes
* Update build and run commands in CONTRIBUTING.md
* Apply formatting changes
* Update package versions to 2.0.0-alpha.13
* Apply formatting changes
* Apply formatting changes
* Fix import statement in media/index.ts
* Apply formatting changes
* chore: Update .gitignore to exclude build and dist directories
* Apply formatting changes
* Apply formatting changes
* Migrate setTimeout to vitest
* Apply formatting changes
* Apply formatting changes
* Fix isNativeShadowDom function signature in utils.ts
* try out jsr
* Apply formatting changes
* Update package versions to 2.0.0-alpha.14
* Apply formatting changes
* Fix name of rrwebSnapshot object
* Apply formatting changes
* Remove unused lock files
* Apply formatting changes
* Update rrweb bundle path to use umd.cjs format
* Apply formatting changes
* Trigger tests to run again
* Rename snapshots for vitest
* Apply formatting changes
* Ping CI
* Apply formatting changes
* Ping CI
* Apply formatting changes
* Ignore files generated by svelte-kit for prettier
* Correct Player object
fix for options `recordCanvas: true`:
* replace document.createElement with doc.createElement in rrweb-snapshot code
* Eoghan: add a regression test to prevent future accidental use of `document` instead of `doc`. This test can be excised if a new feature can only be run in the browser and not in the jsdom environment
Setting of the `crossorigin` attribute is not necessary for same-origin images, and causes an immediate image reload (albeit from cache) necessitating the use of a load event listener which subsequently mutates the snapshot. This change allows us to avoid the mutation of the snapshot for the same-origin case.
* Modify inlineImages test to remove delay and show that we can inline images without mutation
* Add an explicit test for when the `image.crossOrigin = 'anonymous';` method is necessary. Uses a combination of about:blank and our test server to simulate a cross-origin context
* Other test changes: there were some spurious rrweb mutations being generated by the addition of the crossorigin attribute that are now elimnated from the rrweb/__snapshots__/integration.test.ts.snap after this PR - this is good
* Fix and test for bug #1457 (Uncaught SyntaxError: Regular expression too large)
- see test case which is extracted from a real world css file; the selector regex was able to traverse the curly brace as when looking for quotes, it wasn't taking into account that the start quote could be escaped
* Apply formatting changes
* Create fair-ducks-clean.md
* Fix @import regex bit which was stopping consumption in the middle of a url - need to consume quotes.
Thanks dave.kindel@pendo.io for reporting and isolating this case
---------
Co-authored-by: eoghanmurray <eoghanmurray@users.noreply.github.com>
perf(snapshot): avoid costly generation of <a> element on each call to `getHref`, instead cache an anchor element and reuse it's href attributed
---------
Co-authored-by: Eoghan Murray <eoghan@getthere.ie>
* better splitting of selectors - overlapping with #1401
* Add test from example at https://github.com/PostHog/posthog/pull/21427
* ignore brackets inside selector strings
* Add another test as noticed that it's possible to escape strings
* Ensure we are ignoring commas within strings
Co-authored-by: Eoghan Murray <eoghan@getthere.ie>
* Add support for capturing media attributes in rrweb-snapshot
* Add loop to mediaInteractionParam
* Add support for loop in RRMediaElement
* Add support for recording loop attribute on media elements
* Update video playback and fix bugs
* Update cross-origin iframe media attributes and player state
* We weren't recursing into media queries (or @supports etc.) to rewrite hover pseudoclasses
* The early return meant that the stylesWithHoverClass cache wasn't being populated if there were no hover selectors on the stylesheet
- not committing the test, but modifying the existing 'add a hover class to a previously processed css string' as follows shows the problem:
--- a/packages/rrweb-snapshot/test/rebuild.test.ts
+++ b/packages/rrweb-snapshot/test/rebuild.test.ts
@@ -151,6 +185,7 @@ describe('rebuild', function () {
path.resolve(__dirname, './css/benchmark.css'),
'utf8',
);
+ cssText = cssText.replace(/:hover/g, '');
const start = process.hrtime();
addHoverClass(cssText, cache);
* Replace `min-device-width` and similar with `min-width` as the former looks out at the browser viewport whereas we need it to look at the replayer iframe viewport
* Add some tests to show how the hover replacement works against selector lists. I believe these were failing in a previous version of rrweb as I had some local patches that no longer seem to be needed to handle these cases
* Update name of function to reflect that 'addHoverClass' does more than just :hover. I believe this function is only exported for the purposes of use in the tests
* Apply formatting changes
* Create rotten-spies-enjoy.md
* Apply formatting changes
* Add correct typing on `getSelectors`
* Refactor CSS interfaces to include optional rules
* Change `rules` to be non optional
---------
Co-authored-by: eoghanmurray <eoghanmurray@users.noreply.github.com>
Co-authored-by: Justin Halsall <Juice10@users.noreply.github.com>
* 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>