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

Side by Side Diff: chrome/browser/extensions/extension_process_manager.cc

Issue 7328029: Use process-per-app-instance for hosted apps without background permission. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Update tests. Created 9 years, 5 months 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "chrome/browser/extensions/extension_process_manager.h" 5 #include "chrome/browser/extensions/extension_process_manager.h"
6 6
7 #include "chrome/browser/ui/browser_window.h" 7 #include "chrome/browser/ui/browser_window.h"
8 #include "content/browser/browsing_instance.h" 8 #include "content/browser/browsing_instance.h"
9 #if defined(OS_MACOSX) 9 #if defined(OS_MACOSX)
10 #include "chrome/browser/extensions/extension_host_mac.h" 10 #include "chrome/browser/extensions/extension_host_mac.h"
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 : browsing_instance_(new BrowsingInstance(profile)) { 88 : browsing_instance_(new BrowsingInstance(profile)) {
89 Profile* original_profile = profile->GetOriginalProfile(); 89 Profile* original_profile = profile->GetOriginalProfile();
90 registrar_.Add(this, NotificationType::EXTENSIONS_READY, 90 registrar_.Add(this, NotificationType::EXTENSIONS_READY,
91 Source<Profile>(original_profile)); 91 Source<Profile>(original_profile));
92 registrar_.Add(this, NotificationType::EXTENSION_LOADED, 92 registrar_.Add(this, NotificationType::EXTENSION_LOADED,
93 Source<Profile>(original_profile)); 93 Source<Profile>(original_profile));
94 registrar_.Add(this, NotificationType::EXTENSION_UNLOADED, 94 registrar_.Add(this, NotificationType::EXTENSION_UNLOADED,
95 Source<Profile>(original_profile)); 95 Source<Profile>(original_profile));
96 registrar_.Add(this, NotificationType::EXTENSION_HOST_DESTROYED, 96 registrar_.Add(this, NotificationType::EXTENSION_HOST_DESTROYED,
97 Source<Profile>(profile)); 97 Source<Profile>(profile));
98 registrar_.Add(this, NotificationType::RENDERER_PROCESS_TERMINATED,
99 NotificationService::AllSources());
100 registrar_.Add(this, NotificationType::RENDERER_PROCESS_CLOSED,
101 NotificationService::AllSources());
102 registrar_.Add(this, NotificationType::APP_TERMINATING, 98 registrar_.Add(this, NotificationType::APP_TERMINATING,
103 NotificationService::AllSources()); 99 NotificationService::AllSources());
104 } 100 }
105 101
106 ExtensionProcessManager::~ExtensionProcessManager() { 102 ExtensionProcessManager::~ExtensionProcessManager() {
107 VLOG_IF(1, g_log_bug53991) << "~ExtensionProcessManager: " << this; 103 VLOG_IF(1, g_log_bug53991) << "~ExtensionProcessManager: " << this;
108 CloseBackgroundHosts(); 104 CloseBackgroundHosts();
109 DCHECK(background_hosts_.empty()); 105 DCHECK(background_hosts_.empty());
110 } 106 }
111 107
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 const Extension* extension) { 209 const Extension* extension) {
214 for (ExtensionHostSet::iterator iter = background_hosts_.begin(); 210 for (ExtensionHostSet::iterator iter = background_hosts_.begin();
215 iter != background_hosts_.end(); ++iter) { 211 iter != background_hosts_.end(); ++iter) {
216 ExtensionHost* host = *iter; 212 ExtensionHost* host = *iter;
217 if (host->extension() == extension) 213 if (host->extension() == extension)
218 return host; 214 return host;
219 } 215 }
220 return NULL; 216 return NULL;
221 } 217 }
222 218
223 void ExtensionProcessManager::RegisterExtensionProcess(
224 const std::string& extension_id, int process_id) {
225 // TODO(mpcomplete): This is the only place we actually read process_ids_.
226 // Is it necessary?
227 ProcessIDMap::const_iterator it = process_ids_.find(extension_id);
228 if (it != process_ids_.end() && (*it).second == process_id)
229 return;
230
231 // Extension ids should get removed from the map before the process ids get
232 // reused from a dead renderer.
233 DCHECK(it == process_ids_.end());
234 process_ids_[extension_id] = process_id;
235 }
236
237 void ExtensionProcessManager::UnregisterExtensionProcess(int process_id) {
238 ProcessIDMap::iterator it = process_ids_.begin();
239 while (it != process_ids_.end()) {
240 if (it->second == process_id)
241 process_ids_.erase(it++);
242 else
243 ++it;
244 }
245 }
246
247 RenderProcessHost* ExtensionProcessManager::GetExtensionProcess( 219 RenderProcessHost* ExtensionProcessManager::GetExtensionProcess(
248 const GURL& url) { 220 const GURL& url) {
249 if (!browsing_instance_->HasSiteInstance(url)) 221 if (!browsing_instance_->HasSiteInstance(url))
250 return NULL; 222 return NULL;
251 scoped_refptr<SiteInstance> site( 223 scoped_refptr<SiteInstance> site(
252 browsing_instance_->GetSiteInstanceForURL(url)); 224 browsing_instance_->GetSiteInstanceForURL(url));
Matt Perry 2011/07/08 22:18:35 What will happen here for hosted apps?
Charlie Reis 2011/07/08 22:49:50 This doesn't appear to be called for hosted apps--
253 if (site->HasProcess()) 225 if (site->HasProcess())
254 return site->GetProcess(); 226 return site->GetProcess();
255 return NULL; 227 return NULL;
256 } 228 }
257 229
258 RenderProcessHost* ExtensionProcessManager::GetExtensionProcess( 230 RenderProcessHost* ExtensionProcessManager::GetExtensionProcess(
259 const std::string& extension_id) { 231 const std::string& extension_id) {
260 return GetExtensionProcess( 232 return GetExtensionProcess(
261 Extension::GetBaseURLFromExtensionId(extension_id)); 233 Extension::GetBaseURLFromExtensionId(extension_id));
262 } 234 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 break; 277 break;
306 } 278 }
307 279
308 case NotificationType::EXTENSION_HOST_DESTROYED: { 280 case NotificationType::EXTENSION_HOST_DESTROYED: {
309 ExtensionHost* host = Details<ExtensionHost>(details).ptr(); 281 ExtensionHost* host = Details<ExtensionHost>(details).ptr();
310 all_hosts_.erase(host); 282 all_hosts_.erase(host);
311 background_hosts_.erase(host); 283 background_hosts_.erase(host);
312 break; 284 break;
313 } 285 }
314 286
315 case NotificationType::RENDERER_PROCESS_TERMINATED:
316 case NotificationType::RENDERER_PROCESS_CLOSED: {
317 RenderProcessHost* host = Source<RenderProcessHost>(source).ptr();
318 UnregisterExtensionProcess(host->id());
319 break;
320 }
321
322 case NotificationType::APP_TERMINATING: { 287 case NotificationType::APP_TERMINATING: {
323 // Close background hosts when the last browser is closed so that they 288 // Close background hosts when the last browser is closed so that they
324 // have time to shutdown various objects on different threads. Our 289 // have time to shutdown various objects on different threads. Our
325 // destructor is called too late in the shutdown sequence. 290 // destructor is called too late in the shutdown sequence.
326 CloseBackgroundHosts(); 291 CloseBackgroundHosts();
327 break; 292 break;
328 } 293 }
329 294
330 default: 295 default:
331 NOTREACHED(); 296 NOTREACHED();
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
457 if (service && service->is_ready()) 422 if (service && service->is_ready())
458 CreateBackgroundHosts(this, service->extensions()); 423 CreateBackgroundHosts(this, service->extensions());
459 } 424 }
460 break; 425 break;
461 } 426 }
462 default: 427 default:
463 ExtensionProcessManager::Observe(type, source, details); 428 ExtensionProcessManager::Observe(type, source, details);
464 break; 429 break;
465 } 430 }
466 } 431 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698