Title: [192853] trunk/Source/WebCore
Revision
192853
Author
simon.fra...@apple.com
Date
2015-11-30 18:46:09 -0800 (Mon, 30 Nov 2015)

Log Message

Fix possible crash with animated layers in reflections
https://bugs.webkit.org/show_bug.cgi?id=151689
rdar://problem/23018612

Reviewed by Darin Adler.

Reflections create additional PlatformCALayers whose owner is set to the GraphicsLayerCA.
Those PlatformCALayers need their owner pointer cleared out when the GraphicsLayerCA
is destroyed.

Tested by compositing/reflections/nested-reflection-transition.html

* platform/graphics/ca/GraphicsLayerCA.cpp:
* platform/graphics/ca/GraphicsLayerCA.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (192852 => 192853)


--- trunk/Source/WebCore/ChangeLog	2015-12-01 02:29:18 UTC (rev 192852)
+++ trunk/Source/WebCore/ChangeLog	2015-12-01 02:46:09 UTC (rev 192853)
@@ -1,3 +1,20 @@
+2015-11-30  Simon Fraser  <simon.fra...@apple.com>
+
+        Fix possible crash with animated layers in reflections
+        https://bugs.webkit.org/show_bug.cgi?id=151689
+        rdar://problem/23018612
+
+        Reviewed by Darin Adler.
+
+        Reflections create additional PlatformCALayers whose owner is set to the GraphicsLayerCA.
+        Those PlatformCALayers need their owner pointer cleared out when the GraphicsLayerCA
+        is destroyed.
+        
+        Tested by compositing/reflections/nested-reflection-transition.html
+
+        * platform/graphics/ca/GraphicsLayerCA.cpp:
+        * platform/graphics/ca/GraphicsLayerCA.h:
+
 2015-11-30  Brady Eidson  <beid...@apple.com>
 
         Modern IDB: Iterating index cursors to a specific key is busted.

Modified: trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp (192852 => 192853)


--- trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp	2015-12-01 02:29:18 UTC (rev 192852)
+++ trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp	2015-12-01 02:46:09 UTC (rev 192853)
@@ -3486,14 +3486,25 @@
     shapeMaskLayer = findOrMakeClone(cloneID, m_shapeMaskLayer.get(), m_shapeMaskLayerClones.get(), cloneLevel);
 }
 
+void GraphicsLayerCA::clearClones(std::unique_ptr<LayerMap>& layerMap)
+{
+    if (!layerMap)
+        return;
+
+    for (auto& layer : layerMap->values())
+        layer->setOwner(nullptr);
+    
+    layerMap = nullptr;
+}
+
 void GraphicsLayerCA::removeCloneLayers()
 {
-    m_layerClones = nullptr;
-    m_structuralLayerClones = nullptr;
-    m_contentsLayerClones = nullptr;
-    m_contentsClippingLayerClones = nullptr;
-    m_contentsShapeMaskLayerClones = nullptr;
-    m_shapeMaskLayerClones = nullptr;
+    clearClones(m_layerClones);
+    clearClones(m_structuralLayerClones);
+    clearClones(m_contentsLayerClones);
+    clearClones(m_contentsClippingLayerClones);
+    clearClones(m_contentsShapeMaskLayerClones);
+    clearClones(m_shapeMaskLayerClones);
 }
 
 FloatPoint GraphicsLayerCA::positionForCloneRootLayer() const

Modified: trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.h (192852 => 192853)


--- trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.h	2015-12-01 02:29:18 UTC (rev 192852)
+++ trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.h	2015-12-01 02:46:09 UTC (rev 192853)
@@ -365,6 +365,8 @@
     void ensureCloneLayers(CloneID, RefPtr<PlatformCALayer>& primaryLayer, RefPtr<PlatformCALayer>& structuralLayer,
         RefPtr<PlatformCALayer>& contentsLayer, RefPtr<PlatformCALayer>& contentsClippingLayer, RefPtr<PlatformCALayer>& contentsShapeMaskLayer, RefPtr<PlatformCALayer>& shapeMaskLayer, CloneLevel);
 
+    static void clearClones(std::unique_ptr<LayerMap>&);
+
     bool hasCloneLayers() const { return !!m_layerClones; }
     void removeCloneLayers();
     FloatPoint positionForCloneRootLayer() const;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to