| 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 f6d8e104267d9e300da4da1dadab01eac9151889..aff76c3883f8488d590aed1e93dcc77e4bc6a0c1 100644
|
| --- a/chrome/browser/page_load_metrics/page_load_tracker.cc
|
| +++ b/chrome/browser/page_load_metrics/page_load_tracker.cc
|
| @@ -255,7 +255,8 @@ void DispatchObserverTimingCallbacks(PageLoadMetricsObserver* observer,
|
| const PageLoadTiming& new_timing,
|
| const PageLoadMetadata& last_metadata,
|
| const PageLoadExtraInfo& extra_info) {
|
| - if (extra_info.metadata.behavior_flags != last_metadata.behavior_flags)
|
| + if (extra_info.main_frame_metadata.behavior_flags !=
|
| + last_metadata.behavior_flags)
|
| observer->OnLoadingBehaviorObserved(extra_info);
|
| if (last_timing != new_timing)
|
| observer->OnTimingUpdate(new_timing, extra_info);
|
| @@ -506,6 +507,22 @@ void PageLoadTracker::NotifyClientRedirectTo(
|
| }
|
| }
|
|
|
| +void PageLoadTracker::UpdateChildFrameMetadata(
|
| + const PageLoadMetadata& child_metadata) {
|
| + // Merge the child loading behavior flags with any we've already observed,
|
| + // possibly from other child frames.
|
| + const int last_child_loading_behavior_flags =
|
| + child_frame_metadata_.behavior_flags;
|
| + child_frame_metadata_.behavior_flags |= child_metadata.behavior_flags;
|
| + if (last_child_loading_behavior_flags == child_frame_metadata_.behavior_flags)
|
| + return;
|
| +
|
| + PageLoadExtraInfo extra_info(ComputePageLoadExtraInfo());
|
| + for (const auto& observer : observers_) {
|
| + observer->OnLoadingBehaviorObserved(extra_info);
|
| + }
|
| +}
|
| +
|
| bool PageLoadTracker::UpdateTiming(const PageLoadTiming& new_timing,
|
| const PageLoadMetadata& new_metadata) {
|
| // Throw away IPCs that are not relevant to the current navigation.
|
| @@ -517,22 +534,23 @@ bool PageLoadTracker::UpdateTiming(const PageLoadTiming& new_timing,
|
| timing_.navigation_start == new_timing.navigation_start;
|
| // Ensure flags sent previously are still present in the new metadata fields.
|
| bool valid_behavior_descendent =
|
| - (metadata_.behavior_flags & new_metadata.behavior_flags) ==
|
| - metadata_.behavior_flags;
|
| + (main_frame_metadata_.behavior_flags & new_metadata.behavior_flags) ==
|
| + main_frame_metadata_.behavior_flags;
|
| if (IsValidPageLoadTiming(new_timing) && valid_timing_descendent &&
|
| valid_behavior_descendent) {
|
| DCHECK(did_commit_); // OnCommit() must be called first.
|
| // There are some subtle ordering constraints here. GetPageLoadMetricsInfo()
|
| // must be called before DispatchObserverTimingCallbacks, but its
|
| - // implementation depends on the state of metadata_, so we need to update
|
| - // metadata_ before calling GetPageLoadMetricsInfo. Thus, we make a copy of
|
| - // timing here, update timing_ and metadata_, and then proceed to dispatch
|
| - // the observer timing callbacks.
|
| + // implementation depends on the state of main_frame_metadata_, so we need
|
| + // to update main_frame_metadata_ before calling GetPageLoadMetricsInfo.
|
| + // 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;
|
|
|
| - const PageLoadMetadata last_metadata = metadata_;
|
| - metadata_ = new_metadata;
|
| + 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,
|
| @@ -615,11 +633,11 @@ PageLoadExtraInfo PageLoadTracker::ComputePageLoadExtraInfo() {
|
| (!page_end_user_initiated_info_.browser_initiated &&
|
| !page_end_user_initiated_info_.user_gesture &&
|
| !page_end_user_initiated_info_.user_input_event));
|
| - return PageLoadExtraInfo(navigation_start_, first_background_time,
|
| - first_foreground_time, started_in_foreground_,
|
| - user_initiated_info_, url(), start_url_, did_commit_,
|
| - page_end_reason_, page_end_user_initiated_info_,
|
| - page_end_time, metadata_);
|
| + return PageLoadExtraInfo(
|
| + navigation_start_, first_background_time, first_foreground_time,
|
| + started_in_foreground_, user_initiated_info_, url(), start_url_,
|
| + did_commit_, page_end_reason_, page_end_user_initiated_info_,
|
| + page_end_time, main_frame_metadata_, child_frame_metadata_);
|
| }
|
|
|
| bool PageLoadTracker::HasMatchingNavigationRequestID(
|
|
|