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/Dictionary.h" |
8 #include "bindings/core/v8/ScriptPromiseResolver.h" | 9 #include "bindings/core/v8/ScriptPromiseResolver.h" |
9 #include "bindings/core/v8/ScriptState.h" | 10 #include "bindings/core/v8/ScriptState.h" |
| 11 #include "bindings/core/v8/V8ThrowException.h" |
| 12 #include "core/dom/DOMException.h" |
| 13 #include "modules/serviceworkers/Request.h" |
| 14 #include "modules/serviceworkers/Response.h" |
| 15 #include "public/platform/WebServiceWorkerCache.h" |
10 | 16 |
11 namespace blink { | 17 namespace blink { |
12 | 18 |
13 namespace { | 19 namespace { |
14 | 20 |
| 21 WebServiceWorkerCache::QueryParams queryParamsFromDictionary(const Dictionary& d
ictionary) |
| 22 { |
| 23 WebServiceWorkerCache::QueryParams queryParams; |
| 24 DictionaryHelper::get(dictionary, "ignoreSearch", queryParams.ignoreSearch); |
| 25 DictionaryHelper::get(dictionary, "ignoreMethod", queryParams.ignoreMethod); |
| 26 DictionaryHelper::get(dictionary, "ignoreVary", queryParams.ignoreVary); |
| 27 DictionaryHelper::get(dictionary, "prefixMatch", queryParams.prefixMatch); |
| 28 { |
| 29 String cacheName; |
| 30 DictionaryHelper::get(dictionary, "cacheName", cacheName); |
| 31 queryParams.cacheName = cacheName; |
| 32 } |
| 33 return queryParams; |
| 34 } |
| 35 |
| 36 // FIXME: Consider using CallbackPromiseAdapter. |
| 37 class CacheMatchCallbacks : public WebServiceWorkerCache::CacheMatchCallbacks { |
| 38 WTF_MAKE_NONCOPYABLE(CacheMatchCallbacks); |
| 39 public: |
| 40 CacheMatchCallbacks(PassRefPtr<ScriptPromiseResolver> resolver) |
| 41 : m_resolver(resolver) { } |
| 42 |
| 43 virtual void onSuccess(WebServiceWorkerResponse* webResponse) OVERRIDE |
| 44 { |
| 45 m_resolver->resolve(Response::create(m_resolver->scriptState()->executio
nContext(), *webResponse)); |
| 46 m_resolver.clear(); |
| 47 } |
| 48 |
| 49 virtual void onError(WebServiceWorkerCacheError* reason) OVERRIDE |
| 50 { |
| 51 m_resolver->reject(Cache::domExceptionForCacheError(*reason)); |
| 52 m_resolver.clear(); |
| 53 } |
| 54 |
| 55 private: |
| 56 RefPtr<ScriptPromiseResolver> m_resolver; |
| 57 }; |
| 58 |
| 59 // FIXME: Consider using CallbackPromiseAdapter. |
| 60 class CacheWithResponsesCallbacks : public WebServiceWorkerCache::CacheWithRespo
nsesCallbacks { |
| 61 WTF_MAKE_NONCOPYABLE(CacheWithResponsesCallbacks); |
| 62 public: |
| 63 CacheWithResponsesCallbacks(PassRefPtr<ScriptPromiseResolver> resolver) |
| 64 : m_resolver(resolver) { } |
| 65 |
| 66 virtual void onSuccess(WebVector<WebServiceWorkerResponse>* webResponses) OV
ERRIDE |
| 67 { |
| 68 HeapVector<Member<Response> > responses; |
| 69 for (size_t i = 0; i < webResponses->size(); ++i) |
| 70 responses.append(Response::create(m_resolver->scriptState()->executi
onContext(), (*webResponses)[i])); |
| 71 m_resolver->resolve(responses); |
| 72 m_resolver.clear(); |
| 73 } |
| 74 |
| 75 virtual void onError(WebServiceWorkerCacheError* reason) OVERRIDE |
| 76 { |
| 77 m_resolver->reject(Cache::domExceptionForCacheError(*reason)); |
| 78 m_resolver.clear(); |
| 79 } |
| 80 |
| 81 private: |
| 82 RefPtr<ScriptPromiseResolver> m_resolver; |
| 83 }; |
| 84 |
| 85 // FIXME: Consider using CallbackPromiseAdapter. |
| 86 class CacheWithRequestsCallbacks : public WebServiceWorkerCache::CacheWithReques
tsCallbacks { |
| 87 WTF_MAKE_NONCOPYABLE(CacheWithRequestsCallbacks); |
| 88 public: |
| 89 CacheWithRequestsCallbacks(PassRefPtr<ScriptPromiseResolver> resolver) |
| 90 : m_resolver(resolver) { } |
| 91 |
| 92 virtual void onSuccess(WebVector<WebServiceWorkerRequest>* webRequests) OVER
RIDE |
| 93 { |
| 94 HeapVector<Member<Request> > requests; |
| 95 for (size_t i = 0; i < webRequests->size(); ++i) |
| 96 requests.append(Request::create(m_resolver->scriptState()->execution
Context(), (*webRequests)[i])); |
| 97 m_resolver->resolve(requests); |
| 98 m_resolver.clear(); |
| 99 } |
| 100 |
| 101 virtual void onError(WebServiceWorkerCacheError* reason) OVERRIDE |
| 102 { |
| 103 m_resolver->reject(Cache::domExceptionForCacheError(*reason)); |
| 104 m_resolver.clear(); |
| 105 } |
| 106 |
| 107 private: |
| 108 RefPtr<ScriptPromiseResolver> m_resolver; |
| 109 }; |
| 110 |
| 111 ScriptPromise rejectForCacheError(ScriptState* scriptState, WebServiceWorkerCach
eError error) |
| 112 { |
| 113 return ScriptPromise::rejectWithDOMException(scriptState, Cache::domExceptio
nForCacheError(error)); |
| 114 } |
| 115 |
15 ScriptPromise rejectAsNotImplemented(ScriptState* scriptState) | 116 ScriptPromise rejectAsNotImplemented(ScriptState* scriptState) |
16 { | 117 { |
| 118 return ScriptPromise::rejectWithDOMException(scriptState, DOMException::crea
te(NotSupportedError, "Cache is not implemented")); |
| 119 } |
| 120 |
| 121 } // namespace |
| 122 |
| 123 Cache* Cache::create(WebServiceWorkerCache* webCache) |
| 124 { |
| 125 return new Cache(webCache); |
| 126 } |
| 127 |
| 128 ScriptPromise Cache::match(ScriptState* scriptState, Request* originalRequest, c
onst Dictionary& queryParamsDict) |
| 129 { |
| 130 TrackExceptionState exceptionState; |
| 131 Request* request = Request::create(scriptState->executionContext(), original
Request, exceptionState); |
| 132 if (exceptionState.hadException()) { |
| 133 // FIXME: We should throw the caught error. |
| 134 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou
nd); |
| 135 } |
| 136 return matchImpl(scriptState, request, queryParamsDict); |
| 137 } |
| 138 |
| 139 ScriptPromise Cache::match(ScriptState* scriptState, const String& requestString
, const Dictionary& queryParamsDict) |
| 140 { |
| 141 TrackExceptionState exceptionState; |
| 142 Request* request = Request::create(scriptState->executionContext(), requestS
tring, exceptionState); |
| 143 if (exceptionState.hadException()) { |
| 144 // FIXME: We should throw the caught error. |
| 145 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou
nd); |
| 146 } |
| 147 return matchImpl(scriptState, request, queryParamsDict); |
| 148 } |
| 149 |
| 150 ScriptPromise Cache::matchAll(ScriptState* scriptState, Request* originalRequest
, const Dictionary& queryParamsDict) |
| 151 { |
| 152 TrackExceptionState exceptionState; |
| 153 Request* request = Request::create(scriptState->executionContext(), original
Request, exceptionState); |
| 154 if (exceptionState.hadException()) { |
| 155 // FIXME: We should throw the caught error. |
| 156 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou
nd); |
| 157 } |
| 158 return matchAllImpl(scriptState, request, queryParamsDict); |
| 159 } |
| 160 |
| 161 ScriptPromise Cache::matchAll(ScriptState* scriptState, const String& requestStr
ing, const Dictionary& queryParamsDict) |
| 162 { |
| 163 TrackExceptionState exceptionState; |
| 164 Request* request = Request::create(scriptState->executionContext(), requestS
tring, exceptionState); |
| 165 if (exceptionState.hadException()) { |
| 166 // FIXME: We should throw the caught error. |
| 167 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou
nd); |
| 168 } |
| 169 return matchAllImpl(scriptState, request, queryParamsDict); |
| 170 } |
| 171 |
| 172 ScriptPromise Cache::add(ScriptState* scriptState, Request* originalRequest) |
| 173 { |
| 174 TrackExceptionState exceptionState; |
| 175 Request* request = Request::create(scriptState->executionContext(), original
Request, exceptionState); |
| 176 if (exceptionState.hadException()) { |
| 177 // FIXME: We should throw the caught error. |
| 178 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou
nd); |
| 179 } |
| 180 return addImpl(scriptState, request); |
| 181 } |
| 182 |
| 183 ScriptPromise Cache::add(ScriptState* scriptState, const String& requestString) |
| 184 { |
| 185 TrackExceptionState exceptionState; |
| 186 Request* request = Request::create(scriptState->executionContext(), requestS
tring, exceptionState); |
| 187 if (exceptionState.hadException()) { |
| 188 // FIXME: We should throw the caught error. |
| 189 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou
nd); |
| 190 } |
| 191 return addImpl(scriptState, request); |
| 192 } |
| 193 |
| 194 ScriptPromise Cache::addAll(ScriptState* scriptState, const Vector<ScriptValue>&
rawRequests) |
| 195 { |
| 196 // FIXME: Implement this. |
| 197 return rejectAsNotImplemented(scriptState); |
| 198 } |
| 199 |
| 200 ScriptPromise Cache::deleteFunction(ScriptState* scriptState, Request* originalR
equest, const Dictionary& queryParamsDict) |
| 201 { |
| 202 TrackExceptionState exceptionState; |
| 203 Request* request = Request::create(scriptState->executionContext(), original
Request, exceptionState); |
| 204 if (exceptionState.hadException()) { |
| 205 // FIXME: We should throw the caught error. |
| 206 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou
nd); |
| 207 } |
| 208 return deleteImpl(scriptState, request, queryParamsDict); |
| 209 } |
| 210 |
| 211 ScriptPromise Cache::deleteFunction(ScriptState* scriptState, const String& requ
estString, const Dictionary& queryParamsDict) |
| 212 { |
| 213 TrackExceptionState exceptionState; |
| 214 Request* request = Request::create(scriptState->executionContext(), requestS
tring, exceptionState); |
| 215 if (exceptionState.hadException()) { |
| 216 // FIXME: We should throw the caught error. |
| 217 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou
nd); |
| 218 } |
| 219 return deleteImpl(scriptState, request, queryParamsDict); |
| 220 } |
| 221 |
| 222 ScriptPromise Cache::put(ScriptState* scriptState, Request* originalRequest, Res
ponse* response) |
| 223 { |
| 224 TrackExceptionState exceptionState; |
| 225 Request* request = Request::create(scriptState->executionContext(), original
Request, exceptionState); |
| 226 if (exceptionState.hadException()) { |
| 227 // FIXME: We should throw the caught error. |
| 228 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou
nd); |
| 229 } |
| 230 return putImpl(scriptState, request, response); |
| 231 } |
| 232 |
| 233 ScriptPromise Cache::put(ScriptState* scriptState, const String& requestString,
Response* response) |
| 234 { |
| 235 TrackExceptionState exceptionState; |
| 236 Request* request = Request::create(scriptState->executionContext(), requestS
tring, exceptionState); |
| 237 if (exceptionState.hadException()) { |
| 238 // FIXME: We should throw the caught error. |
| 239 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou
nd); |
| 240 } |
| 241 return putImpl(scriptState, request, response); |
| 242 } |
| 243 |
| 244 ScriptPromise Cache::keys(ScriptState* scriptState) |
| 245 { |
| 246 return keysImpl(scriptState); |
| 247 } |
| 248 |
| 249 ScriptPromise Cache::keys(ScriptState* scriptState, Request* originalRequest, co
nst Dictionary& queryParamsDict) |
| 250 { |
| 251 TrackExceptionState exceptionState; |
| 252 Request* request = Request::create(scriptState->executionContext(), original
Request, exceptionState); |
| 253 if (exceptionState.hadException()) { |
| 254 // FIXME: We should throw the caught error. |
| 255 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou
nd); |
| 256 } |
| 257 return keysImpl(scriptState, request, queryParamsDict); |
| 258 } |
| 259 |
| 260 ScriptPromise Cache::keys(ScriptState* scriptState, const String& requestString,
const Dictionary& queryParamsDict) |
| 261 { |
| 262 TrackExceptionState exceptionState; |
| 263 Request* request = Request::create(scriptState->executionContext(), requestS
tring, exceptionState); |
| 264 if (exceptionState.hadException()) { |
| 265 // FIXME: We should throw the caught error. |
| 266 return rejectForCacheError(scriptState, WebServiceWorkerCacheErrorNotFou
nd); |
| 267 } |
| 268 return keysImpl(scriptState, request, queryParamsDict); |
| 269 } |
| 270 |
| 271 Cache::Cache(WebServiceWorkerCache* webCache) |
| 272 : m_webCache(adoptPtr(webCache)) { } |
| 273 |
| 274 ScriptPromise Cache::matchImpl(ScriptState* scriptState, Request* request, const
Dictionary& queryParamsDict) |
| 275 { |
| 276 WebServiceWorkerRequest webRequest; |
| 277 request->populateWebServiceWorkerRequest(webRequest); |
| 278 |
17 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip
tState); | 279 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip
tState); |
18 const ScriptPromise promise = resolver->promise(); | 280 const ScriptPromise promise = resolver->promise(); |
19 resolver->reject(DOMException::create(NotSupportedError, "Cache is not imple
mented")); | 281 m_webCache->dispatchMatch(new CacheMatchCallbacks(resolver), webRequest, que
ryParamsFromDictionary(queryParamsDict)); |
20 return promise; | 282 return promise; |
21 } | 283 } |
22 | 284 |
23 } | 285 ScriptPromise Cache::matchAllImpl(ScriptState* scriptState, Request* request, co
nst Dictionary& queryParamsDict) |
24 | 286 { |
25 Cache* Cache::create(WebServiceWorkerCache* webCache) | 287 WebServiceWorkerRequest webRequest; |
26 { | 288 request->populateWebServiceWorkerRequest(webRequest); |
27 return new Cache(webCache); | 289 |
28 } | 290 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip
tState); |
29 | 291 const ScriptPromise promise = resolver->promise(); |
30 // FIXME: Implement these methods. | 292 m_webCache->dispatchMatchAll(new CacheWithResponsesCallbacks(resolver), webR
equest, queryParamsFromDictionary(queryParamsDict)); |
31 ScriptPromise Cache::match(ScriptState* scriptState, Request* request, const Dic
tionary& queryParams) | 293 return promise; |
32 { | 294 } |
| 295 |
| 296 ScriptPromise Cache::addImpl(ScriptState* scriptState, Request*) |
| 297 { |
| 298 // FIXME: Implement this. |
33 return rejectAsNotImplemented(scriptState); | 299 return rejectAsNotImplemented(scriptState); |
34 } | 300 } |
35 | 301 |
36 ScriptPromise Cache::match(ScriptState* scriptState, const String& requestString
, const Dictionary& queryParams) | 302 ScriptPromise Cache::addAllImpl(ScriptState* scriptState, Vector<Request*>) |
37 { | 303 { |
| 304 // FIXME: Implement this. |
38 return rejectAsNotImplemented(scriptState); | 305 return rejectAsNotImplemented(scriptState); |
39 } | 306 } |
40 | 307 |
41 ScriptPromise Cache::matchAll(ScriptState* scriptState, Request* request, const
Dictionary& queryParams) | |
42 { | |
43 return rejectAsNotImplemented(scriptState); | |
44 } | |
45 | |
46 ScriptPromise Cache::matchAll(ScriptState* scriptState, const String& requestStr
ing, const Dictionary& queryParams) | |
47 { | |
48 return rejectAsNotImplemented(scriptState); | |
49 } | |
50 | |
51 ScriptPromise Cache::add(ScriptState* scriptState, Request* request) | |
52 { | |
53 return rejectAsNotImplemented(scriptState); | |
54 } | |
55 | |
56 ScriptPromise Cache::add(ScriptState* scriptState, const String& requestString) | |
57 { | |
58 return rejectAsNotImplemented(scriptState); | |
59 } | |
60 | |
61 ScriptPromise Cache::addAll(ScriptState* scriptState, const Vector<ScriptValue>&
rawRequests) | |
62 { | |
63 return rejectAsNotImplemented(scriptState); | |
64 } | |
65 | |
66 ScriptPromise Cache::deleteFunction(ScriptState* scriptState, Request* request,
const Dictionary& queryParams) | |
67 { | |
68 return rejectAsNotImplemented(scriptState); | |
69 } | |
70 | |
71 ScriptPromise Cache::deleteFunction(ScriptState* scriptState, const String& requ
estString, const Dictionary& queryParams) | |
72 { | |
73 return rejectAsNotImplemented(scriptState); | |
74 } | |
75 | |
76 ScriptPromise Cache::put(ScriptState* scriptState, Request* request, Response*) | |
77 { | |
78 return rejectAsNotImplemented(scriptState); | |
79 } | |
80 | |
81 ScriptPromise Cache::put(ScriptState* scriptState, const String& requestString,
Response*) | |
82 { | |
83 return rejectAsNotImplemented(scriptState); | |
84 } | |
85 | |
86 ScriptPromise Cache::keys(ScriptState* scriptState) | |
87 { | |
88 return rejectAsNotImplemented(scriptState); | |
89 } | |
90 | |
91 ScriptPromise Cache::keys(ScriptState* scriptState, Request* request, const Dict
ionary& queryParams) | |
92 { | |
93 return rejectAsNotImplemented(scriptState); | |
94 } | |
95 | |
96 ScriptPromise Cache::keys(ScriptState* scriptState, const String& requestString,
const Dictionary& queryParams) | |
97 { | |
98 return rejectAsNotImplemented(scriptState); | |
99 } | |
100 | |
101 PassRefPtrWillBeRawPtr<DOMException> Cache::domExceptionForCacheError(WebService
WorkerCacheError reason) | 308 PassRefPtrWillBeRawPtr<DOMException> Cache::domExceptionForCacheError(WebService
WorkerCacheError reason) |
102 { | 309 { |
103 switch (reason) { | 310 switch (reason) { |
104 case WebServiceWorkerCacheErrorNotImplemented: | 311 case WebServiceWorkerCacheErrorNotImplemented: |
105 return DOMException::create(NotSupportedError, "Method is not implemente
d."); | 312 return DOMException::create(NotSupportedError, "Method is not implemente
d."); |
106 case WebServiceWorkerCacheErrorNotFound: | 313 case WebServiceWorkerCacheErrorNotFound: |
107 return DOMException::create(NotFoundError, "Entry was not found."); | 314 return DOMException::create(NotFoundError, "Entry was not found."); |
108 case WebServiceWorkerCacheErrorExists: | 315 case WebServiceWorkerCacheErrorExists: |
109 return DOMException::create(InvalidAccessError, "Entry already exists.")
; | 316 return DOMException::create(InvalidAccessError, "Entry already exists.")
; |
110 default: | 317 default: |
111 ASSERT_NOT_REACHED(); | 318 ASSERT_NOT_REACHED(); |
112 return DOMException::create(NotSupportedError, "Unknown error."); | 319 return DOMException::create(NotSupportedError, "Unknown error."); |
113 } | 320 } |
114 } | 321 } |
115 | 322 |
116 Cache::Cache(WebServiceWorkerCache* webCache) : m_webCache(webCache) | 323 ScriptPromise Cache::deleteImpl(ScriptState* scriptState, Request* request, cons
t Dictionary& queryParamsDict) |
117 { | 324 { |
| 325 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1)); |
| 326 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypeDelet
e; |
| 327 request->populateWebServiceWorkerRequest(batchOperations[0].request); |
| 328 batchOperations[0].matchParams = queryParamsFromDictionary(queryParamsDict); |
| 329 |
| 330 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip
tState); |
| 331 const ScriptPromise promise = resolver->promise(); |
| 332 m_webCache->dispatchBatch(new CacheWithResponsesCallbacks(resolver), batchOp
erations); |
| 333 return promise; |
| 334 } |
| 335 |
| 336 ScriptPromise Cache::putImpl(ScriptState* scriptState, Request* request, Respons
e* response) |
| 337 { |
| 338 WebVector<WebServiceWorkerCache::BatchOperation> batchOperations(size_t(1)); |
| 339 batchOperations[0].operationType = WebServiceWorkerCache::OperationTypePut; |
| 340 request->populateWebServiceWorkerRequest(batchOperations[0].request); |
| 341 response->populateWebServiceWorkerResponse(batchOperations[0].response); |
| 342 |
| 343 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip
tState); |
| 344 const ScriptPromise promise = resolver->promise(); |
| 345 m_webCache->dispatchBatch(new CacheWithResponsesCallbacks(resolver), batchOp
erations); |
| 346 return promise; |
| 347 } |
| 348 |
| 349 ScriptPromise Cache::keysImpl(ScriptState* scriptState) |
| 350 { |
| 351 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip
tState); |
| 352 const ScriptPromise promise = resolver->promise(); |
| 353 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, WebSer
viceWorkerCache::QueryParams()); |
| 354 return promise; |
| 355 } |
| 356 |
| 357 ScriptPromise Cache::keysImpl(ScriptState* scriptState, Request* request, const
Dictionary& queryParamsDict) |
| 358 { |
| 359 WebServiceWorkerRequest webRequest; |
| 360 request->populateWebServiceWorkerRequest(webRequest); |
| 361 |
| 362 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip
tState); |
| 363 const ScriptPromise promise = resolver->promise(); |
| 364 m_webCache->dispatchKeys(new CacheWithRequestsCallbacks(resolver), 0, queryP
aramsFromDictionary(queryParamsDict)); |
| 365 return promise; |
118 } | 366 } |
119 | 367 |
120 } // namespace blink | 368 } // namespace blink |
OLD | NEW |