1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 15:48:12 +00:00

LibHTML: Respect the link color set via <body link>

The default style for "a" tags now has { color: -libhtml-link; }.
We implement this vendor-specific property by querying the containing
document for the appropriate link color.

Currently we only use the basic link color, but in the future this can
be extended to remember visited links, etc.
This commit is contained in:
Andreas Kling 2019-10-06 10:25:08 +02:00
parent 83a6474d82
commit 847072c2b1
9 changed files with 68 additions and 13 deletions

View file

@ -86,7 +86,7 @@ li {
}
a {
color: #0000ff;
color: -libhtml-link;
text-decoration: underline;
}

View file

@ -29,12 +29,10 @@ String StyleProperties::string_or_fallback(const StringView& property_name, cons
return value.value()->to_string();
}
Color StyleProperties::color_or_fallback(const StringView& property_name, Color fallback) const
Color StyleProperties::color_or_fallback(const StringView& property_name, const Document& document, Color fallback) const
{
auto value = property(property_name);
if (!value.has_value())
return fallback;
if (value.value()->type() != StyleValue::Type::Color)
return fallback;
return static_cast<ColorStyleValue&>(*value.value()).color();
return value.value()->to_color(document);
}

View file

@ -22,7 +22,7 @@ public:
Length length_or_fallback(const StringView& property_name, const Length& fallback) const;
String string_or_fallback(const StringView& property_name, const StringView& fallback) const;
Color color_or_fallback(const StringView& property_name, Color fallback) const;
Color color_or_fallback(const StringView& property_name, const Document&, Color fallback) const;
private:
HashMap<String, NonnullRefPtr<StyleValue>> m_property_values;

View file

@ -1,4 +1,5 @@
#include "StyleValue.h"
#include <LibHTML/CSS/StyleValue.h>
#include <LibHTML/DOM/Document.h>
StyleValue::StyleValue(Type type)
: m_type(type)
@ -8,3 +9,22 @@ StyleValue::StyleValue(Type type)
StyleValue::~StyleValue()
{
}
String IdentifierStyleValue::to_string() const
{
switch (id()) {
case CSS::ValueID::Invalid:
return "(invalid)";
case CSS::ValueID::VendorSpecificLink:
return "-libhtml-link";
default:
ASSERT_NOT_REACHED();
}
}
Color IdentifierStyleValue::to_color(const Document& document) const
{
if (id() == CSS::ValueID::VendorSpecificLink)
return document.link_color();
return {};
}

View file

@ -7,6 +7,15 @@
#include <LibDraw/Color.h>
#include <LibHTML/CSS/Length.h>
class Document;
namespace CSS {
enum class ValueID {
Invalid,
VendorSpecificLink,
};
}
class StyleValue : public RefCounted<StyleValue> {
public:
virtual ~StyleValue();
@ -18,6 +27,7 @@ public:
String,
Length,
Color,
Identifier,
};
Type type() const { return m_type; }
@ -25,10 +35,11 @@ public:
bool is_inherit() const { return type() == Type::Inherit; }
bool is_initial() const { return type() == Type::Initial; }
bool is_color() const { return type() == Type::Color; }
bool is_identifier() const { return type() == Type::Identifier; }
virtual String to_string() const = 0;
virtual Length to_length() const { return {}; }
virtual Color to_color() const { return {}; }
virtual Color to_color(const Document&) const { return {}; }
virtual bool is_auto() const { return false; }
@ -122,7 +133,7 @@ public:
Color color() const { return m_color; }
String to_string() const override { return m_color.to_string(); }
Color to_color() const override { return m_color; }
Color to_color(const Document&) const override { return m_color; }
private:
explicit ColorStyleValue(Color color)
@ -133,3 +144,26 @@ private:
Color m_color;
};
class IdentifierStyleValue final : public StyleValue {
public:
static NonnullRefPtr<IdentifierStyleValue> create(CSS::ValueID id)
{
return adopt(*new IdentifierStyleValue(id));
}
virtual ~IdentifierStyleValue() override {}
CSS::ValueID id() const { return m_id; }
virtual String to_string() const override;
virtual Color to_color(const Document&) const override;
private:
explicit IdentifierStyleValue(CSS::ValueID id)
: StyleValue(Type::Identifier)
, m_id(id)
{
}
CSS::ValueID m_id { CSS::ValueID::Invalid };
};