OLD | NEW |
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.h" | 5 #include "chrome/browser/ui/browser.h" |
6 | 6 |
7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
8 #include <windows.h> | 8 #include <windows.h> |
9 #include <shellapi.h> | 9 #include <shellapi.h> |
10 #endif // OS_WIN | 10 #endif // OS_WIN |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 #include "chrome/browser/instant/instant_controller.h" | 51 #include "chrome/browser/instant/instant_controller.h" |
52 #include "chrome/browser/instant/instant_unload_handler.h" | 52 #include "chrome/browser/instant/instant_unload_handler.h" |
53 #include "chrome/browser/net/browser_url_util.h" | 53 #include "chrome/browser/net/browser_url_util.h" |
54 #include "chrome/browser/net/url_fixer_upper.h" | 54 #include "chrome/browser/net/url_fixer_upper.h" |
55 #include "chrome/browser/notifications/notification_ui_manager.h" | 55 #include "chrome/browser/notifications/notification_ui_manager.h" |
56 #include "chrome/browser/platform_util.h" | 56 #include "chrome/browser/platform_util.h" |
57 #include "chrome/browser/prefs/incognito_mode_prefs.h" | 57 #include "chrome/browser/prefs/incognito_mode_prefs.h" |
58 #include "chrome/browser/prefs/pref_service.h" | 58 #include "chrome/browser/prefs/pref_service.h" |
59 #include "chrome/browser/printing/cloud_print/cloud_print_setup_flow.h" | 59 #include "chrome/browser/printing/cloud_print/cloud_print_setup_flow.h" |
60 #include "chrome/browser/profiles/profile.h" | 60 #include "chrome/browser/profiles/profile.h" |
| 61 #include "chrome/browser/profiles/profile_manager.h" |
61 #include "chrome/browser/sessions/restore_tab_helper.h" | 62 #include "chrome/browser/sessions/restore_tab_helper.h" |
62 #include "chrome/browser/sessions/session_service.h" | 63 #include "chrome/browser/sessions/session_service.h" |
63 #include "chrome/browser/sessions/session_service_factory.h" | 64 #include "chrome/browser/sessions/session_service_factory.h" |
64 #include "chrome/browser/sessions/session_types.h" | 65 #include "chrome/browser/sessions/session_types.h" |
65 #include "chrome/browser/sessions/tab_restore_service.h" | 66 #include "chrome/browser/sessions/tab_restore_service.h" |
66 #include "chrome/browser/sessions/tab_restore_service_factory.h" | 67 #include "chrome/browser/sessions/tab_restore_service_factory.h" |
67 #include "chrome/browser/sync/profile_sync_service.h" | 68 #include "chrome/browser/sync/profile_sync_service.h" |
68 #include "chrome/browser/sync/sync_ui_util.h" | 69 #include "chrome/browser/sync/sync_ui_util.h" |
69 #include "chrome/browser/tab_closeable_state_watcher.h" | 70 #include "chrome/browser/tab_closeable_state_watcher.h" |
70 #include "chrome/browser/tab_contents/background_contents.h" | 71 #include "chrome/browser/tab_contents/background_contents.h" |
(...skipping 969 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1040 | 1041 |
1041 // Sets the confirmation state to NOT_PROMPTED so that if the user tries to | 1042 // Sets the confirmation state to NOT_PROMPTED so that if the user tries to |
1042 // close again we'll show the warning again. | 1043 // close again we'll show the warning again. |
1043 cancel_download_confirmation_state_ = NOT_PROMPTED; | 1044 cancel_download_confirmation_state_ = NOT_PROMPTED; |
1044 | 1045 |
1045 // Show the download page so the user can figure-out what downloads are still | 1046 // Show the download page so the user can figure-out what downloads are still |
1046 // in-progress. | 1047 // in-progress. |
1047 ShowDownloadsTab(); | 1048 ShowDownloadsTab(); |
1048 } | 1049 } |
1049 | 1050 |
| 1051 Browser::DownloadClosePreventionType Browser::OkToCloseWithInProgressDownloads( |
| 1052 int* num_downloads_blocking) const { |
| 1053 DCHECK(num_downloads_blocking); |
| 1054 |
| 1055 if (is_attempting_to_close_browser_) |
| 1056 return DOWNLOAD_CLOSE_OK; |
| 1057 |
| 1058 // If we're not running a full browser process with a profile manager |
| 1059 // (testing), it's ok to close the browser. |
| 1060 if (!g_browser_process->profile_manager()) |
| 1061 return DOWNLOAD_CLOSE_OK; |
| 1062 |
| 1063 int total_download_count = |
| 1064 g_browser_process->profile_manager()->TotalDownloadCount(); |
| 1065 if (total_download_count == 0) |
| 1066 return DOWNLOAD_CLOSE_OK; // No downloads; can definitely close. |
| 1067 |
| 1068 // Let's figure out if we are the last window for our profile, and |
| 1069 // the last window period. |
| 1070 // Note that we cannot just use BrowserList::GetBrowserCount as browser |
| 1071 // windows closing is delayed and the returned count might include windows |
| 1072 // that are being closed. |
| 1073 // The browser allowed to be closed only if both of the following are true: |
| 1074 // 1. There are no downloads present for any profile or it is not the |
| 1075 // last Browser. |
| 1076 // 2. (Incognito Browser) There are no incognito downloads associated with |
| 1077 // the Browser's profile or it is not the last Browser associated with |
| 1078 // that profile. |
| 1079 // Note the lack of parallelism: regular profiles are kept around until |
| 1080 // browser close, whereas incognito profiles are destroyed on last |
| 1081 // associated window close. |
| 1082 int profile_window_count = 0; |
| 1083 int total_window_count = 0; |
| 1084 for (BrowserList::const_iterator iter = BrowserList::begin(); |
| 1085 iter != BrowserList::end(); ++iter) { |
| 1086 // Don't count this browser window or any other in the process of closing. |
| 1087 Browser* const browser = *iter; |
| 1088 if (browser == this || |
| 1089 browser->is_attempting_to_close_browser_) |
| 1090 continue; |
| 1091 |
| 1092 if ((*iter)->profile() == profile()) |
| 1093 profile_window_count++; |
| 1094 total_window_count++; |
| 1095 } |
| 1096 |
| 1097 // If there aren't any other windows, we're at browser shutdown. |
| 1098 if (total_window_count == 0) { |
| 1099 *num_downloads_blocking = total_download_count; |
| 1100 return DOWNLOAD_CLOSE_BROWSER_SHUTDOWN; |
| 1101 } |
| 1102 |
| 1103 // If there aren't any other windows on our profile, we're an incognito |
| 1104 // profile, and there are downloads associated with that profile, |
| 1105 // indicate that. |
| 1106 if (profile_window_count == 0 && profile()->DownloadCount() > 0 && |
| 1107 profile()->IsOffTheRecord()) { |
| 1108 *num_downloads_blocking = profile()->DownloadCount(); |
| 1109 return DOWNLOAD_CLOSE_LAST_WINDOW_IN_INCOGNITO_PROFILE; |
| 1110 } |
| 1111 |
| 1112 // Those are the only conditions under which we will block shutdown. |
| 1113 return DOWNLOAD_CLOSE_OK; |
| 1114 } |
| 1115 |
1050 //////////////////////////////////////////////////////////////////////////////// | 1116 //////////////////////////////////////////////////////////////////////////////// |
1051 // Browser, TabStripModel pass-thrus: | 1117 // Browser, TabStripModel pass-thrus: |
1052 | 1118 |
1053 int Browser::tab_count() const { | 1119 int Browser::tab_count() const { |
1054 return tab_handler_->GetTabStripModel()->count(); | 1120 return tab_handler_->GetTabStripModel()->count(); |
1055 } | 1121 } |
1056 | 1122 |
1057 int Browser::active_index() const { | 1123 int Browser::active_index() const { |
1058 return tab_handler_->GetTabStripModel()->active_index(); | 1124 return tab_handler_->GetTabStripModel()->active_index(); |
1059 } | 1125 } |
(...skipping 3433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4493 MessageLoop::current()->PostTask( | 4559 MessageLoop::current()->PostTask( |
4494 FROM_HERE, | 4560 FROM_HERE, |
4495 method_factory_.NewRunnableMethod(&Browser::ProcessPendingTabs)); | 4561 method_factory_.NewRunnableMethod(&Browser::ProcessPendingTabs)); |
4496 } | 4562 } |
4497 } | 4563 } |
4498 } | 4564 } |
4499 | 4565 |
4500 /////////////////////////////////////////////////////////////////////////////// | 4566 /////////////////////////////////////////////////////////////////////////////// |
4501 // Browser, In-progress download termination handling (private): | 4567 // Browser, In-progress download termination handling (private): |
4502 | 4568 |
4503 void Browser::CheckDownloadsInProgress(bool* normal_downloads_are_present, | |
4504 bool* incognito_downloads_are_present) { | |
4505 *normal_downloads_are_present = false; | |
4506 *incognito_downloads_are_present = false; | |
4507 | |
4508 // If there are no download in-progress, our job is done. | |
4509 DownloadManager* download_manager = NULL; | |
4510 // But first we need to check for the existence of the download manager, as | |
4511 // GetDownloadManager() will unnecessarily try to create one if it does not | |
4512 // exist. | |
4513 if (profile()->HasCreatedDownloadManager()) | |
4514 download_manager = profile()->GetDownloadManager(); | |
4515 if (profile()->IsOffTheRecord()) { | |
4516 // Browser is incognito and so download_manager if present is for incognito | |
4517 // downloads. | |
4518 *incognito_downloads_are_present = | |
4519 (download_manager && download_manager->in_progress_count() != 0); | |
4520 // Check original profile. | |
4521 if (profile()->GetOriginalProfile()->HasCreatedDownloadManager()) | |
4522 download_manager = profile()->GetOriginalProfile()->GetDownloadManager(); | |
4523 } | |
4524 | |
4525 *normal_downloads_are_present = | |
4526 (download_manager && download_manager->in_progress_count() != 0); | |
4527 } | |
4528 | |
4529 bool Browser::CanCloseWithInProgressDownloads() { | 4569 bool Browser::CanCloseWithInProgressDownloads() { |
4530 if (cancel_download_confirmation_state_ != NOT_PROMPTED) { | 4570 if (cancel_download_confirmation_state_ != NOT_PROMPTED) { |
4531 if (cancel_download_confirmation_state_ == WAITING_FOR_RESPONSE) { | 4571 if (cancel_download_confirmation_state_ == WAITING_FOR_RESPONSE) { |
4532 // We need to hear from the user before we can close. | 4572 // We need to hear from the user before we can close. |
4533 return false; | 4573 return false; |
4534 } | 4574 } |
4535 // RESPONSE_RECEIVED case, the user decided to go along with the closing. | 4575 // RESPONSE_RECEIVED case, the user decided to go along with the closing. |
4536 return true; | 4576 return true; |
4537 } | 4577 } |
4538 // Indicated that normal (non-incognito) downloads are pending. | 4578 |
4539 bool normal_downloads_are_present = false; | 4579 int num_downloads_blocking; |
4540 bool incognito_downloads_are_present = false; | 4580 if (DOWNLOAD_CLOSE_OK == |
4541 CheckDownloadsInProgress(&normal_downloads_are_present, | 4581 OkToCloseWithInProgressDownloads(&num_downloads_blocking)) |
4542 &incognito_downloads_are_present); | |
4543 if (!normal_downloads_are_present && !incognito_downloads_are_present) | |
4544 return true; | 4582 return true; |
4545 | 4583 |
4546 if (is_attempting_to_close_browser_) | 4584 // Closing this window will kill some downloads; prompt to make sure |
4547 return true; | 4585 // that's ok. |
4548 | |
4549 if ((!normal_downloads_are_present && !profile()->IsOffTheRecord()) || | |
4550 (!incognito_downloads_are_present && profile()->IsOffTheRecord())) | |
4551 return true; | |
4552 | |
4553 // Let's figure out if we are the last window for our profile. | |
4554 // Note that we cannot just use BrowserList::GetBrowserCount as browser | |
4555 // windows closing is delayed and the returned count might include windows | |
4556 // that are being closed. | |
4557 // The browser allowed to be closed only if: | |
4558 // 1. It is a regular browser and there are no regular downloads present or | |
4559 // this is not the last regular browser window. | |
4560 // 2. It is an incognito browser and there are no incognito downloads present | |
4561 // or this is not the last incognito browser window. | |
4562 int count = 0; | |
4563 for (BrowserList::const_iterator iter = BrowserList::begin(); | |
4564 iter != BrowserList::end(); ++iter) { | |
4565 // Don't count this browser window or any other in the process of closing. | |
4566 // Only consider tabbed browser windows, not popups. | |
4567 Browser* const browser = *iter; | |
4568 if (browser == this | |
4569 || browser->is_attempting_to_close_browser_ | |
4570 || !browser->is_type_tabbed()) | |
4571 continue; | |
4572 | |
4573 // Verify that this is not the last non-incognito or incognito browser, | |
4574 // depending on the pending downloads. | |
4575 if (normal_downloads_are_present && !profile()->IsOffTheRecord() && | |
4576 browser->profile()->IsOffTheRecord()) | |
4577 continue; | |
4578 if (incognito_downloads_are_present && profile()->IsOffTheRecord() && | |
4579 !browser->profile()->IsOffTheRecord()) | |
4580 continue; | |
4581 | |
4582 // We test the original profile, because an incognito browser window keeps | |
4583 // the original profile alive (and its DownloadManager). | |
4584 // We also need to test explicitly the profile directly so that 2 incognito | |
4585 // profiles count as a match. | |
4586 if ((*iter)->profile() == profile() || | |
4587 (*iter)->profile()->GetOriginalProfile() == profile()) | |
4588 count++; | |
4589 } | |
4590 if (count > 0) | |
4591 return true; | |
4592 | |
4593 cancel_download_confirmation_state_ = WAITING_FOR_RESPONSE; | 4586 cancel_download_confirmation_state_ = WAITING_FOR_RESPONSE; |
4594 window_->ConfirmBrowserCloseWithPendingDownloads(); | 4587 window_->ConfirmBrowserCloseWithPendingDownloads(); |
4595 | 4588 |
4596 // Return false so the browser does not close. We'll close if the user | 4589 // Return false so the browser does not close. We'll close if the user |
4597 // confirms in the dialog. | 4590 // confirms in the dialog. |
4598 return false; | 4591 return false; |
4599 } | 4592 } |
4600 | 4593 |
4601 /////////////////////////////////////////////////////////////////////////////// | 4594 /////////////////////////////////////////////////////////////////////////////// |
4602 // Browser, Assorted utility functions (private): | 4595 // Browser, Assorted utility functions (private): |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4885 } | 4878 } |
4886 | 4879 |
4887 void Browser::ShowSyncSetup() { | 4880 void Browser::ShowSyncSetup() { |
4888 ProfileSyncService* service = | 4881 ProfileSyncService* service = |
4889 profile()->GetOriginalProfile()->GetProfileSyncService(); | 4882 profile()->GetOriginalProfile()->GetProfileSyncService(); |
4890 if (service->HasSyncSetupCompleted()) | 4883 if (service->HasSyncSetupCompleted()) |
4891 ShowOptionsTab(chrome::kSyncSetupSubPage); | 4884 ShowOptionsTab(chrome::kSyncSetupSubPage); |
4892 else | 4885 else |
4893 service->ShowLoginDialog(); | 4886 service->ShowLoginDialog(); |
4894 } | 4887 } |
OLD | NEW |