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. |