Add WTF::move()
[WebKit-https.git] / Source / WebCore / css / WebKitCSSKeyframeRule.cpp
1 /*
2  * Copyright (C) 2007, 2008, 2012 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 #include "config.h"
27 #include "WebKitCSSKeyframeRule.h"
28
29 #include "PropertySetCSSStyleDeclaration.h"
30 #include "StyleProperties.h"
31 #include "WebKitCSSKeyframesRule.h"
32 #include <wtf/text/StringBuilder.h>
33
34 namespace WebCore {
35
36 StyleKeyframe::StyleKeyframe(PassRef<StyleProperties> properties)
37     : m_properties(WTF::move(properties))
38 {
39 }
40
41 StyleKeyframe::~StyleKeyframe()
42 {
43 }
44
45 MutableStyleProperties& StyleKeyframe::mutableProperties()
46 {
47     if (!m_properties->isMutable())
48         m_properties = m_properties->mutableCopy();
49     return static_cast<MutableStyleProperties&>(m_properties.get());
50 }
51
52 /* static */
53 void StyleKeyframe::parseKeyString(const String& s, Vector<double>& keys)
54 {
55     keys.clear();
56     Vector<String> strings;
57     s.split(',', strings);
58
59     for (size_t i = 0; i < strings.size(); ++i) {
60         double key = -1;
61         String cur = strings[i].stripWhiteSpace();
62         
63         // For now the syntax MUST be 'xxx%' or 'from' or 'to', where xxx is a legal floating point number
64         if (cur == "from")
65             key = 0;
66         else if (cur == "to")
67             key = 1;
68         else if (cur.endsWith('%')) {
69             double k = cur.substring(0, cur.length() - 1).toDouble();
70             if (k >= 0 && k <= 100)
71                 key = k/100;
72         }
73         if (key < 0) {
74             keys.clear();
75             return;
76         }
77         else
78             keys.append(key);
79     }
80 }
81
82 String StyleKeyframe::cssText() const
83 {
84     StringBuilder result;
85     result.append(keyText());
86     result.appendLiteral(" { ");
87     String decls = m_properties->asText();
88     result.append(decls);
89     if (!decls.isEmpty())
90         result.append(' ');
91     result.append('}');
92     return result.toString();
93 }
94
95 WebKitCSSKeyframeRule::WebKitCSSKeyframeRule(StyleKeyframe* keyframe, WebKitCSSKeyframesRule* parent)
96     : CSSRule(0)
97     , m_keyframe(keyframe)
98 {
99     setParentRule(parent);
100 }
101
102 WebKitCSSKeyframeRule::~WebKitCSSKeyframeRule()
103 {
104     if (m_propertiesCSSOMWrapper)
105         m_propertiesCSSOMWrapper->clearParentRule();
106 }
107
108 CSSStyleDeclaration* WebKitCSSKeyframeRule::style()
109 {
110     if (!m_propertiesCSSOMWrapper)
111         m_propertiesCSSOMWrapper = StyleRuleCSSStyleDeclaration::create(m_keyframe->mutableProperties(), *this);
112     return m_propertiesCSSOMWrapper.get();
113 }
114
115 void WebKitCSSKeyframeRule::reattach(StyleRuleBase*)
116 {
117     // No need to reattach, the underlying data is shareable on mutation.
118     ASSERT_NOT_REACHED();
119 }
120
121 } // namespace WebCore