Index: chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.mm |
diff --git a/chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.mm b/chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.mm |
index 16f755c1971d44e92bfc34f6131b0128f3a3b67f..510402e87e5f70efec6eef06cc40d403eab1f815 100644 |
--- a/chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.mm |
+++ b/chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.mm |
@@ -11,35 +11,59 @@ |
#import "chrome/browser/ui/cocoa/constrained_window/constrained_window_sheet.h" |
#import "chrome/browser/ui/cocoa/single_web_contents_dialog_manager_cocoa.h" |
#include "components/guest_view/browser/guest_view_base.h" |
-#include "components/web_modal/web_contents_modal_dialog_manager.h" |
#include "content/public/browser/browser_thread.h" |
using web_modal::WebContentsModalDialogManager; |
+std::unique_ptr<ConstrainedWindowMac> CreateAndShowWebModalDialogMac( |
+ ConstrainedWindowMacDelegate* delegate, |
+ content::WebContents* web_contents, |
+ id<ConstrainedWindowSheet> sheet) { |
+ ConstrainedWindowMac* window = |
+ new ConstrainedWindowMac(delegate, web_contents, sheet); |
+ window->ShowWebContentsModalDialog(); |
+ return std::unique_ptr<ConstrainedWindowMac>(window); |
+} |
+ |
+std::unique_ptr<ConstrainedWindowMac> CreateWebModalDialogMac( |
+ ConstrainedWindowMacDelegate* delegate, |
+ content::WebContents* web_contents, |
+ id<ConstrainedWindowSheet> sheet) { |
+ return std::unique_ptr<ConstrainedWindowMac>( |
+ new ConstrainedWindowMac(delegate, web_contents, sheet)); |
+} |
+ |
ConstrainedWindowMac::ConstrainedWindowMac( |
ConstrainedWindowMacDelegate* delegate, |
content::WebContents* web_contents, |
id<ConstrainedWindowSheet> sheet) |
- : delegate_(delegate) { |
+ : delegate_(delegate), |
+ sheet_([sheet retain]) { |
DCHECK(sheet); |
// |web_contents| may be embedded within a chain of nested GuestViews. If it |
// is, follow the chain of embedders to the outermost WebContents and use it. |
- web_contents = |
+ web_contents_ = |
guest_view::GuestViewBase::GetTopLevelWebContents(web_contents); |
- auto manager = WebContentsModalDialogManager::FromWebContents(web_contents); |
- scoped_ptr<SingleWebContentsDialogManagerCocoa> native_manager( |
- new SingleWebContentsDialogManagerCocoa(this, sheet, manager)); |
- manager->ShowDialogWithManager([sheet sheetWindow], |
- std::move(native_manager)); |
+ native_manager_.reset( |
+ new SingleWebContentsDialogManagerCocoa(this, sheet_.get(), |
+ GetDialogManager())); |
} |
ConstrainedWindowMac::~ConstrainedWindowMac() { |
CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+ native_manager_.reset(); |
DCHECK(!manager_); |
} |
+void ConstrainedWindowMac::ShowWebContentsModalDialog() { |
+ scoped_ptr<SingleWebContentsDialogManagerCocoa> dialog_manager; |
+ dialog_manager.reset(native_manager_.release()); |
+ GetDialogManager()->ShowDialogWithManager( |
+ [sheet_.get() sheetWindow], std::move(dialog_manager)); |
+} |
+ |
void ConstrainedWindowMac::CloseWebContentsModalDialog() { |
if (manager_) |
manager_->Close(); |
@@ -49,3 +73,13 @@ void ConstrainedWindowMac::OnDialogClosing() { |
if (delegate_) |
delegate_->OnConstrainedWindowClosed(this); |
} |
+ |
+bool ConstrainedWindowMac::DialogWasShown() { |
+ // If the dialog was shown, |native_manager_| would have been released. |
+ return !native_manager_; |
+} |
+ |
+WebContentsModalDialogManager* ConstrainedWindowMac::GetDialogManager() { |
+ DCHECK(web_contents_); |
+ return WebContentsModalDialogManager::FromWebContents(web_contents_); |
+} |