blob: 77e60719b3d37201208b2128844faecb6e3e3a89 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef StyleInvalidator_h
#define StyleInvalidator_h
#include "core/css/RuleFeature.h"
#include "heap/Heap.h"
namespace WebCore {
class StyleInvalidator {
STACK_ALLOCATED();
public:
explicit StyleInvalidator(Document&);
void invalidate();
private:
bool invalidate(Element&);
bool invalidateChildren(Element&);
bool checkInvalidationSetsAgainstElement(Element&);
struct RecursionData {
RecursionData() : m_foundInvalidationSet(false) { }
void pushInvalidationSet(const DescendantInvalidationSet&);
bool matchesCurrentInvalidationSets(Element&);
bool foundInvalidationSet() { return m_foundInvalidationSet; }
Vector<AtomicString> m_invalidationClasses;
Vector<AtomicString> m_invalidationAttributes;
bool m_foundInvalidationSet;
};
class RecursionCheckpoint {
public:
RecursionCheckpoint(RecursionData* data)
: m_prevClassLength(data->m_invalidationClasses.size()),
m_prevAttributeLength(data->m_invalidationAttributes.size()),
m_prevFoundInvalidationSet(data->m_foundInvalidationSet),
m_data(data)
{ }
~RecursionCheckpoint()
{
m_data->m_invalidationClasses.remove(m_prevClassLength, m_data->m_invalidationClasses.size() - m_prevClassLength);
m_data->m_invalidationAttributes.remove(m_prevAttributeLength, m_data->m_invalidationAttributes.size() - m_prevAttributeLength);
m_data->m_foundInvalidationSet = m_prevFoundInvalidationSet;
}
private:
int m_prevClassLength;
int m_prevAttributeLength;
bool m_prevFoundInvalidationSet;
RecursionData* m_data;
};
Document& m_document;
RuleFeatureSet::PendingInvalidationMap& m_pendingInvalidationMap;
RecursionData m_recursionData;
};
} // namespace WebCore
#endif // StyleInvalidator_h