1/* 2 * Copyright (C) 2011 Apple Inc. All Rights Reserved. 3 * Copyright (C) 2011 Google Inc. All Rights Reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27 28#include "config.h" 29#include "RuntimeEnabledFeatures.h" 30#include "platform/mac/NSScrollerImpDetails.h" 31 32namespace { 33 34// Declare notification names from the 10.7 SDK. 35#if !defined(MAC_OS_X_VERSION_10_7) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 36NSString* NSPreferredScrollerStyleDidChangeNotification = @"NSPreferredScrollerStyleDidChangeNotification"; 37#endif 38 39// Storing the current NSScrollerStyle as a global is appreciably faster than 40// having it be a property of ScrollerStylerObserver. 41NSScrollerStyle g_scrollerStyle = NSScrollerStyleLegacy; 42 43} // anonymous namespace 44 45@interface ScrollerStyleObserver : NSObject 46- (id)init; 47- (void)preferredScrollerStyleDidChange:(NSNotification*)notification; 48@end 49 50@implementation ScrollerStyleObserver 51- (id)init 52{ 53 if ((self = [super init])) { 54 if ([NSScroller respondsToSelector:@selector(preferredScrollerStyle)]) { 55 g_scrollerStyle = [NSScroller preferredScrollerStyle]; 56 NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; 57 [center addObserver:self 58 selector:@selector(preferredScrollerStyleDidChange:) 59 name:NSPreferredScrollerStyleDidChangeNotification 60 object:nil]; 61 } 62 } 63 return self; 64} 65 66- (void)preferredScrollerStyleDidChange:(NSNotification*)notification 67{ 68 g_scrollerStyle = [NSScroller preferredScrollerStyle]; 69} 70@end 71 72namespace WebCore { 73 74bool isScrollbarOverlayAPIAvailable() 75{ 76 static bool apiAvailable = 77 [NSClassFromString(@"NSScrollerImp") respondsToSelector:@selector(scrollerImpWithStyle:controlSize:horizontal:replacingScrollerImp:)] 78 && [NSClassFromString(@"NSScrollerImpPair") instancesRespondToSelector:@selector(scrollerStyle)]; 79 return apiAvailable; 80} 81 82NSScrollerStyle recommendedScrollerStyle() 83{ 84 if (RuntimeEnabledFeatures::overlayScrollbarsEnabled()) 85 return NSScrollerStyleOverlay; 86 87 // The ScrollerStyleObserver will update g_scrollerStyle at init and when needed. 88 // This function is hot. 89 // http://crbug.com/303205 90 static ScrollerStyleObserver* scrollerStyleObserver = [[ScrollerStyleObserver alloc] init]; 91 (void)scrollerStyleObserver; 92 return g_scrollerStyle; 93} 94 95} 96