mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-26 22:38:51 +00:00
This patch moves the CSS property+value storage down to a new subclass of CSSStyleDeclaration called PropertyOwningCSSStyleDeclaration. The JavaScript wrapper for CSSStyleDeclaration now calls virtual functions on the C++ object. This is preparation for supporting computed style CSSStyleDeclaration objects which won't have internal property storage, but rather an internal element pointer. :^)
94 lines
2.7 KiB
C++
94 lines
2.7 KiB
C++
/*
|
|
* Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <LibWeb/CSS/CSSStyleDeclaration.h>
|
|
#include <LibWeb/CSS/Parser/Parser.h>
|
|
#include <LibWeb/DOM/Element.h>
|
|
|
|
namespace Web::CSS {
|
|
|
|
PropertyOwningCSSStyleDeclaration::PropertyOwningCSSStyleDeclaration(Vector<StyleProperty> properties, HashMap<String, StyleProperty> custom_properties)
|
|
: m_properties(move(properties))
|
|
, m_custom_properties(move(custom_properties))
|
|
{
|
|
}
|
|
|
|
PropertyOwningCSSStyleDeclaration::~PropertyOwningCSSStyleDeclaration()
|
|
{
|
|
}
|
|
|
|
CSSStyleDeclaration::~CSSStyleDeclaration()
|
|
{
|
|
}
|
|
|
|
String PropertyOwningCSSStyleDeclaration::item(size_t index) const
|
|
{
|
|
if (index >= m_properties.size())
|
|
return {};
|
|
return CSS::string_from_property_id(m_properties[index].property_id);
|
|
}
|
|
|
|
ElementInlineCSSStyleDeclaration::ElementInlineCSSStyleDeclaration(DOM::Element& element)
|
|
: PropertyOwningCSSStyleDeclaration({}, {})
|
|
, m_element(element.make_weak_ptr<DOM::Element>())
|
|
{
|
|
}
|
|
|
|
ElementInlineCSSStyleDeclaration::ElementInlineCSSStyleDeclaration(DOM::Element& element, PropertyOwningCSSStyleDeclaration& declaration)
|
|
: PropertyOwningCSSStyleDeclaration(move(declaration.m_properties), move(declaration.m_custom_properties))
|
|
, m_element(element.make_weak_ptr<DOM::Element>())
|
|
{
|
|
}
|
|
|
|
ElementInlineCSSStyleDeclaration::~ElementInlineCSSStyleDeclaration()
|
|
{
|
|
}
|
|
|
|
size_t PropertyOwningCSSStyleDeclaration::length() const
|
|
{
|
|
return m_properties.size();
|
|
}
|
|
|
|
Optional<StyleProperty> PropertyOwningCSSStyleDeclaration::property(PropertyID property_id) const
|
|
{
|
|
for (auto& property : m_properties) {
|
|
if (property.property_id == property_id)
|
|
return property;
|
|
}
|
|
return {};
|
|
}
|
|
|
|
bool PropertyOwningCSSStyleDeclaration::set_property(PropertyID property_id, StringView css_text)
|
|
{
|
|
auto new_value = parse_css_value(CSS::ParsingContext {}, css_text, property_id);
|
|
// FIXME: What are we supposed to do if we can't parse it?
|
|
if (!new_value)
|
|
return false;
|
|
|
|
ScopeGuard style_invalidation_guard = [&] {
|
|
auto& declaration = verify_cast<CSS::ElementInlineCSSStyleDeclaration>(*this);
|
|
if (auto* element = declaration.element())
|
|
element->invalidate_style();
|
|
};
|
|
|
|
// FIXME: I don't think '!important' is being handled correctly here..
|
|
|
|
for (auto& property : m_properties) {
|
|
if (property.property_id == property_id) {
|
|
property.value = new_value.release_nonnull();
|
|
return true;
|
|
}
|
|
}
|
|
|
|
m_properties.append(CSS::StyleProperty {
|
|
.property_id = property_id,
|
|
.value = new_value.release_nonnull(),
|
|
.important = false,
|
|
});
|
|
return true;
|
|
}
|
|
|
|
}
|