OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/page_load_tracker.h" | 5 #include "chrome/browser/page_load_metrics/page_load_tracker.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 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 app_entered_background_(false), | 296 app_entered_background_(false), |
297 navigation_start_(navigation_handle->NavigationStart()), | 297 navigation_start_(navigation_handle->NavigationStart()), |
298 url_(navigation_handle->GetURL()), | 298 url_(navigation_handle->GetURL()), |
299 start_url_(navigation_handle->GetURL()), | 299 start_url_(navigation_handle->GetURL()), |
300 did_commit_(false), | 300 did_commit_(false), |
301 page_end_reason_(END_NONE), | 301 page_end_reason_(END_NONE), |
302 page_end_user_initiated_info_(UserInitiatedInfo::NotUserInitiated()), | 302 page_end_user_initiated_info_(UserInitiatedInfo::NotUserInitiated()), |
303 started_in_foreground_(in_foreground), | 303 started_in_foreground_(in_foreground), |
304 page_transition_(navigation_handle->GetPageTransition()), | 304 page_transition_(navigation_handle->GetPageTransition()), |
305 user_initiated_info_(user_initiated_info), | 305 user_initiated_info_(user_initiated_info), |
| 306 child_loading_behavior_flags_(0), |
306 aborted_chain_size_(aborted_chain_size), | 307 aborted_chain_size_(aborted_chain_size), |
307 aborted_chain_size_same_url_(aborted_chain_size_same_url), | 308 aborted_chain_size_same_url_(aborted_chain_size_same_url), |
308 embedder_interface_(embedder_interface) { | 309 embedder_interface_(embedder_interface) { |
309 DCHECK(!navigation_handle->HasCommitted()); | 310 DCHECK(!navigation_handle->HasCommitted()); |
310 embedder_interface_->RegisterObservers(this); | 311 embedder_interface_->RegisterObservers(this); |
311 INVOKE_AND_PRUNE_OBSERVERS(observers_, OnStart, navigation_handle, | 312 INVOKE_AND_PRUNE_OBSERVERS(observers_, OnStart, navigation_handle, |
312 currently_committed_url, started_in_foreground_); | 313 currently_committed_url, started_in_foreground_); |
313 } | 314 } |
314 | 315 |
315 PageLoadTracker::~PageLoadTracker() { | 316 PageLoadTracker::~PageLoadTracker() { |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
499 if (destination.navigation_start() > first_paint_time) | 500 if (destination.navigation_start() > first_paint_time) |
500 first_paint_to_navigation = | 501 first_paint_to_navigation = |
501 destination.navigation_start() - first_paint_time; | 502 destination.navigation_start() - first_paint_time; |
502 PAGE_LOAD_HISTOGRAM(internal::kClientRedirectFirstPaintToNavigation, | 503 PAGE_LOAD_HISTOGRAM(internal::kClientRedirectFirstPaintToNavigation, |
503 first_paint_to_navigation); | 504 first_paint_to_navigation); |
504 } else { | 505 } else { |
505 UMA_HISTOGRAM_BOOLEAN(internal::kClientRedirectWithoutPaint, true); | 506 UMA_HISTOGRAM_BOOLEAN(internal::kClientRedirectWithoutPaint, true); |
506 } | 507 } |
507 } | 508 } |
508 | 509 |
| 510 void PageLoadTracker::UpdateChildMetadata( |
| 511 const PageLoadMetadata& child_metadata) { |
| 512 // Merge the child loading behavior flags with any we've already observed, |
| 513 // possibly from other child frames. |
| 514 const int last_child_loading_behavior_flags = child_loading_behavior_flags_; |
| 515 child_loading_behavior_flags_ |= child_metadata.behavior_flags; |
| 516 if (last_child_loading_behavior_flags == child_loading_behavior_flags_) |
| 517 return; |
| 518 |
| 519 PageLoadExtraInfo extra_info(ComputePageLoadExtraInfo()); |
| 520 for (const auto& observer : observers_) { |
| 521 observer->OnLoadingBehaviorObserved(extra_info); |
| 522 } |
| 523 } |
| 524 |
509 bool PageLoadTracker::UpdateTiming(const PageLoadTiming& new_timing, | 525 bool PageLoadTracker::UpdateTiming(const PageLoadTiming& new_timing, |
510 const PageLoadMetadata& new_metadata) { | 526 const PageLoadMetadata& new_metadata) { |
511 // Throw away IPCs that are not relevant to the current navigation. | 527 // Throw away IPCs that are not relevant to the current navigation. |
512 // Two timing structures cannot refer to the same navigation if they indicate | 528 // Two timing structures cannot refer to the same navigation if they indicate |
513 // that a navigation started at different times, so a new timing struct with a | 529 // that a navigation started at different times, so a new timing struct with a |
514 // different start time from an earlier struct is considered invalid. | 530 // different start time from an earlier struct is considered invalid. |
515 bool valid_timing_descendent = | 531 bool valid_timing_descendent = |
516 timing_.navigation_start.is_null() || | 532 timing_.navigation_start.is_null() || |
517 timing_.navigation_start == new_timing.navigation_start; | 533 timing_.navigation_start == new_timing.navigation_start; |
518 // Ensure flags sent previously are still present in the new metadata fields. | 534 // Ensure flags sent previously are still present in the new metadata fields. |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
608 } else { | 624 } else { |
609 DCHECK(page_end_time_.is_null()); | 625 DCHECK(page_end_time_.is_null()); |
610 } | 626 } |
611 | 627 |
612 // page_end_reason_ == END_NONE implies page_end_user_initiated_info_ is not | 628 // page_end_reason_ == END_NONE implies page_end_user_initiated_info_ is not |
613 // user initiated. | 629 // user initiated. |
614 DCHECK(page_end_reason_ != END_NONE || | 630 DCHECK(page_end_reason_ != END_NONE || |
615 (!page_end_user_initiated_info_.browser_initiated && | 631 (!page_end_user_initiated_info_.browser_initiated && |
616 !page_end_user_initiated_info_.user_gesture && | 632 !page_end_user_initiated_info_.user_gesture && |
617 !page_end_user_initiated_info_.user_input_event)); | 633 !page_end_user_initiated_info_.user_input_event)); |
618 return PageLoadExtraInfo(navigation_start_, first_background_time, | 634 return PageLoadExtraInfo( |
619 first_foreground_time, started_in_foreground_, | 635 navigation_start_, first_background_time, first_foreground_time, |
620 user_initiated_info_, url(), start_url_, did_commit_, | 636 started_in_foreground_, user_initiated_info_, url(), start_url_, |
621 page_end_reason_, page_end_user_initiated_info_, | 637 did_commit_, page_end_reason_, page_end_user_initiated_info_, |
622 page_end_time, metadata_); | 638 page_end_time, metadata_, child_loading_behavior_flags_); |
623 } | 639 } |
624 | 640 |
625 bool PageLoadTracker::HasMatchingNavigationRequestID( | 641 bool PageLoadTracker::HasMatchingNavigationRequestID( |
626 const content::GlobalRequestID& request_id) const { | 642 const content::GlobalRequestID& request_id) const { |
627 DCHECK(request_id != content::GlobalRequestID()); | 643 DCHECK(request_id != content::GlobalRequestID()); |
628 return navigation_request_id_.has_value() && | 644 return navigation_request_id_.has_value() && |
629 navigation_request_id_.value() == request_id; | 645 navigation_request_id_.value() == request_id; |
630 } | 646 } |
631 | 647 |
632 void PageLoadTracker::NotifyPageEnd(PageEndReason page_end_reason, | 648 void PageLoadTracker::NotifyPageEnd(PageEndReason page_end_reason, |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
708 // user initiated. | 724 // user initiated. |
709 if (page_end_reason != END_CLIENT_REDIRECT) | 725 if (page_end_reason != END_CLIENT_REDIRECT) |
710 page_end_user_initiated_info_ = user_initiated_info; | 726 page_end_user_initiated_info_ = user_initiated_info; |
711 | 727 |
712 if (is_certainly_browser_timestamp) { | 728 if (is_certainly_browser_timestamp) { |
713 ClampBrowserTimestampIfInterProcessTimeTickSkew(&page_end_time_); | 729 ClampBrowserTimestampIfInterProcessTimeTickSkew(&page_end_time_); |
714 } | 730 } |
715 } | 731 } |
716 | 732 |
717 } // namespace page_load_metrics | 733 } // namespace page_load_metrics |
OLD | NEW |