Index: Source/modules/serviceworkers/CacheStorage.cpp |
diff --git a/Source/modules/serviceworkers/CacheStorage.cpp b/Source/modules/serviceworkers/CacheStorage.cpp |
index 07f76a27d27fdaa6f1335dc1783d04bd684353c5..44a5255d952a0894f40fc9e46023417654a65c1c 100644 |
--- a/Source/modules/serviceworkers/CacheStorage.cpp |
+++ b/Source/modules/serviceworkers/CacheStorage.cpp |
@@ -7,21 +7,110 @@ |
#include "bindings/core/v8/ScriptPromiseResolver.h" |
#include "bindings/core/v8/ScriptState.h" |
+#include "public/platform/WebServiceWorkerCacheStorage.h" |
+#include "public/platform/WebServiceWorkerCacheStorageError.h" |
+ |
+using blink::WebServiceWorkerCacheStorage; |
namespace WebCore { |
-PassRefPtrWillBeRawPtr<CacheStorage> CacheStorage::create() |
+namespace { |
+ |
+const char* CacheStorageErrorToString(WebServiceWorkerCacheStorageError reason) |
+{ |
+ // TODO: Construct correct DOM error objects rather than returning strings. |
+ switch (reason) { |
+ case WebServiceWorkerCacheStorageError::WebServiceWorkerCacheStorageErrorNotImplemented: |
+ return "not implemented"; |
+ case WebServiceWorkerCacheStorageError::WebServiceWorkerCacheStorageErrorNotFound: |
+ return "not found"; |
+ case WebServiceWorkerCacheStorageError::WebServiceWorkerCacheStorageErrorExists: |
+ return "entry already exists"; |
+ default: |
+ ASSERT_NOT_REACHED(); |
+ return "unknown error"; |
+ } |
+} |
+ |
+class CacheStorageCallbacks : public WebServiceWorkerCacheStorage::CacheStorageCallbacks { |
+public: |
+ CacheStorageCallbacks(PassRefPtr<ScriptPromiseResolver> resolver) : m_resolver(resolver) { } |
+ virtual ~CacheStorageCallbacks() { } |
+ |
+ virtual void onSuccess() OVERRIDE |
+ { |
+ m_resolver->resolve(true); |
+ } |
+ |
+ virtual void onError(WebServiceWorkerCacheStorageError* reason) OVERRIDE |
+ { |
+ m_resolver->reject(CacheStorageErrorToString(*reason)); |
+ } |
+ |
+private: |
+ const RefPtr<ScriptPromiseResolver> m_resolver; |
+}; |
+ |
+class CacheStorageWithCacheCallbacks : public WebServiceWorkerCacheStorage::CacheStorageWithCacheCallbacks { |
+public: |
+ CacheStorageWithCacheCallbacks(PassRefPtr<ScriptPromiseResolver> resolver) : m_resolver(resolver) { } |
+ virtual ~CacheStorageWithCacheCallbacks() { } |
+ |
+ virtual void onSuccess(int* cacheId) OVERRIDE |
+ { |
+ // TODO: There should be a blink side of the Cache object implementation here, rather than |
+ // this nonsensical pass through. |
+ m_resolver->resolve(*cacheId); |
+ } |
+ |
+ virtual void onError(WebServiceWorkerCacheStorageError* reason) OVERRIDE |
+ { |
+ m_resolver->reject(CacheStorageErrorToString(*reason)); |
+ } |
+ |
+private: |
+ const RefPtr<ScriptPromiseResolver> m_resolver; |
+}; |
+ |
+class CacheStorageKeysCallbacks : public WebServiceWorkerCacheStorage::CacheStorageKeysCallbacks { |
+public: |
+ CacheStorageKeysCallbacks(ScriptState* scriptState, PassRefPtr<ScriptPromiseResolver> resolver) : m_resolver(resolver), m_scriptState(scriptState) { } |
+ virtual ~CacheStorageKeysCallbacks() { } |
+ |
+ virtual void onSuccess(blink::WebVector<blink::WebString>* keys) OVERRIDE |
+ { |
+ Vector<String> wtfKeys; |
+ for (size_t i = 0; i < keys->size(); ++i) |
+ wtfKeys.append((*keys)[i]); |
+ m_resolver->resolve(wtfKeys); |
+ } |
+ |
+ virtual void onError(WebServiceWorkerCacheStorageError* reason) OVERRIDE |
+ { |
+ m_resolver->reject(CacheStorageErrorToString(*reason)); |
+ } |
+ |
+private: |
+ const RefPtr<ScriptPromiseResolver> m_resolver; |
+ const RefPtr<ScriptState> m_scriptState; |
+}; |
+ |
+} |
+ |
+PassRefPtr<CacheStorage> CacheStorage::create(WebServiceWorkerCacheStorage* webCacheStorage) |
{ |
- return adoptRefWillBeNoop(new CacheStorage()); |
+ return adoptRefWillBeNoop(new CacheStorage(webCacheStorage)); |
} |
-// FIXME: Implement every one of these methods. |
ScriptPromise CacheStorage::createFunction(ScriptState* scriptState, const String& key) |
{ |
RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); |
const ScriptPromise promise = resolver->promise(); |
- resolver->reject("not implemented"); |
+ if (m_webCacheStorage) |
+ m_webCacheStorage->dispatchCreate(new CacheStorageWithCacheCallbacks(resolver), key); |
+ else |
+ resolver->reject("no implementation provided"); |
return promise; |
} |
@@ -31,7 +120,10 @@ ScriptPromise CacheStorage::rename(ScriptState* scriptState, const String& oldKe |
RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); |
const ScriptPromise promise = resolver->promise(); |
- resolver->reject("not implemented"); |
+ if (m_webCacheStorage) |
+ m_webCacheStorage->dispatchRename(new CacheStorageCallbacks(resolver), oldKey, newKey); |
+ else |
+ resolver->reject("no implementation provided"); |
return promise; |
} |
@@ -41,7 +133,10 @@ ScriptPromise CacheStorage::get(ScriptState* scriptState, const String& key) |
RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); |
const ScriptPromise promise = resolver->promise(); |
- resolver->reject("not implemented"); |
+ if (m_webCacheStorage) |
+ m_webCacheStorage->dispatchGet(new CacheStorageWithCacheCallbacks(resolver), key); |
+ else |
+ resolver->reject("no implementation provided"); |
return promise; |
} |
@@ -51,7 +146,10 @@ ScriptPromise CacheStorage::deleteFunction(ScriptState* scriptState, const Strin |
RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); |
const ScriptPromise promise = resolver->promise(); |
- resolver->reject("not implemented"); |
+ if (m_webCacheStorage) |
+ m_webCacheStorage->dispatchDelete(new CacheStorageCallbacks(resolver), key); |
+ else |
+ resolver->reject("no implementation provided"); |
return promise; |
} |
@@ -61,12 +159,15 @@ ScriptPromise CacheStorage::keys(ScriptState* scriptState) |
RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); |
const ScriptPromise promise = resolver->promise(); |
- resolver->reject("not implemented"); |
+ if (m_webCacheStorage) |
+ m_webCacheStorage->dispatchKeys(new CacheStorageKeysCallbacks(scriptState, resolver)); |
+ else |
+ resolver->reject("no implementation provided"); |
return promise; |
} |
-CacheStorage::CacheStorage() |
+CacheStorage::CacheStorage(WebServiceWorkerCacheStorage* webCacheStorage) : m_webCacheStorage(webCacheStorage) |
{ |
ScriptWrappable::init(this); |
} |