- Revoke item blob URLs on destroy and URLs that resolve late.
- Keep the current item playing when the playlist changes around it.
- A fatal error from a preloaded plugin no longer cuts the active item.
- Count playlist metrics only on a real advance, not on retries.
- Store item URLs as normalised strings, so a preloaded webpage is not
loaded again on reveal.
- Replay a lone play-through plugin after every finished message. The
plugin embed now emits finished for each message.
- A held lone webpage or plugin reports one pass, so a single-pass
takeover can end.
- Apply muted changes, sandbox webpage iframes, skip formatting in hot
validity checks, and remove dead members.
Over days of looping, the media player leaked blob URLs, restarted items, cut items short and could hold the screen:
ngOnDestroy, so up to 5 blob URLs leaked per takeover or template change.iframe.srccomparisons failed after URL normalisation, so preloaded webpages loaded twice.Changes
ngOnDestroyrevokes item URLs, and URLs that resolve late are revoked.plugin-embed: a newfinishedoutput, emitted for everyfinishedmessage. The player replays a lone play-through plugin on each one. Other users of the component don't bind it.mutedInputchanges are applied, webpage iframes getsandbox="allow-scripts allow-same-origin allow-forms", hot validity checks useisMediaValid, and dead members are removed.Testing
plugin-embed.nx test signage(432),nx test componentsandnx build signagepass.Notes
allow-scripts+allow-same-origincan escape the sandbox. That is expected for this setting; cross-origin pages stay blocked.Independent of the other signage PRs from this review. Based on
develop.Changes made by Claude Opus 5.5 (1M context) in Claude Code, running in T3 Code.
🤖 Generated with Claude Code