Index: chrome/browser/ui/views/page_info_bubble_view.cc |
diff --git a/chrome/browser/ui/views/page_info_bubble_view.cc b/chrome/browser/ui/views/page_info_bubble_view.cc |
index 9a6dbedc8c04462ba8c3cb43d552daf2849157c5..b0bb3ae379ebf59d10b0e1e7d48c010e2bcac474 100644 |
--- a/chrome/browser/ui/views/page_info_bubble_view.cc |
+++ b/chrome/browser/ui/views/page_info_bubble_view.cc |
@@ -30,6 +30,9 @@ |
namespace { |
+// TODO(msw): Get color from theme/window color. |
+const SkColor kColor = SK_ColorWHITE; |
+ |
// Layout constants. |
const int kHGapToBorder = 11; |
const int kVerticalSectionPadding = 8; |
@@ -98,22 +101,19 @@ class Section : public views::View, |
//////////////////////////////////////////////////////////////////////////////// |
// PageInfoBubbleView |
-Bubble* PageInfoBubbleView::bubble_ = NULL; |
- |
-PageInfoBubbleView::PageInfoBubbleView(gfx::NativeWindow parent_window, |
+PageInfoBubbleView::PageInfoBubbleView(views::View* anchor_view, |
Profile* profile, |
const GURL& url, |
const NavigationEntry::SSLStatus& ssl, |
bool show_history) |
- : ALLOW_THIS_IN_INITIALIZER_LIST(model_(profile, url, ssl, |
+ : BubbleDelegateView(anchor_view, views::BubbleBorder::TOP_LEFT, kColor), |
+ ALLOW_THIS_IN_INITIALIZER_LIST(model_(profile, url, ssl, |
show_history, this)), |
- parent_window_(parent_window), |
cert_id_(ssl.cert_id()), |
help_center_link_(NULL), |
ALLOW_THIS_IN_INITIALIZER_LIST(resize_animation_(this)), |
animation_start_height_(0) { |
- if (bubble_) |
- bubble_->Close(); |
+ |
if (cert_id_ > 0) { |
scoped_refptr<net::X509Certificate> cert; |
CertStore::GetInstance()->RetrieveCert(cert_id_, &cert); |
@@ -127,10 +127,13 @@ PageInfoBubbleView::PageInfoBubbleView(gfx::NativeWindow parent_window, |
} |
PageInfoBubbleView::~PageInfoBubbleView() { |
+ resize_animation_.Reset(); |
} |
void PageInfoBubbleView::ShowCertDialog() { |
- ShowCertificateViewerByID(parent_window_, cert_id_); |
+ gfx::NativeWindow parent = |
+ anchor_view() ? anchor_view()->GetWidget()->GetNativeWindow() : NULL; |
+ ShowCertificateViewerByID(parent, cert_id_); |
} |
gfx::Size PageInfoBubbleView::GetSeparatorSize() { |
@@ -288,51 +291,42 @@ void PageInfoBubbleView::OnPageInfoModelChanged() { |
// animation. |
// TODO(derat): Remove this once we're not using a toplevel X window for the |
// bubble. |
- bubble_->SizeToContents(); |
+ SizeToContents(); |
#else |
resize_animation_.SetSlideDuration(kPageInfoSlideDuration); |
resize_animation_.Show(); |
#endif |
} |
-void PageInfoBubbleView::BubbleClosing(Bubble* bubble, bool closed_by_escape) { |
- resize_animation_.Reset(); |
- bubble_ = NULL; |
-} |
- |
-bool PageInfoBubbleView::CloseOnEscape() { |
- return true; |
-} |
- |
-bool PageInfoBubbleView::FadeInOnShow() { |
- return false; |
-} |
- |
-string16 PageInfoBubbleView::GetAccessibleName() { |
- return ASCIIToUTF16("PageInfoBubble"); |
+gfx::Point PageInfoBubbleView::GetAnchorPoint() { |
+ // Compensate for some built-in padding in the icon. |
+ gfx::Point anchor(BubbleDelegateView::GetAnchorPoint()); |
+ return anchor_view() ? anchor.Subtract(gfx::Point(0, 5)) : anchor; |
} |
void PageInfoBubbleView::LinkClicked(views::Link* source, int event_flags) { |
- // We want to make sure the info bubble closes once the link is activated. So |
- // we close it explicitly rather than relying on a side-effect of opening a |
- // new tab (see http://crosbug.com/10186). |
- bubble_->Close(); |
- |
GURL url = google_util::AppendGoogleLocaleParam( |
GURL(chrome::kPageInfoHelpCenterURL)); |
Browser* browser = BrowserList::GetLastActive(); |
browser->OpenURL( |
url, GURL(), NEW_FOREGROUND_TAB, content::PAGE_TRANSITION_LINK); |
+ // NOTE: The bubble closes automatically on deactivation as the link opens. |
} |
void PageInfoBubbleView::AnimationEnded(const ui::Animation* animation) { |
- LayoutSections(); |
- bubble_->SizeToContents(); |
+ if (animation == &resize_animation_) { |
+ LayoutSections(); |
+ SizeToContents(); |
+ } |
+ BubbleDelegateView::AnimationEnded(animation); |
} |
void PageInfoBubbleView::AnimationProgressed(const ui::Animation* animation) { |
- LayoutSections(); |
- bubble_->SizeToContents(); |
+ if (animation == &resize_animation_) { |
+ LayoutSections(); |
+ SizeToContents(); |
+ } |
+ BubbleDelegateView::AnimationProgressed(animation); |
} |
//////////////////////////////////////////////////////////////////////////////// |
@@ -477,33 +471,15 @@ gfx::Size Section::LayoutItems(bool compute_bounds_only, int width) { |
namespace browser { |
-void ShowPageInfoBubble(BrowserView* browser_view, |
+void ShowPageInfoBubble(views::View* anchor_view, |
Profile* profile, |
const GURL& url, |
const NavigationEntry::SSLStatus& ssl, |
bool show_history) { |
- // Find where to point the bubble at. |
- gfx::Point point; |
- if (base::i18n::IsRTL()) { |
- int width = browser_view->toolbar()->location_bar()->width(); |
- point = gfx::Point(width - kIconHorizontalOffset, 0); |
- } |
- point.Offset(0, kIconVerticalOffset); |
- views::View::ConvertPointToScreen(browser_view->toolbar()->location_bar(), |
- &point); |
- gfx::Rect bounds = browser_view->toolbar()->location_bar()->bounds(); |
- bounds.set_origin(point); |
- bounds.set_width(kIconHorizontalOffset); |
- |
- // Show the bubble. If the bubble already exist - it will be closed first. |
PageInfoBubbleView* page_info_bubble = |
- new PageInfoBubbleView(browser_view->GetNativeHandle(), |
- profile, url, ssl, show_history); |
- Bubble* bubble = |
- Bubble::Show(browser_view->GetWidget(), bounds, |
- views::BubbleBorder::TOP_LEFT, |
- views::BubbleBorder::ALIGN_ARROW_TO_MID_ANCHOR, |
- page_info_bubble, page_info_bubble); |
- page_info_bubble->set_bubble(bubble); |
+ new PageInfoBubbleView(anchor_view, profile, url, ssl, show_history); |
+ views::BubbleDelegateView::CreateBubble(page_info_bubble); |
+ page_info_bubble->Show(); |
} |
+ |
} |