Index: chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc |
diff --git a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc |
index cede2fe261628b87aafc6973b236772fad9f72ba..f5968f23f84311b9a5122b2bc11ecaae15ea8a0b 100644 |
--- a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc |
+++ b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc |
@@ -51,6 +51,8 @@ |
#include "extensions/browser/notification_types.h" |
#include "net/base/data_url.h" |
#include "net/test/embedded_test_server/embedded_test_server.h" |
+#include "net/test/embedded_test_server/http_request.h" |
+#include "net/test/embedded_test_server/http_response.h" |
#include "net/test/url_request/url_request_slow_download_job.h" |
#include "net/url_request/url_request.h" |
#include "net/url_request/url_request_context.h" |
@@ -801,6 +803,19 @@ downloads::InterruptReason InterruptReasonContentToExtension( |
return downloads::INTERRUPT_REASON_NONE; |
} |
+std::unique_ptr<net::test_server::HttpResponse> RedirectRequestHandler( |
+ const std::string& relative_url, |
+ const GURL& target_url, |
+ const net::test_server::HttpRequest& request) { |
+ std::unique_ptr<net::test_server::BasicHttpResponse> response; |
+ if (request.relative_url == relative_url) { |
+ response.reset(new net::test_server::BasicHttpResponse); |
+ response->set_code(net::HTTP_FOUND); |
+ response->AddCustomHeader("Location", target_url.spec()); |
+ } |
+ return std::move(response); |
+} |
+ |
} // namespace |
#if defined(OS_CHROMEOS) |
@@ -829,7 +844,9 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
" \"incognito\": false," |
" \"mime\": \"application/octet-stream\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
+ download_item->GetURL().spec().c_str(), |
download_item->GetURL().spec().c_str()))); |
open_function = new DownloadsOpenFunction(); |
open_function->set_user_gesture(true); |
@@ -1518,7 +1535,9 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
" \"incognito\": false," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE( |
WaitFor(downloads::OnChanged::kEventName, |
@@ -1536,6 +1555,59 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
result_id))); |
} |
+// Test that we can start a download that gets redirected and that the correct |
+// sequence of events is fired for it. |
+IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
+ DownloadExtensionTest_Download_Redirect) { |
+ LoadExtension("downloads_split"); |
+ ASSERT_TRUE(StartEmbeddedTestServer()); |
+ const char redirect_path[] = "/slow_redirect"; |
+ GURL download_url = embedded_test_server()->GetURL(redirect_path); |
+ GURL download_final_url = embedded_test_server()->GetURL("/slow?0"); |
+ embedded_test_server()->RegisterRequestHandler( |
+ base::Bind(&RedirectRequestHandler, redirect_path, download_final_url)); |
+ |
+ GoOnTheRecord(); |
+ |
+ // Start downloading a file. |
+ std::unique_ptr<base::Value> result(RunFunctionAndReturnResult( |
+ new DownloadsDownloadFunction(), |
+ base::StringPrintf("[{\"url\": \"%s\"}]", download_url.spec().c_str()))); |
+ ASSERT_TRUE(result.get()); |
+ int result_id = -1; |
+ ASSERT_TRUE(result->GetAsInteger(&result_id)); |
+ DownloadItem* item = GetCurrentManager()->GetDownload(result_id); |
+ ASSERT_TRUE(item); |
+ ScopedCancellingItem canceller(item); |
+ ASSERT_EQ(download_url, item->GetOriginalUrl()); |
+ ASSERT_EQ(GetExtensionURL(), item->GetSiteUrl().spec()); |
+ |
+ ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, |
+ base::StringPrintf( |
+ "[{\"danger\": \"safe\"," |
+ " \"incognito\": false," |
+ " \"mime\": \"text/plain\"," |
+ " \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
+ " \"url\": \"%s\"}]", |
+ download_final_url.spec().c_str(), |
+ download_url.spec().c_str()))); |
+ ASSERT_TRUE( |
+ WaitFor(downloads::OnChanged::kEventName, |
+ base::StringPrintf("[{\"id\": %d," |
+ " \"filename\": {" |
+ " \"previous\": \"\"," |
+ " \"current\": \"%s\"}}]", |
+ result_id, GetFilename("slow.txt").c_str()))); |
+ ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, |
+ base::StringPrintf( |
+ "[{\"id\": %d," |
+ " \"state\": {" |
+ " \"previous\": \"in_progress\"," |
+ " \"current\": \"complete\"}}]", |
+ result_id))); |
+} |
+ |
// Test that we can start a download from an incognito context, and that the |
// download knows that it's incognito. |
IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
@@ -1563,7 +1635,9 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
" \"incognito\": true," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE( |
WaitFor(downloads::OnChanged::kEventName, |
@@ -1747,7 +1821,9 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
" \"incognito\": false," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, |
base::StringPrintf( |
@@ -1882,7 +1958,9 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
" \"incognito\": false," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE( |
WaitFor(downloads::OnChanged::kEventName, |
@@ -1925,7 +2003,9 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
" \"incognito\": false," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, |
base::StringPrintf( |
@@ -1961,7 +2041,9 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
" \"incognito\": false," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, |
base::StringPrintf( |
@@ -2006,7 +2088,9 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
" \"incognito\": false," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, |
base::StringPrintf( |
@@ -2062,7 +2146,9 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
" \"incognito\": false," |
" \"mime\": \"text/html\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, |
base::StringPrintf( |
@@ -2112,7 +2198,9 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
base::StringPrintf("[{\"danger\": \"safe\"," |
" \"incognito\": false," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
+ download_url.c_str(), |
download_url.c_str()))); |
} |
@@ -2151,7 +2239,9 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
" \"incognito\": false," |
" \"mime\": \"application/octet-stream\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, |
base::StringPrintf( |
@@ -2208,7 +2298,9 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
" \"fileSize\": 0.0," |
" \"mime\": \"\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
+ download_url.c_str(), |
download_url.c_str()))); |
} |
@@ -2247,7 +2339,9 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
" \"bytesReceived\": 0.0," |
" \"mime\": \"text/html\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, |
base::StringPrintf( |
@@ -2292,7 +2386,9 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
" \"incognito\": false," |
" \"mime\": \"application/octet-stream\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, |
base::StringPrintf( |
@@ -2349,8 +2445,10 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
" \"mime\": \"\"," |
" \"paused\": false," |
" \"id\": %d," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
} |
@@ -2392,8 +2490,10 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
" \"mime\": \"\"," |
" \"paused\": false," |
" \"id\": %d," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
} |
@@ -2428,8 +2528,10 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
" \"mime\": \"application/octet-stream\"," |
" \"paused\": false," |
" \"id\": %d," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
item->Cancel(true); |
ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, |
@@ -2489,7 +2591,9 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
" \"incognito\": false," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, |
base::StringPrintf( |
@@ -2539,8 +2643,10 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, |
base::StringPrintf( |
@@ -2611,8 +2717,10 @@ IN_PROC_BROWSER_TEST_F( |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor( |
downloads::OnDeterminingFilename::kEventName, |
@@ -2667,8 +2775,10 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor( |
downloads::OnDeterminingFilename::kEventName, |
@@ -2746,8 +2856,10 @@ IN_PROC_BROWSER_TEST_F( |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, |
base::StringPrintf( |
@@ -2824,8 +2936,10 @@ IN_PROC_BROWSER_TEST_F( |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, |
base::StringPrintf( |
@@ -2890,8 +3004,10 @@ IN_PROC_BROWSER_TEST_F( |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, |
base::StringPrintf( |
@@ -2956,8 +3072,10 @@ IN_PROC_BROWSER_TEST_F( |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, |
base::StringPrintf( |
@@ -3029,8 +3147,10 @@ IN_PROC_BROWSER_TEST_F( |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, |
base::StringPrintf( |
@@ -3095,8 +3215,10 @@ IN_PROC_BROWSER_TEST_F( |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, |
base::StringPrintf( |
@@ -3161,8 +3283,10 @@ IN_PROC_BROWSER_TEST_F( |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, |
base::StringPrintf( |
@@ -3227,8 +3351,10 @@ IN_PROC_BROWSER_TEST_F( |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, |
base::StringPrintf( |
@@ -3294,8 +3420,10 @@ IN_PROC_BROWSER_TEST_F( |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, |
base::StringPrintf( |
@@ -3361,8 +3489,10 @@ IN_PROC_BROWSER_TEST_F( |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, |
base::StringPrintf( |
@@ -3418,8 +3548,10 @@ IN_PROC_BROWSER_TEST_F( |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, |
base::StringPrintf( |
@@ -3487,8 +3619,10 @@ IN_PROC_BROWSER_TEST_F( |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, |
base::StringPrintf( |
@@ -3544,8 +3678,10 @@ IN_PROC_BROWSER_TEST_F( |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, |
base::StringPrintf( |
@@ -3624,8 +3760,10 @@ IN_PROC_BROWSER_TEST_F( |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, |
base::StringPrintf( |
@@ -3681,8 +3819,10 @@ IN_PROC_BROWSER_TEST_F( |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, |
base::StringPrintf( |
@@ -3742,8 +3882,10 @@ IN_PROC_BROWSER_TEST_F( |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
// On-Record renderers should not see events for off-record items. |
ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, |
@@ -3820,8 +3962,10 @@ IN_PROC_BROWSER_TEST_F( |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, |
base::StringPrintf( |
@@ -3881,8 +4025,10 @@ IN_PROC_BROWSER_TEST_F( |
" \"id\": %d," |
" \"mime\": \"text/plain\"," |
" \"paused\": false," |
+ " \"finalUrl\": \"%s\"," |
" \"url\": \"%s\"}]", |
result_id, |
+ download_url.c_str(), |
download_url.c_str()))); |
ASSERT_TRUE(WaitFor(downloads::OnDeterminingFilename::kEventName, |
base::StringPrintf( |