#include "config.h"
#include "core/rendering/RenderTheme.h"
-#include "CSSValueKeywords.h"
-#include "HTMLNames.h"
-#include "RuntimeEnabledFeatures.h"
+#include "core/CSSValueKeywords.h"
+#include "core/HTMLNames.h"
+#include "core/InputTypeNames.h"
#include "core/dom/Document.h"
#include "core/dom/shadow/ElementShadow.h"
#include "core/editing/FrameSelection.h"
#include "core/fileapi/FileList.h"
+#include "core/frame/LocalFrame.h"
#include "core/html/HTMLCollection.h"
#include "core/html/HTMLDataListElement.h"
+#include "core/html/HTMLDataListOptionsCollection.h"
+#include "core/html/HTMLFormControlElement.h"
#include "core/html/HTMLInputElement.h"
#include "core/html/HTMLMeterElement.h"
#include "core/html/HTMLOptionElement.h"
-#include "core/html/forms/InputTypeNames.h"
#include "core/html/parser/HTMLParserIdioms.h"
#include "core/html/shadow/MediaControlElements.h"
#include "core/html/shadow/ShadowElementNames.h"
#include "core/html/shadow/SpinButtonElement.h"
#include "core/html/shadow/TextControlInnerElements.h"
#include "core/page/FocusController.h"
-#include "core/frame/Frame.h"
#include "core/page/Page.h"
-#include "core/page/Settings.h"
-#include "core/platform/graphics/GraphicsContextStateSaver.h"
-#include "core/platform/graphics/StringTruncator.h"
+#include "core/frame/Settings.h"
#include "core/rendering/PaintInfo.h"
#include "core/rendering/RenderMeter.h"
#include "core/rendering/RenderView.h"
#include "core/rendering/style/RenderStyle.h"
#include "platform/FileMetadata.h"
#include "platform/FloatConversion.h"
+#include "platform/RuntimeEnabledFeatures.h"
#include "platform/fonts/FontSelector.h"
+#include "platform/graphics/GraphicsContextStateSaver.h"
#include "platform/text/PlatformLocale.h"
+#include "platform/text/StringTruncator.h"
#include "public/platform/Platform.h"
#include "public/platform/WebFallbackThemeEngine.h"
#include "public/platform/WebRect.h"
#include "wtf/text/StringBuilder.h"
-#if ENABLE(INPUT_SPEECH)
-#include "core/rendering/RenderInputSpeech.h"
-#endif
-
// The methods in this file are shared by all themes on every platform.
-namespace WebCore {
+namespace blink {
using namespace HTMLNames;
-static Color& customFocusRingColor()
-{
- DEFINE_STATIC_LOCAL(Color, color, ());
- return color;
-}
-
-static WebKit::WebFallbackThemeEngine::State getWebFallbackThemeState(const RenderTheme* theme, const RenderObject* o)
+static WebFallbackThemeEngine::State getWebFallbackThemeState(const RenderTheme* theme, const RenderObject* o)
{
if (!theme->isEnabled(o))
- return WebKit::WebFallbackThemeEngine::StateDisabled;
+ return WebFallbackThemeEngine::StateDisabled;
if (theme->isPressed(o))
- return WebKit::WebFallbackThemeEngine::StatePressed;
+ return WebFallbackThemeEngine::StatePressed;
if (theme->isHovered(o))
- return WebKit::WebFallbackThemeEngine::StateHover;
+ return WebFallbackThemeEngine::StateHover;
- return WebKit::WebFallbackThemeEngine::StateNormal;
+ return WebFallbackThemeEngine::StateNormal;
}
RenderTheme::RenderTheme()
+ : m_hasCustomFocusRingColor(false)
#if USE(NEW_THEME)
- : m_platformTheme(platformTheme())
+ , m_platformTheme(platformTheme())
#endif
{
}
-void RenderTheme::adjustStyle(RenderStyle* style, Element* e, const CachedUAStyle& uaStyle)
+void RenderTheme::adjustStyle(RenderStyle* style, Element* e, const CachedUAStyle* uaStyle)
{
// Force inline and table display styles to be inline-block (except for table- which is block)
ControlPart part = style->appearance();
else if (style->display() == LIST_ITEM || style->display() == TABLE)
style->setDisplay(BLOCK);
- if (uaStyle.hasAppearance && isControlStyled(style, uaStyle)) {
+ if (uaStyle && isControlStyled(style, uaStyle)) {
if (part == MenulistPart) {
style->setAppearance(MenulistButtonPart);
part = MenulistButtonPart;
case ButtonPart: {
// Border
LengthBox borderBox(style->borderTopWidth(), style->borderRightWidth(), style->borderBottomWidth(), style->borderLeftWidth());
- borderBox = m_platformTheme->controlBorder(part, style->font(), borderBox, style->effectiveZoom());
+ borderBox = m_platformTheme->controlBorder(part, style->font().fontDescription(), borderBox, style->effectiveZoom());
if (borderBox.top().value() != static_cast<int>(style->borderTopWidth())) {
if (borderBox.top().value())
style->setBorderTopWidth(borderBox.top().value());
}
// Padding
- LengthBox paddingBox = m_platformTheme->controlPadding(part, style->font(), style->paddingBox(), style->effectiveZoom());
+ LengthBox paddingBox = m_platformTheme->controlPadding(part, style->font().fontDescription(), style->paddingBox(), style->effectiveZoom());
if (paddingBox != style->paddingBox())
style->setPaddingBox(paddingBox);
// Width / Height
// The width and height here are affected by the zoom.
// FIXME: Check is flawed, since it doesn't take min-width/max-width into account.
- LengthSize controlSize = m_platformTheme->controlSize(part, style->font(), LengthSize(style->width(), style->height()), style->effectiveZoom());
+ LengthSize controlSize = m_platformTheme->controlSize(part, style->font().fontDescription(), LengthSize(style->width(), style->height()), style->effectiveZoom());
if (controlSize.width() != style->width())
style->setWidth(controlSize.width());
if (controlSize.height() != style->height())
style->setHeight(controlSize.height());
// Min-Width / Min-Height
- LengthSize minControlSize = m_platformTheme->minimumControlSize(part, style->font(), style->effectiveZoom());
+ LengthSize minControlSize = m_platformTheme->minimumControlSize(part, style->font().fontDescription(), style->effectiveZoom());
if (minControlSize.width() != style->minWidth())
style->setMinWidth(minControlSize.width());
if (minControlSize.height() != style->minHeight())
style->setMinHeight(minControlSize.height());
// Font
- FontDescription controlFont = m_platformTheme->controlFont(part, style->font(), style->effectiveZoom());
+ FontDescription controlFont = m_platformTheme->controlFont(part, style->font().fontDescription(), style->effectiveZoom());
if (controlFont != style->font().fontDescription()) {
// Reset our line-height
style->setLineHeight(RenderStyle::initialLineHeight());
// Now update our font.
if (style->setFontDescription(controlFont))
- style->font().update(0);
+ style->font().update(nullptr);
}
}
default:
return adjustSearchFieldDecorationStyle(style, e);
case SearchFieldResultsDecorationPart:
return adjustSearchFieldResultsDecorationStyle(style, e);
-#if ENABLE(INPUT_SPEECH)
- case InputSpeechButtonPart:
- return adjustInputFieldSpeechButtonStyle(style, e);
-#endif
default:
break;
}
bool RenderTheme::paint(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
{
- // If painting is disabled, but we aren't updating control tints, then just bail.
- // If we are updating control tints, just schedule a repaint if the theme supports tinting
- // for that control.
- if (paintInfo.context->updatingControlTints()) {
- if (controlSupportsTints(o))
- o->repaint();
- return false;
- }
- if (paintInfo.context->paintingDisabled())
- return false;
-
ControlPart part = o->style()->appearance();
if (shouldUseFallbackTheme(o->style()))
return paintMediaOverlayPlayButton(o, paintInfo, r);
case MediaMuteButtonPart:
return paintMediaMuteButton(o, paintInfo, r);
- case MediaSeekBackButtonPart:
- return paintMediaSeekBackButton(o, paintInfo, r);
- case MediaSeekForwardButtonPart:
- return paintMediaSeekForwardButton(o, paintInfo, r);
- case MediaRewindButtonPart:
- return paintMediaRewindButton(o, paintInfo, r);
- case MediaReturnToRealtimeButtonPart:
- return paintMediaReturnToRealtimeButton(o, paintInfo, r);
case MediaToggleClosedCaptionsButtonPart:
return paintMediaToggleClosedCaptionsButton(o, paintInfo, r);
case MediaSliderPart:
return paintMediaSliderTrack(o, paintInfo, r);
case MediaSliderThumbPart:
return paintMediaSliderThumb(o, paintInfo, r);
- case MediaVolumeSliderMuteButtonPart:
- return paintMediaMuteButton(o, paintInfo, r);
case MediaVolumeSliderContainerPart:
return paintMediaVolumeSliderContainer(o, paintInfo, r);
case MediaVolumeSliderPart:
return paintMediaCurrentTime(o, paintInfo, r);
case MediaControlsBackgroundPart:
return paintMediaControlsBackground(o, paintInfo, r);
+ case MediaCastOffButtonPart:
+ return paintMediaCastButton(o, paintInfo, r);
+ case MediaOverlayCastOffButtonPart:
+ return paintMediaCastButton(o, paintInfo, r);
case MenulistButtonPart:
case TextFieldPart:
case TextAreaPart:
- case ListboxPart:
return true;
case SearchFieldPart:
return paintSearchField(o, paintInfo, r);
return paintSearchFieldDecoration(o, paintInfo, r);
case SearchFieldResultsDecorationPart:
return paintSearchFieldResultsDecoration(o, paintInfo, r);
-#if ENABLE(INPUT_SPEECH)
- case InputSpeechButtonPart:
- return paintInputFieldSpeechButton(o, paintInfo, r);
-#endif
default:
break;
}
bool RenderTheme::paintBorderOnly(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
{
- if (paintInfo.context->paintingDisabled())
- return false;
-
// Call the appropriate paint method based off the appearance value.
switch (o->style()->appearance()) {
case TextFieldPart:
return paintTextField(o, paintInfo, r);
- case ListboxPart:
case TextAreaPart:
return paintTextArea(o, paintInfo, r);
case MenulistButtonPart:
case SearchFieldPart:
+ case ListboxPart:
return true;
case CheckboxPart:
case RadioPart:
case SearchFieldCancelButtonPart:
case SearchFieldDecorationPart:
case SearchFieldResultsDecorationPart:
-#if ENABLE(INPUT_SPEECH)
- case InputSpeechButtonPart:
-#endif
default:
break;
}
bool RenderTheme::paintDecorations(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
{
- if (paintInfo.context->paintingDisabled())
- return false;
-
// Call the appropriate paint method based off the appearance value.
switch (o->style()->appearance()) {
case MenulistButtonPart:
return paintMenuListButton(o, paintInfo, r);
case TextFieldPart:
case TextAreaPart:
- case ListboxPart:
case CheckboxPart:
case RadioPart:
case PushButtonPart:
case SearchFieldCancelButtonPart:
case SearchFieldDecorationPart:
case SearchFieldResultsDecorationPart:
-#if ENABLE(INPUT_SPEECH)
- case InputSpeechButtonPart:
-#endif
default:
break;
}
String RenderTheme::extraDefaultStyleSheet()
{
- if (!RuntimeEnabledFeatures::dataListElementEnabled() && !RuntimeEnabledFeatures::dialogElementEnabled())
- return String();
StringBuilder runtimeCSS;
-
- if (RuntimeEnabledFeatures::dataListElementEnabled()) {
- runtimeCSS.appendLiteral("datalist {display: none ;}");
-
- if (RuntimeEnabledFeatures::inputTypeColorEnabled()) {
- runtimeCSS.appendLiteral("input[type=\"color\"][list] { -webkit-appearance: menulist; width: 88px; height: 23px;}");
- runtimeCSS.appendLiteral("input[type=\"color\"][list]::-webkit-color-swatch-wrapper { padding-left: 8px; padding-right: 24px;}");
- runtimeCSS.appendLiteral("input[type=\"color\"][list]::-webkit-color-swatch { border-color: #000000;}");
- }
- }
- if (RuntimeEnabledFeatures::dialogElementEnabled()) {
- runtimeCSS.appendLiteral("dialog:not([open]) { display: none; }");
- runtimeCSS.appendLiteral("dialog { position: absolute; left: 0; right: 0; width: -webkit-fit-content; height: -webkit-fit-content; margin: auto; border: solid; padding: 1em; background: white; color: black;}");
- runtimeCSS.appendLiteral("dialog::backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; background: rgba(0,0,0,0.1); }");
- }
-
+ if (RuntimeEnabledFeatures::contextMenuEnabled())
+ runtimeCSS.appendLiteral("menu[type=\"popup\" i] { display: none; }");
return runtimeCSS.toString();
}
Color RenderTheme::activeSelectionBackgroundColor() const
{
- if (!m_activeSelectionBackgroundColor.isValid())
- m_activeSelectionBackgroundColor = platformActiveSelectionBackgroundColor().blendWithWhite();
- return m_activeSelectionBackgroundColor;
+ return platformActiveSelectionBackgroundColor().blendWithWhite();
}
Color RenderTheme::inactiveSelectionBackgroundColor() const
{
- if (!m_inactiveSelectionBackgroundColor.isValid())
- m_inactiveSelectionBackgroundColor = platformInactiveSelectionBackgroundColor().blendWithWhite();
- return m_inactiveSelectionBackgroundColor;
+ return platformInactiveSelectionBackgroundColor().blendWithWhite();
}
Color RenderTheme::activeSelectionForegroundColor() const
{
- if (!m_activeSelectionForegroundColor.isValid() && supportsSelectionForegroundColors())
- m_activeSelectionForegroundColor = platformActiveSelectionForegroundColor();
- return m_activeSelectionForegroundColor;
+ return platformActiveSelectionForegroundColor();
}
Color RenderTheme::inactiveSelectionForegroundColor() const
{
- if (!m_inactiveSelectionForegroundColor.isValid() && supportsSelectionForegroundColors())
- m_inactiveSelectionForegroundColor = platformInactiveSelectionForegroundColor();
- return m_inactiveSelectionForegroundColor;
+ return platformInactiveSelectionForegroundColor();
}
Color RenderTheme::activeListBoxSelectionBackgroundColor() const
{
- if (!m_activeListBoxSelectionBackgroundColor.isValid())
- m_activeListBoxSelectionBackgroundColor = platformActiveListBoxSelectionBackgroundColor();
- return m_activeListBoxSelectionBackgroundColor;
+ return platformActiveListBoxSelectionBackgroundColor();
}
Color RenderTheme::inactiveListBoxSelectionBackgroundColor() const
{
- if (!m_inactiveListBoxSelectionBackgroundColor.isValid())
- m_inactiveListBoxSelectionBackgroundColor = platformInactiveListBoxSelectionBackgroundColor();
- return m_inactiveListBoxSelectionBackgroundColor;
+ return platformInactiveListBoxSelectionBackgroundColor();
}
Color RenderTheme::activeListBoxSelectionForegroundColor() const
{
- if (!m_activeListBoxSelectionForegroundColor.isValid() && supportsListBoxSelectionForegroundColors())
- m_activeListBoxSelectionForegroundColor = platformActiveListBoxSelectionForegroundColor();
- return m_activeListBoxSelectionForegroundColor;
+ return platformActiveListBoxSelectionForegroundColor();
}
Color RenderTheme::inactiveListBoxSelectionForegroundColor() const
{
- if (!m_inactiveListBoxSelectionForegroundColor.isValid() && supportsListBoxSelectionForegroundColors())
- m_inactiveListBoxSelectionForegroundColor = platformInactiveListBoxSelectionForegroundColor();
- return m_inactiveListBoxSelectionForegroundColor;
+ return platformInactiveListBoxSelectionForegroundColor();
}
Color RenderTheme::platformActiveSelectionBackgroundColor() const
{
// Code below excludes the background-repeat from comparison by resetting it
FillLayer backgroundCopy = uaStyle.backgroundLayers;
- FillLayer backgroundLayersCopy = *style.backgroundLayers();
+ FillLayer backgroundLayersCopy = style.backgroundLayers();
backgroundCopy.setRepeatX(NoRepeatFill);
backgroundCopy.setRepeatY(NoRepeatFill);
backgroundLayersCopy.setRepeatX(NoRepeatFill);
|| style.visitedDependentColor(CSSPropertyBackgroundColor) != uaStyle.backgroundColor;
}
-bool RenderTheme::isControlStyled(const RenderStyle* style, const CachedUAStyle& uaStyle) const
+bool RenderTheme::isControlStyled(const RenderStyle* style, const CachedUAStyle* uaStyle) const
{
+ ASSERT(uaStyle);
+
switch (style->appearance()) {
case PushButtonPart:
case SquareButtonPart:
case ContinuousCapacityLevelIndicatorPart:
case DiscreteCapacityLevelIndicatorPart:
case RatingLevelIndicatorPart:
- return isBackgroundOrBorderStyled(*style, uaStyle);
+ return isBackgroundOrBorderStyled(*style, *uaStyle);
- case ListboxPart:
case MenulistPart:
case SearchFieldPart:
case TextAreaPart:
case TextFieldPart:
- return isBackgroundOrBorderStyled(*style, uaStyle) || style->boxShadow();
+ return isBackgroundOrBorderStyled(*style, *uaStyle) || style->boxShadow();
case SliderHorizontalPart:
case SliderVerticalPart:
}
}
-void RenderTheme::adjustRepaintRect(const RenderObject* o, IntRect& r)
+void RenderTheme::adjustPaintInvalidationRect(const RenderObject* o, IntRect& r)
{
#if USE(NEW_THEME)
m_platformTheme->inflateControlPaintRect(o->style()->appearance(), controlStatesForRenderer(o), r, o->style()->effectiveZoom());
-#else
- UNUSED_PARAM(o);
- UNUSED_PARAM(r);
#endif
}
{
if (supportsFocusRing(renderer->style()))
return false;
- if (!renderer->style()->hasAppearance())
- return true;
Node* node = renderer->node();
if (!node)
return true;
+ if (!renderer->style()->hasAppearance() && !node->isLink())
+ return true;
// We can't use RenderTheme::isFocused because outline:auto might be
// specified to non-:focus rulesets.
if (node->focused() && !node->shouldHaveFocusAppearance())
bool RenderTheme::stateChanged(RenderObject* o, ControlState state) const
{
// Default implementation assumes the controls don't respond to changes in :hover state
- if (state == HoverState && !supportsHover(o->style()))
+ if (state == HoverControlState && !supportsHover(o->style()))
return false;
// Assume pressed state is only responded to if the control is enabled.
- if (state == PressedState && !isEnabled(o))
+ if (state == PressedControlState && !isEnabled(o))
return false;
- // Repaint the control.
- o->repaint();
+ o->setShouldDoFullPaintInvalidation();
return true;
}
{
ControlStates result = 0;
if (isHovered(o)) {
- result |= HoverState;
+ result |= HoverControlState;
if (isSpinUpButtonPartHovered(o))
- result |= SpinUpState;
+ result |= SpinUpControlState;
}
if (isPressed(o)) {
- result |= PressedState;
+ result |= PressedControlState;
if (isSpinUpButtonPartPressed(o))
- result |= SpinUpState;
+ result |= SpinUpControlState;
}
if (isFocused(o) && o->style()->outlineStyleIsAuto())
- result |= FocusState;
+ result |= FocusControlState;
if (isEnabled(o))
- result |= EnabledState;
+ result |= EnabledControlState;
if (isChecked(o))
- result |= CheckedState;
+ result |= CheckedControlState;
if (isReadOnlyControl(o))
- result |= ReadOnlyState;
+ result |= ReadOnlyControlState;
if (!isActive(o))
- result |= WindowInactiveState;
+ result |= WindowInactiveControlState;
if (isIndeterminate(o))
- result |= IndeterminateState;
+ result |= IndeterminateControlState;
return result;
}
bool RenderTheme::isChecked(const RenderObject* o) const
{
- if (!o->node() || !o->node()->hasTagName(inputTag))
+ if (!isHTMLInputElement(o->node()))
return false;
return toHTMLInputElement(o->node())->shouldAppearChecked();
}
bool RenderTheme::isIndeterminate(const RenderObject* o) const
{
- if (!o->node() || !o->node()->hasTagName(inputTag))
+ if (!isHTMLInputElement(o->node()))
return false;
return toHTMLInputElement(o->node())->shouldAppearIndeterminate();
}
node = node->focusDelegate();
Document& document = node->document();
- Frame* frame = document.frame();
- return node == document.focusedElement() && node->shouldHaveFocusAppearance() && frame && frame->selection().isFocusedAndActive();
+ LocalFrame* frame = document.frame();
+ return node == document.focusedElement() && node->focused() && node->shouldHaveFocusAppearance() && frame && frame->selection().isFocusedAndActive();
}
bool RenderTheme::isPressed(const RenderObject* o) const
bool RenderTheme::isReadOnlyControl(const RenderObject* o) const
{
Node* node = o->node();
- if (!node || !node->isElementNode())
+ if (!node || !node->isElementNode() || !toElement(node)->isFormControlElement())
return false;
- return toElement(node)->matchesReadOnlyPseudoClass();
+ HTMLFormControlElement* element = toHTMLFormControlElement(node);
+ return element->isReadOnly();
}
bool RenderTheme::isHovered(const RenderObject* o) const
{
}
-#if ENABLE(INPUT_SPEECH)
-void RenderTheme::adjustInputFieldSpeechButtonStyle(RenderStyle* style, Element* element) const
-{
- RenderInputSpeech::adjustInputFieldSpeechButtonStyle(style, element);
-}
-
-bool RenderTheme::paintInputFieldSpeechButton(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
-{
- return RenderInputSpeech::paintInputFieldSpeechButton(object, paintInfo, rect);
-}
-#endif
-
IntSize RenderTheme::meterSizeForBounds(const RenderMeter*, const IntRect& bounds) const
{
return bounds.size();
void RenderTheme::paintSliderTicks(RenderObject* o, const PaintInfo& paintInfo, const IntRect& rect)
{
Node* node = o->node();
- if (!node || !node->hasTagName(inputTag))
+ if (!isHTMLInputElement(node))
return;
HTMLInputElement* input = toHTMLInputElement(node);
+ if (input->type() != InputTypeNames::range)
+ return;
+
HTMLDataListElement* dataList = input->dataList();
if (!dataList)
return;
tickRegionSideMargin = trackBounds.y() + (thumbSize.width() - tickSize.width() * zoomFactor) / 2.0;
tickRegionWidth = trackBounds.height() - thumbSize.width();
}
- RefPtr<HTMLCollection> options = dataList->options();
- GraphicsContextStateSaver stateSaver(*paintInfo.context);
- paintInfo.context->setFillColor(o->resolveColor(CSSPropertyColor));
- for (unsigned i = 0; Node* node = options->item(i); i++) {
- ASSERT(node->hasTagName(optionTag));
- HTMLOptionElement* optionElement = toHTMLOptionElement(node);
+ RefPtrWillBeRawPtr<HTMLDataListOptionsCollection> options = dataList->options();
+ for (unsigned i = 0; HTMLOptionElement* optionElement = options->item(i); i++) {
String value = optionElement->value();
if (!input->isValidValue(value))
continue;
tickRect.setX(tickPosition);
else
tickRect.setY(tickPosition);
- paintInfo.context->fillRect(tickRect);
+ paintInfo.context->fillRect(tickRect, o->resolveColor(CSSPropertyColor));
}
}
bool RenderTheme::shouldHaveSpinButton(HTMLInputElement* inputElement) const
{
- return inputElement->isSteppable() && !inputElement->isRangeControl();
+ return inputElement->isSteppable() && inputElement->type() != InputTypeNames::range;
}
void RenderTheme::adjustMenuListButtonStyle(RenderStyle*, Element*) const
void RenderTheme::platformColorsDidChange()
{
- m_activeSelectionForegroundColor = Color();
- m_inactiveSelectionForegroundColor = Color();
- m_activeSelectionBackgroundColor = Color();
- m_inactiveSelectionBackgroundColor = Color();
+ Page::scheduleForcedStyleRecalcForAllPages();
+}
+
+static FontDescription& getCachedFontDescription(CSSValueID systemFontID)
+{
+ DEFINE_STATIC_LOCAL(FontDescription, caption, ());
+ DEFINE_STATIC_LOCAL(FontDescription, icon, ());
+ DEFINE_STATIC_LOCAL(FontDescription, menu, ());
+ DEFINE_STATIC_LOCAL(FontDescription, messageBox, ());
+ DEFINE_STATIC_LOCAL(FontDescription, smallCaption, ());
+ DEFINE_STATIC_LOCAL(FontDescription, statusBar, ());
+ DEFINE_STATIC_LOCAL(FontDescription, webkitMiniControl, ());
+ DEFINE_STATIC_LOCAL(FontDescription, webkitSmallControl, ());
+ DEFINE_STATIC_LOCAL(FontDescription, webkitControl, ());
+ DEFINE_STATIC_LOCAL(FontDescription, defaultDescription, ());
+ switch (systemFontID) {
+ case CSSValueCaption:
+ return caption;
+ case CSSValueIcon:
+ return icon;
+ case CSSValueMenu:
+ return menu;
+ case CSSValueMessageBox:
+ return messageBox;
+ case CSSValueSmallCaption:
+ return smallCaption;
+ case CSSValueStatusBar:
+ return statusBar;
+ case CSSValueWebkitMiniControl:
+ return webkitMiniControl;
+ case CSSValueWebkitSmallControl:
+ return webkitSmallControl;
+ case CSSValueWebkitControl:
+ return webkitControl;
+ case CSSValueNone:
+ return defaultDescription;
+ default:
+ ASSERT_NOT_REACHED();
+ return defaultDescription;
+ }
+}
- m_activeListBoxSelectionForegroundColor = Color();
- m_inactiveListBoxSelectionForegroundColor = Color();
- m_activeListBoxSelectionBackgroundColor = Color();
- m_inactiveListBoxSelectionForegroundColor = Color();
+void RenderTheme::systemFont(CSSValueID systemFontID, FontDescription& fontDescription)
+{
+ fontDescription = getCachedFontDescription(systemFontID);
+ if (fontDescription.isAbsoluteSize())
+ return;
- Page::scheduleForcedStyleRecalcForAllPages();
+ FontStyle fontStyle = FontStyleNormal;
+ FontWeight fontWeight = FontWeightNormal;
+ float fontSize = 0;
+ AtomicString fontFamily;
+ systemFont(systemFontID, fontStyle, fontWeight, fontSize, fontFamily);
+ fontDescription.setStyle(fontStyle);
+ fontDescription.setWeight(fontWeight);
+ fontDescription.setSpecifiedSize(fontSize);
+ fontDescription.setIsAbsoluteSize(true);
+ fontDescription.firstFamily().setFamily(fontFamily);
+ fontDescription.setGenericFamily(FontDescription::NoFamily);
}
Color RenderTheme::systemColor(CSSValueID cssValueId) const
default:
break;
}
+ ASSERT_NOT_REACHED();
return Color();
}
void RenderTheme::setCustomFocusRingColor(const Color& c)
{
- customFocusRingColor() = c;
+ m_customFocusRingColor = c;
+ m_hasCustomFocusRingColor = true;
}
-Color RenderTheme::focusRingColor()
+Color RenderTheme::focusRingColor() const
{
- return customFocusRingColor().isValid() ? customFocusRingColor() : theme().platformFocusRingColor();
+ return m_hasCustomFocusRingColor ? m_customFocusRingColor : theme().platformFocusRingColor();
}
String RenderTheme::fileListNameForWidth(Locale& locale, const FileList* fileList, const Font& font, int width) const
String string;
if (fileList->isEmpty()) {
- string = locale.queryString(WebKit::WebLocalizedString::FileButtonNoFileSelectedLabel);
+ string = locale.queryString(WebLocalizedString::FileButtonNoFileSelectedLabel);
} else if (fileList->length() == 1) {
string = fileList->item(0)->name();
} else {
// FIXME: Localization of fileList->length().
- return StringTruncator::rightTruncate(locale.queryString(WebKit::WebLocalizedString::MultipleFileUploadText, String::number(fileList->length())), width, font, StringTruncator::EnableRoundingHacks);
+ return StringTruncator::rightTruncate(locale.queryString(WebLocalizedString::MultipleFileUploadText, String::number(fileList->length())), width, font);
}
- return StringTruncator::centerTruncate(string, width, font, StringTruncator::EnableRoundingHacks);
+ return StringTruncator::centerTruncate(string, width, font);
}
bool RenderTheme::shouldOpenPickerWithF4Key() const
return false;
}
-bool RenderTheme::supportsDataListUI(const AtomicString& type) const
-{
- return type == InputTypeNames::text() || type == InputTypeNames::search() || type == InputTypeNames::url()
- || type == InputTypeNames::telephone() || type == InputTypeNames::email() || type == InputTypeNames::number()
- || type == InputTypeNames::color()
- || type == InputTypeNames::date()
- || type == InputTypeNames::datetime()
- || type == InputTypeNames::datetimelocal()
- || type == InputTypeNames::month()
- || type == InputTypeNames::week()
- || type == InputTypeNames::time()
- || type == InputTypeNames::range();
-}
-
#if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
bool RenderTheme::supportsCalendarPicker(const AtomicString& type) const
{
- return type == InputTypeNames::date()
- || type == InputTypeNames::datetime()
- || type == InputTypeNames::datetimelocal()
- || type == InputTypeNames::month()
- || type == InputTypeNames::week();
+ return type == InputTypeNames::date
+ || type == InputTypeNames::datetime
+ || type == InputTypeNames::datetime_local
+ || type == InputTypeNames::month
+ || type == InputTypeNames::week;
}
#endif
bool RenderTheme::paintCheckboxUsingFallbackTheme(RenderObject* o, const PaintInfo& i, const IntRect& r)
{
- WebKit::WebFallbackThemeEngine::ExtraParams extraParams;
- WebKit::WebCanvas* canvas = i.context->canvas();
+ WebFallbackThemeEngine::ExtraParams extraParams;
+ WebCanvas* canvas = i.context->canvas();
extraParams.button.checked = isChecked(o);
extraParams.button.indeterminate = isIndeterminate(o);
unzoomedRect.setWidth(unzoomedRect.width() / zoomLevel);
unzoomedRect.setHeight(unzoomedRect.height() / zoomLevel);
i.context->translate(unzoomedRect.x(), unzoomedRect.y());
- i.context->scale(FloatSize(zoomLevel, zoomLevel));
+ i.context->scale(zoomLevel, zoomLevel);
i.context->translate(-unzoomedRect.x(), -unzoomedRect.y());
}
- WebKit::Platform::current()->fallbackThemeEngine()->paint(canvas, WebKit::WebFallbackThemeEngine::PartCheckbox, getWebFallbackThemeState(this, o), WebKit::WebRect(unzoomedRect), &extraParams);
+ Platform::current()->fallbackThemeEngine()->paint(canvas, WebFallbackThemeEngine::PartCheckbox, getWebFallbackThemeState(this, o), WebRect(unzoomedRect), &extraParams);
return false;
}
if (!style->width().isIntrinsicOrAuto() && !style->height().isAuto())
return;
- IntSize size = WebKit::Platform::current()->fallbackThemeEngine()->getSize(WebKit::WebFallbackThemeEngine::PartCheckbox);
+ IntSize size = Platform::current()->fallbackThemeEngine()->getSize(WebFallbackThemeEngine::PartCheckbox);
float zoomLevel = style->effectiveZoom();
size.setWidth(size.width() * zoomLevel);
size.setHeight(size.height() * zoomLevel);
bool RenderTheme::paintRadioUsingFallbackTheme(RenderObject* o, const PaintInfo& i, const IntRect& r)
{
- WebKit::WebFallbackThemeEngine::ExtraParams extraParams;
- WebKit::WebCanvas* canvas = i.context->canvas();
+ WebFallbackThemeEngine::ExtraParams extraParams;
+ WebCanvas* canvas = i.context->canvas();
extraParams.button.checked = isChecked(o);
extraParams.button.indeterminate = isIndeterminate(o);
unzoomedRect.setWidth(unzoomedRect.width() / zoomLevel);
unzoomedRect.setHeight(unzoomedRect.height() / zoomLevel);
i.context->translate(unzoomedRect.x(), unzoomedRect.y());
- i.context->scale(FloatSize(zoomLevel, zoomLevel));
+ i.context->scale(zoomLevel, zoomLevel);
i.context->translate(-unzoomedRect.x(), -unzoomedRect.y());
}
- WebKit::Platform::current()->fallbackThemeEngine()->paint(canvas, WebKit::WebFallbackThemeEngine::PartRadio, getWebFallbackThemeState(this, o), WebKit::WebRect(unzoomedRect), &extraParams);
+ Platform::current()->fallbackThemeEngine()->paint(canvas, WebFallbackThemeEngine::PartRadio, getWebFallbackThemeState(this, o), WebRect(unzoomedRect), &extraParams);
return false;
}
if (!style->width().isIntrinsicOrAuto() && !style->height().isAuto())
return;
- IntSize size = WebKit::Platform::current()->fallbackThemeEngine()->getSize(WebKit::WebFallbackThemeEngine::PartRadio);
+ IntSize size = Platform::current()->fallbackThemeEngine()->getSize(WebFallbackThemeEngine::PartRadio);
float zoomLevel = style->effectiveZoom();
size.setWidth(size.width() * zoomLevel);
size.setHeight(size.height() * zoomLevel);
style->resetBorder();
}
-} // namespace WebCore
+} // namespace blink