mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 21:17:45 +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:
parent
87f0059088
commit
3a4565beec
15 changed files with 64 additions and 13 deletions
|
@ -10,7 +10,7 @@
|
|||
namespace Web::CSS {
|
||||
|
||||
CSSGroupingRule::CSSGroupingRule(NonnullRefPtrVector<CSSRule>&& rules)
|
||||
: m_rules(CSSRuleList { move(rules) })
|
||||
: m_rules(CSSRuleList::create(move(rules)))
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ protected:
|
|||
explicit CSSGroupingRule(NonnullRefPtrVector<CSSRule>&&);
|
||||
|
||||
private:
|
||||
CSSRuleList m_rules;
|
||||
NonnullRefPtr<CSSRuleList> m_rules;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
5
Userland/Libraries/LibWeb/CSS/CSSRule.idl
Normal file
5
Userland/Libraries/LibWeb/CSS/CSSRule.idl
Normal file
|
@ -0,0 +1,5 @@
|
|||
interface CSSRule {
|
||||
|
||||
|
||||
|
||||
};
|
|
@ -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 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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
[Exposed=Window]
|
||||
interface CSSRuleList {
|
||||
|
||||
getter CSSRule? item(unsigned long index);
|
||||
readonly attribute unsigned long length;
|
||||
|
||||
};
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
namespace Web::CSS {
|
||||
|
||||
CSSStyleSheet::CSSStyleSheet(NonnullRefPtrVector<CSSRule> rules)
|
||||
: m_rules(move(rules))
|
||||
: m_rules(CSSRuleList::create(move(rules)))
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue