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..ae27609eff61e75be5158e168b4cb37c97fdf07a 100644 |
--- a/chrome/browser/download/download_request_limiter_unittest.cc |
+++ b/chrome/browser/download/download_request_limiter_unittest.cc |
@@ -18,6 +18,7 @@ |
#include "content/public/browser/notification_service.h" |
#include "content/public/browser/notification_source.h" |
#include "content/public/browser/web_contents.h" |
+#include "content/public/common/browser_side_navigation_policy.h" |
#include "content/public/common/frame_navigate_params.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -344,6 +345,90 @@ TEST_F(DownloadRequestLimiterTest, DownloadRequestLimiter_ResetOnNavigation) { |
download_request_limiter_->GetDownloadStatus(web_contents())); |
} |
+TEST_F(DownloadRequestLimiterTest, DownloadRequestLimiter_RendererInitiated) { |
+ // This test will only work when browser-side navigation enabled, as the |
+ // renderer initiated navigation check will always return false otherwise. |
+ if (content::IsBrowserSideNavigationEnabled()) { |
+ 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 pending renderer-initiated download 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(); |
+ controller().LoadURLWithParams(load_params); |
+ |
+ // The state should not be reset. |
+ ASSERT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD, |
+ download_request_limiter_->GetDownloadStatus(web_contents())); |
+ |
+ // Pending renderer-initiated navigation to a different host should not |
+ // reset the state. |
+ load_params.url = GURL("http://fooey.com/bar"); |
+ 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 pending renderer-initiated load to |
+ // either the same host or a different host. |
+ load_params.url = GURL("http://fooeybar.com/bar"); |
+ controller().LoadURLWithParams(load_params); |
+ ASSERT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED, |
+ download_request_limiter_->GetDownloadStatus(web_contents())); |
+ |
+ load_params.url = GURL("http://foo.com/bar"); |
+ controller().LoadURLWithParams(load_params); |
+ 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"); |
+ controller().LoadURLWithParams(load_params); |
+ 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"); |
+ controller().LoadURLWithParams(load_params); |
+ ASSERT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD, |
+ download_request_limiter_->GetDownloadStatus(web_contents())); |
+ } |
+} |
+ |
TEST_F(DownloadRequestLimiterTest, DownloadRequestLimiter_ResetOnUserGesture) { |
NavigateAndCommit(GURL("http://foo.com/bar")); |
LoadCompleted(); |