Index: content/browser/loader/resource_dispatcher_host_impl.cc |
diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc |
index 4a9724ec16cd5771bbf2add1558c8f68eb532f35..cf2623dec54ce5e185440772e2aa8a209b97ec5c 100644 |
--- a/content/browser/loader/resource_dispatcher_host_impl.cc |
+++ b/content/browser/loader/resource_dispatcher_host_impl.cc |
@@ -524,8 +524,8 @@ ResourceDispatcherHostImpl::MaybeInterceptAsStream( |
StreamContext* stream_context = |
GetStreamContextForResourceContext(info->GetContext()); |
- std::unique_ptr<StreamResourceHandler> handler( |
- new StreamResourceHandler(request, stream_context->registry(), origin)); |
+ std::unique_ptr<StreamResourceHandler> handler(new StreamResourceHandler( |
+ request, stream_context->registry(), origin, false)); |
info->set_is_stream(true); |
std::unique_ptr<StreamInfo> stream_info(new StreamInfo); |
@@ -1477,7 +1477,7 @@ ResourceDispatcherHostImpl::CreateResourceHandler( |
request_data.fetch_request_context_type, |
request_data.fetch_mixed_content_context_type, |
requester_info->appcache_service(), child_id, |
- route_id, std::move(handler)); |
+ route_id, std::move(handler), nullptr, nullptr); |
} |
std::unique_ptr<ResourceHandler> |
@@ -1490,7 +1490,9 @@ ResourceDispatcherHostImpl::AddStandardHandlers( |
AppCacheService* appcache_service, |
int child_id, |
int route_id, |
- std::unique_ptr<ResourceHandler> handler) { |
+ std::unique_ptr<ResourceHandler> handler, |
+ NavigationURLLoaderImplCore* navigation_loader_core, |
+ std::unique_ptr<StreamHandle> stream_handle) { |
// The InterceptingResourceHandler will replace its next handler with an |
// appropriate one based on the MIME type of the response if needed. It |
// should be placed at the end of the chain, just before |handler|. |
@@ -1502,7 +1504,7 @@ ResourceDispatcherHostImpl::AddStandardHandlers( |
// Add a NavigationResourceThrottle for navigations. |
// PlzNavigate: the throttle is unnecessary as communication with the UI |
- // thread is handled by the NavigationURLloader. |
+ // thread is handled by the NavigationResourceHandler below. |
if (!IsBrowserSideNavigationEnabled() && IsResourceTypeFrame(resource_type)) { |
throttles.push_back(base::MakeUnique<NavigationResourceThrottle>( |
request, delegate_, fetch_request_context_type, |
@@ -1546,6 +1548,19 @@ ResourceDispatcherHostImpl::AddStandardHandlers( |
handler.reset(new ThrottlingResourceHandler( |
std::move(handler), request, std::move(post_mime_sniffing_throttles))); |
+ if (IsBrowserSideNavigationEnabled() && IsResourceTypeFrame(resource_type)) { |
+ DCHECK(navigation_loader_core); |
+ DCHECK(stream_handle); |
+ // PlzNavigate |
+ // Add a NavigationResourceHandler that will control the flow of navigation. |
+ handler.reset(new NavigationResourceHandler( |
+ request, std::move(handler), navigation_loader_core, delegate(), |
+ std::move(stream_handle))); |
+ } else { |
+ DCHECK(!navigation_loader_core); |
+ DCHECK(!stream_handle); |
+ } |
+ |
PluginService* plugin_service = nullptr; |
#if BUILDFLAG(ENABLE_PLUGINS) |
plugin_service = PluginService::GetInstance(); |
@@ -2073,8 +2088,19 @@ void ResourceDispatcherHostImpl::BeginNavigationRequest( |
new_request.get(), appcache_handle_core->host(), resource_type, false); |
} |
+ StreamContext* stream_context = |
+ GetStreamContextForResourceContext(resource_context); |
+ // Note: the stream should be created with immediate mode set to true to |
+ // ensure that data read will be flushed to the reader as soon as it's |
+ // available. Otherwise, we risk delaying transmitting the body of the |
+ // resource to the renderer, which will delay parsing accordingly. |
std::unique_ptr<ResourceHandler> handler( |
- new NavigationResourceHandler(new_request.get(), loader, delegate())); |
+ new StreamResourceHandler(new_request.get(), stream_context->registry(), |
+ new_request->url().GetOrigin(), true)); |
+ std::unique_ptr<StreamHandle> stream_handle = |
+ static_cast<StreamResourceHandler*>(handler.get()) |
+ ->stream() |
+ ->CreateHandle(); |
// TODO(davidben): Fix the dependency on child_id/route_id. Those are used |
// by the ResourceScheduler. currently it's a no-op. |
@@ -2086,7 +2112,7 @@ void ResourceDispatcherHostImpl::BeginNavigationRequest( |
: nullptr, |
-1, // child_id |
-1, // route_id |
- std::move(handler)); |
+ std::move(handler), loader, std::move(stream_handle)); |
BeginRequestInternal(std::move(new_request), std::move(handler)); |
} |