Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(115)

Side by Side Diff: third_party/WebKit/Source/platform/TimerTest.cpp

Issue 2550373005: Make WebTaskRunner ThreadSafeRefCounted (Closed)
Patch Set: +DISALLOW_COPY_AND_ASSIGN for win build fix Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/platform/Timer.cpp ('k') | third_party/WebKit/Source/platform/WebFrameScheduler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698