| Index: cc/trees/thread_proxy.cc
 | 
| diff --git a/cc/trees/thread_proxy.cc b/cc/trees/thread_proxy.cc
 | 
| index 860144b6151adc3f4adf99f2c3212f164f516cd9..9bf4d381c1a35d06568f28a2280be81634f96181 100644
 | 
| --- a/cc/trees/thread_proxy.cc
 | 
| +++ b/cc/trees/thread_proxy.cc
 | 
| @@ -1160,17 +1160,22 @@ DrawSwapReadbackResult ThreadProxy::DrawSwapReadbackInternal(
 | 
|    LayerTreeHostImpl::FrameData frame;
 | 
|    bool draw_frame = false;
 | 
|  
 | 
| -  if (impl().layer_tree_host_impl->CanDraw() &&
 | 
| -      (!drawing_for_readback || can_do_readback)) {
 | 
| -    // If it is for a readback, make sure we draw the portion being read back.
 | 
| -    gfx::Rect readback_rect;
 | 
| -    if (drawing_for_readback)
 | 
| -      readback_rect = impl().readback_request->rect;
 | 
| -
 | 
| -    result.draw_result =
 | 
| -        impl().layer_tree_host_impl->PrepareToDraw(&frame, readback_rect);
 | 
| -    draw_frame = forced_draw ||
 | 
| -                 result.draw_result == DrawSwapReadbackResult::DRAW_SUCCESS;
 | 
| +  if (impl().layer_tree_host_impl->CanDraw()) {
 | 
| +    if (!drawing_for_readback || can_do_readback) {
 | 
| +      // If it is for a readback, make sure we draw the portion being read back.
 | 
| +      gfx::Rect readback_rect;
 | 
| +      if (drawing_for_readback)
 | 
| +        readback_rect = impl().readback_request->rect;
 | 
| +
 | 
| +      result.draw_result =
 | 
| +          impl().layer_tree_host_impl->PrepareToDraw(&frame, readback_rect);
 | 
| +      draw_frame = forced_draw ||
 | 
| +                   result.draw_result == DrawSwapReadbackResult::DRAW_SUCCESS;
 | 
| +    } else {
 | 
| +      result.draw_result = DrawSwapReadbackResult::DRAW_ABORTED_CANT_READBACK;
 | 
| +    }
 | 
| +  } else {
 | 
| +    result.draw_result = DrawSwapReadbackResult::DRAW_ABORTED_CANT_DRAW;
 | 
|    }
 | 
|  
 | 
|    if (draw_frame) {
 | 
| @@ -1202,10 +1207,14 @@ DrawSwapReadbackResult ThreadProxy::DrawSwapReadbackInternal(
 | 
|    if (drawing_for_readback) {
 | 
|      DCHECK(!swap_requested);
 | 
|      result.did_readback = false;
 | 
| -    if (draw_frame && !impl().layer_tree_host_impl->IsContextLost()) {
 | 
| -      impl().layer_tree_host_impl->Readback(impl().readback_request->pixels,
 | 
| -                                            impl().readback_request->rect);
 | 
| -      result.did_readback = true;
 | 
| +    if (draw_frame) {
 | 
| +      if (!impl().layer_tree_host_impl->IsContextLost()) {
 | 
| +        impl().layer_tree_host_impl->Readback(impl().readback_request->pixels,
 | 
| +                                              impl().readback_request->rect);
 | 
| +        result.did_readback = true;
 | 
| +      } else {
 | 
| +        result.draw_result = DrawSwapReadbackResult::DRAW_ABORTED_CONTEXT_LOST;
 | 
| +      }
 | 
|      }
 | 
|      impl().readback_request->success = result.did_readback;
 | 
|      impl().readback_request->completion.Signal();
 | 
| @@ -1229,9 +1238,10 @@ DrawSwapReadbackResult ThreadProxy::DrawSwapReadbackInternal(
 | 
|          base::Bind(&ThreadProxy::DidCommitAndDrawFrame, main_thread_weak_ptr_));
 | 
|    }
 | 
|  
 | 
| -  if (draw_frame) {
 | 
| +  if (draw_frame)
 | 
|      CheckOutputSurfaceStatusOnImplThread();
 | 
|  
 | 
| +  if (result.draw_result == DrawSwapReadbackResult::DRAW_SUCCESS) {
 | 
|      base::TimeDelta draw_duration = impl().timing_history.DidFinishDrawing();
 | 
|  
 | 
|      base::TimeDelta draw_duration_overestimate;
 | 
| @@ -1257,6 +1267,7 @@ DrawSwapReadbackResult ThreadProxy::DrawSwapReadbackInternal(
 | 
|                                 50);
 | 
|    }
 | 
|  
 | 
| +  DCHECK_NE(DrawSwapReadbackResult::INVALID_RESULT, result.draw_result);
 | 
|    return result;
 | 
|  }
 | 
|  
 | 
| @@ -1309,6 +1320,12 @@ void ThreadProxy::ScheduledActionManageTiles() {
 | 
|  
 | 
|  DrawSwapReadbackResult ThreadProxy::ScheduledActionDrawAndSwapIfPossible() {
 | 
|    TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionDrawAndSwap");
 | 
| +
 | 
| +  // SchedulerStateMachine::DidDrawIfPossibleCompleted isn't set up to
 | 
| +  // handle DRAW_ABORTED_CANT_DRAW.  Moreover, the scheduler should
 | 
| +  // never generate this call when it can't draw.
 | 
| +  DCHECK(impl().layer_tree_host_impl->CanDraw());
 | 
| +
 | 
|    bool forced_draw = false;
 | 
|    bool swap_requested = true;
 | 
|    bool readback_requested = false;
 | 
| 
 |