| 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)
|
|
|