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