Commit dc5e434f authored by Daniel Rubery's avatar Daniel Rubery Committed by Commit Bot

Don't show dropdown menu on files blocked by enterprise deep scanning

Based on UX feedback we don't want a "learn more" link in the dropdown,
and there's nothing a user can do with these downloads since they have
been blocked, so remove the dropdown entirely.

Old screenshot: https://screenshot.googleplex.com/7r65OQPO7Xs.png
New screenshot: https://screenshot.googleplex.com/TPkBgzZMDYT.png

Fixed: 1069527
Change-Id: I81b7eee8399ef1ba3e5ec449bee6c6899b09db58
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2321329
Commit-Queue: Daniel Rubery <drubery@chromium.org>
Reviewed-by: default avatarXing Liu <xingliu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#792370}
parent c55166de
......@@ -753,3 +753,24 @@ void DownloadItemModel::CompleteSafeBrowsingScan() {
state->CompleteDownload();
}
#endif
bool DownloadItemModel::ShouldShowDropdown() const {
// We don't show the dropdown for dangerous file types or for files
// blocked by enterprise policy.
if (IsDangerous() && GetState() != DownloadItem::CANCELLED &&
!MightBeMalicious()) {
return false;
}
if (GetDangerType() ==
download::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_BLOCK ||
GetDangerType() ==
download::DOWNLOAD_DANGER_TYPE_BLOCKED_PASSWORD_PROTECTED ||
GetDangerType() == download::DOWNLOAD_DANGER_TYPE_BLOCKED_TOO_LARGE ||
GetDangerType() ==
download::DOWNLOAD_DANGER_TYPE_BLOCKED_UNSUPPORTED_FILETYPE) {
return false;
}
return true;
}
......@@ -96,6 +96,8 @@ class DownloadItemModel : public DownloadUIModel,
void CompleteSafeBrowsingScan() override;
#endif
bool ShouldShowDropdown() const override;
// download::DownloadItem::Observer implementation.
void OnDownloadUpdated(download::DownloadItem* download) override;
void OnDownloadOpened(download::DownloadItem* download) override;
......
......@@ -451,3 +451,56 @@ TEST_F(DownloadItemModelTest, ShouldRemoveFromShelfWhenComplete) {
Mock::VerifyAndClearExpectations(&model());
}
}
TEST_F(DownloadItemModelTest, ShouldShowDropdown) {
// A few aliases for DownloadDangerTypes since the full names are fairly
// verbose.
download::DownloadDangerType safe =
download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS;
download::DownloadDangerType dangerous_file =
download::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE;
download::DownloadDangerType dangerous_content =
download::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT;
download::DownloadDangerType blocked_encrypted =
download::DOWNLOAD_DANGER_TYPE_BLOCKED_PASSWORD_PROTECTED;
download::DownloadDangerType blocked_too_large =
download::DOWNLOAD_DANGER_TYPE_BLOCKED_TOO_LARGE;
download::DownloadDangerType blocked_sensitive =
download::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_BLOCK;
download::DownloadDangerType blocked_filetype =
download::DOWNLOAD_DANGER_TYPE_BLOCKED_UNSUPPORTED_FILETYPE;
const struct TestCase {
DownloadItem::DownloadState state; // Expectation for GetState()
download::DownloadDangerType danger_type; // Expectation for GetDangerType()
bool is_dangerous; // Expectation for IsDangerous()
bool expected_result;
} kTestCases[] = {
// .--- Is dangerous.
// Download state Danger type | .--- Expected result.
{DownloadItem::COMPLETE, safe, false, true},
{DownloadItem::COMPLETE, dangerous_file, true, false},
{DownloadItem::CANCELLED, dangerous_file, true, true},
{DownloadItem::COMPLETE, dangerous_content, true, true},
{DownloadItem::COMPLETE, blocked_encrypted, true, false},
{DownloadItem::COMPLETE, blocked_too_large, true, false},
{DownloadItem::COMPLETE, blocked_sensitive, true, false},
{DownloadItem::COMPLETE, blocked_filetype, true, false},
};
SetupDownloadItemDefaults();
for (unsigned i = 0; i < base::size(kTestCases); i++) {
const TestCase& test_case = kTestCases[i];
EXPECT_CALL(item(), GetState()).WillRepeatedly(Return(test_case.state));
EXPECT_CALL(item(), GetDangerType())
.WillRepeatedly(Return(test_case.danger_type));
EXPECT_CALL(item(), IsDangerous())
.WillRepeatedly(Return(test_case.is_dangerous));
EXPECT_EQ(test_case.expected_result, model().ShouldShowDropdown())
<< "Test case: " << i;
Mock::VerifyAndClearExpectations(&item());
Mock::VerifyAndClearExpectations(&model());
}
}
......@@ -713,3 +713,7 @@ base::string16 DownloadUIModel::GetInProgressStatusString() const {
#if BUILDFLAG(FULL_SAFE_BROWSING)
void DownloadUIModel::CompleteSafeBrowsingScan() {}
#endif
bool DownloadUIModel::ShouldShowDropdown() const {
return true;
}
......@@ -309,6 +309,9 @@ class DownloadUIModel {
virtual void CompleteSafeBrowsingScan();
#endif
// Whether the dropdown menu button should be shown or not.
virtual bool ShouldShowDropdown() const;
protected:
// Returns the MIME type of the download.
virtual std::string GetMimeType() const;
......
......@@ -623,7 +623,7 @@ gfx::Size DownloadItemView::CalculatePreferredSize() const {
status_width + kEndPadding;
}
if (mode_ != Mode::kDangerous)
if (model_->ShouldShowDropdown())
width += dropdown_button_->GetPreferredSize().width();
// The normal height of the item which may be exceeded if text is large.
......@@ -906,7 +906,7 @@ void DownloadItemView::UpdateButtons() {
prompt_to_discard);
scan_button_->SetVisible(prompt_to_scan);
dropdown_button_->SetVisible(mode_ != Mode::kDangerous);
dropdown_button_->SetVisible(model_->ShouldShowDropdown());
}
void DownloadItemView::UpdateAccessibleAlertAndTimersForNormalMode() {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment