OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "base/file_path.h" | 5 #include "base/file_path.h" |
6 #include "base/file_util.h" | 6 #include "base/file_util.h" |
7 #include "base/memory/ref_counted.h" | 7 #include "base/memory/ref_counted.h" |
8 #include "base/path_service.h" | 8 #include "base/path_service.h" |
9 #include "base/scoped_temp_dir.h" | 9 #include "base/scoped_temp_dir.h" |
10 #include "base/test/test_file_util.h" | 10 #include "base/test/test_file_util.h" |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 std::set<DownloadItem*>::iterator it = downloads_observed_.begin(); | 84 std::set<DownloadItem*>::iterator it = downloads_observed_.begin(); |
85 for (; it != downloads_observed_.end(); ++it) { | 85 for (; it != downloads_observed_.end(); ++it) { |
86 (*it)->RemoveObserver(this); | 86 (*it)->RemoveObserver(this); |
87 } | 87 } |
88 download_manager_->RemoveObserver(this); | 88 download_manager_->RemoveObserver(this); |
89 } | 89 } |
90 | 90 |
91 // State accessors. | 91 // State accessors. |
92 bool select_file_dialog_seen() { return select_file_dialog_seen_; } | 92 bool select_file_dialog_seen() { return select_file_dialog_seen_; } |
93 | 93 |
| 94 // Checks if the select file dialog suggesting |path| was displayed. |
| 95 bool IsSeenSelectFileDialogWithPath(FilePath& path) { |
| 96 return select_file_dialog_seen_ && suggested_path_ == path; |
| 97 } |
| 98 |
94 // Wait for whatever state was specified in the constructor. | 99 // Wait for whatever state was specified in the constructor. |
95 void WaitForFinished() { | 100 void WaitForFinished() { |
96 if (!IsFinished()) { | 101 if (!IsFinished()) { |
97 waiting_ = true; | 102 waiting_ = true; |
98 ui_test_utils::RunMessageLoop(); | 103 ui_test_utils::RunMessageLoop(); |
99 waiting_ = false; | 104 waiting_ = false; |
100 } | 105 } |
101 } | 106 } |
102 | 107 |
103 // Return true if everything's happened that we're configured for. | 108 // Return true if everything's happened that we're configured for. |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 // If it is finished and we are observing it, stop. | 149 // If it is finished and we are observing it, stop. |
145 if (finished_it != finished_downloads_.end() && | 150 if (finished_it != finished_downloads_.end() && |
146 observed_it != downloads_observed_.end()) { | 151 observed_it != downloads_observed_.end()) { |
147 (*it)->RemoveObserver(this); | 152 (*it)->RemoveObserver(this); |
148 downloads_observed_.erase(observed_it); | 153 downloads_observed_.erase(observed_it); |
149 continue; | 154 continue; |
150 } | 155 } |
151 } | 156 } |
152 } | 157 } |
153 | 158 |
154 virtual void SelectFileDialogDisplayed(int32 /* id */) { | 159 virtual void SelectFileDialogDisplayed( |
| 160 int32 /* id */, FilePath& suggested_path) { |
155 select_file_dialog_seen_ = true; | 161 select_file_dialog_seen_ = true; |
| 162 suggested_path_ = suggested_path; |
156 SignalIfFinished(); | 163 SignalIfFinished(); |
157 } | 164 } |
158 | 165 |
159 private: | 166 private: |
160 // Called when we know that a download item is in a final state. | 167 // Called when we know that a download item is in a final state. |
161 // Note that this is not the same as it first transitioning in to the | 168 // Note that this is not the same as it first transitioning in to the |
162 // final state; multiple notifications may occur once the item is in | 169 // final state; multiple notifications may occur once the item is in |
163 // that state. So we keep our own track of transitions into final. | 170 // that state. So we keep our own track of transitions into final. |
164 void DownloadInFinalState(DownloadItem* download) { | 171 void DownloadInFinalState(DownloadItem* download) { |
165 if (finished_downloads_.find(download) != finished_downloads_.end()) { | 172 if (finished_downloads_.find(download) != finished_downloads_.end()) { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 // The state on which to consider the DownloadItem finished. | 218 // The state on which to consider the DownloadItem finished. |
212 DownloadItem::DownloadState download_finished_state_; | 219 DownloadItem::DownloadState download_finished_state_; |
213 | 220 |
214 // True if we should transition the DownloadsObserver to finished if | 221 // True if we should transition the DownloadsObserver to finished if |
215 // the select file dialog comes up. | 222 // the select file dialog comes up. |
216 bool finish_on_select_file_; | 223 bool finish_on_select_file_; |
217 | 224 |
218 // True if we've seen the select file dialog. | 225 // True if we've seen the select file dialog. |
219 bool select_file_dialog_seen_; | 226 bool select_file_dialog_seen_; |
220 | 227 |
| 228 // The suggested file path in the select file dialog. |
| 229 FilePath suggested_path_; |
| 230 |
221 DISALLOW_COPY_AND_ASSIGN(DownloadsObserver); | 231 DISALLOW_COPY_AND_ASSIGN(DownloadsObserver); |
222 }; | 232 }; |
223 | 233 |
224 // WaitForFlush() returns after: | 234 // WaitForFlush() returns after: |
225 // * There are no IN_PROGRESS download items remaining on the | 235 // * There are no IN_PROGRESS download items remaining on the |
226 // DownloadManager. | 236 // DownloadManager. |
227 // * There have been two round trip messages through the file and | 237 // * There have been two round trip messages through the file and |
228 // IO threads. | 238 // IO threads. |
229 // This almost certainly means that a Download cancel has propagated through | 239 // This almost certainly means that a Download cancel has propagated through |
230 // the system. | 240 // the system. |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 if (!downloads_directory_.CreateUniqueTempDir()) | 470 if (!downloads_directory_.CreateUniqueTempDir()) |
461 return false; | 471 return false; |
462 | 472 |
463 browser->profile()->GetPrefs()->SetFilePath( | 473 browser->profile()->GetPrefs()->SetFilePath( |
464 prefs::kDownloadDefaultDirectory, | 474 prefs::kDownloadDefaultDirectory, |
465 downloads_directory_.path()); | 475 downloads_directory_.path()); |
466 | 476 |
467 return true; | 477 return true; |
468 } | 478 } |
469 | 479 |
| 480 // Delete the default folder for downloaded files. |
| 481 bool DeleteDownloadsDirectory() { |
| 482 return downloads_directory_.Delete(); |
| 483 } |
| 484 |
470 DownloadPrefs* GetDownloadPrefs(Browser* browser) { | 485 DownloadPrefs* GetDownloadPrefs(Browser* browser) { |
471 return browser->profile()->GetDownloadManager()->download_prefs(); | 486 return browser->profile()->GetDownloadManager()->download_prefs(); |
472 } | 487 } |
473 | 488 |
474 FilePath GetDownloadDirectory(Browser* browser) { | 489 FilePath GetDownloadDirectory(Browser* browser) { |
475 DownloadManager* download_mananger = | 490 DownloadManager* download_mananger = |
476 browser->profile()->GetDownloadManager(); | 491 browser->profile()->GetDownloadManager(); |
477 return download_mananger->download_prefs()->download_path(); | 492 return download_mananger->download_prefs()->download_path(); |
478 } | 493 } |
479 | 494 |
(...skipping 16 matching lines...) Expand all Loading... |
496 browser->profile()->GetDownloadManager(); | 511 browser->profile()->GetDownloadManager(); |
497 return new DownloadsObserver( | 512 return new DownloadsObserver( |
498 download_manager, num_downloads, | 513 download_manager, num_downloads, |
499 DownloadItem::IN_PROGRESS, // Has started | 514 DownloadItem::IN_PROGRESS, // Has started |
500 true); // Bail on select file | 515 true); // Bail on select file |
501 } | 516 } |
502 | 517 |
503 // Download |url|, then wait for the download to finish. | 518 // Download |url|, then wait for the download to finish. |
504 // |disposition| indicates where the navigation occurs (current tab, new | 519 // |disposition| indicates where the navigation occurs (current tab, new |
505 // foreground tab, etc). | 520 // foreground tab, etc). |
506 // |expectation| indicates whether or not a Select File dialog should be | 521 // |expectation| indicates whether or not a select file dialog should be |
507 // open when the download is finished, or if we don't care. | 522 // open when the download is finished, or if we don't care. |
508 // If the dialog appears, the routine exits. The only effect |expectation| | 523 // If the dialog appears, the routine exits. The only effect |expectation| |
509 // has is whether or not the test succeeds. | 524 // has is whether or not the test succeeds. |
510 // |browser_test_flags| indicate what to wait for, and is an OR of 0 or more | 525 // |browser_test_flags| indicate what to wait for, and is an OR of 0 or more |
511 // values in the ui_test_utils::BrowserTestWaitFlags enum. | 526 // values in the ui_test_utils::BrowserTestWaitFlags enum. |
512 void DownloadAndWaitWithDisposition(Browser* browser, | 527 void DownloadAndWaitWithDisposition(Browser* browser, |
513 const GURL& url, | 528 const GURL& url, |
514 WindowOpenDisposition disposition, | 529 WindowOpenDisposition disposition, |
515 SelectExpectation expectation, | 530 SelectExpectation expectation, |
516 int browser_test_flags) { | 531 int browser_test_flags) { |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
771 // Files for these tests are found in DIR_TEST_DATA (currently | 786 // Files for these tests are found in DIR_TEST_DATA (currently |
772 // "chrome\test\data\", see chrome_paths.cc). | 787 // "chrome\test\data\", see chrome_paths.cc). |
773 // Mock responses have extension .mock-http-headers appended to the file name. | 788 // Mock responses have extension .mock-http-headers appended to the file name. |
774 | 789 |
775 // Download a file due to the associated MIME type. | 790 // Download a file due to the associated MIME type. |
776 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadMimeType) { | 791 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadMimeType) { |
777 ASSERT_TRUE(InitialSetup(false)); | 792 ASSERT_TRUE(InitialSetup(false)); |
778 FilePath file(FILE_PATH_LITERAL("download-test1.lib")); | 793 FilePath file(FILE_PATH_LITERAL("download-test1.lib")); |
779 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); | 794 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); |
780 | 795 |
781 // Download the file and wait. We do not expect the Select File dialog. | 796 // Download the file and wait. We do not expect the select file dialog. |
782 DownloadAndWait(browser(), url, EXPECT_NO_SELECT_DIALOG); | 797 DownloadAndWait(browser(), url, EXPECT_NO_SELECT_DIALOG); |
783 | 798 |
784 // Check state. | 799 // Check state. |
785 EXPECT_EQ(1, browser()->tab_count()); | 800 EXPECT_EQ(1, browser()->tab_count()); |
786 CheckDownload(browser(), file, file); | 801 CheckDownload(browser(), file, file); |
787 EXPECT_TRUE(IsDownloadUIVisible(browser())); | 802 EXPECT_TRUE(IsDownloadUIVisible(browser())); |
788 } | 803 } |
789 | 804 |
| 805 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadedFolder) { |
| 806 ASSERT_TRUE(InitialSetup(false)); |
| 807 FilePath file(FILE_PATH_LITERAL("download-test1.lib")); |
| 808 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); |
| 809 FilePath file_path(DestinationFile(browser(), file)); |
| 810 |
| 811 // Delete the default folder for downloaded files. |
| 812 ASSERT_TRUE(DeleteDownloadsDirectory()); |
| 813 ASSERT_FALSE(file_util::PathExists(GetDownloadDirectory(browser()))); |
| 814 |
| 815 // Download the file and wait. We expect the select file dialog. |
| 816 DownloadAndWait(browser(), url, EXPECT_SELECT_DIALOG); |
| 817 |
| 818 FilePath default_downloads_path; |
| 819 ASSERT_TRUE(PathService::Get( |
| 820 chrome::DIR_DEFAULT_DOWNLOADS, &default_downloads_path)); |
| 821 file_path = default_downloads_path.Append(file); |
| 822 EXPECT_FALSE(file_util::PathExists(file_path)); |
| 823 EXPECT_FALSE(file_util::PathExists(GetDownloadDirectory(browser()))); |
| 824 EXPECT_EQ(1, browser()->tab_count()); |
| 825 |
| 826 scoped_ptr<DownloadsObserver> observer(CreateWaiter(browser(), 1)); |
| 827 ui_test_utils::NavigateToURLWithDisposition( |
| 828 browser(), url, CURRENT_TAB, |
| 829 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| 830 |
| 831 // Waits for the download to complete. |
| 832 observer->WaitForFinished(); |
| 833 |
| 834 EXPECT_TRUE(observer->IsSeenSelectFileDialogWithPath(file_path)); |
| 835 } |
| 836 |
790 #if defined(OS_WIN) | 837 #if defined(OS_WIN) |
791 // Download a file and confirm that the zone identifier (on windows) | 838 // Download a file and confirm that the zone identifier (on windows) |
792 // is set to internet. | 839 // is set to internet. |
793 IN_PROC_BROWSER_TEST_F(DownloadTest, CheckInternetZone) { | 840 IN_PROC_BROWSER_TEST_F(DownloadTest, CheckInternetZone) { |
794 ASSERT_TRUE(InitialSetup(false)); | 841 ASSERT_TRUE(InitialSetup(false)); |
795 FilePath file(FILE_PATH_LITERAL("download-test1.lib")); | 842 FilePath file(FILE_PATH_LITERAL("download-test1.lib")); |
796 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); | 843 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); |
797 | 844 |
798 // Download the file and wait. We do not expect the Select File dialog. | 845 // Download the file and wait. We do not expect the select file dialog. |
799 DownloadAndWait(browser(), url, EXPECT_NO_SELECT_DIALOG); | 846 DownloadAndWait(browser(), url, EXPECT_NO_SELECT_DIALOG); |
800 | 847 |
801 // Check state. Special file state must be checked before CheckDownload, | 848 // Check state. Special file state must be checked before CheckDownload, |
802 // as CheckDownload will delete the output file. | 849 // as CheckDownload will delete the output file. |
803 EXPECT_EQ(1, browser()->tab_count()); | 850 EXPECT_EQ(1, browser()->tab_count()); |
804 FilePath downloaded_file(DestinationFile(browser(), file)); | 851 FilePath downloaded_file(DestinationFile(browser(), file)); |
805 if (file_util::VolumeSupportsADS(downloaded_file)) | 852 if (file_util::VolumeSupportsADS(downloaded_file)) |
806 EXPECT_TRUE(file_util::HasInternetZoneIdentifier(downloaded_file)); | 853 EXPECT_TRUE(file_util::HasInternetZoneIdentifier(downloaded_file)); |
807 CheckDownload(browser(), file, file); | 854 CheckDownload(browser(), file, file); |
808 EXPECT_TRUE(IsDownloadUIVisible(browser())); | 855 EXPECT_TRUE(IsDownloadUIVisible(browser())); |
809 } | 856 } |
810 #endif | 857 #endif |
811 | 858 |
812 // Put up a Select File dialog when the file is downloaded, due to its MIME | 859 // Put up a select file dialog when the file is downloaded, due to its MIME |
813 // type. | 860 // type. |
814 // | 861 // |
815 // This test runs correctly, but leaves behind turds in the test user's | 862 // This test runs correctly, but leaves behind turds in the test user's |
816 // download directory because of http://crbug.com/62099. No big loss; it | 863 // download directory because of http://crbug.com/62099. No big loss; it |
817 // was primarily confirming DownloadsObserver wait on select file dialog | 864 // was primarily confirming DownloadsObserver wait on select file dialog |
818 // functionality anyway. | 865 // functionality anyway. |
819 IN_PROC_BROWSER_TEST_F(DownloadTest, DISABLED_DownloadMimeTypeSelect) { | 866 IN_PROC_BROWSER_TEST_F(DownloadTest, DISABLED_DownloadMimeTypeSelect) { |
820 ASSERT_TRUE(InitialSetup(true)); | 867 ASSERT_TRUE(InitialSetup(true)); |
821 FilePath file(FILE_PATH_LITERAL("download-test1.lib")); | 868 FilePath file(FILE_PATH_LITERAL("download-test1.lib")); |
822 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); | 869 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); |
823 | 870 |
824 // Download the file and wait. We expect the Select File dialog to appear | 871 // Download the file and wait. We expect the select file dialog to appear |
825 // due to the MIME type. | 872 // due to the MIME type. |
826 DownloadAndWait(browser(), url, EXPECT_SELECT_DIALOG); | 873 DownloadAndWait(browser(), url, EXPECT_SELECT_DIALOG); |
827 | 874 |
828 // Check state. | 875 // Check state. |
829 EXPECT_EQ(1, browser()->tab_count()); | 876 EXPECT_EQ(1, browser()->tab_count()); |
830 // Since we exited while the Select File dialog was visible, there should not | 877 // Since we exited while the select file dialog was visible, there should not |
831 // be anything in the download shelf and so it should not be visible. | 878 // be anything in the download shelf and so it should not be visible. |
832 EXPECT_FALSE(IsDownloadUIVisible(browser())); | 879 EXPECT_FALSE(IsDownloadUIVisible(browser())); |
833 } | 880 } |
834 | 881 |
835 // Access a file with a viewable mime-type, verify that a download | 882 // Access a file with a viewable mime-type, verify that a download |
836 // did not initiate. | 883 // did not initiate. |
837 IN_PROC_BROWSER_TEST_F(DownloadTest, NoDownload) { | 884 IN_PROC_BROWSER_TEST_F(DownloadTest, NoDownload) { |
838 ASSERT_TRUE(InitialSetup(false)); | 885 ASSERT_TRUE(InitialSetup(false)); |
839 FilePath file(FILE_PATH_LITERAL("download-test2.html")); | 886 FilePath file(FILE_PATH_LITERAL("download-test2.html")); |
840 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); | 887 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); |
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1299 | 1346 |
1300 // Confirm a download makes it into the history properly. | 1347 // Confirm a download makes it into the history properly. |
1301 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadHistoryCheck) { | 1348 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadHistoryCheck) { |
1302 ASSERT_TRUE(InitialSetup(false)); | 1349 ASSERT_TRUE(InitialSetup(false)); |
1303 FilePath file(FILE_PATH_LITERAL("download-test1.lib")); | 1350 FilePath file(FILE_PATH_LITERAL("download-test1.lib")); |
1304 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); | 1351 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); |
1305 FilePath origin_file(OriginFile(file)); | 1352 FilePath origin_file(OriginFile(file)); |
1306 int64 origin_size; | 1353 int64 origin_size; |
1307 file_util::GetFileSize(origin_file, &origin_size); | 1354 file_util::GetFileSize(origin_file, &origin_size); |
1308 | 1355 |
1309 // Download the file and wait. We do not expect the Select File dialog. | 1356 // Download the file and wait. We do not expect the select file dialog. |
1310 DownloadAndWait(browser(), url, EXPECT_NO_SELECT_DIALOG); | 1357 DownloadAndWait(browser(), url, EXPECT_NO_SELECT_DIALOG); |
1311 | 1358 |
1312 // Get details of what downloads have just happened. | 1359 // Get details of what downloads have just happened. |
1313 std::vector<DownloadItem*> downloads; | 1360 std::vector<DownloadItem*> downloads; |
1314 GetDownloads(browser(), &downloads); | 1361 GetDownloads(browser(), &downloads); |
1315 ASSERT_EQ(1u, downloads.size()); | 1362 ASSERT_EQ(1u, downloads.size()); |
1316 int64 db_handle = downloads[0]->db_handle(); | 1363 int64 db_handle = downloads[0]->db_handle(); |
1317 | 1364 |
1318 // Check state. | 1365 // Check state. |
1319 EXPECT_EQ(1, browser()->tab_count()); | 1366 EXPECT_EQ(1, browser()->tab_count()); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1417 string16(), &downloads); | 1464 string16(), &downloads); |
1418 ASSERT_EQ(1u, downloads.size()); | 1465 ASSERT_EQ(1u, downloads.size()); |
1419 EXPECT_EQ(DownloadItem::COMPLETE, downloads[0]->state()); | 1466 EXPECT_EQ(DownloadItem::COMPLETE, downloads[0]->state()); |
1420 EXPECT_TRUE(downloads[0]->opened()); | 1467 EXPECT_TRUE(downloads[0]->opened()); |
1421 | 1468 |
1422 // As long as we're here, confirmed everything else is good. | 1469 // As long as we're here, confirmed everything else is good. |
1423 EXPECT_EQ(1, browser()->tab_count()); | 1470 EXPECT_EQ(1, browser()->tab_count()); |
1424 CheckDownload(browser(), file, file); | 1471 CheckDownload(browser(), file, file); |
1425 EXPECT_FALSE(IsDownloadUIVisible(browser())); // Auto-opened. | 1472 EXPECT_FALSE(IsDownloadUIVisible(browser())); // Auto-opened. |
1426 } | 1473 } |
OLD | NEW |