| Index: chrome/browser/ui/cocoa/constrained_web_dialog_delegate_mac.mm
|
| diff --git a/chrome/browser/ui/cocoa/constrained_web_dialog_delegate_mac.mm b/chrome/browser/ui/cocoa/constrained_web_dialog_delegate_mac.mm
|
| index 0ce4df8dabd21d94c623d0ae10d11a73afba8b5d..74206ed2395466e80c89e059a032b72ceac5dc8a 100644
|
| --- a/chrome/browser/ui/cocoa/constrained_web_dialog_delegate_mac.mm
|
| +++ b/chrome/browser/ui/cocoa/constrained_web_dialog_delegate_mac.mm
|
| @@ -11,7 +11,11 @@
|
| #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_custom_window.h"
|
| #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.h"
|
| #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_web_dialog_sheet.h"
|
| +#include "chrome/browser/ui/webui/chrome_web_contents_handler.h"
|
| +#include "content/public/browser/render_view_host.h"
|
| #include "content/public/browser/web_contents.h"
|
| +#include "content/public/browser/web_contents_observer.h"
|
| +#include "ui/base/cocoa/window_size_constants.h"
|
| #include "ui/gfx/geometry/size.h"
|
| #include "ui/web_dialogs/web_dialog_delegate.h"
|
| #include "ui/web_dialogs/web_dialog_ui.h"
|
| @@ -23,19 +27,61 @@ using ui::WebDialogWebContentsDelegate;
|
|
|
| namespace {
|
|
|
| +class ConstrainedWebDialogDelegateMac;
|
| +
|
| +// This class is to trigger a resize to the dialog window when
|
| +// ResizeDueToAutoResize() is invoked.
|
| +class WebDialogWebContentsDelegateMac
|
| + : public ui::WebDialogWebContentsDelegate {
|
| + public:
|
| + WebDialogWebContentsDelegateMac(content::BrowserContext* browser_context,
|
| + content::WebContentsObserver* observer,
|
| + ConstrainedWebDialogDelegateBase* delegate)
|
| + : ui::WebDialogWebContentsDelegate(browser_context,
|
| + new ChromeWebContentsHandler()),
|
| + observer_(observer),
|
| + delegate_(delegate) {
|
| + }
|
| + ~WebDialogWebContentsDelegateMac() override {}
|
| +
|
| + void ResizeDueToAutoResize(content::WebContents* source,
|
| + const gfx::Size& preferred_size) override {
|
| + if (!observer_->web_contents())
|
| + return;
|
| + delegate_->ResizeToGivenSize(preferred_size);
|
| + }
|
| +
|
| + private:
|
| + // These members must outlive the instance.
|
| + content::WebContentsObserver* const observer_;
|
| + ConstrainedWebDialogDelegateBase* delegate_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(WebDialogWebContentsDelegateMac);
|
| +};
|
| +
|
| class ConstrainedWebDialogDelegateMac
|
| : public ConstrainedWebDialogDelegateBase {
|
| public:
|
| ConstrainedWebDialogDelegateMac(
|
| content::BrowserContext* browser_context,
|
| - WebDialogDelegate* delegate)
|
| - : ConstrainedWebDialogDelegateBase(browser_context, delegate, NULL) {}
|
| + WebDialogDelegate* delegate,
|
| + content::WebContentsObserver* observer)
|
| + : ConstrainedWebDialogDelegateBase(browser_context, delegate,
|
| + new WebDialogWebContentsDelegateMac(browser_context, observer,
|
| + this)) {}
|
|
|
| // WebDialogWebContentsDelegate interface.
|
| void CloseContents(WebContents* source) override {
|
| window_->CloseWebContentsModalDialog();
|
| }
|
|
|
| + // ConstrainedWebDialogDelegateBase:
|
| + void ResizeToGivenSize(const gfx::Size size) override {
|
| + NSSize updated_preferred_size = NSMakeSize(size.width(),
|
| + size.height());
|
| + [window_->sheet() resizeWithNewSize:updated_preferred_size];
|
| + }
|
| +
|
| void set_window(ConstrainedWindowMac* window) { window_ = window; }
|
| ConstrainedWindowMac* window() const { return window_; }
|
|
|
| @@ -50,13 +96,16 @@ class ConstrainedWebDialogDelegateMac
|
|
|
| class ConstrainedWebDialogDelegateViewMac :
|
| public ConstrainedWindowMacDelegate,
|
| - public ConstrainedWebDialogDelegate {
|
| + public ConstrainedWebDialogDelegate,
|
| + public content::WebContentsObserver {
|
|
|
| public:
|
| ConstrainedWebDialogDelegateViewMac(
|
| content::BrowserContext* browser_context,
|
| WebDialogDelegate* delegate,
|
| - content::WebContents* web_contents);
|
| + content::WebContents* web_contents,
|
| + const gfx::Size& min_size,
|
| + const gfx::Size& max_size);
|
| ~ConstrainedWebDialogDelegateViewMac() override {}
|
|
|
| // ConstrainedWebDialogDelegate interface
|
| @@ -75,16 +124,37 @@ class ConstrainedWebDialogDelegateViewMac :
|
| gfx::NativeWindow GetNativeDialog() override { return window_; }
|
| WebContents* GetWebContents() override { return impl_->GetWebContents(); }
|
| gfx::Size GetMinimumSize() const override {
|
| - NOTIMPLEMENTED();
|
| - return gfx::Size();
|
| + return min_size_;
|
| }
|
| gfx::Size GetMaximumSize() const override {
|
| - NOTIMPLEMENTED();
|
| - return gfx::Size();
|
| + return max_size_;
|
| }
|
| gfx::Size GetPreferredSize() const override {
|
| - NOTIMPLEMENTED();
|
| - return gfx::Size();
|
| + gfx::Size size;
|
| + if (!impl_->closed_via_webui()) {
|
| + NSRect frame = [window_ frame];
|
| + size = gfx::Size(frame.size.width, frame.size.height);
|
| + }
|
| + return size;
|
| + }
|
| +
|
| + // content::WebContentsObserver:
|
| + void RenderViewCreated(content::RenderViewHost* render_view_host) override {
|
| + if (IsDialogAutoResizable())
|
| + EnableAutoResize();
|
| + }
|
| + void RenderViewHostChanged(content::RenderViewHost* old_host,
|
| + content::RenderViewHost* new_host) override {
|
| + if (IsDialogAutoResizable())
|
| + EnableAutoResize();
|
| + }
|
| + void DocumentOnLoadCompletedInMainFrame() override {
|
| + if (!IsDialogAutoResizable())
|
| + return;
|
| +
|
| + EnableAutoResize();
|
| + if (GetWebContents())
|
| + constrained_window_->ShowWebContentsModalDialog();
|
| }
|
|
|
| // ConstrainedWindowMacDelegate interface
|
| @@ -95,25 +165,56 @@ class ConstrainedWebDialogDelegateViewMac :
|
| }
|
|
|
| private:
|
| + void EnableAutoResize() {
|
| + if (!GetWebContents())
|
| + return;
|
| +
|
| + content::RenderViewHost* render_view_host =
|
| + GetWebContents()->GetRenderViewHost();
|
| + render_view_host->EnableAutoResize(min_size_, max_size_);
|
| + }
|
| +
|
| + // Whether or not the dialog is autoresizable is determined based on whether
|
| + // |max_size_| was specified.
|
| + bool IsDialogAutoResizable() {
|
| + return !max_size_.IsEmpty();
|
| + }
|
| +
|
| scoped_ptr<ConstrainedWebDialogDelegateMac> impl_;
|
| scoped_ptr<ConstrainedWindowMac> constrained_window_;
|
| base::scoped_nsobject<NSWindow> window_;
|
|
|
| + // Minimum and maximum sizes to determine dialog bounds for auto-resizing.
|
| + const gfx::Size min_size_;
|
| + const gfx::Size max_size_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViewMac);
|
| };
|
|
|
| ConstrainedWebDialogDelegateViewMac::ConstrainedWebDialogDelegateViewMac(
|
| content::BrowserContext* browser_context,
|
| WebDialogDelegate* delegate,
|
| - content::WebContents* web_contents)
|
| - : impl_(new ConstrainedWebDialogDelegateMac(browser_context, delegate)) {
|
| + content::WebContents* web_contents,
|
| + const gfx::Size& min_size,
|
| + const gfx::Size& max_size)
|
| + : content::WebContentsObserver(web_contents),
|
| + impl_(new ConstrainedWebDialogDelegateMac(browser_context, delegate,
|
| + this)),
|
| + min_size_(min_size),
|
| + max_size_(max_size) {
|
| + if (IsDialogAutoResizable())
|
| + Observe(GetWebContents());
|
| +
|
| // Create a window to hold web_contents in the constrained sheet:
|
| gfx::Size size;
|
| delegate->GetDialogSize(&size);
|
| - NSRect frame = NSMakeRect(0, 0, size.width(), size.height());
|
| + // The window size for autoresizing dialogs will be determined at a later
|
| + // time.
|
| + NSRect frame = IsDialogAutoResizable() ? ui::kWindowSizeDeterminedLater :
|
| + NSMakeRect(0, 0, size.width(), size.height());
|
|
|
| - window_.reset(
|
| - [[ConstrainedWindowCustomWindow alloc] initWithContentRect:frame]);
|
| + window_.reset([[ConstrainedWindowCustomWindow alloc]
|
| + initWithContentRect:frame]);
|
| [GetWebContents()->GetNativeView() setFrame:frame];
|
| [GetWebContents()->GetNativeView() setAutoresizingMask:
|
| NSViewWidthSizable|NSViewHeightSizable];
|
| @@ -122,8 +223,14 @@ ConstrainedWebDialogDelegateViewMac::ConstrainedWebDialogDelegateViewMac(
|
| base::scoped_nsobject<WebDialogConstrainedWindowSheet> sheet(
|
| [[WebDialogConstrainedWindowSheet alloc] initWithCustomWindow:window_
|
| webDialogDelegate:delegate]);
|
| - constrained_window_.reset(new ConstrainedWindowMac(
|
| - this, web_contents, sheet));
|
| +
|
| + if (IsDialogAutoResizable()) {
|
| + constrained_window_ = CreateWebModalDialogMac(
|
| + this, web_contents, sheet);
|
| + } else {
|
| + constrained_window_ = CreateAndShowWebModalDialogMac(
|
| + this, web_contents, sheet);
|
| + }
|
|
|
| impl_->set_window(constrained_window_.get());
|
| }
|
| @@ -135,6 +242,23 @@ ConstrainedWebDialogDelegate* ShowConstrainedWebDialog(
|
| // Deleted when the dialog closes.
|
| ConstrainedWebDialogDelegateViewMac* constrained_delegate =
|
| new ConstrainedWebDialogDelegateViewMac(
|
| - browser_context, delegate, web_contents);
|
| + browser_context, delegate, web_contents,
|
| + gfx::Size(), gfx::Size());
|
| + return constrained_delegate;
|
| +}
|
| +
|
| +ConstrainedWebDialogDelegate* ShowConstrainedWebDialogWithAutoResize(
|
| + content::BrowserContext* browser_context,
|
| + WebDialogDelegate* delegate,
|
| + content::WebContents* web_contents,
|
| + const gfx::Size& min_size,
|
| + const gfx::Size& max_size) {
|
| + DCHECK(!min_size.IsEmpty());
|
| + DCHECK(!max_size.IsEmpty());
|
| + // Deleted when the dialog closes.
|
| + ConstrainedWebDialogDelegateViewMac* constrained_delegate =
|
| + new ConstrainedWebDialogDelegateViewMac(
|
| + browser_context, delegate, web_contents,
|
| + min_size, max_size);
|
| return constrained_delegate;
|
| }
|
|
|