OLD | NEW |
---|---|
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 "content/child/web_url_loader_impl.h" | 5 #include "content/child/web_url_loader_impl.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 #include <string.h> | 8 #include <string.h> |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
45 const char kTestData[] = "blah!"; | 45 const char kTestData[] = "blah!"; |
46 | 46 |
47 const char kFtpDirMimeType[] = "text/vnd.chromium.ftp-dir"; | 47 const char kFtpDirMimeType[] = "text/vnd.chromium.ftp-dir"; |
48 // Simple FTP directory listing. Tests are not concerned with correct parsing, | 48 // Simple FTP directory listing. Tests are not concerned with correct parsing, |
49 // but rather correct cleanup when deleted while parsing. Important details of | 49 // but rather correct cleanup when deleted while parsing. Important details of |
50 // this list are that it contains more than one entry that are not "." or "..". | 50 // this list are that it contains more than one entry that are not "." or "..". |
51 const char kFtpDirListing[] = | 51 const char kFtpDirListing[] = |
52 "drwxr-xr-x 3 ftp ftp 4096 May 15 18:11 goat\n" | 52 "drwxr-xr-x 3 ftp ftp 4096 May 15 18:11 goat\n" |
53 "drwxr-xr-x 3 ftp ftp 4096 May 15 18:11 hat"; | 53 "drwxr-xr-x 3 ftp ftp 4096 May 15 18:11 hat"; |
54 | 54 |
55 const char kMultipartResponseMimeType[] = "multipart/x-mixed-replace"; | |
56 const char kMultipartResponseHeaders[] = | |
57 "HTTP/1.0 200 Peachy\r\n" | |
58 "Content-Type: multipart/x-mixed-replace; boundary=boundary\r\n\r\n"; | |
59 // Simple multipart response. Imporant details for the tests are that it | |
60 // contains multiple chunks, and that it doesn't end with a boundary, so will | |
61 // send data in OnResponseComplete. Also, it will resolve to kTestData. | |
62 const char kMultipartResponse[] = | |
63 "--boundary\n" | |
64 "Content-type: text/html\n\n" | |
65 "bl" | |
66 "--boundary\n" | |
67 "Content-type: text/html\n\n" | |
68 "ah!"; | |
69 | |
70 class TestResourceDispatcher : public ResourceDispatcher { | 55 class TestResourceDispatcher : public ResourceDispatcher { |
71 public: | 56 public: |
72 TestResourceDispatcher() : | 57 TestResourceDispatcher() : |
73 ResourceDispatcher(nullptr, nullptr), | 58 ResourceDispatcher(nullptr, nullptr), |
74 canceled_(false) { | 59 canceled_(false) { |
75 } | 60 } |
76 | 61 |
77 ~TestResourceDispatcher() override {} | 62 ~TestResourceDispatcher() override {} |
78 | 63 |
79 // TestDispatcher implementation: | 64 // TestDispatcher implementation: |
(...skipping 29 matching lines...) Expand all Loading... | |
109 DISALLOW_COPY_AND_ASSIGN(TestResourceDispatcher); | 94 DISALLOW_COPY_AND_ASSIGN(TestResourceDispatcher); |
110 }; | 95 }; |
111 | 96 |
112 class TestWebURLLoaderClient : public blink::WebURLLoaderClient { | 97 class TestWebURLLoaderClient : public blink::WebURLLoaderClient { |
113 public: | 98 public: |
114 TestWebURLLoaderClient(ResourceDispatcher* dispatcher, | 99 TestWebURLLoaderClient(ResourceDispatcher* dispatcher, |
115 scoped_refptr<scheduler::TaskQueue> task_runner) | 100 scoped_refptr<scheduler::TaskQueue> task_runner) |
116 : loader_(new WebURLLoaderImpl( | 101 : loader_(new WebURLLoaderImpl( |
117 dispatcher, | 102 dispatcher, |
118 make_scoped_ptr(new scheduler::WebTaskRunnerImpl(task_runner)))), | 103 make_scoped_ptr(new scheduler::WebTaskRunnerImpl(task_runner)))), |
119 expect_multipart_response_(false), | |
120 delete_on_receive_redirect_(false), | 104 delete_on_receive_redirect_(false), |
121 delete_on_receive_response_(false), | 105 delete_on_receive_response_(false), |
122 delete_on_receive_data_(false), | 106 delete_on_receive_data_(false), |
123 delete_on_finish_(false), | 107 delete_on_finish_(false), |
124 delete_on_fail_(false), | 108 delete_on_fail_(false), |
125 did_receive_redirect_(false), | 109 did_receive_redirect_(false), |
126 did_receive_response_(false), | 110 did_receive_response_(false), |
127 did_finish_(false) {} | 111 did_finish_(false) {} |
128 | 112 |
129 ~TestWebURLLoaderClient() override {} | 113 ~TestWebURLLoaderClient() override {} |
(...skipping 19 matching lines...) Expand all Loading... | |
149 EXPECT_TRUE(loader_); | 133 EXPECT_TRUE(loader_); |
150 EXPECT_EQ(loader_.get(), loader); | 134 EXPECT_EQ(loader_.get(), loader); |
151 } | 135 } |
152 | 136 |
153 void didReceiveResponse( | 137 void didReceiveResponse( |
154 blink::WebURLLoader* loader, | 138 blink::WebURLLoader* loader, |
155 const blink::WebURLResponse& response) override { | 139 const blink::WebURLResponse& response) override { |
156 EXPECT_TRUE(loader_); | 140 EXPECT_TRUE(loader_); |
157 EXPECT_EQ(loader_.get(), loader); | 141 EXPECT_EQ(loader_.get(), loader); |
158 | 142 |
159 // Only multipart requests may receive multiple response headers. | |
160 EXPECT_TRUE(expect_multipart_response_ || !did_receive_response_); | |
hiroshige
2016/02/26 19:02:12
Can this be |EXPECT_FALSE(did_receive_response_);|
yhirano
2016/02/27 01:27:45
Done.
| |
161 | |
162 did_receive_response_ = true; | 143 did_receive_response_ = true; |
163 response_ = response; | 144 response_ = response; |
164 if (delete_on_receive_response_) | 145 if (delete_on_receive_response_) |
165 loader_.reset(); | 146 loader_.reset(); |
166 } | 147 } |
167 | 148 |
168 void didDownloadData(blink::WebURLLoader* loader, | 149 void didDownloadData(blink::WebURLLoader* loader, |
169 int dataLength, | 150 int dataLength, |
170 int encodedDataLength) override { | 151 int encodedDataLength) override { |
171 EXPECT_TRUE(loader_); | 152 EXPECT_TRUE(loader_); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
218 | 199 |
219 if (delete_on_fail_) | 200 if (delete_on_fail_) |
220 loader_.reset(); | 201 loader_.reset(); |
221 } | 202 } |
222 | 203 |
223 WebURLLoaderImpl* loader() { return loader_.get(); } | 204 WebURLLoaderImpl* loader() { return loader_.get(); } |
224 void DeleteLoader() { | 205 void DeleteLoader() { |
225 loader_.reset(); | 206 loader_.reset(); |
226 } | 207 } |
227 | 208 |
228 void set_expect_multipart_response() { expect_multipart_response_ = true; } | |
229 | |
230 void set_delete_on_receive_redirect() { delete_on_receive_redirect_ = true; } | 209 void set_delete_on_receive_redirect() { delete_on_receive_redirect_ = true; } |
231 void set_delete_on_receive_response() { delete_on_receive_response_ = true; } | 210 void set_delete_on_receive_response() { delete_on_receive_response_ = true; } |
232 void set_delete_on_receive_data() { delete_on_receive_data_ = true; } | 211 void set_delete_on_receive_data() { delete_on_receive_data_ = true; } |
233 void set_delete_on_finish() { delete_on_finish_ = true; } | 212 void set_delete_on_finish() { delete_on_finish_ = true; } |
234 void set_delete_on_fail() { delete_on_fail_ = true; } | 213 void set_delete_on_fail() { delete_on_fail_ = true; } |
235 | 214 |
236 bool did_receive_redirect() const { return did_receive_redirect_; } | 215 bool did_receive_redirect() const { return did_receive_redirect_; } |
237 bool did_receive_response() const { return did_receive_response_; } | 216 bool did_receive_response() const { return did_receive_response_; } |
238 const std::string& received_data() const { return received_data_; } | 217 const std::string& received_data() const { return received_data_; } |
239 bool did_finish() const { return did_finish_; } | 218 bool did_finish() const { return did_finish_; } |
240 const blink::WebURLError& error() const { return error_; } | 219 const blink::WebURLError& error() const { return error_; } |
241 const blink::WebURLResponse& response() const { return response_; } | 220 const blink::WebURLResponse& response() const { return response_; } |
242 | 221 |
243 private: | 222 private: |
244 scoped_ptr<WebURLLoaderImpl> loader_; | 223 scoped_ptr<WebURLLoaderImpl> loader_; |
245 | 224 |
246 bool expect_multipart_response_; | |
247 | |
248 bool delete_on_receive_redirect_; | 225 bool delete_on_receive_redirect_; |
249 bool delete_on_receive_response_; | 226 bool delete_on_receive_response_; |
250 bool delete_on_receive_data_; | 227 bool delete_on_receive_data_; |
251 bool delete_on_finish_; | 228 bool delete_on_finish_; |
252 bool delete_on_fail_; | 229 bool delete_on_fail_; |
253 | 230 |
254 bool did_receive_redirect_; | 231 bool did_receive_redirect_; |
255 bool did_receive_response_; | 232 bool did_receive_response_; |
256 std::string received_data_; | 233 std::string received_data_; |
257 bool did_finish_; | 234 bool did_finish_; |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
336 EXPECT_TRUE(client()->did_receive_response()); | 313 EXPECT_TRUE(client()->did_receive_response()); |
337 } | 314 } |
338 | 315 |
339 void DoReceiveDataFtp() { | 316 void DoReceiveDataFtp() { |
340 peer()->OnReceivedData(make_scoped_ptr(new FixedReceivedData( | 317 peer()->OnReceivedData(make_scoped_ptr(new FixedReceivedData( |
341 kFtpDirListing, strlen(kFtpDirListing), strlen(kFtpDirListing)))); | 318 kFtpDirListing, strlen(kFtpDirListing), strlen(kFtpDirListing)))); |
342 // The FTP delegate should modify the data the client sees. | 319 // The FTP delegate should modify the data the client sees. |
343 EXPECT_NE(kFtpDirListing, client()->received_data()); | 320 EXPECT_NE(kFtpDirListing, client()->received_data()); |
344 } | 321 } |
345 | 322 |
346 void DoReceiveResponseMultipart() { | |
347 EXPECT_FALSE(client()->did_receive_response()); | |
348 content::ResourceResponseInfo response_info; | |
349 response_info.headers = new net::HttpResponseHeaders( | |
350 net::HttpUtil::AssembleRawHeaders(kMultipartResponseHeaders, | |
351 strlen(kMultipartResponseHeaders))); | |
352 response_info.mime_type = kMultipartResponseMimeType; | |
353 peer()->OnReceivedResponse(response_info); | |
354 EXPECT_TRUE(client()->did_receive_response()); | |
355 } | |
356 | |
357 void DoReceiveDataMultipart() { | |
358 peer()->OnReceivedData(make_scoped_ptr( | |
359 new FixedReceivedData(kMultipartResponse, strlen(kMultipartResponse), | |
360 strlen(kMultipartResponse)))); | |
361 // Multipart delegate should modify the data the client sees. | |
362 EXPECT_NE(kMultipartResponse, client()->received_data()); | |
363 } | |
364 | |
365 TestWebURLLoaderClient* client() { return client_.get(); } | 323 TestWebURLLoaderClient* client() { return client_.get(); } |
366 TestResourceDispatcher* dispatcher() { return &dispatcher_; } | 324 TestResourceDispatcher* dispatcher() { return &dispatcher_; } |
367 RequestPeer* peer() { return dispatcher()->peer(); } | 325 RequestPeer* peer() { return dispatcher()->peer(); } |
368 base::MessageLoop* message_loop() { return &message_loop_; } | 326 base::MessageLoop* message_loop() { return &message_loop_; } |
369 | 327 |
370 private: | 328 private: |
371 base::MessageLoop message_loop_; | 329 base::MessageLoop message_loop_; |
372 // WorkerScheduler is needed because WebURLLoaderImpl needs a | 330 // WorkerScheduler is needed because WebURLLoaderImpl needs a |
373 // scheduler::TaskQueue. | 331 // scheduler::TaskQueue. |
374 scoped_ptr<scheduler::WorkerScheduler> worker_scheduler_; | 332 scoped_ptr<scheduler::WorkerScheduler> worker_scheduler_; |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
588 } | 546 } |
589 | 547 |
590 TEST_F(WebURLLoaderImplTest, FtpDeleteOnFail) { | 548 TEST_F(WebURLLoaderImplTest, FtpDeleteOnFail) { |
591 client()->set_delete_on_fail(); | 549 client()->set_delete_on_fail(); |
592 DoStartAsyncRequest(); | 550 DoStartAsyncRequest(); |
593 DoReceiveResponseFtp(); | 551 DoReceiveResponseFtp(); |
594 DoReceiveDataFtp(); | 552 DoReceiveDataFtp(); |
595 DoFailRequest(); | 553 DoFailRequest(); |
596 } | 554 } |
597 | 555 |
598 // Multipart integration tests. These are focused more on safe deletion than | |
599 // correct parsing of Multipart responses. | |
600 | |
601 TEST_F(WebURLLoaderImplTest, Multipart) { | |
602 client()->set_expect_multipart_response(); | |
603 DoStartAsyncRequest(); | |
604 DoReceiveResponseMultipart(); | |
605 DoReceiveDataMultipart(); | |
606 DoCompleteRequest(); | |
607 EXPECT_EQ(kTestData, client()->received_data()); | |
608 EXPECT_FALSE(dispatcher()->canceled()); | |
609 } | |
610 | |
611 TEST_F(WebURLLoaderImplTest, MultipartDeleteOnReceiveFirstResponse) { | |
612 client()->set_expect_multipart_response(); | |
613 client()->set_delete_on_receive_response(); | |
614 DoStartAsyncRequest(); | |
615 DoReceiveResponseMultipart(); | |
616 EXPECT_EQ("", client()->received_data()); | |
617 } | |
618 | |
619 TEST_F(WebURLLoaderImplTest, MultipartDeleteOnReceiveSecondResponse) { | |
620 client()->set_expect_multipart_response(); | |
621 DoStartAsyncRequest(); | |
622 DoReceiveResponseMultipart(); | |
623 client()->set_delete_on_receive_response(); | |
624 DoReceiveDataMultipart(); | |
625 EXPECT_EQ("", client()->received_data()); | |
626 } | |
627 | |
628 TEST_F(WebURLLoaderImplTest, MultipartDeleteOnReceiveFirstData) { | |
629 client()->set_expect_multipart_response(); | |
630 client()->set_delete_on_receive_data(); | |
631 DoStartAsyncRequest(); | |
632 DoReceiveResponseMultipart(); | |
633 DoReceiveDataMultipart(); | |
634 EXPECT_EQ("bl", client()->received_data()); | |
635 } | |
636 | |
637 TEST_F(WebURLLoaderImplTest, MultipartDeleteOnReceiveMoreData) { | |
638 client()->set_expect_multipart_response(); | |
639 DoStartAsyncRequest(); | |
640 DoReceiveResponseMultipart(); | |
641 DoReceiveDataMultipart(); | |
642 // For multipart responses, the delegate may send some data when notified | |
643 // of a request completing. | |
644 client()->set_delete_on_receive_data(); | |
645 peer()->OnCompletedRequest(net::OK, false, false, "", base::TimeTicks(), | |
646 strlen(kTestData)); | |
647 EXPECT_FALSE(client()->did_finish()); | |
648 EXPECT_EQ(kTestData, client()->received_data()); | |
649 } | |
650 | |
651 TEST_F(WebURLLoaderImplTest, MultipartDeleteFinish) { | |
652 client()->set_expect_multipart_response(); | |
653 client()->set_delete_on_finish(); | |
654 DoStartAsyncRequest(); | |
655 DoReceiveResponseMultipart(); | |
656 DoReceiveDataMultipart(); | |
657 DoCompleteRequest(); | |
658 EXPECT_EQ(kTestData, client()->received_data()); | |
659 } | |
660 | |
661 TEST_F(WebURLLoaderImplTest, MultipartDeleteFail) { | |
662 client()->set_expect_multipart_response(); | |
663 client()->set_delete_on_fail(); | |
664 DoStartAsyncRequest(); | |
665 DoReceiveResponseMultipart(); | |
666 DoReceiveDataMultipart(); | |
667 DoFailRequest(); | |
668 } | |
669 | |
670 // PlzNavigate: checks that the stream override parameters provided on | 556 // PlzNavigate: checks that the stream override parameters provided on |
671 // navigation commit are properly applied. | 557 // navigation commit are properly applied. |
672 TEST_F(WebURLLoaderImplTest, BrowserSideNavigationCommit) { | 558 TEST_F(WebURLLoaderImplTest, BrowserSideNavigationCommit) { |
673 // Initialize the request and the stream override. | 559 // Initialize the request and the stream override. |
674 const GURL kNavigationURL = GURL(kTestURL); | 560 const GURL kNavigationURL = GURL(kTestURL); |
675 const GURL kStreamURL = GURL("http://bar"); | 561 const GURL kStreamURL = GURL("http://bar"); |
676 const std::string kMimeType = "text/html"; | 562 const std::string kMimeType = "text/html"; |
677 blink::WebURLRequest request; | 563 blink::WebURLRequest request; |
678 request.initialize(); | 564 request.initialize(); |
679 request.setURL(kNavigationURL); | 565 request.setURL(kNavigationURL); |
(...skipping 25 matching lines...) Expand all Loading... | |
705 EXPECT_EQ(kMimeType, client()->response().mimeType().latin1()); | 591 EXPECT_EQ(kMimeType, client()->response().mimeType().latin1()); |
706 | 592 |
707 DoReceiveData(); | 593 DoReceiveData(); |
708 DoCompleteRequest(); | 594 DoCompleteRequest(); |
709 EXPECT_FALSE(dispatcher()->canceled()); | 595 EXPECT_FALSE(dispatcher()->canceled()); |
710 EXPECT_EQ(kTestData, client()->received_data()); | 596 EXPECT_EQ(kTestData, client()->received_data()); |
711 } | 597 } |
712 | 598 |
713 } // namespace | 599 } // namespace |
714 } // namespace content | 600 } // namespace content |
OLD | NEW |