1/*
2 * Copyright (C) 2010 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1.  Redistributions of source code must retain the above copyright
8 *     notice, this list of conditions and the following disclaimer.
9 * 2.  Redistributions in binary form must reproduce the above copyright
10 *     notice, this list of conditions and the following disclaimer in the
11 *     documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 */
24
25#ifndef DOMTokenList_h
26#define DOMTokenList_h
27
28#include "bindings/core/v8/ScriptWrappable.h"
29#include "platform/heap/Handle.h"
30#include "wtf/Vector.h"
31#include "wtf/text/AtomicString.h"
32
33namespace blink {
34
35class Element;
36class ExceptionState;
37
38class DOMTokenList : public NoBaseWillBeGarbageCollectedFinalized<DOMTokenList>, public ScriptWrappable {
39    DEFINE_WRAPPERTYPEINFO();
40    WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
41    WTF_MAKE_NONCOPYABLE(DOMTokenList);
42public:
43    DOMTokenList() { }
44    virtual ~DOMTokenList() { }
45
46#if !ENABLE(OILPAN)
47    virtual void ref() = 0;
48    virtual void deref() = 0;
49#endif
50
51    virtual unsigned length() const = 0;
52    virtual const AtomicString item(unsigned index) const = 0;
53
54    bool contains(const AtomicString&, ExceptionState&) const;
55    virtual void add(const Vector<String>&, ExceptionState&);
56    void add(const AtomicString&, ExceptionState&);
57    virtual void remove(const Vector<String>&, ExceptionState&);
58    void remove(const AtomicString&, ExceptionState&);
59    bool toggle(const AtomicString&, ExceptionState&);
60    bool toggle(const AtomicString&, bool force, ExceptionState&);
61
62    const AtomicString& toString() const { return value(); }
63
64    virtual Element* element() { return 0; }
65
66    virtual void trace(Visitor*) { }
67
68protected:
69    virtual const AtomicString& value() const = 0;
70    virtual void setValue(const AtomicString&) = 0;
71
72    virtual void addInternal(const AtomicString&);
73    virtual bool containsInternal(const AtomicString&) const = 0;
74    virtual void removeInternal(const AtomicString&);
75
76    static bool validateToken(const String&, ExceptionState&);
77    static bool validateTokens(const Vector<String>&, ExceptionState&);
78    static AtomicString addToken(const AtomicString&, const AtomicString&);
79    static AtomicString addTokens(const AtomicString&, const Vector<String>&);
80    static AtomicString removeToken(const AtomicString&, const AtomicString&);
81    static AtomicString removeTokens(const AtomicString&, const Vector<String>&);
82};
83
84} // namespace blink
85
86#endif // DOMTokenList_h
87