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..1d71b8872f273aeae1a0b0df99b89f328c19d01b |
| --- /dev/null |
| +++ b/chrome/browser/ui/views/browser_dialogs_views_mac.cc |
| @@ -0,0 +1,64 @@ |
| +// 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 { |
| + |
| +// Closes the bubble when the parent WebContents is destroyed since there is no |
| +// anchor Widget for the BubbleDelegateView to observe. Owns itself. |
| +// TODO(jackhou): Make this adapter manage a Widget that is a child window of |
| +// BrowserWindowCocoa. This is needed for bubbles that can stay open, e.g. |
| +// extensions. |
| +class BubbleAnchorAdapter : public views::WidgetObserver, |
|
tapted
2015/08/17 05:15:03
(as discussed, I think we can get rid of the adapt
tapted
2015/08/17 05:15:45
uhh set_parent_window(..) that is.
jackhou1
2015/08/17 05:42:36
Done.
|
| + public content::WebContentsObserver { |
| + public: |
| + BubbleAnchorAdapter(const gfx::Point& anchor_point, |
| + Profile* profile, |
| + content::WebContents* web_contents, |
| + const GURL& url, |
| + const content::SSLStatus& ssl) { |
| + views::BubbleDelegateView* bubble_view = |
| + WebsiteSettingsPopupView::ShowPopupAtRect( |
| + gfx::Rect(anchor_point, gfx::Size()), profile, web_contents, url, |
| + ssl); |
| + widget_ = bubble_view->GetWidget(); |
| + widget_->AddObserver(this); |
| + Observe(web_contents); |
| + } |
| + |
| + ~BubbleAnchorAdapter() override {} |
| + |
| + // WidgetObserver: |
| + void OnWidgetDestroyed(views::Widget* widget) override { delete this; } |
| + |
| + // content::WebContentsObserver: |
| + void WebContentsDestroyed() override { widget_->Close(); } |
| + |
| + private: |
| + views::Widget* widget_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(BubbleAnchorAdapter); |
| +}; |
| + |
| +} // namespace |
| + |
| +namespace chrome { |
| + |
| +void ShowWebsiteSettingsBubbleViewsAtPoint(const gfx::Point& anchor_point, |
| + Profile* profile, |
| + content::WebContents* web_contents, |
| + const GURL& url, |
| + const content::SSLStatus& ssl) { |
| + new BubbleAnchorAdapter(anchor_point, profile, web_contents, url, ssl); |
| +} |
| + |
| +} // namespace chrome |