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..1cf0696f8495dd1ddbef23b481c6deff024733fa 100644 |
--- a/content/browser/service_worker/service_worker_cache.h |
+++ b/content/browser/service_worker/service_worker_cache.h |
@@ -8,28 +8,52 @@ |
#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" |
+ |
+namespace disk_cache { |
+class Backend; |
+class Entry; |
+} |
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, |
+ ErrorNotFound |
+ }; |
+ enum EntryIndex { INDEX_HEADERS = 0, INDEX_RESPONSE_BODY }; |
+ typedef base::Callback<void(ErrorType)> ErrorCallback; |
+ typedef base::Callback<void(bool)> BoolCallback; |
+ 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 +69,17 @@ 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); |
+ |
+ // ServiceWorker Cache API |
+ void Put(ServiceWorkerFetchRequest* request, |
+ ServiceWorkerResponse* response, |
+ const ErrorCallback& callback); |
+ |
+ // Returns ErrorNotFound if not found. It is the responsibility of the caller |
+ // to call RemoveBlob() once the returned blob uuid is no longer needed. |
+ void Match(ServiceWorkerFetchRequest* request, |
+ const ResponseCallback& callback); |
void set_name(const std::string& name) { name_ = name; } |
const std::string& name() const { return name_; } |
@@ -55,12 +89,58 @@ 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, |
+ int error); |
+ void PutDidWriteHeaders(ServiceWorkerFetchRequest* request, |
+ ServiceWorkerResponse* response, |
+ const ErrorCallback& callback, |
+ disk_cache::Entry* entry, |
+ int expected_bytes, |
+ int rv); |
+ void PutDidWriteBlobToCache(const ErrorCallback& callback, |
+ disk_cache::Entry* entry, |
+ scoped_ptr<BlobReader> blob_reader, |
+ 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::Entry* entry, |
+ const scoped_refptr<net::IOBufferWithSize>& buffer, |
+ int rv); |
+ void MatchDidReadResponseBodyData( |
+ ServiceWorkerFetchRequest* request, |
+ const ResponseCallback& callback, |
+ disk_cache::Entry* 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); |
+ |
+ scoped_ptr<disk_cache::Backend> backend_; |
base::FilePath path_; |
std::string name_; |
net::URLRequestContext* request_context_; |