Index: Source/core/dom/LiveNodeList.h |
diff --git a/Source/core/dom/LiveNodeList.h b/Source/core/dom/LiveNodeList.h |
index 422e6bcc1da1606f86debac787270b7669315c3c..565092a267840813f8403c81a3edcd58d3f3630f 100644 |
--- a/Source/core/dom/LiveNodeList.h |
+++ b/Source/core/dom/LiveNodeList.h |
@@ -24,108 +24,16 @@ |
#ifndef LiveNodeList_h |
#define LiveNodeList_h |
-#include "HTMLNames.h" |
-#include "core/dom/Document.h" |
+#include "core/dom/LiveNodeListBase.h" |
#include "core/dom/NodeList.h" |
#include "core/html/CollectionIndexCache.h" |
#include "core/html/CollectionType.h" |
-#include "wtf/Forward.h" |
-#include "wtf/RefPtr.h" |
+#include "wtf/PassRefPtr.h" |
namespace WebCore { |
class Element; |
-enum NodeListRootType { |
- NodeListIsRootedAtNode, |
- NodeListIsRootedAtDocument, |
- NodeListIsRootedAtDocumentIfOwnerHasItemrefAttr, |
-}; |
- |
-class LiveNodeListBase { |
-public: |
- LiveNodeListBase(ContainerNode* ownerNode, NodeListRootType rootType, NodeListInvalidationType invalidationType, |
- CollectionType collectionType) |
- : m_ownerNode(ownerNode) |
- , m_rootType(rootType) |
- , m_invalidationType(invalidationType) |
- , m_collectionType(collectionType) |
- { |
- ASSERT(m_ownerNode); |
- ASSERT(m_rootType == static_cast<unsigned>(rootType)); |
- ASSERT(m_invalidationType == static_cast<unsigned>(invalidationType)); |
- ASSERT(m_collectionType == static_cast<unsigned>(collectionType)); |
- |
- document().registerNodeList(this); |
- } |
- |
- virtual ~LiveNodeListBase() |
- { |
- document().unregisterNodeList(this); |
- } |
- |
- ContainerNode& rootNode() const; |
- |
- void didMoveToDocument(Document& oldDocument, Document& newDocument); |
- ALWAYS_INLINE bool hasIdNameCache() const { return !isLiveNodeListType(type()); } |
- ALWAYS_INLINE bool isRootedAtDocument() const { return m_rootType == NodeListIsRootedAtDocument || m_rootType == NodeListIsRootedAtDocumentIfOwnerHasItemrefAttr; } |
- ALWAYS_INLINE NodeListInvalidationType invalidationType() const { return static_cast<NodeListInvalidationType>(m_invalidationType); } |
- ALWAYS_INLINE CollectionType type() const { return static_cast<CollectionType>(m_collectionType); } |
- ContainerNode* ownerNode() const { return m_ownerNode.get(); } |
- ALWAYS_INLINE void invalidateCache(const QualifiedName* attrName) const |
- { |
- if (!attrName || shouldInvalidateTypeOnAttributeChange(invalidationType(), *attrName)) |
- invalidateCache(); |
- else if (hasIdNameCache() && (*attrName == HTMLNames::idAttr || *attrName == HTMLNames::nameAttr)) |
- invalidateIdNameCacheMaps(); |
- } |
- virtual void invalidateCache(Document* oldDocument = 0) const = 0; |
- |
- static bool shouldInvalidateTypeOnAttributeChange(NodeListInvalidationType, const QualifiedName&); |
- |
-protected: |
- Document& document() const { return m_ownerNode->document(); } |
- |
- ALWAYS_INLINE NodeListRootType rootType() const { return static_cast<NodeListRootType>(m_rootType); } |
- |
- template <typename Collection> |
- static Element* iterateForPreviousNode(const Collection&, Node* current); |
- template <typename Collection> |
- static Element* itemBefore(const Collection&, const Element* previousItem); |
- |
-private: |
- void invalidateIdNameCacheMaps() const; |
- |
- RefPtr<ContainerNode> m_ownerNode; // Cannot be null. |
- const unsigned m_rootType : 2; |
- const unsigned m_invalidationType : 4; |
- const unsigned m_collectionType : 5; |
-}; |
- |
-ALWAYS_INLINE bool LiveNodeListBase::shouldInvalidateTypeOnAttributeChange(NodeListInvalidationType type, const QualifiedName& attrName) |
-{ |
- switch (type) { |
- case InvalidateOnClassAttrChange: |
- return attrName == HTMLNames::classAttr; |
- case InvalidateOnNameAttrChange: |
- return attrName == HTMLNames::nameAttr; |
- case InvalidateOnIdNameAttrChange: |
- return attrName == HTMLNames::idAttr || attrName == HTMLNames::nameAttr; |
- case InvalidateOnForAttrChange: |
- return attrName == HTMLNames::forAttr; |
- case InvalidateForFormControls: |
- return attrName == HTMLNames::nameAttr || attrName == HTMLNames::idAttr || attrName == HTMLNames::forAttr |
- || attrName == HTMLNames::formAttr || attrName == HTMLNames::typeAttr; |
- case InvalidateOnHRefAttrChange: |
- return attrName == HTMLNames::hrefAttr; |
- case DoNotInvalidateOnAttributeChanges: |
- return false; |
- case InvalidateOnAnyAttrChange: |
- return true; |
- } |
- return false; |
-} |
- |
class LiveNodeList : public NodeList, public LiveNodeListBase { |
public: |
LiveNodeList(PassRefPtr<ContainerNode> ownerNode, CollectionType collectionType, NodeListInvalidationType invalidationType, NodeListRootType rootType = NodeListIsRootedAtNode) |