Modified: trunk/Source/WebCore/Modules/fetch/FetchBody.cpp (206420 => 206421)
--- trunk/Source/WebCore/Modules/fetch/FetchBody.cpp 2016-09-27 07:52:29 UTC (rev 206420)
+++ trunk/Source/WebCore/Modules/fetch/FetchBody.cpp 2016-09-27 07:58:48 UTC (rev 206421)
@@ -48,23 +48,22 @@
FetchBody::FetchBody(Ref<Blob>&& blob)
: m_type(Type::Blob)
- , m_contentType(blob->type())
- , m_blob(WTFMove(blob))
+ , m_data(WTFMove(blob))
+ , m_contentType(this->blobBody().type())
{
}
FetchBody::FetchBody(DOMFormData& formData, Document& document)
: m_type(Type::FormData)
- , m_contentType(ASCIILiteral("multipart/form-data"))
+ , m_data(FormData::createMultiPart(formData, formData.encoding(), &document))
+ , m_contentType(makeString("multipart/form-data;boundary=", this->formDataBody().boundary().data()))
{
- m_formData = FormData::createMultiPart(formData, formData.encoding(), &document);
- m_contentType = makeString("multipart/form-data;boundary=", m_formData->boundary().data());
}
FetchBody::FetchBody(String&& text)
: m_type(Type::Text)
+ , m_data(WTFMove(text))
, m_contentType(ASCIILiteral("text/plain;charset=UTF-8"))
- , m_text(WTFMove(text))
{
}
@@ -76,10 +75,17 @@
FetchBody::FetchBody(Ref<ArrayBufferView>&& dataView)
: m_type(Type::ArrayBufferView)
- , m_dataView(WTFMove(dataView))
+ , m_data(WTFMove(dataView))
{
}
+FetchBody::FetchBody(Type type, const String& contentType, const FetchBodyConsumer& consumer)
+ : m_type(type)
+ , m_contentType(contentType)
+ , m_consumer(consumer)
+{
+}
+
FetchBody FetchBody::extract(ScriptExecutionContext& context, JSC::ExecState& state, JSC::JSValue value)
{
if (value.inherits(JSBlob::info()))
@@ -144,7 +150,7 @@
ASSERT(m_type != Type::None);
if (m_type == Type::Text) {
- fulfillPromiseWithJSON(WTFMove(promise), m_text);
+ fulfillPromiseWithJSON(WTFMove(promise), textBody());
return;
}
m_consumer.setType(FetchBodyConsumer::Type::JSON);
@@ -156,7 +162,7 @@
ASSERT(m_type != Type::None);
if (m_type == Type::Text) {
- promise->resolve(m_text);
+ promise->resolve(textBody());
return;
}
m_consumer.setType(FetchBodyConsumer::Type::Text);
@@ -209,26 +215,23 @@
bool closeStream = false;
switch (m_type) {
case Type::ArrayBuffer:
- ASSERT(m_data);
- closeStream = source.enqueue(ArrayBuffer::tryCreate(m_data->data(), m_data->byteLength()));
+ closeStream = source.enqueue(ArrayBuffer::tryCreate(arrayBufferBody().data(), arrayBufferBody().byteLength()));
m_data = nullptr;
break;
case Type::ArrayBufferView: {
- ASSERT(m_dataView);
- closeStream = source.enqueue(ArrayBuffer::tryCreate(m_dataView->baseAddress(), m_dataView->byteLength()));
- m_dataView = nullptr;
+ closeStream = source.enqueue(ArrayBuffer::tryCreate(arrayBufferViewBody().baseAddress(), arrayBufferViewBody().byteLength()));
+ m_data = nullptr;
break;
}
case Type::Text: {
Vector<uint8_t> data = ""
closeStream = source.enqueue(ArrayBuffer::tryCreate(data.data(), data.size()));
- m_text = { };
+ m_data = nullptr;
break;
}
case Type::Blob:
- ASSERT(m_blob);
- owner.loadBlob(*m_blob, nullptr);
- m_blob = nullptr;
+ owner.loadBlob(blobBody(), nullptr);
+ m_data = nullptr;
break;
case Type::None:
closeStream = true;
@@ -248,16 +251,14 @@
void FetchBody::consumeArrayBuffer(Ref<DeferredPromise>&& promise)
{
- ASSERT(m_data);
- m_consumer.resolveWithData(WTFMove(promise), static_cast<const uint8_t*>(m_data->data()), m_data->byteLength());
+ m_consumer.resolveWithData(WTFMove(promise), static_cast<const uint8_t*>(arrayBufferBody().data()), arrayBufferBody().byteLength());
m_data = nullptr;
}
void FetchBody::consumeArrayBufferView(Ref<DeferredPromise>&& promise)
{
- ASSERT(m_dataView);
- m_consumer.resolveWithData(WTFMove(promise), static_cast<const uint8_t*>(m_dataView->baseAddress()), m_dataView->byteLength());
- m_dataView = nullptr;
+ m_consumer.resolveWithData(WTFMove(promise), static_cast<const uint8_t*>(arrayBufferViewBody().baseAddress()), arrayBufferViewBody().byteLength());
+ m_data = nullptr;
}
void FetchBody::consumeText(Ref<DeferredPromise>&& promise)
@@ -264,16 +265,14 @@
{
Vector<uint8_t> data = ""
m_consumer.resolveWithData(WTFMove(promise), data.data(), data.size());
- m_text = { };
+ m_data = nullptr;
}
void FetchBody::consumeBlob(FetchBodyOwner& owner, Ref<DeferredPromise>&& promise)
{
- ASSERT(m_blob);
-
m_consumePromise = WTFMove(promise);
- owner.loadBlob(*m_blob, &m_consumer);
- m_blob = nullptr;
+ owner.loadBlob(blobBody(), &m_consumer);
+ m_data = nullptr;
}
Vector<uint8_t> FetchBody::extractFromText() const
@@ -280,7 +279,7 @@
{
ASSERT(m_type == Type::Text);
// FIXME: This double allocation is not efficient. Might want to fix that at WTFString level.
- CString data = ""
+ CString data = ""
Vector<uint8_t> value(data.length());
memcpy(value.data(), data.data(), data.length());
return value;
@@ -307,23 +306,19 @@
case Type::None:
return nullptr;
case Type::Text:
- return FormData::create(UTF8Encoding().encode(m_text, EntitiesForUnencodables));
+ return FormData::create(UTF8Encoding().encode(textBody(), EntitiesForUnencodables));
case Type::Blob: {
- ASSERT(m_blob);
RefPtr<FormData> body = FormData::create();
- body->appendBlob(m_blob->url());
+ body->appendBlob(blobBody().url());
return body;
}
case Type::ArrayBuffer:
- ASSERT(m_data);
- return FormData::create(m_data->data(), m_data->byteLength());
+ return FormData::create(arrayBufferBody().data(), arrayBufferBody().byteLength());
case Type::ArrayBufferView:
- ASSERT(m_dataView);
- return FormData::create(m_dataView->baseAddress(), m_dataView->byteLength());
+ return FormData::create(arrayBufferViewBody().baseAddress(), arrayBufferViewBody().byteLength());
case Type::FormData: {
- ASSERT(m_formData);
ASSERT(!context.isWorkerGlobalScope());
- auto body = m_formData;
+ RefPtr<FormData> body = const_cast<FormData*>(&formDataBody());
body->generateFiles(static_cast<Document*>(&context));
return body;
}
@@ -333,6 +328,36 @@
}
}
+FetchBody FetchBody::clone() const
+{
+ ASSERT(!m_consumePromise);
+ FetchBody clone(m_type, m_contentType, m_consumer);
+
+ switch (m_type) {
+ case Type::ArrayBuffer:
+ clone.m_data = const_cast<ArrayBuffer&>(arrayBufferBody());
+ break;
+ case Type::ArrayBufferView:
+ clone.m_data = const_cast<ArrayBufferView&>(arrayBufferViewBody());
+ break;
+ case Type::Blob:
+ clone.m_data = const_cast<Blob&>(blobBody());
+ break;
+ case Type::FormData:
+ clone.m_data = const_cast<FormData&>(formDataBody());
+ break;
+ case Type::Text:
+ clone.m_data = textBody();
+ break;
+ case Type::Loaded:
+ case Type::None:
+ case Type::Loading:
+ case Type::ReadableStream:
+ break;
+ }
+ return clone;
}
+}
+
#endif // ENABLE(FETCH_API)
Modified: trunk/Source/WebCore/Modules/fetch/FetchBody.h (206420 => 206421)
--- trunk/Source/WebCore/Modules/fetch/FetchBody.h 2016-09-27 07:52:29 UTC (rev 206420)
+++ trunk/Source/WebCore/Modules/fetch/FetchBody.h 2016-09-27 07:58:48 UTC (rev 206421)
@@ -36,6 +36,7 @@
#include "FetchLoader.h"
#include "FormData.h"
#include "JSDOMPromise.h"
+#include <wtf/Variant.h>
namespace JSC {
class ExecState;
@@ -85,6 +86,8 @@
void cleanConsumePromise() { m_consumePromise = nullptr; }
+ FetchBody clone() const;
+
private:
FetchBody(Ref<Blob>&&);
FetchBody(Ref<ArrayBuffer>&&);
@@ -91,6 +94,7 @@
FetchBody(Ref<ArrayBufferView>&&);
FetchBody(DOMFormData&, Document&);
FetchBody(String&&);
+ FetchBody(Type, const String&, const FetchBodyConsumer&);
FetchBody(Type type) : m_type(type) { }
void consume(FetchBodyOwner&, Ref<DeferredPromise>&&);
@@ -101,15 +105,22 @@
void consumeText(Ref<DeferredPromise>&&);
void consumeBlob(FetchBodyOwner&, Ref<DeferredPromise>&&);
+ Blob& blobBody() { return std::experimental::get<Ref<Blob>>(m_data).get(); }
+ const Blob& blobBody() const { return std::experimental::get<Ref<Blob>>(m_data).get(); }
+ FormData& formDataBody() { return std::experimental::get<Ref<FormData>>(m_data).get(); }
+ const FormData& formDataBody() const { return std::experimental::get<Ref<FormData>>(m_data).get(); }
+ ArrayBuffer& arrayBufferBody() { return std::experimental::get<Ref<ArrayBuffer>>(m_data).get(); }
+ const ArrayBuffer& arrayBufferBody() const { return std::experimental::get<Ref<ArrayBuffer>>(m_data).get(); }
+ ArrayBufferView& arrayBufferViewBody() { return std::experimental::get<Ref<ArrayBufferView>>(m_data).get(); }
+ const ArrayBufferView& arrayBufferViewBody() const { return std::experimental::get<Ref<ArrayBufferView>>(m_data).get(); }
+ String& textBody() { return std::experimental::get<String>(m_data); }
+ const String& textBody() const { return std::experimental::get<String>(m_data); }
+
Type m_type { Type::None };
- String m_contentType;
// FIXME: Add support for URLSearchParams.
- RefPtr<Blob> m_blob;
- RefPtr<FormData> m_formData;
- RefPtr<ArrayBuffer> m_data;
- RefPtr<ArrayBufferView> m_dataView;
- String m_text;
+ std::experimental::variant<std::nullptr_t, Ref<Blob>, Ref<FormData>, Ref<ArrayBuffer>, Ref<ArrayBufferView>, String> m_data;
+ String m_contentType;
FetchBodyConsumer m_consumer { FetchBodyConsumer::Type::None };
RefPtr<DeferredPromise> m_consumePromise;
Modified: trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp (206420 => 206421)
--- trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp 2016-09-27 07:52:29 UTC (rev 206420)
+++ trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp 2016-09-27 07:58:48 UTC (rev 206421)
@@ -314,7 +314,7 @@
return nullptr;
}
- return adoptRef(*new FetchRequest(context, FetchBody(m_body), FetchHeaders::create(m_headers.get()), FetchRequest::InternalRequest(m_internalRequest)));
+ return adoptRef(*new FetchRequest(context, m_body.clone(), FetchHeaders::create(m_headers.get()), FetchRequest::InternalRequest(m_internalRequest)));
}
const char* FetchRequest::activeDOMObjectName() const
Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp (206420 => 206421)
--- trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp 2016-09-27 07:52:29 UTC (rev 206420)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp 2016-09-27 07:58:48 UTC (rev 206421)
@@ -98,7 +98,7 @@
{
ASSERT(scriptExecutionContext());
ASSERT(!isDisturbedOrLocked());
- return adoptRef(*new FetchResponse(*scriptExecutionContext(), FetchBody(m_body), FetchHeaders::create(headers()), ResourceResponse(m_response)));
+ return adoptRef(*new FetchResponse(*scriptExecutionContext(), m_body.clone(), FetchHeaders::create(headers()), ResourceResponse(m_response)));
}
void FetchResponse::fetch(ScriptExecutionContext& context, FetchRequest& request, FetchPromise&& promise)