Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(177)

Unified Diff: Source/modules/fetch/FetchResponseData.cpp

Issue 1192913007: Change BodyStreamBuffer to be FetchDataConsumerHandle-based and enable backpressure in Fetch API (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase. Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/modules/fetch/FetchResponseData.h ('k') | Source/modules/fetch/FetchResponseDataTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/modules/fetch/FetchResponseData.cpp
diff --git a/Source/modules/fetch/FetchResponseData.cpp b/Source/modules/fetch/FetchResponseData.cpp
index 1e331e3d4878f45531236e374a4e42342740aa9b..a5054184f1e2e22928bd57fb541f1434ddc80f4b 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;
@@ -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,14 +125,6 @@ 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
{
if (m_internalResponse) {
@@ -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 = BodyStreamBuffer::create(createFetchDataConsumerHandleFromWebHandle(handle1.release()));
+ newResponse->m_buffer = BodyStreamBuffer::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)
{
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;
}
}
« no previous file with comments | « Source/modules/fetch/FetchResponseData.h ('k') | Source/modules/fetch/FetchResponseDataTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698