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..4a5d162fe644bcf3d5609ee32df36876181590d7 100644 |
--- a/chrome/browser/page_load_metrics/page_load_tracker.cc |
+++ b/chrome/browser/page_load_metrics/page_load_tracker.cc |
@@ -18,6 +18,7 @@ |
#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 +512,18 @@ void PageLoadTracker::DidFinishSubFrameNavigation( |
content::NavigationHandle* navigation_handle) { |
INVOKE_AND_PRUNE_OBSERVERS(observers_, OnDidFinishSubFrameNavigation, |
navigation_handle); |
+ |
+ // todo we don't want to erase if it's an aborted load (prev doc remains |
+ // committed in that case) |
+ child_frame_navigation_start_.erase(navigation_handle->GetFrameTreeNodeId()); |
+ if (navigation_handle->HasCommitted() && |
jkarlin
2017/05/05 19:19:25
Note that error pages count as commits.
Bryan McQuade
2017/05/07 19:32:11
good catch, thanks!. I decided that for tracking t
|
+ !navigation_handle->IsSameDocument()) { |
+ DCHECK_GE(navigation_handle->NavigationStart(), navigation_start_); |
+ base::TimeDelta navigation_delta = |
+ navigation_handle->NavigationStart() - navigation_start_; |
+ child_frame_navigation_start_.insert(std::make_pair( |
+ navigation_handle->GetFrameTreeNodeId(), navigation_delta)); |
+ } |
} |
void PageLoadTracker::FailedProvisionalLoad( |
@@ -561,7 +574,32 @@ 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_.find( |
+ render_frame_host->GetFrameTreeNodeId()); |
+ if (it == child_frame_navigation_start_.end()) { |
+ // note that this can happen if a navigation starts but aborts and then the |
+ // frame contents is updated via e.g. document.open/document.write from its |
+ // parent. we probably want this to pass through to observers, but it's |
jkarlin
2017/05/05 19:19:25
This can also happen if a navigation aborts and fa
Bryan McQuade
2017/05/07 19:32:10
Yes - I fixed our tracking of loads in DidFinishSu
|
+ // unclear what we should use for a nav start value (what is the nav start |
+ // value in the render process? maybe we should be sending the nav start |
+ // timeticks from the renderer?) |
+ // todo log an error here to keep track of frequency of this case |
+ 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. |