Chromium Code Reviews| Index: chrome/browser/ui/views/constrained_web_dialog_delegate_views.cc |
| diff --git a/chrome/browser/ui/views/constrained_web_dialog_delegate_views.cc b/chrome/browser/ui/views/constrained_web_dialog_delegate_views.cc |
| index c98917173b820a6ed5319febb73e00ea237ce188..730475d638897fcb793cb74a72b27f2a0a5d8344 100644 |
| --- a/chrome/browser/ui/views/constrained_web_dialog_delegate_views.cc |
| +++ b/chrome/browser/ui/views/constrained_web_dialog_delegate_views.cc |
| @@ -9,10 +9,14 @@ |
| #include "chrome/browser/ui/browser_window.h" |
| #include "chrome/browser/ui/webui/chrome_web_contents_handler.h" |
| #include "components/constrained_window/constrained_window_views.h" |
| +#include "components/web_modal/popup_manager.h" |
|
miu
2014/11/26 00:47:43
Is this used anywhere?
apacible
2014/11/26 17:35:14
Nope, fixed.
|
| +#include "components/web_modal/web_contents_modal_dialog_manager.h" |
| #include "content/public/browser/native_web_keyboard_event.h" |
| +#include "content/public/browser/render_view_host.h" |
| #include "content/public/browser/web_contents.h" |
| #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h" |
| #include "ui/views/controls/webview/webview.h" |
| +#include "ui/views/view.h" |
| #include "ui/views/widget/widget.h" |
| #include "ui/views/window/dialog_delegate.h" |
| #include "ui/web_dialogs/web_dialog_delegate.h" |
| @@ -30,6 +34,7 @@ class WebDialogWebContentsDelegateViews |
| new ChromeWebContentsHandler()), |
| initiator_(initiator), |
| web_view_(web_view) { |
| + preferred_size_ = gfx::Size(); |
| } |
| ~WebDialogWebContentsDelegateViews() override {} |
| @@ -52,9 +57,26 @@ class WebDialogWebContentsDelegateViews |
| #endif |
| } |
| + void ResizeDueToAutoResize(content::WebContents* source, |
| + const gfx::Size& preferred_size) override { |
| + web_view_->SetPreferredSize(preferred_size); |
| + preferred_size_ = preferred_size; |
| + |
| + constrained_window::UpdateWebContentsModalDialogPosition( |
| + web_view_->GetWidget(), |
| + web_modal::WebContentsModalDialogManager::FromWebContents( |
| + initiator_)->delegate()->GetWebContentsModalDialogHost()); |
| + web_view_->SetBoundsRect(web_view_->bounds()); |
|
miu
2014/11/26 00:47:43
Is this call to SetBoundsRect() necessary? Seems
apacible
2014/11/26 17:35:13
No, and fixed.
|
| + } |
| + |
| + gfx::Size GetPreferredSize() const { |
|
miu
2014/11/26 00:47:43
I don't think this method is needed. See comments
apacible
2014/11/26 17:35:13
Done.
|
| + return preferred_size_; |
| + } |
| + |
| private: |
| content::WebContents* initiator_; |
| views::WebView* web_view_; |
| + gfx::Size preferred_size_; |
|
miu
2014/11/26 00:47:43
Don't need this if you don't need GetPreferredSize
apacible
2014/11/26 17:35:13
Done.
|
| DISALLOW_COPY_AND_ASSIGN(WebDialogWebContentsDelegateViews); |
| }; |
| @@ -111,9 +133,38 @@ class ConstrainedWebDialogDelegateViewViews |
| : views::WebView(browser_context), |
| impl_(new ConstrainedWebDialogDelegateViews(browser_context, delegate, |
| web_contents, this)) { |
| + delegate_ = static_cast<WebDialogWebContentsDelegateViews*>( |
| + GetWebContents()->GetDelegate()); |
| + DCHECK(delegate_); |
| SetWebContents(GetWebContents()); |
| AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE)); |
| + |
| + web_contents_ = web_contents; |
| + min_size_ = gfx::Size(); |
|
miu
2014/11/26 00:47:43
In C++, both |min_size_| and |max_size_| are autom
apacible
2014/11/26 17:35:14
Done.
|
| + max_size_ = gfx::Size(); |
| + auto_resize_enabled_ = false; |
| } |
| + ConstrainedWebDialogDelegateViewViews( |
|
miu
2014/11/26 00:47:43
nit: Add newline above this line.
apacible
2014/11/26 17:35:14
Removed one constructor.
|
| + content::BrowserContext* browser_context, |
| + ui::WebDialogDelegate* delegate, |
| + content::WebContents* web_contents, |
| + gfx::Size min_size, |
| + gfx::Size max_size) |
| + : views::WebView(browser_context), |
|
miu
2014/11/26 00:47:43
Chromium now allows C++11 delegated constructors,
apacible
2014/11/26 17:35:14
Combined both constructors into one.
|
| + impl_(new ConstrainedWebDialogDelegateViews(browser_context, delegate, |
| + web_contents, this)) { |
| + delegate_ = static_cast<WebDialogWebContentsDelegateViews*>( |
| + GetWebContents()->GetDelegate()); |
| + DCHECK(delegate_); |
| + SetWebContents(GetWebContents()); |
| + AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE)); |
| + |
| + DCHECK(!min_size.IsEmpty()); |
| + DCHECK(!max_size.IsEmpty()); |
| + SetBoundsForAutoResize(min_size, max_size); |
| + |
| + web_contents_ = web_contents; |
| + } |
| ~ConstrainedWebDialogDelegateViewViews() override {} |
| // ConstrainedWebDialogDelegate: |
| @@ -135,6 +186,13 @@ class ConstrainedWebDialogDelegateViewViews |
| content::WebContents* GetWebContents() override { |
| return impl_->GetWebContents(); |
| } |
| + void EnableAutoResize(const gfx::Size& min_size, const gfx::Size& max_size) |
|
miu
2014/11/26 00:47:43
This should be a private method. Also, you don't
apacible
2014/11/26 17:35:14
Done.
|
| + override { |
| + content::RenderViewHost* render_view_host = |
| + GetWebContents()->GetRenderViewHost(); |
| + DCHECK(render_view_host); |
| + render_view_host->EnableAutoResize(min_size, max_size); |
| + } |
| // views::WidgetDelegate: |
| views::View* GetInitiallyFocusedView() override { return this; } |
| @@ -146,6 +204,7 @@ class ConstrainedWebDialogDelegateViewViews |
| const views::Widget* GetWidget() const override { return View::GetWidget(); } |
| base::string16 GetWindowTitle() const override { |
| return impl_->closed_via_webui() ? base::string16() : |
| + |
|
miu
2014/11/26 00:47:43
nit: Remove this newline.
apacible
2014/11/26 17:35:14
Done.
|
| GetWebDialogDelegate()->GetDialogTitle(); |
| } |
| views::View* GetContentsView() override { return this; } |
| @@ -168,18 +227,54 @@ class ConstrainedWebDialogDelegateViewViews |
| } |
| gfx::Size GetPreferredSize() const override { |
| gfx::Size size; |
| - if (!impl_->closed_via_webui()) |
| - GetWebDialogDelegate()->GetDialogSize(&size); |
| + if (!impl_->closed_via_webui()) { |
| + size = delegate_->GetPreferredSize(); |
|
miu
2014/11/26 00:47:43
If you unwind the code, this looks identical to:
apacible
2014/11/26 17:35:14
Done.
|
| + if (size.IsEmpty()) |
| + GetWebDialogDelegate()->GetDialogSize(&size); |
| + } |
| return size; |
| } |
| gfx::Size GetMinimumSize() const override { |
| // Return an empty size so that we can be made smaller. |
| return gfx::Size(); |
|
miu
2014/11/26 00:47:43
Should this method return min_size_ instead?
Also
apacible
2014/11/26 17:35:14
Done.
Talked offline about functionality of GetMa
|
| } |
| + void RenderViewCreated(content::RenderViewHost* render_view_host) override { |
| + if (auto_resize_enabled_) |
| + EnableAutoResize(min_size_, max_size_); |
| + } |
| + void RenderViewHostChanged(content::RenderViewHost* old_host, |
| + content::RenderViewHost* new_host) override { |
| + if (auto_resize_enabled_) |
| + EnableAutoResize(min_size_, max_size_); |
| + } |
| + void DocumentOnLoadCompletedInMainFrame() override { |
| + if (auto_resize_enabled_) { |
| + EnableAutoResize(min_size_, max_size_); |
| + constrained_window::ShowWebModalDialogViews(this, web_contents_); |
| + } |
| + } |
| private: |
| scoped_ptr<ConstrainedWebDialogDelegateViews> impl_; |
| + content::WebContents* web_contents_; |
|
miu
2014/11/26 00:47:43
Don't need this. The code can always call the web
apacible
2014/11/26 17:35:13
Talked offline -- keeping web_contents_ but renami
|
| + |
| + gfx::Size min_size_; |
|
miu
2014/11/26 00:47:43
Use 'const gfx::Size', since these are not modifie
apacible
2014/11/26 17:35:14
Done.
|
| + gfx::Size max_size_; |
| + |
| + bool auto_resize_enabled_; |
|
miu
2014/11/26 00:47:44
Don't need this extra bool member. The code could
apacible
2014/11/26 17:35:14
Done.
|
| + |
| + WebDialogWebContentsDelegateViews* delegate_; |
|
miu
2014/11/26 00:47:43
Don't need this one, either. ;-)
apacible
2014/11/26 17:35:15
Done.
|
| + |
| + void SetBoundsForAutoResize(const gfx::Size& min_size, |
|
miu
2014/11/26 00:47:43
Only the ctor calls this method. Assuming you agr
apacible
2014/11/26 17:35:14
Done.
|
| + const gfx::Size& max_size) { |
| + DCHECK(!min_size.IsEmpty()); |
| + DCHECK(!max_size.IsEmpty()); |
| + min_size_ = min_size; |
| + max_size_ = max_size; |
| + auto_resize_enabled_ = true; |
| + } |
| + |
| DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViewViews); |
| }; |
| @@ -195,3 +290,17 @@ ConstrainedWebDialogDelegate* CreateConstrainedWebDialog( |
| constrained_window::ShowWebModalDialogViews(dialog, web_contents); |
| return dialog; |
| } |
| + |
| +ConstrainedWebDialogDelegate* CreateConstrainedWebDialogWithAutoResize( |
| + content::BrowserContext* browser_context, |
| + ui::WebDialogDelegate* delegate, |
| + content::WebContents* web_contents, |
| + gfx::Size min_size, |
| + gfx::Size max_size) { |
| + ConstrainedWebDialogDelegateViewViews* dialog = |
| + new ConstrainedWebDialogDelegateViewViews( |
| + browser_context, delegate, web_contents, |
| + min_size, max_size); |
| + constrained_window::CreateWebModalDialogViews(dialog, web_contents); |
|
miu
2014/11/26 00:47:43
Did you mean to call ShowWebModalDialogViews() ins
apacible
2014/11/26 17:35:13
The showing happens later. I will rename the forme
|
| + return dialog; |
| +} |