15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/origin_chip_view.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/files/file_path.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/metrics/histogram.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_util.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/browser_process.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/extensions/extension_util.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/favicon/favicon_tab_helper.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_service.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/safe_browsing/ui_manager.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/search/search.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/themes/theme_properties.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/elide_url.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/location_bar/origin_chip_info.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_view.h"
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/toolbar/toolbar_model.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/location_bar_view.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/extensions/extension_constants.h"
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/web_contents.h"
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/url_constants.h"
306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "extensions/browser/extension_icon_image.h"
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/constants.h"
33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/manifest_handlers/icons_handler.h"
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "grit/theme_resources.h"
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/theme_provider.h"
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/gfx/canvas.h"
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/font_list.h"
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/gfx/text_utils.h"
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/background.h"
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/controls/button/label_button.h"
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/controls/button/label_button_border.h"
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/painter.h"
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// OriginChipExtensionIcon ----------------------------------------------------
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class OriginChipExtensionIcon : public extensions::IconImage::Observer {
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OriginChipExtensionIcon(LocationIconView* icon_view,
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          Profile* profile,
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          const extensions::Extension* extension);
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~OriginChipExtensionIcon();
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // IconImage::Observer:
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnExtensionIconImageChanged(
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      extensions::IconImage* image) OVERRIDE;
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LocationIconView* icon_view_;
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<extensions::IconImage> icon_image_;
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(OriginChipExtensionIcon);
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)OriginChipExtensionIcon::OriginChipExtensionIcon(
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LocationIconView* icon_view,
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Profile* profile,
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const extensions::Extension* extension)
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : icon_view_(icon_view),
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      icon_image_(new extensions::IconImage(
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          profile,
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          extension,
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          extensions::IconsInfo::GetIcons(extension),
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          extension_misc::EXTENSION_ICON_BITTY,
765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          extensions::util::GetDefaultAppIcon(),
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          this)) {
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Forces load of the image.
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  icon_image_->image_skia().GetRepresentation(1.0f);
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!icon_image_->image_skia().image_reps().empty())
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OnExtensionIconImageChanged(icon_image_.get());
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)OriginChipExtensionIcon::~OriginChipExtensionIcon() {
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void OriginChipExtensionIcon::OnExtensionIconImageChanged(
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    extensions::IconImage* image) {
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (icon_view_)
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    icon_view_->SetImage(&icon_image_->image_skia());
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// OriginChipView -------------------------------------------------------------
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int kEdgeThickness = 5;
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int k16x16IconLeadingSpacing = 1;
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int k16x16IconTrailingSpacing = 2;
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int kIconTextSpacing = 3;
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kNormalImages[3][9] = {
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IMAGE_GRID(IDR_ORIGIN_CHIP_NORMAL),
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IMAGE_GRID(IDR_ORIGIN_CHIP_HOVER),
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IMAGE_GRID(IDR_ORIGIN_CHIP_PRESSED)
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kMalwareImages[3][9] = {
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IMAGE_GRID(IDR_ORIGIN_CHIP_MALWARE_NORMAL),
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IMAGE_GRID(IDR_ORIGIN_CHIP_MALWARE_HOVER),
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IMAGE_GRID(IDR_ORIGIN_CHIP_MALWARE_PRESSED)
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kBrokenSSLImages[3][9] = {
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IMAGE_GRID(IDR_ORIGIN_CHIP_BROKENSSL_NORMAL),
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IMAGE_GRID(IDR_ORIGIN_CHIP_BROKENSSL_HOVER),
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IMAGE_GRID(IDR_ORIGIN_CHIP_BROKENSSL_PRESSED)
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kEVImages[3][9] = {
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IMAGE_GRID(IDR_ORIGIN_CHIP_EV_NORMAL),
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IMAGE_GRID(IDR_ORIGIN_CHIP_EV_HOVER),
125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IMAGE_GRID(IDR_ORIGIN_CHIP_EV_PRESSED)
126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const extensions::Extension* GetExtension(const GURL& url, Profile* profile) {
12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!url.SchemeIs(extensions::kExtensionScheme))
13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return NULL;
13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ExtensionService* service =
13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extensions::ExtensionSystem::Get(profile)->extension_service();
13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return service->extensions()->GetExtensionOrAppByURL(url);
13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)OriginChipView::OriginChipView(LocationBarView* location_bar_view,
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                               Profile* profile,
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                               const gfx::FontList& font_list)
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : LabelButton(this, base::string16()),
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      location_bar_view_(location_bar_view),
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      profile_(profile),
14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      showing_16x16_icon_(false),
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      fade_in_animation_(this),
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      security_level_(ToolbarModel::NONE),
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      url_malware_(false) {
148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EnableCanvasFlippingForRTLUI(true);
149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<SafeBrowsingService> sb_service =
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->safe_browsing_service();
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // |sb_service| may be NULL in tests.
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (sb_service.get() && sb_service->ui_manager().get())
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    sb_service->ui_manager()->AddObserver(this);
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetFontList(font_list);
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(gbillock): Would be nice to just use stock LabelButton stuff here.
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  location_icon_view_ = new LocationIconView(location_bar_view_);
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Make location icon hover events count as hovering the origin chip.
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  location_icon_view_->set_interactive(false);
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  location_icon_view_->ShowTooltip(true);
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AddChildView(location_icon_view_);
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ev_label_ = new views::Label(base::string16(), GetFontList());
16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ev_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ev_label_->SetElideBehavior(gfx::NO_ELIDE);
16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AddChildView(ev_label_);
16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  host_label_ = new views::Label(base::string16(), GetFontList());
17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  host_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  host_label_->SetElideBehavior(gfx::NO_ELIDE);
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AddChildView(host_label_);
174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  fade_in_animation_.SetTweenType(gfx::Tween::LINEAR_OUT_SLOW_IN);
17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  fade_in_animation_.SetSlideDuration(175);
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Ensure |pressed_text_color_| and |background_colors_| are initialized.
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetBorderImages(kNormalImages);
180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
182effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochOriginChipView::~OriginChipView() {
183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<SafeBrowsingService> sb_service =
184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      g_browser_process->safe_browsing_service();
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (sb_service.get() && sb_service->ui_manager().get())
186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    sb_service->ui_manager()->RemoveObserver(this);
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
18946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void OriginChipView::OnChanged() {
19046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  content::WebContents* web_contents = location_bar_view_->GetWebContents();
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!web_contents)
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Note: security level can change async as the connection is made.
195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GURL url = location_bar_view_->GetToolbarModel()->GetURL();
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const ToolbarModel::SecurityLevel security_level =
197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      location_bar_view_->GetToolbarModel()->GetSecurityLevel(true);
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool url_malware = OriginChip::IsMalware(url, web_contents);
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(gbillock): We persist a malware setting while a new WebContents
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // content is loaded, meaning that we end up transiently marking a safe
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // page as malware. Need to fix that.
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if ((url == url_displayed_) &&
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      (security_level == security_level_) &&
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      (url_malware == url_malware_))
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  url_displayed_ = url;
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  url_malware_ = url_malware;
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  security_level_ = security_level;
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (url_malware_) {
215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetBorderImages(kMalwareImages);
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else if (security_level_ == ToolbarModel::SECURITY_ERROR) {
217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetBorderImages(kBrokenSSLImages);
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else if (security_level_ == ToolbarModel::EV_SECURE) {
219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetBorderImages(kEVImages);
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else {
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetBorderImages(kNormalImages);
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
22446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ev_label_->SetText(location_bar_view_->GetToolbarModel()->GetEVCertName());
22546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ev_label_->SetVisible(security_level_ == ToolbarModel::EV_SECURE);
22646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
22746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // TODO(pkasting): Allow the origin chip to shrink, and use ElideHost().
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 host =
229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      OriginChip::LabelFromURLForProfile(url_displayed_, profile_);
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  host_label_->SetText(host);
231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  host_label_->SetTooltipText(base::UTF8ToUTF16(url.spec()));
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  showing_16x16_icon_ = url_displayed_.is_empty() ||
23446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      url_displayed_.SchemeIs(content::kChromeUIScheme);
23546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int icon = showing_16x16_icon_ ? IDR_PRODUCT_LOGO_16 :
23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      location_bar_view_->GetToolbarModel()->GetIconForSecurityLevel(
23746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          security_level_);
23846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const extensions::Extension* extension =
23946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetExtension(url_displayed_, profile_);
24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (extension) {
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    icon = IDR_EXTENSIONS_FAVICON;
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    showing_16x16_icon_ = true;
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    extension_icon_.reset(
244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        new OriginChipExtensionIcon(location_icon_view_, profile_, extension));
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else {
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    extension_icon_.reset();
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
24846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  location_icon_view_->SetImage(GetThemeProvider()->GetImageSkiaNamed(icon));
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
25046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (visible()) {
25146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    CancelFade();
25246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    Layout();
25346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    SchedulePaint();
25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
25746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void OriginChipView::FadeIn() {
25846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  fade_in_animation_.Show();
259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
26146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void OriginChipView::CancelFade() {
26246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  fade_in_animation_.Stop();
26346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
264c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
26546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int OriginChipView::HostLabelOffset() const {
26646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return host_label_->x() - GetLabelX();
267c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
268c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
26946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int OriginChipView::WidthFromStartOfLabels() const {
27046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return width() - GetLabelX();
271c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
272c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size OriginChipView::GetPreferredSize() const {
27446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // TODO(pkasting): Use of " " here is a horrible hack, to be replaced by
27546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // splitting the chip into separate pieces for EV/host.
27646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int label_size = host_label_->GetPreferredSize().width();
27746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (ev_label_->visible()) {
27846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    label_size += ev_label_->GetPreferredSize().width() +
27946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        gfx::GetStringWidth(base::ASCIIToUTF16(" "), GetFontList());
28046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
28146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return gfx::Size(GetLabelX() + label_size + kEdgeThickness,
28246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   location_icon_view_->GetPreferredSize().height());
28346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
28446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
28546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void OriginChipView::Layout() {
28646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // TODO(gbillock): Eventually we almost certainly want to use
28746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // LocationBarLayout for leading and trailing decorations.
28846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
28946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  location_icon_view_->SetBounds(
29046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kEdgeThickness + (showing_16x16_icon_ ? k16x16IconLeadingSpacing : 0),
29146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      LocationBarView::kNormalEdgeThickness,
29246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      location_icon_view_->GetPreferredSize().width(),
29346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      height() - 2 * LocationBarView::kNormalEdgeThickness);
29446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
29546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int label_x = GetLabelX();
29646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int label_width = std::max(0, width() - label_x - kEdgeThickness);
29746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int label_y = LocationBarView::kNormalEdgeThickness;
29846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int label_height = height() - 2 * LocationBarView::kNormalEdgeThickness;
29946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (ev_label_->visible()) {
30046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    int ev_label_width =
30146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        std::min(ev_label_->GetPreferredSize().width(), label_width);
30246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ev_label_->SetBounds(label_x, label_y, ev_label_width, label_height);
30346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // TODO(pkasting): See comments in GetPreferredSize().
30446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ev_label_width +=
30546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        gfx::GetStringWidth(base::ASCIIToUTF16(" "), GetFontList());
30646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    label_x += ev_label_width;
30746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    label_width = std::max(0, label_width - ev_label_width);
30846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
30946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  host_label_->SetBounds(label_x, label_y, label_width, label_height);
31046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
31146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
31246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int OriginChipView::GetLabelX() const {
31346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int icon_spacing = showing_16x16_icon_ ?
314c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      (k16x16IconLeadingSpacing + k16x16IconTrailingSpacing) : 0;
31546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return kEdgeThickness + location_icon_view_->GetPreferredSize().width() +
31646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      icon_spacing + kIconTextSpacing;
317c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
318c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void OriginChipView::SetBorderImages(const int images[3][9]) {
320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<views::LabelButtonBorder> border(
321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      new views::LabelButtonBorder(views::Button::STYLE_BUTTON));
322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
32346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (size_t i = 0; i < 3; ++i) {
32446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    views::Painter* painter = views::Painter::CreateImageGridPainter(images[i]);
32546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    border->SetPainter(false, static_cast<Button::ButtonState>(i), painter);
32646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
32746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // Calculate a representative background color of the provided image grid to
32846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // use as the background color of the host label in order to color the text
32946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // appropriately. We grab the color of the middle pixel of the middle image
33046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // of the background, which we treat as the representative color of the
33146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // entire background (reasonable, given the current appearance of these
33246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // images).
333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    //
334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // NOTE: Because this is called from the constructor, when we're not in a
335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Widget yet, GetThemeProvider() may return NULL, so use the location bar's
336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // theme provider instead to be safe.
33746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const SkBitmap& bitmap(
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        location_bar_view_->GetThemeProvider()->GetImageSkiaNamed(
33946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            images[i][4])->GetRepresentation(1.0f).sk_bitmap());
34046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    SkAutoLockPixels pixel_lock(bitmap);
34146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    background_colors_[i] =
34246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        bitmap.getColor(bitmap.width() / 2, bitmap.height() / 2);
34346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
34546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Calculate the actual text color of the pressed label.
34646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  host_label_->SetBackgroundColor(background_colors_[Button::STATE_PRESSED]);
34746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  pressed_text_color_ = host_label_->enabled_color();
34846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  host_label_->SetBackgroundColor(background_colors_[state()]);
349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
35046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SetBorder(border.PassAs<views::Border>());
351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
353effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid OriginChipView::AnimationProgressed(const gfx::Animation* animation) {
35446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (animation == &fade_in_animation_)
355effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    SchedulePaint();
356effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  else
357effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    views::LabelButton::AnimationProgressed(animation);
358effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
359effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
360effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid OriginChipView::AnimationEnded(const gfx::Animation* animation) {
36146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (animation == &fade_in_animation_)
36246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    fade_in_animation_.Reset();
363effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  else
364effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    views::LabelButton::AnimationEnded(animation);
365effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
366effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
367effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid OriginChipView::OnPaintBorder(gfx::Canvas* canvas) {
36846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (fade_in_animation_.is_animating()) {
369effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    canvas->SaveLayerAlpha(static_cast<uint8>(
37046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        fade_in_animation_.CurrentValueBetween(0, 255)));
371effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    views::LabelButton::OnPaintBorder(canvas);
372effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    canvas->Restore();
373effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  } else {
374effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    views::LabelButton::OnPaintBorder(canvas);
375effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
376effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
377effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
37846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void OriginChipView::StateChanged() {
37946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK_LT(state(), 3);
38046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SkColor background_color = background_colors_[state()];
38146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ev_label_->SetBackgroundColor(background_color);
38246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  host_label_->SetBackgroundColor(background_color);
38346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
38446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// TODO(gbillock): Make the LocationBarView or OmniboxView the listener for
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// this button.
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void OriginChipView::ButtonPressed(views::Button* sender,
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 const ui::Event& event) {
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // See if the event needs to be passed to the LocationIconView.
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (event.IsMouseEvent() || (event.type() == ui::ET_GESTURE_TAP)) {
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    location_icon_view_->set_interactive(true);
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ui::LocatedEvent& located_event =
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        static_cast<const ui::LocatedEvent&>(event);
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (GetEventHandlerForPoint(located_event.location()) ==
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            location_icon_view_) {
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      location_icon_view_->page_info_helper()->ProcessEvent(located_event);
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      location_icon_view_->set_interactive(false);
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    location_icon_view_->set_interactive(false);
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("OriginChip.Pressed", 1);
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::RecordAction(base::UserMetricsAction("OriginChipPress"));
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
406effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  location_bar_view_->ShowURL();
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Note: When OnSafeBrowsingHit would be called, OnSafeBrowsingMatch will
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// have already been called.
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void OriginChipView::OnSafeBrowsingHit(
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const SafeBrowsingUIManager::UnsafeResource& resource) {}
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void OriginChipView::OnSafeBrowsingMatch(
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const SafeBrowsingUIManager::UnsafeResource& resource) {
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnChanged();
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
418