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

Side by Side Diff: chrome/browser/ui/cocoa/constrained_web_dialog_delegate_mac.mm

Issue 1440173003: Revert of Enable AutoResize for Constrained Web Dialogs for Mac. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month 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 #import <Cocoa/Cocoa.h> 7 #import <Cocoa/Cocoa.h>
8 8
9 #include "base/mac/scoped_nsobject.h" 9 #include "base/mac/scoped_nsobject.h"
10 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_custom_wi ndow.h" 10 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_custom_wi ndow.h"
11 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.h" 11 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.h"
12 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_web_dialo g_sheet.h" 12 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_web_dialo g_sheet.h"
13 #include "chrome/browser/ui/webui/chrome_web_contents_handler.h"
14 #include "content/public/browser/render_view_host.h"
15 #include "content/public/browser/web_contents.h" 13 #include "content/public/browser/web_contents.h"
16 #include "content/public/browser/web_contents_observer.h"
17 #include "ui/gfx/geometry/size.h" 14 #include "ui/gfx/geometry/size.h"
18 #include "ui/web_dialogs/web_dialog_delegate.h" 15 #include "ui/web_dialogs/web_dialog_delegate.h"
19 #include "ui/web_dialogs/web_dialog_ui.h" 16 #include "ui/web_dialogs/web_dialog_ui.h"
20 #include "ui/web_dialogs/web_dialog_web_contents_delegate.h" 17 #include "ui/web_dialogs/web_dialog_web_contents_delegate.h"
21 18
22 using content::WebContents; 19 using content::WebContents;
23 using ui::WebDialogDelegate; 20 using ui::WebDialogDelegate;
24 using ui::WebDialogWebContentsDelegate; 21 using ui::WebDialogWebContentsDelegate;
25 22
26 namespace { 23 namespace {
27 24
28 class ConstrainedWebDialogDelegateMac;
29
30 // This class is to trigger a resize to the dialog window when
31 // ResizeDueToAutoResize() is invoked.
32 class WebDialogWebContentsDelegateMac
33 : public ui::WebDialogWebContentsDelegate {
34 public:
35 WebDialogWebContentsDelegateMac(content::BrowserContext* browser_context,
36 content::WebContentsObserver* observer,
37 ConstrainedWebDialogDelegateBase* delegate)
38 : ui::WebDialogWebContentsDelegate(browser_context,
39 new ChromeWebContentsHandler()),
40 observer_(observer),
41 delegate_(delegate) {
42 }
43 ~WebDialogWebContentsDelegateMac() override {}
44
45 void ResizeDueToAutoResize(content::WebContents* source,
46 const gfx::Size& preferred_size) override {
47 if (!observer_->web_contents())
48 return;
49 delegate_->ResizeToGivenSize(preferred_size);
50 }
51
52 private:
53 // These members must outlive the instance.
54 content::WebContentsObserver* const observer_;
55 ConstrainedWebDialogDelegateBase* delegate_;
56
57 DISALLOW_COPY_AND_ASSIGN(WebDialogWebContentsDelegateMac);
58 };
59
60 class ConstrainedWebDialogDelegateMac 25 class ConstrainedWebDialogDelegateMac
61 : public ConstrainedWebDialogDelegateBase { 26 : public ConstrainedWebDialogDelegateBase {
62 public: 27 public:
63 ConstrainedWebDialogDelegateMac( 28 ConstrainedWebDialogDelegateMac(
64 content::BrowserContext* browser_context, 29 content::BrowserContext* browser_context,
65 WebDialogDelegate* delegate, 30 WebDialogDelegate* delegate)
66 content::WebContentsObserver* observer) 31 : ConstrainedWebDialogDelegateBase(browser_context, delegate, NULL) {}
67 : ConstrainedWebDialogDelegateBase(browser_context, delegate,
68 new WebDialogWebContentsDelegateMac(browser_context, observer,
69 this)) {}
70 32
71 // WebDialogWebContentsDelegate interface. 33 // WebDialogWebContentsDelegate interface.
72 void CloseContents(WebContents* source) override { 34 void CloseContents(WebContents* source) override {
73 window_->CloseWebContentsModalDialog(); 35 window_->CloseWebContentsModalDialog();
74 } 36 }
75 37
76 // ConstrainedWebDialogDelegateBase:
77 void ResizeToGivenSize(const gfx::Size size) override {
78 NSSize updated_preferred_size = NSMakeSize(size.width(),
79 size.height());
80 [window_->sheet() resizeWithNewSize:updated_preferred_size];
81 }
82
83 void set_window(ConstrainedWindowMac* window) { window_ = window; } 38 void set_window(ConstrainedWindowMac* window) { window_ = window; }
84 ConstrainedWindowMac* window() const { return window_; } 39 ConstrainedWindowMac* window() const { return window_; }
85 40
86 private: 41 private:
87 // Weak, owned by ConstrainedWebDialogDelegateViewMac. 42 // Weak, owned by ConstrainedWebDialogDelegateViewMac.
88 ConstrainedWindowMac* window_; 43 ConstrainedWindowMac* window_;
89 44
90 DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateMac); 45 DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateMac);
91 }; 46 };
92 47
93 } // namespace 48 } // namespace
94 49
95 class ConstrainedWebDialogDelegateViewMac : 50 class ConstrainedWebDialogDelegateViewMac :
96 public ConstrainedWindowMacDelegate, 51 public ConstrainedWindowMacDelegate,
97 public ConstrainedWebDialogDelegate, 52 public ConstrainedWebDialogDelegate {
98 public content::WebContentsObserver {
99 53
100 public: 54 public:
101 ConstrainedWebDialogDelegateViewMac( 55 ConstrainedWebDialogDelegateViewMac(
102 content::BrowserContext* browser_context, 56 content::BrowserContext* browser_context,
103 WebDialogDelegate* delegate, 57 WebDialogDelegate* delegate,
104 content::WebContents* web_contents, 58 content::WebContents* web_contents);
105 const gfx::Size& min_size,
106 const gfx::Size& max_size);
107 ~ConstrainedWebDialogDelegateViewMac() override {} 59 ~ConstrainedWebDialogDelegateViewMac() override {}
108 60
109 // ConstrainedWebDialogDelegate interface 61 // ConstrainedWebDialogDelegate interface
110 const WebDialogDelegate* GetWebDialogDelegate() const override { 62 const WebDialogDelegate* GetWebDialogDelegate() const override {
111 return impl_->GetWebDialogDelegate(); 63 return impl_->GetWebDialogDelegate();
112 } 64 }
113 WebDialogDelegate* GetWebDialogDelegate() override { 65 WebDialogDelegate* GetWebDialogDelegate() override {
114 return impl_->GetWebDialogDelegate(); 66 return impl_->GetWebDialogDelegate();
115 } 67 }
116 void OnDialogCloseFromWebUI() override { 68 void OnDialogCloseFromWebUI() override {
117 return impl_->OnDialogCloseFromWebUI(); 69 return impl_->OnDialogCloseFromWebUI();
118 } 70 }
119 void ReleaseWebContentsOnDialogClose() override { 71 void ReleaseWebContentsOnDialogClose() override {
120 return impl_->ReleaseWebContentsOnDialogClose(); 72 return impl_->ReleaseWebContentsOnDialogClose();
121 } 73 }
122 gfx::NativeWindow GetNativeDialog() override { return window_; } 74 gfx::NativeWindow GetNativeDialog() override { return window_; }
123 WebContents* GetWebContents() override { return impl_->GetWebContents(); } 75 WebContents* GetWebContents() override { return impl_->GetWebContents(); }
124 gfx::Size GetMinimumSize() const override { 76 gfx::Size GetMinimumSize() const override {
125 return min_size_; 77 NOTIMPLEMENTED();
78 return gfx::Size();
126 } 79 }
127 gfx::Size GetMaximumSize() const override { 80 gfx::Size GetMaximumSize() const override {
128 return max_size_; 81 NOTIMPLEMENTED();
82 return gfx::Size();
129 } 83 }
130 gfx::Size GetPreferredSize() const override { 84 gfx::Size GetPreferredSize() const override {
131 gfx::Size size; 85 NOTIMPLEMENTED();
132 if (!impl_->closed_via_webui()) { 86 return gfx::Size();
133 NSRect frame = [window_ frame];
134 size = gfx::Size(frame.size.width, frame.size.height);
135 }
136 return size;
137 }
138
139 // content::WebContentsObserver:
140 void RenderViewCreated(content::RenderViewHost* render_view_host) override {
141 if (IsDialogAutoResizable())
142 EnableAutoResize();
143 }
144 void RenderViewHostChanged(content::RenderViewHost* old_host,
145 content::RenderViewHost* new_host) override {
146 if (IsDialogAutoResizable())
147 EnableAutoResize();
148 }
149 void DocumentOnLoadCompletedInMainFrame() override {
150 if (!IsDialogAutoResizable())
151 return;
152
153 EnableAutoResize();
154 if (GetWebContents())
155 constrained_window_->ShowWebContentsModalDialog();
156 } 87 }
157 88
158 // ConstrainedWindowMacDelegate interface 89 // ConstrainedWindowMacDelegate interface
159 void OnConstrainedWindowClosed(ConstrainedWindowMac* window) override { 90 void OnConstrainedWindowClosed(ConstrainedWindowMac* window) override {
160 if (!impl_->closed_via_webui()) 91 if (!impl_->closed_via_webui())
161 GetWebDialogDelegate()->OnDialogClosed(""); 92 GetWebDialogDelegate()->OnDialogClosed("");
162 delete this; 93 delete this;
163 } 94 }
164 95
165 private: 96 private:
166 void EnableAutoResize() {
167 if (!GetWebContents())
168 return;
169
170 content::RenderViewHost* render_view_host =
171 GetWebContents()->GetRenderViewHost();
172 render_view_host->EnableAutoResize(min_size_, max_size_);
173 }
174
175 // Whether or not the dialog is autoresizable is determined based on whether
176 // |max_size_| was specified.
177 bool IsDialogAutoResizable() {
178 return !max_size_.IsEmpty();
179 }
180
181 scoped_ptr<ConstrainedWebDialogDelegateMac> impl_; 97 scoped_ptr<ConstrainedWebDialogDelegateMac> impl_;
182 scoped_ptr<ConstrainedWindowMac> constrained_window_; 98 scoped_ptr<ConstrainedWindowMac> constrained_window_;
183 base::scoped_nsobject<NSWindow> window_; 99 base::scoped_nsobject<NSWindow> window_;
184 100
185 // Minimum and maximum sizes to determine dialog bounds for auto-resizing.
186 const gfx::Size min_size_;
187 const gfx::Size max_size_;
188
189 DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViewMac); 101 DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViewMac);
190 }; 102 };
191 103
192 ConstrainedWebDialogDelegateViewMac::ConstrainedWebDialogDelegateViewMac( 104 ConstrainedWebDialogDelegateViewMac::ConstrainedWebDialogDelegateViewMac(
193 content::BrowserContext* browser_context, 105 content::BrowserContext* browser_context,
194 WebDialogDelegate* delegate, 106 WebDialogDelegate* delegate,
195 content::WebContents* web_contents, 107 content::WebContents* web_contents)
196 const gfx::Size& min_size, 108 : impl_(new ConstrainedWebDialogDelegateMac(browser_context, delegate)) {
197 const gfx::Size& max_size)
198 : content::WebContentsObserver(web_contents),
199 impl_(new ConstrainedWebDialogDelegateMac(browser_context, delegate,
200 this)),
201 min_size_(min_size),
202 max_size_(max_size) {
203 if (IsDialogAutoResizable())
204 Observe(GetWebContents());
205
206 // Create a window to hold web_contents in the constrained sheet: 109 // Create a window to hold web_contents in the constrained sheet:
207 gfx::Size size; 110 gfx::Size size;
208 delegate->GetDialogSize(&size); 111 delegate->GetDialogSize(&size);
209 NSRect frame = NSMakeRect(0, 0, size.width(), size.height()); 112 NSRect frame = NSMakeRect(0, 0, size.width(), size.height());
210 113
211 window_.reset([[ConstrainedWindowCustomWindow alloc] 114 window_.reset(
212 initWithContentRect:frame]); 115 [[ConstrainedWindowCustomWindow alloc] initWithContentRect:frame]);
213 [GetWebContents()->GetNativeView() setFrame:frame]; 116 [GetWebContents()->GetNativeView() setFrame:frame];
214 [GetWebContents()->GetNativeView() setAutoresizingMask: 117 [GetWebContents()->GetNativeView() setAutoresizingMask:
215 NSViewWidthSizable|NSViewHeightSizable]; 118 NSViewWidthSizable|NSViewHeightSizable];
216 [[window_ contentView] addSubview:GetWebContents()->GetNativeView()]; 119 [[window_ contentView] addSubview:GetWebContents()->GetNativeView()];
217 120
218 base::scoped_nsobject<WebDialogConstrainedWindowSheet> sheet( 121 base::scoped_nsobject<WebDialogConstrainedWindowSheet> sheet(
219 [[WebDialogConstrainedWindowSheet alloc] initWithCustomWindow:window_ 122 [[WebDialogConstrainedWindowSheet alloc] initWithCustomWindow:window_
220 webDialogDelegate:delegate]); 123 webDialogDelegate:delegate]);
221 124 constrained_window_.reset(new ConstrainedWindowMac(
222 if (IsDialogAutoResizable()) { 125 this, web_contents, sheet));
223 constrained_window_.reset(CreateWebModalDialogMac(
224 this, web_contents, sheet));
225 } else {
226 constrained_window_.reset(CreateAndShowWebModalDialogMac(
227 this, web_contents, sheet));
228 }
229 126
230 impl_->set_window(constrained_window_.get()); 127 impl_->set_window(constrained_window_.get());
231 } 128 }
232 129
233 ConstrainedWebDialogDelegate* ShowConstrainedWebDialog( 130 ConstrainedWebDialogDelegate* ShowConstrainedWebDialog(
234 content::BrowserContext* browser_context, 131 content::BrowserContext* browser_context,
235 WebDialogDelegate* delegate, 132 WebDialogDelegate* delegate,
236 content::WebContents* web_contents) { 133 content::WebContents* web_contents) {
237 // Deleted when the dialog closes. 134 // Deleted when the dialog closes.
238 ConstrainedWebDialogDelegateViewMac* constrained_delegate = 135 ConstrainedWebDialogDelegateViewMac* constrained_delegate =
239 new ConstrainedWebDialogDelegateViewMac( 136 new ConstrainedWebDialogDelegateViewMac(
240 browser_context, delegate, web_contents, 137 browser_context, delegate, web_contents);
241 gfx::Size(), gfx::Size());
242 return constrained_delegate; 138 return constrained_delegate;
243 } 139 }
244
245 ConstrainedWebDialogDelegate* ShowConstrainedWebDialogWithAutoResize(
246 content::BrowserContext* browser_context,
247 WebDialogDelegate* delegate,
248 content::WebContents* web_contents,
249 const gfx::Size& min_size,
250 const gfx::Size& max_size) {
251 DCHECK(!min_size.IsEmpty());
252 DCHECK(!max_size.IsEmpty());
253 // Deleted when the dialog closes.
254 ConstrainedWebDialogDelegateViewMac* constrained_delegate =
255 new ConstrainedWebDialogDelegateViewMac(
256 browser_context, delegate, web_contents,
257 min_size, max_size);
258 return constrained_delegate;
259 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698