1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
6 #include "modules/serviceworkers/CacheStorage.h"
8 #include "bindings/core/v8/ScriptPromiseResolver.h"
9 #include "bindings/core/v8/ScriptState.h"
10 #include "core/dom/DOMException.h"
11 #include "modules/serviceworkers/Cache.h"
12 #include "public/platform/WebServiceWorkerCacheError.h"
13 #include "public/platform/WebServiceWorkerCacheStorage.h"
19 PassRefPtrWillBeRawPtr<DOMException> createNoImplementationException()
21 return DOMException::create(NotSupportedError, "No CacheStorage implementation provided.");
26 // FIXME: Consider using CallbackPromiseAdapter.
27 class CacheStorage::Callbacks final : public WebServiceWorkerCacheStorage::CacheStorageCallbacks {
28 WTF_MAKE_NONCOPYABLE(Callbacks);
30 explicit Callbacks(PassRefPtr<ScriptPromiseResolver> resolver)
31 : m_resolver(resolver) { }
32 virtual ~Callbacks() { }
34 virtual void onSuccess() override
36 m_resolver->resolve(true);
40 virtual void onError(WebServiceWorkerCacheError* reason) override
42 if (*reason == WebServiceWorkerCacheErrorNotFound)
43 m_resolver->resolve(false);
45 m_resolver->reject(Cache::domExceptionForCacheError(*reason));
50 RefPtr<ScriptPromiseResolver> m_resolver;
53 // FIXME: Consider using CallbackPromiseAdapter.
54 class CacheStorage::WithCacheCallbacks final : public WebServiceWorkerCacheStorage::CacheStorageWithCacheCallbacks {
55 WTF_MAKE_NONCOPYABLE(WithCacheCallbacks);
57 WithCacheCallbacks(const String& cacheName, CacheStorage* cacheStorage, PassRefPtr<ScriptPromiseResolver> resolver)
58 : m_cacheName(cacheName), m_cacheStorage(cacheStorage), m_resolver(resolver) { }
59 virtual ~WithCacheCallbacks() { }
61 virtual void onSuccess(WebServiceWorkerCache* webCache) override
63 // FIXME: Remove this once content's WebServiceWorkerCache implementation has landed.
65 m_resolver->reject("not implemented");
68 Cache* cache = Cache::create(webCache);
69 m_cacheStorage->m_nameToCacheMap.set(m_cacheName, cache);
70 m_resolver->resolve(cache);
74 virtual void onError(WebServiceWorkerCacheError* reason) override
76 if (*reason == WebServiceWorkerCacheErrorNotFound)
77 m_resolver->resolve();
79 m_resolver->reject(Cache::domExceptionForCacheError(*reason));
85 Persistent<CacheStorage> m_cacheStorage;
86 RefPtr<ScriptPromiseResolver> m_resolver;
89 // FIXME: Consider using CallbackPromiseAdapter.
90 class CacheStorage::DeleteCallbacks final : public WebServiceWorkerCacheStorage::CacheStorageCallbacks {
91 WTF_MAKE_NONCOPYABLE(DeleteCallbacks);
93 DeleteCallbacks(const String& cacheName, CacheStorage* cacheStorage, PassRefPtr<ScriptPromiseResolver> resolver)
94 : m_cacheName(cacheName), m_cacheStorage(cacheStorage), m_resolver(resolver) { }
95 virtual ~DeleteCallbacks() { }
97 virtual void onSuccess() override
99 m_cacheStorage->m_nameToCacheMap.remove(m_cacheName);
100 m_resolver->resolve(true);
104 virtual void onError(WebServiceWorkerCacheError* reason) override
106 if (*reason == WebServiceWorkerCacheErrorNotFound)
107 m_resolver->resolve(false);
109 m_resolver->reject(Cache::domExceptionForCacheError(*reason));
115 Persistent<CacheStorage> m_cacheStorage;
116 RefPtr<ScriptPromiseResolver> m_resolver;
119 // FIXME: Consider using CallbackPromiseAdapter.
120 class CacheStorage::KeysCallbacks final : public WebServiceWorkerCacheStorage::CacheStorageKeysCallbacks {
121 WTF_MAKE_NONCOPYABLE(KeysCallbacks);
123 explicit KeysCallbacks(PassRefPtr<ScriptPromiseResolver> resolver)
124 : m_resolver(resolver) { }
125 virtual ~KeysCallbacks() { }
127 virtual void onSuccess(WebVector<WebString>* keys) override
129 Vector<String> wtfKeys;
130 for (size_t i = 0; i < keys->size(); ++i)
131 wtfKeys.append((*keys)[i]);
132 m_resolver->resolve(wtfKeys);
136 virtual void onError(WebServiceWorkerCacheError* reason) override
138 m_resolver->reject(Cache::domExceptionForCacheError(*reason));
143 RefPtr<ScriptPromiseResolver> m_resolver;
146 CacheStorage* CacheStorage::create(WebServiceWorkerCacheStorage* webCacheStorage)
148 return new CacheStorage(webCacheStorage);
151 ScriptPromise CacheStorage::open(ScriptState* scriptState, const String& cacheName)
153 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
154 const ScriptPromise promise = resolver->promise();
156 if (m_nameToCacheMap.contains(cacheName)) {
157 Cache* cache = m_nameToCacheMap.find(cacheName)->value;
158 resolver->resolve(cache);
162 if (m_webCacheStorage)
163 m_webCacheStorage->dispatchOpen(new WithCacheCallbacks(cacheName, this, resolver), cacheName);
165 resolver->reject(createNoImplementationException());
170 ScriptPromise CacheStorage::has(ScriptState* scriptState, const String& cacheName)
172 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
173 const ScriptPromise promise = resolver->promise();
175 if (m_nameToCacheMap.contains(cacheName)) {
176 resolver->resolve(true);
180 if (m_webCacheStorage)
181 m_webCacheStorage->dispatchHas(new Callbacks(resolver), cacheName);
183 resolver->reject(createNoImplementationException());
188 ScriptPromise CacheStorage::deleteFunction(ScriptState* scriptState, const String& cacheName)
190 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
191 const ScriptPromise promise = resolver->promise();
193 if (m_webCacheStorage)
194 m_webCacheStorage->dispatchDelete(new DeleteCallbacks(cacheName, this, resolver), cacheName);
196 resolver->reject(createNoImplementationException());
201 ScriptPromise CacheStorage::keys(ScriptState* scriptState)
203 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
204 const ScriptPromise promise = resolver->promise();
206 if (m_webCacheStorage)
207 m_webCacheStorage->dispatchKeys(new KeysCallbacks(resolver));
209 resolver->reject(createNoImplementationException());
214 void CacheStorage::trace(Visitor* visitor)
216 visitor->trace(m_nameToCacheMap);
219 CacheStorage::CacheStorage(WebServiceWorkerCacheStorage* webCacheStorage)
220 : m_webCacheStorage(webCacheStorage)