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

Unified Diff: ui/views/cocoa/bridged_native_widget.mm

Issue 1059853007: Mac/Linux: Ensure window size constraints propagate to the window server during Init (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Cracked the case on Windows Created 5 years, 8 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
« no previous file with comments | « ui/views/cocoa/bridged_native_widget.h ('k') | ui/views/test/widget_test.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/cocoa/bridged_native_widget.mm
diff --git a/ui/views/cocoa/bridged_native_widget.mm b/ui/views/cocoa/bridged_native_widget.mm
index efe1785b4812e8463364e7f1742bafe0eb6fae60..24275787c04e43ac1ab87b032e13ff5f4665461c 100644
--- a/ui/views/cocoa/bridged_native_widget.mm
+++ b/ui/views/cocoa/bridged_native_widget.mm
@@ -64,10 +64,31 @@ bool PositionWindowInScreenCoordinates(views::Widget* widget,
return widget && widget->is_top_level();
}
+// Return the content size for a minimum or maximum widget size.
+gfx::Size GetClientSizeForWindowSize(NSWindow* window,
+ const gfx::Size& window_size) {
+ NSRect frame_rect =
+ NSMakeRect(0, 0, window_size.width(), window_size.height());
+ // Note gfx::Size will prevent dimensions going negative. They are allowed to
+ // be zero at this point, because Widget::GetMinimumSize() may later increase
+ // the size.
+ return gfx::Size([window contentRectForFrameRect:frame_rect].size);
+}
+
} // namespace
namespace views {
+// static
+gfx::Size BridgedNativeWidget::GetWindowSizeForClientSize(
+ NSWindow* window,
+ const gfx::Size& content_size) {
+ NSRect content_rect =
+ NSMakeRect(0, 0, content_size.width(), content_size.height());
+ NSRect frame_rect = [window frameRectForContentRect:content_rect];
+ return gfx::Size(NSWidth(frame_rect), NSHeight(frame_rect));
+}
+
BridgedNativeWidget::BridgedNativeWidget(NativeWidgetMac* parent)
: native_widget_mac_(parent),
focus_manager_(nullptr),
@@ -187,22 +208,31 @@ void BridgedNativeWidget::SetFocusManager(FocusManager* focus_manager) {
}
void BridgedNativeWidget::SetBounds(const gfx::Rect& new_bounds) {
+ Widget* widget = native_widget_mac_->GetWidget();
+ // -[NSWindow contentMinSize] is only checked by Cocoa for user-initiated
+ // resizes. This is not what toolkit-views expects, so clamp. Note there is
+ // no check for maximum size (consistent with aura::Window::SetBounds()).
+ gfx::Size clamped_content_size =
+ GetClientSizeForWindowSize(window_, new_bounds.size());
+ clamped_content_size.SetToMax(widget->GetMinimumSize());
+
// A contentRect with zero width or height is a banned practice in ChromeMac,
// due to unpredictable OSX treatment.
- DCHECK(!new_bounds.IsEmpty()) << "Zero-sized windows not supported on Mac";
-
- if (native_widget_mac_->GetWidget()->IsModal()) {
- // Modal dialogs are positioned by Cocoa. Just update the size.
- [window_
- setContentSize:NSMakeSize(new_bounds.width(), new_bounds.height())];
+ DCHECK(!clamped_content_size.IsEmpty())
+ << "Zero-sized windows not supported on Mac";
+
+ if (!window_visible_ && widget->IsModal()) {
+ // Window-Modal dialogs (i.e. sheets) are positioned by Cocoa when shown for
+ // the first time. They also have no frame, so just update the content size.
+ [window_ setContentSize:NSMakeSize(clamped_content_size.width(),
+ clamped_content_size.height())];
return;
}
+ gfx::Rect actual_new_bounds(
+ new_bounds.origin(),
+ GetWindowSizeForClientSize(window_, clamped_content_size));
- gfx::Rect actual_new_bounds(new_bounds);
-
- if (parent_ &&
- !PositionWindowInScreenCoordinates(native_widget_mac_->GetWidget(),
- widget_type_))
+ if (parent_ && !PositionWindowInScreenCoordinates(widget, widget_type_))
actual_new_bounds.Offset(parent_->GetRestoredBounds().OffsetFromOrigin());
[window_ setFrame:gfx::ScreenRectToNSRect(actual_new_bounds)
« no previous file with comments | « ui/views/cocoa/bridged_native_widget.h ('k') | ui/views/test/widget_test.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698