Index: Source/core/dom/ContainerNode.cpp |
diff --git a/Source/core/dom/ContainerNode.cpp b/Source/core/dom/ContainerNode.cpp |
index 1f02da09fd1c53bab08ead0b8b89cd710abfab4e..c117d5f2651f171e17b02733d284f38e18fff523 100644 |
--- a/Source/core/dom/ContainerNode.cpp |
+++ b/Source/core/dom/ContainerNode.cpp |
@@ -808,10 +808,12 @@ void ContainerNode::focusStateChanged() |
// renderer we can just ignore the state change. |
if (!renderer()) |
return; |
- // FIXME: This could probably setNeedsStyleRecalc(LocalStyleChange) in the affectedByFocus case |
- // and only setNeedsStyleRecalc(SubtreeStyleChange) in the childrenAffectedByFocus case. |
- if (renderStyle()->affectedByFocus() || (isElementNode() && toElement(this)->childrenAffectedByFocus())) |
+ |
+ if (isElementNode() && toElement(this)->childrenAffectedByFocus()) |
setNeedsStyleRecalc(SubtreeStyleChange); |
+ else if (renderStyle()->affectedByFocus()) |
+ setNeedsStyleRecalc(LocalStyleChange); |
+ |
if (renderer() && renderer()->style()->hasAppearance()) |
RenderTheme::theme().stateChanged(renderer(), FocusState); |
} |
@@ -824,9 +826,15 @@ void ContainerNode::setFocus(bool received) |
Node::setFocus(received); |
focusStateChanged(); |
+ |
+ if (renderer() || received) |
+ return; |
+ |
// If :focus sets display: none, we lose focus but still need to recalc our style. |
- if (!renderer() && !received) |
+ if (isElementNode() && toElement(this)->childrenAffectedByFocus()) |
setNeedsStyleRecalc(SubtreeStyleChange); |
+ else |
+ setNeedsStyleRecalc(LocalStyleChange); |
} |
void ContainerNode::setActive(bool down) |