Index: Source/modules/cachestorage/Cache.cpp |
diff --git a/Source/modules/cachestorage/Cache.cpp b/Source/modules/cachestorage/Cache.cpp |
index e711b2a5177ba22e4e5dfc20616d3071eb980c38..f5abc013831d6633d0e0ba6bd6ac0a48789742ae 100644 |
--- a/Source/modules/cachestorage/Cache.cpp |
+++ b/Source/modules/cachestorage/Cache.cpp |
@@ -16,6 +16,7 @@ |
#include "core/dom/ExceptionCode.h" |
#include "modules/cachestorage/CacheStorageError.h" |
#include "modules/fetch/BodyStreamBuffer.h" |
+#include "modules/fetch/FetchDataLoader.h" |
#include "modules/fetch/GlobalFetch.h" |
#include "modules/fetch/Request.h" |
#include "modules/fetch/Response.h" |
@@ -295,20 +296,14 @@ public: |
m_cache->webCache()->dispatchBatch(new CallbackPromiseAdapter<void, CacheStorageError>(m_resolver), m_batchOperations); |
} |
- void onError(DOMException* exception) |
+ void onError(const String& errorMessage) |
{ |
if (m_completed) |
return; |
m_completed = true; |
- m_resolver->reject(exception); |
- } |
- |
- void onError(v8::Local<v8::Value> exception) |
- { |
- if (m_completed) |
- return; |
- m_completed = true; |
- m_resolver->reject(exception); |
+ ScriptState* state = m_resolver->scriptState(); |
+ ScriptState::Scope scope(state); |
+ m_resolver->reject(V8ThrowException::createTypeError(state->isolate(), errorMessage)); |
} |
DEFINE_INLINE_VIRTUAL_TRACE() |
@@ -325,7 +320,8 @@ private: |
Vector<WebServiceWorkerCache::BatchOperation> m_batchOperations; |
}; |
-class Cache::BlobHandleCallbackForPut final : public BodyStreamBuffer::BlobHandleCreatorClient { |
+class Cache::BlobHandleCallbackForPut final : public GarbageCollectedFinalized<BlobHandleCallbackForPut>, public FetchDataLoader::Client { |
+ USING_GARBAGE_COLLECTED_MIXIN(BlobHandleCallbackForPut); |
public: |
BlobHandleCallbackForPut(size_t index, BarrierCallbackForPut* barrierCallback, Request* request, Response* response) |
: m_index(index) |
@@ -336,7 +332,7 @@ public: |
} |
~BlobHandleCallbackForPut() override { } |
- void didCreateBlobHandle(PassRefPtr<BlobDataHandle> handle) override |
+ void didFetchDataLoadedBlobHandle(PassRefPtr<BlobDataHandle> handle) override |
{ |
WebServiceWorkerCache::BatchOperation batchOperation; |
batchOperation.operationType = WebServiceWorkerCache::OperationTypePut; |
@@ -346,15 +342,15 @@ public: |
m_barrierCallback->onSuccess(m_index, batchOperation); |
} |
- void didFail(DOMException* exception) override |
+ void didFetchDataLoadFailed() override |
{ |
- m_barrierCallback->onError(exception); |
+ m_barrierCallback->onError("network error"); |
} |
DEFINE_INLINE_VIRTUAL_TRACE() |
{ |
visitor->trace(m_barrierCallback); |
- BlobHandleCreatorClient::trace(visitor); |
+ FetchDataLoader::Client::trace(visitor); |
} |
private: |
@@ -541,19 +537,19 @@ ScriptPromise Cache::putImpl(ScriptState* scriptState, const HeapVector<Member<R |
for (size_t i = 0; i < requests.size(); ++i) { |
KURL url(KURL(), requests[i]->url()); |
if (!url.protocolIsInHTTPFamily()) { |
- barrierCallback->onError(V8ThrowException::createTypeError(scriptState->isolate(), "Request scheme '" + url.protocol() + "' is unsupported")); |
+ barrierCallback->onError("Request scheme '" + url.protocol() + "' is unsupported"); |
return promise; |
} |
if (requests[i]->method() != "GET") { |
- barrierCallback->onError(V8ThrowException::createTypeError(scriptState->isolate(), "Request method '" + requests[i]->method() + "' is unsupported")); |
+ barrierCallback->onError("Request method '" + requests[i]->method() + "' is unsupported"); |
return promise; |
} |
if (requests[i]->hasBody() && requests[i]->bodyUsed()) { |
- barrierCallback->onError(V8ThrowException::createTypeError(scriptState->isolate(), "Request body is already used")); |
+ barrierCallback->onError("Request body is already used"); |
return promise; |
} |
if (responses[i]->hasBody() && responses[i]->bodyUsed()) { |
- barrierCallback->onError(V8ThrowException::createTypeError(scriptState->isolate(), "Response body is already used")); |
+ barrierCallback->onError("Response body is already used"); |
return promise; |
} |
@@ -562,12 +558,11 @@ ScriptPromise Cache::putImpl(ScriptState* scriptState, const HeapVector<Member<R |
if (responses[i]->hasBody()) |
responses[i]->lockBody(Body::PassBody); |
- if (BodyStreamBuffer* buffer = responses[i]->internalBuffer()) { |
- if (buffer == responses[i]->buffer() && responses[i]->isBodyConsumed()) |
- buffer = responses[i]->createDrainingStream(); |
- // If the response body type is stream, read the all data and create |
+ if (OwnPtr<DrainingBodyStreamBuffer> buffer = responses[i]->createInternalDrainingStream()) { |
+ // If the response has body, read the all data and create |
// the blob handle and dispatch the put batch asynchronously. |
- buffer->readAllAndCreateBlobHandle(responses[i]->internalMIMEType(), new BlobHandleCallbackForPut(i, barrierCallback, requests[i], responses[i])); |
+ FetchDataLoader* loader = FetchDataLoader::createLoaderAsBlobHandle(responses[i]->internalMIMEType()); |
+ buffer->startLoading(loader, new BlobHandleCallbackForPut(i, barrierCallback, requests[i], responses[i])); |
continue; |
} |