OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 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 <string> | 7 #include <string> |
8 | 8 |
9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 return; | 65 return; |
66 | 66 |
67 // Make sure to release the sender for a previous navigation, if we have one. | 67 // Make sure to release the sender for a previous navigation, if we have one. |
68 page_timing_metrics_sender_.reset(); | 68 page_timing_metrics_sender_.reset(); |
69 | 69 |
70 // We only create a PageTimingMetricsSender if the page meets the criteria for | 70 // We only create a PageTimingMetricsSender if the page meets the criteria for |
71 // sending and recording metrics. Once page_timing_metrics_sender_ is | 71 // sending and recording metrics. Once page_timing_metrics_sender_ is |
72 // non-null, we will send metrics for the current page at some later time, as | 72 // non-null, we will send metrics for the current page at some later time, as |
73 // those metrics become available. | 73 // those metrics become available. |
74 if (ShouldSendMetrics()) { | 74 if (ShouldSendMetrics()) { |
75 PageLoadTiming timing; | 75 mojo::StructPtr<mojom::PageLoadTiming> timing(CreatePageLoadTiming()); |
76 if (IsMainFrame()) { | 76 if (IsMainFrame()) { |
77 // Only populate PageLoadTiming for the main frame. | 77 // Only populate PageLoadTiming for the main frame. |
78 timing = GetTiming(); | 78 timing = GetTiming(); |
79 DCHECK(!timing.navigation_start.is_null()); | 79 DCHECK(!timing->navigation_start.is_null()); |
80 } | 80 } |
81 page_timing_metrics_sender_.reset( | 81 page_timing_metrics_sender_.reset(new PageTimingMetricsSender( |
82 new PageTimingMetricsSender(this, routing_id(), CreateTimer(), timing)); | 82 this, routing_id(), CreateTimer(), std::move(timing))); |
83 } | 83 } |
84 } | 84 } |
85 | 85 |
86 void MetricsRenderFrameObserver::SendMetrics() { | 86 void MetricsRenderFrameObserver::SendMetrics() { |
87 if (!page_timing_metrics_sender_) | 87 if (!page_timing_metrics_sender_) |
88 return; | 88 return; |
89 if (HasNoRenderFrame()) | 89 if (HasNoRenderFrame()) |
90 return; | 90 return; |
91 PageLoadTiming timing(GetTiming()); | 91 page_timing_metrics_sender_->Send(GetTiming()); |
92 page_timing_metrics_sender_->Send(timing); | |
93 } | 92 } |
94 | 93 |
95 bool MetricsRenderFrameObserver::ShouldSendMetrics() const { | 94 bool MetricsRenderFrameObserver::ShouldSendMetrics() const { |
96 if (HasNoRenderFrame()) | 95 if (HasNoRenderFrame()) |
97 return false; | 96 return false; |
98 const blink::WebLocalFrame* frame = render_frame()->GetWebFrame(); | 97 const blink::WebLocalFrame* frame = render_frame()->GetWebFrame(); |
99 const blink::WebDocument& document = frame->GetDocument(); | 98 const blink::WebDocument& document = frame->GetDocument(); |
100 return RendererPageTrackDecider(&document, frame->DataSource()).ShouldTrack(); | 99 return RendererPageTrackDecider(&document, frame->DataSource()).ShouldTrack(); |
101 } | 100 } |
102 | 101 |
103 PageLoadTiming MetricsRenderFrameObserver::GetTiming() const { | 102 mojo::StructPtr<mojom::PageLoadTiming> MetricsRenderFrameObserver::GetTiming() |
| 103 const { |
104 const blink::WebPerformance& perf = | 104 const blink::WebPerformance& perf = |
105 render_frame()->GetWebFrame()->Performance(); | 105 render_frame()->GetWebFrame()->Performance(); |
106 | 106 |
107 PageLoadTiming timing; | 107 mojo::StructPtr<mojom::PageLoadTiming> timing(CreatePageLoadTiming()); |
108 double start = perf.NavigationStart(); | 108 double start = perf.NavigationStart(); |
109 timing.navigation_start = base::Time::FromDoubleT(start); | 109 timing->navigation_start = base::Time::FromDoubleT(start); |
110 if (perf.ResponseStart() > 0.0) | 110 if (perf.ResponseStart() > 0.0) |
111 timing.response_start = ClampDelta(perf.ResponseStart(), start); | 111 timing->response_start = ClampDelta(perf.ResponseStart(), start); |
112 if (perf.DomContentLoadedEventStart() > 0.0) { | 112 if (perf.DomContentLoadedEventStart() > 0.0) { |
113 timing.document_timing.dom_content_loaded_event_start = | 113 timing->document_timing->dom_content_loaded_event_start = |
114 ClampDelta(perf.DomContentLoadedEventStart(), start); | 114 ClampDelta(perf.DomContentLoadedEventStart(), start); |
115 } | 115 } |
116 if (perf.LoadEventStart() > 0.0) { | 116 if (perf.LoadEventStart() > 0.0) { |
117 timing.document_timing.load_event_start = | 117 timing->document_timing->load_event_start = |
118 ClampDelta(perf.LoadEventStart(), start); | 118 ClampDelta(perf.LoadEventStart(), start); |
119 } | 119 } |
120 if (perf.FirstLayout() > 0.0) | 120 if (perf.FirstLayout() > 0.0) |
121 timing.document_timing.first_layout = ClampDelta(perf.FirstLayout(), start); | 121 timing->document_timing->first_layout = |
| 122 ClampDelta(perf.FirstLayout(), start); |
122 if (perf.FirstPaint() > 0.0) | 123 if (perf.FirstPaint() > 0.0) |
123 timing.paint_timing.first_paint = ClampDelta(perf.FirstPaint(), start); | 124 timing->paint_timing->first_paint = ClampDelta(perf.FirstPaint(), start); |
124 if (perf.FirstTextPaint() > 0.0) { | 125 if (perf.FirstTextPaint() > 0.0) { |
125 timing.paint_timing.first_text_paint = | 126 timing->paint_timing->first_text_paint = |
126 ClampDelta(perf.FirstTextPaint(), start); | 127 ClampDelta(perf.FirstTextPaint(), start); |
127 } | 128 } |
128 if (perf.FirstImagePaint() > 0.0) { | 129 if (perf.FirstImagePaint() > 0.0) { |
129 timing.paint_timing.first_image_paint = | 130 timing->paint_timing->first_image_paint = |
130 ClampDelta(perf.FirstImagePaint(), start); | 131 ClampDelta(perf.FirstImagePaint(), start); |
131 } | 132 } |
132 if (perf.FirstContentfulPaint() > 0.0) { | 133 if (perf.FirstContentfulPaint() > 0.0) { |
133 timing.paint_timing.first_contentful_paint = | 134 timing->paint_timing->first_contentful_paint = |
134 ClampDelta(perf.FirstContentfulPaint(), start); | 135 ClampDelta(perf.FirstContentfulPaint(), start); |
135 } | 136 } |
136 if (perf.FirstMeaningfulPaint() > 0.0) { | 137 if (perf.FirstMeaningfulPaint() > 0.0) { |
137 timing.paint_timing.first_meaningful_paint = | 138 timing->paint_timing->first_meaningful_paint = |
138 ClampDelta(perf.FirstMeaningfulPaint(), start); | 139 ClampDelta(perf.FirstMeaningfulPaint(), start); |
139 } | 140 } |
140 if (perf.ParseStart() > 0.0) | 141 if (perf.ParseStart() > 0.0) |
141 timing.parse_timing.parse_start = ClampDelta(perf.ParseStart(), start); | 142 timing->parse_timing->parse_start = ClampDelta(perf.ParseStart(), start); |
142 if (perf.ParseStop() > 0.0) | 143 if (perf.ParseStop() > 0.0) |
143 timing.parse_timing.parse_stop = ClampDelta(perf.ParseStop(), start); | 144 timing->parse_timing->parse_stop = ClampDelta(perf.ParseStop(), start); |
144 if (timing.parse_timing.parse_start) { | 145 if (timing->parse_timing->parse_start) { |
145 // If we started parsing, record all parser durations such as the amount of | 146 // If we started parsing, record all parser durations such as the amount of |
146 // time blocked on script load, even if those values are zero. | 147 // time blocked on script load, even if those values are zero. |
147 timing.parse_timing.parse_blocked_on_script_load_duration = | 148 timing->parse_timing->parse_blocked_on_script_load_duration = |
148 base::TimeDelta::FromSecondsD(perf.ParseBlockedOnScriptLoadDuration()); | 149 base::TimeDelta::FromSecondsD(perf.ParseBlockedOnScriptLoadDuration()); |
149 timing.parse_timing | 150 timing->parse_timing |
150 .parse_blocked_on_script_load_from_document_write_duration = | 151 ->parse_blocked_on_script_load_from_document_write_duration = |
151 base::TimeDelta::FromSecondsD( | 152 base::TimeDelta::FromSecondsD( |
152 perf.ParseBlockedOnScriptLoadFromDocumentWriteDuration()); | 153 perf.ParseBlockedOnScriptLoadFromDocumentWriteDuration()); |
153 timing.parse_timing.parse_blocked_on_script_execution_duration = | 154 timing->parse_timing->parse_blocked_on_script_execution_duration = |
154 base::TimeDelta::FromSecondsD( | 155 base::TimeDelta::FromSecondsD( |
155 perf.ParseBlockedOnScriptExecutionDuration()); | 156 perf.ParseBlockedOnScriptExecutionDuration()); |
156 timing.parse_timing | 157 timing->parse_timing |
157 .parse_blocked_on_script_execution_from_document_write_duration = | 158 ->parse_blocked_on_script_execution_from_document_write_duration = |
158 base::TimeDelta::FromSecondsD( | 159 base::TimeDelta::FromSecondsD( |
159 perf.ParseBlockedOnScriptExecutionFromDocumentWriteDuration()); | 160 perf.ParseBlockedOnScriptExecutionFromDocumentWriteDuration()); |
160 } | 161 } |
161 | 162 |
162 if (perf.AuthorStyleSheetParseDurationBeforeFCP() > 0.0) { | 163 if (perf.AuthorStyleSheetParseDurationBeforeFCP() > 0.0) { |
163 timing.style_sheet_timing.author_style_sheet_parse_duration_before_fcp = | 164 timing->style_sheet_timing->author_style_sheet_parse_duration_before_fcp = |
164 base::TimeDelta::FromSecondsD( | 165 base::TimeDelta::FromSecondsD( |
165 perf.AuthorStyleSheetParseDurationBeforeFCP()); | 166 perf.AuthorStyleSheetParseDurationBeforeFCP()); |
166 } | 167 } |
167 if (perf.UpdateStyleDurationBeforeFCP() > 0.0) { | 168 if (perf.UpdateStyleDurationBeforeFCP() > 0.0) { |
168 timing.style_sheet_timing.update_style_duration_before_fcp = | 169 timing->style_sheet_timing->update_style_duration_before_fcp = |
169 base::TimeDelta::FromSecondsD(perf.UpdateStyleDurationBeforeFCP()); | 170 base::TimeDelta::FromSecondsD(perf.UpdateStyleDurationBeforeFCP()); |
170 } | 171 } |
171 return timing; | 172 return timing; |
172 } | 173 } |
173 | 174 |
174 std::unique_ptr<base::Timer> MetricsRenderFrameObserver::CreateTimer() const { | 175 std::unique_ptr<base::Timer> MetricsRenderFrameObserver::CreateTimer() const { |
175 return base::WrapUnique(new base::OneShotTimer); | 176 return base::WrapUnique(new base::OneShotTimer); |
176 } | 177 } |
177 | 178 |
178 bool MetricsRenderFrameObserver::HasNoRenderFrame() const { | 179 bool MetricsRenderFrameObserver::HasNoRenderFrame() const { |
179 bool no_frame = !render_frame() || !render_frame()->GetWebFrame(); | 180 bool no_frame = !render_frame() || !render_frame()->GetWebFrame(); |
180 DCHECK(!no_frame); | 181 DCHECK(!no_frame); |
181 return no_frame; | 182 return no_frame; |
182 } | 183 } |
183 | 184 |
184 void MetricsRenderFrameObserver::OnDestruct() { | 185 void MetricsRenderFrameObserver::OnDestruct() { |
185 delete this; | 186 delete this; |
186 } | 187 } |
187 | 188 |
188 bool MetricsRenderFrameObserver::IsMainFrame() const { | 189 bool MetricsRenderFrameObserver::IsMainFrame() const { |
189 return render_frame()->IsMainFrame(); | 190 return render_frame()->IsMainFrame(); |
190 } | 191 } |
191 | 192 |
192 } // namespace page_load_metrics | 193 } // namespace page_load_metrics |
OLD | NEW |