Commit d50ac5a4 authored by chrishtr@chromium.org's avatar chrishtr@chromium.org

Make RecursionData a stack-allocated variable in StyleInvalidator, since it is only

used during a single invalidation.

These makes makes its intended object data lifetime clearer and avoids possible bugs.

BUG=379908

Review URL: https://codereview.chromium.org/416243003

git-svn-id: svn://svn.chromium.org/blink/trunk@179050 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 28990a54
......@@ -19,8 +19,9 @@ namespace blink {
void StyleInvalidator::invalidate(Document& document)
{
RecursionData recursionData;
if (Element* documentElement = document.documentElement())
invalidate(*documentElement);
invalidate(*documentElement, recursionData);
document.clearChildNeedsStyleInvalidation();
document.clearNeedsStyleInvalidation();
clearPendingInvalidations();
......@@ -96,56 +97,56 @@ bool StyleInvalidator::RecursionData::matchesCurrentInvalidationSets(Element& el
return false;
}
bool StyleInvalidator::checkInvalidationSetsAgainstElement(Element& element)
bool StyleInvalidator::checkInvalidationSetsAgainstElement(Element& element, StyleInvalidator::RecursionData& recursionData)
{
if (element.styleChangeType() >= SubtreeStyleChange || m_recursionData.wholeSubtreeInvalid()) {
m_recursionData.setWholeSubtreeInvalid();
if (element.styleChangeType() >= SubtreeStyleChange || recursionData.wholeSubtreeInvalid()) {
recursionData.setWholeSubtreeInvalid();
return false;
}
if (element.needsStyleInvalidation()) {
if (InvalidationList* invalidationList = m_pendingInvalidationMap.get(&element)) {
for (InvalidationList::const_iterator it = invalidationList->begin(); it != invalidationList->end(); ++it)
m_recursionData.pushInvalidationSet(**it);
recursionData.pushInvalidationSet(**it);
// FIXME: It's really only necessary to clone the render style for this element, not full style recalc.
return true;
}
}
return m_recursionData.matchesCurrentInvalidationSets(element);
return recursionData.matchesCurrentInvalidationSets(element);
}
bool StyleInvalidator::invalidateChildren(Element& element)
bool StyleInvalidator::invalidateChildren(Element& element, StyleInvalidator::RecursionData& recursionData)
{
bool someChildrenNeedStyleRecalc = false;
for (ShadowRoot* root = element.youngestShadowRoot(); root; root = root->olderShadowRoot()) {
if (!m_recursionData.treeBoundaryCrossing() && !root->childNeedsStyleInvalidation() && !root->needsStyleInvalidation())
if (!recursionData.treeBoundaryCrossing() && !root->childNeedsStyleInvalidation() && !root->needsStyleInvalidation())
continue;
for (Element* child = ElementTraversal::firstChild(*root); child; child = ElementTraversal::nextSibling(*child)) {
bool childRecalced = invalidate(*child);
bool childRecalced = invalidate(*child, recursionData);
someChildrenNeedStyleRecalc = someChildrenNeedStyleRecalc || childRecalced;
}
root->clearChildNeedsStyleInvalidation();
root->clearNeedsStyleInvalidation();
}
for (Element* child = ElementTraversal::firstChild(element); child; child = ElementTraversal::nextSibling(*child)) {
bool childRecalced = invalidate(*child);
bool childRecalced = invalidate(*child, recursionData);
someChildrenNeedStyleRecalc = someChildrenNeedStyleRecalc || childRecalced;
}
return someChildrenNeedStyleRecalc;
}
bool StyleInvalidator::invalidate(Element& element)
bool StyleInvalidator::invalidate(Element& element, StyleInvalidator::RecursionData& recursionData)
{
RecursionCheckpoint checkpoint(&m_recursionData);
RecursionCheckpoint checkpoint(&recursionData);
bool thisElementNeedsStyleRecalc = checkInvalidationSetsAgainstElement(element);
bool thisElementNeedsStyleRecalc = checkInvalidationSetsAgainstElement(element, recursionData);
bool someChildrenNeedStyleRecalc = false;
if (m_recursionData.hasInvalidationSets() || element.childNeedsStyleInvalidation())
someChildrenNeedStyleRecalc = invalidateChildren(element);
if (recursionData.hasInvalidationSets() || element.childNeedsStyleInvalidation())
someChildrenNeedStyleRecalc = invalidateChildren(element, recursionData);
if (thisElementNeedsStyleRecalc) {
element.setNeedsStyleRecalc(m_recursionData.wholeSubtreeInvalid() ? SubtreeStyleChange : LocalStyleChange);
} else if (m_recursionData.hasInvalidationSets() && someChildrenNeedStyleRecalc) {
element.setNeedsStyleRecalc(recursionData.wholeSubtreeInvalid() ? SubtreeStyleChange : LocalStyleChange);
} else if (recursionData.hasInvalidationSets() && someChildrenNeedStyleRecalc) {
// Clone the RenderStyle in order to preserve correct style sharing, if possible. Otherwise recalc style.
if (RenderObject* renderer = element.renderer())
renderer->setStyleInternal(RenderStyle::clone(renderer->style()));
......
......@@ -29,11 +29,6 @@ public:
void trace(Visitor*);
private:
bool invalidate(Element&);
bool invalidateChildren(Element&);
bool checkInvalidationSetsAgainstElement(Element&);
struct RecursionData {
RecursionData()
: m_invalidateCustomPseudo(false)
......@@ -57,6 +52,10 @@ private:
bool m_treeBoundaryCrossing;
};
bool invalidate(Element&, RecursionData&);
bool invalidateChildren(Element&, RecursionData&);
bool checkInvalidationSetsAgainstElement(Element&, RecursionData&);
class RecursionCheckpoint {
public:
RecursionCheckpoint(RecursionData* data)
......@@ -88,7 +87,6 @@ private:
InvalidationList& ensurePendingInvalidationList(Element&);
PendingInvalidationMap m_pendingInvalidationMap;
RecursionData m_recursionData;
};
} // namespace blink
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment