| 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 c735bb78cd41cbe810ef448a7a3c8edab70814b7..8aca100ebf7c82e69be4d0118a856661191d7b7c 100644
|
| --- a/chrome/browser/page_load_metrics/page_load_tracker.cc
|
| +++ b/chrome/browser/page_load_metrics/page_load_tracker.cc
|
| @@ -12,12 +12,14 @@
|
| #include "base/logging.h"
|
| #include "base/memory/ptr_util.h"
|
| #include "base/metrics/histogram_macros.h"
|
| +#include "chrome/browser/page_load_metrics/browser_page_track_decider.h"
|
| #include "chrome/browser/page_load_metrics/page_load_metrics_embedder_interface.h"
|
| #include "chrome/browser/page_load_metrics/page_load_metrics_util.h"
|
| #include "chrome/browser/prerender/prerender_contents.h"
|
| #include "chrome/common/page_load_metrics/page_load_timing.h"
|
| #include "content/public/browser/navigation_details.h"
|
| #include "content/public/browser/navigation_handle.h"
|
| +#include "content/public/browser/render_frame_host.h"
|
| #include "content/public/browser/web_contents.h"
|
| #include "content/public/browser/web_contents_observer.h"
|
| #include "content/public/common/browser_side_navigation_policy.h"
|
| @@ -511,6 +513,25 @@ void PageLoadTracker::DidFinishSubFrameNavigation(
|
| content::NavigationHandle* navigation_handle) {
|
| INVOKE_AND_PRUNE_OBSERVERS(observers_, OnDidFinishSubFrameNavigation,
|
| navigation_handle);
|
| +
|
| + if (!navigation_handle->HasCommitted())
|
| + return;
|
| +
|
| + // We have a new committed navigation, so discard information about the
|
| + // previously committed navigation.
|
| + child_frame_navigation_start_offset_.erase(
|
| + navigation_handle->GetFrameTreeNodeId());
|
| +
|
| + BrowserPageTrackDecider decider(embedder_interface_,
|
| + navigation_handle->GetWebContents(),
|
| + navigation_handle);
|
| + if (decider.ShouldTrack()) {
|
| + DCHECK_GE(navigation_handle->NavigationStart(), navigation_start_);
|
| + base::TimeDelta navigation_delta =
|
| + navigation_handle->NavigationStart() - navigation_start_;
|
| + child_frame_navigation_start_offset_.insert(std::make_pair(
|
| + navigation_handle->GetFrameTreeNodeId(), navigation_delta));
|
| + }
|
| }
|
|
|
| void PageLoadTracker::FailedProvisionalLoad(
|
| @@ -561,7 +582,27 @@ void PageLoadTracker::NotifyClientRedirectTo(
|
| }
|
| }
|
|
|
| -void PageLoadTracker::UpdateChildFrameMetadata(
|
| +void PageLoadTracker::UpdateSubFrameTiming(
|
| + content::RenderFrameHost* render_frame_host,
|
| + const PageLoadTiming& new_timing,
|
| + const PageLoadMetadata& new_metadata) {
|
| + UpdateSubFrameMetadata(new_metadata);
|
| + const auto it = child_frame_navigation_start_offset_.find(
|
| + render_frame_host->GetFrameTreeNodeId());
|
| + if (it == child_frame_navigation_start_offset_.end()) {
|
| + // We received timing information for an untracked load. Ignore it.
|
| + RecordInternalError(ERR_SUBFRAME_IPC_WITH_NO_RELEVANT_LOAD);
|
| + return;
|
| + }
|
| + const PageLoadExtraInfo info = ComputePageLoadExtraInfo();
|
| + for (const auto& observer : observers_) {
|
| + observer->OnSubFrameTimingUpdate(render_frame_host->GetFrameTreeNodeId(),
|
| + it->second, new_timing, new_metadata,
|
| + info);
|
| + }
|
| +}
|
| +
|
| +void PageLoadTracker::UpdateSubFrameMetadata(
|
| const PageLoadMetadata& child_metadata) {
|
| // Merge the child loading behavior flags with any we've already observed,
|
| // possibly from other child frames.
|
|
|