diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/chromium/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc b/chromium/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc index 911c7e2cf0d..6a5130c343c 100644 --- a/chromium/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc +++ b/chromium/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc @@ -6,10 +6,12 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/mojom/frame/lifecycle.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/v8_idle_request_callback.h" #include "third_party/blink/renderer/bindings/core/v8/v8_idle_request_options.h" #include "third_party/blink/renderer/core/testing/null_execution_context.h" #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h" +#include "third_party/blink/renderer/platform/scheduler/test/fake_task_runner.h" #include "third_party/blink/renderer/platform/testing/scoped_scheduler_overrider.h" namespace blink { @@ -38,7 +40,7 @@ class MockScriptedIdleTaskControllerScheduler final : public ThreadScheduler { } scoped_refptr<base::SingleThreadTaskRunner> DeprecatedDefaultTaskRunner() override { - return nullptr; + return task_runner_; } void Shutdown() override {} bool ShouldYieldForHighPriorityWork() override { return should_yield_; } @@ -83,9 +85,15 @@ class MockScriptedIdleTaskControllerScheduler final : public ThreadScheduler { void RunIdleTask() { std::move(idle_task_).Run(base::TimeTicks()); } bool HasIdleTask() const { return !!idle_task_; } + void AdvanceTimeAndRun(base::TimeDelta delta) { + task_runner_->AdvanceTimeAndRun(delta); + } + private: bool should_yield_; Thread::IdleTask idle_task_; + scoped_refptr<scheduler::FakeTaskRunner> task_runner_ = + base::MakeRefCounted<scheduler::FakeTaskRunner>(); DISALLOW_COPY_AND_ASSIGN(MockScriptedIdleTaskControllerScheduler); }; @@ -146,4 +154,36 @@ TEST_F(ScriptedIdleTaskControllerTest, DontRunCallbackWhenAskedToYield) { EXPECT_TRUE(scheduler.HasIdleTask()); } +TEST_F(ScriptedIdleTaskControllerTest, RunCallbacksAsyncWhenUnpaused) { + MockScriptedIdleTaskControllerScheduler scheduler(ShouldYield::YIELD); + ScopedSchedulerOverrider scheduler_overrider(&scheduler); + ScriptedIdleTaskController* controller = + ScriptedIdleTaskController::Create(execution_context_); + + // Register an idle task with a deadline. + Persistent<MockIdleTask> idle_task(MakeGarbageCollected<MockIdleTask>()); + IdleRequestOptions* options = IdleRequestOptions::Create(); + options->setTimeout(1); + int id = controller->RegisterCallback(idle_task, options); + EXPECT_NE(0, id); + + // Hitting the deadline while the frame is paused shouldn't cause any tasks to + // run. + controller->ContextLifecycleStateChanged(mojom::FrameLifecycleState::kPaused); + EXPECT_CALL(*idle_task, invoke(testing::_)).Times(0); + scheduler.AdvanceTimeAndRun(base::TimeDelta::FromMilliseconds(1)); + testing::Mock::VerifyAndClearExpectations(idle_task); + + // Even if we unpause, no tasks should run immediately. + EXPECT_CALL(*idle_task, invoke(testing::_)).Times(0); + controller->ContextLifecycleStateChanged( + mojom::FrameLifecycleState::kRunning); + testing::Mock::VerifyAndClearExpectations(idle_task); + + // Idle callback should have been scheduled as an asynchronous task. + EXPECT_CALL(*idle_task, invoke(testing::_)).Times(1); + scheduler.AdvanceTimeAndRun(base::TimeDelta::FromMilliseconds(0)); + testing::Mock::VerifyAndClearExpectations(idle_task); +} + } // namespace blink |