Diff
Modified: trunk/Source/WebCore/ChangeLog (198889 => 198890)
--- trunk/Source/WebCore/ChangeLog 2016-03-31 08:31:25 UTC (rev 198889)
+++ trunk/Source/WebCore/ChangeLog 2016-03-31 10:31:28 UTC (rev 198890)
@@ -1,5 +1,42 @@
2016-03-31 Youenn Fablet <[email protected]>
+ [Fetch API] Move isDisturbed handling to FetchBodyOwner
+ https://bugs.webkit.org/show_bug.cgi?id=155968
+
+ Reviewed by Darin Adler.
+
+ Moved isDisturbed handling in FetchBodyOwner.
+ This includes promise rejection in case of disturbed bodies.
+
+ No behavior change observable from user scripts.
+
+ * Modules/fetch/FetchBody.cpp:
+ (WebCore::FetchBody::arrayBuffer):
+ (WebCore::FetchBody::blob):
+ (WebCore::FetchBody::json):
+ (WebCore::FetchBody::text):
+ (WebCore::FetchBody::extractFromBody):
+ (WebCore::FetchBody::consume):
+ (WebCore::FetchBody::consumeArrayBuffer):
+ (WebCore::FetchBody::processIfEmptyOrDisturbed): Deleted.
+ * Modules/fetch/FetchBody.h:
+ (WebCore::FetchBody::isEmpty): Deleted.
+ * Modules/fetch/FetchBodyOwner.cpp:
+ (WebCore::FetchBodyOwner::arrayBuffer):
+ (WebCore::FetchBodyOwner::blob):
+ (WebCore::FetchBodyOwner::formData):
+ (WebCore::FetchBodyOwner::json):
+ (WebCore::FetchBodyOwner::text):
+ * Modules/fetch/FetchBodyOwner.h:
+ (WebCore::FetchBodyOwner::isDisturbed):
+ (WebCore::FetchBodyOwner::setDisturbed):
+ * Modules/fetch/FetchRequest.cpp:
+ (WebCore::FetchRequest::create):
+ * Modules/fetch/FetchResponse.cpp:
+ (WebCore::FetchResponse::clone):
+
+2016-03-31 Youenn Fablet <[email protected]>
+
Remove forEach use from Fetch Headers builtin constructor
https://bugs.webkit.org/show_bug.cgi?id=155967
Modified: trunk/Source/WebCore/Modules/fetch/FetchBody.cpp (198889 => 198890)
--- trunk/Source/WebCore/Modules/fetch/FetchBody.cpp 2016-03-31 08:31:25 UTC (rev 198889)
+++ trunk/Source/WebCore/Modules/fetch/FetchBody.cpp 2016-03-31 10:31:28 UTC (rev 198890)
@@ -33,7 +33,6 @@
#include "DOMRequestState.h"
#include "Dictionary.h"
-#include "ExceptionCode.h"
#include "FetchBodyOwner.h"
#include "FormData.h"
#include "HTTPParsers.h"
@@ -82,60 +81,24 @@
if (!body)
return { };
- body->m_isDisturbed = true;
return FetchBody(WTFMove(*body));
}
-bool FetchBody::processIfEmptyOrDisturbed(Consumer::Type type, DeferredWrapper& promise)
-{
- if (m_type == Type::None) {
- switch (type) {
- case Consumer::Type::Text:
- promise.resolve(String());
- return true;
- case Consumer::Type::Blob:
- promise.resolve<RefPtr<Blob>>(Blob::create());
- return true;
- case Consumer::Type::JSON:
- promise.reject<ExceptionCode>(SYNTAX_ERR);
- return true;
- case Consumer::Type::ArrayBuffer:
- fulfillPromiseWithArrayBuffer(promise, nullptr, 0);
- return true;
- default:
- ASSERT_NOT_REACHED();
- promise.reject<ExceptionCode>(0);
- return true;
- };
- }
-
- if (m_isDisturbed) {
- promise.reject<ExceptionCode>(TypeError);
- return true;
- }
- m_isDisturbed = true;
- return false;
-}
-
void FetchBody::arrayBuffer(FetchBodyOwner& owner, DeferredWrapper&& promise)
{
- if (processIfEmptyOrDisturbed(Consumer::Type::ArrayBuffer, promise))
- return;
+ ASSERT(m_type != Type::None);
consume(owner, Consumer::Type::ArrayBuffer, WTFMove(promise));
}
void FetchBody::blob(FetchBodyOwner& owner, DeferredWrapper&& promise)
{
- if (processIfEmptyOrDisturbed(Consumer::Type::Blob, promise))
- return;
-
+ ASSERT(m_type != Type::None);
consume(owner, Consumer::Type::Blob, WTFMove(promise));
}
void FetchBody::json(FetchBodyOwner& owner, DeferredWrapper&& promise)
{
- if (processIfEmptyOrDisturbed(Consumer::Type::JSON, promise))
- return;
+ ASSERT(m_type != Type::None);
if (m_type == Type::Text) {
fulfillPromiseWithJSON(promise, m_text);
@@ -146,8 +109,7 @@
void FetchBody::text(FetchBodyOwner& owner, DeferredWrapper&& promise)
{
- if (processIfEmptyOrDisturbed(Consumer::Type::Text, promise))
- return;
+ ASSERT(m_type != Type::None);
if (m_type == Type::Text) {
promise.resolve(m_text);
Modified: trunk/Source/WebCore/Modules/fetch/FetchBody.h (198889 => 198890)
--- trunk/Source/WebCore/Modules/fetch/FetchBody.h 2016-03-31 08:31:25 UTC (rev 198889)
+++ trunk/Source/WebCore/Modules/fetch/FetchBody.h 2016-03-31 10:31:28 UTC (rev 198890)
@@ -54,7 +54,6 @@
void text(FetchBodyOwner&, DeferredWrapper&&);
void formData(FetchBodyOwner&, DeferredWrapper&& promise) { promise.reject<ExceptionCode>(0); }
- bool isDisturbed() const { return m_isDisturbed; }
bool isEmpty() const { return m_type == Type::None; }
void setMimeType(const String& mimeType) { m_mimeType = mimeType; }
@@ -88,7 +87,6 @@
void consume(FetchBodyOwner&, Consumer::Type, DeferredWrapper&&);
Vector<uint8_t> extractFromText() const;
- bool processIfEmptyOrDisturbed(Consumer::Type, DeferredWrapper&);
void consumeArrayBuffer(Consumer::Type, DeferredWrapper&);
void consumeText(Consumer::Type, DeferredWrapper&);
void consumeBlob(FetchBodyOwner&, Consumer::Type, DeferredWrapper&&);
@@ -98,7 +96,6 @@
Type m_type { Type::None };
String m_mimeType;
- bool m_isDisturbed { false };
// FIXME: Add support for BufferSource and URLSearchParams.
RefPtr<Blob> m_blob;
Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp (198889 => 198890)
--- trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp 2016-03-31 08:31:25 UTC (rev 198889)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp 2016-03-31 10:31:28 UTC (rev 198890)
@@ -31,7 +31,9 @@
#if ENABLE(FETCH_API)
+#include "ExceptionCode.h"
#include "FetchLoader.h"
+#include "JSBlob.h"
#include "ResourceResponse.h"
namespace WebCore {
@@ -53,10 +55,80 @@
ASSERT(!m_blobLoader);
}
+void FetchBodyOwner::arrayBuffer(DeferredWrapper&& promise)
+{
+ if (m_body.isEmpty()) {
+ fulfillPromiseWithArrayBuffer(promise, nullptr, 0);
+ return;
+ }
+ if (isDisturbed()) {
+ promise.reject<ExceptionCode>(TypeError);
+ return;
+ }
+ m_isDisturbed = true;
+ m_body.arrayBuffer(*this, WTFMove(promise));
+}
+
+void FetchBodyOwner::blob(DeferredWrapper&& promise)
+{
+ if (m_body.isEmpty()) {
+ promise.resolve<RefPtr<Blob>>(Blob::create());
+ return;
+ }
+ if (isDisturbed()) {
+ promise.reject<ExceptionCode>(TypeError);
+ return;
+ }
+ m_isDisturbed = true;
+ m_body.blob(*this, WTFMove(promise));
+}
+
+void FetchBodyOwner::formData(DeferredWrapper&& promise)
+{
+ if (m_body.isEmpty()) {
+ promise.reject<ExceptionCode>(0);
+ return;
+ }
+ if (isDisturbed()) {
+ promise.reject<ExceptionCode>(TypeError);
+ return;
+ }
+ m_isDisturbed = true;
+ m_body.formData(*this, WTFMove(promise));
+}
+
+void FetchBodyOwner::json(DeferredWrapper&& promise)
+{
+ if (m_body.isEmpty()) {
+ promise.reject<ExceptionCode>(SYNTAX_ERR);
+ return;
+ }
+ if (isDisturbed()) {
+ promise.reject<ExceptionCode>(TypeError);
+ return;
+ }
+ m_isDisturbed = true;
+ m_body.json(*this, WTFMove(promise));
+}
+
+void FetchBodyOwner::text(DeferredWrapper&& promise)
+{
+ if (m_body.isEmpty()) {
+ promise.resolve(String());
+ return;
+ }
+ if (isDisturbed()) {
+ promise.reject<ExceptionCode>(TypeError);
+ return;
+ }
+ m_isDisturbed = true;
+ m_body.text(*this, WTFMove(promise));
+}
+
void FetchBodyOwner::loadBlob(Blob& blob, FetchLoader::Type type)
{
// Can only be called once for a body instance.
- ASSERT(m_body.isDisturbed());
+ ASSERT(isDisturbed());
ASSERT(!m_blobLoader);
if (!scriptExecutionContext()) {
Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.h (198889 => 198890)
--- trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.h 2016-03-31 08:31:25 UTC (rev 198889)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.h 2016-03-31 10:31:28 UTC (rev 198890)
@@ -43,13 +43,14 @@
FetchBodyOwner(ScriptExecutionContext&, FetchBody&&);
// Exposed Body API
- bool isDisturbed() const { return m_body.isDisturbed(); }
- void arrayBuffer(DeferredWrapper&& promise) { m_body.arrayBuffer(*this, WTFMove(promise)); }
- void blob(DeferredWrapper&& promise) { m_body.blob(*this, WTFMove(promise)); }
- void formData(DeferredWrapper&& promise) { m_body.formData(*this, WTFMove(promise)); }
- void json(DeferredWrapper&& promise) { m_body.json(*this, WTFMove(promise)); }
- void text(DeferredWrapper&& promise) { m_body.text(*this, WTFMove(promise)); }
+ bool isDisturbed() const { return m_isDisturbed; }
+ void arrayBuffer(DeferredWrapper&&);
+ void blob(DeferredWrapper&&);
+ void formData(DeferredWrapper&&);
+ void json(DeferredWrapper&&);
+ void text(DeferredWrapper&&);
+
void loadBlob(Blob&, FetchLoader::Type);
bool isActive() const { return !!m_blobLoader; }
@@ -61,6 +62,8 @@
// ActiveDOMObject API
void stop() override;
+ void setDisturbed() { m_isDisturbed = true; }
+
private:
// Blob loading routines
void loadedBlobAsText(String&&);
@@ -85,6 +88,7 @@
protected:
FetchBody m_body;
+ bool m_isDisturbed { false };
private:
Optional<BlobLoader> m_blobLoader;
Modified: trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp (198889 => 198890)
--- trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp 2016-03-31 08:31:25 UTC (rev 198889)
+++ trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp 2016-03-31 10:31:28 UTC (rev 198890)
@@ -295,6 +295,9 @@
return nullptr;
}
+ if (!input.m_body.isEmpty())
+ input.setDisturbed();
+
return adoptRef(*new FetchRequest(context, WTFMove(body), headers.releaseNonNull(), WTFMove(internalRequest)));
}
Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp (198889 => 198890)
--- trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp 2016-03-31 08:31:25 UTC (rev 198889)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp 2016-03-31 10:31:28 UTC (rev 198890)
@@ -118,7 +118,7 @@
RefPtr<FetchResponse> FetchResponse::clone(ScriptExecutionContext& context, ExceptionCode& ec)
{
- if (m_body.isDisturbed() || m_isLocked) {
+ if (isDisturbed() || m_isLocked) {
ec = TypeError;
return nullptr;
}