Chromium Code Reviews| Index: content/renderer/render_thread_impl.cc |
| diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc |
| index 45678d19a939b0bec6864ddc6aca43a1d66fc21f..5f7e5ae4773bd265ddddeb2d49b8761ebcd52d38 100644 |
| --- a/content/renderer/render_thread_impl.cc |
| +++ b/content/renderer/render_thread_impl.cc |
| @@ -898,6 +898,12 @@ void RenderThreadImpl::Init( |
| base::Bind(&RenderThreadImpl::RecordPurgeAndSuspendMemoryGrowthMetrics, |
| base::Unretained(this))); |
| + purge_before_suspend_timers_closure_.Reset(base::Bind( |
| + &RenderThreadImpl::PurgeBeforeSuspendTimerQueue, base::Unretained(this))); |
| + suspend_timers_when_backgrounded_closure_.Reset( |
| + base::Bind(&RenderThreadImpl::SuspendTimerQueueWhenBackgrounded, |
| + base::Unretained(this))); |
| + |
| base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this); |
| // If this renderer doesn't run inside the browser process, enable |
| @@ -1203,11 +1209,6 @@ void RenderThreadImpl::InitializeWebKit( |
| isolate->IsolateInBackgroundNotification(); |
| } |
| - renderer_scheduler_->SetTimerQueueSuspensionWhenBackgroundedEnabled( |
| - GetContentClient() |
| - ->renderer() |
| - ->AllowTimerSuspensionWhenProcessBackgrounded()); |
| - |
| SkGraphics::SetResourceCacheSingleAllocationByteLimit( |
| kImageCacheSingleAllocationByteLimit); |
| @@ -1641,8 +1642,29 @@ void RenderThreadImpl::OnProcessBackgrounded(bool backgrounded) { |
| if (backgrounded) { |
| renderer_scheduler_->OnRendererBackgrounded(); |
| + |
| + if (GetContentClient() |
| + ->renderer() |
| + ->AllowTimerSuspensionWhenProcessBackgrounded()) { |
| + base::TimeDelta suspend_timers_when_backgrounded_delay = |
| + base::TimeDelta::FromMilliseconds( |
| + kSuspendTimersWhenBackgroundedDelayMillis); |
| + GetRendererScheduler()->DefaultTaskRunner()->PostDelayedTask( |
| + FROM_HERE, purge_before_suspend_timers_closure_.callback(), |
| + suspend_timers_when_backgrounded_delay); |
| + } |
| } else { |
| renderer_scheduler_->OnRendererForegrounded(); |
| + |
| + purge_before_suspend_timers_closure_.Cancel(); |
| + purge_before_suspend_timers_closure_.Reset( |
| + base::Bind(&RenderThreadImpl::PurgeBeforeSuspendTimerQueue, |
| + base::Unretained(this))); |
| + suspend_timers_when_backgrounded_closure_.Cancel(); |
| + suspend_timers_when_backgrounded_closure_.Reset( |
| + base::Bind(&RenderThreadImpl::SuspendTimerQueueWhenBackgrounded, |
| + base::Unretained(this))); |
| + |
| // TODO(tasak): after enabling MemoryCoordinator, remove this Notify |
| // and follow MemoryCoordinator's request. |
| if (base::FeatureList::IsEnabled(features::kPurgeAndSuspend)) |
| @@ -1660,6 +1682,24 @@ void RenderThreadImpl::OnProcessBackgrounded(bool backgrounded) { |
| } |
| } |
| +void RenderThreadImpl::PurgeBeforeSuspendTimerQueue() { |
|
haraken
2017/02/02 08:53:12
PurgeBeforeSuspendTimerQueue => PurgeAndSuspendTim
tasak
2017/02/03 03:13:14
Done.
|
| + DCHECK(IsMainThread()); |
| + if (!RendererIsHidden()) |
| + return; |
| + base::MemoryCoordinatorClientRegistry::GetInstance()->Notify( |
| + base::MemoryState::SUSPENDED); |
|
haraken
2017/02/02 08:53:13
You don't need to do this in this CL but we want t
tasak
2017/02/03 03:13:14
Acknowledged.
|
| + GetRendererScheduler()->DefaultTaskRunner()->PostDelayedTask( |
| + FROM_HERE, suspend_timers_when_backgrounded_closure_.callback(), |
| + base::TimeDelta::FromSeconds(5)); |
|
haraken
2017/02/02 08:53:13
Add a comment and mention why this delay is needed
tasak
2017/02/03 03:13:14
Done.
|
| +} |
| + |
| +void RenderThreadImpl::SuspendTimerQueueWhenBackgrounded() { |
| + DCHECK(IsMainThread()); |
| + if (!RendererIsHidden()) |
| + return; |
| + renderer_scheduler_->SuspendRenderer(); |
| +} |
| + |
| void RenderThreadImpl::OnProcessPurgeAndSuspend() { |
| ChildThreadImpl::OnProcessPurgeAndSuspend(); |
| if (!RendererIsHidden()) |