Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(779)

Unified Diff: chrome/browser/download/download_browsertest.cc

Issue 148133007: [Downloads] Always call DM::StartDownload() for explicit downloads. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Comment updates Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/download/download_browsertest.cc
diff --git a/chrome/browser/download/download_browsertest.cc b/chrome/browser/download/download_browsertest.cc
index 5fdcbf45f3b4b525b84edc2b7f537113804705d6..d87183737057836f6dbed74be5c5bc7a8dd0e507 100644
--- a/chrome/browser/download/download_browsertest.cc
+++ b/chrome/browser/download/download_browsertest.cc
@@ -398,8 +398,12 @@ class DownloadTest : public InProcessBrowserTest {
// Information passed in to |DownloadFileCheckErrors()|.
struct DownloadInfo {
- const char* url_name; // URL for the download.
- DownloadMethod download_method; // Navigation or Direct.
+ const char* starting_url; // URL for initiating the download.
+ const char* expected_download_url; // Expected value of DI::GetURL(). Can
+ // be different if |starting_url|
+ // initiates a download from another
+ // URL.
+ DownloadMethod download_method; // Navigation or Direct.
// Download interrupt reason (NONE is OK).
content::DownloadInterruptReason reason;
bool show_download_item; // True if the download item appears on the shelf.
@@ -832,24 +836,33 @@ class DownloadTest : public InProcessBrowserTest {
void DownloadFilesCheckErrorsLoopBody(const DownloadInfo& download_info,
size_t i) {
- SCOPED_TRACE(
- ::testing::Message()
- << " " << __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 = "/downloads/";
- server_path += download_info.url_name;
- GURL url = embedded_test_server()->GetURL(server_path);
- ASSERT_TRUE(url.is_valid());
+ // 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 = embedded_test_server()->GetURL("/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 =
@@ -873,7 +886,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(std::move(params));
@@ -881,22 +894,12 @@ class DownloadTest : public InProcessBrowserTest {
// won't be.
creation_observer->WaitForDownloadItemCreation();
- ASSERT_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::NavigateToURL(browser(), url);
+ ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
+ browser(), starting_url, 1);
}
if (download_info.show_download_item) {
@@ -926,8 +929,8 @@ class DownloadTest : public InProcessBrowserTest {
item = download_items[d];
}
- ASSERT_EQ(url, item->GetOriginalUrl());
- ASSERT_EQ(download_info.reason, item->GetLastReason());
+ 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.
@@ -1006,7 +1009,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 = "/downloads/";
- server_path += info[i].download_info.url_name;
+ server_path += info[i].download_info.starting_url;
GURL url = embedded_test_server()->GetURL(server_path);
info[i].error_info.url = url.spec();
@@ -1258,12 +1261,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.
@@ -2291,249 +2294,156 @@ IN_PROC_BROWSER_TEST_F(DownloadTest, SavePageNonHTMLViaPost) {
IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsServer) {
DownloadInfo download_info[] = {
- { // Normal navigated download.
- "a_zip_file.zip",
- DOWNLOAD_NAVIGATE,
- content::DOWNLOAD_INTERRUPT_REASON_NONE,
- true,
- false
- },
- { // Normal direct download.
- "a_zip_file.zip",
- DOWNLOAD_DIRECT,
- content::DOWNLOAD_INTERRUPT_REASON_NONE,
- true,
- false
- },
- { // Direct download with 404 error.
- "there_IS_no_spoon.zip",
- DOWNLOAD_DIRECT,
- content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT,
- true,
- false
- },
- { // Navigated download with 404 error.
- "there_IS_no_spoon.zip",
- DOWNLOAD_NAVIGATE,
- content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT,
- false,
- false
- },
- { // Direct download with 400 error.
- "zip_file_not_found.zip",
- DOWNLOAD_DIRECT,
- content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED,
- true,
- false
- },
- { // Navigated download with 400 error.
- "zip_file_not_found.zip",
- DOWNLOAD_NAVIGATE,
- content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED,
- false,
- false
- }
- };
+ {// Normal navigated download.
+ "a_zip_file.zip", "a_zip_file.zip", DOWNLOAD_NAVIGATE,
+ content::DOWNLOAD_INTERRUPT_REASON_NONE, true, false},
+ {// Normal direct download.
+ "a_zip_file.zip", "a_zip_file.zip", DOWNLOAD_DIRECT,
+ content::DOWNLOAD_INTERRUPT_REASON_NONE, true, false},
+ {// 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, false},
+ {// 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, false},
+ {// Direct download with 400 error.
+ "zip_file_not_found.zip", "zip_file_not_found.zip", DOWNLOAD_DIRECT,
+ content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, true, false},
+ {// 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}};
DownloadFilesCheckErrors(arraysize(download_info), download_info);
}
IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorsFile) {
FileErrorInjectInfo error_info[] = {
- { // Navigated download with injected "Disk full" error in Initialize().
- { "a_zip_file.zip",
- DOWNLOAD_NAVIGATE,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE,
- 1
- },
- {
- "",
- content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE,
- 0,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE,
- }
- },
- { // Direct download with injected "Disk full" error in Initialize().
- { "a_zip_file.zip",
- DOWNLOAD_DIRECT,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE,
- 1
- },
- {
- "",
- content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE,
- 0,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE,
- }
- },
- { // Navigated download with injected "Disk full" error in Write().
- { "a_zip_file.zip",
- DOWNLOAD_NAVIGATE,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE,
- 1
- },
- {
- "",
- content::TestFileErrorInjector::FILE_OPERATION_WRITE,
- 0,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE,
- }
- },
- { // Direct download with injected "Disk full" error in Write().
- { "a_zip_file.zip",
- DOWNLOAD_DIRECT,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE,
- 1
- },
- {
- "",
- content::TestFileErrorInjector::FILE_OPERATION_WRITE,
- 0,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE,
- }
- },
- { // Navigated download with injected "Failed" error in Initialize().
- { "a_zip_file.zip",
- DOWNLOAD_NAVIGATE,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED,
- 1
- },
- {
- "",
- content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE,
- 0,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED,
- }
- },
- { // Direct download with injected "Failed" error in Initialize().
- { "a_zip_file.zip",
- DOWNLOAD_DIRECT,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED,
- 1
- },
- {
- "",
- content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE,
- 0,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED,
- }
- },
- { // Navigated download with injected "Failed" error in Write().
- { "a_zip_file.zip",
- DOWNLOAD_NAVIGATE,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED,
- 1
- },
- {
- "",
- content::TestFileErrorInjector::FILE_OPERATION_WRITE,
- 0,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED,
- }
- },
- { // Direct download with injected "Failed" error in Write().
- { "a_zip_file.zip",
- DOWNLOAD_DIRECT,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED,
- 1
- },
- {
- "",
- content::TestFileErrorInjector::FILE_OPERATION_WRITE,
- 0,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED,
- }
- },
- { // Navigated download with injected "Name too long" error in
+ {// Navigated download with injected "Disk full" error in Initialize().
+ {"a_zip_file.zip", "a_zip_file.zip", DOWNLOAD_NAVIGATE,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, true, false},
+ {
+ "", content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, 0,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE,
+ }},
+ {// Direct download with injected "Disk full" error in Initialize().
+ {"a_zip_file.zip", "a_zip_file.zip", DOWNLOAD_DIRECT,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, true, false},
+ {
+ "", content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, 0,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE,
+ }},
+ {// Navigated download with injected "Disk full" error in Write().
+ {"a_zip_file.zip", "a_zip_file.zip", DOWNLOAD_NAVIGATE,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, true, false},
+ {
+ "", content::TestFileErrorInjector::FILE_OPERATION_WRITE, 0,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE,
+ }},
+ {// Direct download with injected "Disk full" error in Write().
+ {"a_zip_file.zip", "a_zip_file.zip", DOWNLOAD_DIRECT,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, true, false},
+ {
+ "", content::TestFileErrorInjector::FILE_OPERATION_WRITE, 0,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE,
+ }},
+ {// Navigated download with injected "Failed" error in Initialize().
+ {"a_zip_file.zip", "a_zip_file.zip", DOWNLOAD_NAVIGATE,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, true, false},
+ {
+ "", content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, 0,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED,
+ }},
+ {// Direct download with injected "Failed" error in Initialize().
+ {"a_zip_file.zip", "a_zip_file.zip", DOWNLOAD_DIRECT,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, true, false},
+ {
+ "", content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, 0,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED,
+ }},
+ {// Navigated download with injected "Failed" error in Write().
+ {"a_zip_file.zip", "a_zip_file.zip", DOWNLOAD_NAVIGATE,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, true, false},
+ {
+ "", content::TestFileErrorInjector::FILE_OPERATION_WRITE, 0,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED,
+ }},
+ {// Direct download with injected "Failed" error in Write().
+ {"a_zip_file.zip", "a_zip_file.zip", DOWNLOAD_DIRECT,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, true, false},
+ {
+ "", content::TestFileErrorInjector::FILE_OPERATION_WRITE, 0,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED,
+ }},
+ {// Navigated download with injected "Name too long" error in
// Initialize().
- { "a_zip_file.zip",
- DOWNLOAD_NAVIGATE,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG,
- 1
- },
- {
- "",
- content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE,
- 0,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG,
- }
- },
- { // Direct download with injected "Name too long" error in Initialize().
- { "a_zip_file.zip",
- DOWNLOAD_DIRECT,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG,
- 1
- },
- {
- "",
- content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE,
- 0,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG,
- }
- },
- { // Navigated download with injected "Name too long" error in Write().
- { "a_zip_file.zip",
- DOWNLOAD_NAVIGATE,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED,
- 1
- },
- {
- "",
- content::TestFileErrorInjector::FILE_OPERATION_WRITE,
- 0,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED,
- }
- },
- { // Direct download with injected "Name too long" error in Write().
- { "a_zip_file.zip",
- DOWNLOAD_DIRECT,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED,
- 1
- },
- {
- "",
- content::TestFileErrorInjector::FILE_OPERATION_WRITE,
- 0,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED,
- }
- },
- { // Direct download with injected "Disk full" error in 2nd Write().
- { "06bESSE21Evolution.ppt",
- DOWNLOAD_DIRECT,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE,
- 1
- },
- {
- "",
- content::TestFileErrorInjector::FILE_OPERATION_WRITE,
- 1,
- content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE,
- }
- }
- };
+ {"a_zip_file.zip", "a_zip_file.zip", DOWNLOAD_NAVIGATE,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG, true, false},
+ {
+ "", content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, 0,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG,
+ }},
+ {// Direct download with injected "Name too long" error in Initialize().
+ {"a_zip_file.zip", "a_zip_file.zip", DOWNLOAD_DIRECT,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG, true, false},
+ {
+ "", content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE, 0,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG,
+ }},
+ {// Navigated download with injected "Name too long" error in Write().
+ {"a_zip_file.zip", "a_zip_file.zip", DOWNLOAD_NAVIGATE,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, true, false},
+ {
+ "", content::TestFileErrorInjector::FILE_OPERATION_WRITE, 0,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED,
+ }},
+ {// Direct download with injected "Name too long" error in Write().
+ {"a_zip_file.zip", "a_zip_file.zip", DOWNLOAD_DIRECT,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, true, false},
+ {
+ "", content::TestFileErrorInjector::FILE_OPERATION_WRITE, 0,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED,
+ }},
+ {// Direct download with injected "Disk full" error in 2nd Write().
+ {"06bESSE21Evolution.ppt", "06bESSE21Evolution.ppt", DOWNLOAD_DIRECT,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, true, false},
+ {
+ "", content::TestFileErrorInjector::FILE_OPERATION_WRITE, 1,
+ content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE,
+ }}};
DownloadInsertFilesErrorCheckErrors(arraysize(error_info), error_info);
}
IN_PROC_BROWSER_TEST_F(DownloadTest, DownloadErrorReadonlyFolder) {
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
- },
- {
- "a_zip_file.zip",
- DOWNLOAD_NAVIGATE,
- // This passes because we switch to the My Documents folder.
- content::DOWNLOAD_INTERRUPT_REASON_NONE,
- true,
- true
- }
- };
+ {"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, true, true},
+ {"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, true, true}};
DownloadFilesToReadonlyFolder(arraysize(download_info), download_info);
}

Powered by Google App Engine
This is Rietveld 408576698