3333#include " JSFetchResponse.h"
3434#include " ReadableStreamChunk.h"
3535#include " ScriptExecutionContext.h"
36+ #include " SuspendableTaskQueue.h"
3637#include < wtf/CompletionHandler.h>
3738#include < wtf/URL.h>
3839
@@ -44,6 +45,7 @@ DOMCache::DOMCache(ScriptExecutionContext& context, String&& name, uint64_t iden
4445 , m_name(WTFMove(name))
4546 , m_identifier(identifier)
4647 , m_connection(WTFMove(connection))
48+ , m_taskQueue(SuspendableTaskQueue::create(&context))
4749{
4850 suspendIfNeeded ();
4951 m_connection->reference (m_identifier);
@@ -57,16 +59,18 @@ DOMCache::~DOMCache()
5759
5860void DOMCache::match (RequestInfo&& info, CacheQueryOptions&& options, Ref<DeferredPromise>&& promise)
5961{
60- doMatch (WTFMove (info), WTFMove (options), [promise = WTFMove (promise)](ExceptionOr<FetchResponse*>&& result) mutable {
61- if (result.hasException ()) {
62- promise->reject (result.releaseException ());
63- return ;
64- }
65- if (!result.returnValue ()) {
66- promise->resolve ();
67- return ;
68- }
69- promise->resolve <IDLInterface<FetchResponse>>(*result.returnValue ());
62+ doMatch (WTFMove (info), WTFMove (options), [this , protectedThis = makeRef (*this ), promise = WTFMove (promise)](ExceptionOr<RefPtr<FetchResponse>>&& result) mutable {
63+ m_taskQueue->enqueueTask ([promise = WTFMove (promise), result = WTFMove (result)]() mutable {
64+ if (result.hasException ()) {
65+ promise->reject (result.releaseException ());
66+ return ;
67+ }
68+ if (!result.returnValue ()) {
69+ promise->resolve ();
70+ return ;
71+ }
72+ promise->resolve <IDLInterface<FetchResponse>>(*result.returnValue ());
73+ });
7074 });
7175}
7276
@@ -91,7 +95,7 @@ void DOMCache::doMatch(RequestInfo&& info, CacheQueryOptions&& options, MatchCal
9195 callback (nullptr );
9296 return ;
9397 }
94- callback (result.returnValue ()[0 ].response ->clone (*scriptExecutionContext ()).releaseReturnValue (). ptr ( ));
98+ callback (RefPtr<FetchResponse>( result.returnValue ()[0 ].response ->clone (*scriptExecutionContext ()).releaseReturnValue ()));
9599 });
96100}
97101
@@ -120,20 +124,24 @@ void DOMCache::matchAll(Optional<RequestInfo>&& info, CacheQueryOptions&& option
120124
121125 if (!request) {
122126 retrieveRecords (URL { }, [this , promise = WTFMove (promise)](Optional<Exception>&& exception) mutable {
123- if (exception) {
124- promise.reject (WTFMove (exception.value ()));
125- return ;
126- }
127- promise.resolve (cloneResponses (m_records));
127+ m_taskQueue->enqueueTask ([this , promise = WTFMove (promise), exception = WTFMove (exception)]() mutable {
128+ if (exception) {
129+ promise.reject (WTFMove (exception.value ()));
130+ return ;
131+ }
132+ promise.resolve (cloneResponses (m_records));
133+ });
128134 });
129135 return ;
130136 }
131137 queryCache (request.releaseNonNull (), WTFMove (options), [this , promise = WTFMove (promise)](ExceptionOr<Vector<CacheStorageRecord>>&& result) mutable {
132- if (result.hasException ()) {
133- promise.reject (result.releaseException ());
134- return ;
135- }
136- promise.resolve (cloneResponses (result.releaseReturnValue ()));
138+ m_taskQueue->enqueueTask ([this , promise = WTFMove (promise), result = WTFMove (result)]() mutable {
139+ if (result.hasException ()) {
140+ promise.reject (result.releaseException ());
141+ return ;
142+ }
143+ promise.resolve (cloneResponses (result.releaseReturnValue ()));
144+ });
137145 });
138146}
139147
@@ -235,11 +243,15 @@ void DOMCache::addAll(Vector<RequestInfo>&& infos, DOMPromiseDeferred<void>&& pr
235243
236244 auto taskHandler = FetchTasksHandler::create (*this , [this , promise = WTFMove (promise)](ExceptionOr<Vector<Record>>&& result) mutable {
237245 if (result.hasException ()) {
238- promise.reject (result.releaseException ());
246+ m_taskQueue->enqueueTask ([promise = WTFMove (promise), exception = result.releaseException ()]() mutable {
247+ promise.reject (WTFMove (exception));
248+ });
239249 return ;
240250 }
241- batchPutOperation (result.releaseReturnValue (), [promise = WTFMove (promise)](ExceptionOr<void >&& result) mutable {
242- promise.settle (WTFMove (result));
251+ batchPutOperation (result.releaseReturnValue (), [this , protectedThis = makeRef (*this ), promise = WTFMove (promise)](ExceptionOr<void >&& result) mutable {
252+ m_taskQueue->enqueueTask ([promise = WTFMove (promise), result = WTFMove (result)]() mutable {
253+ promise.settle (WTFMove (result));
254+ });
243255 });
244256 });
245257
@@ -302,15 +314,19 @@ void DOMCache::addAll(Vector<RequestInfo>&& infos, DOMPromiseDeferred<void>&& pr
302314void DOMCache::putWithResponseData (DOMPromiseDeferred<void >&& promise, Ref<FetchRequest>&& request, Ref<FetchResponse>&& response, ExceptionOr<RefPtr<SharedBuffer>>&& responseBody)
303315{
304316 if (responseBody.hasException ()) {
305- promise.reject (responseBody.releaseException ());
317+ m_taskQueue->enqueueTask ([promise = WTFMove (promise), exception = responseBody.releaseException ()]() mutable {
318+ promise.reject (WTFMove (exception));
319+ });
306320 return ;
307321 }
308322
309323 DOMCacheEngine::ResponseBody body;
310324 if (auto buffer = responseBody.releaseReturnValue ())
311325 body = buffer.releaseNonNull ();
312- batchPutOperation (request.get (), response.get (), WTFMove (body), [promise = WTFMove (promise)](ExceptionOr<void >&& result) mutable {
313- promise.settle (WTFMove (result));
326+ batchPutOperation (request.get (), response.get (), WTFMove (body), [this , protectedThis = makeRef (*this ), promise = WTFMove (promise)](ExceptionOr<void >&& result) mutable {
327+ m_taskQueue->enqueueTask ([promise = WTFMove (promise), result = WTFMove (result)]() mutable {
328+ promise.settle (WTFMove (result));
329+ });
314330 });
315331}
316332
@@ -373,8 +389,10 @@ void DOMCache::put(RequestInfo&& info, Ref<FetchResponse>&& response, DOMPromise
373389 return ;
374390 }
375391
376- batchPutOperation (request.get (), response.get (), response->consumeBody (), [promise = WTFMove (promise)](ExceptionOr<void >&& result) mutable {
377- promise.settle (WTFMove (result));
392+ batchPutOperation (request.get (), response.get (), response->consumeBody (), [this , protectedThis = makeRef (*this ), promise = WTFMove (promise)](ExceptionOr<void >&& result) mutable {
393+ m_taskQueue->enqueueTask ([promise = WTFMove (promise), result = WTFMove (result)]() mutable {
394+ promise.settle (WTFMove (result));
395+ });
378396 });
379397}
380398
@@ -389,8 +407,10 @@ void DOMCache::remove(RequestInfo&& info, CacheQueryOptions&& options, DOMPromis
389407 return ;
390408 }
391409
392- batchDeleteOperation (requestOrException.releaseReturnValue (), WTFMove (options), [promise = WTFMove (promise)](ExceptionOr<bool >&& result) mutable {
393- promise.settle (WTFMove (result));
410+ batchDeleteOperation (requestOrException.releaseReturnValue (), WTFMove (options), [this , protectedThis = makeRef (*this ), promise = WTFMove (promise)](ExceptionOr<bool >&& result) mutable {
411+ m_taskQueue->enqueueTask ([promise = WTFMove (promise), result = WTFMove (result)]() mutable {
412+ promise.settle (WTFMove (result));
413+ });
394414 });
395415}
396416
@@ -416,22 +436,26 @@ void DOMCache::keys(Optional<RequestInfo>&& info, CacheQueryOptions&& options, K
416436
417437 if (!request) {
418438 retrieveRecords (URL { }, [this , promise = WTFMove (promise)](Optional<Exception>&& exception) mutable {
419- if (exception) {
420- promise.reject (WTFMove (exception.value ()));
421- return ;
422- }
423- promise.resolve (WTF::map (m_records, copyRequestRef));
439+ m_taskQueue->enqueueTask ([this , promise = WTFMove (promise), exception = WTFMove (exception)]() mutable {
440+ if (exception) {
441+ promise.reject (WTFMove (exception.value ()));
442+ return ;
443+ }
444+ promise.resolve (WTF::map (m_records, copyRequestRef));
445+ });
424446 });
425447 return ;
426448 }
427449
428- queryCache (request.releaseNonNull (), WTFMove (options), [promise = WTFMove (promise)](ExceptionOr<Vector<CacheStorageRecord>>&& result) mutable {
429- if (result.hasException ()) {
430- promise.reject (result.releaseException ());
431- return ;
432- }
450+ queryCache (request.releaseNonNull (), WTFMove (options), [this , protectedThis = makeRef (*this ), promise = WTFMove (promise)](auto && result) mutable {
451+ m_taskQueue->enqueueTask ([promise = WTFMove (promise), result = WTFMove (result)]() mutable {
452+ if (result.hasException ()) {
453+ promise.reject (result.releaseException ());
454+ return ;
455+ }
433456
434- promise.resolve (WTF::map (result.releaseReturnValue (), copyRequestRef));
457+ promise.resolve (WTF::map (result.releaseReturnValue (), copyRequestRef));
458+ });
435459 });
436460}
437461
@@ -586,7 +610,7 @@ const char* DOMCache::activeDOMObjectName() const
586610
587611bool DOMCache::canSuspendForDocumentSuspension () const
588612{
589- return m_records. isEmpty () && ! hasPendingActivity () ;
613+ return true ;
590614}
591615
592616
0 commit comments