Reland "Close web contents modal dialogs on content load start"
[chromium-blink-merge.git] / chrome / browser / ui / views / tab_modal_confirm_dialog_views.cc
blobb6e35ab20dc21341afda0f26a03f67cd5012618f
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/ui/views/tab_modal_confirm_dialog_views.h"
7 #include "base/strings/utf_string_conversions.h"
8 #include "chrome/browser/ui/browser_dialogs.h"
9 #include "chrome/browser/ui/browser_list.h"
10 #include "chrome/browser/ui/browser_window.h"
11 #include "chrome/browser/ui/tab_modal_confirm_dialog_delegate.h"
12 #include "chrome/browser/ui/views/constrained_window_views.h"
13 #include "chrome/common/chrome_switches.h"
14 #include "components/web_modal/web_contents_modal_dialog_manager.h"
15 #include "components/web_modal/web_contents_modal_dialog_manager_delegate.h"
16 #include "content/public/browser/web_contents.h"
17 #include "content/public/browser/web_contents_view.h"
18 #include "grit/generated_resources.h"
19 #include "ui/base/l10n/l10n_util.h"
20 #include "ui/base/window_open_disposition.h"
21 #include "ui/views/controls/message_box_view.h"
22 #include "ui/views/layout/layout_constants.h"
23 #include "ui/views/widget/widget.h"
24 #include "ui/views/window/dialog_client_view.h"
26 using web_modal::WebContentsModalDialogManager;
28 // static
29 TabModalConfirmDialog* TabModalConfirmDialog::Create(
30 TabModalConfirmDialogDelegate* delegate,
31 content::WebContents* web_contents) {
32 return new TabModalConfirmDialogViews(
33 delegate, web_contents);
36 //////////////////////////////////////////////////////////////////////////////
37 // TabModalConfirmDialogViews, constructor & destructor:
39 TabModalConfirmDialogViews::TabModalConfirmDialogViews(
40 TabModalConfirmDialogDelegate* delegate,
41 content::WebContents* web_contents)
42 : web_contents_(web_contents),
43 delegate_(delegate),
44 dialog_(NULL),
45 browser_context_(web_contents->GetBrowserContext()) {
46 views::MessageBoxView::InitParams init_params(delegate->GetMessage());
47 init_params.inter_row_vertical_spacing =
48 views::kUnrelatedControlVerticalSpacing;
49 message_box_view_ = new views::MessageBoxView(init_params);
51 string16 link_text(delegate->GetLinkText());
52 if (!link_text.empty())
53 message_box_view_->SetLink(link_text, this);
55 WebContentsModalDialogManager* web_contents_modal_dialog_manager =
56 WebContentsModalDialogManager::FromWebContents(web_contents);
57 dialog_ = CreateWebContentsModalDialogViews(
58 this,
59 web_contents->GetView()->GetNativeView(),
60 web_contents_modal_dialog_manager->delegate()->
61 GetWebContentsModalDialogHost());
62 web_contents_modal_dialog_manager->ShowDialog(dialog_->GetNativeView());
63 delegate_->set_operations_delegate(this);
66 TabModalConfirmDialogViews::~TabModalConfirmDialogViews() {
69 void TabModalConfirmDialogViews::AcceptTabModalDialog() {
70 GetDialogClientView()->AcceptWindow();
73 void TabModalConfirmDialogViews::CancelTabModalDialog() {
74 GetDialogClientView()->CancelWindow();
77 void TabModalConfirmDialogViews::CloseDialog() {
78 dialog_->Close();
81 void TabModalConfirmDialogViews::SetPreventCloseOnLoadStart(bool prevent) {
82 WebContentsModalDialogManager* web_contents_modal_dialog_manager =
83 WebContentsModalDialogManager::FromWebContents(web_contents_);
84 web_contents_modal_dialog_manager->SetPreventCloseOnLoadStart(
85 dialog_->GetNativeView(), prevent);
88 //////////////////////////////////////////////////////////////////////////////
89 // TabModalConfirmDialogViews, views::LinkListener implementation:
91 void TabModalConfirmDialogViews::LinkClicked(views::Link* source,
92 int event_flags) {
93 delegate_->LinkClicked(ui::DispositionFromEventFlags(event_flags));
96 //////////////////////////////////////////////////////////////////////////////
97 // TabModalConfirmDialogViews, views::DialogDelegate implementation:
99 string16 TabModalConfirmDialogViews::GetWindowTitle() const {
100 return delegate_->GetTitle();
103 string16 TabModalConfirmDialogViews::GetDialogButtonLabel(
104 ui::DialogButton button) const {
105 if (button == ui::DIALOG_BUTTON_OK)
106 return delegate_->GetAcceptButtonTitle();
107 if (button == ui::DIALOG_BUTTON_CANCEL)
108 return delegate_->GetCancelButtonTitle();
109 return string16();
112 bool TabModalConfirmDialogViews::Cancel() {
113 delegate_->Cancel();
114 return true;
117 bool TabModalConfirmDialogViews::Accept() {
118 delegate_->Accept();
119 return true;
122 ///////////////////////////////////////////////////////////////////////////////
123 // TabModalConfirmDialogViews, views::WidgetDelegate implementation:
125 views::View* TabModalConfirmDialogViews::GetContentsView() {
126 return message_box_view_;
129 // TODO(wittman): Remove this override once we move to the new style frame view
130 // on all dialogs.
131 views::NonClientFrameView* TabModalConfirmDialogViews::CreateNonClientFrameView(
132 views::Widget* widget) {
133 return CreateConstrainedStyleNonClientFrameView(widget, browser_context_);
136 views::Widget* TabModalConfirmDialogViews::GetWidget() {
137 return message_box_view_->GetWidget();
140 const views::Widget* TabModalConfirmDialogViews::GetWidget() const {
141 return message_box_view_->GetWidget();
144 void TabModalConfirmDialogViews::DeleteDelegate() {
145 delete this;
148 ui::ModalType TabModalConfirmDialogViews::GetModalType() const {
149 #if defined(USE_ASH)
150 return ui::MODAL_TYPE_CHILD;
151 #else
152 return views::WidgetDelegate::GetModalType();
153 #endif