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

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

Issue 2620743002: Don't throttle web views until they've been in the background for 10s (Closed)
Patch Set: Remove tricky to fix but redundant layout test Created 3 years, 11 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "platform/scheduler/renderer/web_view_scheduler_impl.h" 5 #include "platform/scheduler/renderer/web_view_scheduler_impl.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/strings/stringprintf.h" 8 #include "base/strings/stringprintf.h"
9 #include "platform/RuntimeEnabledFeatures.h" 9 #include "platform/RuntimeEnabledFeatures.h"
10 #include "platform/WebFrameScheduler.h" 10 #include "platform/WebFrameScheduler.h"
(...skipping 12 matching lines...) Expand all
23 // Given that we already align timers to 1Hz, do not report throttling if 23 // Given that we already align timers to 1Hz, do not report throttling if
24 // it is under 3s. 24 // it is under 3s.
25 constexpr base::TimeDelta kMinimalBackgroundThrottlingDurationToReport = 25 constexpr base::TimeDelta kMinimalBackgroundThrottlingDurationToReport =
26 base::TimeDelta::FromSeconds(3); 26 base::TimeDelta::FromSeconds(3);
27 constexpr base::TimeDelta kDefaultMaxBackgroundBudgetLevel = 27 constexpr base::TimeDelta kDefaultMaxBackgroundBudgetLevel =
28 base::TimeDelta::FromSeconds(3); 28 base::TimeDelta::FromSeconds(3);
29 constexpr base::TimeDelta kDefaultMaxBackgroundThrottlingDelay = 29 constexpr base::TimeDelta kDefaultMaxBackgroundThrottlingDelay =
30 base::TimeDelta::FromMinutes(1); 30 base::TimeDelta::FromMinutes(1);
31 constexpr base::TimeDelta kDefaultInitialBackgroundBudget = 31 constexpr base::TimeDelta kDefaultInitialBackgroundBudget =
32 base::TimeDelta::FromSeconds(1); 32 base::TimeDelta::FromSeconds(1);
33 constexpr base::TimeDelta kBackgroundBudgetThrottlingGracePeriod = 33 constexpr base::TimeDelta kBackgroundThrottlingGracePeriod =
34 base::TimeDelta::FromSeconds(10); 34 base::TimeDelta::FromSeconds(10);
35 35
36 // Values coming from WebViewSchedulerSettings are interpreted as follows: 36 // Values coming from WebViewSchedulerSettings are interpreted as follows:
37 // -1 is "not set". Scheduler should use a reasonable default. 37 // -1 is "not set". Scheduler should use a reasonable default.
38 // 0 is "none". base::nullopt will be used if value is optional. 38 // 0 is "none". base::nullopt will be used if value is optional.
39 // other values are left without changes. 39 // other values are left without changes.
40 40
41 double GetBackgroundBudgetRecoveryRate( 41 double GetBackgroundBudgetRecoveryRate(
42 WebViewScheduler::WebViewSchedulerSettings* settings) { 42 WebViewScheduler::WebViewSchedulerSettings* settings) {
43 if (!settings) 43 if (!settings)
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 disable_background_timer_throttling_(disable_background_timer_throttling), 104 disable_background_timer_throttling_(disable_background_timer_throttling),
105 allow_virtual_time_to_advance_(true), 105 allow_virtual_time_to_advance_(true),
106 have_seen_loading_task_(false), 106 have_seen_loading_task_(false),
107 virtual_time_(false), 107 virtual_time_(false),
108 is_audio_playing_(false), 108 is_audio_playing_(false),
109 reported_background_throttling_since_navigation_(false), 109 reported_background_throttling_since_navigation_(false),
110 background_time_budget_pool_(nullptr), 110 background_time_budget_pool_(nullptr),
111 settings_(settings) { 111 settings_(settings) {
112 renderer_scheduler->AddWebViewScheduler(this); 112 renderer_scheduler->AddWebViewScheduler(this);
113 113
114 delayed_background_budget_throttling_enabler_.Reset( 114 delayed_background_throttling_enabler_.Reset(
115 base::Bind(&WebViewSchedulerImpl::EnableBackgroundBudgetThrottling, 115 base::Bind(&WebViewSchedulerImpl::EnableBackgroundThrottling,
116 base::Unretained(this))); 116 base::Unretained(this)));
117 } 117 }
118 118
119 WebViewSchedulerImpl::~WebViewSchedulerImpl() { 119 WebViewSchedulerImpl::~WebViewSchedulerImpl() {
120 // TODO(alexclarke): Find out why we can't rely on the web view outliving the 120 // TODO(alexclarke): Find out why we can't rely on the web view outliving the
121 // frame. 121 // frame.
122 for (WebFrameSchedulerImpl* frame_scheduler : frame_schedulers_) { 122 for (WebFrameSchedulerImpl* frame_scheduler : frame_schedulers_) {
123 frame_scheduler->DetachFromWebViewScheduler(); 123 frame_scheduler->DetachFromWebViewScheduler();
124 } 124 }
125 renderer_scheduler_->RemoveWebViewScheduler(this); 125 renderer_scheduler_->RemoveWebViewScheduler(this);
126 126
127 if (background_time_budget_pool_) 127 if (background_time_budget_pool_)
128 background_time_budget_pool_->Close(); 128 background_time_budget_pool_->Close();
129 } 129 }
130 130
131 void WebViewSchedulerImpl::setPageVisible(bool page_visible) { 131 void WebViewSchedulerImpl::setPageVisible(bool page_visible) {
132 if (disable_background_timer_throttling_ || page_visible_ == page_visible) 132 if (disable_background_timer_throttling_ || page_visible_ == page_visible)
133 return; 133 return;
134 134
135 page_visible_ = page_visible; 135 page_visible_ = page_visible;
136 136
137 for (WebFrameSchedulerImpl* frame_scheduler : frame_schedulers_) { 137 UpdateBackgroundThrottlingState();
138 frame_scheduler->setPageVisible(page_visible_);
139 }
140
141 UpdateBackgroundBudgetThrottlingState();
142 } 138 }
143 139
144 std::unique_ptr<WebFrameSchedulerImpl> 140 std::unique_ptr<WebFrameSchedulerImpl>
145 WebViewSchedulerImpl::createWebFrameSchedulerImpl( 141 WebViewSchedulerImpl::createWebFrameSchedulerImpl(
146 base::trace_event::BlameContext* blame_context) { 142 base::trace_event::BlameContext* blame_context) {
147 MaybeInitializeBackgroundTimeBudgetPool(); 143 MaybeInitializeBackgroundTimeBudgetPool();
148 std::unique_ptr<WebFrameSchedulerImpl> frame_scheduler( 144 std::unique_ptr<WebFrameSchedulerImpl> frame_scheduler(
149 new WebFrameSchedulerImpl(renderer_scheduler_, this, blame_context)); 145 new WebFrameSchedulerImpl(renderer_scheduler_, this, blame_context));
150 frame_scheduler->setPageVisible(page_visible_); 146 frame_scheduler->setPageVisible(page_visible_);
151 frame_schedulers_.insert(frame_scheduler.get()); 147 frame_schedulers_.insert(frame_scheduler.get());
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 return; 291 return;
296 292
297 if (!RuntimeEnabledFeatures::expensiveBackgroundTimerThrottlingEnabled()) 293 if (!RuntimeEnabledFeatures::expensiveBackgroundTimerThrottlingEnabled())
298 return; 294 return;
299 295
300 background_time_budget_pool_ = 296 background_time_budget_pool_ =
301 renderer_scheduler_->task_queue_throttler()->CreateTimeBudgetPool( 297 renderer_scheduler_->task_queue_throttler()->CreateTimeBudgetPool(
302 "background", GetMaxBudgetLevel(settings_), 298 "background", GetMaxBudgetLevel(settings_),
303 GetMaxThrottlingDelay(settings_)); 299 GetMaxThrottlingDelay(settings_));
304 300
305 UpdateBackgroundBudgetThrottlingState(); 301 UpdateBackgroundThrottlingState();
306 302
307 LazyNow lazy_now(renderer_scheduler_->tick_clock()); 303 LazyNow lazy_now(renderer_scheduler_->tick_clock());
308 304
309 background_time_budget_pool_->SetTimeBudgetRecoveryRate( 305 background_time_budget_pool_->SetTimeBudgetRecoveryRate(
310 lazy_now.Now(), GetBackgroundBudgetRecoveryRate(settings_)); 306 lazy_now.Now(), GetBackgroundBudgetRecoveryRate(settings_));
311 307
312 background_time_budget_pool_->GrantAdditionalBudget( 308 background_time_budget_pool_->GrantAdditionalBudget(
313 lazy_now.Now(), GetInitialBudget(settings_)); 309 lazy_now.Now(), GetInitialBudget(settings_));
314 } 310 }
315 311
(...skipping 10 matching lines...) Expand all
326 "Timer tasks have taken too much time while the page was in the " 322 "Timer tasks have taken too much time while the page was in the "
327 "background. " 323 "background. "
328 "As a result, they have been deferred for %.3f seconds. " 324 "As a result, they have been deferred for %.3f seconds. "
329 "See https://www.chromestatus.com/feature/6172836527865856 " 325 "See https://www.chromestatus.com/feature/6172836527865856 "
330 "for more details", 326 "for more details",
331 throttling_duration.InSecondsF()); 327 throttling_duration.InSecondsF());
332 328
333 intervention_reporter_->ReportIntervention(WebString::fromUTF8(message)); 329 intervention_reporter_->ReportIntervention(WebString::fromUTF8(message));
334 } 330 }
335 331
336 void WebViewSchedulerImpl::EnableBackgroundBudgetThrottling() { 332 void WebViewSchedulerImpl::EnableBackgroundThrottling() {
337 if (!background_time_budget_pool_) 333 for (WebFrameSchedulerImpl* frame_scheduler : frame_schedulers_) {
338 return; 334 frame_scheduler->setPageVisible(false);
Sami 2017/01/10 14:44:22 Should we rename |setPageVisible| to |setThrottlin
alex clarke (OOO till 29th) 2017/01/11 10:54:47 You're probably right. After this patch the WebFr
339 335 }
340 LazyNow lazy_now(renderer_scheduler_->tick_clock()); 336 if (background_time_budget_pool_) {
341 337 LazyNow lazy_now(renderer_scheduler_->tick_clock());
342 background_time_budget_pool_->EnableThrottling(&lazy_now); 338 background_time_budget_pool_->EnableThrottling(&lazy_now);
339 }
343 } 340 }
344 341
345 void WebViewSchedulerImpl::UpdateBackgroundBudgetThrottlingState() { 342 void WebViewSchedulerImpl::UpdateBackgroundThrottlingState() {
346 if (!background_time_budget_pool_) 343 delayed_background_throttling_enabler_.Cancel();
347 return;
348
349 delayed_background_budget_throttling_enabler_.Cancel();
350
351 LazyNow lazy_now(renderer_scheduler_->tick_clock());
352 344
353 if (page_visible_) { 345 if (page_visible_) {
354 background_time_budget_pool_->DisableThrottling(&lazy_now); 346 for (WebFrameSchedulerImpl* frame_scheduler : frame_schedulers_) {
347 frame_scheduler->setPageVisible(true);
348 }
349 if (background_time_budget_pool_) {
350 LazyNow lazy_now(renderer_scheduler_->tick_clock());
351 background_time_budget_pool_->DisableThrottling(&lazy_now);
352 }
355 } else { 353 } else {
356 // TODO(altimin): Consider moving this logic into PumpThrottledTasks. 354 // TODO(altimin): Consider moving this logic into PumpThrottledTasks.
357 renderer_scheduler_->ControlTaskRunner()->PostDelayedTask( 355 renderer_scheduler_->ControlTaskRunner()->PostDelayedTask(
358 FROM_HERE, delayed_background_budget_throttling_enabler_.callback(), 356 FROM_HERE, delayed_background_throttling_enabler_.callback(),
359 kBackgroundBudgetThrottlingGracePeriod); 357 kBackgroundThrottlingGracePeriod);
360 } 358 }
361 } 359 }
362 360
363 // static 361 // static
364 const char* WebViewSchedulerImpl::VirtualTimePolicyToString( 362 const char* WebViewSchedulerImpl::VirtualTimePolicyToString(
365 VirtualTimePolicy virtual_time_policy) { 363 VirtualTimePolicy virtual_time_policy) {
366 switch (virtual_time_policy) { 364 switch (virtual_time_policy) {
367 case VirtualTimePolicy::ADVANCE: 365 case VirtualTimePolicy::ADVANCE:
368 return "ADVANCE"; 366 return "ADVANCE";
369 case VirtualTimePolicy::PAUSE: 367 case VirtualTimePolicy::PAUSE:
370 return "PAUSE"; 368 return "PAUSE";
371 case VirtualTimePolicy::DETERMINISTIC_LOADING: 369 case VirtualTimePolicy::DETERMINISTIC_LOADING:
372 return "DETERMINISTIC_LOADING"; 370 return "DETERMINISTIC_LOADING";
373 default: 371 default:
374 NOTREACHED(); 372 NOTREACHED();
375 return nullptr; 373 return nullptr;
376 } 374 }
377 } 375 }
378 376
379 } // namespace scheduler 377 } // namespace scheduler
380 } // namespace blink 378 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698