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 "components/page_load_metrics/renderer/metrics_render_frame_observer.h" | 5 #include "components/page_load_metrics/renderer/metrics_render_frame_observer.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 // messages get sent. | 25 // messages get sent. |
26 class MockIPCInterceptor { | 26 class MockIPCInterceptor { |
27 public: | 27 public: |
28 void OnMessage(const IPC::Message& message) { | 28 void OnMessage(const IPC::Message& message) { |
29 IPC_BEGIN_MESSAGE_MAP(MockIPCInterceptor, message) | 29 IPC_BEGIN_MESSAGE_MAP(MockIPCInterceptor, message) |
30 IPC_MESSAGE_HANDLER(PageLoadMetricsMsg_TimingUpdated, OnTimingUpdated) | 30 IPC_MESSAGE_HANDLER(PageLoadMetricsMsg_TimingUpdated, OnTimingUpdated) |
31 IPC_MESSAGE_UNHANDLED(ADD_FAILURE()) | 31 IPC_MESSAGE_UNHANDLED(ADD_FAILURE()) |
32 IPC_END_MESSAGE_MAP() | 32 IPC_END_MESSAGE_MAP() |
33 } | 33 } |
34 | 34 |
35 MOCK_METHOD1(OnTimingUpdated, void(PageLoadTiming)); | 35 MOCK_METHOD2(OnTimingUpdated, void(PageLoadTiming, PageLoadMetadata)); |
36 }; | 36 }; |
37 | 37 |
38 // Implementation of the MetricsRenderFrameObserver class we're testing, | 38 // Implementation of the MetricsRenderFrameObserver class we're testing, |
39 // with the GetTiming() and ShouldSendMetrics() methods stubbed out to make | 39 // with the GetTiming() and ShouldSendMetrics() methods stubbed out to make |
40 // the rest of the class more testable. | 40 // the rest of the class more testable. |
41 class MockMetricsRenderFrameObserver : public MetricsRenderFrameObserver { | 41 class MockMetricsRenderFrameObserver : public MetricsRenderFrameObserver { |
42 public: | 42 public: |
43 MockMetricsRenderFrameObserver() : MetricsRenderFrameObserver(nullptr) { | 43 MockMetricsRenderFrameObserver() : MetricsRenderFrameObserver(nullptr) { |
44 ON_CALL(*this, ShouldSendMetrics()).WillByDefault(Return(true)); | 44 ON_CALL(*this, ShouldSendMetrics()).WillByDefault(Return(true)); |
45 ON_CALL(*this, HasNoRenderFrame()).WillByDefault(Return(false)); | 45 ON_CALL(*this, HasNoRenderFrame()).WillByDefault(Return(false)); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 NiceMock<MockMetricsRenderFrameObserver> observer; | 94 NiceMock<MockMetricsRenderFrameObserver> observer; |
95 base::MockTimer* mock_timer = new base::MockTimer(false, false); | 95 base::MockTimer* mock_timer = new base::MockTimer(false, false); |
96 observer.set_mock_timer(make_scoped_ptr(mock_timer)); | 96 observer.set_mock_timer(make_scoped_ptr(mock_timer)); |
97 observer.DidCommitProvisionalLoad(true, false); | 97 observer.DidCommitProvisionalLoad(true, false); |
98 | 98 |
99 PageLoadTiming timing; | 99 PageLoadTiming timing; |
100 timing.navigation_start = nav_start; | 100 timing.navigation_start = nav_start; |
101 timing.first_layout = first_layout; | 101 timing.first_layout = first_layout; |
102 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); | 102 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); |
103 | 103 |
104 EXPECT_CALL(*observer.ipc_interceptor(), OnTimingUpdated(timing)); | 104 EXPECT_CALL(*observer.ipc_interceptor(), |
| 105 OnTimingUpdated(timing, PageLoadMetadata())); |
105 | 106 |
106 observer.DidChangePerformanceTiming(); | 107 observer.DidChangePerformanceTiming(); |
107 mock_timer->Fire(); | 108 mock_timer->Fire(); |
108 } | 109 } |
109 | 110 |
110 TEST_F(MetricsRenderFrameObserverTest, MultipleMetrics) { | 111 TEST_F(MetricsRenderFrameObserverTest, MultipleMetrics) { |
111 base::Time nav_start = base::Time::FromDoubleT(10); | 112 base::Time nav_start = base::Time::FromDoubleT(10); |
112 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2); | 113 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2); |
113 base::TimeDelta dom_event = base::TimeDelta::FromMillisecondsD(2); | 114 base::TimeDelta dom_event = base::TimeDelta::FromMillisecondsD(2); |
114 base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(2); | 115 base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(2); |
115 | 116 |
116 NiceMock<MockMetricsRenderFrameObserver> observer; | 117 NiceMock<MockMetricsRenderFrameObserver> observer; |
117 base::MockTimer* mock_timer = new base::MockTimer(false, false); | 118 base::MockTimer* mock_timer = new base::MockTimer(false, false); |
118 observer.set_mock_timer(make_scoped_ptr(mock_timer)); | 119 observer.set_mock_timer(make_scoped_ptr(mock_timer)); |
119 observer.DidCommitProvisionalLoad(true, false); | 120 observer.DidCommitProvisionalLoad(true, false); |
120 | 121 |
121 PageLoadTiming timing; | 122 PageLoadTiming timing; |
122 timing.navigation_start = nav_start; | 123 timing.navigation_start = nav_start; |
123 timing.first_layout = first_layout; | 124 timing.first_layout = first_layout; |
124 timing.dom_content_loaded_event_start = dom_event; | 125 timing.dom_content_loaded_event_start = dom_event; |
125 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); | 126 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); |
126 | 127 |
127 EXPECT_CALL(*observer.ipc_interceptor(), OnTimingUpdated(timing)); | 128 EXPECT_CALL(*observer.ipc_interceptor(), |
| 129 OnTimingUpdated(timing, PageLoadMetadata())); |
128 observer.DidChangePerformanceTiming(); | 130 observer.DidChangePerformanceTiming(); |
129 mock_timer->Fire(); | 131 mock_timer->Fire(); |
130 | 132 |
131 // At this point, we should have triggered the generation of two metrics. | 133 // At this point, we should have triggered the generation of two metrics. |
132 // Verify and reset the observer's expectations before moving on to the next | 134 // Verify and reset the observer's expectations before moving on to the next |
133 // part of the test. | 135 // part of the test. |
134 testing::Mock::VerifyAndClearExpectations(observer.ipc_interceptor()); | 136 testing::Mock::VerifyAndClearExpectations(observer.ipc_interceptor()); |
135 | 137 |
136 timing.load_event_start = load_event; | 138 timing.load_event_start = load_event; |
137 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); | 139 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); |
138 | 140 |
139 EXPECT_CALL(*observer.ipc_interceptor(), OnTimingUpdated(timing)); | 141 EXPECT_CALL(*observer.ipc_interceptor(), |
| 142 OnTimingUpdated(timing, PageLoadMetadata())); |
140 observer.DidChangePerformanceTiming(); | 143 observer.DidChangePerformanceTiming(); |
141 mock_timer->Fire(); | 144 mock_timer->Fire(); |
142 | 145 |
143 // Verify and reset the observer's expectations before moving on to the next | 146 // Verify and reset the observer's expectations before moving on to the next |
144 // part of the test. | 147 // part of the test. |
145 testing::Mock::VerifyAndClearExpectations(observer.ipc_interceptor()); | 148 testing::Mock::VerifyAndClearExpectations(observer.ipc_interceptor()); |
146 | 149 |
147 // The PageLoadTiming above includes timing information for the first layout, | 150 // The PageLoadTiming above includes timing information for the first layout, |
148 // dom content, and load metrics. However, since we've already generated | 151 // dom content, and load metrics. However, since we've already generated |
149 // timing information for all of these metrics previously, we do not expect | 152 // timing information for all of these metrics previously, we do not expect |
(...skipping 12 matching lines...) Expand all Loading... |
162 base::MockTimer* mock_timer = new base::MockTimer(false, false); | 165 base::MockTimer* mock_timer = new base::MockTimer(false, false); |
163 observer.set_mock_timer(make_scoped_ptr(mock_timer)); | 166 observer.set_mock_timer(make_scoped_ptr(mock_timer)); |
164 observer.DidCommitProvisionalLoad(true, false); | 167 observer.DidCommitProvisionalLoad(true, false); |
165 | 168 |
166 PageLoadTiming timing; | 169 PageLoadTiming timing; |
167 timing.navigation_start = nav_start; | 170 timing.navigation_start = nav_start; |
168 timing.first_layout = first_layout; | 171 timing.first_layout = first_layout; |
169 timing.dom_content_loaded_event_start = dom_event; | 172 timing.dom_content_loaded_event_start = dom_event; |
170 timing.load_event_start = load_event; | 173 timing.load_event_start = load_event; |
171 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); | 174 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); |
172 EXPECT_CALL(*observer.ipc_interceptor(), OnTimingUpdated(timing)); | 175 EXPECT_CALL(*observer.ipc_interceptor(), |
| 176 OnTimingUpdated(timing, PageLoadMetadata())); |
173 observer.DidChangePerformanceTiming(); | 177 observer.DidChangePerformanceTiming(); |
174 mock_timer->Fire(); | 178 mock_timer->Fire(); |
175 | 179 |
176 // At this point, we should have triggered the generation of two metrics. | 180 // At this point, we should have triggered the generation of two metrics. |
177 // Verify and reset the observer's expectations before moving on to the next | 181 // Verify and reset the observer's expectations before moving on to the next |
178 // part of the test. | 182 // part of the test. |
179 testing::Mock::VerifyAndClearExpectations(observer.ipc_interceptor()); | 183 testing::Mock::VerifyAndClearExpectations(observer.ipc_interceptor()); |
180 | 184 |
181 base::Time nav_start_2 = base::Time::FromDoubleT(100); | 185 base::Time nav_start_2 = base::Time::FromDoubleT(100); |
182 base::TimeDelta first_layout_2 = base::TimeDelta::FromMillisecondsD(20); | 186 base::TimeDelta first_layout_2 = base::TimeDelta::FromMillisecondsD(20); |
183 base::TimeDelta dom_event_2 = base::TimeDelta::FromMillisecondsD(20); | 187 base::TimeDelta dom_event_2 = base::TimeDelta::FromMillisecondsD(20); |
184 base::TimeDelta load_event_2 = base::TimeDelta::FromMillisecondsD(20); | 188 base::TimeDelta load_event_2 = base::TimeDelta::FromMillisecondsD(20); |
185 PageLoadTiming timing_2; | 189 PageLoadTiming timing_2; |
186 timing_2.navigation_start = nav_start_2; | 190 timing_2.navigation_start = nav_start_2; |
187 timing_2.first_layout = first_layout_2; | 191 timing_2.first_layout = first_layout_2; |
188 timing_2.dom_content_loaded_event_start = dom_event_2; | 192 timing_2.dom_content_loaded_event_start = dom_event_2; |
189 timing_2.load_event_start = load_event_2; | 193 timing_2.load_event_start = load_event_2; |
190 | 194 |
191 base::MockTimer* mock_timer2 = new base::MockTimer(false, false); | 195 base::MockTimer* mock_timer2 = new base::MockTimer(false, false); |
192 observer.set_mock_timer(make_scoped_ptr(mock_timer2)); | 196 observer.set_mock_timer(make_scoped_ptr(mock_timer2)); |
193 observer.DidCommitProvisionalLoad(true, false); | 197 observer.DidCommitProvisionalLoad(true, false); |
194 EXPECT_CALL(*observer.ipc_interceptor(), OnTimingUpdated(timing)); | 198 EXPECT_CALL(*observer.ipc_interceptor(), |
| 199 OnTimingUpdated(timing, PageLoadMetadata())); |
195 observer.DidChangePerformanceTiming(); | 200 observer.DidChangePerformanceTiming(); |
196 mock_timer2->Fire(); | 201 mock_timer2->Fire(); |
197 } | 202 } |
198 | 203 |
199 } // namespace page_load_metrics | 204 } // namespace page_load_metrics |
OLD | NEW |