/* * Copyright (C) 2008 Apple Inc. All rights reserved. * Copyright (C) 2008 David Smith * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */ #ifndef NodeRareData_h #define NodeRareData_h #include "DynamicNodeList.h" #include "EventListener.h" #include "RegisteredEventListener.h" #include "StringHash.h" #include "QualifiedName.h" #include #include namespace WebCore { struct NodeListsNodeData { typedef HashSet NodeListSet; NodeListSet m_listsWithCaches; DynamicNodeList::Caches m_childNodeListCaches; typedef HashMap CacheMap; CacheMap m_classNodeListCaches; CacheMap m_nameNodeListCaches; typedef HashMap TagCacheMap; TagCacheMap m_tagNodeListCaches; ~NodeListsNodeData() { deleteAllValues(m_classNodeListCaches); deleteAllValues(m_nameNodeListCaches); deleteAllValues(m_tagNodeListCaches); } void invalidateCaches(); void invalidateCachesThatDependOnAttributes(); bool isEmpty() const; }; class NodeRareData { public: NodeRareData() : m_tabIndex(0) , m_tabIndexWasSetExplicitly(false) , m_isFocused(false) , m_needsFocusAppearanceUpdateSoonAfterAttach(false) { } typedef HashMap NodeRareDataMap; static NodeRareDataMap& rareDataMap() { static NodeRareDataMap* dataMap = new NodeRareDataMap; return *dataMap; } static NodeRareData* rareDataFromMap(const Node* node) { return rareDataMap().get(node); } void clearNodeLists() { m_nodeLists.clear(); } void setNodeLists(std::auto_ptr lists) { m_nodeLists.set(lists.release()); } NodeListsNodeData* nodeLists() const { return m_nodeLists.get(); } short tabIndex() const { return m_tabIndex; } void setTabIndexExplicitly(short index) { m_tabIndex = index; m_tabIndexWasSetExplicitly = true; } bool tabIndexSetExplicitly() const { return m_tabIndexWasSetExplicitly; } RegisteredEventListenerVector* listeners() { return m_eventListeners.get(); } RegisteredEventListenerVector& ensureListeners() { if (!m_eventListeners) m_eventListeners.set(new RegisteredEventListenerVector); return *m_eventListeners; } bool isFocused() const { return m_isFocused; } void setFocused(bool focused) { m_isFocused = focused; } protected: // for ElementRareData bool needsFocusAppearanceUpdateSoonAfterAttach() const { return m_needsFocusAppearanceUpdateSoonAfterAttach; } void setNeedsFocusAppearanceUpdateSoonAfterAttach(bool needs) { m_needsFocusAppearanceUpdateSoonAfterAttach = needs; } private: OwnPtr m_nodeLists; OwnPtr m_eventListeners; short m_tabIndex; bool m_tabIndexWasSetExplicitly : 1; bool m_isFocused : 1; bool m_needsFocusAppearanceUpdateSoonAfterAttach : 1; }; } //namespace #endif