blob: 09fc5614fdb906afac3feb16a4c9b4b59930b536 [file] [log] [blame]
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_SCHEDULER_WEB_SCOPED_VIRTUAL_TIME_PAUSER_H_
#define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_SCHEDULER_WEB_SCOPED_VIRTUAL_TIME_PAUSER_H_
#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "third_party/blink/public/platform/web_common.h"
#include "third_party/blink/public/platform/web_string.h"
namespace blink {
namespace scheduler {
class ThreadSchedulerBase;
} // namespace scheduler
// VirtualTime is a headless feature which is intended to make renders (more)
// deterministic by pausing task execution in the Blink main thread (and pausing
// the clock) while certain asynchronous operations are pending, e.g. fetching
// resources. Generally new instances of WebScopedVirtualTimePauser should only
// be added if there are determinism problems with renders on certain pages.
// The WebScopedVirtualTimePauser itself is a move only RAII style helper which
// makes it easier for subsystems to robustly pause and unpause virtual time.
class BLINK_PLATFORM_EXPORT WebScopedVirtualTimePauser {
public:
enum class VirtualTaskDuration {
kInstant, // Virtual time will not be advanced when it's unpaused.
kNonInstant // Virtual time may be advanced when it's unpaused.
};
// Note simply creating a WebScopedVirtualTimePauser doesn't cause VirtualTime
// to pause, instead you need to call PauseVirtualTime.
// By default VirtualTaskDuration::kInstant should be used unless there is a
// risk of virtual time getting stalled (e.g. if a page requests a
// non-existent resource and it has an error handler which always fetches
// another non-existent resource, then there is a risk that virtual time will
// be blocked forever unless we use VirtualTaskDuration::kNonInstant).
WebScopedVirtualTimePauser(scheduler::ThreadSchedulerBase*,
VirtualTaskDuration,
const WebString& debug_name);
WebScopedVirtualTimePauser();
~WebScopedVirtualTimePauser();
WebScopedVirtualTimePauser(WebScopedVirtualTimePauser&& other);
WebScopedVirtualTimePauser& operator=(WebScopedVirtualTimePauser&& other);
WebScopedVirtualTimePauser(const WebScopedVirtualTimePauser&) = delete;
WebScopedVirtualTimePauser& operator=(const WebScopedVirtualTimePauser&) =
delete;
// Virtual time will be paused if any WebScopedVirtualTimePauser votes to
// pause it, and only unpaused only if all WebScopedVirtualTimePauser are
// either destroyed or vote to unpause.
void PauseVirtualTime();
void UnpauseVirtualTime();
private:
void DecrementVirtualTimePauseCount();
base::TimeTicks virtual_time_when_paused_;
bool paused_ = false;
bool virtual_time_enabled_when_paused_ = false;
VirtualTaskDuration duration_ = VirtualTaskDuration::kInstant;
raw_ptr<scheduler::ThreadSchedulerBase, DanglingUntriaged>
scheduler_; // NOT OWNED
WebString debug_name_;
intptr_t trace_id_;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_SCHEDULER_WEB_SCOPED_VIRTUAL_TIME_PAUSER_H_