Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(803)

Side by Side Diff: chrome/browser/ui/views/constrained_web_dialog_delegate_views.cc

Issue 319013002: Reland Fix Views web-modal dialog widget creation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Revert MediaGalleriesScanResultDialogViews::AcceptDialogForTesting. Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/webui/constrained_web_dialog_delegate_base.h" 5 #include "chrome/browser/ui/webui/constrained_web_dialog_delegate_base.h"
6 6
7 #include "base/strings/utf_string_conversions.h" 7 #include "base/strings/utf_string_conversions.h"
8 #include "components/web_modal/web_contents_modal_dialog_host.h" 8 #include "chrome/browser/ui/views/constrained_window_views.h"
9 #include "components/web_modal/web_contents_modal_dialog_manager.h"
10 #include "components/web_modal/web_contents_modal_dialog_manager_delegate.h"
11 #include "content/public/browser/native_web_keyboard_event.h" 9 #include "content/public/browser/native_web_keyboard_event.h"
12 #include "content/public/browser/web_contents.h" 10 #include "content/public/browser/web_contents.h"
13 #include "ui/gfx/size.h"
14 #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h" 11 #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h"
15 #include "ui/views/controls/webview/webview.h" 12 #include "ui/views/controls/webview/webview.h"
16 #include "ui/views/view.h"
17 #include "ui/views/widget/widget.h" 13 #include "ui/views/widget/widget.h"
18 #include "ui/views/widget/widget_delegate.h" 14 #include "ui/views/widget/widget_delegate.h"
19 #include "ui/views/window/dialog_delegate.h"
20 #include "ui/web_dialogs/web_dialog_delegate.h" 15 #include "ui/web_dialogs/web_dialog_delegate.h"
21 #include "ui/web_dialogs/web_dialog_ui.h" 16 #include "ui/web_dialogs/web_dialog_ui.h"
22 17
23 using content::WebContents;
24 using ui::WebDialogDelegate; 18 using ui::WebDialogDelegate;
25 using ui::WebDialogWebContentsDelegate; 19 using ui::WebDialogWebContentsDelegate;
26 using web_modal::NativeWebContentsModalDialog;
27 using web_modal::WebContentsModalDialogManager;
28 using web_modal::WebContentsModalDialogManagerDelegate;
29 20
30 namespace { 21 namespace {
31 22
32 class ConstrainedWebDialogDelegateViews 23 class ConstrainedWebDialogDelegateViews
33 : public ConstrainedWebDialogDelegateBase { 24 : public ConstrainedWebDialogDelegateBase {
34 public: 25 public:
35 ConstrainedWebDialogDelegateViews(content::BrowserContext* browser_context, 26 ConstrainedWebDialogDelegateViews(content::BrowserContext* context,
36 WebDialogDelegate* delegate, 27 WebDialogDelegate* delegate,
37 WebDialogWebContentsDelegate* tab_delegate, 28 WebDialogWebContentsDelegate* tab_delegate,
38 views::WebView* view) 29 views::WebView* view)
39 : ConstrainedWebDialogDelegateBase( 30 : ConstrainedWebDialogDelegateBase(context, delegate, tab_delegate),
40 browser_context, delegate, tab_delegate), 31 view_(view) {}
41 view_(view),
42 window_(NULL) {}
43 32
44 virtual ~ConstrainedWebDialogDelegateViews() {} 33 virtual ~ConstrainedWebDialogDelegateViews() {}
45 34
46 // WebDialogWebContentsDelegate interface. 35 // WebDialogWebContentsDelegate:
47 virtual void CloseContents(WebContents* source) OVERRIDE { 36 virtual void CloseContents(content::WebContents* source) OVERRIDE {
48 window_->Close(); 37 view_->GetWidget()->Close();
49 } 38 }
50 39
51 // contents::WebContentsDelegate 40 // contents::WebContentsDelegate:
52 virtual void HandleKeyboardEvent( 41 virtual void HandleKeyboardEvent(
53 content::WebContents* source, 42 content::WebContents* source,
54 const content::NativeWebKeyboardEvent& event) OVERRIDE { 43 const content::NativeWebKeyboardEvent& event) OVERRIDE {
55 unhandled_keyboard_event_handler_.HandleKeyboardEvent( 44 unhandled_keyboard_event_handler_.HandleKeyboardEvent(
56 event, view_->GetFocusManager()); 45 event, view_->GetFocusManager());
57 } 46 }
58 47
59 // ConstrainedWebDialogDelegate 48 // ConstrainedWebDialogDelegate:
60 virtual NativeWebContentsModalDialog GetNativeDialog() OVERRIDE { 49 virtual web_modal::NativeWebContentsModalDialog GetNativeDialog() OVERRIDE {
61 return window_->GetNativeView(); 50 return view_->GetWidget()->GetNativeView();
62 } 51 }
63 52
64 void set_window(views::Widget* window) { window_ = window; }
65 views::Widget* window() const { return window_; }
66
67 private: 53 private:
68 // Converts keyboard events on the WebContents to accelerators. 54 // Converts keyboard events on the WebContents to accelerators.
69 views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_; 55 views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_;
70 56
71 views::WebView* view_; 57 views::WebView* view_;
72 views::Widget* window_;
73 58
74 DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViews); 59 DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViews);
75 }; 60 };
76 61
77 } // namespace
78
79 class ConstrainedWebDialogDelegateViewViews 62 class ConstrainedWebDialogDelegateViewViews
80 : public views::WebView, 63 : public views::WebView,
81 public ConstrainedWebDialogDelegate, 64 public ConstrainedWebDialogDelegate,
82 public views::WidgetDelegate { 65 public views::WidgetDelegate {
83 public: 66 public:
84 ConstrainedWebDialogDelegateViewViews( 67 ConstrainedWebDialogDelegateViewViews(
85 content::BrowserContext* browser_context, 68 content::BrowserContext* browser_context,
86 WebDialogDelegate* delegate, 69 WebDialogDelegate* delegate,
87 WebDialogWebContentsDelegate* tab_delegate); 70 WebDialogWebContentsDelegate* tab_delegate)
88 virtual ~ConstrainedWebDialogDelegateViewViews(); 71 : views::WebView(browser_context),
72 impl_(new ConstrainedWebDialogDelegateViews(browser_context, delegate,
73 tab_delegate, this)) {
74 SetWebContents(GetWebContents());
75 AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE));
76 }
77 virtual ~ConstrainedWebDialogDelegateViewViews() {}
89 78
90 // ConstrainedWebDialogDelegate interface 79 // ConstrainedWebDialogDelegate:
91 virtual const WebDialogDelegate* GetWebDialogDelegate() const OVERRIDE { 80 virtual const WebDialogDelegate* GetWebDialogDelegate() const OVERRIDE {
92 return impl_->GetWebDialogDelegate(); 81 return impl_->GetWebDialogDelegate();
93 } 82 }
94 virtual WebDialogDelegate* GetWebDialogDelegate() OVERRIDE { 83 virtual WebDialogDelegate* GetWebDialogDelegate() OVERRIDE {
95 return impl_->GetWebDialogDelegate(); 84 return impl_->GetWebDialogDelegate();
96 } 85 }
97 virtual void OnDialogCloseFromWebUI() OVERRIDE { 86 virtual void OnDialogCloseFromWebUI() OVERRIDE {
98 return impl_->OnDialogCloseFromWebUI(); 87 return impl_->OnDialogCloseFromWebUI();
99 } 88 }
100 virtual void ReleaseWebContentsOnDialogClose() OVERRIDE { 89 virtual void ReleaseWebContentsOnDialogClose() OVERRIDE {
101 return impl_->ReleaseWebContentsOnDialogClose(); 90 return impl_->ReleaseWebContentsOnDialogClose();
102 } 91 }
103 virtual NativeWebContentsModalDialog GetNativeDialog() OVERRIDE { 92 virtual web_modal::NativeWebContentsModalDialog GetNativeDialog() OVERRIDE {
104 return impl_->window()->GetNativeView(); 93 return impl_->GetNativeDialog();
105 } 94 }
106 virtual WebContents* GetWebContents() OVERRIDE { 95 virtual content::WebContents* GetWebContents() OVERRIDE {
107 return impl_->GetWebContents(); 96 return impl_->GetWebContents();
108 } 97 }
109 98
110 // views::WidgetDelegate interface. 99 // views::WidgetDelegate:
111 virtual views::View* GetInitiallyFocusedView() OVERRIDE { 100 virtual views::View* GetInitiallyFocusedView() OVERRIDE {
112 return this; 101 return this;
113 } 102 }
114 virtual void WindowClosing() OVERRIDE { 103 virtual void WindowClosing() OVERRIDE {
115 if (!impl_->closed_via_webui()) 104 if (!impl_->closed_via_webui())
116 GetWebDialogDelegate()->OnDialogClosed(std::string()); 105 GetWebDialogDelegate()->OnDialogClosed(std::string());
117 } 106 }
118 virtual views::Widget* GetWidget() OVERRIDE { 107 virtual views::Widget* GetWidget() OVERRIDE {
119 return View::GetWidget(); 108 return View::GetWidget();
120 } 109 }
121 virtual const views::Widget* GetWidget() const OVERRIDE { 110 virtual const views::Widget* GetWidget() const OVERRIDE {
122 return View::GetWidget(); 111 return View::GetWidget();
123 } 112 }
124 virtual base::string16 GetWindowTitle() const OVERRIDE { 113 virtual base::string16 GetWindowTitle() const OVERRIDE {
125 return impl_->closed_via_webui() ? base::string16() : 114 return impl_->closed_via_webui() ? base::string16() :
126 GetWebDialogDelegate()->GetDialogTitle(); 115 GetWebDialogDelegate()->GetDialogTitle();
127 } 116 }
128 virtual views::View* GetContentsView() OVERRIDE { 117 virtual views::View* GetContentsView() OVERRIDE {
129 return this; 118 return this;
130 } 119 }
131 virtual views::NonClientFrameView* CreateNonClientFrameView(
132 views::Widget* widget) OVERRIDE {
133 return views::DialogDelegate::CreateDialogFrameView(widget);
134 }
135 virtual bool ShouldShowCloseButton() const OVERRIDE { 120 virtual bool ShouldShowCloseButton() const OVERRIDE {
136 // No close button if the dialog doesn't want a title bar. 121 // No close button if the dialog doesn't want a title bar.
137 return impl_->GetWebDialogDelegate()->ShouldShowDialogTitle(); 122 return impl_->GetWebDialogDelegate()->ShouldShowDialogTitle();
138 } 123 }
139
140 virtual ui::ModalType GetModalType() const OVERRIDE { 124 virtual ui::ModalType GetModalType() const OVERRIDE {
141 #if defined(USE_ASH)
142 return ui::MODAL_TYPE_CHILD; 125 return ui::MODAL_TYPE_CHILD;
143 #else
144 return views::WidgetDelegate::GetModalType();
145 #endif
146 } 126 }
147 127
148 // views::WebView overrides. 128 // views::WebView:
149 virtual bool AcceleratorPressed( 129 virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE {
150 const ui::Accelerator& accelerator) OVERRIDE {
151 // Pressing ESC closes the dialog. 130 // Pressing ESC closes the dialog.
152 DCHECK_EQ(ui::VKEY_ESCAPE, accelerator.key_code()); 131 DCHECK_EQ(ui::VKEY_ESCAPE, accelerator.key_code());
153 impl_->window()->Close(); 132 GetWidget()->Close();
154 return true; 133 return true;
155 } 134 }
156 virtual gfx::Size GetPreferredSize() const OVERRIDE { 135 virtual gfx::Size GetPreferredSize() const OVERRIDE {
157 gfx::Size size; 136 gfx::Size size;
158 if (!impl_->closed_via_webui()) 137 if (!impl_->closed_via_webui())
159 GetWebDialogDelegate()->GetDialogSize(&size); 138 GetWebDialogDelegate()->GetDialogSize(&size);
160 return size; 139 return size;
161 } 140 }
162 virtual gfx::Size GetMinimumSize() const OVERRIDE { 141 virtual gfx::Size GetMinimumSize() const OVERRIDE {
163 // Return an empty size so that we can be made smaller. 142 // Return an empty size so that we can be made smaller.
164 return gfx::Size(); 143 return gfx::Size();
165 } 144 }
166 145
167 void SetWindow(views::Widget* window) {
168 impl_->set_window(window);
169 }
170
171 views::Widget* GetWindow() {
172 return impl_->window();
173 }
174
175 private: 146 private:
176 scoped_ptr<ConstrainedWebDialogDelegateViews> impl_; 147 scoped_ptr<ConstrainedWebDialogDelegateViews> impl_;
177 148
178 DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViewViews); 149 DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViewViews);
179 }; 150 };
180 151
181 ConstrainedWebDialogDelegateViewViews::ConstrainedWebDialogDelegateViewViews( 152 } // namespace
182 content::BrowserContext* browser_context,
183 WebDialogDelegate* delegate,
184 WebDialogWebContentsDelegate* tab_delegate)
185 : views::WebView(browser_context),
186 impl_(new ConstrainedWebDialogDelegateViews(browser_context,
187 delegate,
188 tab_delegate,
189 this)) {
190 SetWebContents(GetWebContents());
191
192 // Pressing ESC closes the dialog.
193 AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE));
194 }
195
196 ConstrainedWebDialogDelegateViewViews::
197 ~ConstrainedWebDialogDelegateViewViews() {
198 }
199 153
200 ConstrainedWebDialogDelegate* CreateConstrainedWebDialog( 154 ConstrainedWebDialogDelegate* CreateConstrainedWebDialog(
201 content::BrowserContext* browser_context, 155 content::BrowserContext* browser_context,
202 WebDialogDelegate* delegate, 156 WebDialogDelegate* delegate,
203 WebDialogWebContentsDelegate* tab_delegate, 157 WebDialogWebContentsDelegate* tab_delegate,
204 content::WebContents* web_contents) { 158 content::WebContents* web_contents) {
205 ConstrainedWebDialogDelegateViewViews* constrained_delegate = 159 ConstrainedWebDialogDelegateViewViews* dialog =
206 new ConstrainedWebDialogDelegateViewViews( 160 new ConstrainedWebDialogDelegateViewViews(
207 browser_context, delegate, tab_delegate); 161 browser_context, delegate, tab_delegate);
208 WebContentsModalDialogManager* web_contents_modal_dialog_manager = 162 ShowWebModalDialogViews(dialog, web_contents);
209 WebContentsModalDialogManager::FromWebContents(web_contents); 163 return dialog;
210 WebContentsModalDialogManagerDelegate* modal_delegate =
211 web_contents_modal_dialog_manager->delegate();
212 DCHECK(modal_delegate);
213 views::Widget* window = views::Widget::CreateWindowAsFramelessChild(
214 constrained_delegate,
215 modal_delegate->GetWebContentsModalDialogHost()->GetHostView());
216 web_contents_modal_dialog_manager->ShowModalDialog(
217 window->GetNativeView());
218 constrained_delegate->SetWindow(window);
219 return constrained_delegate;
220 } 164 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/collected_cookies_views.cc ('k') | chrome/browser/ui/views/constrained_window_views.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698