OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc
e-loading | 5 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc
e-loading |
6 | 6 |
7 #include "content/browser/loader/resource_dispatcher_host_impl.h" | 7 #include "content/browser/loader/resource_dispatcher_host_impl.h" |
8 | 8 |
9 #include <stddef.h> | 9 #include <stddef.h> |
10 | 10 |
(...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
517 GURL origin; | 517 GURL origin; |
518 if (!delegate_ || | 518 if (!delegate_ || |
519 !delegate_->ShouldInterceptResourceAsStream( | 519 !delegate_->ShouldInterceptResourceAsStream( |
520 request, plugin_path, mime_type, &origin, payload)) { | 520 request, plugin_path, mime_type, &origin, payload)) { |
521 return std::unique_ptr<ResourceHandler>(); | 521 return std::unique_ptr<ResourceHandler>(); |
522 } | 522 } |
523 | 523 |
524 StreamContext* stream_context = | 524 StreamContext* stream_context = |
525 GetStreamContextForResourceContext(info->GetContext()); | 525 GetStreamContextForResourceContext(info->GetContext()); |
526 | 526 |
527 std::unique_ptr<StreamResourceHandler> handler( | 527 std::unique_ptr<StreamResourceHandler> handler(new StreamResourceHandler( |
528 new StreamResourceHandler(request, stream_context->registry(), origin)); | 528 request, stream_context->registry(), origin, false)); |
529 | 529 |
530 info->set_is_stream(true); | 530 info->set_is_stream(true); |
531 std::unique_ptr<StreamInfo> stream_info(new StreamInfo); | 531 std::unique_ptr<StreamInfo> stream_info(new StreamInfo); |
532 stream_info->handle = handler->stream()->CreateHandle(); | 532 stream_info->handle = handler->stream()->CreateHandle(); |
533 stream_info->original_url = request->url(); | 533 stream_info->original_url = request->url(); |
534 stream_info->mime_type = mime_type; | 534 stream_info->mime_type = mime_type; |
535 // Make a copy of the response headers so it is safe to pass across threads; | 535 // Make a copy of the response headers so it is safe to pass across threads; |
536 // the old handler (AsyncResourceHandler) may modify it in parallel via the | 536 // the old handler (AsyncResourceHandler) may modify it in parallel via the |
537 // ResourceDispatcherHostDelegate. | 537 // ResourceDispatcherHostDelegate. |
538 if (response->head.headers.get()) { | 538 if (response->head.headers.get()) { |
(...skipping 931 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1470 IsResourceTypeFrame(request_data.resource_type)) { | 1470 IsResourceTypeFrame(request_data.resource_type)) { |
1471 DCHECK(request->url().SchemeIs(url::kBlobScheme)); | 1471 DCHECK(request->url().SchemeIs(url::kBlobScheme)); |
1472 return handler; | 1472 return handler; |
1473 } | 1473 } |
1474 | 1474 |
1475 return AddStandardHandlers(request, request_data.resource_type, | 1475 return AddStandardHandlers(request, request_data.resource_type, |
1476 resource_context, | 1476 resource_context, |
1477 request_data.fetch_request_context_type, | 1477 request_data.fetch_request_context_type, |
1478 request_data.fetch_mixed_content_context_type, | 1478 request_data.fetch_mixed_content_context_type, |
1479 requester_info->appcache_service(), child_id, | 1479 requester_info->appcache_service(), child_id, |
1480 route_id, std::move(handler)); | 1480 route_id, std::move(handler), nullptr, nullptr); |
1481 } | 1481 } |
1482 | 1482 |
1483 std::unique_ptr<ResourceHandler> | 1483 std::unique_ptr<ResourceHandler> |
1484 ResourceDispatcherHostImpl::AddStandardHandlers( | 1484 ResourceDispatcherHostImpl::AddStandardHandlers( |
1485 net::URLRequest* request, | 1485 net::URLRequest* request, |
1486 ResourceType resource_type, | 1486 ResourceType resource_type, |
1487 ResourceContext* resource_context, | 1487 ResourceContext* resource_context, |
1488 RequestContextType fetch_request_context_type, | 1488 RequestContextType fetch_request_context_type, |
1489 blink::WebMixedContentContextType fetch_mixed_content_context_type, | 1489 blink::WebMixedContentContextType fetch_mixed_content_context_type, |
1490 AppCacheService* appcache_service, | 1490 AppCacheService* appcache_service, |
1491 int child_id, | 1491 int child_id, |
1492 int route_id, | 1492 int route_id, |
1493 std::unique_ptr<ResourceHandler> handler) { | 1493 std::unique_ptr<ResourceHandler> handler, |
| 1494 NavigationURLLoaderImplCore* navigation_loader_core, |
| 1495 std::unique_ptr<StreamHandle> stream_handle) { |
1494 // The InterceptingResourceHandler will replace its next handler with an | 1496 // The InterceptingResourceHandler will replace its next handler with an |
1495 // appropriate one based on the MIME type of the response if needed. It | 1497 // appropriate one based on the MIME type of the response if needed. It |
1496 // should be placed at the end of the chain, just before |handler|. | 1498 // should be placed at the end of the chain, just before |handler|. |
1497 handler.reset(new InterceptingResourceHandler(std::move(handler), request)); | 1499 handler.reset(new InterceptingResourceHandler(std::move(handler), request)); |
1498 InterceptingResourceHandler* intercepting_handler = | 1500 InterceptingResourceHandler* intercepting_handler = |
1499 static_cast<InterceptingResourceHandler*>(handler.get()); | 1501 static_cast<InterceptingResourceHandler*>(handler.get()); |
1500 | 1502 |
1501 std::vector<std::unique_ptr<ResourceThrottle>> throttles; | 1503 std::vector<std::unique_ptr<ResourceThrottle>> throttles; |
1502 | 1504 |
1503 // Add a NavigationResourceThrottle for navigations. | 1505 // Add a NavigationResourceThrottle for navigations. |
1504 // PlzNavigate: the throttle is unnecessary as communication with the UI | 1506 // PlzNavigate: the throttle is unnecessary as communication with the UI |
1505 // thread is handled by the NavigationURLloader. | 1507 // thread is handled by the NavigationResourceHandler below. |
1506 if (!IsBrowserSideNavigationEnabled() && IsResourceTypeFrame(resource_type)) { | 1508 if (!IsBrowserSideNavigationEnabled() && IsResourceTypeFrame(resource_type)) { |
1507 throttles.push_back(base::MakeUnique<NavigationResourceThrottle>( | 1509 throttles.push_back(base::MakeUnique<NavigationResourceThrottle>( |
1508 request, delegate_, fetch_request_context_type, | 1510 request, delegate_, fetch_request_context_type, |
1509 fetch_mixed_content_context_type)); | 1511 fetch_mixed_content_context_type)); |
1510 } | 1512 } |
1511 | 1513 |
1512 if (delegate_) { | 1514 if (delegate_) { |
1513 delegate_->RequestBeginning(request, | 1515 delegate_->RequestBeginning(request, |
1514 resource_context, | 1516 resource_context, |
1515 appcache_service, | 1517 appcache_service, |
(...skipping 23 matching lines...) Expand all Loading... |
1539 } else { | 1541 } else { |
1540 post_mime_sniffing_throttles.push_back(std::move(throttle)); | 1542 post_mime_sniffing_throttles.push_back(std::move(throttle)); |
1541 } | 1543 } |
1542 } | 1544 } |
1543 throttles.clear(); | 1545 throttles.clear(); |
1544 | 1546 |
1545 // Add the post mime sniffing throttles. | 1547 // Add the post mime sniffing throttles. |
1546 handler.reset(new ThrottlingResourceHandler( | 1548 handler.reset(new ThrottlingResourceHandler( |
1547 std::move(handler), request, std::move(post_mime_sniffing_throttles))); | 1549 std::move(handler), request, std::move(post_mime_sniffing_throttles))); |
1548 | 1550 |
| 1551 if (IsBrowserSideNavigationEnabled() && IsResourceTypeFrame(resource_type)) { |
| 1552 DCHECK(navigation_loader_core); |
| 1553 DCHECK(stream_handle); |
| 1554 // PlzNavigate |
| 1555 // Add a NavigationResourceHandler that will control the flow of navigation. |
| 1556 handler.reset(new NavigationResourceHandler( |
| 1557 request, std::move(handler), navigation_loader_core, delegate(), |
| 1558 std::move(stream_handle))); |
| 1559 } else { |
| 1560 DCHECK(!navigation_loader_core); |
| 1561 DCHECK(!stream_handle); |
| 1562 } |
| 1563 |
1549 PluginService* plugin_service = nullptr; | 1564 PluginService* plugin_service = nullptr; |
1550 #if BUILDFLAG(ENABLE_PLUGINS) | 1565 #if BUILDFLAG(ENABLE_PLUGINS) |
1551 plugin_service = PluginService::GetInstance(); | 1566 plugin_service = PluginService::GetInstance(); |
1552 #endif | 1567 #endif |
1553 | 1568 |
1554 // Insert a buffered event handler to sniff the mime type. | 1569 // Insert a buffered event handler to sniff the mime type. |
1555 // Note: all ResourceHandler following the MimeSniffingResourceHandler | 1570 // Note: all ResourceHandler following the MimeSniffingResourceHandler |
1556 // should expect OnWillRead to be called *before* OnResponseStarted as | 1571 // should expect OnWillRead to be called *before* OnResponseStarted as |
1557 // part of the mime sniffing process. | 1572 // part of the mime sniffing process. |
1558 handler.reset(new MimeSniffingResourceHandler( | 1573 handler.reset(new MimeSniffingResourceHandler( |
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2066 info.begin_params.request_context_type, frame_type, | 2081 info.begin_params.request_context_type, frame_type, |
2067 info.are_ancestors_secure, info.common_params.post_data, | 2082 info.are_ancestors_secure, info.common_params.post_data, |
2068 extra_info->GetWebContentsGetterForRequest()); | 2083 extra_info->GetWebContentsGetterForRequest()); |
2069 | 2084 |
2070 // Have the appcache associate its extra info with the request. | 2085 // Have the appcache associate its extra info with the request. |
2071 if (appcache_handle_core) { | 2086 if (appcache_handle_core) { |
2072 AppCacheInterceptor::SetExtraRequestInfoForHost( | 2087 AppCacheInterceptor::SetExtraRequestInfoForHost( |
2073 new_request.get(), appcache_handle_core->host(), resource_type, false); | 2088 new_request.get(), appcache_handle_core->host(), resource_type, false); |
2074 } | 2089 } |
2075 | 2090 |
| 2091 StreamContext* stream_context = |
| 2092 GetStreamContextForResourceContext(resource_context); |
| 2093 // Note: the stream should be created with immediate mode set to true to |
| 2094 // ensure that data read will be flushed to the reader as soon as it's |
| 2095 // available. Otherwise, we risk delaying transmitting the body of the |
| 2096 // resource to the renderer, which will delay parsing accordingly. |
2076 std::unique_ptr<ResourceHandler> handler( | 2097 std::unique_ptr<ResourceHandler> handler( |
2077 new NavigationResourceHandler(new_request.get(), loader, delegate())); | 2098 new StreamResourceHandler(new_request.get(), stream_context->registry(), |
| 2099 new_request->url().GetOrigin(), true)); |
| 2100 std::unique_ptr<StreamHandle> stream_handle = |
| 2101 static_cast<StreamResourceHandler*>(handler.get()) |
| 2102 ->stream() |
| 2103 ->CreateHandle(); |
2078 | 2104 |
2079 // TODO(davidben): Fix the dependency on child_id/route_id. Those are used | 2105 // TODO(davidben): Fix the dependency on child_id/route_id. Those are used |
2080 // by the ResourceScheduler. currently it's a no-op. | 2106 // by the ResourceScheduler. currently it's a no-op. |
2081 handler = AddStandardHandlers( | 2107 handler = AddStandardHandlers( |
2082 new_request.get(), resource_type, resource_context, | 2108 new_request.get(), resource_type, resource_context, |
2083 info.begin_params.request_context_type, | 2109 info.begin_params.request_context_type, |
2084 info.begin_params.mixed_content_context_type, | 2110 info.begin_params.mixed_content_context_type, |
2085 appcache_handle_core ? appcache_handle_core->GetAppCacheService() | 2111 appcache_handle_core ? appcache_handle_core->GetAppCacheService() |
2086 : nullptr, | 2112 : nullptr, |
2087 -1, // child_id | 2113 -1, // child_id |
2088 -1, // route_id | 2114 -1, // route_id |
2089 std::move(handler)); | 2115 std::move(handler), loader, std::move(stream_handle)); |
2090 | 2116 |
2091 BeginRequestInternal(std::move(new_request), std::move(handler)); | 2117 BeginRequestInternal(std::move(new_request), std::move(handler)); |
2092 } | 2118 } |
2093 | 2119 |
2094 void ResourceDispatcherHostImpl::SetLoaderDelegate( | 2120 void ResourceDispatcherHostImpl::SetLoaderDelegate( |
2095 LoaderDelegate* loader_delegate) { | 2121 LoaderDelegate* loader_delegate) { |
2096 loader_delegate_ = loader_delegate; | 2122 loader_delegate_ = loader_delegate; |
2097 } | 2123 } |
2098 | 2124 |
2099 void ResourceDispatcherHostImpl::OnRenderFrameDeleted( | 2125 void ResourceDispatcherHostImpl::OnRenderFrameDeleted( |
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2615 &throttles); | 2641 &throttles); |
2616 if (!throttles.empty()) { | 2642 if (!throttles.empty()) { |
2617 handler.reset(new ThrottlingResourceHandler(std::move(handler), request, | 2643 handler.reset(new ThrottlingResourceHandler(std::move(handler), request, |
2618 std::move(throttles))); | 2644 std::move(throttles))); |
2619 } | 2645 } |
2620 } | 2646 } |
2621 return handler; | 2647 return handler; |
2622 } | 2648 } |
2623 | 2649 |
2624 } // namespace content | 2650 } // namespace content |
OLD | NEW |