Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(147)

Side by Side Diff: chrome/renderer/page_load_metrics/metrics_render_frame_observer.cc

Issue 2874663005: [Page Load Metrics] Add mojom file to page load metrics. (Closed)
Patch Set: rebase Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698