Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/browser_list.h" | 5 #include "chrome/browser/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" |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 176 NotificationService::NoDetails()); | 176 NotificationService::NoDetails()); |
| 177 | 177 |
| 178 // Send out notifications after add has occurred. Do some basic checking to | 178 // Send out notifications after add has occurred. Do some basic checking to |
| 179 // try to catch evil observers that change the list from under us. | 179 // try to catch evil observers that change the list from under us. |
| 180 size_t original_count = observers_.size(); | 180 size_t original_count = observers_.size(); |
| 181 FOR_EACH_OBSERVER(Observer, observers_, OnBrowserAdded(browser)); | 181 FOR_EACH_OBSERVER(Observer, observers_, OnBrowserAdded(browser)); |
| 182 DCHECK_EQ(original_count, observers_.size()) | 182 DCHECK_EQ(original_count, observers_.size()) |
| 183 << "observer list modified during notification"; | 183 << "observer list modified during notification"; |
| 184 } | 184 } |
| 185 | 185 |
| 186 // static | |
| 187 void BrowserList::MarkAsCleanShutdown() { | |
| 188 for (const_iterator i = begin(); i != end(); ++i) { | |
| 189 (*i)->profile()->MarkAsCleanShutdown(); | |
| 190 } | |
| 191 } | |
| 186 | 192 |
| 187 // static | 193 // static |
| 188 void BrowserList::NotifyAndTerminate() { | 194 void BrowserList::NotifyAndTerminate() { |
| 189 NotificationService::current()->Notify(NotificationType::APP_TERMINATING, | 195 NotificationService::current()->Notify(NotificationType::APP_TERMINATING, |
| 190 NotificationService::AllSources(), | 196 NotificationService::AllSources(), |
| 191 NotificationService::NoDetails()); | 197 NotificationService::NoDetails()); |
| 192 #if defined(OS_CHROMEOS) | 198 #if defined(OS_CHROMEOS) |
| 193 chromeos::WmIpc::instance()->NotifyAboutSignout(); | 199 chromeos::WmIpc::instance()->NotifyAboutSignout(); |
| 194 if (chromeos::CrosLibrary::Get()->EnsureLoaded()) { | 200 if (chromeos::CrosLibrary::Get()->EnsureLoaded()) { |
| 195 chromeos::CrosLibrary::Get()->GetLoginLibrary()->StopSession(""); | 201 chromeos::CrosLibrary::Get()->GetLoginLibrary()->StopSession(""); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 255 | 261 |
| 256 // static | 262 // static |
| 257 void BrowserList::RemoveObserver(BrowserList::Observer* observer) { | 263 void BrowserList::RemoveObserver(BrowserList::Observer* observer) { |
| 258 observers_.RemoveObserver(observer); | 264 observers_.RemoveObserver(observer); |
| 259 } | 265 } |
| 260 | 266 |
| 261 #if defined(OS_CHROMEOS) | 267 #if defined(OS_CHROMEOS) |
| 262 // static | 268 // static |
| 263 bool BrowserList::NeedBeforeUnloadFired() { | 269 bool BrowserList::NeedBeforeUnloadFired() { |
| 264 bool need_before_unload_fired = false; | 270 bool need_before_unload_fired = false; |
| 265 for (BrowserList::const_iterator i = BrowserList::begin(); | 271 for (const_iterator i = begin(); i != end(); ++i) { |
| 266 i != BrowserList::end(); ++i) { | |
| 267 need_before_unload_fired = need_before_unload_fired || | 272 need_before_unload_fired = need_before_unload_fired || |
| 268 (*i)->TabsNeedBeforeUnloadFired(); | 273 (*i)->TabsNeedBeforeUnloadFired(); |
| 269 } | 274 } |
| 270 return need_before_unload_fired; | 275 return need_before_unload_fired; |
| 271 } | 276 } |
| 272 | 277 |
| 273 // static | 278 // static |
| 274 bool BrowserList::PendingDownloads() { | 279 bool BrowserList::PendingDownloads() { |
| 275 for (BrowserList::const_iterator i = BrowserList::begin(); | 280 for (const_iterator i = begin(); i != end(); ++i) { |
| 276 i != BrowserList::end(); ++i) { | |
| 277 bool normal_downloads_are_present = false; | 281 bool normal_downloads_are_present = false; |
| 278 bool incognito_downloads_are_present = false; | 282 bool incognito_downloads_are_present = false; |
| 279 (*i)->CheckDownloadsInProgress(&normal_downloads_are_present, | 283 (*i)->CheckDownloadsInProgress(&normal_downloads_are_present, |
| 280 &incognito_downloads_are_present); | 284 &incognito_downloads_are_present); |
| 281 if (normal_downloads_are_present || incognito_downloads_are_present) | 285 if (normal_downloads_are_present || incognito_downloads_are_present) |
| 282 return true; | 286 return true; |
| 283 } | 287 } |
| 284 return false; | 288 return false; |
| 285 } | 289 } |
| 286 #endif | 290 #endif |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 347 && !PendingDownloads()) { | 351 && !PendingDownloads()) { |
| 348 NotifyAndTerminate(); | 352 NotifyAndTerminate(); |
| 349 return; | 353 return; |
| 350 } | 354 } |
| 351 #endif | 355 #endif |
| 352 CloseAllBrowsersAndExit(); | 356 CloseAllBrowsersAndExit(); |
| 353 } | 357 } |
| 354 | 358 |
| 355 // static | 359 // static |
| 356 void BrowserList::CloseAllBrowsersAndExit() { | 360 void BrowserList::CloseAllBrowsersAndExit() { |
| 361 MarkAsCleanShutdown(); // Don't notify users of crashes beyond this point. | |
|
Daniel Erat
2011/01/25 02:29:42
I think you might be missing the fast-shutdown pat
| |
| 357 NotificationService::current()->Notify( | 362 NotificationService::current()->Notify( |
| 358 NotificationType::APP_EXITING, | 363 NotificationType::APP_EXITING, |
| 359 NotificationService::AllSources(), | 364 NotificationService::AllSources(), |
| 360 NotificationService::NoDetails()); | 365 NotificationService::NoDetails()); |
| 361 | 366 |
| 362 #if !defined(OS_MACOSX) | 367 #if !defined(OS_MACOSX) |
| 363 // On most platforms, closing all windows causes the application to exit. | 368 // On most platforms, closing all windows causes the application to exit. |
| 364 CloseAllBrowsers(); | 369 CloseAllBrowsers(); |
| 365 #else | 370 #else |
| 366 // On the Mac, the application continues to run once all windows are closed. | 371 // On the Mac, the application continues to run once all windows are closed. |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 593 } | 598 } |
| 594 | 599 |
| 595 TabContents* next_tab = | 600 TabContents* next_tab = |
| 596 (*browser_iterator_)->GetTabContentsAt(web_view_index_); | 601 (*browser_iterator_)->GetTabContentsAt(web_view_index_); |
| 597 if (next_tab) { | 602 if (next_tab) { |
| 598 cur_ = next_tab; | 603 cur_ = next_tab; |
| 599 return; | 604 return; |
| 600 } | 605 } |
| 601 } | 606 } |
| 602 } | 607 } |
| OLD | NEW |