From 439d978ea52318bad67ff9097fa4551f1f14ece5 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Fri, 8 Oct 2021 17:02:47 +0100 Subject: [PATCH] LibWeb: Make style-rule iteration aware of CSSMediaRule The logic is handled by `CSSGroupingRule` and `CSSConditionRule`, so `CSSMediaRule` only has to report if its condition matches. Right now, that condition is always false because we do not evaluate the media query. --- .../Libraries/LibWeb/CSS/CSSConditionRule.cpp | 14 ++++++++++++++ .../Libraries/LibWeb/CSS/CSSConditionRule.h | 4 ++++ .../Libraries/LibWeb/CSS/CSSGroupingRule.cpp | 10 ++++++++++ .../Libraries/LibWeb/CSS/CSSGroupingRule.h | 4 ++++ Userland/Libraries/LibWeb/CSS/CSSMediaRule.h | 2 ++ Userland/Libraries/LibWeb/CSS/CSSRuleList.cpp | 18 +++++++++++++++--- 6 files changed, 49 insertions(+), 3 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/CSSConditionRule.cpp b/Userland/Libraries/LibWeb/CSS/CSSConditionRule.cpp index eb2a3716cb..35b16b5dd7 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSConditionRule.cpp +++ b/Userland/Libraries/LibWeb/CSS/CSSConditionRule.cpp @@ -17,4 +17,18 @@ CSSConditionRule::~CSSConditionRule() { } +void CSSConditionRule::for_each_effective_style_rule(Function const& callback) const +{ + if (condition_matches()) + CSSGroupingRule::for_each_effective_style_rule(callback); +} + +bool CSSConditionRule::for_first_not_loaded_import_rule(Function const& callback) +{ + if (condition_matches()) + return CSSGroupingRule::for_first_not_loaded_import_rule(callback); + + return false; +} + } diff --git a/Userland/Libraries/LibWeb/CSS/CSSConditionRule.h b/Userland/Libraries/LibWeb/CSS/CSSConditionRule.h index 7fb5b55caa..adca7a46cb 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSConditionRule.h +++ b/Userland/Libraries/LibWeb/CSS/CSSConditionRule.h @@ -21,6 +21,10 @@ public: virtual String condition_text() const = 0; virtual void set_condition_text(String) = 0; + virtual bool condition_matches() const = 0; + + virtual void for_each_effective_style_rule(Function const& callback) const override; + virtual bool for_first_not_loaded_import_rule(Function const& callback) override; protected: explicit CSSConditionRule(NonnullRefPtrVector&&); diff --git a/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.cpp b/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.cpp index 56f30ba847..fb771b6c35 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.cpp +++ b/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.cpp @@ -36,4 +36,14 @@ String CSSGroupingRule::serialized() const TODO(); } +void CSSGroupingRule::for_each_effective_style_rule(Function const& callback) const +{ + m_rules->for_each_effective_style_rule(callback); +} + +bool CSSGroupingRule::for_first_not_loaded_import_rule(Function const& callback) +{ + return m_rules->for_first_not_loaded_import_rule(callback); +} + } diff --git a/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h b/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h index d8c2398caf..cee8386bfe 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h +++ b/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h @@ -6,6 +6,7 @@ #pragma once +#include #include #include #include @@ -24,6 +25,9 @@ public: size_t insert_rule(StringView const& rule, size_t index = 0); void delete_rule(size_t index); + virtual void for_each_effective_style_rule(Function const& callback) const; + virtual bool for_first_not_loaded_import_rule(Function const& callback); + virtual String serialized() const; protected: diff --git a/Userland/Libraries/LibWeb/CSS/CSSMediaRule.h b/Userland/Libraries/LibWeb/CSS/CSSMediaRule.h index b856e9a03d..4c02dfc08e 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSMediaRule.h +++ b/Userland/Libraries/LibWeb/CSS/CSSMediaRule.h @@ -30,6 +30,8 @@ public: virtual String condition_text() const override; virtual void set_condition_text(String) override; + // FIXME: We need to evaluate() the query before matches() will work! + virtual bool condition_matches() const override { return m_media->matches(); } NonnullRefPtr const& media() const { return m_media; } diff --git a/Userland/Libraries/LibWeb/CSS/CSSRuleList.cpp b/Userland/Libraries/LibWeb/CSS/CSSRuleList.cpp index ebb810806f..92f02249d5 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSRuleList.cpp +++ b/Userland/Libraries/LibWeb/CSS/CSSRuleList.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -79,12 +80,21 @@ DOM::ExceptionOr CSSRuleList::remove_a_css_rule(u32 index) void CSSRuleList::for_each_effective_style_rule(Function const& callback) const { for (auto& rule : m_rules) { - if (rule.type() == CSSRule::Type::Style) { + switch (rule.type()) { + case CSSRule::Type::Style: callback(verify_cast(rule)); - } else if (rule.type() == CSSRule::Type::Import) { - const auto& import_rule = verify_cast(rule); + break; + case CSSRule::Type::Import: { + auto const& import_rule = verify_cast(rule); if (import_rule.has_import_result()) import_rule.loaded_style_sheet()->for_each_effective_style_rule(callback); + break; + } + case CSSRule::Type::Media: + verify_cast(rule).for_each_effective_style_rule(callback); + break; + case CSSRule::Type::__Count: + VERIFY_NOT_REACHED(); } } } @@ -102,6 +112,8 @@ bool CSSRuleList::for_first_not_loaded_import_rule(Functionfor_first_not_loaded_import_rule(callback)) { return true; } + } else if (rule.type() == CSSRule::Type::Media) { + return verify_cast(rule).for_first_not_loaded_import_rule(callback); } }