Index: chrome/browser/download/download_browsertest.cc |
diff --git a/chrome/browser/download/download_browsertest.cc b/chrome/browser/download/download_browsertest.cc |
index 4aa216d0f3d4e2e8305deaa4c588f4e8535cf026..455c2111d0cc336dbf431914630d81762583e360 100644 |
--- a/chrome/browser/download/download_browsertest.cc |
+++ b/chrome/browser/download/download_browsertest.cc |
@@ -250,6 +250,7 @@ class DownloadTest : public InProcessBrowserTest { |
// Download interrupt reason (NONE is OK). |
content::DownloadInterruptReason reason; |
bool show_download_item; // True if the download item appears on the shelf. |
+ bool should_redirect_to_documents; // True if we save it in "My Documents". |
}; |
DownloadTest() { |
@@ -641,6 +642,7 @@ class DownloadTest : public InProcessBrowserTest { |
} |
// Attempts to download a file, based on information in |download_info|. |
+ // If a Select File dialog opens, will automatically choose the default. |
void DownloadFileCheckErrors(const DownloadInfo& download_info) { |
ASSERT_TRUE(test_server()->Start()); |
std::vector<DownloadItem*> download_items; |
@@ -654,6 +656,8 @@ class DownloadTest : public InProcessBrowserTest { |
GURL url = test_server()->GetURL(server_path); |
ASSERT_TRUE(url.is_valid()); |
+ NullSelectFile(browser()); // Needed for read-only tests. |
+ |
DownloadManager* download_manager = DownloadManagerForBrowser(browser()); |
scoped_ptr<DownloadTestObserver> observer( |
new DownloadTestObserverTerminal( |
@@ -717,9 +721,46 @@ class DownloadTest : public InProcessBrowserTest { |
ASSERT_EQ(url, item->GetOriginalUrl()); |
ASSERT_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. |
+ FilePath destination_folder = GetDownloadDirectory(browser()); |
+ FilePath my_downloaded_file = item->GetTargetFilePath(); |
+ EXPECT_TRUE(file_util::PathExists(my_downloaded_file)); |
+ EXPECT_TRUE(file_util::Delete(my_downloaded_file, false)); |
+ |
+ EXPECT_EQ(download_info.should_redirect_to_documents ? |
+ std::string::npos : |
+ 0u, |
+ my_downloaded_file.value().find(destination_folder.value())); |
+ if (download_info.should_redirect_to_documents) { |
+ // If it's not where we asked it to be, it should be in the |
+ // My Documents folder. |
+ FilePath my_docs_folder; |
+ EXPECT_TRUE(PathService::Get(chrome::DIR_USER_DOCUMENTS, |
+ &my_docs_folder)); |
+ EXPECT_EQ(0u, |
+ my_downloaded_file.value().find(my_docs_folder.value())); |
+ } |
+ } |
} |
} |
+ // Attempts to download a file to a read-only folder, based on information |
+ // in |download_info|. |
+ void DownloadFileToReadonlyFolder(const DownloadInfo& download_info) { |
+ ASSERT_TRUE(InitialSetup(false)); // Creates temporary download folder. |
+ |
+ // Make the test folder unwritable. |
+ FilePath destination_folder = GetDownloadDirectory(browser()); |
+ DVLOG(1) << " " << __FUNCTION__ << "()" |
+ << " folder = '" << destination_folder.value() << "'"; |
+ file_util::PermissionRestorer permission_restorer(destination_folder); |
+ EXPECT_TRUE(file_util::MakeFileUnwritable(destination_folder)); |
+ |
+ DownloadFileCheckErrors(download_info); |
+ } |
+ |
bool EnsureNoPendingDownloads() { |
bool result = true; |
BrowserThread::PostTask( |
@@ -2028,7 +2069,8 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadNavigate) { |
"a_zip_file.zip", |
DOWNLOAD_NAVIGATE, |
content::DOWNLOAD_INTERRUPT_REASON_NONE, |
- true |
+ true, |
+ false |
}; |
// Do initial setup. |
@@ -2041,7 +2083,8 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadDirect) { |
"a_zip_file.zip", |
DOWNLOAD_DIRECT, |
content::DOWNLOAD_INTERRUPT_REASON_NONE, |
- true |
+ true, |
+ false |
}; |
// Do initial setup. |
@@ -2054,7 +2097,8 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadError404Direct) { |
"there_IS_no_spoon.zip", |
DOWNLOAD_DIRECT, |
content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, |
- true |
+ true, |
+ false |
}; |
// Do initial setup. |
@@ -2067,6 +2111,7 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadError404Navigate) { |
"there_IS_no_spoon.zip", |
DOWNLOAD_NAVIGATE, |
content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, |
+ false, |
false |
}; |
@@ -2080,7 +2125,8 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadError400Direct) { |
"zip_file_not_found.zip", |
DOWNLOAD_DIRECT, |
content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, |
- true |
+ true, |
+ false |
}; |
// Do initial setup. |
@@ -2093,6 +2139,7 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadError400Navigate) { |
"zip_file_not_found.zip", |
DOWNLOAD_NAVIGATE, |
content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, |
+ false, |
false |
}; |
@@ -2100,3 +2147,29 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadError400Navigate) { |
ASSERT_TRUE(InitialSetup(false)); |
DownloadFileCheckErrors(download_info); |
} |
+ |
+IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorReadonlyFolderDirect) { |
+ DownloadInfo download_info = { |
+ "a_zip_file.zip", |
+ DOWNLOAD_DIRECT, |
+ // This passes because we switch to the My Documents folder. |
+ content::DOWNLOAD_INTERRUPT_REASON_NONE, |
+ true, |
+ true |
+ }; |
+ |
+ DownloadFileToReadonlyFolder(download_info); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorReadonlyFolderNavigate) { |
+ DownloadInfo download_info = { |
+ "a_zip_file.zip", |
+ DOWNLOAD_NAVIGATE, |
+ // This passes because we switch to the My Documents folder. |
+ content::DOWNLOAD_INTERRUPT_REASON_NONE, |
+ true, |
+ true |
+ }; |
+ |
+ DownloadFileToReadonlyFolder(download_info); |
+} |