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

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

Issue 2866034: Refactor shutdown code to allow win/linux to run after last browser closes. (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: Uploaded patch that resolves merge issue Created 10 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
« no previous file with comments | « chrome/browser/browser_uitest.cc ('k') | chrome/browser/js_modal_dialog.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/browser.h" 7 #include "chrome/browser/browser.h"
8 #include "chrome/browser/browser_window.h" 8 #include "chrome/browser/browser_window.h"
9 #include "chrome/browser/browsing_instance.h" 9 #include "chrome/browser/browsing_instance.h"
10 #if defined(OS_MACOSX) 10 #if defined(OS_MACOSX)
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 registrar_.Add(this, NotificationType::EXTENSION_LOADED, 44 registrar_.Add(this, NotificationType::EXTENSION_LOADED,
45 NotificationService::AllSources()); 45 NotificationService::AllSources());
46 registrar_.Add(this, NotificationType::EXTENSION_UNLOADED, 46 registrar_.Add(this, NotificationType::EXTENSION_UNLOADED,
47 NotificationService::AllSources()); 47 NotificationService::AllSources());
48 registrar_.Add(this, NotificationType::EXTENSION_HOST_DESTROYED, 48 registrar_.Add(this, NotificationType::EXTENSION_HOST_DESTROYED,
49 Source<Profile>(profile)); 49 Source<Profile>(profile));
50 registrar_.Add(this, NotificationType::RENDERER_PROCESS_TERMINATED, 50 registrar_.Add(this, NotificationType::RENDERER_PROCESS_TERMINATED,
51 NotificationService::AllSources()); 51 NotificationService::AllSources());
52 registrar_.Add(this, NotificationType::RENDERER_PROCESS_CLOSED, 52 registrar_.Add(this, NotificationType::RENDERER_PROCESS_CLOSED,
53 NotificationService::AllSources()); 53 NotificationService::AllSources());
54 #if defined(OS_WIN) || defined(OS_LINUX)
55 registrar_.Add(this, NotificationType::BROWSER_CLOSED,
56 NotificationService::AllSources());
57 #elif defined(OS_MACOSX)
58 registrar_.Add(this, NotificationType::APP_TERMINATING, 54 registrar_.Add(this, NotificationType::APP_TERMINATING,
59 NotificationService::AllSources()); 55 NotificationService::AllSources());
60 #endif
61 } 56 }
62 57
63 ExtensionProcessManager::~ExtensionProcessManager() { 58 ExtensionProcessManager::~ExtensionProcessManager() {
64 CloseBackgroundHosts(); 59 CloseBackgroundHosts();
65 DCHECK(background_hosts_.empty()); 60 DCHECK(background_hosts_.empty());
66 } 61 }
67 62
68 ExtensionHost* ExtensionProcessManager::CreateView(Extension* extension, 63 ExtensionHost* ExtensionProcessManager::CreateView(Extension* extension,
69 const GURL& url, 64 const GURL& url,
70 Browser* browser, 65 Browser* browser,
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 background_hosts_.erase(host); 273 background_hosts_.erase(host);
279 break; 274 break;
280 } 275 }
281 276
282 case NotificationType::RENDERER_PROCESS_TERMINATED: 277 case NotificationType::RENDERER_PROCESS_TERMINATED:
283 case NotificationType::RENDERER_PROCESS_CLOSED: { 278 case NotificationType::RENDERER_PROCESS_CLOSED: {
284 RenderProcessHost* host = Source<RenderProcessHost>(source).ptr(); 279 RenderProcessHost* host = Source<RenderProcessHost>(source).ptr();
285 UnregisterExtensionProcess(host->id()); 280 UnregisterExtensionProcess(host->id());
286 break; 281 break;
287 } 282 }
288 #if defined(OS_WIN) || defined(OS_LINUX) 283
289 case NotificationType::BROWSER_CLOSED: { 284 case NotificationType::APP_TERMINATING: {
290 // Close background hosts when the last browser is closed so that they 285 // Close background hosts when the last browser is closed so that they
291 // have time to shutdown various objects on different threads. Our 286 // have time to shutdown various objects on different threads. Our
292 // destructor is called too late in the shutdown sequence. 287 // destructor is called too late in the shutdown sequence.
293 bool app_closing = *Details<bool>(details).ptr();
294 if (app_closing)
295 CloseBackgroundHosts();
296 break;
297 }
298 #elif defined(OS_MACOSX)
299 case NotificationType::APP_TERMINATING: {
300 CloseBackgroundHosts(); 288 CloseBackgroundHosts();
301 break; 289 break;
302 } 290 }
303 #endif
304 291
305 default: 292 default:
306 NOTREACHED(); 293 NOTREACHED();
307 } 294 }
308 } 295 }
309 296
310 void ExtensionProcessManager::OnExtensionHostCreated(ExtensionHost* host, 297 void ExtensionProcessManager::OnExtensionHostCreated(ExtensionHost* host,
311 bool is_background) { 298 bool is_background) {
312 all_hosts_.insert(host); 299 all_hosts_.insert(host);
313 if (is_background) 300 if (is_background)
314 background_hosts_.insert(host); 301 background_hosts_.insert(host);
315 NotificationService::current()->Notify( 302 NotificationService::current()->Notify(
316 NotificationType::EXTENSION_HOST_CREATED, 303 NotificationType::EXTENSION_HOST_CREATED,
317 Source<ExtensionProcessManager>(this), 304 Source<ExtensionProcessManager>(this),
318 Details<ExtensionHost>(host)); 305 Details<ExtensionHost>(host));
319 } 306 }
320 307
321 void ExtensionProcessManager::CloseBackgroundHosts() { 308 void ExtensionProcessManager::CloseBackgroundHosts() {
322 for (ExtensionHostSet::iterator iter = background_hosts_.begin(); 309 for (ExtensionHostSet::iterator iter = background_hosts_.begin();
323 iter != background_hosts_.end(); ) { 310 iter != background_hosts_.end(); ) {
324 ExtensionHostSet::iterator current = iter++; 311 ExtensionHostSet::iterator current = iter++;
325 delete *current; 312 delete *current;
326 } 313 }
327 } 314 }
OLDNEW
« no previous file with comments | « chrome/browser/browser_uitest.cc ('k') | chrome/browser/js_modal_dialog.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698