| Index: components/scheduler/renderer/web_frame_scheduler_impl.cc
|
| diff --git a/components/scheduler/renderer/web_frame_scheduler_impl.cc b/components/scheduler/renderer/web_frame_scheduler_impl.cc
|
| index 15e4a7de89b1d0978b2909ce472ad7c1a10a98aa..786703d6e2f41e0b38892bf43a087273d158f7c9 100644
|
| --- a/components/scheduler/renderer/web_frame_scheduler_impl.cc
|
| +++ b/components/scheduler/renderer/web_frame_scheduler_impl.cc
|
| @@ -4,6 +4,8 @@
|
|
|
| #include "components/scheduler/renderer/web_frame_scheduler_impl.h"
|
|
|
| +#include "components/scheduler/base/real_time_domain.h"
|
| +#include "components/scheduler/base/virtual_time_domain.h"
|
| #include "components/scheduler/child/web_task_runner_impl.h"
|
| #include "components/scheduler/renderer/renderer_scheduler_impl.h"
|
| #include "components/scheduler/renderer/web_view_scheduler_impl.h"
|
| @@ -16,7 +18,8 @@ WebFrameSchedulerImpl::WebFrameSchedulerImpl(
|
| WebViewSchedulerImpl* parent_web_view_scheduler)
|
| : renderer_scheduler_(renderer_scheduler),
|
| parent_web_view_scheduler_(parent_web_view_scheduler),
|
| - visible_(true) {}
|
| + visible_(true),
|
| + page_in_background_(false) {}
|
|
|
| WebFrameSchedulerImpl::~WebFrameSchedulerImpl() {
|
| if (loading_task_queue_.get())
|
| @@ -27,6 +30,8 @@ WebFrameSchedulerImpl::~WebFrameSchedulerImpl() {
|
|
|
| if (parent_web_view_scheduler_)
|
| parent_web_view_scheduler_->Unregister(this);
|
| +
|
| + renderer_scheduler_->throttling_helper()->Unregister(this);
|
| }
|
|
|
| void WebFrameSchedulerImpl::DetachFromWebViewScheduler() {
|
| @@ -51,6 +56,7 @@ blink::WebTaskRunner* WebFrameSchedulerImpl::timerTaskRunner() {
|
| if (!timer_web_task_runner_) {
|
| timer_task_queue_ =
|
| renderer_scheduler_->NewTimerTaskRunner("frame_timer_tq");
|
| + ApplyPolicyToTimerQueue();
|
| timer_web_task_runner_.reset(new WebTaskRunnerImpl(timer_task_queue_));
|
| }
|
| return timer_web_task_runner_.get();
|
| @@ -63,4 +69,46 @@ void WebFrameSchedulerImpl::setFrameOrigin(
|
| // TODO(skyostil): Associate the task queues with this origin.
|
| }
|
|
|
| +void WebFrameSchedulerImpl::SetPageInBackground(bool page_in_background) {
|
| + if (page_in_background_ == page_in_background)
|
| + return;
|
| +
|
| + page_in_background_ = page_in_background;
|
| +
|
| + if (!timer_task_queue_)
|
| + return;
|
| +
|
| + ApplyPolicyToTimerQueue();
|
| +}
|
| +
|
| +void WebFrameSchedulerImpl::ApplyPolicyToTimerQueue() {
|
| + if (page_in_background_) {
|
| + timer_task_queue_->SetTimeDomain(
|
| + renderer_scheduler_->throttling_helper()->time_domain());
|
| + } else {
|
| + timer_task_queue_->SetTimeDomain(renderer_scheduler_->real_time_domain());
|
| + }
|
| + timer_task_queue_->SetPumpPolicy(page_in_background_
|
| + ? TaskQueue::PumpPolicy::MANUAL
|
| + : TaskQueue::PumpPolicy::AUTO);
|
| +}
|
| +
|
| +bool WebFrameSchedulerImpl::PumpBackgroundTasks() {
|
| + DCHECK(page_in_background_);
|
| + if (!timer_task_queue_ || (timer_task_queue_->IsQueueEmpty() &&
|
| + !timer_task_queue_->HasPendingDelayedTask()))
|
| + return false;
|
| +
|
| + timer_task_queue_->PumpQueue();
|
| + return true;
|
| +}
|
| +
|
| +bool WebFrameSchedulerImpl::PendingBackgroundTasks() {
|
| + if (!timer_task_queue_)
|
| + return false;
|
| +
|
| + return !timer_task_queue_->IsQueueEmpty() ||
|
| + timer_task_queue_->HasPendingDelayedTask();
|
| +}
|
| +
|
| } // namespace scheduler
|
|
|