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

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

Issue 2471153002: [scheduler] Use Finch to control background throttling. (Closed)
Patch Set: Fix test and address comments Created 4 years, 1 month 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 d2403b3bc5b226e736c948f5eecf4fe69b778ace..bbb5b6aceccf291dfd5e84304ec5267fa32ca154 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
@@ -24,11 +24,55 @@ const double kBackgroundBudgetAsCPUFraction = .01;
// it is under 3s.
constexpr base::TimeDelta kMinimalBackgroundThrottlingDurationToReport =
base::TimeDelta::FromSeconds(3);
+constexpr base::TimeDelta kDefaultMaxBackgroundBudgetLevel =
+ base::TimeDelta::FromSeconds(3);
+constexpr base::TimeDelta kDefaultMaxBackgroundThrottlingDelay =
+ base::TimeDelta::FromMinutes(1);
+
+// Values coming from WebViewSchedulerSettings are interpreted as follows:
+// -1 is "not set". Scheduler should use a reasonable default.
+// 0 is "none". base::nullopt will be used if value is optional.
+// other values are left without changes.
+
+double GetBackgroundBudget(
+ WebViewScheduler::WebViewSchedulerSettings* settings) {
+ if (!settings)
+ return kBackgroundBudgetAsCPUFraction;
+ double settings_budget = settings->expensiveBackgroundThrottlingCPUBudget();
+ if (settings_budget == -1.0)
+ return kBackgroundBudgetAsCPUFraction;
+ return settings_budget;
+}
+
+base::Optional<base::TimeDelta> GetMaxBudgetLevel(
+ WebViewScheduler::WebViewSchedulerSettings* settings) {
+ if (!settings)
+ return base::nullopt;
+ double max_budget_level = settings->expensiveBackgroundThrottlingMaxBudget();
+ if (max_budget_level == -1.0)
+ return kDefaultMaxBackgroundBudgetLevel;
+ if (max_budget_level == 0.0)
+ return base::nullopt;
+ return base::TimeDelta::FromSecondsD(max_budget_level);
+}
+
+base::Optional<base::TimeDelta> GetMaxThrottlingDelay(
+ WebViewScheduler::WebViewSchedulerSettings* settings) {
+ if (!settings)
+ return base::nullopt;
+ double max_delay = settings->expensiveBackgroundThrottlingMaxDelay();
+ if (max_delay == -1.0)
+ return kDefaultMaxBackgroundThrottlingDelay;
+ if (max_delay == 0.0)
+ return base::nullopt;
+ return base::TimeDelta::FromSecondsD(max_delay);
+}
} // namespace
WebViewSchedulerImpl::WebViewSchedulerImpl(
WebScheduler::InterventionReporter* intervention_reporter,
+ WebViewScheduler::WebViewSchedulerSettings* settings,
RendererSchedulerImpl* renderer_scheduler,
bool disable_background_timer_throttling)
: intervention_reporter_(intervention_reporter),
@@ -42,22 +86,9 @@ WebViewSchedulerImpl::WebViewSchedulerImpl(
virtual_time_(false),
is_audio_playing_(false),
reported_background_throttling_since_navigation_(false),
- background_time_budget_pool_(nullptr) {
+ background_time_budget_pool_(nullptr),
+ settings_(settings) {
renderer_scheduler->AddWebViewScheduler(this);
-
- if (RuntimeEnabledFeatures::expensiveBackgroundTimerThrottlingEnabled()) {
- background_time_budget_pool_ =
- renderer_scheduler_->task_queue_throttler()->CreateTimeBudgetPool(
- "background");
-
- LazyNow lazy_now(renderer_scheduler_->tick_clock());
-
- // Disable throttling because page is visible by default.
- background_time_budget_pool_->DisableThrottling(&lazy_now);
-
- background_time_budget_pool_->SetTimeBudget(lazy_now.Now(),
- kBackgroundBudgetAsCPUFraction);
- }
}
WebViewSchedulerImpl::~WebViewSchedulerImpl() {
@@ -208,6 +239,36 @@ bool WebViewSchedulerImpl::IsAudioPlaying() const {
return is_audio_playing_;
}
+TaskQueueThrottler::TimeBudgetPool*
+WebViewSchedulerImpl::BackgroundTimeBudgetPool() {
+ MaybeInitializeBackgroundTimeBudgetPool();
+ return background_time_budget_pool_;
+}
+
+void WebViewSchedulerImpl::MaybeInitializeBackgroundTimeBudgetPool() {
+ if (background_time_budget_pool_)
+ return;
+
+ if (!RuntimeEnabledFeatures::expensiveBackgroundTimerThrottlingEnabled())
+ return;
+
+ background_time_budget_pool_ =
+ renderer_scheduler_->task_queue_throttler()->CreateTimeBudgetPool(
+ "background", GetMaxBudgetLevel(settings_),
+ GetMaxThrottlingDelay(settings_));
+
+ LazyNow lazy_now(renderer_scheduler_->tick_clock());
+
+ if (page_visible_) {
+ background_time_budget_pool_->DisableThrottling(&lazy_now);
+ } else {
+ background_time_budget_pool_->EnableThrottling(&lazy_now);
+ }
+
+ background_time_budget_pool_->SetTimeBudget(lazy_now.Now(),
+ GetBackgroundBudget(settings_));
+}
+
void WebViewSchedulerImpl::OnThrottlingReported(
base::TimeDelta throttling_duration) {
if (throttling_duration < kMinimalBackgroundThrottlingDurationToReport)

Powered by Google App Engine
This is Rietveld 408576698