diff options
author | ccameron@chromium.org <ccameron@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-20 23:42:38 +0000 |
---|---|---|
committer | ccameron@chromium.org <ccameron@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-20 23:42:38 +0000 |
commit | 9eceee88a34f09756418e5925ec026a29d3c549d (patch) | |
tree | ece610136b6797edbe94731ab0a2d47178ae544b /cc/layers | |
parent | 3de3afcb22300568e0676904c7d3e9f90743e903 (diff) | |
download | chromium_src-9eceee88a34f09756418e5925ec026a29d3c549d.zip chromium_src-9eceee88a34f09756418e5925ec026a29d3c549d.tar.gz chromium_src-9eceee88a34f09756418e5925ec026a29d3c549d.tar.bz2 |
Fix crashes when NinePatchLayer doesn't have a resource.
First issue is that if NinePatchLayer doesn't get a ResourceId because
of memory pressure, it will DCHECK. This is a valid situation -- just
draw nothing (checkerboard would be okay as well).
Second issue is that NinePatchLayer passes the ResourceId in for the
texture in PushPropertiesTo, but does not call SetNeedsPushProperties
when painting a new resource. The documentation of Layer::Update
suggests that a side-effect of returning true from Layer::Update is
that SetNeedsCommit will be called ont this layer, but this is not
the case.
BUG=133097
Review URL: https://chromiumcodereview.appspot.com/22911024
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@218574 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/layers')
-rw-r--r-- | cc/layers/nine_patch_layer.cc | 6 | ||||
-rw-r--r-- | cc/layers/nine_patch_layer_impl.cc | 5 |
2 files changed, 9 insertions, 2 deletions
diff --git a/cc/layers/nine_patch_layer.cc b/cc/layers/nine_patch_layer.cc index e32f6e0..517b49b 100644 --- a/cc/layers/nine_patch_layer.cc +++ b/cc/layers/nine_patch_layer.cc @@ -72,6 +72,7 @@ bool NinePatchLayer::Update(ResourceUpdateQueue* queue, bitmap_dirty_ = false; updated = true; } + return updated; } @@ -111,6 +112,11 @@ void NinePatchLayer::PushPropertiesTo(LayerImpl* layer) { layer_impl->SetLayout( gfx::Size(bitmap_.width(), bitmap_.height()), image_aperture_); } + + // NinePatchLayer must push properties every commit to make sure + // NinePatchLayerImpl::resource_id_ is valid. + // http://crbug.com/276482 + needs_push_properties_ = true; } } // namespace cc diff --git a/cc/layers/nine_patch_layer_impl.cc b/cc/layers/nine_patch_layer_impl.cc index 103f765..4274bf0 100644 --- a/cc/layers/nine_patch_layer_impl.cc +++ b/cc/layers/nine_patch_layer_impl.cc @@ -64,12 +64,13 @@ bool NinePatchLayerImpl::WillDraw(DrawMode draw_mode, void NinePatchLayerImpl::AppendQuads(QuadSink* quad_sink, AppendQuadsData* append_quads_data) { - DCHECK(resource_id_); - SharedQuadState* shared_quad_state = quad_sink->UseSharedQuadState(CreateSharedQuadState()); AppendDebugBorderQuad(quad_sink, shared_quad_state, append_quads_data); + if (!resource_id_) + return; + static const bool flipped = false; static const bool premultiplied_alpha = true; |