In the `visit` method, we currently cache the rendered HTML for every
walked node. This re-use works well for traces that consist mostly of
references to earlier snapshots.
But for traces that don't share much, this is a large memory overhead
and leads to the memory crash documented in
https://github.com/microsoft/playwright/issues/32336. For the algocracks
amongst you, the current memory usage for an html tree $h$ is
$\mathcal{O}(|h| * \text{height}(h))$.
This PR removes that cache from the nodes and replaces it with a
snapshot-level cache, fixing the memory crash.
Traces *without* reference should not see a performance impact from
this.
Traces *with* references will have slower initial rendering, but
re-rendering maintains speed because of the snapshot-level cache.
Closes https://github.com/microsoft/playwright/issues/32336
---------
Signed-off-by: Simon Knott <info@simonknott.de>
Co-authored-by: Max Schmitt <max@schmitt.mx>
This allows snapshots of file:/// pages with external stylesheets,
images, etc to be rendered correctly in the trace viewer. (Otherwise, it
tries to request the file:/// URIs directly and the requests get blocked
by the browser.)
Fixes#31112.
When `<source>` or `srcset=` are involved, the actual image src is
determinted at runtime based on factors like `devicePixelRatio` and
media queries that depend on width/height.
Since these factors may differ in the Trace Viewer itself, we should
preserve the `currentSrc`, use it as an actual `src`, and disable
various `<source>` and `srcset=`.
Fixes#24144.
Previously, we only matched by url, which confuses GET and HEAD requests
where the latter is usually zero-sized.
Also make sure that resources are sorted by their monotonicTime, since
that's not always the case in the trace file, where they are sorted by
the "response body retrieved" time.
When rendering snapshot, disregard earlier resources with the same url,
because it's most likely that the latest one was used for rendering.
An example would be reloading the page before the stylesheet has
finished loading. In this case, the stylesheet will be requested twice,
and the second copy that was not aborted should be used for the
snapshot.
Fixes#23709.
For all custom elements defined in the page, we preserve their names and
define them in the rendered snapshot.
This makes things like `:defined` css pseudo work.
Fixes#21030.
fix: sanitize URLs with vbscript:
The vbscript: protocols can be used to run scripts in much the same way as the javascript: protocol. This PR adds in validation for those aforementioned protocols in snapshotterInjected.ts and snapshotRenderer.ts.