From: Nicolas Roard Date: Fri, 9 Dec 2011 00:50:32 +0000 (-0800) Subject: Fix ANR when hitting very large layers X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=900fb9639aa20ef442a9f542f1da52fea667589c;hp=e50c6da15806ff91b5e9298cb303f2b8f9ae6b35;p=android-x86%2Fexternal-webkit.git Fix ANR when hitting very large layers In some cases we have to deal with very large layers (e.g. 130k x 56k). We do clip them at draw time, but at prepare time we will generate *all* the needed BaseTile objects. Those are small, but when you have to allocated 100k of them and then iterate, it does not make things fast, and we can ANR (and sometimes recover later). bug:5466840 Change-Id: I01c64ed1014fa719b619609fd2bd24126dc9056e --- diff --git a/Source/WebCore/platform/graphics/android/PaintedSurface.cpp b/Source/WebCore/platform/graphics/android/PaintedSurface.cpp index d3c1e15f8..45c7579ab 100644 --- a/Source/WebCore/platform/graphics/android/PaintedSurface.cpp +++ b/Source/WebCore/platform/graphics/android/PaintedSurface.cpp @@ -52,9 +52,8 @@ #endif // DEBUG -// Allows layers using less than MAX_UNCLIPPED_AREA tiles to -// schedule all of them instead of clipping the area with the visible rect. -#define MAX_UNCLIPPED_AREA 16 +// Layers with an area larger than 2048*2048 should never be unclipped +#define MAX_UNCLIPPED_AREA 4194304 namespace WebCore { @@ -203,10 +202,14 @@ IntRect PaintedSurface::computeVisibleArea(LayerAndroid* layer) { return area; if (!layer->contentIsScrollable() - && layer->state()->layersRenderingMode() == GLWebViewState::kAllTextures) + && layer->state()->layersRenderingMode() == GLWebViewState::kAllTextures) { area = layer->unclippedArea(); - else + double total = ((double) area.width()) * ((double) area.height()); + if (total > MAX_UNCLIPPED_AREA) + area = layer->visibleArea(); + } else { area = layer->visibleArea(); + } return area; }