625e19511e2ddadbad47c6917339d4997118f497
[WebKit-https.git] / Source / WebCore / css / CSSCustomPropertyValue.h
1 /*
2  * Copyright (C) 2015 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "CSSRegisteredCustomProperty.h"
29 #include "CSSValue.h"
30 #include "CSSVariableReferenceValue.h"
31 #include "Length.h"
32 #include <wtf/RefPtr.h>
33 #include <wtf/Variant.h>
34 #include <wtf/text/WTFString.h>
35
36 namespace WebCore {
37
38 class CSSParserToken;
39 class CSSVariableReferenceValue;
40 class RenderStyle;
41
42 class CSSCustomPropertyValue final : public CSSValue {
43 public:
44     using VariantValue = Variant<Ref<CSSVariableReferenceValue>, CSSValueID, Ref<CSSVariableData>, Length>;
45
46     static Ref<CSSCustomPropertyValue> createUnresolved(const AtomicString& name, Ref<CSSVariableReferenceValue>&& value)
47     {
48         return adoptRef(*new CSSCustomPropertyValue(name, { WTFMove(value) }));
49     }
50
51     static Ref<CSSCustomPropertyValue> createUnresolved(const AtomicString& name, CSSValueID value)
52     {
53         return adoptRef(*new CSSCustomPropertyValue(name, { value }));
54     }
55
56     static Ref<CSSCustomPropertyValue> createWithID(const AtomicString& name, CSSValueID id)
57     {
58         ASSERT(id == CSSValueInherit || id == CSSValueInitial || id == CSSValueUnset || id == CSSValueRevert || id == CSSValueInvalid);
59         return adoptRef(*new CSSCustomPropertyValue(name, { id }));
60     }
61
62     static Ref<CSSCustomPropertyValue> createSyntaxAll(const AtomicString& name, Ref<CSSVariableData>&& value)
63     {
64         return adoptRef(*new CSSCustomPropertyValue(name, { WTFMove(value) }));
65     }
66     
67     static Ref<CSSCustomPropertyValue> createSyntaxLength(const AtomicString& name, Length value)
68     {
69         return adoptRef(*new CSSCustomPropertyValue(name, { WTFMove(value) }));
70     }
71
72     static Ref<CSSCustomPropertyValue> create(const CSSCustomPropertyValue& other)
73     {
74         return adoptRef(*new CSSCustomPropertyValue(other));
75     }
76     
77     String customCSSText() const;
78
79     const AtomicString& name() const { return m_name; }
80     bool isResolved() const  { return !WTF::holds_alternative<Ref<CSSVariableReferenceValue>>(m_value); }
81     bool isUnset() const  { return WTF::holds_alternative<CSSValueID>(m_value) && WTF::get<CSSValueID>(m_value) == CSSValueUnset; }
82     bool isInvalid() const  { return WTF::holds_alternative<CSSValueID>(m_value) && WTF::get<CSSValueID>(m_value) == CSSValueInvalid; }
83
84     const VariantValue& value() const { return m_value; }
85
86     Vector<CSSParserToken> tokens() const;
87     bool equals(const CSSCustomPropertyValue& other) const;
88
89 private:
90     CSSCustomPropertyValue(const AtomicString& name, VariantValue&& value)
91         : CSSValue(CustomPropertyClass)
92         , m_name(name)
93         , m_value(WTFMove(value))
94         , m_serialized(false)
95     {
96     }
97
98     CSSCustomPropertyValue(const CSSCustomPropertyValue& other)
99         : CSSValue(CustomPropertyClass)
100         , m_name(other.m_name)
101         , m_value(CSSValueUnset)
102         , m_stringValue(other.m_stringValue)
103         , m_serialized(other.m_serialized)
104     {
105         // No copy constructor for Ref<CSSVariableData>, so we have to do this ourselves
106         auto visitor = WTF::makeVisitor([&](const Ref<CSSVariableReferenceValue>& value) {
107             m_value = value.copyRef();
108         }, [&](const CSSValueID& value) {
109             m_value = value;
110         }, [&](const Ref<CSSVariableData>& value) {
111             m_value = value.copyRef();
112         }, [&](const Length& value) {
113             m_value = value;
114         });
115         WTF::visit(visitor, other.m_value);
116     }
117     
118     const AtomicString m_name;
119     VariantValue m_value;
120     
121     mutable String m_stringValue;
122     mutable bool m_serialized { false };
123 };
124
125 } // namespace WebCore
126
127 SPECIALIZE_TYPE_TRAITS_CSS_VALUE(CSSCustomPropertyValue, isCustomPropertyValue())