Allow implicit conversion from Ref<T> to T&
[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, 2013 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 <wtf/text/StringBuilder.h>
26
27 namespace WebCore {
28
29 CSSValueList::CSSValueList(ClassType classType, ValueListSeparator listSeparator)
30     : CSSValue(classType)
31 {
32     m_valueListSeparator = listSeparator;
33 }
34
35 CSSValueList::CSSValueList(ValueListSeparator listSeparator)
36     : CSSValue(ValueListClass)
37 {
38     m_valueListSeparator = listSeparator;
39 }
40
41 CSSValueList::CSSValueList(CSSParserValueList& parserValues)
42     : CSSValue(ValueListClass)
43 {
44     m_valueListSeparator = SpaceSeparator;
45     m_values.reserveInitialCapacity(parserValues.size());
46     for (unsigned i = 0, size = parserValues.size(); i < size; ++i) {
47         RefPtr<CSSValue> value = parserValues.valueAt(i)->createCSSValue();
48         ASSERT(value);
49         m_values.uncheckedAppend(value.releaseNonNull());
50     }
51 }
52
53 bool CSSValueList::removeAll(CSSValue* val)
54 {
55     // FIXME: Why even take a pointer?
56     if (!val)
57         return false;
58
59     bool found = false;
60     for (unsigned i = 0; i < m_values.size(); ++i) {
61         if (m_values[i].get().equals(*val)) {
62             m_values.remove(i);
63             found = true;
64         }
65     }
66
67     return found;
68 }
69
70 bool CSSValueList::hasValue(CSSValue* val) const
71 {
72     // FIXME: Why even take a pointer?
73     if (!val)
74         return false;
75
76     for (unsigned i = 0, size = m_values.size(); i < size; ++i) {
77         if (m_values[i].get().equals(*val))
78             return true;
79     }
80     return false;
81 }
82
83 PassRefPtr<CSSValueList> CSSValueList::copy()
84 {
85     RefPtr<CSSValueList> newList;
86     switch (m_valueListSeparator) {
87     case SpaceSeparator:
88         newList = createSpaceSeparated();
89         break;
90     case CommaSeparator:
91         newList = createCommaSeparated();
92         break;
93     case SlashSeparator:
94         newList = createSlashSeparated();
95         break;
96     default:
97         ASSERT_NOT_REACHED();
98     }
99     for (auto& value : m_values)
100         newList->append(value.get());
101     return newList.release();
102 }
103
104 String CSSValueList::customCSSText() const
105 {
106     StringBuilder result;
107     String separator;
108     switch (m_valueListSeparator) {
109     case SpaceSeparator:
110         separator = ASCIILiteral(" ");
111         break;
112     case CommaSeparator:
113         separator = ASCIILiteral(", ");
114         break;
115     case SlashSeparator:
116         separator = ASCIILiteral(" / ");
117         break;
118     default:
119         ASSERT_NOT_REACHED();
120     }
121
122     for (auto& value : m_values) {
123         if (!result.isEmpty())
124             result.append(separator);
125         result.append(value.get().cssText());
126     }
127
128     return result.toString();
129 }
130
131 bool CSSValueList::equals(const CSSValueList& other) const
132 {
133     if (m_valueListSeparator != other.m_valueListSeparator)
134         return false;
135
136     if (m_values.size() != other.m_values.size())
137         return false;
138
139     for (unsigned i = 0, size = m_values.size(); i < size; ++i) {
140         if (!m_values[i].get().equals(other.m_values[i]))
141             return false;
142     }
143     return true;
144 }
145
146 bool CSSValueList::equals(const CSSValue& other) const
147 {
148     if (m_values.size() != 1)
149         return false;
150
151     return m_values[0].get().equals(other);
152 }
153
154 void CSSValueList::addSubresourceStyleURLs(ListHashSet<URL>& urls, const StyleSheetContents* styleSheet) const
155 {
156     for (unsigned i = 0, size = m_values.size(); i < size; ++i)
157         m_values[i].get().addSubresourceStyleURLs(urls, styleSheet);
158 }
159
160 bool CSSValueList::hasFailedOrCanceledSubresources() const
161 {
162     for (unsigned i = 0; i < m_values.size(); ++i) {
163         if (m_values[i].get().hasFailedOrCanceledSubresources())
164             return true;
165     }
166     return false;
167 }
168
169 CSSValueList::CSSValueList(const CSSValueList& cloneFrom)
170     : CSSValue(cloneFrom.classType(), /* isCSSOMSafe */ true)
171 {
172     m_valueListSeparator = cloneFrom.m_valueListSeparator;
173     m_values.reserveInitialCapacity(cloneFrom.m_values.size());
174     for (unsigned i = 0, size = cloneFrom.m_values.size(); i < size; ++i)
175         m_values.uncheckedAppend(*cloneFrom.m_values[i]->cloneForCSSOM());
176 }
177
178 PassRefPtr<CSSValueList> CSSValueList::cloneForCSSOM() const
179 {
180     return adoptRef(new CSSValueList(*this));
181 }
182
183 } // namespace WebCore