Chromium Code Reviews| Index: content/browser/service_worker/service_worker_provider_host.cc |
| diff --git a/content/browser/service_worker/service_worker_provider_host.cc b/content/browser/service_worker/service_worker_provider_host.cc |
| index cdd522f45a785e33cd3f6e474b7166868c142594..619f1e466786b8239916b659f927f949c99cf4ff 100644 |
| --- a/content/browser/service_worker/service_worker_provider_host.cc |
| +++ b/content/browser/service_worker/service_worker_provider_host.cc |
| @@ -19,6 +19,7 @@ |
| #include "content/browser/service_worker/service_worker_handle.h" |
| #include "content/browser/service_worker/service_worker_registration_handle.h" |
| #include "content/browser/service_worker/service_worker_version.h" |
| +#include "content/browser/url_loader_factory_getter.h" |
| #include "content/common/resource_request_body_impl.h" |
| #include "content/common/service_worker/service_worker_messages.h" |
| #include "content/common/service_worker/service_worker_types.h" |
| @@ -31,6 +32,7 @@ |
| #include "content/public/common/origin_util.h" |
| #include "mojo/public/cpp/bindings/strong_associated_binding.h" |
| #include "net/base/url_util.h" |
| +#include "storage/browser/blob/blob_storage_context.h" |
| namespace content { |
| @@ -98,6 +100,152 @@ void RemoveProviderHost(base::WeakPtr<ServiceWorkerContextCore> context, |
| context->RemoveProviderHost(process_id, provider_id); |
| } |
| +// Used by a Service Worker for script loading (only during installation, |
| +// eventually). For now this is just a proxy loader for the network loader. |
|
falken
2017/06/16 04:24:56
It's a little hard to grok the parenthetical comme
kinuko
2017/06/16 09:15:15
Yep, rephrased it a bit to make it a little cleare
|
| +// TODO(kinuko): Implement this. Hook up the existing code in |
| +// ServiceWorkerContextRequestHandler. |
| +class ScriptURLLoader : public mojom::URLLoader, public mojom::URLLoaderClient { |
| + public: |
| + ScriptURLLoader( |
| + int32_t routing_id, |
| + int32_t request_id, |
| + uint32_t options, |
| + const ResourceRequest& url_request, |
|
falken
2017/06/16 04:24:56
Slightly nicer to say script_url instead of url_re
falken
2017/06/16 04:26:54
Ah, maybe not nicer. A ResourceRequest is not a UR
kinuko
2017/06/16 09:15:15
Ack. (I renamed it to resource_request just to cla
|
| + mojom::URLLoaderClientPtr client, |
| + base::WeakPtr<ServiceWorkerContextCore> context, |
| + base::WeakPtr<ServiceWorkerProviderHost> provider_host, |
| + base::WeakPtr<storage::BlobStorageContext> blob_storage_context, |
| + scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter, |
| + const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) |
| + : network_client_binding_(this), |
| + forwarding_client_(std::move(client)), |
| + provider_host_(provider_host) { |
| + mojom::URLLoaderClientPtr network_client; |
| + network_client_binding_.Bind(mojo::MakeRequest(&network_client)); |
| + loader_factory_getter->GetNetworkFactory()->get()->CreateLoaderAndStart( |
| + mojo::MakeRequest(&network_loader_), routing_id, request_id, options, |
| + url_request, std::move(network_client), traffic_annotation); |
| + } |
| + ~ScriptURLLoader() override {} |
| + |
| + // mojom::URLLoader: |
| + void FollowRedirect() override { network_loader_->FollowRedirect(); } |
| + void SetPriority(net::RequestPriority priority, |
| + int32_t intra_priority_value) override { |
| + network_loader_->SetPriority(priority, intra_priority_value); |
| + } |
| + |
| + // mojom::URLLoaderClient for simply proxying network: |
| + void OnReceiveResponse( |
| + const ResourceResponseHead& response_head, |
| + const base::Optional<net::SSLInfo>& ssl_info, |
| + mojom::DownloadedTempFilePtr downloaded_file) override { |
| + if (provider_host_) { |
| + // We don't have complete info here, but fill in what we have now. |
| + // At least we need headers and SSL info. |
| + net::HttpResponseInfo response_info; |
| + response_info.headers = response_head.headers; |
| + if (ssl_info.has_value()) |
| + response_info.ssl_info = *ssl_info; |
| + response_info.was_fetched_via_spdy = response_head.was_fetched_via_spdy; |
| + response_info.was_alpn_negotiated = response_head.was_alpn_negotiated; |
| + response_info.alpn_negotiated_protocol = |
| + response_head.alpn_negotiated_protocol; |
| + response_info.connection_info = response_head.connection_info; |
| + response_info.socket_address = response_head.socket_address; |
| + |
| + DCHECK(provider_host_->IsHostToRunningServiceWorker()); |
| + provider_host_->running_hosted_version()->SetMainScriptHttpResponseInfo( |
| + response_info); |
| + } |
| + forwarding_client_->OnReceiveResponse(response_head, ssl_info, |
| + std::move(downloaded_file)); |
| + } |
| + void OnReceiveRedirect(const net::RedirectInfo& redirect_info, |
| + const ResourceResponseHead& response_head) override { |
| + forwarding_client_->OnReceiveRedirect(redirect_info, response_head); |
| + } |
| + void OnDataDownloaded(int64_t data_len, int64_t encoded_data_len) override { |
| + forwarding_client_->OnDataDownloaded(data_len, encoded_data_len); |
| + } |
| + void OnUploadProgress(int64_t current_position, |
| + int64_t total_size, |
| + OnUploadProgressCallback ack_callback) override { |
| + forwarding_client_->OnUploadProgress(current_position, total_size, |
| + std::move(ack_callback)); |
| + } |
| + void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override { |
| + forwarding_client_->OnReceiveCachedMetadata(data); |
| + } |
| + void OnTransferSizeUpdated(int32_t transfer_size_diff) override { |
| + forwarding_client_->OnTransferSizeUpdated(transfer_size_diff); |
| + } |
| + void OnStartLoadingResponseBody( |
| + mojo::ScopedDataPipeConsumerHandle body) override { |
| + forwarding_client_->OnStartLoadingResponseBody(std::move(body)); |
| + } |
| + void OnComplete(const ResourceRequestCompletionStatus& status) override { |
| + forwarding_client_->OnComplete(status); |
| + } |
| + |
| + private: |
| + mojom::URLLoaderAssociatedPtr network_loader_; |
| + mojo::Binding<mojom::URLLoaderClient> network_client_binding_; |
| + mojom::URLLoaderClientPtr forwarding_client_; |
| + base::WeakPtr<ServiceWorkerProviderHost> provider_host_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(ScriptURLLoader); |
| +}; |
| + |
| +// Created per one controller worker for script loading (only during |
| +// installation, eventually). This is kept alive while |
| +// ServiceWorkerNetworkProvider in the renderer process is alive. |
| +// Used only when IsServicificationEnabled is true. |
| +class ScriptURLLoaderFactory : public mojom::URLLoaderFactory { |
| + public: |
| + ScriptURLLoaderFactory( |
| + base::WeakPtr<ServiceWorkerContextCore> context, |
| + base::WeakPtr<ServiceWorkerProviderHost> provider_host, |
| + base::WeakPtr<storage::BlobStorageContext> blob_storage_context, |
| + scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter) |
| + : context_(context), |
| + provider_host_(provider_host), |
| + blob_storage_context_(blob_storage_context), |
| + loader_factory_getter_(loader_factory_getter) {} |
| + ~ScriptURLLoaderFactory() override {} |
| + |
| + // mojom::URLLoaderFactory: |
| + void CreateLoaderAndStart(mojom::URLLoaderAssociatedRequest request, |
| + int32_t routing_id, |
| + int32_t request_id, |
| + uint32_t options, |
| + const ResourceRequest& url_request, |
|
falken
2017/06/16 04:24:56
script_url?
kinuko
2017/06/16 09:15:15
Renamed it to resource_request.
|
| + mojom::URLLoaderClientPtr client, |
| + const net::MutableNetworkTrafficAnnotationTag& |
| + traffic_annotation) override { |
| + mojo::MakeStrongAssociatedBinding( |
| + base::MakeUnique<ScriptURLLoader>( |
| + routing_id, request_id, options, url_request, std::move(client), |
| + context_, provider_host_, blob_storage_context_, |
| + loader_factory_getter_, traffic_annotation), |
| + std::move(request)); |
| + } |
| + |
| + void SyncLoad(int32_t routing_id, |
| + int32_t request_id, |
| + const ResourceRequest& request, |
| + SyncLoadCallback callback) override { |
| + NOTREACHED(); |
| + } |
| + |
| + private: |
| + base::WeakPtr<ServiceWorkerContextCore> context_; |
| + base::WeakPtr<ServiceWorkerProviderHost> provider_host_; |
| + base::WeakPtr<storage::BlobStorageContext> blob_storage_context_; |
| + scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter_; |
| + DISALLOW_COPY_AND_ASSIGN(ScriptURLLoaderFactory); |
| +}; |
| + |
| } // anonymous namespace |
| ServiceWorkerProviderHost::OneShotGetReadyCallback::OneShotGetReadyCallback( |
| @@ -589,6 +737,7 @@ bool ServiceWorkerProviderHost::GetRegistrationForReady( |
| std::unique_ptr<ServiceWorkerProviderHost> |
| ServiceWorkerProviderHost::PrepareForCrossSiteTransfer() { |
| DCHECK(!IsBrowserSideNavigationEnabled()); |
| + DCHECK(!ServiceWorkerUtils::IsServicificationEnabled()); |
| DCHECK_NE(ChildProcessHost::kInvalidUniqueID, render_process_id_); |
| DCHECK_NE(MSG_ROUTING_NONE, info_.route_id); |
| DCHECK_EQ(kDocumentMainThreadId, render_thread_id_); |
| @@ -622,6 +771,7 @@ ServiceWorkerProviderHost::PrepareForCrossSiteTransfer() { |
| void ServiceWorkerProviderHost::CompleteCrossSiteTransfer( |
| ServiceWorkerProviderHost* provisional_host) { |
| DCHECK(!IsBrowserSideNavigationEnabled()); |
| + DCHECK(!ServiceWorkerUtils::IsServicificationEnabled()); |
| DCHECK_EQ(ChildProcessHost::kInvalidUniqueID, render_process_id_); |
| DCHECK_NE(ChildProcessHost::kInvalidUniqueID, provisional_host->process_id()); |
| DCHECK_NE(MSG_ROUTING_NONE, provisional_host->frame_id()); |
| @@ -710,6 +860,15 @@ void ServiceWorkerProviderHost::CompleteStartWorkerPreparation( |
| dispatcher_host->GetRegistrationObjectInfoAndVersionAttributes( |
| AsWeakPtr(), registration, &info, &attrs); |
| + mojom::URLLoaderFactoryAssociatedPtr loader_factory_ptr; |
|
shimazu
2017/06/16 04:45:07
I think you can use mojom::URLLoaderFactoryAssocia
kinuko
2017/06/16 09:15:15
Cool, done.
|
| + if (ServiceWorkerUtils::IsServicificationEnabled()) { |
| + mojo::MakeStrongAssociatedBinding( |
| + base::MakeUnique<ScriptURLLoaderFactory>( |
| + context_, AsWeakPtr(), context_->blob_storage_context(), |
| + context_->loader_factory_getter()), |
| + mojo::MakeRequest(&loader_factory_ptr)); |
| + } |
| + |
| // Initialize provider_client_info. |
| (*out_provider_client_info)->provider_id = provider_id(); |
| (*out_provider_client_info)->type = provider_type(); |
| @@ -718,6 +877,9 @@ void ServiceWorkerProviderHost::CompleteStartWorkerPreparation( |
| (*out_provider_client_info)->is_parent_frame_secure = |
| is_parent_frame_secure(); |
| (*out_provider_client_info)->client_request = mojo::MakeRequest(&provider_); |
| + (*out_provider_client_info)->script_loader_factory_ptr_info = |
| + loader_factory_ptr.PassInterface(); |
| + |
| auto* host_ptr_info_ptr = &(*out_provider_client_info)->host_ptr_info; |
| binding_.Bind(mojo::MakeRequest(host_ptr_info_ptr)); |
| binding_.set_connection_error_handler( |