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 |