Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(97)

Side by Side Diff: third_party/WebKit/Source/modules/fetch/Body.cpp

Issue 2292763002: [Fetch API] Implement Request.formData and Response.formData. (Closed)
Patch Set: Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/fetch/Body.h" 5 #include "modules/fetch/Body.h"
6 6
7 #include "bindings/core/v8/ScriptPromiseResolver.h" 7 #include "bindings/core/v8/ScriptPromiseResolver.h"
8 #include "bindings/core/v8/ScriptState.h" 8 #include "bindings/core/v8/ScriptState.h"
9 #include "bindings/core/v8/V8ArrayBuffer.h" 9 #include "bindings/core/v8/V8ArrayBuffer.h"
10 #include "bindings/core/v8/V8ThrowException.h" 10 #include "bindings/core/v8/V8ThrowException.h"
11 #include "core/dom/DOMArrayBuffer.h" 11 #include "core/dom/DOMArrayBuffer.h"
12 #include "core/dom/DOMTypedArray.h" 12 #include "core/dom/DOMTypedArray.h"
13 #include "core/dom/URLSearchParams.h"
13 #include "core/fileapi/Blob.h" 14 #include "core/fileapi/Blob.h"
14 #include "core/frame/UseCounter.h" 15 #include "core/frame/UseCounter.h"
16 #include "core/html/FormData.h"
15 #include "modules/fetch/BodyStreamBuffer.h" 17 #include "modules/fetch/BodyStreamBuffer.h"
16 #include "modules/fetch/FetchDataLoader.h" 18 #include "modules/fetch/FetchDataLoader.h"
19 #include "platform/network/ParsedContentType.h"
17 #include "public/platform/WebDataConsumerHandle.h" 20 #include "public/platform/WebDataConsumerHandle.h"
18 #include "wtf/PassRefPtr.h" 21 #include "wtf/PassRefPtr.h"
19 #include "wtf/RefPtr.h" 22 #include "wtf/RefPtr.h"
20 #include <memory> 23 #include <memory>
21 24
22 namespace blink { 25 namespace blink {
23 26
24 namespace { 27 namespace {
25 28
26 class BodyConsumerBase : public GarbageCollectedFinalized<BodyConsumerBase>, 29 class BodyConsumerBase : public GarbageCollectedFinalized<BodyConsumerBase>,
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 68
66 public: 69 public:
67 explicit BodyArrayBufferConsumer(ScriptPromiseResolver* resolver) 70 explicit BodyArrayBufferConsumer(ScriptPromiseResolver* resolver)
68 : BodyConsumerBase(resolver) {} 71 : BodyConsumerBase(resolver) {}
69 72
70 void didFetchDataLoadedArrayBuffer(DOMArrayBuffer* arrayBuffer) override { 73 void didFetchDataLoadedArrayBuffer(DOMArrayBuffer* arrayBuffer) override {
71 resolver()->resolve(arrayBuffer); 74 resolver()->resolve(arrayBuffer);
72 } 75 }
73 }; 76 };
74 77
78 class BodyFormDataConsumer final : public BodyConsumerBase {
79 WTF_MAKE_NONCOPYABLE(BodyFormDataConsumer);
80
81 public:
82 explicit BodyFormDataConsumer(ScriptPromiseResolver* resolver)
83 : BodyConsumerBase(resolver) {}
84
85 void didFetchDataLoadedFormData(FormData* formData) override {
86 resolver()->resolve(formData);
87 }
88
89 void didFetchDataLoadedString(const String& string) override {
90 FormData* formData = FormData::create();
91 for (const auto& pair : URLSearchParams::create(string)->params())
92 formData->append(pair.first, pair.second);
93 didFetchDataLoadedFormData(formData);
94 }
95 };
96
75 class BodyTextConsumer final : public BodyConsumerBase { 97 class BodyTextConsumer final : public BodyConsumerBase {
76 WTF_MAKE_NONCOPYABLE(BodyTextConsumer); 98 WTF_MAKE_NONCOPYABLE(BodyTextConsumer);
77 99
78 public: 100 public:
79 explicit BodyTextConsumer(ScriptPromiseResolver* resolver) 101 explicit BodyTextConsumer(ScriptPromiseResolver* resolver)
80 : BodyConsumerBase(resolver) {} 102 : BodyConsumerBase(resolver) {}
81 103
82 void didFetchDataLoadedString(const String& string) override { 104 void didFetchDataLoadedString(const String& string) override {
83 resolver()->resolve(string); 105 resolver()->resolve(string);
84 } 106 }
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 new BodyBlobConsumer(resolver)); 173 new BodyBlobConsumer(resolver));
152 } else { 174 } else {
153 std::unique_ptr<BlobData> blobData = BlobData::create(); 175 std::unique_ptr<BlobData> blobData = BlobData::create();
154 blobData->setContentType(mimeType()); 176 blobData->setContentType(mimeType());
155 resolver->resolve( 177 resolver->resolve(
156 Blob::create(BlobDataHandle::create(std::move(blobData), 0))); 178 Blob::create(BlobDataHandle::create(std::move(blobData), 0)));
157 } 179 }
158 return promise; 180 return promise;
159 } 181 }
160 182
183 ScriptPromise Body::formData(ScriptState* scriptState) {
184 ScriptPromise promise = rejectInvalidConsumption(scriptState);
185 if (!promise.isEmpty())
186 return promise;
187
188 // See above comment.
189 if (!scriptState->getExecutionContext())
190 return ScriptPromise();
191
192 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
193 const ParsedContentType parsedTypeWithParameters(contentType());
194 const String parsedType = parsedTypeWithParameters.mimeType().lower();
195 promise = resolver->promise();
196 if (parsedType == "multipart/form-data") {
197 const String boundary =
198 parsedTypeWithParameters.parameterValueForName("boundary");
199 if (bodyBuffer() && !boundary.isEmpty()) {
200 bodyBuffer()->startLoading(
201 FetchDataLoader::createLoaderAsFormData(boundary),
202 new BodyFormDataConsumer(resolver));
203 return promise;
204 }
205 } else if (parsedType == "application/x-www-form-urlencoded") {
206 if (bodyBuffer()) {
207 bodyBuffer()->startLoading(FetchDataLoader::createLoaderAsString(),
208 new BodyFormDataConsumer(resolver));
209 } else {
210 resolver->resolve(FormData::create());
211 }
212 return promise;
213 } else {
214 if (bodyBuffer())
215 bodyBuffer()->closeAndLockAndDisturb();
216 }
217
218 resolver->reject(V8ThrowException::createTypeError(scriptState->isolate(),
219 "Invalid MIME type"));
220 return promise;
221 }
222
161 ScriptPromise Body::json(ScriptState* scriptState) { 223 ScriptPromise Body::json(ScriptState* scriptState) {
162 ScriptPromise promise = rejectInvalidConsumption(scriptState); 224 ScriptPromise promise = rejectInvalidConsumption(scriptState);
163 if (!promise.isEmpty()) 225 if (!promise.isEmpty())
164 return promise; 226 return promise;
165 227
166 // See above comment. 228 // See above comment.
167 if (!scriptState->getExecutionContext()) 229 if (!scriptState->getExecutionContext())
168 return ScriptPromise(); 230 return ScriptPromise();
169 231
170 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); 232 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 292
231 ScriptPromise Body::rejectInvalidConsumption(ScriptState* scriptState) { 293 ScriptPromise Body::rejectInvalidConsumption(ScriptState* scriptState) {
232 if (isBodyLocked() || bodyUsed()) 294 if (isBodyLocked() || bodyUsed())
233 return ScriptPromise::reject( 295 return ScriptPromise::reject(
234 scriptState, V8ThrowException::createTypeError(scriptState->isolate(), 296 scriptState, V8ThrowException::createTypeError(scriptState->isolate(),
235 "Already read")); 297 "Already read"));
236 return ScriptPromise(); 298 return ScriptPromise();
237 } 299 }
238 300
239 } // namespace blink 301 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698