diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/core/paint/first_meaningful_paint_detector_test.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/core/paint/first_meaningful_paint_detector_test.cc | 174 |
1 files changed, 67 insertions, 107 deletions
diff --git a/chromium/third_party/blink/renderer/core/paint/first_meaningful_paint_detector_test.cc b/chromium/third_party/blink/renderer/core/paint/first_meaningful_paint_detector_test.cc index aa4923c6a28..19483295968 100644 --- a/chromium/third_party/blink/renderer/core/paint/first_meaningful_paint_detector_test.cc +++ b/chromium/third_party/blink/renderer/core/paint/first_meaningful_paint_detector_test.cc @@ -9,7 +9,6 @@ #include "third_party/blink/renderer/core/paint/paint_event.h" #include "third_party/blink/renderer/core/paint/paint_timing.h" #include "third_party/blink/renderer/core/testing/page_test_base.h" -#include "third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h" #include "third_party/blink/renderer/platform/wtf/text/string_builder.h" #include "third_party/blink/renderer/platform/wtf/time.h" @@ -18,13 +17,27 @@ namespace blink { class FirstMeaningfulPaintDetectorTest : public PageTestBase { protected: void SetUp() override { - platform_->AdvanceClock(TimeDelta::FromSeconds(1)); + EnablePlatform(); + platform()->AdvanceClock(base::TimeDelta::FromSeconds(1)); + const base::TickClock* test_clock = + platform()->test_task_runner()->GetMockTickClock(); + FirstMeaningfulPaintDetector::SetTickClockForTesting(test_clock); PageTestBase::SetUp(); + GetPaintTiming().SetTickClockForTesting(test_clock); } - TimeTicks AdvanceClockAndGetTime() { - platform_->AdvanceClock(TimeDelta::FromSeconds(1)); - return CurrentTimeTicks(); + void TearDown() override { + const base::TickClock* clock = base::DefaultTickClock::GetInstance(); + GetPaintTiming().SetTickClockForTesting(clock); + PageTestBase::TearDown(); + FirstMeaningfulPaintDetector::SetTickClockForTesting(clock); + } + + base::TimeTicks Now() { return platform()->test_task_runner()->NowTicks(); } + + base::TimeTicks AdvanceClockAndGetTime() { + platform()->AdvanceClock(base::TimeDelta::FromSeconds(1)); + return Now(); } PaintTiming& GetPaintTiming() { return PaintTiming::From(GetDocument()); } @@ -33,7 +46,7 @@ class FirstMeaningfulPaintDetectorTest : public PageTestBase { } void SimulateLayoutAndPaint(int new_elements) { - platform_->AdvanceClock(TimeDelta::FromMilliseconds(1)); + platform()->AdvanceClock(base::TimeDelta::FromMilliseconds(1)); StringBuilder builder; for (int i = 0; i < new_elements; i++) builder.Append("<span>a</span>"); @@ -44,39 +57,27 @@ class FirstMeaningfulPaintDetectorTest : public PageTestBase { void SimulateNetworkStable() { GetDocument().SetParsingState(Document::kFinishedParsing); - Detector().OnNetwork0Quiet(); - Detector().OnNetwork2Quiet(); - } - - void SimulateNetwork0Quiet() { - GetDocument().SetParsingState(Document::kFinishedParsing); - Detector().OnNetwork0Quiet(); - } - - void SimulateNetwork2Quiet() { - GetDocument().SetParsingState(Document::kFinishedParsing); Detector().OnNetwork2Quiet(); } void SimulateUserInput() { Detector().NotifyInputEvent(); } void ClearFirstPaintSwapPromise() { - platform_->AdvanceClock(TimeDelta::FromMilliseconds(1)); - GetPaintTiming().ReportSwapTime(PaintEvent::kFirstPaint, - WebWidgetClient::SwapResult::kDidSwap, - CurrentTimeTicks()); + platform()->AdvanceClock(base::TimeDelta::FromMilliseconds(1)); + GetPaintTiming().ReportSwapTime( + PaintEvent::kFirstPaint, WebWidgetClient::SwapResult::kDidSwap, Now()); } void ClearFirstContentfulPaintSwapPromise() { - platform_->AdvanceClock(TimeDelta::FromMilliseconds(1)); + platform()->AdvanceClock(base::TimeDelta::FromMilliseconds(1)); GetPaintTiming().ReportSwapTime(PaintEvent::kFirstContentfulPaint, WebWidgetClient::SwapResult::kDidSwap, - CurrentTimeTicks()); + Now()); } void ClearProvisionalFirstMeaningfulPaintSwapPromise() { - platform_->AdvanceClock(TimeDelta::FromMilliseconds(1)); - ClearProvisionalFirstMeaningfulPaintSwapPromise(CurrentTimeTicks()); + platform()->AdvanceClock(base::TimeDelta::FromMilliseconds(1)); + ClearProvisionalFirstMeaningfulPaintSwapPromise(Now()); } void ClearProvisionalFirstMeaningfulPaintSwapPromise( @@ -98,17 +99,13 @@ class FirstMeaningfulPaintDetectorTest : public PageTestBase { GetPaintTiming().MarkFirstPaint(); ClearFirstPaintSwapPromise(); } - - protected: - ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler> - platform_; }; TEST_F(FirstMeaningfulPaintDetectorTest, NoFirstPaint) { SimulateLayoutAndPaint(1); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 0U); SimulateNetworkStable(); - EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaint(), TimeTicks()); + EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaint(), base::TimeTicks()); } TEST_F(FirstMeaningfulPaintDetectorTest, OneLayout) { @@ -116,8 +113,8 @@ TEST_F(FirstMeaningfulPaintDetectorTest, OneLayout) { SimulateLayoutAndPaint(1); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); ClearProvisionalFirstMeaningfulPaintSwapPromise(); - TimeTicks after_paint = AdvanceClockAndGetTime(); - EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaint(), TimeTicks()); + base::TimeTicks after_paint = AdvanceClockAndGetTime(); + EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaint(), base::TimeTicks()); SimulateNetworkStable(); EXPECT_LT(GetPaintTiming().FirstMeaningfulPaint(), after_paint); } @@ -127,11 +124,11 @@ TEST_F(FirstMeaningfulPaintDetectorTest, TwoLayoutsSignificantSecond) { SimulateLayoutAndPaint(1); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); ClearProvisionalFirstMeaningfulPaintSwapPromise(); - TimeTicks after_layout1 = AdvanceClockAndGetTime(); + base::TimeTicks after_layout1 = AdvanceClockAndGetTime(); SimulateLayoutAndPaint(10); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); ClearProvisionalFirstMeaningfulPaintSwapPromise(); - TimeTicks after_layout2 = AdvanceClockAndGetTime(); + base::TimeTicks after_layout2 = AdvanceClockAndGetTime(); SimulateNetworkStable(); EXPECT_GT(GetPaintTiming().FirstMeaningfulPaint(), after_layout1); EXPECT_LT(GetPaintTiming().FirstMeaningfulPaint(), after_layout2); @@ -142,7 +139,7 @@ TEST_F(FirstMeaningfulPaintDetectorTest, TwoLayoutsSignificantFirst) { SimulateLayoutAndPaint(10); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); ClearProvisionalFirstMeaningfulPaintSwapPromise(); - TimeTicks after_layout1 = AdvanceClockAndGetTime(); + base::TimeTicks after_layout1 = AdvanceClockAndGetTime(); SimulateLayoutAndPaint(1); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 0U); SimulateNetworkStable(); @@ -153,19 +150,21 @@ TEST_F(FirstMeaningfulPaintDetectorTest, TwoLayoutsSignificantFirst) { TEST_F(FirstMeaningfulPaintDetectorTest, FirstMeaningfulPaintCandidate) { MarkFirstContentfulPaintAndClearSwapPromise(); - EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaintCandidate(), TimeTicks()); + EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaintCandidate(), + base::TimeTicks()); SimulateLayoutAndPaint(1); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); ClearProvisionalFirstMeaningfulPaintSwapPromise(); - TimeTicks after_paint = AdvanceClockAndGetTime(); + base::TimeTicks after_paint = AdvanceClockAndGetTime(); // The first candidate gets ignored. - EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaintCandidate(), TimeTicks()); + EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaintCandidate(), + base::TimeTicks()); SimulateLayoutAndPaint(10); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); ClearProvisionalFirstMeaningfulPaintSwapPromise(); // The second candidate gets reported. EXPECT_GT(GetPaintTiming().FirstMeaningfulPaintCandidate(), after_paint); - TimeTicks candidate = GetPaintTiming().FirstMeaningfulPaintCandidate(); + base::TimeTicks candidate = GetPaintTiming().FirstMeaningfulPaintCandidate(); // The third candidate gets ignored since we already saw the first candidate. SimulateLayoutAndPaint(20); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); @@ -176,17 +175,19 @@ TEST_F(FirstMeaningfulPaintDetectorTest, FirstMeaningfulPaintCandidate) { TEST_F(FirstMeaningfulPaintDetectorTest, OnlyOneFirstMeaningfulPaintCandidateBeforeNetworkStable) { MarkFirstContentfulPaintAndClearSwapPromise(); - EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaintCandidate(), TimeTicks()); - TimeTicks before_paint = AdvanceClockAndGetTime(); + EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaintCandidate(), + base::TimeTicks()); + base::TimeTicks before_paint = AdvanceClockAndGetTime(); SimulateLayoutAndPaint(1); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); ClearProvisionalFirstMeaningfulPaintSwapPromise(); // The first candidate is initially ignored. - EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaintCandidate(), TimeTicks()); + EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaintCandidate(), + base::TimeTicks()); SimulateNetworkStable(); // The networkStable then promotes the first candidate. EXPECT_GT(GetPaintTiming().FirstMeaningfulPaintCandidate(), before_paint); - TimeTicks candidate = GetPaintTiming().FirstMeaningfulPaintCandidate(); + base::TimeTicks candidate = GetPaintTiming().FirstMeaningfulPaintCandidate(); // The second candidate is then ignored. SimulateLayoutAndPaint(10); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 0U); @@ -200,10 +201,10 @@ TEST_F(FirstMeaningfulPaintDetectorTest, EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); ClearProvisionalFirstMeaningfulPaintSwapPromise(); SimulateNetworkStable(); - EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaint(), TimeTicks()); + EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaint(), base::TimeTicks()); MarkFirstContentfulPaintAndClearSwapPromise(); SimulateNetworkStable(); - EXPECT_NE(GetPaintTiming().FirstMeaningfulPaint(), TimeTicks()); + EXPECT_NE(GetPaintTiming().FirstMeaningfulPaint(), base::TimeTicks()); } TEST_F(FirstMeaningfulPaintDetectorTest, @@ -212,53 +213,13 @@ TEST_F(FirstMeaningfulPaintDetectorTest, SimulateLayoutAndPaint(10); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); ClearProvisionalFirstMeaningfulPaintSwapPromise(); - platform_->AdvanceClock(TimeDelta::FromMilliseconds(1)); + platform()->AdvanceClock(base::TimeDelta::FromMilliseconds(1)); MarkFirstContentfulPaintAndClearSwapPromise(); SimulateNetworkStable(); EXPECT_GE(GetPaintTiming().FirstMeaningfulPaint(), GetPaintTiming().FirstContentfulPaint()); } -TEST_F(FirstMeaningfulPaintDetectorTest, Network2QuietThen0Quiet) { - MarkFirstContentfulPaintAndClearSwapPromise(); - - SimulateLayoutAndPaint(1); - EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); - TimeTicks after_first_paint = AdvanceClockAndGetTime(); - ClearProvisionalFirstMeaningfulPaintSwapPromise(); - TimeTicks after_first_paint_swap = AdvanceClockAndGetTime(); - SimulateNetwork2Quiet(); - - SimulateLayoutAndPaint(10); - EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 0U); - SimulateNetwork0Quiet(); - - // The first paint is FirstMeaningfulPaint. - EXPECT_GT(GetPaintTiming().FirstMeaningfulPaint(), TimeTicks()); - EXPECT_GT(GetPaintTiming().FirstMeaningfulPaint(), after_first_paint); - EXPECT_LT(GetPaintTiming().FirstMeaningfulPaint(), after_first_paint_swap); -} - -TEST_F(FirstMeaningfulPaintDetectorTest, Network0QuietThen2Quiet) { - MarkFirstContentfulPaintAndClearSwapPromise(); - - SimulateLayoutAndPaint(1); - EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); - ClearProvisionalFirstMeaningfulPaintSwapPromise(); - TimeTicks after_first_paint = AdvanceClockAndGetTime(); - SimulateNetwork0Quiet(); - - SimulateLayoutAndPaint(10); - EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); - ClearProvisionalFirstMeaningfulPaintSwapPromise(); - TimeTicks after_second_paint = AdvanceClockAndGetTime(); - SimulateNetwork2Quiet(); - - // The second paint is FirstMeaningfulPaint. - EXPECT_GT(GetPaintTiming().FirstMeaningfulPaint(), after_first_paint); - EXPECT_LT(GetPaintTiming().FirstMeaningfulPaint(), after_second_paint); -} - TEST_F(FirstMeaningfulPaintDetectorTest, FirstMeaningfulPaintAfterUserInteraction) { MarkFirstContentfulPaintAndClearSwapPromise(); @@ -267,7 +228,7 @@ TEST_F(FirstMeaningfulPaintDetectorTest, EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); ClearProvisionalFirstMeaningfulPaintSwapPromise(); SimulateNetworkStable(); - EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaint(), TimeTicks()); + EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaint(), base::TimeTicks()); } TEST_F(FirstMeaningfulPaintDetectorTest, UserInteractionBeforeFirstPaint) { @@ -277,7 +238,7 @@ TEST_F(FirstMeaningfulPaintDetectorTest, UserInteractionBeforeFirstPaint) { EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); ClearProvisionalFirstMeaningfulPaintSwapPromise(); SimulateNetworkStable(); - EXPECT_NE(GetPaintTiming().FirstMeaningfulPaint(), TimeTicks()); + EXPECT_NE(GetPaintTiming().FirstMeaningfulPaint(), base::TimeTicks()); } TEST_F(FirstMeaningfulPaintDetectorTest, @@ -286,9 +247,9 @@ TEST_F(FirstMeaningfulPaintDetectorTest, SimulateLayoutAndPaint(10); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); SimulateNetworkStable(); - EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaint(), TimeTicks()); + EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaint(), base::TimeTicks()); ClearProvisionalFirstMeaningfulPaintSwapPromise(); - EXPECT_NE(GetPaintTiming().FirstMeaningfulPaint(), TimeTicks()); + EXPECT_NE(GetPaintTiming().FirstMeaningfulPaint(), base::TimeTicks()); } TEST_F(FirstMeaningfulPaintDetectorTest, @@ -296,21 +257,21 @@ TEST_F(FirstMeaningfulPaintDetectorTest, MarkFirstContentfulPaintAndClearSwapPromise(); SimulateLayoutAndPaint(1); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); - platform_->AdvanceClock(TimeDelta::FromMilliseconds(1)); + platform()->AdvanceClock(base::TimeDelta::FromMilliseconds(1)); SimulateLayoutAndPaint(10); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 2U); // Having outstanding swap promises should defer setting FMP. SimulateNetworkStable(); - EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaint(), TimeTicks()); + EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaint(), base::TimeTicks()); // Clearing the first swap promise should have no effect on FMP. ClearProvisionalFirstMeaningfulPaintSwapPromise(); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); - EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaint(), TimeTicks()); - TimeTicks after_first_swap = AdvanceClockAndGetTime(); + EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaint(), base::TimeTicks()); + base::TimeTicks after_first_swap = AdvanceClockAndGetTime(); // Clearing the last outstanding swap promise should set FMP. ClearProvisionalFirstMeaningfulPaintSwapPromise(); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 0U); - EXPECT_GT(GetPaintTiming().FirstMeaningfulPaint(), TimeTicks()); + EXPECT_GT(GetPaintTiming().FirstMeaningfulPaint(), base::TimeTicks()); EXPECT_GT(GetPaintTiming().FirstMeaningfulPaint(), after_first_swap); } @@ -320,14 +281,14 @@ TEST_F(FirstMeaningfulPaintDetectorTest, SimulateLayoutAndPaint(10); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); ClearProvisionalFirstMeaningfulPaintSwapPromise(); - platform_->AdvanceClock(TimeDelta::FromMilliseconds(1)); + platform()->AdvanceClock(base::TimeDelta::FromMilliseconds(1)); GetPaintTiming().MarkFirstContentfulPaint(); // FCP > FMP candidate, but still waiting for FCP swap. SimulateNetworkStable(); - EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaint(), TimeTicks()); + EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaint(), base::TimeTicks()); // Trigger notifying the detector about the FCP swap. ClearFirstContentfulPaintSwapPromise(); - EXPECT_GT(GetPaintTiming().FirstMeaningfulPaint(), TimeTicks()); + EXPECT_GT(GetPaintTiming().FirstMeaningfulPaint(), base::TimeTicks()); EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaint(), GetPaintTiming().FirstContentfulPaint()); } @@ -338,16 +299,15 @@ TEST_F(FirstMeaningfulPaintDetectorTest, SimulateLayoutAndPaint(1); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); - // Simulate only network 2-quiet so provisional FMP will be set on next - // layout. - TimeTicks pre_stable_timestamp = AdvanceClockAndGetTime(); - platform_->AdvanceClock(TimeDelta::FromMilliseconds(1)); - SimulateNetwork2Quiet(); - EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaint(), TimeTicks()); + // Simulate network stable so provisional FMP will be set on next layout. + base::TimeTicks pre_stable_timestamp = AdvanceClockAndGetTime(); + platform()->AdvanceClock(base::TimeDelta::FromMilliseconds(1)); + SimulateNetworkStable(); + EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaint(), base::TimeTicks()); // Force another FMP candidate while there is a pending swap promise and the - // network 2-quiet FMP non-swap timestamp is set. - platform_->AdvanceClock(TimeDelta::FromMilliseconds(1)); + // FMP non-swap timestamp is set. + platform()->AdvanceClock(base::TimeDelta::FromMilliseconds(1)); SimulateLayoutAndPaint(10); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 1U); @@ -356,7 +316,7 @@ TEST_F(FirstMeaningfulPaintDetectorTest, // non-swap timestamp is used. ClearProvisionalFirstMeaningfulPaintSwapPromise(pre_stable_timestamp); EXPECT_EQ(OutstandingDetectorSwapPromiseCount(), 0U); - EXPECT_GT(GetPaintTiming().FirstMeaningfulPaint(), TimeTicks()); + EXPECT_GT(GetPaintTiming().FirstMeaningfulPaint(), base::TimeTicks()); EXPECT_EQ(GetPaintTiming().FirstMeaningfulPaint(), pre_stable_timestamp); } |