Hacker DirectoryHacker Directory

WEB / WEB-11.S02

CORS, framing and cross-window message validation

Why are response exposure, embedding and Window replies different approvals?

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mechanism

Read every scenario without motion

Valid message

  1. Pending read

    Atlas parent retains preview-A and pending read-7. Tea & Bread is already available at the preview; this branch makes no API GET. No Window reply has yet been prepared or delivered to the parent.

    Atlas parent
    read-7 pending; no title
    Book preview
    Preview-A; title ready
    Owned API
    No request; no read
  2. Reply prepared

    The preview prepares a fixed title reply for the exact parent origin; this is not an HTTP request.

    Atlas parent
    read-7 pending; no title
    Book preview
    Reply read-7 ready; exact target
    Owned API
    No request; no read
  3. Message task arrival

    The queued Window task has been delivered; origin and source are not yet approved.

    Atlas parent
    Message event arrived; checks pending
    Book preview
    Reply read-7 ready; exact target
    Owned API
    No request; no read
  4. Local identity gate

    Declared event.origin and the retained preview reference match in these two selected rows.

    Atlas parent
    Origin/source matched; data pending
    Book preview
    Reply read-7 ready; exact target
    Owned API
    No request; no read
  5. Local schema/transaction

    Closed kind/version/title schema and pending request ID are separate; a stale read is not the current read.

    Atlas parent
    Schema valid; read-7 matched
    Book preview
    Reply read-7 ready; exact target
    Owned API
    No request; no read
  6. Local display outcome

    Origin/source, title schema and read-7 matched; Tea & Bread was bound as literal text. Acceptance grants no HTML interpretation; this branch sent no request or read to the API.

    Atlas parent
    Literal Tea & Bread; read-7
    Book preview
    Reply read-7 ready; exact target
    Owned API
    No request; no read

Stale reply

  1. Pending read

    Atlas parent awaits read-7 from preview-A. This branch later selects read-6 from the same preview; matching origin and source do not make that older transaction current. No parent message receipt has occurred yet.

    Atlas parent
    read-7 pending; no title
    Book preview
    Preview-A; title ready
    Owned API
    No request; no read
  2. Reply prepared

    The preview prepares a fixed title reply for the exact parent origin; this is not an HTTP request.

    Atlas parent
    read-7 pending; no title
    Book preview
    Reply read-6 ready; exact target
    Owned API
    No request; no read
  3. Message task arrival

    The queued Window task has been delivered; origin and source are not yet approved.

    Atlas parent
    Message event arrived; checks pending
    Book preview
    Reply read-6 ready; exact target
    Owned API
    No request; no read
  4. Local identity gate

    Declared event.origin and the retained preview reference match in these two selected rows.

    Atlas parent
    Origin/source matched; data pending
    Book preview
    Reply read-6 ready; exact target
    Owned API
    No request; no read
  5. Local schema/transaction

    Closed kind/version/title schema and pending request ID are separate; a stale read is not the current read.

    Atlas parent
    Schema valid; read-6 stale denied
    Book preview
    Reply read-6 ready; exact target
    Owned API
    No request; no read
  6. Local display outcome

    The message event reached the parent and origin/source passed; read-6 failed pending read-7, leaving the title unchanged. Message receipt is not transaction acceptance, and this branch performed no API read.

    Atlas parent
    Title unchanged; stale ignored
    Book preview
    Reply read-6 ready; exact target
    Owned API
    No request; no read

CORS read denied

  1. Normal read intent

    Atlas browser wants Tea & Bread from api.example.org. The selected GET uses include mode and the response uses ACAO *; exposure is decided only after response arrival. No API request or server read has occurred yet.

    Atlas parent
    read-7 pending; no title
    Book preview
    Preview-A; title ready
    Owned API
    No request; no read
  2. GET prepared

    A fixed GET is prepared in credentials mode include; no actual cookie or connection is used.

    Atlas parent
    GET request ready; mode=include
    Book preview
    Preview-A; title ready
    Owned API
    No request; no read
  3. API received request

    The normal GET has arrived at the API; CORS exposure cannot undo server receipt.

    Atlas parent
    GET request ready; mode=include
    Book preview
    Preview-A; title ready
    Owned API
    GET arrived; public read pending
  4. Local public response

    The server declares the public read allowed and prepares ordinary JSON with wildcard ACAO.

    Atlas parent
    GET request ready; mode=include
    Book preview
    Preview-A; title ready
    Owned API
    JSON response ready; ACAO=*
  5. Response at browser

    The response arrives; status/content availability and CORS script exposure remain distinct.

    Atlas parent
    Response arrived; exposure pending
    Book preview
    Preview-A; title ready
    Owned API
    JSON response ready; ACAO=*
  6. Local CORS gate

    Include-mode wildcard exposure is rejected while the declared server-read result remains.

    Atlas parent
    Script read blocked; server read allowed
    Book preview
    Preview-A; title ready
    Owned API
    JSON response ready; ACAO=*

Ancestor denied

  1. Policy fixture ready

    The preview response has enforced frame-ancestors allowing the Atlas origin. The selected chain has reader.example.net above the immediate Atlas parent; the later local gate evaluates the whole chain. No resource download or API read occurs.

    Atlas parent
    read-7 pending; no title
    Book preview
    Preview-A; title ready
    Owned API
    No request; no read
  2. Local response policy

    Header-enforced frame-ancestors takes the parent allowlist from the protected preview.

    Atlas parent
    read-7 pending; no title
    Book preview
    Header policy; all ancestors pending
    Owned API
    No request; no read
  3. Local ancestor gate

    The immediate Atlas parent is allowed, but a different outer ancestor rejects this selected chain.

    Atlas parent
    read-7 pending; no title
    Book preview
    Outer ancestor denied; no embedding
    Owned API
    No request; no read
  4. Local UI consequence

    The parent sees declared embedding denial, not an API-permission or CORS-denial result.

    Atlas parent
    Embedding unavailable; title unchanged
    Book preview
    Outer ancestor denied; no embedding
    Owned API
    No request; no read
  5. Local explanatory state

    The immediate Atlas parent is allowed, but outer reader.example.net is absent from the ancestor list; embedding was denied. The UI shows that policy reason without adding an API-read or CORS-denial result.

    Atlas parent
    Ancestor policy explanation ready
    Book preview
    Outer ancestor denied; no embedding
    Owned API
    No request; no read

ACTORS · STATE · DATA FLOW

What does CORS expose?

Reading the Tea & Bread title from Atlas’s owned API concerns resource-server permission to expose a response to a browser origin. Session/object policy is separate. A simple GET can reach the server and receive a normal response while CORS prevents script access to its content; that does not prove absence of server effects. Credentials mode include requires an exact ACAO origin and ACAC true; wildcard ACAO does not allow exposure in that mode, even if no cookie actually exists. Actual credential attachment still depends on SameSite and storage policy. Method/header/value conditions can introduce a preflight before the normal exchange; its permission is not object authorization.

Framing policy belongs to the response owner

A book-preview document limits its embedders with response-header CSP frame-ancestors. The parent’s frame-src instead limits child resource loading; these control opposite directions. frame-ancestors checks the whole ancestor chain, not just the immediate parent, has no default-src fallback and is ignored in meta delivery. An enforced directive overrides X-Frame-Options in supporting browsers. XFO DENY/SAMEORIGIN supplies legacy compatibility; current SAMEORIGIN requires all ancestors to match, while RFC7034 records historical implementation variation. Obsolete ALLOW-FROM is not a modern allowlist solution. Framing denial is a UI-embedding boundary, not a DOM-read or server-permission decision.

A Window message passes four gates

Atlas retains the preview-A WindowProxy reference and a pending read-7 transaction. A harmless reply contains kind=book-title, version=1, requestId=read-7 and title=Tea & Bread, queued for the exact parent targetOrigin. The receiver checks event.origin against the expected sender origin, event.source against its retained preview reference, data against a closed schema and requestId against the pending transaction. event.origin reflects send time; the document can later navigate while its WindowProxy reference remains. Payload origin/source strings do not replace browser event identity. Structured cloning copies data without establishing trust or ordering independent async replies. A transferred MessagePort is a separate capability/channel contract, not an assumption that every port message exposes Window origin/source.

2. Red · Trust & Impact

Read every scenario without motion

Read and framing

  1. Server read and exposure

    serverReadAllowed stays true in the CORS rows. Include wildcard has expectedExposed false; a server returning public data does not imply script-readable body.

    Capability ledger
    Server read true / include wildcard exposed false
    Policy boundary review
    Not yet evaluated
    Acceptance outcome
    Not yet evaluated
  2. Positive CORS controls

    Include with exact Atlas ACAO and lowercase true is readable, as is the omit-mode public wildcard. Credentials mode and response contract are evaluated together.

    Capability ledger
    Server read true / include wildcard exposed false
    Policy boundary review
    Exact include true / public omit true
    Acceptance outcome
    Not yet evaluated
  3. Framing is another question

    owned-chain passes enforced frame-ancestors with two Atlas ancestors. This capability is not script-read or business-action authority; framePolicyGrantsRead is false.

    Capability ledger
    Server read true / include wildcard exposed false
    Policy boundary review
    Exact include true / public omit true
    Acceptance outcome
    Embedding allowed ≠ body readable
  4. Outer ancestor difference

    frame-denied includes a reader.example.net ancestor alongside an Atlas parent. Every ancestor is evaluated; validating only the nearest parent cannot establish chain permission.

    Capability ledger
    Outer reader ancestor / frame denied
    Policy boundary review
    Exact include true / public omit true
    Acceptance outcome
    Embedding allowed ≠ body readable
  5. CSP and XFO delivery

    With supported enforced frame-ancestors in a header, owned-chain is allowed despite XFO DENY. Report-only supplies no enforced ancestor permission and remains denied by XFO DENY.

    Capability ledger
    Outer reader ancestor / frame denied
    Policy boundary review
    Enforce CSP precedence / report XFO deny
    Acceptance outcome
    Embedding allowed ≠ body readable
  6. Do not merge three permissions

    Read, embed and action have separate policies. CORS exposure is not framing permission, and frame-ancestors is not CSRF/action-intent control; the normal title example keeps these boundaries narrow.

    Capability ledger
    Outer reader ancestor / frame denied
    Policy boundary review
    Enforce CSP precedence / report XFO deny
    Acceptance outcome
    Exposure/framing/action policies separate

Stale message

  1. Current request binding

    The parent expects book-title version 1 for read-7 from preview-A. Exact targetOrigin is Atlas, and title Tea & Bread is a string in the normal schema.

    Capability ledger
    preview-A / read-7 / version1
    Policy boundary review
    Not yet evaluated
    Acceptance outcome
    Not yet evaluated
  2. Stale requestId

    stale-message has correct origin and source but carries read-6. It is rejected for not matching current work; a trusted sender can return stale results in ordinary async lifecycle.

    Capability ledger
    preview-A / read-7 / version1
    Policy boundary review
    Correct sender / read-6 rejected
    Acceptance outcome
    Not yet evaluated
  3. Reference difference

    wrong-reference comes from preview-B at the same origin and is rejected. Origin equality alone does not identify the replying WindowProxy instance.

    Capability ledger
    preview-A / read-7 / version1
    Policy boundary review
    Correct sender / read-6 rejected
    Acceptance outcome
    Same origin / preview-B rejected
  4. Shape control

    shape-denied carries null title and fails the string/maxTitle 80 contract. Correct origin/source does not supply type, version or closed-key validation.

    Capability ledger
    title null / shape rejected
    Policy boundary review
    Correct sender / read-6 rejected
    Acceptance outcome
    Same origin / preview-B rejected
  5. Clone is not trust

    Copied message data does not replace WindowProxy identity. Normal acceptance belongs to title text only; messageAcceptedPermitsHTML is false and grants no HTML/code interpretation.

    Capability ledger
    title null / shape rejected
    Policy boundary review
    Accepted title text ≠ HTML/code permission
    Acceptance outcome
    Same origin / preview-B rejected
  6. Bounded effect of acceptance

    Readonly title is accepted when source, origin, schema and pending request pass together. This decision is not expanded to API object authority, framing or complete event-lifecycle success.

    Capability ledger
    title null / shape rejected
    Policy boundary review
    Accepted title text ≠ HTML/code permission
    Acceptance outcome
    Correlated readonly result / separate server policy

ASSUMPTION · BOUNDARY · CONTROL

Response reading, embedding and business actions differ

A title read, preview embedding and reply delivery require different capabilities. The broken assumption is that one origin-allow decision authorizes all of them. Generic CORS origin reflection or incorrect credentials-mode handling changes script exposure, whose impact depends on returned data and real object policy. Missing framing policy can permit relevant action UI inside another context; clickjacking additionally requires deceptive user interaction and applicable UI/action conditions. CORS headers are not framing policy, and frame-ancestors does not replace action-intent/CSRF controls. The artifact uses a benign GET and ordinary ancestor matrix, with no overlay, exploit form or third-party request.

A trusted sender can still return stale or malformed data

A matching origin can still belong to another preview reference, and matching origin/source can still return read-6 after the UI has moved to read-7. Missing titles, extra fields and incorrect versions fail a separate schema gate. These failures also occur during normal multi-window and async lifecycle behavior. The receiver does not use domain-suffix matching or treat payload source aliases as browser identity. Accepted titles remain ordinary h2 text data; message acceptance is not permission to interpret HTML/code. Receiver-handler exceptions do not return synchronous success/failure to the sender of a queued reply. Retained references, expected kinds/types and pending-operation correlation are controls, alongside the sender’s exact targetOrigin privacy boundary.

3. Blue · Secure development & defense

Read every scenario without motion

Matrix controls

  1. CORS matrix

    corsRows retains API response predicates and expected browser exposure; framing.rows retains resource ancestor policy; messageRows retains parent-receiver acceptance predicates. These are supplied example records. normal/stale-message use a Window task without reaching the API; cors-denied carries a GET to the API, while frame-denied is only local policy evaluation. A title observed in correlation-gap cannot establish which path executed. Explicit include and public omit expose true, while include wildcard and wrong-origin expose false. serverReadAllowed and expectedExposed remain distinct fields.

    Capability records
    Two exposure allows / two exposure denies
    Evidence comparison
    Not yet evaluated
    Review result
    Not yet evaluated
  2. Ancestor matrix

    owned-chain is true and outer-reader frame-denied false. Enforced header CSP, legacy XFO SAMEORIGIN and report-only with XFO DENY are evaluated in separate branches.

    Capability records
    Two exposure allows / two exposure denies
    Evidence comparison
    Complete chain / CSP vs XFO fallback
    Review result
    Not yet evaluated
  3. Message matrix

    Normal read-7 is accepted; stale id, wrong reference, wrong origin and null title are rejected separately. Each negative probes a different condition rather than one undifferentiated denial.

    Capability records
    Two exposure allows / two exposure denies
    Evidence comparison
    Complete chain / CSP vs XFO fallback
    Review result
    One normal / four independent message rejects
  4. Evidence source

    Browser exposure, protected headers/ancestor chain and receiver acceptance are different observation points. Server audit knows its own read/action, not the whole browser chain.

    Capability records
    Browser/response/receiver/server scopes distinct
    Evidence comparison
    Complete chain / CSP vs XFO fallback
    Review result
    One normal / four independent message rejects
  5. Minimal comparison fields

    Origin-match, source-match, schema-valid and transaction-match can be correlated without a raw private message body. Aliases and comparison results explain this read-only example.

    Capability records
    Browser/response/receiver/server scopes distinct
    Evidence comparison
    Comparison results / no raw private body
    Review result
    One normal / four independent message rejects
  6. Regression scope

    Finite typed rows compare policy decisions. Without actual CORS, CSP/XFO or postMessage enforcement, local outcomes establish neither browser compatibility nor production-event success.

    Capability records
    Browser/response/receiver/server scopes distinct
    Evidence comparison
    Comparison results / no raw private body
    Review result
    Finite matrices known / browser runtime separate

Correlation gap

  1. One title observation

    corsRows retains API response predicates and expected browser exposure; framing.rows retains resource ancestor policy; messageRows retains parent-receiver acceptance predicates. These are supplied example records. normal/stale-message use a Window task without reaching the API; cors-denied carries a GET to the API, while frame-denied is only local policy evaluation. A title observed in correlation-gap cannot establish which path executed. The review sees only displayed Tea & Bread, without API exposure, ancestor chain or accepted-reply records. The same title can result from different local or remote paths.

    Capability records
    Title known / three capability records missing
    Evidence comparison
    Not yet evaluated
    Review result
    Not yet evaluated
  2. Visible frame is insufficient

    A visible frame is neither script-body exposure nor message acceptance. A parent heading alone does not prove exact-target delivery or receiver schema validation.

    Capability records
    Title known / three capability records missing
    Evidence comparison
    Visible frame/title ≠ capability proof
    Review result
    Not yet evaluated
  3. Retain three unknowns

    Exposure, framing-policy decision and current-message acceptance remain UNKNOWN for this incomplete event. True normal-matrix rows do not fill missing event fields.

    Capability records
    Title known / three capability records missing
    Evidence comparison
    Visible frame/title ≠ capability proof
    Review result
    Exposure/framing/acceptance UNKNOWN
  4. Required correlation

    Request mode/ACAO/ACAC, response policy delivery/chain and message origin/source/schema/requestId are gathered separately and associated with the same read-only work and current display.

    Capability records
    Needed: exposure/chain/message correlations
    Evidence comparison
    Visible frame/title ≠ capability proof
    Review result
    Exposure/framing/acceptance UNKNOWN
  5. Schema versus identity

    Cloning a plain object does not verify the sender WindowProxy. A missing source reference is not invented as event identity, and accepted data remains in text context.

    Capability records
    Needed: exposure/chain/message correlations
    Evidence comparison
    Copied data ≠ sender identity
    Review result
    Exposure/framing/acceptance UNKNOWN
  6. Report the review boundary

    New evidence must answer the three capability questions separately. This event retains the observed title without adding server authority or browser-enforcement success.

    Capability records
    Needed: exposure/chain/message correlations
    Evidence comparison
    Copied data ≠ sender identity
    Review result
    Retain title / collect scoped capability evidence

IMPLEMENTATION · SECURITY CONTROL · VERIFICATION

Observe evidence where each control executes

corsRows retains API response predicates and expected browser exposure; framing.rows retains resource ancestor policy; messageRows retains parent-receiver acceptance predicates. These are supplied example records. normal/stale-message use a Window task without reaching the API; cors-denied carries a GET to the API, while frame-denied is only local policy evaluation. A title observed in correlation-gap cannot establish which path executed. Record request origin, credentials mode, explicit ACAO/ACAC and exposure result with the response source; server read permission and browser exposure are separate fields. If responses vary by explicit origin, relevant caches need Vary: Origin, which is not itself permission checking. Framing review collects the protected response header, enforce/report disposition and complete ancestor chain rather than counting meta/default-src as protection. Message logs separate origin/source/schema/transaction matches and reasons without logging secrets or full bodies. Browser diagnostics know their network/CORS results and server audit knows its own action; one surface cannot certify the whole chain.

Keep the matrices separate

Regression expects blocked script access for credentials mode include with wildcard ACAO; uncredentialed public wildcard and explicit approved origins follow their own policies. The ancestor matrix separates an owned chain from a different outer origin above an owned immediate parent, and distinguishes enforced CSP from legacy XFO fallback. Window checks independently cover same origin with wrong reference, valid reference with stale transaction and invalid schema. Opaque origins or intentional port transfer require different product contracts rather than silently joining this exact tuple-origin Window profile. Native structuredClone only verifies copied ordinary data, not browser event identity, CORS or framing enforcement. Product policy retains text rendering and server action gates independently from these transport/result controls.

NOW APPLY IT TO THE CASE

Are CORS, framing and message acceptance one permission?

Atlas wants to read the API body, embed the preview and accept a title reply for read-7. An include-mode wildcard response is unreadable; another origin in the ancestor chain can change framing. A read-6 reply from the correct origin does not complete current read-7 work.

Which relationship does the case’s browser policy control? Explain exposure, destination or framing decisions separately from server object permission.

Open the related case file ↗

READ THE EXAMPLE TOGETHER

Exposure, ancestor and Window-message ledger

Select a field and examine what it supports and where the evidence ends.

Read the raw artifact and field explanations
{
  "profile": {
    "parentOrigin": "https://atlas.example.org",
    "previewOrigin": "https://preview.example.org",
    "previewReference": "preview-A",
    "pendingRequestId": "read-7",
    "apiOrigin": "https://api.example.org",
    "title": "Tea & Bread",
    "actualBrowser": false,
    "actualMessage": false,
    "actualRequest": false,
    "actualFraming": false
  },
  "corsRows": [
    {
      "case": "explicit",
      "requestOrigin": "https://atlas.example.org",
      "credentialsMode": "include",
      "acao": "https://atlas.example.org",
      "acac": "true",
      "serverReadAllowed": true,
      "expectedExposed": true
    },
    {
      "case": "cors-denied",
      "requestOrigin": "https://atlas.example.org",
      "credentialsMode": "include",
      "acao": "*",
      "acac": "true",
      "serverReadAllowed": true,
      "expectedExposed": false
    },
    {
      "case": "public-wildcard",
      "requestOrigin": "https://atlas.example.org",
      "credentialsMode": "omit",
      "acao": "*",
      "acac": null,
      "serverReadAllowed": true,
      "expectedExposed": true
    },
    {
      "case": "wrong-origin",
      "requestOrigin": "https://atlas.example.org",
      "credentialsMode": "omit",
      "acao": "https://reader.example.net",
      "acac": null,
      "serverReadAllowed": true,
      "expectedExposed": false
    }
  ],
  "framing": {
    "resourceOrigin": "https://preview.example.org",
    "rows": [
      {
        "case": "owned-chain",
        "ancestors": [
          "https://atlas.example.org",
          "https://atlas.example.org"
        ],
        "cspDelivery": "header",
        "cspDisposition": "enforce",
        "allowedOrigins": [
          "https://atlas.example.org"
        ],
        "xfo": "DENY",
        "expectedAllowed": true
      },
      {
        "case": "frame-denied",
        "ancestors": [
          "https://reader.example.net",
          "https://atlas.example.org"
        ],
        "cspDelivery": "header",
        "cspDisposition": "enforce",
        "allowedOrigins": [
          "https://atlas.example.org"
        ],
        "xfo": "DENY",
        "expectedAllowed": false
      },
      {
        "case": "legacy-own",
        "ancestors": [
          "https://preview.example.org"
        ],
        "cspDelivery": null,
        "cspDisposition": null,
        "allowedOrigins": [],
        "xfo": "SAMEORIGIN",
        "expectedAllowed": true
      },
      {
        "case": "report-only",
        "ancestors": [
          "https://atlas.example.org"
        ],
        "cspDelivery": "header",
        "cspDisposition": "report",
        "allowedOrigins": [],
        "xfo": "DENY",
        "expectedAllowed": false
      }
    ],
    "allAncestorsChecked": true,
    "defaultSrcFallback": false,
    "metaEnforcesFrameAncestors": false,
    "actualHeaders": false
  },
  "messageSchema": {
    "keys": [
      "kind",
      "version",
      "requestId",
      "title"
    ],
    "kind": "book-title",
    "version": 1,
    "maxTitle": 80
  },
  "messageRows": [
    {
      "case": "normal",
      "origin": "https://preview.example.org",
      "sourceReference": "preview-A",
      "targetOrigin": "https://atlas.example.org",
      "data": {
        "kind": "book-title",
        "version": 1,
        "requestId": "read-7",
        "title": "Tea & Bread"
      },
      "expected": true
    },
    {
      "case": "stale-message",
      "origin": "https://preview.example.org",
      "sourceReference": "preview-A",
      "targetOrigin": "https://atlas.example.org",
      "data": {
        "kind": "book-title",
        "version": 1,
        "requestId": "read-6",
        "title": "Tea & Bread"
      },
      "expected": false
    },
    {
      "case": "wrong-reference",
      "origin": "https://preview.example.org",
      "sourceReference": "preview-B",
      "targetOrigin": "https://atlas.example.org",
      "data": {
        "kind": "book-title",
        "version": 1,
        "requestId": "read-7",
        "title": "Tea & Bread"
      },
      "expected": false
    },
    {
      "case": "wrong-origin",
      "origin": "https://reader.example.net",
      "sourceReference": "preview-A",
      "targetOrigin": "https://atlas.example.org",
      "data": {
        "kind": "book-title",
        "version": 1,
        "requestId": "read-7",
        "title": "Tea & Bread"
      },
      "expected": false
    },
    {
      "case": "shape-denied",
      "origin": "https://preview.example.org",
      "sourceReference": "preview-A",
      "targetOrigin": "https://atlas.example.org",
      "data": {
        "kind": "book-title",
        "version": 1,
        "requestId": "read-7",
        "title": null
      },
      "expected": false
    }
  ],
  "boundaries": {
    "corsExposureGrantsAction": false,
    "framePolicyGrantsRead": false,
    "originMatchProvesSchema": false,
    "clonedDataTrusted": false,
    "messageAcceptedPermitsHTML": false
  }
}
corsRows
Browser exposure differs from server read permission.
framing
Response-owned ancestor/XFO matrix uses a selected support profile.
messageSchema
Expected fields/types for a closed harmless title reply.
messageRows
Event-identity aliases, target and pending transaction are separate.
profile
Reserved example origins and no-actual-execution scope.

Typed inert rows; sourceReference is not an actual WindowProxy. No CORS, CSP/XFO or browser postMessage executes.

Two reality checks

A blocked CORS response means the server never received the request.

A normal simple request may have reached the server; script exposure is separate.

A matching event.origin makes a message safe to use.

Validate source reference, schema and pending transaction separately and keep output as text.

YOUR TURN

Work through this story.

Predict the outcome, find the evidence boundary, and explain it in your own words.

The reply origin and sourceReference match, but requestId=read-6 while read-7 is pending. Is the title accepted?

  1. No. stale-message has expected=false.
  2. Yes. The correct origin makes every title message acceptable.
Read the explained answer

No. stale-message has expected=false. — Correct origin/source do not make an old reply current. The pending requestId must match too.

Both rows include XFO DENY. In the supporting-browser profile, why is owned-chain allowed while report-only is denied?

Selected lesson artifact fields; teaching example

framing.rows[0]
{"case":"owned-chain","ancestors":["https://atlas.example.org","https://atlas.example.org"],"cspDelivery":"header","cspDisposition":"enforce","allowedOrigins":["https://atlas.example.org"],"xfo":"DENY","expectedAllowed":true}
framing.rows[3]
{"case":"report-only","ancestors":["https://atlas.example.org"],"cspDelivery":"header","cspDisposition":"report","allowedOrigins":[],"xfo":"DENY","expectedAllowed":false}
framing.allAncestorsChecked
true
  1. An allowed immediate parent automatically approves every ancestor and XFO.
  2. Enforced frame-ancestors overrides XFO; report-only does not.
Read the explained answer

Enforced frame-ancestors overrides XFO; report-only does not. — The owned chain has every ancestor on the allowlist. The enforced header takes precedence in a supporting browser; XFO DENY applies to the report-only row.

Wildcard ACAO denies exposure in include mode. Why are that result, framing and an accepted postMessage not server-action permission?

Read the explained answer

CORS determines script exposure, not server-action permission. Frame policy constrains ancestors that may embed; it does not grant DOM read. Messages require exact origin/source, schema and the pending transaction. An accepted title remains data, not permission for HTML interpretation or API access. These tables predict defined conditions rather than executing real browser enforcement.

□ I explained CORS, framing and message checks separately.

□ I did not treat browser outcomes as server-action or HTML-sink permission.

Open the application console · request / response / browser
Also open request, URL, cookie and DOM examples

Sources and scope