| Index: Source/modules/serviceworkers/Body.cpp
|
| diff --git a/Source/modules/serviceworkers/Body.cpp b/Source/modules/serviceworkers/Body.cpp
|
| index 089747b24511f98dfbf4acbf5aaae110012a0a30..7b7b6b0bc22b747f9bf0038cf3c9e2e36a7e9860 100644
|
| --- a/Source/modules/serviceworkers/Body.cpp
|
| +++ b/Source/modules/serviceworkers/Body.cpp
|
| @@ -15,9 +15,37 @@
|
| #include "core/fileapi/FileReaderLoader.h"
|
| #include "core/fileapi/FileReaderLoaderClient.h"
|
| #include "core/streams/UnderlyingSource.h"
|
| +#include "modules/serviceworkers/BodyStreamBuffer.h"
|
|
|
| namespace blink {
|
|
|
| +class Body::BlobHandleResolver final : public BodyStreamBuffer::BlobHandleCreatorClient {
|
| +public:
|
| + explicit BlobHandleResolver(Body* body)
|
| + : m_body(body)
|
| + {
|
| + }
|
| + void didCreateBlobHandle(PassRefPtr<BlobDataHandle> handle) override
|
| + {
|
| + ASSERT(m_body);
|
| + m_body->readAsyncFromBlob(handle);
|
| + m_body = nullptr;
|
| + }
|
| + void didFail(PassRefPtrWillBeRawPtr<DOMException> exception) override
|
| + {
|
| + ASSERT(m_body);
|
| + m_body->didBlobHandleResolveError(exception);
|
| + m_body = nullptr;
|
| + }
|
| + void trace(Visitor* visitor) override
|
| + {
|
| + BodyStreamBuffer::BlobHandleCreatorClient::trace(visitor);
|
| + visitor->trace(m_body);
|
| + }
|
| +private:
|
| + Member<Body> m_body;
|
| +};
|
| +
|
| class Body::ReadableStreamSource : public GarbageCollectedFinalized<ReadableStreamSource>, public UnderlyingSource {
|
| USING_GARBAGE_COLLECTED_MIXIN(ReadableStreamSource);
|
| public:
|
| @@ -54,11 +82,18 @@ void Body::pullSource()
|
| return;
|
| }
|
| ASSERT(!m_loader);
|
| - FileReaderLoader::ReadType readType = FileReaderLoader::ReadAsArrayBuffer;
|
| - RefPtr<BlobDataHandle> blobHandle = blobDataHandle();
|
| + if (buffer(false)) {
|
| + // If the body has a body buffer, we read all data from the buffer and
|
| + // create a blob and then put the data from the blob to |m_stream|.
|
| + // FIXME: Put the data directry from the buffer.
|
| + buffer(false)->readAllAndCreateBlobHandle(new BlobHandleResolver(this));
|
| + return;
|
| + }
|
| + RefPtr<BlobDataHandle> blobHandle = blobDataHandle(false);
|
| if (!blobHandle.get()) {
|
| blobHandle = BlobDataHandle::create(BlobData::create(), 0);
|
| }
|
| + FileReaderLoader::ReadType readType = FileReaderLoader::ReadAsArrayBuffer;
|
| m_loader = adoptPtr(new FileReaderLoader(readType, this));
|
| m_loader->start(executionContext(), blobHandle);
|
| }
|
| @@ -105,12 +140,28 @@ ScriptPromise Body::readAsync(ScriptState* scriptState, ResponseType type)
|
| return promise;
|
| }
|
|
|
| + if (buffer(false)) {
|
| + buffer(false)->readAllAndCreateBlobHandle(new BlobHandleResolver(this));
|
| + return promise;
|
| + }
|
| + readAsyncFromBlob(blobDataHandle(false));
|
| + return promise;
|
| +}
|
| +
|
| +void Body::readAsyncFromBlob(PassRefPtr<BlobDataHandle> handle)
|
| +{
|
| + if (m_streamAccessed) {
|
| + FileReaderLoader::ReadType readType = FileReaderLoader::ReadAsArrayBuffer;
|
| + m_loader = adoptPtr(new FileReaderLoader(readType, this));
|
| + m_loader->start(executionContext(), handle);
|
| + return;
|
| + }
|
| FileReaderLoader::ReadType readType = FileReaderLoader::ReadAsText;
|
| - RefPtr<BlobDataHandle> blobHandle = blobDataHandle();
|
| + RefPtr<BlobDataHandle> blobHandle = handle;
|
| if (!blobHandle.get()) {
|
| blobHandle = BlobDataHandle::create(BlobData::create(), 0);
|
| }
|
| - switch (type) {
|
| + switch (m_responseType) {
|
| case ResponseAsArrayBuffer:
|
| readType = FileReaderLoader::ReadAsArrayBuffer;
|
| break;
|
| @@ -120,7 +171,7 @@ ScriptPromise Body::readAsync(ScriptState* scriptState, ResponseType type)
|
| // it.
|
| m_resolver->resolve(Blob::create(blobHandle));
|
| m_resolver.clear();
|
| - return promise;
|
| + return;
|
| }
|
| // If the size is not set, read as ArrayBuffer and create a new blob to
|
| // get the size.
|
| @@ -141,9 +192,9 @@ ScriptPromise Body::readAsync(ScriptState* scriptState, ResponseType type)
|
| }
|
|
|
| m_loader = adoptPtr(new FileReaderLoader(readType, this));
|
| - m_loader->start(executionContext, blobHandle);
|
| + m_loader->start(m_resolver->scriptState()->executionContext(), blobHandle);
|
|
|
| - return promise;
|
| + return;
|
| }
|
|
|
| void Body::readAllFromStream(ScriptState* scriptState)
|
| @@ -213,10 +264,15 @@ void Body::setBodyUsed()
|
| m_bodyUsed = true;
|
| }
|
|
|
| +bool Body::streamAccessed() const
|
| +{
|
| + return m_streamAccessed;
|
| +}
|
| +
|
| void Body::stop()
|
| {
|
| // Canceling the load will call didFail which will remove the resolver.
|
| - if (m_resolver)
|
| + if (m_resolver && m_loader)
|
| m_loader->cancel();
|
| }
|
|
|
| @@ -294,7 +350,7 @@ void Body::didFinishLoading()
|
| m_resolver->resolve(m_loader->arrayBufferResult());
|
| break;
|
| case ResponseAsBlob: {
|
| - ASSERT(blobDataHandle()->size() == kuint64max);
|
| + ASSERT(blobDataHandle(false)->size() == kuint64max);
|
| OwnPtr<BlobData> blobData = BlobData::create();
|
| RefPtr<DOMArrayBuffer> buffer = m_loader->arrayBufferResult();
|
| blobData->appendBytes(buffer->data(), buffer->byteLength());
|
| @@ -374,4 +430,12 @@ void Body::didFail(FileError::ErrorCode code)
|
| m_stream->error(DOMException::create(NetworkError, "network error"));
|
| }
|
|
|
| +void Body::didBlobHandleResolveError(PassRefPtrWillBeRawPtr<DOMException> exception)
|
| +{
|
| + if (!m_resolver)
|
| + return;
|
| + m_resolver->reject(exception);
|
| + m_resolver.clear();
|
| +}
|
| +
|
| } // namespace blink
|
|
|