[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    =?utf-8?q?=5Bkdelibs=5D_khtml/rendering=3A_Properly_dirty_z-orde?=
From:       Maks Orlovich <maksim () kde ! org>
Date:       2011-02-19 22:43:38
Message-ID: 20110219224338.B10B0A60CD () git ! kde ! org
[Download RAW message or body]

Git commit c03449c379ae904bfb3820bfa793fbc96dae1a6d by Maks Orlovich.
Committed on 14/02/2011 at 02:00.
Pushed by orlovich into branch 'master'.

Properly dirty z-order lists when stacking contextedness changes.

When a layer stops being one (z-index property removed or such) make
sure we properly dirty the parent z-order list so that who is responsible
for child layers gets recomputed.

Fixes a crash on sciplus.com, though there is still a bug with hovers there.

CCBUG: 247675

M  +15   -4    khtml/rendering/render_layer.cpp     
M  +2    -0    khtml/rendering/render_layer.h     

http://commits.kde.org/kdelibs/c03449c379ae904bfb3820bfa793fbc96dae1a6d

diff --git a/khtml/rendering/render_layer.cpp b/khtml/rendering/render_layer.cpp
index 210498f..ac1f4dc 100644
--- a/khtml/rendering/render_layer.cpp
+++ b/khtml/rendering/render_layer.cpp
@@ -122,6 +122,7 @@ m_marquee( 0 )
     }
     m_buffer[0] = 0;
     m_buffer[1] = 0;
+    m_wasStackingContext = object->style() ? isStackingContext() : false;
 }
 
 RenderLayer::~RenderLayer()
@@ -1697,25 +1698,35 @@ bool RenderLayer::shouldBeOverflowOnly() const
 
 void RenderLayer::styleChanged()
 {
+    RenderLayer* parentSC = stackingContext();
+
     // If we stopped being a stacking context, make sure to clear our
     // child lists so we don't end up with dangling references when a kid
     // is removed (as it wouldn't know to remove from us)
-    if (!isStackingContext() && (m_posZOrderList || m_negZOrderList)) {
+    bool nowStackingContext = isStackingContext();
+    if (!nowStackingContext && (m_posZOrderList || m_negZOrderList)) {
         delete m_posZOrderList;
         m_posZOrderList = 0;
         delete m_negZOrderList;
         m_negZOrderList = 0;
     }
 
+    // If we stopped or started being a stacking context, dirty the parent, as
+    // who is responsible for some of the layers may change
+    if (nowStackingContext != m_wasStackingContext && parentSC) {
+        parentSC->dirtyZOrderLists();
+    }
+
+    m_wasStackingContext = nowStackingContext;
+
     bool isOverflowOnly = shouldBeOverflowOnly();
     if (isOverflowOnly != m_isOverflowOnly) {
         m_isOverflowOnly = isOverflowOnly;
         RenderLayer* p = parent();
-        RenderLayer* sc = stackingContext();
         if (p)
             p->dirtyOverflowList();
-        if (sc)
-            sc->dirtyZOrderLists();
+        if (parentSC)
+            parentSC->dirtyZOrderLists();
     }
 
     if (m_object->hasOverflowClip() && 
diff --git a/khtml/rendering/render_layer.h b/khtml/rendering/render_layer.h
index 3578983..2f2289c 100644
--- a/khtml/rendering/render_layer.h
+++ b/khtml/rendering/render_layer.h
@@ -346,6 +346,8 @@ protected:
     bool m_visibleDescendantStatusDirty : 1;
     bool m_hasVisibleDescendant : 1;
     bool m_inScrollbarRelayout : 1;
+    bool m_wasStackingContext : 1; // set to 1 when last style application
+                                   // establised us as a stacking context
 
     QRect m_visibleRect;
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic