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/webui/constrained_web_dialog_delegate_base.h"
7 #include "base/utf_string_conversions.h"
8 #include "chrome/browser/ui/views/constrained_window_views.h"
9 #include "chrome/browser/ui/views/unhandled_keyboard_event_handler.h"
10 #include "chrome/browser/ui/web_contents_modal_dialog_manager.h"
11 #include "content/public/browser/native_web_keyboard_event.h"
12 #include "content/public/browser/web_contents.h"
13 #include "content/public/browser/web_contents_view.h"
14 #include "ui/gfx/size.h"
15 #include "ui/views/controls/webview/webview.h"
16 #include "ui/views/view.h"
17 #include "ui/views/widget/widget.h"
18 #include "ui/views/widget/widget_delegate.h"
19 #include "ui/web_dialogs/web_dialog_delegate.h"
20 #include "ui/web_dialogs/web_dialog_ui.h"
22 using content::WebContents
;
23 using ui::WebDialogDelegate
;
24 using ui::WebDialogWebContentsDelegate
;
28 class ConstrainedWebDialogDelegateViews
29 : public ConstrainedWebDialogDelegateBase
{
31 ConstrainedWebDialogDelegateViews(
32 content::BrowserContext
* browser_context
,
33 WebDialogDelegate
* delegate
,
34 WebDialogWebContentsDelegate
* tab_delegate
,
36 : ConstrainedWebDialogDelegateBase(
37 browser_context
, delegate
, tab_delegate
),
40 virtual ~ConstrainedWebDialogDelegateViews() {}
42 // WebDialogWebContentsDelegate interface.
43 virtual void CloseContents(WebContents
* source
) OVERRIDE
{
47 // contents::WebContentsDelegate
48 virtual void HandleKeyboardEvent(
49 content::WebContents
* source
,
50 const content::NativeWebKeyboardEvent
& event
) OVERRIDE
{
51 unhandled_keyboard_event_handler_
.HandleKeyboardEvent(
52 event
, view_
->GetFocusManager());
55 // ConstrainedWebDialogDelegate
56 virtual NativeWebContentsModalDialog
GetNativeDialog() OVERRIDE
{
57 return window_
->GetNativeView();
60 void set_window(views::Widget
* window
) { window_
= window
; }
61 views::Widget
* window() const { return window_
; }
64 // Converts keyboard events on the WebContents to accelerators.
65 UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_
;
67 views::WebView
* view_
;
68 views::Widget
* window_
;
70 DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViews
);
75 class ConstrainedWebDialogDelegateViewViews
76 : public views::WebView
,
77 public ConstrainedWebDialogDelegate
,
78 public views::WidgetDelegate
{
80 ConstrainedWebDialogDelegateViewViews(
81 content::BrowserContext
* browser_context
,
82 WebDialogDelegate
* delegate
,
83 WebDialogWebContentsDelegate
* tab_delegate
);
84 virtual ~ConstrainedWebDialogDelegateViewViews();
86 // ConstrainedWebDialogDelegate interface
87 virtual const WebDialogDelegate
*
88 GetWebDialogDelegate() const OVERRIDE
{
89 return impl_
->GetWebDialogDelegate();
91 virtual WebDialogDelegate
* GetWebDialogDelegate() OVERRIDE
{
92 return impl_
->GetWebDialogDelegate();
94 virtual void OnDialogCloseFromWebUI() OVERRIDE
{
95 return impl_
->OnDialogCloseFromWebUI();
97 virtual void ReleaseWebContentsOnDialogClose() OVERRIDE
{
98 return impl_
->ReleaseWebContentsOnDialogClose();
100 virtual NativeWebContentsModalDialog
GetNativeDialog() OVERRIDE
{
101 return impl_
->window()->GetNativeView();
103 virtual WebContents
* GetWebContents() OVERRIDE
{
104 return impl_
->GetWebContents();
107 // views::WidgetDelegate interface.
108 virtual views::View
* GetInitiallyFocusedView() OVERRIDE
{
111 virtual bool CanResize() const OVERRIDE
{ return true; }
112 virtual void WindowClosing() OVERRIDE
{
113 if (!impl_
->closed_via_webui())
114 GetWebDialogDelegate()->OnDialogClosed(std::string());
116 virtual views::Widget
* GetWidget() OVERRIDE
{
117 return View::GetWidget();
119 virtual const views::Widget
* GetWidget() const OVERRIDE
{
120 return View::GetWidget();
122 virtual string16
GetWindowTitle() const OVERRIDE
{
123 return impl_
->closed_via_webui() ? string16() :
124 GetWebDialogDelegate()->GetDialogTitle();
126 virtual views::View
* GetContentsView() OVERRIDE
{
129 // TODO(wittman): Remove this override once we move to the new style frame
130 // view on all dialogs.
131 virtual views::NonClientFrameView
* CreateNonClientFrameView(
132 views::Widget
* widget
) OVERRIDE
{
133 return CreateConstrainedStyleNonClientFrameView(
135 GetWebContents()->GetBrowserContext());
138 virtual ui::ModalType
GetModalType() const OVERRIDE
{
140 return ui::MODAL_TYPE_CHILD
;
142 return views::WidgetDelegate::GetModalType();
146 virtual void OnWidgetMove() OVERRIDE
{
147 // We need to check the existence of the widget because when running on
148 // WinXP this could get executed before the widget is entirely created.
152 GetWidget()->CenterWindow(
153 GetWidget()->non_client_view()->GetPreferredSize());
154 views::WidgetDelegate::OnWidgetMove();
157 // views::WebView overrides.
158 virtual bool AcceleratorPressed(
159 const ui::Accelerator
& accelerator
) OVERRIDE
{
160 // Pressing ESC closes the dialog.
161 DCHECK_EQ(ui::VKEY_ESCAPE
, accelerator
.key_code());
162 impl_
->window()->Close();
165 virtual gfx::Size
GetPreferredSize() OVERRIDE
{
167 if (!impl_
->closed_via_webui())
168 GetWebDialogDelegate()->GetDialogSize(&size
);
171 virtual gfx::Size
GetMinimumSize() OVERRIDE
{
172 // Return an empty size so that we can be made smaller.
176 void SetWindow(views::Widget
* window
) {
177 impl_
->set_window(window
);
180 views::Widget
* GetWindow() {
181 return impl_
->window();
184 scoped_ptr
<ConstrainedWebDialogDelegateViews
> impl_
;
186 DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViewViews
);
189 ConstrainedWebDialogDelegateViewViews::ConstrainedWebDialogDelegateViewViews(
190 content::BrowserContext
* browser_context
,
191 WebDialogDelegate
* delegate
,
192 WebDialogWebContentsDelegate
* tab_delegate
)
193 : views::WebView(browser_context
),
194 impl_(new ConstrainedWebDialogDelegateViews(browser_context
,
198 SetWebContents(GetWebContents());
200 // Pressing ESC closes the dialog.
201 AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE
, ui::EF_NONE
));
204 ConstrainedWebDialogDelegateViewViews::~ConstrainedWebDialogDelegateViewViews() {
207 ConstrainedWebDialogDelegate
* CreateConstrainedWebDialog(
208 content::BrowserContext
* browser_context
,
209 WebDialogDelegate
* delegate
,
210 WebDialogWebContentsDelegate
* tab_delegate
,
211 content::WebContents
* web_contents
) {
212 ConstrainedWebDialogDelegateViewViews
* constrained_delegate
=
213 new ConstrainedWebDialogDelegateViewViews(
214 browser_context
, delegate
, tab_delegate
);
215 views::Widget
* window
=
216 CreateWebContentsModalDialogViews(
217 constrained_delegate
,
218 web_contents
->GetView()->GetNativeView());
219 WebContentsModalDialogManager
* web_contents_modal_dialog_manager
=
220 WebContentsModalDialogManager::FromWebContents(web_contents
);
221 web_contents_modal_dialog_manager
->ShowDialog(window
->GetNativeView());
222 constrained_delegate
->SetWindow(window
);
223 return constrained_delegate
;