| # Process Model and Site Isolation | 
 |  | 
 | As the early Web matured, web sites evolved from simple documents to active | 
 | programs, changing the web browser's role from a simple document renderer to an | 
 | operating system for programs. Modern browsers like Chromium use multiple | 
 | operating system processes to manage this workload, improving stability, | 
 | security, and performance. | 
 |  | 
 | Chromium's **process model** determines how documents, workers, and other web | 
 | content are divided into processes. First, the process model must identify | 
 | which parts of a "program" on the web need to coexist in a single process. | 
 | Somewhat surprisingly, a program on the web is not a single document plus its | 
 | subresources, but rather a group of same (or similar) origin documents that can | 
 | fully access each other's contents. Once these atomic groups are defined, the | 
 | process model can then decide which groups will share a process. These | 
 | decisions can be tuned based on platform, available resources, etc, to achieve | 
 | the right level of isolation for different scenarios. | 
 |  | 
 | This document outlines the goals and design of Chromium's process model and the | 
 | various ways it is used today, including its support for Site Isolation. | 
 |  | 
 | [TOC] | 
 |  | 
 |  | 
 | ## Goals | 
 |  | 
 | At a high level, Chromium aims to use separate processes for different instances | 
 | of web sites when possible. A **web site instance** is a group of documents or | 
 | workers that must share a process with each other to support their needs, such | 
 | as cross-document scripting. (This roughly corresponds to an "[agent | 
 | cluster](https://html.spec.whatwg.org/multipage/webappapis.html#integration-with-the-javascript-agent-cluster-formalism)" | 
 | from the HTML Standard, as described below.) | 
 |  | 
 | For stability, putting web site instances in separate processes limits the | 
 | impact of a renderer process crash or hang, allowing other content to continue | 
 | working. For performance, this allows different web site instances to run in | 
 | parallel with better responsiveness, at the cost of some memory overhead for | 
 | each process. | 
 |  | 
 | For security, strictly using separate processes for different web sites allows | 
 | significantly stronger defenses against malicious web sites. In addition to | 
 | running web content within a low-privilege | 
 | [sandbox](https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md) | 
 | that limits an attacker's access to the user's machine, Chromium's | 
 | multi-process architecture can support [Site | 
 | Isolation](https://www.chromium.org/Home/chromium-security/site-isolation), | 
 | where each renderer process is only allowed to access data from a single site. | 
 | Site Isolation involves: | 
 |  | 
 | * **Locked Renderer Processes**: A renderer process can be limited to documents | 
 |     and workers from a single web site or origin, even if such documents are in | 
 |     iframes. | 
 | * **Browser-Enforced Restrictions**: The privileged browser process can monitor | 
 |     IPC messages from renderer processes to limit their actions or access to | 
 |     site data (e.g., using ChildProcessSecurityPolicy::CanAccessDataForOrigin). | 
 |     This [prevents compromised renderer | 
 |     processes](https://chromium.googlesource.com/chromium/src/+/main/docs/security/compromised-renderers.md) | 
 |     from asking for cross-site data, using permissions granted to other sites, | 
 |     etc. These restrictions take two main forms: | 
 |   * _"Jail" checks_: Ensure that a process locked to a particular site can only | 
 |       access data belonging to that site. If all processes are locked, this is | 
 |       sufficient protection. | 
 |   * _"Citadel" checks_: Ensure that unlocked processes cannot access data | 
 |       for sites that require a dedicated process. This adds protection in cases | 
 |       where full Site Isolation is not available, such as Android. | 
 | * **Network Response Limitations**: Chromium can ensure that locked renderer | 
 |     processes are only allowed to receive sensitive data (e.g., HTML, XML, | 
 |     JSON) from their designated site or origin, while still allowing | 
 |     cross-origin subresource requests (e.g., images, media) as needed for | 
 |     compatibility. This is achieved using [Cross-Origin Read | 
 |     Blocking](https://www.chromium.org/Home/chromium-security/corb-for-developers) | 
 |     (CORB) or [Opaque Response Blocking](https://github.com/annevk/orb) (ORB). | 
 |  | 
 |  | 
 | ## Abstractions and Implementations | 
 |  | 
 | Chromium uses several abstractions to track which documents and workers need | 
 | synchronous access to each other, as a constraint for process model decisions. | 
 |  | 
 | * **Security Principal** (implemented by | 
 |     [SiteInfo](https://source.chromium.org/chromium/chromium/src/+/main:content/browser/site_info.h;drc=c79153d6f931dbe2ce2c992962512eaca6766623;l=22)): | 
 |     In security terminology, a **principal** is an entity with certain | 
 |     privileges. Chromium associates a security principal with execution | 
 |     contexts (e.g., documents, workers) to track which data their process is | 
 |     allowed to access. This principal is typically a | 
 |     "[site](https://html.spec.whatwg.org/multipage/origin.html#site)" (i.e., | 
 |     scheme plus eTLD+1, such as `https://example.com`), because web pages can | 
 |     modify their document.domain value to access other same-site documents, and | 
 |     not just same-origin documents. In some cases, though, the principal may be | 
 |     an origin or have a coarser granularity (e.g., `file:`). The SiteInfo class | 
 |     tracks all values that identify a security principal. | 
 |  | 
 | * **Principal Instance** (implemented by | 
 |     [SiteInstance](https://source.chromium.org/chromium/chromium/src/+/main:content/public/browser/site_instance.h;drc=858df4ab8b73f2418f51385954760f2154512029;l=32)): | 
 |     A principal instance is the core unit of Chromium's process model. Any two | 
 |     documents with the same principal in the same browsing context group | 
 |     (see below) must live in the same process, because they have synchronous | 
 |     access to each other's content. This access includes cross-document | 
 |     scripting and synchronous communication through shared memory (e.g., | 
 |     SharedArrayBuffer). If such documents were in different processes, data | 
 |     races or deadlocks would occur if they concurrently accessed objects in | 
 |     their shared DOM or JavaScript heaps. | 
 |  | 
 |     This roughly corresponds to the [agent | 
 |     cluster](https://html.spec.whatwg.org/multipage/webappapis.html#integration-with-the-javascript-agent-cluster-formalism) | 
 |     concept in the spec, although they do not match exactly: multiple agent | 
 |     clusters may sometimes share a principal instance (e.g., with `data:` URLs | 
 |     in the same principal instance as their creator), and principals may keep | 
 |     track of more factors than [agent cluster | 
 |     keys](https://html.spec.whatwg.org/multipage/webappapis.html#agent-cluster-key) | 
 |     (e.g., whether the StoragePartition differs). | 
 |  | 
 |     Note that the user may visit multiple instances of a given principal in the | 
 |     browser, sometimes in unrelated tabs (i.e., separate browsing context | 
 |     groups). These separate instances do not need synchronous access to each | 
 |     other and can safely run in separate processes. | 
 |  | 
 | * **Browsing Context Group** (implemented by | 
 |     [BrowsingInstance](https://source.chromium.org/chromium/chromium/src/+/main:content/browser/browsing_instance.h;drc=df269acf8de952b68b2fbec49365457ff1f6266b;l=34)): | 
 |     A browsing context group is a group of tabs and frames (i.e., containers of | 
 |     documents) that have references to each other (e.g., frames within the same | 
 |     page, popups with window.opener references, etc). Any two documents within | 
 |     a browsing context group may find each other by name, so it is important | 
 |     that any same-principal documents in the group live in the same process. In | 
 |     other words, there is only one principal instance per principal in a given | 
 |     browsing context group. Note that a tab may change its browsing context | 
 |     group on some types of navigations (e.g., due to a | 
 |     Cross-Origin-Opener-Policy header, browser-initiated cross-site | 
 |     navigations, and other reasons). | 
 |  | 
 | From an implementation perspective, Chromium keeps track of the SiteInstance of | 
 | each RenderFrameHost, to determine which renderer process to use for the | 
 | RenderFrameHost's documents. SiteInstances are also tracked for workers, such | 
 | as ServiceWorker or SharedWorkerHost. | 
 |  | 
 |  | 
 | ## Modes and Availability | 
 |  | 
 | ### Full Site Isolation (site-per-process) | 
 |  | 
 | _Used on: Desktop platforms (Windows, Mac, Linux, ChromeOS)._ | 
 |  | 
 | In (one-)site-per-process mode, each process is locked to documents from a | 
 | single site. Sites are defined as scheme plus eTLD+1, since different origins | 
 | within a given site may have synchronous access to each other if they each | 
 | modify their document.domain. This mode provides all sites protection against | 
 | compromised renderers and Spectre-like attacks, without breaking backwards | 
 | compatibility. | 
 |  | 
 | This mode can be enabled on Android using | 
 | `chrome://flags/#enable-site-per-process`. | 
 |  | 
 |  | 
 | ### Partial Site Isolation | 
 |  | 
 | _Used on: Chrome for Android (2+ GB RAM)._ | 
 |  | 
 | On platforms like Android with more significant resource constraints, Chromium | 
 | only uses dedicated (locked) processes for some sites, putting the rest in | 
 | unlocked processes that can be used for any web site. (Note that there is a | 
 | threshold of about 2 GB of device RAM required to support any level of Site | 
 | Isolation on Android.) | 
 |  | 
 | Locked processes are only allowed to access data from their own site. Unlocked | 
 | processes can generally access data from any site that does not require a | 
 | locked process. Chromium usually creates one unlocked process per browsing | 
 | context group. | 
 |  | 
 | Currently, several heuristics are used to isolate the sites that are most likely | 
 | to have user-specific information. As on all platforms, privileged pages like | 
 | WebUI are always isolated. Chromium also isolates sites that users tend to log | 
 | into in general, as well as sites on which a given user has entered a password, | 
 | logged in via an OAuth provider, or encountered a Cross-Origin-Opener-Policy | 
 | (COOP) header. | 
 |  | 
 |  | 
 | ### No Site Isolation | 
 |  | 
 | _Used on: Low-memory Chrome for Android (<2 GB RAM), Android WebView, Chrome for | 
 | iOS._ | 
 |  | 
 | On some platforms, Site Isolation is not available, due to implementation or | 
 | resource constraints. | 
 |  | 
 | * On Android devices with less than 2 GB of RAM, Site Isolation is disabled to | 
 |   avoid requiring multiple renderer processes in a given tab (for out-of-process | 
 |   iframes). Cross-process navigations in the main frame are still possible | 
 |   (e.g., for browser-initiated cross-site navigations with no other pages in the | 
 |   browsing context group, when a new browsing context group may be created). | 
 | * Android WebView does not yet support multiple renderer processes or | 
 |   out-of-process iframes. | 
 | * Chrome for iOS uses WebKit, which does not currently have support for | 
 |   out-of-process iframes or Site Isolation. | 
 |  | 
 |  | 
 | ### Origin Isolation | 
 |  | 
 | _Available on: Desktop platforms, Chrome for Android (2+ GB RAM)._ | 
 |  | 
 | There are several optional ways to lock processes at an origin granularity | 
 | rather than a site granularity, with various tradeoffs for compatibility | 
 | (e.g., breaking pages that modify document.domain). These are available on | 
 | platforms that support some level of Site Isolation. | 
 |  | 
 | * **Built-in**: //content embedders can designate particular origins that | 
 |     require isolation from the rest of their site, using | 
 |     ContentBrowserClient::GetOriginsRequiringDedicatedProcess. | 
 | * **Configurable**: Users and administrators can list particular origins that | 
 |     should be isolated from the rest of their site, using the command line | 
 |     (`--isolate-origins=`...), `chrome://flags#isolate-origins`, or | 
 |     [enterprise policy](https://support.google.com/chrome/a/answer/7581529) | 
 |     ([IsolateOrigins](https://chromeenterprise.google/policies/#IsolateOrigins) | 
 |     or | 
 |     [IsolateOriginsAndroid](https://chromeenterprise.google/policies/#IsolateOriginsAndroid)). | 
 |     It is also possible to isolate all origins (except those that opt-out) using | 
 |     `chrome://flags/#origin-keyed-processes-by-default`. | 
 | * **Opt-in**: The [Origin-Agent-Cluster](https://web.dev/origin-agent-cluster) | 
 |     HTTP response header can be used by web developers to hint to the browser | 
 |     that an origin locked process can be used. This is not a security guarantee | 
 |     and may not always be honored (e.g., to keep all same-origin documents | 
 |     consistent within a given browsing context group), though it allows finer | 
 |     grained isolation in the common case. Note that | 
 |     [Origin-Agent-Cluster is now enabled by default](https://github.com/mikewest/deprecating-document-domain), | 
 |     effectively disabling changes to document.domain unless an OAC opt-out | 
 |     header is used. | 
 |  | 
 |  | 
 | ### CrossOriginIsolated | 
 |  | 
 | Certain powerful web platform features now require an opt-in | 
 | [CrossOriginIsolated](https://web.dev/coop-coep/) mode, which ensures that all | 
 | cross-origin content (e.g., documents and workers, as well as subresources like | 
 | media or scripts) consents to being loaded in the same process as an origin | 
 | using these features. This opt-in is required because these powerful features | 
 | (e.g., SharedArrayBuffers) can be used for very precise timing, which can make | 
 | attacks that leak data from the process (e.g., using Spectre or other transient | 
 | execution attacks) more effective. This mode is important because not all | 
 | browsers support out-of-process iframes for cross-origin documents, and not all | 
 | cross-origin subresources can be put in a separate process. | 
 |  | 
 | CrossOriginIsolated mode requires the main document to have | 
 | Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy headers. These | 
 | headers impose restrictions on all content that may load within the page or | 
 | process (e.g., requiring similar headers on subframes, and CORS, CORP, or a | 
 | credentialless mode for subresources). | 
 |  | 
 |  | 
 | ### Historical Modes | 
 |  | 
 | Before Site Isolation was introduced, Chromium initially supported a few other | 
 | process models that affected the number of renderer processes. | 
 |  | 
 | * **Process-per-site-instance**: This model was the default when Chromium first | 
 |     launched. It used a new process when navigating to a different site in some | 
 |     scenarios (e.g., via the address bar but not link clicks), as well as when | 
 |     visiting different instances of the same site in different tabs. At the | 
 |     time, cross-site subframes stayed in the same process as their parent | 
 |     frames. | 
 | * **Process-per-site**: This model consolidated all instances of a given site | 
 |     into a single process (per profile), to reduce the process count. It | 
 |     generally led to poor usability when a single process was used for too many | 
 |     tabs. This mode is still used for certain limited cases (e.g., the New Tab | 
 |     Page) to reduce the process count and process creation latency. It is also | 
 |     used for extensions to allow synchronous scripting from a background page. | 
 |     Note that having a single process for a site might not be guaranteed (e.g., | 
 |     due to multiple profiles, or races). | 
 | * **Process-per-tab**: This model used a separate process for each browsing | 
 |     context group (i.e., possibly multiple related tabs), but did not attempt | 
 |     to switch processes on cross-site navigations. In practice, though, this | 
 |     model still needed to swap processes for privileged pages like `chrome://` | 
 |     URLs. | 
 | * **Single process**: Chromium also allows a single process model which runs all | 
 |     of the browser and renderer code in a single OS process. This is generally | 
 |     not a safe or robust process model, since it prevents the use of the | 
 |     sandbox and cannot survive any crash in renderer process code. It is mainly | 
 |     used for older low-resource Android WebView scenarios, and for debugging or | 
 |     testing. | 
 |  | 
 |  | 
 | ## Visualizations | 
 |  | 
 | Chromium provides several ways to view the current state of the process model: | 
 |  | 
 | * **Chromium's Task Manager**: This can be found under "More Tools" in the menu, | 
 |     and shows live resource usage for each of Chromium's processes. The Task | 
 |     Manager also shows which documents and workers are grouped together in a | 
 |     given process: only the first row of a given group displays process ID and | 
 |     most statistics, and all rows of a group are highlighted when one is | 
 |     clicked. Note that double clicking any row attempts to switch to the tab it | 
 |     is associated with. In the default sort order (i.e., when clicking the Task | 
 |     column header until the up/down triangle disappears), processes for | 
 |     subframes are listed under the process for their tab when possible, | 
 |     although this may not be possible if subframes from multiple tabs are in a | 
 |     given process. | 
 | * **`chrome://process-internals/#web-contents`**: This is an internal diagnostic | 
 |     page which shows information about the SiteInstances and processes for each | 
 |     open document. | 
 | * **`chrome://discards/graph`**: This is an internal diagnostic page that | 
 |     includes a visualization of how the open documents and workers map to | 
 |     processes. Clicking on any node provides more details. | 
 |  | 
 |  | 
 | ## Process Reuse | 
 |  | 
 | For performance, Chromium attempts to strike a balance between using more | 
 | processes to improve parallelism and using fewer processes to conserve memory. | 
 | There are some cases where a new process is always required (e.g., for a | 
 | cross-site page when Site Isolation is enabled), and other cases where | 
 | heuristics can determine whether to create a new process or reuse an old one. | 
 | Generally, process reuse can only happen in suitable cases, such as within a | 
 | given profile or respecting a process lock.  Several factors go into this | 
 | decision. | 
 |  | 
 | * **Suitability**: Several properties are global to a given renderer process: | 
 |     profile (including Incognito), StoragePartition (which may differ between | 
 |     tabs and Chrome Apps), and crossOriginIsolated status. For example, two | 
 |     documents from different profiles or StoragePartitions can never share the | 
 |     same renderer process. The ProcessLock (described below) also restricts | 
 |     which documents are allowed in a process. | 
 | * **Soft Process Limit**: On desktop platforms, Chromium sets a "soft" process | 
 |     limit based on the memory available on a given client. While this can be | 
 |     exceeded (e.g., if Site Isolation is enabled and the user has more open | 
 |     sites than the limit), Chromium makes an attempt to start randomly reusing | 
 |     same-site processes when over this limit. For example, if the limit is 100 | 
 |     processes and the user has 50 open tabs to `example.com` and 50 open tabs to | 
 |     `example.org`, then a new `example.com` tab will share a process with a | 
 |     random existing `example.com` tab, while a `chromium.org` tab will create a | 
 |     101st process. Note that Chromium on Android does not set this soft process | 
 |     limit, and instead relies on the OS to discard processes. | 
 | * **Aggressive Reuse**: For some cases (including on Android), Chromium will | 
 |     aggressively look for existing same-site processes to reuse even before | 
 |     reaching the process limit. Out-of-process iframes (OOPIFs) and [fenced | 
 |     frames](https://developer.chrome.com/en/docs/privacy-sandbox/fenced-frame/) | 
 |     use this approach, such that an `example.com` iframe in a cross-site page | 
 |     will be placed in an existing `example.com` process (in any browsing context | 
 |     group), even if the process limit has not been reached. This keeps the | 
 |     process count lower, based on the assumption that most iframes/fenced frames | 
 |     are less resource demanding than top-level documents. Similarly, | 
 |     ServiceWorkers are generally placed in the same process as a document that | 
 |     is likely to rely on them. | 
 | * **Extensions**: Chromium ensures that extensions do not share a process with | 
 |     each other or with web pages, but also that a large number of extensions | 
 |     will not consume the entire soft process limit, forcing same-site web pages | 
 |     into too few processes. Chromium only allows extensions to consume [one | 
 |     third](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc;drc=8d6a246c9be4f6b731dc7f6e680b7d5e13a512b5;l=454-458) | 
 |     of the process limit before disregarding further extension processes from | 
 |     the process limit computation. | 
 | * **Process-per-site**: As noted above, pages like the New Tab Page (NTP) and | 
 |     extensions use a model where all instances of the page are placed in the | 
 |     same process. | 
 |  | 
 |  | 
 | ## Process Locks | 
 |  | 
 | Chromium assigns a | 
 | [ProcessLock](https://source.chromium.org/chromium/chromium/src/+/main:content/browser/process_lock.h;drc=47457a6923c0527261d0503998cbeb7de9bab489;l=19) | 
 | to some or all RenderProcessHosts, to restrict which sites are allowed to load | 
 | in the process and which data the process has access to. A RenderProcessHost is | 
 | an object in the browser process that represents a given renderer process, | 
 | though it can be reused if that renderer process crashes and is restarted. Some | 
 | ProcessLock cases are used on all platforms (e.g., `chrome://` URLs are never | 
 | allowed to share a process with other sites), while other cases may depend on | 
 | the mode (e.g., Full Site Isolation requires all processes to be locked, once | 
 | content has been loaded in the process). | 
 |  | 
 | ProcessLocks may have varying granularity, such as a single site | 
 | (e.g., `https://example.com`), a single origin | 
 | (e.g., `https://accounts.example.com`), an entire scheme (e.g., `file://`), or | 
 | a special "allow-any-site" value for processes allowed to host multiple sites | 
 | (which may have other restrictions, such as whether they are | 
 | crossOriginIsolated). RenderProcessHosts begin with an "invalid" or unlocked | 
 | ProcessLock before one is assigned. | 
 |  | 
 | ProcessLocks are always assigned before any content is loaded in a renderer | 
 | process, either at the start of a navigation or at OnResponseStarted time, just | 
 | before a navigation commits. Note that a process may initially receive | 
 | an "allow-any-site" lock for some empty document schemes (e.g., `about:blank`), | 
 | which may later be refined to a site-specific lock when the first actual | 
 | content commits. Once a site-specific lock is assigned, it remains constant for | 
 | the lifetime of the RenderProcessHost, even if the renderer process itself | 
 | exits and is recreated. | 
 |  | 
 | Note that content may be allowed in a locked process based on its origin | 
 | (e.g., an `about:blank` page with an inherited `https://example.com` origin is | 
 | allowed in a process locked to `https://example.com`). Also, some opaque origin | 
 | cases are allowed into a locked process as well, such as `data:` URLs created | 
 | within that process. | 
 |  | 
 |  | 
 | ## Special Cases | 
 |  | 
 | There are many special cases to consider in Chromium's process model, which may | 
 | affect invariants or how features are designed. | 
 |  | 
 | * **WebUI**: Pages like `chrome://settings` are considered part of Chromium and | 
 |     are highly privileged, usually hosted in the `chrome://` scheme. They are | 
 |     strictly isolated from non-WebUI pages as well as other types of WebUI | 
 |     pages (based on "site"), on all platforms. They are also generally not | 
 |     allowed to load content from the network (apart from a shrinking | 
 |     [list](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc;drc=3344b61f7c7f06cf96069751c3bd64d8ec3e3428;l=1405) | 
 |     of allowlisted pages), unless it is from a separate unprivileged | 
 |     `chrome-untrusted://` document. Additionally, normal web pages are not | 
 |     allowed to navigate to WebUI pages, which makes privilege escalation | 
 |     attacks more difficult. | 
 | * **New Tab Page**: On desktop platforms, the default "local" NTP is a WebUI | 
 |     page using process-per-site mode, which loads content from the network via | 
 |     `chrome-untrusted://` iframes. Third party NTPs are also possible, which | 
 |     load a "remote" non-WebUI web page with limited privileges. On Android, the | 
 |     NTP is instead a native Android surface with no privileged renderer | 
 |     process. Chrome on Android creates an unused renderer process in the | 
 |     background while the NTP surface is visible, so that the next page can use | 
 |     it. | 
 | * **Extensions**: On desktop platforms, extension documents and workers are | 
 |     semi-privileged and run in dedicated renderer processes. In contrast, | 
 |     extension content scripts run within the same unprivileged web renderer | 
 |     process as the pages they modify, and thus Chrome Extensions need to | 
 |     [treat content scripts as less | 
 |     trustworthy](https://groups.google.com/a/chromium.org/g/chromium-extensions/c/0ei-UCHNm34/m/lDaXwQhzBAAJ). | 
 |     The browser process makes an effort to enforce that renderer processes have | 
 |     access to any extension APIs or capabilities that they attempt to use. | 
 | * **Hosted Apps**: A hosted app is a deprecated type of extension which allows a | 
 |     normal web site to have a special type of renderer process. For example, a | 
 |     hosted app for `https://example.com/app/` will have an "effective URL" that | 
 |     looks like a `chrome-extension://` URL, causing it to be treated | 
 |     differently in the process model. This support may eventually be removed. | 
 | * **Chrome Web Store**: The [Chrome Web | 
 |     Store](https://chromewebstore.google.com/) is a rare example of a privileged | 
 |     web origin, to which Chrome grants special APIs for installing extensions. | 
 | * **[Isolated Web Apps](https://github.com/WICG/isolated-web-apps/blob/main/README.md)**: Isolated | 
 |     Web Apps (IWAs) are a type of web app that has stricter security and | 
 |     isolation requirements compared to normal web apps. The StoragePartition | 
 |     used for each IWA will be separate from the default StoragePartition used | 
 |     for common browsing and separate from other IWAs. IWAs require strict CSP, | 
 |     [CrossOriginIsolated](#crossoriginisolated), along with other isolation | 
 |     criteria. These contexts are claimed to be | 
 |     "[IsolatedContext](https://wicg.github.io/isolated-web-apps/isolated-contexts)" | 
 |     and | 
 |     "[IsolatedApplication](https://source.chromium.org/chromium/chromium/src/+/main:content/public/browser/web_exposed_isolation_level.h;l=62;drc=998312ac45f85e53257049c5891dff558f203c00)". | 
 | * **GuestView**: The Chrome Apps `<webview>` tag and similar cases like | 
 |     MimeHandlerView and ExtensionOptionsGuest embed one WebContents within | 
 |     another. All of these cases use strict site isolation for content they | 
 |     embed. Note that Chrome Apps allow `<webview>` tags to load normal web pages | 
 |     and the app's own `data:` or `chrome-extension://` URLs, but not URLs from | 
 |     other extensions or apps. The IWA | 
 |     [<controlledframe>](/chrome/common/controlled_frame/README.md) tag is built | 
 |     on top of the `<webview>` tag's implementation and exposed to contexts | 
 |     that meet the proper security and isolation requirements, such as IWAs that | 
 |     provide IsolatedContexts. See the | 
 |     [Isolated Contexts spec](https://wicg.github.io/isolated-web-apps/isolated-contexts) | 
 |     for more info. | 
 | * **Sandboxed iframes**: Documents with the sandbox attribute and without | 
 |     `allow-same-origin` (either iframes or popups) may be same-site with their | 
 |     parent or opener but use an opaque origin. Since 127.0.6483.0, Desktop | 
 |     Chromium moves these documents into a separate process from their | 
 |     parent or opener. On Android, these documents will only be in a separate | 
 |     process if their parent/opener uses | 
 |     [Partial Site Isolation](#partial-site-isolation). Sandboxed frames embedded | 
 |     in extension pages are in a separate process if they are listed in the | 
 |     "sandbox" section of the extension's manifest, otherwise they are in the | 
 |     same process as the parent. | 
 | * **`data:` URLs**: Chromium generally keeps documents with `data:` URLs in the | 
 |     same process as the site that created them, since that site has control | 
 |     over their content. The exception is when restoring a previous session, in | 
 |     which case each document with a `data:` URL ends up in its own process. | 
 | * **File URLs**: Chromium currently treats all `file://` URLs as part of the | 
 |     same site. Normal web pages are not allowed to load `file://` URLs, and | 
 |     renderer processes are only granted access to particular `file://` URLs via | 
 |     file chooser dialogs (e.g., for uploads). These URLs may be further isolated | 
 |     from each other in bug [780770](https://crbug.com/780770). | 
 | * **Error Pages**: Chromium uses a special type of process for error pages | 
 |     provided by the browser (as opposed to error pages provided by a web site, | 
 |     like a 404 page), using process-per-site mode to keep all such pages in the | 
 |     same process. Currently this only applies to error pages in a main frame. | 
 | * **Spare Process**: Chromium often creates a spare RenderProcessHost with a | 
 |     live but unlocked renderer process, which is used the next time a renderer | 
 |     process is needed. This avoids the need to wait for a new process to | 
 |     start. | 
 | * **Android WebView**: While Android WebView uses much of the same code as | 
 |     Chromium, it currently only supports a single renderer process in most | 
 |     cases. | 
 |  | 
 |  | 
 | ## Videos | 
 |  | 
 | [**What's Up with Site | 
 | Isolation**](https://youtu.be/OH-bt7spDgo?si=T_mL39Sxr_JPit0K), September 2023\ | 
 | An interview about the goals and implementation of Site Isolation (46:41). | 
 |  | 
 | [**Chrome Security EDU: Site Isolation | 
 | 101**](https://youtu.be/-L-LwHiCl9E?si=wEv7gdc7lr_6yiAy), June 2025\ | 
 | A short overview of how Site Isolation helps secure the browser (1:30). | 
 |  | 
 | [**Chrome Security EDU: Site Isolation | 
 | 201**](https://youtu.be/Als73-6bqD0?si=LajJlqJeXZe7RTIl), June 2025\ | 
 | An introduction to how Site Isolation uses placeholders for frames in other | 
 | renderer processes (1:15). | 
 |  | 
 | [**Chrome Security EDU: Chrome's Process Model and Site | 
 | Isolation**](https://youtu.be/2Ds_RIACLbk?si=kZWWF75slbRoZMa_), June 2025\ | 
 | An in-depth look at Site Isolation for browser engineers, including tradeoffs | 
 | when making decisions around the process model (16:36). | 
 |  | 
 |  | 
 | ## Further Reading | 
 |  | 
 | Several academic papers have covered topics about Chromium's process model. | 
 |  | 
 | [**Security Architecture of the Chromium | 
 | Browser**](https://crypto.stanford.edu/websec/chromium/) | 
 |  | 
 | Adam Barth, Collin Jackson, Charles Reis, and The Google Chrome Team. Stanford | 
 | Technical Report, September 2008. | 
 |  | 
 | _Abstract:_ | 
 |  | 
 | Most current web browsers employ a monolithic architecture that combines "the | 
 | user" and "the web" into a single protection domain. An attacker who exploits | 
 | an arbitrary code execution vulnerability in such a browser can steal sensitive | 
 | files or install malware. In this paper, we present the security architecture | 
 | of Chromium, the open-source browser upon which Google Chrome is built. | 
 | Chromium has two modules in separate protection domains: a browser kernel, | 
 | which interacts with the operating system, and a rendering engine, which runs | 
 | with restricted privileges in a sandbox. This architecture helps mitigate | 
 | high-severity attacks without sacrificing compatibility with existing web | 
 | sites. We define a threat model for browser exploits and evaluate how the | 
 | architecture would have mitigated past vulnerabilities. | 
 |  | 
 | [**Isolating Web Programs in Modern Browser | 
 | Architectures**](https://research.google.com/pubs/archive/34924.pdf) | 
 |  | 
 | Charles Reis, Steven D. Gribble (both authors at UW + Google). Eurosys, | 
 | April 2009. | 
 |  | 
 | _Abstract:_ | 
 |  | 
 | Many of today's web sites contain substantial amounts of client-side code, and | 
 | consequently, they act more like programs than simple documents. This creates | 
 | robustness and performance challenges for web browsers. To give users a robust | 
 | and responsive platform, the browser must identify program boundaries and | 
 | provide isolation between them. | 
 |  | 
 | We provide three contributions in this paper. First, we present abstractions of | 
 | web programs and program instances, and we show that these abstractions clarify | 
 | how browser components interact and how appropriate program boundaries can be | 
 | identified. Second, we identify backwards compatibility tradeoffs that | 
 | constrain how web content can be divided into programs without disrupting | 
 | existing web sites. Third, we present a multi-process browser architecture that | 
 | isolates these web program instances from each other, improving fault | 
 | tolerance, resource management, and performance. We discuss how this | 
 | architecture is implemented in Google Chrome, and we provide a quantitative | 
 | performance evaluation examining its benefits and costs. | 
 |  | 
 | [**Site Isolation: Process Separation for Web Sites within the | 
 | Browser**](https://www.usenix.org/conference/usenixsecurity19/presentation/reis) | 
 |  | 
 | Charles Reis, Alexander Moshchuk, and Nasko Oskov, Google. Usenix Security, | 
 | August 2019. | 
 |  | 
 | _Abstract:_ | 
 |  | 
 | Current production web browsers are multi-process but place different web sites | 
 | in the same renderer process, which is not sufficient to mitigate threats | 
 | present on the web today. With the prevalence of private user data stored on | 
 | web sites, the risk posed by compromised renderer processes, and the advent of | 
 | transient execution attacks like Spectre and Meltdown that can leak data via | 
 | microarchitectural state, it is no longer safe to render documents from | 
 | different web sites in the same process. In this paper, we describe our | 
 | successful deployment of the Site Isolation architecture to all desktop users | 
 | of Google Chrome as a mitigation for process-wide attacks. Site Isolation locks | 
 | each renderer process to documents from a single site and filters certain | 
 | cross-site data from each process. We overcame performance and compatibility | 
 | challenges to adapt a production browser to this new architecture. We find that | 
 | this architecture offers the best path to protection against compromised | 
 | renderer processes and same-process transient execution attacks, despite | 
 | current limitations. Our performance results indicate it is practical to deploy | 
 | this level of isolation while sufficiently preserving compatibility with | 
 | existing web content. Finally, we discuss future directions and how the current | 
 | limitations of Site Isolation might be addressed. |