mac: [Yosemite] Fix bug where zoom button causes fullscreen mode. (reland)
----------------Reland Description---------------------------
Fix a type error. NSArray comparators return a NSComparisonResult.
----------------Original CL Description---------------------------
In Yosemite, holding down alt while clicking the fullscreen button is supposed
to zoom the window. This doesn't work because Chrome violates unstated AppKit
assumptions.
The problem seems to lie in hit testing the location of the zoom button.
Reordering the subviews by moving the tab strip and the content view behind the
zoom button fixes the problem.
BUG=393808
Review URL: https://codereview.chromium.org/409723004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@284798 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/ui/cocoa/version_independent_window.mm b/chrome/browser/ui/cocoa/version_independent_window.mm
index 98dacb3..de0ca9a 100644
--- a/chrome/browser/ui/cocoa/version_independent_window.mm
+++ b/chrome/browser/ui/cocoa/version_independent_window.mm
@@ -6,6 +6,35 @@
#include "base/logging.h"
#include "base/mac/mac_util.h"
+#include "base/mac/scoped_nsobject.h"
+
+// This view always takes the size of its superview. It is intended to be used
+// as a NSWindow's contentView. It is needed because NSWindow's implementation
+// explicitly resizes the contentView at inopportune times.
+@interface FullSizeContentView : NSView
+@end
+
+namespace {
+
+// Reorders the subviews of NSWindow's root view so that the contentView is
+// moved to the back, and the ordering of the other views is unchanged.
+// |context| should be an NSArray containing the subviews of the root view as
+// they were previously ordered.
+NSComparisonResult ReorderContentViewToBack(id firstView,
+ id secondView,
+ void* context) {
+ NSView* contentView = [[firstView window] contentView];
+ NSArray* subviews = static_cast<NSArray*>(context);
+ if (firstView == contentView)
+ return NSOrderedAscending;
+ if (secondView == contentView)
+ return NSOrderedDescending;
+ NSUInteger index1 = [subviews indexOfObject:firstView];
+ NSUInteger index2 = [subviews indexOfObject:secondView];
+ return (index1 < index2) ? NSOrderedAscending : NSOrderedDescending;
+}
+
+} // namespace
@interface VersionIndependentWindow ()
@@ -15,12 +44,6 @@
@end
-// This view always takes the size of its superview. It is intended to be used
-// as a NSWindow's contentView. It is needed because NSWindow's implementation
-// explicitly resizes the contentView at inopportune times.
-@interface FullSizeContentView : NSView
-@end
-
@implementation FullSizeContentView
// This method is directly called by NSWindow during a window resize on OSX
@@ -75,6 +98,18 @@
setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
[self setContentView:chromeWindowView_];
[chromeWindowView_ setFrame:[[[self contentView] superview] bounds]];
+
+ // Move the content view to the back.
+ // In Yosemite, the content view takes up the full size of the window,
+ // and when it is in front of the zoom/fullscreen button, alt-clicking
+ // the button has the wrong effect.
+ // Adding subviews to the NSThemeFrame provokes a warning in Yosemite, so
+ // we sort the subviews in place.
+ // http://crbug.com/393808
+ NSView* superview = [[self contentView] superview];
+ base::scoped_nsobject<NSArray> subviews([[superview subviews] copy]);
+ [superview sortSubviewsUsingFunction:&ReorderContentViewToBack
+ context:subviews.get()];
}
}
return self;