| OLD | NEW |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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 #include "content/browser/service_worker/service_worker_url_job_wrapper.h" | 5 #include "content/browser/service_worker/service_worker_url_job_wrapper.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "content/browser/service_worker/service_worker_response_type.h" | 8 #include "content/browser/service_worker/service_worker_response_type.h" |
| 9 #include "content/browser/service_worker/service_worker_version.h" | 9 #include "content/browser/service_worker/service_worker_version.h" |
| 10 #include "content/common/service_worker/service_worker_utils.h" | 10 #include "content/common/service_worker/service_worker_utils.h" |
| 11 #include "content/public/browser/browser_thread.h" | 11 #include "content/public/browser/browser_thread.h" |
| 12 #include "content/public/browser/resource_request_info.h" | 12 #include "content/public/browser/resource_request_info.h" |
| 13 #include "content/public/common/browser_side_navigation_policy.h" | 13 #include "content/public/common/browser_side_navigation_policy.h" |
| 14 #include "content/public/common/content_switches.h" | 14 #include "content/public/common/content_switches.h" |
| 15 #include "mojo/public/cpp/bindings/strong_associated_binding.h" | 15 #include "mojo/public/cpp/bindings/strong_associated_binding.h" |
| 16 #include "net/base/io_buffer.h" | 16 #include "net/base/io_buffer.h" |
| 17 #include "storage/browser/blob/blob_storage_context.h" | 17 #include "storage/browser/blob/blob_storage_context.h" |
| 18 | 18 |
| 19 namespace content { | 19 namespace content { |
| 20 | 20 |
| 21 namespace { | 21 namespace { |
| 22 | 22 |
| 23 class URLLoaderImpl : public mojom::URLLoader { | 23 class URLLoaderImpl : public mojom::URLLoader { |
| 24 public: | 24 public: |
| 25 static void Start( |
| 26 const ServiceWorkerResponse& response, |
| 27 blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream, |
| 28 base::WeakPtr<storage::BlobStorageContext> blob_storage_context, |
| 29 mojom::URLLoaderAssociatedRequest request, |
| 30 mojom::URLLoaderClientPtr client) { |
| 31 mojo::MakeStrongAssociatedBinding( |
| 32 base::MakeUnique<URLLoaderImpl>(response, std::move(body_as_stream), |
| 33 blob_storage_context, |
| 34 std::move(client)), |
| 35 std::move(request)); |
| 36 } |
| 37 |
| 25 URLLoaderImpl(const ServiceWorkerResponse& response, | 38 URLLoaderImpl(const ServiceWorkerResponse& response, |
| 26 blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream, | 39 blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream, |
| 27 base::WeakPtr<storage::BlobStorageContext> blob_storage_context, | 40 base::WeakPtr<storage::BlobStorageContext> blob_storage_context, |
| 28 mojom::URLLoaderClientPtr url_loader_client) | 41 mojom::URLLoaderClientPtr url_loader_client) |
| 29 : blob_storage_context_(blob_storage_context), | 42 : blob_storage_context_(blob_storage_context), |
| 30 url_loader_client_(std::move(url_loader_client)), | 43 url_loader_client_(std::move(url_loader_client)), |
| 31 weak_factory_(this) { | 44 weak_factory_(this) { |
| 32 ResourceResponseHead head; | 45 ResourceResponseHead head; |
| 33 // TODO(scottmg): More fields in |head| required? | 46 // TODO(scottmg): More fields in |head| required? |
| 34 head.headers = new net::HttpResponseHeaders(""); | 47 head.headers = new net::HttpResponseHeaders(""); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 std::unique_ptr<storage::BlobReader> blob_reader_; | 108 std::unique_ptr<storage::BlobReader> blob_reader_; |
| 96 mojo::DataPipe data_pipe_; | 109 mojo::DataPipe data_pipe_; |
| 97 | 110 |
| 98 base::WeakPtrFactory<URLLoaderImpl> weak_factory_; | 111 base::WeakPtrFactory<URLLoaderImpl> weak_factory_; |
| 99 | 112 |
| 100 DISALLOW_COPY_AND_ASSIGN(URLLoaderImpl); | 113 DISALLOW_COPY_AND_ASSIGN(URLLoaderImpl); |
| 101 }; | 114 }; |
| 102 | 115 |
| 103 } // namespace | 116 } // namespace |
| 104 | 117 |
| 105 class ServiceWorkerURLJobWrapper::Factory : public mojom::URLLoaderFactory { | |
| 106 public: | |
| 107 Factory(const ServiceWorkerResponse& response, | |
| 108 blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream, | |
| 109 base::WeakPtr<storage::BlobStorageContext> blob_storage_context) | |
| 110 : response_(response), | |
| 111 body_as_stream_(std::move(body_as_stream)), | |
| 112 blob_storage_context_(blob_storage_context) {} | |
| 113 | |
| 114 void CreateLoaderAndStart(mojom::URLLoaderAssociatedRequest request, | |
| 115 int32_t routing_id, | |
| 116 int32_t request_id, | |
| 117 uint32_t options, | |
| 118 const ResourceRequest& url_request, | |
| 119 mojom::URLLoaderClientPtr client) override { | |
| 120 // Note that url_request is ignored here, as we've already processed the | |
| 121 // fetch before even creating the factory. | |
| 122 // TODO(scottmg): Use options. | |
| 123 mojo::MakeStrongAssociatedBinding( | |
| 124 base::MakeUnique<URLLoaderImpl>(response_, std::move(body_as_stream_), | |
| 125 blob_storage_context_, | |
| 126 std::move(client)), | |
| 127 std::move(request)); | |
| 128 } | |
| 129 | |
| 130 void SyncLoad(int32_t routing_id, | |
| 131 int32_t request_id, | |
| 132 const ResourceRequest& url_request, | |
| 133 SyncLoadCallback callback) override { | |
| 134 NOTREACHED(); | |
| 135 } | |
| 136 | |
| 137 private: | |
| 138 ServiceWorkerResponse response_; | |
| 139 blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream_; | |
| 140 base::WeakPtr<storage::BlobStorageContext> blob_storage_context_; | |
| 141 | |
| 142 DISALLOW_COPY_AND_ASSIGN(Factory); | |
| 143 }; | |
| 144 | |
| 145 ServiceWorkerURLJobWrapper::ServiceWorkerURLJobWrapper( | 118 ServiceWorkerURLJobWrapper::ServiceWorkerURLJobWrapper( |
| 146 base::WeakPtr<ServiceWorkerURLRequestJob> url_request_job) | 119 base::WeakPtr<ServiceWorkerURLRequestJob> url_request_job) |
| 147 : job_type_(JobType::kURLRequest), | 120 : job_type_(JobType::kURLRequest), |
| 148 url_request_job_(std::move(url_request_job)), | 121 url_request_job_(std::move(url_request_job)), |
| 149 weak_factory_(this) {} | 122 weak_factory_(this) {} |
| 150 | 123 |
| 151 ServiceWorkerURLJobWrapper::ServiceWorkerURLJobWrapper( | 124 ServiceWorkerURLJobWrapper::ServiceWorkerURLJobWrapper( |
| 152 LoaderFactoryCallback callback, | 125 LoaderCallback callback, |
| 153 Delegate* delegate, | 126 Delegate* delegate, |
| 154 const ResourceRequest& resource_request, | 127 const ResourceRequest& resource_request, |
| 155 base::WeakPtr<storage::BlobStorageContext> blob_storage_context) | 128 base::WeakPtr<storage::BlobStorageContext> blob_storage_context) |
| 156 : job_type_(JobType::kURLLoader), | 129 : job_type_(JobType::kURLLoader), |
| 157 loader_factory_callback_(std::move(callback)), | 130 loader_callback_(std::move(callback)), |
| 158 delegate_(delegate), | 131 delegate_(delegate), |
| 159 resource_request_(resource_request), | 132 resource_request_(resource_request), |
| 160 blob_storage_context_(blob_storage_context), | 133 blob_storage_context_(blob_storage_context), |
| 161 weak_factory_(this) { | 134 weak_factory_(this) { |
| 162 DCHECK(IsBrowserSideNavigationEnabled() && | 135 DCHECK(IsBrowserSideNavigationEnabled() && |
| 163 base::CommandLine::ForCurrentProcess()->HasSwitch( | 136 base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 164 switches::kEnableNetworkService)); | 137 switches::kEnableNetworkService)); |
| 165 } | 138 } |
| 166 | 139 |
| 167 ServiceWorkerURLJobWrapper::~ServiceWorkerURLJobWrapper() {} | 140 ServiceWorkerURLJobWrapper::~ServiceWorkerURLJobWrapper() {} |
| 168 | 141 |
| 169 void ServiceWorkerURLJobWrapper::FallbackToNetwork() { | 142 void ServiceWorkerURLJobWrapper::FallbackToNetwork() { |
| 170 if (job_type_ == JobType::kURLLoader) { | 143 if (job_type_ == JobType::kURLLoader) { |
| 171 response_type_ = FALLBACK_TO_NETWORK; | 144 response_type_ = FALLBACK_TO_NETWORK; |
| 172 // This could be called multiple times in some cases because we simply | 145 // This could be called multiple times in some cases because we simply |
| 173 // call this synchronously here and don't wait for a separate async | 146 // call this synchronously here and don't wait for a separate async |
| 174 // StartRequest cue like what URLRequestJob case does. | 147 // StartRequest cue like what URLRequestJob case does. |
| 175 // TODO(kinuko): Make sure this is ok or we need to make this async. | 148 // TODO(kinuko): Make sure this is ok or we need to make this async. |
| 176 if (!loader_factory_callback_.is_null()) { | 149 if (!loader_callback_.is_null()) { |
| 177 std::move(loader_factory_callback_).Run(nullptr); | 150 std::move(loader_callback_).Run(StartLoaderCallback()); |
| 178 } | 151 } |
| 179 } else { | 152 } else { |
| 180 url_request_job_->FallbackToNetwork(); | 153 url_request_job_->FallbackToNetwork(); |
| 181 } | 154 } |
| 182 } | 155 } |
| 183 | 156 |
| 184 void ServiceWorkerURLJobWrapper::FallbackToNetworkOrRenderer() { | 157 void ServiceWorkerURLJobWrapper::FallbackToNetworkOrRenderer() { |
| 185 if (job_type_ == JobType::kURLLoader) { | 158 if (job_type_ == JobType::kURLLoader) { |
| 186 // TODO(kinuko): Implement this. Now we always fallback to network. | 159 // TODO(kinuko): Implement this. Now we always fallback to network. |
| 187 FallbackToNetwork(); | 160 FallbackToNetwork(); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 void ServiceWorkerURLJobWrapper::FailDueToLostController() { | 206 void ServiceWorkerURLJobWrapper::FailDueToLostController() { |
| 234 if (job_type_ == JobType::kURLLoader) { | 207 if (job_type_ == JobType::kURLLoader) { |
| 235 NOTIMPLEMENTED(); | 208 NOTIMPLEMENTED(); |
| 236 } else { | 209 } else { |
| 237 url_request_job_->FailDueToLostController(); | 210 url_request_job_->FailDueToLostController(); |
| 238 } | 211 } |
| 239 } | 212 } |
| 240 | 213 |
| 241 bool ServiceWorkerURLJobWrapper::WasCanceled() const { | 214 bool ServiceWorkerURLJobWrapper::WasCanceled() const { |
| 242 if (job_type_ == JobType::kURLLoader) { | 215 if (job_type_ == JobType::kURLLoader) { |
| 243 return loader_factory_callback_.is_null(); | 216 return loader_callback_.is_null(); |
| 244 } else { | 217 } else { |
| 245 return !url_request_job_; | 218 return !url_request_job_; |
| 246 } | 219 } |
| 247 } | 220 } |
| 248 | 221 |
| 249 void ServiceWorkerURLJobWrapper::StartRequest() { | 222 void ServiceWorkerURLJobWrapper::StartRequest() { |
| 250 DCHECK_EQ(FORWARD_TO_SERVICE_WORKER, response_type_); | 223 DCHECK_EQ(FORWARD_TO_SERVICE_WORKER, response_type_); |
| 251 | 224 |
| 252 ServiceWorkerMetrics::URLRequestJobResult result = | 225 ServiceWorkerMetrics::URLRequestJobResult result = |
| 253 ServiceWorkerMetrics::REQUEST_JOB_ERROR_BAD_DELEGATE; | 226 ServiceWorkerMetrics::REQUEST_JOB_ERROR_BAD_DELEGATE; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 void ServiceWorkerURLJobWrapper::DidPrepareFetchEvent( | 268 void ServiceWorkerURLJobWrapper::DidPrepareFetchEvent( |
| 296 scoped_refptr<ServiceWorkerVersion> version) {} | 269 scoped_refptr<ServiceWorkerVersion> version) {} |
| 297 | 270 |
| 298 void ServiceWorkerURLJobWrapper::DidDispatchFetchEvent( | 271 void ServiceWorkerURLJobWrapper::DidDispatchFetchEvent( |
| 299 ServiceWorkerStatusCode status, | 272 ServiceWorkerStatusCode status, |
| 300 ServiceWorkerFetchEventResult fetch_result, | 273 ServiceWorkerFetchEventResult fetch_result, |
| 301 const ServiceWorkerResponse& response, | 274 const ServiceWorkerResponse& response, |
| 302 blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream, | 275 blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream, |
| 303 const scoped_refptr<ServiceWorkerVersion>& version) { | 276 const scoped_refptr<ServiceWorkerVersion>& version) { |
| 304 if (fetch_result == SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK) { | 277 if (fetch_result == SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK) { |
| 305 std::move(loader_factory_callback_).Run(nullptr); | 278 std::move(loader_callback_).Run(StartLoaderCallback()); |
| 306 return; | 279 return; |
| 307 } | 280 } |
| 308 DCHECK_EQ(fetch_result, SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE); | 281 DCHECK_EQ(fetch_result, SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE); |
| 309 | 282 std::move(loader_callback_) |
| 310 factory_ = base::MakeUnique<Factory>(response, std::move(body_as_stream), | 283 .Run(base::Bind(&URLLoaderImpl::Start, response, |
| 311 blob_storage_context_); | 284 base::Passed(std::move(body_as_stream)), |
| 312 std::move(loader_factory_callback_).Run(factory_.get()); | 285 blob_storage_context_)); |
| 313 } | 286 } |
| 314 | 287 |
| 315 } // namespace content | 288 } // namespace content |
| OLD | NEW |