Cross-Origin-Opener-Policy-Report-Only security response
The monitoring-only counterpart to COOP — reports what window-isolation behavior would change under same-origin without actually enforcing it.
What it does
Cross-Origin-Opener-Policy-Report-Only is the safe-rollout counterpart to Cross-Origin-Opener-Policy (COOP) — it reports what cross-window relationships would be severed under a stricter COOP policy (like same-origin) without actually severing them. COOP controls whether your page shares a browsing context group with cross-origin windows that opened it or that it opened (via window.open, popups, or being embedded); enforcing a strict policy can silently break legitimate cross-window communication (window.opener references, OAuth popup flows) if you haven't audited for it first.
Syntax
Cross-Origin-Opener-Policy-Report-Only: same-origin
Cross-Origin-Opener-Policy-Report-Only: same-origin-allow-popups; report-to="coop-endpoint"
Same value options as the enforcing header (unsafe-none, same-origin-allow-popups, same-origin), paired with a configured reporting destination to actually collect what would break.
Why COOP needs careful auditing before enforcement
Enforcing Cross-Origin-Opener-Policy: same-origin cuts off window.opener access from any cross-origin window that opened your page, and vice versa. This can silently break:
- OAuth/SSO popup flows — an auth provider's popup window communicating back to the opener via
window.opener.postMessage()or direct property access - Payment provider popups — some payment widgets rely on window references between the main page and a popup
- Legacy cross-window integrations — older third-party embeds that assumed unrestricted
window.openeraccess
None of these failures are typically visible during casual testing — they show up specifically in cross-window flows that a standard page-load QA pass wouldn't necessarily exercise, making the report-only staging step particularly valuable here.
Common mistakes and gotchas
Enforcing COOP without testing every popup-based integration. OAuth login flows, payment popups, and third-party auth widgets are the most common casualties of jumping straight to enforcement — these are exactly the flows that are easy to forget about during a general pre-launch QA pass since they're not part of typical page navigation.
Not distinguishing same-origin from same-origin-allow-popups during the audit. If your report-only testing shows violations specifically tied to popup windows, same-origin-allow-popups (a less strict option that preserves some popup relationships) might be the right target policy rather than full same-origin — the report-only phase is exactly when you'd discover which level of strictness your application can actually tolerate.
Assuming COOP report-only also covers COEP violations. These are separate policies with separate report-only headers — auditing COOP doesn't tell you anything about COEP compliance, and full cross-origin isolation requires both to be correctly configured and enforced together.
Forgetting mobile/embedded webview contexts during testing. Some integrations (in-app browsers, embedded webviews) can have different popup/window behavior than a standard desktop browser — testing exclusively in one environment can miss violations that would surface elsewhere.
Real-world examples
Auditing before enabling strict enforcement:
HTTP/1.1 200 OK
Cross-Origin-Opener-Policy-Report-Only: same-origin; report-to="coop-endpoint"
Report-To: {"group":"coop-endpoint","max_age":86400,"endpoints":[{"url":"https://example.com/reports/coop"}]}
After confirming OAuth popup flows survive, enforcing the discovered-safe policy:
HTTP/1.1 200 OK
Cross-Origin-Opener-Policy: same-origin-allow-popups
FAQ
Does this header break my OAuth popup login flow while testing?
No — report-only mode never blocks or restricts anything; it only generates reports about what would break under real enforcement, letting you test your OAuth flow safely and see if any violations were logged afterward.
How do I know whether to target same-origin or same-origin-allow-popups?
Run the report-only audit and see what actually gets flagged — if your only violations trace back to legitimate popup-based flows (OAuth, payments) that you want to preserve, same-origin-allow-popups is likely the right enforcement target; if you have no such dependencies, full same-origin gives stronger isolation.
Can I use this alongside COEP's report-only header?
Yes, and it's common to run both simultaneously if your actual goal is achieving full cross-origin isolation (crossOriginIsolated === true), since that requires both COOP and COEP correctly configured together — auditing them together gives you the full picture before flipping both to enforcement.
What happens to reports if I don't configure a reporting endpoint?
The violations still occur and are visible in the browser's own developer console during manual testing, but you won't get aggregated data from real user traffic without a properly configured report-to destination — meaning issues specific to certain browsers or user flows could go unnoticed.
Fun fact
COOP's report-only staging is arguably even more important than COEP's, precisely because COOP violations are often invisible during normal page-load testing — they only manifest during specific cross-window interaction flows like OAuth popups, which QA processes frequently under-test compared to standard page rendering. This makes COOP one of the clearer examples in the web platform of why report-only modes exist at all: some classes of breakage are genuinely hard to catch through manual testing alone, and real production traffic monitoring becomes the more reliable signal.