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:
parent
87f0059088
commit
3a4565beec
15 changed files with 64 additions and 13 deletions
|
@ -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>
|
||||||
|
|
|
@ -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) \
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ protected:
|
||||||
explicit CSSGroupingRule(NonnullRefPtrVector<CSSRule>&&);
|
explicit CSSGroupingRule(NonnullRefPtrVector<CSSRule>&&);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CSSRuleList m_rules;
|
NonnullRefPtr<CSSRuleList> m_rules;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
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 {
|
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 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 {
|
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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -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)))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue