From 78fdfbadbd9b4ba76a2a021f85b98bc2b098b8ea Mon Sep 17 00:00:00 2001 From: Nicolas Roard Date: Mon, 8 Aug 2011 15:57:28 -0700 Subject: [PATCH] Fix ANR in webkit bug:5128336 Change-Id: I591882eb9bd96a04fd34299a8bf76d35a9462d94 --- .../platform/graphics/android/GLWebViewState.cpp | 4 +-- .../platform/graphics/android/LayerAndroid.cpp | 2 ++ .../graphics/android/PaintTileOperation.cpp | 10 +++++-- .../platform/graphics/android/PaintTileOperation.h | 4 ++- .../platform/graphics/android/PaintedSurface.h | 3 +- .../graphics/android/TexturesGenerator.cpp | 5 ---- .../platform/graphics/android/TexturesGenerator.h | 1 - .../platform/graphics/android/TiledTexture.cpp | 3 +- .../platform/graphics/android/TilesManager.cpp | 34 ---------------------- .../platform/graphics/android/TilesManager.h | 7 ----- 10 files changed, 17 insertions(+), 56 deletions(-) diff --git a/Source/WebCore/platform/graphics/android/GLWebViewState.cpp b/Source/WebCore/platform/graphics/android/GLWebViewState.cpp index 415546175..748c5e9dd 100644 --- a/Source/WebCore/platform/graphics/android/GLWebViewState.cpp +++ b/Source/WebCore/platform/graphics/android/GLWebViewState.cpp @@ -554,10 +554,8 @@ bool GLWebViewState::drawGL(IntRect& rect, SkRect& viewport, IntRect* invalRect, // the BaseTiles' texture. TilesManager::instance()->transferQueue()->updateDirtyBaseTiles(); - if (compositedRoot != m_previouslyUsedRoot) { + if (compositedRoot != m_previouslyUsedRoot) TilesManager::instance()->swapLayersTextures(m_previouslyUsedRoot, compositedRoot); - TilesManager::instance()->cleanupTilesTextures(); - } bool ret = baseLayer->drawGL(compositedRoot, rect, viewport, webViewRect, titleBarHeight, clip, scale, pagesSwapped, color); diff --git a/Source/WebCore/platform/graphics/android/LayerAndroid.cpp b/Source/WebCore/platform/graphics/android/LayerAndroid.cpp index 00db27cd5..97ff6922c 100644 --- a/Source/WebCore/platform/graphics/android/LayerAndroid.cpp +++ b/Source/WebCore/platform/graphics/android/LayerAndroid.cpp @@ -164,6 +164,7 @@ LayerAndroid::~LayerAndroid() { if (m_texture) m_texture->removeLayer(this); + SkSafeUnref(m_texture); removeChildren(); delete m_extra; delete m_contentsImage; @@ -719,6 +720,7 @@ void LayerAndroid::assignTexture(LayerAndroid* oldTree) if (oldLayer && oldLayer->texture()) { oldLayer->texture()->replaceLayer(this); m_texture = oldLayer->texture(); + SkSafeRef(m_texture); } } diff --git a/Source/WebCore/platform/graphics/android/PaintTileOperation.cpp b/Source/WebCore/platform/graphics/android/PaintTileOperation.cpp index d5623dfc5..064ffb928 100644 --- a/Source/WebCore/platform/graphics/android/PaintTileOperation.cpp +++ b/Source/WebCore/platform/graphics/android/PaintTileOperation.cpp @@ -26,16 +26,21 @@ #include "config.h" #include "PaintTileOperation.h" #include "LayerAndroid.h" +#include "PaintedSurface.h" namespace WebCore { -PaintTileOperation::PaintTileOperation(BaseTile* tile, LayerAndroid* layer) +PaintTileOperation::PaintTileOperation(BaseTile* tile, PaintedSurface* surface) : QueuedOperation(QueuedOperation::PaintTile, tile->page()) , m_tile(tile) - , m_layer(layer) + , m_surface(surface) + , m_layer(0) { if (m_tile) m_tile->setRepaintPending(true); + if (m_surface) + m_layer = surface->layer(); + SkSafeRef(m_surface); SkSafeRef(m_layer); } @@ -45,6 +50,7 @@ PaintTileOperation::~PaintTileOperation() m_tile->setRepaintPending(false); m_tile = 0; } + SkSafeUnref(m_surface); SkSafeUnref(m_layer); } diff --git a/Source/WebCore/platform/graphics/android/PaintTileOperation.h b/Source/WebCore/platform/graphics/android/PaintTileOperation.h index 4d1bb1ad9..72a412538 100644 --- a/Source/WebCore/platform/graphics/android/PaintTileOperation.h +++ b/Source/WebCore/platform/graphics/android/PaintTileOperation.h @@ -31,10 +31,11 @@ namespace WebCore { class LayerAndroid; +class PaintedSurface; class PaintTileOperation : public QueuedOperation { public: - PaintTileOperation(BaseTile* tile, LayerAndroid* layer = 0); + PaintTileOperation(BaseTile* tile, PaintedSurface* surface = 0); virtual ~PaintTileOperation(); virtual bool operator==(const QueuedOperation* operation); virtual void run(); @@ -44,6 +45,7 @@ public: private: BaseTile* m_tile; + PaintedSurface* m_surface; LayerAndroid* m_layer; }; diff --git a/Source/WebCore/platform/graphics/android/PaintedSurface.h b/Source/WebCore/platform/graphics/android/PaintedSurface.h index 39d6154cd..84fe64cdb 100644 --- a/Source/WebCore/platform/graphics/android/PaintedSurface.h +++ b/Source/WebCore/platform/graphics/android/PaintedSurface.h @@ -30,6 +30,7 @@ #include "ClassTracker.h" #include "IntRect.h" #include "LayerAndroid.h" +#include "SkRefCnt.h" #include "TextureOwner.h" #include "TiledTexture.h" #include "TilesManager.h" @@ -40,7 +41,7 @@ class SkCanvas; namespace WebCore { -class PaintedSurface : public TilePainter { +class PaintedSurface : public SkRefCnt, TilePainter { public: PaintedSurface(LayerAndroid* layer) : m_layer(layer) diff --git a/Source/WebCore/platform/graphics/android/TexturesGenerator.cpp b/Source/WebCore/platform/graphics/android/TexturesGenerator.cpp index 9780336f6..3f7d6a392 100644 --- a/Source/WebCore/platform/graphics/android/TexturesGenerator.cpp +++ b/Source/WebCore/platform/graphics/android/TexturesGenerator.cpp @@ -70,11 +70,6 @@ void TexturesGenerator::removePaintOperationsForPage(TiledPage* page, bool waitF removeOperationsForFilter(new PagePaintFilter(page), waitForRunning); } -void TexturesGenerator::removeOperationsForPainter(TilePainter* painter, bool waitForRunning) -{ - removeOperationsForFilter(new TilePainterFilter(painter), waitForRunning); -} - void TexturesGenerator::removeOperationsForFilter(OperationFilter* filter) { removeOperationsForFilter(filter, true); diff --git a/Source/WebCore/platform/graphics/android/TexturesGenerator.h b/Source/WebCore/platform/graphics/android/TexturesGenerator.h index bac198c27..19ab1aff9 100644 --- a/Source/WebCore/platform/graphics/android/TexturesGenerator.h +++ b/Source/WebCore/platform/graphics/android/TexturesGenerator.h @@ -49,7 +49,6 @@ public: virtual status_t readyToRun(); void removeOperationsForPage(TiledPage* page); - void removeOperationsForPainter(TilePainter* painter, bool waitForRunning); void removePaintOperationsForPage(TiledPage* page, bool waitForRunning); void removeOperationsForFilter(OperationFilter* filter); void removeOperationsForFilter(OperationFilter* filter, bool waitForRunning); diff --git a/Source/WebCore/platform/graphics/android/TiledTexture.cpp b/Source/WebCore/platform/graphics/android/TiledTexture.cpp index a49c6c649..d97582528 100644 --- a/Source/WebCore/platform/graphics/android/TiledTexture.cpp +++ b/Source/WebCore/platform/graphics/android/TiledTexture.cpp @@ -139,7 +139,7 @@ void TiledTexture::prepareTile(bool repaint, int x, int y) LayerAndroid* layer = m_surface->layer(); if (schedule && layer && !tile->isRepaintPending()) { - PaintTileOperation *operation = new PaintTileOperation(tile, layer); + PaintTileOperation *operation = new PaintTileOperation(tile, m_surface); TilesManager::instance()->scheduleOperation(operation); } } @@ -228,7 +228,6 @@ void TiledTexture::endPaint() void TiledTexture::removeTiles() { - TilesManager::instance()->removeOperationsForPainter(this, true); for (unsigned int i = 0; i < m_tiles.size(); i++) { delete m_tiles[i]; } diff --git a/Source/WebCore/platform/graphics/android/TilesManager.cpp b/Source/WebCore/platform/graphics/android/TilesManager.cpp index bf14c6170..ba4811138 100644 --- a/Source/WebCore/platform/graphics/android/TilesManager.cpp +++ b/Source/WebCore/platform/graphics/android/TilesManager.cpp @@ -198,40 +198,6 @@ void TilesManager::addPaintedSurface(PaintedSurface* surface) m_paintedSurfaces.append(surface); } -void TilesManager::cleanupTilesTextures() -{ - // release existing surfaces without layers - WTF::Vector collect; - for (unsigned int i = 0; i < m_paintedSurfaces.size(); i++) { - PaintedSurface* surface = m_paintedSurfaces[i]; - if (!surface->layer() && !surface->busy()) - collect.append(surface); - } - XLOG("remove %d / %d PaintedSurfaces", collect.size(), m_paintedSurfaces.size()); - for (unsigned int i = 0; i < collect.size(); i++) { - m_paintedSurfaces.remove(m_paintedSurfaces.find(collect[i])); - TilePainter* painter = collect[i]->texture(); - // Mark the current painter to destroy!! - m_pixmapsGenerationThread->removeOperationsForPainter(painter, true); - XLOG("destroy %x (%x)", collect[i], painter); - delete collect[i]; - } - for (unsigned int i = 0; i < m_tilesTextures.size(); i++) { - BaseTileTexture* texture = m_tilesTextures[i]; - texture->setUsedLevel(-1); - if (texture->owner()) { - bool keep = false; - for (unsigned int j = 0; j < m_paintedSurfaces.size(); j++) { - if (m_paintedSurfaces[j]->owns(texture)) - keep = true; - } - if (!keep) { - texture->release(texture->owner()); - } - } - } -} - BaseTileTexture* TilesManager::getAvailableTexture(BaseTile* owner) { android::Mutex::Autolock lock(m_texturesLock); diff --git a/Source/WebCore/platform/graphics/android/TilesManager.h b/Source/WebCore/platform/graphics/android/TilesManager.h index 354142255..8f0ac7f28 100644 --- a/Source/WebCore/platform/graphics/android/TilesManager.h +++ b/Source/WebCore/platform/graphics/android/TilesManager.h @@ -66,11 +66,6 @@ public: m_pixmapsGenerationThread->removeOperationsForPage(page); } - void removeOperationsForPainter(TilePainter* painter, bool waitForCompletion) - { - m_pixmapsGenerationThread->removeOperationsForPainter(painter, waitForCompletion); - } - void removePaintOperationsForPage(TiledPage* page, bool waitForCompletion) { m_pixmapsGenerationThread->removePaintOperationsForPage(page, waitForCompletion); @@ -90,8 +85,6 @@ public: BaseTileTexture* getAvailableTexture(BaseTile* owner); - void cleanupTilesTextures(); - void markGeneratorAsReady() { { -- 2.11.0