| 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..fb09a56e0c49db494c3d1a4f5ec9051c1c948768 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,31 @@ 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 =
|
| + views::BubbleDelegateView::GetBubbleFrameView();
|
| + 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())));
|
| +
|
| + // Reposition the bubble based on the updated arrow and view.
|
| + SetAnchorView(anchor_view);
|
| +}
|
| +
|
| //////////////////////////////////////////////////////////////////////////////
|
| // PermissionBubbleViewViews
|
|
|
| PermissionBubbleViewViews::PermissionBubbleViewViews(
|
| - views::View* anchor_view,
|
| const std::string& languages)
|
| - : anchor_view_(anchor_view),
|
| + : anchor_view_(nullptr),
|
| + anchor_arrow_(views::BubbleBorder::NONE),
|
| delegate_(NULL),
|
| bubble_delegate_(NULL),
|
| languages_(languages) {}
|
| @@ -365,6 +391,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 +414,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();
|
| }
|
|
|