OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/custom_frame_view.h" | 5 #import "chrome/browser/ui/cocoa/custom_frame_view.h" |
6 | 6 |
7 #import <Carbon/Carbon.h> | 7 #import <Carbon/Carbon.h> |
8 #include <crt_externs.h> | 8 #include <crt_externs.h> |
9 #import <objc/runtime.h> | 9 #import <objc/runtime.h> |
10 #include <string.h> | 10 #include <string.h> |
11 | 11 |
12 #include "base/logging.h" | 12 #include "base/logging.h" |
13 #include "base/mac/mac_util.h" | 13 #include "base/mac/mac_util.h" |
14 #include "base/mac/scoped_nsautorelease_pool.h" | 14 #include "base/mac/scoped_nsautorelease_pool.h" |
15 | 15 |
16 @interface NSView (Swizzles) | 16 @interface NSView (Swizzles) |
17 - (NSPoint)_fullScreenButtonOriginOriginal; | 17 - (NSPoint)_fullScreenButtonOriginOriginal; |
18 @end | 18 @end |
19 | 19 |
20 @interface NSWindow (FramedBrowserWindow) | 20 @interface NSWindow (FramedBrowserWindow) |
21 - (NSPoint)fullScreenButtonOriginAdjustment; | 21 - (NSPoint)fullScreenButtonOriginAdjustment; |
22 @end | 22 @end |
23 | 23 |
24 @interface CustomFrameView : NSView | 24 @interface CustomFrameView : NSView |
25 | 25 |
| 26 // Clang emits a warning if designated initializers don't call the super |
| 27 // initializer, even if the method raises an exception. |
| 28 // http://www.crbug.com/479019. |
| 29 - (id)initWithFrame:(NSRect)frame UNAVAILABLE_ATTRIBUTE; |
| 30 - (id)initWithCoder:(NSCoder*)coder UNAVAILABLE_ATTRIBUTE; |
| 31 |
26 @end | 32 @end |
27 | 33 |
28 @implementation CustomFrameView | 34 @implementation CustomFrameView |
29 | 35 |
30 + (void)load { | 36 + (void)load { |
31 // Swizzling should only happen in the browser process. Interacting with | 37 // Swizzling should only happen in the browser process. Interacting with |
32 // AppKit will run +[borderViewClass initialize] in the renderer, which | 38 // AppKit will run +[borderViewClass initialize] in the renderer, which |
33 // may establish Mach IPC with com.apple.windowserver. | 39 // may establish Mach IPC with com.apple.windowserver. |
34 // Note that CommandLine has not been initialized yet, since this is running | 40 // Note that CommandLine has not been initialized yet, since this is running |
35 // as a module initializer. | 41 // as a module initializer. |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 @selector(_fullScreenButtonOrigin)); | 76 @selector(_fullScreenButtonOrigin)); |
71 Method m2 = class_getInstanceMethod( | 77 Method m2 = class_getInstanceMethod( |
72 borderViewClass, @selector(_fullScreenButtonOriginOriginal)); | 78 borderViewClass, @selector(_fullScreenButtonOriginOriginal)); |
73 if (m1 && m2) { | 79 if (m1 && m2) { |
74 method_exchangeImplementations(m1, m2); | 80 method_exchangeImplementations(m1, m2); |
75 } | 81 } |
76 } | 82 } |
77 } | 83 } |
78 } | 84 } |
79 | 85 |
80 // TODO(erikchen): Clang throws a warning if a designated initializer doesn't | |
81 // call the super initializer, even if the method raises an exception. These | |
82 // pragmas shouldn't be necessary. | |
83 // http://www.crbug.com/479019. | |
84 #pragma clang diagnostic push | |
85 #pragma clang diagnostic ignored "-Wobjc-designated-initializers" | |
86 - (id)initWithFrame:(NSRect)frame { | 86 - (id)initWithFrame:(NSRect)frame { |
87 // This class is not for instantiating. | 87 // This class is not for instantiating. |
88 [self doesNotRecognizeSelector:_cmd]; | 88 [self doesNotRecognizeSelector:_cmd]; |
89 return nil; | 89 return nil; |
90 } | 90 } |
91 | 91 |
92 - (id)initWithCoder:(NSCoder*)coder { | 92 - (id)initWithCoder:(NSCoder*)coder { |
93 // This class is not for instantiating. | 93 // This class is not for instantiating. |
94 [self doesNotRecognizeSelector:_cmd]; | 94 [self doesNotRecognizeSelector:_cmd]; |
95 return nil; | 95 return nil; |
96 } | 96 } |
97 #pragma clang diagnostic pop | |
98 | 97 |
99 // Override to move the fullscreen button to the left of the profile avatar. | 98 // Override to move the fullscreen button to the left of the profile avatar. |
100 - (NSPoint)_fullScreenButtonOrigin { | 99 - (NSPoint)_fullScreenButtonOrigin { |
101 NSWindow* window = [self window]; | 100 NSWindow* window = [self window]; |
102 NSPoint offset = NSZeroPoint; | 101 NSPoint offset = NSZeroPoint; |
103 | 102 |
104 if ([window respondsToSelector:@selector(fullScreenButtonOriginAdjustment)]) | 103 if ([window respondsToSelector:@selector(fullScreenButtonOriginAdjustment)]) |
105 offset = [window fullScreenButtonOriginAdjustment]; | 104 offset = [window fullScreenButtonOriginAdjustment]; |
106 | 105 |
107 NSPoint origin = [self _fullScreenButtonOriginOriginal]; | 106 NSPoint origin = [self _fullScreenButtonOriginOriginal]; |
108 origin.x += offset.x; | 107 origin.x += offset.x; |
109 origin.y += offset.y; | 108 origin.y += offset.y; |
110 return origin; | 109 return origin; |
111 } | 110 } |
112 | 111 |
113 @end | 112 @end |
OLD | NEW |