Chromium Code Reviews| 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 f7ba68c71c706abc2f5cb8692294400ea498420e..85755dfaa3e8d2d9f3ce532b8e5b1c9bc7516638 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 |
| @@ -19,11 +19,55 @@ namespace scheduler { |
| namespace { |
| const double kBackgroundBudgetAsCPUFraction = .01; |
| +constexpr base::TimeDelta kDefaultMaxBackgroundBudgetLevel = |
| + base::TimeDelta::FromSeconds(3); |
| +constexpr base::TimeDelta kDefaultMaxBackgroundThrottlingDelay = |
| + base::TimeDelta::FromMinutes(1); |
| + |
| +// Values coming from WebSchedulerSettings are interpreted as follows: |
|
Sami
2016/11/07 16:33:41
WebViewSchedulerSettings
altimin
2016/11/07 17:01:33
Done.
|
| +// -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), |
| @@ -36,22 +80,9 @@ WebViewSchedulerImpl::WebViewSchedulerImpl( |
| have_seen_loading_task_(false), |
| virtual_time_(false), |
| is_audio_playing_(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() { |
| @@ -198,5 +229,35 @@ 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_)); |
| +} |
| + |
| } // namespace scheduler |
| } // namespace blink |