mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 16:07:47 +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
6 changed files with 49 additions and 3 deletions
|
@ -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 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>&&);
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
break;
|
||||||
const auto& import_rule = verify_cast<CSSImportRule>(rule);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue