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..395c3919b304ac68bb8b94b4736a1d49a891a220 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" |
| @@ -20,15 +23,23 @@ |
| namespace { |
| +class InitiatorWebContentsObserver |
|
msw
2014/12/04 19:27:19
Why do you need to subclass content::WebContentsOb
apacible
2014/12/09 17:07:58
The WebContentsObserver constructor is protected.
|
| + : public content::WebContentsObserver { |
| + public: |
| + explicit InitiatorWebContentsObserver(content::WebContents* web_contents) |
| + : content::WebContentsObserver(web_contents) { |
| + } |
| +}; |
|
msw
2014/12/04 19:27:19
nit: DISALLOW_COPY_AND_ASSIGN
apacible
2014/12/09 17:07:58
Done.
|
| + |
| class WebDialogWebContentsDelegateViews |
| : public ui::WebDialogWebContentsDelegate { |
| public: |
| WebDialogWebContentsDelegateViews(content::BrowserContext* browser_context, |
| - content::WebContents* initiator, |
| + InitiatorWebContentsObserver* observer, |
| views::WebView* web_view) |
| : ui::WebDialogWebContentsDelegate(browser_context, |
| new ChromeWebContentsHandler()), |
| - initiator_(initiator), |
| + observer_(observer), |
| web_view_(web_view) { |
| } |
| ~WebDialogWebContentsDelegateViews() override {} |
| @@ -45,15 +56,32 @@ class WebDialogWebContentsDelegateViews |
| // http://crbug.com/104586 |
| // Disabled on Mac due to http://crbug.com/112173 |
| #if !defined(OS_MACOSX) |
| - auto delegate = initiator_->GetDelegate(); |
| + if (!observer_->web_contents()) |
| + return; |
| + |
| + auto delegate = observer_->web_contents()->GetDelegate(); |
| if (!delegate) |
| return; |
| - delegate->HandleKeyboardEvent(initiator_, event); |
| + delegate->HandleKeyboardEvent(observer_->web_contents(), event); |
| #endif |
| } |
| + void ResizeDueToAutoResize(content::WebContents* source, |
| + const gfx::Size& preferred_size) override { |
| + if (!observer_->web_contents()) |
| + return; |
| + |
| + web_view_->SetPreferredSize(preferred_size); |
| + |
| + constrained_window::UpdateWebContentsModalDialogPosition( |
| + web_view_->GetWidget(), |
| + web_modal::WebContentsModalDialogManager::FromWebContents( |
| + observer_->web_contents())->delegate()-> |
| + GetWebContentsModalDialogHost()); |
| + } |
| + |
| private: |
| - content::WebContents* initiator_; |
| + InitiatorWebContentsObserver* const observer_; |
|
msw
2014/12/04 19:27:19
nit: Use a more descriptive name, like |initiator_
apacible
2014/12/09 17:07:58
Done.
|
| views::WebView* web_view_; |
| DISALLOW_COPY_AND_ASSIGN(WebDialogWebContentsDelegateViews); |
| @@ -64,10 +92,10 @@ class ConstrainedWebDialogDelegateViews |
| public: |
| ConstrainedWebDialogDelegateViews(content::BrowserContext* context, |
| ui::WebDialogDelegate* delegate, |
| - content::WebContents* web_contents, |
| + InitiatorWebContentsObserver* observer, |
| views::WebView* view) |
| : ConstrainedWebDialogDelegateBase(context, delegate, |
| - new WebDialogWebContentsDelegateViews(context, web_contents, view)), |
| + new WebDialogWebContentsDelegateViews(context, observer, view)), |
| view_(view) {} |
| ~ConstrainedWebDialogDelegateViews() override {} |
| @@ -107,13 +135,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), |
| + observer_(web_contents), |
| impl_(new ConstrainedWebDialogDelegateViews(browser_context, delegate, |
| - web_contents, this)) { |
| + &observer_, this)), |
| + min_size_(min_size), |
| + max_size_(max_size) { |
| SetWebContents(GetWebContents()); |
| AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE)); |
| - } |
| + } |
|
msw
2014/12/04 19:27:19
Remove this incorrect indentation change.
apacible
2014/12/09 17:07:58
Done.
|
| ~ConstrainedWebDialogDelegateViewViews() override {} |
| // ConstrainedWebDialogDelegate: |
| @@ -168,30 +201,80 @@ 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(); |
|
msw
2014/12/04 19:27:19
I'm worried that this might be conflating the size
apacible
2014/12/09 17:07:58
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(); |
| + 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(); |
| + if (observer_.web_contents()) |
| + constrained_window::ShowWebModalDialogViews(this, |
| + observer_.web_contents()); |
| + } |
| } |
| private: |
| + void EnableAutoResize() { |
| + content::RenderViewHost* render_view_host = |
| + GetWebContents()->GetRenderViewHost(); |
| + render_view_host->EnableAutoResize(min_size_, max_size_); |
| + } |
| + |
| + InitiatorWebContentsObserver observer_; |
|
msw
2014/12/04 19:27:19
ditto nit: Use a more descriptive name, like |init
apacible
2014/12/09 17:07:58
Done.
|
| + |
| scoped_ptr<ConstrainedWebDialogDelegateViews> impl_; |
| + const gfx::Size min_size_; |
| + const gfx::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, |
| + const gfx::Size& min_size, |
| + const 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; |
| +} |