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

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

Issue 2147633002: Remove nonstandard 'endings' option for Blob/File constructor (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased 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
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "modules/fetch/FetchFormDataConsumerHandle.h"
6
7 #include "core/dom/DOMTypedArray.h"
8 #include "core/html/FormData.h"
9 #include "core/loader/MockThreadableLoader.h"
10 #include "core/loader/ThreadableLoaderClient.h"
11 #include "core/testing/DummyPageHolder.h"
12 #include "modules/fetch/DataConsumerHandleTestUtil.h"
13 #include "platform/network/ResourceResponse.h"
14 #include "platform/testing/UnitTestHelpers.h"
15 #include "platform/weborigin/KURL.h"
16 #include "testing/gmock/include/gmock/gmock.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18 #include "wtf/PassRefPtr.h"
19 #include "wtf/RefPtr.h"
20 #include "wtf/Vector.h"
21 #include "wtf/text/TextEncoding.h"
22 #include "wtf/text/WTFString.h"
23 #include <memory>
24 #include <string.h>
25
26 namespace blink {
27 namespace {
28
29 using Result = WebDataConsumerHandle::Result;
30 const Result kOk = WebDataConsumerHandle::Ok;
31 const Result kDone = WebDataConsumerHandle::Done;
32 const Result kShouldWait = WebDataConsumerHandle::ShouldWait;
33 const WebDataConsumerHandle::Flags kNone = WebDataConsumerHandle::FlagNone;
34 using HandleReader = DataConsumerHandleTestUtil::HandleReader;
35 using HandleTwoPhaseReader = DataConsumerHandleTestUtil::HandleTwoPhaseReader;
36 using HandleReadResult = DataConsumerHandleTestUtil::HandleReadResult;
37 template <typename T>
38 using HandleReaderRunner = DataConsumerHandleTestUtil::HandleReaderRunner<T>;
39 using ReplayingHandle = DataConsumerHandleTestUtil::ReplayingHandle;
40 using Command = DataConsumerHandleTestUtil::Command;
41
42 using ::testing::_;
43 using ::testing::InvokeWithoutArgs;
44
45 String toString(const Vector<char>& data) {
46 return String(data.data(), data.size());
47 }
48
49 class LoaderFactory : public FetchBlobDataConsumerHandle::LoaderFactory {
50 public:
51 explicit LoaderFactory(std::unique_ptr<WebDataConsumerHandle> handle)
52 : m_client(nullptr), m_handle(std::move(handle)) {}
53 ThreadableLoader* create(ExecutionContext&,
54 ThreadableLoaderClient* client,
55 const ThreadableLoaderOptions&,
56 const ResourceLoaderOptions&) override {
57 m_client = client;
58
59 MockThreadableLoader* loader = MockThreadableLoader::create();
60 EXPECT_CALL(*loader, start(_))
61 .WillOnce(
62 InvokeWithoutArgs(this, &LoaderFactory::handleDidReceiveResponse));
63 EXPECT_CALL(*loader, cancel()).Times(1);
64 return loader;
65 }
66
67 private:
68 void handleDidReceiveResponse() {
69 m_client->didReceiveResponse(0, ResourceResponse(), std::move(m_handle));
70 }
71
72 ThreadableLoaderClient* m_client;
73 std::unique_ptr<WebDataConsumerHandle> m_handle;
74 };
75
76 class FetchFormDataConsumerHandleTest : public ::testing::Test {
77 public:
78 FetchFormDataConsumerHandleTest()
79 : m_page(DummyPageHolder::create(IntSize(1, 1))) {}
80
81 protected:
82 Document* getDocument() { return &m_page->document(); }
83
84 std::unique_ptr<DummyPageHolder> m_page;
85 };
86
87 PassRefPtr<EncodedFormData> complexFormData() {
88 RefPtr<EncodedFormData> data = EncodedFormData::create();
89
90 data->appendData("foo", 3);
91 data->appendFileRange("/foo/bar/baz", 3, 4, 5);
92 data->appendFileSystemURLRange(KURL(KURL(), "file:///foo/bar/baz"), 6, 7, 8);
93 std::unique_ptr<BlobData> blobData = BlobData::create();
94 blobData->appendText("hello");
95 auto size = blobData->length();
96 RefPtr<BlobDataHandle> blobDataHandle =
97 BlobDataHandle::create(std::move(blobData), size);
98 data->appendBlob(blobDataHandle->uuid(), blobDataHandle);
99 Vector<char> boundary;
100 boundary.append("\0", 1);
101 data->setBoundary(boundary);
102 return data.release();
103 }
104
105 void verifyComplexFormData(EncodedFormData* data) {
106 const auto& elements = data->elements();
107 if (4 != elements.size()) {
108 FAIL() << "data->elements().size() should be 4, but is "
109 << data->elements().size() << ".";
110 }
111 EXPECT_EQ(FormDataElement::data, elements[0].m_type);
112 EXPECT_EQ("foo",
113 String(elements[0].m_data.data(), elements[0].m_data.size()));
114
115 EXPECT_EQ(FormDataElement::encodedFile, elements[1].m_type);
116 EXPECT_EQ("/foo/bar/baz", elements[1].m_filename);
117 EXPECT_EQ(3, elements[1].m_fileStart);
118 EXPECT_EQ(4, elements[1].m_fileLength);
119 EXPECT_EQ(5, elements[1].m_expectedFileModificationTime);
120
121 EXPECT_EQ(FormDataElement::encodedFileSystemURL, elements[2].m_type);
122 EXPECT_EQ(KURL(KURL(), "file:///foo/bar/baz"), elements[2].m_fileSystemURL);
123 EXPECT_EQ(6, elements[2].m_fileStart);
124 EXPECT_EQ(7, elements[2].m_fileLength);
125 EXPECT_EQ(8, elements[2].m_expectedFileModificationTime);
126
127 EXPECT_EQ(FormDataElement::encodedBlob, elements[3].m_type);
128 if (!elements[3].m_optionalBlobDataHandle) {
129 FAIL() << "optional BlobDataHandle must be set.";
130 }
131 EXPECT_EQ(elements[3].m_blobUUID,
132 elements[3].m_optionalBlobDataHandle->uuid());
133 EXPECT_EQ(5u, elements[3].m_optionalBlobDataHandle->size());
134 }
135
136 TEST_F(FetchFormDataConsumerHandleTest, ReadFromString) {
137 std::unique_ptr<FetchDataConsumerHandle> handle =
138 FetchFormDataConsumerHandle::create(String("hello, world"));
139 HandleReaderRunner<HandleReader> runner(std::move(handle));
140 std::unique_ptr<HandleReadResult> r = runner.wait();
141 EXPECT_EQ(kDone, r->result());
142 EXPECT_EQ("hello, world", toString(r->data()));
143 }
144
145 TEST_F(FetchFormDataConsumerHandleTest, TwoPhaseReadFromString) {
146 std::unique_ptr<FetchDataConsumerHandle> handle =
147 FetchFormDataConsumerHandle::create(String("hello, world"));
148 HandleReaderRunner<HandleTwoPhaseReader> runner(std::move(handle));
149 std::unique_ptr<HandleReadResult> r = runner.wait();
150 EXPECT_EQ(kDone, r->result());
151 EXPECT_EQ("hello, world", toString(r->data()));
152 }
153
154 TEST_F(FetchFormDataConsumerHandleTest, ReadFromStringNonLatin) {
155 UChar cs[] = {0x3042, 0};
156 std::unique_ptr<FetchDataConsumerHandle> handle =
157 FetchFormDataConsumerHandle::create(String(cs));
158 HandleReaderRunner<HandleReader> runner(std::move(handle));
159 std::unique_ptr<HandleReadResult> r = runner.wait();
160 EXPECT_EQ(kDone, r->result());
161 EXPECT_EQ("\xe3\x81\x82", toString(r->data()));
162 }
163
164 TEST_F(FetchFormDataConsumerHandleTest, ReadFromArrayBuffer) {
165 const unsigned char data[] = {0x21, 0xfe, 0x00, 0x00, 0xff, 0xa3,
166 0x42, 0x30, 0x42, 0x99, 0x88};
167 DOMArrayBuffer* buffer = DOMArrayBuffer::create(data, WTF_ARRAY_LENGTH(data));
168 std::unique_ptr<FetchDataConsumerHandle> handle =
169 FetchFormDataConsumerHandle::create(buffer);
170 HandleReaderRunner<HandleReader> runner(std::move(handle));
171 std::unique_ptr<HandleReadResult> r = runner.wait();
172 EXPECT_EQ(kDone, r->result());
173 Vector<char> expected;
174 expected.append(data, WTF_ARRAY_LENGTH(data));
175 EXPECT_EQ(expected, r->data());
176 }
177
178 TEST_F(FetchFormDataConsumerHandleTest, ReadFromArrayBufferView) {
179 const unsigned char data[] = {0x21, 0xfe, 0x00, 0x00, 0xff, 0xa3,
180 0x42, 0x30, 0x42, 0x99, 0x88};
181 const size_t offset = 1, size = 4;
182 DOMArrayBuffer* buffer = DOMArrayBuffer::create(data, WTF_ARRAY_LENGTH(data));
183 std::unique_ptr<FetchDataConsumerHandle> handle =
184 FetchFormDataConsumerHandle::create(
185 DOMUint8Array::create(buffer, offset, size));
186 HandleReaderRunner<HandleReader> runner(std::move(handle));
187 std::unique_ptr<HandleReadResult> r = runner.wait();
188 EXPECT_EQ(kDone, r->result());
189 Vector<char> expected;
190 expected.append(data + offset, size);
191 EXPECT_EQ(expected, r->data());
192 }
193
194 TEST_F(FetchFormDataConsumerHandleTest, ReadFromSimplFormData) {
195 RefPtr<EncodedFormData> data = EncodedFormData::create();
196 data->appendData("foo", 3);
197 data->appendData("hoge", 4);
198
199 std::unique_ptr<FetchDataConsumerHandle> handle =
200 FetchFormDataConsumerHandle::create(getDocument(), data);
201 HandleReaderRunner<HandleReader> runner(std::move(handle));
202 testing::runPendingTasks();
203 std::unique_ptr<HandleReadResult> r = runner.wait();
204 EXPECT_EQ(kDone, r->result());
205 EXPECT_EQ("foohoge", toString(r->data()));
206 }
207
208 TEST_F(FetchFormDataConsumerHandleTest, ReadFromComplexFormData) {
209 RefPtr<EncodedFormData> data = complexFormData();
210 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create();
211 src->add(Command(Command::Data, "bar"));
212 src->add(Command(Command::Done));
213 std::unique_ptr<FetchDataConsumerHandle> handle =
214 FetchFormDataConsumerHandle::createForTest(
215 getDocument(), data, new LoaderFactory(std::move(src)));
216 char c;
217 size_t readSize;
218 EXPECT_EQ(kShouldWait,
219 handle->obtainReader(nullptr)->read(&c, 1, kNone, &readSize));
220
221 HandleReaderRunner<HandleReader> runner(std::move(handle));
222 testing::runPendingTasks();
223 std::unique_ptr<HandleReadResult> r = runner.wait();
224 EXPECT_EQ(kDone, r->result());
225 EXPECT_EQ("bar", toString(r->data()));
226 }
227
228 TEST_F(FetchFormDataConsumerHandleTest, TwoPhaseReadFromComplexFormData) {
229 RefPtr<EncodedFormData> data = complexFormData();
230 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create();
231 src->add(Command(Command::Data, "bar"));
232 src->add(Command(Command::Done));
233 std::unique_ptr<FetchDataConsumerHandle> handle =
234 FetchFormDataConsumerHandle::createForTest(
235 getDocument(), data, new LoaderFactory(std::move(src)));
236 char c;
237 size_t readSize;
238 EXPECT_EQ(kShouldWait,
239 handle->obtainReader(nullptr)->read(&c, 1, kNone, &readSize));
240
241 HandleReaderRunner<HandleTwoPhaseReader> runner(std::move(handle));
242 testing::runPendingTasks();
243 std::unique_ptr<HandleReadResult> r = runner.wait();
244 EXPECT_EQ(kDone, r->result());
245 EXPECT_EQ("bar", toString(r->data()));
246 }
247
248 TEST_F(FetchFormDataConsumerHandleTest, DrainAsBlobDataHandleFromString) {
249 std::unique_ptr<FetchDataConsumerHandle> handle =
250 FetchFormDataConsumerHandle::create(String("hello, world"));
251 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
252 handle->obtainFetchDataReader(nullptr);
253 RefPtr<BlobDataHandle> blobDataHandle = reader->drainAsBlobDataHandle();
254 ASSERT_TRUE(blobDataHandle);
255
256 EXPECT_EQ(String(), blobDataHandle->type());
257 EXPECT_EQ(12u, blobDataHandle->size());
258 EXPECT_EQ(nullptr, reader->drainAsFormData());
259 char c;
260 size_t readSize;
261 EXPECT_EQ(kDone, reader->read(&c, 1, kNone, &readSize));
262 }
263
264 TEST_F(FetchFormDataConsumerHandleTest, DrainAsBlobDataHandleFromArrayBuffer) {
265 std::unique_ptr<FetchDataConsumerHandle> handle =
266 FetchFormDataConsumerHandle::create(DOMArrayBuffer::create("foo", 3));
267 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
268 handle->obtainFetchDataReader(nullptr);
269 RefPtr<BlobDataHandle> blobDataHandle = reader->drainAsBlobDataHandle();
270 ASSERT_TRUE(blobDataHandle);
271
272 EXPECT_EQ(String(), blobDataHandle->type());
273 EXPECT_EQ(3u, blobDataHandle->size());
274 EXPECT_EQ(nullptr, reader->drainAsFormData());
275 char c;
276 size_t readSize;
277 EXPECT_EQ(kDone, reader->read(&c, 1, kNone, &readSize));
278 }
279
280 TEST_F(FetchFormDataConsumerHandleTest,
281 DrainAsBlobDataHandleFromSimpleFormData) {
282 FormData* data = FormData::create(UTF8Encoding());
283 data->append("name1", "value1");
284 data->append("name2", "value2");
285 RefPtr<EncodedFormData> inputFormData = data->encodeMultiPartFormData();
286
287 std::unique_ptr<FetchDataConsumerHandle> handle =
288 FetchFormDataConsumerHandle::create(getDocument(), inputFormData);
289 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
290 handle->obtainFetchDataReader(nullptr);
291 RefPtr<BlobDataHandle> blobDataHandle = reader->drainAsBlobDataHandle();
292 ASSERT_TRUE(blobDataHandle);
293
294 EXPECT_EQ(String(), blobDataHandle->type());
295 EXPECT_EQ(inputFormData->flattenToString().utf8().length(),
296 blobDataHandle->size());
297 EXPECT_EQ(nullptr, reader->drainAsFormData());
298 char c;
299 size_t readSize;
300 EXPECT_EQ(kDone, reader->read(&c, 1, kNone, &readSize));
301 }
302
303 TEST_F(FetchFormDataConsumerHandleTest,
304 DrainAsBlobDataHandleFromComplexFormData) {
305 RefPtr<EncodedFormData> inputFormData = complexFormData();
306
307 std::unique_ptr<FetchDataConsumerHandle> handle =
308 FetchFormDataConsumerHandle::create(getDocument(), inputFormData);
309 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
310 handle->obtainFetchDataReader(nullptr);
311 RefPtr<BlobDataHandle> blobDataHandle = reader->drainAsBlobDataHandle();
312 ASSERT_TRUE(blobDataHandle);
313
314 EXPECT_EQ(nullptr, reader->drainAsFormData());
315 char c;
316 size_t readSize;
317 EXPECT_EQ(kDone, reader->read(&c, 1, kNone, &readSize));
318 }
319
320 TEST_F(FetchFormDataConsumerHandleTest, DrainAsFormDataFromString) {
321 std::unique_ptr<FetchDataConsumerHandle> handle =
322 FetchFormDataConsumerHandle::create(String("hello, world"));
323 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
324 handle->obtainFetchDataReader(nullptr);
325 RefPtr<EncodedFormData> formData = reader->drainAsFormData();
326 ASSERT_TRUE(formData);
327 EXPECT_TRUE(formData->isSafeToSendToAnotherThread());
328 EXPECT_EQ("hello, world", formData->flattenToString());
329
330 const void* buffer = nullptr;
331 size_t size;
332 EXPECT_EQ(kDone, reader->read(nullptr, 0, kNone, &size));
333 EXPECT_EQ(kDone, reader->beginRead(&buffer, kNone, &size));
334 }
335
336 TEST_F(FetchFormDataConsumerHandleTest, DrainAsFormDataFromArrayBuffer) {
337 std::unique_ptr<FetchDataConsumerHandle> handle =
338 FetchFormDataConsumerHandle::create(DOMArrayBuffer::create("foo", 3));
339 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
340 handle->obtainFetchDataReader(nullptr);
341 RefPtr<EncodedFormData> formData = reader->drainAsFormData();
342 ASSERT_TRUE(formData);
343 EXPECT_TRUE(formData->isSafeToSendToAnotherThread());
344 EXPECT_EQ("foo", formData->flattenToString());
345 }
346
347 TEST_F(FetchFormDataConsumerHandleTest, DrainAsFormDataFromSimpleFormData) {
348 FormData* data = FormData::create(UTF8Encoding());
349 data->append("name1", "value1");
350 data->append("name2", "value2");
351 RefPtr<EncodedFormData> inputFormData = data->encodeMultiPartFormData();
352
353 std::unique_ptr<FetchDataConsumerHandle> handle =
354 FetchFormDataConsumerHandle::create(getDocument(), inputFormData);
355 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
356 handle->obtainFetchDataReader(nullptr);
357 RefPtr<EncodedFormData> outputFormData = reader->drainAsFormData();
358 ASSERT_TRUE(outputFormData);
359 EXPECT_TRUE(outputFormData->isSafeToSendToAnotherThread());
360 EXPECT_NE(outputFormData.get(), inputFormData.get());
361 EXPECT_EQ(inputFormData->flattenToString(),
362 outputFormData->flattenToString());
363 }
364
365 TEST_F(FetchFormDataConsumerHandleTest, DrainAsFormDataFromComplexFormData) {
366 RefPtr<EncodedFormData> inputFormData = complexFormData();
367
368 std::unique_ptr<FetchDataConsumerHandle> handle =
369 FetchFormDataConsumerHandle::create(getDocument(), inputFormData);
370 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
371 handle->obtainFetchDataReader(nullptr);
372 RefPtr<EncodedFormData> outputFormData = reader->drainAsFormData();
373 ASSERT_TRUE(outputFormData);
374 EXPECT_TRUE(outputFormData->isSafeToSendToAnotherThread());
375 EXPECT_NE(outputFormData.get(), inputFormData.get());
376 verifyComplexFormData(outputFormData.get());
377 }
378
379 TEST_F(FetchFormDataConsumerHandleTest, ZeroByteReadDoesNotAffectDraining) {
380 std::unique_ptr<FetchDataConsumerHandle> handle =
381 FetchFormDataConsumerHandle::create(String("hello, world"));
382 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
383 handle->obtainFetchDataReader(nullptr);
384 size_t readSize;
385 EXPECT_EQ(kOk, reader->read(nullptr, 0, kNone, &readSize));
386 RefPtr<EncodedFormData> formData = reader->drainAsFormData();
387 ASSERT_TRUE(formData);
388 EXPECT_TRUE(formData->isSafeToSendToAnotherThread());
389 EXPECT_EQ("hello, world", formData->flattenToString());
390 }
391
392 TEST_F(FetchFormDataConsumerHandleTest, OneByteReadAffectsDraining) {
393 char c;
394 std::unique_ptr<FetchDataConsumerHandle> handle =
395 FetchFormDataConsumerHandle::create(String("hello, world"));
396 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
397 handle->obtainFetchDataReader(nullptr);
398 size_t readSize;
399 EXPECT_EQ(kOk, reader->read(&c, 1, kNone, &readSize));
400 EXPECT_EQ(1u, readSize);
401 EXPECT_EQ('h', c);
402 EXPECT_FALSE(reader->drainAsFormData());
403 }
404
405 TEST_F(FetchFormDataConsumerHandleTest, BeginReadAffectsDraining) {
406 const void* buffer = nullptr;
407 std::unique_ptr<FetchDataConsumerHandle> handle =
408 FetchFormDataConsumerHandle::create(String("hello, world"));
409 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
410 handle->obtainFetchDataReader(nullptr);
411 size_t available;
412 EXPECT_EQ(kOk, reader->beginRead(&buffer, kNone, &available));
413 ASSERT_TRUE(buffer);
414 EXPECT_EQ("hello, world",
415 String(static_cast<const char*>(buffer), available));
416 EXPECT_FALSE(reader->drainAsFormData());
417 reader->endRead(0);
418 EXPECT_FALSE(reader->drainAsFormData());
419 }
420
421 TEST_F(FetchFormDataConsumerHandleTest,
422 ZeroByteReadDoesNotAffectDrainingForComplexFormData) {
423 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create();
424 src->add(Command(Command::Data, "bar"));
425 src->add(Command(Command::Done));
426 std::unique_ptr<FetchDataConsumerHandle> handle =
427 FetchFormDataConsumerHandle::createForTest(
428 getDocument(), complexFormData(), new LoaderFactory(std::move(src)));
429 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
430 handle->obtainFetchDataReader(nullptr);
431 size_t readSize;
432 EXPECT_EQ(kShouldWait, reader->read(nullptr, 0, kNone, &readSize));
433 testing::runPendingTasks();
434 RefPtr<EncodedFormData> formData = reader->drainAsFormData();
435 ASSERT_TRUE(formData);
436 EXPECT_TRUE(formData->isSafeToSendToAnotherThread());
437 verifyComplexFormData(formData.get());
438 }
439
440 TEST_F(FetchFormDataConsumerHandleTest,
441 OneByteReadAffectsDrainingForComplexFormData) {
442 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create();
443 src->add(Command(Command::Data, "bar"));
444 src->add(Command(Command::Done));
445 std::unique_ptr<FetchDataConsumerHandle> handle =
446 FetchFormDataConsumerHandle::createForTest(
447 getDocument(), complexFormData(), new LoaderFactory(std::move(src)));
448 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
449 handle->obtainFetchDataReader(nullptr);
450 char c;
451 size_t readSize;
452 EXPECT_EQ(kShouldWait, reader->read(&c, 1, kNone, &readSize));
453 testing::runPendingTasks();
454 EXPECT_EQ(kOk, reader->read(&c, 1, kNone, &readSize));
455 EXPECT_EQ(1u, readSize);
456 EXPECT_EQ('b', c);
457 EXPECT_FALSE(reader->drainAsFormData());
458 }
459
460 TEST_F(FetchFormDataConsumerHandleTest,
461 BeginReadAffectsDrainingForComplexFormData) {
462 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create();
463 src->add(Command(Command::Data, "bar"));
464 src->add(Command(Command::Done));
465 const void* buffer = nullptr;
466 std::unique_ptr<FetchDataConsumerHandle> handle =
467 FetchFormDataConsumerHandle::createForTest(
468 getDocument(), complexFormData(), new LoaderFactory(std::move(src)));
469 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
470 handle->obtainFetchDataReader(nullptr);
471 size_t available;
472 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available));
473 testing::runPendingTasks();
474 EXPECT_EQ(kOk, reader->beginRead(&buffer, kNone, &available));
475 EXPECT_FALSE(reader->drainAsFormData());
476 reader->endRead(0);
477 EXPECT_FALSE(reader->drainAsFormData());
478 }
479
480 } // namespace
481 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698