1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/*
2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2008 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 David Smith <catfish.man@gmail.com>
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NodeRareData_h
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define NodeRareData_h
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DynamicNodeList.h"
26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "EventListener.h"
27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "RegisteredEventListener.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "StringHash.h"
29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "QualifiedName.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/HashSet.h>
315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include <wtf/PassOwnPtr.h>
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/OwnPtr.h>
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstruct NodeListsNodeData : Noncopyable {
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    typedef HashSet<DynamicNodeList*> NodeListSet;
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NodeListSet m_listsWithCaches;
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RefPtr<DynamicNodeList::Caches> m_childNodeListCaches;
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    typedef HashMap<String, RefPtr<DynamicNodeList::Caches> > CacheMap;
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CacheMap m_classNodeListCaches;
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CacheMap m_nameNodeListCaches;
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    typedef HashMap<QualifiedName, RefPtr<DynamicNodeList::Caches> > TagCacheMap;
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    TagCacheMap m_tagNodeListCaches;
485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    static PassOwnPtr<NodeListsNodeData> create()
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return new NodeListsNodeData;
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void invalidateCaches();
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void invalidateCachesThatDependOnAttributes();
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isEmpty() const;
575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianprivate:
590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NodeListsNodeData()
600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        : m_childNodeListCaches(DynamicNodeList::Caches::create())
610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockclass NodeRareData : public Noncopyable {
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NodeRareData()
68635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        : m_tabIndex(0)
69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        , m_tabIndexWasSetExplicitly(false)
70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        , m_isFocused(false)
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        , m_needsFocusAppearanceUpdateSoonAfterAttach(false)
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    typedef HashMap<const Node*, NodeRareData*> NodeRareDataMap;
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static NodeRareDataMap& rareDataMap()
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static NodeRareDataMap* dataMap = new NodeRareDataMap;
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return *dataMap;
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static NodeRareData* rareDataFromMap(const Node* node)
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return rareDataMap().get(node);
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void clearNodeLists() { m_nodeLists.clear(); }
895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    void setNodeLists(PassOwnPtr<NodeListsNodeData> lists) { m_nodeLists = lists; }
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NodeListsNodeData* nodeLists() const { return m_nodeLists.get(); }
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    short tabIndex() const { return m_tabIndex; }
93635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void setTabIndexExplicitly(short index) { m_tabIndex = index; m_tabIndexWasSetExplicitly = true; }
94635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool tabIndexSetExplicitly() const { return m_tabIndexWasSetExplicitly; }
95635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
96231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    EventTargetData* eventTargetData() { return m_eventTargetData.get(); }
97231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    EventTargetData* ensureEventTargetData()
98635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
99231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (!m_eventTargetData)
100231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            m_eventTargetData.set(new EventTargetData);
101231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return m_eventTargetData.get();
102635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
103635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
104635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool isFocused() const { return m_isFocused; }
105635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void setFocused(bool focused) { m_isFocused = focused; }
106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
107635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectprotected:
108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // for ElementRareData
109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool needsFocusAppearanceUpdateSoonAfterAttach() const { return m_needsFocusAppearanceUpdateSoonAfterAttach; }
110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void setNeedsFocusAppearanceUpdateSoonAfterAttach(bool needs) { m_needsFocusAppearanceUpdateSoonAfterAttach = needs; }
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    OwnPtr<NodeListsNodeData> m_nodeLists;
114231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    OwnPtr<EventTargetData> m_eventTargetData;
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    short m_tabIndex;
116635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool m_tabIndexWasSetExplicitly : 1;
117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool m_isFocused : 1;
118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool m_needsFocusAppearanceUpdateSoonAfterAttach : 1;
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} //namespace
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
124