| OLD | NEW |
| 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 "chrome/renderer/page_load_metrics/metrics_render_frame_observer.h" | 5 #include "chrome/renderer/page_load_metrics/metrics_render_frame_observer.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 return fake_timing_ipc_sender_.Send(message); | 36 return fake_timing_ipc_sender_.Send(message); |
| 37 } | 37 } |
| 38 | 38 |
| 39 void set_mock_timer(std::unique_ptr<base::Timer> timer) { | 39 void set_mock_timer(std::unique_ptr<base::Timer> timer) { |
| 40 ASSERT_EQ(nullptr, mock_timer_); | 40 ASSERT_EQ(nullptr, mock_timer_); |
| 41 mock_timer_ = std::move(timer); | 41 mock_timer_ = std::move(timer); |
| 42 } | 42 } |
| 43 | 43 |
| 44 void set_is_main_frame(bool is_main_frame) { is_main_frame_ = is_main_frame; } | 44 void set_is_main_frame(bool is_main_frame) { is_main_frame_ = is_main_frame; } |
| 45 | 45 |
| 46 bool WasFakeTimingConsumed() const { return fake_timing_.IsEmpty(); } | 46 bool WasFakeTimingConsumed() const { return IsEmpty(*fake_timing_); } |
| 47 | 47 |
| 48 void ExpectPageLoadTiming(const PageLoadTiming& timing) { | 48 void ExpectPageLoadTiming(const PageLoadTiming& timing) { |
| 49 SetFakePageLoadTiming(timing); | 49 SetFakePageLoadTiming(timing); |
| 50 fake_timing_ipc_sender_.ExpectPageLoadTiming(timing); | 50 fake_timing_ipc_sender_.ExpectPageLoadTiming(timing); |
| 51 } | 51 } |
| 52 | 52 |
| 53 void SetFakePageLoadTiming(const PageLoadTiming& timing) { | 53 void SetFakePageLoadTiming(const PageLoadTiming& timing) { |
| 54 EXPECT_TRUE(fake_timing_.IsEmpty()); | 54 EXPECT_EQ(nullptr, fake_timing_.get()); |
| 55 fake_timing_ = timing; | 55 fake_timing_ = timing.Clone(); |
| 56 } | 56 } |
| 57 | 57 |
| 58 PageLoadTiming GetTiming() const override { | 58 mojo::StructPtr<PageLoadTiming> GetTiming() const override { |
| 59 PageLoadTiming tmp = fake_timing_; | 59 EXPECT_NE(nullptr, fake_timing_.get()); |
| 60 fake_timing_ = PageLoadTiming(); | 60 return std::move(fake_timing_); |
| 61 return tmp; | |
| 62 } | 61 } |
| 63 | 62 |
| 64 void VerifyExpectedTimings() const { | 63 void VerifyExpectedTimings() const { |
| 65 EXPECT_TRUE(fake_timing_.IsEmpty()); | 64 EXPECT_EQ(nullptr, fake_timing_.get()); |
| 66 fake_timing_ipc_sender_.VerifyExpectedTimings(); | 65 fake_timing_ipc_sender_.VerifyExpectedTimings(); |
| 67 } | 66 } |
| 68 | 67 |
| 69 bool ShouldSendMetrics() const override { return true; } | 68 bool ShouldSendMetrics() const override { return true; } |
| 70 bool HasNoRenderFrame() const override { return false; } | 69 bool HasNoRenderFrame() const override { return false; } |
| 71 bool IsMainFrame() const override { return is_main_frame_; } | 70 bool IsMainFrame() const override { return is_main_frame_; } |
| 72 | 71 |
| 73 private: | 72 private: |
| 74 FakePageTimingMetricsIPCSender fake_timing_ipc_sender_; | 73 FakePageTimingMetricsIPCSender fake_timing_ipc_sender_; |
| 75 mutable PageLoadTiming fake_timing_; | 74 mutable mojo::StructPtr<PageLoadTiming> fake_timing_; |
| 76 mutable std::unique_ptr<base::Timer> mock_timer_; | 75 mutable std::unique_ptr<base::Timer> mock_timer_; |
| 77 bool is_main_frame_ = true; | 76 bool is_main_frame_ = true; |
| 78 }; | 77 }; |
| 79 | 78 |
| 80 typedef testing::Test MetricsRenderFrameObserverTest; | 79 typedef testing::Test MetricsRenderFrameObserverTest; |
| 81 | 80 |
| 82 TEST_F(MetricsRenderFrameObserverTest, NoMetrics) { | 81 TEST_F(MetricsRenderFrameObserverTest, NoMetrics) { |
| 83 TestMetricsRenderFrameObserver observer; | 82 TestMetricsRenderFrameObserver observer; |
| 84 base::MockTimer* mock_timer = new base::MockTimer(false, false); | 83 base::MockTimer* mock_timer = new base::MockTimer(false, false); |
| 85 observer.set_mock_timer(base::WrapUnique(mock_timer)); | 84 observer.set_mock_timer(base::WrapUnique(mock_timer)); |
| 86 | 85 |
| 87 observer.DidChangePerformanceTiming(); | 86 observer.DidChangePerformanceTiming(); |
| 88 ASSERT_FALSE(mock_timer->IsRunning()); | 87 ASSERT_FALSE(mock_timer->IsRunning()); |
| 89 } | 88 } |
| 90 | 89 |
| 91 TEST_F(MetricsRenderFrameObserverTest, SingleMetric) { | 90 TEST_F(MetricsRenderFrameObserverTest, SingleMetric) { |
| 92 base::Time nav_start = base::Time::FromDoubleT(10); | 91 base::Time nav_start = base::Time::FromDoubleT(10); |
| 93 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(10); | 92 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(10); |
| 94 | 93 |
| 95 TestMetricsRenderFrameObserver observer; | 94 TestMetricsRenderFrameObserver observer; |
| 96 base::MockTimer* mock_timer = new base::MockTimer(false, false); | 95 base::MockTimer* mock_timer = new base::MockTimer(false, false); |
| 97 observer.set_mock_timer(base::WrapUnique(mock_timer)); | 96 observer.set_mock_timer(base::WrapUnique(mock_timer)); |
| 98 | 97 |
| 99 PageLoadTiming timing; | 98 PageLoadTiming timing; |
| 99 page_load_metrics::InitPageLoadTimingForTest(&timing); |
| 100 timing.navigation_start = nav_start; | 100 timing.navigation_start = nav_start; |
| 101 observer.ExpectPageLoadTiming(timing); | 101 observer.ExpectPageLoadTiming(timing); |
| 102 observer.DidCommitProvisionalLoad(true, false); | 102 observer.DidCommitProvisionalLoad(true, false); |
| 103 mock_timer->Fire(); | 103 mock_timer->Fire(); |
| 104 | 104 |
| 105 timing.document_timing.first_layout = first_layout; | 105 timing.document_timing->first_layout = first_layout; |
| 106 observer.ExpectPageLoadTiming(timing); | 106 observer.ExpectPageLoadTiming(timing); |
| 107 | 107 |
| 108 observer.DidChangePerformanceTiming(); | 108 observer.DidChangePerformanceTiming(); |
| 109 mock_timer->Fire(); | 109 mock_timer->Fire(); |
| 110 } | 110 } |
| 111 | 111 |
| 112 TEST_F(MetricsRenderFrameObserverTest, MultipleMetrics) { | 112 TEST_F(MetricsRenderFrameObserverTest, MultipleMetrics) { |
| 113 base::Time nav_start = base::Time::FromDoubleT(10); | 113 base::Time nav_start = base::Time::FromDoubleT(10); |
| 114 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2); | 114 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2); |
| 115 base::TimeDelta dom_event = base::TimeDelta::FromMillisecondsD(2); | 115 base::TimeDelta dom_event = base::TimeDelta::FromMillisecondsD(2); |
| 116 base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(2); | 116 base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(2); |
| 117 | 117 |
| 118 TestMetricsRenderFrameObserver observer; | 118 TestMetricsRenderFrameObserver observer; |
| 119 base::MockTimer* mock_timer = new base::MockTimer(false, false); | 119 base::MockTimer* mock_timer = new base::MockTimer(false, false); |
| 120 observer.set_mock_timer(base::WrapUnique(mock_timer)); | 120 observer.set_mock_timer(base::WrapUnique(mock_timer)); |
| 121 | 121 |
| 122 PageLoadTiming timing; | 122 PageLoadTiming timing; |
| 123 page_load_metrics::InitPageLoadTimingForTest(&timing); |
| 123 timing.navigation_start = nav_start; | 124 timing.navigation_start = nav_start; |
| 124 observer.ExpectPageLoadTiming(timing); | 125 observer.ExpectPageLoadTiming(timing); |
| 125 observer.DidCommitProvisionalLoad(true, false); | 126 observer.DidCommitProvisionalLoad(true, false); |
| 126 mock_timer->Fire(); | 127 mock_timer->Fire(); |
| 127 | 128 |
| 128 timing.document_timing.first_layout = first_layout; | 129 timing.document_timing->first_layout = first_layout; |
| 129 timing.document_timing.dom_content_loaded_event_start = dom_event; | 130 timing.document_timing->dom_content_loaded_event_start = dom_event; |
| 130 observer.ExpectPageLoadTiming(timing); | 131 observer.ExpectPageLoadTiming(timing); |
| 131 | 132 |
| 132 observer.DidChangePerformanceTiming(); | 133 observer.DidChangePerformanceTiming(); |
| 133 mock_timer->Fire(); | 134 mock_timer->Fire(); |
| 134 | 135 |
| 135 // At this point, we should have triggered the generation of two metrics. | 136 // At this point, we should have triggered the generation of two metrics. |
| 136 // Verify and reset the observer's expectations before moving on to the next | 137 // Verify and reset the observer's expectations before moving on to the next |
| 137 // part of the test. | 138 // part of the test. |
| 138 observer.VerifyExpectedTimings(); | 139 observer.VerifyExpectedTimings(); |
| 139 | 140 |
| 140 timing.document_timing.load_event_start = load_event; | 141 timing.document_timing->load_event_start = load_event; |
| 141 observer.ExpectPageLoadTiming(timing); | 142 observer.ExpectPageLoadTiming(timing); |
| 142 | 143 |
| 143 observer.DidChangePerformanceTiming(); | 144 observer.DidChangePerformanceTiming(); |
| 144 mock_timer->Fire(); | 145 mock_timer->Fire(); |
| 145 | 146 |
| 146 // Verify and reset the observer's expectations before moving on to the next | 147 // Verify and reset the observer's expectations before moving on to the next |
| 147 // part of the test. | 148 // part of the test. |
| 148 observer.VerifyExpectedTimings(); | 149 observer.VerifyExpectedTimings(); |
| 149 | 150 |
| 150 // The PageLoadTiming above includes timing information for the first layout, | 151 // The PageLoadTiming above includes timing information for the first layout, |
| 151 // dom content, and load metrics. However, since we've already generated | 152 // dom content, and load metrics. However, since we've already generated |
| 152 // timing information for all of these metrics previously, we do not expect | 153 // timing information for all of these metrics previously, we do not expect |
| 153 // this invocation to generate any additional metrics. | 154 // this invocation to generate any additional metrics. |
| 155 observer.SetFakePageLoadTiming(timing); |
| 154 observer.DidChangePerformanceTiming(); | 156 observer.DidChangePerformanceTiming(); |
| 155 ASSERT_FALSE(mock_timer->IsRunning()); | 157 ASSERT_FALSE(mock_timer->IsRunning()); |
| 156 } | 158 } |
| 157 | 159 |
| 158 TEST_F(MetricsRenderFrameObserverTest, MultipleNavigations) { | 160 TEST_F(MetricsRenderFrameObserverTest, MultipleNavigations) { |
| 159 base::Time nav_start = base::Time::FromDoubleT(10); | 161 base::Time nav_start = base::Time::FromDoubleT(10); |
| 160 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2); | 162 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2); |
| 161 base::TimeDelta dom_event = base::TimeDelta::FromMillisecondsD(2); | 163 base::TimeDelta dom_event = base::TimeDelta::FromMillisecondsD(2); |
| 162 base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(2); | 164 base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(2); |
| 163 | 165 |
| 164 TestMetricsRenderFrameObserver observer; | 166 TestMetricsRenderFrameObserver observer; |
| 165 base::MockTimer* mock_timer = new base::MockTimer(false, false); | 167 base::MockTimer* mock_timer = new base::MockTimer(false, false); |
| 166 observer.set_mock_timer(base::WrapUnique(mock_timer)); | 168 observer.set_mock_timer(base::WrapUnique(mock_timer)); |
| 167 | 169 |
| 168 PageLoadTiming timing; | 170 PageLoadTiming timing; |
| 171 page_load_metrics::InitPageLoadTimingForTest(&timing); |
| 169 timing.navigation_start = nav_start; | 172 timing.navigation_start = nav_start; |
| 170 observer.ExpectPageLoadTiming(timing); | 173 observer.ExpectPageLoadTiming(timing); |
| 171 observer.DidCommitProvisionalLoad(true, false); | 174 observer.DidCommitProvisionalLoad(true, false); |
| 172 mock_timer->Fire(); | 175 mock_timer->Fire(); |
| 173 | 176 |
| 174 timing.document_timing.first_layout = first_layout; | 177 timing.document_timing->first_layout = first_layout; |
| 175 timing.document_timing.dom_content_loaded_event_start = dom_event; | 178 timing.document_timing->dom_content_loaded_event_start = dom_event; |
| 176 timing.document_timing.load_event_start = load_event; | 179 timing.document_timing->load_event_start = load_event; |
| 177 observer.ExpectPageLoadTiming(timing); | 180 observer.ExpectPageLoadTiming(timing); |
| 178 observer.DidChangePerformanceTiming(); | 181 observer.DidChangePerformanceTiming(); |
| 179 mock_timer->Fire(); | 182 mock_timer->Fire(); |
| 180 | 183 |
| 181 // At this point, we should have triggered the generation of two metrics. | 184 // At this point, we should have triggered the generation of two metrics. |
| 182 // Verify and reset the observer's expectations before moving on to the next | 185 // Verify and reset the observer's expectations before moving on to the next |
| 183 // part of the test. | 186 // part of the test. |
| 184 observer.VerifyExpectedTimings(); | 187 observer.VerifyExpectedTimings(); |
| 185 | 188 |
| 186 base::Time nav_start_2 = base::Time::FromDoubleT(100); | 189 base::Time nav_start_2 = base::Time::FromDoubleT(100); |
| 187 base::TimeDelta first_layout_2 = base::TimeDelta::FromMillisecondsD(20); | 190 base::TimeDelta first_layout_2 = base::TimeDelta::FromMillisecondsD(20); |
| 188 base::TimeDelta dom_event_2 = base::TimeDelta::FromMillisecondsD(20); | 191 base::TimeDelta dom_event_2 = base::TimeDelta::FromMillisecondsD(20); |
| 189 base::TimeDelta load_event_2 = base::TimeDelta::FromMillisecondsD(20); | 192 base::TimeDelta load_event_2 = base::TimeDelta::FromMillisecondsD(20); |
| 190 PageLoadTiming timing_2; | 193 PageLoadTiming timing_2; |
| 194 page_load_metrics::InitPageLoadTimingForTest(&timing_2); |
| 191 timing_2.navigation_start = nav_start_2; | 195 timing_2.navigation_start = nav_start_2; |
| 192 | 196 |
| 193 base::MockTimer* mock_timer2 = new base::MockTimer(false, false); | 197 base::MockTimer* mock_timer2 = new base::MockTimer(false, false); |
| 194 observer.set_mock_timer(base::WrapUnique(mock_timer2)); | 198 observer.set_mock_timer(base::WrapUnique(mock_timer2)); |
| 195 | 199 |
| 196 observer.ExpectPageLoadTiming(timing_2); | 200 observer.ExpectPageLoadTiming(timing_2); |
| 197 observer.DidCommitProvisionalLoad(true, false); | 201 observer.DidCommitProvisionalLoad(true, false); |
| 198 mock_timer2->Fire(); | 202 mock_timer2->Fire(); |
| 199 | 203 |
| 200 timing_2.document_timing.first_layout = first_layout_2; | 204 timing_2.document_timing->first_layout = first_layout_2; |
| 201 timing_2.document_timing.dom_content_loaded_event_start = dom_event_2; | 205 timing_2.document_timing->dom_content_loaded_event_start = dom_event_2; |
| 202 timing_2.document_timing.load_event_start = load_event_2; | 206 timing_2.document_timing->load_event_start = load_event_2; |
| 203 observer.ExpectPageLoadTiming(timing_2); | 207 observer.ExpectPageLoadTiming(timing_2); |
| 204 | 208 |
| 205 observer.DidChangePerformanceTiming(); | 209 observer.DidChangePerformanceTiming(); |
| 206 mock_timer2->Fire(); | 210 mock_timer2->Fire(); |
| 207 } | 211 } |
| 208 | 212 |
| 209 TEST_F(MetricsRenderFrameObserverTest, NoUpdatesFromChildFrames) { | 213 TEST_F(MetricsRenderFrameObserverTest, NoUpdatesFromChildFrames) { |
| 210 base::Time nav_start = base::Time::FromDoubleT(10); | 214 base::Time nav_start = base::Time::FromDoubleT(10); |
| 211 | 215 |
| 212 TestMetricsRenderFrameObserver observer; | 216 TestMetricsRenderFrameObserver observer; |
| 213 base::MockTimer* mock_timer = new base::MockTimer(false, false); | 217 base::MockTimer* mock_timer = new base::MockTimer(false, false); |
| 214 observer.set_mock_timer(base::WrapUnique(mock_timer)); | 218 observer.set_mock_timer(base::WrapUnique(mock_timer)); |
| 215 observer.set_is_main_frame(false); | 219 observer.set_is_main_frame(false); |
| 216 | 220 |
| 217 PageLoadTiming timing; | 221 PageLoadTiming timing; |
| 222 page_load_metrics::InitPageLoadTimingForTest(&timing); |
| 218 timing.navigation_start = nav_start; | 223 timing.navigation_start = nav_start; |
| 219 observer.SetFakePageLoadTiming(timing); | 224 observer.SetFakePageLoadTiming(timing); |
| 220 observer.DidCommitProvisionalLoad(true, false); | 225 observer.DidCommitProvisionalLoad(true, false); |
| 221 ASSERT_FALSE(observer.WasFakeTimingConsumed()); | 226 ASSERT_FALSE(observer.WasFakeTimingConsumed()); |
| 222 ASSERT_FALSE(mock_timer->IsRunning()); | 227 ASSERT_FALSE(mock_timer->IsRunning()); |
| 223 | 228 |
| 224 observer.DidChangePerformanceTiming(); | 229 observer.DidChangePerformanceTiming(); |
| 225 ASSERT_FALSE(observer.WasFakeTimingConsumed()); | 230 ASSERT_FALSE(observer.WasFakeTimingConsumed()); |
| 226 ASSERT_FALSE(mock_timer->IsRunning()); | 231 ASSERT_FALSE(mock_timer->IsRunning()); |
| 227 } | 232 } |
| 228 | 233 |
| 229 } // namespace page_load_metrics | 234 } // namespace page_load_metrics |
| OLD | NEW |