Index: chrome/browser/sessions/tab_loader.cc |
diff --git a/chrome/browser/sessions/tab_loader.cc b/chrome/browser/sessions/tab_loader.cc |
index 172d5d213b4bfe7e057f240277854b18a8a3f4e7..ba5fb2149ecc87e3abe6c52c4f4c45eef836a945 100644 |
--- a/chrome/browser/sessions/tab_loader.cc |
+++ b/chrome/browser/sessions/tab_loader.cc |
@@ -7,6 +7,8 @@ |
#include <algorithm> |
#include <string> |
+#include "base/memory/memory_coordinator_client_registry.h" |
+#include "base/memory/memory_coordinator_proxy.h" |
#include "base/memory/memory_pressure_monitor.h" |
#include "base/memory/ptr_util.h" |
#include "base/metrics/histogram_macros.h" |
@@ -24,6 +26,7 @@ |
#include "content/public/browser/render_widget_host.h" |
#include "content/public/browser/render_widget_host_view.h" |
#include "content/public/browser/web_contents.h" |
+#include "content/public/common/content_features.h" |
using content::NavigationController; |
using content::RenderWidgetHost; |
@@ -88,12 +91,14 @@ TabLoader::TabLoader(base::TimeTicks restore_started) |
SessionRestoreStatsCollector::UmaStatsReportingDelegate>()); |
shared_tab_loader_ = this; |
this_retainer_ = this; |
+ base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this); |
} |
TabLoader::~TabLoader() { |
DCHECK(tabs_loading_.empty() && tabs_to_load_.empty()); |
DCHECK(shared_tab_loader_ == this); |
shared_tab_loader_ = nullptr; |
+ base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this); |
} |
void TabLoader::StartLoading(const std::vector<RestoredTab>& tabs) { |
@@ -131,12 +136,8 @@ void TabLoader::StartLoading(const std::vector<RestoredTab>& tabs) { |
// There is already at least one tab loading (the active tab). As such we |
// only have to start the timeout timer here. But, don't restore background |
// tabs if the system is under memory pressure. |
- base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level = |
- CurrentMemoryPressureLevel(); |
- |
- if (memory_pressure_level != |
- base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE) { |
- OnMemoryPressure(memory_pressure_level); |
+ if (ShouldStopLoadingTabs()) { |
+ StopLoadingTabs(); |
return; |
} |
@@ -159,11 +160,8 @@ void TabLoader::LoadNextTab() { |
// large delay between a memory pressure event and receiving a notification |
// of that event (in that case tab restore can trigger memory pressure but |
// will complete before the notification arrives). |
- base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level = |
- CurrentMemoryPressureLevel(); |
- if (memory_pressure_level != |
- base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE) { |
- OnMemoryPressure(memory_pressure_level); |
+ if (ShouldStopLoadingTabs()) { |
+ StopLoadingTabs(); |
return; |
} |
@@ -242,16 +240,40 @@ void TabLoader::HandleTabClosedOrLoaded(NavigationController* controller) { |
LoadNextTab(); |
} |
-base::MemoryPressureListener::MemoryPressureLevel |
- TabLoader::CurrentMemoryPressureLevel() { |
- if (base::MemoryPressureMonitor::Get()) |
- return base::MemoryPressureMonitor::Get()->GetCurrentPressureLevel(); |
- |
- return base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE; |
+bool TabLoader::ShouldStopLoadingTabs() const { |
+ if (base::FeatureList::IsEnabled(features::kMemoryCoordinator)) |
+ return base::MemoryCoordinatorProxy::GetInstance()->GetCurrentMemoryState() |
+ != base::MemoryState::NORMAL; |
+ if (base::MemoryPressureMonitor::Get()) { |
+ return base::MemoryPressureMonitor::Get()->GetCurrentPressureLevel() != |
+ base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE; |
+ } |
+ return false; |
} |
void TabLoader::OnMemoryPressure( |
base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) { |
+ if (ShouldStopLoadingTabs()) |
+ StopLoadingTabs(); |
+} |
+ |
+void TabLoader::OnMemoryStateChange(base::MemoryState state) { |
+ switch (state) { |
+ case base::MemoryState::NORMAL: |
+ break; |
+ case base::MemoryState::THROTTLED: |
+ StopLoadingTabs(); |
+ break; |
+ case base::MemoryState::SUSPENDED: |
+ // Note that SUSPENDED never occurs in the main browser process so far. |
+ // Fall through. |
+ case base::MemoryState::UNKNOWN: |
+ NOTREACHED(); |
+ break; |
+ } |
+} |
+ |
+void TabLoader::StopLoadingTabs() { |
// When receiving a resource pressure level warning, we stop pre-loading more |
// tabs since we are running in danger of loading more tabs by throwing out |
// old ones. |