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

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: Remove tricky to fix but redundant layout test 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/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 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 int run_count = 0; 103 int run_count = 0;
104 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( 104 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
105 BLINK_FROM_HERE, 105 BLINK_FROM_HERE,
106 makeRepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count), 106 makeRepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
107 1.0); 107 1.0);
108 108
109 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); 109 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
110 EXPECT_EQ(1000, run_count); 110 EXPECT_EQ(1000, run_count);
111 } 111 }
112 112
113 TEST_F(WebViewSchedulerImplTest, RepeatingTimer_PageInBackground) { 113 TEST_F(WebViewSchedulerImplTest,
114 RepeatingTimer_PageInBackgroundThenForeground) {
114 web_view_scheduler_->setPageVisible(false); 115 web_view_scheduler_->setPageVisible(false);
115 116
116 int run_count = 0; 117 int run_count = 0;
117 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( 118 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
118 BLINK_FROM_HERE, 119 BLINK_FROM_HERE,
119 makeRepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count), 120 makeRepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
120 1.0); 121 1.0);
121 122
122 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); 123 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
124 EXPECT_EQ(1000, run_count);
125
126 // The task queue isn't throttled at all until it's been in the background for
127 // a 10 second grace period.
128 clock_->Advance(base::TimeDelta::FromSeconds(10));
129
130 run_count = 0;
131 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
123 EXPECT_EQ(1, run_count); 132 EXPECT_EQ(1, run_count);
133
134 // Make sure there's no delay in throttling being removed for pages that have
135 // become visible.
136 web_view_scheduler_->setPageVisible(true);
137
138 run_count = 0;
139 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
140 EXPECT_EQ(1001, run_count); // Note we end up running 1001 here because the
141 // task was posted while throttled with a delay of 1ms so the first task was
142 // due to run before the 1s period started.
124 } 143 }
125 144
126 TEST_F(WebViewSchedulerImplTest, RepeatingLoadingTask_PageInBackground) { 145 TEST_F(WebViewSchedulerImplTest, RepeatingLoadingTask_PageInBackground) {
127 web_view_scheduler_->setPageVisible(false); 146 web_view_scheduler_->setPageVisible(false);
128 147
129 int run_count = 0; 148 int run_count = 0;
130 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask( 149 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask(
131 BLINK_FROM_HERE, 150 BLINK_FROM_HERE,
132 makeRepeatingTask(web_frame_scheduler_->loadingTaskRunner(), &run_count), 151 makeRepeatingTask(web_frame_scheduler_->loadingTaskRunner(), &run_count),
133 1.0); 152 1.0);
134 153
135 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); 154 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
136 EXPECT_EQ(1000, run_count); // Loading tasks should not be throttled 155 EXPECT_EQ(1000, run_count); // Loading tasks should not be throttled
137 } 156 }
138 157
139 TEST_F(WebViewSchedulerImplTest, RepeatingTimers_OneBackgroundOneForeground) { 158 TEST_F(WebViewSchedulerImplTest, RepeatingTimers_OneBackgroundOneForeground) {
140 std::unique_ptr<WebViewSchedulerImpl> web_view_scheduler2( 159 std::unique_ptr<WebViewSchedulerImpl> web_view_scheduler2(
141 new WebViewSchedulerImpl(nullptr, nullptr, scheduler_.get(), false)); 160 new WebViewSchedulerImpl(nullptr, nullptr, scheduler_.get(), false));
142 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler2 = 161 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler2 =
143 web_view_scheduler2->createWebFrameSchedulerImpl(nullptr); 162 web_view_scheduler2->createWebFrameSchedulerImpl(nullptr);
144 163
145 web_view_scheduler_->setPageVisible(true); 164 web_view_scheduler_->setPageVisible(true);
146 web_view_scheduler2->setPageVisible(false); 165 web_view_scheduler2->setPageVisible(false);
147 166
167 // Advance past the no-throttling grace period.
168 clock_->Advance(base::TimeDelta::FromSeconds(10));
169
148 int run_count1 = 0; 170 int run_count1 = 0;
149 int run_count2 = 0; 171 int run_count2 = 0;
150 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( 172 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
151 BLINK_FROM_HERE, 173 BLINK_FROM_HERE,
152 makeRepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count1), 174 makeRepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count1),
153 1.0); 175 1.0);
154 web_frame_scheduler2->timerTaskRunner()->postDelayedTask( 176 web_frame_scheduler2->timerTaskRunner()->postDelayedTask(
155 BLINK_FROM_HERE, 177 BLINK_FROM_HERE,
156 makeRepeatingTask(web_frame_scheduler2->timerTaskRunner(), &run_count2), 178 makeRepeatingTask(web_frame_scheduler2->timerTaskRunner(), &run_count2),
157 1.0); 179 1.0);
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 nullptr, &web_view_scheduler_settings, scheduler_.get(), false)); 600 nullptr, &web_view_scheduler_settings, scheduler_.get(), false));
579 web_frame_scheduler_ = 601 web_frame_scheduler_ =
580 web_view_scheduler_->createWebFrameSchedulerImpl(nullptr); 602 web_view_scheduler_->createWebFrameSchedulerImpl(nullptr);
581 web_view_scheduler_->setPageVisible(false); 603 web_view_scheduler_->setPageVisible(false);
582 604
583 mock_task_runner_->RunUntilTime(base::TimeTicks() + 605 mock_task_runner_->RunUntilTime(base::TimeTicks() +
584 base::TimeDelta::FromMilliseconds(2500)); 606 base::TimeDelta::FromMilliseconds(2500));
585 607
586 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( 608 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
587 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), 609 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times),
588 0.1); 610 1);
589 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( 611 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
590 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), 612 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times),
591 0.1); 613 1);
592 614
593 mock_task_runner_->RunUntilTime(base::TimeTicks() + 615 mock_task_runner_->RunUntilTime(base::TimeTicks() +
594 base::TimeDelta::FromMilliseconds(3500)); 616 base::TimeDelta::FromMilliseconds(3500));
595 617
596 // Check that these tasks are aligned, but are not subject to 618 // Check that these tasks are initially unthrottled.
597 // budget-based throttling.
598 EXPECT_THAT( 619 EXPECT_THAT(
599 run_times, 620 run_times,
600 ElementsAre(base::TimeTicks() + base::TimeDelta::FromMilliseconds(3000), 621 ElementsAre(base::TimeTicks() + base::TimeDelta::FromMilliseconds(2501),
601 base::TimeTicks() + base::TimeDelta::FromMilliseconds(3250))); 622 base::TimeTicks() + base::TimeDelta::FromMilliseconds(2751)));
602 run_times.clear(); 623 run_times.clear();
603 624
604 mock_task_runner_->RunUntilTime(base::TimeTicks() + 625 mock_task_runner_->RunUntilTime(base::TimeTicks() +
605 base::TimeDelta::FromMilliseconds(11500)); 626 base::TimeDelta::FromMilliseconds(11500));
606 627
607 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( 628 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
608 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), 629 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times),
609 0.1); 630 1);
610 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( 631 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
611 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times), 632 BLINK_FROM_HERE, base::Bind(&ExpensiveTestTask, clock_.get(), &run_times),
612 0.1); 633 1);
613 634
614 mock_task_runner_->RunUntilIdle(); 635 mock_task_runner_->RunUntilIdle();
615 636
616 // Check that tasks are aligned and throttled. 637 // After the grace period has passed, tasks should be aligned and have budget
638 // based throttling.
617 EXPECT_THAT( 639 EXPECT_THAT(
618 run_times, 640 run_times,
619 ElementsAre(base::TimeTicks() + base::TimeDelta::FromSeconds(12), 641 ElementsAre(base::TimeTicks() + base::TimeDelta::FromSeconds(12),
620 base::TimeTicks() + base::TimeDelta::FromSeconds(29))); 642 base::TimeTicks() + base::TimeDelta::FromSeconds(26)));
621 } 643 }
622 644
623 } // namespace scheduler 645 } // namespace scheduler
624 } // namespace blink 646 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698