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

Side by Side Diff: components/scheduler/renderer/web_frame_scheduler_impl_unittest.cc

Issue 2023033003: scheduler: Throttle timers in out-of-view frames (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add cross origin check, tests Created 4 years, 5 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
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/scheduler/renderer/web_frame_scheduler_impl.h"
6
7 #include <memory>
8
9 #include "base/callback.h"
10 #include "base/memory/ptr_util.h"
11 #include "base/test/simple_test_tick_clock.h"
12 #include "cc/test/ordered_simple_task_runner.h"
13 #include "components/scheduler/base/test_time_source.h"
14 #include "components/scheduler/child/scheduler_tqm_delegate_for_test.h"
15 #include "components/scheduler/renderer/renderer_scheduler_impl.h"
16 #include "components/scheduler/renderer/web_view_scheduler_impl.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18 #include "third_party/WebKit/public/platform/WebTaskRunner.h"
19 #include "third_party/WebKit/public/platform/WebTraceLocation.h"
20
21 namespace scheduler {
22
23 class WebFrameSchedulerImplTest : public testing::Test {
24 public:
25 WebFrameSchedulerImplTest() {}
26 ~WebFrameSchedulerImplTest() override {}
27
28 void SetUp() override {
29 clock_.reset(new base::SimpleTestTickClock());
30 clock_->Advance(base::TimeDelta::FromMicroseconds(5000));
31 mock_task_runner_ =
32 make_scoped_refptr(new cc::OrderedSimpleTaskRunner(clock_.get(), true));
33 delegate_ = SchedulerTqmDelegateForTest::Create(
34 mock_task_runner_, base::WrapUnique(new TestTimeSource(clock_.get())));
35 scheduler_.reset(new RendererSchedulerImpl(delegate_));
36 web_view_scheduler_.reset(new WebViewSchedulerImpl(
37 nullptr, scheduler_.get(), false, AllowHiddenTimerThrottling()));
38 web_frame_scheduler_ =
39 web_view_scheduler_->createWebFrameSchedulerImpl(nullptr);
40 }
41
42 void TearDown() override {
43 web_frame_scheduler_.reset();
44 web_view_scheduler_.reset();
45 scheduler_->Shutdown();
46 scheduler_.reset();
47 }
48
49 virtual bool AllowHiddenTimerThrottling() const { return true; }
50
51 std::unique_ptr<base::SimpleTestTickClock> clock_;
52 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_;
53 scoped_refptr<SchedulerTqmDelegate> delegate_;
54 std::unique_ptr<RendererSchedulerImpl> scheduler_;
55 std::unique_ptr<WebViewSchedulerImpl> web_view_scheduler_;
56 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler_;
57 };
58
59 namespace {
60 class RepeatingTask : public blink::WebTaskRunner::Task {
61 public:
62 RepeatingTask(blink::WebTaskRunner* web_task_runner, int* run_count)
63 : web_task_runner_(web_task_runner), run_count_(run_count) {}
64
65 ~RepeatingTask() override {}
66
67 void run() override {
68 (*run_count_)++;
69 web_task_runner_->postDelayedTask(
70 BLINK_FROM_HERE, new RepeatingTask(web_task_runner_, run_count_), 1.0);
71 }
72
73 private:
74 blink::WebTaskRunner* web_task_runner_; // NOT OWNED
75 int* run_count_; // NOT OWNED
76 };
77 } // namespace
78
79 TEST_F(WebFrameSchedulerImplTest, RepeatingTimer_PageInForeground) {
80 int run_count = 0;
81 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
82 BLINK_FROM_HERE,
83 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
84 1.0);
85
86 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
87 EXPECT_EQ(1000, run_count);
88 }
89
90 TEST_F(WebFrameSchedulerImplTest, RepeatingTimer_PageInBackground) {
91 web_view_scheduler_->setPageVisible(false);
92
93 int run_count = 0;
94 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
95 BLINK_FROM_HERE,
96 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
97 1.0);
98
99 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
100 EXPECT_EQ(1, run_count);
101 }
102
103 TEST_F(WebFrameSchedulerImplTest, RepeatingTimer_FrameHidden_SameOrigin) {
104 web_frame_scheduler_->setFrameVisible(false);
105
106 int run_count = 0;
107 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
108 BLINK_FROM_HERE,
109 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
110 1.0);
111
112 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
113 EXPECT_EQ(1000, run_count);
114 }
115
116 TEST_F(WebFrameSchedulerImplTest, RepeatingTimer_FrameVisible_CrossOrigin) {
117 web_frame_scheduler_->setFrameVisible(true);
118 web_frame_scheduler_->setCrossOrigin(true);
119
120 int run_count = 0;
121 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
122 BLINK_FROM_HERE,
123 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
124 1.0);
125
126 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
127 EXPECT_EQ(1000, run_count);
128 }
129
130 TEST_F(WebFrameSchedulerImplTest, RepeatingTimer_FrameHidden_CrossOrigin) {
131 web_frame_scheduler_->setFrameVisible(false);
132 web_frame_scheduler_->setCrossOrigin(true);
133
134 int run_count = 0;
135 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
136 BLINK_FROM_HERE,
137 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
138 1.0);
139
140 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
141 EXPECT_EQ(1, run_count);
142 }
143
144 class WebFrameSchedulerImplTestWithDisabledHiddenTimerThrottling
145 : public WebFrameSchedulerImplTest {
146 public:
147 WebFrameSchedulerImplTestWithDisabledHiddenTimerThrottling() {}
148 ~WebFrameSchedulerImplTestWithDisabledHiddenTimerThrottling() override {}
149
150 bool AllowHiddenTimerThrottling() const override { return false; }
151 };
152
153 TEST_F(WebFrameSchedulerImplTestWithDisabledHiddenTimerThrottling,
154 PageInBackground) {
155 web_view_scheduler_->setPageVisible(false);
156
157 int run_count = 0;
158 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
159 BLINK_FROM_HERE,
160 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
161 1.0);
162
163 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
164 EXPECT_EQ(1, run_count);
165 }
166
167 TEST_F(WebFrameSchedulerImplTestWithDisabledHiddenTimerThrottling,
168 RepeatingTimer_FrameHidden_CrossOrigin) {
169 web_frame_scheduler_->setFrameVisible(false);
170 web_frame_scheduler_->setCrossOrigin(true);
171
172 int run_count = 0;
173 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
174 BLINK_FROM_HERE,
175 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
176 1.0);
177
178 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
179 EXPECT_EQ(1000, run_count);
180 }
181
182 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698