| Index: cc/layers/delegated_renderer_layer_impl.cc
 | 
| diff --git a/cc/layers/delegated_renderer_layer_impl.cc b/cc/layers/delegated_renderer_layer_impl.cc
 | 
| index 34a1cd86755949fbe946dba7057a7fc647aba072..35bd0b7f1b3c5cea768fb98e345e52dc556941ca 100644
 | 
| --- a/cc/layers/delegated_renderer_layer_impl.cc
 | 
| +++ b/cc/layers/delegated_renderer_layer_impl.cc
 | 
| @@ -33,9 +33,7 @@ DelegatedRendererLayerImpl::~DelegatedRendererLayerImpl() {
 | 
|    ClearChildId();
 | 
|  }
 | 
|  
 | 
| -bool DelegatedRendererLayerImpl::HasDelegatedContent() const {
 | 
| -  return !render_passes_in_draw_order_.empty();
 | 
| -}
 | 
| +bool DelegatedRendererLayerImpl::HasDelegatedContent() const { return true; }
 | 
|  
 | 
|  bool DelegatedRendererLayerImpl::HasContributingDelegatedRenderPasses() const {
 | 
|    // The root RenderPass for the layer is merged with its target
 | 
| @@ -101,14 +99,13 @@ void DelegatedRendererLayerImpl::CreateChildIdIfNeeded(
 | 
|  }
 | 
|  
 | 
|  void DelegatedRendererLayerImpl::SetFrameData(
 | 
| -    scoped_ptr<DelegatedFrameData> frame_data,
 | 
| +    const DelegatedFrameData* frame_data,
 | 
|      gfx::RectF damage_in_frame) {
 | 
| -  DCHECK(frame_data);
 | 
|    DCHECK(child_id_) << "CreateChildIdIfNeeded must be called first.";
 | 
| -
 | 
| +  DCHECK(frame_data);
 | 
| +  DCHECK(!frame_data->render_pass_list.empty());
 | 
|    // A frame with an empty root render pass is invalid.
 | 
| -  DCHECK(frame_data->render_pass_list.empty() ||
 | 
| -         !frame_data->render_pass_list.back()->output_rect.IsEmpty());
 | 
| +  DCHECK(!frame_data->render_pass_list.back()->output_rect.IsEmpty());
 | 
|  
 | 
|    ResourceProvider* resource_provider = layer_tree_impl()->resource_provider();
 | 
|      const ResourceProvider::ResourceIdMap& resource_map =
 | 
| @@ -116,6 +113,9 @@ void DelegatedRendererLayerImpl::SetFrameData(
 | 
|  
 | 
|    resource_provider->ReceiveFromChild(child_id_, frame_data->resource_list);
 | 
|  
 | 
| +  ScopedPtrVector<RenderPass> render_pass_list;
 | 
| +  RenderPass::CopyAll(frame_data->render_pass_list, &render_pass_list);
 | 
| +
 | 
|    bool invalid_frame = false;
 | 
|    ResourceProvider::ResourceIdArray resources_in_frame;
 | 
|    DrawQuad::ResourceIteratorCallback remap_resources_to_parent_callback =
 | 
| @@ -123,8 +123,8 @@ void DelegatedRendererLayerImpl::SetFrameData(
 | 
|                   &invalid_frame,
 | 
|                   resource_map,
 | 
|                   &resources_in_frame);
 | 
| -  for (size_t i = 0; i < frame_data->render_pass_list.size(); ++i) {
 | 
| -    RenderPass* pass = frame_data->render_pass_list[i];
 | 
| +  for (size_t i = 0; i < render_pass_list.size(); ++i) {
 | 
| +    RenderPass* pass = render_pass_list[i];
 | 
|      for (size_t j = 0; j < pass->quad_list.size(); ++j) {
 | 
|        DrawQuad* quad = pass->quad_list[j];
 | 
|        quad->IterateResources(remap_resources_to_parent_callback);
 | 
| @@ -143,18 +143,13 @@ void DelegatedRendererLayerImpl::SetFrameData(
 | 
|  
 | 
|    // Display size is already set so we can compute what the damage rect
 | 
|    // will be in layer space.
 | 
| -  if (!frame_data->render_pass_list.empty()) {
 | 
| -    RenderPass* new_root_pass = frame_data->render_pass_list.back();
 | 
| -    gfx::RectF damage_in_layer = MathUtil::MapClippedRect(
 | 
| -        DelegatedFrameToLayerSpaceTransform(
 | 
| -            new_root_pass->output_rect.size()),
 | 
| -        damage_in_frame);
 | 
| -    set_update_rect(gfx::UnionRects(update_rect(), damage_in_layer));
 | 
| -  }
 | 
| +  RenderPass* new_root_pass = render_pass_list.back();
 | 
| +  gfx::Size frame_size = new_root_pass->output_rect.size();
 | 
| +  gfx::RectF damage_in_layer = MathUtil::MapClippedRect(
 | 
| +      DelegatedFrameToLayerSpaceTransform(frame_size), damage_in_frame);
 | 
| +  set_update_rect(gfx::UnionRects(update_rect(), damage_in_layer));
 | 
|  
 | 
| -  // Save the remapped quads on the layer. This steals the quads and render
 | 
| -  // passes from the frame_data.
 | 
| -  SetRenderPasses(&frame_data->render_pass_list);
 | 
| +  SetRenderPasses(&render_pass_list);
 | 
|    have_render_passes_to_push_ = true;
 | 
|  }
 | 
|  
 | 
| @@ -184,7 +179,6 @@ void DelegatedRendererLayerImpl::SetRenderPasses(
 | 
|  }
 | 
|  
 | 
|  void DelegatedRendererLayerImpl::ClearRenderPasses() {
 | 
| -  // TODO(danakj): Release the resources back to the nested compositor.
 | 
|    render_passes_index_by_id_.clear();
 | 
|    render_passes_in_draw_order_.clear();
 | 
|  }
 | 
| @@ -271,6 +265,7 @@ void DelegatedRendererLayerImpl::AppendQuads(
 | 
|      AppendQuadsData* append_quads_data) {
 | 
|    AppendRainbowDebugBorder(quad_sink, append_quads_data);
 | 
|  
 | 
| +  // This list will be empty after a lost context until a new frame arrives.
 | 
|    if (render_passes_in_draw_order_.empty())
 | 
|      return;
 | 
|  
 | 
| 
 |