| 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/browser/page_load_metrics/observers/aborts_page_load_metrics_ob
server.h" | 5 #include "chrome/browser/page_load_metrics/observers/aborts_page_load_metrics_ob
server.h" |
| 6 | 6 |
| 7 #include "components/page_load_metrics/browser/page_load_metrics_util.h" | 7 #include "components/page_load_metrics/browser/page_load_metrics_util.h" |
| 8 | 8 |
| 9 using page_load_metrics::UserAbortType; | 9 using page_load_metrics::UserAbortType; |
| 10 | 10 |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 NOTREACHED() << "Received UserAbortType::ABORT_OTHER for committed load."; | 160 NOTREACHED() << "Received UserAbortType::ABORT_OTHER for committed load."; |
| 161 return; | 161 return; |
| 162 case UserAbortType::ABORT_NONE: | 162 case UserAbortType::ABORT_NONE: |
| 163 case UserAbortType::ABORT_LAST_ENTRY: | 163 case UserAbortType::ABORT_LAST_ENTRY: |
| 164 NOTREACHED(); | 164 NOTREACHED(); |
| 165 return; | 165 return; |
| 166 } | 166 } |
| 167 NOTREACHED(); | 167 NOTREACHED(); |
| 168 } | 168 } |
| 169 | 169 |
| 170 bool ShouldTrackMetrics( |
| 171 const page_load_metrics::PageLoadExtraInfo& extra_info) { |
| 172 UserAbortType abort_type = extra_info.abort_type; |
| 173 if (abort_type == UserAbortType::ABORT_NONE) |
| 174 return false; |
| 175 |
| 176 DCHECK(extra_info.time_to_abort); |
| 177 |
| 178 // Don't log abort times if the page was backgrounded before the abort event. |
| 179 if (!WasStartedInForegroundOptionalEventInForeground(extra_info.time_to_abort, |
| 180 extra_info)) |
| 181 return false; |
| 182 |
| 183 return true; |
| 184 } |
| 185 |
| 170 } // namespace | 186 } // namespace |
| 171 | 187 |
| 172 AbortsPageLoadMetricsObserver::AbortsPageLoadMetricsObserver() {} | 188 AbortsPageLoadMetricsObserver::AbortsPageLoadMetricsObserver() {} |
| 173 | 189 |
| 174 void AbortsPageLoadMetricsObserver::OnComplete( | 190 void AbortsPageLoadMetricsObserver::OnComplete( |
| 175 const page_load_metrics::PageLoadTiming& timing, | 191 const page_load_metrics::PageLoadTiming& timing, |
| 176 const page_load_metrics::PageLoadExtraInfo& extra_info) { | 192 const page_load_metrics::PageLoadExtraInfo& extra_info) { |
| 177 UserAbortType abort_type = extra_info.abort_type; | 193 if (!ShouldTrackMetrics(extra_info)) |
| 178 if (abort_type == UserAbortType::ABORT_NONE) | |
| 179 return; | 194 return; |
| 180 | 195 |
| 181 DCHECK(extra_info.time_to_abort); | 196 // If we did not receive any timing IPCs from the render process, we can't |
| 182 | 197 // know for certain if the page was truly aborted before paint, or if the |
| 183 // Don't log abort times if the page was backgrounded before the abort event. | 198 // abort happened before we received the IPC from the render process. Thus, we |
| 184 if (!WasStartedInForegroundOptionalEventInForeground(extra_info.time_to_abort, | 199 // do not log aborts for these page loads. Tracked page loads that receive no |
| 185 extra_info)) | 200 // timing IPCs are tracked via the ERR_NO_IPCS_RECEIVED error code in the |
| 201 // PageLoad.Events.InternalError histogram, so we can keep track of how often |
| 202 // this happens. |
| 203 if (timing.IsEmpty()) |
| 186 return; | 204 return; |
| 187 | 205 |
| 188 const base::TimeDelta& time_to_abort = extra_info.time_to_abort.value(); | 206 const base::TimeDelta& time_to_abort = extra_info.time_to_abort.value(); |
| 207 if (timing.parse_start && time_to_abort >= timing.parse_start && |
| 208 (!timing.parse_stop || timing.parse_stop >= time_to_abort)) { |
| 209 RecordAbortDuringParse(extra_info.abort_type, time_to_abort); |
| 210 } |
| 211 if (!timing.first_paint || timing.first_paint >= time_to_abort) { |
| 212 RecordAbortAfterCommitBeforePaint(extra_info.abort_type, time_to_abort); |
| 213 } |
| 214 } |
| 189 | 215 |
| 190 if (!extra_info.time_to_commit) { | 216 void AbortsPageLoadMetricsObserver::OnFailedProvisionalLoad( |
| 191 RecordAbortBeforeCommit(abort_type, time_to_abort); | 217 const page_load_metrics::FailedProvisionalLoadInfo& failed_load_info, |
| 192 return; | 218 const page_load_metrics::PageLoadExtraInfo& extra_info) { |
| 193 } | 219 if (!ShouldTrackMetrics(extra_info)) |
| 194 | |
| 195 // If we have a committed load but |timing.IsEmpty()|, then this load was not | |
| 196 // tracked by the renderer. In this case, it is not possible to know whether | |
| 197 // the abort signals came before the page painted. Additionally, for | |
| 198 // consistency with PageLoad.(Document|Paint|Parse)Timing metrics recorded by | |
| 199 // the CorePageLoadMetricsObserver, we ignore non-render-tracked loads when | |
| 200 // tracking aborts after commit. | |
| 201 if (timing.IsEmpty()) | |
| 202 return; | 220 return; |
| 203 | 221 |
| 204 if (timing.parse_start && time_to_abort >= timing.parse_start && | 222 RecordAbortBeforeCommit(extra_info.abort_type, |
| 205 (!timing.parse_stop || timing.parse_stop >= time_to_abort)) { | 223 extra_info.time_to_abort.value()); |
| 206 RecordAbortDuringParse(abort_type, time_to_abort); | |
| 207 } | |
| 208 if (!timing.first_paint || timing.first_paint >= time_to_abort) { | |
| 209 RecordAbortAfterCommitBeforePaint(abort_type, time_to_abort); | |
| 210 } | |
| 211 } | 224 } |
| OLD | NEW |