summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders Edenbrandt <anders.edenbrandt@sonyericsson.com>2012-03-09 15:33:38 +0100
committerKenneth Andersson <kenneth.andersson@sonymobile.com>2012-08-31 08:20:15 +0200
commite90019d2a3c455d2bee14682e8973dcd33460010 (patch)
treeb394a6c3670998940531249ff0410ce6a9e84b44
parent5423878ee1cb0965ced62800f36933841eaa40f6 (diff)
downloadexternal_webkit-e90019d2a3c455d2bee14682e8973dcd33460010.zip
external_webkit-e90019d2a3c455d2bee14682e8973dcd33460010.tar.gz
external_webkit-e90019d2a3c455d2bee14682e8973dcd33460010.tar.bz2
Crash on Orange media portal
Visit orange.deezer.com, press tab marked "My Music". Browser crashes every time. Pressing the button will trigger a re-layout of the page. This in turn will cause some rendering nodes of type RenderLayer to be removed from the rendering tree. When such a node is removed, it is important to also update certain lists in ancestor nodes that may hold references to this node. A node that may hold such a reference is identified as being a "stacking context". However, in Android, when the symbol ENABLE_COMPOSITED_FIXED_ELEMENTS is defined, the definition of what is a stacking context is expanded. In this case, a node that is a stacking context and holds references to descendants, changes one of the conditions that form part of Android's expanded stacking context definition. So, now it is no longer a stacking context, but the reference list is not deleted/updated. When the descendant node is removed a search for an ancestral stacking context is made, but it will not find this node since it is no longer a stacking context. The solution is to make sure that the list of references is updated/cleared whenever the node changes a condition that may cause its status as a stacking context to also change. Change-Id: If5a7b63715020bc3d23749a7c09003a86d90e28d
-rw-r--r--Source/WebCore/rendering/RenderObject.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/Source/WebCore/rendering/RenderObject.cpp b/Source/WebCore/rendering/RenderObject.cpp
index 012427c..ccd7c14 100644
--- a/Source/WebCore/rendering/RenderObject.cpp
+++ b/Source/WebCore/rendering/RenderObject.cpp
@@ -1667,6 +1667,12 @@ void RenderObject::styleWillChange(StyleDifference diff, const RenderStyle* newS
// If our z-index changes value or our visibility changes,
// we need to dirty our stacking context's z-order list.
if (newStyle) {
+#if ENABLE(COMPOSITED_FIXED_ELEMENTS)
+ RenderLayer* layer = hasLayer() ? enclosingLayer() : 0;
+ if (layer && m_style->position() != newStyle->position()
+ && (m_style->position() == FixedPosition || newStyle->position() == FixedPosition))
+ layer->dirtyZOrderLists();
+#endif
bool visibilityChanged = m_style->visibility() != newStyle->visibility()
|| m_style->zIndex() != newStyle->zIndex()
|| m_style->hasAutoZIndex() != newStyle->hasAutoZIndex();