blob: 22337357e6f6b4817d03148eddd2f5355f1ac39a [file] [log] [blame]
/**
* (C) 1999-2003 Lars Knoll ([email protected])
* Copyright (C) 2004-2023 Apple Inc. All rights reserved.
* Copyright (C) 2013 Intel Corporation. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once
#include "CSSProperty.h"
namespace WebCore {
class CachedResource;
class Color;
class ImmutableStyleProperties;
class MutableStyleProperties;
enum CSSValueID : uint16_t;
enum CSSParserMode : uint8_t;
namespace CSS {
struct SerializationContext;
}
DECLARE_ALLOCATOR_WITH_HEAP_IDENTIFIER(StyleProperties);
class StyleProperties : public RefCounted<StyleProperties> {
WTF_DEPRECATED_MAKE_FAST_ALLOCATED_WITH_HEAP_IDENTIFIER(StyleProperties, StyleProperties);
public:
// Override RefCounted's deref() to ensure operator delete is called on
// the appropriate subclass type.
inline void deref() const;
class PropertyReference {
public:
PropertyReference(const StylePropertyMetadata& metadata, const CSSValue* value)
: m_metadata(metadata)
, m_value(value)
{ }
CSSPropertyID id() const { return static_cast<CSSPropertyID>(m_metadata.m_propertyID); }
CSSPropertyID shorthandID() const { return m_metadata.shorthandID(); }
bool isImportant() const { return m_metadata.m_important; }
bool isImplicit() const { return m_metadata.m_implicit; }
String cssName() const;
String cssText(const CSS::SerializationContext&) const;
const CSSValue* value() const { return m_value; }
// FIXME: We should try to remove this mutable overload.
CSSValue* value() { return const_cast<CSSValue*>(m_value); }
Ref<CSSValue> protectedValue() const { return const_cast<CSSValue&>(*m_value); }
// FIXME: Remove this.
CSSProperty toCSSProperty() const { return CSSProperty(id(), protectedValue(), isImportant() ? IsImportant::Yes : IsImportant::No, m_metadata.m_isSetFromShorthand, m_metadata.m_indexInShorthandsVector, isImplicit() ? IsImplicit::Yes : IsImplicit::No); }
private:
const StylePropertyMetadata& m_metadata;
const CSSValue* m_value;
};
template<typename T>
struct Iterator {
using iterator_category = std::forward_iterator_tag;
using value_type = PropertyReference;
using difference_type = ptrdiff_t;
using pointer = PropertyReference;
using reference = PropertyReference;
Iterator(const T& properties)
: properties { properties }
{
}
PropertyReference operator*() const { return properties.propertyAt(index); }
Iterator& operator++() { ++index; return *this; }
bool operator==(std::nullptr_t) const { return index >= properties.propertyCount(); }
private:
const T& properties;
unsigned index { 0 };
};
inline unsigned propertyCount() const;
inline bool isEmpty() const;
inline PropertyReference propertyAt(unsigned) const LIFETIME_BOUND;
Iterator<StyleProperties> begin() const LIFETIME_BOUND { return { *this }; }
static constexpr std::nullptr_t end() { return nullptr; }
inline unsigned size() const;
WEBCORE_EXPORT RefPtr<CSSValue> getPropertyCSSValue(CSSPropertyID) const;
WEBCORE_EXPORT String getPropertyValue(CSSPropertyID) const;
WEBCORE_EXPORT std::optional<Color> propertyAsColor(CSSPropertyID) const;
WEBCORE_EXPORT std::optional<CSSValueID> propertyAsValueID(CSSPropertyID) const;
bool propertyIsImportant(CSSPropertyID) const;
String getPropertyShorthand(CSSPropertyID) const;
bool isPropertyImplicit(CSSPropertyID) const;
RefPtr<CSSValue> getCustomPropertyCSSValue(const String& propertyName) const;
String getCustomPropertyValue(const String& propertyName) const;
bool customPropertyIsImportant(const String& propertyName) const;
Ref<MutableStyleProperties> copyBlockProperties() const;
CSSParserMode cssParserMode() const { return static_cast<CSSParserMode>(m_cssParserMode); }
WEBCORE_EXPORT Ref<MutableStyleProperties> mutableCopy() const;
Ref<ImmutableStyleProperties> immutableCopyIfNeeded() const;
Ref<MutableStyleProperties> copyProperties(std::span<const CSSPropertyID>) const;
String asText(const CSS::SerializationContext&) const;
AtomString asTextAtom(const CSS::SerializationContext&) const;
bool hasCSSOMWrapper() const;
bool isMutable() const { return m_isMutable; }
bool traverseSubresources(NOESCAPE const Function<bool(const CachedResource&)>& handler) const;
bool mayDependOnBaseURL() const;
static unsigned averageSizeInBytes();
#ifndef NDEBUG
void showStyle();
#endif
bool propertyMatches(CSSPropertyID, const CSSValue*) const;
inline int findPropertyIndex(CSSPropertyID) const;
inline int findCustomPropertyIndex(StringView propertyName) const;
protected:
inline explicit StyleProperties(CSSParserMode);
inline StyleProperties(CSSParserMode, unsigned immutableArraySize);
unsigned m_cssParserMode : 3;
mutable unsigned m_isMutable : 1 { true };
unsigned m_arraySize : 28 { 0 };
private:
StringBuilder asTextInternal(const CSS::SerializationContext&) const;
String serializeLonghandValue(const CSS::SerializationContext&, CSSPropertyID) const;
String serializeShorthandValue(const CSS::SerializationContext&, CSSPropertyID) const;
};
String serializeLonghandValue(const CSS::SerializationContext&, CSSPropertyID, const CSSValue&);
inline String serializeLonghandValue(const CSS::SerializationContext&, CSSPropertyID, const CSSValue*);
inline CSSValueID longhandValueID(CSSPropertyID, const CSSValue&);
inline std::optional<CSSValueID> longhandValueID(CSSPropertyID, const CSSValue*);
} // namespace WebCore