summaryrefslogtreecommitdiffstats
path: root/cc/layers
diff options
context:
space:
mode:
authorccameron@chromium.org <ccameron@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-20 23:42:38 +0000
committerccameron@chromium.org <ccameron@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-20 23:42:38 +0000
commit9eceee88a34f09756418e5925ec026a29d3c549d (patch)
treeece610136b6797edbe94731ab0a2d47178ae544b /cc/layers
parent3de3afcb22300568e0676904c7d3e9f90743e903 (diff)
downloadchromium_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.cc6
-rw-r--r--cc/layers/nine_patch_layer_impl.cc5
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;