| Index: cc/scheduler/begin_frame_source_unittest.cc | 
| diff --git a/cc/scheduler/begin_frame_source_unittest.cc b/cc/scheduler/begin_frame_source_unittest.cc | 
| index 450e154ab3faad8660686583237d4dffd711922a..8250c6c52c5188d646fb46197a0b3ab97c485421 100644 | 
| --- a/cc/scheduler/begin_frame_source_unittest.cc | 
| +++ b/cc/scheduler/begin_frame_source_unittest.cc | 
| @@ -19,6 +19,17 @@ using testing::StrictMock; | 
| namespace cc { | 
| namespace { | 
|  | 
| +// BeginFrameSource testing ---------------------------------------------------- | 
| +TEST(BeginFrameSourceTest, SourceIdsAreUnique) { | 
| +  StubBeginFrameSource source1; | 
| +  StubBeginFrameSource source2; | 
| +  StubBeginFrameSource source3; | 
| +  EXPECT_NE(source1.source_id(), source2.source_id()); | 
| +  EXPECT_NE(source1.source_id(), source3.source_id()); | 
| +  EXPECT_NE(source2.source_id(), source3.source_id()); | 
| +} | 
| + | 
| +// BackToBackBeginFrameSource testing ------------------------------------------ | 
| class BackToBackBeginFrameSourceTest : public ::testing::Test { | 
| protected: | 
| static const int64_t kDeadline; | 
| @@ -55,20 +66,23 @@ TEST_F(BackToBackBeginFrameSourceTest, AddObserverSendsBeginFrame) { | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 
| source_->AddObserver(obs_.get()); | 
| EXPECT_TRUE(task_runner_->HasPendingTasks()); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, | 
| +                          1000 + kDeadline, kInterval); | 
| task_runner_->RunPendingTasks(); | 
|  | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1100, | 
| +                          1100 + kDeadline, kInterval); | 
| now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 
| source_->DidFinishFrame(obs_.get(), 0); | 
| task_runner_->RunPendingTasks(); | 
| } | 
|  | 
| TEST_F(BackToBackBeginFrameSourceTest, | 
| -       DidFinishFrameThenRemoveObserverProducesNoFrame) { | 
| +       RemoveObserverThenDidFinishFrameProducesNoFrame) { | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 
| source_->AddObserver(obs_.get()); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, | 
| +                          1000 + kDeadline, kInterval); | 
| task_runner_->RunPendingTasks(); | 
|  | 
| source_->RemoveObserver(obs_.get()); | 
| @@ -82,10 +96,11 @@ TEST_F(BackToBackBeginFrameSourceTest, | 
| } | 
|  | 
| TEST_F(BackToBackBeginFrameSourceTest, | 
| -       RemoveObserverThenDidFinishFrameProducesNoFrame) { | 
| +       DidFinishFrameThenRemoveObserverProducesNoFrame) { | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 
| source_->AddObserver(obs_.get()); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, | 
| +                          1000 + kDeadline, kInterval); | 
| task_runner_->RunPendingTasks(); | 
|  | 
| now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 
| @@ -100,7 +115,8 @@ TEST_F(BackToBackBeginFrameSourceTest, | 
| TogglingObserverThenDidFinishFrameProducesCorrectFrame) { | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 
| source_->AddObserver(obs_.get()); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, | 
| +                          1000 + kDeadline, kInterval); | 
| task_runner_->RunPendingTasks(); | 
|  | 
| now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 
| @@ -116,7 +132,8 @@ TEST_F(BackToBackBeginFrameSourceTest, | 
| now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); | 
| // The begin frame is posted at the time when the observer was added, | 
| // so it ignores changes to "now" afterward. | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 1110, 1110 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1110, | 
| +                          1110 + kDeadline, kInterval); | 
| EXPECT_TRUE(task_runner_->HasPendingTasks()); | 
| task_runner_->RunPendingTasks(); | 
| } | 
| @@ -125,7 +142,8 @@ TEST_F(BackToBackBeginFrameSourceTest, | 
| DidFinishFrameThenTogglingObserverProducesCorrectFrame) { | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 
| source_->AddObserver(obs_.get()); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, | 
| +                          1000 + kDeadline, kInterval); | 
| task_runner_->RunPendingTasks(); | 
|  | 
| now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 
| @@ -141,7 +159,8 @@ TEST_F(BackToBackBeginFrameSourceTest, | 
| now_src_->Advance(base::TimeDelta::FromMicroseconds(10)); | 
| // Ticks at the time at which the observer was added, ignoring the | 
| // last change to "now". | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 1120, 1120 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1120, | 
| +                          1120 + kDeadline, kInterval); | 
| EXPECT_TRUE(task_runner_->HasPendingTasks()); | 
| task_runner_->RunPendingTasks(); | 
| } | 
| @@ -157,7 +176,8 @@ TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameNoObserver) { | 
| TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameRemainingFrames) { | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 
| source_->AddObserver(obs_.get()); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, | 
| +                          1000 + kDeadline, kInterval); | 
| // Runs the pending begin frame. | 
| task_runner_->RunPendingTasks(); | 
| // While running the begin frame, the next frame was cancelled, this | 
| @@ -174,7 +194,8 @@ TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameRemainingFrames) { | 
| source_->DidFinishFrame(obs_.get(), 1); | 
| EXPECT_FALSE(task_runner_->HasPendingTasks()); | 
|  | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1100, | 
| +                          1100 + kDeadline, kInterval); | 
| source_->DidFinishFrame(obs_.get(), 0); | 
| EXPECT_EQ(base::TimeDelta(), task_runner_->DelayToNextTaskTime()); | 
| task_runner_->RunPendingTasks(); | 
| @@ -183,28 +204,32 @@ TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameRemainingFrames) { | 
| TEST_F(BackToBackBeginFrameSourceTest, DidFinishFrameMultipleCallsIdempotent) { | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 
| source_->AddObserver(obs_.get()); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, | 
| +                          1000 + kDeadline, kInterval); | 
| task_runner_->RunPendingTasks(); | 
|  | 
| now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 
| source_->DidFinishFrame(obs_.get(), 0); | 
| source_->DidFinishFrame(obs_.get(), 0); | 
| source_->DidFinishFrame(obs_.get(), 0); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1100, | 
| +                          1100 + kDeadline, kInterval); | 
| task_runner_->RunPendingTasks(); | 
|  | 
| now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 
| source_->DidFinishFrame(obs_.get(), 0); | 
| source_->DidFinishFrame(obs_.get(), 0); | 
| source_->DidFinishFrame(obs_.get(), 0); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 1200, 1200 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 3, 1200, | 
| +                          1200 + kDeadline, kInterval); | 
| task_runner_->RunPendingTasks(); | 
| } | 
|  | 
| TEST_F(BackToBackBeginFrameSourceTest, DelayInPostedTaskProducesCorrectFrame) { | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 
| source_->AddObserver(obs_.get()); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 1000, 1000 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 1, 1000, | 
| +                          1000 + kDeadline, kInterval); | 
| task_runner_->RunPendingTasks(); | 
|  | 
| now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 
| @@ -212,7 +237,8 @@ TEST_F(BackToBackBeginFrameSourceTest, DelayInPostedTaskProducesCorrectFrame) { | 
| now_src_->Advance(base::TimeDelta::FromMicroseconds(50)); | 
| // Ticks at the time the last frame finished, so ignores the last change to | 
| // "now". | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 1100, 1100 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 1100, | 
| +                          1100 + kDeadline, kInterval); | 
|  | 
| EXPECT_TRUE(task_runner_->HasPendingTasks()); | 
| task_runner_->RunPendingTasks(); | 
| @@ -226,15 +252,19 @@ TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversSynchronized) { | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); | 
| source_->AddObserver(&obs2); | 
|  | 
| -  EXPECT_BEGIN_FRAME_USED(obs1, 1000, 1000 + kDeadline, kInterval); | 
| -  EXPECT_BEGIN_FRAME_USED(obs2, 1000, 1000 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 1, 1000, 1000 + kDeadline, | 
| +                          kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 1, 1000, 1000 + kDeadline, | 
| +                          kInterval); | 
| task_runner_->RunPendingTasks(); | 
|  | 
| now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 
| source_->DidFinishFrame(&obs1, 0); | 
| source_->DidFinishFrame(&obs2, 0); | 
| -  EXPECT_BEGIN_FRAME_USED(obs1, 1100, 1100 + kDeadline, kInterval); | 
| -  EXPECT_BEGIN_FRAME_USED(obs2, 1100, 1100 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 2, 1100, 1100 + kDeadline, | 
| +                          kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 2, 1100, 1100 + kDeadline, | 
| +                          kInterval); | 
| task_runner_->RunPendingTasks(); | 
|  | 
| now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 
| @@ -251,18 +281,21 @@ TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversInterleaved) { | 
|  | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); | 
| source_->AddObserver(&obs1); | 
| -  EXPECT_BEGIN_FRAME_USED(obs1, 1000, 1000 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 1, 1000, 1000 + kDeadline, | 
| +                          kInterval); | 
| task_runner_->RunPendingTasks(); | 
|  | 
| now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); | 
| source_->AddObserver(&obs2); | 
| -  EXPECT_BEGIN_FRAME_USED(obs2, 1100, 1100 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 2, 1100, 1100 + kDeadline, | 
| +                          kInterval); | 
| task_runner_->RunPendingTasks(); | 
|  | 
| now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 
| source_->DidFinishFrame(&obs1, 0); | 
| -  EXPECT_BEGIN_FRAME_USED(obs1, 1200, 1200 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 3, 1200, 1200 + kDeadline, | 
| +                          kInterval); | 
| task_runner_->RunPendingTasks(); | 
|  | 
| source_->DidFinishFrame(&obs1, 0); | 
| @@ -275,7 +308,8 @@ TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversInterleaved) { | 
|  | 
| now_src_->Advance(base::TimeDelta::FromMicroseconds(100)); | 
| source_->DidFinishFrame(&obs2, 0); | 
| -  EXPECT_BEGIN_FRAME_USED(obs2, 1300, 1300 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 4, 1300, 1300 + kDeadline, | 
| +                          kInterval); | 
| task_runner_->RunPendingTasks(); | 
|  | 
| source_->DidFinishFrame(&obs2, 0); | 
| @@ -289,8 +323,10 @@ TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversAtOnce) { | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); | 
| source_->AddObserver(&obs1); | 
| source_->AddObserver(&obs2); | 
| -  EXPECT_BEGIN_FRAME_USED(obs1, 1000, 1000 + kDeadline, kInterval); | 
| -  EXPECT_BEGIN_FRAME_USED(obs2, 1000, 1000 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 1, 1000, 1000 + kDeadline, | 
| +                          kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 1, 1000, 1000 + kDeadline, | 
| +                          kInterval); | 
| task_runner_->RunPendingTasks(); | 
|  | 
| // |obs1| finishes first. | 
| @@ -303,8 +339,10 @@ TEST_F(BackToBackBeginFrameSourceTest, MultipleObserversAtOnce) { | 
|  | 
| // Because the begin frame source already ticked when |obs1| finished, | 
| // we see it as the frame time for both observers. | 
| -  EXPECT_BEGIN_FRAME_USED(obs1, 1100, 1100 + kDeadline, kInterval); | 
| -  EXPECT_BEGIN_FRAME_USED(obs2, 1100, 1100 + kDeadline, kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 2, 1100, 1100 + kDeadline, | 
| +                          kInterval); | 
| +  EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 2, 1100, 1100 + kDeadline, | 
| +                          kInterval); | 
| task_runner_->RunPendingTasks(); | 
|  | 
| source_->DidFinishFrame(&obs1, 0); | 
| @@ -341,18 +379,20 @@ TEST_F(DelayBasedBeginFrameSourceTest, | 
| AddObserverCallsOnBeginFrameWithMissedTick) { | 
| now_src_->Advance(base::TimeDelta::FromMicroseconds(9010)); | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 
| -  EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 10000, 20000, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, source_->source_id(), 1, 10000, 20000, | 
| +                                 10000); | 
| source_->AddObserver(obs_.get());  // Should cause the last tick to be sent | 
| // No tasks should need to be run for this to occur. | 
| } | 
|  | 
| TEST_F(DelayBasedBeginFrameSourceTest, AddObserverCallsCausesOnBeginFrame) { | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 
| -  EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 0, 10000, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, source_->source_id(), 1, 0, 10000, | 
| +                                 10000); | 
| source_->AddObserver(obs_.get()); | 
| EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue()); | 
|  | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 10000, 20000, 10000); | 
| now_src_->Advance(base::TimeDelta::FromMicroseconds(9010)); | 
| task_runner_->RunPendingTasks(); | 
| } | 
| @@ -361,11 +401,12 @@ TEST_F(DelayBasedBeginFrameSourceTest, BasicOperation) { | 
| task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 
|  | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 
| -  EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 0, 10000, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, source_->source_id(), 1, 0, 10000, | 
| +                                 10000); | 
| source_->AddObserver(obs_.get()); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 20000, 30000, 10000); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 30000, 40000, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 10000, 20000, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 3, 20000, 30000, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 4, 30000, 40000, 10000); | 
| task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001)); | 
|  | 
| source_->RemoveObserver(obs_.get()); | 
| @@ -376,21 +417,22 @@ TEST_F(DelayBasedBeginFrameSourceTest, BasicOperation) { | 
| TEST_F(DelayBasedBeginFrameSourceTest, VSyncChanges) { | 
| task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 
| -  EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 0, 10000, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, source_->source_id(), 1, 0, 10000, | 
| +                                 10000); | 
| source_->AddObserver(obs_.get()); | 
|  | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 20000, 30000, 10000); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 30000, 40000, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 10000, 20000, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 3, 20000, 30000, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 4, 30000, 40000, 10000); | 
| task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(30001)); | 
|  | 
| // Update the vsync information | 
| source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(27500), | 
| base::TimeDelta::FromMicroseconds(10001)); | 
|  | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 40000, 47502, 10001); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 47502, 57503, 10001); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 57503, 67504, 10001); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 5, 40000, 47502, 10001); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 6, 47502, 57503, 10001); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 7, 57503, 67504, 10001); | 
| task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60000)); | 
| } | 
|  | 
| @@ -399,25 +441,26 @@ TEST_F(DelayBasedBeginFrameSourceTest, AuthoritativeVSyncChanges) { | 
| source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(500), | 
| base::TimeDelta::FromMicroseconds(10000)); | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(*obs_, false); | 
| -  EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, 500, 10500, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED_MISSED(*obs_, source_->source_id(), 1, 500, 10500, | 
| +                                 10000); | 
| source_->AddObserver(obs_.get()); | 
|  | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 10500, 20500, 10000); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 20500, 30500, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 2, 10500, 20500, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 3, 20500, 30500, 10000); | 
| task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(20501)); | 
|  | 
| // This will keep the same timebase, so 500, 9999 | 
| source_->SetAuthoritativeVSyncInterval( | 
| base::TimeDelta::FromMicroseconds(9999)); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 30500, 40496, 9999); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 40496, 50495, 9999); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 4, 30500, 40496, 9999); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 5, 40496, 50495, 9999); | 
| task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(40497)); | 
|  | 
| // Change the vsync params, but the new interval will be ignored. | 
| source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(400), | 
| base::TimeDelta::FromMicroseconds(1)); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 50495, 60394, 9999); | 
| -  EXPECT_BEGIN_FRAME_USED(*obs_, 60394, 70393, 9999); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 6, 50495, 60394, 9999); | 
| +  EXPECT_BEGIN_FRAME_USED(*obs_, source_->source_id(), 7, 60394, 70393, 9999); | 
| task_runner_->RunUntilTime(base::TimeTicks::FromInternalValue(60395)); | 
| } | 
|  | 
| @@ -427,25 +470,28 @@ TEST_F(DelayBasedBeginFrameSourceTest, MultipleObservers) { | 
| // now_src_ starts off at 1000. | 
| task_runner_->RunForPeriod(base::TimeDelta::FromMicroseconds(9010)); | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs1, false); | 
| -  EXPECT_BEGIN_FRAME_USED_MISSED(obs1, 10000, 20000, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED_MISSED(obs1, source_->source_id(), 1, 10000, 20000, | 
| +                                 10000); | 
| source_->AddObserver(&obs1);  // Should cause the last tick to be sent | 
| // No tasks should need to be run for this to occur. | 
|  | 
| -  EXPECT_BEGIN_FRAME_USED(obs1, 20000, 30000, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 2, 20000, 30000, 10000); | 
| task_runner_->RunForPeriod(base::TimeDelta::FromMicroseconds(10000)); | 
|  | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs2, false); | 
| -  EXPECT_BEGIN_FRAME_USED_MISSED(obs2, 20000, 30000, 10000); | 
| +  // Sequence number unchanged for missed frame with time of last normal frame. | 
| +  EXPECT_BEGIN_FRAME_USED_MISSED(obs2, source_->source_id(), 2, 20000, 30000, | 
| +                                 10000); | 
| source_->AddObserver(&obs2);  // Should cause the last tick to be sent | 
| // No tasks should need to be run for this to occur. | 
|  | 
| -  EXPECT_BEGIN_FRAME_USED(obs1, 30000, 40000, 10000); | 
| -  EXPECT_BEGIN_FRAME_USED(obs2, 30000, 40000, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED(obs1, source_->source_id(), 3, 30000, 40000, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 3, 30000, 40000, 10000); | 
| task_runner_->RunForPeriod(base::TimeDelta::FromMicroseconds(10000)); | 
|  | 
| source_->RemoveObserver(&obs1); | 
|  | 
| -  EXPECT_BEGIN_FRAME_USED(obs2, 40000, 50000, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED(obs2, source_->source_id(), 4, 40000, 50000, 10000); | 
| task_runner_->RunForPeriod(base::TimeDelta::FromMicroseconds(10000)); | 
|  | 
| source_->RemoveObserver(&obs2); | 
| @@ -457,7 +503,7 @@ TEST_F(DelayBasedBeginFrameSourceTest, DoubleTick) { | 
| StrictMock<MockBeginFrameObserver> obs; | 
|  | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | 
| -  EXPECT_BEGIN_FRAME_USED_MISSED(obs, 0, 10000, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED_MISSED(obs, source_->source_id(), 1, 0, 10000, 10000); | 
| source_->AddObserver(&obs); | 
|  | 
| source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(5000), | 
| @@ -471,7 +517,7 @@ TEST_F(DelayBasedBeginFrameSourceTest, DoubleTick) { | 
| source_->OnUpdateVSyncParameters(base::TimeTicks::FromInternalValue(10000), | 
| base::TimeDelta::FromInternalValue(10000)); | 
| now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); | 
| -  EXPECT_BEGIN_FRAME_USED(obs, 10000, 20000, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED(obs, source_->source_id(), 2, 10000, 20000, 10000); | 
| task_runner_->RunPendingTasks(); | 
| } | 
|  | 
| @@ -479,7 +525,7 @@ TEST_F(DelayBasedBeginFrameSourceTest, DoubleTickMissedFrame) { | 
| StrictMock<MockBeginFrameObserver> obs; | 
|  | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | 
| -  EXPECT_BEGIN_FRAME_USED_MISSED(obs, 0, 10000, 10000); | 
| +  EXPECT_BEGIN_FRAME_USED_MISSED(obs, source_->source_id(), 1, 0, 10000, 10000); | 
| source_->AddObserver(&obs); | 
| source_->RemoveObserver(&obs); | 
|  | 
| @@ -489,6 +535,8 @@ TEST_F(DelayBasedBeginFrameSourceTest, DoubleTickMissedFrame) { | 
|  | 
| // No missed frame received. | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | 
| +  // This does not cause a missed BeginFrame, but the sequence number is | 
| +  // incremented, because the possible missed frame has different time/interval. | 
| source_->AddObserver(&obs); | 
| source_->RemoveObserver(&obs); | 
|  | 
| @@ -497,7 +545,10 @@ TEST_F(DelayBasedBeginFrameSourceTest, DoubleTickMissedFrame) { | 
| base::TimeDelta::FromInternalValue(10000)); | 
| now_src_->Advance(base::TimeDelta::FromInternalValue(5000)); | 
| EXPECT_BEGIN_FRAME_SOURCE_PAUSED(obs, false); | 
| -  EXPECT_BEGIN_FRAME_USED_MISSED(obs, 10000, 20000, 10000); | 
| +  // Sequence number is incremented again, because the missed frame has | 
| +  // different time/interval. | 
| +  EXPECT_BEGIN_FRAME_USED_MISSED(obs, source_->source_id(), 3, 10000, 20000, | 
| +                                 10000); | 
| source_->AddObserver(&obs); | 
| source_->RemoveObserver(&obs); | 
| } | 
|  |