Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(154)

Side by Side Diff: components/page_load_metrics/browser/metrics_web_contents_observer.cc

Issue 1857443002: Plumb experiment flags through page_load_metrics and add a new observer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@page_load_experiments
Patch Set: remove todo and fix up a test script Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 observer->OnFailedProvisionalLoad(navigation_handle); 326 observer->OnFailedProvisionalLoad(navigation_handle);
327 } 327 }
328 } 328 }
329 329
330 void PageLoadTracker::Redirect(content::NavigationHandle* navigation_handle) { 330 void PageLoadTracker::Redirect(content::NavigationHandle* navigation_handle) {
331 for (const auto& observer : observers_) { 331 for (const auto& observer : observers_) {
332 observer->OnRedirect(navigation_handle); 332 observer->OnRedirect(navigation_handle);
333 } 333 }
334 } 334 }
335 335
336 bool PageLoadTracker::UpdateTiming(const PageLoadTiming& new_timing) { 336 bool PageLoadTracker::UpdateTiming(const PageLoadTiming& new_timing,
337 const PageLoadMetadata& new_metadata) {
337 // Throw away IPCs that are not relevant to the current navigation. 338 // Throw away IPCs that are not relevant to the current navigation.
338 // Two timing structures cannot refer to the same navigation if they indicate 339 // Two timing structures cannot refer to the same navigation if they indicate
339 // that a navigation started at different times, so a new timing struct with a 340 // that a navigation started at different times, so a new timing struct with a
340 // different start time from an earlier struct is considered invalid. 341 // different start time from an earlier struct is considered invalid.
341 bool valid_timing_descendent = 342 bool valid_timing_descendent =
342 timing_.navigation_start.is_null() || 343 timing_.navigation_start.is_null() ||
343 timing_.navigation_start == new_timing.navigation_start; 344 timing_.navigation_start == new_timing.navigation_start;
344 if (IsValidPageLoadTiming(new_timing) && valid_timing_descendent) { 345 // Ensure flags sent previously are still present in the new metadata fields.
346 bool valid_behavior_descendent =
347 (metadata_.behavior_flags & new_metadata.behavior_flags) ==
348 metadata_.behavior_flags;
349 if (IsValidPageLoadTiming(new_timing) && valid_timing_descendent &&
350 valid_behavior_descendent) {
345 timing_ = new_timing; 351 timing_ = new_timing;
352 metadata_ = new_metadata;
346 return true; 353 return true;
347 } 354 }
348 return false; 355 return false;
349 } 356 }
350 357
351 bool PageLoadTracker::HasBackgrounded() { 358 bool PageLoadTracker::HasBackgrounded() {
352 return !started_in_foreground_ || !background_time_.is_null(); 359 return !started_in_foreground_ || !background_time_.is_null();
353 } 360 }
354 361
355 void PageLoadTracker::set_renderer_tracked(bool renderer_tracked) { 362 void PageLoadTracker::set_renderer_tracked(bool renderer_tracked) {
(...skipping 20 matching lines...) Expand all
376 } else { 383 } else {
377 DCHECK(abort_time_.is_null()); 384 DCHECK(abort_time_.is_null());
378 } 385 }
379 386
380 if (!commit_time_.is_null()) { 387 if (!commit_time_.is_null()) {
381 DCHECK_GT(commit_time_, navigation_start_); 388 DCHECK_GT(commit_time_, navigation_start_);
382 time_to_commit = commit_time_ - navigation_start_; 389 time_to_commit = commit_time_ - navigation_start_;
383 } else { 390 } else {
384 DCHECK(commit_time_.is_null()); 391 DCHECK(commit_time_.is_null());
385 } 392 }
386 return PageLoadExtraInfo(first_background_time, first_foreground_time, 393 return PageLoadExtraInfo(
387 started_in_foreground_, 394 first_background_time, first_foreground_time, started_in_foreground_,
388 commit_time_.is_null() ? GURL() : url_, 395 commit_time_.is_null() ? GURL() : url_, time_to_commit, abort_type_,
389 time_to_commit, abort_type_, time_to_abort); 396 time_to_abort, metadata_);
390 } 397 }
391 398
392 void PageLoadTracker::NotifyAbort(UserAbortType abort_type, 399 void PageLoadTracker::NotifyAbort(UserAbortType abort_type,
393 base::TimeTicks timestamp) { 400 base::TimeTicks timestamp) {
394 DCHECK_NE(abort_type, ABORT_NONE); 401 DCHECK_NE(abort_type, ABORT_NONE);
395 // Use UpdateAbort to update an already notified PageLoadTracker. 402 // Use UpdateAbort to update an already notified PageLoadTracker.
396 if (abort_type_ != ABORT_NONE) 403 if (abort_type_ != ABORT_NONE)
397 return; 404 return;
398 405
399 UpdateAbortInternal(abort_type, timestamp); 406 UpdateAbortInternal(abort_type, timestamp);
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 base::TimeTicks timestamp = new_navigation->NavigationStart(); 688 base::TimeTicks timestamp = new_navigation->NavigationStart();
682 if (last_aborted_load->IsLikelyProvisionalAbort(timestamp)) 689 if (last_aborted_load->IsLikelyProvisionalAbort(timestamp))
683 last_aborted_load->UpdateAbort(ABORT_UNKNOWN_NAVIGATION, timestamp); 690 last_aborted_load->UpdateAbort(ABORT_UNKNOWN_NAVIGATION, timestamp);
684 691
685 aborted_provisional_loads_.clear(); 692 aborted_provisional_loads_.clear();
686 return last_aborted_load; 693 return last_aborted_load;
687 } 694 }
688 695
689 void MetricsWebContentsObserver::OnTimingUpdated( 696 void MetricsWebContentsObserver::OnTimingUpdated(
690 content::RenderFrameHost* render_frame_host, 697 content::RenderFrameHost* render_frame_host,
691 const PageLoadTiming& timing) { 698 const PageLoadTiming& timing,
699 const PageLoadMetadata& metadata) {
692 bool error = false; 700 bool error = false;
693 if (!committed_load_ || !committed_load_->renderer_tracked()) { 701 if (!committed_load_ || !committed_load_->renderer_tracked()) {
694 RecordInternalError(ERR_IPC_WITH_NO_RELEVANT_LOAD); 702 RecordInternalError(ERR_IPC_WITH_NO_RELEVANT_LOAD);
695 error = true; 703 error = true;
696 } 704 }
697 705
698 // We may receive notifications from frames that have been navigated away 706 // We may receive notifications from frames that have been navigated away
699 // from. We simply ignore them. 707 // from. We simply ignore them.
700 if (render_frame_host != web_contents()->GetMainFrame()) { 708 if (render_frame_host != web_contents()->GetMainFrame()) {
701 RecordInternalError(ERR_IPC_FROM_WRONG_FRAME); 709 RecordInternalError(ERR_IPC_FROM_WRONG_FRAME);
702 error = true; 710 error = true;
703 } 711 }
704 712
705 // For urls like chrome://newtab, the renderer and browser disagree, 713 // For urls like chrome://newtab, the renderer and browser disagree,
706 // so we have to double check that the renderer isn't sending data from a 714 // so we have to double check that the renderer isn't sending data from a
707 // bad url like https://www.google.com/_/chrome/newtab. 715 // bad url like https://www.google.com/_/chrome/newtab.
708 if (!web_contents()->GetLastCommittedURL().SchemeIsHTTPOrHTTPS()) { 716 if (!web_contents()->GetLastCommittedURL().SchemeIsHTTPOrHTTPS()) {
709 RecordInternalError(ERR_IPC_FROM_BAD_URL_SCHEME); 717 RecordInternalError(ERR_IPC_FROM_BAD_URL_SCHEME);
710 error = true; 718 error = true;
711 } 719 }
712 720
713 if (error) 721 if (error)
714 return; 722 return;
715 723
716 if (!committed_load_->UpdateTiming(timing)) { 724 if (!committed_load_->UpdateTiming(timing, metadata)) {
717 // If the page load tracker cannot update its timing, something is wrong 725 // If the page load tracker cannot update its timing, something is wrong
718 // with the IPC (it's from another load, or it's invalid in some other way). 726 // with the IPC (it's from another load, or it's invalid in some other way).
719 // We expect this to be a rare occurrence. 727 // We expect this to be a rare occurrence.
720 RecordInternalError(ERR_BAD_TIMING_IPC); 728 RecordInternalError(ERR_BAD_TIMING_IPC);
721 } 729 }
722 } 730 }
723 731
724 } // namespace page_load_metrics 732 } // namespace page_load_metrics
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698