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; |
+} |