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

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: Rebase, LayoutTests updates Created 3 years, 7 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 <memory> 7 #include <memory>
8 #include "bindings/core/v8/ScriptPromiseResolver.h" 8 #include "bindings/core/v8/ScriptPromiseResolver.h"
9 #include "bindings/core/v8/V8ArrayBuffer.h" 9 #include "bindings/core/v8/V8ArrayBuffer.h"
10 #include "core/dom/DOMArrayBuffer.h" 10 #include "core/dom/DOMArrayBuffer.h"
11 #include "core/dom/DOMTypedArray.h" 11 #include "core/dom/DOMTypedArray.h"
12 #include "core/dom/ExecutionContext.h" 12 #include "core/dom/ExecutionContext.h"
13 #include "core/dom/URLSearchParams.h"
13 #include "core/fileapi/Blob.h" 14 #include "core/fileapi/Blob.h"
15 #include "core/html/FormData.h"
14 #include "modules/fetch/BodyStreamBuffer.h" 16 #include "modules/fetch/BodyStreamBuffer.h"
15 #include "modules/fetch/FetchDataLoader.h" 17 #include "modules/fetch/FetchDataLoader.h"
16 #include "platform/bindings/ScriptState.h" 18 #include "platform/bindings/ScriptState.h"
17 #include "platform/bindings/V8ThrowException.h" 19 #include "platform/bindings/V8ThrowException.h"
20 #include "platform/network/ParsedContentType.h"
18 #include "platform/wtf/PassRefPtr.h" 21 #include "platform/wtf/PassRefPtr.h"
19 #include "platform/wtf/RefPtr.h" 22 #include "platform/wtf/RefPtr.h"
20 #include "public/platform/WebDataConsumerHandle.h" 23 #include "public/platform/WebDataConsumerHandle.h"
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>,
27 public FetchDataLoader::Client { 30 public FetchDataLoader::Client {
(...skipping 37 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* array_buffer) override { 73 void DidFetchDataLoadedArrayBuffer(DOMArrayBuffer* array_buffer) override {
71 Resolver()->Resolve(array_buffer); 74 Resolver()->Resolve(array_buffer);
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> blob_data = BlobData::Create(); 175 std::unique_ptr<BlobData> blob_data = BlobData::Create();
154 blob_data->SetContentType(MimeType()); 176 blob_data->SetContentType(MimeType());
155 resolver->Resolve( 177 resolver->Resolve(
156 Blob::Create(BlobDataHandle::Create(std::move(blob_data), 0))); 178 Blob::Create(BlobDataHandle::Create(std::move(blob_data), 0)));
157 } 179 }
158 return promise; 180 return promise;
159 } 181 }
160 182
183 ScriptPromise Body::formData(ScriptState* script_state) {
184 ScriptPromise promise = RejectInvalidConsumption(script_state);
185 if (!promise.IsEmpty())
186 return promise;
187
188 // See above comment.
189 if (!ExecutionContext::From(script_state))
190 return ScriptPromise();
191
192 ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state);
193 const ParsedContentType parsedTypeWithParameters(ContentType());
194 const String parsedType = parsedTypeWithParameters.MimeType().LowerASCII();
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 // "Let |reader| be the result of getting reader from |stream|."
215 // "Read all bytes from |stream| with |reader|."
216 if (BodyBuffer())
217 BodyBuffer()->CloseAndLockAndDisturb();
yhirano 2017/05/12 11:54:12 This is not spec-conformant when BodyBuffer() is m
e_hakkinen 2017/05/12 14:56:12 OK. I used the same code as blink::Request::Create
yhirano 2017/05/15 11:54:48 Please note that "the same code" in Request::Creat
218 }
219
220 resolver->Reject(V8ThrowException::CreateTypeError(script_state->GetIsolate(),
221 "Invalid MIME type"));
222 return promise;
223 }
224
161 ScriptPromise Body::json(ScriptState* script_state) { 225 ScriptPromise Body::json(ScriptState* script_state) {
162 ScriptPromise promise = RejectInvalidConsumption(script_state); 226 ScriptPromise promise = RejectInvalidConsumption(script_state);
163 if (!promise.IsEmpty()) 227 if (!promise.IsEmpty())
164 return promise; 228 return promise;
165 229
166 // See above comment. 230 // See above comment.
167 if (!ExecutionContext::From(script_state)) 231 if (!ExecutionContext::From(script_state))
168 return ScriptPromise(); 232 return ScriptPromise();
169 233
170 ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state); 234 ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 291
228 ScriptPromise Body::RejectInvalidConsumption(ScriptState* script_state) { 292 ScriptPromise Body::RejectInvalidConsumption(ScriptState* script_state) {
229 if (IsBodyLocked() || bodyUsed()) 293 if (IsBodyLocked() || bodyUsed())
230 return ScriptPromise::Reject( 294 return ScriptPromise::Reject(
231 script_state, V8ThrowException::CreateTypeError( 295 script_state, V8ThrowException::CreateTypeError(
232 script_state->GetIsolate(), "Already read")); 296 script_state->GetIsolate(), "Already read"));
233 return ScriptPromise(); 297 return ScriptPromise();
234 } 298 }
235 299
236 } // namespace blink 300 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/modules/fetch/Body.h ('k') | third_party/WebKit/Source/modules/fetch/Body.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698