Skip to content

Commit

Permalink
[M102] Update file type based warning UI in download bubble.
Browse files Browse the repository at this point in the history
To make file type based warnings look different from other download
warnings, add a keep button on the primary page, replace the warning
icon with the info icon, remove the checkbox and make the delete button
not prominent.

The strings will be updated post-MVP.

Before: http://screen/7GZq6ZZFrB9Ws2i, http://screen/6Mn6HMaD3bvoE9S
After: http://screen/8dxupn8mTjWAR2c, http://screen/P93EXcurYyXJ3RR

(cherry picked from commit 7fd3173)

Bug: 1320025
Change-Id: Ic0bede7ecc0915feeb522919d5b78e1142c89d88
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3611545
Reviewed-by: Rohit Bhatia <bhatiarohit@google.com>
Reviewed-by: Min Qin <qinmin@chromium.org>
Commit-Queue: Xinghui Lu <xinghuilu@chromium.org>
Cr-Original-Commit-Position: refs/heads/main@{#997531}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3622197
Cr-Commit-Position: refs/branch-heads/5005@{#392}
Cr-Branched-From: 5b4d945-refs/heads/main@{#992738}
  • Loading branch information
Xinghui Lu authored and Chromium LUCI CQ committed May 3, 2022
1 parent 61d4962 commit 82c0da5
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 50 deletions.
107 changes: 72 additions & 35 deletions chrome/browser/download/download_ui_model.cc
Expand Up @@ -692,6 +692,11 @@ DownloadUIModel::BubbleUIInfo::BubbleUIInfo(const std::u16string& summary)
: has_subpage(true), warning_summary(summary) {}
DownloadUIModel::BubbleUIInfo::BubbleUIInfo(bool has_progress_bar)
: has_progress_bar(has_progress_bar) {}
DownloadUIModel::BubbleUIInfo::SubpageButton::SubpageButton(
DownloadCommands::Command command,
std::u16string label,
bool is_prominent)
: command(command), label(label), is_prominent(is_prominent) {}
DownloadUIModel::BubbleUIInfo::BubbleUIInfo() = default;
DownloadUIModel::BubbleUIInfo::~BubbleUIInfo() = default;
DownloadUIModel::BubbleUIInfo::BubbleUIInfo(const BubbleUIInfo& rhs) = default;
Expand All @@ -716,16 +721,11 @@ DownloadUIModel::BubbleUIInfo& DownloadUIModel::BubbleUIInfo::AddCheckbox(
}
DownloadUIModel::BubbleUIInfo& DownloadUIModel::BubbleUIInfo::AddSubpageButton(
const std::u16string& label,
DownloadCommands::Command command) {
if (!has_first_button) {
has_first_button = true;
first_button_label = label;
first_button_command = command;
} else {
has_second_button = true;
second_button_label = label;
second_button_command = command;
}
DownloadCommands::Command command,
bool is_prominent) {
// The subpage of the bubble supports at most 2 buttons.
DCHECK(subpage_buttons.size() <= 1);
subpage_buttons.emplace_back(command, label, is_prominent);
return *this;
}

Expand Down Expand Up @@ -815,10 +815,11 @@ DownloadUIModel::BubbleUIInfo DownloadUIModel::GetBubbleUIInfoForWarning()
ui::kColorAlertMediumSeverity)
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_CONTINUE),
DownloadCommands::Command::KEEP)
DownloadCommands::Command::KEEP, /*is_prominent=*/false)
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_DELETE),
DownloadCommands::Command::DISCARD);
DownloadCommands::Command::DISCARD,
/*is_prominent=*/true);
case download::DownloadItem::MixedContentStatus::UNKNOWN:
case download::DownloadItem::MixedContentStatus::SAFE:
case download::DownloadItem::MixedContentStatus::VALIDATED:
Expand All @@ -828,7 +829,7 @@ DownloadUIModel::BubbleUIInfo DownloadUIModel::GetBubbleUIInfoForWarning()

switch (GetDangerType()) {
case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE:
if (IsExtensionDownload())
if (IsExtensionDownload()) {
return DownloadUIModel::BubbleUIInfo(
l10n_util::GetStringFUTF16(
IDS_DOWNLOAD_BUBBLE_SUBPAGE_SUMMARY_UNKNOWN_SOURCE,
Expand All @@ -837,11 +838,28 @@ DownloadUIModel::BubbleUIInfo DownloadUIModel::GetBubbleUIInfoForWarning()
.AddIconAndColor(views::kInfoIcon, ui::kColorAlertMediumSeverity)
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_CONTINUE),
DownloadCommands::Command::KEEP)
DownloadCommands::Command::KEEP,
/*is_prominent=*/false)
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_DELETE),
DownloadCommands::Command::DISCARD);
[[fallthrough]];
DownloadCommands::Command::DISCARD,
/*is_prominent=*/true);
} else {
// TODO(crbug.com/1320025): Update the strings to match the UX mock.
return DownloadUIModel::BubbleUIInfo(
l10n_util::GetStringUTF16(
IDS_DOWNLOAD_BUBBLE_MALICIOUS_URL_BLOCKED))
.AddIconAndColor(views::kInfoIcon, ui::kColorSecondaryForeground)
.AddPrimaryButton(DownloadCommands::Command::KEEP)
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_CONTINUE),
DownloadCommands::Command::KEEP,
/*is_prominent=*/false)
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_DELETE),
DownloadCommands::Command::DISCARD,
/*is_prominent=*/false);
}
case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT:
case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST:
return DownloadUIModel::BubbleUIInfo(
Expand All @@ -854,10 +872,12 @@ DownloadUIModel::BubbleUIInfo DownloadUIModel::GetBubbleUIInfoForWarning()
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_CHECKBOX_BYPASS))
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_CONTINUE),
DownloadCommands::Command::KEEP)
DownloadCommands::Command::KEEP,
/*is_prominent=*/false)
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_DELETE),
DownloadCommands::Command::DISCARD);
DownloadCommands::Command::DISCARD,
/*is_prominent=*/true);
case download::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED:
return DownloadUIModel::BubbleUIInfo(
l10n_util::GetStringUTF16(
Expand All @@ -869,21 +889,25 @@ DownloadUIModel::BubbleUIInfo DownloadUIModel::GetBubbleUIInfoForWarning()
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_CHECKBOX_BYPASS))
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_CONTINUE),
DownloadCommands::Command::KEEP)
DownloadCommands::Command::KEEP,
/*is_prominent=*/false)
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_DELETE),
DownloadCommands::Command::DISCARD);
DownloadCommands::Command::DISCARD,
/*is_prominent=*/true);
case download::DOWNLOAD_DANGER_TYPE_BLOCKED_PASSWORD_PROTECTED:
return DownloadUIModel::BubbleUIInfo(
l10n_util::GetStringUTF16(
IDS_DOWNLOAD_BUBBLE_SUBPAGE_SUMMARY_ENCRYPTED))
.AddIconAndColor(views::kInfoIcon, ui::kColorSecondaryForeground)
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_CONTINUE),
DownloadCommands::Command::KEEP)
DownloadCommands::Command::KEEP,
/*is_prominent=*/false)
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_DELETE),
DownloadCommands::Command::DISCARD);
DownloadCommands::Command::DISCARD,
/*is_prominent=*/true);
case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_ACCOUNT_COMPROMISE:
return DownloadUIModel::BubbleUIInfo(
l10n_util::GetStringUTF16(
Expand All @@ -893,10 +917,12 @@ DownloadUIModel::BubbleUIInfo DownloadUIModel::GetBubbleUIInfoForWarning()
.AddPrimaryButton(DownloadCommands::Command::DISCARD)
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_CONTINUE),
DownloadCommands::Command::KEEP)
DownloadCommands::Command::KEEP,
/*is_prominent=*/false)
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_DELETE),
DownloadCommands::Command::DISCARD);
DownloadCommands::Command::DISCARD,
/*is_prominent=*/true);
case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL:
return DownloadUIModel::BubbleUIInfo(
l10n_util::GetStringUTF16(
Expand All @@ -908,18 +934,21 @@ DownloadUIModel::BubbleUIInfo DownloadUIModel::GetBubbleUIInfoForWarning()
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_CHECKBOX_BYPASS))
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_CONTINUE),
DownloadCommands::Command::KEEP)
DownloadCommands::Command::KEEP,
/*is_prominent=*/false)
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_DELETE),
DownloadCommands::Command::DISCARD);
DownloadCommands::Command::DISCARD,
/*is_prominent=*/true);
case download::DOWNLOAD_DANGER_TYPE_BLOCKED_TOO_LARGE:
return DownloadUIModel::BubbleUIInfo(
l10n_util::GetStringUTF16(
IDS_DOWNLOAD_BUBBLE_SUBPAGE_SUMMARY_TOO_BIG))
.AddIconAndColor(views::kInfoIcon, ui::kColorSecondaryForeground)
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_DELETE),
DownloadCommands::Command::DISCARD);
DownloadCommands::Command::DISCARD,
/*is_prominent=*/true);

case download::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT: {
bool request_ap_verdicts = false;
Expand All @@ -937,10 +966,12 @@ DownloadUIModel::BubbleUIInfo DownloadUIModel::GetBubbleUIInfoForWarning()
ui::kColorAlertMediumSeverity)
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_CONTINUE),
DownloadCommands::Command::KEEP)
DownloadCommands::Command::KEEP,
/*is_prominent=*/false)
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_DELETE),
DownloadCommands::Command::DISCARD);
DownloadCommands::Command::DISCARD,
/*is_prominent=*/true);
} else {
return DownloadUIModel::BubbleUIInfo(
l10n_util::GetStringUTF16(
Expand All @@ -949,10 +980,12 @@ DownloadUIModel::BubbleUIInfo DownloadUIModel::GetBubbleUIInfoForWarning()
.AddPrimaryButton(DownloadCommands::Command::DISCARD)
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_CONTINUE),
DownloadCommands::Command::KEEP)
DownloadCommands::Command::KEEP,
/*is_prominent=*/false)
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_DELETE),
DownloadCommands::Command::DISCARD);
DownloadCommands::Command::DISCARD,
/*is_prominent=*/true);
}
}
case download::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_WARNING:
Expand All @@ -962,10 +995,12 @@ DownloadUIModel::BubbleUIInfo DownloadUIModel::GetBubbleUIInfoForWarning()
.AddIconAndColor(views::kInfoIcon, ui::kColorAlertMediumSeverity)
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_CONTINUE),
DownloadCommands::Command::KEEP)
DownloadCommands::Command::KEEP,
/*is_prominent=*/false)
.AddSubpageButton(
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_DELETE),
DownloadCommands::Command::DISCARD);
DownloadCommands::Command::DISCARD,
/*is_prominent=*/true);
case download::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_BLOCK:
return DownloadUIModel::BubbleUIInfo(
l10n_util::GetStringUTF16(
Expand All @@ -979,9 +1014,11 @@ DownloadUIModel::BubbleUIInfo DownloadUIModel::GetBubbleUIInfoForWarning()
ui::kColorAlertMediumSeverity)
.AddPrimaryButton(DownloadCommands::Command::DEEP_SCAN)
.AddSubpageButton(l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_OPEN),
DownloadCommands::Command::BYPASS_DEEP_SCANNING)
DownloadCommands::Command::BYPASS_DEEP_SCANNING,
/*is_prominent=*/false)
.AddSubpageButton(l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_SCAN),
DownloadCommands::Command::DEEP_SCAN);
DownloadCommands::Command::DEEP_SCAN,
/*is_prominent=*/true);
case download::DOWNLOAD_DANGER_TYPE_ASYNC_SCANNING:
return DownloadUIModel::BubbleUIInfo(/*has_progress_bar=*/true)
.AddPrimaryButton(DownloadCommands::Command::BYPASS_DEEP_SCANNING)
Expand Down
22 changes: 14 additions & 8 deletions chrome/browser/download/download_ui_model.h
Expand Up @@ -84,6 +84,16 @@ class DownloadUIModel {

#if !BUILDFLAG(IS_ANDROID)
struct BubbleUIInfo {
struct SubpageButton {
DownloadCommands::Command command;
std::u16string label;
bool is_prominent = false;

SubpageButton(DownloadCommands::Command command,
std::u16string label,
bool is_prominent);
};

// has a progress bar and a cancel button.
bool has_progress_bar = false;
bool is_progress_bar_looping = false;
Expand All @@ -106,13 +116,8 @@ class DownloadUIModel {
bool has_primary_button = false;
DownloadCommands::Command primary_button_command;

// Label and commands for the two subpage buttons
bool has_first_button = false;
DownloadCommands::Command first_button_command;
std::u16string first_button_label;
bool has_second_button = false;
DownloadCommands::Command second_button_command;
std::u16string second_button_label;
// Subpage buttons
std::vector<SubpageButton> subpage_buttons;

// The subpage exists if the summary exists.
explicit BubbleUIInfo(const std::u16string& summary);
Expand All @@ -126,7 +131,8 @@ class DownloadUIModel {
BubbleUIInfo& AddPrimaryButton(DownloadCommands::Command command);
BubbleUIInfo& AddCheckbox(const std::u16string& label);
BubbleUIInfo& AddSubpageButton(const std::u16string& label,
DownloadCommands::Command command);
DownloadCommands::Command command,
bool is_prominent);
BubbleUIInfo& SetProgressBarLooping();
};
#endif
Expand Down
Expand Up @@ -260,6 +260,8 @@ DownloadBubbleRowView::DownloadBubbleRowView(
discard_button_ =
AddMainPageButton(DownloadCommands::DISCARD,
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_DELETE));
keep_button_ = AddMainPageButton(
DownloadCommands::KEEP, l10n_util::GetStringUTF16(IDS_CONFIRM_DOWNLOAD));
scan_button_ =
AddMainPageButton(DownloadCommands::DEEP_SCAN,
l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_SCAN));
Expand Down Expand Up @@ -338,6 +340,8 @@ void DownloadBubbleRowView::UpdateButtonsForItems() {
DownloadCommands::CANCEL);
discard_button_->SetVisible(ui_info_.primary_button_command ==
DownloadCommands::DISCARD);
keep_button_->SetVisible(ui_info_.primary_button_command ==
DownloadCommands::KEEP);
scan_button_->SetVisible(ui_info_.primary_button_command ==
DownloadCommands::DEEP_SCAN);
open_now_button_->SetVisible(ui_info_.primary_button_command ==
Expand Down
Expand Up @@ -105,6 +105,7 @@ class DownloadBubbleRowView : public views::View,
// Buttons on the main page.
raw_ptr<views::MdTextButton> cancel_button_ = nullptr;
raw_ptr<views::MdTextButton> discard_button_ = nullptr;
raw_ptr<views::MdTextButton> keep_button_ = nullptr;
raw_ptr<views::MdTextButton> scan_button_ = nullptr;
raw_ptr<views::MdTextButton> open_now_button_ = nullptr;
raw_ptr<views::FlexLayoutView> main_button_holder_ = nullptr;
Expand Down
Expand Up @@ -216,20 +216,22 @@ void DownloadBubbleSecurityView::UpdateButtons() {
deep_scan_button_->SetVisible(false);
bypass_deep_scan_button_->SetVisible(false);
DownloadUIModel::BubbleUIInfo& ui_info = download_row_view_->ui_info();
if (ui_info.has_first_button) {
first_button_ = GetButtonForCommand(ui_info.first_button_command);
first_button_->SetText(ui_info.first_button_label);

if (ui_info.subpage_buttons.size() > 0) {
first_button_ = GetButtonForCommand(ui_info.subpage_buttons[0].command);
first_button_->SetText(ui_info.subpage_buttons[0].label);
first_button_->SetProminent(ui_info.subpage_buttons[0].is_prominent);
if (ui_info.has_checkbox) {
first_button_->SetEnabled(false);
}
first_button_->SetVisible(true);
}
if (ui_info.has_second_button) {
if (ui_info.subpage_buttons.size() > 1) {
views::MdTextButton* second_button =
GetButtonForCommand(ui_info.second_button_command);
second_button->SetText(ui_info.second_button_label);
GetButtonForCommand(ui_info.subpage_buttons[1].command);
second_button->SetText(ui_info.subpage_buttons[1].label);
second_button->SetVisible(true);
second_button->SetProminent(true);
second_button->SetProminent(ui_info.subpage_buttons[1].is_prominent);
}
}

Expand Down

0 comments on commit 82c0da5

Please sign in to comment.