Chromium Code Reviews| Index: components/scheduler/renderer/web_view_scheduler_impl.cc |
| diff --git a/components/scheduler/renderer/web_view_scheduler_impl.cc b/components/scheduler/renderer/web_view_scheduler_impl.cc |
| index 28bc2163e10c4aa418a4cb0f6057bc3a76afc208..1db944b0e0f01d680cf40c0dd3c9bc5b23ab4f29 100644 |
| --- a/components/scheduler/renderer/web_view_scheduler_impl.cc |
| +++ b/components/scheduler/renderer/web_view_scheduler_impl.cc |
| @@ -5,6 +5,7 @@ |
| #include "components/scheduler/renderer/web_view_scheduler_impl.h" |
| #include "base/logging.h" |
| +#include "components/scheduler/renderer/renderer_scheduler_impl.h" |
| #include "components/scheduler/renderer/web_frame_scheduler_impl.h" |
| #include "third_party/WebKit/public/platform/WebFrameScheduler.h" |
| @@ -12,10 +13,16 @@ namespace scheduler { |
| WebViewSchedulerImpl::WebViewSchedulerImpl( |
| blink::WebView* web_view, |
| - RendererSchedulerImpl* renderer_scheduler) |
| + RendererSchedulerImpl* renderer_scheduler, |
| + const char* tracing_category) |
| : web_view_(web_view), |
| renderer_scheduler_(renderer_scheduler), |
| - background_(false) {} |
| + tracing_category_(tracing_category), |
| + background_(false), |
| + weak_factory_(this) { |
| + pump_throttled_tasks_closure_.Reset(base::Bind( |
|
Sami
2015/11/17 10:12:21
Doing this here is fine for now, but I wonder how
alex clarke (OOO till 29th)
2015/11/23 17:13:45
Yes we probably will add a helper.
|
| + &WebViewSchedulerImpl::PumpThrottledTasks, weak_factory_.GetWeakPtr())); |
| +} |
| WebViewSchedulerImpl::~WebViewSchedulerImpl() { |
| // TODO(alexclarke): Find out why we can't rely on the web view outliving the |
| @@ -26,14 +33,27 @@ WebViewSchedulerImpl::~WebViewSchedulerImpl() { |
| } |
| void WebViewSchedulerImpl::setPageInBackground(bool background) { |
| + if (background_ == background) |
| + return; |
| + |
| background_ = background; |
| - // TODO(alexclarke): Do something with this flag. |
| + |
| + for (WebFrameSchedulerImpl* frame_scheduler : frame_schedulers_) { |
| + frame_scheduler->SetPageInBackground(background); |
| + } |
| + |
| + if (background) { |
| + SchedulePumpThrottledTasks(); |
| + } else { |
| + pump_throttled_tasks_closure_.Cancel(); |
| + } |
| } |
| blink::WebPassOwnPtr<blink::WebFrameScheduler> |
| WebViewSchedulerImpl::createFrameScheduler() { |
| scoped_ptr<WebFrameSchedulerImpl> frame_scheduler( |
| new WebFrameSchedulerImpl(renderer_scheduler_, this)); |
| + frame_scheduler->SetPageInBackground(background_); |
| frame_schedulers_.insert(frame_scheduler.get()); |
| return blink::adoptWebPtr(frame_scheduler.release()); |
| } |
| @@ -43,4 +63,27 @@ void WebViewSchedulerImpl::Unregister(WebFrameSchedulerImpl* frame_scheduler) { |
| frame_schedulers_.erase(frame_scheduler); |
| } |
| +void WebViewSchedulerImpl::PumpThrottledTasks() { |
| + TRACE_EVENT0(tracing_category_, "WebViewSchedulerImpl::PumpThrottledTasks"); |
| + DCHECK(background_); |
| + for (WebFrameSchedulerImpl* frame_scheduler : frame_schedulers_) { |
| + frame_scheduler->PumpBackgroundTasks(); |
| + } |
| + SchedulePumpThrottledTasks(); |
|
Sami
2015/11/17 10:12:21
Will this ever stop ticking if there's no work to
alex clarke (OOO till 29th)
2015/11/23 17:13:45
I've changed it so it does.
|
| +} |
| + |
| +/* static */ |
| +double WebViewSchedulerImpl::DelayToNextRunTimeInSeconds( |
| + double now_in_seconds) { |
| + return ceilf(now_in_seconds + 0.2) - now_in_seconds; |
|
Sami
2015/11/17 10:12:21
This probably deserves a comment and a named const
alex clarke (OOO till 29th)
2015/11/23 17:13:45
Yes and this also ticks once per second too.
|
| +} |
| + |
| +void WebViewSchedulerImpl::SchedulePumpThrottledTasks() { |
| + pump_throttled_tasks_closure_.Cancel(); |
| + renderer_scheduler_->ControlTaskRunner()->PostDelayedTask( |
| + FROM_HERE, pump_throttled_tasks_closure_.callback(), |
| + base::TimeDelta::FromSecondsD(DelayToNextRunTimeInSeconds( |
|
Sami
2015/11/17 10:12:21
Is there a way to do this calculation only using T
alex clarke (OOO till 29th)
2015/11/23 17:13:45
Done.
|
| + renderer_scheduler_->MonotonicallyIncreasingTimeSeconds()))); |
| +} |
| + |
| } // namespace scheduler |