| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/Timer.h" | 5 #include "platform/Timer.h" |
| 6 | 6 |
| 7 #include "platform/scheduler/base/task_queue_impl.h" | 7 #include "platform/scheduler/base/task_queue_impl.h" |
| 8 #include "platform/scheduler/child/web_task_runner_impl.h" | 8 #include "platform/scheduler/child/web_task_runner_impl.h" |
| 9 #include "platform/scheduler/renderer/renderer_scheduler_impl.h" | 9 #include "platform/scheduler/renderer/renderer_scheduler_impl.h" |
| 10 #include "platform/testing/TestingPlatformSupport.h" | 10 #include "platform/testing/TestingPlatformSupport.h" |
| (...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 519 } | 519 } |
| 520 | 520 |
| 521 template <typename TimerFiredClass> | 521 template <typename TimerFiredClass> |
| 522 class TimerForTest : public TaskRunnerTimer<TimerFiredClass> { | 522 class TimerForTest : public TaskRunnerTimer<TimerFiredClass> { |
| 523 public: | 523 public: |
| 524 using TimerFiredFunction = | 524 using TimerFiredFunction = |
| 525 typename TaskRunnerTimer<TimerFiredClass>::TimerFiredFunction; | 525 typename TaskRunnerTimer<TimerFiredClass>::TimerFiredFunction; |
| 526 | 526 |
| 527 ~TimerForTest() override {} | 527 ~TimerForTest() override {} |
| 528 | 528 |
| 529 TimerForTest(WebTaskRunner* webTaskRunner, | 529 TimerForTest(RefPtr<WebTaskRunner> webTaskRunner, |
| 530 TimerFiredClass* timerFiredClass, | 530 TimerFiredClass* timerFiredClass, |
| 531 TimerFiredFunction timerFiredFunction) | 531 TimerFiredFunction timerFiredFunction) |
| 532 : TaskRunnerTimer<TimerFiredClass>(webTaskRunner, | 532 : TaskRunnerTimer<TimerFiredClass>(std::move(webTaskRunner), |
| 533 timerFiredClass, | 533 timerFiredClass, |
| 534 timerFiredFunction) {} | 534 timerFiredFunction) {} |
| 535 }; | 535 }; |
| 536 | 536 |
| 537 TEST_F(TimerTest, UserSuppliedWebTaskRunner) { | 537 TEST_F(TimerTest, UserSuppliedWebTaskRunner) { |
| 538 scoped_refptr<scheduler::TaskQueue> taskRunner( | 538 scoped_refptr<scheduler::TaskQueue> taskRunner( |
| 539 m_platform.rendererScheduler()->NewTimerTaskRunner( | 539 m_platform.rendererScheduler()->NewTimerTaskRunner( |
| 540 scheduler::TaskQueue::QueueType::TEST)); | 540 scheduler::TaskQueue::QueueType::TEST)); |
| 541 scheduler::WebTaskRunnerImpl webTaskRunner(taskRunner); | 541 RefPtr<scheduler::WebTaskRunnerImpl> webTaskRunner = |
| 542 TimerForTest<TimerTest> timer(&webTaskRunner, this, &TimerTest::countingTask); | 542 scheduler::WebTaskRunnerImpl::create(taskRunner); |
| 543 TimerForTest<TimerTest> timer(webTaskRunner, this, &TimerTest::countingTask); |
| 543 timer.startOneShot(0, BLINK_FROM_HERE); | 544 timer.startOneShot(0, BLINK_FROM_HERE); |
| 544 | 545 |
| 545 // Make sure the task was posted on taskRunner. | 546 // Make sure the task was posted on taskRunner. |
| 546 EXPECT_FALSE(taskRunner->IsEmpty()); | 547 EXPECT_FALSE(taskRunner->IsEmpty()); |
| 547 } | 548 } |
| 548 | 549 |
| 549 TEST_F(TimerTest, RunOnHeapTimer) { | 550 TEST_F(TimerTest, RunOnHeapTimer) { |
| 550 RefPtr<OnHeapTimerOwner::Record> record = OnHeapTimerOwner::Record::create(); | 551 RefPtr<OnHeapTimerOwner::Record> record = OnHeapTimerOwner::Record::create(); |
| 551 Persistent<OnHeapTimerOwner> owner = new OnHeapTimerOwner(record); | 552 Persistent<OnHeapTimerOwner> owner = new OnHeapTimerOwner(record); |
| 552 | 553 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 593 m_platform.runUntilIdle(); | 594 m_platform.runUntilIdle(); |
| 594 EXPECT_FALSE(record->timerHasFired()); | 595 EXPECT_FALSE(record->timerHasFired()); |
| 595 EXPECT_FALSE(record->ownerIsDestructed()); | 596 EXPECT_FALSE(record->ownerIsDestructed()); |
| 596 } | 597 } |
| 597 } | 598 } |
| 598 | 599 |
| 599 namespace { | 600 namespace { |
| 600 | 601 |
| 601 class TaskObserver : public base::MessageLoop::TaskObserver { | 602 class TaskObserver : public base::MessageLoop::TaskObserver { |
| 602 public: | 603 public: |
| 603 TaskObserver(WebTaskRunner* task_runner, | 604 TaskObserver(RefPtr<WebTaskRunner> task_runner, |
| 604 std::vector<WebTaskRunner*>* runOrder) | 605 std::vector<RefPtr<WebTaskRunner>>* runOrder) |
| 605 : m_taskRunner(task_runner), m_runOrder(runOrder) {} | 606 : m_taskRunner(std::move(task_runner)), m_runOrder(runOrder) {} |
| 606 | 607 |
| 607 void WillProcessTask(const base::PendingTask&) {} | 608 void WillProcessTask(const base::PendingTask&) {} |
| 608 | 609 |
| 609 void DidProcessTask(const base::PendingTask&) { | 610 void DidProcessTask(const base::PendingTask&) { |
| 610 m_runOrder->push_back(m_taskRunner); | 611 m_runOrder->push_back(m_taskRunner); |
| 611 } | 612 } |
| 612 | 613 |
| 613 private: | 614 private: |
| 614 WebTaskRunner* m_taskRunner; | 615 RefPtr<WebTaskRunner> m_taskRunner; |
| 615 std::vector<WebTaskRunner*>* m_runOrder; | 616 std::vector<RefPtr<WebTaskRunner>>* m_runOrder; |
| 616 }; | 617 }; |
| 617 | 618 |
| 618 } // namespace | 619 } // namespace |
| 619 | 620 |
| 620 TEST_F(TimerTest, MoveToNewTaskRunnerOneShot) { | 621 TEST_F(TimerTest, MoveToNewTaskRunnerOneShot) { |
| 621 std::vector<WebTaskRunner*> runOrder; | 622 std::vector<RefPtr<WebTaskRunner>> runOrder; |
| 622 | 623 |
| 623 scoped_refptr<scheduler::TaskQueue> taskRunner1( | 624 scoped_refptr<scheduler::TaskQueue> taskRunner1( |
| 624 m_platform.rendererScheduler()->NewTimerTaskRunner( | 625 m_platform.rendererScheduler()->NewTimerTaskRunner( |
| 625 scheduler::TaskQueue::QueueType::TEST)); | 626 scheduler::TaskQueue::QueueType::TEST)); |
| 626 scheduler::WebTaskRunnerImpl webTaskRunner1(taskRunner1); | 627 RefPtr<scheduler::WebTaskRunnerImpl> webTaskRunner1 = |
| 627 TaskObserver taskObserver1(&webTaskRunner1, &runOrder); | 628 scheduler::WebTaskRunnerImpl::create(taskRunner1); |
| 629 TaskObserver taskObserver1(webTaskRunner1, &runOrder); |
| 628 taskRunner1->AddTaskObserver(&taskObserver1); | 630 taskRunner1->AddTaskObserver(&taskObserver1); |
| 629 | 631 |
| 630 scoped_refptr<scheduler::TaskQueue> taskRunner2( | 632 scoped_refptr<scheduler::TaskQueue> taskRunner2( |
| 631 m_platform.rendererScheduler()->NewTimerTaskRunner( | 633 m_platform.rendererScheduler()->NewTimerTaskRunner( |
| 632 scheduler::TaskQueue::QueueType::TEST)); | 634 scheduler::TaskQueue::QueueType::TEST)); |
| 633 scheduler::WebTaskRunnerImpl webTaskRunner2(taskRunner2); | 635 RefPtr<scheduler::WebTaskRunnerImpl> webTaskRunner2 = |
| 634 TaskObserver taskObserver2(&webTaskRunner2, &runOrder); | 636 scheduler::WebTaskRunnerImpl::create(taskRunner2); |
| 637 TaskObserver taskObserver2(webTaskRunner2, &runOrder); |
| 635 taskRunner2->AddTaskObserver(&taskObserver2); | 638 taskRunner2->AddTaskObserver(&taskObserver2); |
| 636 | 639 |
| 637 TimerForTest<TimerTest> timer(&webTaskRunner1, this, | 640 TimerForTest<TimerTest> timer(webTaskRunner1, this, &TimerTest::countingTask); |
| 638 &TimerTest::countingTask); | |
| 639 | 641 |
| 640 double startTime = monotonicallyIncreasingTime(); | 642 double startTime = monotonicallyIncreasingTime(); |
| 641 | 643 |
| 642 timer.startOneShot(1, BLINK_FROM_HERE); | 644 timer.startOneShot(1, BLINK_FROM_HERE); |
| 643 | 645 |
| 644 m_platform.runForPeriodSeconds(0.5); | 646 m_platform.runForPeriodSeconds(0.5); |
| 645 | 647 |
| 646 timer.moveToNewTaskRunner(&webTaskRunner2); | 648 timer.moveToNewTaskRunner(webTaskRunner2); |
| 647 | 649 |
| 648 m_platform.runUntilIdle(); | 650 m_platform.runUntilIdle(); |
| 649 | 651 |
| 650 EXPECT_THAT(m_runTimes, ElementsAre(startTime + 1.0)); | 652 EXPECT_THAT(m_runTimes, ElementsAre(startTime + 1.0)); |
| 651 | 653 |
| 652 EXPECT_THAT(runOrder, ElementsAre(&webTaskRunner2)); | 654 EXPECT_THAT(runOrder, ElementsAre(webTaskRunner2)); |
| 653 | 655 |
| 654 EXPECT_TRUE(taskRunner1->IsEmpty()); | 656 EXPECT_TRUE(taskRunner1->IsEmpty()); |
| 655 EXPECT_TRUE(taskRunner2->IsEmpty()); | 657 EXPECT_TRUE(taskRunner2->IsEmpty()); |
| 656 } | 658 } |
| 657 | 659 |
| 658 TEST_F(TimerTest, MoveToNewTaskRunnerRepeating) { | 660 TEST_F(TimerTest, MoveToNewTaskRunnerRepeating) { |
| 659 std::vector<WebTaskRunner*> runOrder; | 661 std::vector<RefPtr<WebTaskRunner>> runOrder; |
| 660 | 662 |
| 661 scoped_refptr<scheduler::TaskQueue> taskRunner1( | 663 scoped_refptr<scheduler::TaskQueue> taskRunner1( |
| 662 m_platform.rendererScheduler()->NewTimerTaskRunner( | 664 m_platform.rendererScheduler()->NewTimerTaskRunner( |
| 663 scheduler::TaskQueue::QueueType::TEST)); | 665 scheduler::TaskQueue::QueueType::TEST)); |
| 664 scheduler::WebTaskRunnerImpl webTaskRunner1(taskRunner1); | 666 RefPtr<scheduler::WebTaskRunnerImpl> webTaskRunner1 = |
| 665 TaskObserver taskObserver1(&webTaskRunner1, &runOrder); | 667 scheduler::WebTaskRunnerImpl::create(taskRunner1); |
| 668 TaskObserver taskObserver1(webTaskRunner1, &runOrder); |
| 666 taskRunner1->AddTaskObserver(&taskObserver1); | 669 taskRunner1->AddTaskObserver(&taskObserver1); |
| 667 | 670 |
| 668 scoped_refptr<scheduler::TaskQueue> taskRunner2( | 671 scoped_refptr<scheduler::TaskQueue> taskRunner2( |
| 669 m_platform.rendererScheduler()->NewTimerTaskRunner( | 672 m_platform.rendererScheduler()->NewTimerTaskRunner( |
| 670 scheduler::TaskQueue::QueueType::TEST)); | 673 scheduler::TaskQueue::QueueType::TEST)); |
| 671 scheduler::WebTaskRunnerImpl webTaskRunner2(taskRunner2); | 674 RefPtr<scheduler::WebTaskRunnerImpl> webTaskRunner2 = |
| 672 TaskObserver taskObserver2(&webTaskRunner2, &runOrder); | 675 scheduler::WebTaskRunnerImpl::create(taskRunner2); |
| 676 TaskObserver taskObserver2(webTaskRunner2, &runOrder); |
| 673 taskRunner2->AddTaskObserver(&taskObserver2); | 677 taskRunner2->AddTaskObserver(&taskObserver2); |
| 674 | 678 |
| 675 TimerForTest<TimerTest> timer(&webTaskRunner1, this, | 679 TimerForTest<TimerTest> timer(webTaskRunner1, this, &TimerTest::countingTask); |
| 676 &TimerTest::countingTask); | |
| 677 | 680 |
| 678 double startTime = monotonicallyIncreasingTime(); | 681 double startTime = monotonicallyIncreasingTime(); |
| 679 | 682 |
| 680 timer.startRepeating(1, BLINK_FROM_HERE); | 683 timer.startRepeating(1, BLINK_FROM_HERE); |
| 681 | 684 |
| 682 m_platform.runForPeriodSeconds(2.5); | 685 m_platform.runForPeriodSeconds(2.5); |
| 683 | 686 |
| 684 timer.moveToNewTaskRunner(&webTaskRunner2); | 687 timer.moveToNewTaskRunner(webTaskRunner2); |
| 685 | 688 |
| 686 m_platform.runForPeriodSeconds(2); | 689 m_platform.runForPeriodSeconds(2); |
| 687 | 690 |
| 688 EXPECT_THAT(m_runTimes, ElementsAre(startTime + 1.0, startTime + 2.0, | 691 EXPECT_THAT(m_runTimes, ElementsAre(startTime + 1.0, startTime + 2.0, |
| 689 startTime + 3.0, startTime + 4.0)); | 692 startTime + 3.0, startTime + 4.0)); |
| 690 | 693 |
| 691 EXPECT_THAT(runOrder, ElementsAre(&webTaskRunner1, &webTaskRunner1, | 694 EXPECT_THAT(runOrder, ElementsAre(webTaskRunner1, webTaskRunner1, |
| 692 &webTaskRunner2, &webTaskRunner2)); | 695 webTaskRunner2, webTaskRunner2)); |
| 693 | 696 |
| 694 EXPECT_TRUE(taskRunner1->IsEmpty()); | 697 EXPECT_TRUE(taskRunner1->IsEmpty()); |
| 695 EXPECT_FALSE(taskRunner2->IsEmpty()); | 698 EXPECT_FALSE(taskRunner2->IsEmpty()); |
| 696 } | 699 } |
| 697 | 700 |
| 698 // This test checks that when inactive timer is moved to a different task | 701 // This test checks that when inactive timer is moved to a different task |
| 699 // runner it isn't activated. | 702 // runner it isn't activated. |
| 700 TEST_F(TimerTest, MoveToNewTaskRunnerWithoutTasks) { | 703 TEST_F(TimerTest, MoveToNewTaskRunnerWithoutTasks) { |
| 701 scoped_refptr<scheduler::TaskQueue> taskRunner1( | 704 scoped_refptr<scheduler::TaskQueue> taskRunner1( |
| 702 m_platform.rendererScheduler()->NewTimerTaskRunner( | 705 m_platform.rendererScheduler()->NewTimerTaskRunner( |
| 703 scheduler::TaskQueue::QueueType::TEST)); | 706 scheduler::TaskQueue::QueueType::TEST)); |
| 704 scheduler::WebTaskRunnerImpl webTaskRunner1(taskRunner1); | 707 RefPtr<scheduler::WebTaskRunnerImpl> webTaskRunner1 = |
| 708 scheduler::WebTaskRunnerImpl::create(taskRunner1); |
| 705 | 709 |
| 706 scoped_refptr<scheduler::TaskQueue> taskRunner2( | 710 scoped_refptr<scheduler::TaskQueue> taskRunner2( |
| 707 m_platform.rendererScheduler()->NewTimerTaskRunner( | 711 m_platform.rendererScheduler()->NewTimerTaskRunner( |
| 708 scheduler::TaskQueue::QueueType::TEST)); | 712 scheduler::TaskQueue::QueueType::TEST)); |
| 709 scheduler::WebTaskRunnerImpl webTaskRunner2(taskRunner2); | 713 RefPtr<scheduler::WebTaskRunnerImpl> webTaskRunner2 = |
| 714 scheduler::WebTaskRunnerImpl::create(taskRunner2); |
| 710 | 715 |
| 711 TimerForTest<TimerTest> timer(&webTaskRunner1, this, | 716 TimerForTest<TimerTest> timer(webTaskRunner1, this, &TimerTest::countingTask); |
| 712 &TimerTest::countingTask); | |
| 713 | 717 |
| 714 m_platform.runUntilIdle(); | 718 m_platform.runUntilIdle(); |
| 715 EXPECT_TRUE(!m_runTimes.size()); | 719 EXPECT_TRUE(!m_runTimes.size()); |
| 716 EXPECT_TRUE(taskRunner1->IsEmpty()); | 720 EXPECT_TRUE(taskRunner1->IsEmpty()); |
| 717 EXPECT_TRUE(taskRunner2->IsEmpty()); | 721 EXPECT_TRUE(taskRunner2->IsEmpty()); |
| 718 } | 722 } |
| 719 | 723 |
| 720 } // namespace | 724 } // namespace |
| 721 } // namespace blink | 725 } // namespace blink |
| OLD | NEW |