OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/renderer/render_frame_impl.h" | 5 #include "content/renderer/render_frame_impl.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
11 #include "base/debug/alias.h" | 11 #include "base/debug/alias.h" |
12 #include "base/debug/dump_without_crashing.h" | 12 #include "base/debug/dump_without_crashing.h" |
13 #include "base/i18n/char_iterator.h" | 13 #include "base/i18n/char_iterator.h" |
14 #include "base/metrics/histogram.h" | |
14 #include "base/strings/utf_string_conversions.h" | 15 #include "base/strings/utf_string_conversions.h" |
15 #include "base/time/time.h" | 16 #include "base/time/time.h" |
16 #include "content/child/appcache/appcache_dispatcher.h" | 17 #include "content/child/appcache/appcache_dispatcher.h" |
17 #include "content/child/plugin_messages.h" | 18 #include "content/child/plugin_messages.h" |
18 #include "content/child/quota_dispatcher.h" | 19 #include "content/child/quota_dispatcher.h" |
19 #include "content/child/request_extra_data.h" | 20 #include "content/child/request_extra_data.h" |
20 #include "content/child/service_worker/web_service_worker_provider_impl.h" | 21 #include "content/child/service_worker/web_service_worker_provider_impl.h" |
21 #include "content/common/frame_messages.h" | 22 #include "content/common/frame_messages.h" |
22 #include "content/common/socket_stream_handle_data.h" | 23 #include "content/common/socket_stream_handle_data.h" |
23 #include "content/common/swapped_out_messages.h" | 24 #include "content/common/swapped_out_messages.h" |
24 #include "content/common/view_messages.h" | 25 #include "content/common/view_messages.h" |
25 #include "content/public/common/content_constants.h" | 26 #include "content/public/common/content_constants.h" |
26 #include "content/public/common/content_switches.h" | 27 #include "content/public/common/content_switches.h" |
27 #include "content/public/common/context_menu_params.h" | 28 #include "content/public/common/context_menu_params.h" |
28 #include "content/public/common/url_constants.h" | 29 #include "content/public/common/url_constants.h" |
29 #include "content/public/common/url_utils.h" | 30 #include "content/public/common/url_utils.h" |
30 #include "content/public/renderer/content_renderer_client.h" | 31 #include "content/public/renderer/content_renderer_client.h" |
31 #include "content/public/renderer/context_menu_client.h" | 32 #include "content/public/renderer/context_menu_client.h" |
32 #include "content/public/renderer/document_state.h" | 33 #include "content/public/renderer/document_state.h" |
34 #include "content/public/renderer/history_item_serialization.h" | |
33 #include "content/public/renderer/navigation_state.h" | 35 #include "content/public/renderer/navigation_state.h" |
34 #include "content/public/renderer/render_frame_observer.h" | 36 #include "content/public/renderer/render_frame_observer.h" |
35 #include "content/renderer/accessibility/renderer_accessibility.h" | 37 #include "content/renderer/accessibility/renderer_accessibility.h" |
36 #include "content/renderer/browser_plugin/browser_plugin.h" | 38 #include "content/renderer/browser_plugin/browser_plugin.h" |
37 #include "content/renderer/browser_plugin/browser_plugin_manager.h" | 39 #include "content/renderer/browser_plugin/browser_plugin_manager.h" |
38 #include "content/renderer/child_frame_compositing_helper.h" | 40 #include "content/renderer/child_frame_compositing_helper.h" |
39 #include "content/renderer/context_menu_params_builder.h" | 41 #include "content/renderer/context_menu_params_builder.h" |
40 #include "content/renderer/internal_document_state_data.h" | 42 #include "content/renderer/internal_document_state_data.h" |
41 #include "content/renderer/npapi/plugin_channel_host.h" | 43 #include "content/renderer/npapi/plugin_channel_host.h" |
42 #include "content/renderer/render_thread_impl.h" | 44 #include "content/renderer/render_thread_impl.h" |
43 #include "content/renderer/render_view_impl.h" | 45 #include "content/renderer/render_view_impl.h" |
44 #include "content/renderer/render_widget_fullscreen_pepper.h" | 46 #include "content/renderer/render_widget_fullscreen_pepper.h" |
45 #include "content/renderer/renderer_webapplicationcachehost_impl.h" | 47 #include "content/renderer/renderer_webapplicationcachehost_impl.h" |
46 #include "content/renderer/shared_worker_repository.h" | 48 #include "content/renderer/shared_worker_repository.h" |
47 #include "content/renderer/websharedworker_proxy.h" | 49 #include "content/renderer/websharedworker_proxy.h" |
48 #include "net/base/net_errors.h" | 50 #include "net/base/net_errors.h" |
49 #include "net/http/http_util.h" | 51 #include "net/http/http_util.h" |
50 #include "third_party/WebKit/public/platform/WebStorageQuotaCallbacks.h" | 52 #include "third_party/WebKit/public/platform/WebStorageQuotaCallbacks.h" |
51 #include "third_party/WebKit/public/platform/WebString.h" | 53 #include "third_party/WebKit/public/platform/WebString.h" |
52 #include "third_party/WebKit/public/platform/WebURL.h" | 54 #include "third_party/WebKit/public/platform/WebURL.h" |
53 #include "third_party/WebKit/public/platform/WebURLError.h" | 55 #include "third_party/WebKit/public/platform/WebURLError.h" |
54 #include "third_party/WebKit/public/platform/WebURLResponse.h" | 56 #include "third_party/WebKit/public/platform/WebURLResponse.h" |
55 #include "third_party/WebKit/public/platform/WebVector.h" | 57 #include "third_party/WebKit/public/platform/WebVector.h" |
56 #include "third_party/WebKit/public/web/WebDocument.h" | 58 #include "third_party/WebKit/public/web/WebDocument.h" |
57 #include "third_party/WebKit/public/web/WebFrame.h" | 59 #include "third_party/WebKit/public/web/WebFrame.h" |
60 #include "third_party/WebKit/public/web/WebGlyphCache.h" | |
58 #include "third_party/WebKit/public/web/WebNavigationPolicy.h" | 61 #include "third_party/WebKit/public/web/WebNavigationPolicy.h" |
59 #include "third_party/WebKit/public/web/WebPlugin.h" | 62 #include "third_party/WebKit/public/web/WebPlugin.h" |
60 #include "third_party/WebKit/public/web/WebPluginParams.h" | 63 #include "third_party/WebKit/public/web/WebPluginParams.h" |
61 #include "third_party/WebKit/public/web/WebSearchableFormData.h" | 64 #include "third_party/WebKit/public/web/WebSearchableFormData.h" |
62 #include "third_party/WebKit/public/web/WebSecurityOrigin.h" | 65 #include "third_party/WebKit/public/web/WebSecurityOrigin.h" |
63 #include "third_party/WebKit/public/web/WebSecurityPolicy.h" | 66 #include "third_party/WebKit/public/web/WebSecurityPolicy.h" |
64 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" | 67 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" |
65 #include "third_party/WebKit/public/web/WebView.h" | 68 #include "third_party/WebKit/public/web/WebView.h" |
66 #include "webkit/child/weburlresponse_extradata_impl.h" | 69 #include "webkit/child/weburlresponse_extradata_impl.h" |
67 | 70 |
68 #if defined(ENABLE_PLUGINS) | 71 #if defined(ENABLE_PLUGINS) |
69 #include "content/renderer/npapi/webplugin_impl.h" | 72 #include "content/renderer/npapi/webplugin_impl.h" |
70 #include "content/renderer/pepper/pepper_browser_connection.h" | 73 #include "content/renderer/pepper/pepper_browser_connection.h" |
71 #include "content/renderer/pepper/pepper_plugin_instance_impl.h" | 74 #include "content/renderer/pepper/pepper_plugin_instance_impl.h" |
72 #include "content/renderer/pepper/pepper_webplugin_impl.h" | 75 #include "content/renderer/pepper/pepper_webplugin_impl.h" |
73 #include "content/renderer/pepper/plugin_module.h" | 76 #include "content/renderer/pepper/plugin_module.h" |
74 #endif | 77 #endif |
75 | 78 |
76 #if defined(ENABLE_WEBRTC) | 79 #if defined(ENABLE_WEBRTC) |
77 #include "content/renderer/media/rtc_peer_connection_handler.h" | 80 #include "content/renderer/media/rtc_peer_connection_handler.h" |
78 #endif | 81 #endif |
79 | 82 |
80 using blink::WebContextMenuData; | 83 using blink::WebContextMenuData; |
81 using blink::WebDataSource; | 84 using blink::WebDataSource; |
82 using blink::WebDocument; | 85 using blink::WebDocument; |
83 using blink::WebFrame; | 86 using blink::WebFrame; |
87 using blink::WebHistoryItem; | |
84 using blink::WebNavigationPolicy; | 88 using blink::WebNavigationPolicy; |
85 using blink::WebPluginParams; | 89 using blink::WebPluginParams; |
86 using blink::WebReferrerPolicy; | 90 using blink::WebReferrerPolicy; |
87 using blink::WebSearchableFormData; | 91 using blink::WebSearchableFormData; |
88 using blink::WebSecurityOrigin; | 92 using blink::WebSecurityOrigin; |
89 using blink::WebSecurityPolicy; | 93 using blink::WebSecurityPolicy; |
90 using blink::WebServiceWorkerProvider; | 94 using blink::WebServiceWorkerProvider; |
91 using blink::WebStorageQuotaCallbacks; | 95 using blink::WebStorageQuotaCallbacks; |
92 using blink::WebString; | 96 using blink::WebString; |
93 using blink::WebURL; | 97 using blink::WebURL; |
94 using blink::WebURLError; | 98 using blink::WebURLError; |
95 using blink::WebURLRequest; | 99 using blink::WebURLRequest; |
96 using blink::WebURLResponse; | 100 using blink::WebURLResponse; |
97 using blink::WebUserGestureIndicator; | 101 using blink::WebUserGestureIndicator; |
98 using blink::WebVector; | 102 using blink::WebVector; |
99 using blink::WebView; | 103 using blink::WebView; |
100 using base::Time; | 104 using base::Time; |
101 using base::TimeDelta; | 105 using base::TimeDelta; |
102 using webkit_glue::WebURLResponseExtraDataImpl; | 106 using webkit_glue::WebURLResponseExtraDataImpl; |
103 | 107 |
104 namespace content { | 108 namespace content { |
105 | 109 |
106 namespace { | 110 namespace { |
107 | 111 |
108 typedef std::map<blink::WebFrame*, RenderFrameImpl*> FrameMap; | 112 typedef std::map<blink::WebFrame*, RenderFrameImpl*> FrameMap; |
109 base::LazyInstance<FrameMap> g_frame_map = LAZY_INSTANCE_INITIALIZER; | 113 base::LazyInstance<FrameMap> g_frame_map = LAZY_INSTANCE_INITIALIZER; |
110 | 114 |
115 int64 ExtractPostId(const WebHistoryItem& item) { | |
116 if (item.isNull()) | |
117 return -1; | |
118 | |
119 if (item.httpBody().isNull()) | |
120 return -1; | |
121 | |
122 return item.httpBody().identifier(); | |
123 } | |
124 | |
125 WebURLResponseExtraDataImpl* GetExtraDataFromResponse( | |
126 const WebURLResponse& response) { | |
127 return static_cast<WebURLResponseExtraDataImpl*>( | |
128 response.extraData()); | |
129 } | |
130 | |
131 void GetRedirectChain(WebDataSource* ds, std::vector<GURL>* result) { | |
132 // Replace any occurrences of swappedout:// with about:blank. | |
133 const WebURL& blank_url = GURL(kAboutBlankURL); | |
134 WebVector<WebURL> urls; | |
135 ds->redirectChain(urls); | |
136 result->reserve(urls.size()); | |
137 for (size_t i = 0; i < urls.size(); ++i) { | |
138 if (urls[i] != GURL(kSwappedOutURL)) | |
139 result->push_back(urls[i]); | |
140 else | |
141 result->push_back(blank_url); | |
142 } | |
143 } | |
144 | |
111 } // namespace | 145 } // namespace |
112 | 146 |
113 static RenderFrameImpl* (*g_create_render_frame_impl)(RenderViewImpl*, int32) = | 147 static RenderFrameImpl* (*g_create_render_frame_impl)(RenderViewImpl*, int32) = |
114 NULL; | 148 NULL; |
115 | 149 |
116 // static | 150 // static |
117 RenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view, | 151 RenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view, |
118 int32 routing_id) { | 152 int32 routing_id) { |
119 DCHECK(routing_id != MSG_ROUTING_NONE); | 153 DCHECK(routing_id != MSG_ROUTING_NONE); |
120 | 154 |
(...skipping 827 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
948 if (frame->parent()) | 982 if (frame->parent()) |
949 return; | 983 return; |
950 // Received a redirect on the main frame. | 984 // Received a redirect on the main frame. |
951 WebDataSource* data_source = frame->provisionalDataSource(); | 985 WebDataSource* data_source = frame->provisionalDataSource(); |
952 if (!data_source) { | 986 if (!data_source) { |
953 // Should only be invoked when we have a data source. | 987 // Should only be invoked when we have a data source. |
954 NOTREACHED(); | 988 NOTREACHED(); |
955 return; | 989 return; |
956 } | 990 } |
957 std::vector<GURL> redirects; | 991 std::vector<GURL> redirects; |
958 RenderViewImpl::GetRedirectChain(data_source, &redirects); | 992 GetRedirectChain(data_source, &redirects); |
959 if (redirects.size() >= 2) { | 993 if (redirects.size() >= 2) { |
960 Send(new FrameHostMsg_DidRedirectProvisionalLoad( | 994 Send(new FrameHostMsg_DidRedirectProvisionalLoad( |
961 routing_id_, | 995 routing_id_, |
962 render_view_->page_id_, | 996 render_view_->page_id_, |
963 redirects[redirects.size() - 2], | 997 redirects[redirects.size() - 2], |
964 redirects.back())); | 998 redirects.back())); |
965 } | 999 } |
966 } | 1000 } |
967 | 1001 |
968 void RenderFrameImpl::didFailProvisionalLoad( | 1002 void RenderFrameImpl::didFailProvisionalLoad( |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1061 replace; | 1095 replace; |
1062 } | 1096 } |
1063 | 1097 |
1064 // Load an error page. | 1098 // Load an error page. |
1065 render_view_->LoadNavigationErrorPage( | 1099 render_view_->LoadNavigationErrorPage( |
1066 frame, failed_request, error, replace); | 1100 frame, failed_request, error, replace); |
1067 } | 1101 } |
1068 | 1102 |
1069 void RenderFrameImpl::didCommitProvisionalLoad(blink::WebFrame* frame, | 1103 void RenderFrameImpl::didCommitProvisionalLoad(blink::WebFrame* frame, |
1070 bool is_new_navigation) { | 1104 bool is_new_navigation) { |
1071 // TODO(nasko): Move implementation here. Needed state: | 1105 DocumentState* document_state = |
1072 // * page_id_ | 1106 DocumentState::FromDataSource(frame->dataSource()); |
1073 // * next_page_id_ | 1107 NavigationState* navigation_state = document_state->navigation_state(); |
1074 // * history_list_offset_ | 1108 InternalDocumentStateData* internal_data = |
1075 // * history_list_length_ | 1109 InternalDocumentStateData::FromDocumentState(document_state); |
1076 // * history_page_ids_ | 1110 |
1077 // Needed methods | 1111 if (document_state->commit_load_time().is_null()) |
1078 // * webview | 1112 document_state->set_commit_load_time(Time::Now()); |
1079 // * UpdateSessionHistory | 1113 |
1080 // * GetLoadingUrl | 1114 if (internal_data->must_reset_scroll_and_scale_state()) { |
1115 render_view_->webview()->resetScrollAndScaleState(); | |
1116 internal_data->set_must_reset_scroll_and_scale_state(false); | |
1117 } | |
1118 internal_data->set_use_error_page(false); | |
1119 | |
1120 if (is_new_navigation) { | |
1121 // When we perform a new navigation, we need to update the last committed | |
1122 // session history entry with state for the page we are leaving. | |
1123 render_view_->UpdateSessionHistory(frame); | |
1124 | |
1125 // We bump our Page ID to correspond with the new session history entry. | |
1126 render_view_->page_id_ = render_view_->next_page_id_++; | |
1127 | |
1128 // Don't update history_page_ids_ (etc) for kSwappedOutURL, since | |
1129 // we don't want to forget the entry that was there, and since we will | |
1130 // never come back to kSwappedOutURL. Note that we have to call | |
1131 // UpdateSessionHistory and update page_id_ even in this case, so that | |
1132 // the current entry gets a state update and so that we don't send a | |
1133 // state update to the wrong entry when we swap back in. | |
1134 if (render_view_->GetLoadingUrl(frame) != GURL(kSwappedOutURL)) { | |
1135 // Advance our offset in session history, applying the length limit. | |
1136 // There is now no forward history. | |
1137 render_view_->history_list_offset_++; | |
1138 if (render_view_->history_list_offset_ >= kMaxSessionHistoryEntries) | |
1139 render_view_->history_list_offset_ = kMaxSessionHistoryEntries - 1; | |
1140 render_view_->history_list_length_ = | |
1141 render_view_->history_list_offset_ + 1; | |
1142 render_view_->history_page_ids_.resize( | |
1143 render_view_->history_list_length_, -1); | |
1144 render_view_->history_page_ids_[render_view_->history_list_offset_] = | |
1145 render_view_->page_id_; | |
1146 } | |
1147 } else { | |
1148 // Inspect the navigation_state on this frame to see if the navigation | |
1149 // corresponds to a session history navigation... Note: |frame| may or | |
1150 // may not be the toplevel frame, but for the case of capturing session | |
1151 // history, the first committed frame suffices. We keep track of whether | |
1152 // we've seen this commit before so that only capture session history once | |
1153 // per navigation. | |
1154 // | |
1155 // Note that we need to check if the page ID changed. In the case of a | |
1156 // reload, the page ID doesn't change, and UpdateSessionHistory gets the | |
1157 // previous URL and the current page ID, which would be wrong. | |
1158 if (navigation_state->pending_page_id() != -1 && | |
1159 navigation_state->pending_page_id() != render_view_->page_id_ && | |
1160 !navigation_state->request_committed()) { | |
1161 // This is a successful session history navigation! | |
1162 render_view_->UpdateSessionHistory(frame); | |
1163 render_view_->page_id_ = navigation_state->pending_page_id(); | |
1164 | |
1165 render_view_->history_list_offset_ = | |
1166 navigation_state->pending_history_list_offset(); | |
1167 | |
1168 // If the history list is valid, our list of page IDs should be correct. | |
1169 DCHECK(render_view_->history_list_length_ <= 0 || | |
1170 render_view_->history_list_offset_ < 0 || | |
1171 render_view_->history_list_offset_ >= | |
1172 render_view_->history_list_length_ || | |
1173 render_view_->history_page_ids_[render_view_->history_list_offset_] | |
1174 == render_view_->page_id_); | |
1175 } | |
1176 } | |
1177 | |
1081 render_view_->didCommitProvisionalLoad(frame, is_new_navigation); | 1178 render_view_->didCommitProvisionalLoad(frame, is_new_navigation); |
1082 | |
1083 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, | 1179 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, |
1084 DidCommitProvisionalLoad(is_new_navigation)); | 1180 DidCommitProvisionalLoad(is_new_navigation)); |
1181 | |
1182 // Remember that we've already processed this request, so we don't update | |
1183 // the session history again. We do this regardless of whether this is | |
1184 // a session history navigation, because if we attempted a session history | |
1185 // navigation without valid HistoryItem state, WebCore will think it is a | |
1186 // new navigation. | |
1187 navigation_state->set_request_committed(true); | |
1188 | |
1189 UpdateURL(frame); | |
1190 | |
1191 // Check whether we have new encoding name. | |
1192 render_view_->UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); | |
1085 } | 1193 } |
1086 | 1194 |
1087 void RenderFrameImpl::didClearWindowObject(blink::WebFrame* frame, | 1195 void RenderFrameImpl::didClearWindowObject(blink::WebFrame* frame, |
1088 int world_id) { | 1196 int world_id) { |
1089 // TODO(nasko): Move implementation here. Needed state: | 1197 // TODO(nasko): Move implementation here. Needed state: |
1090 // * enabled_bindings_ | 1198 // * enabled_bindings_ |
1091 // * dom_automation_controller_ | 1199 // * dom_automation_controller_ |
1092 // * stats_collection_controller_ | 1200 // * stats_collection_controller_ |
1093 render_view_->didClearWindowObject(frame, world_id); | 1201 render_view_->didClearWindowObject(frame, world_id); |
1094 } | 1202 } |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1144 void RenderFrameImpl::didFinishLoad(blink::WebFrame* frame) { | 1252 void RenderFrameImpl::didFinishLoad(blink::WebFrame* frame) { |
1145 // TODO(nasko): Move implementation here. No state needed, just observers | 1253 // TODO(nasko): Move implementation here. No state needed, just observers |
1146 // notification before sending message to the browser process. | 1254 // notification before sending message to the browser process. |
1147 render_view_->didFinishLoad(frame); | 1255 render_view_->didFinishLoad(frame); |
1148 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, | 1256 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, |
1149 DidFinishLoad()); | 1257 DidFinishLoad()); |
1150 } | 1258 } |
1151 | 1259 |
1152 void RenderFrameImpl::didNavigateWithinPage(blink::WebFrame* frame, | 1260 void RenderFrameImpl::didNavigateWithinPage(blink::WebFrame* frame, |
1153 bool is_new_navigation) { | 1261 bool is_new_navigation) { |
1154 // TODO(nasko): Move implementation here. No state needed, just observers | 1262 // If this was a reference fragment navigation that we initiated, then we |
1155 // notification before sending message to the browser process. | 1263 // could end up having a non-null pending navigation params. We just need to |
1156 render_view_->didNavigateWithinPage(frame, is_new_navigation); | 1264 // update the ExtraData on the datasource so that others who read the |
1265 // ExtraData will get the new NavigationState. Similarly, if we did not | |
1266 // initiate this navigation, then we need to take care to reset any pre- | |
1267 // existing navigation state to a content-initiated navigation state. | |
1268 // DidCreateDataSource conveniently takes care of this for us. | |
1269 didCreateDataSource(frame, frame->dataSource()); | |
1270 | |
1271 DocumentState* document_state = | |
1272 DocumentState::FromDataSource(frame->dataSource()); | |
1273 NavigationState* new_state = document_state->navigation_state(); | |
1274 new_state->set_was_within_same_page(true); | |
1275 | |
1276 didCommitProvisionalLoad(frame, is_new_navigation); | |
1157 } | 1277 } |
1158 | 1278 |
1159 void RenderFrameImpl::didUpdateCurrentHistoryItem(blink::WebFrame* frame) { | 1279 void RenderFrameImpl::didUpdateCurrentHistoryItem(blink::WebFrame* frame) { |
1160 // TODO(nasko): Move implementation here. Needed methods: | 1280 // TODO(nasko): Move implementation here. Needed methods: |
1161 // * StartNavStateSyncTimerIfNecessary | 1281 // * StartNavStateSyncTimerIfNecessary |
1162 render_view_->didUpdateCurrentHistoryItem(frame); | 1282 render_view_->didUpdateCurrentHistoryItem(frame); |
1163 } | 1283 } |
1164 | 1284 |
1165 void RenderFrameImpl::willRequestAfterPreconnect( | 1285 void RenderFrameImpl::willRequestAfterPreconnect( |
1166 blink::WebFrame* frame, | 1286 blink::WebFrame* frame, |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1323 // If we are in view source mode, then just let the user see the source of | 1443 // If we are in view source mode, then just let the user see the source of |
1324 // the server's error page. | 1444 // the server's error page. |
1325 if (frame->isViewSourceModeEnabled()) | 1445 if (frame->isViewSourceModeEnabled()) |
1326 return; | 1446 return; |
1327 | 1447 |
1328 DocumentState* document_state = | 1448 DocumentState* document_state = |
1329 DocumentState::FromDataSource(frame->provisionalDataSource()); | 1449 DocumentState::FromDataSource(frame->provisionalDataSource()); |
1330 int http_status_code = response.httpStatusCode(); | 1450 int http_status_code = response.httpStatusCode(); |
1331 | 1451 |
1332 // Record page load flags. | 1452 // Record page load flags. |
1333 WebURLResponseExtraDataImpl* extra_data = | 1453 WebURLResponseExtraDataImpl* extra_data = GetExtraDataFromResponse(response); |
1334 RenderViewImpl::GetExtraDataFromResponse(response); | |
1335 if (extra_data) { | 1454 if (extra_data) { |
1336 document_state->set_was_fetched_via_spdy( | 1455 document_state->set_was_fetched_via_spdy( |
1337 extra_data->was_fetched_via_spdy()); | 1456 extra_data->was_fetched_via_spdy()); |
1338 document_state->set_was_npn_negotiated( | 1457 document_state->set_was_npn_negotiated( |
1339 extra_data->was_npn_negotiated()); | 1458 extra_data->was_npn_negotiated()); |
1340 document_state->set_npn_negotiated_protocol( | 1459 document_state->set_npn_negotiated_protocol( |
1341 extra_data->npn_negotiated_protocol()); | 1460 extra_data->npn_negotiated_protocol()); |
1342 document_state->set_was_alternate_protocol_available( | 1461 document_state->set_was_alternate_protocol_available( |
1343 extra_data->was_alternate_protocol_available()); | 1462 extra_data->was_alternate_protocol_available()); |
1344 document_state->set_connection_info( | 1463 document_state->set_connection_info( |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1635 | 1754 |
1636 void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) { | 1755 void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) { |
1637 observer->RenderFrameGone(); | 1756 observer->RenderFrameGone(); |
1638 observers_.RemoveObserver(observer); | 1757 observers_.RemoveObserver(observer); |
1639 } | 1758 } |
1640 | 1759 |
1641 void RenderFrameImpl::OnStop() { | 1760 void RenderFrameImpl::OnStop() { |
1642 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnStop()); | 1761 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnStop()); |
1643 } | 1762 } |
1644 | 1763 |
1764 // Tell the embedding application that the URL of the active page has changed | |
Charlie Reis
2014/02/05 23:30:37
nit: End with period.
nasko
2014/02/06 01:55:13
Done.
| |
1765 void RenderFrameImpl::UpdateURL(WebFrame* frame) { | |
1766 WebDataSource* ds = frame->dataSource(); | |
1767 DCHECK(ds); | |
1768 | |
1769 const WebURLRequest& request = ds->request(); | |
1770 const WebURLRequest& original_request = ds->originalRequest(); | |
1771 const WebURLResponse& response = ds->response(); | |
1772 | |
1773 DocumentState* document_state = DocumentState::FromDataSource(ds); | |
1774 NavigationState* navigation_state = document_state->navigation_state(); | |
1775 InternalDocumentStateData* internal_data = | |
1776 InternalDocumentStateData::FromDocumentState(document_state); | |
1777 | |
1778 FrameHostMsg_DidCommitProvisionalLoad_Params params; | |
1779 params.http_status_code = response.httpStatusCode(); | |
1780 params.is_post = false; | |
1781 params.post_id = -1; | |
1782 params.page_id = render_view_->page_id_; | |
1783 params.frame_id = frame->identifier(); | |
1784 params.frame_unique_name = frame->uniqueName(); | |
1785 params.socket_address.set_host(response.remoteIPAddress().utf8()); | |
1786 params.socket_address.set_port(response.remotePort()); | |
1787 WebURLResponseExtraDataImpl* extra_data = GetExtraDataFromResponse(response); | |
1788 if (extra_data) { | |
Charlie Reis
2014/02/05 23:30:37
nit: No braces.
nasko
2014/02/06 01:55:13
Done.
| |
1789 params.was_fetched_via_proxy = extra_data->was_fetched_via_proxy(); | |
1790 } | |
1791 params.was_within_same_page = navigation_state->was_within_same_page(); | |
1792 params.security_info = response.securityInfo(); | |
1793 | |
1794 // Set the URL to be displayed in the browser UI to the user. | |
1795 params.url = render_view_->GetLoadingUrl(frame); | |
1796 DCHECK(!is_swapped_out_ || params.url == GURL(kSwappedOutURL)); | |
1797 | |
1798 if (frame->document().baseURL() != params.url) | |
1799 params.base_url = frame->document().baseURL(); | |
1800 | |
1801 GetRedirectChain(ds, ¶ms.redirects); | |
1802 params.should_update_history = !ds->hasUnreachableURL() && | |
1803 !response.isMultipartPayload() && (response.httpStatusCode() != 404); | |
1804 | |
1805 params.searchable_form_url = internal_data->searchable_form_url(); | |
1806 params.searchable_form_encoding = internal_data->searchable_form_encoding(); | |
1807 | |
1808 params.gesture = render_view_->navigation_gesture_; | |
1809 render_view_->navigation_gesture_ = NavigationGestureUnknown; | |
1810 | |
1811 // Make navigation state a part of the FrameNavigate message so that commited | |
Charlie Reis
2014/02/05 23:30:37
nit: FrameNavigate -> DidCommitProvisionalLoad
nit
nasko
2014/02/06 01:55:13
Done.
| |
1812 // entry had it at all times. | |
1813 WebHistoryItem item = frame->currentHistoryItem(); | |
1814 if (item.isNull()) { | |
1815 item.initialize(); | |
1816 item.setURLString(request.url().spec().utf16()); | |
1817 } | |
1818 params.page_state = HistoryItemToPageState(item); | |
1819 | |
1820 if (!frame->parent()) { | |
1821 // Top-level navigation. | |
1822 | |
1823 // Reset the zoom limits in case a plugin had changed them previously. This | |
1824 // will also call us back which will cause us to send a message to | |
1825 // update WebContentsImpl. | |
1826 render_view_->webview()->zoomLimitsChanged( | |
1827 ZoomFactorToZoomLevel(kMinimumZoomFactor), | |
1828 ZoomFactorToZoomLevel(kMaximumZoomFactor)); | |
1829 | |
1830 // Set zoom level, but don't do it for full-page plugin since they don't use | |
1831 // the same zoom settings. | |
1832 HostZoomLevels::iterator host_zoom = | |
1833 render_view_->host_zoom_levels_.find(GURL(request.url())); | |
1834 if (render_view_->webview()->mainFrame()->document().isPluginDocument()) { | |
1835 // Reset the zoom levels for plugins. | |
1836 render_view_->webview()->setZoomLevel(0); | |
1837 } else { | |
1838 if (host_zoom != render_view_->host_zoom_levels_.end()) | |
1839 render_view_->webview()->setZoomLevel(host_zoom->second); | |
1840 } | |
1841 | |
1842 if (host_zoom != render_view_->host_zoom_levels_.end()) { | |
1843 // This zoom level was merely recorded transiently for this load. We can | |
1844 // erase it now. If at some point we reload this page, the browser will | |
1845 // send us a new, up-to-date zoom level. | |
1846 render_view_->host_zoom_levels_.erase(host_zoom); | |
1847 } | |
1848 | |
1849 // Update contents MIME type for main frame. | |
1850 params.contents_mime_type = ds->response().mimeType().utf8(); | |
1851 | |
1852 params.transition = navigation_state->transition_type(); | |
1853 if (!PageTransitionIsMainFrame(params.transition)) { | |
1854 // If the main frame does a load, it should not be reported as a subframe | |
1855 // navigation. This can occur in the following case: | |
1856 // 1. You're on a site with frames. | |
1857 // 2. You do a subframe navigation. This is stored with transition type | |
1858 // MANUAL_SUBFRAME. | |
1859 // 3. You navigate to some non-frame site, say, google.com. | |
1860 // 4. You navigate back to the page from step 2. Since it was initially | |
1861 // MANUAL_SUBFRAME, it will be that same transition type here. | |
1862 // We don't want that, because any navigation that changes the toplevel | |
1863 // frame should be tracked as a toplevel navigation (this allows us to | |
1864 // update the URL bar, etc). | |
1865 params.transition = PAGE_TRANSITION_LINK; | |
1866 } | |
1867 | |
1868 // If the page contained a client redirect (meta refresh, document.loc...), | |
1869 // set the referrer and transition appropriately. | |
1870 if (ds->isClientRedirect()) { | |
1871 params.referrer = | |
1872 Referrer(params.redirects[0], ds->request().referrerPolicy()); | |
1873 params.transition = static_cast<PageTransition>( | |
1874 params.transition | PAGE_TRANSITION_CLIENT_REDIRECT); | |
1875 } else { | |
1876 params.referrer = RenderViewImpl::GetReferrerFromRequest( | |
1877 frame, ds->request()); | |
1878 } | |
1879 | |
1880 base::string16 method = request.httpMethod(); | |
1881 if (EqualsASCII(method, "POST")) { | |
1882 params.is_post = true; | |
1883 params.post_id = ExtractPostId(item); | |
1884 } | |
1885 | |
1886 // Send the user agent override back. | |
1887 params.is_overriding_user_agent = internal_data->is_overriding_user_agent(); | |
1888 | |
1889 // Track the URL of the original request. We use the first entry of the | |
1890 // redirect chain if it exists because the chain may have started in another | |
1891 // process. | |
1892 if (params.redirects.size() > 0) | |
1893 params.original_request_url = params.redirects.at(0); | |
1894 else | |
1895 params.original_request_url = original_request.url(); | |
1896 | |
1897 params.history_list_was_cleared = | |
1898 navigation_state->history_list_was_cleared(); | |
1899 | |
1900 // Save some histogram data so we can compute the average memory used per | |
1901 // page load of the glyphs. | |
1902 UMA_HISTOGRAM_COUNTS_10000("Memory.GlyphPagesPerLoad", | |
1903 blink::WebGlyphCache::pageCount()); | |
1904 | |
1905 // This message needs to be sent before any of allowScripts(), | |
1906 // allowImages(), allowPlugins() is called for the new page, so that when | |
1907 // these functions send a ViewHostMsg_ContentBlocked message, it arrives | |
1908 // after the FrameHostMsg_DidCommitProvisionalLoad message. | |
1909 Send(new FrameHostMsg_DidCommitProvisionalLoad(routing_id_, params)); | |
1910 } else { | |
1911 // Subframe navigation: the type depends on whether this navigation | |
1912 // generated a new session history entry. When they do generate a session | |
1913 // history entry, it means the user initiated the navigation and we should | |
1914 // mark it as such. This test checks if this is the first time UpdateURL | |
1915 // has been called since WillNavigateToURL was called to initiate the load. | |
1916 if (render_view_->page_id_ > render_view_->last_page_id_sent_to_browser_) | |
1917 params.transition = PAGE_TRANSITION_MANUAL_SUBFRAME; | |
1918 else | |
1919 params.transition = PAGE_TRANSITION_AUTO_SUBFRAME; | |
1920 | |
1921 DCHECK(!navigation_state->history_list_was_cleared()); | |
1922 params.history_list_was_cleared = false; | |
1923 | |
1924 // Don't send this message while the subframe is swapped out. | |
1925 // TODO(creis): This whole method should move to RenderFrame. | |
Charlie Reis
2014/02/05 23:30:37
You can remove this TODO now. :) Also, let's use
nasko
2014/02/06 01:55:13
Done.
| |
1926 RenderFrameImpl* rf = RenderFrameImpl::FromWebFrame(frame); | |
1927 if (!rf || !rf->is_swapped_out()) | |
1928 Send(new FrameHostMsg_DidCommitProvisionalLoad(routing_id_, params)); | |
1929 } | |
1930 | |
1931 render_view_->last_page_id_sent_to_browser_ = | |
1932 std::max(render_view_->last_page_id_sent_to_browser_, | |
1933 render_view_->page_id_); | |
1934 | |
1935 // If we end up reusing this WebRequest (for example, due to a #ref click), | |
1936 // we don't want the transition type to persist. Just clear it. | |
1937 navigation_state->set_transition_type(PAGE_TRANSITION_LINK); | |
1938 } | |
1939 | |
1645 } // namespace content | 1940 } // namespace content |
OLD | NEW |