Index: chrome/browser/views/page_info_bubble_view.cc |
=================================================================== |
--- chrome/browser/views/page_info_bubble_view.cc (revision 57314) |
+++ chrome/browser/views/page_info_bubble_view.cc (working copy) |
@@ -4,20 +4,26 @@ |
#include "chrome/browser/views/page_info_bubble_view.h" |
+#include "app/l10n_util.h" |
#include "app/resource_bundle.h" |
#include "base/utf_string_conversions.h" |
+#include "chrome/browser/certificate_viewer.h" |
#include "chrome/browser/views/frame/browser_view.h" |
#include "chrome/browser/views/info_bubble.h" |
#include "chrome/browser/views/toolbar_view.h" |
+#include "grit/generated_resources.h" |
#include "grit/locale_settings.h" |
#include "grit/theme_resources.h" |
#include "views/controls/image_view.h" |
#include "views/controls/label.h" |
+#include "views/controls/link.h" |
#include "views/controls/separator.h" |
#include "views/grid_layout.h" |
#include "views/widget/widget_win.h" |
#include "views/window/window.h" |
+namespace { |
+ |
// Layout constants. |
const int kHGapToBorder = 11; |
const int kVGapToImage = 10; |
@@ -30,35 +36,37 @@ |
// A section contains an image that shows a status (good or bad), a title, an |
// optional head-line (in bold) and a description. |
-class Section : public views::View { |
+class Section : public views::View, |
+ public views::LinkController { |
public: |
- Section(bool state, |
- const string16& headline, |
- const string16& description); |
+ Section(PageInfoBubbleView* owner, |
+ const PageInfoModel::SectionInfo& section_info); |
virtual ~Section(); |
+ // views::View methods: |
virtual int GetHeightForWidth(int w); |
virtual void Layout(); |
+ // views::LinkController methods: |
+ virtual void LinkActivated(views::Link* source, int event_flags); |
+ |
private: |
// Calculate the layout if |compute_bounds_only|, otherwise does Layout also. |
gfx::Size LayoutItems(bool compute_bounds_only, int width); |
- // Whether to show the good/bad icon. |
- bool state_; |
+ // The view that owns this Section object. |
+ PageInfoBubbleView* owner_; |
- // The first line of the description, show in bold. |
- string16 headline_; |
+ // The information this view represents. |
+ PageInfoModel::SectionInfo info_; |
- // The description, displayed below the head line. |
- string16 description_; |
- |
static SkBitmap* good_state_icon_; |
static SkBitmap* bad_state_icon_; |
views::ImageView* status_image_; |
views::Label* headline_label_; |
views::Label* description_label_; |
+ views::Link* link_; |
DISALLOW_COPY_AND_ASSIGN(Section); |
}; |
@@ -67,15 +75,19 @@ |
SkBitmap* Section::good_state_icon_ = NULL; |
SkBitmap* Section::bad_state_icon_ = NULL; |
+} // namespace |
+ |
//////////////////////////////////////////////////////////////////////////////// |
// PageInfoBubbleView |
-PageInfoBubbleView::PageInfoBubbleView(Profile* profile, |
+PageInfoBubbleView::PageInfoBubbleView(gfx::NativeWindow parent_window, |
+ Profile* profile, |
const GURL& url, |
const NavigationEntry::SSLStatus& ssl, |
bool show_history) |
: ALLOW_THIS_IN_INITIALIZER_LIST(model_(profile, url, ssl, |
show_history, this)), |
+ parent_window_(parent_window), |
cert_id_(ssl.cert_id()), |
info_bubble_(NULL) { |
LayoutSections(); |
@@ -84,6 +96,10 @@ |
PageInfoBubbleView::~PageInfoBubbleView() { |
} |
+void PageInfoBubbleView::ShowCertDialog() { |
+ ShowCertificateViewerByID(parent_window_, cert_id_); |
+} |
+ |
void PageInfoBubbleView::LayoutSections() { |
// Remove all the existing sections. |
RemoveAllChildViews(true); |
@@ -104,7 +120,7 @@ |
layout->StartRow(0, 0); |
// TODO(finnur): Remove title from the info struct, since it is |
// not used anymore. |
- layout->AddView(new Section(info.state, info.head_line, info.description)); |
+ layout->AddView(new Section(this, info)); |
// Add separator after all sections except the last. |
if (i < count - 1) { |
@@ -124,7 +140,7 @@ |
int count = model_.GetSectionCount(); |
for (int i = 0; i < count; ++i) { |
PageInfoModel::SectionInfo info = model_.GetSectionInfo(i); |
- Section section(info.state, info.head_line, info.description); |
+ Section section(this, info); |
size.Enlarge(0, section.GetHeightForWidth(size.width())); |
} |
@@ -145,35 +161,43 @@ |
//////////////////////////////////////////////////////////////////////////////// |
// Section |
-Section::Section(bool state, |
- const string16& headline, |
- const string16& description) |
- : state_(state), |
- headline_(headline), |
- description_(description) { |
+Section::Section(PageInfoBubbleView* owner, |
+ const PageInfoModel::SectionInfo& section_info) |
+ : owner_(owner), |
+ info_(section_info) { |
if (!good_state_icon_) { |
ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
good_state_icon_ = rb.GetBitmapNamed(IDR_PAGEINFO_GOOD); |
bad_state_icon_ = rb.GetBitmapNamed(IDR_PAGEINFO_BAD); |
} |
- status_image_ = new views::ImageView(); |
- status_image_->SetImage(state ? good_state_icon_ : bad_state_icon_); |
- AddChildView(status_image_); |
+ if (info_.type == PageInfoModel::SECTION_INFO_IDENTITY || |
+ info_.type == PageInfoModel::SECTION_INFO_CONNECTION) { |
+ status_image_ = new views::ImageView(); |
+ status_image_->SetImage(info_.state ? good_state_icon_ : bad_state_icon_); |
+ AddChildView(status_image_); |
+ } |
- headline_label_ = new views::Label(UTF16ToWideHack(headline)); |
+ headline_label_ = new views::Label(UTF16ToWideHack(info_.headline)); |
headline_label_->SetFont( |
headline_label_->font().DeriveFont(0, gfx::Font::BOLD)); |
headline_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); |
AddChildView(headline_label_); |
- description_label_ = new views::Label(UTF16ToWideHack(description)); |
+ description_label_ = new views::Label(UTF16ToWideHack(info_.description)); |
description_label_->SetMultiLine(true); |
description_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); |
// Allow linebreaking in the middle of words if necessary, so that extremely |
// long hostnames (longer than one line) will still be completely shown. |
description_label_->SetAllowCharacterBreak(true); |
AddChildView(description_label_); |
+ |
+ if (info_.type == PageInfoModel::SECTION_INFO_IDENTITY) { |
+ link_ = new views::Link( |
+ l10n_util::GetStringUTF16(IDS_PAGEINFO_CERT_INFO_BUTTON)); |
+ link_->SetController(this); |
+ AddChildView(link_); |
+ } |
} |
Section::~Section() { |
@@ -187,14 +211,22 @@ |
LayoutItems(false, width()); |
} |
+void Section::LinkActivated(views::Link* source, int event_flags) { |
+ owner_->ShowCertDialog(); |
+} |
+ |
gfx::Size Section::LayoutItems(bool compute_bounds_only, int width) { |
int x = kHGapToBorder; |
int y = kVGapToImage; |
// Layout the image, head-line and description. |
- gfx::Size size = status_image_->GetPreferredSize(); |
- if (!compute_bounds_only) |
- status_image_->SetBounds(x, y, size.width(), size.height()); |
+ gfx::Size size; |
+ if (info_.type == PageInfoModel::SECTION_INFO_IDENTITY || |
+ info_.type == PageInfoModel::SECTION_INFO_CONNECTION) { |
+ size = status_image_->GetPreferredSize(); |
+ if (!compute_bounds_only) |
+ status_image_->SetBounds(x, y, size.width(), size.height()); |
+ } |
int image_height = y + size.height(); |
x += size.width() + kHGapImageToDescription; |
int w = width - x - kTextPaddingRight; |
@@ -217,6 +249,11 @@ |
if (!compute_bounds_only) |
description_label_->SetBounds(x, y, 0, 0); |
} |
+ if (info_.type == PageInfoModel::SECTION_INFO_IDENTITY) { |
+ size = link_->GetPreferredSize(); |
+ link_->SetBounds(x, y, size.width(), size.height()); |
+ y += size.height(); |
+ } |
// Make sure the image is not truncated if the text doesn't contain much. |
y = std::max(y, image_height); |
@@ -242,7 +279,7 @@ |
// Show the bubble. |
PageInfoBubbleView* page_info_bubble = |
- new PageInfoBubbleView(profile, url, ssl, show_history); |
+ new PageInfoBubbleView(parent, profile, url, ssl, show_history); |
InfoBubble* info_bubble = |
InfoBubble::Show(browser_view->GetWidget(), bounds, |
BubbleBorder::TOP_LEFT, |