Title: [206708] trunk/Source/WebCore
Revision
206708
Author
[email protected]
Date
2016-10-01 09:31:44 -0700 (Sat, 01 Oct 2016)

Log Message

removing FetchBoyd::m_type

Remove FetchBody::m_type
https://bugs.webkit.org/show_bug.cgi?id=162841

Patch by Youenn Fablet <[email protected]> on 2016-10-01
Reviewed by Sam Weinig.

No change of behavior.

Removing FetchBody::m_type and using m_data in lieu.
Introducing temporarily FetchBody::m_isEmpty to handle the case of null bodies.
Null body handling should be moved to FetchBodyOwner in a follow-up patch.

* Modules/fetch/FetchBody.cpp:
(WebCore::FetchBody::FetchBody):
(WebCore::FetchBody::extract):
(WebCore::FetchBody::arrayBuffer):
(WebCore::FetchBody::blob):
(WebCore::FetchBody::json):
(WebCore::FetchBody::text):
(WebCore::FetchBody::consumeOnceLoadingFinished):
(WebCore::FetchBody::consume):
(WebCore::FetchBody::consumeAsStream):
(WebCore::FetchBody::loadingSucceeded):
(WebCore::FetchBody::bodyForInternalRequest):
(WebCore::FetchBody::clone):
(WebCore::FetchBody::consumeText): Deleted.
(WebCore::FetchBody::consumeBlob): Deleted.
* Modules/fetch/FetchBody.h:
(WebCore::FetchBody::isEmpty):
(WebCore::FetchBody::isBlob):
(WebCore::FetchBody::isFormData):
(WebCore::FetchBody::isArrayBuffer):
(WebCore::FetchBody::isArrayBufferView):
(WebCore::FetchBody::isURLSearchParams):
(WebCore::FetchBody::isText):
(WebCore::FetchBody::FetchBody):
(WebCore::FetchBody::setContentType): Deleted.
(WebCore::FetchBody::urlSearchParamsBody): Deleted.
* Modules/fetch/FetchBodyOwner.cpp:
(WebCore::FetchBodyOwner::consumeOnceLoadingFinished):
(WebCore::FetchBodyOwner::blobLoadingSucceeded):
(WebCore::FetchBodyOwner::finishBlobLoading): Deleted.
* Modules/fetch/FetchBodyOwner.h:
(WebCore::FetchBodyOwner::body): Deleted.
* Modules/fetch/FetchRequest.cpp:
(WebCore::FetchRequest::setBody):
* Modules/fetch/FetchResponse.cpp:
(WebCore::FetchResponse::fetch):
(WebCore::FetchResponse::BodyLoader::didSucceed):
(WebCore::FetchResponse::consume):
(WebCore::FetchResponse::consumeBodyAsStream):
(WebCore::FetchResponse::createReadableStreamSource):
(WebCore::FetchResponse::finishConsumingStream): Deleted.
* Modules/fetch/FetchResponse.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (206707 => 206708)


--- trunk/Source/WebCore/ChangeLog	2016-10-01 15:32:59 UTC (rev 206707)
+++ trunk/Source/WebCore/ChangeLog	2016-10-01 16:31:44 UTC (rev 206708)
@@ -1,3 +1,61 @@
+2016-10-01  Youenn Fablet  <[email protected]>
+
+        removing FetchBoyd::m_type
+
+        Remove FetchBody::m_type
+        https://bugs.webkit.org/show_bug.cgi?id=162841
+
+        Reviewed by Sam Weinig.
+
+        No change of behavior.
+
+        Removing FetchBody::m_type and using m_data in lieu.
+        Introducing temporarily FetchBody::m_isEmpty to handle the case of null bodies.
+        Null body handling should be moved to FetchBodyOwner in a follow-up patch.
+
+        * Modules/fetch/FetchBody.cpp:
+        (WebCore::FetchBody::FetchBody):
+        (WebCore::FetchBody::extract):
+        (WebCore::FetchBody::arrayBuffer):
+        (WebCore::FetchBody::blob):
+        (WebCore::FetchBody::json):
+        (WebCore::FetchBody::text):
+        (WebCore::FetchBody::consumeOnceLoadingFinished):
+        (WebCore::FetchBody::consume):
+        (WebCore::FetchBody::consumeAsStream):
+        (WebCore::FetchBody::loadingSucceeded):
+        (WebCore::FetchBody::bodyForInternalRequest):
+        (WebCore::FetchBody::clone):
+        (WebCore::FetchBody::consumeText): Deleted.
+        (WebCore::FetchBody::consumeBlob): Deleted.
+        * Modules/fetch/FetchBody.h:
+        (WebCore::FetchBody::isEmpty):
+        (WebCore::FetchBody::isBlob):
+        (WebCore::FetchBody::isFormData):
+        (WebCore::FetchBody::isArrayBuffer):
+        (WebCore::FetchBody::isArrayBufferView):
+        (WebCore::FetchBody::isURLSearchParams):
+        (WebCore::FetchBody::isText):
+        (WebCore::FetchBody::FetchBody):
+        (WebCore::FetchBody::setContentType): Deleted.
+        (WebCore::FetchBody::urlSearchParamsBody): Deleted.
+        * Modules/fetch/FetchBodyOwner.cpp:
+        (WebCore::FetchBodyOwner::consumeOnceLoadingFinished):
+        (WebCore::FetchBodyOwner::blobLoadingSucceeded):
+        (WebCore::FetchBodyOwner::finishBlobLoading): Deleted.
+        * Modules/fetch/FetchBodyOwner.h:
+        (WebCore::FetchBodyOwner::body): Deleted.
+        * Modules/fetch/FetchRequest.cpp:
+        (WebCore::FetchRequest::setBody):
+        * Modules/fetch/FetchResponse.cpp:
+        (WebCore::FetchResponse::fetch):
+        (WebCore::FetchResponse::BodyLoader::didSucceed):
+        (WebCore::FetchResponse::consume):
+        (WebCore::FetchResponse::consumeBodyAsStream):
+        (WebCore::FetchResponse::createReadableStreamSource):
+        (WebCore::FetchResponse::finishConsumingStream): Deleted.
+        * Modules/fetch/FetchResponse.h:
+
 2016-09-30  David Kilzer  <[email protected]>
 
         REGRESSION (r203424): WebCore::ImageBuffer::createCompatibleBuffer() in ImageBufferCG.cpp over-releases CGColorSpaceRef objects

Modified: trunk/Source/WebCore/Modules/fetch/FetchBody.cpp (206707 => 206708)


--- trunk/Source/WebCore/Modules/fetch/FetchBody.cpp	2016-10-01 15:32:59 UTC (rev 206707)
+++ trunk/Source/WebCore/Modules/fetch/FetchBody.cpp	2016-10-01 16:31:44 UTC (rev 206708)
@@ -48,48 +48,41 @@
 namespace WebCore {
 
 FetchBody::FetchBody(Ref<const Blob>&& blob)
-    : m_type(Type::Blob)
-    , m_data(WTFMove(blob))
+    : m_data(WTFMove(blob))
     , m_contentType(this->blobBody().type())
 {
 }
 
 FetchBody::FetchBody(DOMFormData& formData, Document& document)
-    : m_type(Type::FormData)
-    , m_data(FormData::createMultiPart(formData, formData.encoding(), &document))
+    : m_data(FormData::createMultiPart(formData, formData.encoding(), &document))
     , m_contentType(makeString("multipart/form-data;boundary=", this->formDataBody().boundary().data()))
 {
 }
 
 FetchBody::FetchBody(String&& text)
-    : m_type(Type::Text)
-    , m_data(WTFMove(text))
+    : m_data(WTFMove(text))
     , m_contentType(ASCIILiteral("text/plain;charset=UTF-8"))
 {
 }
 
 FetchBody::FetchBody(Ref<const ArrayBuffer>&& data)
-    : m_type(Type::ArrayBuffer)
-    , m_data(WTFMove(data))
+    : m_data(WTFMove(data))
 {
 }
 
 FetchBody::FetchBody(Ref<const ArrayBufferView>&& dataView)
-    : m_type(Type::ArrayBufferView)
-    , m_data(WTFMove(dataView))
+    : m_data(WTFMove(dataView))
 {
 }
 
 FetchBody::FetchBody(Ref<const URLSearchParams>&& url)
-    : m_type(Type::URLSeachParams)
-    , m_data(WTFMove(url))
+    : m_data(WTFMove(url))
     , m_contentType(ASCIILiteral("application/x-www-form-urlencoded;charset=UTF-8"))
 {
 }
 
-FetchBody::FetchBody(Type type, const String& contentType, const FetchBodyConsumer& consumer)
-    : m_type(type)
-    , m_contentType(contentType)
+FetchBody::FetchBody(const String& contentType, const FetchBodyConsumer& consumer)
+    : m_contentType(contentType)
     , m_consumer(consumer)
 {
 }
@@ -106,9 +99,11 @@
         return FetchBody(value.toWTFString(&state));
     if (value.inherits(JSURLSearchParams::info()))
         return FetchBody(*JSURLSearchParams::toWrapped(value));
-    if (value.inherits(JSReadableStream::info()))
-        return { Type::ReadableStream };
-    if (value.inherits(JSC::JSArrayBuffer::info())) {
+    if (value.inherits(JSReadableStream::info())) {
+        FetchBody body;
+        body.m_isEmpty = false;
+        return body;
+    } if (value.inherits(JSC::JSArrayBuffer::info())) {
         ArrayBuffer* data = ""
         ASSERT(data);
         return { *data };
@@ -140,7 +135,6 @@
 
 void FetchBody::arrayBuffer(FetchBodyOwner& owner, Ref<DeferredPromise>&& promise)
 {
-    ASSERT(m_type != Type::None);
     m_consumer.setType(FetchBodyConsumer::Type::ArrayBuffer);
     consume(owner, WTFMove(promise));
 }
@@ -147,7 +141,6 @@
 
 void FetchBody::blob(FetchBodyOwner& owner, Ref<DeferredPromise>&& promise)
 {
-    ASSERT(m_type != Type::None);
     m_consumer.setType(FetchBodyConsumer::Type::Blob);
     m_consumer.setContentType(Blob::normalizedContentType(extractMIMETypeFromMediaType(m_contentType)));
     consume(owner, WTFMove(promise));
@@ -155,9 +148,7 @@
 
 void FetchBody::json(FetchBodyOwner& owner, Ref<DeferredPromise>&& promise)
 {
-    ASSERT(m_type != Type::None);
-
-    if (m_type == Type::Text) {
+    if (isText()) {
         fulfillPromiseWithJSON(WTFMove(promise), textBody());
         return;
     }
@@ -167,9 +158,7 @@
 
 void FetchBody::text(FetchBodyOwner& owner, Ref<DeferredPromise>&& promise)
 {
-    ASSERT(m_type != Type::None);
-
-    if (m_type == Type::Text) {
+    if (isText()) {
         promise->resolve(textBody());
         return;
     }
@@ -177,89 +166,73 @@
     consume(owner, WTFMove(promise));
 }
 
+void FetchBody::consumeOnceLoadingFinished(FetchBodyConsumer::Type type, Ref<DeferredPromise>&& promise)
+{
+    m_consumer.setType(type);
+    m_consumePromise = WTFMove(promise);
+}
+
 void FetchBody::consume(FetchBodyOwner& owner, Ref<DeferredPromise>&& promise)
 {
-    // This should be handled by FetchBodyOwner
-    ASSERT(m_type != Type::None);
-    // This should be handled by JS built-ins
-    ASSERT(m_type != Type::ReadableStream);
-
-    switch (m_type) {
-    case Type::ArrayBuffer:
+    if (isArrayBuffer()) {
         consumeArrayBuffer(WTFMove(promise));
         return;
-    case Type::ArrayBufferView:
+    }
+    if (isArrayBufferView()) {
         consumeArrayBufferView(WTFMove(promise));
         return;
-    case Type::Text:
+    }
+    if (isText()) {
         consumeText(WTFMove(promise), textBody());
         return;
-    case Type::URLSeachParams:
+    }
+    if (isURLSearchParams()) {
         consumeText(WTFMove(promise), urlSearchParamsBody().toString());
         return;
-    case Type::Blob:
+    }
+    if (isBlob()) {
         consumeBlob(owner, WTFMove(promise));
         return;
-    case Type::Loading:
-        m_consumePromise = WTFMove(promise);
-        return;
-    case Type::Loaded:
+    }
+    if (m_consumer.hasData()) {
         m_consumer.resolve(WTFMove(promise));
         return;
-    case Type::FormData:
+    }
+    if (isFormData()) {
         // FIXME: Support consuming FormData.
         promise->reject(0);
         return;
-    default:
-        ASSERT_NOT_REACHED();
     }
+    ASSERT_NOT_REACHED();
 }
 
 #if ENABLE(READABLE_STREAM_API)
 void FetchBody::consumeAsStream(FetchBodyOwner& owner, FetchResponseSource& source)
 {
-    // This should be handled by FetchResponse
-    ASSERT(m_type != Type::Loading);
-    // This should be handled by JS built-ins
-    ASSERT(m_type != Type::ReadableStream);
-
     bool closeStream = false;
-    switch (m_type) {
-    case Type::ArrayBuffer:
+    if (isArrayBuffer()) {
         closeStream = source.enqueue(ArrayBuffer::tryCreate(arrayBufferBody().data(), arrayBufferBody().byteLength()));
         m_data = nullptr;
-        break;
-    case Type::ArrayBufferView: {
+    } else if (isArrayBufferView()) {
         closeStream = source.enqueue(ArrayBuffer::tryCreate(arrayBufferViewBody().baseAddress(), arrayBufferViewBody().byteLength()));
         m_data = nullptr;
-        break;
-    }
-    case Type::Text: {
+    } else if (isText()) {
         auto data = "" EntitiesForUnencodables);
         closeStream = source.enqueue(ArrayBuffer::tryCreate(data.data(), data.length()));
         m_data = nullptr;
-        break;
-    }
-    case Type::URLSeachParams: {
+    } else if (isURLSearchParams()) {
         auto data = "" EntitiesForUnencodables);
         closeStream = source.enqueue(ArrayBuffer::tryCreate(data.data(), data.length()));
         m_data = nullptr;
-        break;
-    }
-    case Type::Blob:
+    } else if (isBlob()) {
         owner.loadBlob(blobBody(), nullptr);
         m_data = nullptr;
-        break;
-    case Type::None:
+    } else if (m_consumer.hasData())
+        closeStream = source.enqueue(m_consumer.takeAsArrayBuffer());
+    else if (isEmpty())
         closeStream = true;
-        break;
-    case Type::Loaded: {
-        closeStream = source.enqueue(m_consumer.takeAsArrayBuffer());
-        break;
-    }
-    default:
+    else
         source.error(ASCIILiteral("not implemented"));
-    }
 
     if (closeStream)
         source.close();
@@ -302,7 +275,7 @@
 
 void FetchBody::loadingSucceeded()
 {
-    m_type = m_consumer.hasData() ? Type::Loaded : Type::None;
+    m_isEmpty = !m_consumer.hasData();
     if (m_consumePromise)
         m_consumer.resolve(m_consumePromise.releaseNonNull());
 }
@@ -309,64 +282,49 @@
 
 RefPtr<FormData> FetchBody::bodyForInternalRequest(ScriptExecutionContext& context) const
 {
-    switch (m_type) {
-    case Type::None:
+    if (isEmpty())
         return nullptr;
-    case Type::Text:
+    if (isText())
         return FormData::create(UTF8Encoding().encode(textBody(), EntitiesForUnencodables));
-    case Type::URLSeachParams:
+    if (isURLSearchParams())
         return FormData::create(UTF8Encoding().encode(urlSearchParamsBody().toString(), EntitiesForUnencodables));
-    case Type::Blob: {
+    if (isBlob()) {
         RefPtr<FormData> body = FormData::create();
         body->appendBlob(blobBody().url());
         return body;
     }
-    case Type::ArrayBuffer:
+    if (isArrayBuffer())
         return FormData::create(arrayBufferBody().data(), arrayBufferBody().byteLength());
-    case Type::ArrayBufferView:
+    if (isArrayBufferView())
         return FormData::create(arrayBufferViewBody().baseAddress(), arrayBufferViewBody().byteLength());
-    case Type::FormData: {
+    if (isFormData()) {
         ASSERT(!context.isWorkerGlobalScope());
         RefPtr<FormData> body = const_cast<FormData*>(&formDataBody());
         body->generateFiles(static_cast<Document*>(&context));
         return body;
     }
-    default:
-        ASSERT_NOT_REACHED();
-        return nullptr;
-    }
+    ASSERT_NOT_REACHED();
+    return nullptr;
 }
 
 FetchBody FetchBody::clone() const
 {
     ASSERT(!m_consumePromise);
-    FetchBody clone(m_type, m_contentType, m_consumer);
+    FetchBody clone(m_contentType, m_consumer);
+    clone.m_isEmpty = m_isEmpty;
 
-    switch (m_type) {
-    case Type::ArrayBuffer:
+    if (isArrayBuffer())
         clone.m_data = arrayBufferBody();
-        break;
-    case Type::ArrayBufferView:
+    else if (isArrayBufferView())
         clone.m_data = arrayBufferViewBody();
-        break;
-    case Type::Blob:
+    else if (isBlob())
         clone.m_data = blobBody();
-        break;
-    case Type::FormData:
+    else if (isFormData())
         clone.m_data = const_cast<FormData&>(formDataBody());
-        break;
-    case Type::Text:
+    else if (isText())
         clone.m_data = textBody();
-        break;
-    case Type::URLSeachParams:
+    else if (isURLSearchParams())
         clone.m_data = urlSearchParamsBody();
-        break;
-    case Type::Loaded:
-    case Type::None:
-    case Type::Loading:
-    case Type::ReadableStream:
-        break;
-    }
     return clone;
 }
 

Modified: trunk/Source/WebCore/Modules/fetch/FetchBody.h (206707 => 206708)


--- trunk/Source/WebCore/Modules/fetch/FetchBody.h	2016-10-01 15:32:59 UTC (rev 206707)
+++ trunk/Source/WebCore/Modules/fetch/FetchBody.h	2016-10-01 16:31:44 UTC (rev 206708)
@@ -64,7 +64,13 @@
     void consumeAsStream(FetchBodyOwner&, FetchResponseSource&);
 #endif
 
-    bool isEmpty() const { return m_type == Type::None; }
+    bool isEmpty() const { return m_isEmpty; }
+    bool isBlob() const { return std::experimental::holds_alternative<Ref<const Blob>>(m_data); }
+    bool isFormData() const { return std::experimental::holds_alternative<Ref<FormData>>(m_data); }
+    bool isArrayBuffer() const { return std::experimental::holds_alternative<Ref<const ArrayBuffer>>(m_data); }
+    bool isArrayBufferView() const { return std::experimental::holds_alternative<Ref<const ArrayBufferView>>(m_data); }
+    bool isURLSearchParams() const { return std::experimental::holds_alternative<Ref<const URLSearchParams>>(m_data); }
+    bool isText() const { return std::experimental::holds_alternative<String>(m_data); }
 
     void updateContentType(FetchHeaders&);
     void setContentType(const String& contentType) { m_contentType = contentType; }
@@ -72,8 +78,7 @@
 
     static FetchBody extract(ScriptExecutionContext&, JSC::ExecState&, JSC::JSValue);
     static FetchBody extractFromBody(FetchBody*);
-    static FetchBody loadingBody() { return { Type::Loading }; }
-    FetchBody() = default;
+    FetchBody() : m_isEmpty(true) { }
 
     void loadingFailed();
     void loadingSucceeded();
@@ -80,11 +85,9 @@
 
     RefPtr<FormData> bodyForInternalRequest(ScriptExecutionContext&) const;
 
-    enum class Type { None, ArrayBuffer, ArrayBufferView, Blob, FormData, Text, URLSeachParams, Loading, Loaded, ReadableStream };
-    Type type() const { return m_type; }
-
     FetchBodyConsumer& consumer() { return m_consumer; }
 
+    void consumeOnceLoadingFinished(FetchBodyConsumer::Type, Ref<DeferredPromise>&&);
     void cleanConsumePromise() { m_consumePromise = nullptr; }
 
     FetchBody clone() const;
@@ -96,8 +99,7 @@
     FetchBody(DOMFormData&, Document&);
     FetchBody(String&&);
     FetchBody(Ref<const URLSearchParams>&&);
-    FetchBody(Type, const String&, const FetchBodyConsumer&);
-    FetchBody(Type type) : m_type(type) { }
+    FetchBody(const String&, const FetchBodyConsumer&);
 
     void consume(FetchBodyOwner&, Ref<DeferredPromise>&&);
 
@@ -115,11 +117,11 @@
     const String& textBody() const { return std::experimental::get<String>(m_data); }
     const URLSearchParams& urlSearchParamsBody() const { return std::experimental::get<Ref<const URLSearchParams>>(m_data).get(); }
 
-    Type m_type { Type::None };
-
-    std::experimental::variant<std::nullptr_t, Ref<const Blob>, Ref<FormData>, Ref<const ArrayBuffer>, Ref<const ArrayBufferView>, Ref<const URLSearchParams>, String> m_data;
+    std::experimental::variant<std::nullptr_t, Ref<const Blob>, Ref<FormData>, Ref<const ArrayBuffer>, Ref<const ArrayBufferView>, Ref<const URLSearchParams>, String> m_data { nullptr };
     String m_contentType;
 
+    bool m_isEmpty { false };
+
     FetchBodyConsumer m_consumer { FetchBodyConsumer::Type::None };
     RefPtr<DeferredPromise> m_consumePromise;
 };

Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp (206707 => 206708)


--- trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp	2016-10-01 15:32:59 UTC (rev 206707)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp	2016-10-01 16:31:44 UTC (rev 206708)
@@ -101,6 +101,16 @@
     m_body.blob(*this, WTFMove(promise));
 }
 
+void FetchBodyOwner::consumeOnceLoadingFinished(FetchBodyConsumer::Type type, Ref<DeferredPromise>&& promise)
+{
+    if (isDisturbedOrLocked()) {
+        promise->reject(TypeError);
+        return;
+    }
+    m_isDisturbed = true;
+    m_body.consumeOnceLoadingFinished(type, WTFMove(promise));
+}
+
 void FetchBodyOwner::formData(Ref<DeferredPromise>&& promise)
 {
     if (m_body.isEmpty()) {
@@ -176,8 +186,6 @@
 
 void FetchBodyOwner::blobLoadingSucceeded()
 {
-    ASSERT(m_body.type() == FetchBody::Type::Blob);
-
 #if ENABLE(READABLE_STREAM_API)
     if (m_readableStreamSource) {
         m_readableStreamSource->close();

Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.h (206707 => 206708)


--- trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.h	2016-10-01 15:32:59 UTC (rev 206707)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.h	2016-10-01 16:31:44 UTC (rev 206708)
@@ -58,11 +58,10 @@
 
     bool isActive() const { return !!m_blobLoader; }
 
-    FetchBody::Type bodyType() const { return m_body.type(); }
-
 protected:
     const FetchBody& body() const { return m_body; }
     FetchBody& body() { return m_body; }
+    void consumeOnceLoadingFinished(FetchBodyConsumer::Type, Ref<DeferredPromise>&&);
 
     // ActiveDOMObject API
     void stop() override;

Modified: trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp (206707 => 206708)


--- trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp	2016-10-01 15:32:59 UTC (rev 206707)
+++ trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp	2016-10-01 16:31:44 UTC (rev 206708)
@@ -262,7 +262,7 @@
 
         ASSERT(scriptExecutionContext());
         m_body = FetchBody::extract(*scriptExecutionContext(), execState, body);
-        if (m_body.type() == FetchBody::Type::None) {
+        if (m_body.isEmpty()) {
             ec = TypeError;
             return;
         }

Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp (206707 => 206708)


--- trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp	2016-10-01 15:32:59 UTC (rev 206707)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp	2016-10-01 16:31:44 UTC (rev 206708)
@@ -103,7 +103,7 @@
 
 void FetchResponse::fetch(ScriptExecutionContext& context, FetchRequest& request, FetchPromise&& promise)
 {
-    auto response = adoptRef(*new FetchResponse(context, FetchBody::loadingBody(), FetchHeaders::create(FetchHeaders::Guard::Immutable), { }));
+    auto response = adoptRef(*new FetchResponse(context, { }, FetchHeaders::create(FetchHeaders::Guard::Immutable), { }));
 
     // Setting pending activity until BodyLoader didFail or didSucceed callback is called.
     response->setPendingActivity(response.ptr());
@@ -126,9 +126,9 @@
     m_response.m_body.loadingSucceeded();
 
 #if ENABLE(READABLE_STREAM_API)
-    if (m_response.m_readableStreamSource && m_response.m_body.type() != FetchBody::Type::Loaded) {
-        // We only close the stream if FetchBody already enqueued data.
-        // Otherwise, FetchBody will close the stream when enqueuing data.
+    if (m_response.m_readableStreamSource && m_response.body().isEmpty()) {
+        // We only close the stream if FetchBody already enqueued all data.
+        // Otherwise, FetchBody will close the stream after enqueuing the data.
         m_response.m_readableStreamSource->close();
         m_response.m_readableStreamSource = nullptr;
     }
@@ -209,8 +209,14 @@
 void FetchResponse::consume(unsigned type, Ref<DeferredPromise>&& wrapper)
 {
     ASSERT(type <= static_cast<unsigned>(FetchBodyConsumer::Type::Text));
+    auto consumerType = static_cast<FetchBodyConsumer::Type>(type);
 
-    switch (static_cast<FetchBodyConsumer::Type>(type)) {
+    if (isLoading()) {
+        consumeOnceLoadingFinished(consumerType, WTFMove(wrapper));
+        return;
+    }
+
+    switch (consumerType) {
     case FetchBodyConsumer::Type::ArrayBuffer:
         arrayBuffer(WTFMove(wrapper));
         return;
@@ -250,7 +256,7 @@
 {
     ASSERT(m_readableStreamSource);
     m_isDisturbed = true;
-    if (body().type() != FetchBody::Type::Loading) {
+    if (!isLoading()) {
         body().consumeAsStream(*this, *m_readableStreamSource);
         if (!m_readableStreamSource->isStarting())
             m_readableStreamSource = nullptr;
@@ -272,7 +278,7 @@
     ASSERT(!m_readableStreamSource);
     ASSERT(!m_isDisturbed);
 
-    if (body().isEmpty())
+    if (body().isEmpty() && !isLoading())
         return nullptr;
 
     m_readableStreamSource = adoptRef(*new FetchResponseSource(*this));

Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.h (206707 => 206708)


--- trunk/Source/WebCore/Modules/fetch/FetchResponse.h	2016-10-01 15:32:59 UTC (rev 206707)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.h	2016-10-01 16:31:44 UTC (rev 206708)
@@ -85,7 +85,7 @@
     void consumeBodyAsStream();
     void cancel();
 #endif
-    bool isLoading() const { return body().type() == FetchBody::Type::Loading; }
+    bool isLoading() const { return !!m_bodyLoader; }
 
 private:
     FetchResponse(ScriptExecutionContext&, FetchBody&&, Ref<FetchHeaders>&&, ResourceResponse&&);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to