Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(33)

Side by Side Diff: extensions/browser/process_manager.cc

Issue 671763002: Extract ProcessManager from ExtensionSystem. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698