Chromium Code Reviews| Index: chrome/browser/download/download_request_limiter_unittest.cc |
| diff --git a/chrome/browser/download/download_request_limiter_unittest.cc b/chrome/browser/download/download_request_limiter_unittest.cc |
| index e5c3e4569cd5bc0a9f206df1180db3c2fb0573fe..8e501e63babb427f027fe135806b1da56823473c 100644 |
| --- a/chrome/browser/download/download_request_limiter_unittest.cc |
| +++ b/chrome/browser/download/download_request_limiter_unittest.cc |
| @@ -19,6 +19,7 @@ |
| #include "content/public/browser/notification_source.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/common/frame_navigate_params.h" |
| +#include "content/public/test/web_contents_tester.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #if defined(OS_ANDROID) |
| @@ -237,6 +238,12 @@ class DownloadRequestLimiterTest : public ChromeRenderViewHostTestHarness { |
| testing_delegate_.UpdateExpectations(action); |
| } |
| + void NavigateAndCommitWithParams( |
| + content::NavigationController::LoadURLParams& params) { |
| + controller().LoadURLWithParams(params); |
| + content::WebContentsTester::For(web_contents())->CommitPendingNavigation(); |
| + } |
| + |
| scoped_refptr<DownloadRequestLimiter> download_request_limiter_; |
| // Number of times ContinueDownload was invoked. |
| @@ -322,7 +329,8 @@ TEST_F(DownloadRequestLimiterTest, DownloadRequestLimiter_ResetOnNavigation) { |
| ASSERT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD, |
| download_request_limiter_->GetDownloadStatus(web_contents())); |
| - // Do two downloads, allowing the second so that we end up with allow all. |
| + // Do two downloads, blocking the second so that we end up with downloads not |
| + // allowed. |
| CanDownload(); |
| ExpectAndResetCounts(1, 0, 0, __LINE__); |
| ASSERT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD, |
| @@ -344,6 +352,92 @@ TEST_F(DownloadRequestLimiterTest, DownloadRequestLimiter_ResetOnNavigation) { |
| download_request_limiter_->GetDownloadStatus(web_contents())); |
| } |
| +TEST_F(DownloadRequestLimiterTest, DownloadRequestLimiter_RendererInitiated) { |
|
asanka
2016/05/19 02:18:30
Could you add a test for navigation in an iframe?
dominickn
2016/05/19 07:25:45
Done.
|
| + NavigateAndCommit(GURL("http://foo.com/bar")); |
| + LoadCompleted(); |
| + |
| + // Do one download so we end up in PROMPT. |
| + CanDownload(); |
| + ExpectAndResetCounts(1, 0, 0, __LINE__); |
| + ASSERT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD, |
| + download_request_limiter_->GetDownloadStatus(web_contents())); |
| + |
| + // Set up a renderer-initiated navigation to the same host. |
| + content::NavigationController::LoadURLParams load_params( |
| + GURL("http://foo.com/bar2")); |
| + load_params.is_renderer_initiated = true; |
| + load_params.transition_type = ui::PAGE_TRANSITION_GENERATED; |
| + load_params.referrer = content::Referrer(); |
| + NavigateAndCommitWithParams(load_params); |
| + LoadCompleted(); |
| + |
| + // The state should not be reset. |
| + ASSERT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD, |
| + download_request_limiter_->GetDownloadStatus(web_contents())); |
| + |
| + // Renderer-initiated nav to a different host shouldn't reset the state. |
| + load_params.url = GURL("http://fooey.com/bar"); |
| + NavigateAndCommitWithParams(load_params); |
| + LoadCompleted(); |
| + ASSERT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD, |
| + download_request_limiter_->GetDownloadStatus(web_contents())); |
| + |
| + // Set up a blocked state. |
| + UpdateExpectations(CANCEL); |
| + CanDownload(); |
| + ExpectAndResetCounts(0, 1, 1, __LINE__); |
| + ASSERT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED, |
| + download_request_limiter_->GetDownloadStatus(web_contents())); |
| + |
| + // The state should not be reset on a renderer-initiated load to either the |
| + // same host or a different host. |
| + load_params.url = GURL("http://fooeybar.com/bar"); |
| + NavigateAndCommitWithParams(load_params); |
| + LoadCompleted(); |
| + ASSERT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED, |
| + download_request_limiter_->GetDownloadStatus(web_contents())); |
| + |
| + load_params.url = GURL("http://foo.com/bar"); |
| + NavigateAndCommitWithParams(load_params); |
| + LoadCompleted(); |
| + ASSERT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED, |
| + download_request_limiter_->GetDownloadStatus(web_contents())); |
| + |
| + // Browser-initiated navigation to a different host, which should reset the |
| + // state. |
| + NavigateAndCommit(GURL("http://foobar.com")); |
| + LoadCompleted(); |
| + ASSERT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD, |
| + download_request_limiter_->GetDownloadStatus(web_contents())); |
| + |
| + // Set up an allow all state. |
| + CanDownload(); |
| + ExpectAndResetCounts(1, 0, 0, __LINE__); |
| + ASSERT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD, |
| + download_request_limiter_->GetDownloadStatus(web_contents())); |
| + |
| + UpdateExpectations(ACCEPT); |
| + CanDownload(); |
| + ExpectAndResetCounts(1, 0, 1, __LINE__); |
| + ASSERT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS, |
| + download_request_limiter_->GetDownloadStatus(web_contents())); |
| + |
| + // The state should not be reset on a pending renderer-initiated load to |
| + // the same host. |
| + load_params.url = GURL("http://foobar.com/bar"); |
| + NavigateAndCommitWithParams(load_params); |
| + LoadCompleted(); |
| + ASSERT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS, |
| + download_request_limiter_->GetDownloadStatus(web_contents())); |
| + |
| + // But a pending load to a different host should reset the state. |
| + load_params.url = GURL("http://foo.com"); |
| + NavigateAndCommitWithParams(load_params); |
| + LoadCompleted(); |
| + ASSERT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD, |
| + download_request_limiter_->GetDownloadStatus(web_contents())); |
| +} |
| + |
| TEST_F(DownloadRequestLimiterTest, DownloadRequestLimiter_ResetOnUserGesture) { |
| NavigateAndCommit(GURL("http://foo.com/bar")); |
| LoadCompleted(); |