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

Side by Side Diff: content/browser/download/download_browsertest.cc

Issue 246893006: [Downloads] Clear suggested filename on cross origin redirect. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Simplify use of EmbeddedTestServer Created 6 years, 8 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | content/browser/download/download_resource_handler.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 // This file contains download browser tests that are known to be runnable 5 // This file contains download browser tests that are known to be runnable
6 // in a pure content context. Over time tests should be migrated here. 6 // in a pure content context. Over time tests should be migrated here.
7 7
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/files/file_path.h" 10 #include "base/files/file_path.h"
(...skipping 18 matching lines...) Expand all
29 #include "content/public/test/content_browser_test_utils.h" 29 #include "content/public/test/content_browser_test_utils.h"
30 #include "content/public/test/download_test_observer.h" 30 #include "content/public/test/download_test_observer.h"
31 #include "content/public/test/test_file_error_injector.h" 31 #include "content/public/test/test_file_error_injector.h"
32 #include "content/public/test/test_utils.h" 32 #include "content/public/test/test_utils.h"
33 #include "content/shell/browser/shell.h" 33 #include "content/shell/browser/shell.h"
34 #include "content/shell/browser/shell_browser_context.h" 34 #include "content/shell/browser/shell_browser_context.h"
35 #include "content/shell/browser/shell_download_manager_delegate.h" 35 #include "content/shell/browser/shell_download_manager_delegate.h"
36 #include "content/shell/browser/shell_network_delegate.h" 36 #include "content/shell/browser/shell_network_delegate.h"
37 #include "content/test/net/url_request_mock_http_job.h" 37 #include "content/test/net/url_request_mock_http_job.h"
38 #include "content/test/net/url_request_slow_download_job.h" 38 #include "content/test/net/url_request_slow_download_job.h"
39 #include "net/test/embedded_test_server/embedded_test_server.h"
40 #include "net/test/embedded_test_server/http_request.h"
41 #include "net/test/embedded_test_server/http_response.h"
39 #include "net/test/spawned_test_server/spawned_test_server.h" 42 #include "net/test/spawned_test_server/spawned_test_server.h"
40 #include "testing/gmock/include/gmock/gmock.h" 43 #include "testing/gmock/include/gmock/gmock.h"
41 #include "testing/gtest/include/gtest/gtest.h" 44 #include "testing/gtest/include/gtest/gtest.h"
42 #include "url/gurl.h" 45 #include "url/gurl.h"
43 46
44 using ::testing::_; 47 using ::net::test_server::EmbeddedTestServer;
45 using ::testing::AllOf; 48 using ::testing::AllOf;
46 using ::testing::Field; 49 using ::testing::Field;
47 using ::testing::InSequence; 50 using ::testing::InSequence;
48 using ::testing::Property; 51 using ::testing::Property;
49 using ::testing::Return; 52 using ::testing::Return;
50 using ::testing::StrictMock; 53 using ::testing::StrictMock;
54 using ::testing::_;
51 55
52 namespace content { 56 namespace content {
53 57
54 namespace { 58 namespace {
55 59
56 class MockDownloadItemObserver : public DownloadItem::Observer { 60 class MockDownloadItemObserver : public DownloadItem::Observer {
57 public: 61 public:
58 MockDownloadItemObserver() {} 62 MockDownloadItemObserver() {}
59 virtual ~MockDownloadItemObserver() {} 63 virtual ~MockDownloadItemObserver() {}
60 64
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 // Filter for saving the size of the download when the first IN_PROGRESS 500 // Filter for saving the size of the download when the first IN_PROGRESS
497 // is hit. 501 // is hit.
498 bool InitialSizeFilter(int* download_size, DownloadItem* download) { 502 bool InitialSizeFilter(int* download_size, DownloadItem* download) {
499 if (download->GetState() != DownloadItem::IN_PROGRESS) 503 if (download->GetState() != DownloadItem::IN_PROGRESS)
500 return false; 504 return false;
501 505
502 *download_size = download->GetReceivedBytes(); 506 *download_size = download->GetReceivedBytes();
503 return true; 507 return true;
504 } 508 }
505 509
510 // Request handler to be used with CreateRedirectHandler().
511 scoped_ptr<net::test_server::HttpResponse> HandleRequestAndSendRedirectResponse(
512 const std::string& relative_url,
513 const GURL& target_url,
514 const net::test_server::HttpRequest& request) {
515 scoped_ptr<net::test_server::BasicHttpResponse> response;
516 if (request.relative_url == relative_url) {
517 response.reset(new net::test_server::BasicHttpResponse);
518 response->set_code(net::HTTP_FOUND);
519 response->AddCustomHeader("Location", target_url.spec());
520 }
521 return response.PassAs<net::test_server::HttpResponse>();
522 }
523
524 // Creates a request handler for EmbeddedTestServer that responds with a HTTP
525 // 302 redirect if the request URL matches |relative_url|.
526 EmbeddedTestServer::HandleRequestCallback CreateRedirectHandler(
527 const std::string& relative_url,
528 const GURL& target_url) {
529 return base::Bind(
530 &HandleRequestAndSendRedirectResponse, relative_url, target_url);
531 }
532
533 // Request handler to be used with CreateBasicResponseHandler().
534 scoped_ptr<net::test_server::HttpResponse> HandleRequestAndSendBasicResponse(
535 const std::string& relative_url,
536 const std::string& content_type,
537 const std::string& body,
538 const net::test_server::HttpRequest& request) {
539 scoped_ptr<net::test_server::BasicHttpResponse> response;
540 if (request.relative_url == relative_url) {
541 response.reset(new net::test_server::BasicHttpResponse);
542 response->set_content_type(content_type);
543 response->set_content(body);
544 }
545 return response.PassAs<net::test_server::HttpResponse>();
546 }
547
548 // Creates a request handler for an EmbeddedTestServer that response with an
549 // HTTP 200 status code, a Content-Type header and a body.
550 EmbeddedTestServer::HandleRequestCallback CreateBasicResponseHandler(
551 const std::string& relative_url,
552 const std::string& content_type,
553 const std::string& body) {
554 return base::Bind(
555 &HandleRequestAndSendBasicResponse, relative_url, content_type, body);
556 }
557
506 } // namespace 558 } // namespace
507 559
508 class DownloadContentTest : public ContentBrowserTest { 560 class DownloadContentTest : public ContentBrowserTest {
509 protected: 561 protected:
510 // An initial send from a website of at least this size will not be 562 // An initial send from a website of at least this size will not be
511 // help up by buffering in the underlying downloads ByteStream data 563 // help up by buffering in the underlying downloads ByteStream data
512 // transfer. This is important because on resumption tests we wait 564 // transfer. This is important because on resumption tests we wait
513 // until we've gotten the data we expect before allowing the test server 565 // until we've gotten the data we expect before allowing the test server
514 // to send its reset, to get around hard close semantics on the Windows 566 // to send its reset, to get around hard close semantics on the Windows
515 // socket layer implementation. 567 // socket layer implementation.
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 bool EnsureNoPendingDownloads() { 627 bool EnsureNoPendingDownloads() {
576 bool result = true; 628 bool result = true;
577 BrowserThread::PostTask( 629 BrowserThread::PostTask(
578 BrowserThread::IO, FROM_HERE, 630 BrowserThread::IO, FROM_HERE,
579 base::Bind(&EnsureNoPendingDownloadJobsOnIO, &result)); 631 base::Bind(&EnsureNoPendingDownloadJobsOnIO, &result));
580 base::MessageLoop::current()->Run(); 632 base::MessageLoop::current()->Run();
581 return result && 633 return result &&
582 (CountingDownloadFile::GetNumberActiveFilesFromFileThread() == 0); 634 (CountingDownloadFile::GetNumberActiveFilesFromFileThread() == 0);
583 } 635 }
584 636
585 void DownloadAndWait(Shell* shell, const GURL& url, 637 void NavigateToURLAndWaitForDownload(
586 DownloadItem::DownloadState expected_terminal_state) { 638 Shell* shell,
639 const GURL& url,
640 DownloadItem::DownloadState expected_terminal_state) {
587 scoped_ptr<DownloadTestObserver> observer(CreateWaiter(shell, 1)); 641 scoped_ptr<DownloadTestObserver> observer(CreateWaiter(shell, 1));
588 NavigateToURL(shell, url); 642 NavigateToURL(shell, url);
589 observer->WaitForFinished(); 643 observer->WaitForFinished();
590 EXPECT_EQ(1u, observer->NumDownloadsSeenInState(expected_terminal_state)); 644 EXPECT_EQ(1u, observer->NumDownloadsSeenInState(expected_terminal_state));
591 } 645 }
592 646
593 // Checks that |path| is has |file_size| bytes, and matches the |value| 647 // Checks that |path| is has |file_size| bytes, and matches the |value|
594 // string. 648 // string.
595 bool VerifyFile(const base::FilePath& path, 649 bool VerifyFile(const base::FilePath& path,
596 const std::string& value, 650 const std::string& value,
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 std::vector<DownloadItem*> downloads; 793 std::vector<DownloadItem*> downloads;
740 DownloadManagerForShell(shell())->GetAllDownloads(&downloads); 794 DownloadManagerForShell(shell())->GetAllDownloads(&downloads);
741 ASSERT_EQ(1u, downloads.size()); 795 ASSERT_EQ(1u, downloads.size());
742 ASSERT_EQ(DownloadItem::IN_PROGRESS, downloads[0]->GetState()); 796 ASSERT_EQ(DownloadItem::IN_PROGRESS, downloads[0]->GetState());
743 DownloadItem* download1 = downloads[0]; // The only download. 797 DownloadItem* download1 = downloads[0]; // The only download.
744 798
745 // Start the second download and wait until it's done. 799 // Start the second download and wait until it's done.
746 base::FilePath file(FILE_PATH_LITERAL("download-test.lib")); 800 base::FilePath file(FILE_PATH_LITERAL("download-test.lib"));
747 GURL url(URLRequestMockHTTPJob::GetMockUrl(file)); 801 GURL url(URLRequestMockHTTPJob::GetMockUrl(file));
748 // Download the file and wait. 802 // Download the file and wait.
749 DownloadAndWait(shell(), url, DownloadItem::COMPLETE); 803 NavigateToURLAndWaitForDownload(shell(), url, DownloadItem::COMPLETE);
750 804
751 // Should now have 2 items on the manager. 805 // Should now have 2 items on the manager.
752 downloads.clear(); 806 downloads.clear();
753 DownloadManagerForShell(shell())->GetAllDownloads(&downloads); 807 DownloadManagerForShell(shell())->GetAllDownloads(&downloads);
754 ASSERT_EQ(2u, downloads.size()); 808 ASSERT_EQ(2u, downloads.size());
755 // We don't know the order of the downloads. 809 // We don't know the order of the downloads.
756 DownloadItem* download2 = downloads[(download1 == downloads[0]) ? 1 : 0]; 810 DownloadItem* download2 = downloads[(download1 == downloads[0]) ? 1 : 0];
757 811
758 ASSERT_EQ(DownloadItem::IN_PROGRESS, download1->GetState()); 812 ASSERT_EQ(DownloadItem::IN_PROGRESS, download1->GetState());
759 ASSERT_EQ(DownloadItem::COMPLETE, download2->GetState()); 813 ASSERT_EQ(DownloadItem::COMPLETE, download2->GetState());
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
793 const char kTestFileType[] = "abc"; 847 const char kTestFileType[] = "abc";
794 848
795 WebPluginInfo plugin_info; 849 WebPluginInfo plugin_info;
796 plugin_info.name = base::ASCIIToUTF16(kTestPluginName); 850 plugin_info.name = base::ASCIIToUTF16(kTestPluginName);
797 plugin_info.mime_types.push_back( 851 plugin_info.mime_types.push_back(
798 WebPluginMimeType(kTestMimeType, kTestFileType, "")); 852 WebPluginMimeType(kTestMimeType, kTestFileType, ""));
799 PluginServiceImpl::GetInstance()->RegisterInternalPlugin(plugin_info, false); 853 PluginServiceImpl::GetInstance()->RegisterInternalPlugin(plugin_info, false);
800 854
801 // The following is served with a Content-Type of application/octet-stream. 855 // The following is served with a Content-Type of application/octet-stream.
802 GURL url(URLRequestMockHTTPJob::GetMockUrl(base::FilePath(kTestFilePath))); 856 GURL url(URLRequestMockHTTPJob::GetMockUrl(base::FilePath(kTestFilePath)));
803 DownloadAndWait(shell(), url, DownloadItem::COMPLETE); 857 NavigateToURLAndWaitForDownload(shell(), url, DownloadItem::COMPLETE);
804 } 858 }
805 #endif 859 #endif
806 860
807 // Try to cancel just before we release the download file, by delaying final 861 // Try to cancel just before we release the download file, by delaying final
808 // rename callback. 862 // rename callback.
809 IN_PROC_BROWSER_TEST_F(DownloadContentTest, CancelAtFinalRename) { 863 IN_PROC_BROWSER_TEST_F(DownloadContentTest, CancelAtFinalRename) {
810 // Setup new factory. 864 // Setup new factory.
811 DownloadFileWithDelayFactory* file_factory = 865 DownloadFileWithDelayFactory* file_factory =
812 new DownloadFileWithDelayFactory(); 866 new DownloadFileWithDelayFactory();
813 DownloadManagerImpl* download_manager(DownloadManagerForShell(shell())); 867 DownloadManagerImpl* download_manager(DownloadManagerForShell(shell()));
(...skipping 739 matching lines...) Expand 10 before | Expand all | Expand 10 after
1553 1607
1554 // The intermediate file should now be gone. 1608 // The intermediate file should now be gone.
1555 RunAllPendingInMessageLoop(BrowserThread::FILE); 1609 RunAllPendingInMessageLoop(BrowserThread::FILE);
1556 RunAllPendingInMessageLoop(); 1610 RunAllPendingInMessageLoop();
1557 EXPECT_FALSE(base::PathExists(intermediate_path)); 1611 EXPECT_FALSE(base::PathExists(intermediate_path));
1558 1612
1559 // Start the second download and wait until it's done. The test server is 1613 // Start the second download and wait until it's done. The test server is
1560 // single threaded. The response to this download request should follow the 1614 // single threaded. The response to this download request should follow the
1561 // response to the previous resumption request. 1615 // response to the previous resumption request.
1562 GURL url2(test_server()->GetURL("rangereset?size=100&rst_limit=0&token=x")); 1616 GURL url2(test_server()->GetURL("rangereset?size=100&rst_limit=0&token=x"));
1563 DownloadAndWait(shell(), url2, DownloadItem::COMPLETE); 1617 NavigateToURLAndWaitForDownload(shell(), url2, DownloadItem::COMPLETE);
1564 1618
1565 EXPECT_TRUE(EnsureNoPendingDownloads()); 1619 EXPECT_TRUE(EnsureNoPendingDownloads());
1566 } 1620 }
1567 1621
1568 IN_PROC_BROWSER_TEST_F(DownloadContentTest, CancelResumingDownload) { 1622 IN_PROC_BROWSER_TEST_F(DownloadContentTest, CancelResumingDownload) {
1569 SetupEnsureNoPendingDownloads(); 1623 SetupEnsureNoPendingDownloads();
1570 CommandLine::ForCurrentProcess()->AppendSwitch( 1624 CommandLine::ForCurrentProcess()->AppendSwitch(
1571 switches::kEnableDownloadResumption); 1625 switches::kEnableDownloadResumption);
1572 ASSERT_TRUE(test_server()->Start()); 1626 ASSERT_TRUE(test_server()->Start());
1573 1627
(...skipping 27 matching lines...) Expand all
1601 // The intermediate file should now be gone. 1655 // The intermediate file should now be gone.
1602 RunAllPendingInMessageLoop(BrowserThread::FILE); 1656 RunAllPendingInMessageLoop(BrowserThread::FILE);
1603 RunAllPendingInMessageLoop(); 1657 RunAllPendingInMessageLoop();
1604 EXPECT_FALSE(base::PathExists(intermediate_path)); 1658 EXPECT_FALSE(base::PathExists(intermediate_path));
1605 EXPECT_TRUE(download->GetFullPath().empty()); 1659 EXPECT_TRUE(download->GetFullPath().empty());
1606 1660
1607 // Start the second download and wait until it's done. The test server is 1661 // Start the second download and wait until it's done. The test server is
1608 // single threaded. The response to this download request should follow the 1662 // single threaded. The response to this download request should follow the
1609 // response to the previous resumption request. 1663 // response to the previous resumption request.
1610 GURL url2(test_server()->GetURL("rangereset?size=100&rst_limit=0&token=x")); 1664 GURL url2(test_server()->GetURL("rangereset?size=100&rst_limit=0&token=x"));
1611 DownloadAndWait(shell(), url2, DownloadItem::COMPLETE); 1665 NavigateToURLAndWaitForDownload(shell(), url2, DownloadItem::COMPLETE);
1612 1666
1613 EXPECT_TRUE(EnsureNoPendingDownloads()); 1667 EXPECT_TRUE(EnsureNoPendingDownloads());
1614 } 1668 }
1615 1669
1616 // Check that the cookie policy is correctly updated when downloading a file 1670 // Check that the cookie policy is correctly updated when downloading a file
1617 // that redirects cross origin. 1671 // that redirects cross origin.
1618 IN_PROC_BROWSER_TEST_F(DownloadContentTest, CookiePolicy) { 1672 IN_PROC_BROWSER_TEST_F(DownloadContentTest, CookiePolicy) {
1619 ASSERT_TRUE(test_server()->Start()); 1673 ASSERT_TRUE(test_server()->Start());
1620 net::HostPortPair host_port = test_server()->host_port_pair(); 1674 net::HostPortPair host_port = test_server()->host_port_pair();
1621 DCHECK_EQ(host_port.host(), std::string("127.0.0.1")); 1675 DCHECK_EQ(host_port.host(), std::string("127.0.0.1"));
(...skipping 22 matching lines...) Expand all
1644 DownloadManagerForShell(shell())->GetAllDownloads(&downloads); 1698 DownloadManagerForShell(shell())->GetAllDownloads(&downloads);
1645 ASSERT_EQ(1u, downloads.size()); 1699 ASSERT_EQ(1u, downloads.size());
1646 ASSERT_EQ(DownloadItem::COMPLETE, downloads[0]->GetState()); 1700 ASSERT_EQ(DownloadItem::COMPLETE, downloads[0]->GetState());
1647 1701
1648 // Check that the cookies were correctly set. 1702 // Check that the cookies were correctly set.
1649 EXPECT_EQ("A=B", 1703 EXPECT_EQ("A=B",
1650 content::GetCookies(shell()->web_contents()->GetBrowserContext(), 1704 content::GetCookies(shell()->web_contents()->GetBrowserContext(),
1651 GURL(download))); 1705 GURL(download)));
1652 } 1706 }
1653 1707
1708 // A filename suggestion specified via a @download attribute should not be
1709 // effective if the final download URL is in another origin from the original
1710 // download URL.
1711 IN_PROC_BROWSER_TEST_F(DownloadContentTest,
1712 DownloadAttributeCrossOriginRedirect) {
1713 EmbeddedTestServer origin_one;
1714 EmbeddedTestServer origin_two;
1715 ASSERT_TRUE(origin_one.InitializeAndWaitUntilReady());
1716 ASSERT_TRUE(origin_two.InitializeAndWaitUntilReady());
1717
1718 // The download-attribute.html page contains an anchor element whose href is
1719 // set to the value of the query parameter (specified as |target| in the URL
1720 // below). The suggested filename for the anchor is 'suggested-filename'. When
1721 // the page is loaded, a script simulates a click on the anchor, triggering a
1722 // download of the target URL.
1723 //
1724 // We construct two test servers; origin_one and origin_two. Once started, the
1725 // server URLs will differ by the port number. Therefore they will be in
1726 // different origins.
1727 GURL download_url = origin_one.GetURL("/ping");
1728 GURL referrer_url = origin_one.GetURL(
1729 std::string("/download-attribute.html?target=") + download_url.spec());
1730
1731 // <origin_one>/download-attribute.html initiates a download of
1732 // <origin_one>/ping, which redirects to <origin_two>/download.
1733 origin_one.ServeFilesFromDirectory(GetTestFilePath("download", ""));
1734 origin_one.RegisterRequestHandler(
1735 CreateRedirectHandler("/ping", origin_two.GetURL("/download")));
1736 origin_two.RegisterRequestHandler(CreateBasicResponseHandler(
1737 "/download", "application/octet-stream", "Hello"));
1738
1739 NavigateToURLAndWaitForDownload(
1740 shell(), referrer_url, DownloadItem::COMPLETE);
1741
1742 std::vector<DownloadItem*> downloads;
1743 DownloadManagerForShell(shell())->GetAllDownloads(&downloads);
1744 ASSERT_EQ(1u, downloads.size());
1745
1746 EXPECT_EQ(FILE_PATH_LITERAL("download"),
Randy Smith (Not in Mondays) 2014/04/24 22:08:43 Suggestion: Comment that this is the key check, an
asanka 2014/04/25 22:08:07 Done.
1747 downloads[0]->GetTargetFilePath().BaseName().value());
1748 ASSERT_TRUE(origin_one.ShutdownAndWaitUntilComplete());
1749 ASSERT_TRUE(origin_two.ShutdownAndWaitUntilComplete());
1750 }
1751
1752 // A filename suggestion specified via a @download attribute should be effective
1753 // if the final download URL is in the same origin as the initial download URL.
1754 // Test that this holds even if there are cross origin redirects in the middle
1755 // of the redirect chain.
1756 IN_PROC_BROWSER_TEST_F(DownloadContentTest,
1757 DownloadAttributeSameOriginRedirect) {
1758 EmbeddedTestServer origin_one;
1759 EmbeddedTestServer origin_two;
1760 ASSERT_TRUE(origin_one.InitializeAndWaitUntilReady());
1761 ASSERT_TRUE(origin_two.InitializeAndWaitUntilReady());
1762
1763 // The download-attribute.html page contains an anchor element whose href is
1764 // set to the value of the query parameter (specified as |target| in the URL
1765 // below). The suggested filename for the anchor is 'suggested-filename'. When
1766 // the page is loaded, a script simulates a click on the anchor, triggering a
1767 // download of the target URL.
1768 //
1769 // We construct two test servers; origin_one and origin_two. Once started, the
1770 // server URLs will differ by the port number. Therefore they will be in
1771 // different origins.
1772 GURL download_url = origin_one.GetURL("/ping");
1773 GURL referrer_url = origin_one.GetURL(
1774 std::string("/download-attribute.html?target=") + download_url.spec());
1775 origin_one.ServeFilesFromDirectory(GetTestFilePath("download", ""));
1776
1777 // <origin_one>/download-attribute.html initiates a download of
1778 // <origin_one>/ping, which redirects to <origin_two>/pong, and then finally
1779 // to <origin_one>/download.
1780 origin_one.RegisterRequestHandler(
1781 CreateRedirectHandler("/ping", origin_two.GetURL("/pong")));
1782 origin_two.RegisterRequestHandler(
1783 CreateRedirectHandler("/pong", origin_one.GetURL("/download")));
1784 origin_one.RegisterRequestHandler(CreateBasicResponseHandler(
1785 "/download", "application/octet-stream", "Hello"));
1786
1787 NavigateToURLAndWaitForDownload(
1788 shell(), referrer_url, DownloadItem::COMPLETE);
1789
1790 std::vector<DownloadItem*> downloads;
1791 DownloadManagerForShell(shell())->GetAllDownloads(&downloads);
1792 ASSERT_EQ(1u, downloads.size());
1793
1794 EXPECT_EQ(FILE_PATH_LITERAL("suggested-filename"),
1795 downloads[0]->GetTargetFilePath().BaseName().value());
1796 ASSERT_TRUE(origin_one.ShutdownAndWaitUntilComplete());
1797 ASSERT_TRUE(origin_two.ShutdownAndWaitUntilComplete());
1798 }
1799
1654 } // namespace content 1800 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | content/browser/download/download_resource_handler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698