Chromium Code Reviews| Index: Source/core/platform/mac/NSScrollerImpDetails.mm |
| diff --git a/Source/core/platform/mac/NSScrollerImpDetails.mm b/Source/core/platform/mac/NSScrollerImpDetails.mm |
| index a5f09c5d519c0df39a5713c72bc1acc9152a3ce1..36dd0346d8c3a4fb07a41b7687f5b7326311e634 100644 |
| --- a/Source/core/platform/mac/NSScrollerImpDetails.mm |
| +++ b/Source/core/platform/mac/NSScrollerImpDetails.mm |
| @@ -29,28 +29,64 @@ |
| #include "RuntimeEnabledFeatures.h" |
| #include "core/platform/mac/NSScrollerImpDetails.h" |
| +namespace { |
| + |
| +// Declare notification names from the 10.7 SDK. |
| +#if !defined(MAC_OS_X_VERSION_10_7) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 |
| +NSString* NSPreferredScrollerStyleDidChangeNotification = @"NSPreferredScrollerStyleDidChangeNotification"; |
| +#endif |
| + |
| +// Storing the current NSScrollerStyle as a global is appreciably faster than |
| +// having it be a property of ScrollerStylerObserver. |
| +NSScrollerStyle g_scrollerStyle = NSScrollerStyleLegacy; |
| + |
| +} // anonymous namespace |
| + |
| +@interface ScrollerStyleObserver : NSObject |
| +- (id)init; |
| +- (void)preferredScrollerStyleDidChange:(NSNotification*)notification; |
| +@end |
| + |
| +@implementation ScrollerStyleObserver |
| +- (id)init |
| +{ |
| + if ((self = [super init])) { |
| + if ([NSScroller respondsToSelector:@selector(preferredScrollerStyle)]) { |
| + g_scrollerStyle = [NSScroller preferredScrollerStyle]; |
| + NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; |
| + [center addObserver:self |
| + selector:@selector(preferredScrollerStyleDidChange:) |
| + name:NSPreferredScrollerStyleDidChangeNotification |
| + object:nil]; |
| + } |
| + } |
| + return self; |
| +} |
| + |
| +- (void)preferredScrollerStyleDidChange:(NSNotification*)notification |
| +{ |
| + g_scrollerStyle = [NSScroller preferredScrollerStyle]; |
| +} |
| +@end |
| + |
| namespace WebCore { |
| bool isScrollbarOverlayAPIAvailable() |
| { |
| - static bool apiAvailable; |
| - static bool shouldInitialize = true; |
| - if (shouldInitialize) { |
| - shouldInitialize = false; |
| - Class scrollerImpClass = NSClassFromString(@"NSScrollerImp"); |
| - Class scrollerImpPairClass = NSClassFromString(@"NSScrollerImpPair"); |
| - apiAvailable = [scrollerImpClass respondsToSelector:@selector(scrollerImpWithStyle:controlSize:horizontal:replacingScrollerImp:)] |
| - && [scrollerImpPairClass instancesRespondToSelector:@selector(scrollerStyle)]; |
| - } |
| + static bool apiAvailable = |
| + [NSClassFromString(@"NSScrollerImp") respondsToSelector:@selector(scrollerImpWithStyle:controlSize:horizontal:replacingScrollerImp:)] |
| + && [NSClassFromString(@"NSScrollerImpPair") instancesRespondToSelector:@selector(scrollerStyle)]; |
| return apiAvailable; |
| } |
| -NSScrollerStyle recommendedScrollerStyle() { |
| +NSScrollerStyle recommendedScrollerStyle() |
| +{ |
| if (RuntimeEnabledFeatures::overlayScrollbarsEnabled()) |
| return NSScrollerStyleOverlay; |
| - if ([NSScroller respondsToSelector:@selector(preferredScrollerStyle)]) |
| - return [NSScroller preferredScrollerStyle]; |
| - return NSScrollerStyleLegacy; |
| + |
| + // The ScrollerStyleObserver will update g_scrollerStyle at init and when needed. |
|
Nico
2013/10/15 22:20:44
(might want to add a "this function is hot" commen
|
| + static ScrollerStyleObserver* scrollerStyleObserver = [[ScrollerStyleObserver alloc] init]; |
| + return g_scrollerStyle; |
| } |
| } |