Back out e9a46afd9375 (bug 1279017) for 10.10 reftest-e10s failures in async scrolling tests

CLOSED TREE
This commit is contained in:
Phil Ringnalda 2016-06-08 20:34:36 -07:00
parent 6ec321d0df
commit 2f02d62e38
10 changed files with 317 additions and 35 deletions

View File

@ -104,6 +104,65 @@ class APZCTreeManager;
@end
#if !defined(MAC_OS_X_VERSION_10_6) || \
MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6
@interface NSEvent (SnowLeopardEventFeatures)
+ (NSUInteger)pressedMouseButtons;
+ (NSUInteger)modifierFlags;
@end
#endif
// The following section, required to support fluid swipe tracking on OS X 10.7
// and up, contains defines/declarations that are only available on 10.7 and up.
// [NSEvent trackSwipeEventWithOptions:...] also requires that the compiler
// support "blocks"
// (http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html)
// -- which it does on 10.6 and up (using the 10.6 SDK or higher).
//
// MAC_OS_X_VERSION_MAX_ALLOWED "controls which OS functionality, if used,
// will result in a compiler error because that functionality is not
// available" (quoting from AvailabilityMacros.h). The compiler initializes
// it to the version of the SDK being used. Its value does *not* prevent the
// binary from running on higher OS versions. MAC_OS_X_VERSION_10_7 and
// friends are defined (in AvailabilityMacros.h) as decimal numbers (not
// hexadecimal numbers).
#if !defined(MAC_OS_X_VERSION_10_7) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7
enum {
NSFullScreenWindowMask = 1 << 14
};
@interface NSWindow (LionWindowFeatures)
- (NSRect)convertRectToScreen:(NSRect)aRect;
@end
#ifdef __LP64__
enum {
NSEventSwipeTrackingLockDirection = 0x1 << 0,
NSEventSwipeTrackingClampGestureAmount = 0x1 << 1
};
typedef NSUInteger NSEventSwipeTrackingOptions;
enum {
NSEventGestureAxisNone = 0,
NSEventGestureAxisHorizontal,
NSEventGestureAxisVertical
};
typedef NSInteger NSEventGestureAxis;
@interface NSEvent (FluidSwipeTracking)
+ (BOOL)isSwipeTrackingFromScrollEventsEnabled;
- (BOOL)hasPreciseScrollingDeltas;
- (CGFloat)scrollingDeltaX;
- (CGFloat)scrollingDeltaY;
- (NSEventPhase)phase;
- (void)trackSwipeEventWithOptions:(NSEventSwipeTrackingOptions)options
dampenAmountThresholdMin:(CGFloat)minDampenThreshold
max:(CGFloat)maxDampenThreshold
usingHandler:(void (^)(CGFloat gestureAmount, NSEventPhase phase, BOOL isComplete, BOOL *stop))trackingHandler;
@end
#endif // #ifdef __LP64__
#endif // #if !defined(MAC_OS_X_VERSION_10_7) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7
@interface ChildView : NSView<
#ifdef ACCESSIBILITY
mozAccessible,
@ -252,6 +311,9 @@ class APZCTreeManager;
- (void)scrollWheel:(NSEvent *)anEvent;
- (void)handleAsyncScrollEvent:(CGEventRef)cgEvent ofType:(CGEventType)type;
// Helper function for Lion smart magnify events
+ (BOOL)isLionSmartMagnifyEvent:(NSEvent*)anEvent;
- (void)setUsingOMTCompositor:(BOOL)aUseOMTC;
- (NSEvent*)lastKeyDownEvent;

View File

@ -487,11 +487,13 @@ nsresult nsChildView::Create(nsIWidget* aParent,
nsToolkit::SwizzleMethods([NSView class], @selector(mouseDownCanMoveWindow),
@selector(nsChildView_NSView_mouseDownCanMoveWindow));
#ifdef __LP64__
nsToolkit::SwizzleMethods([NSEvent class], @selector(addLocalMonitorForEventsMatchingMask:handler:),
@selector(nsChildView_NSEvent_addLocalMonitorForEventsMatchingMask:handler:),
true);
nsToolkit::SwizzleMethods([NSEvent class], @selector(removeMonitor:),
@selector(nsChildView_NSEvent_removeMonitor:), true);
if (nsCocoaFeatures::OnLionOrLater()) {
nsToolkit::SwizzleMethods([NSEvent class], @selector(addLocalMonitorForEventsMatchingMask:handler:),
@selector(nsChildView_NSEvent_addLocalMonitorForEventsMatchingMask:handler:),
true);
nsToolkit::SwizzleMethods([NSEvent class], @selector(removeMonitor:),
@selector(nsChildView_NSEvent_removeMonitor:), true);
}
#endif
gChildViewMethodsSwizzled = true;
}
@ -4336,6 +4338,15 @@ NSEvent* gLastDragMouseDownEvent = nil;
if (!anEvent || !mGeckoChild)
return;
/*
* In OS X 10.7.* (Lion), smart zoom events come through magnifyWithEvent,
* instead of smartMagnifyWithEvent. See bug 863841.
*/
if ([ChildView isLionSmartMagnifyEvent: anEvent]) {
[self smartMagnifyWithEvent: anEvent];
return;
}
nsAutoRetainCocoaObject kungFuDeathGrip(self);
float deltaZ = [anEvent deltaZ];
@ -4500,8 +4511,28 @@ NSEvent* gLastDragMouseDownEvent = nil;
NS_OBJC_END_TRY_ABORT_BLOCK;
}
+ (BOOL)isLionSmartMagnifyEvent:(NSEvent*)anEvent
{
/*
* On Lion, smart zoom events have type NSEventTypeGesture, subtype 0x16,
* whereas pinch zoom events have type NSEventTypeMagnify. So, use that to
* discriminate between the two. Smart zoom gestures do not call
* beginGestureWithEvent or endGestureWithEvent, so mGestureState is not
* changed. Documentation couldn't be found for the meaning of the subtype
* 0x16, but it will probably never change. See bug 863841.
*/
return nsCocoaFeatures::OnLionOrLater() &&
!nsCocoaFeatures::OnMountainLionOrLater() &&
[anEvent type] == NSEventTypeGesture &&
[anEvent subtype] == 0x16;
}
- (bool)shouldConsiderStartingSwipeFromEvent:(NSEvent*)anEvent
{
if (!nsCocoaFeatures::OnLionOrLater()) {
return false;
}
// This method checks whether the AppleEnableSwipeNavigateWithScrolls global
// preference is set. If it isn't, fluid swipe tracking is disabled, and a
// horizontal two-finger gesture is always a scroll (even in Safari). This

View File

@ -13,6 +13,7 @@
#define MAC_OS_X_VERSION_MASK 0x0000FFFF
#define MAC_OS_X_VERSION_10_0_HEX 0x00001000
#define MAC_OS_X_VERSION_10_6_HEX 0x00001060
#define MAC_OS_X_VERSION_10_7_HEX 0x00001070
#define MAC_OS_X_VERSION_10_8_HEX 0x00001080
#define MAC_OS_X_VERSION_10_9_HEX 0x00001090
@ -82,12 +83,12 @@ int32_t nsCocoaFeatures::GetVersion(int32_t aMajor, int32_t aMinor, int32_t aBug
int32_t osxVersion;
if (aMajor < 10) {
aMajor = 10;
NS_ERROR("Couldn't determine OS X version, assuming 10.7");
osxVersion = MAC_OS_X_VERSION_10_7_HEX;
} else if (aMinor < 7) {
aMinor = 7;
NS_ERROR("OS X version too old, assuming 10.7");
osxVersion = MAC_OS_X_VERSION_10_7_HEX;
NS_ERROR("Couldn't determine OS X version, assuming 10.6");
osxVersion = MAC_OS_X_VERSION_10_6_HEX;
} else if (aMinor < 6) {
aMinor = 6;
NS_ERROR("OS X version too old, assuming 10.6");
osxVersion = MAC_OS_X_VERSION_10_6_HEX;
} else {
MOZ_ASSERT(aMajor == 10); // For now, even though we're ready...
MOZ_ASSERT(aMinor < 16);

View File

@ -25,11 +25,24 @@
- (CGFloat)backingScaleFactor;
@end
// When building with a pre-10.7 SDK, NSEventPhase is not defined.
#if !defined(MAC_OS_X_VERSION_10_7) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7
enum {
NSEventPhaseNone = 0,
NSEventPhaseBegan = 0x1 << 0,
NSEventPhaseStationary = 0x1 << 1,
NSEventPhaseChanged = 0x1 << 2,
NSEventPhaseEnded = 0x1 << 3,
NSEventPhaseCancelled = 0x1 << 4,
};
typedef NSUInteger NSEventPhase;
#endif // #if !defined(MAC_OS_X_VERSION_10_7) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7
#if !defined(MAC_OS_X_VERSION_10_8) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_8
enum {
NSEventPhaseMayBegin = 0x1 << 5
};
#endif
#endif // #if !defined(MAC_OS_X_VERSION_10_8) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_8
class nsIWidget;
@ -86,6 +99,11 @@ private:
// versions of OS X from (at least) 10.2.8 through 10.5.
- (void)_modalSession:(NSModalSession)aSession sendEvent:(NSEvent *)theEvent;
// Present (and documented) on OS X 10.6 and above. Not present before 10.6.
// This declaration needed to avoid compiler warnings when compiling on 10.5
// and below (or using the 10.5 SDK and below).
- (void)setHelpMenu:(NSMenu *)helpMenu;
@end
struct KeyBindingsCommand

View File

@ -20,6 +20,36 @@ class nsChildView;
class nsMenuBarX;
@class ChildView;
// If we are using an SDK older than 10.7, define bits we need that are missing
// from it.
#if !defined(MAC_OS_X_VERSION_10_7) || \
MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7
enum {
NSWindowAnimationBehaviorDefault = 0,
NSWindowAnimationBehaviorNone = 2,
NSWindowAnimationBehaviorDocumentWindow = 3,
NSWindowAnimationBehaviorUtilityWindow = 4,
NSWindowAnimationBehaviorAlertPanel = 5,
NSWindowCollectionBehaviorFullScreenPrimary = 128, // 1 << 7
};
typedef NSInteger NSWindowAnimationBehavior;
@interface NSWindow (LionWindowFeatures)
- (void)setAnimationBehavior:(NSWindowAnimationBehavior)newAnimationBehavior;
- (void)toggleFullScreen:(id)sender;
@end
typedef struct NSEdgeInsets {
CGFloat top;
CGFloat left;
CGFloat bottom;
CGFloat right;
} NSEdgeInsets;
#endif
typedef struct _nsCocoaWindowList {
_nsCocoaWindowList() : prev(nullptr), window(nullptr) {}
struct _nsCocoaWindowList *prev;
@ -152,7 +182,11 @@ typedef struct _nsCocoaWindowList {
@end
#if defined( MAC_OS_X_VERSION_10_6 ) && ( MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 )
@interface WindowDelegate : NSObject <NSWindowDelegate>
#else
@interface WindowDelegate : NSObject
#endif
{
nsCocoaWindow* mGeckoWindow; // [WEAK] (we are owned by the window)
// Used to avoid duplication when we send NS_ACTIVATE and
@ -412,8 +446,9 @@ protected:
// Only true on 10.7+ if SetShowsFullScreenButton(true) is called.
bool mSupportsNativeFullScreen;
// Whether we are currently using native fullscreen. It could be false because
// we are in the DOM fullscreen where we do not use the native fullscreen.
// Whether we are currently using Lion native fullscreen. It could be
// false either because we are not on Lion, or we are in the DOM
// fullscreen where we do not use the native fullscreen.
bool mInNativeFullScreenMode;
bool mIsAnimationSuppressed;

View File

@ -3263,7 +3263,7 @@ static const NSString* kStateCollectionBehavior = @"collectionBehavior";
// We work around this problem by only returning AXChildren that are
// mozAccessible object or are one of the titlebar's buttons (which
// instantiate subclasses of NSButtonCell).
if ([retval isKindOfClass:[NSArray class]] &&
if (nsCocoaFeatures::OnLionOrLater() && [retval isKindOfClass:[NSArray class]] &&
[attribute isEqualToString:@"AXChildren"]) {
NSMutableArray *holder = [NSMutableArray arrayWithCapacity:10];
[holder addObjectsFromArray:(NSArray *)retval];
@ -3284,6 +3284,22 @@ static const NSString* kStateCollectionBehavior = @"collectionBehavior";
return retval;
}
// If we were built on OS X 10.6 or with the 10.6 SDK and are running on Lion,
// the OS (specifically -[NSWindow sendEvent:]) won't send NSEventTypeGesture
// events to -[ChildView magnifyWithEvent:] as it should. The following code
// gets around this. See bug 863841.
#if !defined( MAC_OS_X_VERSION_10_7 ) || \
( MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 )
- (void)sendEvent:(NSEvent *)anEvent
{
if ([ChildView isLionSmartMagnifyEvent: anEvent]) {
[[self mainChildView] magnifyWithEvent:anEvent];
return;
}
[super sendEvent:anEvent];
}
#endif
@end
// This class allows us to exercise control over the window's title bar. This
@ -3345,7 +3361,7 @@ static const NSString* kStateCollectionBehavior = @"collectionBehavior";
// setBottomCornerRounded: is a private API call, so we check to make sure
// we respond to it just in case.
if ([self respondsToSelector:@selector(setBottomCornerRounded:)])
[self setBottomCornerRounded:YES];
[self setBottomCornerRounded:nsCocoaFeatures::OnLionOrLater()];
[self setAutorecalculatesContentBorderThickness:NO forEdge:NSMaxYEdge];
[self setContentBorderThickness:0.0f forEdge:NSMaxYEdge];
@ -3641,11 +3657,14 @@ DrawNativeTitlebar(CGContextRef aContext, CGRect aTitlebarRect,
{
nsNativeThemeCocoa::DrawNativeTitlebar(aContext, aTitlebarRect, aUnifiedToolbarHeight, aIsMain, NO);
// The call to CUIDraw doesn't draw the top pixel strip at some window widths.
// We don't want to have a flickering transparent line, so we overdraw it.
CGContextSetRGBFillColor(aContext, 0.95, 0.95, 0.95, 1);
CGContextFillRect(aContext, CGRectMake(0, CGRectGetMaxY(aTitlebarRect) - 1,
if (nsCocoaFeatures::OnLionOrLater()) {
// On Lion the call to CUIDraw doesn't draw the top pixel strip at some
// window widths. We don't want to have a flickering transparent line, so
// we overdraw it.
CGContextSetRGBFillColor(aContext, 0.95, 0.95, 0.95, 1);
CGContextFillRect(aContext, CGRectMake(0, CGRectGetMaxY(aTitlebarRect) - 1,
aTitlebarRect.size.width, 1));
}
}
// Pattern draw callback for standard titlebar gradients and solid titlebar colors

View File

@ -346,7 +346,21 @@ nsLookAndFeel::GetIntImpl(IntID aID, int32_t &aResult)
aResult = 4;
break;
case eIntID_ScrollArrowStyle:
aResult = eScrollArrow_None;
if (nsCocoaFeatures::OnLionOrLater()) {
// OS X Lion's scrollbars have no arrows
aResult = eScrollArrow_None;
} else {
NSString *buttonPlacement = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleScrollBarVariant"];
if ([buttonPlacement isEqualToString:@"Single"]) {
aResult = eScrollArrowStyle_Single;
} else if ([buttonPlacement isEqualToString:@"DoubleMin"]) {
aResult = eScrollArrowStyle_BothAtTop;
} else if ([buttonPlacement isEqualToString:@"DoubleBoth"]) {
aResult = eScrollArrowStyle_BothAtEachEnd;
} else {
aResult = eScrollArrowStyle_BothAtBottom; // The default is BothAtBottom.
}
}
break;
case eIntID_ScrollSliderStyle:
aResult = eScrollThumbStyle_Proportional;
@ -511,7 +525,7 @@ bool nsLookAndFeel::SystemWantsOverlayScrollbars()
bool nsLookAndFeel::AllowOverlayScrollbarsOverlap()
{
return UseOverlayScrollbars();
return (UseOverlayScrollbars() && nsCocoaFeatures::OnMountainLionOrLater());
}
bool

View File

@ -23,7 +23,11 @@ class nsIWidget;
// MenuDelegate is used to receive Cocoa notifications for setting
// up carbon events. Protocol is defined as of 10.6 SDK.
#if defined(MAC_OS_X_VERSION_10_6) && (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6)
@interface MenuDelegate : NSObject < NSMenuDelegate >
#else
@interface MenuDelegate : NSObject
#endif
{
nsMenuX* mGeckoMenu; // weak ref
}

View File

@ -470,6 +470,8 @@ WindowButtonsSize(nsIFrame* aFrame)
NSWindow* window = NativeWindowForFrame(aFrame);
if (!window) {
// Return fallback values.
if (!nsCocoaFeatures::OnLionOrLater())
return NSMakeSize(57, 16);
return NSMakeSize(54, 16);
}
@ -1113,7 +1115,8 @@ nsNativeThemeCocoa::DrawSearchField(CGContextRef cgContext, const HIRect& inBoxR
}
static const NSSize kCheckmarkSize = NSMakeSize(11, 11);
static const NSSize kMenuarrowSize = NSMakeSize(9, 10);
static const NSSize kMenuarrowSize = nsCocoaFeatures::OnLionOrLater() ?
NSMakeSize(9, 10) : NSMakeSize(8, 10);
static const NSSize kMenuScrollArrowSize = NSMakeSize(10, 8);
static NSString* kCheckmarkImage = @"MenuOnState";
static NSString* kMenuarrowRightImage = @"MenuSubmenu";
@ -1141,8 +1144,19 @@ nsNativeThemeCocoa::DrawMenuIcon(CGContextRef cgContext, const CGRect& aRect,
aRect.origin.y + ceil(paddingY / 2),
aIconSize.width, aIconSize.height);
NSString* state = IsDisabled(aFrame, inState) ? @"disabled" :
(CheckBooleanAttr(aFrame, nsGkAtoms::menuactive) ? @"pressed" : @"normal");
BOOL isDisabled = IsDisabled(aFrame, inState);
BOOL isActive = CheckBooleanAttr(aFrame, nsGkAtoms::menuactive);
// On 10.6 and at least on 10.7.0, Apple doesnt seem to have implemented all
// keys and values used on 10.7.5 and later. We can however draw menu icons
// on earlier OS versions by using different keys/values.
BOOL otherKeysAndValues = !nsCocoaFeatures::IsAtLeastVersion(10,7,5);
// 2 states combined with 2 different backgroundTypeKeys on earlier versions.
NSString* state = isDisabled ? @"disabled" :
(isActive && !otherKeysAndValues) ? @"pressed" : @"normal";
NSString* backgroundTypeKey = !otherKeysAndValues ? @"kCUIBackgroundTypeMenu" :
!isDisabled && isActive ? @"backgroundTypeDark" : @"backgroundTypeLight";
NSString* imageName = aImageName;
if (!nsCocoaFeatures::OnElCapitanOrLater()) {
@ -1150,14 +1164,19 @@ nsNativeThemeCocoa::DrawMenuIcon(CGContextRef cgContext, const CGRect& aRect,
imageName = [@"image." stringByAppendingString:aImageName];
}
NSMutableArray* keys = [NSMutableArray arrayWithObjects:@"backgroundTypeKey",
@"imageNameKey", @"state", @"widget", @"is.flipped", nil];
NSMutableArray* values = [NSMutableArray arrayWithObjects: backgroundTypeKey,
imageName, state, @"image", [NSNumber numberWithBool:YES], nil];
if (otherKeysAndValues) { // Earlier versions used one more key-value pair.
[keys insertObject:@"imageIsGrayscaleKey" atIndex:1];
[values insertObject:[NSNumber numberWithBool:YES] atIndex:1];
}
RenderWithCoreUI(drawRect, cgContext,
[NSDictionary dictionaryWithObjectsAndKeys:
@"kCUIBackgroundTypeMenu", @"backgroundTypeKey",
aImageName, @"imageNameKey",
state, @"state",
@"image", @"widget",
[NSNumber numberWithBool:YES], @"is.flipped",
nil]);
[NSDictionary dictionaryWithObjects:values
forKeys:keys]);
#if DRAW_IN_FRAME_DEBUG
CGContextSetRGBFillColor(cgContext, 0.0, 0.0, 0.5, 0.25);
@ -2053,6 +2072,13 @@ nsNativeThemeCocoa::DrawSegment(CGContextRef cgContext, const HIRect& inBoxRect,
nil]);
}
static inline UInt8
ConvertToPressState(EventStates aButtonState, UInt8 aPressState)
{
// If the button is pressed, return the press state passed in. Otherwise, return 0.
return aButtonState.HasAllStates(NS_EVENT_STATE_ACTIVE | NS_EVENT_STATE_HOVER) ? aPressState : 0;
}
void
nsNativeThemeCocoa::GetScrollbarPressStates(nsIFrame* aFrame,
EventStates aButtonStates[])
@ -2134,6 +2160,30 @@ nsNativeThemeCocoa::GetScrollbarDrawInfo(HIThemeTrackDrawInfo& aTdi, nsIFrame *a
aTdi.trackInfo.scrollbar.pressState = 0;
// Only go get these scrollbar button states if we need it. For example,
// there's no reason to look up scrollbar button states when we're only
// creating a TrackDrawInfo to determine the size of the thumb. There's
// also no reason to do this on Lion or later, whose scrollbars have no
// arrow buttons.
if (aShouldGetButtonStates && !nsCocoaFeatures::OnLionOrLater()) {
EventStates buttonStates[4];
GetScrollbarPressStates(aFrame, buttonStates);
NSString *buttonPlacement = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleScrollBarVariant"];
// It seems that unless all four buttons are showing, kThemeTopOutsideArrowPressed is the correct constant for
// the up scrollbar button.
if ([buttonPlacement isEqualToString:@"DoubleBoth"]) {
aTdi.trackInfo.scrollbar.pressState = ConvertToPressState(buttonStates[0], kThemeTopOutsideArrowPressed) |
ConvertToPressState(buttonStates[1], kThemeTopInsideArrowPressed) |
ConvertToPressState(buttonStates[2], kThemeBottomInsideArrowPressed) |
ConvertToPressState(buttonStates[3], kThemeBottomOutsideArrowPressed);
} else {
aTdi.trackInfo.scrollbar.pressState = ConvertToPressState(buttonStates[0], kThemeTopOutsideArrowPressed) |
ConvertToPressState(buttonStates[1], kThemeBottomOutsideArrowPressed) |
ConvertToPressState(buttonStates[2], kThemeTopOutsideArrowPressed) |
ConvertToPressState(buttonStates[3], kThemeBottomOutsideArrowPressed);
}
}
NS_OBJC_END_TRY_ABORT_BLOCK;
}
@ -2341,7 +2391,7 @@ DrawVibrancyBackground(CGContextRef cgContext, CGRect inBoxRect,
static bool
ScrollbarTrackAndThumbDrawSeparately()
{
return nsLookAndFeel::UseOverlayScrollbars();
return nsLookAndFeel::UseOverlayScrollbars() || nsCocoaFeatures::OnLionOrLater();
}
bool
@ -2832,7 +2882,7 @@ nsNativeThemeCocoa::DrawWidgetBackground(nsRenderingContext* aContext,
BOOL isRolledOver = IsParentScrollbarRolledOver(aFrame);
nsIFrame* scrollbarFrame = GetParentScrollbarFrame(aFrame);
bool isSmall = (scrollbarFrame && scrollbarFrame->StyleDisplay()->mAppearance == NS_THEME_SCROLLBAR_SMALL);
if (isOverlay && !isRolledOver) {
if (isOverlay && (!nsCocoaFeatures::OnMountainLionOrLater() || !isRolledOver)) {
if (isHorizontal) {
macRect.origin.y += 4;
macRect.size.height -= 4;
@ -2883,6 +2933,21 @@ nsNativeThemeCocoa::DrawWidgetBackground(nsRenderingContext* aContext,
BOOL isHorizontal = (aWidgetType == NS_THEME_SCROLLBARTRACK_HORIZONTAL);
nsIFrame* scrollbarFrame = GetParentScrollbarFrame(aFrame);
bool isSmall = (scrollbarFrame && scrollbarFrame->StyleDisplay()->mAppearance == NS_THEME_SCROLLBAR_SMALL);
if (isOverlay && !nsCocoaFeatures::OnMountainLionOrLater()) {
// On OSX 10.7, scrollbars don't grow when hovered.
// The adjustments below were obtained by trial and error.
if (isHorizontal) {
macRect.origin.y += 2.0;
} else {
if (aFrame->StyleVisibility()->mDirection !=
NS_STYLE_DIRECTION_RTL) {
macRect.origin.x += 3.0;
} else {
macRect.origin.x -= 1.0;
}
}
}
const BOOL isOnTopOfDarkBackground = IsDarkBackground(aFrame);
RenderWithCoreUILegacy(macRect, cgContext,
[NSDictionary dictionaryWithObjectsAndKeys:
@ -3100,6 +3165,27 @@ nsNativeThemeCocoa::GetWidgetBorder(nsDeviceContext* aContext,
case NS_THEME_SCROLLBARTRACK_VERTICAL:
{
bool isHorizontal = (aWidgetType == NS_THEME_SCROLLBARTRACK_HORIZONTAL);
// On Lion and later, scrollbars have no arrows.
if (!nsCocoaFeatures::OnLionOrLater()) {
// There's only an endcap to worry about when both arrows are on the bottom
NSString *buttonPlacement = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleScrollBarVariant"];
if (!buttonPlacement || [buttonPlacement isEqualToString:@"DoubleMax"]) {
nsIFrame *scrollbarFrame = GetParentScrollbarFrame(aFrame);
if (!scrollbarFrame) return NS_ERROR_FAILURE;
bool isSmall = (scrollbarFrame->StyleDisplay()->mAppearance == NS_THEME_SCROLLBAR_SMALL);
// There isn't a metric for this, so just hardcode a best guess at the value.
// This value is even less exact due to the fact that the endcap is partially concave.
int32_t endcapSize = isSmall ? 5 : 6;
if (isHorizontal)
aResult->SizeTo(0, 0, 0, endcapSize);
else
aResult->SizeTo(endcapSize, 0, 0, 0);
}
}
if (nsLookAndFeel::UseOverlayScrollbars()) {
if (isHorizontal) {
aResult->SizeTo(2, 1, 1, 1);

View File

@ -15,6 +15,14 @@ enum ColorName {
toolbarBottomBorderGrey,
};
static const int sSnowLeopardThemeColors[][2] = {
/* { active window, inactive window } */
// toolbar:
{ 0xD0, 0xF1 }, // top separator line
{ 0xA7, 0xD8 }, // fill color
{ 0x51, 0x99 }, // bottom separator line
};
static const int sLionThemeColors[][2] = {
/* { active window, inactive window } */
// toolbar:
@ -36,7 +44,11 @@ static int NativeGreyColorAsInt(ColorName name, BOOL isMain)
{
if (nsCocoaFeatures::OnYosemiteOrLater())
return sYosemiteThemeColors[name][isMain ? 0 : 1];
return sLionThemeColors[name][isMain ? 0 : 1];
if (nsCocoaFeatures::OnLionOrLater())
return sLionThemeColors[name][isMain ? 0 : 1];
return sSnowLeopardThemeColors[name][isMain ? 0 : 1];
}
__attribute__((unused))