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&&);