page_info_bubble_view.cc revision 21d179b334e59e9a3bfcaed4c4430bef1bc5759d
1bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/views/page_info_bubble_view.h" 6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "app/l10n_util.h" 8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/utf_string_conversions.h" 9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/browser_list.h" 10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/cert_store.h" 11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/certificate_viewer.h" 124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/google/google_util.h" 13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/views/frame/browser_view.h" 14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/views/info_bubble.h" 15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/views/toolbar_view.h" 164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/common/url_constants.h" 17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/generated_resources.h" 18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/locale_settings.h" 19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/controls/image_view.h" 20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/controls/label.h" 21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/controls/separator.h" 22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/grid_layout.h" 23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/widget/widget.h" 24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "views/window/window.h" 25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace { 27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Layout constants. 29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kHGapToBorder = 11; 30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kVGapToImage = 10; 31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kVGapToHeadline = 7; 32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kHGapImageToDescription = 6; 33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kTextPaddingRight = 10; 34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kPaddingBelowSeparator = 4; 35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kPaddingAboveSeparator = 13; 36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst int kIconHorizontalOffset = 27; 37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst int kIconVerticalOffset = -7; 38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// The duration of the animation that resizes the bubble once the async 40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// information is provided through the ModelChanged event. 41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst int kPageInfoSlideDuration = 300; 42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// A section contains an image that shows a status (good or bad), a title, an 44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// optional head-line (in bold) and a description. 45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass Section : public views::View, 46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public views::LinkController { 47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public: 48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Section(PageInfoBubbleView* owner, 49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const PageInfoModel::SectionInfo& section_info, 50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const SkBitmap* status_icon, 51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool show_cert); 52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen virtual ~Section(); 53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // views::View methods: 55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen virtual int GetHeightForWidth(int w); 56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen virtual void Layout(); 57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // views::LinkController methods: 59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen virtual void LinkActivated(views::Link* source, int event_flags); 60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private: 62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Calculate the layout if |compute_bounds_only|, otherwise does Layout also. 63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gfx::Size LayoutItems(bool compute_bounds_only, int width); 64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // The view that owns this Section object. 66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen PageInfoBubbleView* owner_; 67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // The information this view represents. 69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen PageInfoModel::SectionInfo info_; 70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen views::ImageView* status_image_; 72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen views::Label* headline_label_; 73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen views::Label* description_label_; 74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen views::Link* link_; 75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DISALLOW_COPY_AND_ASSIGN(Section); 77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} // namespace 80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// PageInfoBubbleView 83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenPageInfoBubbleView::PageInfoBubbleView(gfx::NativeWindow parent_window, 85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Profile* profile, 86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const GURL& url, 87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NavigationEntry::SSLStatus& ssl, 88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool show_history) 89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : ALLOW_THIS_IN_INITIALIZER_LIST(model_(profile, url, ssl, 90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen show_history, this)), 91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen parent_window_(parent_window), 92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen cert_id_(ssl.cert_id()), 93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen info_bubble_(NULL), 94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick help_center_link_(NULL), 95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ALLOW_THIS_IN_INITIALIZER_LIST(resize_animation_(this)), 96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick animation_start_height_(0) { 97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (cert_id_ > 0) { 98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_refptr<net::X509Certificate> cert; 9921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertStore::GetInstance()->RetrieveCert(cert_id_, &cert); 100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // When running with fake certificate (Chrome Frame) or Gears in offline 101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // mode, we have no os certificate, so there is no cert to show. Don't 102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // bother showing the cert info link in that case. 103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!cert.get() || !cert->os_cert_handle()) 104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick cert_id_ = 0; 105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LayoutSections(); 107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenPageInfoBubbleView::~PageInfoBubbleView() { 110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid PageInfoBubbleView::ShowCertDialog() { 113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ShowCertificateViewerByID(parent_window_, cert_id_); 114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid PageInfoBubbleView::LayoutSections() { 117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Remove all the existing sections. 118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen RemoveAllChildViews(true); 119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen views::GridLayout* layout = new views::GridLayout(this); 121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SetLayoutManager(layout); 122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen views::ColumnSet* columns = layout->AddColumnSet(0); 123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen columns->AddColumn(views::GridLayout::FILL, // Horizontal resize. 124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen views::GridLayout::FILL, // Vertical resize. 125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1, // Resize weight. 126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen views::GridLayout::USE_PREF, // Size type. 127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 0, // Ignored for USE_PREF. 128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 0); // Minimum size. 129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Add a column set for aligning the text when it has no icons (such as the 130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // help center link). 131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick columns = layout->AddColumnSet(1); 132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick columns->AddPaddingColumn( 133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 0, kHGapToBorder + kIconHorizontalOffset + kHGapImageToDescription); 134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick columns->AddColumn(views::GridLayout::LEADING, // Horizontal resize. 135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick views::GridLayout::FILL, // Vertical resize. 136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1, // Resize weight. 137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick views::GridLayout::USE_PREF, // Size type. 138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 0, // Ignored for USE_PREF. 139731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 0); // Minimum size. 140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int count = model_.GetSectionCount(); 142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (int i = 0; i < count; ++i) { 143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen PageInfoModel::SectionInfo info = model_.GetSectionInfo(i); 144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen layout->StartRow(0, 0); 145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const SkBitmap* icon = model_.GetIconImage(info.icon_id); 146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick layout->AddView(new Section(this, info, icon, cert_id_ > 0)); 147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Add separator after all sections. 149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen layout->AddPaddingRow(0, kPaddingAboveSeparator); 150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen layout->StartRow(0, 0); 151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen layout->AddView(new views::Separator()); 152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen layout->AddPaddingRow(0, kPaddingBelowSeparator); 153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 155bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Then add the help center link at the bottom. 156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick layout->StartRow(0, 1); 157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen help_center_link_ = 158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen new views::Link(l10n_util::GetString(IDS_PAGE_INFO_HELP_CENTER_LINK)); 159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen help_center_link_->SetController(this); 160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen layout->AddView(help_center_link_); 161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsengfx::Size PageInfoBubbleView::GetPreferredSize() { 164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gfx::Size size(views::Window::GetLocalizedContentsSize( 165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDS_PAGEINFOBUBBLE_WIDTH_CHARS, IDS_PAGEINFOBUBBLE_HEIGHT_LINES)); 166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen size.set_height(0); 167bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 168bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int count = model_.GetSectionCount(); 169bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (int i = 0; i < count; ++i) { 170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen PageInfoModel::SectionInfo info = model_.GetSectionInfo(i); 171731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const SkBitmap* icon = model_.GetIconImage(info.icon_id); 172731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Section section(this, info, icon, cert_id_ > 0); 173bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen size.Enlarge(0, section.GetHeightForWidth(size.width())); 174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 175bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Calculate how much space the separators take up (with padding). 177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen views::Separator separator; 178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gfx::Size separator_size = separator.GetPreferredSize(); 179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gfx::Size separator_plus_padding(0, separator_size.height() + 180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen kPaddingAboveSeparator + 181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen kPaddingBelowSeparator); 182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Account for the separators and padding within sections. 184bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen size.Enlarge(0, (count - 1) * separator_plus_padding.height()); 185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Account for the Help Center link and the separator above it. 187bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gfx::Size link_size = help_center_link_->GetPreferredSize(); 188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen size.Enlarge(0, separator_plus_padding.height() + 189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen link_size.height()); 190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 191731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!resize_animation_.is_animating()) 192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return size; 193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // We are animating from animation_start_height_ to size. 195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int target_height = animation_start_height_ + static_cast<int>( 196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick (size.height() - animation_start_height_) * 197731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick resize_animation_.GetCurrentValue()); 198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick size.set_height(target_height); 199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return size; 200bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 201bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid PageInfoBubbleView::ModelChanged() { 203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick animation_start_height_ = bounds().height(); 204bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LayoutSections(); 205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick resize_animation_.SetSlideDuration(kPageInfoSlideDuration); 206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick resize_animation_.Show(); 207bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid PageInfoBubbleView::LinkActivated(views::Link* source, int event_flags) { 2104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch GURL url = google_util::AppendGoogleLocaleParam( 2114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch GURL(chrome::kPageInfoHelpCenterURL)); 212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Browser* browser = BrowserList::GetLastActive(); 213bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen browser->OpenURL(url, GURL(), NEW_FOREGROUND_TAB, PageTransition::LINK); 214bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid PageInfoBubbleView::AnimationEnded(const Animation* animation) { 217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick info_bubble_->SizeToContents(); 218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid PageInfoBubbleView::AnimationProgressed(const Animation* animation) { 221731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick info_bubble_->SizeToContents(); 222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 224bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//////////////////////////////////////////////////////////////////////////////// 225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Section 226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSection::Section(PageInfoBubbleView* owner, 228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const PageInfoModel::SectionInfo& section_info, 229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const SkBitmap* state_icon, 230bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool show_cert) 231bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : owner_(owner), 232bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen info_(section_info), 233bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen status_image_(NULL), 234bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen link_(NULL) { 235731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (state_icon) { 236bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen status_image_ = new views::ImageView(); 237731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick status_image_->SetImage(*state_icon); 238bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddChildView(status_image_); 239bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 240bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 241bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen headline_label_ = new views::Label(UTF16ToWideHack(info_.headline)); 242bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen headline_label_->SetFont( 243bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen headline_label_->font().DeriveFont(0, gfx::Font::BOLD)); 244bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen headline_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); 245bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddChildView(headline_label_); 246bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 247bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen description_label_ = new views::Label(UTF16ToWideHack(info_.description)); 248bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen description_label_->SetMultiLine(true); 249bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen description_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); 250bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Allow linebreaking in the middle of words if necessary, so that extremely 251bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // long hostnames (longer than one line) will still be completely shown. 252bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen description_label_->SetAllowCharacterBreak(true); 253bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddChildView(description_label_); 254bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 255bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (info_.type == PageInfoModel::SECTION_INFO_IDENTITY && show_cert) { 256bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen link_ = new views::Link( 257bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen l10n_util::GetString(IDS_PAGEINFO_CERT_INFO_BUTTON)); 258bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen link_->SetController(this); 259bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddChildView(link_); 260bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 261bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 262bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 263bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSection::~Section() { 264bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 265bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 266bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenint Section::GetHeightForWidth(int width) { 267bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return LayoutItems(true, width).height(); 268bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 269bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 270bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid Section::Layout() { 271bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LayoutItems(false, width()); 272bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 273bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 274bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid Section::LinkActivated(views::Link* source, int event_flags) { 275bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen owner_->ShowCertDialog(); 276bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 277bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 278bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsengfx::Size Section::LayoutItems(bool compute_bounds_only, int width) { 279bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int x = kHGapToBorder; 280bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int y = kVGapToImage; 281bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 282bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Layout the image, head-line and description. 283bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gfx::Size size; 284bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (status_image_) { 285bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen size = status_image_->GetPreferredSize(); 286bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!compute_bounds_only) 287bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen status_image_->SetBounds(x, y, size.width(), size.height()); 288bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 289bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int image_height = y + size.height(); 290bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen x += size.width() + kHGapImageToDescription; 291bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int w = width - x - kTextPaddingRight; 292bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen y = kVGapToHeadline; 293bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!headline_label_->GetText().empty()) { 294bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen size = headline_label_->GetPreferredSize(); 295bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!compute_bounds_only) 296bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen headline_label_->SetBounds(x, y, w > 0 ? w : 0, size.height()); 297bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen y += size.height(); 298bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else { 299bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!compute_bounds_only) 300bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen headline_label_->SetBounds(x, y, 0, 0); 301bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 302bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (w > 0) { 303bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int height = description_label_->GetHeightForWidth(w); 304bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!compute_bounds_only) 305bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen description_label_->SetBounds(x, y, w, height); 306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen y += height; 307bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else { 308bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!compute_bounds_only) 309bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen description_label_->SetBounds(x, y, 0, 0); 310bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 311bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (info_.type == PageInfoModel::SECTION_INFO_IDENTITY && link_) { 312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen size = link_->GetPreferredSize(); 313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!compute_bounds_only) 314bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen link_->SetBounds(x, y, size.width(), size.height()); 315bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen y += size.height(); 316bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 317bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 318bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Make sure the image is not truncated if the text doesn't contain much. 319bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen y = std::max(y, image_height); 320bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return gfx::Size(width, y); 321bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 322bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 323bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace browser { 324bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 325bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid ShowPageInfoBubble(gfx::NativeWindow parent, 326bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Profile* profile, 327bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const GURL& url, 328bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const NavigationEntry::SSLStatus& ssl, 329bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool show_history) { 330bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Find where to point the bubble at. 331bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BrowserView* browser_view = 332bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BrowserView::GetBrowserViewForNativeWindow(parent); 333bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gfx::Point point; 334bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (base::i18n::IsRTL()) { 335bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int width = browser_view->toolbar()->location_bar()->width(); 336731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick point = gfx::Point(width - kIconHorizontalOffset, 0); 337bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 338731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick point.Offset(0, kIconVerticalOffset); 339bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen views::View::ConvertPointToScreen(browser_view->toolbar()->location_bar(), 340bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &point); 341bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen gfx::Rect bounds = browser_view->toolbar()->location_bar()->bounds(); 342bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bounds.set_origin(point); 343731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bounds.set_width(kIconHorizontalOffset); 344bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 345bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Show the bubble. 346bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen PageInfoBubbleView* page_info_bubble = 347bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen new PageInfoBubbleView(parent, profile, url, ssl, show_history); 348bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen InfoBubble* info_bubble = 349bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen InfoBubble::Show(browser_view->GetWidget(), bounds, 350bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BubbleBorder::TOP_LEFT, 351bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen page_info_bubble, page_info_bubble); 352bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen page_info_bubble->set_info_bubble(info_bubble); 353bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 354bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 355bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 356