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

Side by Side Diff: content/browser/tab_contents/tab_contents.cc

Issue 7054008: Remove history dependency from content. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 7 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 "content/browser/tab_contents/tab_contents.h" 5 #include "content/browser/tab_contents/tab_contents.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
11 #include "base/metrics/stats_counters.h" 11 #include "base/metrics/stats_counters.h"
12 #include "base/string16.h" 12 #include "base/string16.h"
13 #include "base/string_util.h" 13 #include "base/string_util.h"
14 #include "base/time.h" 14 #include "base/time.h"
15 #include "base/utf_string_conversions.h" 15 #include "base/utf_string_conversions.h"
16 #include "chrome/browser/browser_shutdown.h" 16 #include "chrome/browser/browser_shutdown.h"
17 #include "chrome/browser/debugger/devtools_manager.h" 17 #include "chrome/browser/debugger/devtools_manager.h"
18 #include "chrome/browser/defaults.h" 18 #include "chrome/browser/defaults.h"
19 #include "chrome/browser/external_protocol_handler.h" 19 #include "chrome/browser/external_protocol_handler.h"
20 #include "chrome/browser/history/history.h"
21 #include "chrome/browser/load_from_memory_cache_details.h" 20 #include "chrome/browser/load_from_memory_cache_details.h"
22 #include "chrome/browser/load_notification_details.h" 21 #include "chrome/browser/load_notification_details.h"
23 #include "chrome/browser/notifications/desktop_notification_service.h" 22 #include "chrome/browser/notifications/desktop_notification_service.h"
24 #include "chrome/browser/notifications/desktop_notification_service_factory.h" 23 #include "chrome/browser/notifications/desktop_notification_service_factory.h"
25 #include "chrome/browser/platform_util.h" 24 #include "chrome/browser/platform_util.h"
26 #include "chrome/browser/prefs/pref_service.h" 25 #include "chrome/browser/prefs/pref_service.h"
27 #include "chrome/browser/profiles/profile.h" 26 #include "chrome/browser/profiles/profile.h"
28 #include "chrome/browser/renderer_host/web_cache_manager.h" 27 #include "chrome/browser/renderer_host/web_cache_manager.h"
29 #include "chrome/browser/renderer_preferences_util.h" 28 #include "chrome/browser/renderer_preferences_util.h"
30 #include "chrome/browser/ui/app_modal_dialogs/message_box_handler.h" 29 #include "chrome/browser/ui/app_modal_dialogs/message_box_handler.h"
31 #include "chrome/browser/ui/browser_dialogs.h" 30 #include "chrome/browser/ui/browser_dialogs.h"
32 #include "chrome/common/chrome_constants.h" 31 #include "chrome/common/chrome_constants.h"
33 #include "chrome/common/pref_names.h" 32 #include "chrome/common/pref_names.h"
34 #include "chrome/common/render_messages.h" 33 #include "chrome/common/render_messages.h"
35 #include "content/browser/child_process_security_policy.h" 34 #include "content/browser/child_process_security_policy.h"
36 #include "content/browser/content_browser_client.h" 35 #include "content/browser/content_browser_client.h"
37 #include "content/browser/host_zoom_map.h" 36 #include "content/browser/host_zoom_map.h"
38 #include "content/browser/in_process_webkit/session_storage_namespace.h" 37 #include "content/browser/in_process_webkit/session_storage_namespace.h"
39 #include "content/browser/renderer_host/render_process_host.h" 38 #include "content/browser/renderer_host/render_process_host.h"
40 #include "content/browser/renderer_host/render_view_host.h" 39 #include "content/browser/renderer_host/render_view_host.h"
41 #include "content/browser/renderer_host/render_widget_host_view.h" 40 #include "content/browser/renderer_host/render_widget_host_view.h"
42 #include "content/browser/renderer_host/resource_request_details.h" 41 #include "content/browser/renderer_host/resource_request_details.h"
43 #include "content/browser/site_instance.h" 42 #include "content/browser/site_instance.h"
44 #include "content/browser/tab_contents/interstitial_page.h" 43 #include "content/browser/tab_contents/interstitial_page.h"
45 #include "content/browser/tab_contents/navigation_entry.h" 44 #include "content/browser/tab_contents/navigation_entry.h"
46 #include "content/browser/tab_contents/provisional_load_details.h" 45 #include "content/browser/tab_contents/provisional_load_details.h"
47 #include "content/browser/tab_contents/tab_contents_delegate.h" 46 #include "content/browser/tab_contents/tab_contents_delegate.h"
48 #include "content/browser/tab_contents/tab_contents_observer.h" 47 #include "content/browser/tab_contents/tab_contents_observer.h"
49 #include "content/browser/tab_contents/tab_contents_view.h" 48 #include "content/browser/tab_contents/tab_contents_view.h"
49 #include "content/browser/tab_contents/title_updated_details.h"
50 #include "content/browser/user_metrics.h" 50 #include "content/browser/user_metrics.h"
51 #include "content/browser/webui/web_ui_factory.h" 51 #include "content/browser/webui/web_ui_factory.h"
52 #include "content/common/bindings_policy.h" 52 #include "content/common/bindings_policy.h"
53 #include "content/common/content_client.h" 53 #include "content/common/content_client.h"
54 #include "content/common/content_restriction.h" 54 #include "content/common/content_restriction.h"
55 #include "content/common/navigation_types.h" 55 #include "content/common/navigation_types.h"
56 #include "content/common/notification_service.h" 56 #include "content/common/notification_service.h"
57 #include "content/common/url_constants.h" 57 #include "content/common/url_constants.h"
58 #include "content/common/view_messages.h" 58 #include "content/common/view_messages.h"
59 #include "net/base/net_util.h" 59 #include "net/base/net_util.h"
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 ALLOW_THIS_IN_INITIALIZER_LIST(render_manager_(this, this)), 209 ALLOW_THIS_IN_INITIALIZER_LIST(render_manager_(this, this)),
210 bookmark_drag_(NULL), 210 bookmark_drag_(NULL),
211 is_loading_(false), 211 is_loading_(false),
212 crashed_status_(base::TERMINATION_STATUS_STILL_RUNNING), 212 crashed_status_(base::TERMINATION_STATUS_STILL_RUNNING),
213 crashed_error_code_(0), 213 crashed_error_code_(0),
214 waiting_for_response_(false), 214 waiting_for_response_(false),
215 max_page_id_(-1), 215 max_page_id_(-1),
216 load_state_(net::LOAD_STATE_IDLE), 216 load_state_(net::LOAD_STATE_IDLE),
217 upload_size_(0), 217 upload_size_(0),
218 upload_position_(0), 218 upload_position_(0),
219 received_page_title_(false),
220 displayed_insecure_content_(false), 219 displayed_insecure_content_(false),
221 capturing_contents_(false), 220 capturing_contents_(false),
222 is_being_destroyed_(false), 221 is_being_destroyed_(false),
223 notify_disconnection_(false), 222 notify_disconnection_(false),
224 #if defined(OS_WIN) 223 #if defined(OS_WIN)
225 message_box_active_(CreateEvent(NULL, TRUE, FALSE, NULL)), 224 message_box_active_(CreateEvent(NULL, TRUE, FALSE, NULL)),
226 #endif 225 #endif
227 suppress_javascript_messages_(false), 226 suppress_javascript_messages_(false),
228 is_showing_before_unload_dialog_(false), 227 is_showing_before_unload_dialog_(false),
229 opener_web_ui_type_(WebUI::kNoWebUI), 228 opener_web_ui_type_(WebUI::kNoWebUI),
(...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 #endif 808 #endif
810 } 809 }
811 810
812 void TabContents::SystemDragEnded() { 811 void TabContents::SystemDragEnded() {
813 if (render_view_host()) 812 if (render_view_host())
814 render_view_host()->DragSourceSystemDragEnded(); 813 render_view_host()->DragSourceSystemDragEnded();
815 if (delegate()) 814 if (delegate())
816 delegate()->DragEnded(); 815 delegate()->DragEnded();
817 } 816 }
818 817
819 void TabContents::UpdateHistoryForNavigation(
820 scoped_refptr<history::HistoryAddPageArgs> add_page_args) {
821 if (profile()->IsOffTheRecord())
822 return;
823
824 // Add to history service.
825 HistoryService* hs = profile()->GetHistoryService(Profile::IMPLICIT_ACCESS);
826 if (hs)
827 hs->AddPage(*add_page_args);
828 }
829
830 void TabContents::UpdateHistoryPageTitle(const NavigationEntry& entry) {
831 if (profile()->IsOffTheRecord())
832 return;
833
834 HistoryService* hs = profile()->GetHistoryService(Profile::IMPLICIT_ACCESS);
835 if (hs)
836 hs->SetPageTitle(entry.virtual_url(), entry.title());
837 }
838
839 double TabContents::GetZoomLevel() const { 818 double TabContents::GetZoomLevel() const {
840 HostZoomMap* zoom_map = profile()->GetHostZoomMap(); 819 HostZoomMap* zoom_map = profile()->GetHostZoomMap();
841 if (!zoom_map) 820 if (!zoom_map)
842 return 0; 821 return 0;
843 822
844 double zoom_level; 823 double zoom_level;
845 if (temporary_zoom_settings_) { 824 if (temporary_zoom_settings_) {
846 zoom_level = zoom_map->GetTemporaryZoomLevel( 825 zoom_level = zoom_map->GetTemporaryZoomLevel(
847 GetRenderProcessHost()->id(), render_view_host()->routing_id()); 826 GetRenderProcessHost()->id(), render_view_host()->routing_id());
848 } else { 827 } else {
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
1143 if (details.is_user_initiated_main_frame_load()) { 1122 if (details.is_user_initiated_main_frame_load()) {
1144 // Clear the status bubble. This is a workaround for a bug where WebKit 1123 // Clear the status bubble. This is a workaround for a bug where WebKit
1145 // doesn't let us know that the cursor left an element during a 1124 // doesn't let us know that the cursor left an element during a
1146 // transition (this is also why the mouse cursor remains as a hand after 1125 // transition (this is also why the mouse cursor remains as a hand after
1147 // clicking on a link); see bugs 1184641 and 980803. We don't want to 1126 // clicking on a link); see bugs 1184641 and 980803. We don't want to
1148 // clear the bubble when a user navigates to a named anchor in the same 1127 // clear the bubble when a user navigates to a named anchor in the same
1149 // page. 1128 // page.
1150 UpdateTargetURL(details.entry->page_id(), GURL()); 1129 UpdateTargetURL(details.entry->page_id(), GURL());
1151 } 1130 }
1152 1131
1153 // Allow the new page to set the title again.
1154 received_page_title_ = false;
1155
1156 if (!details.is_in_page) { 1132 if (!details.is_in_page) {
1157 // Once the main frame is navigated, we're no longer considered to have 1133 // Once the main frame is navigated, we're no longer considered to have
1158 // displayed insecure content. 1134 // displayed insecure content.
1159 displayed_insecure_content_ = false; 1135 displayed_insecure_content_ = false;
1160 } 1136 }
1161 1137
1162 // Close constrained windows if necessary. 1138 // Close constrained windows if necessary.
1163 if (!net::RegistryControlledDomainService::SameDomainOrHost( 1139 if (!net::RegistryControlledDomainService::SameDomainOrHost(
1164 details.previous_url, details.entry->url())) 1140 details.previous_url, details.entry->url()))
1165 CloseConstrainedWindows(); 1141 CloseConstrainedWindows();
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1231 // Also tell the renderer to update its internal representation. We 1207 // Also tell the renderer to update its internal representation. We
1232 // need to reserve enough IDs to make all restored page IDs less than 1208 // need to reserve enough IDs to make all restored page IDs less than
1233 // the max. 1209 // the max.
1234 if (curr_max_page_id < 0) 1210 if (curr_max_page_id < 0)
1235 curr_max_page_id = 0; 1211 curr_max_page_id = 0;
1236 rvh->ReservePageIDRange(max_restored_page_id - curr_max_page_id); 1212 rvh->ReservePageIDRange(max_restored_page_id - curr_max_page_id);
1237 } 1213 }
1238 } 1214 }
1239 } 1215 }
1240 1216
1241 scoped_refptr<history::HistoryAddPageArgs>
1242 TabContents::CreateHistoryAddPageArgs(
1243 const GURL& virtual_url,
1244 const NavigationController::LoadCommittedDetails& details,
1245 const ViewHostMsg_FrameNavigate_Params& params) {
1246 scoped_refptr<history::HistoryAddPageArgs> add_page_args(
1247 new history::HistoryAddPageArgs(
1248 params.url, base::Time::Now(), this, params.page_id, params.referrer,
1249 params.redirects, params.transition, history::SOURCE_BROWSED,
1250 details.did_replace_entry));
1251 if (PageTransition::IsMainFrame(params.transition) &&
1252 virtual_url != params.url) {
1253 // Hack on the "virtual" URL so that it will appear in history. For some
1254 // types of URLs, we will display a magic URL that is different from where
1255 // the page is actually navigated. We want the user to see in history what
1256 // they saw in the URL bar, so we add the virtual URL as a redirect. This
1257 // only applies to the main frame, as the virtual URL doesn't apply to
1258 // sub-frames.
1259 add_page_args->url = virtual_url;
1260 if (!add_page_args->redirects.empty())
1261 add_page_args->redirects.back() = virtual_url;
1262 }
1263 return add_page_args;
1264 }
1265
1266 bool TabContents::UpdateTitleForEntry(NavigationEntry* entry, 1217 bool TabContents::UpdateTitleForEntry(NavigationEntry* entry,
1267 const std::wstring& title) { 1218 const std::wstring& title) {
1268 // For file URLs without a title, use the pathname instead. In the case of a 1219 // For file URLs without a title, use the pathname instead. In the case of a
1269 // synthesized title, we don't want the update to count toward the "one set 1220 // synthesized title, we don't want the update to count toward the "one set
1270 // per page of the title to history." 1221 // per page of the title to history."
1271 string16 final_title; 1222 string16 final_title;
1272 bool explicit_set; 1223 bool explicit_set;
1273 if (entry->url().SchemeIsFile() && title.empty()) { 1224 if (entry->url().SchemeIsFile() && title.empty()) {
1274 final_title = UTF8ToUTF16(entry->url().ExtractFileName()); 1225 final_title = UTF8ToUTF16(entry->url().ExtractFileName());
1275 explicit_set = false; // Don't count synthetic titles toward the set limit. 1226 explicit_set = false; // Don't count synthetic titles toward the set limit.
1276 } else { 1227 } else {
1277 TrimWhitespace(WideToUTF16Hack(title), TRIM_ALL, &final_title); 1228 TrimWhitespace(WideToUTF16Hack(title), TRIM_ALL, &final_title);
1278 explicit_set = true; 1229 explicit_set = true;
1279 } 1230 }
1280 1231
1281 if (final_title == entry->title()) 1232 if (final_title == entry->title())
1282 return false; // Nothing changed, don't bother. 1233 return false; // Nothing changed, don't bother.
1283 1234
1284 entry->set_title(final_title); 1235 entry->set_title(final_title);
1285 1236
1286 if (!received_page_title_) {
1287 UpdateHistoryPageTitle(*entry);
1288 received_page_title_ = explicit_set;
1289 }
1290
1291 // Lastly, set the title for the view. 1237 // Lastly, set the title for the view.
1292 view_->SetPageTitle(UTF16ToWideHack(final_title)); 1238 view_->SetPageTitle(UTF16ToWideHack(final_title));
1293 1239
1240 TitleUpdatedDetails details(entry, explicit_set);
1241
1294 NotificationService::current()->Notify( 1242 NotificationService::current()->Notify(
1295 NotificationType::TAB_CONTENTS_TITLE_UPDATED, 1243 NotificationType::TAB_CONTENTS_TITLE_UPDATED,
1296 Source<TabContents>(this), 1244 Source<TabContents>(this),
1297 NotificationService::NoDetails()); 1245 Details<TitleUpdatedDetails>(&details));
1298 1246
1299 return true; 1247 return true;
1300 } 1248 }
1301 1249
1302 void TabContents::NotifySwapped() { 1250 void TabContents::NotifySwapped() {
1303 // After sending out a swap notification, we need to send a disconnect 1251 // After sending out a swap notification, we need to send a disconnect
1304 // notification so that clients that pick up a pointer to |this| can NULL the 1252 // notification so that clients that pick up a pointer to |this| can NULL the
1305 // pointer. See Bug 1230284. 1253 // pointer. See Bug 1230284.
1306 notify_disconnection_ = true; 1254 notify_disconnection_ = true;
1307 NotificationService::current()->Notify( 1255 NotificationService::current()->Notify(
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
1498 (controller_.GetActiveEntry()->transition_type() & 1446 (controller_.GetActiveEntry()->transition_type() &
1499 PageTransition::FORWARD_BACK)) { 1447 PageTransition::FORWARD_BACK)) {
1500 transition_type = params.transition | PageTransition::FORWARD_BACK; 1448 transition_type = params.transition | PageTransition::FORWARD_BACK;
1501 } 1449 }
1502 // Notify observers about the commit of the provisional load. 1450 // Notify observers about the commit of the provisional load.
1503 FOR_EACH_OBSERVER(TabContentsObserver, observers_, 1451 FOR_EACH_OBSERVER(TabContentsObserver, observers_,
1504 DidCommitProvisionalLoadForFrame(params.frame_id, 1452 DidCommitProvisionalLoadForFrame(params.frame_id,
1505 is_main_frame, params.url, transition_type)); 1453 is_main_frame, params.url, transition_type));
1506 } 1454 }
1507 1455
1508 // Update history. Note that this needs to happen after the entry is complete,
1509 // which WillNavigate[Main,Sub]Frame will do before this function is called.
1510 if (params.should_update_history) {
1511 // Most of the time, the displayURL matches the loaded URL, but for about:
1512 // URLs, we use a data: URL as the real value. We actually want to save the
1513 // about: URL to the history db and keep the data: URL hidden. This is what
1514 // the TabContents' URL getter does.
1515 scoped_refptr<history::HistoryAddPageArgs> add_page_args(
1516 CreateHistoryAddPageArgs(GetURL(), details, params));
1517 if (!delegate() ||
1518 delegate()->ShouldAddNavigationToHistory(*add_page_args,
1519 details.type)) {
1520 UpdateHistoryForNavigation(add_page_args);
1521 }
1522 }
1523
1524 if (!did_navigate) 1456 if (!did_navigate)
1525 return; // No navigation happened. 1457 return; // No navigation happened.
1526 1458
1527 // DO NOT ADD MORE STUFF TO THIS FUNCTION! Your component should either listen 1459 // DO NOT ADD MORE STUFF TO THIS FUNCTION! Your component should either listen
1528 // for the appropriate notification (best) or you can add it to 1460 // for the appropriate notification (best) or you can add it to
1529 // DidNavigateMainFramePostCommit / DidNavigateAnyFramePostCommit (only if 1461 // DidNavigateMainFramePostCommit / DidNavigateAnyFramePostCommit (only if
1530 // necessary, please). 1462 // necessary, please).
1531 1463
1532 // Run post-commit tasks. 1464 // Run post-commit tasks.
1533 if (details.is_main_frame) 1465 if (details.is_main_frame)
(...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after
2053 1985
2054 void TabContents::CreateViewAndSetSizeForRVH(RenderViewHost* rvh) { 1986 void TabContents::CreateViewAndSetSizeForRVH(RenderViewHost* rvh) {
2055 RenderWidgetHostView* rwh_view = view()->CreateViewForWidget(rvh); 1987 RenderWidgetHostView* rwh_view = view()->CreateViewForWidget(rvh);
2056 rwh_view->SetSize(view()->GetContainerSize()); 1988 rwh_view->SetSize(view()->GetContainerSize());
2057 } 1989 }
2058 1990
2059 void TabContents::OnOnlineStateChanged(bool online) { 1991 void TabContents::OnOnlineStateChanged(bool online) {
2060 render_view_host()->Send(new ViewMsg_NetworkStateChanged( 1992 render_view_host()->Send(new ViewMsg_NetworkStateChanged(
2061 render_view_host()->routing_id(), online)); 1993 render_view_host()->routing_id(), online));
2062 } 1994 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698