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
28 namespace WebCore {
29
CSSValueList(bool isSpaceSeparated)30 CSSValueList::CSSValueList(bool isSpaceSeparated)
31 : m_isSpaceSeparated(isSpaceSeparated)
32 {
33 }
34
CSSValueList(CSSParserValueList * list)35 CSSValueList::CSSValueList(CSSParserValueList* list)
36 : m_isSpaceSeparated(true)
37 {
38 if (list) {
39 size_t size = list->size();
40 for (unsigned i = 0; i < size; ++i)
41 append(list->valueAt(i)->createCSSValue());
42 }
43 }
44
~CSSValueList()45 CSSValueList::~CSSValueList()
46 {
47 }
48
item(unsigned index)49 CSSValue* CSSValueList::item(unsigned index)
50 {
51 if (index >= m_values.size())
52 return 0;
53 return m_values[index].get();
54 }
55
cssValueType() const56 unsigned short CSSValueList::cssValueType() const
57 {
58 return CSS_VALUE_LIST;
59 }
60
append(PassRefPtr<CSSValue> val)61 void CSSValueList::append(PassRefPtr<CSSValue> val)
62 {
63 m_values.append(val);
64 }
65
prepend(PassRefPtr<CSSValue> val)66 void CSSValueList::prepend(PassRefPtr<CSSValue> val)
67 {
68 m_values.prepend(val);
69 }
70
removeAll(CSSValue * val)71 bool CSSValueList::removeAll(CSSValue* val)
72 {
73 bool found = false;
74 // FIXME: we should be implementing operator== to CSSValue and its derived classes
75 // to make comparison more flexible and fast.
76 for (size_t index = 0; index < m_values.size(); index++) {
77 if (m_values.at(index)->cssText() == val->cssText()) {
78 m_values.remove(index);
79 found = true;
80 }
81 }
82
83 return found;
84 }
85
hasValue(CSSValue * val)86 bool CSSValueList::hasValue(CSSValue* val)
87 {
88 // FIXME: we should be implementing operator== to CSSValue and its derived classes
89 // to make comparison more flexible and fast.
90 for (size_t index = 0; index < m_values.size(); index++) {
91 if (m_values.at(index)->cssText() == val->cssText())
92 return true;
93 }
94 return false;
95 }
96
copy()97 PassRefPtr<CSSValueList> CSSValueList::copy()
98 {
99 PassRefPtr<CSSValueList> newList = m_isSpaceSeparated ? createSpaceSeparated() : createCommaSeparated();
100 for (size_t index = 0; index < m_values.size(); index++)
101 newList->append(item(index));
102 return newList;
103 }
104
cssText() const105 String CSSValueList::cssText() const
106 {
107 String result = "";
108
109 unsigned size = m_values.size();
110 for (unsigned i = 0; i < size; i++) {
111 if (!result.isEmpty()) {
112 if (m_isSpaceSeparated)
113 result += " ";
114 else
115 result += ", ";
116 }
117 result += m_values[i]->cssText();
118 }
119
120 return result;
121 }
122
addSubresourceStyleURLs(ListHashSet<KURL> & urls,const CSSStyleSheet * styleSheet)123 void CSSValueList::addSubresourceStyleURLs(ListHashSet<KURL>& urls, const CSSStyleSheet* styleSheet)
124 {
125 size_t size = m_values.size();
126 for (size_t i = 0; i < size; ++i)
127 m_values[i]->addSubresourceStyleURLs(urls, styleSheet);
128 }
129
130 } // namespace WebCore
131