HTMLPropertiesCollection.h [plain text]
#ifndef HTMLPropertiesCollection_h
#define HTMLPropertiesCollection_h
#if ENABLE(MICRODATA)
#include "DOMStringList.h"
#include "HTMLCollection.h"
namespace WebCore {
class DOMStringList;
class HTMLPropertiesCollection : public HTMLCollection {
public:
static PassOwnPtr<HTMLPropertiesCollection> create(Node*);
virtual ~HTMLPropertiesCollection();
unsigned length() const OVERRIDE;
virtual Node* item(unsigned) const OVERRIDE;
PassRefPtr<DOMStringList> names() const;
PassRefPtr<NodeList> namedItem(const String&) const;
bool hasNamedItem(const AtomicString&) const;
private:
HTMLPropertiesCollection(Node*);
unsigned calcLength() const;
void findProperties(Element* base) const;
Node* findRefElements(Node* previous) const;
Element* firstProperty() const;
Element* itemAfter(Element* base, Element* previous) const;
void updateNameCache() const;
void updateRefElements() const;
void invalidateCacheIfNeeded() const;
mutable struct {
uint64_t version;
Element* current;
unsigned position;
unsigned length;
bool hasLength;
bool hasNameCache;
NodeCacheMap propertyCache;
Vector<Element*> itemRefElements;
RefPtr<DOMStringList> propertyNames;
unsigned itemRefElementPosition;
bool hasItemRefElements;
void clear()
{
version = 0;
current = 0;
position = 0;
length = 0;
hasLength = false;
hasNameCache = false;
propertyCache.clear();
itemRefElements.clear();
propertyNames.clear();
itemRefElementPosition = 0;
hasItemRefElements = false;
}
void setItemRefElements(const Vector<Element*>& elements)
{
itemRefElements = elements;
hasItemRefElements = true;
}
const Vector<Element*>& getItemRefElements()
{
return itemRefElements;
}
void updateLength(unsigned len)
{
length = len;
hasLength = true;
}
void updatePropertyCache(Element* element, const AtomicString& propertyName)
{
if (!propertyNames)
propertyNames = DOMStringList::create();
if (!propertyNames->contains(propertyName))
propertyNames->append(propertyName);
Vector<Element*>* propertyResults = propertyCache.get(propertyName.impl());
if (!propertyResults || !propertyResults->contains(element))
append(propertyCache, propertyName, element);
}
void updateCurrentItem(Element* element, unsigned pos, unsigned itemRefElementPos)
{
current = element;
position = pos;
itemRefElementPosition = itemRefElementPos;
}
void resetPosition()
{
current = 0;
position = 0;
itemRefElementPosition = 0;
}
} m_cache;
};
}
#endif // ENABLE(MICRODATA)
#endif // HTMLPropertiesCollection_h