| 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 84d695b5eec74b27cf58a8a0cdbbe76deff42faf..bb9ae48b0714e80c6b6188218d028a97a6ac5aec 100644
|
| --- a/content/browser/cache_storage/cache_storage_dispatcher_host.cc
|
| +++ b/content/browser/cache_storage/cache_storage_dispatcher_host.cc
|
| @@ -4,11 +4,13 @@
|
|
|
| #include "content/browser/cache_storage/cache_storage_dispatcher_host.h"
|
|
|
| +#include "base/bind.h"
|
| #include "base/logging.h"
|
| #include "base/strings/string16.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| +#include "base/trace_event/trace_event.h"
|
| +#include "content/browser/cache_storage/cache_storage_cache.h"
|
| #include "content/browser/cache_storage/cache_storage_context_impl.h"
|
| -#include "content/browser/cache_storage/cache_storage_listener.h"
|
| #include "content/browser/cache_storage/cache_storage_manager.h"
|
| #include "content/common/cache_storage/cache_storage_messages.h"
|
| #include "content/public/browser/content_browser_client.h"
|
| @@ -102,13 +104,15 @@ bool CacheStorageDispatcherHost::OnMessageReceived(
|
| IPC_MESSAGE_HANDLER(CacheStorageHostMsg_CacheStorageKeys, OnCacheStorageKeys)
|
| IPC_MESSAGE_HANDLER(CacheStorageHostMsg_CacheStorageMatch,
|
| OnCacheStorageMatch)
|
| + IPC_MESSAGE_HANDLER(CacheStorageHostMsg_CacheMatch, OnCacheMatch)
|
| + IPC_MESSAGE_HANDLER(CacheStorageHostMsg_CacheMatchAll, OnCacheMatchAll)
|
| + IPC_MESSAGE_HANDLER(CacheStorageHostMsg_CacheKeys, OnCacheKeys)
|
| + IPC_MESSAGE_HANDLER(CacheStorageHostMsg_CacheBatch, OnCacheBatch)
|
| + IPC_MESSAGE_HANDLER(CacheStorageHostMsg_CacheClosed, OnCacheClosed)
|
| + IPC_MESSAGE_HANDLER(CacheStorageHostMsg_BlobDataHandled, OnBlobDataHandled)
|
| IPC_MESSAGE_UNHANDLED(handled = false)
|
| IPC_END_MESSAGE_MAP()
|
| - if (handled)
|
| - return handled;
|
|
|
| - DCHECK(cache_listener_);
|
| - handled = cache_listener_->OnMessageReceived(message);
|
| if (!handled)
|
| BadMessageReceived();
|
| return handled;
|
| @@ -117,7 +121,6 @@ bool CacheStorageDispatcherHost::OnMessageReceived(
|
| void CacheStorageDispatcherHost::CreateCacheListener(
|
| CacheStorageContextImpl* context) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - cache_listener_.reset(new CacheStorageListener(this, context));
|
| context_ = context;
|
| }
|
|
|
| @@ -197,6 +200,121 @@ void CacheStorageDispatcherHost::OnCacheStorageMatch(
|
| thread_id, request_id));
|
| }
|
|
|
| +void CacheStorageDispatcherHost::OnCacheMatch(
|
| + int thread_id,
|
| + int request_id,
|
| + int cache_id,
|
| + const ServiceWorkerFetchRequest& request,
|
| + const CacheStorageCacheQueryParams& match_params) {
|
| + IDToCacheMap::iterator it = id_to_cache_map_.find(cache_id);
|
| + if (it == id_to_cache_map_.end()) {
|
| + Send(new CacheStorageMsg_CacheMatchError(
|
| + thread_id, request_id, blink::WebServiceWorkerCacheErrorNotFound));
|
| + return;
|
| + }
|
| +
|
| + scoped_refptr<CacheStorageCache> cache = it->second;
|
| + scoped_ptr<ServiceWorkerFetchRequest> scoped_request(
|
| + new ServiceWorkerFetchRequest(request.url, request.method,
|
| + request.headers, request.referrer,
|
| + request.is_reload));
|
| + cache->Match(scoped_request.Pass(),
|
| + base::Bind(&CacheStorageDispatcherHost::OnCacheMatchCallback,
|
| + this, thread_id, request_id, cache));
|
| +}
|
| +
|
| +void CacheStorageDispatcherHost::OnCacheMatchAll(
|
| + int thread_id,
|
| + int request_id,
|
| + int cache_id,
|
| + const ServiceWorkerFetchRequest& request,
|
| + const CacheStorageCacheQueryParams& match_params) {
|
| + // TODO(gavinp,jkarlin): Implement this method.
|
| + Send(new CacheStorageMsg_CacheMatchAllError(
|
| + thread_id, request_id, blink::WebServiceWorkerCacheErrorNotImplemented));
|
| +}
|
| +
|
| +void CacheStorageDispatcherHost::OnCacheKeys(
|
| + int thread_id,
|
| + int request_id,
|
| + int cache_id,
|
| + const ServiceWorkerFetchRequest& request,
|
| + const CacheStorageCacheQueryParams& match_params) {
|
| + IDToCacheMap::iterator it = id_to_cache_map_.find(cache_id);
|
| + if (it == id_to_cache_map_.end()) {
|
| + Send(new CacheStorageMsg_CacheKeysError(
|
| + thread_id, request_id, blink::WebServiceWorkerCacheErrorNotFound));
|
| + return;
|
| + }
|
| +
|
| + scoped_refptr<CacheStorageCache> cache = it->second;
|
| +
|
| + cache->Keys(base::Bind(&CacheStorageDispatcherHost::OnCacheKeysCallback, this,
|
| + thread_id, request_id, cache));
|
| +}
|
| +
|
| +void CacheStorageDispatcherHost::OnCacheBatch(
|
| + int thread_id,
|
| + int request_id,
|
| + int cache_id,
|
| + const std::vector<CacheStorageBatchOperation>& operations) {
|
| + if (operations.size() != 1u) {
|
| + Send(new CacheStorageMsg_CacheBatchError(
|
| + thread_id, request_id,
|
| + blink::WebServiceWorkerCacheErrorNotImplemented));
|
| + return;
|
| + }
|
| +
|
| + IDToCacheMap::iterator it = id_to_cache_map_.find(cache_id);
|
| + if (it == id_to_cache_map_.end()) {
|
| + Send(new CacheStorageMsg_CacheBatchError(
|
| + thread_id, request_id, blink::WebServiceWorkerCacheErrorNotFound));
|
| + return;
|
| + }
|
| +
|
| + const CacheStorageBatchOperation& operation = operations[0];
|
| +
|
| + scoped_refptr<CacheStorageCache> cache = it->second;
|
| + scoped_ptr<ServiceWorkerFetchRequest> scoped_request(
|
| + new ServiceWorkerFetchRequest(
|
| + operation.request.url, operation.request.method,
|
| + operation.request.headers, operation.request.referrer,
|
| + operation.request.is_reload));
|
| +
|
| + if (operation.operation_type == CACHE_STORAGE_CACHE_OPERATION_TYPE_DELETE) {
|
| + cache->Delete(scoped_request.Pass(),
|
| + base::Bind(&CacheStorageDispatcherHost::OnCacheDeleteCallback,
|
| + this, thread_id, request_id, cache));
|
| + return;
|
| + }
|
| +
|
| + if (operation.operation_type == CACHE_STORAGE_CACHE_OPERATION_TYPE_PUT) {
|
| + // We don't support streaming for cache.
|
| + DCHECK(operation.response.stream_url.is_empty());
|
| + scoped_ptr<ServiceWorkerResponse> scoped_response(new ServiceWorkerResponse(
|
| + operation.response.url, operation.response.status_code,
|
| + operation.response.status_text, operation.response.response_type,
|
| + operation.response.headers, operation.response.blob_uuid,
|
| + operation.response.blob_size, operation.response.stream_url));
|
| + cache->Put(scoped_request.Pass(), scoped_response.Pass(),
|
| + base::Bind(&CacheStorageDispatcherHost::OnCachePutCallback, this,
|
| + thread_id, request_id, cache));
|
| +
|
| + return;
|
| + }
|
| +
|
| + Send(new CacheStorageMsg_CacheBatchError(
|
| + thread_id, request_id, blink::WebServiceWorkerCacheErrorNotImplemented));
|
| +}
|
| +
|
| +void CacheStorageDispatcherHost::OnCacheClosed(int cache_id) {
|
| + DropCacheReference(cache_id);
|
| +}
|
| +
|
| +void CacheStorageDispatcherHost::OnBlobDataHandled(const std::string& uuid) {
|
| + DropBlobDataHandle(uuid);
|
| +}
|
| +
|
| void CacheStorageDispatcherHost::OnCacheStorageHasCallback(
|
| int thread_id,
|
| int request_id,
|
| @@ -225,8 +343,7 @@ void CacheStorageDispatcherHost::OnCacheStorageOpenCallback(
|
| thread_id, request_id, ToWebServiceWorkerCacheError(error)));
|
| return;
|
| }
|
| - CacheStorageListener::CacheID cache_id =
|
| - cache_listener_->StoreCacheReference(cache);
|
| + CacheID cache_id = StoreCacheReference(cache);
|
| Send(new CacheStorageMsg_CacheStorageOpenSuccess(thread_id, request_id,
|
| cache_id));
|
| }
|
| @@ -276,10 +393,120 @@ void CacheStorageDispatcherHost::OnCacheStorageMatchCallback(
|
| }
|
|
|
| if (blob_data_handle)
|
| - cache_listener_->StoreBlobDataHandle(blob_data_handle.Pass());
|
| + StoreBlobDataHandle(blob_data_handle.Pass());
|
|
|
| Send(new CacheStorageMsg_CacheStorageMatchSuccess(thread_id, request_id,
|
| *response));
|
| }
|
|
|
| +void CacheStorageDispatcherHost::OnCacheMatchCallback(
|
| + int thread_id,
|
| + int request_id,
|
| + const scoped_refptr<CacheStorageCache>& cache,
|
| + CacheStorageCache::ErrorType error,
|
| + scoped_ptr<ServiceWorkerResponse> response,
|
| + scoped_ptr<storage::BlobDataHandle> blob_data_handle) {
|
| + if (error != CacheStorageCache::ERROR_TYPE_OK) {
|
| + Send(new CacheStorageMsg_CacheMatchError(
|
| + thread_id, request_id, CacheErrorToWebServiceWorkerCacheError(error)));
|
| + return;
|
| + }
|
| +
|
| + if (blob_data_handle)
|
| + StoreBlobDataHandle(blob_data_handle.Pass());
|
| +
|
| + Send(new CacheStorageMsg_CacheMatchSuccess(thread_id, request_id, *response));
|
| +}
|
| +
|
| +void CacheStorageDispatcherHost::OnCacheKeysCallback(
|
| + int thread_id,
|
| + int request_id,
|
| + const scoped_refptr<CacheStorageCache>& cache,
|
| + CacheStorageCache::ErrorType error,
|
| + scoped_ptr<CacheStorageCache::Requests> requests) {
|
| + if (error != CacheStorageCache::ERROR_TYPE_OK) {
|
| + Send(new CacheStorageMsg_CacheKeysError(
|
| + thread_id, request_id, CacheErrorToWebServiceWorkerCacheError(error)));
|
| + return;
|
| + }
|
| +
|
| + CacheStorageCache::Requests out;
|
| +
|
| + for (CacheStorageCache::Requests::const_iterator it = requests->begin();
|
| + it != requests->end(); ++it) {
|
| + ServiceWorkerFetchRequest request(it->url, it->method, it->headers,
|
| + it->referrer, it->is_reload);
|
| + out.push_back(request);
|
| + }
|
| +
|
| + Send(new CacheStorageMsg_CacheKeysSuccess(thread_id, request_id, out));
|
| +}
|
| +
|
| +void CacheStorageDispatcherHost::OnCacheDeleteCallback(
|
| + int thread_id,
|
| + int request_id,
|
| + const scoped_refptr<CacheStorageCache>& cache,
|
| + CacheStorageCache::ErrorType error) {
|
| + if (error != CacheStorageCache::ERROR_TYPE_OK) {
|
| + Send(new CacheStorageMsg_CacheBatchError(
|
| + thread_id, request_id, CacheErrorToWebServiceWorkerCacheError(error)));
|
| + return;
|
| + }
|
| +
|
| + Send(new CacheStorageMsg_CacheBatchSuccess(
|
| + thread_id, request_id, std::vector<ServiceWorkerResponse>()));
|
| +}
|
| +
|
| +void CacheStorageDispatcherHost::OnCachePutCallback(
|
| + int thread_id,
|
| + int request_id,
|
| + const scoped_refptr<CacheStorageCache>& cache,
|
| + CacheStorageCache::ErrorType error,
|
| + scoped_ptr<ServiceWorkerResponse> response,
|
| + scoped_ptr<storage::BlobDataHandle> blob_data_handle) {
|
| + if (error != CacheStorageCache::ERROR_TYPE_OK) {
|
| + Send(new CacheStorageMsg_CacheBatchError(
|
| + thread_id, request_id, CacheErrorToWebServiceWorkerCacheError(error)));
|
| + return;
|
| + }
|
| +
|
| + if (blob_data_handle)
|
| + StoreBlobDataHandle(blob_data_handle.Pass());
|
| +
|
| + std::vector<ServiceWorkerResponse> responses;
|
| + responses.push_back(*response);
|
| + Send(new CacheStorageMsg_CacheBatchSuccess(thread_id, request_id, responses));
|
| +}
|
| +
|
| +CacheStorageDispatcherHost::CacheID
|
| +CacheStorageDispatcherHost::StoreCacheReference(
|
| + const scoped_refptr<CacheStorageCache>& cache) {
|
| + int cache_id = next_cache_id_++;
|
| + id_to_cache_map_[cache_id] = cache;
|
| + return cache_id;
|
| +}
|
| +
|
| +void CacheStorageDispatcherHost::DropCacheReference(CacheID cache_id) {
|
| + id_to_cache_map_.erase(cache_id);
|
| +}
|
| +
|
| +void CacheStorageDispatcherHost::StoreBlobDataHandle(
|
| + scoped_ptr<storage::BlobDataHandle> blob_data_handle) {
|
| + DCHECK(blob_data_handle);
|
| + std::pair<UUIDToBlobDataHandleList::iterator, bool> rv =
|
| + blob_handle_store_.insert(std::make_pair(
|
| + blob_data_handle->uuid(), std::list<storage::BlobDataHandle>()));
|
| + rv.first->second.push_front(storage::BlobDataHandle(*blob_data_handle));
|
| +}
|
| +
|
| +void CacheStorageDispatcherHost::DropBlobDataHandle(std::string uuid) {
|
| + UUIDToBlobDataHandleList::iterator it = blob_handle_store_.find(uuid);
|
| + if (it == blob_handle_store_.end())
|
| + return;
|
| + DCHECK(!it->second.empty());
|
| + it->second.pop_front();
|
| + if (it->second.empty())
|
| + blob_handle_store_.erase(it);
|
| +}
|
| +
|
| } // namespace content
|
|
|