| Index: chrome/browser/download/chrome_download_manager_delegate_unittest.cc
|
| diff --git a/chrome/browser/download/chrome_download_manager_delegate_unittest.cc b/chrome/browser/download/chrome_download_manager_delegate_unittest.cc
|
| index 69a2b43417903f7725de4acc9591b5ecbaa86919..ed6f7b6df6918371a43f614a23102951aa426fcf 100644
|
| --- a/chrome/browser/download/chrome_download_manager_delegate_unittest.cc
|
| +++ b/chrome/browser/download/chrome_download_manager_delegate_unittest.cc
|
| @@ -239,6 +239,7 @@ class ChromeDownloadManagerDelegateTest
|
| TestChromeDownloadManagerDelegate* delegate();
|
| content::MockDownloadManager* download_manager();
|
| DownloadPrefs* download_prefs();
|
| + PrefService* pref_service();
|
|
|
| private:
|
| sync_preferences::TestingPrefServiceSyncable* pref_service_;
|
| @@ -392,6 +393,10 @@ DownloadPrefs* ChromeDownloadManagerDelegateTest::download_prefs() {
|
| return delegate_->download_prefs();
|
| }
|
|
|
| +PrefService* ChromeDownloadManagerDelegateTest::pref_service() {
|
| + return pref_service_;
|
| +}
|
| +
|
| } // namespace
|
|
|
| TEST_F(ChromeDownloadManagerDelegateTest, LastSavePath) {
|
| @@ -574,6 +579,40 @@ TEST_F(ChromeDownloadManagerDelegateTest, CheckForFileExistence) {
|
| EXPECT_FALSE(CheckForFileExistence(download_item.get()));
|
| }
|
|
|
| +TEST_F(ChromeDownloadManagerDelegateTest, BlockedByPolicy) {
|
| + const GURL kUrl("http://example.com/foo");
|
| + const std::string kTargetDisposition("attachment; filename=\"foo.txt\"");
|
| +
|
| + std::unique_ptr<content::MockDownloadItem> download_item =
|
| + CreateActiveDownloadItem(0);
|
| + EXPECT_CALL(*download_item, GetURL()).WillRepeatedly(ReturnRef(kUrl));
|
| + EXPECT_CALL(*download_item, GetContentDisposition())
|
| + .WillRepeatedly(Return(kTargetDisposition));
|
| +
|
| + base::FilePath kExpectedPath = GetPathInDownloadDir("bar.txt");
|
| +
|
| + DetermineDownloadTargetResult result;
|
| +
|
| + EXPECT_CALL(*delegate(), MockReserveVirtualPath(_, _, _, _, _))
|
| + .WillOnce(DoAll(SetArgPointee<4>(PathValidationResult::CONFLICT),
|
| + ReturnArg<1>()));
|
| + EXPECT_CALL(
|
| + *delegate(),
|
| + RequestConfirmation(_, _, DownloadConfirmationReason::TARGET_CONFLICT, _))
|
| + .WillOnce(WithArg<3>(ScheduleCallback2(
|
| + DownloadConfirmationResult::CONFIRMED, kExpectedPath)));
|
| +
|
| + pref_service()->SetInteger(
|
| + prefs::kDownloadRestrictions,
|
| + static_cast<int>(DownloadPrefs::DownloadRestriction::ALL_FILES));
|
| +
|
| + DetermineDownloadTarget(download_item.get(), &result);
|
| + EXPECT_EQ(content::DOWNLOAD_INTERRUPT_REASON_FILE_BLOCKED,
|
| + result.interrupt_reason);
|
| +
|
| + VerifyAndClearExpectations();
|
| +}
|
| +
|
| #if defined(FULL_SAFE_BROWSING)
|
| namespace {
|
|
|
| @@ -581,8 +620,10 @@ struct SafeBrowsingTestParameters {
|
| content::DownloadDangerType initial_danger_type;
|
| DownloadFileType::DangerLevel initial_danger_level;
|
| safe_browsing::DownloadProtectionService::DownloadCheckResult verdict;
|
| + DownloadPrefs::DownloadRestriction download_restriction;
|
|
|
| content::DownloadDangerType expected_danger_type;
|
| + bool blocked;
|
| };
|
|
|
| class TestDownloadProtectionService
|
| @@ -631,106 +672,165 @@ const SafeBrowsingTestParameters kSafeBrowsingTestCases[] = {
|
| {content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
|
| DownloadFileType::NOT_DANGEROUS,
|
| safe_browsing::DownloadProtectionService::SAFE,
|
| + DownloadPrefs::DownloadRestriction::NONE,
|
|
|
| - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS},
|
| + content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
|
| + /*blocked=*/false},
|
|
|
| // UNKNOWN verdict for a safe file.
|
| {content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
|
| DownloadFileType::NOT_DANGEROUS,
|
| safe_browsing::DownloadProtectionService::UNKNOWN,
|
| + DownloadPrefs::DownloadRestriction::NONE,
|
|
|
| - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS},
|
| + content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
|
| + /*blocked=*/false},
|
|
|
| // DANGEROUS verdict for a safe file.
|
| {content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
|
| DownloadFileType::NOT_DANGEROUS,
|
| safe_browsing::DownloadProtectionService::DANGEROUS,
|
| + DownloadPrefs::DownloadRestriction::NONE,
|
|
|
| - content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT},
|
| + content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT,
|
| + /*blocked=*/false},
|
|
|
| // UNCOMMON verdict for a safe file.
|
| {content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
|
| DownloadFileType::NOT_DANGEROUS,
|
| safe_browsing::DownloadProtectionService::UNCOMMON,
|
| + DownloadPrefs::DownloadRestriction::NONE,
|
|
|
| - content::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT},
|
| + content::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT,
|
| + /*blocked=*/false},
|
|
|
| // POTENTIALLY_UNWANTED verdict for a safe file.
|
| {content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
|
| DownloadFileType::NOT_DANGEROUS,
|
| safe_browsing::DownloadProtectionService::POTENTIALLY_UNWANTED,
|
| + DownloadPrefs::DownloadRestriction::NONE,
|
|
|
| - content::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED},
|
| + content::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED,
|
| + /*blocked=*/false},
|
|
|
| // SAFE verdict for a potentially dangerous file.
|
| {content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
|
| DownloadFileType::ALLOW_ON_USER_GESTURE,
|
| safe_browsing::DownloadProtectionService::SAFE,
|
| + DownloadPrefs::DownloadRestriction::NONE,
|
|
|
| - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS},
|
| + content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
|
| + /*blocked=*/false},
|
|
|
| // UNKNOWN verdict for a potentially dangerous file.
|
| {content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
|
| DownloadFileType::ALLOW_ON_USER_GESTURE,
|
| safe_browsing::DownloadProtectionService::UNKNOWN,
|
| + DownloadPrefs::DownloadRestriction::NONE,
|
|
|
| - content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE},
|
| + content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE,
|
| + /*blocked=*/false},
|
| +
|
| + // UNKNOWN verdict for a potentially dangerous file blocked by policy.
|
| + {content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
|
| + DownloadFileType::ALLOW_ON_USER_GESTURE,
|
| + safe_browsing::DownloadProtectionService::UNKNOWN,
|
| + DownloadPrefs::DownloadRestriction::DANGEROUS_FILES,
|
| +
|
| + content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE,
|
| + /*blocked=*/true},
|
|
|
| // DANGEROUS verdict for a potentially dangerous file.
|
| {content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
|
| DownloadFileType::ALLOW_ON_USER_GESTURE,
|
| safe_browsing::DownloadProtectionService::DANGEROUS,
|
| + DownloadPrefs::DownloadRestriction::NONE,
|
|
|
| - content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT},
|
| + content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT,
|
| + /*blocked=*/false},
|
|
|
| // UNCOMMON verdict for a potentially dangerous file.
|
| {content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
|
| DownloadFileType::ALLOW_ON_USER_GESTURE,
|
| safe_browsing::DownloadProtectionService::UNCOMMON,
|
| + DownloadPrefs::DownloadRestriction::NONE,
|
|
|
| - content::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT},
|
| + content::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT,
|
| + /*blocked=*/false},
|
|
|
| // POTENTIALLY_UNWANTED verdict for a potentially dangerous file.
|
| {content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
|
| DownloadFileType::ALLOW_ON_USER_GESTURE,
|
| safe_browsing::DownloadProtectionService::POTENTIALLY_UNWANTED,
|
| + DownloadPrefs::DownloadRestriction::NONE,
|
|
|
| - content::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED},
|
| + content::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED,
|
| + /*blocked=*/false},
|
| +
|
| + // POTENTIALLY_UNWANTED verdict for a potentially dangerous file, blocked by
|
| + // policy.
|
| + {content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
|
| + DownloadFileType::ALLOW_ON_USER_GESTURE,
|
| + safe_browsing::DownloadProtectionService::POTENTIALLY_UNWANTED,
|
| + DownloadPrefs::DownloadRestriction::POTENTIALLY_DANGEROUS_FILES,
|
| +
|
| + content::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED,
|
| + /*blocked=*/true},
|
| +
|
| + // POTENTIALLY_UNWANTED verdict for a potentially dangerous file, not
|
| + // blocked by policy.
|
| + {content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
|
| + DownloadFileType::ALLOW_ON_USER_GESTURE,
|
| + safe_browsing::DownloadProtectionService::POTENTIALLY_UNWANTED,
|
| + DownloadPrefs::DownloadRestriction::DANGEROUS_FILES,
|
| +
|
| + content::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED,
|
| + /*blocked=*/false},
|
|
|
| // SAFE verdict for a dangerous file.
|
| {content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
|
| DownloadFileType::DANGEROUS,
|
| safe_browsing::DownloadProtectionService::SAFE,
|
| + DownloadPrefs::DownloadRestriction::NONE,
|
|
|
| - content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE},
|
| + content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE,
|
| + /*blocked=*/false},
|
|
|
| // UNKNOWN verdict for a dangerous file.
|
| {content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
|
| DownloadFileType::DANGEROUS,
|
| safe_browsing::DownloadProtectionService::UNKNOWN,
|
| + DownloadPrefs::DownloadRestriction::NONE,
|
|
|
| - content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE},
|
| + content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE,
|
| + /*blocked=*/false},
|
|
|
| // DANGEROUS verdict for a dangerous file.
|
| {content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
|
| DownloadFileType::DANGEROUS,
|
| safe_browsing::DownloadProtectionService::DANGEROUS,
|
| + DownloadPrefs::DownloadRestriction::NONE,
|
|
|
| - content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT},
|
| + content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT,
|
| + /*blocked=*/false},
|
|
|
| // UNCOMMON verdict for a dangerous file.
|
| {content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
|
| DownloadFileType::DANGEROUS,
|
| safe_browsing::DownloadProtectionService::UNCOMMON,
|
| + DownloadPrefs::DownloadRestriction::NONE,
|
|
|
| - content::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT},
|
| + content::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT,
|
| + /*blocked=*/false},
|
|
|
| // POTENTIALLY_UNWANTED verdict for a dangerous file.
|
| {content::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT,
|
| DownloadFileType::DANGEROUS,
|
| safe_browsing::DownloadProtectionService::POTENTIALLY_UNWANTED,
|
| + DownloadPrefs::DownloadRestriction::NONE,
|
|
|
| - content::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED},
|
| + content::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED,
|
| + /*blocked=*/false},
|
| };
|
|
|
| INSTANTIATE_TEST_CASE_P(_,
|
| @@ -757,12 +857,26 @@ TEST_P(ChromeDownloadManagerDelegateTestWithSafeBrowsing, CheckClientDownload) {
|
|
|
| if (kParameters.expected_danger_type !=
|
| content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS) {
|
| - EXPECT_CALL(*download_item,
|
| - OnContentCheckCompleted(kParameters.expected_danger_type));
|
| + if (kParameters.blocked) {
|
| + EXPECT_CALL(*download_item,
|
| + OnContentCheckCompleted(
|
| + // Specifying a dangerous type here would take precendence
|
| + // over the blocking of the file.
|
| + content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
|
| + content::DOWNLOAD_INTERRUPT_REASON_FILE_BLOCKED));
|
| + } else {
|
| + EXPECT_CALL(*download_item, OnContentCheckCompleted(
|
| + kParameters.expected_danger_type,
|
| + content::DOWNLOAD_INTERRUPT_REASON_NONE));
|
| + }
|
| } else {
|
| - EXPECT_CALL(*download_item, OnContentCheckCompleted(_)).Times(0);
|
| + EXPECT_CALL(*download_item, OnContentCheckCompleted(_, _)).Times(0);
|
| }
|
|
|
| + pref_service()->SetInteger(
|
| + prefs::kDownloadRestrictions,
|
| + static_cast<int>(kParameters.download_restriction));
|
| +
|
| base::RunLoop run_loop;
|
| ASSERT_FALSE(delegate()->ShouldCompleteDownload(download_item.get(),
|
| run_loop.QuitClosure()));
|
|
|