15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 1999-2003 Lars Knoll (knoll@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef CSSValueList_h
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define CSSValueList_h
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSValue.h"
25e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/PassRefPtr.h"
26e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/Vector.h"
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSParserValueList;
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSValueList : public CSSValue {
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static PassRefPtr<CSSValueList> createCommaSeparated()
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return adoptRef(new CSSValueList(CommaSeparator));
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static PassRefPtr<CSSValueList> createSpaceSeparated()
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return adoptRef(new CSSValueList(SpaceSeparator));
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static PassRefPtr<CSSValueList> createSlashSeparated()
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return adoptRef(new CSSValueList(SlashSeparator));
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static PassRefPtr<CSSValueList> createFromParserValueList(CSSParserValueList* list)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return adoptRef(new CSSValueList(list));
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t length() const { return m_values.size(); }
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSValue* item(size_t index) { return index < m_values.size() ? m_values[index].get() : 0; }
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const CSSValue* item(size_t index) const { return index < m_values.size() ? m_values[index].get() : 0; }
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSValue* itemWithoutBoundsCheck(size_t index) { return m_values[index].get(); }
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void append(PassRefPtr<CSSValue> value) { m_values.append(value); }
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void prepend(PassRefPtr<CSSValue> value) { m_values.prepend(value); }
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool removeAll(CSSValue*);
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasValue(CSSValue*) const;
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<CSSValueList> copy();
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
62591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    String customCssText(CssTextFormattingFlags = QuoteCSSStringIfNeeded) const;
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool equals(const CSSValueList&) const;
64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool equals(const CSSValue&) const;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String customSerializeResolvingVariables(const HashMap<AtomicString, String>&) const;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void addSubresourceStyleURLs(ListHashSet<KURL>&, const StyleSheetContents*) const;
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasFailedOrCanceledSubresources() const;
7002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<CSSValueList> cloneForCSSOM() const;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSValueList(ClassType, ValueListSeparator);
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSValueList(const CSSValueList& cloneFrom);
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    explicit CSSValueList(ValueListSeparator);
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    explicit CSSValueList(CSSParserValueList*);
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<RefPtr<CSSValue>, 4> m_values;
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
84e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)inline CSSValueList* toCSSValueList(CSSValue* value)
85e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
86e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    ASSERT_WITH_SECURITY_IMPLICATION(!value || value->isValueList());
87e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    return static_cast<CSSValueList*>(value);
88e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
89e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
90e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)inline const CSSValueList* toCSSValueList(const CSSValue* value)
91e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
92e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    ASSERT_WITH_SECURITY_IMPLICATION(!value || value->isValueList());
93e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    return static_cast<const CSSValueList*>(value);
94e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
95e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
96e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)// Catch unneeded cast.
97e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)void toCSSValueList(const CSSValueList*);
98e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Objects of this class are intended to be stack-allocated and scoped to a single function.
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Please take care not to pass these around as they do hold onto a raw pointer.
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSValueListInspector {
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
103e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    CSSValueListInspector(CSSValue* value) : m_list((value && value->isValueList()) ? toCSSValueList(value) : 0) { }
104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    CSSValue* item(size_t index) const { ASSERT_WITH_SECURITY_IMPLICATION(index < length()); return m_list->itemWithoutBoundsCheck(index); }
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSValue* first() const { return item(0); }
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSValue* second() const { return item(1); }
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t length() const { return m_list ? m_list->length() : 0; }
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSValueList* m_list;
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Wrapper that can be used to iterate over any CSSValue. Non-list values and 0 behave as zero-length lists.
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Objects of this class are intended to be stack-allocated and scoped to a single function.
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Please take care not to pass these around as they do hold onto a raw pointer.
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSValueListIterator {
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSValueListIterator(CSSValue* value) : m_inspector(value), m_position(0) { }
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasMore() const { return m_position < m_inspector.length(); }
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSValue* value() const { return m_inspector.item(m_position); }
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isPrimitiveValue() const { return value()->isPrimitiveValue(); }
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void advance() { m_position++; ASSERT(m_position <= m_inspector.length());}
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t index() const { return m_position; }
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSValueListInspector m_inspector;
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t m_position;
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
127e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // CSSValueList_h
131