* Add a `slimDOM` option to strip out unnecessary parts of the DOM in terms of replay
- <script> tags in the <head> take up unnecessary storage space and are often injected semi randomly to become a source of unnecessary variation between recordings of the same thing
- comment tags can be stripped out without affecting display
- future: this option could also turn on more aggressive stripping, e.g. elements that are hidden by CSS (assuming we can handle them becoming visible after mutation events)
* Mark nodes ignored due to slimDOM option, so that they can also be ignored by the mutation observer in rrweb
* Introducing the `ignored` attribute violates the `serializedNodeWithId` type
* slimDOM: Strip out whitespace nodes from <head> element as they have no effect but take up space
- these would otherwise have to be merged after <script> elements are removed; for statcounter usecase, removing
<script> elements is no good if there is still a trace of their presence due to the white space (and hence a variant <head> node is still produced)
- I explored a more radical stripping of all white space nodes, but there is a problem if parent node is <pre> or otherwise rendered with `white-space: pre` and similar.
detecting applied styles with getComputedStyle would be very expensive (I haven't measured it though)
* Export IGNORED_NODE as a constant instead of relying on the hard-to-grok `-2`
* Remove <link rel=preload as=script> which are similarly as useless as <script> tags
* Make slimDOM configurable with the expecations that `slimDOMOptions: true` will only enable non-destructive options (so not all options may be turned on)
* Expand slimDOM to add options to remove more elements from the <head> that should not be necessary in the replayer context
* record canvas mutations
close#60, #261
This patch implements the canvas mutation observer.
It consists of both the record and the replay side changes.
In the record side, we add a `recordCanvas` flag to indicate
whether to record canvas elements and the flag defaults to false.
Different from our other observers, the canvas observer was
disabled by default. Because some applications with heavy canvas
usage may emit a lot of data as canvas changed, especially the
scenarios that use a lot of `drawImage` API.
So the behavior should be audited by users and only record canvas
when the flag was set to true.
In the replay side, we add a `UNSAFE_replayCanvas` flag to indicate
whether to replay canvas mutations.
Similar to the `recordCanvas` flag, `UNSAFE_replayCanvas` defaults
to false. But unlike the record canvas implementation is stable and
safe, the replay canvas implementation is UNSAFE.
It's unsafe because we need to add `allow-scripts` to the replay
sandbox, which may cause some unexpected script execution. Currently,
users should be aware of this implementation detail and enable this
feature carefully.
* update canvas integration test