OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "chrome/browser/ui/cocoa/version_independent_window.h" | 5 #import "chrome/browser/ui/cocoa/version_independent_window.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/mac/mac_util.h" | 9 #include "base/mac/mac_util.h" |
10 #include "chrome/common/chrome_switches.h" | 10 #include "chrome/common/chrome_switches.h" |
11 | 11 |
12 @interface VersionIndependentWindow () | 12 @interface VersionIndependentWindow () |
13 | 13 |
14 + (BOOL)shouldUseFullSizeContentViewForStyle:(NSUInteger)windowStyle; | 14 + (BOOL)shouldUseFullSizeContentViewForStyle:(NSUInteger)windowStyle; |
15 | 15 |
16 - (NSView*)chromeWindowView; | 16 - (NSView*)chromeWindowView; |
17 | 17 |
18 @end | 18 @end |
19 | 19 |
20 // This view always takes the size of its superview. It is intended to be used | 20 // This view always takes the size of its superview. It is intended to be used |
21 // as a NSWindow's contentView. It is needed because NSWindow's implementation | 21 // as a NSWindow's contentView. It is needed because NSWindow's implementation |
22 // explicitly resizes the contentView at inopportune times. | 22 // explicitly resizes the contentView at inopportune times. |
23 @interface FullSizeContentView : NSView | 23 @interface FullSizeContentView : NSView |
24 @end | 24 @end |
25 | 25 |
26 @implementation FullSizeContentView | 26 @implementation FullSizeContentView |
27 | 27 |
28 // This method is directly called by NSWindow during a window resize on OSX | 28 // This method is directly called by AppKit during a live window resize. |
29 // 10.10.0, beta 2. We must override it to prevent the content view from | 29 // Override it to prevent the content view from shrinking. |
30 // shrinking. | |
31 - (void)setFrameSize:(NSSize)size { | 30 - (void)setFrameSize:(NSSize)size { |
32 if ([self superview]) | 31 if ([self superview]) |
33 size = [[self superview] bounds].size; | 32 size = [[self superview] bounds].size; |
34 [super setFrameSize:size]; | 33 [super setFrameSize:size]; |
35 } | 34 } |
36 | 35 |
37 // The contentView gets moved around during certain full-screen operations. | |
38 // This is less than ideal, and should eventually be removed. | |
39 - (void)viewDidMoveToSuperview { | |
40 [self setFrame:[[self superview] bounds]]; | |
41 } | |
42 | |
43 @end | 36 @end |
44 | 37 |
45 @implementation NSWindow (VersionIndependentWindow) | 38 @implementation NSWindow (VersionIndependentWindow) |
46 | 39 |
47 - (NSView*)cr_windowView { | 40 - (NSView*)cr_windowView { |
48 if ([self isKindOfClass:[VersionIndependentWindow class]]) { | 41 if ([self isKindOfClass:[VersionIndependentWindow class]]) { |
49 VersionIndependentWindow* window = | 42 VersionIndependentWindow* window = |
50 static_cast<VersionIndependentWindow*>(self); | 43 static_cast<VersionIndependentWindow*>(self); |
51 NSView* chromeWindowView = [window chromeWindowView]; | 44 NSView* chromeWindowView = [window chromeWindowView]; |
52 if (chromeWindowView) | 45 if (chromeWindowView) |
(...skipping 11 matching lines...) Expand all Loading... |
64 | 57 |
65 - (instancetype)init { | 58 - (instancetype)init { |
66 NOTREACHED(); | 59 NOTREACHED(); |
67 return nil; | 60 return nil; |
68 } | 61 } |
69 | 62 |
70 - (instancetype)initWithContentRect:(NSRect)contentRect | 63 - (instancetype)initWithContentRect:(NSRect)contentRect |
71 styleMask:(NSUInteger)windowStyle | 64 styleMask:(NSUInteger)windowStyle |
72 backing:(NSBackingStoreType)bufferingType | 65 backing:(NSBackingStoreType)bufferingType |
73 defer:(BOOL)deferCreation { | 66 defer:(BOOL)deferCreation { |
| 67 return [self initWithContentRect:contentRect |
| 68 styleMask:windowStyle |
| 69 backing:bufferingType |
| 70 defer:deferCreation |
| 71 wantsViewsOverTitlebar:NO]; |
| 72 } |
| 73 |
| 74 - (instancetype)initWithContentRect:(NSRect)contentRect |
| 75 styleMask:(NSUInteger)windowStyle |
| 76 backing:(NSBackingStoreType)bufferingType |
| 77 defer:(BOOL)deferCreation |
| 78 wantsViewsOverTitlebar:(BOOL)wantsViewsOverTitlebar { |
74 self = [super initWithContentRect:contentRect | 79 self = [super initWithContentRect:contentRect |
75 styleMask:windowStyle | 80 styleMask:windowStyle |
76 backing:bufferingType | 81 backing:bufferingType |
77 defer:deferCreation]; | 82 defer:deferCreation]; |
78 if (self) { | 83 if (self) { |
79 if ([VersionIndependentWindow | 84 if (wantsViewsOverTitlebar && |
80 shouldUseFullSizeContentViewForStyle:windowStyle]) { | 85 [VersionIndependentWindow |
| 86 shouldUseFullSizeContentViewForStyle:windowStyle]) { |
81 chromeWindowView_.reset([[FullSizeContentView alloc] init]); | 87 chromeWindowView_.reset([[FullSizeContentView alloc] init]); |
82 [chromeWindowView_ | 88 [chromeWindowView_ |
83 setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; | 89 setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; |
84 [chromeWindowView_ setFrame:[[[self contentView] superview] bounds]]; | |
85 [self setContentView:chromeWindowView_]; | 90 [self setContentView:chromeWindowView_]; |
| 91 [chromeWindowView_ setFrame:[[chromeWindowView_ superview] bounds]]; |
86 } | 92 } |
87 } | 93 } |
88 return self; | 94 return self; |
89 } | 95 } |
90 | 96 |
91 #pragma mark - Private Methods | 97 #pragma mark - Private Methods |
92 | 98 |
93 + (BOOL)shouldUseFullSizeContentViewForStyle:(NSUInteger)windowStyle { | 99 + (BOOL)shouldUseFullSizeContentViewForStyle:(NSUInteger)windowStyle { |
94 // TODO(erikchen): Once OSX Yosemite is released, consider removing this | 100 return windowStyle & NSTitledWindowMask; |
95 // class entirely. | |
96 // http://crbug.com/398574 | |
97 if (!CommandLine::ForCurrentProcess()->HasSwitch( | |
98 switches::kEnableFullSizeContentView)) | |
99 return NO; | |
100 return (windowStyle & NSTitledWindowMask) && base::mac::IsOSYosemiteOrLater(); | |
101 } | 101 } |
102 | 102 |
103 - (NSView*)chromeWindowView { | 103 - (NSView*)chromeWindowView { |
104 return chromeWindowView_; | 104 return chromeWindowView_; |
105 } | 105 } |
106 | 106 |
107 #pragma mark - NSWindow Overrides | 107 #pragma mark - NSWindow Overrides |
108 | 108 |
109 #ifndef NDEBUG | |
110 | |
111 - (void)setContentSize:(NSSize)size { | |
112 DCHECK(!chromeWindowView_); | |
113 [super setContentSize:size]; | |
114 } | |
115 | |
116 - (void)setContentMinSize:(NSSize)size { | |
117 DCHECK(!chromeWindowView_); | |
118 [super setContentMinSize:size]; | |
119 } | |
120 | |
121 - (void)setContentMaxSize:(NSSize)size { | |
122 DCHECK(!chromeWindowView_); | |
123 [super setContentMaxSize:size]; | |
124 } | |
125 | |
126 - (void)setContentAspectRatio:(NSSize)ratio { | |
127 DCHECK(!chromeWindowView_); | |
128 [super setContentAspectRatio:ratio]; | |
129 } | |
130 | |
131 #endif // NDEBUG | |
132 | |
133 + (NSRect)frameRectForContentRect:(NSRect)cRect styleMask:(NSUInteger)aStyle { | 109 + (NSRect)frameRectForContentRect:(NSRect)cRect styleMask:(NSUInteger)aStyle { |
134 if ([self shouldUseFullSizeContentViewForStyle:aStyle]) | 110 if ([self shouldUseFullSizeContentViewForStyle:aStyle]) |
135 return cRect; | 111 return cRect; |
136 return [super frameRectForContentRect:cRect styleMask:aStyle]; | 112 return [super frameRectForContentRect:cRect styleMask:aStyle]; |
137 } | 113 } |
138 | 114 |
139 - (NSRect)frameRectForContentRect:(NSRect)contentRect { | 115 - (NSRect)frameRectForContentRect:(NSRect)contentRect { |
140 if (chromeWindowView_) | 116 if (chromeWindowView_) |
141 return contentRect; | 117 return contentRect; |
142 return [super frameRectForContentRect:contentRect]; | 118 return [super frameRectForContentRect:contentRect]; |
143 } | 119 } |
144 | 120 |
145 + (NSRect)contentRectForFrameRect:(NSRect)fRect styleMask:(NSUInteger)aStyle { | 121 + (NSRect)contentRectForFrameRect:(NSRect)fRect styleMask:(NSUInteger)aStyle { |
146 if ([self shouldUseFullSizeContentViewForStyle:aStyle]) | 122 if ([self shouldUseFullSizeContentViewForStyle:aStyle]) |
147 return fRect; | 123 return fRect; |
148 return [super contentRectForFrameRect:fRect styleMask:aStyle]; | 124 return [super contentRectForFrameRect:fRect styleMask:aStyle]; |
149 } | 125 } |
150 | 126 |
151 - (NSRect)contentRectForFrameRect:(NSRect)frameRect { | 127 - (NSRect)contentRectForFrameRect:(NSRect)frameRect { |
152 if (chromeWindowView_) | 128 if (chromeWindowView_) |
153 return frameRect; | 129 return frameRect; |
154 return [super contentRectForFrameRect:frameRect]; | 130 return [super contentRectForFrameRect:frameRect]; |
155 } | 131 } |
156 | 132 |
157 @end | 133 @end |
OLD | NEW |