Index: Source/modules/fetch/FetchResponseData.cpp |
diff --git a/Source/modules/fetch/FetchResponseData.cpp b/Source/modules/fetch/FetchResponseData.cpp |
index 1e331e3d4878f45531236e374a4e42342740aa9b..81e505b099f45772a179a87a71e997e446c61f30 100644 |
--- a/Source/modules/fetch/FetchResponseData.cpp |
+++ b/Source/modules/fetch/FetchResponseData.cpp |
@@ -8,6 +8,8 @@ |
#include "core/dom/DOMArrayBuffer.h" |
#include "core/fetch/CrossOriginAccessControl.h" |
#include "modules/fetch/BodyStreamBuffer.h" |
+#include "modules/fetch/DataConsumerHandleUtil.h" |
+#include "modules/fetch/DataConsumerTee.h" |
#include "modules/fetch/FetchHeaderList.h" |
#include "public/platform/WebServiceWorkerResponse.h" |
@@ -15,68 +17,6 @@ namespace blink { |
namespace { |
-class BranchCanceller : public BodyStreamBuffer::Canceller { |
-public: |
- static void create(BodyStreamBuffer* buffer, BranchCanceller** canceller1, BranchCanceller** canceller2) |
- { |
- auto context = new Context(buffer); |
- *canceller1 = new BranchCanceller(context, First); |
- *canceller2 = new BranchCanceller(context, Second); |
- } |
- |
- void setBuffer(BodyStreamBuffer* buffer) { m_buffer = buffer; } |
- |
- void cancel() override |
- { |
- if (m_tag == First) { |
- m_context->isFirstCancelled = true; |
- } else { |
- ASSERT(m_tag == Second); |
- m_context->isSecondCancelled = true; |
- } |
- ASSERT(m_buffer); |
- ASSERT(!m_buffer->isClosed()); |
- ASSERT(!m_buffer->hasError()); |
- m_buffer->close(); |
- if (m_context->isFirstCancelled && m_context->isSecondCancelled) |
- m_context->buffer->cancel(); |
- } |
- |
- DEFINE_INLINE_VIRTUAL_TRACE() |
- { |
- visitor->trace(m_context); |
- visitor->trace(m_buffer); |
- BodyStreamBuffer::Canceller::trace(visitor); |
- } |
- |
-private: |
- enum Tag { |
- First, |
- Second, |
- }; |
- class Context : public GarbageCollected<Context> { |
- public: |
- explicit Context(BodyStreamBuffer* buffer) |
- : buffer(buffer) |
- , isFirstCancelled(false) |
- , isSecondCancelled(false) { } |
- |
- DEFINE_INLINE_VIRTUAL_TRACE() |
- { |
- visitor->trace(buffer); |
- } |
- |
- Member<BodyStreamBuffer> buffer; |
- bool isFirstCancelled; |
- bool isSecondCancelled; |
- }; |
- |
- BranchCanceller(Context* context, Tag tag) : m_context(context), m_tag(tag) { } |
- Member<Context> m_context; |
- Member<BodyStreamBuffer> m_buffer; |
- Tag m_tag; |
-}; |
- |
WebServiceWorkerResponseType fetchTypeToWebType(FetchResponseData::Type fetchType) |
{ |
WebServiceWorkerResponseType webType = WebServiceWorkerResponseTypeDefault; |
@@ -117,7 +57,7 @@ FetchResponseData* FetchResponseData::createNetworkErrorResponse() |
return new FetchResponseData(ErrorType, 0, ""); |
} |
-FetchResponseData* FetchResponseData::createWithBuffer(BodyStreamBuffer* buffer) |
+FetchResponseData* FetchResponseData::createWithBuffer(BodyStreamBuffer2* buffer) |
{ |
FetchResponseData* response = FetchResponseData::create(); |
response->m_buffer = buffer; |
@@ -137,7 +77,6 @@ FetchResponseData* FetchResponseData::createBasicFilteredResponse() |
continue; |
response->m_headerList->append(header->first, header->second); |
} |
- response->m_blobDataHandle = m_blobDataHandle; |
response->m_buffer = m_buffer; |
response->m_mimeType = m_mimeType; |
response->m_internalResponse = this; |
@@ -165,7 +104,6 @@ FetchResponseData* FetchResponseData::createCORSFilteredResponse() |
continue; |
response->m_headerList->append(header->first, header->second); |
} |
- response->m_blobDataHandle = m_blobDataHandle; |
response->m_buffer = m_buffer; |
response->m_mimeType = m_mimeType; |
response->m_internalResponse = this; |
@@ -187,15 +125,7 @@ String FetchResponseData::mimeType() const |
return m_mimeType; |
} |
-PassRefPtr<BlobDataHandle> FetchResponseData::internalBlobDataHandle() const |
-{ |
- if (m_internalResponse) { |
- return m_internalResponse->m_blobDataHandle; |
- } |
- return m_blobDataHandle; |
-} |
- |
-BodyStreamBuffer* FetchResponseData::internalBuffer() const |
+BodyStreamBuffer2* FetchResponseData::internalBuffer() const |
{ |
if (m_internalResponse) { |
return m_internalResponse->m_buffer; |
@@ -211,7 +141,7 @@ String FetchResponseData::internalMIMEType() const |
return m_mimeType; |
} |
-FetchResponseData* FetchResponseData::clone() |
+FetchResponseData* FetchResponseData::clone(ExecutionContext* executionContext) |
{ |
FetchResponseData* newResponse = create(); |
newResponse->m_type = m_type; |
@@ -223,17 +153,15 @@ FetchResponseData* FetchResponseData::clone() |
newResponse->m_status = m_status; |
newResponse->m_statusMessage = m_statusMessage; |
newResponse->m_headerList = m_headerList->clone(); |
- newResponse->m_blobDataHandle = m_blobDataHandle; |
newResponse->m_mimeType = m_mimeType; |
switch (m_type) { |
case BasicType: |
case CORSType: |
ASSERT(m_internalResponse); |
- ASSERT(m_blobDataHandle == m_internalResponse->m_blobDataHandle); |
ASSERT(m_buffer == m_internalResponse->m_buffer); |
ASSERT(m_internalResponse->m_type == DefaultType); |
- newResponse->m_internalResponse = m_internalResponse->clone(); |
+ newResponse->m_internalResponse = m_internalResponse->clone(executionContext); |
m_buffer = m_internalResponse->m_buffer; |
newResponse->m_buffer = newResponse->m_internalResponse->m_buffer; |
break; |
@@ -241,28 +169,23 @@ FetchResponseData* FetchResponseData::clone() |
ASSERT(!m_internalResponse); |
if (!m_buffer) |
return newResponse; |
- BodyStreamBuffer* original = m_buffer; |
- BranchCanceller* canceller1 = nullptr; |
- BranchCanceller* canceller2 = nullptr; |
- BranchCanceller::create(original, &canceller1, &canceller2); |
- m_buffer = new BodyStreamBuffer(canceller1); |
- newResponse->m_buffer = new BodyStreamBuffer(canceller2); |
- canceller1->setBuffer(m_buffer); |
- canceller2->setBuffer(newResponse->m_buffer); |
- original->startTee(m_buffer, newResponse->m_buffer); |
+ |
+ OwnPtr<WebDataConsumerHandle> handle1; |
+ OwnPtr<WebDataConsumerHandle> handle2; |
+ DataConsumerTee::create(executionContext, m_buffer->releaseHandle(), &handle1, &handle2); |
+ m_buffer = BodyStreamBuffer2::create(createFetchDataConsumerHandleFromWebHandle(handle1.release())); |
+ newResponse->m_buffer = BodyStreamBuffer2::create(createFetchDataConsumerHandleFromWebHandle(handle2.release())); |
break; |
} |
case ErrorType: |
ASSERT(!m_internalResponse); |
- ASSERT(!m_blobDataHandle); |
ASSERT(!m_buffer); |
break; |
case OpaqueType: |
ASSERT(m_internalResponse); |
- ASSERT(!m_blobDataHandle); |
ASSERT(!m_buffer); |
ASSERT(m_internalResponse->m_type == DefaultType); |
- newResponse->m_internalResponse = m_internalResponse->clone(); |
+ newResponse->m_internalResponse = m_internalResponse->clone(executionContext); |
break; |
} |
return newResponse; |
@@ -284,7 +207,6 @@ void FetchResponseData::populateWebServiceWorkerResponse(WebServiceWorkerRespons |
const FetchHeaderList::Header* header = headerList()->list()[i].get(); |
response.appendHeader(header->first, header->second); |
} |
- response.setBlobDataHandle(m_blobDataHandle); |
} |
FetchResponseData::FetchResponseData(Type type, unsigned short status, AtomicString statusMessage) |
@@ -295,23 +217,14 @@ FetchResponseData::FetchResponseData(Type type, unsigned short status, AtomicStr |
{ |
} |
-void FetchResponseData::setBlobDataHandle(PassRefPtr<BlobDataHandle> blobDataHandle) |
-{ |
- ASSERT(!m_buffer); |
- m_blobDataHandle = blobDataHandle; |
-} |
- |
-void FetchResponseData::replaceBodyStreamBuffer(BodyStreamBuffer* buffer) |
+void FetchResponseData::replaceBodyStreamBuffer(BodyStreamBuffer2* buffer) |
{ |
if (m_type == BasicType || m_type == CORSType) { |
ASSERT(m_internalResponse); |
- m_internalResponse->m_blobDataHandle = nullptr; |
m_internalResponse->m_buffer = buffer; |
- m_blobDataHandle = nullptr; |
m_buffer = buffer; |
} else if (m_type == DefaultType) { |
ASSERT(!m_internalResponse); |
- m_blobDataHandle = nullptr; |
m_buffer = buffer; |
} |
} |