15ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (C) 1999-2003 Lars Knoll (knoll@kde.org)
35ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * Copyright (C) 2004, 2005, 2006, 2007, 2010 Apple Inc. All rights reserved.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSValueList.h"
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSParserValues.h"
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h"
265ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include <wtf/PassOwnPtr.h>
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSValueList::CSSValueList(bool isSpaceSeparated)
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_isSpaceSeparated(isSpaceSeparated)
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSValueList::CSSValueList(CSSParserValueList* list)
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_isSpaceSeparated(true)
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (list) {
395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        size_t size = list->size();
405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        for (unsigned i = 0; i < size; ++i)
415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            append(list->valueAt(i)->createCSSValue());
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSValueList::~CSSValueList()
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSValue* CSSValueList::item(unsigned index)
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (index >= m_values.size())
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_values[index].get();
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned short CSSValueList::cssValueType() const
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return CSS_VALUE_LIST;
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSValueList::append(PassRefPtr<CSSValue> val)
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_values.append(val);
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSValueList::prepend(PassRefPtr<CSSValue> val)
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_values.prepend(val);
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool CSSValueList::removeAll(CSSValue* val)
720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    bool found = false;
740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // FIXME: we should be implementing operator== to CSSValue and its derived classes
750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // to make comparison more flexible and fast.
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    for (size_t index = 0; index < m_values.size(); index++) {
770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (m_values.at(index)->cssText() == val->cssText()) {
780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            m_values.remove(index);
790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            found = true;
800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return found;
840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool CSSValueList::hasValue(CSSValue* val)
870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // FIXME: we should be implementing operator== to CSSValue and its derived classes
890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // to make comparison more flexible and fast.
900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    for (size_t index = 0; index < m_values.size(); index++) {
910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (m_values.at(index)->cssText() == val->cssText())
920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return true;
930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return false;
950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
97231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockPassRefPtr<CSSValueList> CSSValueList::copy()
98231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
99231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    PassRefPtr<CSSValueList> newList = m_isSpaceSeparated ? createSpaceSeparated() : createCommaSeparated();
100231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    for (size_t index = 0; index < m_values.size(); index++)
101231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        newList->append(item(index));
102231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return newList;
103231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
104231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString CSSValueList::cssText() const
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String result = "";
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned size = m_values.size();
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < size; i++) {
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!result.isEmpty()) {
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_isSpaceSeparated)
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                result += " ";
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                result += ", ";
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result += m_values[i]->cssText();
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
123635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid CSSValueList::addSubresourceStyleURLs(ListHashSet<KURL>& urls, const CSSStyleSheet* styleSheet)
124635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    size_t size = m_values.size();
126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    for (size_t i = 0; i < size; ++i)
127635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_values[i]->addSubresourceStyleURLs(urls, styleSheet);
128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
131