Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(372)

Unified Diff: chrome/browser/ui/cocoa/constrained_web_dialog_delegate_mac.mm

Issue 1446623003: [Reland] Enable AutoResize for Constrained Web Dialogs for Mac. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..5dc49ab2cd9379615439830a019f6f79fdba9a53 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,53 @@ 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_;
+ std::unique_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());
- window_.reset(
- [[ConstrainedWindowCustomWindow alloc] initWithContentRect:frame]);
+ window_.reset([[ConstrainedWindowCustomWindow alloc]
+ initWithContentRect:ui::kWindowSizeDeterminedLater]);
[GetWebContents()->GetNativeView() setFrame:frame];
[GetWebContents()->GetNativeView() setAutoresizingMask:
NSViewWidthSizable|NSViewHeightSizable];
@@ -122,8 +220,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 +239,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;
}

Powered by Google App Engine
This is Rietveld 408576698