mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 18:37:35 +00:00
LibWeb: Implement and use TextDecorationStyleValue
Modified text-decoration.html to better test that the values can be in any order, and that it adopts the color from the `color` property if no decoration color is specified. Right now, it always does because we do not support a different decoration color. Later, we need to support the `currentcolor` special CSS value for this purpose.
This commit is contained in:
parent
0e15561df0
commit
44a082391b
5 changed files with 132 additions and 90 deletions
|
@ -336,40 +336,6 @@ static inline bool is_line_width(StyleValue const& value)
|
|||
}
|
||||
}
|
||||
|
||||
static inline bool is_text_decoration_line(StyleValue const& value)
|
||||
{
|
||||
if (value.is_builtin_or_dynamic())
|
||||
return true;
|
||||
|
||||
switch (value.to_identifier()) {
|
||||
case ValueID::None:
|
||||
case ValueID::Underline:
|
||||
case ValueID::Overline:
|
||||
case ValueID::LineThrough:
|
||||
case ValueID::Blink:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static inline bool is_text_decoration_style(StyleValue const& value)
|
||||
{
|
||||
if (value.is_builtin_or_dynamic())
|
||||
return true;
|
||||
|
||||
switch (value.to_identifier()) {
|
||||
case ValueID::Solid:
|
||||
case ValueID::Double:
|
||||
case ValueID::Dotted:
|
||||
case ValueID::Dashed:
|
||||
case ValueID::Wavy:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static void set_property_expanding_shorthands(StyleProperties& style, CSS::PropertyID property_id, StyleValue const& value, DOM::Document& document, bool is_internally_generated_pseudo_property = false)
|
||||
{
|
||||
CSS::ParsingContext context(document);
|
||||
|
@ -404,63 +370,19 @@ static void set_property_expanding_shorthands(StyleProperties& style, CSS::Prope
|
|||
};
|
||||
|
||||
if (property_id == CSS::PropertyID::TextDecoration) {
|
||||
if (value.is_color()) {
|
||||
if (value.is_text_decoration()) {
|
||||
auto& text_decoration = static_cast<TextDecorationStyleValue const&>(value);
|
||||
style.set_property(CSS::PropertyID::TextDecorationLine, text_decoration.line());
|
||||
style.set_property(CSS::PropertyID::TextDecorationStyle, text_decoration.style());
|
||||
style.set_property(CSS::PropertyID::TextDecorationColor, text_decoration.color());
|
||||
return;
|
||||
}
|
||||
if (value.is_builtin()) {
|
||||
style.set_property(CSS::PropertyID::TextDecorationLine, value);
|
||||
style.set_property(CSS::PropertyID::TextDecorationStyle, value);
|
||||
style.set_property(CSS::PropertyID::TextDecorationColor, value);
|
||||
return;
|
||||
}
|
||||
if (is_text_decoration_line(value)) {
|
||||
style.set_property(CSS::PropertyID::TextDecorationLine, value);
|
||||
return;
|
||||
}
|
||||
if (is_text_decoration_style(value)) {
|
||||
style.set_property(CSS::PropertyID::TextDecorationStyle, value);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value.is_component_value_list()) {
|
||||
auto& parts = static_cast<CSS::ValueListStyleValue const&>(value).values();
|
||||
if (!parts.is_empty() && parts.size() <= 3) {
|
||||
RefPtr<StyleValue> color_value;
|
||||
RefPtr<StyleValue> line_value;
|
||||
RefPtr<StyleValue> style_value;
|
||||
|
||||
for (auto& part : parts) {
|
||||
auto value = Parser::parse_css_value(context, property_id, part);
|
||||
if (!value)
|
||||
return;
|
||||
|
||||
if (value->is_color()) {
|
||||
if (color_value)
|
||||
return;
|
||||
color_value = move(value);
|
||||
continue;
|
||||
}
|
||||
if (is_text_decoration_line(*value)) {
|
||||
if (line_value)
|
||||
return;
|
||||
line_value = move(value);
|
||||
continue;
|
||||
}
|
||||
if (is_text_decoration_style(*value)) {
|
||||
if (style_value)
|
||||
return;
|
||||
style_value = move(value);
|
||||
continue;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (color_value)
|
||||
style.set_property(CSS::PropertyID::TextDecorationColor, *color_value);
|
||||
if (line_value)
|
||||
style.set_property(CSS::PropertyID::TextDecorationLine, *line_value);
|
||||
if (style_value)
|
||||
style.set_property(CSS::PropertyID::TextDecorationStyle, *style_value);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue