MenulistButtonAppearance, which appears to be used for styled select controls, is given a rounded border. This looks wrong in Windows when not using the "Safari" style theme, since Windows select dropdowns are square. Platforms need more control over how this control is drawn.
Created attachment 16318 [details] make some methods virtual This simple patch just makes a few methods virtual so that platforms can override them with custom behavior.
Comment on attachment 16318 [details] make some methods virtual I don't think this is the right way to go about this. If this change were made, the <select>s computedStyle would still include the border-radius properties, even though we wouldn't be honoring them. Instead, you should override adjustMenuListButtonStyle, which is already virtual.
Hmm, yes, you're right. Doing it this way results in the <select> being drawn as if its size included the border. However, adjustMenuListButtonStyle seems insufficient. The only way to prevent it from drawing the rounded border is to reset the border entirely, which is undesirable when the user explicitly sets a border. I think the real fix involves fixing RenderObject::paintBorder so that it doesn't attempt to draw rounded corners in all cases. (It only really makes sense on <select> controls that are styled the Mac way).
(In reply to comment #3) > However, adjustMenuListButtonStyle seems insufficient. The only way to prevent > it from drawing the rounded border is to reset the border entirely, which is > undesirable when the user explicitly sets a border. Perhaps we need to change html4.css, then. > I think the real fix involves fixing RenderObject::paintBorder so that it > doesn't attempt to draw rounded corners in all cases. (It only really makes > sense on <select> controls that are styled the Mac way). RenderObject::paintBorder does not always try to paint rounded borders: if (style->hasBorderRadius() && static_cast<unsigned>(w) >= static_cast<unsigned>(topLeft.width()) + static_cast<unsigned>(topRight.width()) && static_cast<unsigned>(w) >= static_cast<unsigned>(bottomLeft.width()) + static_cast<unsigned>(bottomRight.width()) && static_cast<unsigned>(h) >= static_cast<unsigned>(topLeft.height()) + static_cast<unsigned>(bottomLeft.height()) && static_cast<unsigned>(h) >= static_cast<unsigned>(topRight.height()) + static_cast<unsigned>(bottomRight.height())) renderRadii = true;
(In reply to comment #4) > RenderObject::paintBorder does not always try to paint rounded borders: > > if (style->hasBorderRadius() && > static_cast<unsigned>(w) >= static_cast<unsigned>(topLeft.width()) + > static_cast<unsigned>(topRight.width()) && > static_cast<unsigned>(w) >= static_cast<unsigned>(bottomLeft.width()) + > static_cast<unsigned>(bottomRight.width()) && > static_cast<unsigned>(h) >= static_cast<unsigned>(topLeft.height()) + > static_cast<unsigned>(bottomLeft.height()) && > static_cast<unsigned>(h) >= static_cast<unsigned>(topRight.height()) + > static_cast<unsigned>(bottomRight.height())) > renderRadii = true; > You're right again. I suppose resetting the border radius would achieve the effect I want. Closing as WORKSFORME.