| 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);
|
| + }
|
| }
|
| }
|
| }
|
|
|