| Index: android_webview/browser/browser_view_renderer.cc | 
| diff --git a/android_webview/browser/browser_view_renderer.cc b/android_webview/browser/browser_view_renderer.cc | 
| index c2de48b16c75b110ef37d3cf5a35e1e94adc9310..dbbd873ba32f157577da09a4933adebbf05ecb83 100644 | 
| --- a/android_webview/browser/browser_view_renderer.cc | 
| +++ b/android_webview/browser/browser_view_renderer.cc | 
| @@ -68,6 +68,7 @@ BrowserViewRenderer::BrowserViewRenderer( | 
| page_scale_factor_(1.0), | 
| on_new_picture_enable_(false), | 
| clear_view_(false), | 
| +      offscreen_pre_raster_(false), | 
| compositor_needs_continuous_invalidate_(false), | 
| invalidate_after_composite_(false), | 
| block_invalidates_(false), | 
| @@ -128,8 +129,11 @@ size_t BrowserViewRenderer::CalculateDesiredMemoryPolicy() { | 
| if (g_memory_override_in_bytes) | 
| return static_cast<size_t>(g_memory_override_in_bytes); | 
|  | 
| -  size_t width = last_on_draw_global_visible_rect_.width(); | 
| -  size_t height = last_on_draw_global_visible_rect_.height(); | 
| +  gfx::Rect interest_rect = offscreen_pre_raster_ | 
| +                                ? gfx::Rect(size_) | 
| +                                : last_on_draw_global_visible_rect_; | 
| +  size_t width = interest_rect.width(); | 
| +  size_t height = interest_rect.height(); | 
| size_t bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height; | 
| // Round up to a multiple of kMemoryAllocationStep. | 
| bytes_limit = | 
| @@ -178,15 +182,6 @@ bool BrowserViewRenderer::OnDrawHardware() { | 
| return false; | 
| } | 
|  | 
| -  if (last_on_draw_global_visible_rect_.IsEmpty() && | 
| -      parent_draw_constraints_.surface_rect.IsEmpty()) { | 
| -    TRACE_EVENT_INSTANT0("android_webview", | 
| -                         "EarlyOut_EmptyVisibleRect", | 
| -                         TRACE_EVENT_SCOPE_THREAD); | 
| -    shared_renderer_state_.SetForceInvalidateOnNextDrawGLOnUI(true); | 
| -    return true; | 
| -  } | 
| - | 
| ReturnResourceFromParent(); | 
| if (shared_renderer_state_.HasCompositorFrameOnUI()) { | 
| TRACE_EVENT_INSTANT0("android_webview", | 
| @@ -222,11 +217,15 @@ scoped_ptr<cc::CompositorFrame> BrowserViewRenderer::CompositeHw() { | 
| // applied onto the layer so global visible rect does not make sense here. | 
| // In this case, just use the surface rect for tiling. | 
| gfx::Rect viewport_rect_for_tile_priority; | 
| -  if (parent_draw_constraints_.is_layer || | 
| -      last_on_draw_global_visible_rect_.IsEmpty()) { | 
| -    viewport_rect_for_tile_priority = parent_draw_constraints_.surface_rect; | 
| -  } else { | 
| -    viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_; | 
| + | 
| +  // Leave viewport_rect_for_tile_priority empty if offscreen_pre_raster_ is on. | 
| +  if (!offscreen_pre_raster_) { | 
| +    if (parent_draw_constraints_.is_layer || | 
| +        last_on_draw_global_visible_rect_.IsEmpty()) { | 
| +      viewport_rect_for_tile_priority = parent_draw_constraints_.surface_rect; | 
| +    } else { | 
| +      viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_; | 
| +    } | 
| } | 
|  | 
| scoped_ptr<cc::CompositorFrame> frame = | 
| @@ -326,6 +325,11 @@ void BrowserViewRenderer::ClearView() { | 
| EnsureContinuousInvalidation(true, false); | 
| } | 
|  | 
| +void BrowserViewRenderer::SetOffscreenPreRaster(bool enable) { | 
| +  // TODO(hush): anything to do when the setting is toggled? | 
| +  offscreen_pre_raster_ = enable; | 
| +} | 
| + | 
| void BrowserViewRenderer::SetIsPaused(bool paused) { | 
| TRACE_EVENT_INSTANT1("android_webview", | 
| "BrowserViewRenderer::SetIsPaused", | 
|  |