OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |