Part 2 of removing PlatformString.h, remove PlatformString.h
[WebKit-https.git] / Source / WebCore / css / CSSValueList.cpp
1 /*
2  * (C) 1999-2003 Lars Knoll (knoll@kde.org)
3  * Copyright (C) 2004, 2005, 2006, 2007, 2010 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 #include "config.h"
22 #include "CSSValueList.h"
23
24 #include "CSSParserValues.h"
25 #include "MemoryInstrumentation.h"
26 #include <wtf/PassOwnPtr.h>
27 #include <wtf/text/StringBuilder.h>
28
29 namespace WebCore {
30
31 CSSValueList::CSSValueList(ClassType classType, ValueListSeparator listSeparator)
32     : CSSValue(classType)
33 {
34     m_valueListSeparator = listSeparator;
35 }
36
37 CSSValueList::CSSValueList(ValueListSeparator listSeparator)
38     : CSSValue(ValueListClass)
39 {
40     m_valueListSeparator = listSeparator;
41 }
42
43 CSSValueList::CSSValueList(CSSParserValueList* parserValues)
44     : CSSValue(ValueListClass)
45 {
46     m_valueListSeparator = SpaceSeparator;
47     if (parserValues) {
48         m_values.reserveInitialCapacity(parserValues->size());
49         for (unsigned i = 0; i < parserValues->size(); ++i)
50             m_values.uncheckedAppend(parserValues->valueAt(i)->createCSSValue());
51     }
52 }
53
54 bool CSSValueList::removeAll(CSSValue* val)
55 {
56     bool found = false;
57     // FIXME: we should be implementing operator== to CSSValue and its derived classes
58     // to make comparison more flexible and fast.
59     for (size_t index = 0; index < m_values.size(); index++) {
60         if (m_values.at(index)->cssText() == val->cssText()) {
61             m_values.remove(index);
62             found = true;
63         }
64     }
65
66     return found;
67 }
68
69 bool CSSValueList::hasValue(CSSValue* val) const
70 {
71     // FIXME: we should be implementing operator== to CSSValue and its derived classes
72     // to make comparison more flexible and fast.
73     for (size_t index = 0; index < m_values.size(); index++) {
74         if (m_values.at(index)->cssText() == val->cssText())
75             return true;
76     }
77     return false;
78 }
79
80 PassRefPtr<CSSValueList> CSSValueList::copy()
81 {
82     RefPtr<CSSValueList> newList;
83     switch (m_valueListSeparator) {
84     case SpaceSeparator:
85         newList = createSpaceSeparated();
86         break;
87     case CommaSeparator:
88         newList = createCommaSeparated();
89         break;
90     case SlashSeparator:
91         newList = createSlashSeparated();
92         break;
93     default:
94         ASSERT_NOT_REACHED();
95     }
96     for (size_t index = 0; index < m_values.size(); index++)
97         newList->append(m_values[index]);
98     return newList.release();
99 }
100
101 String CSSValueList::customCssText() const
102 {
103     StringBuilder result;
104     String separator;
105     switch (m_valueListSeparator) {
106     case SpaceSeparator:
107         separator = " ";
108         break;
109     case CommaSeparator:
110         separator = ", ";
111         break;
112     case SlashSeparator:
113         separator = " / ";
114         break;
115     default:
116         ASSERT_NOT_REACHED();
117     }
118
119     unsigned size = m_values.size();
120     for (unsigned i = 0; i < size; i++) {
121         if (!result.isEmpty())
122             result.append(separator);
123         result.append(m_values[i]->cssText());
124     }
125
126     return result.toString();
127 }
128
129 #if ENABLE(CSS_VARIABLES)
130 String CSSValueList::customSerializeResolvingVariables(const HashMap<AtomicString, String>& variables) const
131 {
132     StringBuilder result;
133     String separator;
134     switch (m_valueListSeparator) {
135     case SpaceSeparator:
136         separator = " ";
137         break;
138     case CommaSeparator:
139         separator = ", ";
140         break;
141     case SlashSeparator:
142         separator = " / ";
143         break;
144     default:
145         ASSERT_NOT_REACHED();
146     }
147
148     unsigned size = m_values.size();
149     for (unsigned i = 0; i < size; i++) {
150         if (!result.isEmpty())
151             result.append(separator);
152         result.append(m_values[i]->serializeResolvingVariables(variables));
153     }
154
155     return result.toString();
156 }
157 #endif
158
159 void CSSValueList::addSubresourceStyleURLs(ListHashSet<KURL>& urls, const StyleSheetContents* styleSheet) const
160 {
161     size_t size = m_values.size();
162     for (size_t i = 0; i < size; ++i)
163         m_values[i]->addSubresourceStyleURLs(urls, styleSheet);
164 }
165
166 bool CSSValueList::hasFailedOrCanceledSubresources() const
167 {
168     for (unsigned i = 0; i < m_values.size(); ++i) {
169         if (m_values[i]->hasFailedOrCanceledSubresources())
170             return true;
171     }
172     return false;
173 }
174
175 CSSValueList::CSSValueList(const CSSValueList& cloneFrom)
176     : CSSValue(cloneFrom.classType(), /* isCSSOMSafe */ true)
177 {
178     m_valueListSeparator = cloneFrom.m_valueListSeparator;
179     m_values.resize(cloneFrom.m_values.size());
180     for (unsigned i = 0; i < m_values.size(); ++i)
181         m_values[i] = cloneFrom.m_values[i]->cloneForCSSOM();
182 }
183
184 PassRefPtr<CSSValueList> CSSValueList::cloneForCSSOM() const
185 {
186     return adoptRef(new CSSValueList(*this));
187 }
188
189 void CSSValueList::reportDescendantMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
190 {
191     MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CSS);
192     info.addInstrumentedVector(m_values);
193 }
194
195 } // namespace WebCore