| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "extensions/browser/process_manager.h" | 5 #include "extensions/browser/process_manager.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 #include "content/public/browser/web_contents_observer.h" | 26 #include "content/public/browser/web_contents_observer.h" |
| 27 #include "content/public/browser/web_contents_user_data.h" | 27 #include "content/public/browser/web_contents_user_data.h" |
| 28 #include "content/public/common/renderer_preferences.h" | 28 #include "content/public/common/renderer_preferences.h" |
| 29 #include "content/public/common/url_constants.h" | 29 #include "content/public/common/url_constants.h" |
| 30 #include "extensions/browser/extension_host.h" | 30 #include "extensions/browser/extension_host.h" |
| 31 #include "extensions/browser/extension_registry.h" | 31 #include "extensions/browser/extension_registry.h" |
| 32 #include "extensions/browser/extension_system.h" | 32 #include "extensions/browser/extension_system.h" |
| 33 #include "extensions/browser/extensions_browser_client.h" | 33 #include "extensions/browser/extensions_browser_client.h" |
| 34 #include "extensions/browser/notification_types.h" | 34 #include "extensions/browser/notification_types.h" |
| 35 #include "extensions/browser/process_manager_delegate.h" | 35 #include "extensions/browser/process_manager_delegate.h" |
| 36 #include "extensions/browser/process_manager_factory.h" |
| 36 #include "extensions/browser/process_manager_observer.h" | 37 #include "extensions/browser/process_manager_observer.h" |
| 37 #include "extensions/browser/view_type_utils.h" | 38 #include "extensions/browser/view_type_utils.h" |
| 38 #include "extensions/common/constants.h" | 39 #include "extensions/common/constants.h" |
| 39 #include "extensions/common/extension.h" | 40 #include "extensions/common/extension.h" |
| 40 #include "extensions/common/extension_messages.h" | 41 #include "extensions/common/extension_messages.h" |
| 41 #include "extensions/common/manifest_handlers/background_info.h" | 42 #include "extensions/common/manifest_handlers/background_info.h" |
| 42 #include "extensions/common/manifest_handlers/incognito_info.h" | 43 #include "extensions/common/manifest_handlers/incognito_info.h" |
| 43 #include "extensions/common/one_shot_event.h" | 44 #include "extensions/common/one_shot_event.h" |
| 44 | 45 |
| 45 using content::BrowserContext; | 46 using content::BrowserContext; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 content::Details<RenderViewHost>(render_view_host)); | 108 content::Details<RenderViewHost>(render_view_host)); |
| 108 } | 109 } |
| 109 | 110 |
| 110 // Incognito profiles use this process manager. It is mostly a shim that decides | 111 // Incognito profiles use this process manager. It is mostly a shim that decides |
| 111 // whether to fall back on the original profile's ProcessManager based | 112 // whether to fall back on the original profile's ProcessManager based |
| 112 // on whether a given extension uses "split" or "spanning" incognito behavior. | 113 // on whether a given extension uses "split" or "spanning" incognito behavior. |
| 113 class IncognitoProcessManager : public ProcessManager { | 114 class IncognitoProcessManager : public ProcessManager { |
| 114 public: | 115 public: |
| 115 IncognitoProcessManager(BrowserContext* incognito_context, | 116 IncognitoProcessManager(BrowserContext* incognito_context, |
| 116 BrowserContext* original_context, | 117 BrowserContext* original_context, |
| 117 ProcessManager* original_manager, | |
| 118 ExtensionRegistry* extension_registry); | 118 ExtensionRegistry* extension_registry); |
| 119 ~IncognitoProcessManager() override {} | 119 ~IncognitoProcessManager() override {} |
| 120 bool CreateBackgroundHost(const Extension* extension, | 120 bool CreateBackgroundHost(const Extension* extension, |
| 121 const GURL& url) override; | 121 const GURL& url) override; |
| 122 SiteInstance* GetSiteInstanceForURL(const GURL& url) override; | 122 SiteInstance* GetSiteInstanceForURL(const GURL& url) override; |
| 123 | 123 |
| 124 private: | 124 private: |
| 125 ProcessManager* original_manager_; | |
| 126 | |
| 127 DISALLOW_COPY_AND_ASSIGN(IncognitoProcessManager); | 125 DISALLOW_COPY_AND_ASSIGN(IncognitoProcessManager); |
| 128 }; | 126 }; |
| 129 | 127 |
| 130 static void CreateBackgroundHostForExtensionLoad( | 128 static void CreateBackgroundHostForExtensionLoad( |
| 131 ProcessManager* manager, const Extension* extension) { | 129 ProcessManager* manager, const Extension* extension) { |
| 132 DVLOG(1) << "CreateBackgroundHostForExtensionLoad"; | 130 DVLOG(1) << "CreateBackgroundHostForExtensionLoad"; |
| 133 if (BackgroundInfo::HasPersistentBackgroundPage(extension)) | 131 if (BackgroundInfo::HasPersistentBackgroundPage(extension)) |
| 134 manager->CreateBackgroundHost(extension, | 132 manager->CreateBackgroundHost(extension, |
| 135 BackgroundInfo::GetBackgroundURL(extension)); | 133 BackgroundInfo::GetBackgroundURL(extension)); |
| 136 } | 134 } |
| 137 | 135 |
| 138 } // namespace | 136 } // namespace |
| 139 | 137 |
| 140 class RenderViewHostDestructionObserver | 138 class RenderViewHostDestructionObserver |
| 141 : public content::WebContentsObserver, | 139 : public content::WebContentsObserver, |
| 142 public content::WebContentsUserData<RenderViewHostDestructionObserver> { | 140 public content::WebContentsUserData<RenderViewHostDestructionObserver> { |
| 143 public: | 141 public: |
| 144 ~RenderViewHostDestructionObserver() override {} | 142 ~RenderViewHostDestructionObserver() override {} |
| 145 | 143 |
| 146 private: | 144 private: |
| 147 explicit RenderViewHostDestructionObserver(WebContents* web_contents) | 145 explicit RenderViewHostDestructionObserver(WebContents* web_contents) |
| 148 : WebContentsObserver(web_contents) { | 146 : WebContentsObserver(web_contents) { |
| 149 BrowserContext* context = web_contents->GetBrowserContext(); | 147 BrowserContext* context = web_contents->GetBrowserContext(); |
| 150 process_manager_ = ExtensionSystem::Get(context)->process_manager(); | 148 process_manager_ = ProcessManager::Get(context); |
| 151 } | 149 } |
| 152 | 150 |
| 153 friend class content::WebContentsUserData<RenderViewHostDestructionObserver>; | 151 friend class content::WebContentsUserData<RenderViewHostDestructionObserver>; |
| 154 | 152 |
| 155 // content::WebContentsObserver overrides. | 153 // content::WebContentsObserver overrides. |
| 156 void RenderViewDeleted(RenderViewHost* render_view_host) override { | 154 void RenderViewDeleted(RenderViewHost* render_view_host) override { |
| 157 process_manager_->UnregisterRenderViewHost(render_view_host); | 155 process_manager_->UnregisterRenderViewHost(render_view_host); |
| 158 } | 156 } |
| 159 | 157 |
| 160 ProcessManager* process_manager_; | 158 ProcessManager* process_manager_; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 previous_keepalive_impulse(false), | 190 previous_keepalive_impulse(false), |
| 193 is_closing(false), | 191 is_closing(false), |
| 194 close_sequence_id(0) {} | 192 close_sequence_id(0) {} |
| 195 }; | 193 }; |
| 196 | 194 |
| 197 // | 195 // |
| 198 // ProcessManager | 196 // ProcessManager |
| 199 // | 197 // |
| 200 | 198 |
| 201 // static | 199 // static |
| 200 ProcessManager* ProcessManager::Get(BrowserContext* context) { |
| 201 return ProcessManagerFactory::GetForBrowserContext(context); |
| 202 } |
| 203 |
| 204 // static |
| 202 ProcessManager* ProcessManager::Create(BrowserContext* context) { | 205 ProcessManager* ProcessManager::Create(BrowserContext* context) { |
| 203 ExtensionRegistry* extension_registry = ExtensionRegistry::Get(context); | 206 ExtensionRegistry* extension_registry = ExtensionRegistry::Get(context); |
| 204 ExtensionsBrowserClient* client = ExtensionsBrowserClient::Get(); | 207 ExtensionsBrowserClient* client = ExtensionsBrowserClient::Get(); |
| 205 if (client->IsGuestSession(context)) { | 208 if (client->IsGuestSession(context)) { |
| 206 // In the guest session, there is a single off-the-record context. Unlike | 209 // In the guest session, there is a single off-the-record context. Unlike |
| 207 // a regular incognito mode, background pages of extensions must be | 210 // a regular incognito mode, background pages of extensions must be |
| 208 // created regardless of whether extensions use "spanning" or "split" | 211 // created regardless of whether extensions use "spanning" or "split" |
| 209 // incognito behavior. | 212 // incognito behavior. |
| 210 BrowserContext* original_context = client->GetOriginalContext(context); | 213 BrowserContext* original_context = client->GetOriginalContext(context); |
| 211 return new ProcessManager(context, original_context, extension_registry); | 214 return new ProcessManager(context, original_context, extension_registry); |
| 212 } | 215 } |
| 213 | 216 |
| 214 if (context->IsOffTheRecord()) { | 217 if (context->IsOffTheRecord()) { |
| 215 BrowserContext* original_context = client->GetOriginalContext(context); | 218 BrowserContext* original_context = client->GetOriginalContext(context); |
| 216 ProcessManager* original_manager = | |
| 217 ExtensionSystem::Get(original_context)->process_manager(); | |
| 218 return new IncognitoProcessManager( | 219 return new IncognitoProcessManager( |
| 219 context, original_context, original_manager, extension_registry); | 220 context, original_context, extension_registry); |
| 220 } | 221 } |
| 221 | 222 |
| 222 return new ProcessManager(context, context, extension_registry); | 223 return new ProcessManager(context, context, extension_registry); |
| 223 } | 224 } |
| 224 | 225 |
| 225 // static | 226 // static |
| 226 ProcessManager* ProcessManager::CreateForTesting( | 227 ProcessManager* ProcessManager::CreateForTesting( |
| 227 BrowserContext* context, | 228 BrowserContext* context, |
| 228 ExtensionRegistry* extension_registry) { | 229 ExtensionRegistry* extension_registry) { |
| 229 DCHECK(!context->IsOffTheRecord()); | 230 DCHECK(!context->IsOffTheRecord()); |
| 230 return new ProcessManager(context, context, extension_registry); | 231 return new ProcessManager(context, context, extension_registry); |
| 231 } | 232 } |
| 232 | 233 |
| 233 // static | 234 // static |
| 234 ProcessManager* ProcessManager::CreateIncognitoForTesting( | 235 ProcessManager* ProcessManager::CreateIncognitoForTesting( |
| 235 BrowserContext* incognito_context, | 236 BrowserContext* incognito_context, |
| 236 BrowserContext* original_context, | 237 BrowserContext* original_context, |
| 237 ProcessManager* original_manager, | |
| 238 ExtensionRegistry* extension_registry) { | 238 ExtensionRegistry* extension_registry) { |
| 239 DCHECK(incognito_context->IsOffTheRecord()); | 239 DCHECK(incognito_context->IsOffTheRecord()); |
| 240 DCHECK(!original_context->IsOffTheRecord()); | 240 DCHECK(!original_context->IsOffTheRecord()); |
| 241 return new IncognitoProcessManager(incognito_context, | 241 return new IncognitoProcessManager(incognito_context, |
| 242 original_context, | 242 original_context, |
| 243 original_manager, | |
| 244 extension_registry); | 243 extension_registry); |
| 245 } | 244 } |
| 246 | 245 |
| 247 ProcessManager::ProcessManager(BrowserContext* context, | 246 ProcessManager::ProcessManager(BrowserContext* context, |
| 248 BrowserContext* original_context, | 247 BrowserContext* original_context, |
| 249 ExtensionRegistry* extension_registry) | 248 ExtensionRegistry* extension_registry) |
| 250 : site_instance_(SiteInstance::Create(context)), | 249 : site_instance_(SiteInstance::Create(context)), |
| 251 extension_registry_(extension_registry), | 250 extension_registry_(extension_registry), |
| 252 startup_background_hosts_created_(false), | 251 startup_background_hosts_created_(false), |
| 253 devtools_callback_(base::Bind(&ProcessManager::OnDevToolsStateChanged, | 252 devtools_callback_(base::Bind(&ProcessManager::OnDevToolsStateChanged, |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 510 if (!site_instance) | 509 if (!site_instance) |
| 511 return; | 510 return; |
| 512 | 511 |
| 513 BrowserContext* browser_context = site_instance->GetBrowserContext(); | 512 BrowserContext* browser_context = site_instance->GetBrowserContext(); |
| 514 const Extension* extension = | 513 const Extension* extension = |
| 515 ExtensionRegistry::Get(browser_context)->enabled_extensions().GetByID( | 514 ExtensionRegistry::Get(browser_context)->enabled_extensions().GetByID( |
| 516 extension_id); | 515 extension_id); |
| 517 if (!extension) | 516 if (!extension) |
| 518 return; | 517 return; |
| 519 | 518 |
| 520 ProcessManager* pm = ExtensionSystem::Get(browser_context)->process_manager(); | 519 ProcessManager::Get(browser_context)->KeepaliveImpulse(extension); |
| 521 if (!pm) | |
| 522 return; | |
| 523 | |
| 524 pm->KeepaliveImpulse(extension); | |
| 525 } | 520 } |
| 526 | 521 |
| 527 // DecrementLazyKeepaliveCount is called when no calls to KeepaliveImpulse | 522 // DecrementLazyKeepaliveCount is called when no calls to KeepaliveImpulse |
| 528 // have been made for at least g_event_page_idle_time_msec. In the best case an | 523 // have been made for at least g_event_page_idle_time_msec. In the best case an |
| 529 // impulse was made just before being cleared, and the decrement will occur | 524 // impulse was made just before being cleared, and the decrement will occur |
| 530 // g_event_page_idle_time_msec later, causing a 2 * g_event_page_idle_time_msec | 525 // g_event_page_idle_time_msec later, causing a 2 * g_event_page_idle_time_msec |
| 531 // total time for extension to be shut down based on impulses. Worst case is | 526 // total time for extension to be shut down based on impulses. Worst case is |
| 532 // an impulse just after a clear, adding one check cycle and resulting in 3x | 527 // an impulse just after a clear, adding one check cycle and resulting in 3x |
| 533 // total time. | 528 // total time. |
| 534 void ProcessManager::OnKeepaliveImpulseCheck() { | 529 void ProcessManager::OnKeepaliveImpulseCheck() { |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 913 } | 908 } |
| 914 } | 909 } |
| 915 | 910 |
| 916 // | 911 // |
| 917 // IncognitoProcessManager | 912 // IncognitoProcessManager |
| 918 // | 913 // |
| 919 | 914 |
| 920 IncognitoProcessManager::IncognitoProcessManager( | 915 IncognitoProcessManager::IncognitoProcessManager( |
| 921 BrowserContext* incognito_context, | 916 BrowserContext* incognito_context, |
| 922 BrowserContext* original_context, | 917 BrowserContext* original_context, |
| 923 ProcessManager* original_manager, | |
| 924 ExtensionRegistry* extension_registry) | 918 ExtensionRegistry* extension_registry) |
| 925 : ProcessManager(incognito_context, original_context, extension_registry), | 919 : ProcessManager(incognito_context, original_context, extension_registry) { |
| 926 original_manager_(original_manager) { | |
| 927 DCHECK(incognito_context->IsOffTheRecord()); | 920 DCHECK(incognito_context->IsOffTheRecord()); |
| 928 | 921 |
| 929 // The original profile will have its own ProcessManager to | 922 // The original profile will have its own ProcessManager to |
| 930 // load the background pages of the spanning extensions. This process | 923 // load the background pages of the spanning extensions. This process |
| 931 // manager need only worry about the split mode extensions, which is handled | 924 // manager need only worry about the split mode extensions, which is handled |
| 932 // in the NOTIFICATION_BROWSER_WINDOW_READY notification handler. | 925 // in the NOTIFICATION_BROWSER_WINDOW_READY notification handler. |
| 933 registrar_.Remove(this, | 926 registrar_.Remove(this, |
| 934 extensions::NOTIFICATION_EXTENSIONS_READY_DEPRECATED, | 927 extensions::NOTIFICATION_EXTENSIONS_READY_DEPRECATED, |
| 935 content::Source<BrowserContext>(original_context)); | 928 content::Source<BrowserContext>(original_context)); |
| 936 } | 929 } |
| 937 | 930 |
| 938 bool IncognitoProcessManager::CreateBackgroundHost(const Extension* extension, | 931 bool IncognitoProcessManager::CreateBackgroundHost(const Extension* extension, |
| 939 const GURL& url) { | 932 const GURL& url) { |
| 940 if (IncognitoInfo::IsSplitMode(extension)) { | 933 if (IncognitoInfo::IsSplitMode(extension)) { |
| 941 if (ExtensionsBrowserClient::Get()->IsExtensionIncognitoEnabled( | 934 if (ExtensionsBrowserClient::Get()->IsExtensionIncognitoEnabled( |
| 942 extension->id(), GetBrowserContext())) | 935 extension->id(), GetBrowserContext())) |
| 943 return ProcessManager::CreateBackgroundHost(extension, url); | 936 return ProcessManager::CreateBackgroundHost(extension, url); |
| 944 } else { | 937 } else { |
| 945 // Do nothing. If an extension is spanning, then its original-profile | 938 // Do nothing. If an extension is spanning, then its original-profile |
| 946 // background page is shared with incognito, so we don't create another. | 939 // background page is shared with incognito, so we don't create another. |
| 947 } | 940 } |
| 948 return false; | 941 return false; |
| 949 } | 942 } |
| 950 | 943 |
| 951 SiteInstance* IncognitoProcessManager::GetSiteInstanceForURL(const GURL& url) { | 944 SiteInstance* IncognitoProcessManager::GetSiteInstanceForURL(const GURL& url) { |
| 952 const Extension* extension = | 945 const Extension* extension = |
| 953 extension_registry_->enabled_extensions().GetExtensionOrAppByURL(url); | 946 extension_registry_->enabled_extensions().GetExtensionOrAppByURL(url); |
| 954 if (extension && !IncognitoInfo::IsSplitMode(extension)) | 947 if (extension && !IncognitoInfo::IsSplitMode(extension)) { |
| 955 return original_manager_->GetSiteInstanceForURL(url); | 948 BrowserContext* original_context = |
| 949 ExtensionsBrowserClient::Get()->GetOriginalContext(GetBrowserContext()); |
| 950 return ProcessManager::Get(original_context)->GetSiteInstanceForURL(url); |
| 951 } |
| 956 | 952 |
| 957 return ProcessManager::GetSiteInstanceForURL(url); | 953 return ProcessManager::GetSiteInstanceForURL(url); |
| 958 } | 954 } |
| 959 | 955 |
| 960 } // namespace extensions | 956 } // namespace extensions |
| OLD | NEW |