Browse Source

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.
Sam Atkins 3 năm trước cách đây
mục cha
commit
439d978ea5

+ 14 - 0
Userland/Libraries/LibWeb/CSS/CSSConditionRule.cpp

@@ -17,4 +17,18 @@ CSSConditionRule::~CSSConditionRule()
 {
 {
 }
 }
 
 
+void CSSConditionRule::for_each_effective_style_rule(Function<void(CSSStyleRule const&)> const& callback) const
+{
+    if (condition_matches())
+        CSSGroupingRule::for_each_effective_style_rule(callback);
+}
+
+bool CSSConditionRule::for_first_not_loaded_import_rule(Function<void(CSSImportRule&)> const& callback)
+{
+    if (condition_matches())
+        return CSSGroupingRule::for_first_not_loaded_import_rule(callback);
+
+    return false;
+}
+
 }
 }

+ 4 - 0
Userland/Libraries/LibWeb/CSS/CSSConditionRule.h

@@ -21,6 +21,10 @@ public:
 
 
     virtual String condition_text() const = 0;
     virtual String condition_text() const = 0;
     virtual void set_condition_text(String) = 0;
     virtual void set_condition_text(String) = 0;
+    virtual bool condition_matches() const = 0;
+
+    virtual void for_each_effective_style_rule(Function<void(CSSStyleRule const&)> const& callback) const override;
+    virtual bool for_first_not_loaded_import_rule(Function<void(CSSImportRule&)> const& callback) override;
 
 
 protected:
 protected:
     explicit CSSConditionRule(NonnullRefPtrVector<CSSRule>&&);
     explicit CSSConditionRule(NonnullRefPtrVector<CSSRule>&&);

+ 10 - 0
Userland/Libraries/LibWeb/CSS/CSSGroupingRule.cpp

@@ -36,4 +36,14 @@ String CSSGroupingRule::serialized() const
     TODO();
     TODO();
 }
 }
 
 
+void CSSGroupingRule::for_each_effective_style_rule(Function<void(CSSStyleRule const&)> const& callback) const
+{
+    m_rules->for_each_effective_style_rule(callback);
+}
+
+bool CSSGroupingRule::for_first_not_loaded_import_rule(Function<void(CSSImportRule&)> const& callback)
+{
+    return m_rules->for_first_not_loaded_import_rule(callback);
+}
+
 }
 }

+ 4 - 0
Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h

@@ -6,6 +6,7 @@
 
 
 #pragma once
 #pragma once
 
 
+#include <AK/Function.h>
 #include <AK/NonnullRefPtr.h>
 #include <AK/NonnullRefPtr.h>
 #include <LibWeb/CSS/CSSRule.h>
 #include <LibWeb/CSS/CSSRule.h>
 #include <LibWeb/CSS/CSSRuleList.h>
 #include <LibWeb/CSS/CSSRuleList.h>
@@ -24,6 +25,9 @@ public:
     size_t insert_rule(StringView const& rule, size_t index = 0);
     size_t insert_rule(StringView const& rule, size_t index = 0);
     void delete_rule(size_t index);
     void delete_rule(size_t index);
 
 
+    virtual void for_each_effective_style_rule(Function<void(CSSStyleRule const&)> const& callback) const;
+    virtual bool for_first_not_loaded_import_rule(Function<void(CSSImportRule&)> const& callback);
+
     virtual String serialized() const;
     virtual String serialized() const;
 
 
 protected:
 protected:

+ 2 - 0
Userland/Libraries/LibWeb/CSS/CSSMediaRule.h

@@ -30,6 +30,8 @@ public:
 
 
     virtual String condition_text() const override;
     virtual String condition_text() const override;
     virtual void set_condition_text(String) 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<MediaList> const& media() const { return m_media; }
     NonnullRefPtr<MediaList> const& media() const { return m_media; }
 
 

+ 15 - 3
Userland/Libraries/LibWeb/CSS/CSSRuleList.cpp

@@ -6,6 +6,7 @@
 
 
 #include <AK/TypeCasts.h>
 #include <AK/TypeCasts.h>
 #include <LibWeb/CSS/CSSImportRule.h>
 #include <LibWeb/CSS/CSSImportRule.h>
+#include <LibWeb/CSS/CSSMediaRule.h>
 #include <LibWeb/CSS/CSSRuleList.h>
 #include <LibWeb/CSS/CSSRuleList.h>
 #include <LibWeb/DOM/ExceptionOr.h>
 #include <LibWeb/DOM/ExceptionOr.h>
 
 
@@ -79,12 +80,21 @@ DOM::ExceptionOr<void> CSSRuleList::remove_a_css_rule(u32 index)
 void CSSRuleList::for_each_effective_style_rule(Function<void(CSSStyleRule const&)> const& callback) const
 void CSSRuleList::for_each_effective_style_rule(Function<void(CSSStyleRule const&)> const& callback) const
 {
 {
     for (auto& rule : m_rules) {
     for (auto& rule : m_rules) {
-        if (rule.type() == CSSRule::Type::Style) {
+        switch (rule.type()) {
+        case CSSRule::Type::Style:
             callback(verify_cast<CSSStyleRule>(rule));
             callback(verify_cast<CSSStyleRule>(rule));
-        } else if (rule.type() == CSSRule::Type::Import) {
-            const auto& import_rule = verify_cast<CSSImportRule>(rule);
+            break;
+        case CSSRule::Type::Import: {
+            auto const& import_rule = verify_cast<CSSImportRule>(rule);
             if (import_rule.has_import_result())
             if (import_rule.has_import_result())
                 import_rule.loaded_style_sheet()->for_each_effective_style_rule(callback);
                 import_rule.loaded_style_sheet()->for_each_effective_style_rule(callback);
+            break;
+        }
+        case CSSRule::Type::Media:
+            verify_cast<CSSMediaRule>(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(Function<void(CSSImportRule&)
             if (import_rule.loaded_style_sheet()->for_first_not_loaded_import_rule(callback)) {
             if (import_rule.loaded_style_sheet()->for_first_not_loaded_import_rule(callback)) {
                 return true;
                 return true;
             }
             }
+        } else if (rule.type() == CSSRule::Type::Media) {
+            return verify_cast<CSSMediaRule>(rule).for_first_not_loaded_import_rule(callback);
         }
         }
     }
     }