// Copyright 2013 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef EXTENSIONS_BROWSER_PROCESS_MAP_H_ #define EXTENSIONS_BROWSER_PROCESS_MAP_H_ #include <stddef.h> #include <optional> #include "base/containers/flat_map.h" #include "components/keyed_service/core/keyed_service.h" #include "content/public/browser/site_instance.h" #include "extensions/common/extension_id.h" #include "extensions/common/features/feature.h" #include "extensions/common/mojom/context_type.mojom-forward.h" namespace content { class BrowserContext; } // namespace content namespace extensions { class Extension; // Contains information about which extensions are assigned to which processes. // // The relationship between extensions and processes is complex: // // - Extensions can be either "split" mode or "spanning" mode. // - In spanning mode, extensions *generally* share a single process between all // incognito and normal windows. This was the original mode for extensions. // - In split mode, extensions have separate processes in incognito windows. // - There are also hosted apps, which are a kind of extensions, and those // usually have a process model similar to normal web sites: multiple // processes per-profile. // - An extension can also opt into Cross Origin Isolation in which case it can // have multiple processes per profile since cross-origin-isolated and // non-cross-origin-isolated contexts don't share a process. // // Under the current model, a single extension can correspond to multiple // processes (see explanation below), but a single process cannot be shared by // multiple extensions. // // Note that because of content scripts, frames, and other edge cases in // Chrome's process isolation, extension code can still end up running outside // an assigned process. // // But we only allow high-privilege operations to be performed by an extension // when it is running in an assigned process. // // =========================================================================== // WARNINGS - PLEASE UNDERSTAND THESE BEFORE CALLING OR MODIFYING THIS CLASS // =========================================================================== // // 1. This class contains the processes for hosted apps as well as extensions // and packaged apps. Just because a process is present here *does not* mean // it is an "extension process" (e.g., for UI purposes). It may contain only // hosted apps. See crbug.com/102533. // // 2. An extension can show up in multiple processes. That is why there is no // GetExtensionProcess() method here. There are multiple such cases: // a) The extension is actually a hosted app. // b) There is an incognito window open and the extension is "split mode". // c) The extension is cross origin isolated but has // non-cross-origin-isolated contexts. // It is *not safe* to assume that there is one process per extension. // // 3. The process ids contained in this class are *not limited* to the Profile // you got this map from. They can also be associated with that profile's // incognito/normal twin. If you care about this, use // RenderProcessHost::FromID() and check the profile of the resulting object. // // TODO(aa): The above warnings suggest this class could use improvement :). // // TODO(kalman): This class is not threadsafe, but is used on both the UI and IO // threads. Somebody should fix that, either make it threadsafe or // enforce single thread. Investigation required. class ProcessMap : public KeyedService { … }; } // namespace extensions #endif // EXTENSIONS_BROWSER_PROCESS_MAP_H_