blob: 0a9dab2cd79dd6aae4e296e221f5ed166886db9c [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/core/css/style_color.h"
#include "third_party/blink/renderer/core/layout/layout_theme.h"
#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
namespace blink {
Color StyleColor::Resolve(Color current_color,
mojom::blink::ColorScheme color_scheme,
bool is_forced_color) const {
if (IsCurrentColor())
return current_color;
if (EffectiveColorKeyword() != CSSValueID::kInvalid ||
(is_forced_color && IsSystemColor()))
return ColorFromKeyword(color_keyword_, color_scheme);
return color_;
}
Color StyleColor::ResolveWithAlpha(Color current_color,
mojom::blink::ColorScheme color_scheme,
int alpha,
bool is_forced_color) const {
Color color = Resolve(current_color, color_scheme, is_forced_color);
return Color(color.Red(), color.Green(), color.Blue(), alpha);
}
Color StyleColor::ColorFromKeyword(CSSValueID keyword,
mojom::blink::ColorScheme color_scheme) {
if (const char* value_name = getValueName(keyword)) {
if (const NamedColor* named_color =
FindColor(value_name, static_cast<wtf_size_t>(strlen(value_name))))
return Color(named_color->argb_value);
}
return LayoutTheme::GetTheme().SystemColor(keyword, color_scheme);
}
bool StyleColor::IsColorKeyword(CSSValueID id) {
// Named colors and color keywords:
//
// <named-color>
// 'aqua', 'black', 'blue', ..., 'yellow' (CSS3: "basic color keywords")
// 'aliceblue', ..., 'yellowgreen' (CSS3: "extended color keywords")
// 'transparent'
//
// 'currentcolor'
//
// <deprecated-system-color>
// 'ActiveBorder', ..., 'WindowText'
//
// WebKit proprietary/internal:
// '-webkit-link'
// '-webkit-activelink'
// '-internal-active-list-box-selection'
// '-internal-active-list-box-selection-text'
// '-internal-inactive-list-box-selection'
// '-internal-inactive-list-box-selection-text'
// '-webkit-focus-ring-color'
// '-internal-quirk-inherit'
//
return (id >= CSSValueID::kAqua && id <= CSSValueID::kInternalQuirkInherit) ||
(id >= CSSValueID::kAliceblue && id <= CSSValueID::kYellowgreen) ||
id == CSSValueID::kMenu;
}
bool StyleColor::IsSystemColor(CSSValueID id) {
return (id >= CSSValueID::kActiveborder && id <= CSSValueID::kWindowtext) ||
id == CSSValueID::kMenu;
}
CSSValueID StyleColor::EffectiveColorKeyword() const {
if (!RuntimeEnabledFeatures::CSSSystemColorComputeToSelfEnabled()) {
return IsSystemColor(color_keyword_) ? CSSValueID::kInvalid
: color_keyword_;
}
return color_keyword_;
}
} // namespace blink