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