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