Modified: branches/safari-536-branch/Source/WebCore/ChangeLog (117141 => 117142)
--- branches/safari-536-branch/Source/WebCore/ChangeLog 2012-05-15 20:26:10 UTC (rev 117141)
+++ branches/safari-536-branch/Source/WebCore/ChangeLog 2012-05-15 20:41:58 UTC (rev 117142)
@@ -1,5 +1,45 @@
2012-05-15 Lucas Forschler <[email protected]>
+ Merge 116697
+
+ 2012-05-10 Beth Dakin <[email protected]>
+
+ https://bugs.webkit.org/show_bug.cgi?id=82131
+ [Mac] REGRESSION (r110480): Text field that specifies background-color
+ (or is auto-filled) gets un-themed border
+ -and corresponding-
+ <rdar://problem/11115221>
+
+ Reviewed by Maciej Stachowiak.
+
+ This change rolls out r110480 which is what caused styled text fields
+ to get the un-themed border, and it does a bunch of work to make sure
+ we get the pretty, new version of the NSTextField art whenever
+ possible. We do this differently for post-Lion OS's since there is now
+ a way to opt into it all the time. Lion and SnowLeopard can only use
+ the new art in HiDPI mode when the background color of the text field
+ is just white.
+
+ RenderThemeMac::textField() takes a boolean paramter used to determine
+ if the new gradient will be used.
+ * rendering/RenderThemeMac.h:
+ (RenderThemeMac):
+
+ This is the post-Lion workaround. This code has no effect on Lion and
+ SnowLeopard. This allows up to opt into a version of [NSTextField drawWithFrame:] that will only draw the frame of the text field; without this, it will draw the frame and the background, which creates a number of problems with styled text fields and text fields in HiDPI. There is a less comprehesive workaround for Lion and SnowLeopard in place in RenderThemeMac::textField().
+ * rendering/RenderThemeMac.mm:
+ (-[WebCoreTextFieldCell _coreUIDrawOptionsWithFrame:inView:includeFocus:]):
+
+ This is the roll-out of r110480.
+ (WebCore::RenderThemeMac::isControlStyled):
+
+ See the comments for a full explanation, but this is mostly code for
+ Lion and SnowLeopard to determine if we can opt into the new artwork.
+ (WebCore::RenderThemeMac::paintTextField):
+ (WebCore::RenderThemeMac::textField):
+
+2012-05-15 Lucas Forschler <[email protected]>
+
Merge 116794
2012-05-11 Anders Carlsson <[email protected]>
Modified: branches/safari-536-branch/Source/WebCore/rendering/RenderThemeMac.h (117141 => 117142)
--- branches/safari-536-branch/Source/WebCore/rendering/RenderThemeMac.h 2012-05-15 20:26:10 UTC (rev 117141)
+++ branches/safari-536-branch/Source/WebCore/rendering/RenderThemeMac.h 2012-05-15 20:41:58 UTC (rev 117142)
@@ -219,7 +219,7 @@
NSMenu* searchMenuTemplate() const;
NSSliderCell* sliderThumbHorizontal() const;
NSSliderCell* sliderThumbVertical() const;
- NSTextFieldCell* textField() const;
+ NSTextFieldCell* textField(bool useNewGradient) const;
#if ENABLE(METER_TAG)
NSLevelIndicatorStyle levelIndicatorStyleFor(ControlPart) const;
Modified: branches/safari-536-branch/Source/WebCore/rendering/RenderThemeMac.mm (117141 => 117142)
--- branches/safari-536-branch/Source/WebCore/rendering/RenderThemeMac.mm 2012-05-15 20:26:10 UTC (rev 117141)
+++ branches/safari-536-branch/Source/WebCore/rendering/RenderThemeMac.mm 2012-05-15 20:41:58 UTC (rev 117142)
@@ -105,6 +105,25 @@
@end
+@interface NSTextFieldCell (WKDetails)
+- (CFDictionaryRef)_coreUIDrawOptionsWithFrame:(NSRect)cellFrame inView:(NSView *)controlView includeFocus:(BOOL)includeFocus;
+@end
+
+
+@interface WebCoreTextFieldCell : NSTextFieldCell
+- (CFDictionaryRef)_coreUIDrawOptionsWithFrame:(NSRect)cellFrame inView:(NSView *)controlView includeFocus:(BOOL)includeFocus;
+@end
+
+@implementation WebCoreTextFieldCell
+- (CFDictionaryRef)_coreUIDrawOptionsWithFrame:(NSRect)cellFrame inView:(NSView *)controlView includeFocus:(BOOL)includeFocus
+{
+ // FIXME: This is a post-Lion-only workaround for <rdar://problem/11385461>. When that bug is resolved, we should remove this code.
+ CFMutableDictionaryRef coreUIDrawOptions = CFDictionaryCreateMutableCopy(NULL, 0, [super _coreUIDrawOptionsWithFrame:cellFrame inView:controlView includeFocus:includeFocus]);
+ CFDictionarySetValue(coreUIDrawOptions, @"borders only", kCFBooleanTrue);
+ return (CFDictionaryRef)[NSMakeCollectable(coreUIDrawOptions) autorelease];
+}
+@end
+
namespace WebCore {
using namespace HTMLNames;
@@ -489,7 +508,7 @@
bool RenderThemeMac::isControlStyled(const RenderStyle* style, const BorderData& border,
const FillLayer& background, const Color& backgroundColor) const
{
- if (style->appearance() == TextAreaPart || style->appearance() == ListboxPart)
+ if (style->appearance() == TextFieldPart || style->appearance() == TextAreaPart || style->appearance() == ListboxPart)
return style->border() != border;
// FIXME: This is horrible, but there is not much else that can be done. Menu lists cannot draw properly when
@@ -714,8 +733,20 @@
bool RenderThemeMac::paintTextField(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
{
LocalCurrentGraphicsContext localContext(paintInfo.context);
- NSTextFieldCell* textField = this->textField();
+ bool useNewGradient = true;
+#if defined(BUILDING_ON_LION) || defined(BUILDING_ON_SNOW_LEOPARD)
+ // See comment in RenderThemeMac::textField() for a complete explanation of this.
+ useNewGradient = WebCore::deviceScaleFactor(o->frame()) != 1;
+ if (useNewGradient) {
+ useNewGradient = o->style()->hasAppearance()
+ && o->style()->visitedDependentColor(CSSPropertyBackgroundColor) == Color::white
+ && !o->style()->hasBackgroundImage();
+ }
+#endif
+
+ NSTextFieldCell* textField = this->textField(useNewGradient);
+
GraphicsContextStateSaver stateSaver(*paintInfo.context);
[textField setEnabled:(isEnabled(o) && !isReadOnlyControl(o))];
@@ -2133,15 +2164,36 @@
return m_sliderThumbVertical.get();
}
-NSTextFieldCell* RenderThemeMac::textField() const
+NSTextFieldCell* RenderThemeMac::textField(bool useNewGradient) const
{
if (!m_textField) {
- m_textField.adoptNS([[NSTextFieldCell alloc] initTextCell:@""]);
+ m_textField.adoptNS([[WebCoreTextFieldCell alloc] initTextCell:@""]);
[m_textField.get() setBezeled:YES];
[m_textField.get() setEditable:YES];
[m_textField.get() setFocusRingType:NSFocusRingTypeExterior];
+#if defined(BUILDING_ON_LION) || defined(BUILDING_ON_SNOW_LEOPARD)
+ [m_textField.get() setDrawsBackground:YES];
+#else
+ UNUSED_PARAM(useNewGradient);
+ [m_textField.get() setDrawsBackground:NO];
+#endif
}
+#if defined(BUILDING_ON_LION) || defined(BUILDING_ON_SNOW_LEOPARD)
+ // This is a workaround for <rdar://problem/11385461> on Lion and SnowLeopard. Newer versions of the
+ // OS can always use the newer version of the text field with the workaround above in
+ // _coreUIDrawOptionsWithFrame. With this workaround for older OS's, when the deviceScaleFactor is 1,
+ // we have an old-school gradient bezel in text fields whether they are styled or not. This is fine and
+ // matches shipping Safari. When the deviceScaleFactor is greater than 1, text fields will have newer,
+ // AppKit-matching gradients that look much more appropriate at the higher resolutions. However, if the
+ // text field is styled in any way, we'll revert to the old-school bezel, which doesn't look great in
+ // HiDPI, but it looks better than the CSS border, which is the only alternative until 11385461 is resolved.
+ if (useNewGradient)
+ [m_textField.get() setBackgroundColor:[NSColor whiteColor]];
+ else
+ [m_textField.get() setBackgroundColor:[NSColor clearColor]];
+#endif
+
return m_textField.get();
}