Chromium Code Reviews| 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 "components/scheduler/renderer/web_view_scheduler_impl.h" | 5 #include "components/scheduler/renderer/web_view_scheduler_impl.h" |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/test/simple_test_tick_clock.h" | 9 #include "base/test/simple_test_tick_clock.h" |
| 10 #include "cc/test/ordered_simple_task_runner.h" | 10 #include "cc/test/ordered_simple_task_runner.h" |
| 11 #include "components/scheduler/base/test_time_source.h" | 11 #include "components/scheduler/base/test_time_source.h" |
| 12 #include "components/scheduler/child/scheduler_tqm_delegate_for_test.h" | 12 #include "components/scheduler/child/scheduler_tqm_delegate_for_test.h" |
| 13 #include "components/scheduler/renderer/renderer_scheduler_impl.h" | 13 #include "components/scheduler/renderer/renderer_scheduler_impl.h" |
| 14 #include "components/scheduler/renderer/web_frame_scheduler_impl.h" | 14 #include "components/scheduler/renderer/web_frame_scheduler_impl.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 16 #include "third_party/WebKit/public/platform/WebTaskRunner.h" | |
| 17 #include "third_party/WebKit/public/platform/WebTraceLocation.h" | |
| 16 | 18 |
| 17 namespace scheduler { | 19 namespace scheduler { |
| 18 | 20 |
| 19 class WebViewSchedulerImplTest : public testing::Test { | 21 class WebViewSchedulerImplTest : public testing::Test { |
| 20 public: | 22 public: |
| 21 WebViewSchedulerImplTest() {} | 23 WebViewSchedulerImplTest() {} |
| 22 ~WebViewSchedulerImplTest() override {} | 24 ~WebViewSchedulerImplTest() override {} |
| 23 | 25 |
| 24 void SetUp() override { | 26 void SetUp() override { |
| 25 clock_.reset(new base::SimpleTestTickClock()); | 27 clock_.reset(new base::SimpleTestTickClock()); |
| 26 clock_->Advance(base::TimeDelta::FromMicroseconds(5000)); | 28 clock_->Advance(base::TimeDelta::FromMicroseconds(5000)); |
| 27 mock_task_runner_ = make_scoped_refptr( | 29 mock_task_runner_ = make_scoped_refptr( |
| 28 new cc::OrderedSimpleTaskRunner(clock_.get(), false)); | 30 new cc::OrderedSimpleTaskRunner(clock_.get(), false)); |
| 29 main_task_runner_ = SchedulerTqmDelegateForTest::Create( | 31 main_task_runner_ = SchedulerTqmDelegateForTest::Create( |
| 30 mock_task_runner_, make_scoped_ptr(new TestTimeSource(clock_.get()))); | 32 mock_task_runner_, make_scoped_ptr(new TestTimeSource(clock_.get()))); |
| 31 scheduler_.reset(new RendererSchedulerImpl(main_task_runner_)); | 33 scheduler_.reset(new RendererSchedulerImpl(main_task_runner_)); |
| 32 web_view_scheduler_.reset( | 34 web_view_scheduler_.reset( |
| 33 new WebViewSchedulerImpl(nullptr, scheduler_.get())); | 35 new WebViewSchedulerImpl(nullptr, scheduler_.get(), "test.category")); |
| 34 } | 36 } |
| 35 | 37 |
| 36 void TearDown() override { scheduler_->Shutdown(); } | 38 void TearDown() override { scheduler_->Shutdown(); } |
| 37 | 39 |
| 38 scoped_ptr<base::SimpleTestTickClock> clock_; | 40 scoped_ptr<base::SimpleTestTickClock> clock_; |
| 39 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; | 41 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; |
| 40 scoped_refptr<SchedulerTqmDelegate> main_task_runner_; | 42 scoped_refptr<SchedulerTqmDelegate> main_task_runner_; |
| 41 scoped_ptr<RendererSchedulerImpl> scheduler_; | 43 scoped_ptr<RendererSchedulerImpl> scheduler_; |
| 42 scoped_ptr<WebViewSchedulerImpl> web_view_scheduler_; | 44 scoped_ptr<WebViewSchedulerImpl> web_view_scheduler_; |
| 43 }; | 45 }; |
| 44 | 46 |
| 45 TEST_F(WebViewSchedulerImplTest, TestDestructionOfFrameSchedulersBefore) { | 47 TEST_F(WebViewSchedulerImplTest, TestDestructionOfFrameSchedulersBefore) { |
| 46 blink::WebPassOwnPtr<blink::WebFrameScheduler> frame1( | 48 blink::WebPassOwnPtr<blink::WebFrameScheduler> frame1( |
| 47 web_view_scheduler_->createFrameScheduler()); | 49 web_view_scheduler_->createFrameScheduler()); |
| 48 blink::WebPassOwnPtr<blink::WebFrameScheduler> frame2( | 50 blink::WebPassOwnPtr<blink::WebFrameScheduler> frame2( |
| 49 web_view_scheduler_->createFrameScheduler()); | 51 web_view_scheduler_->createFrameScheduler()); |
| 50 } | 52 } |
| 51 | 53 |
| 52 TEST_F(WebViewSchedulerImplTest, TestDestructionOfFrameSchedulersAfter) { | 54 TEST_F(WebViewSchedulerImplTest, TestDestructionOfFrameSchedulersAfter) { |
| 53 blink::WebPassOwnPtr<blink::WebFrameScheduler> frame1( | 55 blink::WebPassOwnPtr<blink::WebFrameScheduler> frame1( |
| 54 web_view_scheduler_->createFrameScheduler()); | 56 web_view_scheduler_->createFrameScheduler()); |
| 55 blink::WebPassOwnPtr<blink::WebFrameScheduler> frame2( | 57 blink::WebPassOwnPtr<blink::WebFrameScheduler> frame2( |
| 56 web_view_scheduler_->createFrameScheduler()); | 58 web_view_scheduler_->createFrameScheduler()); |
| 57 web_view_scheduler_.reset(); | 59 web_view_scheduler_.reset(); |
| 58 } | 60 } |
| 59 | 61 |
| 62 TEST_F(WebViewSchedulerImplTest, DelayToNextRunTimeInSeconds) { | |
| 63 EXPECT_FLOAT_EQ( | |
| 64 1.0, (float)WebViewSchedulerImpl::DelayToNextRunTimeInSeconds(0.0)); | |
| 65 EXPECT_FLOAT_EQ( | |
| 66 0.9, (float)WebViewSchedulerImpl::DelayToNextRunTimeInSeconds(0.1)); | |
| 67 EXPECT_FLOAT_EQ( | |
| 68 0.8, (float)WebViewSchedulerImpl::DelayToNextRunTimeInSeconds(0.2)); | |
| 69 EXPECT_FLOAT_EQ( | |
| 70 0.7, (float)WebViewSchedulerImpl::DelayToNextRunTimeInSeconds(0.3)); | |
| 71 EXPECT_FLOAT_EQ( | |
| 72 0.6, (float)WebViewSchedulerImpl::DelayToNextRunTimeInSeconds(0.4)); | |
| 73 EXPECT_FLOAT_EQ( | |
| 74 0.5, (float)WebViewSchedulerImpl::DelayToNextRunTimeInSeconds(0.5)); | |
| 75 EXPECT_FLOAT_EQ( | |
| 76 0.4, (float)WebViewSchedulerImpl::DelayToNextRunTimeInSeconds(0.6)); | |
| 77 EXPECT_FLOAT_EQ( | |
| 78 0.3, (float)WebViewSchedulerImpl::DelayToNextRunTimeInSeconds(0.7)); | |
| 79 EXPECT_FLOAT_EQ( | |
| 80 0.2, (float)WebViewSchedulerImpl::DelayToNextRunTimeInSeconds(0.8)); | |
| 81 EXPECT_FLOAT_EQ( | |
| 82 1.1, (float)WebViewSchedulerImpl::DelayToNextRunTimeInSeconds(0.9)); | |
| 83 EXPECT_FLOAT_EQ( | |
| 84 1.0, (float)WebViewSchedulerImpl::DelayToNextRunTimeInSeconds(1.0)); | |
| 85 EXPECT_FLOAT_EQ( | |
| 86 1.0, (float)WebViewSchedulerImpl::DelayToNextRunTimeInSeconds(8.0)); | |
| 87 EXPECT_FLOAT_EQ( | |
| 88 0.8, (float)WebViewSchedulerImpl::DelayToNextRunTimeInSeconds(8.2)); | |
| 89 } | |
| 90 | |
| 91 namespace { | |
| 92 class RepeatingTask : public blink::WebTaskRunner::Task { | |
| 93 public: | |
| 94 RepeatingTask(blink::WebTaskRunner* web_task_runner, int* run_count) | |
| 95 : web_task_runner_(web_task_runner), run_count_(run_count) {} | |
| 96 | |
| 97 ~RepeatingTask() override {} | |
| 98 | |
| 99 void run() override { | |
| 100 (*run_count_)++; | |
| 101 web_task_runner_->postDelayedTask( | |
| 102 BLINK_FROM_HERE, new RepeatingTask(web_task_runner_, run_count_), 1.0); | |
| 103 } | |
| 104 | |
| 105 private: | |
| 106 blink::WebTaskRunner* web_task_runner_; // NOT OWNED | |
| 107 int* run_count_; // NOT OWNED | |
| 108 }; | |
| 109 } // namespace | |
| 110 | |
| 111 TEST_F(WebViewSchedulerImplTest, RepeatingTimer_PageInForeground) { | |
| 112 web_view_scheduler_->setPageInBackground(false); | |
| 113 | |
| 114 blink::WebPassOwnPtr<blink::WebFrameScheduler> frame( | |
|
Sami
2015/11/17 10:12:21
Looks like this could just be a regular OwnPtr, wh
alex clarke (OOO till 29th)
2015/11/23 17:13:46
As discussed I ended up adding a new method to exp
| |
| 115 web_view_scheduler_->createFrameScheduler()); | |
| 116 | |
| 117 int run_count = 0; | |
| 118 frame.get()->timerTaskRunner()->postDelayedTask( | |
| 119 BLINK_FROM_HERE, | |
| 120 new RepeatingTask(frame.get()->timerTaskRunner(), &run_count), 1.0); | |
| 121 | |
| 122 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | |
| 123 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | |
| 124 EXPECT_EQ(1000, run_count); | |
| 125 } | |
| 126 | |
| 127 TEST_F(WebViewSchedulerImplTest, RepeatingTimer_PageInBackground) { | |
| 128 web_view_scheduler_->setPageInBackground(true); | |
| 129 | |
| 130 blink::WebPassOwnPtr<blink::WebFrameScheduler> frame( | |
| 131 web_view_scheduler_->createFrameScheduler()); | |
| 132 | |
| 133 int run_count = 0; | |
| 134 frame.get()->timerTaskRunner()->postDelayedTask( | |
| 135 BLINK_FROM_HERE, | |
| 136 new RepeatingTask(frame.get()->timerTaskRunner(), &run_count), 1.0); | |
| 137 | |
| 138 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | |
| 139 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | |
| 140 EXPECT_EQ(1, run_count); | |
| 141 } | |
| 142 | |
| 143 TEST_F(WebViewSchedulerImplTest, RepeatingLoadingTask_PageInBackground) { | |
| 144 web_view_scheduler_->setPageInBackground(true); | |
| 145 | |
| 146 blink::WebPassOwnPtr<blink::WebFrameScheduler> frame( | |
| 147 web_view_scheduler_->createFrameScheduler()); | |
| 148 | |
| 149 int run_count = 0; | |
| 150 frame.get()->loadingTaskRunner()->postDelayedTask( | |
| 151 BLINK_FROM_HERE, | |
| 152 new RepeatingTask(frame.get()->loadingTaskRunner(), &run_count), 1.0); | |
| 153 | |
| 154 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | |
| 155 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | |
| 156 EXPECT_EQ(1000, run_count); // Loading tasks should not be throttled | |
| 157 } | |
| 158 | |
| 60 } // namespace scheduler | 159 } // namespace scheduler |
| OLD | NEW |