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