OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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 // defined(OS_WIN) | 10 #endif // defined(OS_WIN) |
(...skipping 1029 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1040 search_delegate_->OnTabDeactivated(contents); | 1040 search_delegate_->OnTabDeactivated(contents); |
1041 | 1041 |
1042 // Save what the user's currently typing, so it can be restored when we | 1042 // Save what the user's currently typing, so it can be restored when we |
1043 // switch back to this tab. | 1043 // switch back to this tab. |
1044 window_->GetLocationBar()->SaveStateToContents(contents); | 1044 window_->GetLocationBar()->SaveStateToContents(contents); |
1045 | 1045 |
1046 if (instant_controller_) | 1046 if (instant_controller_) |
1047 instant_controller_->TabDeactivated(contents); | 1047 instant_controller_->TabDeactivated(contents); |
1048 } | 1048 } |
1049 | 1049 |
1050 void Browser::ActiveTabChanged(WebContents* old_contents, | |
1051 WebContents* new_contents, | |
1052 int index, | |
1053 int reason) { | |
1054 content::RecordAction(UserMetricsAction("ActiveTabChanged")); | |
1055 | |
1056 // Discarded tabs always get reloaded. | |
1057 if (tab_strip_model_->IsTabDiscarded(index)) { | |
1058 LOG(WARNING) << "Reloading discarded tab at " << index; | |
1059 static int reload_count = 0; | |
1060 UMA_HISTOGRAM_CUSTOM_COUNTS( | |
1061 "Tabs.Discard.ReloadCount", ++reload_count, 1, 1000, 50); | |
1062 chrome::Reload(this, CURRENT_TAB); | |
1063 } | |
1064 | |
1065 // If we have any update pending, do it now. | |
1066 if (chrome_updater_factory_.HasWeakPtrs() && old_contents) | |
1067 ProcessPendingUIUpdates(); | |
1068 | |
1069 // Propagate the profile to the location bar. | |
1070 UpdateToolbar((reason & CHANGE_REASON_REPLACED) == 0); | |
1071 | |
1072 // Propagate tab state to toolbar, tab-strip, etc. | |
1073 UpdateSearchState(new_contents); | |
1074 | |
1075 // Update reload/stop state. | |
1076 command_controller_->LoadingStateChanged(new_contents->IsLoading(), true); | |
1077 | |
1078 // Update commands to reflect current state. | |
1079 command_controller_->TabStateChanged(); | |
1080 | |
1081 // Reset the status bubble. | |
1082 StatusBubble* status_bubble = GetStatusBubble(); | |
1083 if (status_bubble) { | |
1084 status_bubble->Hide(); | |
1085 | |
1086 // Show the loading state (if any). | |
1087 status_bubble->SetStatus(CoreTabHelper::FromWebContents( | |
1088 tab_strip_model_->GetActiveWebContents())->GetStatusText()); | |
1089 } | |
1090 | |
1091 if (HasFindBarController()) { | |
1092 find_bar_controller_->ChangeWebContents(new_contents); | |
1093 find_bar_controller_->find_bar()->MoveWindowIfNecessary(gfx::Rect(), true); | |
1094 } | |
1095 | |
1096 // Update sessions. Don't force creation of sessions. If sessions doesn't | |
1097 // exist, the change will be picked up by sessions when created. | |
1098 SessionService* session_service = | |
1099 SessionServiceFactory::GetForProfileIfExisting(profile_); | |
1100 if (session_service && !tab_strip_model_->closing_all()) { | |
1101 session_service->SetSelectedTabInWindow(session_id(), | |
1102 tab_strip_model_->active_index()); | |
1103 } | |
1104 | |
1105 UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_SWITCH); | |
1106 | |
1107 // This needs to be called after UpdateSearchState(). | |
1108 if (instant_controller_) | |
1109 instant_controller_->ActiveTabChanged(); | |
1110 | |
1111 autofill::TabAutofillManagerDelegate::FromWebContents(new_contents)-> | |
1112 TabActivated(reason); | |
1113 } | |
1114 | |
1115 void Browser::TabMoved(WebContents* contents, | 1050 void Browser::TabMoved(WebContents* contents, |
1116 int from_index, | 1051 int from_index, |
1117 int to_index) { | 1052 int to_index) { |
1118 DCHECK(from_index >= 0 && to_index >= 0); | 1053 DCHECK(from_index >= 0 && to_index >= 0); |
1119 // Notify the history service. | 1054 // Notify the history service. |
1120 SyncHistoryWithTabs(std::min(from_index, to_index)); | 1055 SyncHistoryWithTabs(std::min(from_index, to_index)); |
1121 } | 1056 } |
1122 | 1057 |
1123 void Browser::TabReplacedAt(TabStripModel* tab_strip_model, | 1058 void Browser::TabReplacedAt(TabStripModel* tab_strip_model, |
1124 WebContents* old_contents, | 1059 WebContents* old_contents, |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1170 // times. This is because it does not close the window if tabs are | 1105 // times. This is because it does not close the window if tabs are |
1171 // still present. | 1106 // still present. |
1172 base::MessageLoop::current()->PostTask( | 1107 base::MessageLoop::current()->PostTask( |
1173 FROM_HERE, base::Bind(&Browser::CloseFrame, weak_factory_.GetWeakPtr())); | 1108 FROM_HERE, base::Bind(&Browser::CloseFrame, weak_factory_.GetWeakPtr())); |
1174 | 1109 |
1175 // Instant may have visible WebContents that need to be detached before the | 1110 // Instant may have visible WebContents that need to be detached before the |
1176 // window system closes. | 1111 // window system closes. |
1177 instant_controller_.reset(); | 1112 instant_controller_.reset(); |
1178 } | 1113 } |
1179 | 1114 |
| 1115 void Browser::OnActiveTabChanged(WebContents* old_contents, |
| 1116 WebContents* new_contents, |
| 1117 int index, |
| 1118 int reason) { |
| 1119 content::RecordAction(UserMetricsAction("ActiveTabChanged")); |
| 1120 |
| 1121 // Discarded tabs always get reloaded. |
| 1122 if (tab_strip_model_->IsTabDiscarded(index)) { |
| 1123 LOG(WARNING) << "Reloading discarded tab at " << index; |
| 1124 static int reload_count = 0; |
| 1125 UMA_HISTOGRAM_CUSTOM_COUNTS( |
| 1126 "Tabs.Discard.ReloadCount", ++reload_count, 1, 1000, 50); |
| 1127 chrome::Reload(this, CURRENT_TAB); |
| 1128 } |
| 1129 |
| 1130 // If we have any update pending, do it now. |
| 1131 if (chrome_updater_factory_.HasWeakPtrs() && old_contents) |
| 1132 ProcessPendingUIUpdates(); |
| 1133 |
| 1134 // Propagate the profile to the location bar. |
| 1135 UpdateToolbar((reason & CHANGE_REASON_REPLACED) == 0); |
| 1136 |
| 1137 // Propagate tab state to toolbar, tab-strip, etc. |
| 1138 UpdateSearchState(new_contents); |
| 1139 |
| 1140 // Update reload/stop state. |
| 1141 command_controller_->LoadingStateChanged(new_contents->IsLoading(), true); |
| 1142 |
| 1143 // Update commands to reflect current state. |
| 1144 command_controller_->TabStateChanged(); |
| 1145 |
| 1146 // Reset the status bubble. |
| 1147 StatusBubble* status_bubble = GetStatusBubble(); |
| 1148 if (status_bubble) { |
| 1149 status_bubble->Hide(); |
| 1150 |
| 1151 // Show the loading state (if any). |
| 1152 status_bubble->SetStatus(CoreTabHelper::FromWebContents( |
| 1153 tab_strip_model_->GetActiveWebContents())->GetStatusText()); |
| 1154 } |
| 1155 |
| 1156 if (HasFindBarController()) { |
| 1157 find_bar_controller_->ChangeWebContents(new_contents); |
| 1158 find_bar_controller_->find_bar()->MoveWindowIfNecessary(gfx::Rect(), true); |
| 1159 } |
| 1160 |
| 1161 // Update sessions. Don't force creation of sessions. If sessions doesn't |
| 1162 // exist, the change will be picked up by sessions when created. |
| 1163 SessionService* session_service = |
| 1164 SessionServiceFactory::GetForProfileIfExisting(profile_); |
| 1165 if (session_service && !tab_strip_model_->closing_all()) { |
| 1166 session_service->SetSelectedTabInWindow(session_id(), |
| 1167 tab_strip_model_->active_index()); |
| 1168 } |
| 1169 |
| 1170 UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_SWITCH); |
| 1171 |
| 1172 // This needs to be called after UpdateSearchState(). |
| 1173 if (instant_controller_) |
| 1174 instant_controller_->ActiveTabChanged(); |
| 1175 |
| 1176 autofill::TabAutofillManagerDelegate::FromWebContents(new_contents)-> |
| 1177 TabActivated(reason); |
| 1178 } |
| 1179 |
1180 bool Browser::CanOverscrollContent() const { | 1180 bool Browser::CanOverscrollContent() const { |
1181 #if defined(USE_AURA) | 1181 #if defined(USE_AURA) |
1182 bool overscroll_enabled = CommandLine::ForCurrentProcess()-> | 1182 bool overscroll_enabled = CommandLine::ForCurrentProcess()-> |
1183 GetSwitchValueASCII(switches::kOverscrollHistoryNavigation) != "0"; | 1183 GetSwitchValueASCII(switches::kOverscrollHistoryNavigation) != "0"; |
1184 if (!overscroll_enabled) | 1184 if (!overscroll_enabled) |
1185 return false; | 1185 return false; |
1186 if (is_app() || is_devtools() || !is_type_tabbed()) | 1186 if (is_app() || is_devtools() || !is_type_tabbed()) |
1187 return false; | 1187 return false; |
1188 | 1188 |
1189 // The detached bookmark bar has appearance of floating above the | 1189 // The detached bookmark bar has appearance of floating above the |
(...skipping 1102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2292 if (contents && !allow_js_access) { | 2292 if (contents && !allow_js_access) { |
2293 contents->web_contents()->GetController().LoadURL( | 2293 contents->web_contents()->GetController().LoadURL( |
2294 target_url, | 2294 target_url, |
2295 content::Referrer(), | 2295 content::Referrer(), |
2296 content::PAGE_TRANSITION_LINK, | 2296 content::PAGE_TRANSITION_LINK, |
2297 std::string()); // No extra headers. | 2297 std::string()); // No extra headers. |
2298 } | 2298 } |
2299 | 2299 |
2300 return contents != NULL; | 2300 return contents != NULL; |
2301 } | 2301 } |
OLD | NEW |