Chromium Code Reviews| Index: Source/modules/serviceworkers/Body.cpp |
| diff --git a/Source/modules/serviceworkers/Body.cpp b/Source/modules/serviceworkers/Body.cpp |
| index e18218981bc9c4d3eb695d9ce54f0c8c42e980bf..b1b0adfb73b8f867b5e22d5e5faf217afb27e992 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 { |
|
yhirano
2014/12/12 04:31:16
I don't understand why this class is named as "Res
horo
2014/12/12 05:30:47
I think BlobHandle"Receiver" is a better name.
Cha
|
| +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; |
| + if (buffer()) { |
| + // 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()->readAllAndCreateBlobHandle(contentType(), new BlobHandleResolver(this)); |
| + return; |
| + } |
| RefPtr<BlobDataHandle> blobHandle = blobDataHandle(); |
| if (!blobHandle.get()) { |
| blobHandle = BlobDataHandle::create(BlobData::create(), 0); |
| } |
| + FileReaderLoader::ReadType readType = FileReaderLoader::ReadAsArrayBuffer; |
|
yhirano
2014/12/12 04:31:16
You can call readAsyncFromBlob here.
horo
2014/12/12 05:30:47
Done.
|
| 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()) { |
| + buffer()->readAllAndCreateBlobHandle(contentType(), new BlobHandleResolver(this)); |
| + return promise; |
| + } |
| + readAsyncFromBlob(blobDataHandle()); |
| + 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) |
|
yhirano
2014/12/12 04:31:16
Just |if (m_loader)| is fine, I think.
horo
2014/12/12 05:30:47
Done.
|
| m_loader->cancel(); |
| } |
| @@ -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 |