Chromium Code Reviews| Index: chrome/browser/ui/views/browser_dialogs_views_mac.cc |
| diff --git a/chrome/browser/ui/views/browser_dialogs_views_mac.cc b/chrome/browser/ui/views/browser_dialogs_views_mac.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..aeb5d4d80ebfad4971b3a16e463fa130068db5b0 |
| --- /dev/null |
| +++ b/chrome/browser/ui/views/browser_dialogs_views_mac.cc |
| @@ -0,0 +1,78 @@ |
| +// Copyright 2015 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "chrome/browser/ui/browser_dialogs.h" |
| + |
| +#include "chrome/browser/ui/views/website_settings/website_settings_popup_view.h" |
| +#include "content/public/browser/web_contents_observer.h" |
| +#include "ui/views/widget/widget_observer.h" |
| + |
| +// This file provides definitions of desktop browser dialog-creation methods for |
| +// Mac where a Cocoa browser is using Views dialogs. |
| + |
| +namespace { |
| + |
| +// Creates an anchor view for a bubble and deletes it when the bubble is closed. |
| +// It also closes the bubble when the parent WebContents is destroyed since the |
| +// anchor view does not have its own Widget for the BubbleDelegateView to |
| +// observe. Owns itself. |
| +class BubbleAnchorViewAdapter : public views::WidgetObserver, |
|
msw
2015/08/11 22:09:11
Yeah, this seems far from optimal... (1) Using a p
jackhou1
2015/08/12 06:02:11
SetAnchorRect would be good. Do you think it's oka
msw
2015/08/12 16:52:43
Make a public helper on WebsiteSettingsPopupView i
jackhou1
2015/08/17 04:54:19
Done.
Added a static helper WebsiteSettingsPopupV
|
| + public content::WebContentsObserver { |
| + public: |
| + BubbleAnchorViewAdapter(const gfx::Point& anchor_point, |
| + Profile* profile, |
| + content::WebContents* web_contents, |
| + const GURL& url, |
| + const content::SSLStatus& ssl) |
| + : anchor_view_(new views::View) { |
| + // Since the view doesn't have a container Widget, |
| + // View::ConvertPointToScreen will assume its origin is 0,0. Create a rect |
| + // where the midpoint of the bottom edge is at the anchor point. |
| + // Note that this will not work for windows to the left of the screen |
| + // origin, e.g. in multi-monitor setups. |
| + // TODO(jackhou): Make this adapter manage a Widget that is a child of |
| + // BrowserWindowCocoa. This fixes the multi-monitor problem and is needed |
| + // for bubbles that can stay open, e.g. extensions. |
| + anchor_view_->SetBounds( |
| + 0, 0, anchor_point.x() * 2, |
| + anchor_point.y() + |
| + WebsiteSettingsPopupView::kLocationIconVerticalMargin); |
| + views::BubbleDelegateView* bubble_view = |
| + WebsiteSettingsPopupView::ShowPopup(anchor_view_.get(), profile, |
| + web_contents, url, ssl); |
| + |
| + widget_ = bubble_view->GetWidget(); |
| + widget_->AddObserver(this); |
| + Observe(web_contents); |
| + } |
| + |
| + ~BubbleAnchorViewAdapter() override {} |
| + |
| + // WidgetObserver: |
| + void OnWidgetDestroyed(views::Widget* widget) override { delete this; } |
| + |
| + // content::WebContentsObserver: |
| + void WebContentsDestroyed() override { widget_->Close(); } |
| + |
| + private: |
| + // This view should never be (or have been) inserted into a view heirarchy. |
| + scoped_ptr<views::View> anchor_view_; |
| + views::Widget* widget_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(BubbleAnchorViewAdapter); |
| +}; |
| + |
| +} // namespace |
| + |
| +namespace chrome { |
| + |
| +void ShowWebsiteSettingsBubbleViewsAtPoint(const gfx::Point& anchor_point, |
| + Profile* profile, |
| + content::WebContents* web_contents, |
| + const GURL& url, |
| + const content::SSLStatus& ssl) { |
| + new BubbleAnchorViewAdapter(anchor_point, profile, web_contents, url, ssl); |
| +} |
| + |
| +} // namespace chrome |