Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / css / CSSValueList.h
1 /*
2  * (C) 1999-2003 Lars Knoll (knoll@kde.org)
3  * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 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 #ifndef CSSValueList_h
22 #define CSSValueList_h
23
24 #include "core/css/CSSValue.h"
25 #include "wtf/PassRefPtr.h"
26 #include "wtf/Vector.h"
27
28 namespace blink {
29
30 class CSSValueList : public CSSValue {
31 public:
32     static PassRefPtrWillBeRawPtr<CSSValueList> createCommaSeparated()
33     {
34         return adoptRefWillBeNoop(new CSSValueList(CommaSeparator));
35     }
36     static PassRefPtrWillBeRawPtr<CSSValueList> createSpaceSeparated()
37     {
38         return adoptRefWillBeNoop(new CSSValueList(SpaceSeparator));
39     }
40     static PassRefPtrWillBeRawPtr<CSSValueList> createSlashSeparated()
41     {
42         return adoptRefWillBeNoop(new CSSValueList(SlashSeparator));
43     }
44
45     size_t length() const { return m_values.size(); }
46     CSSValue* item(size_t index) { return m_values[index].get(); }
47     const CSSValue* item(size_t index) const { return m_values[index].get(); }
48     CSSValue* itemWithBoundsCheck(size_t index) { return index < m_values.size() ? m_values[index].get() : 0; }
49     const CSSValue* itemWithBoundsCheck(size_t index) const { return index < m_values.size() ? m_values[index].get() : 0; }
50
51     void append(PassRefPtrWillBeRawPtr<CSSValue> value) { m_values.append(value); }
52     void prepend(PassRefPtrWillBeRawPtr<CSSValue> value) { m_values.prepend(value); }
53     bool removeAll(CSSValue*);
54     bool hasValue(CSSValue*) const;
55     PassRefPtrWillBeRawPtr<CSSValueList> copy();
56
57     String customCSSText(CSSTextFormattingFlags = QuoteCSSStringIfNeeded) const;
58     bool equals(const CSSValueList&) const;
59     bool equals(const CSSValue&) const;
60
61     bool hasFailedOrCanceledSubresources() const;
62
63     PassRefPtrWillBeRawPtr<CSSValueList> cloneForCSSOM() const;
64
65     void traceAfterDispatch(Visitor*);
66
67 protected:
68     CSSValueList(ClassType, ValueListSeparator);
69     CSSValueList(const CSSValueList& cloneFrom);
70
71 private:
72     explicit CSSValueList(ValueListSeparator);
73
74     WillBeHeapVector<RefPtrWillBeMember<CSSValue>, 4> m_values;
75 };
76
77 DEFINE_CSS_VALUE_TYPE_CASTS(CSSValueList, isValueList());
78
79 // FIXME: We should add begin() and end() to CSSValueList and use range-based
80 // for loops instead of having an iterator class.
81 class CSSValueListIterator {
82     STACK_ALLOCATED();
83 public:
84     CSSValueListIterator(CSSValue* value) : m_list(toCSSValueList(value)), m_position(0) { }
85     bool hasMore() const { return m_position < m_list->length(); }
86     CSSValue* value() const { return m_list->item(m_position); }
87     bool isPrimitiveValue() const { return value()->isPrimitiveValue(); }
88     void advance() { m_position++; ASSERT(m_position <= m_list->length());}
89     size_t index() const { return m_position; }
90 private:
91     RawPtrWillBeMember<CSSValueList> m_list;
92     size_t m_position;
93 };
94
95 } // namespace blink
96
97 #endif // CSSValueList_h