1/*
2 * Copyright (C) 2012 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 are
6 * met:
7 *
8 *     * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *     * Neither the name of Google Inc. nor the names of its
11 * contributors may be used to endorse or promote products derived from
12 * this software without specific prior written permission.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#ifndef UserActionElementSet_h
28#define UserActionElementSet_h
29
30#include "platform/heap/Handle.h"
31#include "wtf/HashMap.h"
32#include "wtf/PassOwnPtr.h"
33#include "wtf/RefPtr.h"
34
35namespace WebCore {
36
37class Node;
38class Element;
39
40class UserActionElementSet FINAL {
41    DISALLOW_ALLOCATION();
42public:
43    bool isFocused(const Node* node) { return hasFlags(node, IsFocusedFlag); }
44    bool isActive(const Node* node) { return hasFlags(node, IsActiveFlag); }
45    bool isInActiveChain(const Node* node) { return hasFlags(node, InActiveChainFlag); }
46    bool isHovered(const Node* node) { return hasFlags(node, IsHoveredFlag); }
47    void setFocused(Node* node, bool enable) { setFlags(node, enable, IsFocusedFlag); }
48    void setActive(Node* node, bool enable) { setFlags(node, enable, IsActiveFlag); }
49    void setInActiveChain(Node* node, bool enable) { setFlags(node, enable, InActiveChainFlag); }
50    void setHovered(Node* node, bool enable) { setFlags(node, enable, IsHoveredFlag); }
51
52    UserActionElementSet();
53    ~UserActionElementSet();
54
55    void didDetach(Node*);
56
57#if !ENABLE(OILPAN)
58    void documentDidRemoveLastRef();
59#endif
60
61    void trace(Visitor*);
62
63private:
64    enum ElementFlags {
65        IsActiveFlag      = 1 ,
66        InActiveChainFlag = 1 << 1,
67        IsHoveredFlag     = 1 << 2,
68        IsFocusedFlag     = 1 << 3
69    };
70
71    void setFlags(Node* node, bool enable, unsigned flags) { enable ? setFlags(node, flags) : clearFlags(node, flags); }
72    void setFlags(Node*, unsigned);
73    void clearFlags(Node*, unsigned);
74    bool hasFlags(const Node*, unsigned flags) const;
75
76    void setFlags(Element*, unsigned);
77    void clearFlags(Element*, unsigned);
78    bool hasFlags(const Element*, unsigned flags) const;
79
80    typedef WillBeHeapHashMap<RefPtrWillBeMember<Element>, unsigned> ElementFlagMap;
81    ElementFlagMap m_elements;
82};
83
84} // namespace
85
86#endif // UserActionElementSet_h
87