Index: Source/modules/serviceworkers/FetchBodyStream.cpp |
diff --git a/Source/modules/serviceworkers/FetchBodyStream.cpp b/Source/modules/serviceworkers/FetchBodyStream.cpp |
index 7adde04b0be03aaa505dde5a99698d59224ac70d..a42706aca6785b21e90e9d68220cb65e6f947352 100644 |
--- a/Source/modules/serviceworkers/FetchBodyStream.cpp |
+++ b/Source/modules/serviceworkers/FetchBodyStream.cpp |
@@ -44,9 +44,17 @@ ScriptPromise FetchBodyStream::readAsync(ScriptState* scriptState, ResponseType |
readType = FileReaderLoader::ReadAsArrayBuffer; |
break; |
case ResponseAsBlob: |
- m_resolver->resolve(Blob::create(m_blobDataHandle)); |
- m_resolver.clear(); |
- return promise; |
+ if (m_blobDataHandle->size() != kuint64max) { |
+ // If the size of |m_blobDataHandle| is set correctly, creates Blob from it. |
+ m_resolver->resolve(Blob::create(m_blobDataHandle)); |
+ m_resolver.clear(); |
+ return promise; |
+ } |
+ // If the size is not set, read as ArrayBuffer and create a new blob to get the size. |
+ // FIXME: This workaround is not good for performance. |
+ // When we will stop using Blob as a base system of FetchBodyStream to support stream, this problem should be solved. |
+ readType = FileReaderLoader::ReadAsArrayBuffer; |
+ break; |
case ResponseAsFormData: |
// FIXME: Implement this. |
ASSERT_NOT_REACHED(); |
@@ -139,10 +147,15 @@ void FetchBodyStream::didFinishLoading() |
case ResponseAsArrayBuffer: |
m_resolver->resolve(m_loader->arrayBufferResult()); |
break; |
- case ResponseAsBlob: |
- // Handled in ::readAsync(). |
- ASSERT_NOT_REACHED(); |
+ case ResponseAsBlob: { |
+ ASSERT(m_blobDataHandle->size() == kuint64max); |
+ OwnPtr<BlobData> blobData = BlobData::create(); |
+ RefPtr<ArrayBuffer> buffer = m_loader->arrayBufferResult(); |
+ blobData->appendArrayBuffer(buffer.get()); |
+ const size_t length = blobData->length(); |
+ m_resolver->resolve(Blob::create(BlobDataHandle::create(blobData.release(), length))); |
break; |
+ } |
case ResponseAsFormData: |
ASSERT_NOT_REACHED(); |
break; |