| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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 "cc/scheduler/begin_frame_source.h" | 5 #include "cc/scheduler/begin_frame_source.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "base/test/test_simple_task_runner.h" | 10 #include "base/test/test_simple_task_runner.h" |
| 11 #include "cc/test/begin_frame_args_test.h" | 11 #include "cc/test/begin_frame_args_test.h" |
| 12 #include "cc/test/begin_frame_source_test.h" | 12 #include "cc/test/begin_frame_source_test.h" |
| 13 #include "cc/test/scheduler_test_common.h" | 13 #include "cc/test/scheduler_test_common.h" |
| 14 #include "testing/gmock/include/gmock/gmock.h" | 14 #include "testing/gmock/include/gmock/gmock.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 16 | 16 |
| 17 using testing::StrictMock; | 17 using testing::StrictMock; |
| 18 | 18 |
| 19 namespace cc { | 19 namespace cc { |
| 20 namespace { | 20 namespace { |
| 21 | 21 |
| 22 class BackToBackBeginFrameSourceTest : public ::testing::Test { | 22 class BackToBackBeginFrameSourceTest : public ::testing::Test { |
| 23 protected: | 23 protected: |
| 24 static const int64_t kDeadline; | 24 static const int64_t kDeadline; |
| 25 static const int64_t kInterval; | 25 static const int64_t kInterval; |
| 26 | 26 |
| 27 void SetUp() override { | 27 void SetUp() override { |
| 28 now_src_.reset(new base::SimpleTestTickClock()); | 28 now_src_ = base::MakeUnique<base::SimpleTestTickClock>(); |
| 29 now_src_->Advance(base::TimeDelta::FromMicroseconds(1000)); | 29 now_src_->Advance(base::TimeDelta::FromMicroseconds(1000)); |
| 30 task_runner_ = | 30 task_runner_ = |
| 31 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_.get(), false)); | 31 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_.get(), false)); |
| 32 std::unique_ptr<TestDelayBasedTimeSource> time_source( | 32 source_.reset( |
| 33 new TestDelayBasedTimeSource(now_src_.get(), task_runner_.get())); | 33 new BackToBackBeginFrameSource(task_runner_.get(), now_src_.get())); |
| 34 source_.reset(new BackToBackBeginFrameSource(std::move(time_source))); | |
| 35 obs_ = base::WrapUnique(new ::testing::StrictMock<MockBeginFrameObserver>); | 34 obs_ = base::WrapUnique(new ::testing::StrictMock<MockBeginFrameObserver>); |
| 36 } | 35 } |
| 37 | 36 |
| 38 void TearDown() override { obs_.reset(); } | 37 void TearDown() override { obs_.reset(); } |
| 39 | 38 |
| 40 std::unique_ptr<base::SimpleTestTickClock> now_src_; | 39 std::unique_ptr<base::SimpleTestTickClock> now_src_; |
| 41 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; | 40 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; |
| 42 std::unique_ptr<BackToBackBeginFrameSource> source_; | 41 std::unique_ptr<BackToBackBeginFrameSource> source_; |
| 43 std::unique_ptr<MockBeginFrameObserver> obs_; | 42 std::unique_ptr<MockBeginFrameObserver> obs_; |
| 44 }; | 43 }; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 source_->RemoveObserver(obs_.get()); | 104 source_->RemoveObserver(obs_.get()); |
| 106 | 105 |
| 107 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); | 106 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); |
| 108 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 107 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 109 source_->AddObserver(obs_.get()); | 108 source_->AddObserver(obs_.get()); |
| 110 | 109 |
| 111 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); | 110 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); |
| 112 source_->DidFinishFrame(obs_.get(), 0); | 111 source_->DidFinishFrame(obs_.get(), 0); |
| 113 | 112 |
| 114 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); | 113 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); |
| 115 // The begin frame is posted at the time when the observer was added, | 114 EXPECT_BEGIN_FRAME_USED(*obs_, 1130, 1130 + kDeadline, kInterval); |
| 116 // so it ignores changes to "now" afterward. | |
| 117 EXPECT_BEGIN_FRAME_USED(*obs_, 1110, 1110 + kDeadline, kInterval); | |
| 118 EXPECT_TRUE(task_runner_->HasPendingTasks()); | 115 EXPECT_TRUE(task_runner_->HasPendingTasks()); |
| 119 task_runner_->RunPendingTasks(); | 116 task_runner_->RunPendingTasks(); |
| 120 } | 117 } |
| 121 | 118 |
| 122 TEST_F(BackToBackBeginFrameSourceTest, | 119 TEST_F(BackToBackBeginFrameSourceTest, |
| 123 DidFinishFrameThenTogglingObserverProducesCorrectFrame) { | 120 DidFinishFrameThenTogglingObserverProducesCorrectFrame) { |
| 124 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 121 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 125 source_->AddObserver(obs_.get()); | 122 source_->AddObserver(obs_.get()); |
| 126 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 123 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); |
| 127 task_runner_->RunPendingTasks(); | 124 task_runner_->RunPendingTasks(); |
| 128 | 125 |
| 129 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 126 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
| 130 source_->DidFinishFrame(obs_.get(), 0); | 127 source_->DidFinishFrame(obs_.get(), 0); |
| 131 | 128 |
| 132 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); | 129 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); |
| 133 source_->RemoveObserver(obs_.get()); | 130 source_->RemoveObserver(obs_.get()); |
| 134 | 131 |
| 135 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); | 132 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); |
| 136 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 133 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 137 source_->AddObserver(obs_.get()); | 134 source_->AddObserver(obs_.get()); |
| 138 | 135 |
| 139 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); | 136 now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); |
| 140 // Ticks at the time at which the observer was added, ignoring the | 137 EXPECT_BEGIN_FRAME_USED(*obs_, 1130, 1130 + kDeadline, kInterval); |
| 141 // last change to "now". | |
| 142 EXPECT_BEGIN_FRAME_USED(*obs_, 1120, 1120 + kDeadline, kInterval); | |
| 143 EXPECT_TRUE(task_runner_->HasPendingTasks()); | 138 EXPECT_TRUE(task_runner_->HasPendingTasks()); |
| 144 task_runner_->RunPendingTasks(); | 139 task_runner_->RunPendingTasks(); |
| 145 } | 140 } |
| 146 | 141 |
| 147 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameNoObserver) { | 142 TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameNoObserver) { |
| 148 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 143 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 149 source_->AddObserver(obs_.get()); | 144 source_->AddObserver(obs_.get()); |
| 150 source_->RemoveObserver(obs_.get()); | 145 source_->RemoveObserver(obs_.get()); |
| 151 source_->DidFinishFrame(obs_.get(), 0); | 146 source_->DidFinishFrame(obs_.get(), 0); |
| 152 EXPECT_FALSE(task_runner_->RunPendingTasks()); | 147 EXPECT_FALSE(task_runner_->RunPendingTasks()); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 task_runner_->RunPendingTasks(); | 187 task_runner_->RunPendingTasks(); |
| 193 | 188 |
| 194 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 189 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
| 195 source_->DidFinishFrame(obs_.get(), 0); | 190 source_->DidFinishFrame(obs_.get(), 0); |
| 196 source_->DidFinishFrame(obs_.get(), 0); | 191 source_->DidFinishFrame(obs_.get(), 0); |
| 197 source_->DidFinishFrame(obs_.get(), 0); | 192 source_->DidFinishFrame(obs_.get(), 0); |
| 198 EXPECT_BEGIN_FRAME_USED(*obs_, 1200, 1200 + kDeadline, kInterval); | 193 EXPECT_BEGIN_FRAME_USED(*obs_, 1200, 1200 + kDeadline, kInterval); |
| 199 task_runner_->RunPendingTasks(); | 194 task_runner_->RunPendingTasks(); |
| 200 } | 195 } |
| 201 | 196 |
| 202 TEST_F(BackToBackBeginFrameSourceTest, DelayInPostedTaskProducesCorrectFrame) { | |
| 203 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | |
| 204 source_->AddObserver(obs_.get()); | |
| 205 EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | |
| 206 task_runner_->RunPendingTasks(); | |
| 207 | |
| 208 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | |
| 209 source_->DidFinishFrame(obs_.get(), 0); | |
| 210 now_src_->Advance(base::TimeDelta::FromMicroseconds(50)); | |
| 211 // Ticks at the time the last frame finished, so ignores the last change to | |
| 212 // "now". | |
| 213 EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval); | |
| 214 | |
| 215 EXPECT_TRUE(task_runner_->HasPendingTasks()); | |
| 216 task_runner_->RunPendingTasks(); | |
| 217 } | |
| 218 | |
| 219 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversSynchronized) { | 197 TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversSynchronized) { |
| 220 StrictMock<MockBeginFrameObserver> obs1, obs2; | 198 StrictMock<MockBeginFrameObserver> obs1, obs2; |
| 221 | 199 |
| 222 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); | 200 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); |
| 223 source_->AddObserver(&obs1); | 201 source_->AddObserver(&obs1); |
| 224 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); | 202 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); |
| 225 source_->AddObserver(&obs2); | 203 source_->AddObserver(&obs2); |
| 226 | 204 |
| 227 EXPECT_BEGIN_FRAME_USED(obs1, 1000, 1000 + kDeadline, kInterval); | 205 EXPECT_BEGIN_FRAME_USED(obs1, 1000, 1000 + kDeadline, kInterval); |
| 228 EXPECT_BEGIN_FRAME_USED(obs2, 1000, 1000 + kDeadline, kInterval); | 206 EXPECT_BEGIN_FRAME_USED(obs2, 1000, 1000 + kDeadline, kInterval); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 task_runner_->RunPendingTasks(); | 268 task_runner_->RunPendingTasks(); |
| 291 | 269 |
| 292 // |obs1| finishes first. | 270 // |obs1| finishes first. |
| 293 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 271 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
| 294 source_->DidFinishFrame(&obs1, 0); | 272 source_->DidFinishFrame(&obs1, 0); |
| 295 | 273 |
| 296 // |obs2| finishes also, before getting to the newly posted begin frame. | 274 // |obs2| finishes also, before getting to the newly posted begin frame. |
| 297 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 275 now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); |
| 298 source_->DidFinishFrame(&obs2, 0); | 276 source_->DidFinishFrame(&obs2, 0); |
| 299 | 277 |
| 300 // Because the begin frame source already ticked when |obs1| finished, | 278 EXPECT_BEGIN_FRAME_USED(obs1, 1200, 1200 + kDeadline, kInterval); |
| 301 // we see it as the frame time for both observers. | 279 EXPECT_BEGIN_FRAME_USED(obs2, 1200, 1200 + kDeadline, kInterval); |
| 302 EXPECT_BEGIN_FRAME_USED(obs1, 1100, 1100 + kDeadline, kInterval); | |
| 303 EXPECT_BEGIN_FRAME_USED(obs2, 1100, 1100 + kDeadline, kInterval); | |
| 304 task_runner_->RunPendingTasks(); | 280 task_runner_->RunPendingTasks(); |
| 305 | 281 |
| 306 source_->DidFinishFrame(&obs1, 0); | 282 source_->DidFinishFrame(&obs1, 0); |
| 307 source_->RemoveObserver(&obs1); | 283 source_->RemoveObserver(&obs1); |
| 308 source_->DidFinishFrame(&obs2, 0); | 284 source_->DidFinishFrame(&obs2, 0); |
| 309 source_->RemoveObserver(&obs2); | 285 source_->RemoveObserver(&obs2); |
| 310 } | 286 } |
| 311 | 287 |
| 312 // DelayBasedBeginFrameSource testing ------------------------------------------ | 288 // DelayBasedBeginFrameSource testing ------------------------------------------ |
| 313 class DelayBasedBeginFrameSourceTest : public ::testing::Test { | 289 class DelayBasedBeginFrameSourceTest : public ::testing::Test { |
| 314 public: | 290 public: |
| 315 std::unique_ptr<base::SimpleTestTickClock> now_src_; | 291 std::unique_ptr<base::SimpleTestTickClock> now_src_; |
| 316 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; | 292 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; |
| 317 std::unique_ptr<DelayBasedBeginFrameSource> source_; | 293 std::unique_ptr<DelayBasedBeginFrameSource> source_; |
| 318 std::unique_ptr<MockBeginFrameObserver> obs_; | 294 std::unique_ptr<MockBeginFrameObserver> obs_; |
| 319 | 295 |
| 320 void SetUp() override { | 296 void SetUp() override { |
| 321 now_src_.reset(new base::SimpleTestTickClock()); | 297 now_src_ = base::MakeUnique<base::SimpleTestTickClock>(); |
| 322 now_src_->Advance(base::TimeDelta::FromMicroseconds(1000)); | 298 now_src_->Advance(base::TimeDelta::FromMicroseconds(1000)); |
| 323 task_runner_ = | 299 task_runner_ = |
| 324 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_.get(), false)); | 300 make_scoped_refptr(new OrderedSimpleTaskRunner(now_src_.get(), false)); |
| 325 std::unique_ptr<DelayBasedTimeSource> time_source( | 301 source_.reset( |
| 326 new TestDelayBasedTimeSource(now_src_.get(), task_runner_.get())); | 302 new DelayBasedBeginFrameSource(task_runner_.get(), now_src_.get())); |
| 327 time_source->SetTimebaseAndInterval( | 303 source_->OnUpdateVSyncParameters(base::TimeTicks(), |
| 328 base::TimeTicks(), base::TimeDelta::FromMicroseconds(10000)); | 304 base::TimeDelta::FromMicroseconds(10000)); |
| 329 source_.reset(new DelayBasedBeginFrameSource(std::move(time_source))); | |
| 330 obs_.reset(new MockBeginFrameObserver); | 305 obs_.reset(new MockBeginFrameObserver); |
| 331 } | 306 } |
| 332 | 307 |
| 333 void TearDown() override { obs_.reset(); } | 308 void TearDown() override { obs_.reset(); } |
| 334 }; | 309 }; |
| 335 | 310 |
| 336 TEST_F(DelayBasedBeginFrameSourceTest, | 311 TEST_F(DelayBasedBeginFrameSourceTest, |
| 337 AddObserverCallsOnBeginFrameWithMissedTick) { | 312 AddObserverCallsOnBeginFrameWithMissedTick) { |
| 338 now_src_->Advance(base::TimeDelta::FromMicroseconds(9010)); | 313 now_src_->Advance(base::TimeDelta::FromMicroseconds(9010)); |
| 339 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 314 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 315 source_->AddObserver(obs_.get()); |
| 316 |
| 340 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 10000, 20000, 10000); | 317 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 10000, 20000, 10000); |
| 341 source_->AddObserver(obs_.get()); // Should cause the last tick to be sent | 318 task_runner_->RunPendingTasks(); // Should cause the last tick to be sent. |
| 342 // No tasks should need to be run for this to occur. | |
| 343 } | 319 } |
| 344 | 320 |
| 345 TEST_F(DelayBasedBeginFrameSourceTest, AddObserverCallsCausesOnBeginFrame) { | 321 TEST_F(DelayBasedBeginFrameSourceTest, AddObserverCallsCausesOnBeginFrame) { |
| 346 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 322 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); |
| 323 source_->AddObserver(obs_.get()); |
| 347 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 0, 10000, 10000); | 324 EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 0, 10000, 10000); |
| 348 source_->AddObserver(obs_.get()); | 325 task_runner_->RunPendingTasks(); |
| 349 EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue()); | 326 EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue()); |
| 350 | 327 |
| 351 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); | 328 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); |
| 352 now_src_->Advance(base::TimeDelta::FromMicroseconds(9010)); | 329 now_src_->Advance(base::TimeDelta::FromMicroseconds(9010)); |
| 353 task_runner_->RunPendingTasks(); | 330 task_runner_->RunPendingTasks(); |
| 354 } | 331 } |
| 355 | 332 |
| 356 TEST_F(DelayBasedBeginFrameSourceTest, BasicOperation) { | 333 TEST_F(DelayBasedBeginFrameSourceTest, BasicOperation) { |
| 357 task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 334 task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 358 | 335 |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 base::TimeDelta::FromInternalValue(10000)); | 445 base::TimeDelta::FromInternalValue(10000)); |
| 469 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); | 446 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); |
| 470 EXPECT_BEGIN_FRAME_USED(obs, 10000, 20000, 10000); | 447 EXPECT_BEGIN_FRAME_USED(obs, 10000, 20000, 10000); |
| 471 task_runner_->RunPendingTasks(); | 448 task_runner_->RunPendingTasks(); |
| 472 } | 449 } |
| 473 | 450 |
| 474 TEST_F(DelayBasedBeginFrameSourceTest, DoubleTickMissedFrame) { | 451 TEST_F(DelayBasedBeginFrameSourceTest, DoubleTickMissedFrame) { |
| 475 StrictMock<MockBeginFrameObserver> obs; | 452 StrictMock<MockBeginFrameObserver> obs; |
| 476 | 453 |
| 477 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | 454 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); |
| 455 source_->AddObserver(&obs); |
| 478 EXPECT_BEGIN_FRAME_USED_MISSED(obs, 0, 10000, 10000); | 456 EXPECT_BEGIN_FRAME_USED_MISSED(obs, 0, 10000, 10000); |
| 479 source_->AddObserver(&obs); | 457 task_runner_->RunPendingTasks(); |
| 480 source_->RemoveObserver(&obs); | 458 source_->RemoveObserver(&obs); |
| 481 | 459 |
| 482 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(5000), | 460 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(5000), |
| 483 base::TimeDelta::FromInternalValue(10000)); | 461 base::TimeDelta::FromInternalValue(10000)); |
| 484 now_src_->Advance(base::TimeDelta::FromInternalValue(4000)); | 462 now_src_->Advance(base::TimeDelta::FromInternalValue(4000)); |
| 485 | 463 |
| 486 // No missed frame received. | 464 // No missed frame received. |
| 487 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | 465 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); |
| 488 source_->AddObserver(&obs); | 466 source_->AddObserver(&obs); |
| 489 source_->RemoveObserver(&obs); | 467 source_->RemoveObserver(&obs); |
| 490 | 468 |
| 491 // Missed frame received. | 469 // Missed frame received. |
| 492 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(10000), | 470 source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(10000), |
| 493 base::TimeDelta::FromInternalValue(10000)); | 471 base::TimeDelta::FromInternalValue(10000)); |
| 494 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); | 472 now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); |
| 495 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | 473 EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); |
| 474 source_->AddObserver(&obs); |
| 496 EXPECT_BEGIN_FRAME_USED_MISSED(obs, 10000, 20000, 10000); | 475 EXPECT_BEGIN_FRAME_USED_MISSED(obs, 10000, 20000, 10000); |
| 497 source_->AddObserver(&obs); | 476 task_runner_->RunPendingTasks(); |
| 498 source_->RemoveObserver(&obs); | 477 source_->RemoveObserver(&obs); |
| 499 } | 478 } |
| 500 | 479 |
| 501 } // namespace | 480 } // namespace |
| 502 } // namespace cc | 481 } // namespace cc |
| OLD | NEW |