Home | History | Annotate | Download | only in dom
      1 /*
      2  * Copyright (C) 2008, 2010 Apple Inc. All rights reserved.
      3  * Copyright (C) 2008 David Smith <catfish.man (at) gmail.com>
      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 
     22 #ifndef NodeRareData_h
     23 #define NodeRareData_h
     24 
     25 #include "ClassNodeList.h"
     26 #include "DynamicNodeList.h"
     27 #include "NameNodeList.h"
     28 #include "QualifiedName.h"
     29 #include "TagNodeList.h"
     30 #include <wtf/HashSet.h>
     31 #include <wtf/OwnPtr.h>
     32 #include <wtf/PassOwnPtr.h>
     33 #include <wtf/text/StringHash.h>
     34 
     35 namespace WebCore {
     36 
     37 class TreeScope;
     38 
     39 struct NodeListsNodeData {
     40     WTF_MAKE_NONCOPYABLE(NodeListsNodeData); WTF_MAKE_FAST_ALLOCATED;
     41 public:
     42     typedef HashSet<DynamicNodeList*> NodeListSet;
     43     NodeListSet m_listsWithCaches;
     44 
     45     RefPtr<DynamicNodeList::Caches> m_childNodeListCaches;
     46 
     47     typedef HashMap<String, ClassNodeList*> ClassNodeListCache;
     48     ClassNodeListCache m_classNodeListCache;
     49 
     50     typedef HashMap<String, NameNodeList*> NameNodeListCache;
     51     NameNodeListCache m_nameNodeListCache;
     52 
     53     typedef HashMap<RefPtr<QualifiedName::QualifiedNameImpl>, TagNodeList*> TagNodeListCache;
     54     TagNodeListCache m_tagNodeListCache;
     55 
     56     RefPtr<DynamicNodeList> m_labelsNodeListCache;
     57 
     58     static PassOwnPtr<NodeListsNodeData> create()
     59     {
     60         return new NodeListsNodeData;
     61     }
     62 
     63     void invalidateCaches();
     64     void invalidateCachesThatDependOnAttributes();
     65     bool isEmpty() const;
     66 
     67 private:
     68     NodeListsNodeData()
     69         : m_childNodeListCaches(DynamicNodeList::Caches::create()), m_labelsNodeListCache(0)
     70     {
     71     }
     72 };
     73 
     74 class NodeRareData {
     75     WTF_MAKE_NONCOPYABLE(NodeRareData); WTF_MAKE_FAST_ALLOCATED;
     76 public:
     77     NodeRareData()
     78         : m_treeScope(0)
     79         , m_tabIndex(0)
     80         , m_tabIndexWasSetExplicitly(false)
     81         , m_isFocused(false)
     82         , m_needsFocusAppearanceUpdateSoonAfterAttach(false)
     83     {
     84     }
     85 
     86     virtual ~NodeRareData()
     87     {
     88     }
     89 
     90     typedef HashMap<const Node*, NodeRareData*> NodeRareDataMap;
     91 
     92     static NodeRareDataMap& rareDataMap()
     93     {
     94         static NodeRareDataMap* dataMap = new NodeRareDataMap;
     95         return *dataMap;
     96     }
     97 
     98     static NodeRareData* rareDataFromMap(const Node* node)
     99     {
    100         return rareDataMap().get(node);
    101     }
    102 
    103     TreeScope* treeScope() const { return m_treeScope; }
    104     void setTreeScope(TreeScope* treeScope) { m_treeScope = treeScope; }
    105 
    106     void clearNodeLists() { m_nodeLists.clear(); }
    107     void setNodeLists(PassOwnPtr<NodeListsNodeData> lists) { m_nodeLists = lists; }
    108     NodeListsNodeData* nodeLists() const { return m_nodeLists.get(); }
    109 
    110     short tabIndex() const { return m_tabIndex; }
    111     void setTabIndexExplicitly(short index) { m_tabIndex = index; m_tabIndexWasSetExplicitly = true; }
    112     bool tabIndexSetExplicitly() const { return m_tabIndexWasSetExplicitly; }
    113     void clearTabIndexExplicitly() { m_tabIndex = 0; m_tabIndexWasSetExplicitly = false; }
    114 
    115     EventTargetData* eventTargetData() { return m_eventTargetData.get(); }
    116     EventTargetData* ensureEventTargetData()
    117     {
    118         if (!m_eventTargetData)
    119             m_eventTargetData.set(new EventTargetData);
    120         return m_eventTargetData.get();
    121     }
    122 
    123     bool isFocused() const { return m_isFocused; }
    124     void setFocused(bool focused) { m_isFocused = focused; }
    125 
    126 protected:
    127     // for ElementRareData
    128     bool needsFocusAppearanceUpdateSoonAfterAttach() const { return m_needsFocusAppearanceUpdateSoonAfterAttach; }
    129     void setNeedsFocusAppearanceUpdateSoonAfterAttach(bool needs) { m_needsFocusAppearanceUpdateSoonAfterAttach = needs; }
    130 
    131 private:
    132     TreeScope* m_treeScope;
    133     OwnPtr<NodeListsNodeData> m_nodeLists;
    134     OwnPtr<EventTargetData> m_eventTargetData;
    135     short m_tabIndex;
    136     bool m_tabIndexWasSetExplicitly : 1;
    137     bool m_isFocused : 1;
    138     bool m_needsFocusAppearanceUpdateSoonAfterAttach : 1;
    139 };
    140 
    141 } // namespace WebCore
    142 
    143 #endif // NodeRareData_h
    144