| 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 "components/page_load_metrics/browser/metrics_web_contents_observer.h" | 5 #include "components/page_load_metrics/browser/metrics_web_contents_observer.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 observer->OnFailedProvisionalLoad(navigation_handle); | 291 observer->OnFailedProvisionalLoad(navigation_handle); |
| 292 } | 292 } |
| 293 } | 293 } |
| 294 | 294 |
| 295 void PageLoadTracker::Redirect(content::NavigationHandle* navigation_handle) { | 295 void PageLoadTracker::Redirect(content::NavigationHandle* navigation_handle) { |
| 296 for (const auto& observer : observers_) { | 296 for (const auto& observer : observers_) { |
| 297 observer->OnRedirect(navigation_handle); | 297 observer->OnRedirect(navigation_handle); |
| 298 } | 298 } |
| 299 } | 299 } |
| 300 | 300 |
| 301 bool PageLoadTracker::UpdateTiming(const PageLoadTiming& new_timing) { | 301 bool PageLoadTracker::UpdateTiming(const PageLoadTiming& new_timing, |
| 302 const PageLoadMetadata& new_metadata) { |
| 302 // Throw away IPCs that are not relevant to the current navigation. | 303 // Throw away IPCs that are not relevant to the current navigation. |
| 303 // Two timing structures cannot refer to the same navigation if they indicate | 304 // Two timing structures cannot refer to the same navigation if they indicate |
| 304 // that a navigation started at different times, so a new timing struct with a | 305 // that a navigation started at different times, so a new timing struct with a |
| 305 // different start time from an earlier struct is considered invalid. | 306 // different start time from an earlier struct is considered invalid. |
| 306 bool valid_timing_descendent = | 307 bool valid_timing_descendent = |
| 307 timing_.navigation_start.is_null() || | 308 timing_.navigation_start.is_null() || |
| 308 timing_.navigation_start == new_timing.navigation_start; | 309 timing_.navigation_start == new_timing.navigation_start; |
| 309 if (IsValidPageLoadTiming(new_timing) && valid_timing_descendent) { | 310 if (IsValidPageLoadTiming(new_timing) && valid_timing_descendent) { |
| 310 timing_ = new_timing; | 311 timing_ = new_timing; |
| 312 metadata_ = new_metadata; |
| 311 return true; | 313 return true; |
| 312 } | 314 } |
| 313 return false; | 315 return false; |
| 314 } | 316 } |
| 315 | 317 |
| 316 bool PageLoadTracker::HasBackgrounded() { | 318 bool PageLoadTracker::HasBackgrounded() { |
| 317 return !started_in_foreground_ || !background_time_.is_null(); | 319 return !started_in_foreground_ || !background_time_.is_null(); |
| 318 } | 320 } |
| 319 | 321 |
| 320 void PageLoadTracker::set_renderer_tracked(bool renderer_tracked) { | 322 void PageLoadTracker::set_renderer_tracked(bool renderer_tracked) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 341 } else { | 343 } else { |
| 342 DCHECK(abort_time_.is_null()); | 344 DCHECK(abort_time_.is_null()); |
| 343 } | 345 } |
| 344 | 346 |
| 345 if (!commit_time_.is_null()) { | 347 if (!commit_time_.is_null()) { |
| 346 DCHECK_GT(commit_time_, navigation_start_); | 348 DCHECK_GT(commit_time_, navigation_start_); |
| 347 time_to_commit = commit_time_ - navigation_start_; | 349 time_to_commit = commit_time_ - navigation_start_; |
| 348 } else { | 350 } else { |
| 349 DCHECK(commit_time_.is_null()); | 351 DCHECK(commit_time_.is_null()); |
| 350 } | 352 } |
| 351 return PageLoadExtraInfo(first_background_time, first_foreground_time, | 353 return PageLoadExtraInfo( |
| 352 started_in_foreground_, | 354 first_background_time, first_foreground_time, started_in_foreground_, |
| 353 commit_time_.is_null() ? GURL() : url_, | 355 commit_time_.is_null() ? GURL() : url_, time_to_commit, abort_type_, |
| 354 time_to_commit, abort_type_, time_to_abort); | 356 time_to_abort, metadata_); |
| 355 } | 357 } |
| 356 | 358 |
| 357 void PageLoadTracker::NotifyAbort(UserAbortType abort_type, | 359 void PageLoadTracker::NotifyAbort(UserAbortType abort_type, |
| 358 base::TimeTicks timestamp) { | 360 base::TimeTicks timestamp) { |
| 359 DCHECK_NE(abort_type, ABORT_NONE); | 361 DCHECK_NE(abort_type, ABORT_NONE); |
| 360 // Use UpdateAbort to update an already notified PageLoadTracker. | 362 // Use UpdateAbort to update an already notified PageLoadTracker. |
| 361 if (abort_type_ != ABORT_NONE) | 363 if (abort_type_ != ABORT_NONE) |
| 362 return; | 364 return; |
| 363 | 365 |
| 364 UpdateAbortInternal(abort_type, timestamp); | 366 UpdateAbortInternal(abort_type, timestamp); |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 646 base::TimeTicks timestamp = new_navigation->NavigationStart(); | 648 base::TimeTicks timestamp = new_navigation->NavigationStart(); |
| 647 if (last_aborted_load->IsLikelyProvisionalAbort(timestamp)) | 649 if (last_aborted_load->IsLikelyProvisionalAbort(timestamp)) |
| 648 last_aborted_load->UpdateAbort(ABORT_UNKNOWN_NAVIGATION, timestamp); | 650 last_aborted_load->UpdateAbort(ABORT_UNKNOWN_NAVIGATION, timestamp); |
| 649 | 651 |
| 650 aborted_provisional_loads_.clear(); | 652 aborted_provisional_loads_.clear(); |
| 651 return last_aborted_load; | 653 return last_aborted_load; |
| 652 } | 654 } |
| 653 | 655 |
| 654 void MetricsWebContentsObserver::OnTimingUpdated( | 656 void MetricsWebContentsObserver::OnTimingUpdated( |
| 655 content::RenderFrameHost* render_frame_host, | 657 content::RenderFrameHost* render_frame_host, |
| 656 const PageLoadTiming& timing) { | 658 const PageLoadTiming& timing, |
| 659 const PageLoadMetadata& metadata) { |
| 657 bool error = false; | 660 bool error = false; |
| 658 if (!committed_load_ || !committed_load_->renderer_tracked()) { | 661 if (!committed_load_ || !committed_load_->renderer_tracked()) { |
| 659 RecordInternalError(ERR_IPC_WITH_NO_RELEVANT_LOAD); | 662 RecordInternalError(ERR_IPC_WITH_NO_RELEVANT_LOAD); |
| 660 error = true; | 663 error = true; |
| 661 } | 664 } |
| 662 | 665 |
| 663 // We may receive notifications from frames that have been navigated away | 666 // We may receive notifications from frames that have been navigated away |
| 664 // from. We simply ignore them. | 667 // from. We simply ignore them. |
| 665 if (render_frame_host != web_contents()->GetMainFrame()) { | 668 if (render_frame_host != web_contents()->GetMainFrame()) { |
| 666 RecordInternalError(ERR_IPC_FROM_WRONG_FRAME); | 669 RecordInternalError(ERR_IPC_FROM_WRONG_FRAME); |
| 667 error = true; | 670 error = true; |
| 668 } | 671 } |
| 669 | 672 |
| 670 // For urls like chrome://newtab, the renderer and browser disagree, | 673 // For urls like chrome://newtab, the renderer and browser disagree, |
| 671 // so we have to double check that the renderer isn't sending data from a | 674 // so we have to double check that the renderer isn't sending data from a |
| 672 // bad url like https://www.google.com/_/chrome/newtab. | 675 // bad url like https://www.google.com/_/chrome/newtab. |
| 673 if (!web_contents()->GetLastCommittedURL().SchemeIsHTTPOrHTTPS()) { | 676 if (!web_contents()->GetLastCommittedURL().SchemeIsHTTPOrHTTPS()) { |
| 674 RecordInternalError(ERR_IPC_FROM_BAD_URL_SCHEME); | 677 RecordInternalError(ERR_IPC_FROM_BAD_URL_SCHEME); |
| 675 error = true; | 678 error = true; |
| 676 } | 679 } |
| 677 | 680 |
| 678 if (error) | 681 if (error) |
| 679 return; | 682 return; |
| 680 | 683 |
| 681 if (!committed_load_->UpdateTiming(timing)) { | 684 if (!committed_load_->UpdateTiming(timing, metadata)) { |
| 682 // If the page load tracker cannot update its timing, something is wrong | 685 // If the page load tracker cannot update its timing, something is wrong |
| 683 // with the IPC (it's from another load, or it's invalid in some other way). | 686 // with the IPC (it's from another load, or it's invalid in some other way). |
| 684 // We expect this to be a rare occurrence. | 687 // We expect this to be a rare occurrence. |
| 685 RecordInternalError(ERR_BAD_TIMING_IPC); | 688 RecordInternalError(ERR_BAD_TIMING_IPC); |
| 686 } | 689 } |
| 687 } | 690 } |
| 688 | 691 |
| 689 } // namespace page_load_metrics | 692 } // namespace page_load_metrics |
| OLD | NEW |