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/metrics_web_contents_observer.h" | 5 #include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <ostream> | 8 #include <ostream> |
9 #include <string> | 9 #include <string> |
10 #include <utility> | 10 #include <utility> |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 const char kAbortChainSizeSameURL[] = | 46 const char kAbortChainSizeSameURL[] = |
47 "PageLoad.Internal.ProvisionalAbortChainSize.SameURL"; | 47 "PageLoad.Internal.ProvisionalAbortChainSize.SameURL"; |
48 const char kAbortChainSizeNoCommit[] = | 48 const char kAbortChainSizeNoCommit[] = |
49 "PageLoad.Internal.ProvisionalAbortChainSize.NoCommit"; | 49 "PageLoad.Internal.ProvisionalAbortChainSize.NoCommit"; |
50 const char kClientRedirectFirstPaintToNavigation[] = | 50 const char kClientRedirectFirstPaintToNavigation[] = |
51 "PageLoad.Internal.ClientRedirect.FirstPaintToNavigation"; | 51 "PageLoad.Internal.ClientRedirect.FirstPaintToNavigation"; |
52 const char kClientRedirectWithoutPaint[] = | 52 const char kClientRedirectWithoutPaint[] = |
53 "PageLoad.Internal.ClientRedirect.NavigationWithoutPaint"; | 53 "PageLoad.Internal.ClientRedirect.NavigationWithoutPaint"; |
54 const char kCommitToCompleteNoTimingIPCs[] = | 54 const char kCommitToCompleteNoTimingIPCs[] = |
55 "PageLoad.Internal.CommitToComplete.NoTimingIPCs"; | 55 "PageLoad.Internal.CommitToComplete.NoTimingIPCs"; |
| 56 const char kPageLoadCompletedAfterAppBackground[] = |
| 57 "PageLoad.Internal.PageLoadCompleted.AfterAppBackground"; |
56 | 58 |
57 } // namespace internal | 59 } // namespace internal |
58 | 60 |
59 namespace { | 61 namespace { |
60 | 62 |
61 // Helper to allow use of Optional<> values in LOG() messages. | 63 // Helper to allow use of Optional<> values in LOG() messages. |
62 std::ostream& operator<<(std::ostream& os, | 64 std::ostream& operator<<(std::ostream& os, |
63 const base::Optional<base::TimeDelta>& opt) { | 65 const base::Optional<base::TimeDelta>& opt) { |
64 if (opt) | 66 if (opt) |
65 os << opt.value(); | 67 os << opt.value(); |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 return false; | 182 return false; |
181 } | 183 } |
182 | 184 |
183 return true; | 185 return true; |
184 } | 186 } |
185 | 187 |
186 void RecordInternalError(InternalErrorLoadEvent event) { | 188 void RecordInternalError(InternalErrorLoadEvent event) { |
187 UMA_HISTOGRAM_ENUMERATION(internal::kErrorEvents, event, ERR_LAST_ENTRY); | 189 UMA_HISTOGRAM_ENUMERATION(internal::kErrorEvents, event, ERR_LAST_ENTRY); |
188 } | 190 } |
189 | 191 |
| 192 void RecordAppBackgroundPageLoadCompleted(bool completed_after_background) { |
| 193 UMA_HISTOGRAM_BOOLEAN(internal::kPageLoadCompletedAfterAppBackground, |
| 194 completed_after_background); |
| 195 } |
| 196 |
190 UserAbortType AbortTypeForPageTransition(ui::PageTransition transition) { | 197 UserAbortType AbortTypeForPageTransition(ui::PageTransition transition) { |
191 if (ui::PageTransitionCoreTypeIs(transition, ui::PAGE_TRANSITION_RELOAD)) | 198 if (ui::PageTransitionCoreTypeIs(transition, ui::PAGE_TRANSITION_RELOAD)) |
192 return ABORT_RELOAD; | 199 return ABORT_RELOAD; |
193 if (transition & ui::PAGE_TRANSITION_FORWARD_BACK) | 200 if (transition & ui::PAGE_TRANSITION_FORWARD_BACK) |
194 return ABORT_FORWARD_BACK; | 201 return ABORT_FORWARD_BACK; |
195 if (ui::PageTransitionIsNewNavigation(transition)) | 202 if (ui::PageTransitionIsNewNavigation(transition)) |
196 return ABORT_NEW_NAVIGATION; | 203 return ABORT_NEW_NAVIGATION; |
197 NOTREACHED() | 204 NOTREACHED() |
198 << "AbortTypeForPageTransition received unexpected ui::PageTransition: " | 205 << "AbortTypeForPageTransition received unexpected ui::PageTransition: " |
199 << transition; | 206 << transition; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
240 } // namespace | 247 } // namespace |
241 | 248 |
242 PageLoadTracker::PageLoadTracker( | 249 PageLoadTracker::PageLoadTracker( |
243 bool in_foreground, | 250 bool in_foreground, |
244 PageLoadMetricsEmbedderInterface* embedder_interface, | 251 PageLoadMetricsEmbedderInterface* embedder_interface, |
245 const GURL& currently_committed_url, | 252 const GURL& currently_committed_url, |
246 content::NavigationHandle* navigation_handle, | 253 content::NavigationHandle* navigation_handle, |
247 int aborted_chain_size, | 254 int aborted_chain_size, |
248 int aborted_chain_size_same_url) | 255 int aborted_chain_size_same_url) |
249 : did_stop_tracking_(false), | 256 : did_stop_tracking_(false), |
| 257 app_entered_background_(false), |
250 navigation_start_(navigation_handle->NavigationStart()), | 258 navigation_start_(navigation_handle->NavigationStart()), |
251 url_(navigation_handle->GetURL()), | 259 url_(navigation_handle->GetURL()), |
252 abort_type_(ABORT_NONE), | 260 abort_type_(ABORT_NONE), |
253 started_in_foreground_(in_foreground), | 261 started_in_foreground_(in_foreground), |
254 aborted_chain_size_(aborted_chain_size), | 262 aborted_chain_size_(aborted_chain_size), |
255 aborted_chain_size_same_url_(aborted_chain_size_same_url), | 263 aborted_chain_size_same_url_(aborted_chain_size_same_url), |
256 embedder_interface_(embedder_interface) { | 264 embedder_interface_(embedder_interface) { |
257 DCHECK(!navigation_handle->HasCommitted()); | 265 DCHECK(!navigation_handle->HasCommitted()); |
258 embedder_interface_->RegisterObservers(this); | 266 embedder_interface_->RegisterObservers(this); |
259 for (const auto& observer : observers_) { | 267 for (const auto& observer : observers_) { |
260 observer->OnStart(navigation_handle, currently_committed_url, | 268 observer->OnStart(navigation_handle, currently_committed_url, |
261 started_in_foreground_); | 269 started_in_foreground_); |
262 } | 270 } |
263 } | 271 } |
264 | 272 |
265 PageLoadTracker::~PageLoadTracker() { | 273 PageLoadTracker::~PageLoadTracker() { |
| 274 if (app_entered_background_) { |
| 275 RecordAppBackgroundPageLoadCompleted(true); |
| 276 } |
| 277 |
266 if (did_stop_tracking_) | 278 if (did_stop_tracking_) |
267 return; | 279 return; |
268 | 280 |
269 if (commit_time_.is_null()) { | 281 if (commit_time_.is_null()) { |
270 if (!failed_provisional_load_info_) | 282 if (!failed_provisional_load_info_) |
271 RecordInternalError(ERR_NO_COMMIT_OR_FAILED_PROVISIONAL_LOAD); | 283 RecordInternalError(ERR_NO_COMMIT_OR_FAILED_PROVISIONAL_LOAD); |
272 | 284 |
273 // Recall that trackers that are given ABORT_UNKNOWN_NAVIGATION have their | 285 // Recall that trackers that are given ABORT_UNKNOWN_NAVIGATION have their |
274 // chain length added to the next navigation. Take care not to double count | 286 // chain length added to the next navigation. Take care not to double count |
275 // them. Also do not double count committed loads, which call this already. | 287 // them. Also do not double count committed loads, which call this already. |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 observer->OnRedirect(navigation_handle); | 403 observer->OnRedirect(navigation_handle); |
392 } | 404 } |
393 } | 405 } |
394 | 406 |
395 void PageLoadTracker::OnInputEvent(const blink::WebInputEvent& event) { | 407 void PageLoadTracker::OnInputEvent(const blink::WebInputEvent& event) { |
396 for (const auto& observer : observers_) { | 408 for (const auto& observer : observers_) { |
397 observer->OnUserInput(event); | 409 observer->OnUserInput(event); |
398 } | 410 } |
399 } | 411 } |
400 | 412 |
| 413 void PageLoadTracker::FlushMetricsOnAppEnterBackground() { |
| 414 if (!app_entered_background_) { |
| 415 RecordAppBackgroundPageLoadCompleted(false); |
| 416 app_entered_background_ = true; |
| 417 } |
| 418 } |
| 419 |
401 void PageLoadTracker::NotifyClientRedirectTo( | 420 void PageLoadTracker::NotifyClientRedirectTo( |
402 const PageLoadTracker& destination) { | 421 const PageLoadTracker& destination) { |
403 if (timing_.first_paint) { | 422 if (timing_.first_paint) { |
404 base::TimeTicks first_paint_time = | 423 base::TimeTicks first_paint_time = |
405 navigation_start() + timing_.first_paint.value(); | 424 navigation_start() + timing_.first_paint.value(); |
406 base::TimeDelta first_paint_to_navigation; | 425 base::TimeDelta first_paint_to_navigation; |
407 if (destination.navigation_start() > first_paint_time) | 426 if (destination.navigation_start() > first_paint_time) |
408 first_paint_to_navigation = | 427 first_paint_to_navigation = |
409 destination.navigation_start() - first_paint_time; | 428 destination.navigation_start() - first_paint_time; |
410 PAGE_LOAD_HISTOGRAM(internal::kClientRedirectFirstPaintToNavigation, | 429 PAGE_LOAD_HISTOGRAM(internal::kClientRedirectFirstPaintToNavigation, |
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
798 void MetricsWebContentsObserver::OnInputEvent( | 817 void MetricsWebContentsObserver::OnInputEvent( |
799 const blink::WebInputEvent& event) { | 818 const blink::WebInputEvent& event) { |
800 // Ignore browser navigation or reload which comes with type Undefined. | 819 // Ignore browser navigation or reload which comes with type Undefined. |
801 if (event.type == blink::WebInputEvent::Type::Undefined) | 820 if (event.type == blink::WebInputEvent::Type::Undefined) |
802 return; | 821 return; |
803 | 822 |
804 if (committed_load_) | 823 if (committed_load_) |
805 committed_load_->OnInputEvent(event); | 824 committed_load_->OnInputEvent(event); |
806 } | 825 } |
807 | 826 |
| 827 void MetricsWebContentsObserver::FlushMetricsOnAppEnterBackground() { |
| 828 if (committed_load_) |
| 829 committed_load_->FlushMetricsOnAppEnterBackground(); |
| 830 for (const auto& kv : provisional_loads_) { |
| 831 kv.second->FlushMetricsOnAppEnterBackground(); |
| 832 } |
| 833 for (const auto& tracker : aborted_provisional_loads_) { |
| 834 tracker->FlushMetricsOnAppEnterBackground(); |
| 835 } |
| 836 } |
| 837 |
808 void MetricsWebContentsObserver::DidRedirectNavigation( | 838 void MetricsWebContentsObserver::DidRedirectNavigation( |
809 content::NavigationHandle* navigation_handle) { | 839 content::NavigationHandle* navigation_handle) { |
810 if (!navigation_handle->IsInMainFrame()) | 840 if (!navigation_handle->IsInMainFrame()) |
811 return; | 841 return; |
812 auto it = provisional_loads_.find(navigation_handle); | 842 auto it = provisional_loads_.find(navigation_handle); |
813 if (it == provisional_loads_.end()) | 843 if (it == provisional_loads_.end()) |
814 return; | 844 return; |
815 it->second->Redirect(navigation_handle); | 845 it->second->Redirect(navigation_handle); |
816 } | 846 } |
817 | 847 |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
952 if (navigation_handle->IsSamePage() || navigation_handle->IsErrorPage()) | 982 if (navigation_handle->IsSamePage() || navigation_handle->IsErrorPage()) |
953 return false; | 983 return false; |
954 const std::string& mime_type = web_contents()->GetContentsMimeType(); | 984 const std::string& mime_type = web_contents()->GetContentsMimeType(); |
955 if (mime_type != "text/html" && mime_type != "application/xhtml+xml") | 985 if (mime_type != "text/html" && mime_type != "application/xhtml+xml") |
956 return false; | 986 return false; |
957 } | 987 } |
958 return true; | 988 return true; |
959 } | 989 } |
960 | 990 |
961 } // namespace page_load_metrics | 991 } // namespace page_load_metrics |
OLD | NEW |