Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(553)

Side by Side Diff: Source/modules/serviceworkers/CacheStorage.cpp

Issue 783423003: Make ScriptPromiseResolver RefCountedWillBeRefCountedGarbageCollected. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: WIP: 1st trial Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "modules/serviceworkers/CacheStorage.h" 6 #include "modules/serviceworkers/CacheStorage.h"
7 7
8 #include "bindings/core/v8/ScriptPromiseResolver.h" 8 #include "bindings/core/v8/ScriptPromiseResolver.h"
9 #include "bindings/core/v8/ScriptState.h" 9 #include "bindings/core/v8/ScriptState.h"
10 #include "core/dom/DOMException.h" 10 #include "core/dom/DOMException.h"
(...skipping 10 matching lines...) Expand all
21 { 21 {
22 return DOMException::create(NotSupportedError, "No CacheStorage implementati on provided."); 22 return DOMException::create(NotSupportedError, "No CacheStorage implementati on provided.");
23 } 23 }
24 24
25 } 25 }
26 26
27 // FIXME: Consider using CallbackPromiseAdapter. 27 // FIXME: Consider using CallbackPromiseAdapter.
28 class CacheStorage::Callbacks final : public WebServiceWorkerCacheStorage::Cache StorageCallbacks { 28 class CacheStorage::Callbacks final : public WebServiceWorkerCacheStorage::Cache StorageCallbacks {
29 WTF_MAKE_NONCOPYABLE(Callbacks); 29 WTF_MAKE_NONCOPYABLE(Callbacks);
30 public: 30 public:
31 explicit Callbacks(PassRefPtr<ScriptPromiseResolver> resolver) 31 explicit Callbacks(PassRefPtrWillBeRawPtr<ScriptPromiseResolver> resolver)
32 : m_resolver(resolver) { } 32 : m_resolver(resolver) { }
33 virtual ~Callbacks() { } 33 virtual ~Callbacks() { }
34 34
35 virtual void onSuccess() override 35 virtual void onSuccess() override
36 { 36 {
37 m_resolver->resolve(true); 37 m_resolver->resolve(true);
38 m_resolver.clear(); 38 m_resolver.clear();
39 } 39 }
40 40
41 virtual void onError(WebServiceWorkerCacheError* reason) override 41 virtual void onError(WebServiceWorkerCacheError* reason) override
42 { 42 {
43 if (*reason == WebServiceWorkerCacheErrorNotFound) 43 if (*reason == WebServiceWorkerCacheErrorNotFound)
44 m_resolver->resolve(false); 44 m_resolver->resolve(false);
45 else 45 else
46 m_resolver->reject(Cache::domExceptionForCacheError(*reason)); 46 m_resolver->reject(Cache::domExceptionForCacheError(*reason));
47 m_resolver.clear(); 47 m_resolver.clear();
48 } 48 }
49 49
50 private: 50 private:
51 RefPtr<ScriptPromiseResolver> m_resolver; 51 RefPtrWillBeCrossThreadPersistent<ScriptPromiseResolver> m_resolver;
52 }; 52 };
53 53
54 // FIXME: Consider using CallbackPromiseAdapter. 54 // FIXME: Consider using CallbackPromiseAdapter.
55 class CacheStorage::WithCacheCallbacks final : public WebServiceWorkerCacheStora ge::CacheStorageWithCacheCallbacks { 55 class CacheStorage::WithCacheCallbacks final : public WebServiceWorkerCacheStora ge::CacheStorageWithCacheCallbacks {
56 WTF_MAKE_NONCOPYABLE(WithCacheCallbacks); 56 WTF_MAKE_NONCOPYABLE(WithCacheCallbacks);
57 public: 57 public:
58 WithCacheCallbacks(const String& cacheName, CacheStorage* cacheStorage, Pass RefPtr<ScriptPromiseResolver> resolver) 58 WithCacheCallbacks(const String& cacheName, CacheStorage* cacheStorage, Pass RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver)
59 : m_cacheName(cacheName), m_cacheStorage(cacheStorage), m_resolver(resol ver) { } 59 : m_cacheName(cacheName), m_cacheStorage(cacheStorage), m_resolver(resol ver) { }
60 virtual ~WithCacheCallbacks() { } 60 virtual ~WithCacheCallbacks() { }
61 61
62 virtual void onSuccess(WebServiceWorkerCache* webCache) override 62 virtual void onSuccess(WebServiceWorkerCache* webCache) override
63 { 63 {
64 // FIXME: Remove this once content's WebServiceWorkerCache implementatio n has landed. 64 // FIXME: Remove this once content's WebServiceWorkerCache implementatio n has landed.
65 if (!webCache) { 65 if (!webCache) {
66 m_resolver->reject("not implemented"); 66 m_resolver->reject("not implemented");
67 return; 67 return;
68 } 68 }
69 Cache* cache = Cache::create(webCache); 69 Cache* cache = Cache::create(webCache);
70 m_cacheStorage->m_nameToCacheMap.set(m_cacheName, cache); 70 m_cacheStorage->m_nameToCacheMap.set(m_cacheName, cache);
71 m_resolver->resolve(cache); 71 m_resolver->resolve(cache);
72 m_resolver.clear(); 72 m_resolver.clear();
73 } 73 }
74 74
75 virtual void onError(WebServiceWorkerCacheError* reason) override 75 virtual void onError(WebServiceWorkerCacheError* reason) override
76 { 76 {
77 if (*reason == WebServiceWorkerCacheErrorNotFound) 77 if (*reason == WebServiceWorkerCacheErrorNotFound)
78 m_resolver->resolve(); 78 m_resolver->resolve();
79 else 79 else
80 m_resolver->reject(Cache::domExceptionForCacheError(*reason)); 80 m_resolver->reject(Cache::domExceptionForCacheError(*reason));
81 m_resolver.clear(); 81 m_resolver.clear();
82 } 82 }
83 83
84 private: 84 private:
85 String m_cacheName; 85 String m_cacheName;
86 Persistent<CacheStorage> m_cacheStorage; 86 Persistent<CacheStorage> m_cacheStorage;
87 RefPtr<ScriptPromiseResolver> m_resolver; 87 RefPtrWillBeCrossThreadPersistent<ScriptPromiseResolver> m_resolver;
88 }; 88 };
89 89
90 // FIXME: Consider using CallbackPromiseAdapter. 90 // FIXME: Consider using CallbackPromiseAdapter.
91 class CacheStorage::DeleteCallbacks final : public WebServiceWorkerCacheStorage: :CacheStorageCallbacks { 91 class CacheStorage::DeleteCallbacks final : public WebServiceWorkerCacheStorage: :CacheStorageCallbacks {
92 WTF_MAKE_NONCOPYABLE(DeleteCallbacks); 92 WTF_MAKE_NONCOPYABLE(DeleteCallbacks);
93 public: 93 public:
94 DeleteCallbacks(const String& cacheName, CacheStorage* cacheStorage, PassRef Ptr<ScriptPromiseResolver> resolver) 94 DeleteCallbacks(const String& cacheName, CacheStorage* cacheStorage, PassRef PtrWillBeRawPtr<ScriptPromiseResolver> resolver)
95 : m_cacheName(cacheName), m_cacheStorage(cacheStorage), m_resolver(resol ver) { } 95 : m_cacheName(cacheName), m_cacheStorage(cacheStorage), m_resolver(resol ver) { }
96 virtual ~DeleteCallbacks() { } 96 virtual ~DeleteCallbacks() { }
97 97
98 virtual void onSuccess() override 98 virtual void onSuccess() override
99 { 99 {
100 m_cacheStorage->m_nameToCacheMap.remove(m_cacheName); 100 m_cacheStorage->m_nameToCacheMap.remove(m_cacheName);
101 m_resolver->resolve(true); 101 m_resolver->resolve(true);
102 m_resolver.clear(); 102 m_resolver.clear();
103 } 103 }
104 104
105 virtual void onError(WebServiceWorkerCacheError* reason) override 105 virtual void onError(WebServiceWorkerCacheError* reason) override
106 { 106 {
107 if (*reason == WebServiceWorkerCacheErrorNotFound) 107 if (*reason == WebServiceWorkerCacheErrorNotFound)
108 m_resolver->resolve(false); 108 m_resolver->resolve(false);
109 else 109 else
110 m_resolver->reject(Cache::domExceptionForCacheError(*reason)); 110 m_resolver->reject(Cache::domExceptionForCacheError(*reason));
111 m_resolver.clear(); 111 m_resolver.clear();
112 } 112 }
113 113
114 private: 114 private:
115 String m_cacheName; 115 String m_cacheName;
116 Persistent<CacheStorage> m_cacheStorage; 116 Persistent<CacheStorage> m_cacheStorage;
117 RefPtr<ScriptPromiseResolver> m_resolver; 117 RefPtrWillBeCrossThreadPersistent<ScriptPromiseResolver> m_resolver;
118 }; 118 };
119 119
120 // FIXME: Consider using CallbackPromiseAdapter. 120 // FIXME: Consider using CallbackPromiseAdapter.
121 class CacheStorage::KeysCallbacks final : public WebServiceWorkerCacheStorage::C acheStorageKeysCallbacks { 121 class CacheStorage::KeysCallbacks final : public WebServiceWorkerCacheStorage::C acheStorageKeysCallbacks {
122 WTF_MAKE_NONCOPYABLE(KeysCallbacks); 122 WTF_MAKE_NONCOPYABLE(KeysCallbacks);
123 public: 123 public:
124 explicit KeysCallbacks(PassRefPtr<ScriptPromiseResolver> resolver) 124 explicit KeysCallbacks(PassRefPtrWillBeRawPtr<ScriptPromiseResolver> resolve r)
125 : m_resolver(resolver) { } 125 : m_resolver(resolver) { }
126 virtual ~KeysCallbacks() { } 126 virtual ~KeysCallbacks() { }
127 127
128 virtual void onSuccess(WebVector<WebString>* keys) override 128 virtual void onSuccess(WebVector<WebString>* keys) override
129 { 129 {
130 Vector<String> wtfKeys; 130 Vector<String> wtfKeys;
131 for (size_t i = 0; i < keys->size(); ++i) 131 for (size_t i = 0; i < keys->size(); ++i)
132 wtfKeys.append((*keys)[i]); 132 wtfKeys.append((*keys)[i]);
133 m_resolver->resolve(wtfKeys); 133 m_resolver->resolve(wtfKeys);
134 m_resolver.clear(); 134 m_resolver.clear();
135 } 135 }
136 136
137 virtual void onError(WebServiceWorkerCacheError* reason) override 137 virtual void onError(WebServiceWorkerCacheError* reason) override
138 { 138 {
139 m_resolver->reject(Cache::domExceptionForCacheError(*reason)); 139 m_resolver->reject(Cache::domExceptionForCacheError(*reason));
140 m_resolver.clear(); 140 m_resolver.clear();
141 } 141 }
142 142
143 private: 143 private:
144 RefPtr<ScriptPromiseResolver> m_resolver; 144 RefPtrWillBeCrossThreadPersistent<ScriptPromiseResolver> m_resolver;
145 }; 145 };
146 146
147 CacheStorage* CacheStorage::create(WebServiceWorkerCacheStorage* webCacheStorage ) 147 CacheStorage* CacheStorage::create(WebServiceWorkerCacheStorage* webCacheStorage )
148 { 148 {
149 return new CacheStorage(webCacheStorage); 149 return new CacheStorage(webCacheStorage);
150 } 150 }
151 151
152 ScriptPromise CacheStorage::open(ScriptState* scriptState, const String& cacheNa me) 152 ScriptPromise CacheStorage::open(ScriptState* scriptState, const String& cacheNa me)
153 { 153 {
154 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState); 154 RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver:: create(scriptState);
155 const ScriptPromise promise = resolver->promise(); 155 const ScriptPromise promise = resolver->promise();
156 156
157 if (m_nameToCacheMap.contains(cacheName)) { 157 if (m_nameToCacheMap.contains(cacheName)) {
158 Cache* cache = m_nameToCacheMap.find(cacheName)->value; 158 Cache* cache = m_nameToCacheMap.find(cacheName)->value;
159 resolver->resolve(cache); 159 resolver->resolve(cache);
160 return promise; 160 return promise;
161 } 161 }
162 162
163 if (m_webCacheStorage) 163 if (m_webCacheStorage)
164 m_webCacheStorage->dispatchOpen(new WithCacheCallbacks(cacheName, this, resolver), cacheName); 164 m_webCacheStorage->dispatchOpen(new WithCacheCallbacks(cacheName, this, resolver), cacheName);
165 else 165 else
166 resolver->reject(createNoImplementationException()); 166 resolver->reject(createNoImplementationException());
167 167
168 return promise; 168 return promise;
169 } 169 }
170 170
171 ScriptPromise CacheStorage::has(ScriptState* scriptState, const String& cacheNam e) 171 ScriptPromise CacheStorage::has(ScriptState* scriptState, const String& cacheNam e)
172 { 172 {
173 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState); 173 RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver:: create(scriptState);
174 const ScriptPromise promise = resolver->promise(); 174 const ScriptPromise promise = resolver->promise();
175 175
176 if (m_nameToCacheMap.contains(cacheName)) { 176 if (m_nameToCacheMap.contains(cacheName)) {
177 resolver->resolve(true); 177 resolver->resolve(true);
178 return promise; 178 return promise;
179 } 179 }
180 180
181 if (m_webCacheStorage) 181 if (m_webCacheStorage)
182 m_webCacheStorage->dispatchHas(new Callbacks(resolver), cacheName); 182 m_webCacheStorage->dispatchHas(new Callbacks(resolver), cacheName);
183 else 183 else
184 resolver->reject(createNoImplementationException()); 184 resolver->reject(createNoImplementationException());
185 185
186 return promise; 186 return promise;
187 } 187 }
188 188
189 ScriptPromise CacheStorage::deleteFunction(ScriptState* scriptState, const Strin g& cacheName) 189 ScriptPromise CacheStorage::deleteFunction(ScriptState* scriptState, const Strin g& cacheName)
190 { 190 {
191 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState); 191 RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver:: create(scriptState);
192 const ScriptPromise promise = resolver->promise(); 192 const ScriptPromise promise = resolver->promise();
193 193
194 if (m_webCacheStorage) 194 if (m_webCacheStorage)
195 m_webCacheStorage->dispatchDelete(new DeleteCallbacks(cacheName, this, r esolver), cacheName); 195 m_webCacheStorage->dispatchDelete(new DeleteCallbacks(cacheName, this, r esolver), cacheName);
196 else 196 else
197 resolver->reject(createNoImplementationException()); 197 resolver->reject(createNoImplementationException());
198 198
199 return promise; 199 return promise;
200 } 200 }
201 201
202 ScriptPromise CacheStorage::keys(ScriptState* scriptState) 202 ScriptPromise CacheStorage::keys(ScriptState* scriptState)
203 { 203 {
204 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState); 204 RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver:: create(scriptState);
205 const ScriptPromise promise = resolver->promise(); 205 const ScriptPromise promise = resolver->promise();
206 206
207 if (m_webCacheStorage) 207 if (m_webCacheStorage)
208 m_webCacheStorage->dispatchKeys(new KeysCallbacks(resolver)); 208 m_webCacheStorage->dispatchKeys(new KeysCallbacks(resolver));
209 else 209 else
210 resolver->reject(createNoImplementationException()); 210 resolver->reject(createNoImplementationException());
211 211
212 return promise; 212 return promise;
213 } 213 }
214 214
215 void CacheStorage::trace(Visitor* visitor) 215 void CacheStorage::trace(Visitor* visitor)
216 { 216 {
217 visitor->trace(m_nameToCacheMap); 217 visitor->trace(m_nameToCacheMap);
218 } 218 }
219 219
220 CacheStorage::CacheStorage(WebServiceWorkerCacheStorage* webCacheStorage) 220 CacheStorage::CacheStorage(WebServiceWorkerCacheStorage* webCacheStorage)
221 : m_webCacheStorage(webCacheStorage) 221 : m_webCacheStorage(webCacheStorage)
222 { 222 {
223 } 223 }
224 224
225 } // namespace blink 225 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698