Commit a6447cd0 authored by Alexander Timin's avatar Alexander Timin Committed by Commit Bot

[scheduler] FrameSchedulerImpl::Create

Remove PageSchedulerImpl::CreateFrameSchedulerImpl in favour of
FrameSchedulerImpl::Create and
PageSchedulerImpl::RegisterFrameSchedulerImpl.
This will allow to create subclasses of FrameSchedulerImpl in tests.

R=alexclarke@chromium.org

Change-Id: I401596bcae945a0039a8737cf795c13a19dd35e2
Reviewed-on: https://chromium-review.googlesource.com/1099071
Commit-Queue: Alexander Timin <altimin@chromium.org>
Reviewed-by: default avatarAlex Clarke <alexclarke@chromium.org>
Cr-Commit-Position: refs/heads/master@{#567272}
parent 436b5556
...@@ -102,6 +102,17 @@ FrameSchedulerImpl::PauseSubresourceLoadingHandleImpl:: ...@@ -102,6 +102,17 @@ FrameSchedulerImpl::PauseSubresourceLoadingHandleImpl::
frame_scheduler_->RemovePauseSubresourceLoadingHandle(); frame_scheduler_->RemovePauseSubresourceLoadingHandle();
} }
std::unique_ptr<FrameSchedulerImpl> FrameSchedulerImpl::Create(
PageSchedulerImpl* parent_page_scheduler,
base::trace_event::BlameContext* blame_context,
FrameScheduler::FrameType frame_type) {
std::unique_ptr<FrameSchedulerImpl> frame_scheduler(
new FrameSchedulerImpl(parent_page_scheduler->GetMainThreadScheduler(),
parent_page_scheduler, blame_context, frame_type));
parent_page_scheduler->RegisterFrameSchedulerImpl(frame_scheduler.get());
return frame_scheduler;
}
FrameSchedulerImpl::FrameSchedulerImpl( FrameSchedulerImpl::FrameSchedulerImpl(
MainThreadSchedulerImpl* main_thread_scheduler, MainThreadSchedulerImpl* main_thread_scheduler,
PageSchedulerImpl* parent_page_scheduler, PageSchedulerImpl* parent_page_scheduler,
......
...@@ -51,11 +51,10 @@ class PageSchedulerImplTest; ...@@ -51,11 +51,10 @@ class PageSchedulerImplTest;
class PLATFORM_EXPORT FrameSchedulerImpl : public FrameScheduler { class PLATFORM_EXPORT FrameSchedulerImpl : public FrameScheduler {
public: public:
FrameSchedulerImpl(MainThreadSchedulerImpl* main_thread_scheduler, static std::unique_ptr<FrameSchedulerImpl> Create(
PageSchedulerImpl* parent_page_scheduler, PageSchedulerImpl* page_scheduler,
base::trace_event::BlameContext* blame_context, base::trace_event::BlameContext* blame_context,
FrameScheduler::FrameType frame_type); FrameScheduler::FrameType frame_type);
~FrameSchedulerImpl() override; ~FrameSchedulerImpl() override;
// FrameScheduler implementation: // FrameScheduler implementation:
...@@ -106,6 +105,11 @@ class PLATFORM_EXPORT FrameSchedulerImpl : public FrameScheduler { ...@@ -106,6 +105,11 @@ class PLATFORM_EXPORT FrameSchedulerImpl : public FrameScheduler {
MainThreadTaskQueue* task_queue) const; MainThreadTaskQueue* task_queue) const;
protected: protected:
FrameSchedulerImpl(MainThreadSchedulerImpl* main_thread_scheduler,
PageSchedulerImpl* parent_page_scheduler,
base::trace_event::BlameContext* blame_context,
FrameScheduler::FrameType frame_type);
// This will construct a subframe that is not linked to any main thread or // This will construct a subframe that is not linked to any main thread or
// page scheduler. Should be used only for testing purposes. // page scheduler. Should be used only for testing purposes.
FrameSchedulerImpl(); FrameSchedulerImpl();
......
...@@ -48,8 +48,8 @@ class FrameSchedulerImplTest : public testing::Test { ...@@ -48,8 +48,8 @@ class FrameSchedulerImplTest : public testing::Test {
task_environment_.GetMockTickClock()), task_environment_.GetMockTickClock()),
base::nullopt)); base::nullopt));
page_scheduler_.reset(new PageSchedulerImpl(nullptr, scheduler_.get())); page_scheduler_.reset(new PageSchedulerImpl(nullptr, scheduler_.get()));
frame_scheduler_ = page_scheduler_->CreateFrameSchedulerImpl( frame_scheduler_ = FrameSchedulerImpl::Create(
nullptr, FrameScheduler::FrameType::kSubframe); page_scheduler_.get(), nullptr, FrameScheduler::FrameType::kSubframe);
} }
void TearDown() override { void TearDown() override {
...@@ -954,8 +954,8 @@ TEST_F(FrameSchedulerImplTest, kLowPriorityForThrottleableTaskFeatureEnabled) { ...@@ -954,8 +954,8 @@ TEST_F(FrameSchedulerImplTest, kLowPriorityForThrottleableTaskFeatureEnabled) {
EXPECT_EQ(UnpausableTaskQueue()->GetQueuePriority(), EXPECT_EQ(UnpausableTaskQueue()->GetQueuePriority(),
TaskQueue::QueuePriority::kNormalPriority); TaskQueue::QueuePriority::kNormalPriority);
frame_scheduler_ = page_scheduler_->CreateFrameSchedulerImpl( frame_scheduler_ = FrameSchedulerImpl::Create(
nullptr, FrameScheduler::FrameType::kMainFrame); page_scheduler_.get(), nullptr, FrameScheduler::FrameType::kMainFrame);
// Main Frame Task Queues. // Main Frame Task Queues.
EXPECT_EQ(LoadingTaskQueue()->GetQueuePriority(), EXPECT_EQ(LoadingTaskQueue()->GetQueuePriority(),
...@@ -1019,8 +1019,8 @@ TEST_F(FrameSchedulerImplTest, ...@@ -1019,8 +1019,8 @@ TEST_F(FrameSchedulerImplTest,
feature_list_.InitWithFeatures( feature_list_.InitWithFeatures(
{kLowPriorityForThrottleableTask, kExperimentOnlyWhenLoading}, {}); {kLowPriorityForThrottleableTask, kExperimentOnlyWhenLoading}, {});
frame_scheduler_ = page_scheduler_->CreateFrameSchedulerImpl( frame_scheduler_ = FrameSchedulerImpl::Create(
nullptr, FrameScheduler::FrameType::kMainFrame); page_scheduler_.get(), nullptr, FrameScheduler::FrameType::kMainFrame);
// Main thread is in the loading use case. // Main thread is in the loading use case.
scheduler_->DidStartProvisionalLoad(true); scheduler_->DidStartProvisionalLoad(true);
......
...@@ -301,8 +301,8 @@ class MainThreadSchedulerImplTest : public testing::Test { ...@@ -301,8 +301,8 @@ class MainThreadSchedulerImplTest : public testing::Test {
page_scheduler_ = page_scheduler_ =
std::make_unique<PageSchedulerImpl>(nullptr, scheduler_.get()); std::make_unique<PageSchedulerImpl>(nullptr, scheduler_.get());
main_frame_scheduler_ = page_scheduler_->CreateFrameSchedulerImpl( main_frame_scheduler_ = FrameSchedulerImpl::Create(
nullptr, FrameScheduler::FrameType::kMainFrame); page_scheduler_.get(), nullptr, FrameScheduler::FrameType::kMainFrame);
loading_task_runner_ = main_frame_scheduler_->LoadingTaskQueue(); loading_task_runner_ = main_frame_scheduler_->LoadingTaskQueue();
loading_control_task_runner_ = loading_control_task_runner_ =
...@@ -3465,8 +3465,8 @@ TEST_F(MainThreadSchedulerImplTest, EnableVirtualTimeAfterThrottling) { ...@@ -3465,8 +3465,8 @@ TEST_F(MainThreadSchedulerImplTest, EnableVirtualTimeAfterThrottling) {
scheduler_->AddPageScheduler(page_scheduler.get()); scheduler_->AddPageScheduler(page_scheduler.get());
std::unique_ptr<FrameSchedulerImpl> frame_scheduler = std::unique_ptr<FrameSchedulerImpl> frame_scheduler =
page_scheduler->CreateFrameSchedulerImpl( FrameSchedulerImpl::Create(page_scheduler.get(), nullptr,
nullptr, FrameScheduler::FrameType::kSubframe); FrameScheduler::FrameType::kSubframe);
TaskQueue* timer_tq = ThrottleableTaskQueue(frame_scheduler.get()).get(); TaskQueue* timer_tq = ThrottleableTaskQueue(frame_scheduler.get()).get();
...@@ -3554,8 +3554,8 @@ TEST_F(MainThreadSchedulerImplTest, Tracing) { ...@@ -3554,8 +3554,8 @@ TEST_F(MainThreadSchedulerImplTest, Tracing) {
scheduler_->AddPageScheduler(page_scheduler1.get()); scheduler_->AddPageScheduler(page_scheduler1.get());
std::unique_ptr<FrameSchedulerImpl> frame_scheduler = std::unique_ptr<FrameSchedulerImpl> frame_scheduler =
page_scheduler1->CreateFrameSchedulerImpl( FrameSchedulerImpl::Create(page_scheduler1.get(), nullptr,
nullptr, FrameScheduler::FrameType::kSubframe); FrameScheduler::FrameType::kSubframe);
std::unique_ptr<PageSchedulerImpl> page_scheduler2 = std::unique_ptr<PageSchedulerImpl> page_scheduler2 =
base::WrapUnique(new PageSchedulerImpl(nullptr, scheduler_.get())); base::WrapUnique(new PageSchedulerImpl(nullptr, scheduler_.get()));
......
...@@ -261,21 +261,17 @@ void PageSchedulerImpl::SetIsMainFrameLocal(bool is_local) { ...@@ -261,21 +261,17 @@ void PageSchedulerImpl::SetIsMainFrameLocal(bool is_local) {
is_main_frame_local_ = is_local; is_main_frame_local_ = is_local;
} }
std::unique_ptr<FrameSchedulerImpl> PageSchedulerImpl::CreateFrameSchedulerImpl( void PageSchedulerImpl::RegisterFrameSchedulerImpl(
base::trace_event::BlameContext* blame_context, FrameSchedulerImpl* frame_scheduler) {
FrameScheduler::FrameType frame_type) {
MaybeInitializeBackgroundCPUTimeBudgetPool(); MaybeInitializeBackgroundCPUTimeBudgetPool();
std::unique_ptr<FrameSchedulerImpl> frame_scheduler(new FrameSchedulerImpl( frame_schedulers_.insert(frame_scheduler);
main_thread_scheduler_, this, blame_context, frame_type));
frame_scheduler->UpdatePolicy(); frame_scheduler->UpdatePolicy();
frame_schedulers_.insert(frame_scheduler.get());
return frame_scheduler;
} }
std::unique_ptr<blink::FrameScheduler> PageSchedulerImpl::CreateFrameScheduler( std::unique_ptr<blink::FrameScheduler> PageSchedulerImpl::CreateFrameScheduler(
blink::BlameContext* blame_context, blink::BlameContext* blame_context,
FrameScheduler::FrameType frame_type) { FrameScheduler::FrameType frame_type) {
return CreateFrameSchedulerImpl(blame_context, frame_type); return FrameSchedulerImpl::Create(this, blame_context, frame_type);
} }
void PageSchedulerImpl::Unregister(FrameSchedulerImpl* frame_scheduler) { void PageSchedulerImpl::Unregister(FrameSchedulerImpl* frame_scheduler) {
...@@ -558,6 +554,10 @@ void PageSchedulerImpl::SetMaxVirtualTimeTaskStarvationCount( ...@@ -558,6 +554,10 @@ void PageSchedulerImpl::SetMaxVirtualTimeTaskStarvationCount(
max_task_starvation_count); max_task_starvation_count);
} }
MainThreadSchedulerImpl* PageSchedulerImpl::GetMainThreadScheduler() const {
return main_thread_scheduler_;
}
ukm::UkmRecorder* PageSchedulerImpl::GetUkmRecorder() { ukm::UkmRecorder* PageSchedulerImpl::GetUkmRecorder() {
if (!delegate_) if (!delegate_)
return nullptr; return nullptr;
......
...@@ -91,9 +91,9 @@ class PLATFORM_EXPORT PageSchedulerImpl : public PageScheduler { ...@@ -91,9 +91,9 @@ class PLATFORM_EXPORT PageSchedulerImpl : public PageScheduler {
bool IsThrottled() const; bool IsThrottled() const;
bool KeepActive() const; bool KeepActive() const;
std::unique_ptr<FrameSchedulerImpl> CreateFrameSchedulerImpl( void RegisterFrameSchedulerImpl(FrameSchedulerImpl* frame_scheduler);
base::trace_event::BlameContext*,
FrameScheduler::FrameType); MainThreadSchedulerImpl* GetMainThreadScheduler() const;
void Unregister(FrameSchedulerImpl*); void Unregister(FrameSchedulerImpl*);
void OnNavigation(); void OnNavigation();
......
...@@ -60,8 +60,8 @@ class PageSchedulerImplTest : public testing::Test { ...@@ -60,8 +60,8 @@ class PageSchedulerImplTest : public testing::Test {
nullptr, test_task_runner_, test_task_runner_->GetMockTickClock()), nullptr, test_task_runner_, test_task_runner_->GetMockTickClock()),
base::nullopt)); base::nullopt));
page_scheduler_.reset(new PageSchedulerImpl(nullptr, scheduler_.get())); page_scheduler_.reset(new PageSchedulerImpl(nullptr, scheduler_.get()));
frame_scheduler_ = page_scheduler_->CreateFrameSchedulerImpl( frame_scheduler_ = FrameSchedulerImpl::Create(
nullptr, FrameScheduler::FrameType::kSubframe); page_scheduler_.get(), nullptr, FrameScheduler::FrameType::kSubframe);
} }
void TearDown() override { void TearDown() override {
...@@ -296,8 +296,8 @@ TEST_F(PageSchedulerImplTest, RepeatingTimers_OneBackgroundOneForeground) { ...@@ -296,8 +296,8 @@ TEST_F(PageSchedulerImplTest, RepeatingTimers_OneBackgroundOneForeground) {
std::unique_ptr<PageSchedulerImpl> page_scheduler2( std::unique_ptr<PageSchedulerImpl> page_scheduler2(
new PageSchedulerImpl(nullptr, scheduler_.get())); new PageSchedulerImpl(nullptr, scheduler_.get()));
std::unique_ptr<FrameSchedulerImpl> frame_scheduler2 = std::unique_ptr<FrameSchedulerImpl> frame_scheduler2 =
page_scheduler2->CreateFrameSchedulerImpl( FrameSchedulerImpl::Create(page_scheduler2.get(), nullptr,
nullptr, FrameScheduler::FrameType::kSubframe); FrameScheduler::FrameType::kSubframe);
page_scheduler_->SetPageVisible(true); page_scheduler_->SetPageVisible(true);
page_scheduler2->SetPageVisible(false); page_scheduler2->SetPageVisible(false);
...@@ -548,8 +548,8 @@ TEST_F(PageSchedulerImplTest, VirtualTimeSettings_NewFrameScheduler) { ...@@ -548,8 +548,8 @@ TEST_F(PageSchedulerImplTest, VirtualTimeSettings_NewFrameScheduler) {
page_scheduler_->EnableVirtualTime(); page_scheduler_->EnableVirtualTime();
std::unique_ptr<FrameSchedulerImpl> frame_scheduler = std::unique_ptr<FrameSchedulerImpl> frame_scheduler =
page_scheduler_->CreateFrameSchedulerImpl( FrameSchedulerImpl::Create(page_scheduler_.get(), nullptr,
nullptr, FrameScheduler::FrameType::kSubframe); FrameScheduler::FrameType::kSubframe);
ThrottleableTaskQueueForScheduler(frame_scheduler.get()) ThrottleableTaskQueueForScheduler(frame_scheduler.get())
->PostDelayedTask( ->PostDelayedTask(
...@@ -578,9 +578,8 @@ base::OnceClosure MakeDeletionTask(T* obj) { ...@@ -578,9 +578,8 @@ base::OnceClosure MakeDeletionTask(T* obj) {
TEST_F(PageSchedulerImplTest, DeleteFrameSchedulers_InTask) { TEST_F(PageSchedulerImplTest, DeleteFrameSchedulers_InTask) {
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
FrameSchedulerImpl* frame_scheduler = FrameSchedulerImpl* frame_scheduler =
page_scheduler_ FrameSchedulerImpl::Create(page_scheduler_.get(), nullptr,
->CreateFrameSchedulerImpl(nullptr, FrameScheduler::FrameType::kSubframe)
FrameScheduler::FrameType::kSubframe)
.release(); .release();
ThrottleableTaskQueueForScheduler(frame_scheduler) ThrottleableTaskQueueForScheduler(frame_scheduler)
->PostDelayedTask(FROM_HERE, MakeDeletionTask(frame_scheduler), ->PostDelayedTask(FROM_HERE, MakeDeletionTask(frame_scheduler),
...@@ -599,9 +598,8 @@ TEST_F(PageSchedulerImplTest, DeleteThrottledQueue_InTask) { ...@@ -599,9 +598,8 @@ TEST_F(PageSchedulerImplTest, DeleteThrottledQueue_InTask) {
page_scheduler_->SetPageVisible(false); page_scheduler_->SetPageVisible(false);
FrameSchedulerImpl* frame_scheduler = FrameSchedulerImpl* frame_scheduler =
page_scheduler_ FrameSchedulerImpl::Create(page_scheduler_.get(), nullptr,
->CreateFrameSchedulerImpl(nullptr, FrameScheduler::FrameType::kSubframe)
FrameScheduler::FrameType::kSubframe)
.release(); .release();
scoped_refptr<TaskQueue> timer_task_queue = scoped_refptr<TaskQueue> timer_task_queue =
ThrottleableTaskQueueForScheduler(frame_scheduler); ThrottleableTaskQueueForScheduler(frame_scheduler);
...@@ -653,8 +651,8 @@ TEST_F(PageSchedulerImplTest, ...@@ -653,8 +651,8 @@ TEST_F(PageSchedulerImplTest,
VirtualTimePolicy::kDeterministicLoading); VirtualTimePolicy::kDeterministicLoading);
std::unique_ptr<FrameSchedulerImpl> frame_scheduler = std::unique_ptr<FrameSchedulerImpl> frame_scheduler =
page_scheduler_->CreateFrameSchedulerImpl( FrameSchedulerImpl::Create(page_scheduler_.get(), nullptr,
nullptr, FrameScheduler::FrameType::kSubframe); FrameScheduler::FrameType::kSubframe);
{ {
WebScopedVirtualTimePauser virtual_time_pauser = WebScopedVirtualTimePauser virtual_time_pauser =
...@@ -720,8 +718,8 @@ TEST_F(PageSchedulerImplTest, ...@@ -720,8 +718,8 @@ TEST_F(PageSchedulerImplTest,
base::TimeTicks time_second_task; base::TimeTicks time_second_task;
std::unique_ptr<FrameSchedulerImpl> frame_scheduler = std::unique_ptr<FrameSchedulerImpl> frame_scheduler =
page_scheduler_->CreateFrameSchedulerImpl( FrameSchedulerImpl::Create(page_scheduler_.get(), nullptr,
nullptr, FrameScheduler::FrameType::kSubframe); FrameScheduler::FrameType::kSubframe);
// Pauses and unpauses virtual time, thereby advancing virtual time by an // Pauses and unpauses virtual time, thereby advancing virtual time by an
// additional 10ms due to WebScopedVirtualTimePauser's delay. // additional 10ms due to WebScopedVirtualTimePauser's delay.
...@@ -756,8 +754,8 @@ TEST_F(PageSchedulerImplTest, ...@@ -756,8 +754,8 @@ TEST_F(PageSchedulerImplTest,
VirtualTimePolicy::kDeterministicLoading); VirtualTimePolicy::kDeterministicLoading);
std::unique_ptr<FrameSchedulerImpl> frame_scheduler = std::unique_ptr<FrameSchedulerImpl> frame_scheduler =
page_scheduler_->CreateFrameSchedulerImpl( FrameSchedulerImpl::Create(page_scheduler_.get(), nullptr,
nullptr, FrameScheduler::FrameType::kSubframe); FrameScheduler::FrameType::kSubframe);
WebScopedVirtualTimePauser virtual_time_pauser1 = WebScopedVirtualTimePauser virtual_time_pauser1 =
frame_scheduler->CreateWebScopedVirtualTimePauser( frame_scheduler->CreateWebScopedVirtualTimePauser(
...@@ -795,8 +793,8 @@ TEST_F(PageSchedulerImplTest, PauseTimersWhileVirtualTimeIsPaused) { ...@@ -795,8 +793,8 @@ TEST_F(PageSchedulerImplTest, PauseTimersWhileVirtualTimeIsPaused) {
std::vector<int> run_order; std::vector<int> run_order;
std::unique_ptr<FrameSchedulerImpl> frame_scheduler = std::unique_ptr<FrameSchedulerImpl> frame_scheduler =
page_scheduler_->CreateFrameSchedulerImpl( FrameSchedulerImpl::Create(page_scheduler_.get(), nullptr,
nullptr, FrameScheduler::FrameType::kSubframe); FrameScheduler::FrameType::kSubframe);
page_scheduler_->SetVirtualTimePolicy(VirtualTimePolicy::kPause); page_scheduler_->SetVirtualTimePolicy(VirtualTimePolicy::kPause);
page_scheduler_->EnableVirtualTime(); page_scheduler_->EnableVirtualTime();
...@@ -1077,8 +1075,8 @@ TEST_F(PageSchedulerImplTest, BackgroundTimerThrottling) { ...@@ -1077,8 +1075,8 @@ TEST_F(PageSchedulerImplTest, BackgroundTimerThrottling) {
EXPECT_FALSE(page_scheduler_->IsThrottled()); EXPECT_FALSE(page_scheduler_->IsThrottled());
std::vector<base::TimeTicks> run_times; std::vector<base::TimeTicks> run_times;
frame_scheduler_ = page_scheduler_->CreateFrameSchedulerImpl( frame_scheduler_ = FrameSchedulerImpl::Create(
nullptr, FrameScheduler::FrameType::kSubframe); page_scheduler_.get(), nullptr, FrameScheduler::FrameType::kSubframe);
page_scheduler_->SetPageVisible(true); page_scheduler_->SetPageVisible(true);
EXPECT_FALSE(page_scheduler_->IsThrottled()); EXPECT_FALSE(page_scheduler_->IsThrottled());
...@@ -1143,11 +1141,11 @@ TEST_F(PageSchedulerImplTest, OpenWebSocketExemptsFromBudgetThrottling) { ...@@ -1143,11 +1141,11 @@ TEST_F(PageSchedulerImplTest, OpenWebSocketExemptsFromBudgetThrottling) {
std::vector<base::TimeTicks> run_times; std::vector<base::TimeTicks> run_times;
std::unique_ptr<FrameSchedulerImpl> frame_scheduler1 = std::unique_ptr<FrameSchedulerImpl> frame_scheduler1 =
page_scheduler->CreateFrameSchedulerImpl( FrameSchedulerImpl::Create(page_scheduler.get(), nullptr,
nullptr, FrameScheduler::FrameType::kSubframe); FrameScheduler::FrameType::kSubframe);
std::unique_ptr<FrameSchedulerImpl> frame_scheduler2 = std::unique_ptr<FrameSchedulerImpl> frame_scheduler2 =
page_scheduler->CreateFrameSchedulerImpl( FrameSchedulerImpl::Create(page_scheduler.get(), nullptr,
nullptr, FrameScheduler::FrameType::kSubframe); FrameScheduler::FrameType::kSubframe);
page_scheduler->SetPageVisible(false); page_scheduler->SetPageVisible(false);
......
...@@ -122,9 +122,10 @@ class WorkerSchedulerProxyTest : public testing::Test { ...@@ -122,9 +122,10 @@ class WorkerSchedulerProxyTest : public testing::Test {
page_scheduler_( page_scheduler_(
std::make_unique<PageSchedulerImpl>(nullptr, std::make_unique<PageSchedulerImpl>(nullptr,
main_thread_scheduler_.get())), main_thread_scheduler_.get())),
frame_scheduler_(page_scheduler_->CreateFrameSchedulerImpl( frame_scheduler_(
nullptr, FrameSchedulerImpl::Create(page_scheduler_.get(),
FrameScheduler::FrameType::kMainFrame)) { nullptr,
FrameScheduler::FrameType::kMainFrame)) {
// Null clock triggers some assertions. // Null clock triggers some assertions.
task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(5)); task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(5));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment