Index: chrome/browser/ui/views/website_settings/permissions_bubble_view.cc |
diff --git a/chrome/browser/ui/views/website_settings/permissions_bubble_view.cc b/chrome/browser/ui/views/website_settings/permissions_bubble_view.cc |
index 1bf465a5a919e62c962bdd7ecf46be4c7c8225bb..06802638a2cc3d1ebcd2e28278599c5a30126542 100644 |
--- a/chrome/browser/ui/views/website_settings/permissions_bubble_view.cc |
+++ b/chrome/browser/ui/views/website_settings/permissions_bubble_view.cc |
@@ -16,6 +16,7 @@ |
#include "ui/base/resource/resource_bundle.h" |
#include "ui/gfx/text_constants.h" |
#include "ui/views/bubble/bubble_delegate.h" |
+#include "ui/views/bubble/bubble_frame_view.h" |
#include "ui/views/controls/button/checkbox.h" |
#include "ui/views/controls/button/label_button.h" |
#include "ui/views/controls/button/label_button_border.h" |
@@ -140,7 +141,8 @@ class PermissionsBubbleDelegateView : public views::BubbleDelegateView, |
public PermissionCombobox::Listener { |
public: |
PermissionsBubbleDelegateView( |
- views::View* anchor, |
+ views::View* anchor_view, |
+ views::BubbleBorder::Arrow anchor_arrow, |
PermissionBubbleViewViews* owner, |
const std::string& languages, |
const std::vector<PermissionBubbleRequest*>& requests, |
@@ -163,6 +165,11 @@ class PermissionsBubbleDelegateView : public views::BubbleDelegateView, |
// PermissionCombobox::Listener: |
void PermissionSelectionChanged(int index, bool allowed) override; |
+ // Updates the anchor's arrow and view. Also repositions the bubble so it's |
+ // displayed in the correct location. |
+ void UpdateAnchor(views::View* anchor_view, |
+ views::BubbleBorder::Arrow anchor_arrow); |
+ |
private: |
PermissionBubbleViewViews* owner_; |
views::Button* allow_; |
@@ -176,12 +183,13 @@ class PermissionsBubbleDelegateView : public views::BubbleDelegateView, |
}; |
PermissionsBubbleDelegateView::PermissionsBubbleDelegateView( |
- views::View* anchor, |
+ views::View* anchor_view, |
+ views::BubbleBorder::Arrow anchor_arrow, |
PermissionBubbleViewViews* owner, |
const std::string& languages, |
const std::vector<PermissionBubbleRequest*>& requests, |
const std::vector<bool>& accept_state) |
- : views::BubbleDelegateView(anchor, views::BubbleBorder::TOP_LEFT), |
+ : views::BubbleDelegateView(anchor_view, anchor_arrow), |
owner_(owner), |
allow_(NULL), |
deny_(NULL), |
@@ -349,13 +357,32 @@ void PermissionsBubbleDelegateView::PermissionSelectionChanged( |
owner_->Toggle(index, allowed); |
} |
+void PermissionsBubbleDelegateView::UpdateAnchor( |
+ views::View* anchor_view, |
+ views::BubbleBorder::Arrow anchor_arrow) { |
+ set_arrow(anchor_arrow); |
+ |
+ // Update the border in the bubble: will either add or remove the arrow. |
+ views::BubbleFrameView* frame = static_cast<views::BubbleFrameView*>( |
msw
2015/03/11 22:25:30
nit: use BubbleDelegateView::GetBubbleFrameView()
hcarmona
2015/03/12 18:43:33
Done.
|
+ GetWidget()->non_client_view()->frame_view()); |
+ views::BubbleBorder::Arrow adjusted_arrow = anchor_arrow; |
+ if (base::i18n::IsRTL()) |
+ adjusted_arrow = views::BubbleBorder::horizontal_mirror(adjusted_arrow); |
+ frame->SetBubbleBorder(scoped_ptr<views::BubbleBorder>( |
+ new views::BubbleBorder(adjusted_arrow, shadow(), color()))); |
msw
2015/03/11 22:25:31
nit: outdent 2 spaces.
hcarmona
2015/03/12 18:43:33
Done.
|
+ |
+ // Reposition the bubble based on the updated arrow and view. |
+ SetAnchorView(anchor_view); |
+} |
+ |
+ |
msw
2015/03/11 22:25:31
nit: remove extra blank line.
hcarmona
2015/03/12 18:43:33
Done.
|
////////////////////////////////////////////////////////////////////////////// |
// PermissionBubbleViewViews |
PermissionBubbleViewViews::PermissionBubbleViewViews( |
- views::View* anchor_view, |
const std::string& languages) |
- : anchor_view_(anchor_view), |
+ : anchor_view_(NULL), |
msw
2015/03/11 22:25:30
nit: nullptr here and elsewhere.
hcarmona
2015/03/12 18:43:33
Done.
|
+ anchor_arrow_(views::BubbleBorder::NONE), |
delegate_(NULL), |
bubble_delegate_(NULL), |
languages_(languages) {} |
@@ -365,6 +392,18 @@ PermissionBubbleViewViews::~PermissionBubbleViewViews() { |
delegate_->SetView(NULL); |
} |
+void PermissionBubbleViewViews::SetAnchor( |
+ views::View* view, |
+ views::BubbleBorder::Arrow arrow) { |
+ // These values will be used to create any new bubble. |
+ anchor_view_ = view; |
+ anchor_arrow_ = arrow; |
+ |
+ // If there is a bubble visible, it should be updated. |
+ if (IsVisible()) |
+ bubble_delegate_->UpdateAnchor(view, arrow); |
+} |
+ |
void PermissionBubbleViewViews::SetDelegate(Delegate* delegate) { |
delegate_ = delegate; |
} |
@@ -376,8 +415,8 @@ void PermissionBubbleViewViews::Show( |
bubble_delegate_->Close(); |
bubble_delegate_ = |
- new PermissionsBubbleDelegateView(anchor_view_, this, languages_, |
- requests, values); |
+ new PermissionsBubbleDelegateView(anchor_view_, anchor_arrow_, this, |
+ languages_, requests, values); |
views::BubbleDelegateView::CreateBubble(bubble_delegate_)->Show(); |
bubble_delegate_->SizeToContents(); |
} |