@@ -46,17 +46,27 @@ operations, performs conversion, and stores the current result.
4646computed paints, text measurements, stacking information, fonts, and asset requests. It is the
4747correct place to measure facts that only a browser can know. Later modules should consume those
4848facts rather than infer them from class names, URL suffixes, text shape, or layer names.
49+ This includes legacy rectangular clips, image clip bounds, positioned-auto paint bands, and the
50+ nearest owner of a dense unsupported clip-path cluster.
4951
5052Consent-overlay handling, full-page scrolling, asset recovery, and single-frame raster fallbacks
5153are coordinated by the extension adapters. Cleanup runs in ` finally ` paths so capture markers,
5254hidden overlays, emulation, debugger attachment, and scroll position are restored on success or
5355failure.
56+ The debugger locks both Browser and preset captures to the viewport measured at capture start;
57+ this prevents clipped screenshots from changing Chromium's layout width between fallback regions.
5458
5559The public dynamic-content behavior is ` local-static-v1 ` . It takes at most one current-frame sample
5660for each attempted fallback region, attempts no more than 12 regions, and does not finish animation
5761timelines, perform multi-frame quality retries, recover transparent layers from a second screenshot,
58- or use a hosted rendering environment. Failed or deferred regions become explicit labeled
59- placeholders and retain the extractor's node-scoped warning.
62+ or use a hosted rendering environment. The fixed queue prioritizes image nodes, then CSS-background
63+ hosts, and uses captured area as the tie-breaker. Failed or deferred image regions become explicit
64+ labeled placeholders; unresolved background paints remain warning-scoped when their isolated
65+ single-frame recovery is unavailable. Browser-resolved generated content that cannot be expressed
66+ as literal text uses one host screenshot whose bounds include measurable pseudo-element paint.
67+ Unsupported masked pseudo-elements no thicker than 2px are omitted only when they have no filter,
68+ shadow, or outline that would extend their paint; the omission is warning-scoped and the host tree
69+ remains editable.
6070
6171### Contract module
6272
@@ -117,8 +127,20 @@ The content runtime discovers assets declared by the page. The service worker ad
117127only HTTP(S) URLs, omits credentials and referrer data, follows bounded time and byte limits, and
118128returns bytes to the active capture. Inline SVG is checked before it enters a portable plan.
119129These reads may contact the page's own origin or CDN; they never target a Web2UI service.
120- If a declared asset is unavailable, conversion keeps the rest of the page usable: image nodes
121- receive a neutral placeholder, missing paints are omitted, and the node-scoped warning is retained.
130+ PNG, JPEG, and GIF can remain direct clipboard assets. WebP, AVIF, tinted rasters, narrowly safe
131+ styled SVGs, and SVG colors that Figma may not preserve are browser-decoded to PNG under the same
132+ 4 MiB per-asset and approximately 18 MiB total budgets. Required page imagery is admitted before
133+ optional generated glyphs.
134+
135+ If a declared image is unavailable, it is marked for the bounded screenshot flow instead of being
136+ silently omitted. An unresolved CSS background is captured in isolation and replaces only the
137+ host's background fill, leaving its child text and elements editable. Fallbacks are scrolled into
138+ view and captured with a live page-coordinate clip while Chromium's beyond-viewport screenshot mode
139+ remains disabled; this avoids that path temporarily reflowing the page. The live box is used when
140+ its measured dimensions remain stable, while the captured rectangle preserves expanded
141+ pseudo-element paint. ` scrollIntoView ` may move nested scrollers, so their authored horizontal
142+ positions are restored before pixel capture and all ancestor scroll positions are restored during
143+ cleanup. If recovery still fails, the node-scoped warning is retained.
122144
123145### Local persistence
124146
0 commit comments