Index: chrome/browser/download/download_browsertest.cc |
diff --git a/chrome/browser/download/download_browsertest.cc b/chrome/browser/download/download_browsertest.cc |
index e1ec1c9d7e0c2dc0177a6d623e98b4db26101459..9d3acecb48e89368b1a75393abfa22188be8fca5 100644 |
--- a/chrome/browser/download/download_browsertest.cc |
+++ b/chrome/browser/download/download_browsertest.cc |
@@ -426,7 +426,8 @@ class DownloadTest : public InProcessBrowserTest { |
// Information passed in to |DownloadFileCheckErrors()|. |
struct DownloadInfo { |
- const char* url_name; // URL for the download. |
+ const char* starting_url; // URL for initiating the download. |
+ const char* expected_download_url; // Expected value of DI::GetURL(). |
DownloadMethod download_method; // Navigation or Direct. |
// Download interrupt reason (NONE is OK). |
content::DownloadInterruptReason reason; |
@@ -847,29 +848,37 @@ class DownloadTest : public InProcessBrowserTest { |
void DownloadFilesCheckErrorsLoopBody(const DownloadInfo& download_info, |
size_t i) { |
- std::stringstream s; |
- s << " " << __FUNCTION__ << "()" |
- << " index = " << i |
- << " url = '" << download_info.url_name << "'" |
- << " method = " |
- << ((download_info.download_method == DOWNLOAD_DIRECT) ? |
- "DOWNLOAD_DIRECT" : "DOWNLOAD_NAVIGATE") |
- << " show_item = " << download_info.show_download_item |
- << " reason = " << DownloadInterruptReasonToString(download_info.reason); |
+ SCOPED_TRACE(testing::Message() |
+ << " " << __FUNCTION__ << "()" |
+ << " index = " << i << " starting_url = '" |
+ << download_info.starting_url << "'" |
+ << " download_url = '" << download_info.expected_download_url |
+ << "'" |
+ << " method = " |
+ << ((download_info.download_method == DOWNLOAD_DIRECT) |
+ ? "DOWNLOAD_DIRECT" |
+ : "DOWNLOAD_NAVIGATE") << " show_item = " |
+ << download_info.show_download_item << " reason = " |
+ << DownloadInterruptReasonToString(download_info.reason)); |
std::vector<DownloadItem*> download_items; |
GetDownloads(browser(), &download_items); |
size_t downloads_expected = download_items.size(); |
- std::string server_path = "files/downloads/"; |
- server_path += download_info.url_name; |
- GURL url = test_server()->GetURL(server_path); |
- ASSERT_TRUE(url.is_valid()) << s.str(); |
+ // GURL("http://foo/bar").Resolve("baz") => "http://foo/bar/baz" |
+ // GURL("http://foo/bar").Resolve("http://baz") => "http://baz" |
+ // I.e. both starting_url and expected_download_url can either be relative |
+ // to the base test server URL or be an absolute URL. |
+ GURL base_url = test_server()->GetURL("files/downloads/"); |
+ GURL starting_url = base_url.Resolve(download_info.starting_url); |
+ GURL download_url = base_url.Resolve(download_info.expected_download_url); |
+ ASSERT_TRUE(starting_url.is_valid()); |
+ ASSERT_TRUE(download_url.is_valid()); |
DownloadManager* download_manager = DownloadManagerForBrowser(browser()); |
WebContents* web_contents = |
browser()->tab_strip_model()->GetActiveWebContents(); |
- ASSERT_TRUE(web_contents) << s.str(); |
+ ASSERT_TRUE(web_contents); |
scoped_ptr<content::DownloadTestObserver> observer( |
new content::DownloadTestObserverTerminal( |
@@ -883,7 +892,7 @@ class DownloadTest : public InProcessBrowserTest { |
creation_observer(new content::DownloadTestItemCreationObserver); |
scoped_ptr<DownloadUrlParameters> params( |
- DownloadUrlParameters::FromWebContents(web_contents, url)); |
+ DownloadUrlParameters::FromWebContents(web_contents, starting_url)); |
params->set_callback(creation_observer->callback()); |
DownloadManagerForBrowser(browser())->DownloadUrl(params.Pass()); |
@@ -891,24 +900,12 @@ class DownloadTest : public InProcessBrowserTest { |
// won't be. |
creation_observer->WaitForDownloadItemCreation(); |
- EXPECT_EQ(download_info.show_download_item, |
- creation_observer->succeeded()); |
- if (download_info.show_download_item) { |
- EXPECT_EQ(content::DOWNLOAD_INTERRUPT_REASON_NONE, |
- creation_observer->interrupt_reason()); |
- EXPECT_NE(content::DownloadItem::kInvalidId, |
- creation_observer->download_id()); |
- } else { |
- EXPECT_NE(content::DOWNLOAD_INTERRUPT_REASON_NONE, |
- creation_observer->interrupt_reason()); |
- EXPECT_EQ(content::DownloadItem::kInvalidId, |
- creation_observer->download_id()); |
- } |
+ EXPECT_NE(content::DownloadItem::kInvalidId, |
+ creation_observer->download_id()); |
} else { |
// Navigate to URL normally, wait until done. |
- ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(), |
- url, |
- 1); |
+ ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
+ browser(), starting_url, 1); |
} |
if (download_info.show_download_item) { |
@@ -928,7 +925,7 @@ class DownloadTest : public InProcessBrowserTest { |
// Validate that the correct files were downloaded. |
download_items.clear(); |
GetDownloads(browser(), &download_items); |
- ASSERT_EQ(downloads_expected, download_items.size()) << s.str(); |
+ ASSERT_EQ(downloads_expected, download_items.size()); |
if (download_info.show_download_item) { |
// Find the last download item. |
@@ -938,9 +935,8 @@ class DownloadTest : public InProcessBrowserTest { |
item = download_items[d]; |
} |
- ASSERT_EQ(url, item->GetOriginalUrl()) << s.str(); |
- |
- ASSERT_EQ(download_info.reason, item->GetLastReason()) << s.str(); |
+ EXPECT_EQ(download_url, item->GetURL()); |
+ EXPECT_EQ(download_info.reason, item->GetLastReason()); |
if (item->GetState() == content::DownloadItem::COMPLETE) { |
// Clean up the file, in case it ended up in the My Documents folder. |
@@ -1019,7 +1015,7 @@ class DownloadTest : public InProcessBrowserTest { |
for (size_t i = 0; i < count; ++i) { |
// Set up the full URL, for download file tracking. |
std::string server_path = "files/downloads/"; |
- server_path += info[i].download_info.url_name; |
+ server_path += info[i].download_info.starting_url; |
GURL url = test_server()->GetURL(server_path); |
info[i].error_info.url = url.spec(); |
@@ -1269,12 +1265,12 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadResourceThrottleCancels) { |
// Try to start the download via Javascript and wait for the corresponding |
// load stop event. |
content::TestNavigationObserver observer(web_contents); |
- bool download_assempted; |
+ bool download_attempted; |
ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
browser()->tab_strip_model()->GetActiveWebContents(), |
"window.domAutomationController.send(startDownload());", |
- &download_assempted)); |
- ASSERT_TRUE(download_assempted); |
+ &download_attempted)); |
+ ASSERT_TRUE(download_attempted); |
observer.Wait(); |
// Check that we did not download the file. |
@@ -2417,6 +2413,7 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsServer) { |
DownloadInfo download_info[] = { |
{ // Normal navigated download. |
"a_zip_file.zip", |
+ "a_zip_file.zip", |
DOWNLOAD_NAVIGATE, |
content::DOWNLOAD_INTERRUPT_REASON_NONE, |
true, |
@@ -2424,6 +2421,7 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsServer) { |
}, |
{ // Normal direct download. |
"a_zip_file.zip", |
+ "a_zip_file.zip", |
DOWNLOAD_DIRECT, |
content::DOWNLOAD_INTERRUPT_REASON_NONE, |
true, |
@@ -2431,6 +2429,7 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsServer) { |
}, |
{ // Direct download with 404 error. |
"there_IS_no_spoon.zip", |
+ "there_IS_no_spoon.zip", |
DOWNLOAD_DIRECT, |
content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, |
true, |
@@ -2438,6 +2437,7 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsServer) { |
}, |
{ // Navigated download with 404 error. |
"there_IS_no_spoon.zip", |
+ "there_IS_no_spoon.zip", |
DOWNLOAD_NAVIGATE, |
content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, |
false, |
@@ -2445,6 +2445,7 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsServer) { |
}, |
{ // Direct download with 400 error. |
"zip_file_not_found.zip", |
+ "zip_file_not_found.zip", |
DOWNLOAD_DIRECT, |
content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, |
true, |
@@ -2452,10 +2453,49 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsServer) { |
}, |
{ // Navigated download with 400 error. |
"zip_file_not_found.zip", |
+ "", |
DOWNLOAD_NAVIGATE, |
content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, |
false, |
false |
+ }, |
+ { // Simulates clicking on <a href="http://..." download="">. The name does |
+ // not resolve. But since this is an explicit download, the download |
+ // should appear on the shelf and the error should be indicated. |
+ "download-anchor-attrib-name-not-resolved.html", |
+ "http://doesnotexist/shouldnotberesolved", |
+ DOWNLOAD_NAVIGATE, |
+ content::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, |
+ true, |
+ false |
+ }, |
+ { // Simulates clicking on <a href="http://..." download=""> where the URL |
+ // leads to a 404 response. This is different from the previous test case |
+ // in that the ResourceLoader issues a OnResponseStarted() callback since |
+ // the headers are successfully received. |
+ "download-anchor-attrib-404.html", |
+ "there_IS_no_spoon.zip", |
+ DOWNLOAD_NAVIGATE, |
+ content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, |
+ true, |
+ false |
+ }, |
+ { // Similar to the above, but the resulting response contains a status |
+ // code of 400. |
+ "download-anchor-attrib-400.html", |
+ "zip_file_not_found.zip", |
+ DOWNLOAD_NAVIGATE, |
+ content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, |
+ true, |
+ false |
+ }, |
+ { // Direct download of a URL where the hostname doesn't resolve. |
+ "http://doesnotexist/shouldnotdownloadsuccessfully", |
+ "http://doesnotexist/shouldnotdownloadsuccessfully", |
+ DOWNLOAD_DIRECT, |
+ content::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, |
+ true, |
+ false |
} |
}; |
@@ -2465,10 +2505,13 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsServer) { |
IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsFile) { |
FileErrorInjectInfo error_info[] = { |
{ // Navigated download with injected "Disk full" error in Initialize(). |
- { "a_zip_file.zip", |
+ { |
+ "a_zip_file.zip", |
+ "a_zip_file.zip", |
DOWNLOAD_NAVIGATE, |
content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, |
- 1 |
+ true, |
+ false |
}, |
{ |
"", |
@@ -2478,10 +2521,13 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsFile) { |
} |
}, |
{ // Direct download with injected "Disk full" error in Initialize(). |
- { "a_zip_file.zip", |
+ { |
+ "a_zip_file.zip", |
+ "a_zip_file.zip", |
DOWNLOAD_DIRECT, |
content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, |
- 1 |
+ true, |
+ false |
}, |
{ |
"", |
@@ -2491,10 +2537,13 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsFile) { |
} |
}, |
{ // Navigated download with injected "Disk full" error in Write(). |
- { "a_zip_file.zip", |
+ { |
+ "a_zip_file.zip", |
+ "a_zip_file.zip", |
DOWNLOAD_NAVIGATE, |
content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, |
- 1 |
+ true, |
+ false |
}, |
{ |
"", |
@@ -2504,10 +2553,13 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsFile) { |
} |
}, |
{ // Direct download with injected "Disk full" error in Write(). |
- { "a_zip_file.zip", |
+ { |
+ "a_zip_file.zip", |
+ "a_zip_file.zip", |
DOWNLOAD_DIRECT, |
content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, |
- 1 |
+ true, |
+ false |
}, |
{ |
"", |
@@ -2517,10 +2569,13 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsFile) { |
} |
}, |
{ // Navigated download with injected "Failed" error in Initialize(). |
- { "a_zip_file.zip", |
+ { |
+ "a_zip_file.zip", |
+ "a_zip_file.zip", |
DOWNLOAD_NAVIGATE, |
content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
- 1 |
+ true, |
+ false |
}, |
{ |
"", |
@@ -2530,10 +2585,13 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsFile) { |
} |
}, |
{ // Direct download with injected "Failed" error in Initialize(). |
- { "a_zip_file.zip", |
+ { |
+ "a_zip_file.zip", |
+ "a_zip_file.zip", |
DOWNLOAD_DIRECT, |
content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
- 1 |
+ true, |
+ false |
}, |
{ |
"", |
@@ -2543,10 +2601,13 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsFile) { |
} |
}, |
{ // Navigated download with injected "Failed" error in Write(). |
- { "a_zip_file.zip", |
+ { |
+ "a_zip_file.zip", |
+ "a_zip_file.zip", |
DOWNLOAD_NAVIGATE, |
content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
- 1 |
+ true, |
+ false |
}, |
{ |
"", |
@@ -2556,10 +2617,13 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsFile) { |
} |
}, |
{ // Direct download with injected "Failed" error in Write(). |
- { "a_zip_file.zip", |
+ { |
+ "a_zip_file.zip", |
+ "a_zip_file.zip", |
DOWNLOAD_DIRECT, |
content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
- 1 |
+ true, |
+ false |
}, |
{ |
"", |
@@ -2570,10 +2634,13 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsFile) { |
}, |
{ // Navigated download with injected "Name too long" error in |
// Initialize(). |
- { "a_zip_file.zip", |
+ { |
+ "a_zip_file.zip", |
+ "a_zip_file.zip", |
DOWNLOAD_NAVIGATE, |
content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG, |
- 1 |
+ true, |
+ false |
}, |
{ |
"", |
@@ -2583,10 +2650,13 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsFile) { |
} |
}, |
{ // Direct download with injected "Name too long" error in Initialize(). |
- { "a_zip_file.zip", |
+ { |
+ "a_zip_file.zip", |
+ "a_zip_file.zip", |
DOWNLOAD_DIRECT, |
content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG, |
- 1 |
+ true, |
+ false |
}, |
{ |
"", |
@@ -2596,10 +2666,13 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsFile) { |
} |
}, |
{ // Navigated download with injected "Name too long" error in Write(). |
- { "a_zip_file.zip", |
+ { |
+ "a_zip_file.zip", |
+ "a_zip_file.zip", |
DOWNLOAD_NAVIGATE, |
content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
- 1 |
+ true, |
+ false |
}, |
{ |
"", |
@@ -2609,10 +2682,13 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsFile) { |
} |
}, |
{ // Direct download with injected "Name too long" error in Write(). |
- { "a_zip_file.zip", |
+ { |
+ "a_zip_file.zip", |
+ "a_zip_file.zip", |
DOWNLOAD_DIRECT, |
content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
- 1 |
+ true, |
+ false |
}, |
{ |
"", |
@@ -2622,10 +2698,13 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsFile) { |
} |
}, |
{ // Direct download with injected "Disk full" error in 2nd Write(). |
- { "06bESSE21Evolution.ppt", |
+ { |
+ "06bESSE21Evolution.ppt", |
+ "06bESSE21Evolution.ppt", |
DOWNLOAD_DIRECT, |
content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, |
- 1 |
+ true, |
+ false |
}, |
{ |
"", |
@@ -2643,6 +2722,7 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorReadonlyFolder) { |
DownloadInfo download_info[] = { |
{ |
"a_zip_file.zip", |
+ "a_zip_file.zip", |
DOWNLOAD_DIRECT, |
// This passes because we switch to the My Documents folder. |
content::DOWNLOAD_INTERRUPT_REASON_NONE, |
@@ -2651,6 +2731,7 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorReadonlyFolder) { |
}, |
{ |
"a_zip_file.zip", |
+ "a_zip_file.zip", |
DOWNLOAD_NAVIGATE, |
// This passes because we switch to the My Documents folder. |
content::DOWNLOAD_INTERRUPT_REASON_NONE, |