Title: [93927] trunk/Source/WebCore
Revision
93927
Author
[email protected]
Date
2011-08-26 17:38:50 -0700 (Fri, 26 Aug 2011)

Log Message

[Chromium] Possible leak of LayerRendererChromium
https://bugs.webkit.org/show_bug.cgi?id=66981

Patch by James Robinson <[email protected]> on 2011-08-26
Reviewed by Kenneth Russell.

Fix a number of reference cycle leaks that prevent LayerRendererChromiums from being destroyed when a tab is
closed.

Not possible to write a layout test where an entire WebView goes away.

* platform/graphics/chromium/GraphicsLayerChromium.cpp:
(WebCore::GraphicsLayerChromium::~GraphicsLayerChromium):
* platform/graphics/chromium/LayerRendererChromium.cpp:
(WebCore::LayerRendererChromium::clearRenderSurfacesOnCCLayerImplRecursive):
(WebCore::LayerRendererChromium::clearRootCCLayerImpl):
(WebCore::LayerRendererChromium::cleanupSharedObjects):
* platform/graphics/chromium/LayerRendererChromium.h:
* platform/graphics/chromium/cc/CCLayerTreeHost.cpp:
(WebCore::CCLayerTreeHost::setRootLayer):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (93926 => 93927)


--- trunk/Source/WebCore/ChangeLog	2011-08-27 00:23:11 UTC (rev 93926)
+++ trunk/Source/WebCore/ChangeLog	2011-08-27 00:38:50 UTC (rev 93927)
@@ -1,3 +1,25 @@
+2011-08-26  James Robinson  <[email protected]>
+
+        [Chromium] Possible leak of LayerRendererChromium
+        https://bugs.webkit.org/show_bug.cgi?id=66981
+
+        Reviewed by Kenneth Russell.
+
+        Fix a number of reference cycle leaks that prevent LayerRendererChromiums from being destroyed when a tab is
+        closed.
+
+        Not possible to write a layout test where an entire WebView goes away.
+
+        * platform/graphics/chromium/GraphicsLayerChromium.cpp:
+        (WebCore::GraphicsLayerChromium::~GraphicsLayerChromium):
+        * platform/graphics/chromium/LayerRendererChromium.cpp:
+        (WebCore::LayerRendererChromium::clearRenderSurfacesOnCCLayerImplRecursive):
+        (WebCore::LayerRendererChromium::clearRootCCLayerImpl):
+        (WebCore::LayerRendererChromium::cleanupSharedObjects):
+        * platform/graphics/chromium/LayerRendererChromium.h:
+        * platform/graphics/chromium/cc/CCLayerTreeHost.cpp:
+        (WebCore::CCLayerTreeHost::setRootLayer):
+
 2011-08-26  Nate Chapin  <[email protected]>
 
         Move allowCredentials from ThreadableLoaderOptions down

Modified: trunk/Source/WebCore/platform/graphics/chromium/GraphicsLayerChromium.cpp (93926 => 93927)


--- trunk/Source/WebCore/platform/graphics/chromium/GraphicsLayerChromium.cpp	2011-08-27 00:23:11 UTC (rev 93926)
+++ trunk/Source/WebCore/platform/graphics/chromium/GraphicsLayerChromium.cpp	2011-08-27 00:38:50 UTC (rev 93927)
@@ -102,12 +102,18 @@
 
 GraphicsLayerChromium::~GraphicsLayerChromium()
 {
-    if (m_layer)
+    if (m_layer) {
         m_layer->setOwner(0);
-    if (m_contentsLayer)
+        m_layer->clearRenderSurface();
+    }
+    if (m_contentsLayer) {
         m_contentsLayer->setOwner(0);
-    if (m_transformLayer)
+        m_contentsLayer->clearRenderSurface();
+    }
+    if (m_transformLayer) {
         m_transformLayer->setOwner(0);
+        m_transformLayer->clearRenderSurface();
+    }
 }
 
 void GraphicsLayerChromium::setName(const String& inName)

Modified: trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp (93926 => 93927)


--- trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp	2011-08-27 00:23:11 UTC (rev 93926)
+++ trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp	2011-08-27 00:38:50 UTC (rev 93927)
@@ -507,6 +507,20 @@
     cleanupSharedObjects();
 }
 
+void LayerRendererChromium::clearRenderSurfacesOnCCLayerImplRecursive(CCLayerImpl* layer)
+{
+    for (size_t i = 0; i < layer->children().size(); ++i)
+        clearRenderSurfacesOnCCLayerImplRecursive(layer->children()[i].get());
+    layer->clearRenderSurface();
+}
+
+void LayerRendererChromium::clearRootCCLayerImpl()
+{
+    if (m_rootCCLayerImpl)
+        clearRenderSurfacesOnCCLayerImplRecursive(m_rootCCLayerImpl.get());
+    m_rootCCLayerImpl.clear();
+}
+
 GraphicsContext3D* LayerRendererChromium::context()
 {
     return m_context.get();
@@ -1240,15 +1254,17 @@
 
     m_sharedGeometry.clear();
     m_borderProgram.clear();
+    m_headsUpDisplayProgram.clear();
+    m_tilerProgram.clear();
+    m_tilerProgramSwizzle.clear();
+    m_tilerProgramAA.clear();
+    m_tilerProgramSwizzleAA.clear();
     m_canvasLayerProgram.clear();
-    m_headsUpDisplayProgram.clear();
+    m_pluginLayerProgram.clear();
+    m_renderSurfaceMaskProgram.clear();
+    m_renderSurfaceProgram.clear();
     m_videoLayerRGBAProgram.clear();
     m_videoLayerYUVProgram.clear();
-    m_pluginLayerProgram.clear();
-    m_renderSurfaceProgram.clear();
-    m_renderSurfaceMaskProgram.clear();
-    m_tilerProgram.clear();
-    m_tilerProgramSwizzle.clear();
     if (m_offscreenFramebufferId)
         GLC(m_context.get(), m_context->deleteFramebuffer(m_offscreenFramebufferId));
 

Modified: trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h (93926 => 93927)


--- trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h	2011-08-27 00:23:11 UTC (rev 93926)
+++ trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h	2011-08-27 00:38:50 UTC (rev 93927)
@@ -154,6 +154,7 @@
     typedef Vector<RefPtr<LayerChromium> > LayerList;
     typedef Vector<RefPtr<CCLayerImpl> > CCLayerList;
 
+    void clearRootCCLayerImpl();
 private:
     // FIXME: This needs to be moved to the CCLayerTreeHostImpl when that class exists.
     RefPtr<CCLayerImpl> m_rootCCLayerImpl;
@@ -189,6 +190,8 @@
     bool initializeSharedObjects();
     void cleanupSharedObjects();
 
+    void clearRenderSurfacesOnCCLayerImplRecursive(CCLayerImpl*);
+
     // FIXME: Change this to CCLayerTreeHostImpl
     CCLayerTreeHost* m_owner;
 

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp (93926 => 93927)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp	2011-08-27 00:23:11 UTC (rev 93926)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp	2011-08-27 00:38:50 UTC (rev 93927)
@@ -180,7 +180,8 @@
     if (layer) {
         m_nonCompositedContentHost->graphicsLayer()->addChild(layer);
         layer->platformLayer()->setLayerRenderer(m_layerRenderer.get());
-    }
+    } else
+        layerRenderer()->clearRootCCLayerImpl();
 
 }
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to