Chromium Code Reviews| Index: chrome/browser/ui/views/location_bar/origin_chip_view.cc |
| diff --git a/chrome/browser/ui/views/location_bar/origin_chip_view.cc b/chrome/browser/ui/views/location_bar/origin_chip_view.cc |
| index b73eca9167105216c73af4b999084519f9d22ea4..a2e73496bf64d8760b515259487655cd0d166872 100644 |
| --- a/chrome/browser/ui/views/location_bar/origin_chip_view.cc |
| +++ b/chrome/browser/ui/views/location_bar/origin_chip_view.cc |
| @@ -36,9 +36,9 @@ |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/base/resource/resource_bundle.h" |
| #include "ui/base/theme_provider.h" |
| -#include "ui/gfx/animation/slide_animation.h" |
| #include "ui/gfx/canvas.h" |
| #include "ui/gfx/font_list.h" |
| +#include "ui/gfx/text_utils.h" |
| #include "ui/views/background.h" |
| #include "ui/views/controls/button/label_button.h" |
| #include "ui/views/controls/button/label_button_border.h" |
| @@ -102,7 +102,6 @@ const int kEdgeThickness = 5; |
| const int k16x16IconLeadingSpacing = 1; |
| const int k16x16IconTrailingSpacing = 2; |
| const int kIconTextSpacing = 3; |
| -const int kTrailingLabelMargin = 0; |
| const int kNormalImages[3][9] = { |
| IMAGE_GRID(IDR_ORIGIN_CHIP_NORMAL), |
| @@ -136,7 +135,8 @@ OriginChipView::OriginChipView(LocationBarView* location_bar_view, |
| : LabelButton(this, base::string16()), |
| location_bar_view_(location_bar_view), |
| profile_(profile), |
| - showing_16x16_icon_(false) { |
| + showing_16x16_icon_(false), |
| + fade_in_animation_(this) { |
| scoped_refptr<SafeBrowsingService> sb_service = |
| g_browser_process->safe_browsing_service(); |
| // May not be set for unit tests. |
| @@ -154,12 +154,18 @@ OriginChipView::OriginChipView(LocationBarView* location_bar_view, |
| location_icon_view_->ShowTooltip(true); |
| AddChildView(location_icon_view_); |
| + ev_label_ = new views::Label(base::string16(), GetFontList()); |
| + ev_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| + ev_label_->SetElideBehavior(views::Label::NO_ELIDE); |
| + AddChildView(ev_label_); |
| + |
| host_label_ = new views::Label(base::string16(), GetFontList()); |
| + host_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| + host_label_->SetElideBehavior(views::Label::NO_ELIDE); |
| AddChildView(host_label_); |
| - fade_in_animation_.reset(new gfx::SlideAnimation(this)); |
| - fade_in_animation_->SetTweenType(gfx::Tween::LINEAR); |
| - fade_in_animation_->SetSlideDuration(300); |
| + fade_in_animation_.SetTweenType(gfx::Tween::LINEAR_OUT_SLOW_IN); |
| + fade_in_animation_.SetSlideDuration(175); |
| } |
| OriginChipView::~OriginChipView() { |
| @@ -169,7 +175,8 @@ OriginChipView::~OriginChipView() { |
| sb_service->ui_manager()->RemoveObserver(this); |
| } |
| -void OriginChipView::Update(content::WebContents* web_contents) { |
| +void OriginChipView::OnChanged() { |
| + content::WebContents* web_contents = location_bar_view_->GetWebContents(); |
| if (!web_contents) |
| return; |
| @@ -203,16 +210,14 @@ void OriginChipView::Update(content::WebContents* web_contents) { |
| SetBorderImages(kNormalImages); |
| } |
| + ev_label_->SetText(location_bar_view_->GetToolbarModel()->GetEVCertName()); |
| + ev_label_->SetVisible(security_level_ == ToolbarModel::EV_SECURE); |
| + |
| + // TODO(pkasting): Allow the origin chip to shrink, and use ElideHost(). |
| base::string16 host = |
| OriginChip::LabelFromURLForProfile(url_displayed_, profile_); |
| - if (security_level_ == ToolbarModel::EV_SECURE) { |
| - host = l10n_util::GetStringFUTF16(IDS_SITE_CHIP_EV_SSL_LABEL, |
| - location_bar_view_->GetToolbarModel()->GetEVCertName(), |
| - host); |
| - } |
| host_label_->SetText(host); |
| host_label_->SetTooltipText(base::UTF8ToUTF16(url.spec())); |
| - host_label_->SetElideBehavior(views::Label::NO_ELIDE); |
| int icon = location_bar_view_->GetToolbarModel()->GetIconForSecurityLevel( |
| security_level_); |
| @@ -241,113 +246,119 @@ void OriginChipView::Update(content::WebContents* web_contents) { |
| extension_icon_.reset(); |
| } |
| - Layout(); |
| - SchedulePaint(); |
| + if (visible()) { |
| + CancelFade(); |
|
Justin Donnelly
2014/05/29 21:37:29
Is this intended to cover navigation while the chi
Peter Kasting
2014/05/29 23:32:16
Yes, basically. Anything that changes the visible
|
| + Layout(); |
| + SchedulePaint(); |
| + } |
| } |
| -void OriginChipView::OnChanged() { |
| - Update(location_bar_view_->GetWebContents()); |
| - // TODO(gbillock): Also need to potentially repaint infobars to make sure the |
| - // arrows are pointing to the right spot. Only needed for some edge cases. |
| +void OriginChipView::FadeIn() { |
| + fade_in_animation_.Show(); |
| } |
| -int OriginChipView::ElideDomainTarget(int target_max_width) { |
| - base::string16 host = |
| - OriginChip::LabelFromURLForProfile(url_displayed_, profile_); |
| - host_label_->SetText(host); |
| - int width = GetPreferredSize().width(); |
| - if (width <= target_max_width) |
| - return width; |
| +void OriginChipView::CancelFade() { |
| + fade_in_animation_.Stop(); |
| +} |
| - gfx::Size label_size = host_label_->GetPreferredSize(); |
| - int padding_width = width - label_size.width(); |
| +int OriginChipView::HostLabelOffset() const { |
| + return host_label_->x() - GetLabelX(); |
| +} |
| - host_label_->SetText(ElideHost( |
| - location_bar_view_->GetToolbarModel()->GetURL(), |
| - host_label_->font_list(), target_max_width - padding_width)); |
| - return GetPreferredSize().width(); |
| +gfx::Size OriginChipView::GetPreferredSize() const { |
| + // TODO(pkasting): Use of " " here is a horrible hack, to be replaced by |
| + // splitting the chip into separate pieces for EV/host. |
| + int label_size = host_label_->GetPreferredSize().width(); |
| + if (ev_label_->visible()) { |
| + label_size += ev_label_->GetPreferredSize().width() + |
| + gfx::GetStringWidth(base::ASCIIToUTF16(" "), GetFontList()); |
| + } |
| + return gfx::Size(GetLabelX() + label_size + kEdgeThickness, |
| + location_icon_view_->GetPreferredSize().height()); |
| } |
| -void OriginChipView::FadeIn() { |
| - fade_in_animation_->Show(); |
| +void OriginChipView::Layout() { |
| + // TODO(gbillock): Eventually we almost certainly want to use |
| + // LocationBarLayout for leading and trailing decorations. |
| + |
| + location_icon_view_->SetBounds( |
| + kEdgeThickness + (showing_16x16_icon_ ? k16x16IconLeadingSpacing : 0), |
| + LocationBarView::kNormalEdgeThickness, |
| + location_icon_view_->GetPreferredSize().width(), |
| + height() - 2 * LocationBarView::kNormalEdgeThickness); |
| + |
| + int label_x = GetLabelX(); |
| + int label_width = std::max(0, width() - label_x - kEdgeThickness); |
| + const int label_y = LocationBarView::kNormalEdgeThickness; |
| + const int label_height = height() - 2 * LocationBarView::kNormalEdgeThickness; |
| + if (ev_label_->visible()) { |
| + int ev_label_width = |
| + std::min(ev_label_->GetPreferredSize().width(), label_width); |
| + ev_label_->SetBounds(label_x, label_y, ev_label_width, label_height); |
| + // TODO(pkasting): See comments in GetPreferredSize(). |
| + ev_label_width += |
| + gfx::GetStringWidth(base::ASCIIToUTF16(" "), GetFontList()); |
| + label_x += ev_label_width; |
| + label_width = std::max(0, label_width - ev_label_width); |
| + } |
| + host_label_->SetBounds(label_x, label_y, label_width, label_height); |
| } |
| -gfx::Size OriginChipView::GetPreferredSize() const { |
| - gfx::Size label_size = host_label_->GetPreferredSize(); |
| - gfx::Size icon_size = location_icon_view_->GetPreferredSize(); |
| - int icon_spacing = showing_16x16_icon_ ? |
| +int OriginChipView::GetLabelX() const { |
| + const int icon_spacing = showing_16x16_icon_ ? |
| (k16x16IconLeadingSpacing + k16x16IconTrailingSpacing) : 0; |
| - return gfx::Size(kEdgeThickness + icon_size.width() + icon_spacing + |
| - kIconTextSpacing + label_size.width() + |
| - kTrailingLabelMargin + kEdgeThickness, |
| - icon_size.height()); |
| + return kEdgeThickness + location_icon_view_->GetPreferredSize().width() + |
| + icon_spacing + kIconTextSpacing; |
| } |
| void OriginChipView::SetBorderImages(const int images[3][9]) { |
| scoped_ptr<views::LabelButtonBorder> border( |
| new views::LabelButtonBorder(views::Button::STYLE_BUTTON)); |
| - views::Painter* painter = views::Painter::CreateImageGridPainter(images[0]); |
| - border->SetPainter(false, Button::STATE_NORMAL, painter); |
| - painter = views::Painter::CreateImageGridPainter(images[1]); |
| - border->SetPainter(false, Button::STATE_HOVERED, painter); |
| - painter = views::Painter::CreateImageGridPainter(images[2]); |
| - border->SetPainter(false, Button::STATE_PRESSED, painter); |
| + for (size_t i = 0; i < 3; ++i) { |
| + views::Painter* painter = views::Painter::CreateImageGridPainter(images[i]); |
| + border->SetPainter(false, static_cast<Button::ButtonState>(i), painter); |
| + |
| + // Calculate a representative background color of the provided image grid to |
| + // use as the background color of the host label in order to color the text |
| + // appropriately. We grab the color of the middle pixel of the middle image |
| + // of the background, which we treat as the representative color of the |
| + // entire background (reasonable, given the current appearance of these |
| + // images). |
| + const SkBitmap& bitmap( |
| + GetThemeProvider()->GetImageSkiaNamed( |
| + images[i][4])->GetRepresentation(1.0f).sk_bitmap()); |
| + SkAutoLockPixels pixel_lock(bitmap); |
| + background_colors_[i] = |
| + bitmap.getColor(bitmap.width() / 2, bitmap.height() / 2); |
| + } |
| - SetBorder(border.PassAs<views::Border>()); |
| + // Calculate the actual text color of the pressed label. |
| + host_label_->SetBackgroundColor(background_colors_[Button::STATE_PRESSED]); |
| + pressed_text_color_ = host_label_->enabled_color(); |
| + host_label_->SetBackgroundColor(background_colors_[state()]); |
| - // Calculate a representative background color of the provided image grid and |
| - // set it as the background color of the host label in order to color the text |
| - // appropriately. We grab the color of the middle pixel of the middle image |
| - // of the background, which we treat as the representative color of the entire |
| - // background (reasonable, given the current appearance of these images). |
| - const SkBitmap& bitmap( |
| - GetThemeProvider()->GetImageSkiaNamed( |
| - images[0][4])->GetRepresentation(1.0f).sk_bitmap()); |
| - SkAutoLockPixels pixel_lock(bitmap); |
| - host_label_->SetBackgroundColor( |
| - bitmap.getColor(bitmap.width() / 2, bitmap.height() / 2)); |
| + SetBorder(border.PassAs<views::Border>()); |
| } |
| void OriginChipView::AnimationProgressed(const gfx::Animation* animation) { |
| - if (animation == fade_in_animation_.get()) |
| + if (animation == &fade_in_animation_) |
| SchedulePaint(); |
| else |
| views::LabelButton::AnimationProgressed(animation); |
| } |
| void OriginChipView::AnimationEnded(const gfx::Animation* animation) { |
| - if (animation == fade_in_animation_.get()) |
| - fade_in_animation_->Reset(); |
| + if (animation == &fade_in_animation_) |
| + fade_in_animation_.Reset(); |
| else |
| views::LabelButton::AnimationEnded(animation); |
| } |
| -void OriginChipView::Layout() { |
| - // TODO(gbillock): Eventually we almost certainly want to use |
| - // LocationBarLayout for leading and trailing decorations. |
| - |
| - location_icon_view_->SetBounds( |
| - kEdgeThickness + (showing_16x16_icon_ ? k16x16IconLeadingSpacing : 0), |
| - LocationBarView::kNormalEdgeThickness, |
| - location_icon_view_->GetPreferredSize().width(), |
| - height() - 2 * LocationBarView::kNormalEdgeThickness); |
| - |
| - int host_label_x = location_icon_view_->x() + location_icon_view_->width() + |
| - kIconTextSpacing; |
| - host_label_x += showing_16x16_icon_ ? k16x16IconTrailingSpacing : 0; |
| - int host_label_width = |
| - width() - host_label_x - kEdgeThickness - kTrailingLabelMargin; |
| - host_label_->SetBounds(host_label_x, |
| - LocationBarView::kNormalEdgeThickness, |
| - host_label_width, |
| - height() - 2 * LocationBarView::kNormalEdgeThickness); |
| -} |
| - |
| void OriginChipView::OnPaintBorder(gfx::Canvas* canvas) { |
| - if (fade_in_animation_->is_animating()) { |
| + if (fade_in_animation_.is_animating()) { |
| canvas->SaveLayerAlpha(static_cast<uint8>( |
| - fade_in_animation_->CurrentValueBetween(0, 255))); |
| + fade_in_animation_.CurrentValueBetween(0, 255))); |
| views::LabelButton::OnPaintBorder(canvas); |
| canvas->Restore(); |
| } else { |
| @@ -355,6 +366,13 @@ void OriginChipView::OnPaintBorder(gfx::Canvas* canvas) { |
| } |
| } |
| +void OriginChipView::StateChanged() { |
| + DCHECK_LT(state(), 3); |
| + SkColor background_color = background_colors_[state()]; |
| + ev_label_->SetBackgroundColor(background_color); |
| + host_label_->SetBackgroundColor(background_color); |
| +} |
| + |
| // TODO(gbillock): Make the LocationBarView or OmniboxView the listener for |
| // this button. |
| void OriginChipView::ButtonPressed(views::Button* sender, |