Chromium Code Reviews| Index: Source/modules/fetch/BodyStreamBuffer.cpp |
| diff --git a/Source/modules/fetch/BodyStreamBuffer.cpp b/Source/modules/fetch/BodyStreamBuffer.cpp |
| index 9d7df4248e5a0a96a70e0f8ba95e9032db34b085..0e992c5d5004ca89c037e3bbb47bb1815bfaff2e 100644 |
| --- a/Source/modules/fetch/BodyStreamBuffer.cpp |
| +++ b/Source/modules/fetch/BodyStreamBuffer.cpp |
| @@ -6,6 +6,7 @@ |
| #include "modules/fetch/BodyStreamBuffer.h" |
| #include "core/dom/DOMArrayBuffer.h" |
| +#include "core/dom/ExceptionCode.h" |
| namespace blink { |
| @@ -134,6 +135,99 @@ private: |
| Member<BodyStreamBuffer> m_outBuffer2; |
| }; |
| +// WebDataConsumerHandleAdapter is used to migrate incrementally |
| +// from BodyStreamBuffer to FetchDataConsumerHandle and will be removed |
| +// after the migration. |
| +class WebDataConsumerHandleAdapter |
| + : public GarbageCollectedFinalized<WebDataConsumerHandleAdapter> |
| + , public WebDataConsumerHandle::Client { |
| +public: |
| + WebDataConsumerHandleAdapter(PassOwnPtr<WebDataConsumerHandle> handle, const String& failureMessage) |
| + : m_reader(handle->obtainReader(this)) |
| + , m_failureMessage(failureMessage) |
| + , m_outputBuffer(new BodyStreamBuffer(new Canceller(this))) |
| + { |
| + ASSERT(m_reader); |
| + } |
| + |
| + ~WebDataConsumerHandleAdapter() override { } |
|
yhirano
2015/06/17 01:34:02
Do we need an empty destructor?
hiroshige
2015/06/17 07:21:28
Done.
|
| + |
| + BodyStreamBuffer* outputBuffer() { return m_outputBuffer; } |
| + |
| + DEFINE_INLINE_TRACE() |
| + { |
| + visitor->trace(m_outputBuffer); |
| + } |
| + |
| +private: |
| + class Canceller : public BodyStreamBuffer::Canceller { |
| + public: |
| + Canceller(WebDataConsumerHandleAdapter* source) : m_source(source) { } |
|
yhirano
2015/06/17 01:34:03
explicit
hiroshige
2015/06/17 07:21:28
Done.
|
| + |
| + void cancel() override |
| + { |
| + m_source->close(); |
| + } |
| + |
| + DEFINE_INLINE_VIRTUAL_TRACE() |
| + { |
| + BodyStreamBuffer::Canceller::trace(visitor); |
| + visitor->trace(m_source); |
| + } |
| + |
| + private: |
| + Member<WebDataConsumerHandleAdapter> m_source; |
| + }; |
| + |
| + void didGetReadable() override |
| + { |
| + while (true) { |
| + const void* buffer; |
| + size_t available; |
| + WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &available); |
| + switch (result) { |
| + case WebDataConsumerHandle::Ok: |
| + m_outputBuffer->write(DOMArrayBuffer::create(buffer, available)); |
| + m_reader->endRead(available); |
| + break; |
| + |
| + case WebDataConsumerHandle::Done: |
| + close(); |
| + return; |
| + |
| + case WebDataConsumerHandle::ShouldWait: |
| + return; |
| + |
| + case WebDataConsumerHandle::Busy: |
| + case WebDataConsumerHandle::ResourceExhausted: |
| + case WebDataConsumerHandle::UnexpectedError: |
| + error(); |
| + return; |
| + } |
| + } |
| + } |
| + |
| + void error() |
| + { |
| + m_reader.clear(); |
| + m_outputBuffer->error(DOMException::create(NetworkError, m_failureMessage)); |
| + m_outputBuffer.clear(); |
| + } |
| + |
| + void close() |
| + { |
| + m_reader.clear(); |
| + m_outputBuffer->close(); |
| + m_outputBuffer.clear(); |
| + } |
| + |
| + OwnPtr<WebDataConsumerHandle::Reader> m_reader; |
| + String m_failureMessage; |
| + |
| + Member<BodyStreamBuffer> m_outputBuffer; |
| +}; |
| + |
| + |
| } // namespace |
| PassRefPtr<DOMArrayBuffer> BodyStreamBuffer::read() |