Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/cache_storage/cache_storage_cache.h" | 5 #include "content/browser/cache_storage/cache_storage_cache.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/barrier_closure.h" | 9 #include "base/barrier_closure.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| 11 #include "base/guid.h" | 11 #include "base/guid.h" |
| 12 #include "base/metrics/histogram_macros.h" | 12 #include "base/metrics/histogram_macros.h" |
| 13 #include "base/strings/string_util.h" | 13 #include "base/strings/string_util.h" |
| 14 #include "content/browser/cache_storage/cache_storage.pb.h" | 14 #include "content/browser/cache_storage/cache_storage.pb.h" |
| 15 #include "content/browser/cache_storage/cache_storage_scheduler.h" | 15 #include "content/browser/cache_storage/cache_storage_scheduler.h" |
| 16 #include "content/public/browser/browser_thread.h" | 16 #include "content/public/browser/browser_thread.h" |
| 17 #include "content/public/common/referrer.h" | 17 #include "content/public/common/referrer.h" |
| 18 #include "net/base/completion_callback.h" | 18 #include "net/base/completion_callback.h" |
| 19 #include "net/base/io_buffer.h" | 19 #include "net/base/io_buffer.h" |
| 20 #include "net/base/net_errors.h" | 20 #include "net/base/net_errors.h" |
| 21 #include "net/disk_cache/disk_cache.h" | 21 #include "net/disk_cache/disk_cache.h" |
| 22 #include "net/url_request/url_request_context.h" | 22 #include "net/url_request/url_request_context_getter.h" |
| 23 #include "storage/browser/blob/blob_data_builder.h" | 23 #include "storage/browser/blob/blob_data_builder.h" |
| 24 #include "storage/browser/blob/blob_data_handle.h" | 24 #include "storage/browser/blob/blob_data_handle.h" |
| 25 #include "storage/browser/blob/blob_storage_context.h" | 25 #include "storage/browser/blob/blob_storage_context.h" |
| 26 #include "storage/browser/blob/blob_url_request_job_factory.h" | 26 #include "storage/browser/blob/blob_url_request_job_factory.h" |
| 27 #include "storage/browser/quota/quota_manager_proxy.h" | 27 #include "storage/browser/quota/quota_manager_proxy.h" |
| 28 #include "third_party/WebKit/public/platform/WebServiceWorkerResponseType.h" | 28 #include "third_party/WebKit/public/platform/WebServiceWorkerResponseType.h" |
| 29 | 29 |
| 30 namespace content { | 30 namespace content { |
| 31 | 31 |
| 32 namespace { | 32 namespace { |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 171 public: | 171 public: |
| 172 typedef base::Callback<void(disk_cache::ScopedEntryPtr, bool)> | 172 typedef base::Callback<void(disk_cache::ScopedEntryPtr, bool)> |
| 173 EntryAndBoolCallback; | 173 EntryAndBoolCallback; |
| 174 | 174 |
| 175 BlobReader() | 175 BlobReader() |
| 176 : cache_entry_offset_(0), | 176 : cache_entry_offset_(0), |
| 177 buffer_(new net::IOBufferWithSize(kBufferSize)), | 177 buffer_(new net::IOBufferWithSize(kBufferSize)), |
| 178 weak_ptr_factory_(this) {} | 178 weak_ptr_factory_(this) {} |
| 179 | 179 |
| 180 // |entry| is passed to the callback once complete. | 180 // |entry| is passed to the callback once complete. |
| 181 void StreamBlobToCache(disk_cache::ScopedEntryPtr entry, | 181 void StreamBlobToCache( |
| 182 net::URLRequestContext* request_context, | 182 disk_cache::ScopedEntryPtr entry, |
| 183 scoped_ptr<storage::BlobDataHandle> blob_data_handle, | 183 const scoped_refptr<net::URLRequestContextGetter>& request_context, |
| 184 const EntryAndBoolCallback& callback) { | 184 scoped_ptr<storage::BlobDataHandle> blob_data_handle, |
| 185 const EntryAndBoolCallback& callback) { | |
| 185 DCHECK(entry); | 186 DCHECK(entry); |
| 187 DCHECK(request_context->GetURLRequestContext()); | |
|
mmenke
2015/06/10 17:00:31
Do we have a strong guarantee that if we shut down
jkarlin
2015/06/10 18:26:03
This is only called via blink->...->RenderProcessH
| |
| 188 | |
| 186 entry_ = entry.Pass(); | 189 entry_ = entry.Pass(); |
| 187 callback_ = callback; | 190 callback_ = callback; |
| 191 | |
| 188 blob_request_ = storage::BlobProtocolHandler::CreateBlobRequest( | 192 blob_request_ = storage::BlobProtocolHandler::CreateBlobRequest( |
| 189 blob_data_handle.Pass(), request_context, this); | 193 blob_data_handle.Pass(), request_context->GetURLRequestContext(), this); |
| 190 blob_request_->Start(); | 194 blob_request_->Start(); |
| 191 } | 195 } |
| 192 | 196 |
| 193 // net::URLRequest::Delegate overrides for reading blobs. | 197 // net::URLRequest::Delegate overrides for reading blobs. |
| 194 void OnReceivedRedirect(net::URLRequest* request, | 198 void OnReceivedRedirect(net::URLRequest* request, |
| 195 const net::RedirectInfo& redirect_info, | 199 const net::RedirectInfo& redirect_info, |
| 196 bool* defer_redirect) override { | 200 bool* defer_redirect) override { |
| 197 NOTREACHED(); | 201 NOTREACHED(); |
| 198 } | 202 } |
| 199 void OnAuthRequired(net::URLRequest* request, | 203 void OnAuthRequired(net::URLRequest* request, |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 334 }; | 338 }; |
| 335 | 339 |
| 336 // The state needed to pass between CacheStorageCache::Put callbacks. | 340 // The state needed to pass between CacheStorageCache::Put callbacks. |
| 337 struct CacheStorageCache::PutContext { | 341 struct CacheStorageCache::PutContext { |
| 338 PutContext( | 342 PutContext( |
| 339 const GURL& origin, | 343 const GURL& origin, |
| 340 scoped_ptr<ServiceWorkerFetchRequest> request, | 344 scoped_ptr<ServiceWorkerFetchRequest> request, |
| 341 scoped_ptr<ServiceWorkerResponse> response, | 345 scoped_ptr<ServiceWorkerResponse> response, |
| 342 scoped_ptr<storage::BlobDataHandle> blob_data_handle, | 346 scoped_ptr<storage::BlobDataHandle> blob_data_handle, |
| 343 const CacheStorageCache::ErrorCallback& callback, | 347 const CacheStorageCache::ErrorCallback& callback, |
| 344 net::URLRequestContext* request_context, | 348 const scoped_refptr<net::URLRequestContextGetter>& request_context, |
| 345 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy) | 349 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy) |
| 346 : origin(origin), | 350 : origin(origin), |
| 347 request(request.Pass()), | 351 request(request.Pass()), |
| 348 response(response.Pass()), | 352 response(response.Pass()), |
| 349 blob_data_handle(blob_data_handle.Pass()), | 353 blob_data_handle(blob_data_handle.Pass()), |
| 350 callback(callback), | 354 callback(callback), |
| 351 request_context(request_context), | 355 request_context(request_context), |
| 352 quota_manager_proxy(quota_manager_proxy), | 356 quota_manager_proxy(quota_manager_proxy), |
| 353 cache_entry(NULL) {} | 357 cache_entry(NULL) {} |
| 354 ~PutContext() { | 358 ~PutContext() { |
| 355 if (cache_entry) | 359 if (cache_entry) |
| 356 cache_entry->Close(); | 360 cache_entry->Close(); |
| 357 } | 361 } |
| 358 | 362 |
| 359 // Input parameters to the Put function. | 363 // Input parameters to the Put function. |
| 360 GURL origin; | 364 GURL origin; |
| 361 scoped_ptr<ServiceWorkerFetchRequest> request; | 365 scoped_ptr<ServiceWorkerFetchRequest> request; |
| 362 scoped_ptr<ServiceWorkerResponse> response; | 366 scoped_ptr<ServiceWorkerResponse> response; |
| 363 scoped_ptr<storage::BlobDataHandle> blob_data_handle; | 367 scoped_ptr<storage::BlobDataHandle> blob_data_handle; |
| 364 CacheStorageCache::ErrorCallback callback; | 368 CacheStorageCache::ErrorCallback callback; |
| 365 net::URLRequestContext* request_context; | 369 scoped_refptr<net::URLRequestContextGetter> request_context; |
| 366 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy; | 370 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy; |
| 367 | 371 |
| 368 // This isn't a scoped_ptr because the disk_cache needs an Entry** as input to | 372 // This isn't a scoped_ptr because the disk_cache needs an Entry** as input to |
| 369 // CreateEntry. | 373 // CreateEntry. |
| 370 disk_cache::Entry* cache_entry; | 374 disk_cache::Entry* cache_entry; |
| 371 | 375 |
| 372 DISALLOW_COPY_AND_ASSIGN(PutContext); | 376 DISALLOW_COPY_AND_ASSIGN(PutContext); |
| 373 }; | 377 }; |
| 374 | 378 |
| 375 // static | 379 // static |
| 376 scoped_refptr<CacheStorageCache> CacheStorageCache::CreateMemoryCache( | 380 scoped_refptr<CacheStorageCache> CacheStorageCache::CreateMemoryCache( |
| 377 const GURL& origin, | 381 const GURL& origin, |
| 378 net::URLRequestContext* request_context, | 382 const scoped_refptr<net::URLRequestContextGetter>& request_context, |
| 379 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy, | 383 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy, |
| 380 base::WeakPtr<storage::BlobStorageContext> blob_context) { | 384 base::WeakPtr<storage::BlobStorageContext> blob_context) { |
| 381 return make_scoped_refptr( | 385 return make_scoped_refptr( |
| 382 new CacheStorageCache(origin, base::FilePath(), request_context, | 386 new CacheStorageCache(origin, base::FilePath(), request_context, |
| 383 quota_manager_proxy, blob_context)); | 387 quota_manager_proxy, blob_context)); |
| 384 } | 388 } |
| 385 | 389 |
| 386 // static | 390 // static |
| 387 scoped_refptr<CacheStorageCache> CacheStorageCache::CreatePersistentCache( | 391 scoped_refptr<CacheStorageCache> CacheStorageCache::CreatePersistentCache( |
| 388 const GURL& origin, | 392 const GURL& origin, |
| 389 const base::FilePath& path, | 393 const base::FilePath& path, |
| 390 net::URLRequestContext* request_context, | 394 const scoped_refptr<net::URLRequestContextGetter>& request_context, |
| 391 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy, | 395 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy, |
| 392 base::WeakPtr<storage::BlobStorageContext> blob_context) { | 396 base::WeakPtr<storage::BlobStorageContext> blob_context) { |
| 393 return make_scoped_refptr(new CacheStorageCache( | 397 return make_scoped_refptr(new CacheStorageCache( |
| 394 origin, path, request_context, quota_manager_proxy, blob_context)); | 398 origin, path, request_context, quota_manager_proxy, blob_context)); |
| 395 } | 399 } |
| 396 | 400 |
| 397 CacheStorageCache::~CacheStorageCache() { | 401 CacheStorageCache::~CacheStorageCache() { |
| 398 } | 402 } |
| 399 | 403 |
| 400 base::WeakPtr<CacheStorageCache> CacheStorageCache::AsWeakPtr() { | 404 base::WeakPtr<CacheStorageCache> CacheStorageCache::AsWeakPtr() { |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 547 entry->GetDataSize(INDEX_RESPONSE_BODY); | 551 entry->GetDataSize(INDEX_RESPONSE_BODY); |
| 548 entry->Close(); | 552 entry->Close(); |
| 549 } | 553 } |
| 550 | 554 |
| 551 return sum; | 555 return sum; |
| 552 } | 556 } |
| 553 | 557 |
| 554 CacheStorageCache::CacheStorageCache( | 558 CacheStorageCache::CacheStorageCache( |
| 555 const GURL& origin, | 559 const GURL& origin, |
| 556 const base::FilePath& path, | 560 const base::FilePath& path, |
| 557 net::URLRequestContext* request_context, | 561 const scoped_refptr<net::URLRequestContextGetter>& request_context, |
| 558 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy, | 562 const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy, |
| 559 base::WeakPtr<storage::BlobStorageContext> blob_context) | 563 base::WeakPtr<storage::BlobStorageContext> blob_context) |
| 560 : origin_(origin), | 564 : origin_(origin), |
| 561 path_(path), | 565 path_(path), |
| 562 request_context_(request_context), | 566 request_context_(request_context), |
| 563 quota_manager_proxy_(quota_manager_proxy), | 567 quota_manager_proxy_(quota_manager_proxy), |
| 564 blob_storage_context_(blob_context), | 568 blob_storage_context_(blob_context), |
| 565 backend_state_(BACKEND_UNINITIALIZED), | 569 backend_state_(BACKEND_UNINITIALIZED), |
| 566 scheduler_(new CacheStorageScheduler()), | 570 scheduler_(new CacheStorageScheduler()), |
| 567 initializing_(false), | 571 initializing_(false), |
| (...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 925 } | 929 } |
| 926 | 930 |
| 927 DCHECK(put_context->blob_data_handle); | 931 DCHECK(put_context->blob_data_handle); |
| 928 | 932 |
| 929 disk_cache::ScopedEntryPtr entry(put_context->cache_entry); | 933 disk_cache::ScopedEntryPtr entry(put_context->cache_entry); |
| 930 put_context->cache_entry = NULL; | 934 put_context->cache_entry = NULL; |
| 931 scoped_ptr<BlobReader> reader(new BlobReader()); | 935 scoped_ptr<BlobReader> reader(new BlobReader()); |
| 932 BlobReader* reader_ptr = reader.get(); | 936 BlobReader* reader_ptr = reader.get(); |
| 933 | 937 |
| 934 // Grab some pointers before passing put_context in Bind. | 938 // Grab some pointers before passing put_context in Bind. |
| 935 net::URLRequestContext* request_context = put_context->request_context; | 939 scoped_refptr<net::URLRequestContextGetter> request_context = |
| 940 put_context->request_context; | |
| 936 scoped_ptr<storage::BlobDataHandle> blob_data_handle = | 941 scoped_ptr<storage::BlobDataHandle> blob_data_handle = |
| 937 put_context->blob_data_handle.Pass(); | 942 put_context->blob_data_handle.Pass(); |
| 938 | 943 |
| 939 reader_ptr->StreamBlobToCache( | 944 reader_ptr->StreamBlobToCache( |
| 940 entry.Pass(), request_context, blob_data_handle.Pass(), | 945 entry.Pass(), request_context, blob_data_handle.Pass(), |
| 941 base::Bind(&CacheStorageCache::PutDidWriteBlobToCache, | 946 base::Bind(&CacheStorageCache::PutDidWriteBlobToCache, |
| 942 weak_ptr_factory_.GetWeakPtr(), | 947 weak_ptr_factory_.GetWeakPtr(), |
| 943 base::Passed(put_context.Pass()), | 948 base::Passed(put_context.Pass()), |
| 944 base::Passed(reader.Pass()))); | 949 base::Passed(reader.Pass()))); |
| 945 } | 950 } |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1265 CacheStorageError error, | 1270 CacheStorageError error, |
| 1266 scoped_ptr<Requests> requests) { | 1271 scoped_ptr<Requests> requests) { |
| 1267 base::WeakPtr<CacheStorageCache> cache = weak_ptr_factory_.GetWeakPtr(); | 1272 base::WeakPtr<CacheStorageCache> cache = weak_ptr_factory_.GetWeakPtr(); |
| 1268 | 1273 |
| 1269 callback.Run(error, requests.Pass()); | 1274 callback.Run(error, requests.Pass()); |
| 1270 if (cache) | 1275 if (cache) |
| 1271 scheduler_->CompleteOperationAndRunNext(); | 1276 scheduler_->CompleteOperationAndRunNext(); |
| 1272 } | 1277 } |
| 1273 | 1278 |
| 1274 } // namespace content | 1279 } // namespace content |
| OLD | NEW |