diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp index 9af2edc8a0..1f3815ec3a 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp @@ -1490,6 +1490,8 @@ void generate_implementation(IDL::Interface const& interface) #include #include #include +#include +#include #include #include #include @@ -2684,6 +2686,8 @@ void generate_prototype_implementation(IDL::Interface const& interface) #include #include #include +#include +#include #include #include #include diff --git a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h index 1ee1f80e77..c74b6abf17 100644 --- a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h +++ b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h @@ -12,6 +12,10 @@ #include #include #include +#include +#include +#include +#include #include #include #include @@ -265,6 +269,8 @@ auto& vm = this->vm(); \ ADD_WINDOW_OBJECT_INTERFACE(AbortController) \ ADD_WINDOW_OBJECT_INTERFACE(AbortSignal) \ + ADD_WINDOW_OBJECT_INTERFACE(CSSRule) \ + ADD_WINDOW_OBJECT_INTERFACE(CSSRuleList) \ ADD_WINDOW_OBJECT_INTERFACE(CanvasRenderingContext2D) \ ADD_WINDOW_OBJECT_INTERFACE(CharacterData) \ ADD_WINDOW_OBJECT_INTERFACE(CloseEvent) \ diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 27cafb50f8..f02ee959b7 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -340,6 +340,8 @@ function(libweb_js_wrapper class) add_dependencies(all_generated generate_${basename}Prototype.cpp) endfunction() +libweb_js_wrapper(CSS/CSSRule) +libweb_js_wrapper(CSS/CSSRuleList) libweb_js_wrapper(CSS/CSSStyleDeclaration) libweb_js_wrapper(CSS/CSSStyleSheet) libweb_js_wrapper(CSS/MediaQueryList) diff --git a/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.cpp b/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.cpp index 59cc281c69..a0174c4157 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.cpp +++ b/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.cpp @@ -10,7 +10,7 @@ namespace Web::CSS { CSSGroupingRule::CSSGroupingRule(NonnullRefPtrVector&& rules) - : m_rules(CSSRuleList { move(rules) }) + : m_rules(CSSRuleList::create(move(rules))) { } diff --git a/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h b/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h index e60a7ff8a3..2ae2fbf13f 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h +++ b/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h @@ -28,7 +28,7 @@ protected: explicit CSSGroupingRule(NonnullRefPtrVector&&); private: - CSSRuleList m_rules; + NonnullRefPtr m_rules; }; } diff --git a/Userland/Libraries/LibWeb/CSS/CSSRule.h b/Userland/Libraries/LibWeb/CSS/CSSRule.h index 921e00c389..472e022b42 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSRule.h +++ b/Userland/Libraries/LibWeb/CSS/CSSRule.h @@ -8,13 +8,18 @@ #include #include +#include #include #include namespace Web::CSS { -class CSSRule : public RefCounted { +class CSSRule + : public RefCounted + , public Bindings::Wrappable { public: + using WrapperType = Bindings::CSSRuleWrapper; + virtual ~CSSRule(); enum class Type : u32 { diff --git a/Userland/Libraries/LibWeb/CSS/CSSRule.idl b/Userland/Libraries/LibWeb/CSS/CSSRule.idl new file mode 100644 index 0000000000..385eba2a5d --- /dev/null +++ b/Userland/Libraries/LibWeb/CSS/CSSRule.idl @@ -0,0 +1,5 @@ +interface CSSRule { + + + +}; diff --git a/Userland/Libraries/LibWeb/CSS/CSSRuleList.cpp b/Userland/Libraries/LibWeb/CSS/CSSRuleList.cpp index 10f7ba598c..d33eb145d4 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSRuleList.cpp +++ b/Userland/Libraries/LibWeb/CSS/CSSRuleList.cpp @@ -9,7 +9,7 @@ namespace Web::CSS { CSSRuleList::CSSRuleList(NonnullRefPtrVector&& rules) - : m_rules(rules) + : m_rules(move(rules)) { } @@ -17,4 +17,11 @@ CSSRuleList::~CSSRuleList() { } +bool CSSRuleList::is_supported_property_index(u32 index) const +{ + // The object’s supported property indices are the numbers in the range zero to one less than the number of CSSRule objects represented by the collection. + // If there are no such CSSRule objects, then there are no supported property indices. + return index < m_rules.size(); +} + } diff --git a/Userland/Libraries/LibWeb/CSS/CSSRuleList.h b/Userland/Libraries/LibWeb/CSS/CSSRuleList.h index 4dd5426162..697c5fdf66 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSRuleList.h +++ b/Userland/Libraries/LibWeb/CSS/CSSRuleList.h @@ -15,10 +15,18 @@ namespace Web::CSS { -class CSSRuleList { +// https://drafts.csswg.org/cssom/#the-cssrulelist-interface +class CSSRuleList + : public RefCounted + , public Bindings::Wrappable { public: - explicit CSSRuleList(NonnullRefPtrVector&&); - virtual ~CSSRuleList(); + using WrapperType = Bindings::CSSRuleListWrapper; + + static NonnullRefPtr create(NonnullRefPtrVector&& rules) + { + return adopt_ref(*new CSSRuleList(move(rules))); + } + ~CSSRuleList(); RefPtr item(size_t index) const { @@ -37,7 +45,11 @@ public: ConstIterator const end() const { return m_rules.end(); } Iterator end() { return m_rules.end(); } + bool is_supported_property_index(u32 index) const; + private: + explicit CSSRuleList(NonnullRefPtrVector&&); + NonnullRefPtrVector m_rules; }; diff --git a/Userland/Libraries/LibWeb/CSS/CSSRuleList.idl b/Userland/Libraries/LibWeb/CSS/CSSRuleList.idl index 5973f711d3..13acd35b1d 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSRuleList.idl +++ b/Userland/Libraries/LibWeb/CSS/CSSRuleList.idl @@ -1,4 +1,7 @@ +[Exposed=Window] interface CSSRuleList { + getter CSSRule? item(unsigned long index); readonly attribute unsigned long length; + }; diff --git a/Userland/Libraries/LibWeb/CSS/CSSStyleSheet.cpp b/Userland/Libraries/LibWeb/CSS/CSSStyleSheet.cpp index ed06f7fc94..0321d2fcd9 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSStyleSheet.cpp +++ b/Userland/Libraries/LibWeb/CSS/CSSStyleSheet.cpp @@ -9,7 +9,7 @@ namespace Web::CSS { CSSStyleSheet::CSSStyleSheet(NonnullRefPtrVector rules) - : m_rules(move(rules)) + : m_rules(CSSRuleList::create(move(rules))) { } diff --git a/Userland/Libraries/LibWeb/CSS/CSSStyleSheet.h b/Userland/Libraries/LibWeb/CSS/CSSStyleSheet.h index 68c1cf83b4..03d3a04bf0 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSStyleSheet.h +++ b/Userland/Libraries/LibWeb/CSS/CSSStyleSheet.h @@ -31,11 +31,15 @@ public: CSSRuleList const& rules() const { return m_rules; } CSSRuleList& rules() { return m_rules; } + void set_rules(NonnullRefPtr rules) { m_rules = move(rules); } + + CSSRuleList* css_rules() { return m_rules; } + CSSRuleList const* css_rules() const { return m_rules; } template void for_each_effective_style_rule(Callback callback) const { - for (auto& rule : m_rules) + for (auto& rule : *m_rules) if (rule.type() == CSSRule::Type::Style) { callback(verify_cast(rule)); } else if (rule.type() == CSSRule::Type::Import) { @@ -48,7 +52,7 @@ public: template bool for_first_not_loaded_import_rule(Callback callback) { - for (auto& rule : m_rules) + for (auto& rule : *m_rules) if (rule.type() == CSSRule::Type::Import) { auto& import_rule = verify_cast(rule); if (!import_rule.has_import_result()) { @@ -67,7 +71,7 @@ public: private: explicit CSSStyleSheet(NonnullRefPtrVector); - CSSRuleList m_rules; + NonnullRefPtr m_rules; }; } diff --git a/Userland/Libraries/LibWeb/CSS/CSSStyleSheet.idl b/Userland/Libraries/LibWeb/CSS/CSSStyleSheet.idl index bf02535dc4..7f5d324248 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSStyleSheet.idl +++ b/Userland/Libraries/LibWeb/CSS/CSSStyleSheet.idl @@ -1,6 +1,6 @@ interface CSSStyleSheet : StyleSheet { // readonly attribute CSSRule? ownerRule; - // [SameObject] readonly attribute CSSRuleList cssRules; + [SameObject] readonly attribute CSSRuleList cssRules; // unsigned long insertRule(CSSOMString rule, optional unsigned long index = 0); // undefined deleteRule(unsigned long index); }; diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 39d4350c8e..39db308396 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -262,6 +262,8 @@ class URLSearchParamsIterator; namespace Web::Bindings { class AbortControllerWrapper; class AbortSignalWrapper; +class CSSRuleWrapper; +class CSSRuleListWrapper; class CSSStyleDeclarationWrapper; class CSSStyleSheetWrapper; class CanvasRenderingContext2DWrapper; diff --git a/Userland/Libraries/LibWeb/Loader/CSSLoader.cpp b/Userland/Libraries/LibWeb/Loader/CSSLoader.cpp index e2eed4a8cf..418ae70276 100644 --- a/Userland/Libraries/LibWeb/Loader/CSSLoader.cpp +++ b/Userland/Libraries/LibWeb/Loader/CSSLoader.cpp @@ -64,8 +64,9 @@ void CSSLoader::resource_did_load() }); // Transfer the rules from the successfully parsed sheet into the sheet we've already inserted. + // FIXME: @import rules need work. if (!was_imported) { - m_style_sheet->rules() = sheet->rules(); + m_style_sheet->set_rules(sheet->rules()); } if (on_load)