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

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl_unittest.cc

Issue 2620743002: Don't throttle web views until they've been in the background for 10s (Closed)
Patch Set: Fix asan test issue 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
« no previous file with comments | « third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/scheduler/renderer/web_view_scheduler_impl.h" 5 #include "platform/scheduler/renderer/web_view_scheduler_impl.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 int run_count = 0; 106 int run_count = 0;
107 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( 107 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
108 BLINK_FROM_HERE, 108 BLINK_FROM_HERE,
109 makeRepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count), 109 makeRepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
110 1.0); 110 1.0);
111 111
112 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); 112 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
113 EXPECT_EQ(1000, run_count); 113 EXPECT_EQ(1000, run_count);
114 } 114 }
115 115
116 TEST_F(WebViewSchedulerImplTest, RepeatingTimer_PageInBackground) { 116 TEST_F(WebViewSchedulerImplTest,
117 RepeatingTimer_PageInBackgroundThenForeground) {
117 web_view_scheduler_->setPageVisible(false); 118 web_view_scheduler_->setPageVisible(false);
118 119
119 int run_count = 0; 120 int run_count = 0;
120 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( 121 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
121 BLINK_FROM_HERE, 122 BLINK_FROM_HERE,
122 makeRepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count), 123 makeRepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
123 1.0); 124 1.0);
124 125
125 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); 126 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
127 EXPECT_EQ(1000, run_count);
128
129 // The task queue isn't throttled at all until it's been in the background for
130 // a 10 second grace period.
131 clock_->Advance(base::TimeDelta::FromSeconds(10));
132
133 run_count = 0;
134 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
126 EXPECT_EQ(1, run_count); 135 EXPECT_EQ(1, run_count);
136
137 // Make sure there's no delay in throttling being removed for pages that have
138 // become visible.
139 web_view_scheduler_->setPageVisible(true);
140
141 run_count = 0;
142 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
143 EXPECT_EQ(1001, run_count); // Note we end up running 1001 here because the
144 // task was posted while throttled with a delay of 1ms so the first task was
145 // due to run before the 1s period started.
146 }
147
148 TEST_F(WebViewSchedulerImplTest, GracePeriodAppliesToNewBackgroundFrames) {
149 web_view_scheduler_->setPageVisible(false);
150
151 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler =
152 web_view_scheduler_->createWebFrameSchedulerImpl(nullptr);
153 blink::WebTaskRunner* timer_task_runner =
154 web_frame_scheduler->timerTaskRunner().get();
155
156 int run_count = 0;
157 timer_task_runner->postDelayedTask(
158 BLINK_FROM_HERE,
159 makeRepeatingTask(web_frame_scheduler->timerTaskRunner(), &run_count),
160 1.0);
161
162 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
163 EXPECT_EQ(1000, run_count);
164
165 // The task queue isn't throttled at all until it's been in the background for
166 // a 10 second grace period.
167 clock_->Advance(base::TimeDelta::FromSeconds(10));
168
169 run_count = 0;
170 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
171 EXPECT_EQ(1, run_count);
172
173 // Make sure there's no delay in throttling being removed for pages that have
174 // become visible.
175 web_view_scheduler_->setPageVisible(true);
176
177 run_count = 0;
178 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
179 EXPECT_EQ(1001, run_count); // Note we end up running 1001 here because the
180 // task was posted while throttled with a delay of 1ms so the first task was
181 // due to run before the 1s period started.
127 } 182 }
128 183
129 TEST_F(WebViewSchedulerImplTest, RepeatingLoadingTask_PageInBackground) { 184 TEST_F(WebViewSchedulerImplTest, RepeatingLoadingTask_PageInBackground) {
130 web_view_scheduler_->setPageVisible(false); 185 web_view_scheduler_->setPageVisible(false);
131 186
132 int run_count = 0; 187 int run_count = 0;
133 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask( 188 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask(
134 BLINK_FROM_HERE, 189 BLINK_FROM_HERE,
135 makeRepeatingTask(web_frame_scheduler_->loadingTaskRunner(), &run_count), 190 makeRepeatingTask(web_frame_scheduler_->loadingTaskRunner(), &run_count),
136 1.0); 191 1.0);
137 192
138 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); 193 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
139 EXPECT_EQ(1000, run_count); // Loading tasks should not be throttled 194 EXPECT_EQ(1000, run_count); // Loading tasks should not be throttled
140 } 195 }
141 196
142 TEST_F(WebViewSchedulerImplTest, RepeatingTimers_OneBackgroundOneForeground) { 197 TEST_F(WebViewSchedulerImplTest, RepeatingTimers_OneBackgroundOneForeground) {
143 std::unique_ptr<WebViewSchedulerImpl> web_view_scheduler2( 198 std::unique_ptr<WebViewSchedulerImpl> web_view_scheduler2(
144 new WebViewSchedulerImpl(nullptr, nullptr, scheduler_.get(), false)); 199 new WebViewSchedulerImpl(nullptr, nullptr, scheduler_.get(), false));
145 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler2 = 200 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler2 =
146 web_view_scheduler2->createWebFrameSchedulerImpl(nullptr); 201 web_view_scheduler2->createWebFrameSchedulerImpl(nullptr);
147 202
148 web_view_scheduler_->setPageVisible(true); 203 web_view_scheduler_->setPageVisible(true);
149 web_view_scheduler2->setPageVisible(false); 204 web_view_scheduler2->setPageVisible(false);
150 205
206 // Advance past the no-throttling grace period.
207 clock_->Advance(base::TimeDelta::FromSeconds(10));
208
151 int run_count1 = 0; 209 int run_count1 = 0;
152 int run_count2 = 0; 210 int run_count2 = 0;
153 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( 211 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
154 BLINK_FROM_HERE, 212 BLINK_FROM_HERE,
155 makeRepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count1), 213 makeRepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count1),
156 1.0); 214 1.0);
157 web_frame_scheduler2->timerTaskRunner()->postDelayedTask( 215 web_frame_scheduler2->timerTaskRunner()->postDelayedTask(
158 BLINK_FROM_HERE, 216 BLINK_FROM_HERE,
159 makeRepeatingTask(web_frame_scheduler2->timerTaskRunner(), &run_count2), 217 makeRepeatingTask(web_frame_scheduler2->timerTaskRunner(), &run_count2),
160 1.0); 218 1.0);
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 489
432 TEST_F(WebViewSchedulerImplTest, DeleteWebViewScheduler_InTask) { 490 TEST_F(WebViewSchedulerImplTest, DeleteWebViewScheduler_InTask) {
433 web_frame_scheduler_->timerTaskRunner()->postTask( 491 web_frame_scheduler_->timerTaskRunner()->postTask(
434 BLINK_FROM_HERE, makeDeletionTask(web_view_scheduler_.release())); 492 BLINK_FROM_HERE, makeDeletionTask(web_view_scheduler_.release()));
435 mock_task_runner_->RunUntilIdle(); 493 mock_task_runner_->RunUntilIdle();
436 } 494 }
437 495
438 TEST_F(WebViewSchedulerImplTest, DeleteThrottledQueue_InTask) { 496 TEST_F(WebViewSchedulerImplTest, DeleteThrottledQueue_InTask) {
439 web_view_scheduler_->setPageVisible(false); 497 web_view_scheduler_->setPageVisible(false);
440 498
499 // The task queue isn't throttled at all until it's been in the background for
500 // a 10 second grace period.
501 clock_->Advance(base::TimeDelta::FromSeconds(10));
502
441 WebFrameSchedulerImpl* web_frame_scheduler = 503 WebFrameSchedulerImpl* web_frame_scheduler =
442 web_view_scheduler_->createWebFrameSchedulerImpl(nullptr).release(); 504 web_view_scheduler_->createWebFrameSchedulerImpl(nullptr).release();
443 RefPtr<blink::WebTaskRunner> timer_task_runner = 505 RefPtr<blink::WebTaskRunner> timer_task_runner =
444 web_frame_scheduler->timerTaskRunner(); 506 web_frame_scheduler->timerTaskRunner();
445 507
446 int run_count = 0; 508 int run_count = 0;
447 timer_task_runner->postDelayedTask( 509 timer_task_runner->postDelayedTask(
448 BLINK_FROM_HERE, makeRepeatingTask(timer_task_runner, &run_count), 1.0); 510 BLINK_FROM_HERE, makeRepeatingTask(timer_task_runner, &run_count), 1.0);
449 511
450 // Note this will run at time t = 10s since we start at time t = 5000us, and 512 // Note this will run at time t = 10s since we start at time t = 5000us, and
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 nullptr, &web_view_scheduler_settings, scheduler_.get(), false)); 643 nullptr, &web_view_scheduler_settings, scheduler_.get(), false));
582 web_frame_scheduler_ = 644 web_frame_scheduler_ =
583 web_view_scheduler_->createWebFrameSchedulerImpl(nullptr); 645 web_view_scheduler_->createWebFrameSchedulerImpl(nullptr);
584 web_view_scheduler_->setPageVisible(false); 646 web_view_scheduler_->setPageVisible(false);
585 647
586 mock_task_runner_->RunUntilTime(base::TimeTicks() + 648 mock_task_runner_->RunUntilTime(base::TimeTicks() +
587 base::TimeDelta::FromMilliseconds(2500)); 649 base::TimeDelta::FromMilliseconds(2500));
588 650
589 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( 651 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
590 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), 652 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times),
591 0.1); 653 1);
592 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( 654 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
593 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), 655 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times),
594 0.1); 656 1);
595 657
596 mock_task_runner_->RunUntilTime(base::TimeTicks() + 658 mock_task_runner_->RunUntilTime(base::TimeTicks() +
597 base::TimeDelta::FromMilliseconds(3500)); 659 base::TimeDelta::FromMilliseconds(3500));
598 660
599 // Check that these tasks are aligned, but are not subject to 661 // Check that these tasks are initially unthrottled.
600 // budget-based throttling.
601 EXPECT_THAT( 662 EXPECT_THAT(
602 run_times, 663 run_times,
603 ElementsAre(base::TimeTicks() + base::TimeDelta::FromMilliseconds(3000), 664 ElementsAre(base::TimeTicks() + base::TimeDelta::FromMilliseconds(2501),
604 base::TimeTicks() + base::TimeDelta::FromMilliseconds(3250))); 665 base::TimeTicks() + base::TimeDelta::FromMilliseconds(2751)));
605 run_times.clear(); 666 run_times.clear();
606 667
607 mock_task_runner_->RunUntilTime(base::TimeTicks() + 668 mock_task_runner_->RunUntilTime(base::TimeTicks() +
608 base::TimeDelta::FromMilliseconds(11500)); 669 base::TimeDelta::FromMilliseconds(11500));
609 670
610 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( 671 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
611 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), 672 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times),
612 0.1); 673 1);
613 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( 674 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
614 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), 675 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times),
615 0.1); 676 1);
616 677
617 mock_task_runner_->RunUntilIdle(); 678 mock_task_runner_->RunUntilIdle();
618 679
619 // Check that tasks are aligned and throttled. 680 // After the grace period has passed, tasks should be aligned and have budget
681 // based throttling.
620 EXPECT_THAT( 682 EXPECT_THAT(
621 run_times, 683 run_times,
622 ElementsAre(base::TimeTicks() + base::TimeDelta::FromSeconds(12), 684 ElementsAre(base::TimeTicks() + base::TimeDelta::FromSeconds(12),
623 base::TimeTicks() + base::TimeDelta::FromSeconds(29))); 685 base::TimeTicks() + base::TimeDelta::FromSeconds(26)));
624 } 686 }
625 687
626 } // namespace scheduler 688 } // namespace scheduler
627 } // namespace blink 689 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698