The same streamed widget, rendered into several iframe configurations at once. Each card shows the sandbox tokens it was handed and which origin the frame ended up with, plus a count of how many document loads it took to paint.
Then the widget goes after this page: the session token, the cookies, the message you're drafting. Every attempt lands in the audit log at the bottom, blocked or not.
Pick a widget. Dashboard and diagram are honest. FX rates looks like an ordinary rates table and ships a payload that fires the moment its markup is inserted.
Watch frame origin and document loads while it streams. Isolation on one side, the cost of painting it on the other.
Every run ends with each frame probing this page. FX rates also attacks on its own, mid-stream. Read the results: red means the frame got out.
This page is the parent. These are the things a widget would want: a session token in
localStorage, a cookie, and the message you're drafting. Type something in the
draft box and see whether it survives.
Filled in live from what the frames report back. A cell stays red once it has been reached, even if a later phase blocks it. Watch D. Select a row to jump to that approach.
| Approach | Frame origin | Doc loads | Parent DOM | localStorage | Cookies | fetch as you | Your draft |
|---|
Same widget, same stream, different renderers. The only differences that matter are the sandbox tokens and where the HTML is written.
Every attempt from every frame, in order, with repeats collapsed. A breaches from the first byte. B, C and E never do. D breaches while streaming and then goes quiet. Load FX rates and watch it happen.
A separate layer, doing a separate job. Each frame gets a
<meta http-equiv="Content-Security-Policy"> in its <head>
restricting where it may load code from.
sandbox decides whether the frame is your origin, which decides whether it can touch
your DOM, storage and cookies at all. CSP decides which domains the frame's own
code may load from. It does nothing to stop a same-origin frame reading your session.
code.jquery.com (real, reachable, not allowlisted) and reports the browser's own
securitypolicyviolation event rather than guessing from an onerror.
It behaves the same in every card, A included. CSP and sandbox aren't two
settings on the same dial.