Chromium Code Reviews| Index: content/browser/cache_storage/cache_storage_dispatcher_host.cc |
| diff --git a/content/browser/cache_storage/cache_storage_dispatcher_host.cc b/content/browser/cache_storage/cache_storage_dispatcher_host.cc |
| index e3ab6fa7faf33cfdeeac9fc64716b046ba1e959a..ec75a6dfea919e4dc79438cd4fa3cb47011219c5 100644 |
| --- a/content/browser/cache_storage/cache_storage_dispatcher_host.cc |
| +++ b/content/browser/cache_storage/cache_storage_dispatcher_host.cc |
| @@ -10,8 +10,11 @@ |
| #include "base/bind.h" |
| #include "base/logging.h" |
| #include "base/macros.h" |
| +#include "base/stl_util.h" |
| #include "base/strings/string16.h" |
| #include "base/strings/utf_string_conversions.h" |
| +#include "base/threading/thread_task_runner_handle.h" |
| +#include "base/time/time.h" |
| #include "base/trace_event/trace_event.h" |
| #include "content/browser/bad_message.h" |
| #include "content/browser/cache_storage/cache_storage_cache.h" |
| @@ -31,6 +34,7 @@ namespace content { |
| namespace { |
| const uint32_t kFilteredMessageClasses[] = {CacheStorageMsgStart}; |
| +const int32_t kCachePreservationSeconds = 5; |
| blink::WebServiceWorkerCacheError ToWebServiceWorkerCacheError( |
| CacheStorageError err) { |
| @@ -63,8 +67,7 @@ bool OriginCanAccessCacheStorage(const url::Origin& origin) { |
| CacheStorageDispatcherHost::CacheStorageDispatcherHost() |
| : BrowserMessageFilter(kFilteredMessageClasses, |
| - arraysize(kFilteredMessageClasses)) { |
| -} |
| + arraysize(kFilteredMessageClasses)) {} |
| CacheStorageDispatcherHost::~CacheStorageDispatcherHost() { |
| } |
| @@ -354,6 +357,18 @@ void CacheStorageDispatcherHost::OnCacheStorageOpenCallback( |
| thread_id, request_id, ToWebServiceWorkerCacheError(error))); |
| return; |
| } |
| + |
| + // Hang on to the cache for a few seconds (if we aren't already doing so). |
| + // This way if the user quickly closes and reopens it the next open operation |
| + // will be fast. |
| + if (!ContainsKey(preserved_cache_handles_, cache_handle->value())) { |
| + preserved_cache_handles_[cache_handle->value()] = cache_handle->Clone(); |
| + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| + FROM_HERE, base::Bind(&CacheStorageDispatcherHost::StopPreservingCache, |
| + this, cache_handle->value()), |
|
nhiroki
2016/06/29 09:15:39
This may extend the lifetime of MessageFilter. Alt
jkarlin
2016/06/29 12:52:53
Actually, there isn't even a need to run the callb
|
| + base::TimeDelta::FromSeconds(kCachePreservationSeconds)); |
| + } |
| + |
| CacheID cache_id = StoreCacheReference(std::move(cache_handle)); |
| Send(new CacheStorageMsg_CacheStorageOpenSuccess(thread_id, request_id, |
| cache_id)); |
| @@ -508,6 +523,12 @@ void CacheStorageDispatcherHost::OnCacheBatchCallback( |
| Send(new CacheStorageMsg_CacheBatchSuccess(thread_id, request_id)); |
| } |
| +void CacheStorageDispatcherHost::StopPreservingCache( |
| + const CacheStorageCache* cache) { |
| + DCHECK(ContainsKey(preserved_cache_handles_, cache)); |
| + preserved_cache_handles_.erase(cache); |
| +} |
| + |
| CacheStorageDispatcherHost::CacheID |
| CacheStorageDispatcherHost::StoreCacheReference( |
| std::unique_ptr<CacheStorageCacheHandle> cache_handle) { |