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

Side by Side Diff: third_party/WebKit/Source/platform/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: Rebased Created 4 years, 3 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 "platform/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 "platform/RuntimeEnabledFeatures.h"
14 #include "platform/scheduler/base/test_time_source.h"
15 #include "platform/scheduler/child/scheduler_tqm_delegate_for_test.h"
16 #include "platform/scheduler/renderer/renderer_scheduler_impl.h"
17 #include "platform/scheduler/renderer/web_view_scheduler_impl.h"
18 #include "public/platform/WebTaskRunner.h"
19 #include "public/platform/WebTraceLocation.h"
20 #include "testing/gtest/include/gtest/gtest.h"
21
22 namespace blink {
23 namespace scheduler {
24
25 class WebFrameSchedulerImplTest : public testing::Test {
26 public:
27 WebFrameSchedulerImplTest() {}
28 ~WebFrameSchedulerImplTest() override {}
29
30 void SetUp() override {
31 clock_.reset(new base::SimpleTestTickClock());
32 clock_->Advance(base::TimeDelta::FromMicroseconds(5000));
33 mock_task_runner_ =
34 make_scoped_refptr(new cc::OrderedSimpleTaskRunner(clock_.get(), true));
35 delegate_ = SchedulerTqmDelegateForTest::Create(
36 mock_task_runner_, base::WrapUnique(new TestTimeSource(clock_.get())));
37 scheduler_.reset(new RendererSchedulerImpl(delegate_));
38 web_view_scheduler_.reset(new WebViewSchedulerImpl(
39 nullptr, scheduler_.get(), false));
40 web_frame_scheduler_ =
41 web_view_scheduler_->createWebFrameSchedulerImpl(nullptr);
42 }
43
44 void TearDown() override {
45 web_frame_scheduler_.reset();
46 web_view_scheduler_.reset();
47 scheduler_->Shutdown();
48 scheduler_.reset();
49 }
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 RuntimeEnabledFeatures::setTimerThrottlingForHiddenFramesEnabled(true);
81
82 int run_count = 0;
83 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
84 BLINK_FROM_HERE,
85 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
86 1.0);
87
88 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
89 EXPECT_EQ(1000, run_count);
90 }
91
92 TEST_F(WebFrameSchedulerImplTest, RepeatingTimer_PageInBackground) {
93 RuntimeEnabledFeatures::setTimerThrottlingForHiddenFramesEnabled(true);
94 web_view_scheduler_->setPageVisible(false);
95
96 int run_count = 0;
97 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
98 BLINK_FROM_HERE,
99 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
100 1.0);
101
102 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
103 EXPECT_EQ(1, run_count);
104 }
105
106 TEST_F(WebFrameSchedulerImplTest, RepeatingTimer_FrameHidden_SameOrigin) {
107 RuntimeEnabledFeatures::setTimerThrottlingForHiddenFramesEnabled(true);
108 web_frame_scheduler_->setFrameVisible(false);
109
110 int run_count = 0;
111 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
112 BLINK_FROM_HERE,
113 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
114 1.0);
115
116 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
117 EXPECT_EQ(1000, run_count);
118 }
119
120 TEST_F(WebFrameSchedulerImplTest, RepeatingTimer_FrameVisible_CrossOrigin) {
121 RuntimeEnabledFeatures::setTimerThrottlingForHiddenFramesEnabled(true);
122 web_frame_scheduler_->setFrameVisible(true);
123 web_frame_scheduler_->setCrossOrigin(true);
124
125 int run_count = 0;
126 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
127 BLINK_FROM_HERE,
128 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
129 1.0);
130
131 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
132 EXPECT_EQ(1000, run_count);
133 }
134
135 TEST_F(WebFrameSchedulerImplTest, RepeatingTimer_FrameHidden_CrossOrigin) {
136 RuntimeEnabledFeatures::setTimerThrottlingForHiddenFramesEnabled(true);
137 web_frame_scheduler_->setFrameVisible(false);
138 web_frame_scheduler_->setCrossOrigin(true);
139
140 int run_count = 0;
141 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
142 BLINK_FROM_HERE,
143 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
144 1.0);
145
146 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
147 EXPECT_EQ(1, run_count);
148 }
149
150 TEST_F(WebFrameSchedulerImplTest, PageInBackground_ThrottlingDisabled) {
151 RuntimeEnabledFeatures::setTimerThrottlingForHiddenFramesEnabled(false);
152 web_view_scheduler_->setPageVisible(false);
153
154 int run_count = 0;
155 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
156 BLINK_FROM_HERE,
157 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
158 1.0);
159
160 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
161 EXPECT_EQ(1, run_count);
162 }
163
164 TEST_F(WebFrameSchedulerImplTest, RepeatingTimer_FrameHidden_CrossOrigin_Throttl ingDisabled) {
165 RuntimeEnabledFeatures::setTimerThrottlingForHiddenFramesEnabled(false);
166 web_frame_scheduler_->setFrameVisible(false);
167 web_frame_scheduler_->setCrossOrigin(true);
168
169 int run_count = 0;
170 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
171 BLINK_FROM_HERE,
172 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
173 1.0);
174
175 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
176 EXPECT_EQ(1000, run_count);
177 }
178
179 } // namespace scheduler
180 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698