1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 01:27:43 +00:00

LibWeb: Make CSSRule and CSSRuleList available to JavaScript :^)

This patch makes both of these classes inherit from RefCounted and
Bindings::Wrappable, plus some minimal rejigging to allow us to keep
using them internally while also exposing them to web content.
This commit is contained in:
Andreas Kling 2021-09-29 19:41:46 +02:00
parent 87f0059088
commit 3a4565beec
15 changed files with 64 additions and 13 deletions

View file

@ -1490,6 +1490,8 @@ void generate_implementation(IDL::Interface const& interface)
#include <LibJS/Runtime/Value.h> #include <LibJS/Runtime/Value.h>
#include <LibWeb/Bindings/@prototype_class@.h> #include <LibWeb/Bindings/@prototype_class@.h>
#include <LibWeb/Bindings/@wrapper_class@.h> #include <LibWeb/Bindings/@wrapper_class@.h>
#include <LibWeb/Bindings/CSSRuleListWrapper.h>
#include <LibWeb/Bindings/CSSRuleWrapper.h>
#include <LibWeb/Bindings/CSSStyleSheetWrapper.h> #include <LibWeb/Bindings/CSSStyleSheetWrapper.h>
#include <LibWeb/Bindings/CanvasRenderingContext2DWrapper.h> #include <LibWeb/Bindings/CanvasRenderingContext2DWrapper.h>
#include <LibWeb/Bindings/CommentWrapper.h> #include <LibWeb/Bindings/CommentWrapper.h>
@ -2684,6 +2686,8 @@ void generate_prototype_implementation(IDL::Interface const& interface)
#include <LibWeb/Bindings/@prototype_class@.h> #include <LibWeb/Bindings/@prototype_class@.h>
#include <LibWeb/Bindings/@wrapper_class@.h> #include <LibWeb/Bindings/@wrapper_class@.h>
#include <LibWeb/Bindings/AbortSignalWrapper.h> #include <LibWeb/Bindings/AbortSignalWrapper.h>
#include <LibWeb/Bindings/CSSRuleListWrapper.h>
#include <LibWeb/Bindings/CSSRuleWrapper.h>
#include <LibWeb/Bindings/CSSStyleDeclarationWrapper.h> #include <LibWeb/Bindings/CSSStyleDeclarationWrapper.h>
#include <LibWeb/Bindings/CSSStyleSheetWrapper.h> #include <LibWeb/Bindings/CSSStyleSheetWrapper.h>
#include <LibWeb/Bindings/CanvasRenderingContext2DWrapper.h> #include <LibWeb/Bindings/CanvasRenderingContext2DWrapper.h>

View file

@ -12,6 +12,10 @@
#include <LibWeb/Bindings/AbortControllerPrototype.h> #include <LibWeb/Bindings/AbortControllerPrototype.h>
#include <LibWeb/Bindings/AbortSignalConstructor.h> #include <LibWeb/Bindings/AbortSignalConstructor.h>
#include <LibWeb/Bindings/AbortSignalPrototype.h> #include <LibWeb/Bindings/AbortSignalPrototype.h>
#include <LibWeb/Bindings/CSSRuleConstructor.h>
#include <LibWeb/Bindings/CSSRuleListConstructor.h>
#include <LibWeb/Bindings/CSSRuleListPrototype.h>
#include <LibWeb/Bindings/CSSRulePrototype.h>
#include <LibWeb/Bindings/CSSStyleDeclarationConstructor.h> #include <LibWeb/Bindings/CSSStyleDeclarationConstructor.h>
#include <LibWeb/Bindings/CSSStyleDeclarationPrototype.h> #include <LibWeb/Bindings/CSSStyleDeclarationPrototype.h>
#include <LibWeb/Bindings/CSSStyleSheetConstructor.h> #include <LibWeb/Bindings/CSSStyleSheetConstructor.h>
@ -265,6 +269,8 @@
auto& vm = this->vm(); \ auto& vm = this->vm(); \
ADD_WINDOW_OBJECT_INTERFACE(AbortController) \ ADD_WINDOW_OBJECT_INTERFACE(AbortController) \
ADD_WINDOW_OBJECT_INTERFACE(AbortSignal) \ ADD_WINDOW_OBJECT_INTERFACE(AbortSignal) \
ADD_WINDOW_OBJECT_INTERFACE(CSSRule) \
ADD_WINDOW_OBJECT_INTERFACE(CSSRuleList) \
ADD_WINDOW_OBJECT_INTERFACE(CanvasRenderingContext2D) \ ADD_WINDOW_OBJECT_INTERFACE(CanvasRenderingContext2D) \
ADD_WINDOW_OBJECT_INTERFACE(CharacterData) \ ADD_WINDOW_OBJECT_INTERFACE(CharacterData) \
ADD_WINDOW_OBJECT_INTERFACE(CloseEvent) \ ADD_WINDOW_OBJECT_INTERFACE(CloseEvent) \

View file

@ -340,6 +340,8 @@ function(libweb_js_wrapper class)
add_dependencies(all_generated generate_${basename}Prototype.cpp) add_dependencies(all_generated generate_${basename}Prototype.cpp)
endfunction() endfunction()
libweb_js_wrapper(CSS/CSSRule)
libweb_js_wrapper(CSS/CSSRuleList)
libweb_js_wrapper(CSS/CSSStyleDeclaration) libweb_js_wrapper(CSS/CSSStyleDeclaration)
libweb_js_wrapper(CSS/CSSStyleSheet) libweb_js_wrapper(CSS/CSSStyleSheet)
libweb_js_wrapper(CSS/MediaQueryList) libweb_js_wrapper(CSS/MediaQueryList)

View file

@ -10,7 +10,7 @@
namespace Web::CSS { namespace Web::CSS {
CSSGroupingRule::CSSGroupingRule(NonnullRefPtrVector<CSSRule>&& rules) CSSGroupingRule::CSSGroupingRule(NonnullRefPtrVector<CSSRule>&& rules)
: m_rules(CSSRuleList { move(rules) }) : m_rules(CSSRuleList::create(move(rules)))
{ {
} }

View file

@ -28,7 +28,7 @@ protected:
explicit CSSGroupingRule(NonnullRefPtrVector<CSSRule>&&); explicit CSSGroupingRule(NonnullRefPtrVector<CSSRule>&&);
private: private:
CSSRuleList m_rules; NonnullRefPtr<CSSRuleList> m_rules;
}; };
} }

View file

@ -8,13 +8,18 @@
#include <AK/RefCounted.h> #include <AK/RefCounted.h>
#include <AK/String.h> #include <AK/String.h>
#include <LibWeb/Bindings/Wrappable.h>
#include <LibWeb/CSS/CSSStyleDeclaration.h> #include <LibWeb/CSS/CSSStyleDeclaration.h>
#include <LibWeb/CSS/Selector.h> #include <LibWeb/CSS/Selector.h>
namespace Web::CSS { namespace Web::CSS {
class CSSRule : public RefCounted<CSSRule> { class CSSRule
: public RefCounted<CSSRule>
, public Bindings::Wrappable {
public: public:
using WrapperType = Bindings::CSSRuleWrapper;
virtual ~CSSRule(); virtual ~CSSRule();
enum class Type : u32 { enum class Type : u32 {

View file

@ -0,0 +1,5 @@
interface CSSRule {
};

View file

@ -9,7 +9,7 @@
namespace Web::CSS { namespace Web::CSS {
CSSRuleList::CSSRuleList(NonnullRefPtrVector<CSSRule>&& rules) CSSRuleList::CSSRuleList(NonnullRefPtrVector<CSSRule>&& rules)
: m_rules(rules) : m_rules(move(rules))
{ {
} }
@ -17,4 +17,11 @@ CSSRuleList::~CSSRuleList()
{ {
} }
bool CSSRuleList::is_supported_property_index(u32 index) const
{
// The objects 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();
}
} }

View file

@ -15,10 +15,18 @@
namespace Web::CSS { namespace Web::CSS {
class CSSRuleList { // https://drafts.csswg.org/cssom/#the-cssrulelist-interface
class CSSRuleList
: public RefCounted<CSSRuleList>
, public Bindings::Wrappable {
public: public:
explicit CSSRuleList(NonnullRefPtrVector<CSSRule>&&); using WrapperType = Bindings::CSSRuleListWrapper;
virtual ~CSSRuleList();
static NonnullRefPtr<CSSRuleList> create(NonnullRefPtrVector<CSSRule>&& rules)
{
return adopt_ref(*new CSSRuleList(move(rules)));
}
~CSSRuleList();
RefPtr<CSSRule> item(size_t index) const RefPtr<CSSRule> item(size_t index) const
{ {
@ -37,7 +45,11 @@ public:
ConstIterator const end() const { return m_rules.end(); } ConstIterator const end() const { return m_rules.end(); }
Iterator end() { return m_rules.end(); } Iterator end() { return m_rules.end(); }
bool is_supported_property_index(u32 index) const;
private: private:
explicit CSSRuleList(NonnullRefPtrVector<CSSRule>&&);
NonnullRefPtrVector<CSSRule> m_rules; NonnullRefPtrVector<CSSRule> m_rules;
}; };

View file

@ -1,4 +1,7 @@
[Exposed=Window]
interface CSSRuleList { interface CSSRuleList {
getter CSSRule? item(unsigned long index); getter CSSRule? item(unsigned long index);
readonly attribute unsigned long length; readonly attribute unsigned long length;
}; };

View file

@ -9,7 +9,7 @@
namespace Web::CSS { namespace Web::CSS {
CSSStyleSheet::CSSStyleSheet(NonnullRefPtrVector<CSSRule> rules) CSSStyleSheet::CSSStyleSheet(NonnullRefPtrVector<CSSRule> rules)
: m_rules(move(rules)) : m_rules(CSSRuleList::create(move(rules)))
{ {
} }

View file

@ -31,11 +31,15 @@ public:
CSSRuleList const& rules() const { return m_rules; } CSSRuleList const& rules() const { return m_rules; }
CSSRuleList& rules() { return m_rules; } CSSRuleList& rules() { return m_rules; }
void set_rules(NonnullRefPtr<CSSRuleList> rules) { m_rules = move(rules); }
CSSRuleList* css_rules() { return m_rules; }
CSSRuleList const* css_rules() const { return m_rules; }
template<typename Callback> template<typename Callback>
void for_each_effective_style_rule(Callback callback) const 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) { if (rule.type() == CSSRule::Type::Style) {
callback(verify_cast<CSSStyleRule>(rule)); callback(verify_cast<CSSStyleRule>(rule));
} else if (rule.type() == CSSRule::Type::Import) { } else if (rule.type() == CSSRule::Type::Import) {
@ -48,7 +52,7 @@ public:
template<typename Callback> template<typename Callback>
bool for_first_not_loaded_import_rule(Callback callback) 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) { if (rule.type() == CSSRule::Type::Import) {
auto& import_rule = verify_cast<CSSImportRule>(rule); auto& import_rule = verify_cast<CSSImportRule>(rule);
if (!import_rule.has_import_result()) { if (!import_rule.has_import_result()) {
@ -67,7 +71,7 @@ public:
private: private:
explicit CSSStyleSheet(NonnullRefPtrVector<CSSRule>); explicit CSSStyleSheet(NonnullRefPtrVector<CSSRule>);
CSSRuleList m_rules; NonnullRefPtr<CSSRuleList> m_rules;
}; };
} }

View file

@ -1,6 +1,6 @@
interface CSSStyleSheet : StyleSheet { interface CSSStyleSheet : StyleSheet {
// readonly attribute CSSRule? ownerRule; // readonly attribute CSSRule? ownerRule;
// [SameObject] readonly attribute CSSRuleList cssRules; [SameObject] readonly attribute CSSRuleList cssRules;
// unsigned long insertRule(CSSOMString rule, optional unsigned long index = 0); // unsigned long insertRule(CSSOMString rule, optional unsigned long index = 0);
// undefined deleteRule(unsigned long index); // undefined deleteRule(unsigned long index);
}; };

View file

@ -262,6 +262,8 @@ class URLSearchParamsIterator;
namespace Web::Bindings { namespace Web::Bindings {
class AbortControllerWrapper; class AbortControllerWrapper;
class AbortSignalWrapper; class AbortSignalWrapper;
class CSSRuleWrapper;
class CSSRuleListWrapper;
class CSSStyleDeclarationWrapper; class CSSStyleDeclarationWrapper;
class CSSStyleSheetWrapper; class CSSStyleSheetWrapper;
class CanvasRenderingContext2DWrapper; class CanvasRenderingContext2DWrapper;

View file

@ -64,8 +64,9 @@ void CSSLoader::resource_did_load()
}); });
// Transfer the rules from the successfully parsed sheet into the sheet we've already inserted. // Transfer the rules from the successfully parsed sheet into the sheet we've already inserted.
// FIXME: @import rules need work.
if (!was_imported) { if (!was_imported) {
m_style_sheet->rules() = sheet->rules(); m_style_sheet->set_rules(sheet->rules());
} }
if (on_load) if (on_load)