1c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// found in the LICENSE file.
4c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
5c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "config.h"
6c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "modules/serviceworkers/CacheStorage.h"
7c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
8c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "bindings/core/v8/ScriptPromiseResolver.h"
9c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "bindings/core/v8/ScriptState.h"
109e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "core/dom/DOMException.h"
11e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "modules/serviceworkers/Cache.h"
12c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "public/platform/WebServiceWorkerCacheError.h"
13c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "public/platform/WebServiceWorkerCacheStorage.h"
14c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
15c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
16c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
17c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace {
18c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
199e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)PassRefPtrWillBeRawPtr<DOMException> createNoImplementationException()
20c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
219e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    return DOMException::create(NotSupportedError, "No CacheStorage implementation provided.");
22c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
23c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
269e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)// FIXME: Consider using CallbackPromiseAdapter.
277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass CacheStorage::Callbacks FINAL : public WebServiceWorkerCacheStorage::CacheStorageCallbacks {
287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WTF_MAKE_NONCOPYABLE(Callbacks);
29c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    explicit Callbacks(PassRefPtr<ScriptPromiseResolver> resolver)
317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        : m_resolver(resolver) { }
327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual ~Callbacks() { }
33c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
34c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual void onSuccess() OVERRIDE
35c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
36c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        m_resolver->resolve(true);
379e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_resolver.clear();
38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
39c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
40c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual void onError(WebServiceWorkerCacheError* reason) OVERRIDE
41c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
429e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        if (*reason == WebServiceWorkerCacheErrorNotFound)
439e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            m_resolver->resolve(false);
449e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        else
457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            m_resolver->reject(Cache::domExceptionForCacheError(*reason));
469e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_resolver.clear();
47c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
48c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
49c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
509e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    RefPtr<ScriptPromiseResolver> m_resolver;
51c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
52c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
539e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)// FIXME: Consider using CallbackPromiseAdapter.
547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass CacheStorage::WithCacheCallbacks FINAL : public WebServiceWorkerCacheStorage::CacheStorageWithCacheCallbacks {
557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WTF_MAKE_NONCOPYABLE(WithCacheCallbacks);
56c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WithCacheCallbacks(const String& cacheName, CacheStorage* cacheStorage, PassRefPtr<ScriptPromiseResolver> resolver)
587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        : m_cacheName(cacheName), m_cacheStorage(cacheStorage), m_resolver(resolver) { }
597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual ~WithCacheCallbacks() { }
60c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual void onSuccess(WebServiceWorkerCache* webCache) OVERRIDE
62c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // FIXME: Remove this once content's WebServiceWorkerCache implementation has landed.
647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (!webCache) {
657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            m_resolver->reject("not implemented");
667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            return;
677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        Cache* cache = Cache::create(webCache);
697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_cacheStorage->m_nameToCacheMap.set(m_cacheName, cache);
707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_resolver->resolve(cache);
717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_resolver.clear();
727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual void onError(WebServiceWorkerCacheError* reason) OVERRIDE
757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {
767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (*reason == WebServiceWorkerCacheErrorNotFound)
777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            m_resolver->resolve();
787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        else
797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            m_resolver->reject(Cache::domExceptionForCacheError(*reason));
807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_resolver.clear();
817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciprivate:
847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    String m_cacheName;
857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    Persistent<CacheStorage> m_cacheStorage;
867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtr<ScriptPromiseResolver> m_resolver;
877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci};
887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// FIXME: Consider using CallbackPromiseAdapter.
907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass CacheStorage::DeleteCallbacks FINAL : public WebServiceWorkerCacheStorage::CacheStorageCallbacks {
917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WTF_MAKE_NONCOPYABLE(DeleteCallbacks);
927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccipublic:
937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    DeleteCallbacks(const String& cacheName, CacheStorage* cacheStorage, PassRefPtr<ScriptPromiseResolver> resolver)
947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        : m_cacheName(cacheName), m_cacheStorage(cacheStorage), m_resolver(resolver) { }
957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual ~DeleteCallbacks() { }
967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual void onSuccess() OVERRIDE
987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {
997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_cacheStorage->m_nameToCacheMap.remove(m_cacheName);
1007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_resolver->resolve(true);
1019e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_resolver.clear();
102c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
103c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
104c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual void onError(WebServiceWorkerCacheError* reason) OVERRIDE
105c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1069e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        if (*reason == WebServiceWorkerCacheErrorNotFound)
1079e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            m_resolver->resolve(false);
1089e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        else
1097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            m_resolver->reject(Cache::domExceptionForCacheError(*reason));
1109e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_resolver.clear();
111c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
112c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
113c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
1147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    String m_cacheName;
1157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    Persistent<CacheStorage> m_cacheStorage;
1169e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    RefPtr<ScriptPromiseResolver> m_resolver;
117c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
118c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1199e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)// FIXME: Consider using CallbackPromiseAdapter.
1207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass CacheStorage::KeysCallbacks FINAL : public WebServiceWorkerCacheStorage::CacheStorageKeysCallbacks {
1217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WTF_MAKE_NONCOPYABLE(KeysCallbacks);
122c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
1237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    explicit KeysCallbacks(PassRefPtr<ScriptPromiseResolver> resolver)
1247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        : m_resolver(resolver) { }
1257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual ~KeysCallbacks() { }
126c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
127e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    virtual void onSuccess(WebVector<WebString>* keys) OVERRIDE
128c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
129c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        Vector<String> wtfKeys;
130c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        for (size_t i = 0; i < keys->size(); ++i)
131c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            wtfKeys.append((*keys)[i]);
132c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        m_resolver->resolve(wtfKeys);
1339e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_resolver.clear();
134c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
135c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
136c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual void onError(WebServiceWorkerCacheError* reason) OVERRIDE
137c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
1389e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_resolver->reject(Cache::domExceptionForCacheError(*reason));
1399e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_resolver.clear();
140c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
141c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
142c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
1439e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    RefPtr<ScriptPromiseResolver> m_resolver;
144c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
145c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciCacheStorage* CacheStorage::create(WebServiceWorkerCacheStorage* webCacheStorage)
147c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return new CacheStorage(webCacheStorage);
149c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
150c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
151c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)ScriptPromise CacheStorage::get(ScriptState* scriptState, const String& cacheName)
152c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
153c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
154c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    const ScriptPromise promise = resolver->promise();
155c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_nameToCacheMap.contains(cacheName)) {
1577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        Cache* cache = m_nameToCacheMap.find(cacheName)->value;
1587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        resolver->resolve(cache);
1597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return promise;
1607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
162c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (m_webCacheStorage)
1637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_webCacheStorage->dispatchGet(new WithCacheCallbacks(cacheName, this, resolver), cacheName);
164c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    else
1659e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        resolver->reject(createNoImplementationException());
166c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
167c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return promise;
168c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
169c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
170c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)ScriptPromise CacheStorage::has(ScriptState* scriptState, const String& cacheName)
171c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
172c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
173c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    const ScriptPromise promise = resolver->promise();
174c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_nameToCacheMap.contains(cacheName)) {
1767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        resolver->resolve(true);
1777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return promise;
1787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
180c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (m_webCacheStorage)
1817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_webCacheStorage->dispatchHas(new Callbacks(resolver), cacheName);
182c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    else
1839e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        resolver->reject(createNoImplementationException());
184c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
185c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return promise;
186c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
187c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
188c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)ScriptPromise CacheStorage::createFunction(ScriptState* scriptState, const String& cacheName)
189c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
190c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
191c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    const ScriptPromise promise = resolver->promise();
192c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
193c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (m_webCacheStorage)
1947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_webCacheStorage->dispatchCreate(new WithCacheCallbacks(cacheName, this, resolver), cacheName);
195c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    else
1969e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        resolver->reject(createNoImplementationException());
197c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
198c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return promise;
199c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
200c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
201c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)ScriptPromise CacheStorage::deleteFunction(ScriptState* scriptState, const String& cacheName)
202c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
203c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
204c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    const ScriptPromise promise = resolver->promise();
205c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
206c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (m_webCacheStorage)
2077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_webCacheStorage->dispatchDelete(new DeleteCallbacks(cacheName, this, resolver), cacheName);
208c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    else
2099e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        resolver->reject(createNoImplementationException());
210c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
211c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return promise;
212c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
213c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
214c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)ScriptPromise CacheStorage::keys(ScriptState* scriptState)
215c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
216c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
217c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    const ScriptPromise promise = resolver->promise();
218c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
219c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (m_webCacheStorage)
2207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_webCacheStorage->dispatchKeys(new KeysCallbacks(resolver));
221c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    else
2229e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        resolver->reject(createNoImplementationException());
223c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
224c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return promise;
225c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
226c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
2277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid CacheStorage::trace(Visitor* visitor)
2287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
2297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    visitor->trace(m_nameToCacheMap);
2307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
2317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciCacheStorage::CacheStorage(WebServiceWorkerCacheStorage* webCacheStorage)
2337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    : m_webCacheStorage(webCacheStorage)
234c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
235c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
236c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
237c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
238