| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "chrome/browser/ui/views/download/download_item_view_md.h" | 5 #include "chrome/browser/ui/views/download/download_item_view_md.h" | 
| 6 | 6 | 
| 7 #include <algorithm> | 7 #include <algorithm> | 
| 8 #include <vector> | 8 #include <vector> | 
| 9 | 9 | 
| 10 #include "base/bind.h" | 10 #include "base/bind.h" | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 23 #include "chrome/browser/download/chrome_download_manager_delegate.h" | 23 #include "chrome/browser/download/chrome_download_manager_delegate.h" | 
| 24 #include "chrome/browser/download/download_item_model.h" | 24 #include "chrome/browser/download/download_item_model.h" | 
| 25 #include "chrome/browser/download/download_stats.h" | 25 #include "chrome/browser/download/download_stats.h" | 
| 26 #include "chrome/browser/download/drag_download_item.h" | 26 #include "chrome/browser/download/drag_download_item.h" | 
| 27 #include "chrome/browser/extensions/api/experience_sampling_private/experience_s
      ampling.h" | 27 #include "chrome/browser/extensions/api/experience_sampling_private/experience_s
      ampling.h" | 
| 28 #include "chrome/browser/profiles/profile.h" | 28 #include "chrome/browser/profiles/profile.h" | 
| 29 #include "chrome/browser/safe_browsing/download_feedback_service.h" | 29 #include "chrome/browser/safe_browsing/download_feedback_service.h" | 
| 30 #include "chrome/browser/safe_browsing/download_protection_service.h" | 30 #include "chrome/browser/safe_browsing/download_protection_service.h" | 
| 31 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 31 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 
| 32 #include "chrome/browser/themes/theme_properties.h" | 32 #include "chrome/browser/themes/theme_properties.h" | 
|  | 33 #include "chrome/browser/ui/views/bar_control_button.h" | 
| 33 #include "chrome/browser/ui/views/download/download_feedback_dialog_view.h" | 34 #include "chrome/browser/ui/views/download/download_feedback_dialog_view.h" | 
| 34 #include "chrome/browser/ui/views/download/download_shelf_context_menu_view.h" | 35 #include "chrome/browser/ui/views/download/download_shelf_context_menu_view.h" | 
| 35 #include "chrome/browser/ui/views/download/download_shelf_view.h" | 36 #include "chrome/browser/ui/views/download/download_shelf_view.h" | 
| 36 #include "chrome/browser/ui/views/frame/browser_view.h" | 37 #include "chrome/browser/ui/views/frame/browser_view.h" | 
| 37 #include "chrome/common/pref_names.h" | 38 #include "chrome/common/pref_names.h" | 
| 38 #include "chrome/grit/generated_resources.h" | 39 #include "chrome/grit/generated_resources.h" | 
| 39 #include "content/public/browser/download_danger_type.h" | 40 #include "content/public/browser/download_danger_type.h" | 
| 40 #include "third_party/icu/source/common/unicode/uchar.h" | 41 #include "third_party/icu/source/common/unicode/uchar.h" | 
| 41 #include "ui/accessibility/ax_view_state.h" | 42 #include "ui/accessibility/ax_view_state.h" | 
| 42 #include "ui/base/l10n/l10n_util.h" | 43 #include "ui/base/l10n/l10n_util.h" | 
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 96 // The space between the Save and Discard buttons when prompting for a dangerous | 97 // The space between the Save and Discard buttons when prompting for a dangerous | 
| 97 // download. | 98 // download. | 
| 98 const int kButtonPadding = 5; | 99 const int kButtonPadding = 5; | 
| 99 | 100 | 
| 100 // The space on the left and right side of the dangerous download label. | 101 // The space on the left and right side of the dangerous download label. | 
| 101 const int kLabelPadding = 8; | 102 const int kLabelPadding = 8; | 
| 102 | 103 | 
| 103 // Height/width of the warning icon, also in dp. | 104 // Height/width of the warning icon, also in dp. | 
| 104 const int kWarningIconSize = 24; | 105 const int kWarningIconSize = 24; | 
| 105 | 106 | 
| 106 const SkColor kFileNameDisabledColor = SkColorSetRGB(171, 192, 212); |  | 
| 107 |  | 
| 108 // How long the 'download complete' animation should last for. | 107 // How long the 'download complete' animation should last for. | 
| 109 const int kCompleteAnimationDurationMs = 2500; | 108 const int kCompleteAnimationDurationMs = 2500; | 
| 110 | 109 | 
| 111 // How long the 'download interrupted' animation should last for. | 110 // How long the 'download interrupted' animation should last for. | 
| 112 const int kInterruptedAnimationDurationMs = 2500; | 111 const int kInterruptedAnimationDurationMs = 2500; | 
| 113 | 112 | 
| 114 // How long we keep the item disabled after the user clicked it to open the | 113 // How long we keep the item disabled after the user clicked it to open the | 
| 115 // downloaded item. | 114 // downloaded item. | 
| 116 const int kDisabledOnOpenDuration = 3000; | 115 const int kDisabledOnOpenDuration = 3000; | 
| 117 | 116 | 
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 173   status_font_list_ = | 172   status_font_list_ = | 
| 174       rb.GetFontList(ui::ResourceBundle::BaseFont).DeriveWithSizeDelta(-2); | 173       rb.GetFontList(ui::ResourceBundle::BaseFont).DeriveWithSizeDelta(-2); | 
| 175 | 174 | 
| 176   body_hover_animation_.reset(new gfx::SlideAnimation(this)); | 175   body_hover_animation_.reset(new gfx::SlideAnimation(this)); | 
| 177   drop_hover_animation_.reset(new gfx::SlideAnimation(this)); | 176   drop_hover_animation_.reset(new gfx::SlideAnimation(this)); | 
| 178 | 177 | 
| 179   SetAccessibilityFocusable(true); | 178   SetAccessibilityFocusable(true); | 
| 180 | 179 | 
| 181   OnDownloadUpdated(download()); | 180   OnDownloadUpdated(download()); | 
| 182 | 181 | 
| 183   // TODO(estade): share this button init code with the find in page bar; | 182   dropdown_button_ = new BarControlButton(this); | 
| 184   // also fix theming. |  | 
| 185   dropdown_button_ = new views::ImageButton(this); |  | 
| 186   dropdown_button_->SetBorder(views::Border::CreateEmptyBorder(4, 4, 4, 4)); |  | 
| 187   dropdown_button_->SetImageAlignment(views::ImageButton::ALIGN_CENTER, |  | 
| 188                                       views::ImageButton::ALIGN_MIDDLE); |  | 
| 189   AddChildView(dropdown_button_); | 183   AddChildView(dropdown_button_); | 
| 190   SetDropdownState(NORMAL); | 184   SetDropdownState(NORMAL); | 
| 191   UpdateColorsFromTheme(); | 185   UpdateColorsFromTheme(); | 
| 192 } | 186 } | 
| 193 | 187 | 
| 194 DownloadItemViewMd::~DownloadItemViewMd() { | 188 DownloadItemViewMd::~DownloadItemViewMd() { | 
| 195   StopDownloadProgress(); | 189   StopDownloadProgress(); | 
| 196   download()->RemoveObserver(this); | 190   download()->RemoveObserver(this); | 
| 197 | 191 | 
| 198   // ExperienceSampling: If the user took no action to remove the warning | 192   // ExperienceSampling: If the user took no action to remove the warning | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 215 } | 209 } | 
| 216 | 210 | 
| 217 void DownloadItemViewMd::StopDownloadProgress() { | 211 void DownloadItemViewMd::StopDownloadProgress() { | 
| 218   if (!progress_timer_.IsRunning()) | 212   if (!progress_timer_.IsRunning()) | 
| 219     return; | 213     return; | 
| 220   previous_progress_elapsed_ += base::TimeTicks::Now() - progress_start_time_; | 214   previous_progress_elapsed_ += base::TimeTicks::Now() - progress_start_time_; | 
| 221   progress_start_time_ = base::TimeTicks(); | 215   progress_start_time_ = base::TimeTicks(); | 
| 222   progress_timer_.Stop(); | 216   progress_timer_.Stop(); | 
| 223 } | 217 } | 
| 224 | 218 | 
|  | 219 // static | 
|  | 220 SkColor DownloadItemViewMd::GetTextColorForThemeProvider( | 
|  | 221     ui::ThemeProvider* theme) { | 
|  | 222   return theme ? theme->GetColor(ThemeProperties::COLOR_BOOKMARK_TEXT) | 
|  | 223                : SK_ColorRED; | 
|  | 224 } | 
|  | 225 | 
| 225 void DownloadItemViewMd::OnExtractIconComplete(gfx::Image* icon_bitmap) { | 226 void DownloadItemViewMd::OnExtractIconComplete(gfx::Image* icon_bitmap) { | 
| 226   if (icon_bitmap) | 227   if (icon_bitmap) | 
| 227     shelf_->SchedulePaint(); | 228     shelf_->SchedulePaint(); | 
| 228 } | 229 } | 
| 229 | 230 | 
| 230 // DownloadObserver interface. | 231 // DownloadObserver interface. | 
| 231 | 232 | 
| 232 // Update the progress graphic on the icon and our text status label | 233 // Update the progress graphic on the icon and our text status label | 
| 233 // to reflect our current bytes downloaded, time remaining. | 234 // to reflect our current bytes downloaded, time remaining. | 
| 234 void DownloadItemViewMd::OnDownloadUpdated(DownloadItem* download_item) { | 235 void DownloadItemViewMd::OnDownloadUpdated(DownloadItem* download_item) { | 
| (...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 581 void DownloadItemViewMd::DrawStatusText(gfx::Canvas* canvas) { | 582 void DownloadItemViewMd::DrawStatusText(gfx::Canvas* canvas) { | 
| 582   if (status_text_.empty() || IsShowingWarningDialog()) | 583   if (status_text_.empty() || IsShowingWarningDialog()) | 
| 583     return; | 584     return; | 
| 584 | 585 | 
| 585   int mirrored_x = GetMirroredXWithWidthInView( | 586   int mirrored_x = GetMirroredXWithWidthInView( | 
| 586       kStartPadding + DownloadShelf::kProgressIndicatorSize + | 587       kStartPadding + DownloadShelf::kProgressIndicatorSize + | 
| 587           kProgressTextPadding, | 588           kProgressTextPadding, | 
| 588       kTextWidth); | 589       kTextWidth); | 
| 589   int y = | 590   int y = | 
| 590       GetYForFilenameText() + font_list_.GetBaseline() + kVerticalTextPadding; | 591       GetYForFilenameText() + font_list_.GetBaseline() + kVerticalTextPadding; | 
| 591   SkColor file_name_color = SkColorSetA( |  | 
| 592       GetThemeProvider()->GetColor(ThemeProperties::COLOR_BOOKMARK_TEXT), 0xC7); |  | 
| 593   canvas->DrawStringRect( | 592   canvas->DrawStringRect( | 
| 594       status_text_, status_font_list_, file_name_color, | 593       status_text_, status_font_list_, GetDimmedTextColor(), | 
| 595       gfx::Rect(mirrored_x, y, kTextWidth, status_font_list_.GetHeight())); | 594       gfx::Rect(mirrored_x, y, kTextWidth, status_font_list_.GetHeight())); | 
| 596 } | 595 } | 
| 597 | 596 | 
| 598 void DownloadItemViewMd::DrawFilename(gfx::Canvas* canvas) { | 597 void DownloadItemViewMd::DrawFilename(gfx::Canvas* canvas) { | 
| 599   if (IsShowingWarningDialog()) | 598   if (IsShowingWarningDialog()) | 
| 600     return; | 599     return; | 
| 601 | 600 | 
| 602   // Print the text, left aligned and always print the file extension. | 601   // Print the text, left aligned and always print the file extension. | 
| 603   // Last value of x was the end of the right image, just before the button. | 602   // Last value of x was the end of the right image, just before the button. | 
| 604   // Note that in dangerous mode we use a label (as the text is multi-line). | 603   // Note that in dangerous mode we use a label (as the text is multi-line). | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 617                            kTextWidth - status_string_width); | 616                            kTextWidth - status_string_width); | 
| 618     // Last, concat the whole string. | 617     // Last, concat the whole string. | 
| 619     filename = l10n_util::GetStringFUTF16(IDS_DOWNLOAD_STATUS_OPENING, | 618     filename = l10n_util::GetStringFUTF16(IDS_DOWNLOAD_STATUS_OPENING, | 
| 620                                           filename_string); | 619                                           filename_string); | 
| 621   } | 620   } | 
| 622 | 621 | 
| 623   int mirrored_x = GetMirroredXWithWidthInView( | 622   int mirrored_x = GetMirroredXWithWidthInView( | 
| 624       kStartPadding + DownloadShelf::kProgressIndicatorSize + | 623       kStartPadding + DownloadShelf::kProgressIndicatorSize + | 
| 625           kProgressTextPadding, | 624           kProgressTextPadding, | 
| 626       kTextWidth); | 625       kTextWidth); | 
| 627   SkColor file_name_color = |  | 
| 628       GetThemeProvider()->GetColor(ThemeProperties::COLOR_BOOKMARK_TEXT); |  | 
| 629 |  | 
| 630   canvas->DrawStringRect(filename, font_list_, | 626   canvas->DrawStringRect(filename, font_list_, | 
| 631                          enabled() ? file_name_color : kFileNameDisabledColor, | 627                          enabled() ? GetTextColor() : GetDimmedTextColor(), | 
| 632                          gfx::Rect(mirrored_x, GetYForFilenameText(), | 628                          gfx::Rect(mirrored_x, GetYForFilenameText(), | 
| 633                                    kTextWidth, font_list_.GetHeight())); | 629                                    kTextWidth, font_list_.GetHeight())); | 
| 634 } | 630 } | 
| 635 | 631 | 
| 636 void DownloadItemViewMd::DrawIcon(gfx::Canvas* canvas) { | 632 void DownloadItemViewMd::DrawIcon(gfx::Canvas* canvas) { | 
| 637   if (IsShowingWarningDialog()) { | 633   if (IsShowingWarningDialog()) { | 
| 638     int icon_x = base::i18n::IsRTL() | 634     int icon_x = base::i18n::IsRTL() | 
| 639                      ? width() - kWarningIconSize - kStartPadding | 635                      ? width() - kWarningIconSize - kStartPadding | 
| 640                      : kStartPadding; | 636                      : kStartPadding; | 
| 641     int icon_y = (height() - kWarningIconSize) / 2; | 637     int icon_y = (height() - kWarningIconSize) / 2; | 
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 753   if (last_download_item_path_ == current_download_path) | 749   if (last_download_item_path_ == current_download_path) | 
| 754     return; | 750     return; | 
| 755 | 751 | 
| 756   LoadIcon(); | 752   LoadIcon(); | 
| 757 } | 753 } | 
| 758 | 754 | 
| 759 void DownloadItemViewMd::UpdateColorsFromTheme() { | 755 void DownloadItemViewMd::UpdateColorsFromTheme() { | 
| 760   if (!GetThemeProvider()) | 756   if (!GetThemeProvider()) | 
| 761     return; | 757     return; | 
| 762 | 758 | 
| 763   if (dangerous_download_label_) { | 759   if (dangerous_download_label_) | 
| 764     dangerous_download_label_->SetEnabledColor( | 760     dangerous_download_label_->SetEnabledColor(GetTextColor()); | 
| 765         GetThemeProvider()->GetColor(ThemeProperties::COLOR_BOOKMARK_TEXT)); |  | 
| 766   } |  | 
| 767   SetBorder(make_scoped_ptr(new SeparatorBorder( | 761   SetBorder(make_scoped_ptr(new SeparatorBorder( | 
| 768       GetThemeProvider()->GetColor(ThemeProperties::COLOR_TOOLBAR_SEPARATOR)))); | 762       GetThemeProvider()->GetColor(ThemeProperties::COLOR_TOOLBAR_SEPARATOR)))); | 
| 769 } | 763 } | 
| 770 | 764 | 
| 771 void DownloadItemViewMd::ShowContextMenuImpl(const gfx::Rect& rect, | 765 void DownloadItemViewMd::ShowContextMenuImpl(const gfx::Rect& rect, | 
| 772                                              ui::MenuSourceType source_type) { | 766                                              ui::MenuSourceType source_type) { | 
| 773   // Similar hack as in MenuButton. | 767   // Similar hack as in MenuButton. | 
| 774   // We're about to show the menu from a mouse press. By showing from the | 768   // We're about to show the menu from a mouse press. By showing from the | 
| 775   // mouse press event we block RootView in mouse dispatching. This also | 769   // mouse press event we block RootView in mouse dispatching. This also | 
| 776   // appears to cause RootView to get a mouse pressed BEFORE the mouse | 770   // appears to cause RootView to get a mouse pressed BEFORE the mouse | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 818   OpenDownload(); | 812   OpenDownload(); | 
| 819 } | 813 } | 
| 820 | 814 | 
| 821 void DownloadItemViewMd::SetDropdownState(State new_state) { | 815 void DownloadItemViewMd::SetDropdownState(State new_state) { | 
| 822   // Avoid extra SchedulePaint()s if the state is going to be the same and | 816   // Avoid extra SchedulePaint()s if the state is going to be the same and | 
| 823   // |dropdown_button_| has already been initialized. | 817   // |dropdown_button_| has already been initialized. | 
| 824   if (dropdown_state_ == new_state && | 818   if (dropdown_state_ == new_state && | 
| 825       !dropdown_button_->GetImage(views::CustomButton::STATE_NORMAL).isNull()) | 819       !dropdown_button_->GetImage(views::CustomButton::STATE_NORMAL).isNull()) | 
| 826     return; | 820     return; | 
| 827 | 821 | 
| 828   // TODO(estade): theme this color instead of using a constant. | 822   dropdown_button_->SetIcon( | 
| 829   gfx::ImageSkia image = | 823       new_state == PUSHED ? gfx::VectorIconId::FIND_NEXT | 
| 830       gfx::CreateVectorIcon(new_state == PUSHED ? gfx::VectorIconId::FIND_NEXT | 824                           : gfx::VectorIconId::FIND_PREV, | 
| 831                                                 : gfx::VectorIconId::FIND_PREV, | 825       base::Bind(&DownloadItemViewMd::GetTextColor, base::Unretained(this))); | 
| 832                             16, gfx::kChromeIconGrey); | 826   dropdown_button_->OnThemeChanged(); | 
| 833   dropdown_button_->SetImage(views::CustomButton::STATE_NORMAL, &image); |  | 
| 834   dropdown_state_ = new_state; | 827   dropdown_state_ = new_state; | 
| 835   SchedulePaint(); | 828   SchedulePaint(); | 
| 836 } | 829 } | 
| 837 | 830 | 
| 838 void DownloadItemViewMd::ClearWarningDialog() { | 831 void DownloadItemViewMd::ClearWarningDialog() { | 
| 839   DCHECK(download()->GetDangerType() == | 832   DCHECK(download()->GetDangerType() == | 
| 840          content::DOWNLOAD_DANGER_TYPE_USER_VALIDATED); | 833          content::DOWNLOAD_DANGER_TYPE_USER_VALIDATED); | 
| 841   DCHECK(mode_ == DANGEROUS_MODE || mode_ == MALICIOUS_MODE); | 834   DCHECK(mode_ == DANGEROUS_MODE || mode_ == MALICIOUS_MODE); | 
| 842 | 835 | 
| 843   mode_ = NORMAL_MODE; | 836   mode_ = NORMAL_MODE; | 
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1070     State to, | 1063     State to, | 
| 1071     gfx::SlideAnimation* animation) { | 1064     gfx::SlideAnimation* animation) { | 
| 1072   if (from == NORMAL && to == HOT) { | 1065   if (from == NORMAL && to == HOT) { | 
| 1073     animation->Show(); | 1066     animation->Show(); | 
| 1074   } else if (from == HOT && to == NORMAL) { | 1067   } else if (from == HOT && to == NORMAL) { | 
| 1075     animation->Hide(); | 1068     animation->Hide(); | 
| 1076   } else if (from != to) { | 1069   } else if (from != to) { | 
| 1077     animation->Reset((to == HOT) ? 1.0 : 0.0); | 1070     animation->Reset((to == HOT) ? 1.0 : 0.0); | 
| 1078   } | 1071   } | 
| 1079 } | 1072 } | 
|  | 1073 | 
|  | 1074 SkColor DownloadItemViewMd::GetTextColor() { | 
|  | 1075   return GetTextColorForThemeProvider(GetThemeProvider()); | 
|  | 1076 } | 
|  | 1077 | 
|  | 1078 SkColor DownloadItemViewMd::GetDimmedTextColor() { | 
|  | 1079   return SkColorSetA(GetTextColor(), 0xC7); | 
|  | 1080 } | 
| OLD | NEW | 
|---|