mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-21 03:55:24 +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
Notes:
sideshowbarker
2024-07-18 03:20:07 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/3a4565beec1
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 <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>
|
||||
|
|
|
@ -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) \
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
|
|
@ -262,6 +262,8 @@ class URLSearchParamsIterator;
|
|||
namespace Web::Bindings {
|
||||
class AbortControllerWrapper;
|
||||
class AbortSignalWrapper;
|
||||
class CSSRuleWrapper;
|
||||
class CSSRuleListWrapper;
|
||||
class CSSStyleDeclarationWrapper;
|
||||
class CSSStyleSheetWrapper;
|
||||
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.
|
||||
// FIXME: @import rules need work.
|
||||
if (!was_imported) {
|
||||
m_style_sheet->rules() = sheet->rules();
|
||||
m_style_sheet->set_rules(sheet->rules());
|
||||
}
|
||||
|
||||
if (on_load)
|
||||
|
|
Loading…
Add table
Reference in a new issue