| Index: chrome/browser/extensions/process_map.h | 
| diff --git a/chrome/browser/extensions/process_map.h b/chrome/browser/extensions/process_map.h | 
| index 84c8f86677195d56d2ce718eb67d250dc1ab0fba..017ae729ec1492ff6df6c573cd0a64ee3ed8f536 100644 | 
| --- a/chrome/browser/extensions/process_map.h | 
| +++ b/chrome/browser/extensions/process_map.h | 
| @@ -16,6 +16,7 @@ namespace extensions { | 
| // 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 share a single process between all incognito | 
| //   and normal windows. This was the original mode for extensions. | 
| @@ -23,6 +24,8 @@ namespace extensions { | 
| // - 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. | 
| +// - A single hosted app can have more than one SiteInstance in the same process | 
| +//   if we're over the process limit and force them to share a process. | 
| // | 
| // In general, we seem to play with the process model of extensions a lot, so | 
| // it is safest to assume it is many-to-many in most places in the codebase. | 
| @@ -43,12 +46,14 @@ namespace extensions { | 
| //    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 be in multiple processes. That is why there is no | 
| +// 2. An extension can show up in multiple processes. That is why there is no | 
| //    GetExtensionProcess() method here. There are two cases: a) The extension | 
| //    is actually a hosted app, in which case this is normal, or b) there is an | 
| //    incognito window open and the extension is "split mode". It is *not safe* | 
| //    to assume that there is one process per extension. If you only care about | 
| -//    extensions (not hosted apps), and you are on the UI thread, then use | 
| +//    extensions (not hosted apps), and you are on the UI thread, and you don't | 
| +//    care about incognito version of this extension (or vice versa if you're in | 
| +//    an incognito profile) then use | 
| //    ExtensionProcessManager::GetSiteInstanceForURL()->[Has|Get]Process(). | 
| // | 
| // 3. The process ids contained in this class are *not limited* to the Profile | 
| @@ -64,30 +69,23 @@ class ProcessMap { | 
|  | 
| size_t size() const { return items_.size(); } | 
|  | 
| -  bool Insert(const std::string& extension_id, int process_id); | 
| -  bool Remove(const std::string& extension_id, int process_id); | 
| -  int Remove(int process_id); | 
| +  bool Insert(const std::string& extension_id, int process_id, | 
| +              int site_instance_id); | 
| + | 
| +  bool Remove(const std::string& extension_id, int process_id, | 
| +              int site_instance_id); | 
| +  int RemoveAllFromProcess(int process_id); | 
| + | 
| bool Contains(const std::string& extension_id, int process_id) const; | 
| bool Contains(int process_id) const; | 
|  | 
| std::set<std::string> GetExtensionsInProcess(int process_id) const; | 
|  | 
| private: | 
| -  struct Item { | 
| -    Item(); | 
| -    Item(const Item& other); | 
| -    Item(const std::string& extension_id, int process_id); | 
| -    ~Item(); | 
| - | 
| -    // Required for set membership. | 
| -    bool operator<(const Item& other) const; | 
| - | 
| -    std::string extension_id; | 
| -    int process_id; | 
| -  }; | 
| +  struct Item; | 
|  | 
| typedef std::set<Item> ItemSet; | 
| -  std::set<Item> items_; | 
| +  ItemSet items_; | 
|  | 
| DISALLOW_COPY_AND_ASSIGN(ProcessMap); | 
| }; | 
|  |