Index: third_party/WebKit/Source/platform/scheduler/base/delayed_switch.cc |
diff --git a/third_party/WebKit/Source/platform/scheduler/base/delayed_switch.cc b/third_party/WebKit/Source/platform/scheduler/base/delayed_switch.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a6dcb557c704cdbb99f2cbea4c959838f0cc4326 |
--- /dev/null |
+++ b/third_party/WebKit/Source/platform/scheduler/base/delayed_switch.cc |
@@ -0,0 +1,69 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "platform/scheduler/base/delayed_switch.h" |
+ |
+#include "base/task_runner.h" |
+ |
+namespace blink { |
+namespace scheduler { |
+ |
+DelayedSwitch::DelayedSwitch( |
+ base::TaskRunner* task_runner, |
+ base::TimeDelta disable_delay, |
+ base::Closure enable_callback, |
+ base::Closure disable_callback) |
+ : state_(State::DISABLED), |
+ task_runner_(task_runner), |
+ disable_delay_(disable_delay), |
+ enable_callback_(enable_callback), |
+ disable_callback_(disable_callback), |
+ has_disable_task_queued_(false), |
+ weak_ptr_factory_(this) { |
+ delayed_disable_task_.Reset(base::Bind( |
+ &DelayedSwitch::DoDisable, weak_ptr_factory_.GetWeakPtr())); |
+} |
+ |
+DelayedSwitch::~DelayedSwitch() {} |
+ |
+void DelayedSwitch::Enable() { |
+ // Cancel queued call to |disable_callback|. |
+ delayed_disable_task_.Cancel(); |
alex clarke (OOO till 29th)
2016/09/29 11:16:53
DCHECK(task_runner_->RunsTasksOnCurrentThread());
altimin
2016/09/29 16:29:42
Acknowledged.
|
+ has_disable_task_queued_ = false; |
+ |
+ if (state_ == State::ENABLED) |
+ return; |
+ |
+ state_ = State::ENABLED; |
+ |
+ enable_callback_.Run(); |
+} |
+ |
+void DelayedSwitch::Disable() { |
+ if (state_ == State::DISABLED) |
alex clarke (OOO till 29th)
2016/09/29 11:16:53
DCHECK(task_runner_->RunsTasksOnCurrentThread());
altimin
2016/09/29 16:29:42
Acknowledged.
|
+ return; |
+ |
+ if (has_disable_task_queued_) |
+ return; |
+ |
+ task_runner_->PostDelayedTask( |
+ FROM_HERE, delayed_disable_task_.callback(), disable_delay_); |
+ has_disable_task_queued_ = true; |
+} |
+ |
+bool DelayedSwitch::IsEnabled() const { |
+ return state_ == State::ENABLED; |
alex clarke (OOO till 29th)
2016/09/29 11:16:53
DCHECK(task_runner_->RunsTasksOnCurrentThread());
altimin
2016/09/29 16:29:42
Acknowledged.
|
+} |
+ |
+void DelayedSwitch::DoDisable() { |
+ has_disable_task_queued_ = false; |
+ |
+ DCHECK_EQ(State::ENABLED, state_); |
Sami
2016/09/29 13:36:07
Does this work? If so, please mark https://bugs.ch
altimin
2016/09/29 16:29:42
Done.
|
+ state_ = State::DISABLED; |
+ |
+ disable_callback_.Run(); |
+} |
+ |
+} // namespace scheduler |
+} // namespace blink |