Chromium Code Reviews| Index: chrome/browser/memory/tab_manager.cc |
| diff --git a/chrome/browser/memory/tab_manager.cc b/chrome/browser/memory/tab_manager.cc |
| index 582b2e667099f6fa0085f6721c4b9c69a37709c8..7160d4bc180954ef11ad8ff367c86be79c48655a 100644 |
| --- a/chrome/browser/memory/tab_manager.cc |
| +++ b/chrome/browser/memory/tab_manager.cc |
| @@ -84,6 +84,16 @@ const int kRecentTabDiscardIntervalSeconds = 60; |
| // machine was suspended and correct the timing statistics. |
| const int kSuspendThresholdSeconds = kAdjustmentIntervalSeconds * 4; |
| +// If a backgrounded renderer is kept backgrounded during this time after |
|
Sami
2016/10/06 13:10:09
s/during/for/
/after suspended/after being suspend
tasak
2016/10/07 05:31:26
Done.
|
| +// suspended, resume the renderer to avoid breaking web. |
| +constexpr base::TimeDelta kSuspendResumedRendererTime = |
| + base::TimeDelta::FromSeconds(120); |
| + |
| +// After resuming and running a backgrounded renderer for this period, |
| +// the renderer is purged and suspended again. |
| +constexpr base::TimeDelta kResumeSuspendedRendererTime = |
| + base::TimeDelta::FromSeconds(10); |
| + |
| // The time during which a tab is protected from discarding after it stops being |
| // audible. |
| const int kAudioProtectionTimeSeconds = 60; |
| @@ -683,8 +693,9 @@ void TabManager::PurgeAndSuspendBackgroundedTabs() { |
| } |
| if (purge_and_suspend_time <= 0) |
| return; |
| + base::TimeTicks current_time = NowTicks(); |
| auto purge_and_suspend_time_threshold = |
| - NowTicks() - base::TimeDelta::FromSeconds(purge_and_suspend_time); |
| + current_time - base::TimeDelta::FromSeconds(purge_and_suspend_time); |
| auto tab_stats = GetUnsortedTabStats(); |
| for (auto& tab : tab_stats) { |
| if (!tab.render_process_host->IsProcessBackgrounded()) |
| @@ -695,7 +706,25 @@ void TabManager::PurgeAndSuspendBackgroundedTabs() { |
| // timers if we want necessary and sufficient signals. |
| if (tab.last_active > purge_and_suspend_time_threshold) |
| continue; |
| - tab.render_process_host->PurgeAndSuspend(); |
| + |
| + auto last_purged_and_suspended_time = |
| + tab.render_process_host->GetLastPurgedAndSuspendedTime(); |
| + auto last_resumed_time = |
| + tab.render_process_host->GetLastResumedInBackgroundTime(); |
| + |
| + if (last_purged_and_suspended_time < tab.last_active || |
| + (last_resumed_time > last_purged_and_suspended_time && |
| + last_purged_and_suspended_time > tab.last_active && |
| + ((current_time - last_resumed_time) > kSuspendResumedRendererTime))) { |
| + tab.render_process_host->PurgeAndSuspend(); |
| + if (!task_runner_.get()) |
| + task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
| + } else { |
| + auto delta = current_time - last_purged_and_suspended_time; |
| + if (last_resumed_time < last_purged_and_suspended_time && |
| + delta > kResumeSuspendedRendererTime) |
| + tab.render_process_host->Resume(); |
| + } |
| } |
| } |