mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-30 00:31:14 +00:00
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.
This commit is contained in:
parent
df08b25b3f
commit
439d978ea5
Notes:
sideshowbarker
2024-07-18 02:54:59 +09:00
Author: https://github.com/AtkinsSJ Commit: https://github.com/SerenityOS/serenity/commit/439d978ea52 Pull-request: https://github.com/SerenityOS/serenity/pull/10400 Reviewed-by: https://github.com/Lubrsi
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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<void(CSSStyleRule const&)> const& callback) const override;
|
||||
virtual bool for_first_not_loaded_import_rule(Function<void(CSSImportRule&)> const& callback) override;
|
||||
|
||||
protected:
|
||||
explicit CSSConditionRule(NonnullRefPtrVector<CSSRule>&&);
|
||||
|
|
|
@ -36,4 +36,14 @@ String CSSGroupingRule::serialized() const
|
|||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <AK/Function.h>
|
||||
#include <AK/NonnullRefPtr.h>
|
||||
#include <LibWeb/CSS/CSSRule.h>
|
||||
#include <LibWeb/CSS/CSSRuleList.h>
|
||||
|
@ -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<void(CSSStyleRule const&)> const& callback) const;
|
||||
virtual bool for_first_not_loaded_import_rule(Function<void(CSSImportRule&)> const& callback);
|
||||
|
||||
virtual String serialized() const;
|
||||
|
||||
protected:
|
||||
|
|
|
@ -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<MediaList> const& media() const { return m_media; }
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
#include <AK/TypeCasts.h>
|
||||
#include <LibWeb/CSS/CSSImportRule.h>
|
||||
#include <LibWeb/CSS/CSSMediaRule.h>
|
||||
#include <LibWeb/CSS/CSSRuleList.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
|
||||
{
|
||||
for (auto& rule : m_rules) {
|
||||
if (rule.type() == CSSRule::Type::Style) {
|
||||
switch (rule.type()) {
|
||||
case CSSRule::Type::Style:
|
||||
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())
|
||||
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)) {
|
||||
return true;
|
||||
}
|
||||
} else if (rule.type() == CSSRule::Type::Media) {
|
||||
return verify_cast<CSSMediaRule>(rule).for_first_not_loaded_import_rule(callback);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue