Rename AtomicString to AtomString
[WebKit-https.git] / Source / WebCore / css / CSSValue.h
index 59ea1c9..f885ebd 100644 (file)
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef CSSValue_h
-#define CSSValue_h
+#pragma once
 
-#include "ExceptionCode.h"
-#include "URLHash.h"
-#include <wtf/ListHashSet.h>
+#include "CSSPropertyNames.h"
+#include <wtf/Function.h>
+#include <wtf/HashMap.h>
 #include <wtf/RefCounted.h>
 #include <wtf/RefPtr.h>
 #include <wtf/TypeCasts.h>
+#include <wtf/URLHash.h>
 
 namespace WebCore {
 
+class CSSCustomPropertyValue;
+class CSSStyleDeclaration;
 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 {
@@ -45,8 +45,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
@@ -58,9 +59,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; }
@@ -73,60 +72,67 @@ 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; }
+    bool isFontStyleValue() const { return m_classType == FontStyleClass; }
+    bool isFontStyleRangeValue() const { return m_classType == FontStyleRangeClass; }
+    bool isImageGeneratorValue() const { return m_classType >= CanvasClass && m_classType <= ConicGradientClass; }
+    bool isGradientValue() const { return m_classType >= LinearGradientClass && m_classType <= ConicGradientClass; }
     bool isNamedImageValue() const { return m_classType == NamedImageClass; }
-#if ENABLE(CSS_IMAGE_SET)
     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 isGlobalKeyword() const { return isInheritedValue() || isInitialValue() || isUnsetValue() || isRevertValue(); }
+    bool treatAsInitialValue(CSSPropertyID) const;
+    bool treatAsInheritedValue(CSSPropertyID) const;
     bool isLinearGradientValue() const { return m_classType == LinearGradientClass; }
     bool isRadialGradientValue() const { return m_classType == RadialGradientClass; }
+    bool isConicGradientValue() const { return m_classType == ConicGradientClass; }
     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; }
     bool isFilterImageValue() const { return m_classType == FilterImageClass; }
-    bool isWebKitCSSFilterValue() const { return m_classType == WebKitCSSFilterClass; }
+#if ENABLE(CSS_PAINTING_API)
+    bool isPaintImageValue() const { return m_classType == PaintImageClass; }
+#endif
     bool isContentDistributionValue() const { return m_classType == CSSContentDistributionClass; }
-#if ENABLE(CSS_GRID_LAYOUT)
+    bool isGridAutoRepeatValue() const { return m_classType == GridAutoRepeatClass; }
+    bool isGridIntegerRepeatValue() const { return m_classType == GridIntegerRepeatClass; }
     bool isGridTemplateAreasValue() const { return m_classType == GridTemplateAreasClass; }
     bool isGridLineNamesValue() const { return m_classType == GridLineNamesClass; }
-#endif
-    bool isSVGColor() const { return m_classType == SVGColorClass || m_classType == SVGPaintClass; }
-    bool isSVGPaint() const { return m_classType == SVGPaintClass; }
     bool isUnicodeRangeValue() const { return m_classType == UnicodeRangeClass; }
-    bool isWebKitCSSResourceValue() const { return m_classType == WebKitCSSResourceClass; }
-
-#if ENABLE(CSS_ANIMATIONS_LEVEL_2)
-    bool isAnimationTriggerScrollValue() const { return m_classType == AnimationTriggerScrollClass; }
-#endif
 
-    bool isCSSOMSafe() const { return m_isCSSOMSafe; }
-    bool isSubtypeExposedToCSSOM() const
-    { 
-        return isPrimitiveValue() 
-            || isSVGColor()
-            || isValueList();
-    }
+    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(); }
 
-    PassRefPtr<CSSValue> cloneForCSSOM() const;
+    Ref<DeprecatedCSSOMValue> createDeprecatedCSSOMWrapper(CSSStyleDeclaration&) const;
 
-    void addSubresourceStyleURLs(ListHashSet<URL>&, const StyleSheetContents*) const;
+    bool traverseSubresources(const WTF::Function<bool (const CachedResource&)>& handler) const;
 
-    bool traverseSubresources(const std::function<bool (const CachedResource&)>& handler) const;
+    // What properties does this value rely on (eg, font-size for em units)
+    void collectDirectComputationalDependencies(HashSet<CSSPropertyID>&) const;
+    // What properties in the root element does this value rely on (eg. font-size for rem units)
+    void collectDirectRootComputationalDependencies(HashSet<CSSPropertyID>&) const;
 
     bool equals(const CSSValue&) const;
+    bool operator==(const CSSValue& other) const { return equals(other); }
 
 protected:
 
@@ -140,59 +146,66 @@ protected:
 
         // Image generator classes.
         CanvasClass,
+#if ENABLE(CSS_PAINTING_API)
+        PaintImageClass,
+#endif
         NamedImageClass,
         CrossfadeClass,
         FilterImageClass,
         LinearGradientClass,
         RadialGradientClass,
+        ConicGradientClass,
 
         // Timing function classes.
         CubicBezierTimingFunctionClass,
         StepsTimingFunctionClass,
+        SpringTimingFunctionClass,
 
         // Other class types.
         AspectRatioClass,
         BorderImageSliceClass,
         FontFeatureClass,
+#if ENABLE(VARIATION_FONTS)
+        FontVariationClass,
+#endif
         FontClass,
+        FontStyleClass,
+        FontStyleRangeClass,
         FontFaceSrcClass,
         FunctionClass,
 
         InheritedClass,
         InitialClass,
+        UnsetClass,
+        RevertClass,
 
         ReflectClass,
         ShadowClass,
         UnicodeRangeClass,
         LineBoxContainClass,
         CalculationClass,
-#if ENABLE(CSS_GRID_LAYOUT)
         GridTemplateAreasClass,
-#endif
-        SVGColorClass,
-        SVGPaintClass,
-        WebKitCSSResourceClass,
-
-#if ENABLE(CSS_ANIMATIONS_LEVEL_2)
-        AnimationTriggerScrollClass,
-#endif
 
         CSSContentDistributionClass,
 
-        // List class types must appear after ValueListClass.
+        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
-        WebKitCSSFilterClass,
-        WebKitCSSTransformClass,
-#if ENABLE(CSS_GRID_LAYOUT)
         GridLineNamesClass,
-#endif
-
+        GridAutoRepeatClass,
+        GridIntegerRepeatClass,
         // Do not append non-list class types here.
     };
 
+public:
     static const size_t ValueListSeparatorBits = 2;
     enum ValueListSeparator {
         SpaceSeparator,
@@ -200,12 +213,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)
@@ -216,19 +228,17 @@ protected:
     // NOTE: This class is non-virtual for memory and performance reasons.
     // Don't go making it virtual again unless you know exactly what you're doing!
 
-    ~CSSValue() { }
+    ~CSSValue() = default;
 
 private:
     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;
 
@@ -236,19 +246,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;
     }
@@ -267,11 +279,11 @@ inline bool compareCSSValue(const Ref<CSSValueType>& first, const Ref<CSSValueTy
     return first.get().equals(second);
 }
 
+typedef HashMap<AtomString, RefPtr<CSSCustomPropertyValue>> CustomPropertyValueMap;
+
 } // namespace WebCore
 
 #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()
-
-#endif // CSSValue_h