Changeset 206421 in webkit


Ignore:
Timestamp:
Sep 27, 2016 12:58:48 AM (8 years ago)
Author:
commit-queue@webkit.org
Message:

[Fetch API] Refactor FetchBody to use std::experimental::variant
https://bugs.webkit.org/show_bug.cgi?id=162559

Patch by Youenn Fablet <youenn@apple.com> on 2016-09-27
Reviewed by Alex Christensen.

Covered by exiting tests.

Using variant to represent the variant data types.
Adding nullptr as a specific type for default empty values and to allow clean-up.
Adding FetchBody::clone as the default copy constructor is deleted with this change.

  • Modules/fetch/FetchBody.cpp:

(WebCore::FetchBody::FetchBody):
(WebCore::FetchBody::json):
(WebCore::FetchBody::text):
(WebCore::FetchBody::consumeAsStream):
(WebCore::FetchBody::consumeArrayBuffer):
(WebCore::FetchBody::consumeArrayBufferView):
(WebCore::FetchBody::consumeText):
(WebCore::FetchBody::consumeBlob):
(WebCore::FetchBody::extractFromText):
(WebCore::FetchBody::bodyForInternalRequest):
(WebCore::FetchBody::clone):

  • Modules/fetch/FetchBody.h:

(WebCore::FetchBody::blobBody):
(WebCore::FetchBody::formDataBody):
(WebCore::FetchBody::arrayBufferBody):
(WebCore::FetchBody::arrayBufferViewBody):
(WebCore::FetchBody::textBody):

  • Modules/fetch/FetchRequest.cpp:

(WebCore::FetchRequest::clone):

  • Modules/fetch/FetchResponse.cpp:

(WebCore::FetchResponse::cloneForJS):

Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r206419 r206421  
     12016-09-27  Youenn Fablet  <youenn@apple.com>
     2
     3        [Fetch API] Refactor FetchBody to use std::experimental::variant
     4        https://bugs.webkit.org/show_bug.cgi?id=162559
     5
     6        Reviewed by Alex Christensen.
     7
     8        Covered by exiting tests.
     9
     10        Using variant to represent the variant data types.
     11        Adding nullptr as a specific type for default empty values and to allow clean-up.
     12        Adding FetchBody::clone as the default copy constructor is deleted with this change.
     13
     14        * Modules/fetch/FetchBody.cpp:
     15        (WebCore::FetchBody::FetchBody):
     16        (WebCore::FetchBody::json):
     17        (WebCore::FetchBody::text):
     18        (WebCore::FetchBody::consumeAsStream):
     19        (WebCore::FetchBody::consumeArrayBuffer):
     20        (WebCore::FetchBody::consumeArrayBufferView):
     21        (WebCore::FetchBody::consumeText):
     22        (WebCore::FetchBody::consumeBlob):
     23        (WebCore::FetchBody::extractFromText):
     24        (WebCore::FetchBody::bodyForInternalRequest):
     25        (WebCore::FetchBody::clone):
     26        * Modules/fetch/FetchBody.h:
     27        (WebCore::FetchBody::blobBody):
     28        (WebCore::FetchBody::formDataBody):
     29        (WebCore::FetchBody::arrayBufferBody):
     30        (WebCore::FetchBody::arrayBufferViewBody):
     31        (WebCore::FetchBody::textBody):
     32        * Modules/fetch/FetchRequest.cpp:
     33        (WebCore::FetchRequest::clone):
     34        * Modules/fetch/FetchResponse.cpp:
     35        (WebCore::FetchResponse::cloneForJS):
     36
    1372016-09-26  Joonghun Park  <jh718.park@samsung.com>
    238
  • trunk/Source/WebCore/Modules/fetch/FetchBody.cpp

    r206252 r206421  
    4949FetchBody::FetchBody(Ref<Blob>&& blob)
    5050    : m_type(Type::Blob)
    51     , m_contentType(blob->type())
    52     , m_blob(WTFMove(blob))
     51    , m_data(WTFMove(blob))
     52    , m_contentType(this->blobBody().type())
    5353{
    5454}
     
    5656FetchBody::FetchBody(DOMFormData& formData, Document& document)
    5757    : m_type(Type::FormData)
    58     , m_contentType(ASCIILiteral("multipart/form-data"))
    59 {
    60     m_formData = FormData::createMultiPart(formData, formData.encoding(), &document);
    61     m_contentType = makeString("multipart/form-data;boundary=", m_formData->boundary().data());
     58    , m_data(FormData::createMultiPart(formData, formData.encoding(), &document))
     59    , m_contentType(makeString("multipart/form-data;boundary=", this->formDataBody().boundary().data()))
     60{
    6261}
    6362
    6463FetchBody::FetchBody(String&& text)
    6564    : m_type(Type::Text)
     65    , m_data(WTFMove(text))
    6666    , m_contentType(ASCIILiteral("text/plain;charset=UTF-8"))
    67     , m_text(WTFMove(text))
    6867{
    6968}
     
    7776FetchBody::FetchBody(Ref<ArrayBufferView>&& dataView)
    7877    : m_type(Type::ArrayBufferView)
    79     , m_dataView(WTFMove(dataView))
     78    , m_data(WTFMove(dataView))
     79{
     80}
     81
     82FetchBody::FetchBody(Type type, const String& contentType, const FetchBodyConsumer& consumer)
     83    : m_type(type)
     84    , m_contentType(contentType)
     85    , m_consumer(consumer)
    8086{
    8187}
     
    145151
    146152    if (m_type == Type::Text) {
    147         fulfillPromiseWithJSON(WTFMove(promise), m_text);
     153        fulfillPromiseWithJSON(WTFMove(promise), textBody());
    148154        return;
    149155    }
     
    157163
    158164    if (m_type == Type::Text) {
    159         promise->resolve(m_text);
     165        promise->resolve(textBody());
    160166        return;
    161167    }
     
    210216    switch (m_type) {
    211217    case Type::ArrayBuffer:
    212         ASSERT(m_data);
    213         closeStream = source.enqueue(ArrayBuffer::tryCreate(m_data->data(), m_data->byteLength()));
     218        closeStream = source.enqueue(ArrayBuffer::tryCreate(arrayBufferBody().data(), arrayBufferBody().byteLength()));
    214219        m_data = nullptr;
    215220        break;
    216221    case Type::ArrayBufferView: {
    217         ASSERT(m_dataView);
    218         closeStream = source.enqueue(ArrayBuffer::tryCreate(m_dataView->baseAddress(), m_dataView->byteLength()));
    219         m_dataView = nullptr;
     222        closeStream = source.enqueue(ArrayBuffer::tryCreate(arrayBufferViewBody().baseAddress(), arrayBufferViewBody().byteLength()));
     223        m_data = nullptr;
    220224        break;
    221225    }
     
    223227        Vector<uint8_t> data = extractFromText();
    224228        closeStream = source.enqueue(ArrayBuffer::tryCreate(data.data(), data.size()));
    225         m_text = { };
     229        m_data = nullptr;
    226230        break;
    227231    }
    228232    case Type::Blob:
    229         ASSERT(m_blob);
    230         owner.loadBlob(*m_blob, nullptr);
    231         m_blob = nullptr;
     233        owner.loadBlob(blobBody(), nullptr);
     234        m_data = nullptr;
    232235        break;
    233236    case Type::None:
     
    249252void FetchBody::consumeArrayBuffer(Ref<DeferredPromise>&& promise)
    250253{
    251     ASSERT(m_data);
    252     m_consumer.resolveWithData(WTFMove(promise), static_cast<const uint8_t*>(m_data->data()), m_data->byteLength());
     254    m_consumer.resolveWithData(WTFMove(promise), static_cast<const uint8_t*>(arrayBufferBody().data()), arrayBufferBody().byteLength());
    253255    m_data = nullptr;
    254256}
     
    256258void FetchBody::consumeArrayBufferView(Ref<DeferredPromise>&& promise)
    257259{
    258     ASSERT(m_dataView);
    259     m_consumer.resolveWithData(WTFMove(promise), static_cast<const uint8_t*>(m_dataView->baseAddress()), m_dataView->byteLength());
    260     m_dataView = nullptr;
     260    m_consumer.resolveWithData(WTFMove(promise), static_cast<const uint8_t*>(arrayBufferViewBody().baseAddress()), arrayBufferViewBody().byteLength());
     261    m_data = nullptr;
    261262}
    262263
     
    265266    Vector<uint8_t> data = extractFromText();
    266267    m_consumer.resolveWithData(WTFMove(promise), data.data(), data.size());
    267     m_text = { };
     268    m_data = nullptr;
    268269}
    269270
    270271void FetchBody::consumeBlob(FetchBodyOwner& owner, Ref<DeferredPromise>&& promise)
    271272{
    272     ASSERT(m_blob);
    273 
    274273    m_consumePromise = WTFMove(promise);
    275     owner.loadBlob(*m_blob, &m_consumer);
    276     m_blob = nullptr;
     274    owner.loadBlob(blobBody(), &m_consumer);
     275    m_data = nullptr;
    277276}
    278277
     
    281280    ASSERT(m_type == Type::Text);
    282281    // FIXME: This double allocation is not efficient. Might want to fix that at WTFString level.
    283     CString data = m_text.utf8();
     282    CString data = textBody().utf8();
    284283    Vector<uint8_t> value(data.length());
    285284    memcpy(value.data(), data.data(), data.length());
     
    308307        return nullptr;
    309308    case Type::Text:
    310         return FormData::create(UTF8Encoding().encode(m_text, EntitiesForUnencodables));
     309        return FormData::create(UTF8Encoding().encode(textBody(), EntitiesForUnencodables));
    311310    case Type::Blob: {
    312         ASSERT(m_blob);
    313311        RefPtr<FormData> body = FormData::create();
    314         body->appendBlob(m_blob->url());
     312        body->appendBlob(blobBody().url());
    315313        return body;
    316314    }
    317315    case Type::ArrayBuffer:
    318         ASSERT(m_data);
    319         return FormData::create(m_data->data(), m_data->byteLength());
     316        return FormData::create(arrayBufferBody().data(), arrayBufferBody().byteLength());
    320317    case Type::ArrayBufferView:
    321         ASSERT(m_dataView);
    322         return FormData::create(m_dataView->baseAddress(), m_dataView->byteLength());
     318        return FormData::create(arrayBufferViewBody().baseAddress(), arrayBufferViewBody().byteLength());
    323319    case Type::FormData: {
    324         ASSERT(m_formData);
    325320        ASSERT(!context.isWorkerGlobalScope());
    326         auto body = m_formData;
     321        RefPtr<FormData> body = const_cast<FormData*>(&formDataBody());
    327322        body->generateFiles(static_cast<Document*>(&context));
    328323        return body;
     
    334329}
    335330
     331FetchBody FetchBody::clone() const
     332{
     333    ASSERT(!m_consumePromise);
     334    FetchBody clone(m_type, m_contentType, m_consumer);
     335
     336    switch (m_type) {
     337    case Type::ArrayBuffer:
     338        clone.m_data = const_cast<ArrayBuffer&>(arrayBufferBody());
     339        break;
     340    case Type::ArrayBufferView:
     341        clone.m_data = const_cast<ArrayBufferView&>(arrayBufferViewBody());
     342        break;
     343    case Type::Blob:
     344        clone.m_data = const_cast<Blob&>(blobBody());
     345        break;
     346    case Type::FormData:
     347        clone.m_data = const_cast<FormData&>(formDataBody());
     348        break;
     349    case Type::Text:
     350        clone.m_data = textBody();
     351        break;
     352    case Type::Loaded:
     353    case Type::None:
     354    case Type::Loading:
     355    case Type::ReadableStream:
     356        break;
     357    }
     358    return clone;
     359}
     360
    336361}
    337362
  • trunk/Source/WebCore/Modules/fetch/FetchBody.h

    r206252 r206421  
    3737#include "FormData.h"
    3838#include "JSDOMPromise.h"
     39#include <wtf/Variant.h>
    3940
    4041namespace JSC {
     
    8687    void cleanConsumePromise() { m_consumePromise = nullptr; }
    8788
     89    FetchBody clone() const;
     90
    8891private:
    8992    FetchBody(Ref<Blob>&&);
     
    9295    FetchBody(DOMFormData&, Document&);
    9396    FetchBody(String&&);
     97    FetchBody(Type, const String&, const FetchBodyConsumer&);
    9498    FetchBody(Type type) : m_type(type) { }
    9599
     
    102106    void consumeBlob(FetchBodyOwner&, Ref<DeferredPromise>&&);
    103107
     108    Blob& blobBody() { return std::experimental::get<Ref<Blob>>(m_data).get(); }
     109    const Blob& blobBody() const { return std::experimental::get<Ref<Blob>>(m_data).get(); }
     110    FormData& formDataBody() { return std::experimental::get<Ref<FormData>>(m_data).get(); }
     111    const FormData& formDataBody() const { return std::experimental::get<Ref<FormData>>(m_data).get(); }
     112    ArrayBuffer& arrayBufferBody() { return std::experimental::get<Ref<ArrayBuffer>>(m_data).get(); }
     113    const ArrayBuffer& arrayBufferBody() const { return std::experimental::get<Ref<ArrayBuffer>>(m_data).get(); }
     114    ArrayBufferView& arrayBufferViewBody() { return std::experimental::get<Ref<ArrayBufferView>>(m_data).get(); }
     115    const ArrayBufferView& arrayBufferViewBody() const { return std::experimental::get<Ref<ArrayBufferView>>(m_data).get(); }
     116    String& textBody() { return std::experimental::get<String>(m_data); }
     117    const String& textBody() const { return std::experimental::get<String>(m_data); }
     118
    104119    Type m_type { Type::None };
    105     String m_contentType;
    106120
    107121    // FIXME: Add support for URLSearchParams.
    108     RefPtr<Blob> m_blob;
    109     RefPtr<FormData> m_formData;
    110     RefPtr<ArrayBuffer> m_data;
    111     RefPtr<ArrayBufferView> m_dataView;
    112     String m_text;
     122    std::experimental::variant<std::nullptr_t, Ref<Blob>, Ref<FormData>, Ref<ArrayBuffer>, Ref<ArrayBufferView>, String> m_data;
     123    String m_contentType;
    113124
    114125    FetchBodyConsumer m_consumer { FetchBodyConsumer::Type::None };
  • trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp

    r206009 r206421  
    315315    }
    316316
    317     return adoptRef(*new FetchRequest(context, FetchBody(m_body), FetchHeaders::create(m_headers.get()), FetchRequest::InternalRequest(m_internalRequest)));
     317    return adoptRef(*new FetchRequest(context, m_body.clone(), FetchHeaders::create(m_headers.get()), FetchRequest::InternalRequest(m_internalRequest)));
    318318}
    319319
  • trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp

    r206252 r206421  
    9999    ASSERT(scriptExecutionContext());
    100100    ASSERT(!isDisturbedOrLocked());
    101     return adoptRef(*new FetchResponse(*scriptExecutionContext(), FetchBody(m_body), FetchHeaders::create(headers()), ResourceResponse(m_response)));
     101    return adoptRef(*new FetchResponse(*scriptExecutionContext(), m_body.clone(), FetchHeaders::create(headers()), ResourceResponse(m_response)));
    102102}
    103103
Note: See TracChangeset for help on using the changeset viewer.