diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/css/CSSValue.h | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/css/CSSValue.h')
-rw-r--r-- | Source/WebCore/css/CSSValue.h | 142 |
1 files changed, 78 insertions, 64 deletions
diff --git a/Source/WebCore/css/CSSValue.h b/Source/WebCore/css/CSSValue.h index 942b793df..47c62087e 100644 --- a/Source/WebCore/css/CSSValue.h +++ b/Source/WebCore/css/CSSValue.h @@ -18,24 +18,25 @@ * Boston, MA 02110-1301, USA. */ -#ifndef CSSValue_h -#define CSSValue_h +#pragma once -#include "ExceptionCode.h" +#include "ExceptionOr.h" #include "URLHash.h" +#include <wtf/HashMap.h> #include <wtf/ListHashSet.h> #include <wtf/RefCounted.h> #include <wtf/RefPtr.h> +#include <wtf/TypeCasts.h> namespace WebCore { +class CSSCustomPropertyValue; +class CachedResource; +class DeprecatedCSSOMValue; class StyleSheetContents; - -// FIXME: The current CSSValue and subclasses should be turned into internal types (StyleValue). -// The few subtypes that are actually exposed in CSSOM can be seen in the cloneForCSSOM() function. -// They should be handled by separate wrapper classes. -// Please don't expose more CSSValue types to the web. +enum CSSPropertyID : uint16_t; + class CSSValue : public RefCounted<CSSValue> { public: enum Type { @@ -43,8 +44,9 @@ public: CSS_PRIMITIVE_VALUE = 1, CSS_VALUE_LIST = 2, CSS_CUSTOM = 3, - CSS_INITIAL = 4 - + CSS_INITIAL = 4, + CSS_UNSET = 5, + CSS_REVERT = 6 }; // Override RefCounted's deref() to ensure operator delete is called on @@ -56,9 +58,7 @@ public: } Type cssValueType() const; - String cssText() const; - void setCssText(const String&, ExceptionCode&) { } // FIXME: Not implemented. bool isPrimitiveValue() const { return m_classType == PrimitiveClass; } bool isValueList() const { return m_classType >= ValueListClass; } @@ -71,56 +71,58 @@ public: bool isCanvasValue() const { return m_classType == CanvasClass; } bool isCrossfadeValue() const { return m_classType == CrossfadeClass; } bool isCursorImageValue() const { return m_classType == CursorImageClass; } + bool isCustomPropertyValue() const { return m_classType == CustomPropertyClass; } bool isFunctionValue() const { return m_classType == FunctionClass; } bool isFontFeatureValue() const { return m_classType == FontFeatureClass; } +#if ENABLE(VARIATION_FONTS) + bool isFontVariationValue() const { return m_classType == FontVariationClass; } +#endif bool isFontFaceSrcValue() const { return m_classType == FontFaceSrcClass; } bool isFontValue() const { return m_classType == FontClass; } bool isImageGeneratorValue() const { return m_classType >= CanvasClass && m_classType <= RadialGradientClass; } bool isGradientValue() const { return m_classType >= LinearGradientClass && m_classType <= RadialGradientClass; } -#if ENABLE(CSS_IMAGE_SET) + bool isNamedImageValue() const { return m_classType == NamedImageClass; } bool isImageSetValue() const { return m_classType == ImageSetClass; } -#endif bool isImageValue() const { return m_classType == ImageClass; } bool isImplicitInitialValue() const; bool isInheritedValue() const { return m_classType == InheritedClass; } bool isInitialValue() const { return m_classType == InitialClass; } + bool isUnsetValue() const { return m_classType == UnsetClass; } + bool isRevertValue() const { return m_classType == RevertClass; } + bool treatAsInitialValue(CSSPropertyID) const; + bool treatAsInheritedValue(CSSPropertyID) const; bool isLinearGradientValue() const { return m_classType == LinearGradientClass; } bool isRadialGradientValue() const { return m_classType == RadialGradientClass; } bool isReflectValue() const { return m_classType == ReflectClass; } bool isShadowValue() const { return m_classType == ShadowClass; } bool isCubicBezierTimingFunctionValue() const { return m_classType == CubicBezierTimingFunctionClass; } bool isStepsTimingFunctionValue() const { return m_classType == StepsTimingFunctionClass; } - bool isWebKitCSSTransformValue() const { return m_classType == WebKitCSSTransformClass; } + bool isSpringTimingFunctionValue() const { return m_classType == SpringTimingFunctionClass; } bool isLineBoxContainValue() const { return m_classType == LineBoxContainClass; } bool isCalcValue() const {return m_classType == CalculationClass; } -#if ENABLE(CSS_FILTERS) bool isFilterImageValue() const { return m_classType == FilterImageClass; } - bool isWebKitCSSFilterValue() const { return m_classType == WebKitCSSFilterClass; } -#endif // ENABLE(CSS_FILTERS) - bool isGridTemplateValue() const { return m_classType == GridTemplateClass; } -#if ENABLE(SVG) - bool isSVGColor() const { return m_classType == SVGColorClass || m_classType == SVGPaintClass; } - bool isSVGPaint() const { return m_classType == SVGPaintClass; } -#endif + bool isContentDistributionValue() const { return m_classType == CSSContentDistributionClass; } + bool isGridAutoRepeatValue() const { return m_classType == GridAutoRepeatClass; } + bool isGridTemplateAreasValue() const { return m_classType == GridTemplateAreasClass; } + bool isGridLineNamesValue() const { return m_classType == GridLineNamesClass; } bool isUnicodeRangeValue() const { return m_classType == UnicodeRangeClass; } - bool isCSSOMSafe() const { return m_isCSSOMSafe; } - bool isSubtypeExposedToCSSOM() const - { - return isPrimitiveValue() -#if ENABLE(SVG) - || isSVGColor() +#if ENABLE(CSS_ANIMATIONS_LEVEL_2) + bool isAnimationTriggerScrollValue() const { return m_classType == AnimationTriggerScrollClass; } #endif - || isValueList(); - } - PassRefPtr<CSSValue> cloneForCSSOM() const; + bool isCustomIdentValue() const { return m_classType == CustomIdentClass; } + bool isVariableReferenceValue() const { return m_classType == VariableReferenceClass; } + bool isPendingSubstitutionValue() const { return m_classType == PendingSubstitutionValueClass; } + + bool hasVariableReferences() const { return isVariableReferenceValue() || isPendingSubstitutionValue(); } - void addSubresourceStyleURLs(ListHashSet<URL>&, const StyleSheetContents*) const; + Ref<DeprecatedCSSOMValue> createDeprecatedCSSOMWrapper() const; - bool hasFailedOrCanceledSubresources() const; + bool traverseSubresources(const std::function<bool (const CachedResource&)>& handler) const; bool equals(const CSSValue&) const; + bool operator==(const CSSValue& other) const { return equals(other); } protected: @@ -134,51 +136,62 @@ protected: // Image generator classes. CanvasClass, + NamedImageClass, CrossfadeClass, -#if ENABLE(CSS_FILTERS) FilterImageClass, -#endif LinearGradientClass, RadialGradientClass, // Timing function classes. CubicBezierTimingFunctionClass, StepsTimingFunctionClass, + SpringTimingFunctionClass, // Other class types. AspectRatioClass, BorderImageSliceClass, FontFeatureClass, +#if ENABLE(VARIATION_FONTS) + FontVariationClass, +#endif FontClass, FontFaceSrcClass, FunctionClass, InheritedClass, InitialClass, + UnsetClass, + RevertClass, ReflectClass, ShadowClass, UnicodeRangeClass, LineBoxContainClass, CalculationClass, - GridTemplateClass, -#if ENABLE(SVG) - SVGColorClass, - SVGPaintClass, + GridTemplateAreasClass, +#if ENABLE(CSS_ANIMATIONS_LEVEL_2) + AnimationTriggerScrollClass, #endif - // List class types must appear after ValueListClass. + CSSContentDistributionClass, + + CustomIdentClass, + + CustomPropertyClass, + VariableReferenceClass, + PendingSubstitutionValueClass, + + // List class types must appear after ValueListClass. Note CSSFunctionValue + // is deliberately excluded, since we don't want it exposed to the CSS OM + // as a list. ValueListClass, -#if ENABLE(CSS_IMAGE_SET) ImageSetClass, -#endif -#if ENABLE(CSS_FILTERS) - WebKitCSSFilterClass, -#endif - WebKitCSSTransformClass, + GridLineNamesClass, + GridAutoRepeatClass, // Do not append non-list class types here. }; +public: static const size_t ValueListSeparatorBits = 2; enum ValueListSeparator { SpaceSeparator, @@ -186,12 +199,11 @@ protected: SlashSeparator }; +protected: ClassType classType() const { return static_cast<ClassType>(m_classType); } - explicit CSSValue(ClassType classType, bool isCSSOMSafe = false) - : m_isCSSOMSafe(isCSSOMSafe) - , m_isTextClone(false) - , m_primitiveUnitType(0) + explicit CSSValue(ClassType classType) + : m_primitiveUnitType(0) , m_hasCachedCSSText(false) , m_isQuirkValue(false) , m_valueListSeparator(SpaceSeparator) @@ -205,16 +217,14 @@ protected: ~CSSValue() { } private: - void destroy(); + WEBCORE_EXPORT void destroy(); protected: - unsigned m_isCSSOMSafe : 1; - unsigned m_isTextClone : 1; // The bits in this section are only used by specific subclasses but kept here // to maximize struct packing. // CSSPrimitiveValue bits: - unsigned m_primitiveUnitType : 7; // CSSPrimitiveValue::UnitTypes + unsigned m_primitiveUnitType : 7; // CSSPrimitiveValue::UnitType mutable unsigned m_hasCachedCSSText : 1; unsigned m_isQuirkValue : 1; @@ -222,19 +232,21 @@ protected: private: unsigned m_classType : ClassTypeBits; // ClassType + +friend class CSSValueList; }; template<typename CSSValueType> -inline bool compareCSSValueVector(const Vector<RefPtr<CSSValueType>>& firstVector, const Vector<RefPtr<CSSValueType>>& secondVector) +inline bool compareCSSValueVector(const Vector<Ref<CSSValueType>>& firstVector, const Vector<Ref<CSSValueType>>& secondVector) { size_t size = firstVector.size(); if (size != secondVector.size()) return false; - for (size_t i = 0; i < size; i++) { - const RefPtr<CSSValueType>& firstPtr = firstVector[i]; - const RefPtr<CSSValueType>& secondPtr = secondVector[i]; - if (firstPtr == secondPtr || (firstPtr && secondPtr && firstPtr->equals(*secondPtr))) + for (size_t i = 0; i < size; ++i) { + auto& firstPtr = firstVector[i]; + auto& secondPtr = secondVector[i]; + if (firstPtr.ptr() == secondPtr.ptr() || firstPtr->equals(secondPtr)) continue; return false; } @@ -250,12 +262,14 @@ inline bool compareCSSValuePtr(const RefPtr<CSSValueType>& first, const RefPtr<C template<typename CSSValueType> inline bool compareCSSValue(const Ref<CSSValueType>& first, const Ref<CSSValueType>& second) { - return first.get().equals(second.get()); + return first.get().equals(second); } -#define CSS_VALUE_TYPE_CASTS(ToValueTypeName, predicate) \ - TYPE_CASTS_BASE(ToValueTypeName, CSSValue, value, value->predicate, value.predicate) +typedef HashMap<AtomicString, RefPtr<CSSCustomPropertyValue>> CustomPropertyValueMap; } // namespace WebCore -#endif // CSSValue_h +#define SPECIALIZE_TYPE_TRAITS_CSS_VALUE(ToValueTypeName, predicate) \ +SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToValueTypeName) \ + static bool isType(const WebCore::CSSValue& value) { return value.predicate; } \ +SPECIALIZE_TYPE_TRAITS_END() |