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..31b4c60023c0304489134c0cd0b1ef7befbb6600 100644 |
--- a/content/browser/service_worker/service_worker_cache.h |
+++ b/content/browser/service_worker/service_worker_cache.h |
@@ -8,28 +8,49 @@ |
#include "base/callback.h" |
#include "base/files/file_path.h" |
#include "base/memory/weak_ptr.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>, |
+ scoped_ptr<webkit_blob::BlobDataHandle>)> |
+ ResponseCallback; |
+ class BlobReader; |
+ |
static scoped_ptr<ServiceWorkerCache> CreateMemoryCache( |
const std::string& name, |
net::URLRequestContext* request_context, |
@@ -45,7 +66,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. |
+ void Match(ServiceWorkerFetchRequest* request, |
+ const ResponseCallback& callback); |
+ |
+ // Puts the request and response object in the cache. The response body (if |
+ // present) is stored in the cache, but not the request body. Returns |
+ // ErrorTypeOK on success. |
+ 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); |
+ |
+ // Call to determine if CreateBackend must be called. |
+ bool HasCreatedBackend() const; |
void set_name(const std::string& name) { name_ = name; } |
const std::string& name() const { return name_; } |
@@ -55,12 +95,71 @@ class ServiceWorkerCache { |
base::WeakPtr<ServiceWorkerCache> AsWeakPtr(); |
private: |
+ typedef scoped_ptr<disk_cache::Backend> ScopedBackendPtr; |
+ |
+ 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, |
+ scoped_ptr<ScopedBackendPtr> backend_ptr, |
+ 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, |
michaeln
2014/08/21 01:46:15
All of these DidSomething() async completion callb
jkarlin
2014/08/21 18:31:21
I've reworked ServiceWorkerCache so that its publi
|
+ const ErrorCallback& callback, |
+ scoped_ptr<disk_cache::Entry*> entryptr, |
+ int rv); |
+ |
+ scoped_ptr<disk_cache::Backend> backend_; |
base::FilePath path_; |
std::string name_; |
net::URLRequestContext* request_context_; |