OLD | NEW |
---|---|
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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/tab_contents/tab_contents.h" | 5 #include "chrome/browser/tab_contents/tab_contents.h" |
6 | 6 |
7 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
8 #include "app/resource_bundle.h" | 8 #include "app/resource_bundle.h" |
9 #include "base/file_version_info.h" | 9 #include "base/file_version_info.h" |
10 #include "base/process_util.h" | 10 #include "base/process_util.h" |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
258 last_search_result_(), | 258 last_search_result_(), |
259 capturing_contents_(false), | 259 capturing_contents_(false), |
260 is_being_destroyed_(false), | 260 is_being_destroyed_(false), |
261 notify_disconnection_(false), | 261 notify_disconnection_(false), |
262 history_requests_(), | 262 history_requests_(), |
263 #if defined(OS_WIN) | 263 #if defined(OS_WIN) |
264 message_box_active_(CreateEvent(NULL, TRUE, FALSE, NULL)), | 264 message_box_active_(CreateEvent(NULL, TRUE, FALSE, NULL)), |
265 #endif | 265 #endif |
266 last_javascript_message_dismissal_(), | 266 last_javascript_message_dismissal_(), |
267 suppress_javascript_messages_(false), | 267 suppress_javascript_messages_(false), |
268 is_showing_before_unload_dialog_(false), | |
268 opener_dom_ui_type_(DOMUIFactory::kNoDOMUI) { | 269 opener_dom_ui_type_(DOMUIFactory::kNoDOMUI) { |
269 pending_install_.page_id = 0; | 270 pending_install_.page_id = 0; |
270 pending_install_.callback_functor = NULL; | 271 pending_install_.callback_functor = NULL; |
271 | 272 |
272 #if defined(OS_CHROMEOS) | 273 #if defined(OS_CHROMEOS) |
273 // Make sure the thumbnailer is started before starting the render manager. | 274 // Make sure the thumbnailer is started before starting the render manager. |
274 // The thumbnailer will want to listen for RVH creations, one of which will | 275 // The thumbnailer will want to listen for RVH creations, one of which will |
275 // happen in RVHManager::Init. | 276 // happen in RVHManager::Init. |
276 ThumbnailGenerator* generator = g_browser_process->GetThumbnailGenerator(); | 277 ThumbnailGenerator* generator = g_browser_process->GetThumbnailGenerator(); |
277 if (generator) | 278 if (generator) |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
367 } | 368 } |
368 infobar_delegates_.clear(); | 369 infobar_delegates_.clear(); |
369 | 370 |
370 // TODO(brettw) this should be moved to the view. | 371 // TODO(brettw) this should be moved to the view. |
371 #if defined(OS_WIN) | 372 #if defined(OS_WIN) |
372 // If we still have a window handle, destroy it. GetNativeView can return | 373 // If we still have a window handle, destroy it. GetNativeView can return |
373 // NULL if this contents was part of a window that closed. | 374 // NULL if this contents was part of a window that closed. |
374 if (GetNativeView()) | 375 if (GetNativeView()) |
375 ::DestroyWindow(GetNativeView()); | 376 ::DestroyWindow(GetNativeView()); |
376 #endif | 377 #endif |
378 | |
379 // OnCloseStarted isn't called in unit tests. | |
380 if (!tab_close_start_time_.is_null()) { | |
381 UMA_HISTOGRAM_TIMES("Tab.Close", | |
382 base::TimeTicks::Now() - tab_close_start_time_); | |
383 } | |
377 } | 384 } |
378 | 385 |
379 // static | 386 // static |
380 void TabContents::RegisterUserPrefs(PrefService* prefs) { | 387 void TabContents::RegisterUserPrefs(PrefService* prefs) { |
381 prefs->RegisterBooleanPref(prefs::kAlternateErrorPagesEnabled, true); | 388 prefs->RegisterBooleanPref(prefs::kAlternateErrorPagesEnabled, true); |
382 | 389 |
383 WebPreferences pref_defaults; | 390 WebPreferences pref_defaults; |
384 prefs->RegisterBooleanPref(prefs::kWebKitJavascriptEnabled, | 391 prefs->RegisterBooleanPref(prefs::kWebKitJavascriptEnabled, |
385 pref_defaults.javascript_enabled); | 392 pref_defaults.javascript_enabled); |
386 prefs->RegisterBooleanPref(prefs::kWebKitWebSecurityEnabled, | 393 prefs->RegisterBooleanPref(prefs::kWebKitWebSecurityEnabled, |
(...skipping 718 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1105 } | 1112 } |
1106 | 1113 |
1107 void TabContents::GetPageLanguage() { | 1114 void TabContents::GetPageLanguage() { |
1108 render_view_host()->GetPageLanguage(); | 1115 render_view_host()->GetPageLanguage(); |
1109 } | 1116 } |
1110 | 1117 |
1111 void TabContents::OnJavaScriptMessageBoxClosed(IPC::Message* reply_msg, | 1118 void TabContents::OnJavaScriptMessageBoxClosed(IPC::Message* reply_msg, |
1112 bool success, | 1119 bool success, |
1113 const std::wstring& prompt) { | 1120 const std::wstring& prompt) { |
1114 last_javascript_message_dismissal_ = base::TimeTicks::Now(); | 1121 last_javascript_message_dismissal_ = base::TimeTicks::Now(); |
1115 render_manager_.OnJavaScriptMessageBoxClosed(reply_msg, success, prompt); | 1122 if (is_showing_before_unload_dialog_ && !success) { |
1123 // If a beforeunload dialog is canceled, we need to stop the throbber from | |
1124 // spinning, since we forced it to start spinning in Navigate. | |
1125 DidStopLoading(); | |
1126 | |
1127 tab_close_start_time_ = base::TimeTicks(); | |
1128 } | |
1129 is_showing_before_unload_dialog_ = false; | |
1130 render_view_host()->JavaScriptMessageBoxClosed(reply_msg, success, prompt); | |
1116 } | 1131 } |
1117 | 1132 |
1118 void TabContents::OnSavePage() { | 1133 void TabContents::OnSavePage() { |
1119 // If we can not save the page, try to download it. | 1134 // If we can not save the page, try to download it. |
1120 if (!SavePackage::IsSavableContents(contents_mime_type())) { | 1135 if (!SavePackage::IsSavableContents(contents_mime_type())) { |
1121 DownloadManager* dlm = profile()->GetDownloadManager(); | 1136 DownloadManager* dlm = profile()->GetDownloadManager(); |
1122 const GURL& current_page_url = GetURL(); | 1137 const GURL& current_page_url = GetURL(); |
1123 if (dlm && current_page_url.is_valid()) | 1138 if (dlm && current_page_url.is_valid()) |
1124 dlm->DownloadUrl(current_page_url, GURL(), "", this); | 1139 dlm->DownloadUrl(current_page_url, GURL(), "", this); |
1125 return; | 1140 return; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1173 void TabContents::LogNewTabTime(const std::string& event_name) { | 1188 void TabContents::LogNewTabTime(const std::string& event_name) { |
1174 // Not all new tab pages get timed. In those cases, we don't have a | 1189 // Not all new tab pages get timed. In those cases, we don't have a |
1175 // new_tab_start_time_. | 1190 // new_tab_start_time_. |
1176 if (new_tab_start_time_.is_null()) | 1191 if (new_tab_start_time_.is_null()) |
1177 return; | 1192 return; |
1178 | 1193 |
1179 base::TimeDelta duration = base::TimeTicks::Now() - new_tab_start_time_; | 1194 base::TimeDelta duration = base::TimeTicks::Now() - new_tab_start_time_; |
1180 MetricEventDurationDetails details(event_name, | 1195 MetricEventDurationDetails details(event_name, |
1181 static_cast<int>(duration.InMilliseconds())); | 1196 static_cast<int>(duration.InMilliseconds())); |
1182 | 1197 |
1183 if (event_name == "NewTab.ScriptStart") { | 1198 if (event_name == "Tab.NewTabScriptStart") { |
1184 UMA_HISTOGRAM_TIMES("NewTab.ScriptStart", duration); | 1199 UMA_HISTOGRAM_TIMES("Tab.NewTabScriptStart", duration); |
1185 } else if (event_name == "NewTab.DOMContentLoaded") { | 1200 } else if (event_name == "Tab.NewTabDOMContentLoaded") { |
1186 UMA_HISTOGRAM_TIMES("NewTab.DOMContentLoaded", duration); | 1201 UMA_HISTOGRAM_TIMES("Tab.NewTabDOMContentLoaded", duration); |
1187 } else if (event_name == "NewTab.Onload") { | 1202 } else if (event_name == "Tab.NewTabOnload") { |
1188 UMA_HISTOGRAM_TIMES("NewTab.Onload", duration); | 1203 UMA_HISTOGRAM_TIMES("Tab.NewTabOnload", duration); |
1189 // The new tab page has finished loading; reset it. | 1204 // The new tab page has finished loading; reset it. |
1190 new_tab_start_time_ = base::TimeTicks(); | 1205 new_tab_start_time_ = base::TimeTicks(); |
1191 } else { | 1206 } else { |
1192 NOTREACHED(); | 1207 NOTREACHED(); |
1193 } | 1208 } |
1194 NotificationService::current()->Notify( | 1209 NotificationService::current()->Notify( |
1195 NotificationType::METRIC_EVENT_DURATION, | 1210 NotificationType::METRIC_EVENT_DURATION, |
1196 Source<TabContents>(this), | 1211 Source<TabContents>(this), |
1197 Details<MetricEventDurationDetails>(&details)); | 1212 Details<MetricEventDurationDetails>(&details)); |
1198 } | 1213 } |
1199 | 1214 |
1215 void TabContents::OnCloseStarted() { | |
1216 if (tab_close_start_time_.is_null()) | |
tony
2009/10/14 23:20:06
Is it possible for this to be called twice?
jam
2009/10/14 23:31:11
Yes it does, since InternalCloseTabs will get call
| |
1217 tab_close_start_time_ = base::TimeTicks::Now(); | |
1218 } | |
1219 | |
1200 // Notifies the RenderWidgetHost instance about the fact that the page is | 1220 // Notifies the RenderWidgetHost instance about the fact that the page is |
1201 // loading, or done loading and calls the base implementation. | 1221 // loading, or done loading and calls the base implementation. |
1202 void TabContents::SetIsLoading(bool is_loading, | 1222 void TabContents::SetIsLoading(bool is_loading, |
1203 LoadNotificationDetails* details) { | 1223 LoadNotificationDetails* details) { |
1204 if (is_loading == is_loading_) | 1224 if (is_loading == is_loading_) |
1205 return; | 1225 return; |
1206 | 1226 |
1207 if (!is_loading) { | 1227 if (!is_loading) { |
1208 load_state_ = net::LOAD_STATE_IDLE; | 1228 load_state_ = net::LOAD_STATE_IDLE; |
1209 load_state_host_.clear(); | 1229 load_state_host_.clear(); |
(...skipping 933 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2143 // Ignore this if it comes from a RenderViewHost that we aren't showing. | 2163 // Ignore this if it comes from a RenderViewHost that we aren't showing. |
2144 if (delegate() && rvh == render_view_host()) | 2164 if (delegate() && rvh == render_view_host()) |
2145 delegate()->CloseContents(this); | 2165 delegate()->CloseContents(this); |
2146 } | 2166 } |
2147 | 2167 |
2148 void TabContents::RequestMove(const gfx::Rect& new_bounds) { | 2168 void TabContents::RequestMove(const gfx::Rect& new_bounds) { |
2149 if (delegate() && delegate()->IsPopup(this)) | 2169 if (delegate() && delegate()->IsPopup(this)) |
2150 delegate()->MoveContents(this, new_bounds); | 2170 delegate()->MoveContents(this, new_bounds); |
2151 } | 2171 } |
2152 | 2172 |
2153 void TabContents::DidStartLoading(RenderViewHost* rvh) { | 2173 void TabContents::DidStartLoading() { |
2154 SetIsLoading(true, NULL); | 2174 SetIsLoading(true, NULL); |
2155 } | 2175 } |
2156 | 2176 |
2157 void TabContents::DidStopLoading(RenderViewHost* rvh) { | 2177 void TabContents::DidStopLoading() { |
2158 scoped_ptr<LoadNotificationDetails> details; | 2178 scoped_ptr<LoadNotificationDetails> details; |
2159 | 2179 |
2160 NavigationEntry* entry = controller_.GetActiveEntry(); | 2180 NavigationEntry* entry = controller_.GetActiveEntry(); |
2161 // An entry may not exist for a stop when loading an initial blank page or | 2181 // An entry may not exist for a stop when loading an initial blank page or |
2162 // if an iframe injected by script into a blank page finishes loading. | 2182 // if an iframe injected by script into a blank page finishes loading. |
2163 if (entry) { | 2183 if (entry) { |
2164 scoped_ptr<base::ProcessMetrics> metrics( | 2184 scoped_ptr<base::ProcessMetrics> metrics( |
2165 base::ProcessMetrics::CreateProcessMetrics( | 2185 base::ProcessMetrics::CreateProcessMetrics( |
2166 process()->process().handle())); | 2186 process()->process().handle())); |
2167 | 2187 |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2286 show_suppress_checkbox, reply_msg); | 2306 show_suppress_checkbox, reply_msg); |
2287 } else { | 2307 } else { |
2288 // If we are suppressing messages, just reply as is if the user immediately | 2308 // If we are suppressing messages, just reply as is if the user immediately |
2289 // pressed "Cancel". | 2309 // pressed "Cancel". |
2290 OnJavaScriptMessageBoxClosed(reply_msg, false, std::wstring()); | 2310 OnJavaScriptMessageBoxClosed(reply_msg, false, std::wstring()); |
2291 } | 2311 } |
2292 } | 2312 } |
2293 | 2313 |
2294 void TabContents::RunBeforeUnloadConfirm(const std::wstring& message, | 2314 void TabContents::RunBeforeUnloadConfirm(const std::wstring& message, |
2295 IPC::Message* reply_msg) { | 2315 IPC::Message* reply_msg) { |
2316 is_showing_before_unload_dialog_ = true; | |
2296 RunBeforeUnloadDialog(this, message, reply_msg); | 2317 RunBeforeUnloadDialog(this, message, reply_msg); |
2297 } | 2318 } |
2298 | 2319 |
2299 void TabContents::ShowModalHTMLDialog(const GURL& url, int width, int height, | 2320 void TabContents::ShowModalHTMLDialog(const GURL& url, int width, int height, |
2300 const std::string& json_arguments, | 2321 const std::string& json_arguments, |
2301 IPC::Message* reply_msg) { | 2322 IPC::Message* reply_msg) { |
2302 if (delegate()) { | 2323 if (delegate()) { |
2303 HtmlDialogUIDelegate* dialog_delegate = | 2324 HtmlDialogUIDelegate* dialog_delegate = |
2304 new ModalHtmlDialogDelegate(url, width, height, json_arguments, | 2325 new ModalHtmlDialogDelegate(url, width, height, json_arguments, |
2305 reply_msg, this); | 2326 reply_msg, this); |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2598 | 2619 |
2599 default: | 2620 default: |
2600 NOTREACHED(); | 2621 NOTREACHED(); |
2601 } | 2622 } |
2602 } | 2623 } |
2603 | 2624 |
2604 void TabContents::set_encoding(const std::string& encoding) { | 2625 void TabContents::set_encoding(const std::string& encoding) { |
2605 encoding_ = CharacterEncoding::GetCanonicalEncodingNameByAliasName(encoding); | 2626 encoding_ = CharacterEncoding::GetCanonicalEncodingNameByAliasName(encoding); |
2606 } | 2627 } |
2607 | 2628 |
OLD | NEW |