| 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 7746633e307f9e737764babb2578a4621546ba0f..d70afa71e4951628f7a50d32a6a40b7f70dcaad2 100644
|
| --- a/content/browser/loader/resource_dispatcher_host_impl.cc
|
| +++ b/content/browser/loader/resource_dispatcher_host_impl.cc
|
| @@ -57,6 +57,7 @@
|
| #include "content/browser/loader/resource_loader.h"
|
| #include "content/browser/loader/resource_message_filter.h"
|
| #include "content/browser/loader/resource_request_info_impl.h"
|
| +#include "content/browser/loader/resource_requester_info.h"
|
| #include "content/browser/loader/resource_scheduler.h"
|
| #include "content/browser/loader/stream_resource_handler.h"
|
| #include "content/browser/loader/sync_resource_handler.h"
|
| @@ -65,6 +66,7 @@
|
| #include "content/browser/resource_context_impl.h"
|
| #include "content/browser/service_worker/foreign_fetch_request_handler.h"
|
| #include "content/browser/service_worker/link_header_support.h"
|
| +#include "content/browser/service_worker/service_worker_context_wrapper.h"
|
| #include "content/browser/service_worker/service_worker_navigation_handle_core.h"
|
| #include "content/browser/service_worker/service_worker_request_handler.h"
|
| #include "content/browser/streams/stream.h"
|
| @@ -90,7 +92,6 @@
|
| #include "content/public/common/browser_side_navigation_policy.h"
|
| #include "content/public/common/content_features.h"
|
| #include "content/public/common/content_switches.h"
|
| -#include "content/public/common/process_type.h"
|
| #include "ipc/ipc_message_macros.h"
|
| #include "ipc/ipc_message_start.h"
|
| #include "net/base/auth.h"
|
| @@ -228,7 +229,7 @@ bool IsDetachableResourceType(ResourceType type) {
|
|
|
| // Aborts a request before an URLRequest has actually been created.
|
| void AbortRequestBeforeItStarts(
|
| - ResourceMessageFilter* filter,
|
| + IPC::Sender* sender,
|
| const SyncLoadResultCallback& sync_result_handler,
|
| int request_id,
|
| mojom::URLLoaderClientAssociatedPtr url_loader_client) {
|
| @@ -249,7 +250,7 @@ void AbortRequestBeforeItStarts(
|
| if (url_loader_client) {
|
| url_loader_client->OnComplete(request_complete_data);
|
| } else {
|
| - filter->Send(
|
| + sender->Send(
|
| new ResourceMsg_RequestComplete(request_id, request_complete_data));
|
| }
|
| }
|
| @@ -469,7 +470,6 @@ ResourceDispatcherHostImpl::ResourceDispatcherHostImpl(
|
| max_num_in_flight_requests_ * kMaxRequestsPerProcessRatio)),
|
| max_outstanding_requests_cost_per_process_(
|
| kMaxOutstandingRequestsCostPerProcess),
|
| - filter_(nullptr),
|
| delegate_(nullptr),
|
| loader_delegate_(nullptr),
|
| allow_cross_origin_auth_prompt_(false),
|
| @@ -619,12 +619,13 @@ void ResourceDispatcherHostImpl::CancelRequestsForContext(
|
| // the associated processes go away. It may be OK for this invariant to
|
| // change in the future, but if this assertion fires without the invariant
|
| // changing, then it's indicative of a leak.
|
| - DCHECK(loader->GetRequestInfo()->IsDownload() ||
|
| - loader->GetRequestInfo()->is_stream() ||
|
| - (loader->GetRequestInfo()->detachable_handler() &&
|
| - loader->GetRequestInfo()->detachable_handler()->is_detached()) ||
|
| - loader->GetRequestInfo()->GetProcessType() == PROCESS_TYPE_BROWSER ||
|
| - loader->is_transferring());
|
| + DCHECK(
|
| + loader->GetRequestInfo()->IsDownload() ||
|
| + loader->GetRequestInfo()->is_stream() ||
|
| + (loader->GetRequestInfo()->detachable_handler() &&
|
| + loader->GetRequestInfo()->detachable_handler()->is_detached()) ||
|
| + loader->GetRequestInfo()->requester_info()->IsBrowserSideNavigation() ||
|
| + loader->is_transferring());
|
| }
|
| #endif
|
|
|
| @@ -784,7 +785,7 @@ void ResourceDispatcherHostImpl::DidReceiveRedirect(
|
| DCHECK_EQ(request->url_chain().size(), 1u);
|
| DCHECK(async_revalidation_manager_);
|
|
|
| - async_revalidation_manager_->BeginAsyncRevalidation(*request,
|
| + async_revalidation_manager_->BeginAsyncRevalidation(request,
|
| scheduler_.get());
|
| }
|
|
|
| @@ -827,7 +828,7 @@ void ResourceDispatcherHostImpl::DidReceiveResponse(ResourceLoader* loader) {
|
|
|
| if (request->response_info().async_revalidation_required) {
|
| DCHECK(async_revalidation_manager_);
|
| - async_revalidation_manager_->BeginAsyncRevalidation(*request,
|
| + async_revalidation_manager_->BeginAsyncRevalidation(request,
|
| scheduler_.get());
|
| }
|
|
|
| @@ -1010,13 +1011,15 @@ void ResourceDispatcherHostImpl::OnShutdown() {
|
|
|
| bool ResourceDispatcherHostImpl::OnMessageReceived(
|
| const IPC::Message& message,
|
| - ResourceMessageFilter* filter) {
|
| + ResourceRequesterInfo* requester_info) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - filter_ = filter;
|
| +
|
| bool handled = true;
|
| - IPC_BEGIN_MESSAGE_MAP(ResourceDispatcherHostImpl, message)
|
| + IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(ResourceDispatcherHostImpl, message,
|
| + requester_info)
|
| IPC_MESSAGE_HANDLER(ResourceHostMsg_RequestResource, OnRequestResource)
|
| - IPC_MESSAGE_HANDLER_DELAY_REPLY(ResourceHostMsg_SyncLoad, OnSyncLoad)
|
| + IPC_MESSAGE_HANDLER_WITH_PARAM_DELAY_REPLY(ResourceHostMsg_SyncLoad,
|
| + OnSyncLoad)
|
| IPC_MESSAGE_HANDLER(ResourceHostMsg_ReleaseDownloadedFile,
|
| OnReleaseDownloadedFile)
|
| IPC_MESSAGE_HANDLER(ResourceHostMsg_CancelRequest, OnCancelRequest)
|
| @@ -1029,7 +1032,7 @@ bool ResourceDispatcherHostImpl::OnMessageReceived(
|
| int request_id = -1;
|
| bool ok = iter.ReadInt(&request_id);
|
| DCHECK(ok);
|
| - GlobalRequestID id(filter_->child_id(), request_id);
|
| + GlobalRequestID id(requester_info->child_id(), request_id);
|
| DelegateMap::iterator it = delegate_map_.find(id);
|
| if (it != delegate_map_.end()) {
|
| for (auto& delegate : *it->second) {
|
| @@ -1045,24 +1048,26 @@ bool ResourceDispatcherHostImpl::OnMessageReceived(
|
| handled = true;
|
| }
|
|
|
| - filter_ = NULL;
|
| return handled;
|
| }
|
|
|
| void ResourceDispatcherHostImpl::OnRequestResource(
|
| + ResourceRequesterInfo* requester_info,
|
| int routing_id,
|
| int request_id,
|
| const ResourceRequest& request_data) {
|
| - OnRequestResourceInternal(routing_id, request_id, request_data, nullptr,
|
| - nullptr);
|
| + OnRequestResourceInternal(requester_info, routing_id, request_id,
|
| + request_data, nullptr, nullptr);
|
| }
|
|
|
| void ResourceDispatcherHostImpl::OnRequestResourceInternal(
|
| + ResourceRequesterInfo* requester_info,
|
| int routing_id,
|
| int request_id,
|
| const ResourceRequest& request_data,
|
| mojom::URLLoaderAssociatedRequest mojo_request,
|
| mojom::URLLoaderClientAssociatedPtr url_loader_client) {
|
| + DCHECK(requester_info->IsRenderer());
|
| // TODO(pkasting): Remove ScopedTracker below once crbug.com/477117 is fixed.
|
| tracked_objects::ScopedTracker tracking_profile(
|
| FROM_HERE_WITH_EXPLICIT_FUNCTION(
|
| @@ -1075,16 +1080,14 @@ void ResourceDispatcherHostImpl::OnRequestResourceInternal(
|
| request_data.transferred_request_request_id == -1 &&
|
| !IsBrowserSideNavigationEnabled()) {
|
| BrowserThread::PostTask(
|
| - BrowserThread::UI,
|
| - FROM_HERE,
|
| - base::Bind(&LogResourceRequestTimeOnUI,
|
| - TimeTicks::Now(),
|
| - filter_->child_id(),
|
| - request_data.render_frame_id,
|
| + BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&LogResourceRequestTimeOnUI, TimeTicks::Now(),
|
| + requester_info->child_id(), request_data.render_frame_id,
|
| request_data.url));
|
| }
|
| - BeginRequest(request_id, request_data, SyncLoadResultCallback(), routing_id,
|
| - std::move(mojo_request), std::move(url_loader_client));
|
| + BeginRequest(requester_info, request_id, request_data,
|
| + SyncLoadResultCallback(), routing_id, std::move(mojo_request),
|
| + std::move(url_loader_client));
|
| }
|
|
|
| // Begins a resource request with the given params on behalf of the specified
|
| @@ -1095,14 +1098,16 @@ void ResourceDispatcherHostImpl::OnRequestResourceInternal(
|
| //
|
| // If sync_result is non-null, then a SyncLoad reply will be generated, else
|
| // a normal asynchronous set of response messages will be generated.
|
| -void ResourceDispatcherHostImpl::OnSyncLoad(int request_id,
|
| - const ResourceRequest& request_data,
|
| - IPC::Message* sync_result) {
|
| - SyncLoadResultCallback callback = base::Bind(
|
| - &HandleSyncLoadResult, filter_->GetWeakPtr(),
|
| - base::Passed(WrapUnique(sync_result)));
|
| - BeginRequest(request_id, request_data, callback, sync_result->routing_id(),
|
| - nullptr, nullptr);
|
| +void ResourceDispatcherHostImpl::OnSyncLoad(
|
| + ResourceRequesterInfo* requester_info,
|
| + int request_id,
|
| + const ResourceRequest& request_data,
|
| + IPC::Message* sync_result) {
|
| + SyncLoadResultCallback callback =
|
| + base::Bind(&HandleSyncLoadResult, requester_info->filter()->GetWeakPtr(),
|
| + base::Passed(WrapUnique(sync_result)));
|
| + BeginRequest(requester_info, request_id, request_data, callback,
|
| + sync_result->routing_id(), nullptr, nullptr);
|
| }
|
|
|
| bool ResourceDispatcherHostImpl::IsRequestIDInUse(
|
| @@ -1120,13 +1125,15 @@ bool ResourceDispatcherHostImpl::IsRequestIDInUse(
|
| }
|
|
|
| void ResourceDispatcherHostImpl::UpdateRequestForTransfer(
|
| - int child_id,
|
| + ResourceRequesterInfo* requester_info,
|
| int route_id,
|
| int request_id,
|
| const ResourceRequest& request_data,
|
| LoaderMap::iterator iter,
|
| mojom::URLLoaderAssociatedRequest mojo_request,
|
| mojom::URLLoaderClientAssociatedPtr url_loader_client) {
|
| + DCHECK(requester_info->IsRenderer());
|
| + int child_id = requester_info->child_id();
|
| ResourceRequestInfoImpl* info = iter->second->GetRequestInfo();
|
| GlobalFrameRoutingId old_routing_id(request_data.transferred_request_child_id,
|
| info->GetRenderFrameID());
|
| @@ -1152,9 +1159,9 @@ void ResourceDispatcherHostImpl::UpdateRequestForTransfer(
|
| // ResourceHandlers should always get state related to the request from the
|
| // ResourceRequestInfo rather than caching it locally. This lets us update
|
| // the info object when a transfer occurs.
|
| - info->UpdateForTransfer(child_id, route_id, request_data.render_frame_id,
|
| - request_data.origin_pid, request_id,
|
| - filter_->GetWeakPtr(), std::move(mojo_request),
|
| + info->UpdateForTransfer(route_id, request_data.render_frame_id,
|
| + request_data.origin_pid, request_id, requester_info,
|
| + std::move(mojo_request),
|
| std::move(url_loader_client));
|
|
|
| // Update maps that used the old IDs, if necessary. Some transfers in tests
|
| @@ -1184,17 +1191,16 @@ void ResourceDispatcherHostImpl::UpdateRequestForTransfer(
|
| }
|
|
|
| AppCacheInterceptor::CompleteCrossSiteTransfer(
|
| - loader_ptr->request(),
|
| - child_id,
|
| - request_data.appcache_host_id,
|
| - filter_);
|
| + loader_ptr->request(), child_id, request_data.appcache_host_id,
|
| + requester_info);
|
|
|
| ServiceWorkerRequestHandler* handler =
|
| ServiceWorkerRequestHandler::GetHandler(loader_ptr->request());
|
| if (handler) {
|
| - if (!handler->SanityCheckIsSameContext(filter_->service_worker_context())) {
|
| + if (!handler->SanityCheckIsSameContext(
|
| + requester_info->service_worker_context())) {
|
| bad_message::ReceivedBadMessage(
|
| - filter_, bad_message::RDHI_WRONG_STORAGE_PARTITION);
|
| + requester_info->filter(), bad_message::RDHI_WRONG_STORAGE_PARTITION);
|
| } else {
|
| handler->CompleteCrossSiteTransfer(
|
| child_id, request_data.service_worker_provider_id);
|
| @@ -1203,11 +1209,13 @@ void ResourceDispatcherHostImpl::UpdateRequestForTransfer(
|
| }
|
|
|
| void ResourceDispatcherHostImpl::CompleteTransfer(
|
| + ResourceRequesterInfo* requester_info,
|
| int request_id,
|
| const ResourceRequest& request_data,
|
| int route_id,
|
| mojom::URLLoaderAssociatedRequest mojo_request,
|
| mojom::URLLoaderClientAssociatedPtr url_loader_client) {
|
| + DCHECK(requester_info->IsRenderer());
|
| // Caller should ensure that |request_data| is associated with a transfer.
|
| DCHECK(request_data.transferred_request_child_id != -1 ||
|
| request_data.transferred_request_request_id != -1);
|
| @@ -1219,7 +1227,8 @@ void ResourceDispatcherHostImpl::CompleteTransfer(
|
| // Transfers apply only to navigational requests - the renderer seems to
|
| // have sent bogus IPC data.
|
| bad_message::ReceivedBadMessage(
|
| - filter_, bad_message::RDH_TRANSFERRING_NONNAVIGATIONAL_REQUEST);
|
| + requester_info->filter(),
|
| + bad_message::RDH_TRANSFERRING_NONNAVIGATIONAL_REQUEST);
|
| return;
|
| }
|
|
|
| @@ -1243,32 +1252,33 @@ void ResourceDispatcherHostImpl::CompleteTransfer(
|
| // transferred_request_child_id that doesn't correspond to an actually
|
| // transferring loader on the browser side.
|
| base::debug::Alias(pending_loader);
|
| - bad_message::ReceivedBadMessage(filter_,
|
| + bad_message::ReceivedBadMessage(requester_info->filter(),
|
| bad_message::RDH_REQUEST_NOT_TRANSFERRING);
|
| return;
|
| }
|
|
|
| // If the request is transferring to a new process, we can update our
|
| // state and let it resume with its existing ResourceHandlers.
|
| - UpdateRequestForTransfer(filter_->child_id(), route_id, request_id,
|
| - request_data, it, std::move(mojo_request),
|
| + UpdateRequestForTransfer(requester_info, route_id, request_id, request_data,
|
| + it, std::move(mojo_request),
|
| std::move(url_loader_client));
|
| pending_loader->CompleteTransfer();
|
| }
|
|
|
| void ResourceDispatcherHostImpl::BeginRequest(
|
| + ResourceRequesterInfo* requester_info,
|
| int request_id,
|
| const ResourceRequest& request_data,
|
| const SyncLoadResultCallback& sync_result_handler, // only valid for sync
|
| int route_id,
|
| mojom::URLLoaderAssociatedRequest mojo_request,
|
| mojom::URLLoaderClientAssociatedPtr url_loader_client) {
|
| - int process_type = filter_->process_type();
|
| - int child_id = filter_->child_id();
|
| + DCHECK(requester_info->IsRenderer());
|
| + int child_id = requester_info->child_id();
|
|
|
| // Reject request id that's currently in use.
|
| if (IsRequestIDInUse(GlobalRequestID(child_id, request_id))) {
|
| - bad_message::ReceivedBadMessage(filter_,
|
| + bad_message::ReceivedBadMessage(requester_info->filter(),
|
| bad_message::RDH_INVALID_REQUEST_ID);
|
| return;
|
| }
|
| @@ -1277,18 +1287,18 @@ void ResourceDispatcherHostImpl::BeginRequest(
|
| bool is_navigation_stream_request =
|
| IsBrowserSideNavigationEnabled() &&
|
| IsResourceTypeFrame(request_data.resource_type);
|
| - // The process_type check is to ensure that unittests are not blocked from
|
| - // issuing http requests.
|
| - if ((process_type == PROCESS_TYPE_RENDERER) && is_navigation_stream_request
|
| - && !request_data.resource_body_stream_url.SchemeIs(url::kBlobScheme)) {
|
| - bad_message::ReceivedBadMessage(filter_, bad_message::RDH_INVALID_URL);
|
| + if (is_navigation_stream_request &&
|
| + !request_data.resource_body_stream_url.SchemeIs(url::kBlobScheme)) {
|
| + bad_message::ReceivedBadMessage(requester_info->filter(),
|
| + bad_message::RDH_INVALID_URL);
|
| return;
|
| }
|
|
|
| // Reject invalid priority.
|
| if (request_data.priority < net::MINIMUM_PRIORITY ||
|
| request_data.priority > net::MAXIMUM_PRIORITY) {
|
| - bad_message::ReceivedBadMessage(filter_, bad_message::RDH_INVALID_PRIORITY);
|
| + bad_message::ReceivedBadMessage(requester_info->filter(),
|
| + bad_message::RDH_INVALID_PRIORITY);
|
| return;
|
| }
|
|
|
| @@ -1302,15 +1312,15 @@ void ResourceDispatcherHostImpl::BeginRequest(
|
| // we want to reuse and resume the old loader rather than start a new one.
|
| if (request_data.transferred_request_child_id != -1 ||
|
| request_data.transferred_request_request_id != -1) {
|
| - CompleteTransfer(request_id, request_data, route_id,
|
| + CompleteTransfer(requester_info, request_id, request_data, route_id,
|
| std::move(mojo_request), std::move(url_loader_client));
|
| return;
|
| }
|
|
|
| ResourceContext* resource_context = NULL;
|
| net::URLRequestContext* request_context = NULL;
|
| - filter_->GetContexts(request_data.resource_type, &resource_context,
|
| - &request_context);
|
| + requester_info->GetContexts(request_data.resource_type, &resource_context,
|
| + &request_context);
|
|
|
| // Parse the headers before calling ShouldServiceRequest, so that they are
|
| // available to be validated.
|
| @@ -1318,10 +1328,10 @@ void ResourceDispatcherHostImpl::BeginRequest(
|
| headers.AddHeadersFromString(request_data.headers);
|
|
|
| if (is_shutdown_ ||
|
| - !ShouldServiceRequest(process_type, child_id, request_data, headers,
|
| - filter_, resource_context)) {
|
| - AbortRequestBeforeItStarts(filter_, sync_result_handler, request_id,
|
| - std::move(url_loader_client));
|
| + !ShouldServiceRequest(child_id, request_data, headers, requester_info,
|
| + resource_context)) {
|
| + AbortRequestBeforeItStarts(requester_info->filter(), sync_result_handler,
|
| + request_id, std::move(url_loader_client));
|
| return;
|
| }
|
| // Check if we have a registered interceptor for the headers passed in. If
|
| @@ -1344,20 +1354,21 @@ void ResourceDispatcherHostImpl::BeginRequest(
|
| interceptor_info.interceptor.Run(
|
| it.name(), it.value(), child_id, resource_context,
|
| base::Bind(&ResourceDispatcherHostImpl::ContinuePendingBeginRequest,
|
| - base::Unretained(this), request_id, request_data,
|
| - sync_result_handler, route_id, headers,
|
| + base::Unretained(this), requester_info, request_id,
|
| + request_data, sync_result_handler, route_id, headers,
|
| base::Passed(std::move(mojo_request)),
|
| base::Passed(std::move(url_loader_client))));
|
| return;
|
| }
|
| }
|
| }
|
| - ContinuePendingBeginRequest(request_id, request_data, sync_result_handler,
|
| - route_id, headers, std::move(mojo_request),
|
| - std::move(url_loader_client), true, 0);
|
| + ContinuePendingBeginRequest(
|
| + requester_info, request_id, request_data, sync_result_handler, route_id,
|
| + headers, std::move(mojo_request), std::move(url_loader_client), true, 0);
|
| }
|
|
|
| void ResourceDispatcherHostImpl::ContinuePendingBeginRequest(
|
| + scoped_refptr<ResourceRequesterInfo> requester_info,
|
| int request_id,
|
| const ResourceRequest& request_data,
|
| const SyncLoadResultCallback& sync_result_handler, // only valid for sync
|
| @@ -1367,35 +1378,34 @@ void ResourceDispatcherHostImpl::ContinuePendingBeginRequest(
|
| mojom::URLLoaderClientAssociatedPtr url_loader_client,
|
| bool continue_request,
|
| int error_code) {
|
| + DCHECK(requester_info->IsRenderer());
|
| if (!continue_request) {
|
| // TODO(ananta): Find a way to specify the right error code here. Passing
|
| // in a non-content error code is not safe.
|
| - bad_message::ReceivedBadMessage(filter_, bad_message::RDH_ILLEGAL_ORIGIN);
|
| - AbortRequestBeforeItStarts(filter_, sync_result_handler, request_id,
|
| - std::move(url_loader_client));
|
| + bad_message::ReceivedBadMessage(requester_info->filter(),
|
| + bad_message::RDH_ILLEGAL_ORIGIN);
|
| + AbortRequestBeforeItStarts(requester_info->filter(), sync_result_handler,
|
| + request_id, std::move(url_loader_client));
|
| return;
|
| }
|
| -
|
| - int process_type = filter_->process_type();
|
| - int child_id = filter_->child_id();
|
| + int child_id = requester_info->child_id();
|
|
|
| bool is_navigation_stream_request =
|
| IsBrowserSideNavigationEnabled() &&
|
| - IsResourceTypeFrame(request_data.resource_type) &&
|
| - process_type == PROCESS_TYPE_RENDERER;
|
| + IsResourceTypeFrame(request_data.resource_type);
|
|
|
| ResourceContext* resource_context = NULL;
|
| net::URLRequestContext* request_context = NULL;
|
| - filter_->GetContexts(request_data.resource_type, &resource_context,
|
| - &request_context);
|
| + requester_info->GetContexts(request_data.resource_type, &resource_context,
|
| + &request_context);
|
|
|
| // Allow the observer to block/handle the request.
|
| if (delegate_ && !delegate_->ShouldBeginRequest(request_data.method,
|
| request_data.url,
|
| request_data.resource_type,
|
| resource_context)) {
|
| - AbortRequestBeforeItStarts(filter_, sync_result_handler, request_id,
|
| - std::move(url_loader_client));
|
| + AbortRequestBeforeItStarts(requester_info->filter(), sync_result_handler,
|
| + request_id, std::move(url_loader_client));
|
| return;
|
| }
|
|
|
| @@ -1450,7 +1460,7 @@ void ResourceDispatcherHostImpl::ContinuePendingBeginRequest(
|
| new_request->SetExtraRequestHeaders(headers);
|
|
|
| storage::BlobStorageContext* blob_context =
|
| - GetBlobStorageContext(filter_->blob_storage_context());
|
| + GetBlobStorageContext(requester_info->blob_storage_context());
|
| // Resolve elements from request_body and prepare upload data.
|
| if (request_data.request_body.get()) {
|
| // |blob_context| could be null when the request is from the plugins because
|
| @@ -1466,7 +1476,7 @@ void ResourceDispatcherHostImpl::ContinuePendingBeginRequest(
|
| }
|
| new_request->set_upload(UploadDataStreamBuilder::Build(
|
| request_data.request_body.get(), blob_context,
|
| - filter_->file_system_context(),
|
| + requester_info->file_system_context(),
|
| BrowserThread::GetTaskRunnerForThread(BrowserThread::FILE).get()));
|
| }
|
|
|
| @@ -1485,8 +1495,7 @@ void ResourceDispatcherHostImpl::ContinuePendingBeginRequest(
|
| VLOG(1) << "Denied unauthorized request for raw headers";
|
| report_raw_headers = false;
|
| }
|
| - int load_flags =
|
| - BuildLoadFlagsForRequest(request_data, child_id, is_sync_load);
|
| + int load_flags = BuildLoadFlagsForRequest(request_data, is_sync_load);
|
| if (request_data.resource_type == RESOURCE_TYPE_PREFETCH ||
|
| request_data.resource_type == RESOURCE_TYPE_FAVICON) {
|
| do_not_prompt_for_login = true;
|
| @@ -1526,7 +1535,7 @@ void ResourceDispatcherHostImpl::ContinuePendingBeginRequest(
|
|
|
| // Make extra info and read footer (contains request ID).
|
| ResourceRequestInfoImpl* extra_info = new ResourceRequestInfoImpl(
|
| - process_type, child_id, route_id,
|
| + requester_info, route_id,
|
| -1, // frame_tree_node_id
|
| request_data.origin_pid, request_id, request_data.render_frame_id,
|
| request_data.is_main_frame, request_data.parent_is_main_frame,
|
| @@ -1537,8 +1546,8 @@ void ResourceDispatcherHostImpl::ContinuePendingBeginRequest(
|
| allow_download, request_data.has_user_gesture,
|
| request_data.enable_load_timing, request_data.enable_upload_progress,
|
| do_not_prompt_for_login, request_data.referrer_policy,
|
| - request_data.visibility_state, resource_context, filter_->GetWeakPtr(),
|
| - report_raw_headers, !is_sync_load,
|
| + request_data.visibility_state, resource_context, report_raw_headers,
|
| + !is_sync_load,
|
| IsUsingLoFi(request_data.lofi_state, delegate_, *new_request,
|
| resource_context,
|
| request_data.resource_type == RESOURCE_TYPE_MAIN_FRAME),
|
| @@ -1551,9 +1560,9 @@ void ResourceDispatcherHostImpl::ContinuePendingBeginRequest(
|
| // Hang on to a reference to ensure the blob is not released prior
|
| // to the job being started.
|
| storage::BlobProtocolHandler::SetRequestedBlobDataHandle(
|
| - new_request.get(),
|
| - filter_->blob_storage_context()->context()->GetBlobDataFromPublicURL(
|
| - new_request->url()));
|
| + new_request.get(), requester_info->blob_storage_context()
|
| + ->context()
|
| + ->GetBlobDataFromPublicURL(new_request->url()));
|
| }
|
|
|
| // Initialize the service worker handler for the request. We don't use
|
| @@ -1561,7 +1570,7 @@ void ResourceDispatcherHostImpl::ContinuePendingBeginRequest(
|
| const SkipServiceWorker should_skip_service_worker =
|
| is_sync_load ? SkipServiceWorker::ALL : request_data.skip_service_worker;
|
| ServiceWorkerRequestHandler::InitializeHandler(
|
| - new_request.get(), filter_->service_worker_context(), blob_context,
|
| + new_request.get(), requester_info->service_worker_context(), blob_context,
|
| child_id, request_data.service_worker_provider_id,
|
| should_skip_service_worker != SkipServiceWorker::NONE,
|
| request_data.fetch_request_mode, request_data.fetch_credentials_mode,
|
| @@ -1570,7 +1579,7 @@ void ResourceDispatcherHostImpl::ContinuePendingBeginRequest(
|
| request_data.request_body);
|
|
|
| ForeignFetchRequestHandler::InitializeHandler(
|
| - new_request.get(), filter_->service_worker_context(), blob_context,
|
| + new_request.get(), requester_info->service_worker_context(), blob_context,
|
| child_id, request_data.service_worker_provider_id,
|
| should_skip_service_worker, request_data.fetch_request_mode,
|
| request_data.fetch_credentials_mode, request_data.fetch_redirect_mode,
|
| @@ -1580,14 +1589,14 @@ void ResourceDispatcherHostImpl::ContinuePendingBeginRequest(
|
|
|
| // Have the appcache associate its extra info with the request.
|
| AppCacheInterceptor::SetExtraRequestInfo(
|
| - new_request.get(), filter_->appcache_service(), child_id,
|
| + new_request.get(), requester_info->appcache_service(), child_id,
|
| request_data.appcache_host_id, request_data.resource_type,
|
| request_data.should_reset_appcache);
|
|
|
| std::unique_ptr<ResourceHandler> handler(CreateResourceHandler(
|
| - new_request.get(), request_data, sync_result_handler, route_id,
|
| - process_type, child_id, resource_context, std::move(mojo_request),
|
| - std::move(url_loader_client)));
|
| + requester_info.get(), new_request.get(), request_data,
|
| + sync_result_handler, route_id, child_id, resource_context,
|
| + std::move(mojo_request), std::move(url_loader_client)));
|
|
|
| if (handler)
|
| BeginRequestInternal(std::move(new_request), std::move(handler));
|
| @@ -1595,15 +1604,16 @@ void ResourceDispatcherHostImpl::ContinuePendingBeginRequest(
|
|
|
| std::unique_ptr<ResourceHandler>
|
| ResourceDispatcherHostImpl::CreateResourceHandler(
|
| + ResourceRequesterInfo* requester_info,
|
| net::URLRequest* request,
|
| const ResourceRequest& request_data,
|
| const SyncLoadResultCallback& sync_result_handler,
|
| int route_id,
|
| - int process_type,
|
| int child_id,
|
| ResourceContext* resource_context,
|
| mojom::URLLoaderAssociatedRequest mojo_request,
|
| mojom::URLLoaderClientAssociatedPtr url_loader_client) {
|
| + DCHECK(requester_info->IsRenderer());
|
| // TODO(pkasting): Remove ScopedTracker below once crbug.com/456331 is fixed.
|
| tracked_objects::ScopedTracker tracking_profile(
|
| FROM_HERE_WITH_EXPLICIT_FUNCTION(
|
| @@ -1613,7 +1623,8 @@ ResourceDispatcherHostImpl::CreateResourceHandler(
|
| if (sync_result_handler) {
|
| // download_to_file is not supported for synchronous requests.
|
| if (request_data.download_to_file) {
|
| - bad_message::ReceivedBadMessage(filter_, bad_message::RDH_BAD_DOWNLOAD);
|
| + bad_message::ReceivedBadMessage(requester_info->filter(),
|
| + bad_message::RDH_BAD_DOWNLOAD);
|
| return std::unique_ptr<ResourceHandler>();
|
| }
|
|
|
| @@ -1652,10 +1663,20 @@ ResourceDispatcherHostImpl::CreateResourceHandler(
|
| handler = std::move(detachable_handler);
|
| }
|
|
|
| - return AddStandardHandlers(
|
| - request, request_data.resource_type, resource_context,
|
| - request_data.fetch_request_context_type, filter_->appcache_service(),
|
| - child_id, route_id, std::move(handler));
|
| + // PlzNavigate: do not add ResourceThrottles for main resource requests from
|
| + // the renderer. Decisions about the navigation should have been done in the
|
| + // initial request.
|
| + if (IsBrowserSideNavigationEnabled() &&
|
| + IsResourceTypeFrame(request_data.resource_type)) {
|
| + DCHECK(request->url().SchemeIs(url::kBlobScheme));
|
| + return handler;
|
| + }
|
| +
|
| + return AddStandardHandlers(request, request_data.resource_type,
|
| + resource_context,
|
| + request_data.fetch_request_context_type,
|
| + requester_info->appcache_service(), child_id,
|
| + route_id, std::move(handler));
|
| }
|
|
|
| std::unique_ptr<ResourceHandler>
|
| @@ -1668,17 +1689,6 @@ ResourceDispatcherHostImpl::AddStandardHandlers(
|
| int child_id,
|
| int route_id,
|
| std::unique_ptr<ResourceHandler> handler) {
|
| - // PlzNavigate: do not add ResourceThrottles for main resource requests from
|
| - // the renderer. Decisions about the navigation should have been done in the
|
| - // initial request.
|
| - bool is_renderer =
|
| - filter_ ? (filter_->process_type() == PROCESS_TYPE_RENDERER) : false;
|
| - if (is_renderer && IsBrowserSideNavigationEnabled() &&
|
| - IsResourceTypeFrame(resource_type)) {
|
| - DCHECK(request->url().SchemeIs(url::kBlobScheme));
|
| - return handler;
|
| - }
|
| -
|
| // 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|.
|
| @@ -1756,15 +1766,18 @@ ResourceDispatcherHostImpl::AddStandardHandlers(
|
| return handler;
|
| }
|
|
|
| -void ResourceDispatcherHostImpl::OnReleaseDownloadedFile(int request_id) {
|
| - UnregisterDownloadedTempFile(filter_->child_id(), request_id);
|
| +void ResourceDispatcherHostImpl::OnReleaseDownloadedFile(
|
| + ResourceRequesterInfo* requester_info,
|
| + int request_id) {
|
| + UnregisterDownloadedTempFile(requester_info->child_id(), request_id);
|
| }
|
|
|
| void ResourceDispatcherHostImpl::OnDidChangePriority(
|
| + ResourceRequesterInfo* requester_info,
|
| int request_id,
|
| net::RequestPriority new_priority,
|
| int intra_priority_value) {
|
| - ResourceLoader* loader = GetLoader(filter_->child_id(), request_id);
|
| + ResourceLoader* loader = GetLoader(requester_info->child_id(), request_id);
|
| // The request may go away before processing this message, so |loader| can
|
| // legitimately be null.
|
| if (!loader)
|
| @@ -1815,8 +1828,11 @@ bool ResourceDispatcherHostImpl::Send(IPC::Message* message) {
|
| return false;
|
| }
|
|
|
| -void ResourceDispatcherHostImpl::OnCancelRequest(int request_id) {
|
| - CancelRequestFromRenderer(GlobalRequestID(filter_->child_id(), request_id));
|
| +void ResourceDispatcherHostImpl::OnCancelRequest(
|
| + ResourceRequesterInfo* requester_info,
|
| + int request_id) {
|
| + CancelRequestFromRenderer(
|
| + GlobalRequestID(requester_info->child_id(), request_id));
|
| }
|
|
|
| ResourceRequestInfoImpl* ResourceDispatcherHostImpl::CreateRequestInfo(
|
| @@ -1826,7 +1842,8 @@ ResourceRequestInfoImpl* ResourceDispatcherHostImpl::CreateRequestInfo(
|
| bool download,
|
| ResourceContext* context) {
|
| return new ResourceRequestInfoImpl(
|
| - PROCESS_TYPE_RENDERER, child_id, render_view_route_id,
|
| + ResourceRequesterInfo::CreateForDownloadOrPageSave(child_id),
|
| + render_view_route_id,
|
| -1, // frame_tree_node_id
|
| 0, MakeRequestID(), render_frame_route_id,
|
| false, // is_main_frame
|
| @@ -1842,13 +1859,12 @@ ResourceRequestInfoImpl* ResourceDispatcherHostImpl::CreateRequestInfo(
|
| false, // do_not_prompt_for_login
|
| blink::WebReferrerPolicyDefault, blink::WebPageVisibilityStateVisible,
|
| context,
|
| - base::WeakPtr<ResourceMessageFilter>(), // filter
|
| - false, // report_raw_headers
|
| - true, // is_async
|
| - false, // is_using_lofi
|
| - std::string(), // original_headers
|
| - nullptr, // body
|
| - false); // initiated_in_secure_context
|
| + false, // report_raw_headers
|
| + true, // is_async
|
| + false, // is_using_lofi
|
| + std::string(), // original_headers
|
| + nullptr, // body
|
| + false); // initiated_in_secure_context
|
| }
|
|
|
| void ResourceDispatcherHostImpl::OnRenderViewHostCreated(int child_id,
|
| @@ -2188,8 +2204,10 @@ void ResourceDispatcherHostImpl::BeginNavigationRequest(
|
| // TODO(davidben): Associate the request with the FrameTreeNode and/or tab so
|
| // that IO thread -> UI thread hops will work.
|
| ResourceRequestInfoImpl* extra_info = new ResourceRequestInfoImpl(
|
| - PROCESS_TYPE_BROWSER,
|
| - -1, // child_id
|
| + ResourceRequesterInfo::CreateForBrowserSideNavigation(
|
| + service_worker_handle_core
|
| + ? service_worker_handle_core->context_wrapper()
|
| + : scoped_refptr<ServiceWorkerContextWrapper>()),
|
| -1, // route_id
|
| info.frame_tree_node_id,
|
| -1, // request_data.origin_pid,
|
| @@ -2211,9 +2229,8 @@ void ResourceDispatcherHostImpl::BeginNavigationRequest(
|
| // is_showing with something for that. Or maybe it just comes from the
|
| // same mechanism as the cookie one.
|
| blink::WebPageVisibilityStateVisible, resource_context,
|
| - base::WeakPtr<ResourceMessageFilter>(), // filter
|
| info.report_raw_headers,
|
| - true, // is_async
|
| + true, // is_async
|
| IsUsingLoFi(info.common_params.lofi_state, delegate_, *new_request,
|
| resource_context, info.is_main_frame),
|
| // The original_headers field is for stale-while-revalidate but the
|
| @@ -2230,11 +2247,6 @@ void ResourceDispatcherHostImpl::BeginNavigationRequest(
|
| false); // initiated_in_secure_context
|
| extra_info->set_navigation_ui_data(std::move(navigation_ui_data));
|
|
|
| - if (service_worker_handle_core) {
|
| - extra_info->set_service_worker_context(
|
| - service_worker_handle_core->context_wrapper());
|
| - }
|
| -
|
| // Request takes ownership.
|
| extra_info->AssociateWithRequest(new_request.get());
|
|
|
| @@ -2290,29 +2302,25 @@ void ResourceDispatcherHostImpl::OnRenderFrameDeleted(
|
| }
|
|
|
| void ResourceDispatcherHostImpl::OnRequestResourceWithMojo(
|
| + ResourceRequesterInfo* requester_info,
|
| int routing_id,
|
| int request_id,
|
| const ResourceRequest& request,
|
| mojom::URLLoaderAssociatedRequest mojo_request,
|
| - mojom::URLLoaderClientAssociatedPtr url_loader_client,
|
| - ResourceMessageFilter* filter) {
|
| - filter_ = filter;
|
| - OnRequestResourceInternal(routing_id, request_id, request,
|
| + mojom::URLLoaderClientAssociatedPtr url_loader_client) {
|
| + OnRequestResourceInternal(requester_info, routing_id, request_id, request,
|
| std::move(mojo_request),
|
| std::move(url_loader_client));
|
| - filter_ = nullptr;
|
| }
|
|
|
| void ResourceDispatcherHostImpl::OnSyncLoadWithMojo(
|
| + ResourceRequesterInfo* requester_info,
|
| int routing_id,
|
| int request_id,
|
| const ResourceRequest& request_data,
|
| - ResourceMessageFilter* filter,
|
| const SyncLoadResultCallback& result_handler) {
|
| - filter_ = filter;
|
| - BeginRequest(request_id, request_data, result_handler, routing_id,
|
| - nullptr, nullptr);
|
| - filter_ = nullptr;
|
| + BeginRequest(requester_info, request_id, request_data, result_handler,
|
| + routing_id, nullptr, nullptr);
|
| }
|
|
|
| // static
|
| @@ -2711,7 +2719,6 @@ void ResourceDispatcherHostImpl::UnregisterResourceMessageDelegate(
|
|
|
| int ResourceDispatcherHostImpl::BuildLoadFlagsForRequest(
|
| const ResourceRequest& request_data,
|
| - int child_id,
|
| bool is_sync_load) {
|
| int load_flags = request_data.load_flags;
|
|
|
| @@ -2733,11 +2740,10 @@ int ResourceDispatcherHostImpl::BuildLoadFlagsForRequest(
|
| }
|
|
|
| bool ResourceDispatcherHostImpl::ShouldServiceRequest(
|
| - int process_type,
|
| int child_id,
|
| const ResourceRequest& request_data,
|
| const net::HttpRequestHeaders& headers,
|
| - ResourceMessageFilter* filter,
|
| + ResourceRequesterInfo* requester_info,
|
| ResourceContext* resource_context) {
|
| ChildProcessSecurityPolicyImpl* policy =
|
| ChildProcessSecurityPolicyImpl::GetInstance();
|
| @@ -2757,7 +2763,8 @@ bool ResourceDispatcherHostImpl::ShouldServiceRequest(
|
| GURL origin(origin_string);
|
| if (!policy->CanSetAsOriginHeader(child_id, origin)) {
|
| VLOG(1) << "Killed renderer for illegal origin: " << origin_string;
|
| - bad_message::ReceivedBadMessage(filter, bad_message::RDH_ILLEGAL_ORIGIN);
|
| + bad_message::ReceivedBadMessage(requester_info->filter(),
|
| + bad_message::RDH_ILLEGAL_ORIGIN);
|
| return false;
|
| }
|
| }
|
| @@ -2777,7 +2784,8 @@ bool ResourceDispatcherHostImpl::ShouldServiceRequest(
|
| if (iter->type() ==
|
| ResourceRequestBodyImpl::Element::TYPE_FILE_FILESYSTEM) {
|
| storage::FileSystemURL url =
|
| - filter->file_system_context()->CrackURL(iter->filesystem_url());
|
| + requester_info->file_system_context()->CrackURL(
|
| + iter->filesystem_url());
|
| if (!policy->CanReadFileSystemFile(child_id, url)) {
|
| NOTREACHED() << "Denied unauthorized upload of "
|
| << iter->filesystem_url().spec();
|
|
|