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