| 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 18 matching lines...) Expand all Loading... |
| 148 unsigned long long totalBytesToBeSent) override { | 132 unsigned long long totalBytesToBeSent) override { |
| 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 EXPECT_FALSE(did_receive_response_); |
| 159 // Only multipart requests may receive multiple response headers. | |
| 160 EXPECT_TRUE(expect_multipart_response_ || !did_receive_response_); | |
| 161 | 143 |
| 162 did_receive_response_ = true; | 144 did_receive_response_ = true; |
| 163 response_ = response; | 145 response_ = response; |
| 164 if (delete_on_receive_response_) | 146 if (delete_on_receive_response_) |
| 165 loader_.reset(); | 147 loader_.reset(); |
| 166 } | 148 } |
| 167 | 149 |
| 168 void didDownloadData(blink::WebURLLoader* loader, | 150 void didDownloadData(blink::WebURLLoader* loader, |
| 169 int dataLength, | 151 int dataLength, |
| 170 int encodedDataLength) override { | 152 int encodedDataLength) override { |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 | 200 |
| 219 if (delete_on_fail_) | 201 if (delete_on_fail_) |
| 220 loader_.reset(); | 202 loader_.reset(); |
| 221 } | 203 } |
| 222 | 204 |
| 223 WebURLLoaderImpl* loader() { return loader_.get(); } | 205 WebURLLoaderImpl* loader() { return loader_.get(); } |
| 224 void DeleteLoader() { | 206 void DeleteLoader() { |
| 225 loader_.reset(); | 207 loader_.reset(); |
| 226 } | 208 } |
| 227 | 209 |
| 228 void set_expect_multipart_response() { expect_multipart_response_ = true; } | |
| 229 | |
| 230 void set_delete_on_receive_redirect() { delete_on_receive_redirect_ = true; } | 210 void set_delete_on_receive_redirect() { delete_on_receive_redirect_ = true; } |
| 231 void set_delete_on_receive_response() { delete_on_receive_response_ = true; } | 211 void set_delete_on_receive_response() { delete_on_receive_response_ = true; } |
| 232 void set_delete_on_receive_data() { delete_on_receive_data_ = true; } | 212 void set_delete_on_receive_data() { delete_on_receive_data_ = true; } |
| 233 void set_delete_on_finish() { delete_on_finish_ = true; } | 213 void set_delete_on_finish() { delete_on_finish_ = true; } |
| 234 void set_delete_on_fail() { delete_on_fail_ = true; } | 214 void set_delete_on_fail() { delete_on_fail_ = true; } |
| 235 | 215 |
| 236 bool did_receive_redirect() const { return did_receive_redirect_; } | 216 bool did_receive_redirect() const { return did_receive_redirect_; } |
| 237 bool did_receive_response() const { return did_receive_response_; } | 217 bool did_receive_response() const { return did_receive_response_; } |
| 238 const std::string& received_data() const { return received_data_; } | 218 const std::string& received_data() const { return received_data_; } |
| 239 bool did_finish() const { return did_finish_; } | 219 bool did_finish() const { return did_finish_; } |
| 240 const blink::WebURLError& error() const { return error_; } | 220 const blink::WebURLError& error() const { return error_; } |
| 241 const blink::WebURLResponse& response() const { return response_; } | 221 const blink::WebURLResponse& response() const { return response_; } |
| 242 | 222 |
| 243 private: | 223 private: |
| 244 scoped_ptr<WebURLLoaderImpl> loader_; | 224 scoped_ptr<WebURLLoaderImpl> loader_; |
| 245 | 225 |
| 246 bool expect_multipart_response_; | |
| 247 | |
| 248 bool delete_on_receive_redirect_; | 226 bool delete_on_receive_redirect_; |
| 249 bool delete_on_receive_response_; | 227 bool delete_on_receive_response_; |
| 250 bool delete_on_receive_data_; | 228 bool delete_on_receive_data_; |
| 251 bool delete_on_finish_; | 229 bool delete_on_finish_; |
| 252 bool delete_on_fail_; | 230 bool delete_on_fail_; |
| 253 | 231 |
| 254 bool did_receive_redirect_; | 232 bool did_receive_redirect_; |
| 255 bool did_receive_response_; | 233 bool did_receive_response_; |
| 256 std::string received_data_; | 234 std::string received_data_; |
| 257 bool did_finish_; | 235 bool did_finish_; |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 336 EXPECT_TRUE(client()->did_receive_response()); | 314 EXPECT_TRUE(client()->did_receive_response()); |
| 337 } | 315 } |
| 338 | 316 |
| 339 void DoReceiveDataFtp() { | 317 void DoReceiveDataFtp() { |
| 340 peer()->OnReceivedData(make_scoped_ptr(new FixedReceivedData( | 318 peer()->OnReceivedData(make_scoped_ptr(new FixedReceivedData( |
| 341 kFtpDirListing, strlen(kFtpDirListing), strlen(kFtpDirListing)))); | 319 kFtpDirListing, strlen(kFtpDirListing), strlen(kFtpDirListing)))); |
| 342 // The FTP delegate should modify the data the client sees. | 320 // The FTP delegate should modify the data the client sees. |
| 343 EXPECT_NE(kFtpDirListing, client()->received_data()); | 321 EXPECT_NE(kFtpDirListing, client()->received_data()); |
| 344 } | 322 } |
| 345 | 323 |
| 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(); } | 324 TestWebURLLoaderClient* client() { return client_.get(); } |
| 366 TestResourceDispatcher* dispatcher() { return &dispatcher_; } | 325 TestResourceDispatcher* dispatcher() { return &dispatcher_; } |
| 367 RequestPeer* peer() { return dispatcher()->peer(); } | 326 RequestPeer* peer() { return dispatcher()->peer(); } |
| 368 base::MessageLoop* message_loop() { return &message_loop_; } | 327 base::MessageLoop* message_loop() { return &message_loop_; } |
| 369 | 328 |
| 370 private: | 329 private: |
| 371 base::MessageLoop message_loop_; | 330 base::MessageLoop message_loop_; |
| 372 // WorkerScheduler is needed because WebURLLoaderImpl needs a | 331 // WorkerScheduler is needed because WebURLLoaderImpl needs a |
| 373 // scheduler::TaskQueue. | 332 // scheduler::TaskQueue. |
| 374 scoped_ptr<scheduler::WorkerScheduler> worker_scheduler_; | 333 scoped_ptr<scheduler::WorkerScheduler> worker_scheduler_; |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 588 } | 547 } |
| 589 | 548 |
| 590 TEST_F(WebURLLoaderImplTest, FtpDeleteOnFail) { | 549 TEST_F(WebURLLoaderImplTest, FtpDeleteOnFail) { |
| 591 client()->set_delete_on_fail(); | 550 client()->set_delete_on_fail(); |
| 592 DoStartAsyncRequest(); | 551 DoStartAsyncRequest(); |
| 593 DoReceiveResponseFtp(); | 552 DoReceiveResponseFtp(); |
| 594 DoReceiveDataFtp(); | 553 DoReceiveDataFtp(); |
| 595 DoFailRequest(); | 554 DoFailRequest(); |
| 596 } | 555 } |
| 597 | 556 |
| 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 | 557 // PlzNavigate: checks that the stream override parameters provided on |
| 671 // navigation commit are properly applied. | 558 // navigation commit are properly applied. |
| 672 TEST_F(WebURLLoaderImplTest, BrowserSideNavigationCommit) { | 559 TEST_F(WebURLLoaderImplTest, BrowserSideNavigationCommit) { |
| 673 // Initialize the request and the stream override. | 560 // Initialize the request and the stream override. |
| 674 const GURL kNavigationURL = GURL(kTestURL); | 561 const GURL kNavigationURL = GURL(kTestURL); |
| 675 const GURL kStreamURL = GURL("http://bar"); | 562 const GURL kStreamURL = GURL("http://bar"); |
| 676 const std::string kMimeType = "text/html"; | 563 const std::string kMimeType = "text/html"; |
| 677 blink::WebURLRequest request; | 564 blink::WebURLRequest request; |
| 678 request.initialize(); | 565 request.initialize(); |
| 679 request.setURL(kNavigationURL); | 566 request.setURL(kNavigationURL); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 705 EXPECT_EQ(kMimeType, client()->response().mimeType().latin1()); | 592 EXPECT_EQ(kMimeType, client()->response().mimeType().latin1()); |
| 706 | 593 |
| 707 DoReceiveData(); | 594 DoReceiveData(); |
| 708 DoCompleteRequest(); | 595 DoCompleteRequest(); |
| 709 EXPECT_FALSE(dispatcher()->canceled()); | 596 EXPECT_FALSE(dispatcher()->canceled()); |
| 710 EXPECT_EQ(kTestData, client()->received_data()); | 597 EXPECT_EQ(kTestData, client()->received_data()); |
| 711 } | 598 } |
| 712 | 599 |
| 713 } // namespace | 600 } // namespace |
| 714 } // namespace content | 601 } // namespace content |
| OLD | NEW |