Index: content/browser/service_worker/service_worker_cache.h |
diff --git a/content/browser/service_worker/service_worker_cache.h b/content/browser/service_worker/service_worker_cache.h |
index d5ee7071e5cc07cb53c8cab493aca6c46d3a186b..874ae5e2b8f08f30fc65f6309f2696fe72313c2d 100644 |
--- a/content/browser/service_worker/service_worker_cache.h |
+++ b/content/browser/service_worker/service_worker_cache.h |
@@ -8,28 +8,48 @@ |
#include "base/callback.h" |
#include "base/files/file_path.h" |
#include "base/memory/weak_ptr.h" |
+#include "content/browser/service_worker/service_worker_cache.pb.h" |
+#include "content/common/service_worker/service_worker_types.h" |
+#include "net/base/completion_callback.h" |
+#include "net/disk_cache/disk_cache.h" |
namespace net { |
class URLRequestContext; |
+class IOBufferWithSize; |
} |
namespace webkit_blob { |
+class BlobData; |
+class BlobDataHandle; |
class BlobStorageContext; |
} |
namespace content { |
+class ChromeBlobStorageContext; |
-// TODO(jkarlin): Fill this in with a real Cache implementation as |
-// specified in |
-// https://slightlyoff.github.io/ServiceWorker/spec/service_worker/index.html. |
// TODO(jkarlin): Unload cache backend from memory once the cache object is no |
// longer referenced in javascript. |
// Represents a ServiceWorker Cache as seen in |
// https://slightlyoff.github.io/ServiceWorker/spec/service_worker/index.html. |
// InitializeIfNeeded must be called before calling the other public members. |
-class ServiceWorkerCache { |
+class CONTENT_EXPORT ServiceWorkerCache { |
public: |
+ enum ErrorType { |
+ ErrorTypeOK = 0, |
+ ErrorTypeExists, |
+ ErrorTypeStorage, |
+ ErrorTypeNotFound |
+ }; |
+ enum EntryIndex { INDEX_HEADERS = 0, INDEX_RESPONSE_BODY }; |
+ typedef base::Callback<void(ErrorType)> ErrorCallback; |
+ typedef base::Callback<void(bool)> BoolCallback; |
+ typedef base::Callback<void(disk_cache::ScopedEntryPtr, bool)> |
+ EntryBoolCallback; |
+ typedef base::Callback<void(ErrorType, scoped_ptr<ServiceWorkerResponse>)> |
+ ResponseCallback; |
+ class BlobReader; |
+ |
static scoped_ptr<ServiceWorkerCache> CreateMemoryCache( |
const std::string& name, |
net::URLRequestContext* request_context, |
@@ -45,7 +65,26 @@ class ServiceWorkerCache { |
// Loads the backend and calls the callback with the result (true for |
// success). This must be called before member functions that require a |
// backend are called. |
- void CreateBackend(const base::Callback<void(bool)>& callback); |
+ void CreateBackend(const ErrorCallback& callback); |
+ |
+ // Returns ErrorTypeNotFound if not found. A refptr to the BlobDataHandle is |
+ // held |
+ // by ServiceWorkerCache until DerefBlob() is called. |
+ void Match(ServiceWorkerFetchRequest* request, |
+ const ResponseCallback& callback); |
+ |
+ // ServiceWorker Cache API |
+ void Put(ServiceWorkerFetchRequest* request, |
+ ServiceWorkerResponse* response, |
+ const ErrorCallback& callback); |
+ |
+ // Returns ErrorNotFound if not found. Otherwise deletes and returns |
+ // ErrorTypeOK. |
+ void Delete(ServiceWorkerFetchRequest* request, |
+ const ErrorCallback& callback); |
+ |
+ // Drops the reference to the blob's data handle. |
+ void DerefBlob(const std::string& uuid); |
void set_name(const std::string& name) { name_ = name; } |
const std::string& name() const { return name_; } |
@@ -55,18 +94,84 @@ class ServiceWorkerCache { |
base::WeakPtr<ServiceWorkerCache> AsWeakPtr(); |
private: |
+ struct ResponseReadContext; |
+ |
ServiceWorkerCache( |
const base::FilePath& path, |
const std::string& name, |
net::URLRequestContext* request_context, |
base::WeakPtr<webkit_blob::BlobStorageContext> blob_context); |
+ // CreateBackend callbacks |
+ void CreateBackendDidCreate(const ErrorCallback& callback, int rv); |
+ |
+ // Put callbacks |
+ void PutDidCreateEntry( |
+ ServiceWorkerFetchRequest* request, |
+ ServiceWorkerResponse* response, |
+ const ErrorCallback& callback, |
+ scoped_ptr<disk_cache::Entry*> entry, |
+ scoped_ptr<webkit_blob::BlobDataHandle> blob_data_handle, |
+ int error); |
+ void PutDidWriteHeaders( |
+ ServiceWorkerResponse* response, |
+ const ErrorCallback& callback, |
+ disk_cache::ScopedEntryPtr entry, |
+ scoped_ptr<webkit_blob::BlobDataHandle> blob_data_handle, |
+ int expected_bytes, |
+ int rv); |
+ void PutDidWriteBlobToCache(const ErrorCallback& callback, |
+ scoped_ptr<BlobReader> blob_reader, |
+ disk_cache::ScopedEntryPtr entry, |
+ bool success); |
+ |
+ // Match callbacks |
+ void MatchDidOpenEntry(ServiceWorkerFetchRequest* request, |
+ const ResponseCallback& callback, |
+ scoped_ptr<disk_cache::Entry*> entryptr, |
+ int rv); |
+ void MatchDidReadHeaderData( |
+ ServiceWorkerFetchRequest* request, |
+ const ResponseCallback& callback, |
+ disk_cache::ScopedEntryPtr entry, |
+ const scoped_refptr<net::IOBufferWithSize>& buffer, |
+ int rv); |
+ void MatchDidReadResponseBodyData( |
+ ServiceWorkerFetchRequest* request, |
+ const ResponseCallback& callback, |
+ disk_cache::ScopedEntryPtr entry, |
+ scoped_ptr<ServiceWorkerResponse> response, |
+ scoped_ptr<ResponseReadContext> response_context, |
+ int rv); |
+ void MatchDoneWithBody(ServiceWorkerFetchRequest* request, |
+ const ResponseCallback& callback, |
+ scoped_ptr<ServiceWorkerResponse> response, |
+ scoped_ptr<ResponseReadContext> response_context); |
+ |
+ // Delete callbacks |
+ void DeleteDidOpenEntry(ServiceWorkerFetchRequest* request, |
+ const ErrorCallback& callback, |
+ scoped_ptr<disk_cache::Entry*> entryptr, |
+ int rv); |
+ |
+ void HoldBlobDataHandle( |
+ const std::string& uuid, |
+ scoped_ptr<webkit_blob::BlobDataHandle> blob_data_handle); |
+ void DropBlobDataHandle(const std::string& uuid); |
+ |
+ scoped_ptr<disk_cache::Backend> backend_; |
base::FilePath path_; |
std::string name_; |
net::URLRequestContext* request_context_; |
base::WeakPtr<webkit_blob::BlobStorageContext> blob_storage_context_; |
int32 id_; |
+ typedef std::map<std::string, webkit_blob::BlobDataHandle*> BlobDataHandleMap; |
+ |
+ // Holds onto blob handles while waiting for acknowledgement of receipt from |
+ // the service worker. |
+ BlobDataHandleMap blob_data_handle_map_; |
michaeln
2014/08/14 22:59:00
Can the ServiceWorkerCachebe deleted prior to rece
jkarlin
2014/08/15 11:49:44
Done. One would expect that deleting a cache while
|
+ |
base::WeakPtrFactory<ServiceWorkerCache> weak_ptr_factory_; |
DISALLOW_COPY_AND_ASSIGN(ServiceWorkerCache); |