blob: 7ebc4ca499c8bd0ec9b05a5e32f8f6097ced821a [file] [log] [blame]
// Copyright (c) 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.
#include "config.h"
#include "core/dom/SiblingRuleHelper.h"
#include "core/dom/Document.h"
#include "core/dom/Element.h"
#include "core/dom/StyleEngine.h"
#include "core/dom/shadow/ShadowRoot.h"
namespace WebCore {
bool SiblingRuleHelper::isFinishedParsingChildren()
{
if (m_node->isElementNode())
return toElement(m_node)->isFinishedParsingChildren();
return toShadowRoot(m_node)->isFinishedParsingChildren();
}
void SiblingRuleHelper::setChildrenAffectedByDirectAdjacentRules()
{
if (m_node->isElementNode())
toElement(m_node)->setChildrenAffectedByDirectAdjacentRules();
else
toShadowRoot(m_node)->setChildrenAffectedByDirectAdjacentRules();
}
void SiblingRuleHelper::setChildrenAffectedByForwardPositionalRules()
{
if (m_node->isElementNode())
toElement(m_node)->setChildrenAffectedByForwardPositionalRules();
else
toShadowRoot(m_node)->setChildrenAffectedByForwardPositionalRules();
}
void SiblingRuleHelper::setChildrenAffectedByBackwardPositionalRules()
{
if (m_node->isElementNode())
toElement(m_node)->setChildrenAffectedByBackwardPositionalRules();
else
toShadowRoot(m_node)->setChildrenAffectedByBackwardPositionalRules();
}
void SiblingRuleHelper::setChildrenAffectedByFirstChildRules()
{
if (m_node->isElementNode())
toElement(m_node)->setChildrenAffectedByFirstChildRules();
else
toShadowRoot(m_node)->setChildrenAffectedByFirstChildRules();
}
void SiblingRuleHelper::setChildrenAffectedByLastChildRules()
{
if (m_node->isElementNode())
toElement(m_node)->setChildrenAffectedByLastChildRules();
else
toShadowRoot(m_node)->setChildrenAffectedByLastChildRules();
}
bool SiblingRuleHelper::childrenAffectedByPositionalRules() const
{
return m_node->isElementNode() ? toElement(m_node)->childrenAffectedByPositionalRules() : toShadowRoot(m_node)->childrenAffectedByPositionalRules();
}
bool SiblingRuleHelper::childrenAffectedByFirstChildRules() const
{
return m_node->isElementNode() ? toElement(m_node)->childrenAffectedByFirstChildRules() : toShadowRoot(m_node)->childrenAffectedByFirstChildRules();
}
bool SiblingRuleHelper::childrenAffectedByLastChildRules() const
{
return m_node->isElementNode() ? toElement(m_node)->childrenAffectedByLastChildRules() : toShadowRoot(m_node)->childrenAffectedByLastChildRules();
}
bool SiblingRuleHelper::childrenAffectedByDirectAdjacentRules() const
{
return m_node->isElementNode() ? toElement(m_node)->childrenAffectedByDirectAdjacentRules() : toShadowRoot(m_node)->childrenAffectedByDirectAdjacentRules();
}
bool SiblingRuleHelper::childrenAffectedByForwardPositionalRules() const
{
return m_node->isElementNode() ? toElement(m_node)->childrenAffectedByForwardPositionalRules() : toShadowRoot(m_node)->childrenAffectedByForwardPositionalRules();
}
bool SiblingRuleHelper::childrenAffectedByBackwardPositionalRules() const
{
return m_node->isElementNode() ? toElement(m_node)->childrenAffectedByBackwardPositionalRules() : toShadowRoot(m_node)->childrenAffectedByBackwardPositionalRules();
}
void SiblingRuleHelper::checkForChildrenAdjacentRuleChanges()
{
bool hasDirectAdjacentRules = childrenAffectedByDirectAdjacentRules();
bool hasIndirectAdjacentRules = childrenAffectedByForwardPositionalRules();
if (!hasDirectAdjacentRules && !hasIndirectAdjacentRules)
return;
unsigned forceCheckOfNextElementCount = 0;
bool forceCheckOfAnyElementSibling = false;
Document& document = m_node->document();
for (Node* child = m_node->firstChild(); child; child = child->nextSibling()) {
if (!child->isElementNode())
continue;
Element* element = toElement(child);
bool childRulesChanged = element->needsStyleRecalc() && element->styleChangeType() >= SubtreeStyleChange;
if (forceCheckOfNextElementCount || forceCheckOfAnyElementSibling)
element->setNeedsStyleRecalc(SubtreeStyleChange);
if (forceCheckOfNextElementCount)
forceCheckOfNextElementCount--;
if (childRulesChanged && hasDirectAdjacentRules)
forceCheckOfNextElementCount = document.styleEngine()->maxDirectAdjacentSelectors();
forceCheckOfAnyElementSibling = forceCheckOfAnyElementSibling || (childRulesChanged && hasIndirectAdjacentRules);
}
}
bool SiblingRuleHelper::childrenSupportStyleSharing()
{
return m_node->isElementNode() ? toElement(m_node)->childrenSupportStyleSharing() : toShadowRoot(m_node)->childrenSupportStyleSharing();
}
} // namespace WebCore