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

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

Issue 2172363002: Created min size for print preview dialog and modified to allow the Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix mac build error Created 4 years, 3 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
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/macros.h" 7 #include "base/macros.h"
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "build/build_config.h" 9 #include "build/build_config.h"
10 #include "chrome/browser/ui/browser_finder.h" 10 #include "chrome/browser/ui/browser_finder.h"
11 #include "chrome/browser/ui/browser_window.h" 11 #include "chrome/browser/ui/browser_window.h"
12 #include "chrome/browser/ui/webui/chrome_web_contents_handler.h" 12 #include "chrome/browser/ui/webui/chrome_web_contents_handler.h"
13 #include "components/constrained_window/constrained_window_views.h" 13 #include "components/constrained_window/constrained_window_views.h"
14 #include "components/guest_view/browser/guest_view_base.h"
14 #include "components/web_modal/web_contents_modal_dialog_manager.h" 15 #include "components/web_modal/web_contents_modal_dialog_manager.h"
15 #include "content/public/browser/native_web_keyboard_event.h" 16 #include "content/public/browser/native_web_keyboard_event.h"
16 #include "content/public/browser/render_view_host.h" 17 #include "content/public/browser/render_view_host.h"
17 #include "content/public/browser/web_contents.h" 18 #include "content/public/browser/web_contents.h"
19 #include "ui/gfx/native_widget_types.h"
18 #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h" 20 #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h"
19 #include "ui/views/controls/webview/webview.h" 21 #include "ui/views/controls/webview/webview.h"
20 #include "ui/views/view.h" 22 #include "ui/views/view.h"
21 #include "ui/views/widget/widget.h" 23 #include "ui/views/widget/widget.h"
22 #include "ui/views/window/dialog_delegate.h" 24 #include "ui/views/window/dialog_delegate.h"
23 #include "ui/web_dialogs/web_dialog_delegate.h" 25 #include "ui/web_dialogs/web_dialog_delegate.h"
24 #include "ui/web_dialogs/web_dialog_ui.h" 26 #include "ui/web_dialogs/web_dialog_ui.h"
25 27
26 namespace { 28 namespace {
27 29
28 // WebContentsObserver that tracks the lifetime of the WebContents to avoid 30 // WebContentsObserver that tracks the lifetime of the WebContents to avoid
29 // potential use after destruction. 31 // potential use after destruction.
30 class InitiatorWebContentsObserver 32 class InitiatorWebContentsObserver
31 : public content::WebContentsObserver { 33 : public content::WebContentsObserver {
32 public: 34 public:
33 explicit InitiatorWebContentsObserver(content::WebContents* web_contents) 35 explicit InitiatorWebContentsObserver(content::WebContents* web_contents)
34 : content::WebContentsObserver(web_contents) { 36 : content::WebContentsObserver(web_contents) {}
35 }
36 37
37 private: 38 private:
38 DISALLOW_COPY_AND_ASSIGN(InitiatorWebContentsObserver); 39 DISALLOW_COPY_AND_ASSIGN(InitiatorWebContentsObserver);
39 }; 40 };
40 41
41 class WebDialogWebContentsDelegateViews 42 class WebDialogWebContentsDelegateViews
42 : public ui::WebDialogWebContentsDelegate { 43 : public ui::WebDialogWebContentsDelegate {
43 public: 44 public:
44 WebDialogWebContentsDelegateViews(content::BrowserContext* browser_context, 45 WebDialogWebContentsDelegateViews(content::BrowserContext* browser_context,
45 InitiatorWebContentsObserver* observer, 46 InitiatorWebContentsObserver* observer,
46 views::WebView* web_view) 47 views::WebView* web_view)
47 : ui::WebDialogWebContentsDelegate(browser_context, 48 : ui::WebDialogWebContentsDelegate(browser_context,
48 new ChromeWebContentsHandler()), 49 new ChromeWebContentsHandler()),
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 class ConstrainedWebDialogDelegateViewViews 138 class ConstrainedWebDialogDelegateViewViews
138 : public views::WebView, 139 : public views::WebView,
139 public ConstrainedWebDialogDelegate, 140 public ConstrainedWebDialogDelegate,
140 public views::WidgetDelegate { 141 public views::WidgetDelegate {
141 public: 142 public:
142 ConstrainedWebDialogDelegateViewViews( 143 ConstrainedWebDialogDelegateViewViews(
143 content::BrowserContext* browser_context, 144 content::BrowserContext* browser_context,
144 ui::WebDialogDelegate* delegate, 145 ui::WebDialogDelegate* delegate,
145 content::WebContents* web_contents, 146 content::WebContents* web_contents,
146 const gfx::Size& min_size, 147 const gfx::Size& min_size,
147 const gfx::Size& max_size) 148 const gfx::Size& max_size,
149 bool is_toplevel)
148 : views::WebView(browser_context), 150 : views::WebView(browser_context),
149 initiator_observer_(web_contents), 151 initiator_observer_(web_contents),
150 impl_(new ConstrainedWebDialogDelegateViews(browser_context, delegate, 152 impl_(new ConstrainedWebDialogDelegateViews(browser_context,
153 delegate,
151 &initiator_observer_, 154 &initiator_observer_,
152 this)), 155 this)),
153 min_size_(min_size), 156 min_size_(min_size),
154 max_size_(max_size) { 157 max_size_(max_size),
158 is_toplevel_(is_toplevel) {
155 SetWebContents(GetWebContents()); 159 SetWebContents(GetWebContents());
156 AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE)); 160 AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE));
157 if (!max_size_.IsEmpty()) 161 if (!max_size_.IsEmpty())
158 EnableAutoResize(); 162 EnableAutoResize();
159 } 163 }
160 ~ConstrainedWebDialogDelegateViewViews() override {} 164 ~ConstrainedWebDialogDelegateViewViews() override {}
161 165
162 // ConstrainedWebDialogDelegate: 166 // ConstrainedWebDialogDelegate:
163 const ui::WebDialogDelegate* GetWebDialogDelegate() const override { 167 const ui::WebDialogDelegate* GetWebDialogDelegate() const override {
164 return impl_->GetWebDialogDelegate(); 168 return impl_->GetWebDialogDelegate();
(...skipping 28 matching lines...) Expand all
193 } 197 }
194 views::View* GetContentsView() override { return this; } 198 views::View* GetContentsView() override { return this; }
195 views::NonClientFrameView* CreateNonClientFrameView( 199 views::NonClientFrameView* CreateNonClientFrameView(
196 views::Widget* widget) override { 200 views::Widget* widget) override {
197 return views::DialogDelegate::CreateDialogFrameView(widget); 201 return views::DialogDelegate::CreateDialogFrameView(widget);
198 } 202 }
199 bool ShouldShowCloseButton() const override { 203 bool ShouldShowCloseButton() const override {
200 // No close button if the dialog doesn't want a title bar. 204 // No close button if the dialog doesn't want a title bar.
201 return impl_->GetWebDialogDelegate()->ShouldShowDialogTitle(); 205 return impl_->GetWebDialogDelegate()->ShouldShowDialogTitle();
202 } 206 }
203 ui::ModalType GetModalType() const override { return ui::MODAL_TYPE_CHILD; } 207 ui::ModalType GetModalType() const override {
208 ui::ModalType type = GetWebDialogDelegate()->GetDialogModalType();
209 return type == ui::MODAL_TYPE_NONE ? ui::MODAL_TYPE_CHILD : type;
210 }
204 211
205 // views::WebView: 212 // views::WebView:
206 bool AcceleratorPressed(const ui::Accelerator& accelerator) override { 213 bool AcceleratorPressed(const ui::Accelerator& accelerator) override {
207 // Pressing ESC closes the dialog. 214 // Pressing ESC closes the dialog.
208 DCHECK_EQ(ui::VKEY_ESCAPE, accelerator.key_code()); 215 DCHECK_EQ(ui::VKEY_ESCAPE, accelerator.key_code());
209 GetWidget()->Close(); 216 GetWidget()->Close();
210 return true; 217 return true;
211 } 218 }
212 gfx::Size GetPreferredSize() const override { 219 gfx::Size GetPreferredSize() const override {
213 gfx::Size size; 220 gfx::Size size;
(...skipping 17 matching lines...) Expand all
231 if (!max_size_.IsEmpty()) 238 if (!max_size_.IsEmpty())
232 EnableAutoResize(); 239 EnableAutoResize();
233 } 240 }
234 void RenderViewHostChanged(content::RenderViewHost* old_host, 241 void RenderViewHostChanged(content::RenderViewHost* old_host,
235 content::RenderViewHost* new_host) override { 242 content::RenderViewHost* new_host) override {
236 if (!max_size_.IsEmpty()) 243 if (!max_size_.IsEmpty())
237 EnableAutoResize(); 244 EnableAutoResize();
238 } 245 }
239 void DocumentOnLoadCompletedInMainFrame() override { 246 void DocumentOnLoadCompletedInMainFrame() override {
240 if (!max_size_.IsEmpty() && initiator_observer_.web_contents()) { 247 if (!max_size_.IsEmpty() && initiator_observer_.web_contents()) {
241 constrained_window::ShowModalDialog(GetWidget()->GetNativeWindow(), 248 if (is_toplevel_) {
242 initiator_observer_.web_contents()); 249 constrained_window::ShowTopLevelModalDialog(
250 GetWidget()->GetNativeWindow(), initiator_observer_.web_contents(),
251 this);
252 } else {
253 constrained_window::ShowModalDialog(GetWidget()->GetNativeWindow(),
254 initiator_observer_.web_contents());
255 }
243 } 256 }
244 } 257 }
245 258
246 private: 259 private:
247 void EnableAutoResize() { 260 void EnableAutoResize() {
248 content::RenderViewHost* render_view_host = 261 content::RenderViewHost* render_view_host =
249 GetWebContents()->GetRenderViewHost(); 262 GetWebContents()->GetRenderViewHost();
250 render_view_host->EnableAutoResize(min_size_, max_size_); 263 render_view_host->EnableAutoResize(min_size_, max_size_);
251 } 264 }
252 265
253 InitiatorWebContentsObserver initiator_observer_; 266 InitiatorWebContentsObserver initiator_observer_;
254 267
255 std::unique_ptr<ConstrainedWebDialogDelegateViews> impl_; 268 std::unique_ptr<ConstrainedWebDialogDelegateViews> impl_;
256 269
257 // Minimum and maximum sizes to determine dialog bounds for auto-resizing. 270 // Minimum and maximum sizes to determine dialog bounds for auto-resizing.
258 const gfx::Size min_size_; 271 const gfx::Size min_size_;
259 const gfx::Size max_size_; 272 const gfx::Size max_size_;
260 273
274 // If true, dialog is a toplevel window - a peer and modal transient child of
275 // the original web contents window rather than a child. This allows the
276 // dialog to extend outside of the original window on some platforms
277 // (ChromeOS)
278 bool is_toplevel_;
279
261 DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViewViews); 280 DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViewViews);
262 }; 281 };
263 282
264 } // namespace 283 } // namespace
265 284
285 ConstrainedWebDialogDelegate* ShowTopLevelConstrainedWebDialogInWindow(
286 content::BrowserContext* browser_context,
287 ui::WebDialogDelegate* delegate,
288 content::WebContents* web_contents,
289 gfx::NativeView dialog_host_window) {
290 ConstrainedWebDialogDelegateViewViews* dialog =
291 new ConstrainedWebDialogDelegateViewViews(browser_context, delegate,
292 web_contents, gfx::Size(),
293 gfx::Size(), false);
294 content::WebContents* top_web_contents =
295 guest_view::GuestViewBase::GetTopLevelWebContents(web_contents);
296 views::Widget* widget =
297 views::DialogDelegate::CreateDialogWidget(dialog,
298 dialog_host_window,
299 nullptr);
300 constrained_window::ShowTopLevelModalDialog(widget->GetNativeWindow(),
301 top_web_contents, dialog);
302 return dialog;
303 }
304
266 ConstrainedWebDialogDelegate* ShowConstrainedWebDialog( 305 ConstrainedWebDialogDelegate* ShowConstrainedWebDialog(
267 content::BrowserContext* browser_context, 306 content::BrowserContext* browser_context,
268 ui::WebDialogDelegate* delegate, 307 ui::WebDialogDelegate* delegate,
269 content::WebContents* web_contents) { 308 content::WebContents* web_contents) {
270 ConstrainedWebDialogDelegateViewViews* dialog = 309 ConstrainedWebDialogDelegateViewViews* dialog =
271 new ConstrainedWebDialogDelegateViewViews( 310 new ConstrainedWebDialogDelegateViewViews(browser_context, delegate,
272 browser_context, delegate, web_contents, 311 web_contents, gfx::Size(),
273 gfx::Size(), gfx::Size()); 312 gfx::Size(), false);
274 constrained_window::ShowWebModalDialogViews(dialog, web_contents); 313 constrained_window::ShowWebModalDialogViews(dialog, web_contents);
275 return dialog; 314 return dialog;
276 } 315 }
277 316
317 ConstrainedWebDialogDelegate* ShowTopLevelConstrainedWebDialog(
318 content::BrowserContext* browser_context,
319 ui::WebDialogDelegate* delegate,
320 content::WebContents* web_contents) {
321 ConstrainedWebDialogDelegateViewViews* dialog =
322 new ConstrainedWebDialogDelegateViewViews(browser_context, delegate,
323 web_contents, gfx::Size(),
324 gfx::Size(), true);
325 constrained_window::ShowTopLevelWebModalDialogViews(dialog, web_contents,
326 dialog);
327 return dialog;
328 }
329
278 ConstrainedWebDialogDelegate* ShowConstrainedWebDialogWithAutoResize( 330 ConstrainedWebDialogDelegate* ShowConstrainedWebDialogWithAutoResize(
279 content::BrowserContext* browser_context, 331 content::BrowserContext* browser_context,
280 ui::WebDialogDelegate* delegate, 332 ui::WebDialogDelegate* delegate,
281 content::WebContents* web_contents, 333 content::WebContents* web_contents,
282 const gfx::Size& min_size, 334 const gfx::Size& min_size,
283 const gfx::Size& max_size) { 335 const gfx::Size& max_size) {
284 DCHECK(!min_size.IsEmpty()); 336 DCHECK(!min_size.IsEmpty());
285 DCHECK(!max_size.IsEmpty()); 337 DCHECK(!max_size.IsEmpty());
286 ConstrainedWebDialogDelegateViewViews* dialog = 338 ConstrainedWebDialogDelegateViewViews* dialog =
287 new ConstrainedWebDialogDelegateViewViews( 339 new ConstrainedWebDialogDelegateViewViews(
288 browser_context, delegate, web_contents, 340 browser_context, delegate, web_contents, min_size, max_size, false);
289 min_size, max_size);
290 constrained_window::CreateWebModalDialogViews(dialog, web_contents); 341 constrained_window::CreateWebModalDialogViews(dialog, web_contents);
291 return dialog; 342 return dialog;
292 } 343 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698