diff options
Diffstat (limited to 'chromium/content/renderer/loader')
9 files changed, 96 insertions, 57 deletions
diff --git a/chromium/content/renderer/loader/resource_dispatcher.cc b/chromium/content/renderer/loader/resource_dispatcher.cc index 4f6b3a9ce1c..70b959ead57 100644 --- a/chromium/content/renderer/loader/resource_dispatcher.cc +++ b/chromium/content/renderer/loader/resource_dispatcher.cc @@ -407,6 +407,11 @@ void ResourceDispatcher::OnTransferSizeUpdated(int request_id, transfer_size_diff); } +void ResourceDispatcher::SetCorsExemptHeaderList( + const std::vector<std::string>& list) { + cors_exempt_header_list_ = list; +} + ResourceDispatcher::PendingRequestInfo::PendingRequestInfo( std::unique_ptr<RequestPeer> peer, network::mojom::RequestDestination request_destination, @@ -460,14 +465,14 @@ void ResourceDispatcher::StartSync( base::ThreadPool::CreateSingleThreadTaskRunner({}); task_runner->PostTask( FROM_HERE, - base::BindOnce(&SyncLoadContext::StartAsyncWithWaitableEvent, - std::move(request), routing_id, task_runner, - traffic_annotation, loader_options, - std::move(pending_factory), std::move(throttles), - base::Unretained(response), - base::Unretained(&redirect_or_response_event), - base::Unretained(terminate_sync_load_event_), timeout, - std::move(download_to_blob_registry))); + base::BindOnce( + &SyncLoadContext::StartAsyncWithWaitableEvent, std::move(request), + routing_id, task_runner, traffic_annotation, loader_options, + std::move(pending_factory), std::move(throttles), + base::Unretained(response), + base::Unretained(&redirect_or_response_event), + base::Unretained(terminate_sync_load_event_), timeout, + std::move(download_to_blob_registry), cors_exempt_header_list_)); // redirect_or_response_event will signal when each redirect completes, and // when the final response is complete. @@ -561,7 +566,8 @@ int ResourceDispatcher::StartAsync( blink::ThrottlingURLLoader::CreateLoaderAndStart( std::move(url_loader_factory), std::move(throttles), routing_id, request_id, loader_options, request.get(), client.get(), - traffic_annotation, std::move(loading_task_runner)); + traffic_annotation, std::move(loading_task_runner), + base::make_optional(cors_exempt_header_list_)); pending_request->url_loader = std::move(url_loader); pending_request->url_loader_client = std::move(client); @@ -603,6 +609,9 @@ void ResourceDispatcher::ToLocalURLResponseHead( RemoteToLocalTimeTicks(converter, &load_timing->push_end); RemoteToLocalTimeTicks(converter, &load_timing->service_worker_start_time); RemoteToLocalTimeTicks(converter, &load_timing->service_worker_ready_time); + RemoteToLocalTimeTicks(converter, &load_timing->service_worker_fetch_start); + RemoteToLocalTimeTicks(converter, + &load_timing->service_worker_respond_with_settled); } // TODO(dgozman): this is not used for navigation anymore, only for worker diff --git a/chromium/content/renderer/loader/resource_dispatcher.h b/chromium/content/renderer/loader/resource_dispatcher.h index 949cc1ecdfa..6b291710183 100644 --- a/chromium/content/renderer/loader/resource_dispatcher.h +++ b/chromium/content/renderer/loader/resource_dispatcher.h @@ -14,7 +14,6 @@ #include <string> #include <vector> -#include "base/containers/circular_deque.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/single_thread_task_runner.h" @@ -159,6 +158,13 @@ class CONTENT_EXPORT ResourceDispatcher { void OnTransferSizeUpdated(int request_id, int32_t transfer_size_diff); + // Sets the CORS exempt header list for sanity checking. + void SetCorsExemptHeaderList(const std::vector<std::string>& list); + + std::vector<std::string> cors_exempt_header_list() const { + return cors_exempt_header_list_; + } + // This is used only when |this| is created for a worker thread. // Sets |terminate_sync_load_event_| which will be signaled from the main // thread when the worker thread is being terminated so that the sync requests @@ -253,6 +259,8 @@ class CONTENT_EXPORT ResourceDispatcher { base::WaitableEvent* terminate_sync_load_event_ = nullptr; + std::vector<std::string> cors_exempt_header_list_; + base::WeakPtrFactory<ResourceDispatcher> weak_factory_{this}; DISALLOW_COPY_AND_ASSIGN(ResourceDispatcher); diff --git a/chromium/content/renderer/loader/sync_load_context.cc b/chromium/content/renderer/loader/sync_load_context.cc index ba16da6106d..b246fe3e65b 100644 --- a/chromium/content/renderer/loader/sync_load_context.cc +++ b/chromium/content/renderer/loader/sync_load_context.cc @@ -101,11 +101,13 @@ void SyncLoadContext::StartAsyncWithWaitableEvent( base::WaitableEvent* redirect_or_response_event, base::WaitableEvent* abort_event, base::TimeDelta timeout, - mojo::PendingRemote<blink::mojom::BlobRegistry> download_to_blob_registry) { - auto* context = new SyncLoadContext( - request.get(), std::move(pending_url_loader_factory), response, - redirect_or_response_event, abort_event, timeout, - std::move(download_to_blob_registry), loading_task_runner); + mojo::PendingRemote<blink::mojom::BlobRegistry> download_to_blob_registry, + const std::vector<std::string>& cors_exempt_header_list) { + auto* context = + new SyncLoadContext(request.get(), std::move(pending_url_loader_factory), + response, redirect_or_response_event, abort_event, + timeout, std::move(download_to_blob_registry), + loading_task_runner, cors_exempt_header_list); context->request_id_ = context->resource_dispatcher_->StartAsync( std::move(request), routing_id, std::move(loading_task_runner), traffic_annotation, loader_options, base::WrapUnique(context), @@ -121,7 +123,8 @@ SyncLoadContext::SyncLoadContext( base::WaitableEvent* abort_event, base::TimeDelta timeout, mojo::PendingRemote<blink::mojom::BlobRegistry> download_to_blob_registry, - scoped_refptr<base::SingleThreadTaskRunner> task_runner) + scoped_refptr<base::SingleThreadTaskRunner> task_runner, + const std::vector<std::string>& cors_exempt_header_list) : response_(response), body_watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::MANUAL), download_to_blob_registry_(std::move(download_to_blob_registry)), @@ -138,6 +141,7 @@ SyncLoadContext::SyncLoadContext( // Constructs a new ResourceDispatcher specifically for this request. resource_dispatcher_ = std::make_unique<ResourceDispatcher>(); + resource_dispatcher_->SetCorsExemptHeaderList(cors_exempt_header_list); // Initialize the final URL with the original request URL. It will be // overwritten on redirects. diff --git a/chromium/content/renderer/loader/sync_load_context.h b/chromium/content/renderer/loader/sync_load_context.h index f7565e5dab0..9ba341f04af 100644 --- a/chromium/content/renderer/loader/sync_load_context.h +++ b/chromium/content/renderer/loader/sync_load_context.h @@ -66,8 +66,8 @@ class CONTENT_EXPORT SyncLoadContext : public RequestPeer { base::WaitableEvent* completed_event, base::WaitableEvent* abort_event, base::TimeDelta timeout, - mojo::PendingRemote<blink::mojom::BlobRegistry> - download_to_blob_registry); + mojo::PendingRemote<blink::mojom::BlobRegistry> download_to_blob_registry, + const std::vector<std::string>& cors_exempt_header_list); ~SyncLoadContext() override; @@ -86,7 +86,8 @@ class CONTENT_EXPORT SyncLoadContext : public RequestPeer { base::WaitableEvent* abort_event, base::TimeDelta timeout, mojo::PendingRemote<blink::mojom::BlobRegistry> download_to_blob_registry, - scoped_refptr<base::SingleThreadTaskRunner> task_runner); + scoped_refptr<base::SingleThreadTaskRunner> task_runner, + const std::vector<std::string>& cors_exempt_header_list); // RequestPeer implementation: void OnUploadProgress(uint64_t position, uint64_t size) override; bool OnReceivedRedirect(const net::RedirectInfo& redirect_info, diff --git a/chromium/content/renderer/loader/sync_load_context_unittest.cc b/chromium/content/renderer/loader/sync_load_context_unittest.cc index d4d012d1ac3..3e30786489b 100644 --- a/chromium/content/renderer/loader/sync_load_context_unittest.cc +++ b/chromium/content/renderer/loader/sync_load_context_unittest.cc @@ -104,16 +104,17 @@ class SyncLoadContextTest : public testing::Test { base::WaitableEvent* redirect_or_response_event) { loading_thread_.task_runner()->PostTask( FROM_HERE, - base::BindOnce(&SyncLoadContext::StartAsyncWithWaitableEvent, - std::move(request), MSG_ROUTING_NONE, - loading_thread_.task_runner(), - TRAFFIC_ANNOTATION_FOR_TESTS, 0 /* loader_options */, - std::move(pending_factory), - std::vector<std::unique_ptr<blink::URLLoaderThrottle>>(), - out_response, redirect_or_response_event, - nullptr /* terminate_sync_load_event */, - base::TimeDelta::FromSeconds(60) /* timeout */, - mojo::NullRemote() /* download_to_blob_registry */)); + base::BindOnce( + &SyncLoadContext::StartAsyncWithWaitableEvent, std::move(request), + MSG_ROUTING_NONE, loading_thread_.task_runner(), + TRAFFIC_ANNOTATION_FOR_TESTS, 0 /* loader_options */, + std::move(pending_factory), + std::vector<std::unique_ptr<blink::URLLoaderThrottle>>(), + out_response, redirect_or_response_event, + nullptr /* terminate_sync_load_event */, + base::TimeDelta::FromSeconds(60) /* timeout */, + mojo::NullRemote() /* download_to_blob_registry */, + std::vector<std::string>() /* cors_exempt_header_list */)); } static void RunSyncLoadContextViaDataPipe( @@ -128,7 +129,8 @@ class SyncLoadContextTest : public testing::Test { response, redirect_or_response_event, nullptr /* terminate_sync_load_event */, base::TimeDelta::FromSeconds(60) /* timeout */, - mojo::NullRemote() /* download_to_blob_registry */, task_runner); + mojo::NullRemote() /* download_to_blob_registry */, task_runner, + std::vector<std::string>() /* cors_exempt_header_list */); // Override |resource_dispatcher_| for testing. auto dispatcher = std::make_unique<MockResourceDispatcher>(); diff --git a/chromium/content/renderer/loader/web_url_loader_impl.cc b/chromium/content/renderer/loader/web_url_loader_impl.cc index a506772220c..d571a441bfd 100644 --- a/chromium/content/renderer/loader/web_url_loader_impl.cc +++ b/chromium/content/renderer/loader/web_url_loader_impl.cc @@ -118,9 +118,11 @@ network::mojom::LoadTimingInfo ToMojoLoadTiming( load_timing.proxy_resolve_start, load_timing.proxy_resolve_end, load_timing.connect_timing, load_timing.send_start, load_timing.send_end, load_timing.receive_headers_start, load_timing.receive_headers_end, - load_timing.push_start, load_timing.push_end, - load_timing.service_worker_start_time, - load_timing.service_worker_ready_time); + load_timing.first_early_hints_time, load_timing.push_start, + load_timing.push_end, load_timing.service_worker_start_time, + load_timing.service_worker_ready_time, + load_timing.service_worker_fetch_start, + load_timing.service_worker_respond_with_settled); } // This is complementary to ConvertNetPriorityToWebKitPriority, defined in @@ -927,12 +929,14 @@ void WebURLLoaderImpl::PopulateURLResponse( response->SetConnectionReused(head.load_timing.socket_reused); response->SetWasFetchedViaSPDY(head.was_fetched_via_spdy); response->SetWasFetchedViaServiceWorker(head.was_fetched_via_service_worker); + response->SetServiceWorkerResponseSource(head.service_worker_response_source); response->SetWasFallbackRequiredByServiceWorker( head.was_fallback_required_by_service_worker); response->SetType(head.response_type); response->SetUrlListViaServiceWorker(head.url_list_via_service_worker); response->SetCacheStorageCacheName( - head.is_in_cache_storage + head.service_worker_response_source == + network::mojom::FetchResponseSource::kCacheStorage ? blink::WebString::FromUTF8(head.cache_storage_cache_name) : blink::WebString()); blink::WebVector<blink::WebString> cors_exposed_header_names( @@ -1112,7 +1116,7 @@ void WebURLLoaderImpl::LoadSynchronously( WebString::FromLatin1(sync_load_response.downloaded_blob->uuid), WebString::FromLatin1(sync_load_response.downloaded_blob->content_type), sync_load_response.downloaded_blob->size, - sync_load_response.downloaded_blob->blob.PassPipe()); + std::move(sync_load_response.downloaded_blob->blob)); } data.Assign(sync_load_response.data.data(), sync_load_response.data.size()); diff --git a/chromium/content/renderer/loader/web_url_request_util.cc b/chromium/content/renderer/loader/web_url_request_util.cc index 3c58401723c..e351493f1c9 100644 --- a/chromium/content/renderer/loader/web_url_request_util.cc +++ b/chromium/content/renderer/loader/web_url_request_util.cc @@ -149,7 +149,7 @@ WebHTTPBody GetWebHTTPBodyForRequestBody( http_body.AppendBlob(WebString::FromASCII(element.blob_uuid())); break; case network::mojom::DataElementType::kDataPipe: { - http_body.AppendDataPipe(element.CloneDataPipeGetter().PassPipe()); + http_body.AppendDataPipe(element.CloneDataPipeGetter()); break; } case network::mojom::DataElementType::kUnknown: @@ -203,11 +203,10 @@ scoped_refptr<network::ResourceRequestBody> GetRequestBodyForWebHTTPBody( } break; case WebHTTPBody::Element::kTypeBlob: { - DCHECK(element.optional_blob_handle.is_valid()); + DCHECK(element.optional_blob); mojo::Remote<blink::mojom::Blob> blob_remote( mojo::PendingRemote<blink::mojom::Blob>( - std::move(element.optional_blob_handle), - blink::mojom::Blob::Version_)); + std::move(element.optional_blob))); mojo::PendingRemote<network::mojom::DataPipeGetter> data_pipe_getter_remote; @@ -222,7 +221,7 @@ scoped_refptr<network::ResourceRequestBody> GetRequestBodyForWebHTTPBody( // mojo::Remote<network::mojom::DataPipeGetter> data_pipe_getter. mojo::Remote<network::mojom::DataPipeGetter> data_pipe_getter( mojo::PendingRemote<network::mojom::DataPipeGetter>( - std::move(element.data_pipe_getter), 0u)); + std::move(element.data_pipe_getter))); // Set the cloned DataPipeGetter to the output |request_body|, while // keeping the original message pipe back in the input |httpBody|. This @@ -231,7 +230,7 @@ scoped_refptr<network::ResourceRequestBody> GetRequestBodyForWebHTTPBody( mojo::PendingRemote<network::mojom::DataPipeGetter> cloned_getter; data_pipe_getter->Clone(cloned_getter.InitWithNewPipeAndPassReceiver()); request_body->AppendDataPipe(std::move(cloned_getter)); - element.data_pipe_getter = data_pipe_getter.Unbind().PassPipe(); + element.data_pipe_getter = data_pipe_getter.Unbind(); break; } } diff --git a/chromium/content/renderer/loader/web_worker_fetch_context_impl.cc b/chromium/content/renderer/loader/web_worker_fetch_context_impl.cc index 5e7b8b3b7e8..505f87fef07 100644 --- a/chromium/content/renderer/loader/web_worker_fetch_context_impl.cc +++ b/chromium/content/renderer/loader/web_worker_fetch_context_impl.cc @@ -171,7 +171,8 @@ scoped_refptr<WebWorkerFetchContextImpl> WebWorkerFetchContextImpl::Create( std::unique_ptr<network::PendingSharedURLLoaderFactory> pending_fallback_factory, mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater> - pending_subresource_loader_updater) { + pending_subresource_loader_updater, + const std::vector<std::string>& cors_exempt_header_list) { mojo::PendingReceiver<blink::mojom::ServiceWorkerWorkerClient> service_worker_client_receiver; mojo::PendingRemote<blink::mojom::ServiceWorkerWorkerClientRegistry> @@ -209,7 +210,8 @@ scoped_refptr<WebWorkerFetchContextImpl> WebWorkerFetchContextImpl::Create( ->renderer() ->CreateWebSocketHandshakeThrottleProvider(), ChildThreadImpl::current()->thread_safe_sender(), - ChildThreadImpl::current()->child_process_host())); + ChildThreadImpl::current()->child_process_host(), + cors_exempt_header_list)); if (provider_context) { worker_fetch_context->set_controller_service_worker_mode( provider_context->GetControllerServiceWorkerMode()); @@ -241,7 +243,8 @@ WebWorkerFetchContextImpl::WebWorkerFetchContextImpl( std::unique_ptr<WebSocketHandshakeThrottleProvider> websocket_handshake_throttle_provider, ThreadSafeSender* thread_safe_sender, - mojo::SharedRemote<mojom::ChildProcessHost> process_host) + mojo::SharedRemote<mojom::ChildProcessHost> process_host, + const std::vector<std::string>& cors_exempt_header_list) : service_worker_client_receiver_( std::move(service_worker_client_receiver)), pending_service_worker_worker_client_registry_( @@ -259,7 +262,8 @@ WebWorkerFetchContextImpl::WebWorkerFetchContextImpl( throttle_provider_(std::move(throttle_provider)), websocket_handshake_throttle_provider_( std::move(websocket_handshake_throttle_provider)), - process_host_(std::move(process_host)) {} + process_host_(std::move(process_host)), + cors_exempt_header_list_(cors_exempt_header_list) {} WebWorkerFetchContextImpl::~WebWorkerFetchContextImpl() {} @@ -373,6 +377,7 @@ void WebWorkerFetchContextImpl::InitializeOnWorkerThread( DCHECK(!receiver_.is_bound()); DCHECK(!preference_watcher_receiver_.is_bound()); resource_dispatcher_ = std::make_unique<ResourceDispatcher>(); + resource_dispatcher_->SetCorsExemptHeaderList(cors_exempt_header_list_); resource_dispatcher_->set_terminate_sync_load_event( terminate_sync_load_event_); @@ -424,13 +429,12 @@ blink::WebURLLoaderFactory* WebWorkerFetchContextImpl::GetURLLoaderFactory() { std::unique_ptr<blink::WebURLLoaderFactory> WebWorkerFetchContextImpl::WrapURLLoaderFactory( - mojo::ScopedMessagePipeHandle url_loader_factory_handle) { + blink::CrossVariantMojoRemote<network::mojom::URLLoaderFactoryInterfaceBase> + url_loader_factory) { return std::make_unique<WebURLLoaderFactoryImpl>( resource_dispatcher_->GetWeakPtr(), base::MakeRefCounted<network::WrapperSharedURLLoaderFactory>( - mojo::PendingRemote<network::mojom::URLLoaderFactory>( - std::move(url_loader_factory_handle), - network::mojom::URLLoaderFactory::Version_))); + std::move(url_loader_factory))); } std::unique_ptr<blink::CodeCacheLoader> @@ -534,7 +538,8 @@ WebWorkerFetchContextImpl::CreateWebSocketHandshakeThrottle( ancestor_frame_id_, std::move(task_runner)); } -mojo::ScopedMessagePipeHandle +blink::CrossVariantMojoReceiver< + blink::mojom::WorkerTimingContainerInterfaceBase> WebWorkerFetchContextImpl::TakePendingWorkerTimingReceiver(int request_id) { auto iter = worker_timing_container_receivers_.find(request_id); if (iter == worker_timing_container_receivers_.end()) { @@ -542,7 +547,7 @@ WebWorkerFetchContextImpl::TakePendingWorkerTimingReceiver(int request_id) { } auto receiver = std::move(iter->second); worker_timing_container_receivers_.erase(iter); - return receiver.PassPipe(); + return std::move(receiver); } void WebWorkerFetchContextImpl::SetIsOfflineMode(bool is_offline_mode) { @@ -620,7 +625,7 @@ WebWorkerFetchContextImpl::CloneForNestedWorkerInternal( ? websocket_handshake_throttle_provider_->Clone( std::move(task_runner)) : nullptr, - thread_safe_sender_.get(), process_host_)); + thread_safe_sender_.get(), process_host_, cors_exempt_header_list_)); new_context->is_on_sub_frame_ = is_on_sub_frame_; new_context->ancestor_frame_id_ = ancestor_frame_id_; new_context->frame_request_blocker_ = frame_request_blocker_; diff --git a/chromium/content/renderer/loader/web_worker_fetch_context_impl.h b/chromium/content/renderer/loader/web_worker_fetch_context_impl.h index 6d08e2d5be3..8a45725b471 100644 --- a/chromium/content/renderer/loader/web_worker_fetch_context_impl.h +++ b/chromium/content/renderer/loader/web_worker_fetch_context_impl.h @@ -85,7 +85,8 @@ class CONTENT_EXPORT WebWorkerFetchContextImpl std::unique_ptr<network::PendingSharedURLLoaderFactory> pending_fallback_factory, mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater> - pending_subresource_loader_updater); + pending_subresource_loader_updater, + const std::vector<std::string>& cors_exempt_header_list); // Clones this fetch context for a nested worker. // For non-PlzDedicatedWorker. This will be removed once PlzDedicatedWorker is @@ -110,7 +111,9 @@ class CONTENT_EXPORT WebWorkerFetchContextImpl void InitializeOnWorkerThread(blink::AcceptLanguagesWatcher*) override; blink::WebURLLoaderFactory* GetURLLoaderFactory() override; std::unique_ptr<blink::WebURLLoaderFactory> WrapURLLoaderFactory( - mojo::ScopedMessagePipeHandle url_loader_factory_handle) override; + blink::CrossVariantMojoRemote< + network::mojom::URLLoaderFactoryInterfaceBase> url_loader_factory) + override; std::unique_ptr<blink::CodeCacheLoader> CreateCodeCacheLoader() override; void WillSendRequest(blink::WebURLRequest&) override; blink::mojom::ControllerServiceWorkerMode GetControllerServiceWorkerMode() @@ -130,8 +133,9 @@ class CONTENT_EXPORT WebWorkerFetchContextImpl std::unique_ptr<blink::WebSocketHandshakeThrottle> CreateWebSocketHandshakeThrottle( scoped_refptr<base::SingleThreadTaskRunner> task_runner) override; - mojo::ScopedMessagePipeHandle TakePendingWorkerTimingReceiver( - int request_id) override; + blink::CrossVariantMojoReceiver< + blink::mojom::WorkerTimingContainerInterfaceBase> + TakePendingWorkerTimingReceiver(int request_id) override; void SetIsOfflineMode(bool is_offline_mode) override; // blink::mojom::ServiceWorkerWorkerClient implementation: @@ -215,7 +219,8 @@ class CONTENT_EXPORT WebWorkerFetchContextImpl std::unique_ptr<WebSocketHandshakeThrottleProvider> websocket_handshake_throttle_provider, ThreadSafeSender* thread_safe_sender, - mojo::SharedRemote<mojom::ChildProcessHost> process_host); + mojo::SharedRemote<mojom::ChildProcessHost> process_host, + const std::vector<std::string>& cors_exempt_header_list); ~WebWorkerFetchContextImpl() override; @@ -359,6 +364,8 @@ class CONTENT_EXPORT WebWorkerFetchContextImpl mojo::SharedRemote<mojom::ChildProcessHost> process_host_; + std::vector<std::string> cors_exempt_header_list_; + std::unique_ptr<NavigationResponseOverrideParameters> response_override_; blink::AcceptLanguagesWatcher* accept_languages_watcher_ = nullptr; |