| 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 0a9122f5502064f94b66d6ac0463b176c9590c15..888a34bc203b012602b8bad1e389e3514a9d1855 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/base/real_time_domain.h"
|
| #include "components/scheduler/base/virtual_time_domain.h"
|
| #include "components/scheduler/child/scheduler_tqm_delegate.h"
|
| #include "components/scheduler/renderer/auto_advancing_virtual_time_domain.h"
|
| @@ -21,14 +22,15 @@ WebViewSchedulerImpl::WebViewSchedulerImpl(
|
| blink::WebView* web_view,
|
| RendererSchedulerImpl* renderer_scheduler,
|
| bool disable_background_timer_throttling)
|
| - : virtual_time_pump_policy_(TaskQueue::PumpPolicy::AUTO),
|
| - web_view_(web_view),
|
| + : web_view_(web_view),
|
| renderer_scheduler_(renderer_scheduler),
|
| virtual_time_policy_(VirtualTimePolicy::ADVANCE),
|
| background_parser_count_(0),
|
| page_visible_(true),
|
| disable_background_timer_throttling_(disable_background_timer_throttling),
|
| - allow_virtual_time_to_advance_(true) {
|
| + allow_virtual_time_to_advance_(true),
|
| + have_seen_loading_task_(false),
|
| + virtual_time_(false) {
|
| renderer_scheduler->AddWebViewScheduler(this);
|
| }
|
|
|
| @@ -39,8 +41,6 @@ WebViewSchedulerImpl::~WebViewSchedulerImpl() {
|
| frame_scheduler->DetachFromWebViewScheduler();
|
| }
|
| renderer_scheduler_->RemoveWebViewScheduler(this);
|
| - if (virtual_time_domain_)
|
| - renderer_scheduler_->UnregisterTimeDomain(virtual_time_domain_.get());
|
| }
|
|
|
| void WebViewSchedulerImpl::setPageVisible(bool page_visible) {
|
| @@ -84,34 +84,25 @@ void WebViewSchedulerImpl::AddConsoleWarning(const std::string& message) {
|
| }
|
|
|
| void WebViewSchedulerImpl::enableVirtualTime() {
|
| - // If we've already switched to virtual time then we don't need to do
|
| - // anything more.
|
| - if (virtual_time_domain_.get())
|
| + if (virtual_time_)
|
| return;
|
|
|
| - virtual_time_domain_.reset(new AutoAdvancingVirtualTimeDomain(
|
| - renderer_scheduler_->tick_clock()->NowTicks()));
|
| - renderer_scheduler_->RegisterTimeDomain(virtual_time_domain_.get());
|
| -
|
| - virtual_time_domain_->SetCanAdvanceVirtualTime(
|
| + virtual_time_ = true;
|
| + renderer_scheduler_->GetVirtualTimeDomain()->SetCanAdvanceVirtualTime(
|
| allow_virtual_time_to_advance_);
|
|
|
| - for (WebFrameSchedulerImpl* frame_scheduler : frame_schedulers_) {
|
| - frame_scheduler->OnVirtualTimeDomainChanged();
|
| - }
|
| + renderer_scheduler_->EnableVirtualTime();
|
| }
|
|
|
| void WebViewSchedulerImpl::setAllowVirtualTimeToAdvance(
|
| bool allow_virtual_time_to_advance) {
|
| - if (allow_virtual_time_to_advance_ == allow_virtual_time_to_advance)
|
| - return;
|
| -
|
| allow_virtual_time_to_advance_ = allow_virtual_time_to_advance;
|
|
|
| - if (virtual_time_domain_) {
|
| - virtual_time_domain_->SetCanAdvanceVirtualTime(
|
| - allow_virtual_time_to_advance);
|
| - }
|
| + if (!virtual_time_)
|
| + return;
|
| +
|
| + renderer_scheduler_->GetVirtualTimeDomain()->SetCanAdvanceVirtualTime(
|
| + allow_virtual_time_to_advance);
|
| }
|
|
|
| bool WebViewSchedulerImpl::virtualTimeAllowedToAdvance() const {
|
| @@ -120,6 +111,7 @@ bool WebViewSchedulerImpl::virtualTimeAllowedToAdvance() const {
|
|
|
| void WebViewSchedulerImpl::DidStartLoading(unsigned long identifier) {
|
| pending_loads_.insert(identifier);
|
| + have_seen_loading_task_ = true;
|
| ApplyVirtualTimePolicy();
|
| }
|
|
|
| @@ -162,8 +154,12 @@ void WebViewSchedulerImpl::ApplyVirtualTimePolicy() {
|
| return;
|
| }
|
|
|
| + // We pause virtual time until we've seen a loading task posted, because
|
| + // otherwise we could advance virtual time arbitarially far before the
|
| + // first load arrives.
|
| setAllowVirtualTimeToAdvance(pending_loads_.size() == 0 &&
|
| - background_parser_count_ == 0);
|
| + background_parser_count_ == 0 &&
|
| + have_seen_loading_task_);
|
| }
|
|
|
| } // namespace scheduler
|
|
|