Use "= default" to denote default constructor or destructor
[WebKit-https.git] / Source / WebCore / css / DeprecatedCSSOMValue.h
1 /*
2  * Copyright (C) 2016 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 "CSSStyleDeclaration.h"
29 #include "CSSValue.h"
30 #include "ExceptionOr.h"
31 #include <wtf/Ref.h>
32 #include <wtf/RefCounted.h>
33 #include <wtf/TypeCasts.h>
34 #include <wtf/text/WTFString.h>
35
36 namespace WebCore {
37
38 class DeprecatedCSSOMValue : public RefCounted<DeprecatedCSSOMValue> {
39 public:
40     // Exactly match the IDL. No reason to add anything if it's not in the IDL.
41     enum Type {
42         CSS_INHERIT = 0,
43         CSS_PRIMITIVE_VALUE = 1,
44         CSS_VALUE_LIST = 2,
45         CSS_CUSTOM = 3
46     };
47
48     // Override RefCounted's deref() to ensure operator delete is called on
49     // the appropriate subclass type.
50     void deref()
51     {
52         if (derefBase())
53             destroy();
54     }
55
56     WEBCORE_EXPORT unsigned cssValueType() const;
57
58     WEBCORE_EXPORT String cssText() const;
59     ExceptionOr<void> setCssText(const String&) { return { }; } // Will never implement.
60
61     bool equals(const DeprecatedCSSOMValue& other) const;
62     bool operator==(const DeprecatedCSSOMValue& other) const { return equals(other); }
63
64     bool isComplexValue() const { return m_classType == DeprecatedComplexValueClass; }
65     bool isPrimitiveValue() const { return m_classType == DeprecatedPrimitiveValueClass; }
66     bool isValueList() const { return m_classType == DeprecatedValueListClass; }
67
68     CSSStyleDeclaration& owner() const { return m_owner; }
69
70 protected:
71     static const size_t ClassTypeBits = 2;
72     enum DeprecatedClassType {
73         DeprecatedComplexValueClass,
74         DeprecatedPrimitiveValueClass,
75         DeprecatedValueListClass
76     };
77
78     DeprecatedClassType classType() const { return static_cast<DeprecatedClassType>(m_classType); }
79
80     DeprecatedCSSOMValue(DeprecatedClassType classType, CSSStyleDeclaration& owner)
81         : m_classType(classType)
82         , m_owner(owner)
83     {
84     }
85
86     // NOTE: This class is non-virtual for memory and performance reasons.
87     // Don't go making it virtual again unless you know exactly what you're doing!
88     ~DeprecatedCSSOMValue() = default;
89
90 private:
91     WEBCORE_EXPORT void destroy();
92
93 protected:
94     unsigned m_valueListSeparator : CSSValue::ValueListSeparatorBits;
95     unsigned m_classType : ClassTypeBits; // ClassType
96     
97     Ref<CSSStyleDeclaration> m_owner;
98 };
99
100 class DeprecatedCSSOMComplexValue : public DeprecatedCSSOMValue {
101 public:
102     static Ref<DeprecatedCSSOMComplexValue> create(const CSSValue& value, CSSStyleDeclaration& owner)
103     {
104         return adoptRef(*new DeprecatedCSSOMComplexValue(value, owner));
105     }
106
107     bool equals(const DeprecatedCSSOMComplexValue& other) const { return m_value->equals(other.m_value); }
108     String cssText() const { return m_value->cssText(); }
109
110     unsigned cssValueType() const { return m_value->cssValueType(); }
111
112 protected:
113     DeprecatedCSSOMComplexValue(const CSSValue& value, CSSStyleDeclaration& owner)
114         : DeprecatedCSSOMValue(DeprecatedComplexValueClass, owner)
115         , m_value(const_cast<CSSValue&>(value))
116     {
117     }
118
119 private:
120     Ref<CSSValue> m_value;
121 };
122     
123 } // namespace WebCore
124
125 #define SPECIALIZE_TYPE_TRAITS_CSSOM_VALUE(ToValueTypeName, predicate) \
126 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToValueTypeName) \
127 static bool isType(const WebCore::DeprecatedCSSOMValue& value) { return value.predicate; } \
128 SPECIALIZE_TYPE_TRAITS_END()
129
130 SPECIALIZE_TYPE_TRAITS_CSSOM_VALUE(DeprecatedCSSOMComplexValue, isComplexValue())
131
132