Index: content/browser/memory/memory_coordinator.cc |
diff --git a/content/browser/memory/memory_coordinator.cc b/content/browser/memory/memory_coordinator.cc |
index 5bf29c78e1d6afbb11fe113de6507c3193f24188..b691322002007921695018b1e3ae16c69fec041d 100644 |
--- a/content/browser/memory/memory_coordinator.cc |
+++ b/content/browser/memory/memory_coordinator.cc |
@@ -88,10 +88,7 @@ bool MemoryCoordinator::SetChildMemoryState(int render_process_id, |
if (!iter->second.handle->child().is_bound()) |
return false; |
- // We don't suspend foreground renderers. Throttle them instead. |
- if (memory_state == mojom::MemoryState::SUSPENDED && |
- iter->second.is_visible) |
- memory_state = mojom::MemoryState::THROTTLED; |
+ memory_state = OverrideGlobalState(memory_state, iter->second); |
// A nop doesn't need to be sent, but is considered successful. |
if (iter->second.memory_state == memory_state) |
@@ -173,6 +170,23 @@ bool MemoryCoordinator::CanSuspendRenderer(int render_process_id) { |
return delegate_->CanSuspendBackgroundedRenderer(render_process_id); |
} |
+mojom::MemoryState MemoryCoordinator::OverrideGlobalState( |
+ mojom::MemoryState memory_state, |
+ const ChildInfo& child) { |
+ // We don't suspend foreground renderers. Throttle them instead. |
+ if (child.is_visible && memory_state == mojom::MemoryState::SUSPENDED) |
+ return mojom::MemoryState::THROTTLED; |
+#if defined(OS_ANDROID) |
+ // On Android, we throttle background renderers immediately. |
+ // TODO(bashi): Create a specialized class of MemoryCoordinator for Android |
+ // and move this ifdef to the class. |
+ if (!child.is_visible && memory_state == mojom::MemoryState::NORMAL) |
+ return mojom::MemoryState::THROTTLED; |
+ // TODO(bashi): Suspend background renderers after a certain period of time. |
+#endif // defined(OS_ANDROID) |
+ return memory_state; |
+} |
+ |
void MemoryCoordinator::SetDelegateForTesting( |
std::unique_ptr<MemoryCoordinatorDelegate> delegate) { |
CHECK(!delegate_); |