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..1ec88be0820addb871d0684ba2307dbfd6fe8510 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,13 @@ |
| #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/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" |
| @@ -52,6 +55,16 @@ class WebDialogWebContentsDelegateViews |
| #endif |
| } |
| + void ResizeDueToAutoResize(content::WebContents* source, |
| + const gfx::Size& preferred_size) override { |
| + web_view_->SetPreferredSize(preferred_size); |
| + |
| + constrained_window::UpdateWebContentsModalDialogPosition( |
| + web_view_->GetWidget(), |
| + web_modal::WebContentsModalDialogManager::FromWebContents( |
| + initiator_)->delegate()->GetWebContentsModalDialogHost()); |
| + } |
| + |
| private: |
| content::WebContents* initiator_; |
| views::WebView* web_view_; |
| @@ -107,13 +120,18 @@ class ConstrainedWebDialogDelegateViewViews |
| ConstrainedWebDialogDelegateViewViews( |
| content::BrowserContext* browser_context, |
| ui::WebDialogDelegate* delegate, |
| - content::WebContents* web_contents) |
| + content::WebContents* web_contents, |
| + const gfx::Size& min_size, |
| + const gfx::Size& max_size) |
| : views::WebView(browser_context), |
| impl_(new ConstrainedWebDialogDelegateViews(browser_context, delegate, |
| - web_contents, this)) { |
| + web_contents, this)), |
| + initiator_web_contents_(web_contents), |
|
sky
2014/12/02 15:55:40
What is the lifetime of this WebContents?
apacible
2014/12/09 17:07:58
The WebContents are destroyed before ConstrainedWe
|
| + min_size_(min_size), |
| + max_size_(max_size) { |
| SetWebContents(GetWebContents()); |
| AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE)); |
| - } |
| + } |
| ~ConstrainedWebDialogDelegateViewViews() override {} |
| // ConstrainedWebDialogDelegate: |
| @@ -168,30 +186,79 @@ class ConstrainedWebDialogDelegateViewViews |
| } |
| gfx::Size GetPreferredSize() const override { |
| gfx::Size size; |
| - if (!impl_->closed_via_webui()) |
| - GetWebDialogDelegate()->GetDialogSize(&size); |
| + if (!impl_->closed_via_webui()) { |
| + size = WebView::GetPreferredSize(); |
| + 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(); |
| + return min_size_; |
| + } |
| + gfx::Size GetMaximumSize() const override { |
| + return !max_size_.IsEmpty() ? max_size_ : WebView::GetMaximumSize(); |
| + } |
| + void RenderViewCreated(content::RenderViewHost* render_view_host) override { |
| + if (!max_size_.IsEmpty()) |
| + EnableAutoResize(); |
| + } |
| + void RenderViewHostChanged(content::RenderViewHost* old_host, |
| + content::RenderViewHost* new_host) override { |
| + if (!max_size_.IsEmpty()) |
| + EnableAutoResize(); |
| + } |
| + void DocumentOnLoadCompletedInMainFrame() override { |
| + if (!max_size_.IsEmpty()) { |
| + EnableAutoResize(); |
| + constrained_window::ShowWebModalDialogViews(this, |
| + initiator_web_contents_); |
| + } |
| } |
| private: |
| scoped_ptr<ConstrainedWebDialogDelegateViews> impl_; |
| + content::WebContents* const initiator_web_contents_; |
| + |
| + const gfx::Size min_size_; |
| + const gfx::Size max_size_; |
| + |
| + void EnableAutoResize() { |
|
sky
2014/12/02 15:55:40
functions before members.
apacible
2014/12/09 17:07:58
Done.
|
| + content::RenderViewHost* render_view_host = |
| + GetWebContents()->GetRenderViewHost(); |
| + render_view_host->EnableAutoResize(min_size_, max_size_); |
| + } |
| + |
| DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViewViews); |
| }; |
| } // namespace |
| -ConstrainedWebDialogDelegate* CreateConstrainedWebDialog( |
| +ConstrainedWebDialogDelegate* ShowConstrainedWebDialog( |
| content::BrowserContext* browser_context, |
| ui::WebDialogDelegate* delegate, |
| content::WebContents* web_contents) { |
| ConstrainedWebDialogDelegateViewViews* dialog = |
| new ConstrainedWebDialogDelegateViewViews( |
| - browser_context, delegate, web_contents); |
| + browser_context, delegate, web_contents, |
| + gfx::Size(), gfx::Size()); |
| 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, |
|
sky
2014/12/02 15:55:40
const gfx::Size&
apacible
2014/12/09 17:07:58
Done.
|
| + gfx::Size max_size) { |
| + DCHECK(!min_size.IsEmpty()); |
| + DCHECK(!max_size.IsEmpty()); |
| + ConstrainedWebDialogDelegateViewViews* dialog = |
| + new ConstrainedWebDialogDelegateViewViews( |
| + browser_context, delegate, web_contents, |
| + min_size, max_size); |
| + constrained_window::CreateWebModalDialogViews(dialog, web_contents); |
| + return dialog; |
| +} |