46 lines
2.3 KiB
Diff
46 lines
2.3 KiB
Diff
diff -ur qt-everywhere-opensource-src-4.6.3/src/3rdparty/webkit/WebCore/rendering/RenderLayer.cpp qt-everywhere-opensource-src-4.6.3-2010-1412/src/3rdparty/webkit/WebCore/rendering/RenderLayer.cpp
|
|
--- qt-everywhere-opensource-src-4.6.3/src/3rdparty/webkit/WebCore/rendering/RenderLayer.cpp 2010-06-02 04:03:11.000000000 +0200
|
|
+++ qt-everywhere-opensource-src-4.6.3-2010-1412/src/3rdparty/webkit/WebCore/rendering/RenderLayer.cpp 2010-06-11 00:09:43.741191104 +0200
|
|
@@ -3039,22 +3039,33 @@
|
|
// Locate the common ancestor render object for the two renderers.
|
|
RenderObject* ancestor = commonAncestor(oldHoverObj, newHoverObj);
|
|
|
|
+ Vector<Node*, 32> nodesToRemoveFromChain;
|
|
+ Vector<Node*, 32> nodesToAddToChain;
|
|
+
|
|
if (oldHoverObj != newHoverObj) {
|
|
// The old hover path only needs to be cleared up to (and not including) the common ancestor;
|
|
for (RenderObject* curr = oldHoverObj; curr && curr != ancestor; curr = curr->hoverAncestor()) {
|
|
- if (curr->node() && !curr->isText() && (!mustBeInActiveChain || curr->node()->inActiveChain())) {
|
|
- curr->node()->setActive(false);
|
|
- curr->node()->setHovered(false);
|
|
- }
|
|
+ if (curr->node() && !curr->isText() && (!mustBeInActiveChain || curr->node()->inActiveChain()))
|
|
+ nodesToRemoveFromChain.append(curr->node());
|
|
}
|
|
}
|
|
|
|
// Now set the hover state for our new object up to the root.
|
|
for (RenderObject* curr = newHoverObj; curr; curr = curr->hoverAncestor()) {
|
|
- if (curr->node() && !curr->isText() && (!mustBeInActiveChain || curr->node()->inActiveChain())) {
|
|
- curr->node()->setActive(request.active());
|
|
- curr->node()->setHovered(true);
|
|
- }
|
|
+ if (curr->node() && !curr->isText() && (!mustBeInActiveChain || curr->node()->inActiveChain()))
|
|
+ nodesToAddToChain.append(curr->node());
|
|
+ }
|
|
+
|
|
+ size_t removeCount = nodesToRemoveFromChain.size();
|
|
+ for (size_t i = 0; i < removeCount; ++i) {
|
|
+ nodesToRemoveFromChain[i]->setActive(false);
|
|
+ nodesToRemoveFromChain[i]->setHovered(false);
|
|
+ }
|
|
+
|
|
+ size_t addCount = nodesToAddToChain.size();
|
|
+ for (size_t i = 0; i < addCount; ++i) {
|
|
+ nodesToAddToChain[i]->setActive(request.active());
|
|
+ nodesToAddToChain[i]->setHovered(true);
|
|
}
|
|
}
|
|
|