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