Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1121)

Unified Diff: third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.cc

Issue 2860263002: NOT FOR COMMIT: Move background pausing to the WebView level
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.cc
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.cc
index 500c89a5ab96c5d9bc8bfdef2f391d834e7d20f3..6898a52d8409e9ba950c0fc5117c28f5f48ad00e 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.cc
@@ -5,7 +5,10 @@
#include "platform/scheduler/renderer/web_view_scheduler_impl.h"
#include "base/logging.h"
+#include "base/memory/memory_coordinator_client_registry.h"
#include "base/strings/stringprintf.h"
+// TODO(ojan): This is disallowed by build rules?
+#include "chrome/common/pause_tabs_field_trial.h"
#include "platform/RuntimeEnabledFeatures.h"
#include "platform/WebFrameScheduler.h"
#include "platform/scheduler/base/virtual_time_domain.h"
@@ -14,6 +17,7 @@
#include "platform/scheduler/renderer/budget_pool.h"
#include "platform/scheduler/renderer/renderer_scheduler_impl.h"
#include "platform/scheduler/renderer/web_frame_scheduler_impl.h"
+// #include "public/platform/Platform.h"
namespace blink {
namespace scheduler {
@@ -31,8 +35,13 @@ constexpr base::TimeDelta kDefaultMaxBackgroundThrottlingDelay =
base::TimeDelta::FromMinutes(1);
constexpr base::TimeDelta kDefaultInitialBackgroundBudget =
base::TimeDelta::FromSeconds(1);
+// TODO(ojan): Make this 10 seconds. This is just for easy testing.
constexpr base::TimeDelta kBackgroundThrottlingGracePeriod =
- base::TimeDelta::FromSeconds(10);
+ base::TimeDelta::FromSeconds(100);
+// TODO(ojan): Make this 5 minutes. This is just for testing.
+constexpr base::TimeDelta kBackgroundPausingDelay =
+ base::TimeDelta::FromSeconds(3);
+
// Values coming from WebViewSchedulerSettings are interpreted as follows:
// -1 is "not set". Scheduler should use a reasonable default.
@@ -118,6 +127,10 @@ WebViewSchedulerImpl::WebViewSchedulerImpl(
delayed_background_throttling_enabler_.Reset(
base::Bind(&WebViewSchedulerImpl::EnableBackgroundThrottling,
base::Unretained(this)));
+
+ background_pauser_.Reset(
+ base::Bind(&WebViewSchedulerImpl::EnableBackgroundSuspension,
+ base::Unretained(this)));
}
WebViewSchedulerImpl::~WebViewSchedulerImpl() {
@@ -395,13 +408,37 @@ void WebViewSchedulerImpl::EnableBackgroundThrottling() {
UpdateBackgroundBudgetPoolThrottlingState();
}
+void WebViewSchedulerImpl::EnableBackgroundSuspension() {
+ for (WebFrameSchedulerImpl* frame_scheduler : frame_schedulers_) {
+ frame_scheduler->SetSuspended(true);
+ }
+ UpdateBackgroundBudgetPoolThrottlingState();
+
+ // TODO(tasak|bashi): We should use ChildMemoryCoordinator here, but
+ // ChildMemoryCoordinator isn't always available as it's only initialized
+ // when kMemoryCoordinatorV0 is enabled.
+ // Use ChildMemoryCoordinator when memory coordinator is always enabled.
+ base::MemoryCoordinatorClientRegistry::GetInstance()->PurgeMemory();
+}
+
+bool WebViewSchedulerImpl::ShouldSuspendWhenBackgrounded() {
+#if defined(OS_ANDROID)
+ return true;
+#else
+ // TODO(ojan): Hook this up to site engagement.
+ return base::FeatureList::IsEnabled(pausetabs::kFeature);
+#endif
+}
+
void WebViewSchedulerImpl::UpdateBackgroundThrottlingState() {
delayed_background_throttling_enabler_.Cancel();
+ background_pauser_.Cancel();
if (page_visible_) {
should_throttle_frames_ = false;
for (WebFrameSchedulerImpl* frame_scheduler : frame_schedulers_) {
frame_scheduler->SetPageThrottled(false);
+ frame_scheduler->SetSuspended(false);
}
UpdateBackgroundBudgetPoolThrottlingState();
} else {
@@ -413,6 +450,12 @@ void WebViewSchedulerImpl::UpdateBackgroundThrottlingState() {
renderer_scheduler_->ControlTaskQueue()->PostDelayedTask(
FROM_HERE, delayed_background_throttling_enabler_.GetCallback(),
kBackgroundThrottlingGracePeriod);
+
+ if (ShouldSuspendWhenBackgrounded()) {
+ renderer_scheduler_->ControlTaskQueue()->PostDelayedTask(
+ FROM_HERE, background_pauser_.GetCallback(),
+ kBackgroundPausingDelay);
+ }
}
}
}

Powered by Google App Engine
This is Rietveld 408576698