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

Side by Side Diff: Source/modules/serviceworkers/Cache.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/Cache.h" 6 #include "modules/serviceworkers/Cache.h"
7 7
8 #include "bindings/core/v8/ExceptionState.h" 8 #include "bindings/core/v8/ExceptionState.h"
9 #include "bindings/core/v8/ScriptPromiseResolver.h" 9 #include "bindings/core/v8/ScriptPromiseResolver.h"
10 #include "bindings/core/v8/ScriptState.h" 10 #include "bindings/core/v8/ScriptState.h"
(...skipping 15 matching lines...) Expand all
26 webQueryParams.ignoreVary = options.ignoreVary(); 26 webQueryParams.ignoreVary = options.ignoreVary();
27 webQueryParams.prefixMatch = options.prefixMatch(); 27 webQueryParams.prefixMatch = options.prefixMatch();
28 webQueryParams.cacheName = options.cacheName(); 28 webQueryParams.cacheName = options.cacheName();
29 return webQueryParams; 29 return webQueryParams;
30 } 30 }
31 31
32 // FIXME: Consider using CallbackPromiseAdapter. 32 // FIXME: Consider using CallbackPromiseAdapter.
33 class CacheMatchCallbacks : public WebServiceWorkerCache::CacheMatchCallbacks { 33 class CacheMatchCallbacks : public WebServiceWorkerCache::CacheMatchCallbacks {
34 WTF_MAKE_NONCOPYABLE(CacheMatchCallbacks); 34 WTF_MAKE_NONCOPYABLE(CacheMatchCallbacks);
35 public: 35 public:
36 CacheMatchCallbacks(PassRefPtr<ScriptPromiseResolver> resolver) 36 CacheMatchCallbacks(PassRefPtrWillBeRawPtr<ScriptPromiseResolver> resolver)
37 : m_resolver(resolver) { } 37 : m_resolver(resolver) { }
38 38
39 virtual void onSuccess(WebServiceWorkerResponse* webResponse) override 39 virtual void onSuccess(WebServiceWorkerResponse* webResponse) override
40 { 40 {
41 m_resolver->resolve(Response::create(m_resolver->scriptState()->executio nContext(), *webResponse)); 41 m_resolver->resolve(Response::create(m_resolver->scriptState()->executio nContext(), *webResponse));
42 m_resolver.clear(); 42 m_resolver.clear();
43 } 43 }
44 44
45 virtual void onError(WebServiceWorkerCacheError* reason) override 45 virtual void onError(WebServiceWorkerCacheError* reason) override
46 { 46 {
47 if (*reason == WebServiceWorkerCacheErrorNotFound) 47 if (*reason == WebServiceWorkerCacheErrorNotFound)
48 m_resolver->resolve(); 48 m_resolver->resolve();
49 else 49 else
50 m_resolver->reject(Cache::domExceptionForCacheError(*reason)); 50 m_resolver->reject(Cache::domExceptionForCacheError(*reason));
51 m_resolver.clear(); 51 m_resolver.clear();
52 } 52 }
53 53
54 private: 54 private:
55 RefPtr<ScriptPromiseResolver> m_resolver; 55 RefPtrWillBeCrossThreadPersistent<ScriptPromiseResolver> m_resolver;
56 }; 56 };
57 57
58 // FIXME: Consider using CallbackPromiseAdapter. 58 // FIXME: Consider using CallbackPromiseAdapter.
59 class CacheWithResponsesCallbacks : public WebServiceWorkerCache::CacheWithRespo nsesCallbacks { 59 class CacheWithResponsesCallbacks : public WebServiceWorkerCache::CacheWithRespo nsesCallbacks {
60 WTF_MAKE_NONCOPYABLE(CacheWithResponsesCallbacks); 60 WTF_MAKE_NONCOPYABLE(CacheWithResponsesCallbacks);
61 public: 61 public:
62 CacheWithResponsesCallbacks(PassRefPtr<ScriptPromiseResolver> resolver) 62 CacheWithResponsesCallbacks(PassRefPtrWillBeRawPtr<ScriptPromiseResolver> re solver)
63 : m_resolver(resolver) { } 63 : m_resolver(resolver) { }
64 64
65 virtual void onSuccess(WebVector<WebServiceWorkerResponse>* webResponses) ov erride 65 virtual void onSuccess(WebVector<WebServiceWorkerResponse>* webResponses) ov erride
66 { 66 {
67 HeapVector<Member<Response> > responses; 67 HeapVector<Member<Response> > responses;
68 for (size_t i = 0; i < webResponses->size(); ++i) 68 for (size_t i = 0; i < webResponses->size(); ++i)
69 responses.append(Response::create(m_resolver->scriptState()->executi onContext(), (*webResponses)[i])); 69 responses.append(Response::create(m_resolver->scriptState()->executi onContext(), (*webResponses)[i]));
70 m_resolver->resolve(responses); 70 m_resolver->resolve(responses);
71 m_resolver.clear(); 71 m_resolver.clear();
72 } 72 }
73 73
74 virtual void onError(WebServiceWorkerCacheError* reason) override 74 virtual void onError(WebServiceWorkerCacheError* reason) override
75 { 75 {
76 m_resolver->reject(Cache::domExceptionForCacheError(*reason)); 76 m_resolver->reject(Cache::domExceptionForCacheError(*reason));
77 m_resolver.clear(); 77 m_resolver.clear();
78 } 78 }
79 79
80 protected: 80 protected:
81 RefPtr<ScriptPromiseResolver> m_resolver; 81 RefPtrWillBeCrossThreadPersistent<ScriptPromiseResolver> m_resolver;
82 }; 82 };
83 83
84 // FIXME: Consider using CallbackPromiseAdapter. 84 // FIXME: Consider using CallbackPromiseAdapter.
85 class CacheAddOrPutCallbacks : public CacheWithResponsesCallbacks { 85 class CacheAddOrPutCallbacks : public CacheWithResponsesCallbacks {
86 WTF_MAKE_NONCOPYABLE(CacheAddOrPutCallbacks); 86 WTF_MAKE_NONCOPYABLE(CacheAddOrPutCallbacks);
87 public: 87 public:
88 CacheAddOrPutCallbacks(PassRefPtr<ScriptPromiseResolver> resolver) 88 CacheAddOrPutCallbacks(PassRefPtrWillBeRawPtr<ScriptPromiseResolver> resolve r)
89 : CacheWithResponsesCallbacks(resolver) { } 89 : CacheWithResponsesCallbacks(resolver) { }
90 90
91 virtual void onSuccess(WebVector<WebServiceWorkerResponse>* webResponses) ov erride 91 virtual void onSuccess(WebVector<WebServiceWorkerResponse>* webResponses) ov erride
92 { 92 {
93 // FIXME: Since response is ignored, consider simplifying public API. 93 // FIXME: Since response is ignored, consider simplifying public API.
94 m_resolver->resolve(); 94 m_resolver->resolve();
95 m_resolver.clear(); 95 m_resolver.clear();
96 } 96 }
97 }; 97 };
98 98
99 // FIXME: Consider using CallbackPromiseAdapter. 99 // FIXME: Consider using CallbackPromiseAdapter.
100 class CacheDeleteCallback : public WebServiceWorkerCache::CacheWithResponsesCall backs { 100 class CacheDeleteCallback : public WebServiceWorkerCache::CacheWithResponsesCall backs {
101 WTF_MAKE_NONCOPYABLE(CacheDeleteCallback); 101 WTF_MAKE_NONCOPYABLE(CacheDeleteCallback);
102 public: 102 public:
103 CacheDeleteCallback(PassRefPtr<ScriptPromiseResolver> resolver) 103 CacheDeleteCallback(PassRefPtrWillBeRawPtr<ScriptPromiseResolver> resolver)
104 : m_resolver(resolver) { } 104 : m_resolver(resolver) { }
105 105
106 virtual void onSuccess(WebVector<WebServiceWorkerResponse>* webResponses) ov erride 106 virtual void onSuccess(WebVector<WebServiceWorkerResponse>* webResponses) ov erride
107 { 107 {
108 // FIXME: Since response is ignored, consider simplifying public API. 108 // FIXME: Since response is ignored, consider simplifying public API.
109 m_resolver->resolve(true); 109 m_resolver->resolve(true);
110 m_resolver.clear(); 110 m_resolver.clear();
111 } 111 }
112 112
113 virtual void onError(WebServiceWorkerCacheError* reason) override 113 virtual void onError(WebServiceWorkerCacheError* reason) override
114 { 114 {
115 if (*reason == WebServiceWorkerCacheErrorNotFound) 115 if (*reason == WebServiceWorkerCacheErrorNotFound)
116 m_resolver->resolve(false); 116 m_resolver->resolve(false);
117 else 117 else
118 m_resolver->reject(Cache::domExceptionForCacheError(*reason)); 118 m_resolver->reject(Cache::domExceptionForCacheError(*reason));
119 m_resolver.clear(); 119 m_resolver.clear();
120 } 120 }
121 121
122 private: 122 private:
123 RefPtr<ScriptPromiseResolver> m_resolver; 123 RefPtrWillBeCrossThreadPersistent<ScriptPromiseResolver> m_resolver;
124 }; 124 };
125 125
126 // FIXME: Consider using CallbackPromiseAdapter. 126 // FIXME: Consider using CallbackPromiseAdapter.
127 class CacheWithRequestsCallbacks : public WebServiceWorkerCache::CacheWithReques tsCallbacks { 127 class CacheWithRequestsCallbacks : public WebServiceWorkerCache::CacheWithReques tsCallbacks {
128 WTF_MAKE_NONCOPYABLE(CacheWithRequestsCallbacks); 128 WTF_MAKE_NONCOPYABLE(CacheWithRequestsCallbacks);
129 public: 129 public:
130 CacheWithRequestsCallbacks(PassRefPtr<ScriptPromiseResolver> resolver) 130 CacheWithRequestsCallbacks(PassRefPtrWillBeRawPtr<ScriptPromiseResolver> res olver)
131 : m_resolver(resolver) { } 131 : m_resolver(resolver) { }
132 132
133 virtual void onSuccess(WebVector<WebServiceWorkerRequest>* webRequests) over ride 133 virtual void onSuccess(WebVector<WebServiceWorkerRequest>* webRequests) over ride
134 { 134 {
135 HeapVector<Member<Request> > requests; 135 HeapVector<Member<Request> > requests;
136 for (size_t i = 0; i < webRequests->size(); ++i) 136 for (size_t i = 0; i < webRequests->size(); ++i)
137 requests.append(Request::create(m_resolver->scriptState()->execution Context(), (*webRequests)[i])); 137 requests.append(Request::create(m_resolver->scriptState()->execution Context(), (*webRequests)[i]));
138 m_resolver->resolve(requests); 138 m_resolver->resolve(requests);
139 m_resolver.clear(); 139 m_resolver.clear();
140 } 140 }
141 141
142 virtual void onError(WebServiceWorkerCacheError* reason) override 142 virtual void onError(WebServiceWorkerCacheError* reason) override
143 { 143 {
144 m_resolver->reject(Cache::domExceptionForCacheError(*reason)); 144 m_resolver->reject(Cache::domExceptionForCacheError(*reason));
145 m_resolver.clear(); 145 m_resolver.clear();
146 } 146 }
147 147
148 private: 148 private:
149 RefPtr<ScriptPromiseResolver> m_resolver; 149 RefPtrWillBeCrossThreadPersistent<ScriptPromiseResolver> m_resolver;
150 }; 150 };
151 151
152 ScriptPromise rejectAsNotImplemented(ScriptState* scriptState) 152 ScriptPromise rejectAsNotImplemented(ScriptState* scriptState)
153 { 153 {
154 return ScriptPromise::rejectWithDOMException(scriptState, DOMException::crea te(NotSupportedError, "Cache is not implemented")); 154 return ScriptPromise::rejectWithDOMException(scriptState, DOMException::crea te(NotSupportedError, "Cache is not implemented"));
155 } 155 }
156 156
157 } // namespace 157 } // namespace
158 158
159 Cache* Cache::create(WebServiceWorkerCache* webCache) 159 Cache* Cache::create(WebServiceWorkerCache* webCache)
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 } 239 }
240 240
241 Cache::Cache(WebServiceWorkerCache* webCache) 241 Cache::Cache(WebServiceWorkerCache* webCache)
242 : m_webCache(adoptPtr(webCache)) { } 242 : m_webCache(adoptPtr(webCache)) { }
243 243
244 ScriptPromise Cache::matchImpl(ScriptState* scriptState, const Request* request, const CacheQueryOptions& options) 244 ScriptPromise Cache::matchImpl(ScriptState* scriptState, const Request* request, const CacheQueryOptions& options)
245 { 245 {
246 WebServiceWorkerRequest webRequest; 246 WebServiceWorkerRequest webRequest;
247 request->populateWebServiceWorkerRequest(webRequest); 247 request->populateWebServiceWorkerRequest(webRequest);
248 248
249 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState); 249 RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver:: create(scriptState);
250 const ScriptPromise promise = resolver->promise(); 250 const ScriptPromise promise = resolver->promise();
251 m_webCache->dispatchMatch(new CacheMatchCallbacks(resolver), webRequest, toW ebQueryParams(options)); 251 m_webCache->dispatchMatch(new CacheMatchCallbacks(resolver), webRequest, toW ebQueryParams(options));
252 return promise; 252 return promise;
253 } 253 }
254 254
255 ScriptPromise Cache::matchAllImpl(ScriptState* scriptState, const Request* reque st, const CacheQueryOptions& options) 255 ScriptPromise Cache::matchAllImpl(ScriptState* scriptState, const Request* reque st, const CacheQueryOptions& options)
256 { 256 {
257 WebServiceWorkerRequest webRequest; 257 WebServiceWorkerRequest webRequest;
258 request->populateWebServiceWorkerRequest(webRequest); 258 request->populateWebServiceWorkerRequest(webRequest);
259 259
260 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState); 260 RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver:: create(scriptState);
261 const ScriptPromise promise = resolver->promise(); 261 const ScriptPromise promise = resolver->promise();
262 m_webCache->dispatchMatchAll(new CacheWithResponsesCallbacks(resolver), webR equest, toWebQueryParams(options)); 262 m_webCache->dispatchMatchAll(new CacheWithResponsesCallbacks(resolver), webR equest, toWebQueryParams(options));
263 return promise; 263 return promise;
264 } 264 }
265 265
266 ScriptPromise Cache::addImpl(ScriptState* scriptState, const Request*) 266 ScriptPromise Cache::addImpl(ScriptState* scriptState, const Request*)
267 { 267 {
268 // FIXME: Implement this. 268 // FIXME: Implement this.
269 return rejectAsNotImplemented(scriptState); 269 return rejectAsNotImplemented(scriptState);
270 } 270 }
(...skipping 19 matching lines...) Expand all
290 } 290 }
291 } 291 }
292 292
293 ScriptPromise Cache::deleteImpl(ScriptState* scriptState, const Request* request , const CacheQueryOptions& options) 293 ScriptPromise Cache::deleteImpl(ScriptState* scriptState, const Request* request , const CacheQueryOptions& options)
294 { 294 {
295 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1)); 295 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1));
296 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypeDelet e; 296 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypeDelet e;
297 request->populateWebServiceWorkerRequest(batchOperations[0].request); 297 request->populateWebServiceWorkerRequest(batchOperations[0].request);
298 batchOperations[0].matchParams = toWebQueryParams(options); 298 batchOperations[0].matchParams = toWebQueryParams(options);
299 299
300 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState); 300 RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver:: create(scriptState);
301 const ScriptPromise promise = resolver->promise(); 301 const ScriptPromise promise = resolver->promise();
302 m_webCache->dispatchBatch(new CacheDeleteCallback(resolver), batchOperations ); 302 m_webCache->dispatchBatch(new CacheDeleteCallback(resolver), batchOperations );
303 return promise; 303 return promise;
304 } 304 }
305 305
306 ScriptPromise Cache::putImpl(ScriptState* scriptState, Request* request, Respons e* response) 306 ScriptPromise Cache::putImpl(ScriptState* scriptState, Request* request, Respons e* response)
307 { 307 {
308 KURL url(KURL(), request->url()); 308 KURL url(KURL(), request->url());
309 if (!url.protocolIsInHTTPFamily()) 309 if (!url.protocolIsInHTTPFamily())
310 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(scriptState->isolate(), "Request scheme '" + url.protocol() + "' is unsuppor ted")); 310 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(scriptState->isolate(), "Request scheme '" + url.protocol() + "' is unsuppor ted"));
311 if (request->method() != "GET") 311 if (request->method() != "GET")
312 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(scriptState->isolate(), "Request method '" + request->method() + "' is unsup ported")); 312 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(scriptState->isolate(), "Request method '" + request->method() + "' is unsup ported"));
313 if (request->hasBody() && request->bodyUsed()) 313 if (request->hasBody() && request->bodyUsed())
314 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(scriptState->isolate(), "Request body is already used")); 314 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(scriptState->isolate(), "Request body is already used"));
315 if (response->hasBody() && response->bodyUsed()) 315 if (response->hasBody() && response->bodyUsed())
316 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(scriptState->isolate(), "Response body is already used")); 316 return ScriptPromise::reject(scriptState, V8ThrowException::createTypeEr ror(scriptState->isolate(), "Response body is already used"));
317 317
318 if (request->hasBody()) 318 if (request->hasBody())
319 request->setBodyUsed(); 319 request->setBodyUsed();
320 if (response->hasBody()) 320 if (response->hasBody())
321 response->setBodyUsed(); 321 response->setBodyUsed();
322 322
323 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1)); 323 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1));
324 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypePut; 324 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypePut;
325 request->populateWebServiceWorkerRequest(batchOperations[0].request); 325 request->populateWebServiceWorkerRequest(batchOperations[0].request);
326 response->populateWebServiceWorkerResponse(batchOperations[0].response); 326 response->populateWebServiceWorkerResponse(batchOperations[0].response);
327 327
328 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState); 328 RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver:: create(scriptState);
329 const ScriptPromise promise = resolver->promise(); 329 const ScriptPromise promise = resolver->promise();
330 m_webCache->dispatchBatch(new CacheAddOrPutCallbacks(resolver), batchOperati ons); 330 m_webCache->dispatchBatch(new CacheAddOrPutCallbacks(resolver), batchOperati ons);
331 return promise; 331 return promise;
332 } 332 }
333 333
334 ScriptPromise Cache::keysImpl(ScriptState* scriptState) 334 ScriptPromise Cache::keysImpl(ScriptState* scriptState)
335 { 335 {
336 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState); 336 RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver:: create(scriptState);
337 const ScriptPromise promise = resolver->promise(); 337 const ScriptPromise promise = resolver->promise();
338 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, WebSer viceWorkerCache::QueryParams()); 338 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, WebSer viceWorkerCache::QueryParams());
339 return promise; 339 return promise;
340 } 340 }
341 341
342 ScriptPromise Cache::keysImpl(ScriptState* scriptState, const Request* request, const CacheQueryOptions& options) 342 ScriptPromise Cache::keysImpl(ScriptState* scriptState, const Request* request, const CacheQueryOptions& options)
343 { 343 {
344 WebServiceWorkerRequest webRequest; 344 WebServiceWorkerRequest webRequest;
345 request->populateWebServiceWorkerRequest(webRequest); 345 request->populateWebServiceWorkerRequest(webRequest);
346 346
347 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState); 347 RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver:: create(scriptState);
348 const ScriptPromise promise = resolver->promise(); 348 const ScriptPromise promise = resolver->promise();
349 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, toWebQ ueryParams(options)); 349 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, toWebQ ueryParams(options));
350 return promise; 350 return promise;
351 } 351 }
352 352
353 } // namespace blink 353 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698