Commit e3a07a7a authored by Peter Kasting's avatar Peter Kasting Committed by Commit Bot

Misc. cleanup for some downloads-related classes.

Bug: none
Change-Id: I7da24a70506ea2b029e34b3bbe4804aa4b5a6b78
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2248879
Commit-Queue: Peter Kasting <pkasting@chromium.org>
Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Cr-Commit-Position: refs/heads/master@{#798040}
parent f2fec435
...@@ -178,11 +178,10 @@ TEST_F(DownloadItemModelTest, InterruptedStatus) { ...@@ -178,11 +178,10 @@ TEST_F(DownloadItemModelTest, InterruptedStatus) {
"interrupt reason mismatch"); "interrupt reason mismatch");
SetupDownloadItemDefaults(); SetupDownloadItemDefaults();
for (unsigned i = 0; i < base::size(kTestCases); ++i) { for (const auto& test_case : kTestCases) {
const TestCase& test_case = kTestCases[i];
SetupInterruptedDownloadItem(test_case.reason); SetupInterruptedDownloadItem(test_case.reason);
EXPECT_STREQ(test_case.expected_status, EXPECT_EQ(test_case.expected_status,
base::UTF16ToUTF8(model().GetStatusText()).c_str()); base::UTF16ToUTF8(model().GetStatusText()));
} }
} }
...@@ -257,11 +256,10 @@ TEST_F(DownloadItemModelTest, InterruptTooltip) { ...@@ -257,11 +256,10 @@ TEST_F(DownloadItemModelTest, InterruptTooltip) {
"interrupt reason mismatch"); "interrupt reason mismatch");
SetupDownloadItemDefaults(); SetupDownloadItemDefaults();
for (unsigned i = 0; i < base::size(kTestCases); ++i) { for (const auto& test_case : kTestCases) {
const TestCase& test_case = kTestCases[i];
SetupInterruptedDownloadItem(test_case.reason); SetupInterruptedDownloadItem(test_case.reason);
EXPECT_STREQ(test_case.expected_tooltip, EXPECT_EQ(test_case.expected_tooltip,
base::UTF16ToUTF8(model().GetTooltipText()).c_str()); base::UTF16ToUTF8(model().GetTooltipText()));
} }
} }
...@@ -315,8 +313,7 @@ TEST_F(DownloadItemModelTest, InProgressStatus) { ...@@ -315,8 +313,7 @@ TEST_F(DownloadItemModelTest, InProgressStatus) {
SetupDownloadItemDefaults(); SetupDownloadItemDefaults();
for (unsigned i = 0; i < base::size(kTestCases); i++) { for (const auto& test_case : kTestCases) {
const TestCase& test_case = kTestCases[i];
Mock::VerifyAndClearExpectations(&item()); Mock::VerifyAndClearExpectations(&item());
Mock::VerifyAndClearExpectations(&model()); Mock::VerifyAndClearExpectations(&model());
EXPECT_CALL(item(), GetReceivedBytes()) EXPECT_CALL(item(), GetReceivedBytes())
...@@ -332,8 +329,8 @@ TEST_F(DownloadItemModelTest, InProgressStatus) { ...@@ -332,8 +329,8 @@ TEST_F(DownloadItemModelTest, InProgressStatus) {
EXPECT_CALL(item(), IsPaused()) EXPECT_CALL(item(), IsPaused())
.WillRepeatedly(Return(test_case.is_paused)); .WillRepeatedly(Return(test_case.is_paused));
EXPECT_STREQ(test_case.expected_status, EXPECT_EQ(test_case.expected_status,
base::UTF16ToUTF8(model().GetStatusText()).c_str()); base::UTF16ToUTF8(model().GetStatusText()));
} }
} }
...@@ -433,8 +430,7 @@ TEST_F(DownloadItemModelTest, ShouldRemoveFromShelfWhenComplete) { ...@@ -433,8 +430,7 @@ TEST_F(DownloadItemModelTest, ShouldRemoveFromShelfWhenComplete) {
SetupDownloadItemDefaults(); SetupDownloadItemDefaults();
for (unsigned i = 0; i < base::size(kTestCases); i++) { for (const auto& test_case : kTestCases) {
const TestCase& test_case = kTestCases[i];
EXPECT_CALL(item(), GetOpenWhenComplete()) EXPECT_CALL(item(), GetOpenWhenComplete())
.WillRepeatedly(Return(test_case.is_auto_open)); .WillRepeatedly(Return(test_case.is_auto_open));
EXPECT_CALL(item(), GetState()) EXPECT_CALL(item(), GetState())
...@@ -445,8 +441,7 @@ TEST_F(DownloadItemModelTest, ShouldRemoveFromShelfWhenComplete) { ...@@ -445,8 +441,7 @@ TEST_F(DownloadItemModelTest, ShouldRemoveFromShelfWhenComplete) {
.WillRepeatedly(Return(test_case.auto_opened)); .WillRepeatedly(Return(test_case.auto_opened));
EXPECT_EQ(test_case.expected_result, EXPECT_EQ(test_case.expected_result,
model().ShouldRemoveFromShelfWhenComplete()) model().ShouldRemoveFromShelfWhenComplete());
<< "Test case: " << i;
Mock::VerifyAndClearExpectations(&item()); Mock::VerifyAndClearExpectations(&item());
Mock::VerifyAndClearExpectations(&model()); Mock::VerifyAndClearExpectations(&model());
} }
...@@ -490,16 +485,14 @@ TEST_F(DownloadItemModelTest, ShouldShowDropdown) { ...@@ -490,16 +485,14 @@ TEST_F(DownloadItemModelTest, ShouldShowDropdown) {
SetupDownloadItemDefaults(); SetupDownloadItemDefaults();
for (unsigned i = 0; i < base::size(kTestCases); i++) { for (const auto& test_case : kTestCases) {
const TestCase& test_case = kTestCases[i];
EXPECT_CALL(item(), GetState()).WillRepeatedly(Return(test_case.state)); EXPECT_CALL(item(), GetState()).WillRepeatedly(Return(test_case.state));
EXPECT_CALL(item(), GetDangerType()) EXPECT_CALL(item(), GetDangerType())
.WillRepeatedly(Return(test_case.danger_type)); .WillRepeatedly(Return(test_case.danger_type));
EXPECT_CALL(item(), IsDangerous()) EXPECT_CALL(item(), IsDangerous())
.WillRepeatedly(Return(test_case.is_dangerous)); .WillRepeatedly(Return(test_case.is_dangerous));
EXPECT_EQ(test_case.expected_result, model().ShouldShowDropdown()) EXPECT_EQ(test_case.expected_result, model().ShouldShowDropdown());
<< "Test case: " << i;
Mock::VerifyAndClearExpectations(&item()); Mock::VerifyAndClearExpectations(&item());
Mock::VerifyAndClearExpectations(&model()); Mock::VerifyAndClearExpectations(&model());
} }
......
...@@ -33,17 +33,10 @@ ...@@ -33,17 +33,10 @@
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "ui/gfx/animation/animation.h" #include "ui/gfx/animation/animation.h"
namespace {
// Delay before we show a transient download.
const int64_t kDownloadShowDelayInSeconds = 2;
} // namespace
DownloadShelf::DownloadShelf(Browser* browser, Profile* profile) DownloadShelf::DownloadShelf(Browser* browser, Profile* profile)
: browser_(browser), profile_(profile) {} : browser_(browser), profile_(profile) {}
DownloadShelf::~DownloadShelf() {} DownloadShelf::~DownloadShelf() = default;
void DownloadShelf::AddDownload(DownloadUIModel::DownloadUIModelPtr model) { void DownloadShelf::AddDownload(DownloadUIModel::DownloadUIModelPtr model) {
DCHECK(model); DCHECK(model);
...@@ -96,7 +89,7 @@ void DownloadShelf::Unhide() { ...@@ -96,7 +89,7 @@ void DownloadShelf::Unhide() {
} }
base::TimeDelta DownloadShelf::GetTransientDownloadShowDelay() const { base::TimeDelta DownloadShelf::GetTransientDownloadShowDelay() const {
return base::TimeDelta::FromSeconds(kDownloadShowDelayInSeconds); return base::TimeDelta::FromSeconds(2);
} }
void DownloadShelf::ShowDownload(DownloadUIModel::DownloadUIModelPtr download) { void DownloadShelf::ShowDownload(DownloadUIModel::DownloadUIModelPtr download) {
...@@ -108,65 +101,54 @@ void DownloadShelf::ShowDownload(DownloadUIModel::DownloadUIModelPtr download) { ...@@ -108,65 +101,54 @@ void DownloadShelf::ShowDownload(DownloadUIModel::DownloadUIModelPtr download) {
->IsShelfEnabled()) ->IsShelfEnabled())
return; return;
bool should_show_download_started_animation = Unhide();
download->ShouldShowDownloadStartedAnimation();
if (is_hidden_)
Unhide();
Open(); Open();
DoShowDownload(std::move(download));
// browser_ can be null for tests. const bool should_show_download_started_animation =
if (!browser_) download->ShouldShowDownloadStartedAnimation();
return; DoShowDownload(std::move(download));
// Show the download started animation if: // Show the download started animation if:
// - Download started animation is enabled for this download. It is disabled // - Download started animation is enabled for this download. It is disabled
// for "Save As" downloads and extension installs, for example. // for "Save As" downloads and extension installs, for example.
// - Rich animations are enabled.
// - The browser has an active visible WebContents. (browser isn't minimized, // - The browser has an active visible WebContents. (browser isn't minimized,
// or running under a test etc.) // or running under a test etc.)
// - Rich animations are enabled. if (!should_show_download_started_animation ||
content::WebContents* shelf_tab = !gfx::Animation::ShouldRenderRichAnimation() || !browser_)
return;
content::WebContents* const shelf_tab =
browser_->tab_strip_model()->GetActiveWebContents(); browser_->tab_strip_model()->GetActiveWebContents();
if (should_show_download_started_animation && shelf_tab && if (shelf_tab && platform_util::IsVisible(shelf_tab->GetNativeView()))
platform_util::IsVisible(shelf_tab->GetNativeView()) &&
gfx::Animation::ShouldRenderRichAnimation()) {
DownloadStartedAnimation::Show(shelf_tab); DownloadStartedAnimation::Show(shelf_tab);
}
} }
void DownloadShelf::ShowDownloadById( void DownloadShelf::ShowDownloadById(
const offline_items_collection::ContentId& id) { const offline_items_collection::ContentId& id) {
if (OfflineItemUtils::IsDownload(id)) { if (OfflineItemUtils::IsDownload(id)) {
content::DownloadManager* download_manager = auto* const manager =
content::BrowserContext::GetDownloadManager(profile_); content::BrowserContext::GetDownloadManager(profile());
if (!download_manager) if (manager) {
return; auto* const download = manager->GetDownloadByGuid(id.id);
if (download)
download::DownloadItem* download = ShowDownload(DownloadItemModel::Wrap(download));
download_manager->GetDownloadByGuid(id.id); }
if (!download)
return;
ShowDownload(DownloadItemModel::Wrap(download));
} else { } else {
offline_items_collection::OfflineContentAggregator* aggregator = auto* const aggregator =
OfflineContentAggregatorFactory::GetForKey(profile_->GetProfileKey()); OfflineContentAggregatorFactory::GetForKey(profile()->GetProfileKey());
if (!aggregator) if (aggregator) {
return; aggregator->GetItemById(
id, base::BindOnce(&DownloadShelf::OnGetDownloadDoneForOfflineItem,
aggregator->GetItemById( weak_ptr_factory_.GetWeakPtr()));
id, base::BindOnce(&DownloadShelf::OnGetDownloadDoneForOfflineItem, }
weak_ptr_factory_.GetWeakPtr()));
} }
} }
void DownloadShelf::OnGetDownloadDoneForOfflineItem( void DownloadShelf::OnGetDownloadDoneForOfflineItem(
const base::Optional<offline_items_collection::OfflineItem>& item) { const base::Optional<offline_items_collection::OfflineItem>& item) {
if (!item.has_value()) if (item.has_value()) {
return; auto* const manager =
OfflineItemModelManagerFactory::GetForBrowserContext(profile());
OfflineItemModelManager* manager = ShowDownload(OfflineItemModel::Wrap(manager, item.value()));
OfflineItemModelManagerFactory::GetForBrowserContext(profile_); }
ShowDownload(OfflineItemModel::Wrap(manager, item.value()));
} }
...@@ -200,39 +200,28 @@ base::string16 DownloadUIModel::GetInterruptReasonText() const { ...@@ -200,39 +200,28 @@ base::string16 DownloadUIModel::GetInterruptReasonText() const {
} }
base::string16 DownloadUIModel::GetStatusText() const { base::string16 DownloadUIModel::GetStatusText() const {
base::string16 status_text;
switch (GetState()) { switch (GetState()) {
case DownloadItem::IN_PROGRESS: case DownloadItem::IN_PROGRESS:
status_text = GetInProgressStatusString(); return GetInProgressStatusString();
break;
case DownloadItem::COMPLETE: case DownloadItem::COMPLETE:
if (GetFileExternallyRemoved()) { return GetFileExternallyRemoved()
status_text = l10n_util::GetStringUTF16(IDS_DOWNLOAD_STATUS_REMOVED); ? l10n_util::GetStringUTF16(IDS_DOWNLOAD_STATUS_REMOVED)
} else { : base::string16();
status_text.clear();
}
break;
case DownloadItem::CANCELLED:
status_text = l10n_util::GetStringUTF16(IDS_DOWNLOAD_STATUS_CANCELLED);
break;
case DownloadItem::INTERRUPTED: { case DownloadItem::INTERRUPTED: {
FailState fail_state = GetLastFailState(); const FailState fail_state = GetLastFailState();
if (fail_state != FailState::USER_CANCELED) { if (fail_state != FailState::USER_CANCELED) {
base::string16 message = return l10n_util::GetStringFUTF16(
OfflineItemUtils::GetFailStateMessage(fail_state); IDS_DOWNLOAD_STATUS_INTERRUPTED,
status_text = l10n_util::GetStringFUTF16( OfflineItemUtils::GetFailStateMessage(fail_state));
IDS_DOWNLOAD_STATUS_INTERRUPTED, message);
} else {
// Same as DownloadItem::CANCELLED.
status_text = l10n_util::GetStringUTF16(IDS_DOWNLOAD_STATUS_CANCELLED);
} }
break;
} }
default: FALLTHROUGH;
case DownloadItem::CANCELLED:
return l10n_util::GetStringUTF16(IDS_DOWNLOAD_STATUS_CANCELLED);
case DownloadItem::MAX_DOWNLOAD_STATE:
NOTREACHED(); NOTREACHED();
return base::string16();
} }
return status_text;
} }
base::string16 DownloadUIModel::GetTooltipText() const { base::string16 DownloadUIModel::GetTooltipText() const {
...@@ -249,23 +238,18 @@ base::string16 DownloadUIModel::GetWarningText(const base::string16& filename, ...@@ -249,23 +238,18 @@ base::string16 DownloadUIModel::GetWarningText(const base::string16& filename,
size_t* offset) const { size_t* offset) const {
*offset = std::string::npos; *offset = std::string::npos;
switch (GetDangerType()) { switch (GetDangerType()) {
case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL: { case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL:
return l10n_util::GetStringUTF16(IDS_PROMPT_MALICIOUS_DOWNLOAD_URL); return l10n_util::GetStringUTF16(IDS_PROMPT_MALICIOUS_DOWNLOAD_URL);
} case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE:
case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE: { return IsExtensionDownload()
if (IsExtensionDownload()) { ? l10n_util::GetStringUTF16(
return l10n_util::GetStringUTF16( IDS_PROMPT_DANGEROUS_DOWNLOAD_EXTENSION)
IDS_PROMPT_DANGEROUS_DOWNLOAD_EXTENSION); : l10n_util::GetStringFUTF16(IDS_PROMPT_DANGEROUS_DOWNLOAD,
} else { filename, offset);
return l10n_util::GetStringFUTF16(IDS_PROMPT_DANGEROUS_DOWNLOAD,
filename, offset);
}
}
case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT: case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT:
case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST: { case download::DOWNLOAD_DANGER_TYPE_DANGEROUS_HOST:
return l10n_util::GetStringFUTF16(IDS_PROMPT_MALICIOUS_DOWNLOAD_CONTENT, return l10n_util::GetStringFUTF16(IDS_PROMPT_MALICIOUS_DOWNLOAD_CONTENT,
filename, offset); filename, offset);
}
case download::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT: { case download::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT: {
bool request_ap_verdicts = false; bool request_ap_verdicts = false;
#if BUILDFLAG(FULL_SAFE_BROWSING) #if BUILDFLAG(FULL_SAFE_BROWSING)
...@@ -280,30 +264,24 @@ base::string16 DownloadUIModel::GetWarningText(const base::string16& filename, ...@@ -280,30 +264,24 @@ base::string16 DownloadUIModel::GetWarningText(const base::string16& filename,
: IDS_PROMPT_UNCOMMON_DOWNLOAD_CONTENT, : IDS_PROMPT_UNCOMMON_DOWNLOAD_CONTENT,
filename, offset); filename, offset);
} }
case download::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED: { case download::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED:
return l10n_util::GetStringFUTF16(IDS_PROMPT_DOWNLOAD_CHANGES_SETTINGS, return l10n_util::GetStringFUTF16(IDS_PROMPT_DOWNLOAD_CHANGES_SETTINGS,
filename, offset); filename, offset);
} case download::DOWNLOAD_DANGER_TYPE_BLOCKED_TOO_LARGE:
case download::DOWNLOAD_DANGER_TYPE_BLOCKED_TOO_LARGE: {
return l10n_util::GetStringFUTF16(IDS_PROMPT_DOWNLOAD_BLOCKED_TOO_LARGE, return l10n_util::GetStringFUTF16(IDS_PROMPT_DOWNLOAD_BLOCKED_TOO_LARGE,
filename, offset); filename, offset);
} case download::DOWNLOAD_DANGER_TYPE_BLOCKED_PASSWORD_PROTECTED:
case download::DOWNLOAD_DANGER_TYPE_BLOCKED_PASSWORD_PROTECTED: {
return l10n_util::GetStringFUTF16( return l10n_util::GetStringFUTF16(
IDS_PROMPT_DOWNLOAD_BLOCKED_PASSWORD_PROTECTED, filename, offset); IDS_PROMPT_DOWNLOAD_BLOCKED_PASSWORD_PROTECTED, filename, offset);
} case download::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_WARNING:
case download::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_WARNING: {
return l10n_util::GetStringFUTF16( return l10n_util::GetStringFUTF16(
IDS_PROMPT_DOWNLOAD_SENSITIVE_CONTENT_WARNING, filename, offset); IDS_PROMPT_DOWNLOAD_SENSITIVE_CONTENT_WARNING, filename, offset);
} case download::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_BLOCK:
case download::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_BLOCK: {
return l10n_util::GetStringFUTF16( return l10n_util::GetStringFUTF16(
IDS_PROMPT_DOWNLOAD_SENSITIVE_CONTENT_BLOCKED, filename, offset); IDS_PROMPT_DOWNLOAD_SENSITIVE_CONTENT_BLOCKED, filename, offset);
} case download::DOWNLOAD_DANGER_TYPE_PROMPT_FOR_SCANNING:
case download::DOWNLOAD_DANGER_TYPE_PROMPT_FOR_SCANNING: {
return l10n_util::GetStringFUTF16(IDS_PROMPT_APP_DEEP_SCANNING, filename, return l10n_util::GetStringFUTF16(IDS_PROMPT_APP_DEEP_SCANNING, filename,
offset); offset);
}
case download::DOWNLOAD_DANGER_TYPE_BLOCKED_UNSUPPORTED_FILETYPE: case download::DOWNLOAD_DANGER_TYPE_BLOCKED_UNSUPPORTED_FILETYPE:
case download::DOWNLOAD_DANGER_TYPE_DEEP_SCANNED_SAFE: case download::DOWNLOAD_DANGER_TYPE_DEEP_SCANNED_SAFE:
case download::DOWNLOAD_DANGER_TYPE_DEEP_SCANNED_OPENED_DANGEROUS: case download::DOWNLOAD_DANGER_TYPE_DEEP_SCANNED_OPENED_DANGEROUS:
...@@ -312,9 +290,8 @@ base::string16 DownloadUIModel::GetWarningText(const base::string16& filename, ...@@ -312,9 +290,8 @@ base::string16 DownloadUIModel::GetWarningText(const base::string16& filename,
case download::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT: case download::DOWNLOAD_DANGER_TYPE_MAYBE_DANGEROUS_CONTENT:
case download::DOWNLOAD_DANGER_TYPE_USER_VALIDATED: case download::DOWNLOAD_DANGER_TYPE_USER_VALIDATED:
case download::DOWNLOAD_DANGER_TYPE_WHITELISTED_BY_POLICY: case download::DOWNLOAD_DANGER_TYPE_WHITELISTED_BY_POLICY:
case download::DOWNLOAD_DANGER_TYPE_MAX: { case download::DOWNLOAD_DANGER_TYPE_MAX:
break; break;
}
} }
switch (GetMixedContentStatus()) { switch (GetMixedContentStatus()) {
...@@ -335,12 +312,11 @@ base::string16 DownloadUIModel::GetWarningText(const base::string16& filename, ...@@ -335,12 +312,11 @@ base::string16 DownloadUIModel::GetWarningText(const base::string16& filename,
} }
base::string16 DownloadUIModel::GetWarningConfirmButtonText() const { base::string16 DownloadUIModel::GetWarningConfirmButtonText() const {
if (GetDangerType() == download::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE && const auto kDangerousFile = download::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE;
IsExtensionDownload()) { return l10n_util::GetStringUTF16(
return l10n_util::GetStringUTF16(IDS_CONTINUE_EXTENSION_DOWNLOAD); (GetDangerType() == kDangerousFile && IsExtensionDownload())
} else { ? IDS_CONTINUE_EXTENSION_DOWNLOAD
return l10n_util::GetStringUTF16(IDS_CONFIRM_DOWNLOAD); : IDS_CONFIRM_DOWNLOAD);
}
} }
ContentId DownloadUIModel::GetContentId() const { ContentId DownloadUIModel::GetContentId() const {
......
...@@ -160,8 +160,8 @@ class TransparentButton : public views::Button { ...@@ -160,8 +160,8 @@ class TransparentButton : public views::Button {
SkColor GetInkDropBaseColor() const override { SkColor GetInkDropBaseColor() const override {
// This button will be used like a LabelButton, so use the same foreground // This button will be used like a LabelButton, so use the same foreground
// base color as a label button. // base color as a label button.
return color_utils::DeriveDefaultIconColor(GetNativeTheme()->GetSystemColor( return color_utils::DeriveDefaultIconColor(views::style::GetColor(
ui::NativeTheme::kColorId_LabelEnabledColor)); *this, views::style::CONTEXT_BUTTON, views::style::STYLE_PRIMARY));
} }
// Forward dragging and capture loss events, since this class doesn't have // Forward dragging and capture loss events, since this class doesn't have
...@@ -562,12 +562,11 @@ void DownloadItemView::OnPaintBackground(gfx::Canvas* canvas) { ...@@ -562,12 +562,11 @@ void DownloadItemView::OnPaintBackground(gfx::Canvas* canvas) {
// Draw the separator as part of the background. It will be covered by the // Draw the separator as part of the background. It will be covered by the
// focus ring when the view has focus. // focus ring when the view has focus.
const int end_x = base::i18n::IsRTL() ? 0 : width() - 1; gfx::Rect rect(0, 0, 1, height());
const SkColor separator_color = GetThemeProvider()->GetColor( rect.Inset(0, kTopBottomPadding);
ThemeProperties::COLOR_TOOLBAR_VERTICAL_SEPARATOR); canvas->FillRect(GetMirroredRect(rect),
canvas->DrawLine(gfx::Point(end_x, kTopBottomPadding), GetThemeProvider()->GetColor(
gfx::Point(end_x, height() - kTopBottomPadding), ThemeProperties::COLOR_TOOLBAR_VERTICAL_SEPARATOR));
separator_color);
} }
void DownloadItemView::OnPaint(gfx::Canvas* canvas) { void DownloadItemView::OnPaint(gfx::Canvas* canvas) {
...@@ -584,10 +583,9 @@ void DownloadItemView::OnPaint(gfx::Canvas* canvas) { ...@@ -584,10 +583,9 @@ void DownloadItemView::OnPaint(gfx::Canvas* canvas) {
// Paint download progress. // Paint download progress.
// TODO(pkasting): Use a child view to display this. // TODO(pkasting): Use a child view to display this.
int progress_x = base::i18n::IsRTL() const int progress_x =
? width() - kStartPadding - kProgressIndicatorSize GetMirroredXWithWidthInView(kStartPadding, kProgressIndicatorSize);
: kStartPadding; const int progress_y = CenterY(kProgressIndicatorSize);
int progress_y = CenterY(kProgressIndicatorSize);
const gfx::RectF progress_bounds( const gfx::RectF progress_bounds(
progress_x, progress_y, kProgressIndicatorSize, kProgressIndicatorSize); progress_x, progress_y, kProgressIndicatorSize, kProgressIndicatorSize);
const download::DownloadItem::DownloadState state = model_->GetState(); const download::DownloadItem::DownloadState state = model_->GetState();
...@@ -703,7 +701,7 @@ void DownloadItemView::UpdateMode(Mode mode) { ...@@ -703,7 +701,7 @@ void DownloadItemView::UpdateMode(Mode mode) {
if (mode_ == Mode::kNormal) { if (mode_ == Mode::kNormal) {
UpdateAccessibleAlertAndTimersForNormalMode(); UpdateAccessibleAlertAndTimersForNormalMode();
} else if (is_download_warning(mode_)) { } else if (is_download_warning(mode_)) {
download::DownloadDangerType danger_type = model_->GetDangerType(); const auto danger_type = model_->GetDangerType();
RecordDangerousDownloadWarningShown(danger_type); RecordDangerousDownloadWarningShown(danger_type);
announce_accessible_alert_soon_ = true; announce_accessible_alert_soon_ = true;
if (danger_type == download::DOWNLOAD_DANGER_TYPE_PROMPT_FOR_SCANNING) { if (danger_type == download::DOWNLOAD_DANGER_TYPE_PROMPT_FOR_SCANNING) {
...@@ -880,7 +878,7 @@ base::string16 DownloadItemView::GetInProgressAccessibleAlertText() const { ...@@ -880,7 +878,7 @@ base::string16 DownloadItemView::GetInProgressAccessibleAlertText() const {
if (remaining.is_zero()) if (remaining.is_zero())
return base::string16(); return base::string16();
base::string16 remaining_string = const base::string16 remaining_string =
ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_REMAINING, ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_REMAINING,
ui::TimeFormat::LENGTH_SHORT, remaining); ui::TimeFormat::LENGTH_SHORT, remaining);
return l10n_util::GetStringFUTF16( return l10n_util::GetStringFUTF16(
...@@ -896,11 +894,10 @@ base::string16 DownloadItemView::GetInProgressAccessibleAlertText() const { ...@@ -896,11 +894,10 @@ base::string16 DownloadItemView::GetInProgressAccessibleAlertText() const {
} }
// Percent remaining is also unknown, announce bytes to download. // Percent remaining is also unknown, announce bytes to download.
base::string16 file_name =
model_->GetFileNameToReportUser().LossyDisplayName();
return l10n_util::GetStringFUTF16( return l10n_util::GetStringFUTF16(
IDS_DOWNLOAD_STATUS_IN_PROGRESS_ACCESSIBLE_ALERT, IDS_DOWNLOAD_STATUS_IN_PROGRESS_ACCESSIBLE_ALERT,
ui::FormatBytes(model_->GetTotalBytes()), file_name); ui::FormatBytes(model_->GetTotalBytes()),
model_->GetFileNameToReportUser().LossyDisplayName());
} }
void DownloadItemView::AnnounceAccessibleAlert() { void DownloadItemView::AnnounceAccessibleAlert() {
...@@ -1104,10 +1101,7 @@ int DownloadItemView::GetLabelWidth(const views::StyledLabel& label) const { ...@@ -1104,10 +1101,7 @@ int DownloadItemView::GetLabelWidth(const views::StyledLabel& label) const {
void DownloadItemView::SetDropdownPressed(bool pressed) { void DownloadItemView::SetDropdownPressed(bool pressed) {
if (dropdown_pressed_ != pressed) { if (dropdown_pressed_ != pressed) {
dropdown_pressed_ = pressed; dropdown_pressed_ = pressed;
dropdown_button_->AnimateInkDrop(dropdown_pressed_ dropdown_button_->SetHighlighted(dropdown_pressed_);
? views::InkDropState::ACTIVATED
: views::InkDropState::DEACTIVATED,
nullptr);
UpdateDropdownButtonImage(); UpdateDropdownButtonImage();
} }
} }
...@@ -1171,20 +1165,16 @@ void DownloadItemView::OpenDownloadDuringAsyncScanning() { ...@@ -1171,20 +1165,16 @@ void DownloadItemView::OpenDownloadDuringAsyncScanning() {
bool DownloadItemView::SubmitDownloadToFeedbackService( bool DownloadItemView::SubmitDownloadToFeedbackService(
DownloadCommands::Command command) const { DownloadCommands::Command command) const {
#if BUILDFLAG(FULL_SAFE_BROWSING) #if BUILDFLAG(FULL_SAFE_BROWSING)
safe_browsing::SafeBrowsingService* sb_service = auto* const sb_service = g_browser_process->safe_browsing_service();
g_browser_process->safe_browsing_service();
if (!sb_service) if (!sb_service)
return false; return false;
safe_browsing::DownloadProtectionService* dp_service = auto* const dp_service = sb_service->download_protection_service();
sb_service->download_protection_service();
if (!dp_service) if (!dp_service)
return false; return false;
// TODO(shaktisahu): Enable feedback service for offline item. // TODO(shaktisahu): Enable feedback service for offline item.
if (model_->download()) { return !model_->download() ||
return dp_service->MaybeBeginFeedbackForDownload( dp_service->MaybeBeginFeedbackForDownload(shelf_->browser()->profile(),
shelf_->browser()->profile(), model_->download(), command); model_->download(), command);
}
return true;
#else #else
NOTREACHED(); NOTREACHED();
return false; return false;
......
...@@ -25,7 +25,7 @@ void DownloadShelfContextMenuView::Run( ...@@ -25,7 +25,7 @@ void DownloadShelfContextMenuView::Run(
views::Widget* parent_widget, views::Widget* parent_widget,
const gfx::Rect& rect, const gfx::Rect& rect,
ui::MenuSourceType source_type, ui::MenuSourceType source_type,
const base::Closure& on_menu_closed_callback) { base::RepeatingClosure on_menu_closed_callback) {
using Position = views::MenuAnchorPosition; using Position = views::MenuAnchorPosition;
ui::MenuModel* menu_model = GetMenuModel(); ui::MenuModel* menu_model = GetMenuModel();
// Run() should not be getting called if the DownloadItem was destroyed. // Run() should not be getting called if the DownloadItem was destroyed.
...@@ -35,7 +35,8 @@ void DownloadShelfContextMenuView::Run( ...@@ -35,7 +35,8 @@ void DownloadShelfContextMenuView::Run(
menu_model, menu_model,
views::MenuRunner::HAS_MNEMONICS | views::MenuRunner::CONTEXT_MENU, views::MenuRunner::HAS_MNEMONICS | views::MenuRunner::CONTEXT_MENU,
base::BindRepeating(&DownloadShelfContextMenuView::OnMenuClosed, base::BindRepeating(&DownloadShelfContextMenuView::OnMenuClosed,
base::Unretained(this), on_menu_closed_callback)); base::Unretained(this),
std::move(on_menu_closed_callback)));
// The menu's alignment is determined based on the UI layout. // The menu's alignment is determined based on the UI layout.
Position position; Position position;
...@@ -48,7 +49,7 @@ void DownloadShelfContextMenuView::Run( ...@@ -48,7 +49,7 @@ void DownloadShelfContextMenuView::Run(
} }
void DownloadShelfContextMenuView::OnMenuClosed( void DownloadShelfContextMenuView::OnMenuClosed(
const base::Closure& on_menu_closed_callback) { base::RepeatingClosure on_menu_closed_callback) {
close_time_ = base::TimeTicks::Now(); close_time_ = base::TimeTicks::Now();
// This must be run before clearing |menu_runner_| who owns the reference. // This must be run before clearing |menu_runner_| who owns the reference.
......
...@@ -38,11 +38,11 @@ class DownloadShelfContextMenuView : public DownloadShelfContextMenu { ...@@ -38,11 +38,11 @@ class DownloadShelfContextMenuView : public DownloadShelfContextMenu {
void Run(views::Widget* parent_widget, void Run(views::Widget* parent_widget,
const gfx::Rect& rect, const gfx::Rect& rect,
ui::MenuSourceType source_type, ui::MenuSourceType source_type,
const base::Closure& on_menu_closed_callback); base::RepeatingClosure on_menu_closed_callback);
private: private:
// Callback for MenuRunner. // Callback for MenuRunner.
void OnMenuClosed(const base::Closure& on_menu_closed_callback); void OnMenuClosed(base::RepeatingClosure on_menu_closed_callback);
void ExecuteCommand(int command_id, int event_flags) override; void ExecuteCommand(int command_id, int event_flags) override;
......
...@@ -45,8 +45,6 @@ ...@@ -45,8 +45,6 @@
#include "ui/views/view.h" #include "ui/views/view.h"
#include "ui/views/widget/widget.h" #include "ui/views/widget/widget.h"
using download::DownloadItem;
namespace { namespace {
// TODO(pkasting): Replace these with LayoutProvider constants // TODO(pkasting): Replace these with LayoutProvider constants
...@@ -94,9 +92,10 @@ DownloadShelfView::DownloadShelfView(Browser* browser, BrowserView* parent) ...@@ -94,9 +92,10 @@ DownloadShelfView::DownloadShelfView(Browser* browser, BrowserView* parent)
shelf_animation_.SetSlideDuration(base::TimeDelta()); shelf_animation_.SetSlideDuration(base::TimeDelta());
} }
GetViewAccessibility().OverrideName( views::ViewAccessibility& accessibility = GetViewAccessibility();
accessibility.OverrideName(
l10n_util::GetStringUTF16(IDS_ACCNAME_DOWNLOADS_BAR)); l10n_util::GetStringUTF16(IDS_ACCNAME_DOWNLOADS_BAR));
GetViewAccessibility().OverrideRole(ax::mojom::Role::kGroup); accessibility.OverrideRole(ax::mojom::Role::kGroup);
// Delay 5 seconds if the mouse leaves the shelf by way of entering another // Delay 5 seconds if the mouse leaves the shelf by way of entering another
// window. This is much larger than the normal delay as opening a download is // window. This is much larger than the normal delay as opening a download is
...@@ -139,14 +138,10 @@ gfx::Size DownloadShelfView::CalculatePreferredSize() const { ...@@ -139,14 +138,10 @@ gfx::Size DownloadShelfView::CalculatePreferredSize() const {
void DownloadShelfView::Layout() { void DownloadShelfView::Layout() {
int x = kStartPadding; int x = kStartPadding;
const int download_items_end =
int download_items_end =
std::max(0, width() - kEndPadding - close_button_->width() - std::max(0, width() - kEndPadding - close_button_->width() -
kCloseAndLinkPadding - show_all_view_->width()); kCloseAndLinkPadding - show_all_view_->width());
// If there is not enough room to show the first download item, show the const bool all_downloads_hidden =
// "Show all downloads" link to the left to make it more visible that there is
// something to see.
bool all_downloads_hidden =
!download_views_.empty() && !download_views_.empty() &&
(download_views_.back()->GetPreferredSize().width() > (download_views_.back()->GetPreferredSize().width() >
(download_items_end - x)); (download_items_end - x));
...@@ -155,13 +150,16 @@ void DownloadShelfView::Layout() { ...@@ -155,13 +150,16 @@ void DownloadShelfView::Layout() {
return std::max((height - item_height) / 2, kTopPadding); return std::max((height - item_height) / 2, kTopPadding);
}; };
show_all_view_->SetPosition({all_downloads_hidden ? x : download_items_end, show_all_view_->SetPosition(
center_y(show_all_view_->height())}); {// If none of the download items can be shown, move the link to the left
// to make it more obvious that there is something to see.
all_downloads_hidden ? x : download_items_end,
center_y(show_all_view_->height())});
close_button_->SetPosition( close_button_->SetPosition(
{show_all_view_->bounds().right() + kCloseAndLinkPadding, {show_all_view_->bounds().right() + kCloseAndLinkPadding,
center_y(close_button_->height())}); center_y(close_button_->height())});
if (all_downloads_hidden) { if (all_downloads_hidden) {
// Let's hide all the items.
for (auto* view : download_views_) for (auto* view : download_views_)
view->SetVisible(false); view->SetVisible(false);
return; return;
...@@ -169,7 +167,6 @@ void DownloadShelfView::Layout() { ...@@ -169,7 +167,6 @@ void DownloadShelfView::Layout() {
for (auto* view : base::Reversed(download_views_)) { for (auto* view : base::Reversed(download_views_)) {
gfx::Size view_size = view->GetPreferredSize(); gfx::Size view_size = view->GetPreferredSize();
if (view == download_views_.back()) { if (view == download_views_.back()) {
view_size = gfx::Tween::SizeValueBetween( view_size = gfx::Tween::SizeValueBetween(
new_item_animation_.GetCurrentValue(), new_item_animation_.GetCurrentValue(),
...@@ -177,24 +174,20 @@ void DownloadShelfView::Layout() { ...@@ -177,24 +174,20 @@ void DownloadShelfView::Layout() {
} }
const gfx::Rect bounds({x, center_y(view_size.height())}, view_size); const gfx::Rect bounds({x, center_y(view_size.height())}, view_size);
x = bounds.right(); view->SetBoundsRect(bounds);
view->SetVisible(bounds.right() < download_items_end);
// Make sure our item can be contained within the shelf. x = bounds.right();
if (x < download_items_end) {
view->SetVisible(true);
view->SetBoundsRect(bounds);
} else {
view->SetVisible(false);
}
} }
} }
void DownloadShelfView::AnimationProgressed(const gfx::Animation* animation) { void DownloadShelfView::AnimationProgressed(const gfx::Animation* animation) {
if (animation == &new_item_animation_) { if (animation == &new_item_animation_) {
InvalidateLayout(); InvalidateLayout();
} else if (animation == &shelf_animation_) { } else {
DCHECK_EQ(&shelf_animation_, animation);
// Force a re-layout of the parent, which will call back into // Force a re-layout of the parent, which will call back into
// GetPreferredSize, where we will do our animation. In the case where the // GetPreferredSize(), where we will do our animation. In the case where the
// animation is hiding, we do a full resize - the fast resizing would // animation is hiding, we do a full resize - the fast resizing would
// otherwise leave blank white areas where the shelf was and where the // otherwise leave blank white areas where the shelf was and where the
// user's eye is. Thankfully bottom-resizing is a lot faster than // user's eye is. Thankfully bottom-resizing is a lot faster than
...@@ -215,21 +208,18 @@ void DownloadShelfView::AnimationEnded(const gfx::Animation* animation) { ...@@ -215,21 +208,18 @@ void DownloadShelfView::AnimationEnded(const gfx::Animation* animation) {
if (shown || is_hidden()) if (shown || is_hidden())
return; return;
// When the close animation is complete, remove all completed downloads. // Remove all completed downloads.
size_t i = 0; for (size_t i = 0; i < download_views_.size();) {
while (i < download_views_.size()) { DownloadItemView* const view = download_views_[i];
DownloadUIModel* download = download_views_[i]->model(); DownloadUIModel* const model = view->model();
DownloadItem::DownloadState state = download->GetState(); if ((model->GetState() == download::DownloadItem::IN_PROGRESS) ||
bool is_transfer_done = state == DownloadItem::COMPLETE || model->IsDangerous()) {
state == DownloadItem::CANCELLED ||
state == DownloadItem::INTERRUPTED;
if (is_transfer_done && !download->IsDangerous()) {
RemoveDownloadView(download_views_[i]);
} else {
// Treat the item as opened when we close. This way if we get shown again // Treat the item as opened when we close. This way if we get shown again
// the user need not open this item for the shelf to auto-close. // the user need not open this item for the shelf to auto-close.
download->SetOpened(true); model->SetOpened(true);
++i; ++i;
} else {
RemoveDownloadView(view);
} }
} }
...@@ -245,14 +235,14 @@ void DownloadShelfView::AnimationEnded(const gfx::Animation* animation) { ...@@ -245,14 +235,14 @@ void DownloadShelfView::AnimationEnded(const gfx::Animation* animation) {
SetVisible(false); SetVisible(false);
} }
void DownloadShelfView::ButtonPressed( void DownloadShelfView::ButtonPressed(views::Button* button,
views::Button* button, const ui::Event& event) { const ui::Event& event) {
if (button == close_button_) if (button == close_button_) {
Close(); Close();
else if (button == show_all_view_) } else {
DCHECK_EQ(show_all_view_, button);
chrome::ShowDownloads(browser()); chrome::ShowDownloads(browser());
else }
NOTREACHED();
} }
void DownloadShelfView::MouseMovedOutOfHost() { void DownloadShelfView::MouseMovedOutOfHost() {
...@@ -267,11 +257,11 @@ void DownloadShelfView::AutoClose() { ...@@ -267,11 +257,11 @@ void DownloadShelfView::AutoClose() {
void DownloadShelfView::RemoveDownloadView(View* view) { void DownloadShelfView::RemoveDownloadView(View* view) {
DCHECK(view); DCHECK(view);
auto i = find(download_views_.begin(), download_views_.end(), view); const auto i =
std::find(download_views_.begin(), download_views_.end(), view);
DCHECK(i != download_views_.end()); DCHECK(i != download_views_.end());
download_views_.erase(i); download_views_.erase(i);
RemoveChildView(view); RemoveChildViewT(view);
delete view;
if (download_views_.empty()) if (download_views_.empty())
Close(); Close();
else else
...@@ -325,7 +315,7 @@ void DownloadShelfView::DoShowDownload( ...@@ -325,7 +315,7 @@ void DownloadShelfView::DoShowDownload(
if (was_empty && !shelf_animation_.is_animating() && GetVisible()) { if (was_empty && !shelf_animation_.is_animating() && GetVisible()) {
// Force a re-layout of the parent to adjust height of shelf properly. // Force a re-layout of the parent to adjust height of shelf properly.
parent_->ToolbarSizeChanged(shelf_animation_.IsShowing()); parent_->ToolbarSizeChanged(true);
} }
} }
...@@ -371,8 +361,6 @@ void DownloadShelfView::OnThemeChanged() { ...@@ -371,8 +361,6 @@ void DownloadShelfView::OnThemeChanged() {
} }
views::View* DownloadShelfView::GetDefaultFocusableChild() { views::View* DownloadShelfView::GetDefaultFocusableChild() {
if (!download_views_.empty()) return download_views_.empty() ? static_cast<views::View*>(show_all_view_)
return download_views_.back(); : download_views_.back();
return show_all_view_;
} }
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