Don't expose internal CSSValues in API
[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 "PlatformString.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* list)
44     : CSSValue(ValueListClass)
45 {
46     m_valueListSeparator = SpaceSeparator;
47     if (list) {
48         size_t size = list->size();
49         for (unsigned i = 0; i < size; ++i)
50             append(list->valueAt(i)->createCSSValue());
51     }
52 }
53
54 void CSSValueList::append(PassRefPtr<CSSValue> val)
55 {
56     m_values.append(val);
57 }
58
59 void CSSValueList::prepend(PassRefPtr<CSSValue> val)
60 {
61     m_values.prepend(val);
62 }
63
64 bool CSSValueList::removeAll(CSSValue* val)
65 {
66     bool found = false;
67     // FIXME: we should be implementing operator== to CSSValue and its derived classes
68     // to make comparison more flexible and fast.
69     for (size_t index = 0; index < m_values.size(); index++) {
70         if (m_values.at(index)->cssText() == val->cssText()) {
71             m_values.remove(index);
72             found = true;
73         }
74     }
75
76     return found;
77 }
78
79 bool CSSValueList::hasValue(CSSValue* val) const
80 {
81     // FIXME: we should be implementing operator== to CSSValue and its derived classes
82     // to make comparison more flexible and fast.
83     for (size_t index = 0; index < m_values.size(); index++) {
84         if (m_values.at(index)->cssText() == val->cssText())
85             return true;
86     }
87     return false;
88 }
89
90 PassRefPtr<CSSValueList> CSSValueList::copy()
91 {
92     RefPtr<CSSValueList> newList;
93     switch (m_valueListSeparator) {
94     case SpaceSeparator:
95         newList = createSpaceSeparated();
96         break;
97     case CommaSeparator:
98         newList = createCommaSeparated();
99         break;
100     case SlashSeparator:
101         newList = createSlashSeparated();
102         break;
103     default:
104         ASSERT_NOT_REACHED();
105     }
106     for (size_t index = 0; index < m_values.size(); index++)
107         newList->append(m_values[index]);
108     return newList.release();
109 }
110
111 String CSSValueList::customCssText() const
112 {
113     StringBuilder result;
114     String separator;
115     switch (m_valueListSeparator) {
116     case SpaceSeparator:
117         separator = " ";
118         break;
119     case CommaSeparator:
120         separator = ", ";
121         break;
122     case SlashSeparator:
123         separator = " / ";
124         break;
125     default:
126         ASSERT_NOT_REACHED();
127     }
128
129     unsigned size = m_values.size();
130     for (unsigned i = 0; i < size; i++) {
131         if (!result.isEmpty())
132             result.append(separator);
133         result.append(m_values[i]->cssText());
134     }
135
136     return result.toString();
137 }
138
139 void CSSValueList::addSubresourceStyleURLs(ListHashSet<KURL>& urls, const CSSStyleSheet* styleSheet)
140 {
141     size_t size = m_values.size();
142     for (size_t i = 0; i < size; ++i)
143         m_values[i]->addSubresourceStyleURLs(urls, styleSheet);
144 }
145
146 CSSValueList::CSSValueList(const CSSValueList& cloneFrom)
147     : CSSValue(cloneFrom.classType(), /* isCSSOMSafe */ true)
148 {
149     m_valueListSeparator = cloneFrom.m_valueListSeparator;
150     m_values.resize(cloneFrom.m_values.size());
151     for (unsigned i = 0; i < m_values.size(); ++i)
152         m_values[i] = cloneFrom.m_values[i]->cloneForCSSOM();
153 }
154
155 PassRefPtr<CSSValueList> CSSValueList::cloneForCSSOM() const
156 {
157     return adoptRef(new CSSValueList(*this));
158 }
159
160 } // namespace WebCore