Index: third_party/WebKit/Source/modules/fetch/FetchDataLoader.cpp |
diff --git a/third_party/WebKit/Source/modules/fetch/FetchDataLoader.cpp b/third_party/WebKit/Source/modules/fetch/FetchDataLoader.cpp |
index 5a491d0024a46831b54bb985e05494a72e98b335..47a95f29a2286e508e112ffa053ebabe0ab204f6 100644 |
--- a/third_party/WebKit/Source/modules/fetch/FetchDataLoader.cpp |
+++ b/third_party/WebKit/Source/modules/fetch/FetchDataLoader.cpp |
@@ -5,6 +5,7 @@ |
#include "modules/fetch/FetchDataLoader.h" |
#include "core/html/parser/TextResourceDecoder.h" |
+#include "modules/fetch/BytesConsumer.h" |
#include "wtf/PtrUtil.h" |
#include "wtf/text/StringBuilder.h" |
#include "wtf/text/WTFString.h" |
@@ -15,345 +16,259 @@ namespace blink { |
namespace { |
-class FetchDataLoaderAsBlobHandle |
- : public FetchDataLoader |
- , public WebDataConsumerHandle::Client { |
+class FetchDataLoaderAsBlobHandle final : public FetchDataLoader, public BytesConsumer::Client { |
+ USING_GARBAGE_COLLECTED_MIXIN(FetchDataLoaderAsBlobHandle); |
public: |
explicit FetchDataLoaderAsBlobHandle(const String& mimeType) |
- : m_client(nullptr) |
- , m_mimeType(mimeType) { } |
- |
- DEFINE_INLINE_VIRTUAL_TRACE() |
+ : m_mimeType(mimeType) |
{ |
- FetchDataLoader::trace(visitor); |
- visitor->trace(m_client); |
} |
-private: |
- void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client) override |
+ void start(BytesConsumer* consumer, FetchDataLoader::Client* client) override |
{ |
- ASSERT(!m_client); |
- ASSERT(!m_reader); |
+ DCHECK(!m_client); |
+ DCHECK(!m_consumer); |
m_client = client; |
- // Passing |this| here is safe because |this| owns |m_reader|. |
- m_reader = handle->obtainFetchDataReader(this); |
- RefPtr<BlobDataHandle> blobHandle = m_reader->drainAsBlobDataHandle(); |
+ m_consumer = consumer; |
+ |
+ RefPtr<BlobDataHandle> blobHandle = m_consumer->drainAsBlobDataHandle(); |
if (blobHandle) { |
- ASSERT(blobHandle->size() != UINT64_MAX); |
- m_reader.reset(); |
+ DCHECK_NE(UINT64_MAX, blobHandle->size()); |
if (blobHandle->type() != m_mimeType) { |
// A new BlobDataHandle is created to override the Blob's type. |
m_client->didFetchDataLoadedBlobHandle(BlobDataHandle::create(blobHandle->uuid(), m_mimeType, blobHandle->size())); |
} else { |
- m_client->didFetchDataLoadedBlobHandle(blobHandle); |
+ m_client->didFetchDataLoadedBlobHandle(std::move(blobHandle)); |
} |
- m_client.clear(); |
return; |
} |
- // We read data from |m_reader| and create a new blob. |
m_blobData = BlobData::create(); |
m_blobData->setContentType(m_mimeType); |
+ m_consumer->setClient(this); |
+ onStateChange(); |
} |
- void didGetReadable() override |
+ void cancel() override |
{ |
- ASSERT(m_client); |
- ASSERT(m_reader); |
+ m_consumer->cancel(); |
+ } |
+ void onStateChange() override |
+ { |
while (true) { |
- const void* buffer; |
+ const char* buffer; |
size_t available; |
- WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &available); |
- |
- switch (result) { |
- case WebDataConsumerHandle::Ok: |
+ switch (m_consumer->beginRead(&buffer, &available)) { |
+ case BytesConsumer::Result::Ok: |
m_blobData->appendBytes(buffer, available); |
- m_reader->endRead(available); |
+ m_consumer->endRead(available); |
break; |
- |
- case WebDataConsumerHandle::Done: { |
- m_reader.reset(); |
- long long size = m_blobData->length(); |
+ case BytesConsumer::Result::ShouldWait: |
+ return; |
+ case BytesConsumer::Result::Done: { |
+ auto size = m_blobData->length(); |
m_client->didFetchDataLoadedBlobHandle(BlobDataHandle::create(std::move(m_blobData), size)); |
- m_client.clear(); |
return; |
} |
- |
- case WebDataConsumerHandle::ShouldWait: |
- return; |
- |
- case WebDataConsumerHandle::Busy: |
- case WebDataConsumerHandle::ResourceExhausted: |
- case WebDataConsumerHandle::UnexpectedError: |
- m_reader.reset(); |
- m_blobData.reset(); |
+ case BytesConsumer::Result::Error: |
m_client->didFetchDataLoadFailed(); |
- m_client.clear(); |
return; |
} |
} |
} |
- void cancel() override |
+ DEFINE_INLINE_TRACE() |
{ |
- m_reader.reset(); |
- m_blobData.reset(); |
- m_client.clear(); |
+ visitor->trace(m_consumer); |
+ visitor->trace(m_client); |
+ FetchDataLoader::trace(visitor); |
+ BytesConsumer::Client::trace(visitor); |
} |
- std::unique_ptr<FetchDataConsumerHandle::Reader> m_reader; |
+private: |
+ Member<BytesConsumer> m_consumer; |
Member<FetchDataLoader::Client> m_client; |
String m_mimeType; |
std::unique_ptr<BlobData> m_blobData; |
}; |
-class FetchDataLoaderAsArrayBuffer |
- : public FetchDataLoader |
- , public WebDataConsumerHandle::Client { |
+class FetchDataLoaderAsArrayBuffer final : public FetchDataLoader, public BytesConsumer::Client { |
+ USING_GARBAGE_COLLECTED_MIXIN(FetchDataLoaderAsArrayBuffer) |
public: |
- FetchDataLoaderAsArrayBuffer() |
- : m_client(nullptr) { } |
- |
- DEFINE_INLINE_VIRTUAL_TRACE() |
+ void start(BytesConsumer* consumer, FetchDataLoader::Client* client) override |
{ |
- FetchDataLoader::trace(visitor); |
- visitor->trace(m_client); |
- } |
- |
-protected: |
- void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client) override |
- { |
- ASSERT(!m_client); |
- ASSERT(!m_rawData); |
- ASSERT(!m_reader); |
+ DCHECK(!m_client); |
+ DCHECK(!m_rawData); |
+ DCHECK(!m_consumer); |
m_client = client; |
m_rawData = wrapUnique(new ArrayBufferBuilder()); |
- m_reader = handle->obtainFetchDataReader(this); |
+ m_consumer = consumer; |
+ m_consumer->setClient(this); |
+ onStateChange(); |
} |
- void didGetReadable() override |
+ void cancel() override |
{ |
- ASSERT(m_client); |
- ASSERT(m_rawData); |
- ASSERT(m_reader); |
+ m_consumer->cancel(); |
+ } |
+ void onStateChange() override |
+ { |
while (true) { |
- const void* buffer; |
+ const char* buffer; |
size_t available; |
- WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &available); |
- |
- switch (result) { |
- case WebDataConsumerHandle::Ok: |
+ switch (m_consumer->beginRead(&buffer, &available)) { |
+ case BytesConsumer::Result::Ok: |
if (available > 0) { |
- unsigned bytesAppended = m_rawData->append(static_cast<const char*>(buffer), available); |
+ unsigned bytesAppended = m_rawData->append(buffer, available); |
if (!bytesAppended) { |
- m_reader->endRead(0); |
- error(); |
+ m_consumer->endRead(0); |
+ m_consumer->cancel(); |
+ m_client->didFetchDataLoadFailed(); |
return; |
} |
- ASSERT(bytesAppended == available); |
+ DCHECK_EQ(bytesAppended, available); |
} |
- m_reader->endRead(available); |
+ m_consumer->endRead(available); |
break; |
- |
- case WebDataConsumerHandle::Done: |
- m_reader.reset(); |
- m_client->didFetchDataLoadedArrayBuffer(DOMArrayBuffer::create(m_rawData->toArrayBuffer())); |
- m_rawData.reset(); |
- m_client.clear(); |
+ case BytesConsumer::Result::ShouldWait: |
return; |
- |
- case WebDataConsumerHandle::ShouldWait: |
+ case BytesConsumer::Result::Done: |
+ m_client->didFetchDataLoadedArrayBuffer(DOMArrayBuffer::create(m_rawData->toArrayBuffer())); |
return; |
- |
- case WebDataConsumerHandle::Busy: |
- case WebDataConsumerHandle::ResourceExhausted: |
- case WebDataConsumerHandle::UnexpectedError: |
- error(); |
+ case BytesConsumer::Result::Error: |
+ m_client->didFetchDataLoadFailed(); |
return; |
} |
} |
} |
- void error() |
+ DEFINE_INLINE_TRACE() |
{ |
- m_reader.reset(); |
- m_rawData.reset(); |
- m_client->didFetchDataLoadFailed(); |
- m_client.clear(); |
- } |
- |
- void cancel() override |
- { |
- m_reader.reset(); |
- m_rawData.reset(); |
- m_client.clear(); |
+ visitor->trace(m_consumer); |
+ visitor->trace(m_client); |
+ FetchDataLoader::trace(visitor); |
+ BytesConsumer::Client::trace(visitor); |
} |
- std::unique_ptr<FetchDataConsumerHandle::Reader> m_reader; |
+private: |
+ Member<BytesConsumer> m_consumer; |
Member<FetchDataLoader::Client> m_client; |
std::unique_ptr<ArrayBufferBuilder> m_rawData; |
}; |
-class FetchDataLoaderAsString |
- : public FetchDataLoader |
- , public WebDataConsumerHandle::Client { |
+class FetchDataLoaderAsString final : public FetchDataLoader, public BytesConsumer::Client { |
+ USING_GARBAGE_COLLECTED_MIXIN(FetchDataLoaderAsString); |
public: |
- FetchDataLoaderAsString() |
- : m_client(nullptr) { } |
- |
- DEFINE_INLINE_VIRTUAL_TRACE() |
- { |
- FetchDataLoader::trace(visitor); |
- visitor->trace(m_client); |
- } |
- |
-protected: |
- void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client) override |
+ void start(BytesConsumer* consumer, FetchDataLoader::Client* client) override |
{ |
- ASSERT(!m_client); |
- ASSERT(!m_decoder); |
- ASSERT(!m_reader); |
+ DCHECK(!m_client); |
+ DCHECK(!m_decoder); |
+ DCHECK(!m_consumer); |
m_client = client; |
m_decoder = TextResourceDecoder::createAlwaysUseUTF8ForText(); |
- m_reader = handle->obtainFetchDataReader(this); |
+ m_consumer = consumer; |
+ m_consumer->setClient(this); |
+ onStateChange(); |
} |
- void didGetReadable() override |
+ void onStateChange() override |
{ |
- ASSERT(m_client); |
- ASSERT(m_decoder); |
- ASSERT(m_reader); |
- |
while (true) { |
- const void* buffer; |
+ const char* buffer; |
size_t available; |
- WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &available); |
- |
- switch (result) { |
- case WebDataConsumerHandle::Ok: |
+ switch (m_consumer->beginRead(&buffer, &available)) { |
+ case BytesConsumer::Result::Ok: |
if (available > 0) |
- m_builder.append(m_decoder->decode(static_cast<const char*>(buffer), available)); |
- m_reader->endRead(available); |
+ m_builder.append(m_decoder->decode(buffer, available)); |
+ m_consumer->endRead(available); |
break; |
- |
- case WebDataConsumerHandle::Done: |
- m_reader.reset(); |
+ case BytesConsumer::Result::ShouldWait: |
+ return; |
+ case BytesConsumer::Result::Done: |
m_builder.append(m_decoder->flush()); |
m_client->didFetchDataLoadedString(m_builder.toString()); |
- m_builder.clear(); |
- m_decoder.reset(); |
- m_client.clear(); |
return; |
- |
- case WebDataConsumerHandle::ShouldWait: |
- return; |
- |
- case WebDataConsumerHandle::Busy: |
- case WebDataConsumerHandle::ResourceExhausted: |
- case WebDataConsumerHandle::UnexpectedError: |
- error(); |
+ case BytesConsumer::Result::Error: |
+ m_client->didFetchDataLoadFailed(); |
return; |
} |
} |
} |
- void error() |
+ void cancel() override |
{ |
- m_reader.reset(); |
- m_builder.clear(); |
- m_decoder.reset(); |
- m_client->didFetchDataLoadFailed(); |
- m_client.clear(); |
+ m_consumer->cancel(); |
} |
- void cancel() override |
+ DEFINE_INLINE_TRACE() |
{ |
- m_reader.reset(); |
- m_builder.clear(); |
- m_decoder.reset(); |
- m_client.clear(); |
+ visitor->trace(m_consumer); |
+ visitor->trace(m_client); |
+ FetchDataLoader::trace(visitor); |
+ BytesConsumer::Client::trace(visitor); |
} |
- std::unique_ptr<FetchDataConsumerHandle::Reader> m_reader; |
+private: |
+ Member<BytesConsumer> m_consumer; |
Member<FetchDataLoader::Client> m_client; |
std::unique_ptr<TextResourceDecoder> m_decoder; |
StringBuilder m_builder; |
}; |
-class FetchDataLoaderAsStream |
- : public FetchDataLoader |
- , public WebDataConsumerHandle::Client { |
+class FetchDataLoaderAsStream final : public FetchDataLoader, public BytesConsumer::Client { |
+ USING_GARBAGE_COLLECTED_MIXIN(FetchDataLoaderAsStream); |
public: |
explicit FetchDataLoaderAsStream(Stream* outStream) |
- : m_client(nullptr) |
- , m_outStream(outStream) { } |
- |
- DEFINE_INLINE_VIRTUAL_TRACE() |
+ : m_outStream(outStream) |
{ |
- FetchDataLoader::trace(visitor); |
- visitor->trace(m_client); |
- visitor->trace(m_outStream); |
} |
-protected: |
- void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client) override |
+ void start(BytesConsumer* consumer, FetchDataLoader::Client* client) override |
{ |
- ASSERT(!m_client); |
- ASSERT(!m_reader); |
+ DCHECK(!m_client); |
+ DCHECK(!m_consumer); |
m_client = client; |
- m_reader = handle->obtainFetchDataReader(this); |
+ m_consumer = consumer; |
+ m_consumer->setClient(this); |
+ onStateChange(); |
} |
- void didGetReadable() override |
+ void onStateChange() override |
{ |
- ASSERT(m_client); |
- ASSERT(m_reader); |
- |
bool needToFlush = false; |
while (true) { |
- const void* buffer; |
+ const char* buffer; |
size_t available; |
- WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &available); |
- |
- switch (result) { |
- case WebDataConsumerHandle::Ok: |
- m_outStream->addData(static_cast<const char*>(buffer), available); |
- m_reader->endRead(available); |
+ switch (m_consumer->beginRead(&buffer, &available)) { |
+ case BytesConsumer::Result::Ok: |
+ m_outStream->addData(buffer, available); |
+ m_consumer->endRead(available); |
needToFlush = true; |
break; |
- |
- case WebDataConsumerHandle::Done: |
- m_reader.reset(); |
+ case BytesConsumer::Result::ShouldWait: |
if (needToFlush) |
m_outStream->flush(); |
- m_outStream->finalize(); |
- m_client->didFetchDataLoadedStream(); |
- cleanup(); |
return; |
- |
- case WebDataConsumerHandle::ShouldWait: |
+ case BytesConsumer::Result::Done: |
if (needToFlush) |
m_outStream->flush(); |
+ m_outStream->finalize(); |
+ m_client->didFetchDataLoadedStream(); |
return; |
- |
- case WebDataConsumerHandle::Busy: |
- case WebDataConsumerHandle::ResourceExhausted: |
- case WebDataConsumerHandle::UnexpectedError: |
+ case BytesConsumer::Result::Error: |
// If the stream is aborted soon after the stream is registered |
// to the StreamRegistry, ServiceWorkerURLRequestJob may not |
// notice the error and continue waiting forever. |
- // FIXME: Add new message to report the error to the browser |
- // process. |
- m_reader.reset(); |
+ // TODO(yhirano): Add new message to report the error to the |
+ // browser process. |
m_outStream->abort(); |
m_client->didFetchDataLoadFailed(); |
- cleanup(); |
return; |
} |
} |
@@ -361,23 +276,23 @@ protected: |
void cancel() override |
{ |
- cleanup(); |
+ m_consumer->cancel(); |
} |
- void cleanup() |
+ DEFINE_INLINE_TRACE() |
{ |
- m_reader.reset(); |
- m_client.clear(); |
- m_outStream.clear(); |
+ visitor->trace(m_consumer); |
+ visitor->trace(m_client); |
+ visitor->trace(m_outStream); |
+ FetchDataLoader::trace(visitor); |
+ BytesConsumer::Client::trace(visitor); |
} |
- std::unique_ptr<FetchDataConsumerHandle::Reader> m_reader; |
+ Member<BytesConsumer> m_consumer; |
Member<FetchDataLoader::Client> m_client; |
- |
Member<Stream> m_outStream; |
}; |
- |
} // namespace |
FetchDataLoader* FetchDataLoader::createLoaderAsBlobHandle(const String& mimeType) |