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/auto_reset.h" | 10 #include "base/auto_reset.h" |
(...skipping 20 matching lines...) Expand all Loading... | |
31 #include "content/child/v8_value_converter_impl.h" | 31 #include "content/child/v8_value_converter_impl.h" |
32 #include "content/child/web_url_loader_impl.h" | 32 #include "content/child/web_url_loader_impl.h" |
33 #include "content/child/web_url_request_util.h" | 33 #include "content/child/web_url_request_util.h" |
34 #include "content/child/webmessageportchannel_impl.h" | 34 #include "content/child/webmessageportchannel_impl.h" |
35 #include "content/child/websocket_bridge.h" | 35 #include "content/child/websocket_bridge.h" |
36 #include "content/child/weburlresponse_extradata_impl.h" | 36 #include "content/child/weburlresponse_extradata_impl.h" |
37 #include "content/common/clipboard_messages.h" | 37 #include "content/common/clipboard_messages.h" |
38 #include "content/common/frame_messages.h" | 38 #include "content/common/frame_messages.h" |
39 #include "content/common/frame_replication_state.h" | 39 #include "content/common/frame_replication_state.h" |
40 #include "content/common/input_messages.h" | 40 #include "content/common/input_messages.h" |
41 #include "content/common/navigation_params.h" | |
41 #include "content/common/service_worker/service_worker_types.h" | 42 #include "content/common/service_worker/service_worker_types.h" |
42 #include "content/common/swapped_out_messages.h" | 43 #include "content/common/swapped_out_messages.h" |
43 #include "content/common/view_messages.h" | 44 #include "content/common/view_messages.h" |
44 #include "content/public/common/bindings_policy.h" | 45 #include "content/public/common/bindings_policy.h" |
45 #include "content/public/common/content_constants.h" | 46 #include "content/public/common/content_constants.h" |
46 #include "content/public/common/content_switches.h" | 47 #include "content/public/common/content_switches.h" |
47 #include "content/public/common/context_menu_params.h" | 48 #include "content/public/common/context_menu_params.h" |
48 #include "content/public/common/page_state.h" | 49 #include "content/public/common/page_state.h" |
49 #include "content/public/common/resource_response.h" | 50 #include "content/public/common/resource_response.h" |
50 #include "content/public/common/url_constants.h" | 51 #include "content/public/common/url_constants.h" |
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
481 #if !defined(OS_ANDROID) | 482 #if !defined(OS_ANDROID) |
482 media::Context3D GetSharedMainThreadContext3D() { | 483 media::Context3D GetSharedMainThreadContext3D() { |
483 cc::ContextProvider* provider = | 484 cc::ContextProvider* provider = |
484 RenderThreadImpl::current()->SharedMainThreadContextProvider().get(); | 485 RenderThreadImpl::current()->SharedMainThreadContextProvider().get(); |
485 if (!provider) | 486 if (!provider) |
486 return media::Context3D(); | 487 return media::Context3D(); |
487 return media::Context3D(provider->ContextGL(), provider->GrContext()); | 488 return media::Context3D(provider->ContextGL(), provider->GrContext()); |
488 } | 489 } |
489 #endif | 490 #endif |
490 | 491 |
492 bool IsReload(FrameMsg_Navigate_Type::Value navigation_type) { | |
493 return navigation_type == FrameMsg_Navigate_Type::RELOAD || | |
494 navigation_type == FrameMsg_Navigate_Type::RELOAD_IGNORING_CACHE || | |
495 navigation_type == FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL; | |
496 } | |
497 | |
491 RenderFrameImpl::CreateRenderFrameImplFunction g_create_render_frame_impl = | 498 RenderFrameImpl::CreateRenderFrameImplFunction g_create_render_frame_impl = |
492 nullptr; | 499 nullptr; |
493 | 500 |
494 #define STATIC_ASSERT_MATCHING_ENUMS(content_name, blink_name) \ | 501 #define STATIC_ASSERT_MATCHING_ENUMS(content_name, blink_name) \ |
495 static_assert( \ | 502 static_assert( \ |
496 static_cast<int>(content_name) == static_cast<int>(blink_name), \ | 503 static_cast<int>(content_name) == static_cast<int>(blink_name), \ |
497 "enum values must match") | 504 "enum values must match") |
498 | 505 |
499 // Check that blink::WebSandboxFlags is kept in sync with | 506 // Check that blink::WebSandboxFlags is kept in sync with |
500 // content::SandboxFlags. | 507 // content::SandboxFlags. |
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1040 } | 1047 } |
1041 | 1048 |
1042 void RenderFrameImpl::OnNavigate( | 1049 void RenderFrameImpl::OnNavigate( |
1043 const CommonNavigationParams& common_params, | 1050 const CommonNavigationParams& common_params, |
1044 const StartNavigationParams& start_params, | 1051 const StartNavigationParams& start_params, |
1045 const CommitNavigationParams& commit_params, | 1052 const CommitNavigationParams& commit_params, |
1046 const HistoryNavigationParams& history_params) { | 1053 const HistoryNavigationParams& history_params) { |
1047 TRACE_EVENT2("navigation", "RenderFrameImpl::OnNavigate", "id", routing_id_, | 1054 TRACE_EVENT2("navigation", "RenderFrameImpl::OnNavigate", "id", routing_id_, |
1048 "url", common_params.url.possibly_invalid_spec()); | 1055 "url", common_params.url.possibly_invalid_spec()); |
1049 | 1056 |
1050 bool is_reload = RenderViewImpl::IsReload(common_params.navigation_type); | 1057 bool is_reload = IsReload(common_params.navigation_type); |
1051 bool is_history_navigation = history_params.page_state.IsValid(); | 1058 bool is_history_navigation = history_params.page_state.IsValid(); |
1052 WebURLRequest::CachePolicy cache_policy = | 1059 WebURLRequest::CachePolicy cache_policy = |
1053 WebURLRequest::UseProtocolCachePolicy; | 1060 WebURLRequest::UseProtocolCachePolicy; |
1054 if (!RenderFrameImpl::PrepareRenderViewForNavigation( | 1061 if (!RenderFrameImpl::PrepareRenderViewForNavigation( |
1055 common_params.url, is_history_navigation, history_params, &is_reload, | 1062 common_params.url, is_history_navigation, history_params, &is_reload, |
1056 &cache_policy)) { | 1063 &cache_policy)) { |
1057 Send(new FrameHostMsg_DidDropNavigation(routing_id_)); | 1064 Send(new FrameHostMsg_DidDropNavigation(routing_id_)); |
1058 return; | 1065 return; |
1059 } | 1066 } |
1060 | 1067 |
1061 GetContentClient()->SetActiveURL(common_params.url); | 1068 GetContentClient()->SetActiveURL(common_params.url); |
1062 | 1069 |
1063 WebFrame* frame = frame_; | 1070 WebFrame* frame = frame_; |
1064 if (!commit_params.frame_to_navigate.empty()) { | 1071 if (!commit_params.frame_to_navigate.empty()) { |
1065 // TODO(nasko): Move this lookup to the browser process. | 1072 // TODO(nasko): Move this lookup to the browser process. |
1066 frame = render_view_->webview()->findFrameByName( | 1073 frame = render_view_->webview()->findFrameByName( |
1067 WebString::fromUTF8(commit_params.frame_to_navigate)); | 1074 WebString::fromUTF8(commit_params.frame_to_navigate)); |
1068 CHECK(frame) << "Invalid frame name passed: " | 1075 CHECK(frame) << "Invalid frame name passed: " |
1069 << commit_params.frame_to_navigate; | 1076 << commit_params.frame_to_navigate; |
1070 } | 1077 } |
1071 | 1078 |
1072 if (is_reload && !render_view_->history_controller()->GetCurrentEntry()) { | 1079 if (is_reload && !render_view_->history_controller()->GetCurrentEntry()) { |
1073 // We cannot reload if we do not have any history state. This happens, for | 1080 // We cannot reload if we do not have any history state. This happens, for |
1074 // example, when recovering from a crash. | 1081 // example, when recovering from a crash. |
1075 is_reload = false; | 1082 is_reload = false; |
1076 cache_policy = WebURLRequest::ReloadIgnoringCacheData; | 1083 cache_policy = WebURLRequest::ReloadIgnoringCacheData; |
1077 } | 1084 } |
1078 | 1085 |
1079 render_view_->pending_navigation_params_.reset(new NavigationParams( | 1086 provisional_navigation_params_.reset(new NavigationParams( |
1080 common_params, start_params, commit_params, history_params)); | 1087 common_params, start_params, commit_params, history_params)); |
1081 | 1088 |
1082 // If we are reloading, then WebKit will use the history state of the current | 1089 // If we are reloading, then WebKit will use the history state of the current |
1083 // page, so we should just ignore any given history state. Otherwise, if we | 1090 // page, so we should just ignore any given history state. Otherwise, if we |
1084 // have history state, then we need to navigate to it, which corresponds to a | 1091 // have history state, then we need to navigate to it, which corresponds to a |
1085 // back/forward navigation event. | 1092 // back/forward navigation event. |
1086 if (is_reload) { | 1093 if (is_reload) { |
1087 bool reload_original_url = | 1094 bool reload_original_url = |
1088 (common_params.navigation_type == | 1095 (common_params.navigation_type == |
1089 FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL); | 1096 FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL); |
1090 bool ignore_cache = (common_params.navigation_type == | 1097 bool ignore_cache = (common_params.navigation_type == |
1091 FrameMsg_Navigate_Type::RELOAD_IGNORING_CACHE); | 1098 FrameMsg_Navigate_Type::RELOAD_IGNORING_CACHE); |
1092 | 1099 |
1093 if (reload_original_url) | 1100 if (reload_original_url) |
1094 frame->reloadWithOverrideURL(common_params.url, true); | 1101 frame->reloadWithOverrideURL(common_params.url, true); |
1095 else | 1102 else |
1096 frame->reload(ignore_cache); | 1103 frame->reload(ignore_cache); |
1097 } else if (is_history_navigation) { | 1104 } else if (is_history_navigation) { |
1098 // We must know the page ID of the page we are navigating back to. | 1105 // We must know the page ID of the page we are navigating back to. |
1099 DCHECK_NE(history_params.page_id, -1); | 1106 DCHECK_NE(history_params.page_id, -1); |
1100 scoped_ptr<HistoryEntry> entry = | 1107 scoped_ptr<HistoryEntry> entry = |
1101 PageStateToHistoryEntry(history_params.page_state); | 1108 PageStateToHistoryEntry(history_params.page_state); |
1102 if (entry) { | 1109 if (entry) { |
1103 // Ensure we didn't save the swapped out URL in UpdateState, since the | 1110 // Ensure we didn't save the swapped out URL in UpdateState, since the |
1104 // browser should never be telling us to navigate to swappedout://. | 1111 // browser should never be telling us to navigate to swappedout://. |
1105 CHECK(entry->root().urlString() != WebString::fromUTF8(kSwappedOutURL)); | 1112 CHECK(entry->root().urlString() != WebString::fromUTF8(kSwappedOutURL)); |
1106 render_view_->history_controller()->GoToEntry(entry.Pass(), cache_policy); | 1113 scoped_ptr<NavigationParams> navigation_params( |
1114 new NavigationParams(*provisional_navigation_params_.get())); | |
1115 render_view_->history_controller()->GoToEntry( | |
1116 entry.Pass(), navigation_params.Pass(), cache_policy); | |
1107 } | 1117 } |
1108 } else if (!common_params.base_url_for_data_url.is_empty()) { | 1118 } else if (!common_params.base_url_for_data_url.is_empty()) { |
1109 LoadDataURL(common_params, frame); | 1119 LoadDataURL(common_params, frame); |
1110 } else { | 1120 } else { |
1111 // Navigate to the given URL. | 1121 // Navigate to the given URL. |
1112 WebURLRequest request = CreateURLRequestForNavigation( | 1122 WebURLRequest request = CreateURLRequestForNavigation( |
1113 common_params, scoped_ptr<StreamOverrideParameters>(), | 1123 common_params, scoped_ptr<StreamOverrideParameters>(), |
1114 frame->isViewSourceModeEnabled()); | 1124 frame->isViewSourceModeEnabled()); |
1115 | 1125 |
1116 if (!start_params.extra_headers.empty()) { | 1126 if (!start_params.extra_headers.empty()) { |
(...skipping 27 matching lines...) Expand all Loading... | |
1144 | 1154 |
1145 // Record this before starting the load, we need a lower bound of this time | 1155 // Record this before starting the load, we need a lower bound of this time |
1146 // to sanitize the navigationStart override set below. | 1156 // to sanitize the navigationStart override set below. |
1147 base::TimeTicks renderer_navigation_start = base::TimeTicks::Now(); | 1157 base::TimeTicks renderer_navigation_start = base::TimeTicks::Now(); |
1148 frame->loadRequest(request); | 1158 frame->loadRequest(request); |
1149 | 1159 |
1150 UpdateFrameNavigationTiming(frame, commit_params.browser_navigation_start, | 1160 UpdateFrameNavigationTiming(frame, commit_params.browser_navigation_start, |
1151 renderer_navigation_start); | 1161 renderer_navigation_start); |
1152 } | 1162 } |
1153 | 1163 |
1154 // In case LoadRequest failed before DidCreateDataSource was called. | 1164 // In case LoadRequest failed before didCreateDataSource was called. |
1155 render_view_->pending_navigation_params_.reset(); | 1165 provisional_navigation_params_.reset(); |
1156 } | 1166 } |
1157 | 1167 |
1158 void RenderFrameImpl::NavigateToSwappedOutURL() { | 1168 void RenderFrameImpl::NavigateToSwappedOutURL() { |
1159 // We use loadRequest instead of loadHTMLString because the former commits | 1169 // We use loadRequest instead of loadHTMLString because the former commits |
1160 // synchronously. Otherwise a new navigation can interrupt the navigation | 1170 // synchronously. Otherwise a new navigation can interrupt the navigation |
1161 // to kSwappedOutURL. If that happens to be to the page we had been | 1171 // to kSwappedOutURL. If that happens to be to the page we had been |
1162 // showing, then WebKit will never send a commit and we'll be left spinning. | 1172 // showing, then WebKit will never send a commit and we'll be left spinning. |
1163 // Set the is_swapped_out_ bit to true, so IPC filtering is in effect and | 1173 // Set the is_swapped_out_ bit to true, so IPC filtering is in effect and |
1164 // the navigation to swappedout:// is not announced to the browser side. | 1174 // the navigation to swappedout:// is not announced to the browser side. |
1165 is_swapped_out_ = true; | 1175 is_swapped_out_ = true; |
1166 GURL swappedOutURL(kSwappedOutURL); | 1176 GURL swappedOutURL(kSwappedOutURL); |
1167 WebURLRequest request(swappedOutURL); | 1177 WebURLRequest request(swappedOutURL); |
1168 frame_->loadRequest(request); | 1178 frame_->loadRequest(request); |
1169 } | 1179 } |
1170 | 1180 |
1171 void RenderFrameImpl::BindServiceRegistry( | 1181 void RenderFrameImpl::BindServiceRegistry( |
1172 mojo::InterfaceRequest<mojo::ServiceProvider> services, | 1182 mojo::InterfaceRequest<mojo::ServiceProvider> services, |
1173 mojo::ServiceProviderPtr exposed_services) { | 1183 mojo::ServiceProviderPtr exposed_services) { |
1174 service_registry_.Bind(services.Pass()); | 1184 service_registry_.Bind(services.Pass()); |
1175 service_registry_.BindRemoteServiceProvider(exposed_services.Pass()); | 1185 service_registry_.BindRemoteServiceProvider(exposed_services.Pass()); |
1176 } | 1186 } |
1177 | 1187 |
1178 ManifestManager* RenderFrameImpl::manifest_manager() { | 1188 ManifestManager* RenderFrameImpl::manifest_manager() { |
1179 return manifest_manager_; | 1189 return manifest_manager_; |
1180 } | 1190 } |
1181 | 1191 |
1192 void RenderFrameImpl::SetProvisionalNavigationParams( | |
1193 scoped_ptr<NavigationParams> navigation_params) { | |
1194 provisional_navigation_params_ = navigation_params.Pass(); | |
1195 } | |
1196 | |
1182 void RenderFrameImpl::OnBeforeUnload() { | 1197 void RenderFrameImpl::OnBeforeUnload() { |
1183 TRACE_EVENT1("navigation", "RenderFrameImpl::OnBeforeUnload", | 1198 TRACE_EVENT1("navigation", "RenderFrameImpl::OnBeforeUnload", |
1184 "id", routing_id_); | 1199 "id", routing_id_); |
1185 // TODO(creis): Right now, this is only called on the main frame. Make the | 1200 // TODO(creis): Right now, this is only called on the main frame. Make the |
1186 // browser process send dispatchBeforeUnloadEvent to every frame that needs | 1201 // browser process send dispatchBeforeUnloadEvent to every frame that needs |
1187 // it. | 1202 // it. |
1188 CHECK(!frame_->parent()); | 1203 CHECK(!frame_->parent()); |
1189 | 1204 |
1190 base::TimeTicks before_unload_start_time = base::TimeTicks::Now(); | 1205 base::TimeTicks before_unload_start_time = base::TimeTicks::Now(); |
1191 bool proceed = frame_->dispatchBeforeUnloadEvent(); | 1206 bool proceed = frame_->dispatchBeforeUnloadEvent(); |
(...skipping 1091 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2283 internal_data->set_searchable_form_encoding( | 2298 internal_data->set_searchable_form_encoding( |
2284 web_searchable_form_data.encoding().utf8()); | 2299 web_searchable_form_data.encoding().utf8()); |
2285 | 2300 |
2286 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WillSubmitForm(form)); | 2301 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, WillSubmitForm(form)); |
2287 } | 2302 } |
2288 | 2303 |
2289 void RenderFrameImpl::didCreateDataSource(blink::WebLocalFrame* frame, | 2304 void RenderFrameImpl::didCreateDataSource(blink::WebLocalFrame* frame, |
2290 blink::WebDataSource* datasource) { | 2305 blink::WebDataSource* datasource) { |
2291 DCHECK(!frame_ || frame_ == frame); | 2306 DCHECK(!frame_ || frame_ == frame); |
2292 | 2307 |
2293 // TODO(nasko): Move implementation here. Needed state: | 2308 bool content_initiated = !provisional_navigation_params_.get(); |
2294 // * pending_navigation_params_ | 2309 |
2295 // * webview | 2310 // Make sure any previous redirect URLs end up in our new data source. |
2296 // Needed methods: | 2311 if (provisional_navigation_params_.get()) { |
2297 // * PopulateDocumentStateFromPending | 2312 for (const auto& i : |
2298 // * CreateNavigationStateFromPending | 2313 provisional_navigation_params_->commit_params.redirects) { |
2299 render_view_->didCreateDataSource(frame, datasource); | 2314 datasource->appendRedirect(i); |
2315 } | |
2316 } | |
2317 | |
2318 DocumentState* document_state = DocumentState::FromDataSource(datasource); | |
2319 if (!document_state) { | |
2320 document_state = new DocumentState; | |
2321 datasource->setExtraData(document_state); | |
2322 if (!content_initiated) | |
2323 PopulateDocumentStateFromPending(document_state); | |
2324 } | |
2325 | |
2326 // Carry over the user agent override flag, if it exists. | |
2327 blink::WebView* webview = render_view_->webview(); | |
2328 if (content_initiated && webview && webview->mainFrame() && | |
2329 webview->mainFrame()->isWebLocalFrame() && | |
2330 webview->mainFrame()->dataSource()) { | |
2331 DocumentState* old_document_state = | |
2332 DocumentState::FromDataSource(webview->mainFrame()->dataSource()); | |
2333 if (old_document_state) { | |
2334 InternalDocumentStateData* internal_data = | |
2335 InternalDocumentStateData::FromDocumentState(document_state); | |
2336 InternalDocumentStateData* old_internal_data = | |
2337 InternalDocumentStateData::FromDocumentState(old_document_state); | |
2338 internal_data->set_is_overriding_user_agent( | |
2339 old_internal_data->is_overriding_user_agent()); | |
2340 } | |
2341 } | |
2342 | |
2343 // The rest of RenderView assumes that a WebDataSource will always have a | |
2344 // non-null NavigationState. | |
2345 if (content_initiated) { | |
2346 document_state->set_navigation_state( | |
2347 NavigationStateImpl::CreateContentInitiated()); | |
2348 } else { | |
2349 document_state->set_navigation_state(CreateNavigationStateFromPending()); | |
2350 provisional_navigation_params_.reset(); | |
2351 } | |
2352 | |
2353 // DocumentState::referred_by_prefetcher_ is true if we are | |
2354 // navigating from a page that used prefetching using a link on that | |
2355 // page. We are early enough in the request process here that we | |
2356 // can still see the DocumentState of the previous page and set | |
2357 // this value appropriately. | |
2358 // TODO(gavinp): catch the important case of navigation in a new | |
2359 // renderer process. | |
2360 if (webview) { | |
2361 if (WebFrame* old_frame = webview->mainFrame()) { | |
2362 const WebURLRequest& original_request = datasource->originalRequest(); | |
2363 const GURL referrer( | |
2364 original_request.httpHeaderField(WebString::fromUTF8("Referer"))); | |
2365 if (!referrer.is_empty() && old_frame->isWebLocalFrame() && | |
2366 DocumentState::FromDataSource(old_frame->dataSource()) | |
2367 ->was_prefetcher()) { | |
2368 for (; old_frame; old_frame = old_frame->traverseNext(false)) { | |
2369 WebDataSource* old_frame_datasource = old_frame->dataSource(); | |
2370 if (old_frame_datasource && | |
2371 referrer == GURL(old_frame_datasource->request().url())) { | |
2372 document_state->set_was_referred_by_prefetcher(true); | |
2373 break; | |
2374 } | |
2375 } | |
2376 } | |
2377 } | |
2378 } | |
2379 | |
2380 if (content_initiated) { | |
2381 const WebURLRequest& request = datasource->request(); | |
2382 switch (request.cachePolicy()) { | |
2383 case WebURLRequest::UseProtocolCachePolicy: // normal load. | |
2384 document_state->set_load_type(DocumentState::LINK_LOAD_NORMAL); | |
2385 break; | |
2386 case WebURLRequest::ReloadIgnoringCacheData: // reload. | |
2387 case WebURLRequest::ReloadBypassingCache: // end-to-end reload. | |
2388 document_state->set_load_type(DocumentState::LINK_LOAD_RELOAD); | |
2389 break; | |
2390 case WebURLRequest::ReturnCacheDataElseLoad: // allow stale data. | |
2391 document_state->set_load_type(DocumentState::LINK_LOAD_CACHE_STALE_OK); | |
2392 break; | |
2393 case WebURLRequest::ReturnCacheDataDontLoad: // Don't re-post. | |
2394 document_state->set_load_type(DocumentState::LINK_LOAD_CACHE_ONLY); | |
2395 break; | |
2396 default: | |
2397 NOTREACHED(); | |
2398 } | |
2399 } | |
2300 | 2400 |
2301 // Create the serviceworker's per-document network observing object if it | 2401 // Create the serviceworker's per-document network observing object if it |
2302 // does not exist (When navigation happens within a page, the provider already | 2402 // does not exist (When navigation happens within a page, the provider already |
2303 // exists). | 2403 // exists). |
2304 if (!ServiceWorkerNetworkProvider::FromDocumentState( | 2404 if (!ServiceWorkerNetworkProvider::FromDocumentState( |
2305 DocumentState::FromDataSource(datasource))) { | 2405 DocumentState::FromDataSource(datasource))) { |
2306 scoped_ptr<ServiceWorkerNetworkProvider> | 2406 scoped_ptr<ServiceWorkerNetworkProvider> |
2307 network_provider(new ServiceWorkerNetworkProvider( | 2407 network_provider(new ServiceWorkerNetworkProvider( |
2308 routing_id_, SERVICE_WORKER_PROVIDER_FOR_CONTROLLEE)); | 2408 routing_id_, SERVICE_WORKER_PROVIDER_FOR_CONTROLLEE)); |
2309 ServiceWorkerNetworkProvider::AttachToDocumentState( | 2409 ServiceWorkerNetworkProvider::AttachToDocumentState( |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2447 // TODO(davidben): This should also take the failed navigation's replacement | 2547 // TODO(davidben): This should also take the failed navigation's replacement |
2448 // state into account, if a location.replace() failed. | 2548 // state into account, if a location.replace() failed. |
2449 bool replace = | 2549 bool replace = |
2450 navigation_state->history_params().page_id != -1 || | 2550 navigation_state->history_params().page_id != -1 || |
2451 ui::PageTransitionCoreTypeIs(navigation_state->GetTransitionType(), | 2551 ui::PageTransitionCoreTypeIs(navigation_state->GetTransitionType(), |
2452 ui::PAGE_TRANSITION_AUTO_SUBFRAME); | 2552 ui::PAGE_TRANSITION_AUTO_SUBFRAME); |
2453 | 2553 |
2454 // If we failed on a browser initiated request, then make sure that our error | 2554 // If we failed on a browser initiated request, then make sure that our error |
2455 // page load is regarded as the same browser initiated request. | 2555 // page load is regarded as the same browser initiated request. |
2456 if (!navigation_state->IsContentInitiated()) { | 2556 if (!navigation_state->IsContentInitiated()) { |
2457 render_view_->pending_navigation_params_.reset(new NavigationParams( | 2557 provisional_navigation_params_.reset(new NavigationParams( |
2458 navigation_state->common_params(), navigation_state->start_params(), | 2558 navigation_state->common_params(), navigation_state->start_params(), |
2459 CommitNavigationParams(false, base::TimeTicks(), std::vector<GURL>(), | 2559 CommitNavigationParams(false, base::TimeTicks(), std::vector<GURL>(), |
2460 false, std::string(), | 2560 false, std::string(), |
2461 document_state->request_time()), | 2561 document_state->request_time()), |
2462 navigation_state->history_params())); | 2562 navigation_state->history_params())); |
2463 } | 2563 } |
2464 | 2564 |
2465 // Load an error page. | 2565 // Load an error page. |
2466 LoadNavigationErrorPage(failed_request, error, replace); | 2566 LoadNavigationErrorPage(failed_request, error, replace); |
2467 } | 2567 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2500 | 2600 |
2501 if (document_state->commit_load_time().is_null()) | 2601 if (document_state->commit_load_time().is_null()) |
2502 document_state->set_commit_load_time(Time::Now()); | 2602 document_state->set_commit_load_time(Time::Now()); |
2503 | 2603 |
2504 if (internal_data->must_reset_scroll_and_scale_state()) { | 2604 if (internal_data->must_reset_scroll_and_scale_state()) { |
2505 render_view_->webview()->resetScrollAndScaleState(); | 2605 render_view_->webview()->resetScrollAndScaleState(); |
2506 internal_data->set_must_reset_scroll_and_scale_state(false); | 2606 internal_data->set_must_reset_scroll_and_scale_state(false); |
2507 } | 2607 } |
2508 internal_data->set_use_error_page(false); | 2608 internal_data->set_use_error_page(false); |
2509 | 2609 |
2510 bool is_new_navigation = commit_type == blink::WebStandardCommit; | 2610 if (commit_type == blink::WebStandardCommit) { |
Charlie Reis
2015/03/23 22:23:02
Why remove this if we need it below?
Avi (use Gerrit)
2015/03/24 20:33:46
To keep the if() branches parallel:
if (commit_ty
| |
2511 if (is_new_navigation) { | |
2512 // We bump our Page ID to correspond with the new session history entry. | 2611 // We bump our Page ID to correspond with the new session history entry. |
2513 render_view_->page_id_ = render_view_->next_page_id_++; | 2612 render_view_->page_id_ = render_view_->next_page_id_++; |
2514 | 2613 |
2515 // Don't update history list values for kSwappedOutURL, since | 2614 // Don't update history list values for kSwappedOutURL, since |
2516 // we don't want to forget the entry that was there, and since we will | 2615 // we don't want to forget the entry that was there, and since we will |
2517 // never come back to kSwappedOutURL. Note that we have to call | 2616 // never come back to kSwappedOutURL. Note that we have to call |
2518 // UpdateSessionHistory and update page_id_ even in this case, so that | 2617 // UpdateSessionHistory and update page_id_ even in this case, so that |
2519 // the current entry gets a state update and so that we don't send a | 2618 // the current entry gets a state update and so that we don't send a |
2520 // state update to the wrong entry when we swap back in. | 2619 // state update to the wrong entry when we swap back in. |
2521 DCHECK_IMPLIES( | 2620 DCHECK_IMPLIES( |
2522 navigation_state->start_params().should_replace_current_entry, | 2621 navigation_state->start_params().should_replace_current_entry, |
2523 render_view_->history_list_length_ > 0); | 2622 render_view_->history_list_length_ > 0); |
2524 if (GetLoadingUrl() != GURL(kSwappedOutURL) && | 2623 if (GetLoadingUrl() != GURL(kSwappedOutURL) && |
2525 !navigation_state->start_params().should_replace_current_entry) { | 2624 !navigation_state->start_params().should_replace_current_entry) { |
2526 // Advance our offset in session history, applying the length limit. | 2625 // Advance our offset in session history, applying the length limit. |
2527 // There is now no forward history. | 2626 // There is now no forward history. |
2528 render_view_->history_list_offset_++; | 2627 render_view_->history_list_offset_++; |
2529 if (render_view_->history_list_offset_ >= kMaxSessionHistoryEntries) | 2628 if (render_view_->history_list_offset_ >= kMaxSessionHistoryEntries) |
2530 render_view_->history_list_offset_ = kMaxSessionHistoryEntries - 1; | 2629 render_view_->history_list_offset_ = kMaxSessionHistoryEntries - 1; |
2531 render_view_->history_list_length_ = | 2630 render_view_->history_list_length_ = |
2532 render_view_->history_list_offset_ + 1; | 2631 render_view_->history_list_offset_ + 1; |
2533 } | 2632 } |
2534 } else { | 2633 } else if (commit_type == blink::WebBackForwardCommit) { |
Charlie Reis
2015/03/23 22:23:02
What would you think about doing this part of the
Avi (use Gerrit)
2015/03/24 20:33:46
Hmm... In the original change, the !navigation_sta
Charlie Reis
2015/03/24 22:04:08
Acknowledged.
| |
2535 // Inspect the navigation_state on this frame to see if the navigation | 2634 render_view_->page_id_ = navigation_state->history_params().page_id; |
2536 // corresponds to a session history navigation... Note: |frame| may or | 2635 render_view_->history_list_offset_ = |
2537 // may not be the toplevel frame, but for the case of capturing session | 2636 navigation_state->history_params().pending_history_list_offset; |
2538 // history, the first committed frame suffices. We keep track of whether | |
2539 // we've seen this commit before so that only capture session history once | |
2540 // per navigation. | |
2541 // | |
2542 // Note that we need to check if the page ID changed. In the case of a | |
2543 // reload, the page ID doesn't change, and UpdateSessionHistory gets the | |
2544 // previous URL and the current page ID, which would be wrong. | |
2545 if (navigation_state->history_params().page_id != -1 && | |
2546 navigation_state->history_params().page_id != render_view_->page_id_ && | |
2547 !navigation_state->request_committed()) { | |
2548 // This is a successful session history navigation! | |
2549 render_view_->page_id_ = navigation_state->history_params().page_id; | |
2550 | |
2551 render_view_->history_list_offset_ = | |
2552 navigation_state->history_params().pending_history_list_offset; | |
2553 } | |
2554 } | 2637 } |
2555 | 2638 |
2556 bool sent = Send( | 2639 bool sent = Send( |
2557 new FrameHostMsg_DidAssignPageId(routing_id_, render_view_->page_id_)); | 2640 new FrameHostMsg_DidAssignPageId(routing_id_, render_view_->page_id_)); |
2558 CHECK(sent); // http://crbug.com/407376 | 2641 CHECK(sent); // http://crbug.com/407376 |
2559 | 2642 |
2643 bool is_new_navigation = commit_type == blink::WebStandardCommit; | |
2560 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers_, | 2644 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers_, |
2561 DidCommitProvisionalLoad(frame, is_new_navigation)); | 2645 DidCommitProvisionalLoad(frame, is_new_navigation)); |
2562 FOR_EACH_OBSERVER( | 2646 FOR_EACH_OBSERVER( |
2563 RenderFrameObserver, observers_, | 2647 RenderFrameObserver, observers_, |
2564 DidCommitProvisionalLoad(is_new_navigation, | 2648 DidCommitProvisionalLoad(is_new_navigation, |
2565 navigation_state->WasWithinSamePage())); | 2649 navigation_state->WasWithinSamePage())); |
2566 | 2650 |
2567 if (!frame->parent()) { // Only for top frames. | 2651 if (!frame->parent()) { // Only for top frames. |
2568 RenderThreadImpl* render_thread_impl = RenderThreadImpl::current(); | 2652 RenderThreadImpl* render_thread_impl = RenderThreadImpl::current(); |
2569 if (render_thread_impl) { // Can be NULL in tests. | 2653 if (render_thread_impl) { // Can be NULL in tests. |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2764 blink::WebHistoryCommitType commit_type) { | 2848 blink::WebHistoryCommitType commit_type) { |
2765 TRACE_EVENT1("navigation", "RenderFrameImpl::didNavigateWithinPage", | 2849 TRACE_EVENT1("navigation", "RenderFrameImpl::didNavigateWithinPage", |
2766 "id", routing_id_); | 2850 "id", routing_id_); |
2767 DCHECK(!frame_ || frame_ == frame); | 2851 DCHECK(!frame_ || frame_ == frame); |
2768 // If this was a reference fragment navigation that we initiated, then we | 2852 // If this was a reference fragment navigation that we initiated, then we |
2769 // could end up having a non-null pending navigation params. We just need to | 2853 // could end up having a non-null pending navigation params. We just need to |
2770 // update the ExtraData on the datasource so that others who read the | 2854 // update the ExtraData on the datasource so that others who read the |
2771 // ExtraData will get the new NavigationState. Similarly, if we did not | 2855 // ExtraData will get the new NavigationState. Similarly, if we did not |
2772 // initiate this navigation, then we need to take care to reset any pre- | 2856 // initiate this navigation, then we need to take care to reset any pre- |
2773 // existing navigation state to a content-initiated navigation state. | 2857 // existing navigation state to a content-initiated navigation state. |
2774 // DidCreateDataSource conveniently takes care of this for us. | 2858 // didCreateDataSource conveniently takes care of this for us. |
2775 didCreateDataSource(frame, frame->dataSource()); | 2859 didCreateDataSource(frame, frame->dataSource()); |
2776 | 2860 |
2777 DocumentState* document_state = | 2861 DocumentState* document_state = |
2778 DocumentState::FromDataSource(frame->dataSource()); | 2862 DocumentState::FromDataSource(frame->dataSource()); |
2779 static_cast<NavigationStateImpl*>(document_state->navigation_state()) | 2863 static_cast<NavigationStateImpl*>(document_state->navigation_state()) |
2780 ->set_was_within_same_page(true); | 2864 ->set_was_within_same_page(true); |
2781 | 2865 |
2782 didCommitProvisionalLoad(frame, item, commit_type); | 2866 didCommitProvisionalLoad(frame, item, commit_type); |
2783 } | 2867 } |
2784 | 2868 |
(...skipping 1150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3935 WebURLRequest::CachePolicy cache_policy = | 4019 WebURLRequest::CachePolicy cache_policy = |
3936 WebURLRequest::UseProtocolCachePolicy; | 4020 WebURLRequest::UseProtocolCachePolicy; |
3937 if (!RenderFrameImpl::PrepareRenderViewForNavigation( | 4021 if (!RenderFrameImpl::PrepareRenderViewForNavigation( |
3938 common_params.url, is_history_navigation, history_params, &is_reload, | 4022 common_params.url, is_history_navigation, history_params, &is_reload, |
3939 &cache_policy)) { | 4023 &cache_policy)) { |
3940 return; | 4024 return; |
3941 } | 4025 } |
3942 | 4026 |
3943 GetContentClient()->SetActiveURL(common_params.url); | 4027 GetContentClient()->SetActiveURL(common_params.url); |
3944 | 4028 |
3945 render_view_->pending_navigation_params_.reset(new NavigationParams( | 4029 provisional_navigation_params_.reset(new NavigationParams( |
3946 common_params, StartNavigationParams(), commit_params, history_params)); | 4030 common_params, StartNavigationParams(), commit_params, history_params)); |
3947 | 4031 |
3948 if (!common_params.base_url_for_data_url.is_empty() || | 4032 if (!common_params.base_url_for_data_url.is_empty() || |
3949 common_params.url.SchemeIs(url::kDataScheme)) { | 4033 common_params.url.SchemeIs(url::kDataScheme)) { |
3950 LoadDataURL(common_params, frame_); | 4034 LoadDataURL(common_params, frame_); |
3951 return; | 4035 return; |
3952 } | 4036 } |
3953 | 4037 |
3954 // Create a WebURLRequest that blink can use to get access to the body of the | 4038 // Create a WebURLRequest that blink can use to get access to the body of the |
3955 // response through a stream in the browser. Blink will then commit the | 4039 // response through a stream in the browser. Blink will then commit the |
(...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4477 | 4561 |
4478 GURL RenderFrameImpl::GetLoadingUrl() const { | 4562 GURL RenderFrameImpl::GetLoadingUrl() const { |
4479 WebDataSource* ds = frame_->dataSource(); | 4563 WebDataSource* ds = frame_->dataSource(); |
4480 if (ds->hasUnreachableURL()) | 4564 if (ds->hasUnreachableURL()) |
4481 return ds->unreachableURL(); | 4565 return ds->unreachableURL(); |
4482 | 4566 |
4483 const WebURLRequest& request = ds->request(); | 4567 const WebURLRequest& request = ds->request(); |
4484 return request.url(); | 4568 return request.url(); |
4485 } | 4569 } |
4486 | 4570 |
4571 void RenderFrameImpl::PopulateDocumentStateFromPending( | |
4572 DocumentState* document_state) { | |
4573 document_state->set_request_time( | |
4574 provisional_navigation_params_->commit_params.request_time); | |
4575 | |
4576 InternalDocumentStateData* internal_data = | |
4577 InternalDocumentStateData::FromDocumentState(document_state); | |
4578 | |
4579 if (!provisional_navigation_params_->common_params.url.SchemeIs( | |
4580 url::kJavaScriptScheme) && | |
4581 provisional_navigation_params_->common_params.navigation_type == | |
4582 FrameMsg_Navigate_Type::RESTORE) { | |
4583 // We're doing a load of a page that was restored from the last session. By | |
4584 // default this prefers the cache over loading (LOAD_PREFERRING_CACHE) which | |
4585 // can result in stale data for pages that are set to expire. We explicitly | |
4586 // override that by setting the policy here so that as necessary we load | |
4587 // from the network. | |
4588 // | |
4589 // TODO(davidben): Remove this in favor of passing a cache policy to the | |
4590 // loadHistoryItem call in OnNavigate. That requires not overloading | |
4591 // UseProtocolCachePolicy to mean both "normal load" and "determine cache | |
4592 // policy based on load type, etc". | |
4593 internal_data->set_cache_policy_override( | |
4594 WebURLRequest::UseProtocolCachePolicy); | |
4595 } | |
4596 | |
4597 if (IsReload(provisional_navigation_params_->common_params.navigation_type)) | |
4598 document_state->set_load_type(DocumentState::RELOAD); | |
4599 else if (provisional_navigation_params_->history_params.page_state.IsValid()) | |
4600 document_state->set_load_type(DocumentState::HISTORY_LOAD); | |
4601 else | |
4602 document_state->set_load_type(DocumentState::NORMAL_LOAD); | |
4603 | |
4604 internal_data->set_is_overriding_user_agent( | |
4605 provisional_navigation_params_->commit_params.is_overriding_user_agent); | |
4606 internal_data->set_must_reset_scroll_and_scale_state( | |
4607 provisional_navigation_params_->common_params.navigation_type == | |
4608 FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL); | |
4609 document_state->set_can_load_local_resources( | |
4610 provisional_navigation_params_->commit_params.can_load_local_resources); | |
4611 } | |
4612 | |
4613 NavigationState* RenderFrameImpl::CreateNavigationStateFromPending() { | |
4614 // A navigation resulting from loading a javascript URL should not be treated | |
4615 // as a browser initiated event. Instead, we want it to look as if the page | |
4616 // initiated any load resulting from JS execution. | |
4617 if (!provisional_navigation_params_->common_params.url.SchemeIs( | |
4618 url::kJavaScriptScheme)) { | |
4619 return NavigationStateImpl::CreateBrowserInitiated( | |
4620 provisional_navigation_params_->common_params, | |
4621 provisional_navigation_params_->start_params, | |
4622 provisional_navigation_params_->history_params); | |
4623 } | |
4624 return NavigationStateImpl::CreateContentInitiated(); | |
4625 } | |
4487 #if defined(OS_ANDROID) | 4626 #if defined(OS_ANDROID) |
4488 | 4627 |
4489 WebMediaPlayer* RenderFrameImpl::CreateAndroidWebMediaPlayer( | 4628 WebMediaPlayer* RenderFrameImpl::CreateAndroidWebMediaPlayer( |
4490 const blink::WebURL& url, | 4629 const blink::WebURL& url, |
4491 WebMediaPlayerClient* client, | 4630 WebMediaPlayerClient* client, |
4492 media::MediaPermission* media_permission, | 4631 media::MediaPermission* media_permission, |
4493 blink::WebContentDecryptionModule* initial_cdm) { | 4632 blink::WebContentDecryptionModule* initial_cdm) { |
4494 GpuChannelHost* gpu_channel_host = | 4633 GpuChannelHost* gpu_channel_host = |
4495 RenderThreadImpl::current()->EstablishGpuChannelSync( | 4634 RenderThreadImpl::current()->EstablishGpuChannelSync( |
4496 CAUSE_FOR_GPU_LAUNCH_VIDEODECODEACCELERATOR_INITIALIZE); | 4635 CAUSE_FOR_GPU_LAUNCH_VIDEODECODEACCELERATOR_INITIALIZE); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4539 | 4678 |
4540 #if defined(ENABLE_BROWSER_CDMS) | 4679 #if defined(ENABLE_BROWSER_CDMS) |
4541 RendererCdmManager* RenderFrameImpl::GetCdmManager() { | 4680 RendererCdmManager* RenderFrameImpl::GetCdmManager() { |
4542 if (!cdm_manager_) | 4681 if (!cdm_manager_) |
4543 cdm_manager_ = new RendererCdmManager(this); | 4682 cdm_manager_ = new RendererCdmManager(this); |
4544 return cdm_manager_; | 4683 return cdm_manager_; |
4545 } | 4684 } |
4546 #endif // defined(ENABLE_BROWSER_CDMS) | 4685 #endif // defined(ENABLE_BROWSER_CDMS) |
4547 | 4686 |
4548 } // namespace content | 4687 } // namespace content |
OLD | NEW |