Use NeverDestroyed instead of DEPRECATED_DEFINE_STATIC_LOCAL
[WebKit-https.git] / Source / WebCore / platform / animation / Animation.cpp
1 /*
2  * Copyright (C) 1999 Antti Koivisto (koivisto@kde.org)
3  * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  *
20  */
21
22 #include "config.h"
23 #include "Animation.h"
24
25 #include <wtf/NeverDestroyed.h>
26
27 namespace WebCore {
28
29 Animation::Animation()
30     : m_name(initialName())
31     , m_property(CSSPropertyInvalid)
32     , m_mode(AnimateAll)
33     , m_iterationCount(initialIterationCount())
34     , m_delay(initialDelay())
35     , m_duration(initialDuration())
36     , m_timingFunction(initialTimingFunction())
37 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
38     , m_trigger(initialTrigger())
39 #endif
40     , m_direction(initialDirection())
41     , m_fillMode(initialFillMode())
42     , m_playState(initialPlayState())
43     , m_delaySet(false)
44     , m_directionSet(false)
45     , m_durationSet(false)
46     , m_fillModeSet(false)
47     , m_iterationCountSet(false)
48     , m_nameSet(false)
49     , m_playStateSet(false)
50     , m_propertySet(false)
51     , m_timingFunctionSet(false)
52 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
53     , m_triggerSet(false)
54 #endif
55     , m_isNone(false)
56 {
57 }
58
59 Animation::Animation(const Animation& o)
60     : RefCounted<Animation>()
61     , m_name(o.m_name)
62     , m_property(o.m_property)
63     , m_mode(o.m_mode)
64     , m_iterationCount(o.m_iterationCount)
65     , m_delay(o.m_delay)
66     , m_duration(o.m_duration)
67     , m_timingFunction(o.m_timingFunction)
68 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
69     , m_trigger(o.m_trigger)
70 #endif
71     , m_direction(o.m_direction)
72     , m_fillMode(o.m_fillMode)
73     , m_playState(o.m_playState)
74     , m_delaySet(o.m_delaySet)
75     , m_directionSet(o.m_directionSet)
76     , m_durationSet(o.m_durationSet)
77     , m_fillModeSet(o.m_fillModeSet)
78     , m_iterationCountSet(o.m_iterationCountSet)
79     , m_nameSet(o.m_nameSet)
80     , m_playStateSet(o.m_playStateSet)
81     , m_propertySet(o.m_propertySet)
82     , m_timingFunctionSet(o.m_timingFunctionSet)
83 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
84     , m_triggerSet(o.m_triggerSet)
85 #endif
86     , m_isNone(o.m_isNone)
87 {
88 }
89
90 Animation& Animation::operator=(const Animation& o)
91 {
92     m_name = o.m_name;
93     m_property = o.m_property;
94     m_mode = o.m_mode;
95     m_iterationCount = o.m_iterationCount;
96     m_delay = o.m_delay;
97     m_duration = o.m_duration;
98     m_timingFunction = o.m_timingFunction;
99 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
100     m_trigger = o.m_trigger;
101 #endif
102     m_direction = o.m_direction;
103     m_fillMode = o.m_fillMode;
104     m_playState = o.m_playState;
105 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
106     m_trigger = o.m_trigger;
107 #endif
108
109     m_delaySet = o.m_delaySet;
110     m_directionSet = o.m_directionSet;
111     m_durationSet = o.m_durationSet;
112     m_fillModeSet = o.m_fillModeSet;
113     m_iterationCountSet = o.m_iterationCountSet;
114     m_nameSet = o.m_nameSet;
115     m_playStateSet = o.m_playStateSet;
116     m_propertySet = o.m_propertySet;
117     m_timingFunctionSet = o.m_timingFunctionSet;
118 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
119     m_triggerSet = o.m_triggerSet;
120 #endif
121     m_isNone = o.m_isNone;
122
123     return *this;
124 }
125
126 Animation::~Animation()
127 {
128 }
129
130 bool Animation::animationsMatch(const Animation& other, bool matchPlayStates) const
131 {
132     bool result = m_name == other.m_name
133         && m_property == other.m_property
134         && m_mode == other.m_mode
135         && m_iterationCount == other.m_iterationCount
136         && m_delay == other.m_delay
137         && m_duration == other.m_duration
138         && *(m_timingFunction.get()) == *(other.m_timingFunction.get())
139 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
140         && *(m_trigger.get()) == *(other.m_trigger.get())
141 #endif
142         && m_direction == other.m_direction
143         && m_fillMode == other.m_fillMode
144         && m_delaySet == other.m_delaySet
145         && m_directionSet == other.m_directionSet
146         && m_durationSet == other.m_durationSet
147         && m_fillModeSet == other.m_fillModeSet
148         && m_iterationCountSet == other.m_iterationCountSet
149         && m_nameSet == other.m_nameSet
150         && m_propertySet == other.m_propertySet
151         && m_timingFunctionSet == other.m_timingFunctionSet
152 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
153         && m_triggerSet == other.m_triggerSet
154 #endif
155         && m_isNone == other.m_isNone;
156
157     if (!result)
158         return false;
159
160     return !matchPlayStates || (m_playState == other.m_playState && m_playStateSet == other.m_playStateSet);
161 }
162
163 const String& Animation::initialName()
164 {
165     static NeverDestroyed<String> initialValue(ASCIILiteral("none"));
166     return initialValue;
167 }
168
169 } // namespace WebCore