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
Notes: sideshowbarker 2024-07-18 03:20:07 +09:00
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 <LibWeb/Bindings/@prototype_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/CanvasRenderingContext2DWrapper.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/@wrapper_class@.h>
#include <LibWeb/Bindings/AbortSignalWrapper.h>
#include <LibWeb/Bindings/CSSRuleListWrapper.h>
#include <LibWeb/Bindings/CSSRuleWrapper.h>
#include <LibWeb/Bindings/CSSStyleDeclarationWrapper.h>
#include <LibWeb/Bindings/CSSStyleSheetWrapper.h>
#include <LibWeb/Bindings/CanvasRenderingContext2DWrapper.h>

View file

@ -12,6 +12,10 @@
#include <LibWeb/Bindings/AbortControllerPrototype.h>
#include <LibWeb/Bindings/AbortSignalConstructor.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/CSSStyleDeclarationPrototype.h>
#include <LibWeb/Bindings/CSSStyleSheetConstructor.h>
@ -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) \

View file

@ -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)

View file

@ -10,7 +10,7 @@
namespace Web::CSS {
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>&&);
private:
CSSRuleList m_rules;
NonnullRefPtr<CSSRuleList> m_rules;
};
}

View file

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

View file

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

View file

@ -9,7 +9,7 @@
namespace Web::CSS {
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 {
class CSSRuleList {
// https://drafts.csswg.org/cssom/#the-cssrulelist-interface
class CSSRuleList
: public RefCounted<CSSRuleList>
, public Bindings::Wrappable {
public:
explicit CSSRuleList(NonnullRefPtrVector<CSSRule>&&);
virtual ~CSSRuleList();
using WrapperType = Bindings::CSSRuleListWrapper;
static NonnullRefPtr<CSSRuleList> create(NonnullRefPtrVector<CSSRule>&& rules)
{
return adopt_ref(*new CSSRuleList(move(rules)));
}
~CSSRuleList();
RefPtr<CSSRule> 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<CSSRule>&&);
NonnullRefPtrVector<CSSRule> m_rules;
};

View file

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

View file

@ -9,7 +9,7 @@
namespace Web::CSS {
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& 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>
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<CSSStyleRule>(rule));
} else if (rule.type() == CSSRule::Type::Import) {
@ -48,7 +52,7 @@ public:
template<typename 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) {
auto& import_rule = verify_cast<CSSImportRule>(rule);
if (!import_rule.has_import_result()) {
@ -67,7 +71,7 @@ public:
private:
explicit CSSStyleSheet(NonnullRefPtrVector<CSSRule>);
CSSRuleList m_rules;
NonnullRefPtr<CSSRuleList> m_rules;
};
}

View file

@ -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);
};

View file

@ -262,6 +262,8 @@ class URLSearchParamsIterator;
namespace Web::Bindings {
class AbortControllerWrapper;
class AbortSignalWrapper;
class CSSRuleWrapper;
class CSSRuleListWrapper;
class CSSStyleDeclarationWrapper;
class CSSStyleSheetWrapper;
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.
// FIXME: @import rules need work.
if (!was_imported) {
m_style_sheet->rules() = sheet->rules();
m_style_sheet->set_rules(sheet->rules());
}
if (on_load)