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