[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