Index: chrome/browser/page_load_metrics/page_load_tracker.cc |
diff --git a/chrome/browser/page_load_metrics/page_load_tracker.cc b/chrome/browser/page_load_metrics/page_load_tracker.cc |
index 07390cbc1f5278029222447b748c8bc559ad70f5..f6c4b6cc734fdf5e965844b727ae8570ac92ac6e 100644 |
--- a/chrome/browser/page_load_metrics/page_load_tracker.cc |
+++ b/chrome/browser/page_load_metrics/page_load_tracker.cc |
@@ -129,7 +129,7 @@ bool EventsInOrder(const base::Optional<base::TimeDelta>& first, |
internal::PageLoadTimingStatus IsValidPageLoadTiming( |
const PageLoadTiming& timing) { |
- if (timing.IsEmpty()) |
+ if (page_load_metrics::IsEmpty(timing)) |
return internal::INVALID_EMPTY_TIMING; |
// If we have a non-empty timing, it should always have a navigation start. |
@@ -140,11 +140,11 @@ internal::PageLoadTimingStatus IsValidPageLoadTiming( |
// Verify proper ordering between the various timings. |
- if (!EventsInOrder(timing.response_start, timing.parse_timing.parse_start)) { |
+ if (!EventsInOrder(timing.response_start, timing.parse_timing->parse_start)) { |
// We sometimes get a zero response_start with a non-zero parse start. See |
// crbug.com/590212. |
LOG(ERROR) << "Invalid response_start " << timing.response_start |
- << " for parse_start " << timing.parse_timing.parse_start; |
+ << " for parse_start " << timing.parse_timing->parse_start; |
// When browser-side navigation is enabled, we sometimes encounter this |
// error case. For now, we disable reporting of this error, since most |
// PageLoadMetricsObservers don't care about response_start and we want to |
@@ -155,122 +155,122 @@ internal::PageLoadTimingStatus IsValidPageLoadTiming( |
// return internal::INVALID_ORDER_RESPONSE_START_PARSE_START; |
} |
- if (!EventsInOrder(timing.parse_timing.parse_start, |
- timing.parse_timing.parse_stop)) { |
- LOG(ERROR) << "Invalid parse_start " << timing.parse_timing.parse_start |
- << " for parse_stop " << timing.parse_timing.parse_stop; |
+ if (!EventsInOrder(timing.parse_timing->parse_start, |
+ timing.parse_timing->parse_stop)) { |
+ LOG(ERROR) << "Invalid parse_start " << timing.parse_timing->parse_start |
+ << " for parse_stop " << timing.parse_timing->parse_stop; |
return internal::INVALID_ORDER_PARSE_START_PARSE_STOP; |
} |
- if (timing.parse_timing.parse_stop) { |
+ if (timing.parse_timing->parse_stop) { |
const base::TimeDelta parse_duration = |
- timing.parse_timing.parse_stop.value() - |
- timing.parse_timing.parse_start.value(); |
- if (timing.parse_timing.parse_blocked_on_script_load_duration > |
+ timing.parse_timing->parse_stop.value() - |
+ timing.parse_timing->parse_start.value(); |
+ if (timing.parse_timing->parse_blocked_on_script_load_duration > |
parse_duration) { |
LOG(ERROR) << "Invalid parse_blocked_on_script_load_duration " |
- << timing.parse_timing.parse_blocked_on_script_load_duration |
+ << timing.parse_timing->parse_blocked_on_script_load_duration |
<< " for parse duration " << parse_duration; |
return internal::INVALID_SCRIPT_LOAD_LONGER_THAN_PARSE; |
} |
- if (timing.parse_timing.parse_blocked_on_script_execution_duration > |
+ if (timing.parse_timing->parse_blocked_on_script_execution_duration > |
parse_duration) { |
LOG(ERROR) |
<< "Invalid parse_blocked_on_script_execution_duration " |
- << timing.parse_timing.parse_blocked_on_script_execution_duration |
+ << timing.parse_timing->parse_blocked_on_script_execution_duration |
<< " for parse duration " << parse_duration; |
return internal::INVALID_SCRIPT_EXEC_LONGER_THAN_PARSE; |
} |
} |
if (timing.parse_timing |
- .parse_blocked_on_script_load_from_document_write_duration > |
- timing.parse_timing.parse_blocked_on_script_load_duration) { |
+ ->parse_blocked_on_script_load_from_document_write_duration > |
+ timing.parse_timing->parse_blocked_on_script_load_duration) { |
LOG(ERROR) |
<< "Invalid parse_blocked_on_script_load_from_document_write_duration " |
<< timing.parse_timing |
- .parse_blocked_on_script_load_from_document_write_duration |
+ ->parse_blocked_on_script_load_from_document_write_duration |
<< " for parse_blocked_on_script_load_duration " |
- << timing.parse_timing.parse_blocked_on_script_load_duration; |
+ << timing.parse_timing->parse_blocked_on_script_load_duration; |
return internal::INVALID_SCRIPT_LOAD_DOC_WRITE_LONGER_THAN_SCRIPT_LOAD; |
} |
if (timing.parse_timing |
- .parse_blocked_on_script_execution_from_document_write_duration > |
- timing.parse_timing.parse_blocked_on_script_execution_duration) { |
+ ->parse_blocked_on_script_execution_from_document_write_duration > |
+ timing.parse_timing->parse_blocked_on_script_execution_duration) { |
LOG(ERROR) |
<< "Invalid " |
"parse_blocked_on_script_execution_from_document_write_duration " |
<< timing.parse_timing |
- .parse_blocked_on_script_execution_from_document_write_duration |
+ ->parse_blocked_on_script_execution_from_document_write_duration |
<< " for parse_blocked_on_script_execution_duration " |
- << timing.parse_timing.parse_blocked_on_script_execution_duration; |
+ << timing.parse_timing->parse_blocked_on_script_execution_duration; |
return internal::INVALID_SCRIPT_EXEC_DOC_WRITE_LONGER_THAN_SCRIPT_EXEC; |
} |
- if (!EventsInOrder(timing.parse_timing.parse_stop, |
- timing.document_timing.dom_content_loaded_event_start)) { |
- LOG(ERROR) << "Invalid parse_stop " << timing.parse_timing.parse_stop |
+ if (!EventsInOrder(timing.parse_timing->parse_stop, |
+ timing.document_timing->dom_content_loaded_event_start)) { |
+ LOG(ERROR) << "Invalid parse_stop " << timing.parse_timing->parse_stop |
<< " for dom_content_loaded_event_start " |
- << timing.document_timing.dom_content_loaded_event_start; |
+ << timing.document_timing->dom_content_loaded_event_start; |
return internal::INVALID_ORDER_PARSE_STOP_DOM_CONTENT_LOADED; |
} |
- if (!EventsInOrder(timing.document_timing.dom_content_loaded_event_start, |
- timing.document_timing.load_event_start)) { |
+ if (!EventsInOrder(timing.document_timing->dom_content_loaded_event_start, |
+ timing.document_timing->load_event_start)) { |
LOG(ERROR) << "Invalid dom_content_loaded_event_start " |
- << timing.document_timing.dom_content_loaded_event_start |
+ << timing.document_timing->dom_content_loaded_event_start |
<< " for load_event_start " |
- << timing.document_timing.load_event_start; |
+ << timing.document_timing->load_event_start; |
return internal::INVALID_ORDER_DOM_CONTENT_LOADED_LOAD; |
} |
- if (!EventsInOrder(timing.parse_timing.parse_start, |
- timing.document_timing.first_layout)) { |
- LOG(ERROR) << "Invalid parse_start " << timing.parse_timing.parse_start |
- << " for first_layout " << timing.document_timing.first_layout; |
+ if (!EventsInOrder(timing.parse_timing->parse_start, |
+ timing.document_timing->first_layout)) { |
+ LOG(ERROR) << "Invalid parse_start " << timing.parse_timing->parse_start |
+ << " for first_layout " << timing.document_timing->first_layout; |
return internal::INVALID_ORDER_PARSE_START_FIRST_LAYOUT; |
} |
- if (!EventsInOrder(timing.document_timing.first_layout, |
- timing.paint_timing.first_paint)) { |
+ if (!EventsInOrder(timing.document_timing->first_layout, |
+ timing.paint_timing->first_paint)) { |
// This can happen when we process an XHTML document that doesn't contain |
// well formed XML. See crbug.com/627607. |
DLOG(ERROR) << "Invalid first_layout " |
- << timing.document_timing.first_layout << " for first_paint " |
- << timing.paint_timing.first_paint; |
+ << timing.document_timing->first_layout << " for first_paint " |
+ << timing.paint_timing->first_paint; |
return internal::INVALID_ORDER_FIRST_LAYOUT_FIRST_PAINT; |
} |
- if (!EventsInOrder(timing.paint_timing.first_paint, |
- timing.paint_timing.first_text_paint)) { |
- LOG(ERROR) << "Invalid first_paint " << timing.paint_timing.first_paint |
+ if (!EventsInOrder(timing.paint_timing->first_paint, |
+ timing.paint_timing->first_text_paint)) { |
+ LOG(ERROR) << "Invalid first_paint " << timing.paint_timing->first_paint |
<< " for first_text_paint " |
- << timing.paint_timing.first_text_paint; |
+ << timing.paint_timing->first_text_paint; |
return internal::INVALID_ORDER_FIRST_PAINT_FIRST_TEXT_PAINT; |
} |
- if (!EventsInOrder(timing.paint_timing.first_paint, |
- timing.paint_timing.first_image_paint)) { |
- LOG(ERROR) << "Invalid first_paint " << timing.paint_timing.first_paint |
+ if (!EventsInOrder(timing.paint_timing->first_paint, |
+ timing.paint_timing->first_image_paint)) { |
+ LOG(ERROR) << "Invalid first_paint " << timing.paint_timing->first_paint |
<< " for first_image_paint " |
- << timing.paint_timing.first_image_paint; |
+ << timing.paint_timing->first_image_paint; |
return internal::INVALID_ORDER_FIRST_PAINT_FIRST_IMAGE_PAINT; |
} |
- if (!EventsInOrder(timing.paint_timing.first_paint, |
- timing.paint_timing.first_contentful_paint)) { |
- LOG(ERROR) << "Invalid first_paint " << timing.paint_timing.first_paint |
+ if (!EventsInOrder(timing.paint_timing->first_paint, |
+ timing.paint_timing->first_contentful_paint)) { |
+ LOG(ERROR) << "Invalid first_paint " << timing.paint_timing->first_paint |
<< " for first_contentful_paint " |
- << timing.paint_timing.first_contentful_paint; |
+ << timing.paint_timing->first_contentful_paint; |
return internal::INVALID_ORDER_FIRST_PAINT_FIRST_CONTENTFUL_PAINT; |
} |
- if (!EventsInOrder(timing.paint_timing.first_paint, |
- timing.paint_timing.first_meaningful_paint)) { |
- LOG(ERROR) << "Invalid first_paint " << timing.paint_timing.first_paint |
+ if (!EventsInOrder(timing.paint_timing->first_paint, |
+ timing.paint_timing->first_meaningful_paint)) { |
+ LOG(ERROR) << "Invalid first_paint " << timing.paint_timing->first_paint |
<< " for first_meaningful_paint " |
- << timing.paint_timing.first_meaningful_paint; |
+ << timing.paint_timing->first_meaningful_paint; |
return internal::INVALID_ORDER_FIRST_PAINT_FIRST_MEANINGFUL_PAINT; |
} |
@@ -290,37 +290,37 @@ void DispatchObserverTimingCallbacks(PageLoadMetricsObserver* observer, |
if (extra_info.main_frame_metadata.behavior_flags != |
last_metadata.behavior_flags) |
observer->OnLoadingBehaviorObserved(extra_info); |
- if (last_timing != new_timing) |
+ if (!last_timing.Equals(new_timing)) |
observer->OnTimingUpdate(new_timing, extra_info); |
- if (new_timing.document_timing.dom_content_loaded_event_start && |
- !last_timing.document_timing.dom_content_loaded_event_start) |
+ if (new_timing.document_timing->dom_content_loaded_event_start && |
+ !last_timing.document_timing->dom_content_loaded_event_start) |
observer->OnDomContentLoadedEventStart(new_timing, extra_info); |
- if (new_timing.document_timing.load_event_start && |
- !last_timing.document_timing.load_event_start) |
+ if (new_timing.document_timing->load_event_start && |
+ !last_timing.document_timing->load_event_start) |
observer->OnLoadEventStart(new_timing, extra_info); |
- if (new_timing.document_timing.first_layout && |
- !last_timing.document_timing.first_layout) |
+ if (new_timing.document_timing->first_layout && |
+ !last_timing.document_timing->first_layout) |
observer->OnFirstLayout(new_timing, extra_info); |
- if (new_timing.paint_timing.first_paint && |
- !last_timing.paint_timing.first_paint) |
+ if (new_timing.paint_timing->first_paint && |
+ !last_timing.paint_timing->first_paint) |
observer->OnFirstPaint(new_timing, extra_info); |
- if (new_timing.paint_timing.first_text_paint && |
- !last_timing.paint_timing.first_text_paint) |
+ if (new_timing.paint_timing->first_text_paint && |
+ !last_timing.paint_timing->first_text_paint) |
observer->OnFirstTextPaint(new_timing, extra_info); |
- if (new_timing.paint_timing.first_image_paint && |
- !last_timing.paint_timing.first_image_paint) |
+ if (new_timing.paint_timing->first_image_paint && |
+ !last_timing.paint_timing->first_image_paint) |
observer->OnFirstImagePaint(new_timing, extra_info); |
- if (new_timing.paint_timing.first_contentful_paint && |
- !last_timing.paint_timing.first_contentful_paint) |
+ if (new_timing.paint_timing->first_contentful_paint && |
+ !last_timing.paint_timing->first_contentful_paint) |
observer->OnFirstContentfulPaint(new_timing, extra_info); |
- if (new_timing.paint_timing.first_meaningful_paint && |
- !last_timing.paint_timing.first_meaningful_paint) |
+ if (new_timing.paint_timing->first_meaningful_paint && |
+ !last_timing.paint_timing->first_meaningful_paint) |
observer->OnFirstMeaningfulPaint(new_timing, extra_info); |
- if (new_timing.parse_timing.parse_start && |
- !last_timing.parse_timing.parse_start) |
+ if (new_timing.parse_timing->parse_start && |
+ !last_timing.parse_timing->parse_start) |
observer->OnParseStart(new_timing, extra_info); |
- if (new_timing.parse_timing.parse_stop && |
- !last_timing.parse_timing.parse_stop) |
+ if (new_timing.parse_timing->parse_stop && |
+ !last_timing.parse_timing->parse_stop) |
observer->OnParseStop(new_timing, extra_info); |
} |
@@ -343,6 +343,7 @@ PageLoadTracker::PageLoadTracker( |
page_end_reason_(END_NONE), |
page_end_user_initiated_info_(UserInitiatedInfo::NotUserInitiated()), |
started_in_foreground_(in_foreground), |
+ timing_(CreatePageLoadTiming()), |
page_transition_(navigation_handle->GetPageTransition()), |
user_initiated_info_(user_initiated_info), |
aborted_chain_size_(aborted_chain_size), |
@@ -390,7 +391,7 @@ PageLoadTracker::~PageLoadTracker() { |
page_end_reason_ != END_NEW_NAVIGATION) { |
LogAbortChainHistograms(nullptr); |
} |
- } else if (timing_.IsEmpty()) { |
+ } else if (page_load_metrics::IsEmpty(*timing_)) { |
RecordInternalError(ERR_NO_IPCS_RECEIVED); |
} |
@@ -399,7 +400,7 @@ PageLoadTracker::~PageLoadTracker() { |
if (failed_provisional_load_info_) { |
observer->OnFailedProvisionalLoad(*failed_provisional_load_info_, info); |
} else if (did_commit_) { |
- observer->OnComplete(timing_, info); |
+ observer->OnComplete(*timing_, info); |
} |
} |
} |
@@ -466,7 +467,7 @@ void PageLoadTracker::WebContentsHidden() { |
ClampBrowserTimestampIfInterProcessTimeTickSkew(&background_time_); |
} |
const PageLoadExtraInfo info = ComputePageLoadExtraInfo(); |
- INVOKE_AND_PRUNE_OBSERVERS(observers_, OnHidden, timing_, info); |
+ INVOKE_AND_PRUNE_OBSERVERS(observers_, OnHidden, *timing_, info); |
} |
void PageLoadTracker::WebContentsShown() { |
@@ -549,14 +550,14 @@ void PageLoadTracker::FlushMetricsOnAppEnterBackground() { |
const PageLoadExtraInfo info = ComputePageLoadExtraInfo(); |
INVOKE_AND_PRUNE_OBSERVERS(observers_, FlushMetricsOnAppEnterBackground, |
- timing_, info); |
+ *timing_, info); |
} |
void PageLoadTracker::NotifyClientRedirectTo( |
const PageLoadTracker& destination) { |
- if (timing_.paint_timing.first_paint) { |
+ if (timing_->paint_timing->first_paint) { |
base::TimeTicks first_paint_time = |
- navigation_start() + timing_.paint_timing.first_paint.value(); |
+ navigation_start() + timing_->paint_timing->first_paint.value(); |
base::TimeDelta first_paint_to_navigation; |
if (destination.navigation_start() > first_paint_time) |
first_paint_to_navigation = |
@@ -591,8 +592,8 @@ void PageLoadTracker::UpdateTiming(const PageLoadTiming& new_timing, |
// that a navigation started at different times, so a new timing struct with a |
// different start time from an earlier struct is considered invalid. |
const bool valid_timing_descendent = |
- timing_.navigation_start.is_null() || |
- timing_.navigation_start == new_timing.navigation_start; |
+ timing_->navigation_start.is_null() || |
+ timing_->navigation_start == new_timing.navigation_start; |
if (!valid_timing_descendent) { |
RecordInternalError(ERR_BAD_TIMING_IPC_INVALID_TIMING_DESCENDENT); |
return; |
@@ -622,14 +623,14 @@ void PageLoadTracker::UpdateTiming(const PageLoadTiming& new_timing, |
// Thus, we make a copy of timing here, update timing_ and |
// main_frame_metadata_, and then proceed to dispatch the observer timing |
// callbacks. |
- const PageLoadTiming last_timing = timing_; |
- timing_ = new_timing; |
+ mojo::StructPtr<PageLoadTiming> last_timing = std::move(timing_); |
+ timing_ = new_timing.Clone(); |
const PageLoadMetadata last_metadata = main_frame_metadata_; |
main_frame_metadata_ = new_metadata; |
const PageLoadExtraInfo info = ComputePageLoadExtraInfo(); |
for (const auto& observer : observers_) { |
- DispatchObserverTimingCallbacks(observer.get(), last_timing, new_timing, |
+ DispatchObserverTimingCallbacks(observer.get(), *last_timing, new_timing, |
last_metadata, info); |
} |
} |