Skip to content

Load raster and controlled asynchronous CSS mask resources #507

Description

@wieslawsoltes

Problem

URL-backed SVG masks loaded synchronously through host policy are merged, but raster masks and controlled ServiceWorker responses do not reach the retained mask resource. Dynamic extension/webview assets can therefore remain invisible or stale.

Focused implementation

  • Route PNG/WebP and controlled asynchronous mask fetches through the bounded CSS image request/cache lifecycle.
  • Publish immutable decoded alpha resources with generation, dimensions, content identity, policy result, and cancellation state.
  • Replace pending/failed resources atomically; stale completions after navigation, style replacement, or detach cannot publish.
  • Reuse decoded resources across background/mask consumers while keeping per-origin policy and memory ownership explicit.
  • Apply repeat/position/size through the existing mask group; unsupported formats and failures remain transparent/fail closed.

Gates

Host-policy, redirect, MIME, decode failure, controlled/uncontrolled ServiceWorker, cancellation/navigation, replacement, cache reuse/eviction, Skia/Flutter pixels, 4,096-resource load bounds, and 100 restart/detach cycles with no monotonic RSS growth.

Parent: #256. Coordination: #266/#267 and merged #502.

Completion checkpoint — 19 September 2026

WebScene native Stack #517 atomically merged provider PR #515 and cumulative Avalonia/Flutter consumer PR #516 as 73d0daf925d7b7bdddcae2ef2ca00bffb7fbd225. AppScene PR #181 merged the packaged Skia/Graphite consumer as 50da4995b07bfa7bd23cd2eaf6fae85912ad7c5b; AppScene #180 is closed.

The delivered webscene-raster-v2 envelope keeps mask v2/v3 framing, carries dimensions, SHA-256 identity, and base64 PNG/WebP, and is shared with webscene-bg-svg-v1. Provider publication reuses controlled CSS resource generation/policy/cancellation state and rejects stale URL/navigation/detach completions. Avalonia, Flutter, and AppScene validate format/identity/dimensions/caps; caches are limited to 256 entries and 64 MiB logical decoded pixels; Flutter requests the existing checkpoint after current async decode.

Regression sources cover sync/controlled/stale/failure provider behavior, PNG/WebP pixels, repeat/position/size, add/exclude, cache reuse/bounds, and lifecycle. Per the implementation-first direction they were not executed; only git diff --check ran. Runtime pixels, performance, memory, lifecycle, installed package, complete CI, and Release qualification remain deferred and are not claimed.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    vscode-oss/plannedPlanned for the AppScene/WebScene VS Code OSS integration

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions