Chromium Code Reviews| 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 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 316 observer->OnFailedProvisionalLoad(navigation_handle); | 316 observer->OnFailedProvisionalLoad(navigation_handle); |
| 317 } | 317 } |
| 318 } | 318 } |
| 319 | 319 |
| 320 void PageLoadTracker::Redirect(content::NavigationHandle* navigation_handle) { | 320 void PageLoadTracker::Redirect(content::NavigationHandle* navigation_handle) { |
| 321 for (const auto& observer : observers_) { | 321 for (const auto& observer : observers_) { |
| 322 observer->OnRedirect(navigation_handle); | 322 observer->OnRedirect(navigation_handle); |
| 323 } | 323 } |
| 324 } | 324 } |
| 325 | 325 |
| 326 bool PageLoadTracker::UpdateTiming(const PageLoadTiming& new_timing) { | 326 bool PageLoadTracker::UpdateTiming(const PageLoadTiming& new_timing, |
| 327 const PageLoadMetadata& new_metadata) { | |
| 327 // Throw away IPCs that are not relevant to the current navigation. | 328 // Throw away IPCs that are not relevant to the current navigation. |
| 328 // Two timing structures cannot refer to the same navigation if they indicate | 329 // Two timing structures cannot refer to the same navigation if they indicate |
| 329 // that a navigation started at different times, so a new timing struct with a | 330 // that a navigation started at different times, so a new timing struct with a |
| 330 // different start time from an earlier struct is considered invalid. | 331 // different start time from an earlier struct is considered invalid. |
| 331 bool valid_timing_descendent = | 332 bool valid_timing_descendent = |
|
Bryan McQuade
2016/04/11 20:18:47
just to be extra safe, could we do a similar test
Charlie Harrison
2016/04/12 15:18:50
Done.
| |
| 332 timing_.navigation_start.is_null() || | 333 timing_.navigation_start.is_null() || |
| 333 timing_.navigation_start == new_timing.navigation_start; | 334 timing_.navigation_start == new_timing.navigation_start; |
| 334 if (IsValidPageLoadTiming(new_timing) && valid_timing_descendent) { | 335 if (IsValidPageLoadTiming(new_timing) && valid_timing_descendent) { |
| 335 timing_ = new_timing; | 336 timing_ = new_timing; |
| 337 metadata_ = new_metadata; | |
| 336 return true; | 338 return true; |
| 337 } | 339 } |
| 338 return false; | 340 return false; |
| 339 } | 341 } |
| 340 | 342 |
| 341 bool PageLoadTracker::HasBackgrounded() { | 343 bool PageLoadTracker::HasBackgrounded() { |
| 342 return !started_in_foreground_ || !background_time_.is_null(); | 344 return !started_in_foreground_ || !background_time_.is_null(); |
| 343 } | 345 } |
| 344 | 346 |
| 345 void PageLoadTracker::set_renderer_tracked(bool renderer_tracked) { | 347 void PageLoadTracker::set_renderer_tracked(bool renderer_tracked) { |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 366 } else { | 368 } else { |
| 367 DCHECK(abort_time_.is_null()); | 369 DCHECK(abort_time_.is_null()); |
| 368 } | 370 } |
| 369 | 371 |
| 370 if (!commit_time_.is_null()) { | 372 if (!commit_time_.is_null()) { |
| 371 DCHECK_GT(commit_time_, navigation_start_); | 373 DCHECK_GT(commit_time_, navigation_start_); |
| 372 time_to_commit = commit_time_ - navigation_start_; | 374 time_to_commit = commit_time_ - navigation_start_; |
| 373 } else { | 375 } else { |
| 374 DCHECK(commit_time_.is_null()); | 376 DCHECK(commit_time_.is_null()); |
| 375 } | 377 } |
| 376 return PageLoadExtraInfo(first_background_time, first_foreground_time, | 378 return PageLoadExtraInfo( |
| 377 started_in_foreground_, | 379 first_background_time, first_foreground_time, started_in_foreground_, |
| 378 commit_time_.is_null() ? GURL() : url_, | 380 commit_time_.is_null() ? GURL() : url_, time_to_commit, abort_type_, |
| 379 time_to_commit, abort_type_, time_to_abort); | 381 time_to_abort, metadata_); |
| 380 } | 382 } |
| 381 | 383 |
| 382 void PageLoadTracker::NotifyAbort(UserAbortType abort_type, | 384 void PageLoadTracker::NotifyAbort(UserAbortType abort_type, |
| 383 base::TimeTicks timestamp) { | 385 base::TimeTicks timestamp) { |
| 384 DCHECK_NE(abort_type, ABORT_NONE); | 386 DCHECK_NE(abort_type, ABORT_NONE); |
| 385 // Use UpdateAbort to update an already notified PageLoadTracker. | 387 // Use UpdateAbort to update an already notified PageLoadTracker. |
| 386 if (abort_type_ != ABORT_NONE) | 388 if (abort_type_ != ABORT_NONE) |
| 387 return; | 389 return; |
| 388 | 390 |
| 389 UpdateAbortInternal(abort_type, timestamp); | 391 UpdateAbortInternal(abort_type, timestamp); |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 671 base::TimeTicks timestamp = new_navigation->NavigationStart(); | 673 base::TimeTicks timestamp = new_navigation->NavigationStart(); |
| 672 if (last_aborted_load->IsLikelyProvisionalAbort(timestamp)) | 674 if (last_aborted_load->IsLikelyProvisionalAbort(timestamp)) |
| 673 last_aborted_load->UpdateAbort(ABORT_UNKNOWN_NAVIGATION, timestamp); | 675 last_aborted_load->UpdateAbort(ABORT_UNKNOWN_NAVIGATION, timestamp); |
| 674 | 676 |
| 675 aborted_provisional_loads_.clear(); | 677 aborted_provisional_loads_.clear(); |
| 676 return last_aborted_load; | 678 return last_aborted_load; |
| 677 } | 679 } |
| 678 | 680 |
| 679 void MetricsWebContentsObserver::OnTimingUpdated( | 681 void MetricsWebContentsObserver::OnTimingUpdated( |
| 680 content::RenderFrameHost* render_frame_host, | 682 content::RenderFrameHost* render_frame_host, |
| 681 const PageLoadTiming& timing) { | 683 const PageLoadTiming& timing, |
| 684 const PageLoadMetadata& metadata) { | |
| 682 bool error = false; | 685 bool error = false; |
| 683 if (!committed_load_ || !committed_load_->renderer_tracked()) { | 686 if (!committed_load_ || !committed_load_->renderer_tracked()) { |
| 684 RecordInternalError(ERR_IPC_WITH_NO_RELEVANT_LOAD); | 687 RecordInternalError(ERR_IPC_WITH_NO_RELEVANT_LOAD); |
| 685 error = true; | 688 error = true; |
| 686 } | 689 } |
| 687 | 690 |
| 688 // We may receive notifications from frames that have been navigated away | 691 // We may receive notifications from frames that have been navigated away |
| 689 // from. We simply ignore them. | 692 // from. We simply ignore them. |
| 690 if (render_frame_host != web_contents()->GetMainFrame()) { | 693 if (render_frame_host != web_contents()->GetMainFrame()) { |
| 691 RecordInternalError(ERR_IPC_FROM_WRONG_FRAME); | 694 RecordInternalError(ERR_IPC_FROM_WRONG_FRAME); |
| 692 error = true; | 695 error = true; |
| 693 } | 696 } |
| 694 | 697 |
| 695 // For urls like chrome://newtab, the renderer and browser disagree, | 698 // For urls like chrome://newtab, the renderer and browser disagree, |
| 696 // so we have to double check that the renderer isn't sending data from a | 699 // so we have to double check that the renderer isn't sending data from a |
| 697 // bad url like https://www.google.com/_/chrome/newtab. | 700 // bad url like https://www.google.com/_/chrome/newtab. |
| 698 if (!web_contents()->GetLastCommittedURL().SchemeIsHTTPOrHTTPS()) { | 701 if (!web_contents()->GetLastCommittedURL().SchemeIsHTTPOrHTTPS()) { |
| 699 RecordInternalError(ERR_IPC_FROM_BAD_URL_SCHEME); | 702 RecordInternalError(ERR_IPC_FROM_BAD_URL_SCHEME); |
| 700 error = true; | 703 error = true; |
| 701 } | 704 } |
| 702 | 705 |
| 703 if (error) | 706 if (error) |
| 704 return; | 707 return; |
| 705 | 708 |
| 706 if (!committed_load_->UpdateTiming(timing)) { | 709 if (!committed_load_->UpdateTiming(timing, metadata)) { |
| 707 // If the page load tracker cannot update its timing, something is wrong | 710 // If the page load tracker cannot update its timing, something is wrong |
| 708 // with the IPC (it's from another load, or it's invalid in some other way). | 711 // with the IPC (it's from another load, or it's invalid in some other way). |
| 709 // We expect this to be a rare occurrence. | 712 // We expect this to be a rare occurrence. |
| 710 RecordInternalError(ERR_BAD_TIMING_IPC); | 713 RecordInternalError(ERR_BAD_TIMING_IPC); |
| 711 } | 714 } |
| 712 } | 715 } |
| 713 | 716 |
| 714 } // namespace page_load_metrics | 717 } // namespace page_load_metrics |
| OLD | NEW |