diff options
-rw-r--r-- | src/libserver/css/css_property.hxx | 4 | ||||
-rw-r--r-- | src/libserver/css/css_rule.cxx | 14 | ||||
-rw-r--r-- | src/libserver/css/css_rule.hxx | 10 |
3 files changed, 26 insertions, 2 deletions
diff --git a/src/libserver/css/css_property.hxx b/src/libserver/css/css_property.hxx index 82ef9808c..0e17e39fe 100644 --- a/src/libserver/css/css_property.hxx +++ b/src/libserver/css/css_property.hxx @@ -126,6 +126,10 @@ struct alignas(int) css_property { return type == css_property_type::PROPERTY_DISPLAY; } + auto is_visibility(void) const -> bool { + return type == css_property_type::PROPERTY_VISIBILITY; + } + auto operator==(const css_property &other) const { return type == other.type; } }; diff --git a/src/libserver/css/css_rule.cxx b/src/libserver/css/css_rule.cxx index 238998009..2e84aaa1c 100644 --- a/src/libserver/css/css_rule.cxx +++ b/src/libserver/css/css_rule.cxx @@ -180,6 +180,16 @@ allowed_property_value(const css_property &prop, const css_consumed_block &parse } } } + if (prop.is_visibility()) { + if (parser_block.is_token()) { + /* A single token */ + const auto &tok = parser_block.get_token_or_empty(); + + if (tok.type == css_parser_token::token_type::ident_token) { + return css_value::maybe_display_from_string(tok.get_string_or_default("")); + } + } + } if (prop.is_normal_number()) { if (parser_block.is_token()) { /* A single token */ @@ -369,10 +379,12 @@ css_declarations_block::merge_block(const css_declarations_block &other, merge_t } } -void css_rule::add_value(const css_value &value) { +void css_rule::add_value(const css_value &value) +{ values.push_back(value); } + TEST_SUITE("css rules") { TEST_CASE("simple css rules") { const std::vector<std::pair<const char *, std::vector<css_property>>> cases{ diff --git a/src/libserver/css/css_rule.hxx b/src/libserver/css/css_rule.hxx index 113402905..3353382e7 100644 --- a/src/libserver/css/css_rule.hxx +++ b/src/libserver/css/css_rule.hxx @@ -76,7 +76,9 @@ public: namespace rspamd::css { - +/** + * Class that is designed to hold css declaration (a set of rules) + */ class css_declarations_block { public: using rule_shared_ptr = std::shared_ptr<css_rule>; @@ -96,9 +98,15 @@ public: return rules; } + /** + * Returns if a declaration block has some property + * @param prop + * @return + */ auto has_property(const css_property &prop) const -> bool { return (rules.find(css_rule{prop}) != rules.end()); } + private: robin_hood::unordered_flat_set<rule_shared_ptr, rule_shared_hash, rule_shared_eq> rules; }; |