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 |