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 da0b51f2e74bb5..437964a956e60e 100644 --- a/chrome/browser/ui/views/website_settings/permissions_bubble_view.cc +++ b/chrome/browser/ui/views/website_settings/permissions_bubble_view.cc @@ -361,10 +361,9 @@ void PermissionsBubbleDialogDelegateView::UpdateAnchor( new views::BubbleBorder(adjusted_arrow, shadow(), color()))); // Reposition the bubble based on the updated arrow and view. - if (anchor_view) - SetAnchorView(anchor_view); - else - SetAnchorRect(gfx::Rect(anchor_point, gfx::Size())); + SetAnchorView(anchor_view); + // The anchor rect is ignored unless |anchor_view| is nullptr. + SetAnchorRect(gfx::Rect(anchor_point, gfx::Size())); } ////////////////////////////////////////////////////////////////////////////// diff --git a/chrome/browser/ui/views/website_settings/permissions_bubble_view.h b/chrome/browser/ui/views/website_settings/permissions_bubble_view.h index bc839fd176290f..66d3c34860d7bd 100644 --- a/chrome/browser/ui/views/website_settings/permissions_bubble_view.h +++ b/chrome/browser/ui/views/website_settings/permissions_bubble_view.h @@ -44,8 +44,13 @@ class PermissionBubbleViewViews : public PermissionBubbleView { private: // These three functions have separate implementations for Views-based and // Cocoa-based browsers, to allow this bubble to be used in either. + + // Returns the view to anchor the permission bubble to. May be null. views::View* GetAnchorView(); + // Returns the anchor point to anchor the permission bubble to, as a fallback. + // Only used if GetAnchorView() returns nullptr. gfx::Point GetAnchorPoint(); + // Returns the type of arrow to display on the permission bubble. views::BubbleBorder::Arrow GetAnchorArrow(); Browser* browser_; diff --git a/chrome/browser/ui/views/website_settings/permissions_bubble_view_views.cc b/chrome/browser/ui/views/website_settings/permissions_bubble_view_views.cc index 3ad8efeae462e7..43ddc952b826c5 100644 --- a/chrome/browser/ui/views/website_settings/permissions_bubble_view_views.cc +++ b/chrome/browser/ui/views/website_settings/permissions_bubble_view_views.cc @@ -12,28 +12,39 @@ #include "chrome/browser/ui/views/location_bar/location_icon_view.h" #include "chrome/browser/ui/views/website_settings/permissions_bubble_view.h" #include "ui/gfx/geometry/point.h" +#include "ui/gfx/geometry/vector2d.h" // The Views browser implementation of PermissionBubbleViewViews' // anchor methods. Views browsers have a native View to anchor the bubble to, // which these functions provide. +// Left margin for the bubble when anchored to the top of the screen in +// fullscreen mode. +const int kFullscreenLeftMargin = 40; + views::View* PermissionBubbleViewViews::GetAnchorView() { BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser_); if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) return browser_view->GetLocationBarView()->location_icon_view(); - return browser_view->top_container(); + // Fall back to GetAnchorPoint(). + return nullptr; } gfx::Point PermissionBubbleViewViews::GetAnchorPoint() { - return gfx::Point(); + BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser_); + // Get position in view (taking RTL displays into account). + int x_within_browser_view = + browser_view->GetMirroredXInView(kFullscreenLeftMargin); + // Get position in screen (taking browser view origin into account, which may + // not be 0,0 if there are multiple displays). + gfx::Point browser_view_origin = browser_view->GetBoundsInScreen().origin(); + return browser_view_origin + gfx::Vector2d(x_within_browser_view, 0); } views::BubbleBorder::Arrow PermissionBubbleViewViews::GetAnchorArrow() { - if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) - return views::BubbleBorder::TOP_LEFT; - return views::BubbleBorder::NONE; + return views::BubbleBorder::TOP_LEFT; } // static