Index: Source/core/dom/ContainerNode.cpp |
diff --git a/Source/core/dom/ContainerNode.cpp b/Source/core/dom/ContainerNode.cpp |
index 04c55d0644d5f8bbd0c86355a63720908fd59ee3..6ca8c750dcb71d8149f0f75a96f779280d900b39 100644 |
--- a/Source/core/dom/ContainerNode.cpp |
+++ b/Source/core/dom/ContainerNode.cpp |
@@ -829,12 +829,14 @@ void ContainerNode::focusStateChanged() |
if (!renderer()) |
return; |
- if (renderStyle()->affectedByFocus() && renderStyle()->hasPseudoStyle(FIRST_LETTER)) |
- setNeedsStyleRecalc(SubtreeStyleChange); |
- else if (isElementNode() && toElement(this)->childrenAffectedByFocus()) |
- document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().scheduleStyleInvalidationForPseudoChange(CSSSelector::PseudoFocus, *toElement(this)); |
- else if (renderStyle()->affectedByFocus()) |
- setNeedsStyleRecalc(LocalStyleChange); |
+ if (styleChangeType() < SubtreeStyleChange) { |
+ if (renderStyle()->affectedByFocus() && renderStyle()->hasPseudoStyle(FIRST_LETTER)) |
+ setNeedsStyleRecalc(SubtreeStyleChange); |
+ else if (isElementNode() && toElement(this)->childrenAffectedByFocus()) |
+ document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().scheduleStyleInvalidationForPseudoChange(CSSSelector::PseudoFocus, *toElement(this)); |
+ else if (renderStyle()->affectedByFocus()) |
+ setNeedsStyleRecalc(LocalStyleChange); |
+ } |
if (renderer() && renderer()->style()->hasAppearance()) |
RenderTheme::theme().stateChanged(renderer(), FocusState); |
@@ -853,7 +855,7 @@ void ContainerNode::setFocus(bool received) |
return; |
// If :focus sets display: none, we lose focus but still need to recalc our style. |
- if (isElementNode() && toElement(this)->childrenAffectedByFocus()) |
+ if (isElementNode() && toElement(this)->childrenAffectedByFocus() && styleChangeType() < SubtreeStyleChange) |
document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().scheduleStyleInvalidationForPseudoChange(CSSSelector::PseudoFocus, *toElement(this)); |
else |
setNeedsStyleRecalc(LocalStyleChange); |
@@ -868,12 +870,14 @@ void ContainerNode::setActive(bool down) |
// FIXME: Why does this not need to handle the display: none transition like :hover does? |
if (renderer()) { |
- if (renderStyle()->affectedByActive() && renderStyle()->hasPseudoStyle(FIRST_LETTER)) |
- setNeedsStyleRecalc(SubtreeStyleChange); |
- else if (isElementNode() && toElement(this)->childrenAffectedByActive()) |
- document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().scheduleStyleInvalidationForPseudoChange(CSSSelector::PseudoActive, *toElement(this)); |
- else if (renderStyle()->affectedByActive()) |
- setNeedsStyleRecalc(LocalStyleChange); |
+ if (styleChangeType() < SubtreeStyleChange) { |
+ if (renderStyle()->affectedByActive() && renderStyle()->hasPseudoStyle(FIRST_LETTER)) |
+ setNeedsStyleRecalc(SubtreeStyleChange); |
+ else if (isElementNode() && toElement(this)->childrenAffectedByActive()) |
+ document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().scheduleStyleInvalidationForPseudoChange(CSSSelector::PseudoActive, *toElement(this)); |
+ else if (renderStyle()->affectedByActive()) |
+ setNeedsStyleRecalc(LocalStyleChange); |
+ } |
if (renderStyle()->hasAppearance()) |
RenderTheme::theme().stateChanged(renderer(), PressedState); |
@@ -891,19 +895,21 @@ void ContainerNode::setHovered(bool over) |
if (!renderer()) { |
if (over) |
return; |
- if (isElementNode() && toElement(this)->childrenAffectedByHover()) |
+ if (isElementNode() && toElement(this)->childrenAffectedByHover() && styleChangeType() < SubtreeStyleChange) |
document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().scheduleStyleInvalidationForPseudoChange(CSSSelector::PseudoHover, *toElement(this)); |
else |
setNeedsStyleRecalc(LocalStyleChange); |
return; |
} |
- if (renderStyle()->affectedByHover() && renderStyle()->hasPseudoStyle(FIRST_LETTER)) |
- setNeedsStyleRecalc(SubtreeStyleChange); |
- else if (isElementNode() && toElement(this)->childrenAffectedByHover()) |
- document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().scheduleStyleInvalidationForPseudoChange(CSSSelector::PseudoHover, *toElement(this)); |
- else if (renderStyle()->affectedByHover()) |
- setNeedsStyleRecalc(LocalStyleChange); |
+ if (styleChangeType() < SubtreeStyleChange) { |
+ if (renderStyle()->affectedByHover() && renderStyle()->hasPseudoStyle(FIRST_LETTER)) |
+ setNeedsStyleRecalc(SubtreeStyleChange); |
+ else if (isElementNode() && toElement(this)->childrenAffectedByHover()) |
+ document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().scheduleStyleInvalidationForPseudoChange(CSSSelector::PseudoHover, *toElement(this)); |
+ else if (renderStyle()->affectedByHover()) |
+ setNeedsStyleRecalc(LocalStyleChange); |
+ } |
if (renderer()->style()->hasAppearance()) |
RenderTheme::theme().stateChanged(renderer(), HoverState); |