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..79dfad9b14cbed43f2c4775494163e420ee50107 |
| --- /dev/null |
| +++ b/chrome/browser/ui/views/browser_dialogs_views_mac.cc |
| @@ -0,0 +1,73 @@ |
| +// 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, |
| + 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. |
| + anchor_view_->SetBounds( |
| + 0, 0, anchor_point.x() * 2, |
|
tapted
2015/08/11 03:20:37
ooh - I just realised something... What happens in
tapted
2015/08/11 03:45:42
lgtm with a comment about the dual-screen thing (h
jackhou1
2015/08/11 03:54:02
Done.
|
| + 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 |