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

Side by Side Diff: chrome/browser/ui/browser_list.cc

Issue 7273038: ChromeOs: Call BrowserList::SessionEnding when shutting down via SIGTERM (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: " 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/ui/browser_list.h" 5 #include "chrome/browser/ui/browser_list.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/message_loop.h" 8 #include "base/message_loop.h"
9 #include "base/metrics/histogram.h" 9 #include "base/metrics/histogram.h"
10 #include "build/build_config.h" 10 #include "build/build_config.h"
11 #include "chrome/browser/browser_process.h" 11 #include "chrome/browser/browser_process.h"
12 #include "chrome/browser/browser_shutdown.h" 12 #include "chrome/browser/browser_shutdown.h"
13 #include "chrome/browser/metrics/metrics_service.h"
13 #include "chrome/browser/prefs/pref_service.h" 14 #include "chrome/browser/prefs/pref_service.h"
14 #include "chrome/browser/printing/background_printing_manager.h" 15 #include "chrome/browser/printing/background_printing_manager.h"
15 #include "chrome/browser/profiles/profile_manager.h" 16 #include "chrome/browser/profiles/profile_manager.h"
16 #include "chrome/browser/ui/browser_window.h" 17 #include "chrome/browser/ui/browser_window.h"
17 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" 18 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
18 #include "chrome/common/pref_names.h" 19 #include "chrome/common/pref_names.h"
19 #include "content/browser/renderer_host/render_process_host.h" 20 #include "content/browser/renderer_host/render_process_host.h"
20 #include "content/browser/tab_contents/navigation_details.h" 21 #include "content/browser/tab_contents/navigation_details.h"
21 #include "content/common/notification_registrar.h" 22 #include "content/common/notification_registrar.h"
22 #include "content/common/notification_service.h" 23 #include "content/common/notification_service.h"
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 249
249 // Send out notifications after add has occurred. Do some basic checking to 250 // Send out notifications after add has occurred. Do some basic checking to
250 // try to catch evil observers that change the list from under us. 251 // try to catch evil observers that change the list from under us.
251 size_t original_count = observers_.size(); 252 size_t original_count = observers_.size();
252 FOR_EACH_OBSERVER(Observer, observers_, OnBrowserAdded(browser)); 253 FOR_EACH_OBSERVER(Observer, observers_, OnBrowserAdded(browser));
253 DCHECK_EQ(original_count, observers_.size()) 254 DCHECK_EQ(original_count, observers_.size())
254 << "observer list modified during notification"; 255 << "observer list modified during notification";
255 } 256 }
256 257
257 // static 258 // static
258 void BrowserList::MarkAsCleanShutdown() { 259 void BrowserList::MarkAsCleanShutdownInUserProfiles() {
259 for (const_iterator i = begin(); i != end(); ++i) { 260 for (const_iterator i = begin(); i != end(); ++i) {
260 (*i)->profile()->MarkAsCleanShutdown(); 261 (*i)->profile()->MarkAsCleanShutdown();
261 } 262 }
262 } 263 }
263 264
264 void BrowserList::AttemptExitInternal() { 265 void BrowserList::AttemptExitInternal() {
265 NotificationService::current()->Notify( 266 NotificationService::current()->Notify(
266 NotificationType::APP_EXITING, 267 NotificationType::APP_EXITING,
267 NotificationService::AllSources(), 268 NotificationService::AllSources(),
268 NotificationService::NoDetails()); 269 NotificationService::NoDetails());
269 270
270 #if !defined(OS_MACOSX) 271 #if !defined(OS_MACOSX)
271 // On most platforms, closing all windows causes the application to exit. 272 // On most platforms, closing all windows causes the application to exit.
272 CloseAllBrowsers(); 273 CloseAllBrowsers();
273 #else 274 #else
274 // On the Mac, the application continues to run once all windows are closed. 275 // On the Mac, the application continues to run once all windows are closed.
275 // Terminate will result in a CloseAllBrowsers() call, and once (and if) 276 // Terminate will result in a CloseAllBrowsers() call, and once (and if)
276 // that is done, will cause the application to exit cleanly. 277 // that is done, will cause the application to exit cleanly.
277 chrome_browser_application_mac::Terminate(); 278 chrome_browser_application_mac::Terminate();
278 #endif 279 #endif
279 } 280 }
280 281
281 // static 282 // static
282 void BrowserList::NotifyAndTerminate(bool fast_path) { 283 void BrowserList::NotifyAndTerminate(bool fast_path) {
283 #if defined(OS_CHROMEOS) 284 #if defined(OS_CHROMEOS)
284 if (!signout) return; 285 if (!signout) return;
jar (doing other things) 2011/06/29 04:00:09 style nit: put return on next line, to be more con
285 NotifyWindowManagerAboutSignout();
286 #endif 286 #endif
287 287
288 if (fast_path) { 288 if (fast_path) {
289 NotificationService::current()->Notify(NotificationType::APP_TERMINATING, 289 NotificationService::current()->Notify(NotificationType::APP_TERMINATING,
290 NotificationService::AllSources(), 290 NotificationService::AllSources(),
291 NotificationService::NoDetails()); 291 NotificationService::NoDetails());
292 } 292 }
293 293
294 #if defined(OS_CHROMEOS) 294 #if defined(OS_CHROMEOS)
295 NotifyWindowManagerAboutSignout();
295 chromeos::CrosLibrary* cros_library = chromeos::CrosLibrary::Get(); 296 chromeos::CrosLibrary* cros_library = chromeos::CrosLibrary::Get();
296 if (cros_library->EnsureLoaded()) { 297 if (cros_library->EnsureLoaded()) {
297 // If update has been installed, reboot, otherwise, sign out. 298 // If update has been installed, reboot, otherwise, sign out.
298 if (cros_library->GetUpdateLibrary()->status().status == 299 if (cros_library->GetUpdateLibrary()->status().status ==
299 chromeos::UPDATE_STATUS_UPDATED_NEED_REBOOT) { 300 chromeos::UPDATE_STATUS_UPDATED_NEED_REBOOT) {
300 cros_library->GetUpdateLibrary()->RebootAfterUpdate(); 301 cros_library->GetUpdateLibrary()->RebootAfterUpdate();
301 } else { 302 } else {
302 cros_library->GetLoginLibrary()->StopSession(""); 303 cros_library->GetLoginLibrary()->StopSession("");
303 } 304 }
304 return; 305 return;
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 PrefService* state = g_browser_process->local_state(); 433 PrefService* state = g_browser_process->local_state();
433 if (state) { 434 if (state) {
434 std::string owner_locale = state->GetString(prefs::kOwnerLocale); 435 std::string owner_locale = state->GetString(prefs::kOwnerLocale);
435 if (!owner_locale.empty() && 436 if (!owner_locale.empty() &&
436 state->GetString(prefs::kApplicationLocale) != owner_locale && 437 state->GetString(prefs::kApplicationLocale) != owner_locale &&
437 !state->IsManagedPreference(prefs::kApplicationLocale)) { 438 !state->IsManagedPreference(prefs::kApplicationLocale)) {
438 state->SetString(prefs::kApplicationLocale, owner_locale); 439 state->SetString(prefs::kApplicationLocale, owner_locale);
439 state->ScheduleSavePersistentPrefs(); 440 state->ScheduleSavePersistentPrefs();
440 } 441 }
441 } 442 }
442 if (FastShutdown()) { 443 if (FastShutdown())
443 return; 444 return;
444 }
445 #else 445 #else
446 // Reset the restart bit that might have been set in cancelled restart 446 // Reset the restart bit that might have been set in cancelled restart
447 // request. 447 // request.
448 PrefService* pref_service = g_browser_process->local_state(); 448 PrefService* pref_service = g_browser_process->local_state();
449 pref_service->SetBoolean(prefs::kRestartLastSessionOnShutdown, false); 449 pref_service->SetBoolean(prefs::kRestartLastSessionOnShutdown, false);
450 #endif 450 #endif
451 AttemptExitInternal(); 451 AttemptExitInternal();
452 } 452 }
453 453
454 // static 454 // static
455 void BrowserList::AttemptRestart() { 455 void BrowserList::AttemptRestart() {
456 #if defined(OS_CHROMEOS) 456 #if defined(OS_CHROMEOS)
457 // For CrOS instead of browser restart (which is not supported) perform a full 457 // For CrOS instead of browser restart (which is not supported) perform a full
458 // sign out. Session will be only restored if user has that setting set. 458 // sign out. Session will be only restored if user has that setting set.
459 // Same session restore behavior happens in case of full restart after update. 459 // Same session restore behavior happens in case of full restart after update.
460 AttemptUserExit(); 460 AttemptUserExit();
461 #else 461 #else
462 // Set the flag to restore state after the restart. 462 // Set the flag to restore state after the restart.
463 PrefService* pref_service = g_browser_process->local_state(); 463 PrefService* pref_service = g_browser_process->local_state();
464 pref_service->SetBoolean(prefs::kRestartLastSessionOnShutdown, true); 464 pref_service->SetBoolean(prefs::kRestartLastSessionOnShutdown, true);
465 AttemptExit(); 465 AttemptExit();
466 #endif 466 #endif
467 } 467 }
468 468
469 // static 469 // static
470 void BrowserList::AttemptExit() { 470 void BrowserList::AttemptExit() {
471 // If we know that all browsers can be closed without blocking, 471 // If we know that all browsers can be closed without blocking,
472 // don't notify users of crashes beyond this point. 472 // don't notify users of crashes beyond this point. Note that
473 // Note that MarkAsCleanShutdown does not set UMA's exit cleanly bit 473 // MarkAsCleanShutdownInUserProfiles does not set UMA's exit cleanly
474 // so crashes during shutdown are still reported in UMA. 474 // bit so crashes during shutdown are still reported in UMA.
475 if (AreAllBrowsersCloseable()) 475 if (AreAllBrowsersCloseable())
476 MarkAsCleanShutdown(); 476 MarkAsCleanShutdownInUserProfiles();
477 AttemptExitInternal(); 477 AttemptExitInternal();
478 } 478 }
479 479
480 #if defined(OS_CHROMEOS) 480 #if defined(OS_CHROMEOS)
481 // static 481 // static
482 void BrowserList::ExitCleanly() { 482 void BrowserList::ExitCleanly() {
483 // We always mark exit cleanly. 483 // We always mark exit cleanly.
484 MarkAsCleanShutdown(); 484 MarkAsCleanShutdownInUserProfiles();
485 // Don't report UMA crash beyond this point. SessionManager may kill
486 // chrome after this point.
487 MetricsService* metrics = g_browser_process->metrics_service();
488 if (metrics)
489 metrics->LogCleanShutdown();
485 AttemptExitInternal(); 490 AttemptExitInternal();
486 } 491 }
487 #endif 492 #endif
488 493
489 // static 494 // static
490 void BrowserList::SessionEnding() { 495 void BrowserList::SessionEnding() {
491 // EndSession is invoked once per frame. Only do something the first time. 496 // EndSession is invoked once per frame. Only do something the first time.
492 static bool already_ended = false; 497 static bool already_ended = false;
493 // We may get called in the middle of shutdown, e.g. http://crbug.com/70852 498 // We may get called in the middle of shutdown, e.g. http://crbug.com/70852
494 // In this case, do nothing. 499 // In this case, do nothing.
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 // If no more TabContents from Browsers, check the BackgroundPrintingManager. 731 // If no more TabContents from Browsers, check the BackgroundPrintingManager.
727 while (bg_printing_iterator_ != GetBackgroundPrintingManager()->end()) { 732 while (bg_printing_iterator_ != GetBackgroundPrintingManager()->end()) {
728 cur_ = *bg_printing_iterator_; 733 cur_ = *bg_printing_iterator_;
729 CHECK(cur_); 734 CHECK(cur_);
730 ++bg_printing_iterator_; 735 ++bg_printing_iterator_;
731 return; 736 return;
732 } 737 }
733 // Reached the end - no more TabContents. 738 // Reached the end - no more TabContents.
734 cur_ = NULL; 739 cur_ = NULL;
735 } 740 }
OLDNEW
« chrome/browser/metrics/metrics_service.cc ('K') | « chrome/browser/ui/browser_list.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698