mirror of
https://github.com/RGBCube/serenity
synced 2025-05-24 03:55:06 +00:00
LibWeb: Resolve cyclic dependency between StyleSheet and ImportRule
Previously: CSSImportRule::loaded_style_sheet() (and others) depend on the definition of class CSSStyleSheet. Meanwhile, CSSStyleSheet::template for_each_effective_style_rule (and others) depend on the definition of class CSSImportRule. This hasn't caused any problems so far because CSSStyleSheet.h happened to be always included after CSSImportRule.h (in part due to alphabetical ordering). However, a compilation unit that (for example) only contains #include <Userland/Libraries/LibWeb/CSSImportRule.h> would fail to compile. This patch resolves this issue by pushing the inline definition of Web::CSS::CSSStyleSheet::for_each_effective_style_rule and for_first_not_loaded_import_rule into a different file, and adding the missing headers.
This commit is contained in:
parent
0f35ae13fb
commit
0db6ca4065
6 changed files with 41 additions and 33 deletions
|
@ -8,6 +8,7 @@
|
||||||
|
|
||||||
#include <AK/URL.h>
|
#include <AK/URL.h>
|
||||||
#include <LibWeb/CSS/CSSRule.h>
|
#include <LibWeb/CSS/CSSRule.h>
|
||||||
|
#include <LibWeb/CSS/CSSStyleSheet.h>
|
||||||
|
|
||||||
namespace Web::CSS {
|
namespace Web::CSS {
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <LibWeb/CSS/CSSImportRule.h>
|
||||||
#include <LibWeb/CSS/CSSStyleSheet.h>
|
#include <LibWeb/CSS/CSSStyleSheet.h>
|
||||||
#include <LibWeb/CSS/Parser/Parser.h>
|
#include <LibWeb/CSS/Parser/Parser.h>
|
||||||
#include <LibWeb/DOM/ExceptionOr.h>
|
#include <LibWeb/DOM/ExceptionOr.h>
|
||||||
|
@ -57,4 +58,34 @@ DOM::ExceptionOr<void> CSSStyleSheet::remove_rule(unsigned index)
|
||||||
return delete_rule(index);
|
return delete_rule(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSSStyleSheet::for_each_effective_style_rule(Function<void(CSSStyleRule const&)> const& callback) const
|
||||||
|
{
|
||||||
|
for (auto& rule : *m_rules)
|
||||||
|
if (rule.type() == CSSRule::Type::Style) {
|
||||||
|
callback(verify_cast<CSSStyleRule>(rule));
|
||||||
|
} else if (rule.type() == CSSRule::Type::Import) {
|
||||||
|
const auto& import_rule = verify_cast<CSSImportRule>(rule);
|
||||||
|
if (import_rule.has_import_result())
|
||||||
|
import_rule.loaded_style_sheet()->for_each_effective_style_rule(callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CSSStyleSheet::for_first_not_loaded_import_rule(Function<void(CSSImportRule&)> const& callback)
|
||||||
|
{
|
||||||
|
for (auto& rule : *m_rules)
|
||||||
|
if (rule.type() == CSSRule::Type::Import) {
|
||||||
|
auto& import_rule = verify_cast<CSSImportRule>(rule);
|
||||||
|
if (!import_rule.has_import_result()) {
|
||||||
|
callback(import_rule);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (import_rule.loaded_style_sheet()->for_first_not_loaded_import_rule(callback)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,16 +6,19 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <AK/Function.h>
|
||||||
#include <AK/NonnullRefPtrVector.h>
|
#include <AK/NonnullRefPtrVector.h>
|
||||||
#include <AK/TypeCasts.h>
|
#include <AK/TypeCasts.h>
|
||||||
#include <LibWeb/CSS/CSSImportRule.h>
|
|
||||||
#include <LibWeb/CSS/CSSRule.h>
|
#include <LibWeb/CSS/CSSRule.h>
|
||||||
#include <LibWeb/CSS/CSSRuleList.h>
|
#include <LibWeb/CSS/CSSRuleList.h>
|
||||||
|
#include <LibWeb/CSS/CSSStyleRule.h>
|
||||||
#include <LibWeb/CSS/StyleSheet.h>
|
#include <LibWeb/CSS/StyleSheet.h>
|
||||||
#include <LibWeb/Loader/Resource.h>
|
#include <LibWeb/Loader/Resource.h>
|
||||||
|
|
||||||
namespace Web::CSS {
|
namespace Web::CSS {
|
||||||
|
|
||||||
|
class CSSImportRule;
|
||||||
|
|
||||||
class CSSStyleSheet final : public StyleSheet {
|
class CSSStyleSheet final : public StyleSheet {
|
||||||
public:
|
public:
|
||||||
using WrapperType = Bindings::CSSStyleSheetWrapper;
|
using WrapperType = Bindings::CSSStyleSheetWrapper;
|
||||||
|
@ -42,37 +45,8 @@ public:
|
||||||
DOM::ExceptionOr<void> remove_rule(unsigned index);
|
DOM::ExceptionOr<void> remove_rule(unsigned index);
|
||||||
DOM::ExceptionOr<void> delete_rule(unsigned index);
|
DOM::ExceptionOr<void> delete_rule(unsigned index);
|
||||||
|
|
||||||
template<typename Callback>
|
void for_each_effective_style_rule(Function<void(CSSStyleRule const&)> const& callback) const;
|
||||||
void for_each_effective_style_rule(Callback callback) const
|
bool for_first_not_loaded_import_rule(Function<void(CSSImportRule&)> const& callback);
|
||||||
{
|
|
||||||
for (auto& rule : *m_rules)
|
|
||||||
if (rule.type() == CSSRule::Type::Style) {
|
|
||||||
callback(verify_cast<CSSStyleRule>(rule));
|
|
||||||
} else if (rule.type() == CSSRule::Type::Import) {
|
|
||||||
const auto& import_rule = verify_cast<CSSImportRule>(rule);
|
|
||||||
if (import_rule.has_import_result())
|
|
||||||
import_rule.loaded_style_sheet()->for_each_effective_style_rule(callback);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Callback>
|
|
||||||
bool for_first_not_loaded_import_rule(Callback callback)
|
|
||||||
{
|
|
||||||
for (auto& rule : *m_rules)
|
|
||||||
if (rule.type() == CSSRule::Type::Import) {
|
|
||||||
auto& import_rule = verify_cast<CSSImportRule>(rule);
|
|
||||||
if (!import_rule.has_import_result()) {
|
|
||||||
callback(import_rule);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (import_rule.loaded_style_sheet()->for_first_not_loaded_import_rule(callback)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit CSSStyleSheet(NonnullRefPtrVector<CSSRule>);
|
explicit CSSStyleSheet(NonnullRefPtrVector<CSSRule>);
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <AK/Debug.h>
|
#include <AK/Debug.h>
|
||||||
#include <AK/NonnullRefPtrVector.h>
|
#include <AK/NonnullRefPtrVector.h>
|
||||||
#include <AK/SourceLocation.h>
|
#include <AK/SourceLocation.h>
|
||||||
|
#include <LibWeb/CSS/CSSImportRule.h>
|
||||||
#include <LibWeb/CSS/CSSMediaRule.h>
|
#include <LibWeb/CSS/CSSMediaRule.h>
|
||||||
#include <LibWeb/CSS/CSSStyleDeclaration.h>
|
#include <LibWeb/CSS/CSSStyleDeclaration.h>
|
||||||
#include <LibWeb/CSS/CSSStyleRule.h>
|
#include <LibWeb/CSS/CSSStyleRule.h>
|
||||||
|
|
|
@ -77,7 +77,7 @@ Vector<MatchingRule> StyleComputer::collect_matching_rules(DOM::Element const& e
|
||||||
size_t style_sheet_index = 0;
|
size_t style_sheet_index = 0;
|
||||||
for_each_stylesheet(declaration_type, [&](auto& sheet) {
|
for_each_stylesheet(declaration_type, [&](auto& sheet) {
|
||||||
size_t rule_index = 0;
|
size_t rule_index = 0;
|
||||||
static_cast<CSSStyleSheet const&>(sheet).for_each_effective_style_rule([&](auto& rule) {
|
static_cast<CSSStyleSheet const&>(sheet).for_each_effective_style_rule([&](auto const& rule) {
|
||||||
size_t selector_index = 0;
|
size_t selector_index = 0;
|
||||||
for (auto& selector : rule.selectors()) {
|
for (auto& selector : rule.selectors()) {
|
||||||
if (SelectorEngine::matches(selector, element)) {
|
if (SelectorEngine::matches(selector, element)) {
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include <AK/Debug.h>
|
#include <AK/Debug.h>
|
||||||
#include <AK/URL.h>
|
#include <AK/URL.h>
|
||||||
|
#include <LibWeb/CSS/CSSImportRule.h>
|
||||||
#include <LibWeb/CSS/Parser/Parser.h>
|
#include <LibWeb/CSS/Parser/Parser.h>
|
||||||
#include <LibWeb/DOM/Document.h>
|
#include <LibWeb/DOM/Document.h>
|
||||||
#include <LibWeb/DOM/Element.h>
|
#include <LibWeb/DOM/Element.h>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue