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

Unified Diff: chrome/browser/page_load_metrics/page_load_tracker.cc

Issue 2859393002: Report page load timing information for child frames. (Closed)
Patch Set: cleanup Created 3 years, 7 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 side-by-side diff with in-line comments
Download patch
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.

Powered by Google App Engine
This is Rietveld 408576698