Index: Source/core/dom/Element.cpp |
diff --git a/Source/core/dom/Element.cpp b/Source/core/dom/Element.cpp |
index f1676dd89408cfae9f6ce1eac58c1c09663cecd6..91995d3d26309d7c6ad2591cf1ec3814a27dea32 100644 |
--- a/Source/core/dom/Element.cpp |
+++ b/Source/core/dom/Element.cpp |
@@ -1347,22 +1347,22 @@ bool Element::pseudoStyleCacheIsInvalid(const RenderStyle* currentStyle, RenderS |
return false; |
} |
-PassRefPtr<RenderStyle> Element::styleForRenderer() |
+PassRefPtr<RenderStyle> Element::styleForRenderer(int childIndex) |
{ |
if (hasCustomStyleCallbacks()) { |
if (RefPtr<RenderStyle> style = customStyleForRenderer()) |
return style.release(); |
} |
- return originalStyleForRenderer(); |
+ return originalStyleForRenderer(childIndex); |
} |
-PassRefPtr<RenderStyle> Element::originalStyleForRenderer() |
+PassRefPtr<RenderStyle> Element::originalStyleForRenderer(int childIndex) |
{ |
- return document()->styleResolver()->styleForElement(this); |
+ return document()->styleResolver()->styleForElement(this, childIndex); |
} |
-void Element::recalcStyle(StyleChange change) |
+void Element::recalcStyle(StyleChange change, int childIndex) |
{ |
ASSERT(document()->inStyleRecalc()); |
@@ -1386,7 +1386,7 @@ void Element::recalcStyle(StyleChange change) |
// FIXME: This still recalcs style twice when changing display types, but saves |
// us from recalcing twice when going from none -> anything else which is more |
// common, especially during lazy attach. |
- newStyle = styleForRenderer(); |
+ newStyle = styleForRenderer(childIndex); |
localChange = Node::diff(currentStyle.get(), newStyle.get(), document()); |
} |
if (localChange == Detach) { |
@@ -1442,7 +1442,9 @@ void Element::recalcStyle(StyleChange change) |
// without doing way too much re-resolution. |
bool forceCheckOfNextElementSibling = false; |
bool forceCheckOfAnyElementSibling = false; |
+ int indexForChild = 0; |
for (Node *n = firstChild(); n; n = n->nextSibling()) { |
+ ++indexForChild; |
if (n->isTextNode()) { |
toText(n)->recalcTextStyle(change); |
continue; |
@@ -1453,12 +1455,18 @@ void Element::recalcStyle(StyleChange change) |
bool childRulesChanged = element->needsStyleRecalc() && element->styleChangeType() == FullStyleChange; |
if ((forceCheckOfNextElementSibling || forceCheckOfAnyElementSibling)) |
element->setNeedsStyleRecalc(); |
+ forceCheckOfNextElementSibling = childRulesChanged && hasDirectAdjacentRules; |
+ forceCheckOfAnyElementSibling = forceCheckOfAnyElementSibling || (childRulesChanged && hasIndirectAdjacentRules); |
+ } |
+ for (Node *n = lastChild(); n; n = n->previousSibling()) { |
+ if (n->isTextNode() || !n->isElementNode()) |
+ continue; |
+ Element* element = toElement(n); |
if (shouldRecalcStyle(change, element)) { |
parentPusher.push(); |
- element->recalcStyle(change); |
+ element->recalcStyle(change, indexForChild); |
} |
- forceCheckOfNextElementSibling = childRulesChanged && hasDirectAdjacentRules; |
- forceCheckOfAnyElementSibling = forceCheckOfAnyElementSibling || (childRulesChanged && hasIndirectAdjacentRules); |
+ --indexForChild; |
} |
if (shouldRecalcStyle(change, this)) |