Learn Measure Blog Live About

A guide to enable cross-origin isolation

A guide to enable cross-origin isolation

Cross-origin isolation enables a web page to use powerful features such as SharedArrayBuffer. This article explains how to enable cross-origin isolation on your website.

Updated

This guide shows you how to enable cross-origin isolation. Cross-origin isolation is required if you want to use SharedArrayBuffer, performance.measureUserAgentSpecificMemory(), or the JS Self-Profiling API.

Objective:

  • Turn on cross-origin isolation to keep using SharedArrayBuffer.
  • If you rely on third-party code that uses SharedArrayBuffer, notify the third-party provider to take action.

Determine where in your website SharedArrayBuffer is used

If you are not sure where in your site a SharedArrayBuffer is used, there are two ways find out:

  • Using Chrome DevTools
  • (Advanced) Using Deprecation Reporting

If you already know where you are using SharedArrayBuffer, skip to Analyze the impact of cross-origin isolation.

Using Chrome DevTools

Chrome DevTools allows developers to inspect websites.

  1. Open the Chrome DevTools on the page you suspect might be using SharedArrayBuffer.
  2. Select the Console panel.
  3. If the page is using SharedArrayBuffer, the following message will show up:
    [Deprecation] SharedArrayBuffer will require cross-origin isolation as of M91, around May 2021. See https://developer.chrome.com/blog/enabling-shared-array-buffer/ for more details. common-bundle.js:535
  4. The filename and the line number at the end of the message (for example, common-bundle.js:535) indicate where the SharedArrayBuffer is coming from. If it's a third-party library, contact the developer to fix the issue. If it's implemented as part of your website, follow the guide below to enable cross-origin isolation.
DevToools Console warning when SharedArrayBuffer is used without cross-origin isolation
DevToools Console warning when SharedArrayBuffer is used without cross-origin isolation.

(Advanced) Using Deprecation Reporting

Some browsers have a reporting functionality of deprecating APIs to a specified endpoint.

  1. Set up a deprecation report server and get the reporting URL. You can achieve this by either using a public service or building one yourself.
  2. Using the URL, set the following HTTP header to pages that are potentially serving SharedArrayBuffer.
    Report-To: {"group":"default","max_age":86400,"endpoints":[{"url":"THE_DEPRECATION_ENDPOINT_URL"}]}
  3. Once the header starts to propagate, the endpoint you registered to should start collecting deprecation reports.

See an example implementation here: https://first-party-test.glitch.me.

Analyze the impact of cross-origin isolation

Wouldn't it be great if you could assess the impact that enabling cross-origin isolation would have on your site without actually breaking anything? The Cross-Origin-Opener-Policy-Report-Only and Cross-Origin-Embedder-Policy-Report-Only HTTP headers allow you to do just that.

  1. Set Cross-Origin-Opener-Policy-Report-Only: same-origin on your top-level document. As the name indicates, this header only sends reports about the impact that COOP: same-origin would have on your site—it won't actually disable communication with popup windows.
  2. Set up reporting and configure a web server to receive and save the reports.
  3. Set Cross-Origin-Embedder-Policy-Report-Only: require-corp on your top-level document. Again, this header lets you see the impact of enabling COEP: require-corp without actually affecting your site's functioning yet. You can configure this header to send reports to the same reporting server that you set up in the previous step.

You can also enable the Domain column in Chrome DevTools Network panel to get a general view of which resources would be impacted.

Caution: Enabling cross-origin isolation will block the loading of cross-origin resources that you don't explicitly opt-in, and it will prevent your top-level document from being able to communicate with popup windows.

Mitigate the impact of cross-origin isolation

After you have determined which resources will be affected by cross-origin isolation, here are general guidelines for how you actually opt-in those cross-origin resources:

  1. On cross-origin resources such as images, scripts, stylesheets, iframes, and others, set the Cross-Origin-Resource-Policy: cross-origin header. On same-site resources, set Cross-Origin-Resource-Policy: same-site header.
  2. Set the crossorigin attribute in the HTML tag on top-level document if the resource is served with CORS (for example, <img src="example.jpg" crossorigin>).
  3. If cross-origin resources loaded into iframes involve another layer of iframes, recursively apply steps described in this section before moving forward.
  4. Once you confirm that all cross-origin resources are opted-in, set the Cross-Origin-Embedder-Policy: require-corp header on the cross-origin resources loaded into iframes.
  5. Make sure there are no cross-origin popup windows that require communication through postMessage(). There's no way to keep them working when cross-origin isolation is enabled. You can move the communication to another document that isn't cross-origin isolated, or use a different communication method (for example, HTTP requests).

Enable cross-origin isolation

After you have mitigated the impact by cross-origin isolation, here are general guidelines to enable cross-origin isolation:

  1. Set the Cross-Origin-Opener-Policy: same-origin header on your top-level document. If you had set Cross-Origin-Opener-Policy-Report-Only: same-origin, replace it. This blocks communication between your top-level document and its popup windows.
  2. Set the Cross-Origin-Embedder-Policy: require-corp header on your top-level document. If you had set Cross-Origin-Embedder-Policy-Report-Only: require-corp, replace it. This will block the loading of cross-origin resources that are not opted-in.
  3. Check that self.crossOriginIsolated returns true in console to verify that your page is cross-origin isolated.

Resources

Last updated: Improve article