| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/frame_host/navigation_request.h" | 5 #include "content/browser/frame_host/navigation_request.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "content/browser/devtools/render_frame_devtools_agent_host.h" | 9 #include "content/browser/devtools/render_frame_devtools_agent_host.h" |
| 10 #include "content/browser/frame_host/frame_tree.h" | 10 #include "content/browser/frame_host/frame_tree.h" |
| 11 #include "content/browser/frame_host/frame_tree_node.h" | 11 #include "content/browser/frame_host/frame_tree_node.h" |
| 12 #include "content/browser/frame_host/navigation_controller_impl.h" | 12 #include "content/browser/frame_host/navigation_controller_impl.h" |
| 13 #include "content/browser/frame_host/navigation_handle_impl.h" | 13 #include "content/browser/frame_host/navigation_handle_impl.h" |
| 14 #include "content/browser/frame_host/navigation_request_info.h" | 14 #include "content/browser/frame_host/navigation_request_info.h" |
| 15 #include "content/browser/frame_host/navigator.h" | 15 #include "content/browser/frame_host/navigator.h" |
| 16 #include "content/browser/frame_host/navigator_impl.h" | 16 #include "content/browser/frame_host/navigator_impl.h" |
| 17 #include "content/browser/loader/navigation_url_loader.h" | 17 #include "content/browser/loader/navigation_url_loader.h" |
| 18 #include "content/browser/service_worker/service_worker_context_wrapper.h" | 18 #include "content/browser/service_worker/service_worker_context_wrapper.h" |
| 19 #include "content/browser/service_worker/service_worker_navigation_handle.h" | |
| 20 #include "content/browser/site_instance_impl.h" | 19 #include "content/browser/site_instance_impl.h" |
| 21 #include "content/common/resource_request_body_impl.h" | 20 #include "content/common/resource_request_body_impl.h" |
| 22 #include "content/public/browser/browser_context.h" | 21 #include "content/public/browser/browser_context.h" |
| 23 #include "content/public/browser/navigation_controller.h" | 22 #include "content/public/browser/navigation_controller.h" |
| 24 #include "content/public/browser/navigation_data.h" | 23 #include "content/public/browser/navigation_data.h" |
| 25 #include "content/public/browser/storage_partition.h" | 24 #include "content/public/browser/storage_partition.h" |
| 26 #include "content/public/browser/stream_handle.h" | 25 #include "content/public/browser/stream_handle.h" |
| 27 #include "content/public/common/content_client.h" | 26 #include "content/public/common/content_client.h" |
| 28 #include "content/public/common/resource_response.h" | 27 #include "content/public/common/resource_response.h" |
| 29 #include "net/base/load_flags.h" | 28 #include "net/base/load_flags.h" |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 // HTTP 204 (No Content) and HTTP 205 (Reset Content) responses should not | 282 // HTTP 204 (No Content) and HTTP 205 (Reset Content) responses should not |
| 284 // commit; they leave the frame showing the previous page. | 283 // commit; they leave the frame showing the previous page. |
| 285 DCHECK(response); | 284 DCHECK(response); |
| 286 if (response->head.headers.get() && | 285 if (response->head.headers.get() && |
| 287 (response->head.headers->response_code() == 204 || | 286 (response->head.headers->response_code() == 204 || |
| 288 response->head.headers->response_code() == 205)) { | 287 response->head.headers->response_code() == 205)) { |
| 289 frame_tree_node_->ResetNavigationRequest(false); | 288 frame_tree_node_->ResetNavigationRequest(false); |
| 290 return; | 289 return; |
| 291 } | 290 } |
| 292 | 291 |
| 293 // Update the service worker params of the request params. | |
| 294 request_params_.should_create_service_worker = | |
| 295 (frame_tree_node_->pending_sandbox_flags() & | |
| 296 blink::WebSandboxFlags::Origin) != blink::WebSandboxFlags::Origin; | |
| 297 if (navigation_handle_->service_worker_handle()) { | |
| 298 request_params_.service_worker_provider_id = | |
| 299 navigation_handle_->service_worker_handle() | |
| 300 ->service_worker_provider_host_id(); | |
| 301 } | |
| 302 | |
| 303 // Update the lofi state of the request. | 292 // Update the lofi state of the request. |
| 304 if (response->head.is_using_lofi) | 293 if (response->head.is_using_lofi) |
| 305 common_params_.lofi_state = LOFI_ON; | 294 common_params_.lofi_state = LOFI_ON; |
| 306 else | 295 else |
| 307 common_params_.lofi_state = LOFI_OFF; | 296 common_params_.lofi_state = LOFI_OFF; |
| 308 | 297 |
| 309 // Select an appropriate renderer to commit the navigation. | 298 // Select an appropriate renderer to commit the navigation. |
| 310 RenderFrameHostImpl* render_frame_host = | 299 RenderFrameHostImpl* render_frame_host = |
| 311 frame_tree_node_->render_manager()->GetFrameHostForNavigation(*this); | 300 frame_tree_node_->render_manager()->GetFrameHostForNavigation(*this); |
| 312 NavigatorImpl::CheckWebUIRendererDoesNotDisplayNormalURL(render_frame_host, | 301 NavigatorImpl::CheckWebUIRendererDoesNotDisplayNormalURL(render_frame_host, |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 if (frame_tree_node_->IsMainFrame()) { | 339 if (frame_tree_node_->IsMainFrame()) { |
| 351 TRACE_EVENT_ASYNC_END_WITH_TIMESTAMP0( | 340 TRACE_EVENT_ASYNC_END_WITH_TIMESTAMP0( |
| 352 "navigation", "Navigation timeToNetworkStack", navigation_handle_.get(), | 341 "navigation", "Navigation timeToNetworkStack", navigation_handle_.get(), |
| 353 timestamp.ToInternalValue()); | 342 timestamp.ToInternalValue()); |
| 354 } | 343 } |
| 355 | 344 |
| 356 frame_tree_node_->navigator()->LogResourceRequestTime(timestamp, | 345 frame_tree_node_->navigator()->LogResourceRequestTime(timestamp, |
| 357 common_params_.url); | 346 common_params_.url); |
| 358 } | 347 } |
| 359 | 348 |
| 349 void NavigationRequest::OnServiceWorkerEncountered() { |
| 350 request_params_.should_create_service_worker = true; |
| 351 |
| 352 // TODO(clamy): the navigation should be sent to a RenderFrameHost to be |
| 353 // picked up by the ServiceWorker. |
| 354 NOTIMPLEMENTED(); |
| 355 } |
| 356 |
| 360 void NavigationRequest::OnStartChecksComplete( | 357 void NavigationRequest::OnStartChecksComplete( |
| 361 NavigationThrottle::ThrottleCheckResult result) { | 358 NavigationThrottle::ThrottleCheckResult result) { |
| 362 CHECK(result != NavigationThrottle::DEFER); | 359 CHECK(result != NavigationThrottle::DEFER); |
| 363 | 360 |
| 364 // Abort the request if needed. This will destroy the NavigationRequest. | 361 // Abort the request if needed. This will destroy the NavigationRequest. |
| 365 if (result == NavigationThrottle::CANCEL_AND_IGNORE || | 362 if (result == NavigationThrottle::CANCEL_AND_IGNORE || |
| 366 result == NavigationThrottle::CANCEL) { | 363 result == NavigationThrottle::CANCEL) { |
| 367 // TODO(clamy): distinguish between CANCEL and CANCEL_AND_IGNORE. | 364 // TODO(clamy): distinguish between CANCEL and CANCEL_AND_IGNORE. |
| 368 frame_tree_node_->ResetNavigationRequest(false); | 365 frame_tree_node_->ResetNavigationRequest(false); |
| 369 return; | 366 return; |
| 370 } | 367 } |
| 371 | 368 |
| 372 InitializeServiceWorkerHandleIfNeeded(); | 369 // Use the SiteInstance of the navigating RenderFrameHost to get access to |
| 370 // the StoragePartition. Using the url of the navigation will result in a |
| 371 // wrong StoragePartition being picked when a WebView is navigating. |
| 372 DCHECK_NE(AssociatedSiteInstanceType::NONE, associated_site_instance_type_); |
| 373 RenderFrameHostImpl* navigating_frame_host = |
| 374 associated_site_instance_type_ == AssociatedSiteInstanceType::SPECULATIVE |
| 375 ? frame_tree_node_->render_manager()->speculative_frame_host() |
| 376 : frame_tree_node_->current_frame_host(); |
| 377 DCHECK(navigating_frame_host); |
| 378 |
| 379 BrowserContext* browser_context = |
| 380 frame_tree_node_->navigator()->GetController()->GetBrowserContext(); |
| 381 StoragePartition* partition = BrowserContext::GetStoragePartition( |
| 382 browser_context, navigating_frame_host->GetSiteInstance()); |
| 383 DCHECK(partition); |
| 384 |
| 385 ServiceWorkerContextWrapper* service_worker_context = |
| 386 static_cast<ServiceWorkerContextWrapper*>( |
| 387 partition->GetServiceWorkerContext()); |
| 388 |
| 373 loader_ = NavigationURLLoader::Create( | 389 loader_ = NavigationURLLoader::Create( |
| 374 frame_tree_node_->navigator()->GetController()->GetBrowserContext(), | 390 frame_tree_node_->navigator()->GetController()->GetBrowserContext(), |
| 375 std::move(info_), navigation_handle_->service_worker_handle(), this); | 391 std::move(info_), service_worker_context, this); |
| 376 } | 392 } |
| 377 | 393 |
| 378 void NavigationRequest::OnRedirectChecksComplete( | 394 void NavigationRequest::OnRedirectChecksComplete( |
| 379 NavigationThrottle::ThrottleCheckResult result) { | 395 NavigationThrottle::ThrottleCheckResult result) { |
| 380 CHECK(result != NavigationThrottle::DEFER); | 396 CHECK(result != NavigationThrottle::DEFER); |
| 381 | 397 |
| 382 // Abort the request if needed. This will destroy the NavigationRequest. | 398 // Abort the request if needed. This will destroy the NavigationRequest. |
| 383 if (result == NavigationThrottle::CANCEL_AND_IGNORE || | 399 if (result == NavigationThrottle::CANCEL_AND_IGNORE || |
| 384 result == NavigationThrottle::CANCEL) { | 400 result == NavigationThrottle::CANCEL) { |
| 385 // TODO(clamy): distinguish between CANCEL and CANCEL_AND_IGNORE. | 401 // TODO(clamy): distinguish between CANCEL and CANCEL_AND_IGNORE. |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 common_params_, request_params_, | 443 common_params_, request_params_, |
| 428 is_view_source_); | 444 is_view_source_); |
| 429 | 445 |
| 430 // When navigating to a Javascript url, the NavigationRequest is not stored | 446 // When navigating to a Javascript url, the NavigationRequest is not stored |
| 431 // in the FrameTreeNode. Therefore do not reset it, as this could cancel an | 447 // in the FrameTreeNode. Therefore do not reset it, as this could cancel an |
| 432 // existing pending navigation. | 448 // existing pending navigation. |
| 433 if (!common_params_.url.SchemeIs(url::kJavaScriptScheme)) | 449 if (!common_params_.url.SchemeIs(url::kJavaScriptScheme)) |
| 434 frame_tree_node_->ResetNavigationRequest(true); | 450 frame_tree_node_->ResetNavigationRequest(true); |
| 435 } | 451 } |
| 436 | 452 |
| 437 void NavigationRequest::InitializeServiceWorkerHandleIfNeeded() { | |
| 438 // Only initialize the ServiceWorkerNavigationHandle if it can be created for | |
| 439 // this frame. | |
| 440 bool can_create_service_worker = | |
| 441 (frame_tree_node_->pending_sandbox_flags() & | |
| 442 blink::WebSandboxFlags::Origin) != blink::WebSandboxFlags::Origin; | |
| 443 if (!can_create_service_worker) | |
| 444 return; | |
| 445 | |
| 446 // Use the SiteInstance of the navigating RenderFrameHost to get access to | |
| 447 // the StoragePartition. Using the url of the navigation will result in a | |
| 448 // wrong StoragePartition being picked when a WebView is navigating. | |
| 449 RenderFrameHostImpl* navigating_frame_host = | |
| 450 frame_tree_node_->render_manager()->speculative_frame_host(); | |
| 451 if (!navigating_frame_host) | |
| 452 navigating_frame_host = frame_tree_node_->current_frame_host(); | |
| 453 DCHECK(navigating_frame_host); | |
| 454 | |
| 455 BrowserContext* browser_context = | |
| 456 frame_tree_node_->navigator()->GetController()->GetBrowserContext(); | |
| 457 StoragePartition* partition = BrowserContext::GetStoragePartition( | |
| 458 browser_context, navigating_frame_host->GetSiteInstance()); | |
| 459 DCHECK(partition); | |
| 460 | |
| 461 ServiceWorkerContextWrapper* service_worker_context = | |
| 462 static_cast<ServiceWorkerContextWrapper*>( | |
| 463 partition->GetServiceWorkerContext()); | |
| 464 navigation_handle_->InitServiceWorkerHandle(service_worker_context); | |
| 465 } | |
| 466 | |
| 467 } // namespace content | 453 } // namespace content |
| OLD | NEW |