| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <sstream> | 5 #include <sstream> |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 419 class DownloadTest : public InProcessBrowserTest { | 419 class DownloadTest : public InProcessBrowserTest { |
| 420 public: | 420 public: |
| 421 // Choice of navigation or direct fetch. Used by |DownloadFileCheckErrors()|. | 421 // Choice of navigation or direct fetch. Used by |DownloadFileCheckErrors()|. |
| 422 enum DownloadMethod { | 422 enum DownloadMethod { |
| 423 DOWNLOAD_NAVIGATE, | 423 DOWNLOAD_NAVIGATE, |
| 424 DOWNLOAD_DIRECT | 424 DOWNLOAD_DIRECT |
| 425 }; | 425 }; |
| 426 | 426 |
| 427 // Information passed in to |DownloadFileCheckErrors()|. | 427 // Information passed in to |DownloadFileCheckErrors()|. |
| 428 struct DownloadInfo { | 428 struct DownloadInfo { |
| 429 const char* url_name; // URL for the download. | 429 const char* starting_url; // URL for initiating the download. |
| 430 const char* expected_download_url; // Expected value of DI::GetURL(). |
| 430 DownloadMethod download_method; // Navigation or Direct. | 431 DownloadMethod download_method; // Navigation or Direct. |
| 431 // Download interrupt reason (NONE is OK). | 432 // Download interrupt reason (NONE is OK). |
| 432 content::DownloadInterruptReason reason; | 433 content::DownloadInterruptReason reason; |
| 433 bool show_download_item; // True if the download item appears on the shelf. | 434 bool show_download_item; // True if the download item appears on the shelf. |
| 434 bool should_redirect_to_documents; // True if we save it in "My Documents". | 435 bool should_redirect_to_documents; // True if we save it in "My Documents". |
| 435 }; | 436 }; |
| 436 | 437 |
| 437 struct FileErrorInjectInfo { | 438 struct FileErrorInjectInfo { |
| 438 DownloadInfo download_info; | 439 DownloadInfo download_info; |
| 439 content::TestFileErrorInjector::FileErrorInfo error_info; | 440 content::TestFileErrorInjector::FileErrorInfo error_info; |
| (...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 840 ASSERT_TRUE(test_server()->Start()); | 841 ASSERT_TRUE(test_server()->Start()); |
| 841 std::vector<DownloadItem*> download_items; | 842 std::vector<DownloadItem*> download_items; |
| 842 GetDownloads(browser(), &download_items); | 843 GetDownloads(browser(), &download_items); |
| 843 ASSERT_TRUE(download_items.empty()); | 844 ASSERT_TRUE(download_items.empty()); |
| 844 | 845 |
| 845 EnableFileChooser(true); | 846 EnableFileChooser(true); |
| 846 } | 847 } |
| 847 | 848 |
| 848 void DownloadFilesCheckErrorsLoopBody(const DownloadInfo& download_info, | 849 void DownloadFilesCheckErrorsLoopBody(const DownloadInfo& download_info, |
| 849 size_t i) { | 850 size_t i) { |
| 850 std::stringstream s; | 851 SCOPED_TRACE(testing::Message() |
| 851 s << " " << __FUNCTION__ << "()" | 852 << " " << __FUNCTION__ << "()" |
| 852 << " index = " << i | 853 << " index = " << i << " starting_url = '" |
| 853 << " url = '" << download_info.url_name << "'" | 854 << download_info.starting_url << "'" |
| 854 << " method = " | 855 << " download_url = '" << download_info.expected_download_url |
| 855 << ((download_info.download_method == DOWNLOAD_DIRECT) ? | 856 << "'" |
| 856 "DOWNLOAD_DIRECT" : "DOWNLOAD_NAVIGATE") | 857 << " method = " |
| 857 << " show_item = " << download_info.show_download_item | 858 << ((download_info.download_method == DOWNLOAD_DIRECT) |
| 858 << " reason = " << DownloadInterruptReasonToString(download_info.reason); | 859 ? "DOWNLOAD_DIRECT" |
| 860 : "DOWNLOAD_NAVIGATE") << " show_item = " |
| 861 << download_info.show_download_item << " reason = " |
| 862 << DownloadInterruptReasonToString(download_info.reason)); |
| 859 | 863 |
| 860 std::vector<DownloadItem*> download_items; | 864 std::vector<DownloadItem*> download_items; |
| 861 GetDownloads(browser(), &download_items); | 865 GetDownloads(browser(), &download_items); |
| 862 size_t downloads_expected = download_items.size(); | 866 size_t downloads_expected = download_items.size(); |
| 863 | 867 |
| 864 std::string server_path = "files/downloads/"; | 868 // GURL("http://foo/bar").Resolve("baz") => "http://foo/bar/baz" |
| 865 server_path += download_info.url_name; | 869 // GURL("http://foo/bar").Resolve("http://baz") => "http://baz" |
| 866 GURL url = test_server()->GetURL(server_path); | 870 // I.e. both starting_url and expected_download_url can either be relative |
| 867 ASSERT_TRUE(url.is_valid()) << s.str(); | 871 // to the base test server URL or be an absolute URL. |
| 872 GURL base_url = test_server()->GetURL("files/downloads/"); |
| 873 GURL starting_url = base_url.Resolve(download_info.starting_url); |
| 874 GURL download_url = base_url.Resolve(download_info.expected_download_url); |
| 875 ASSERT_TRUE(starting_url.is_valid()); |
| 876 ASSERT_TRUE(download_url.is_valid()); |
| 868 | 877 |
| 869 DownloadManager* download_manager = DownloadManagerForBrowser(browser()); | 878 DownloadManager* download_manager = DownloadManagerForBrowser(browser()); |
| 870 WebContents* web_contents = | 879 WebContents* web_contents = |
| 871 browser()->tab_strip_model()->GetActiveWebContents(); | 880 browser()->tab_strip_model()->GetActiveWebContents(); |
| 872 ASSERT_TRUE(web_contents) << s.str(); | 881 ASSERT_TRUE(web_contents); |
| 873 | 882 |
| 874 scoped_ptr<content::DownloadTestObserver> observer( | 883 scoped_ptr<content::DownloadTestObserver> observer( |
| 875 new content::DownloadTestObserverTerminal( | 884 new content::DownloadTestObserverTerminal( |
| 876 download_manager, | 885 download_manager, |
| 877 1, | 886 1, |
| 878 content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); | 887 content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); |
| 879 | 888 |
| 880 if (download_info.download_method == DOWNLOAD_DIRECT) { | 889 if (download_info.download_method == DOWNLOAD_DIRECT) { |
| 881 // Go directly to download. Don't wait for navigation. | 890 // Go directly to download. Don't wait for navigation. |
| 882 scoped_refptr<content::DownloadTestItemCreationObserver> | 891 scoped_refptr<content::DownloadTestItemCreationObserver> |
| 883 creation_observer(new content::DownloadTestItemCreationObserver); | 892 creation_observer(new content::DownloadTestItemCreationObserver); |
| 884 | 893 |
| 885 scoped_ptr<DownloadUrlParameters> params( | 894 scoped_ptr<DownloadUrlParameters> params( |
| 886 DownloadUrlParameters::FromWebContents(web_contents, url)); | 895 DownloadUrlParameters::FromWebContents(web_contents, starting_url)); |
| 887 params->set_callback(creation_observer->callback()); | 896 params->set_callback(creation_observer->callback()); |
| 888 DownloadManagerForBrowser(browser())->DownloadUrl(params.Pass()); | 897 DownloadManagerForBrowser(browser())->DownloadUrl(params.Pass()); |
| 889 | 898 |
| 890 // Wait until the item is created, or we have determined that it | 899 // Wait until the item is created, or we have determined that it |
| 891 // won't be. | 900 // won't be. |
| 892 creation_observer->WaitForDownloadItemCreation(); | 901 creation_observer->WaitForDownloadItemCreation(); |
| 893 | 902 |
| 894 EXPECT_EQ(download_info.show_download_item, | 903 EXPECT_NE(content::DownloadItem::kInvalidId, |
| 895 creation_observer->succeeded()); | 904 creation_observer->download_id()); |
| 896 if (download_info.show_download_item) { | |
| 897 EXPECT_EQ(content::DOWNLOAD_INTERRUPT_REASON_NONE, | |
| 898 creation_observer->interrupt_reason()); | |
| 899 EXPECT_NE(content::DownloadItem::kInvalidId, | |
| 900 creation_observer->download_id()); | |
| 901 } else { | |
| 902 EXPECT_NE(content::DOWNLOAD_INTERRUPT_REASON_NONE, | |
| 903 creation_observer->interrupt_reason()); | |
| 904 EXPECT_EQ(content::DownloadItem::kInvalidId, | |
| 905 creation_observer->download_id()); | |
| 906 } | |
| 907 } else { | 905 } else { |
| 908 // Navigate to URL normally, wait until done. | 906 // Navigate to URL normally, wait until done. |
| 909 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(), | 907 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
| 910 url, | 908 browser(), starting_url, 1); |
| 911 1); | |
| 912 } | 909 } |
| 913 | 910 |
| 914 if (download_info.show_download_item) { | 911 if (download_info.show_download_item) { |
| 915 downloads_expected++; | 912 downloads_expected++; |
| 916 observer->WaitForFinished(); | 913 observer->WaitForFinished(); |
| 917 DownloadItem::DownloadState final_state = | 914 DownloadItem::DownloadState final_state = |
| 918 (download_info.reason == content::DOWNLOAD_INTERRUPT_REASON_NONE) ? | 915 (download_info.reason == content::DOWNLOAD_INTERRUPT_REASON_NONE) ? |
| 919 DownloadItem::COMPLETE : | 916 DownloadItem::COMPLETE : |
| 920 DownloadItem::INTERRUPTED; | 917 DownloadItem::INTERRUPTED; |
| 921 EXPECT_EQ(1u, observer->NumDownloadsSeenInState(final_state)); | 918 EXPECT_EQ(1u, observer->NumDownloadsSeenInState(final_state)); |
| 922 } | 919 } |
| 923 | 920 |
| 924 // Wait till the |DownloadFile|s are destroyed. | 921 // Wait till the |DownloadFile|s are destroyed. |
| 925 content::RunAllPendingInMessageLoop(content::BrowserThread::FILE); | 922 content::RunAllPendingInMessageLoop(content::BrowserThread::FILE); |
| 926 content::RunAllPendingInMessageLoop(content::BrowserThread::UI); | 923 content::RunAllPendingInMessageLoop(content::BrowserThread::UI); |
| 927 | 924 |
| 928 // Validate that the correct files were downloaded. | 925 // Validate that the correct files were downloaded. |
| 929 download_items.clear(); | 926 download_items.clear(); |
| 930 GetDownloads(browser(), &download_items); | 927 GetDownloads(browser(), &download_items); |
| 931 ASSERT_EQ(downloads_expected, download_items.size()) << s.str(); | 928 ASSERT_EQ(downloads_expected, download_items.size()); |
| 932 | 929 |
| 933 if (download_info.show_download_item) { | 930 if (download_info.show_download_item) { |
| 934 // Find the last download item. | 931 // Find the last download item. |
| 935 DownloadItem* item = download_items[0]; | 932 DownloadItem* item = download_items[0]; |
| 936 for (size_t d = 1; d < downloads_expected; ++d) { | 933 for (size_t d = 1; d < downloads_expected; ++d) { |
| 937 if (download_items[d]->GetStartTime() > item->GetStartTime()) | 934 if (download_items[d]->GetStartTime() > item->GetStartTime()) |
| 938 item = download_items[d]; | 935 item = download_items[d]; |
| 939 } | 936 } |
| 940 | 937 |
| 941 ASSERT_EQ(url, item->GetOriginalUrl()) << s.str(); | 938 EXPECT_EQ(download_url, item->GetURL()); |
| 942 | 939 EXPECT_EQ(download_info.reason, item->GetLastReason()); |
| 943 ASSERT_EQ(download_info.reason, item->GetLastReason()) << s.str(); | |
| 944 | 940 |
| 945 if (item->GetState() == content::DownloadItem::COMPLETE) { | 941 if (item->GetState() == content::DownloadItem::COMPLETE) { |
| 946 // Clean up the file, in case it ended up in the My Documents folder. | 942 // Clean up the file, in case it ended up in the My Documents folder. |
| 947 base::FilePath destination_folder = GetDownloadDirectory(browser()); | 943 base::FilePath destination_folder = GetDownloadDirectory(browser()); |
| 948 base::FilePath my_downloaded_file = item->GetTargetFilePath(); | 944 base::FilePath my_downloaded_file = item->GetTargetFilePath(); |
| 949 EXPECT_TRUE(base::PathExists(my_downloaded_file)); | 945 EXPECT_TRUE(base::PathExists(my_downloaded_file)); |
| 950 EXPECT_TRUE(base::DeleteFile(my_downloaded_file, false)); | 946 EXPECT_TRUE(base::DeleteFile(my_downloaded_file, false)); |
| 951 | 947 |
| 952 EXPECT_EQ(download_info.should_redirect_to_documents ? | 948 EXPECT_EQ(download_info.should_redirect_to_documents ? |
| 953 std::string::npos : | 949 std::string::npos : |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1012 DownloadFilesCheckErrorsSetup(); | 1008 DownloadFilesCheckErrorsSetup(); |
| 1013 | 1009 |
| 1014 // Set up file failures. | 1010 // Set up file failures. |
| 1015 scoped_refptr<content::TestFileErrorInjector> injector( | 1011 scoped_refptr<content::TestFileErrorInjector> injector( |
| 1016 content::TestFileErrorInjector::Create( | 1012 content::TestFileErrorInjector::Create( |
| 1017 DownloadManagerForBrowser(browser()))); | 1013 DownloadManagerForBrowser(browser()))); |
| 1018 | 1014 |
| 1019 for (size_t i = 0; i < count; ++i) { | 1015 for (size_t i = 0; i < count; ++i) { |
| 1020 // Set up the full URL, for download file tracking. | 1016 // Set up the full URL, for download file tracking. |
| 1021 std::string server_path = "files/downloads/"; | 1017 std::string server_path = "files/downloads/"; |
| 1022 server_path += info[i].download_info.url_name; | 1018 server_path += info[i].download_info.starting_url; |
| 1023 GURL url = test_server()->GetURL(server_path); | 1019 GURL url = test_server()->GetURL(server_path); |
| 1024 info[i].error_info.url = url.spec(); | 1020 info[i].error_info.url = url.spec(); |
| 1025 | 1021 |
| 1026 DownloadInsertFilesErrorCheckErrorsLoopBody(injector, info[i], i); | 1022 DownloadInsertFilesErrorCheckErrorsLoopBody(injector, info[i], i); |
| 1027 } | 1023 } |
| 1028 } | 1024 } |
| 1029 | 1025 |
| 1030 // Attempts to download a file to a read-only folder, based on information | 1026 // Attempts to download a file to a read-only folder, based on information |
| 1031 // in |download_info|. | 1027 // in |download_info|. |
| 1032 void DownloadFilesToReadonlyFolder(size_t count, | 1028 void DownloadFilesToReadonlyFolder(size_t count, |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1262 DownloadRequestLimiter::TabDownloadState* tab_download_state = | 1258 DownloadRequestLimiter::TabDownloadState* tab_download_state = |
| 1263 g_browser_process->download_request_limiter()->GetDownloadState( | 1259 g_browser_process->download_request_limiter()->GetDownloadState( |
| 1264 web_contents, web_contents, true); | 1260 web_contents, web_contents, true); |
| 1265 ASSERT_TRUE(tab_download_state); | 1261 ASSERT_TRUE(tab_download_state); |
| 1266 tab_download_state->set_download_status( | 1262 tab_download_state->set_download_status( |
| 1267 DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED); | 1263 DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED); |
| 1268 | 1264 |
| 1269 // Try to start the download via Javascript and wait for the corresponding | 1265 // Try to start the download via Javascript and wait for the corresponding |
| 1270 // load stop event. | 1266 // load stop event. |
| 1271 content::TestNavigationObserver observer(web_contents); | 1267 content::TestNavigationObserver observer(web_contents); |
| 1272 bool download_assempted; | 1268 bool download_attempted; |
| 1273 ASSERT_TRUE(content::ExecuteScriptAndExtractBool( | 1269 ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
| 1274 browser()->tab_strip_model()->GetActiveWebContents(), | 1270 browser()->tab_strip_model()->GetActiveWebContents(), |
| 1275 "window.domAutomationController.send(startDownload());", | 1271 "window.domAutomationController.send(startDownload());", |
| 1276 &download_assempted)); | 1272 &download_attempted)); |
| 1277 ASSERT_TRUE(download_assempted); | 1273 ASSERT_TRUE(download_attempted); |
| 1278 observer.Wait(); | 1274 observer.Wait(); |
| 1279 | 1275 |
| 1280 // Check that we did not download the file. | 1276 // Check that we did not download the file. |
| 1281 base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); | 1277 base::FilePath file(FILE_PATH_LITERAL("download-test1.lib")); |
| 1282 base::FilePath file_path(DestinationFile(browser(), file)); | 1278 base::FilePath file_path(DestinationFile(browser(), file)); |
| 1283 EXPECT_FALSE(base::PathExists(file_path)); | 1279 EXPECT_FALSE(base::PathExists(file_path)); |
| 1284 | 1280 |
| 1285 // Check state. | 1281 // Check state. |
| 1286 EXPECT_EQ(1, browser()->tab_strip_model()->count()); | 1282 EXPECT_EQ(1, browser()->tab_strip_model()->count()); |
| 1287 EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); | 1283 EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible()); |
| (...skipping 1122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2410 EXPECT_TRUE(DidShowFileChooser()); | 2406 EXPECT_TRUE(DidShowFileChooser()); |
| 2411 ASSERT_EQ(2u, download_items.size()); | 2407 ASSERT_EQ(2u, download_items.size()); |
| 2412 ASSERT_EQ(jpeg_url, download_items[0]->GetOriginalUrl()); | 2408 ASSERT_EQ(jpeg_url, download_items[0]->GetOriginalUrl()); |
| 2413 ASSERT_EQ(jpeg_url, download_items[1]->GetOriginalUrl()); | 2409 ASSERT_EQ(jpeg_url, download_items[1]->GetOriginalUrl()); |
| 2414 } | 2410 } |
| 2415 | 2411 |
| 2416 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsServer) { | 2412 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsServer) { |
| 2417 DownloadInfo download_info[] = { | 2413 DownloadInfo download_info[] = { |
| 2418 { // Normal navigated download. | 2414 { // Normal navigated download. |
| 2419 "a_zip_file.zip", | 2415 "a_zip_file.zip", |
| 2416 "a_zip_file.zip", |
| 2420 DOWNLOAD_NAVIGATE, | 2417 DOWNLOAD_NAVIGATE, |
| 2421 content::DOWNLOAD_INTERRUPT_REASON_NONE, | 2418 content::DOWNLOAD_INTERRUPT_REASON_NONE, |
| 2422 true, | 2419 true, |
| 2423 false | 2420 false |
| 2424 }, | 2421 }, |
| 2425 { // Normal direct download. | 2422 { // Normal direct download. |
| 2426 "a_zip_file.zip", | 2423 "a_zip_file.zip", |
| 2424 "a_zip_file.zip", |
| 2427 DOWNLOAD_DIRECT, | 2425 DOWNLOAD_DIRECT, |
| 2428 content::DOWNLOAD_INTERRUPT_REASON_NONE, | 2426 content::DOWNLOAD_INTERRUPT_REASON_NONE, |
| 2429 true, | 2427 true, |
| 2430 false | 2428 false |
| 2431 }, | 2429 }, |
| 2432 { // Direct download with 404 error. | 2430 { // Direct download with 404 error. |
| 2433 "there_IS_no_spoon.zip", | 2431 "there_IS_no_spoon.zip", |
| 2432 "there_IS_no_spoon.zip", |
| 2434 DOWNLOAD_DIRECT, | 2433 DOWNLOAD_DIRECT, |
| 2435 content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, | 2434 content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, |
| 2436 true, | 2435 true, |
| 2437 false | 2436 false |
| 2438 }, | 2437 }, |
| 2439 { // Navigated download with 404 error. | 2438 { // Navigated download with 404 error. |
| 2440 "there_IS_no_spoon.zip", | 2439 "there_IS_no_spoon.zip", |
| 2440 "there_IS_no_spoon.zip", |
| 2441 DOWNLOAD_NAVIGATE, | 2441 DOWNLOAD_NAVIGATE, |
| 2442 content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, | 2442 content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, |
| 2443 false, | 2443 false, |
| 2444 false | 2444 false |
| 2445 }, | 2445 }, |
| 2446 { // Direct download with 400 error. | 2446 { // Direct download with 400 error. |
| 2447 "zip_file_not_found.zip", | 2447 "zip_file_not_found.zip", |
| 2448 "zip_file_not_found.zip", |
| 2448 DOWNLOAD_DIRECT, | 2449 DOWNLOAD_DIRECT, |
| 2449 content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, | 2450 content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, |
| 2450 true, | 2451 true, |
| 2451 false | 2452 false |
| 2452 }, | 2453 }, |
| 2453 { // Navigated download with 400 error. | 2454 { // Navigated download with 400 error. |
| 2454 "zip_file_not_found.zip", | 2455 "zip_file_not_found.zip", |
| 2456 "", |
| 2455 DOWNLOAD_NAVIGATE, | 2457 DOWNLOAD_NAVIGATE, |
| 2456 content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, | 2458 content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, |
| 2457 false, | 2459 false, |
| 2458 false | 2460 false |
| 2461 }, |
| 2462 { // Simulates clicking on <a href="http://..." download="">. The name does |
| 2463 // not resolve. But since this is an explicit download, the download |
| 2464 // should appear on the shelf and the error should be indicated. |
| 2465 "download-anchor-attrib-name-not-resolved.html", |
| 2466 "http://doesnotexist/shouldnotberesolved", |
| 2467 DOWNLOAD_NAVIGATE, |
| 2468 content::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, |
| 2469 true, |
| 2470 false |
| 2471 }, |
| 2472 { // Simulates clicking on <a href="http://..." download=""> where the URL |
| 2473 // leads to a 404 response. This is different from the previous test case |
| 2474 // in that the ResourceLoader issues a OnResponseStarted() callback since |
| 2475 // the headers are successfully received. |
| 2476 "download-anchor-attrib-404.html", |
| 2477 "there_IS_no_spoon.zip", |
| 2478 DOWNLOAD_NAVIGATE, |
| 2479 content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, |
| 2480 true, |
| 2481 false |
| 2482 }, |
| 2483 { // Similar to the above, but the resulting response contains a status |
| 2484 // code of 400. |
| 2485 "download-anchor-attrib-400.html", |
| 2486 "zip_file_not_found.zip", |
| 2487 DOWNLOAD_NAVIGATE, |
| 2488 content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, |
| 2489 true, |
| 2490 false |
| 2491 }, |
| 2492 { // Direct download of a URL where the hostname doesn't resolve. |
| 2493 "http://doesnotexist/shouldnotdownloadsuccessfully", |
| 2494 "http://doesnotexist/shouldnotdownloadsuccessfully", |
| 2495 DOWNLOAD_DIRECT, |
| 2496 content::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, |
| 2497 true, |
| 2498 false |
| 2459 } | 2499 } |
| 2460 }; | 2500 }; |
| 2461 | 2501 |
| 2462 DownloadFilesCheckErrors(ARRAYSIZE_UNSAFE(download_info), download_info); | 2502 DownloadFilesCheckErrors(ARRAYSIZE_UNSAFE(download_info), download_info); |
| 2463 } | 2503 } |
| 2464 | 2504 |
| 2465 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsFile) { | 2505 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsFile) { |
| 2466 FileErrorInjectInfo error_info[] = { | 2506 FileErrorInjectInfo error_info[] = { |
| 2467 { // Navigated download with injected "Disk full" error in Initialize(). | 2507 { // Navigated download with injected "Disk full" error in Initialize(). |
| 2468 { "a_zip_file.zip", | 2508 { |
| 2509 "a_zip_file.zip", |
| 2510 "a_zip_file.zip", |
| 2469 DOWNLOAD_NAVIGATE, | 2511 DOWNLOAD_NAVIGATE, |
| 2470 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, | 2512 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, |
| 2471 1 | 2513 true, |
| 2514 false |
| 2472 }, | 2515 }, |
| 2473 { | 2516 { |
| 2474 "", | 2517 "", |
| 2475 content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, | 2518 content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, |
| 2476 0, | 2519 0, |
| 2477 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, | 2520 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, |
| 2478 } | 2521 } |
| 2479 }, | 2522 }, |
| 2480 { // Direct download with injected "Disk full" error in Initialize(). | 2523 { // Direct download with injected "Disk full" error in Initialize(). |
| 2481 { "a_zip_file.zip", | 2524 { |
| 2525 "a_zip_file.zip", |
| 2526 "a_zip_file.zip", |
| 2482 DOWNLOAD_DIRECT, | 2527 DOWNLOAD_DIRECT, |
| 2483 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, | 2528 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, |
| 2484 1 | 2529 true, |
| 2530 false |
| 2485 }, | 2531 }, |
| 2486 { | 2532 { |
| 2487 "", | 2533 "", |
| 2488 content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, | 2534 content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, |
| 2489 0, | 2535 0, |
| 2490 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, | 2536 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, |
| 2491 } | 2537 } |
| 2492 }, | 2538 }, |
| 2493 { // Navigated download with injected "Disk full" error in Write(). | 2539 { // Navigated download with injected "Disk full" error in Write(). |
| 2494 { "a_zip_file.zip", | 2540 { |
| 2541 "a_zip_file.zip", |
| 2542 "a_zip_file.zip", |
| 2495 DOWNLOAD_NAVIGATE, | 2543 DOWNLOAD_NAVIGATE, |
| 2496 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, | 2544 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, |
| 2497 1 | 2545 true, |
| 2546 false |
| 2498 }, | 2547 }, |
| 2499 { | 2548 { |
| 2500 "", | 2549 "", |
| 2501 content::TestFileErrorInjector::FILE_OPERATION_WRITE, | 2550 content::TestFileErrorInjector::FILE_OPERATION_WRITE, |
| 2502 0, | 2551 0, |
| 2503 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, | 2552 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, |
| 2504 } | 2553 } |
| 2505 }, | 2554 }, |
| 2506 { // Direct download with injected "Disk full" error in Write(). | 2555 { // Direct download with injected "Disk full" error in Write(). |
| 2507 { "a_zip_file.zip", | 2556 { |
| 2557 "a_zip_file.zip", |
| 2558 "a_zip_file.zip", |
| 2508 DOWNLOAD_DIRECT, | 2559 DOWNLOAD_DIRECT, |
| 2509 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, | 2560 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, |
| 2510 1 | 2561 true, |
| 2562 false |
| 2511 }, | 2563 }, |
| 2512 { | 2564 { |
| 2513 "", | 2565 "", |
| 2514 content::TestFileErrorInjector::FILE_OPERATION_WRITE, | 2566 content::TestFileErrorInjector::FILE_OPERATION_WRITE, |
| 2515 0, | 2567 0, |
| 2516 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, | 2568 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, |
| 2517 } | 2569 } |
| 2518 }, | 2570 }, |
| 2519 { // Navigated download with injected "Failed" error in Initialize(). | 2571 { // Navigated download with injected "Failed" error in Initialize(). |
| 2520 { "a_zip_file.zip", | 2572 { |
| 2573 "a_zip_file.zip", |
| 2574 "a_zip_file.zip", |
| 2521 DOWNLOAD_NAVIGATE, | 2575 DOWNLOAD_NAVIGATE, |
| 2522 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, | 2576 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
| 2523 1 | 2577 true, |
| 2578 false |
| 2524 }, | 2579 }, |
| 2525 { | 2580 { |
| 2526 "", | 2581 "", |
| 2527 content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, | 2582 content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, |
| 2528 0, | 2583 0, |
| 2529 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, | 2584 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
| 2530 } | 2585 } |
| 2531 }, | 2586 }, |
| 2532 { // Direct download with injected "Failed" error in Initialize(). | 2587 { // Direct download with injected "Failed" error in Initialize(). |
| 2533 { "a_zip_file.zip", | 2588 { |
| 2589 "a_zip_file.zip", |
| 2590 "a_zip_file.zip", |
| 2534 DOWNLOAD_DIRECT, | 2591 DOWNLOAD_DIRECT, |
| 2535 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, | 2592 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
| 2536 1 | 2593 true, |
| 2594 false |
| 2537 }, | 2595 }, |
| 2538 { | 2596 { |
| 2539 "", | 2597 "", |
| 2540 content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, | 2598 content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, |
| 2541 0, | 2599 0, |
| 2542 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, | 2600 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
| 2543 } | 2601 } |
| 2544 }, | 2602 }, |
| 2545 { // Navigated download with injected "Failed" error in Write(). | 2603 { // Navigated download with injected "Failed" error in Write(). |
| 2546 { "a_zip_file.zip", | 2604 { |
| 2605 "a_zip_file.zip", |
| 2606 "a_zip_file.zip", |
| 2547 DOWNLOAD_NAVIGATE, | 2607 DOWNLOAD_NAVIGATE, |
| 2548 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, | 2608 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
| 2549 1 | 2609 true, |
| 2610 false |
| 2550 }, | 2611 }, |
| 2551 { | 2612 { |
| 2552 "", | 2613 "", |
| 2553 content::TestFileErrorInjector::FILE_OPERATION_WRITE, | 2614 content::TestFileErrorInjector::FILE_OPERATION_WRITE, |
| 2554 0, | 2615 0, |
| 2555 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, | 2616 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
| 2556 } | 2617 } |
| 2557 }, | 2618 }, |
| 2558 { // Direct download with injected "Failed" error in Write(). | 2619 { // Direct download with injected "Failed" error in Write(). |
| 2559 { "a_zip_file.zip", | 2620 { |
| 2621 "a_zip_file.zip", |
| 2622 "a_zip_file.zip", |
| 2560 DOWNLOAD_DIRECT, | 2623 DOWNLOAD_DIRECT, |
| 2561 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, | 2624 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
| 2562 1 | 2625 true, |
| 2626 false |
| 2563 }, | 2627 }, |
| 2564 { | 2628 { |
| 2565 "", | 2629 "", |
| 2566 content::TestFileErrorInjector::FILE_OPERATION_WRITE, | 2630 content::TestFileErrorInjector::FILE_OPERATION_WRITE, |
| 2567 0, | 2631 0, |
| 2568 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, | 2632 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
| 2569 } | 2633 } |
| 2570 }, | 2634 }, |
| 2571 { // Navigated download with injected "Name too long" error in | 2635 { // Navigated download with injected "Name too long" error in |
| 2572 // Initialize(). | 2636 // Initialize(). |
| 2573 { "a_zip_file.zip", | 2637 { |
| 2638 "a_zip_file.zip", |
| 2639 "a_zip_file.zip", |
| 2574 DOWNLOAD_NAVIGATE, | 2640 DOWNLOAD_NAVIGATE, |
| 2575 content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG, | 2641 content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG, |
| 2576 1 | 2642 true, |
| 2643 false |
| 2577 }, | 2644 }, |
| 2578 { | 2645 { |
| 2579 "", | 2646 "", |
| 2580 content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, | 2647 content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, |
| 2581 0, | 2648 0, |
| 2582 content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG, | 2649 content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG, |
| 2583 } | 2650 } |
| 2584 }, | 2651 }, |
| 2585 { // Direct download with injected "Name too long" error in Initialize(). | 2652 { // Direct download with injected "Name too long" error in Initialize(). |
| 2586 { "a_zip_file.zip", | 2653 { |
| 2654 "a_zip_file.zip", |
| 2655 "a_zip_file.zip", |
| 2587 DOWNLOAD_DIRECT, | 2656 DOWNLOAD_DIRECT, |
| 2588 content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG, | 2657 content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG, |
| 2589 1 | 2658 true, |
| 2659 false |
| 2590 }, | 2660 }, |
| 2591 { | 2661 { |
| 2592 "", | 2662 "", |
| 2593 content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, | 2663 content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, |
| 2594 0, | 2664 0, |
| 2595 content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG, | 2665 content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG, |
| 2596 } | 2666 } |
| 2597 }, | 2667 }, |
| 2598 { // Navigated download with injected "Name too long" error in Write(). | 2668 { // Navigated download with injected "Name too long" error in Write(). |
| 2599 { "a_zip_file.zip", | 2669 { |
| 2670 "a_zip_file.zip", |
| 2671 "a_zip_file.zip", |
| 2600 DOWNLOAD_NAVIGATE, | 2672 DOWNLOAD_NAVIGATE, |
| 2601 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, | 2673 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
| 2602 1 | 2674 true, |
| 2675 false |
| 2603 }, | 2676 }, |
| 2604 { | 2677 { |
| 2605 "", | 2678 "", |
| 2606 content::TestFileErrorInjector::FILE_OPERATION_WRITE, | 2679 content::TestFileErrorInjector::FILE_OPERATION_WRITE, |
| 2607 0, | 2680 0, |
| 2608 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, | 2681 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
| 2609 } | 2682 } |
| 2610 }, | 2683 }, |
| 2611 { // Direct download with injected "Name too long" error in Write(). | 2684 { // Direct download with injected "Name too long" error in Write(). |
| 2612 { "a_zip_file.zip", | 2685 { |
| 2686 "a_zip_file.zip", |
| 2687 "a_zip_file.zip", |
| 2613 DOWNLOAD_DIRECT, | 2688 DOWNLOAD_DIRECT, |
| 2614 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, | 2689 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
| 2615 1 | 2690 true, |
| 2691 false |
| 2616 }, | 2692 }, |
| 2617 { | 2693 { |
| 2618 "", | 2694 "", |
| 2619 content::TestFileErrorInjector::FILE_OPERATION_WRITE, | 2695 content::TestFileErrorInjector::FILE_OPERATION_WRITE, |
| 2620 0, | 2696 0, |
| 2621 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, | 2697 content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
| 2622 } | 2698 } |
| 2623 }, | 2699 }, |
| 2624 { // Direct download with injected "Disk full" error in 2nd Write(). | 2700 { // Direct download with injected "Disk full" error in 2nd Write(). |
| 2625 { "06bESSE21Evolution.ppt", | 2701 { |
| 2702 "06bESSE21Evolution.ppt", |
| 2703 "06bESSE21Evolution.ppt", |
| 2626 DOWNLOAD_DIRECT, | 2704 DOWNLOAD_DIRECT, |
| 2627 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, | 2705 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, |
| 2628 1 | 2706 true, |
| 2707 false |
| 2629 }, | 2708 }, |
| 2630 { | 2709 { |
| 2631 "", | 2710 "", |
| 2632 content::TestFileErrorInjector::FILE_OPERATION_WRITE, | 2711 content::TestFileErrorInjector::FILE_OPERATION_WRITE, |
| 2633 1, | 2712 1, |
| 2634 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, | 2713 content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, |
| 2635 } | 2714 } |
| 2636 } | 2715 } |
| 2637 }; | 2716 }; |
| 2638 | 2717 |
| 2639 DownloadInsertFilesErrorCheckErrors(ARRAYSIZE_UNSAFE(error_info), error_info); | 2718 DownloadInsertFilesErrorCheckErrors(ARRAYSIZE_UNSAFE(error_info), error_info); |
| 2640 } | 2719 } |
| 2641 | 2720 |
| 2642 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorReadonlyFolder) { | 2721 IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorReadonlyFolder) { |
| 2643 DownloadInfo download_info[] = { | 2722 DownloadInfo download_info[] = { |
| 2644 { | 2723 { |
| 2645 "a_zip_file.zip", | 2724 "a_zip_file.zip", |
| 2725 "a_zip_file.zip", |
| 2646 DOWNLOAD_DIRECT, | 2726 DOWNLOAD_DIRECT, |
| 2647 // This passes because we switch to the My Documents folder. | 2727 // This passes because we switch to the My Documents folder. |
| 2648 content::DOWNLOAD_INTERRUPT_REASON_NONE, | 2728 content::DOWNLOAD_INTERRUPT_REASON_NONE, |
| 2649 true, | 2729 true, |
| 2650 true | 2730 true |
| 2651 }, | 2731 }, |
| 2652 { | 2732 { |
| 2653 "a_zip_file.zip", | 2733 "a_zip_file.zip", |
| 2734 "a_zip_file.zip", |
| 2654 DOWNLOAD_NAVIGATE, | 2735 DOWNLOAD_NAVIGATE, |
| 2655 // This passes because we switch to the My Documents folder. | 2736 // This passes because we switch to the My Documents folder. |
| 2656 content::DOWNLOAD_INTERRUPT_REASON_NONE, | 2737 content::DOWNLOAD_INTERRUPT_REASON_NONE, |
| 2657 true, | 2738 true, |
| 2658 true | 2739 true |
| 2659 } | 2740 } |
| 2660 }; | 2741 }; |
| 2661 | 2742 |
| 2662 DownloadFilesToReadonlyFolder(ARRAYSIZE_UNSAFE(download_info), download_info); | 2743 DownloadFilesToReadonlyFolder(ARRAYSIZE_UNSAFE(download_info), download_info); |
| 2663 } | 2744 } |
| (...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3225 | 3306 |
| 3226 // No errors this time. The download should complete successfully. | 3307 // No errors this time. The download should complete successfully. |
| 3227 EXPECT_FALSE(completion_observer->IsFinished()); | 3308 EXPECT_FALSE(completion_observer->IsFinished()); |
| 3228 completion_observer->StartObserving(); | 3309 completion_observer->StartObserving(); |
| 3229 download->Resume(); | 3310 download->Resume(); |
| 3230 completion_observer->WaitForFinished(); | 3311 completion_observer->WaitForFinished(); |
| 3231 EXPECT_EQ(DownloadItem::COMPLETE, download->GetState()); | 3312 EXPECT_EQ(DownloadItem::COMPLETE, download->GetState()); |
| 3232 | 3313 |
| 3233 EXPECT_FALSE(DidShowFileChooser()); | 3314 EXPECT_FALSE(DidShowFileChooser()); |
| 3234 } | 3315 } |
| OLD | NEW |