#include "chrome/browser/download/download_request_limiter.h"
#include <memory>
#include "base/command_line.h"
#include "base/functional/bind.h"
#include "base/run_loop.h"
#include "base/test/scoped_feature_list.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
#include "chrome/browser/download/download_permission_request.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/content_settings/core/common/content_settings.h"
#include "components/content_settings/core/common/content_settings_types.h"
#include "components/permissions/features.h"
#include "components/permissions/permission_request_manager.h"
#include "components/permissions/test/mock_permission_prompt_factory.h"
#include "content/public/browser/navigation_controller.h"
#include "content/public/browser/navigation_details.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/navigation_simulator.h"
#include "content/public/test/web_contents_tester.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/input/web_gesture_event.h"
#include "third_party/blink/public/common/input/web_keyboard_event.h"
#include "third_party/blink/public/common/input/web_mouse_event.h"
#include "third_party/blink/public/common/input/web_touch_event.h"
#if BUILDFLAG(IS_ANDROID)
#include "chrome/browser/flags/android/chrome_feature_list.h"
#endif
using content::WebContents;
namespace {
enum TestingAction {
ACCEPT,
CANCEL,
WAIT
};
}
class DownloadRequestLimiterTest : public ChromeRenderViewHostTestHarness {
public:
void SetUp() override {
ChromeRenderViewHostTestHarness::SetUp();
permissions::PermissionRequestManager::CreateForWebContents(web_contents());
permissions::PermissionRequestManager* manager =
permissions::PermissionRequestManager::FromWebContents(web_contents());
mock_permission_prompt_factory_ =
std::make_unique<permissions::MockPermissionPromptFactory>(manager);
UpdateExpectations(ACCEPT);
cancel_count_ = continue_count_ = 0;
download_request_limiter_ = new DownloadRequestLimiter();
}
void TearDown() override {
mock_permission_prompt_factory_.reset();
ChromeRenderViewHostTestHarness::TearDown();
}
void CanDownload(const GURL& url) { CanDownloadFor(url, web_contents()); }
void CanDownloadFor(const GURL& url, WebContents* web_contents) {
CanDownloadFor(url, web_contents, std::nullopt);
}
void CanDownloadFor(const GURL& url,
WebContents* web_contents,
std::optional<url::Origin> origin) {
download_request_limiter_->CanDownloadImpl(
url, web_contents,
"GET",
std::move(origin),
false,
base::BindOnce(&DownloadRequestLimiterTest::ContinueDownload,
base::Unretained(this)));
base::RunLoop().RunUntilIdle();
}
void OnUserInteraction(blink::WebInputEvent::Type type) {
OnUserInteractionFor(web_contents(), type);
}
void OnUserInteractionFor(WebContents* web_contents,
blink::WebInputEvent::Type type) {
DownloadRequestLimiter::TabDownloadState* state =
download_request_limiter_->GetDownloadState(web_contents, false);
if (!state)
return;
std::unique_ptr<blink::WebInputEvent> event;
switch (type) {
case blink::WebInputEvent::Type::kRawKeyDown:
event = std::make_unique<blink::WebKeyboardEvent>();
break;
case blink::WebInputEvent::Type::kGestureScrollBegin:
event = std::make_unique<blink::WebGestureEvent>();
break;
case blink::WebInputEvent::Type::kMouseDown:
event = std::make_unique<blink::WebMouseEvent>();
break;
case blink::WebInputEvent::Type::kTouchStart:
event = std::make_unique<blink::WebTouchEvent>();
break;
default:
NOTREACHED();
}
event->SetType(type);
state->DidGetUserInteraction(*event);
}
void ExpectAndResetCounts(
int expect_continues,
int expect_cancels,
int expect_asks,
int line) {
EXPECT_EQ(expect_continues, continue_count_) << "line " << line;
EXPECT_EQ(expect_cancels, cancel_count_) << "line " << line;
EXPECT_EQ(expect_asks, AskAllowCount()) << "line " << line;
continue_count_ = cancel_count_ = 0;
mock_permission_prompt_factory_->ResetCounts();
}
void UpdateContentSettings(WebContents* web_contents,
ContentSetting setting) {
download_request_limiter_->GetDownloadState(web_contents, true);
SetHostContentSetting(web_contents, setting);
}
protected:
const GURL kTestURL = GURL("http://foo.com/bar");
void ContinueDownload(bool allow) {
if (allow) {
continue_count_++;
} else {
cancel_count_++;
}
}
void SetHostContentSetting(WebContents* contents, ContentSetting setting) {
SetHostContentSetting(contents, contents->GetURL(), setting);
}
void SetHostContentSetting(WebContents* contents,
const GURL& host,
ContentSetting setting) {
HostContentSettingsMapFactory::GetForProfile(
Profile::FromBrowserContext(contents->GetBrowserContext()))
->SetContentSettingDefaultScope(
host, GURL(), ContentSettingsType::AUTOMATIC_DOWNLOADS, setting);
}
void LoadCompleted() {
mock_permission_prompt_factory_
->DocumentOnLoadCompletedInPrimaryMainFrame();
}
int AskAllowCount() { return mock_permission_prompt_factory_->show_count(); }
void UpdateExpectations(TestingAction action) {
permissions::PermissionRequestManager::AutoResponseType response_type =
permissions::PermissionRequestManager::DISMISS;
switch (action) {
case ACCEPT:
response_type = permissions::PermissionRequestManager::ACCEPT_ALL;
break;
case CANCEL:
response_type = permissions::PermissionRequestManager::DENY_ALL;
break;
case WAIT:
response_type = permissions::PermissionRequestManager::NONE;
break;
}
mock_permission_prompt_factory_->set_response_type(response_type);
}
scoped_refptr<DownloadRequestLimiter> download_request_limiter_;
int continue_count_;
int cancel_count_;
std::unique_ptr<permissions::MockPermissionPromptFactory>
mock_permission_prompt_factory_;
};
TEST_F(DownloadRequestLimiterTest, Allow) {
NavigateAndCommit(kTestURL);
LoadCompleted();
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownload(kTestURL);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
ExpectAndResetCounts(1, 0, 0, __LINE__);
UpdateExpectations(ACCEPT);
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 1, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_ALLOWED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_ALLOWED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
}
TEST_F(DownloadRequestLimiterTest, ResetOnNavigation) {
NavigateAndCommit(kTestURL);
LoadCompleted();
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
UpdateExpectations(ACCEPT);
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 1, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_ALLOWED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
NavigateAndCommit(GURL("http://foo.com/bar2"));
LoadCompleted();
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_ALLOWED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
OnUserInteraction(blink::WebInputEvent::Type::kRawKeyDown);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_ALLOWED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
GURL different_host("http://fooey.com");
NavigateAndCommit(different_host);
LoadCompleted();
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownload(different_host);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
UpdateExpectations(CANCEL);
CanDownload(different_host);
ExpectAndResetCounts(0, 1, 1, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_BLOCKED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
NavigateAndCommit(GURL("http://fooey.com/bar2"));
LoadCompleted();
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownload(different_host);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownload(different_host);
ExpectAndResetCounts(0, 1, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_BLOCKED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
}
TEST_F(DownloadRequestLimiterTest, RendererInitiated) {
NavigateAndCommit(kTestURL);
LoadCompleted();
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
content::NavigationSimulator::NavigateAndCommitFromDocument(
GURL("http://foo.com/bar2"), web_contents()->GetPrimaryMainFrame());
LoadCompleted();
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
content::NavigationSimulator::NavigateAndCommitFromDocument(
GURL("http://fooey.com/bar"), web_contents()->GetPrimaryMainFrame());
LoadCompleted();
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
content::RenderFrameHostTester* rfh_tester =
content::RenderFrameHostTester::For(
web_contents()->GetPrimaryMainFrame());
content::RenderFrameHost* subframe = rfh_tester->AppendChild("subframe");
subframe = content::NavigationSimulator::NavigateAndCommitFromDocument(
GURL("http://foo.com"), subframe);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
subframe = content::NavigationSimulator::NavigateAndCommitFromDocument(
GURL("http://foobargoo.com"), subframe);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
UpdateExpectations(CANCEL);
CanDownload(kTestURL);
ExpectAndResetCounts(0, 1, 1, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_BLOCKED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
content::NavigationSimulator::NavigateAndCommitFromDocument(
GURL("http://fooey.com/bar2"), web_contents()->GetPrimaryMainFrame());
LoadCompleted();
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
content::NavigationSimulator::NavigateAndCommitFromDocument(
GURL("http://foo.com/bar"), web_contents()->GetPrimaryMainFrame());
LoadCompleted();
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
rfh_tester = content::RenderFrameHostTester::For(
web_contents()->GetPrimaryMainFrame());
subframe = rfh_tester->AppendChild("subframe");
subframe = content::NavigationSimulator::NavigateAndCommitFromDocument(
GURL("http://foo.com"), subframe);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
subframe = content::NavigationSimulator::NavigateAndCommitFromDocument(
GURL("http://foobarfoo.com"), subframe);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
GURL different_host("http://foobar.com");
NavigateAndCommit(different_host);
LoadCompleted();
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownload(different_host);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
UpdateExpectations(ACCEPT);
CanDownload(different_host);
ExpectAndResetCounts(1, 0, 1, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_ALLOWED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
content::NavigationSimulator::NavigateAndCommitFromDocument(
GURL("http://foobar.com/bar"), web_contents()->GetPrimaryMainFrame());
LoadCompleted();
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
rfh_tester = content::RenderFrameHostTester::For(
web_contents()->GetPrimaryMainFrame());
subframe = rfh_tester->AppendChild("subframe");
subframe = content::NavigationSimulator::NavigateAndCommitFromDocument(
GURL("http://foobar.com/bar"), subframe);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
subframe = content::NavigationSimulator::NavigateAndCommitFromDocument(
GURL("http://foobarfoo.com/"), subframe);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
content::NavigationSimulator::NavigateAndCommitFromDocument(
GURL("http://foo.com"), web_contents()->GetPrimaryMainFrame());
LoadCompleted();
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownload(different_host);
ExpectAndResetCounts(1, 0, 0, __LINE__);
}
TEST_F(DownloadRequestLimiterTest, HistoryBack) {
NavigateAndCommit(kTestURL);
LoadCompleted();
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
content::NavigationSimulator::NavigateAndCommitFromDocument(
GURL("http://foobar.com/bar"), web_contents()->GetPrimaryMainFrame());
LoadCompleted();
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
auto backward_navigation =
content::NavigationSimulator::CreateHistoryNavigation(
-1 , web_contents(), false );
backward_navigation->Start();
backward_navigation->Commit();
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
NavigateAndCommit(GURL("http://foobar.com"));
LoadCompleted();
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
backward_navigation = content::NavigationSimulator::CreateHistoryNavigation(
-1 , web_contents(), false );
backward_navigation->Start();
backward_navigation->Commit();
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
}
TEST_F(DownloadRequestLimiterTest, HistoryForwardBack) {
NavigateAndCommit(kTestURL);
LoadCompleted();
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
content::NavigationSimulator::NavigateAndCommitFromDocument(
GURL("http://foobar.com/bar"), web_contents()->GetPrimaryMainFrame());
LoadCompleted();
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
auto backward_navigation =
content::NavigationSimulator::CreateHistoryNavigation(
-1 , web_contents(), false );
backward_navigation->Start();
backward_navigation->Commit();
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
auto forward_navigation =
content::NavigationSimulator::CreateHistoryNavigation(
1 , web_contents(), false );
forward_navigation->Start();
forward_navigation->Commit();
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
backward_navigation = content::NavigationSimulator::CreateHistoryNavigation(
-1 , web_contents(), false );
backward_navigation->Start();
backward_navigation->Commit();
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
}
TEST_F(DownloadRequestLimiterTest, DownloadRequestLimiter_ResetOnUserGesture) {
NavigateAndCommit(kTestURL);
LoadCompleted();
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
OnUserInteraction(blink::WebInputEvent::Type::kGestureScrollBegin);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
OnUserInteraction(blink::WebInputEvent::Type::kMouseDown);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
OnUserInteraction(blink::WebInputEvent::Type::kTouchStart);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
OnUserInteraction(blink::WebInputEvent::Type::kRawKeyDown);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
UpdateExpectations(CANCEL);
CanDownload(kTestURL);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_BLOCKED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
ExpectAndResetCounts(0, 1, 1, __LINE__);
OnUserInteraction(blink::WebInputEvent::Type::kMouseDown);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_BLOCKED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownload(kTestURL);
ExpectAndResetCounts(0, 1, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_BLOCKED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
}
TEST_F(DownloadRequestLimiterTest, ResetOnReload) {
NavigateAndCommit(kTestURL);
LoadCompleted();
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
content::NavigationSimulator::Reload(web_contents());
LoadCompleted();
base::RunLoop().RunUntilIdle();
ExpectAndResetCounts(0, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
UpdateExpectations(WAIT);
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownload(kTestURL);
ExpectAndResetCounts(0, 0, 1, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
content::NavigationSimulator::Reload(web_contents());
LoadCompleted();
base::RunLoop().RunUntilIdle();
ExpectAndResetCounts(0, 1, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownload(kTestURL);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
ExpectAndResetCounts(1, 0, 0, __LINE__);
UpdateExpectations(CANCEL);
CanDownload(kTestURL);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_BLOCKED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
ExpectAndResetCounts(0, 1, 1, __LINE__);
content::NavigationSimulator::Reload(web_contents());
LoadCompleted();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownload(kTestURL);
ExpectAndResetCounts(0, 1, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_BLOCKED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
content::NavigationSimulator::NavigateAndCommitFromDocument(
GURL("http://foo.com/bar"), web_contents()->GetPrimaryMainFrame());
LoadCompleted();
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
}
TEST_F(DownloadRequestLimiterTest, RawWebContents) {
std::unique_ptr<WebContents> web_contents(CreateTestWebContents());
web_contents->GetController().LoadURL(
kTestURL, content::Referrer(), ui::PAGE_TRANSITION_LINK, std::string());
ExpectAndResetCounts(0, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents.get()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents.get()));
CanDownloadFor(kTestURL, web_contents.get());
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents.get()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents.get()));
OnUserInteractionFor(web_contents.get(),
blink::WebInputEvent::Type::kTouchStart);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents.get()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents.get()));
CanDownloadFor(kTestURL, web_contents.get());
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents.get()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents.get()));
CanDownloadFor(kTestURL, web_contents.get());
ExpectAndResetCounts(0, 1, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents.get()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_BLOCKED,
download_request_limiter_->GetDownloadUiStatus(web_contents.get()));
OnUserInteractionFor(web_contents.get(),
blink::WebInputEvent::Type::kRawKeyDown);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents.get()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents.get()));
CanDownloadFor(kTestURL, web_contents.get());
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents.get()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents.get()));
}
TEST_F(DownloadRequestLimiterTest, SetHostContentSetting) {
NavigateAndCommit(kTestURL);
LoadCompleted();
SetHostContentSetting(web_contents(), CONTENT_SETTING_ALLOW);
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
download_request_limiter_->GetDownloadStatus(web_contents()));
SetHostContentSetting(web_contents(), CONTENT_SETTING_BLOCK);
CanDownload(kTestURL);
ExpectAndResetCounts(0, 1, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
CanDownload(kTestURL);
ExpectAndResetCounts(0, 1, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
}
TEST_F(DownloadRequestLimiterTest, ContentSettingChanged) {
NavigateAndCommit(kTestURL);
LoadCompleted();
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
UpdateExpectations(CANCEL);
CanDownload(kTestURL);
ExpectAndResetCounts(0, 1, 1, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
UpdateContentSettings(web_contents(), CONTENT_SETTING_ALLOW);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
download_request_limiter_->GetDownloadStatus(web_contents()));
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
download_request_limiter_->GetDownloadStatus(web_contents()));
UpdateContentSettings(web_contents(), CONTENT_SETTING_BLOCK);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
CanDownload(kTestURL);
ExpectAndResetCounts(0, 1, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
UpdateContentSettings(web_contents(), CONTENT_SETTING_ASK);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
UpdateExpectations(WAIT);
CanDownload(kTestURL);
ExpectAndResetCounts(0, 0, 1, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
}
TEST_F(DownloadRequestLimiterTest, RendererInitiatedDownloadFromAnotherOrigin) {
NavigateAndCommit(kTestURL);
LoadCompleted();
SetHostContentSetting(web_contents(), GURL("http://foobar.com"),
CONTENT_SETTING_BLOCK);
CanDownloadFor(kTestURL, web_contents(),
url::Origin::Create(GURL("http://foobar.com")));
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownloadFor(kTestURL, web_contents());
ExpectAndResetCounts(1, 0, 1, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_ALLOWED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
SetHostContentSetting(web_contents(), GURL("http://foobar.com"),
CONTENT_SETTING_ALLOW);
CanDownloadFor(kTestURL, web_contents(),
url::Origin::Create(GURL("http://foobar.com")));
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_ALLOWED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownloadFor(kTestURL, web_contents());
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_ALLOWED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownloadFor(kTestURL, web_contents(),
url::Origin::Create(GURL("http://foobar.com")));
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_ALLOWED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
}
TEST_F(DownloadRequestLimiterTest,
DownloadStatusForOtherOriginsNotResetOnUserInteraction) {
NavigateAndCommit(kTestURL);
LoadCompleted();
CanDownloadFor(kTestURL, web_contents(),
url::Origin::Create(GURL("http://foobar.com")));
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
UpdateExpectations(CANCEL);
CanDownloadFor(kTestURL, web_contents());
ExpectAndResetCounts(0, 1, 1, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_BLOCKED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
OnUserInteraction(blink::WebInputEvent::Type::kTouchStart);
CanDownloadFor(kTestURL, web_contents());
ExpectAndResetCounts(0, 1, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_BLOCKED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownloadFor(kTestURL, web_contents(),
url::Origin::Create(GURL("http://foobar.com")));
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
UpdateExpectations(CANCEL);
CanDownloadFor(kTestURL, web_contents(),
url::Origin::Create(GURL("http://foobar.com")));
ExpectAndResetCounts(0, 1, 1, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_BLOCKED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
}
TEST_F(DownloadRequestLimiterTest, OpaqueOrigins) {
NavigateAndCommit(GURL("about:blank"));
LoadCompleted();
url::Origin origin;
CanDownloadFor(kTestURL, web_contents(), origin);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownloadFor(kTestURL, web_contents(), origin);
ExpectAndResetCounts(0, 1, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownloadFor(kTestURL, web_contents());
ExpectAndResetCounts(1, 0, 1, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_ALLOWED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
}
TEST_F(DownloadRequestLimiterTest,
EmptyRequestInitiator_BrowserInitiatedDownload) {
NavigateAndCommit(kTestURL);
LoadCompleted();
GURL download_url("http://test.com/abc");
CanDownload(download_url);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
SetHostContentSetting(web_contents(), GURL("http://test.com"),
CONTENT_SETTING_BLOCK);
CanDownload(download_url);
ExpectAndResetCounts(0, 1, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_BLOCKED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
}
TEST_F(DownloadRequestLimiterTest,
EmptyRequestInitiator_DownloadWithOpaqueOrigin) {
NavigateAndCommit(kTestURL);
LoadCompleted();
GURL download_url("about:blank");
CanDownload(download_url);
ExpectAndResetCounts(1, 0, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownload(download_url);
ExpectAndResetCounts(0, 1, 0, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 1, __LINE__);
EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
download_request_limiter_->GetDownloadStatus(web_contents()));
EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_ALLOWED,
download_request_limiter_->GetDownloadUiStatus(web_contents()));
}
TEST_F(DownloadRequestLimiterTest, SetContentSetting_LastVisited_Tracked) {
base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(
permissions::features::
kSafetyHubUnusedPermissionRevocationForAllSurfaces);
NavigateAndCommit(kTestURL);
LoadCompleted();
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
UpdateExpectations(ACCEPT);
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 1, __LINE__);
base::Time now = base::Time::Now();
content_settings::SettingInfo info;
HostContentSettingsMap* hcsm = HostContentSettingsMapFactory::GetForProfile(
Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
hcsm->GetWebsiteSetting(kTestURL, kTestURL,
ContentSettingsType::AUTOMATIC_DOWNLOADS, &info);
EXPECT_GE(info.metadata.last_visited(), now - base::Days(7));
EXPECT_LE(info.metadata.last_visited(), now);
}
TEST_F(DownloadRequestLimiterTest,
SetContentSetting_LastVisited_NotTracked_WrongValue) {
base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(
permissions::features::
kSafetyHubUnusedPermissionRevocationForAllSurfaces);
NavigateAndCommit(kTestURL);
LoadCompleted();
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
UpdateExpectations(CANCEL);
CanDownload(kTestURL);
ExpectAndResetCounts(0, 1, 1, __LINE__);
content_settings::SettingInfo info;
HostContentSettingsMap* hcsm = HostContentSettingsMapFactory::GetForProfile(
Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
hcsm->GetWebsiteSetting(kTestURL, kTestURL,
ContentSettingsType::AUTOMATIC_DOWNLOADS, &info);
EXPECT_EQ(base::Time(), info.metadata.last_visited());
}
TEST_F(DownloadRequestLimiterTest,
SetContentSetting_LastVisited_NotTracked_FeatureOff) {
base::test::ScopedFeatureList feature_list;
feature_list.InitAndDisableFeature(
permissions::features::
kSafetyHubUnusedPermissionRevocationForAllSurfaces);
NavigateAndCommit(kTestURL);
LoadCompleted();
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 0, __LINE__);
UpdateExpectations(ACCEPT);
CanDownload(kTestURL);
ExpectAndResetCounts(1, 0, 1, __LINE__);
content_settings::SettingInfo info;
HostContentSettingsMap* hcsm = HostContentSettingsMapFactory::GetForProfile(
Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
hcsm->GetWebsiteSetting(kTestURL, kTestURL,
ContentSettingsType::AUTOMATIC_DOWNLOADS, &info);
EXPECT_EQ(base::Time(), info.metadata.last_visited());
}