Index: chrome/browser/page_load_metrics/page_load_tracker.h |
diff --git a/chrome/browser/page_load_metrics/page_load_tracker.h b/chrome/browser/page_load_metrics/page_load_tracker.h |
index f6529d1a059d00a620572763477253d17ed8fec0..c696acb68da85aa746bb1d825ce0262b85e20183 100644 |
--- a/chrome/browser/page_load_metrics/page_load_tracker.h |
+++ b/chrome/browser/page_load_metrics/page_load_tracker.h |
@@ -26,6 +26,7 @@ class WebInputEvent; |
namespace content { |
class NavigationHandle; |
+class RenderFrameHost; |
} // namespace content |
namespace page_load_metrics { |
@@ -152,8 +153,8 @@ enum InternalErrorLoadEvent { |
// No page load end time was recorded for this page load. |
ERR_NO_PAGE_LOAD_END_TIME, |
- // Received a timing update from a subframe. |
- ERR_TIMING_IPC_FROM_SUBFRAME, |
+ // Received a timing update from a subframe (deprecated). |
+ DEPRECATED_ERR_TIMING_IPC_FROM_SUBFRAME, |
// A timing IPC was sent from the renderer that contained timing data which |
// was inconsistent with our timing data for the currently committed load. |
@@ -168,6 +169,10 @@ enum InternalErrorLoadEvent { |
// (e.g. out of order timings, or other issues). |
ERR_BAD_TIMING_IPC_INVALID_TIMING, |
+ // We received a navigation start for a child frame that is before the |
+ // navigation start of the main frame. |
+ ERR_SUBFRAME_NAVIGATION_START_BEFORE_MAIN_FRAME, |
+ |
// Add values before this final count. |
ERR_LAST_ENTRY, |
}; |
@@ -222,10 +227,14 @@ class PageLoadTracker { |
void UpdateTiming(const PageLoadTiming& timing, |
const PageLoadMetadata& metadata); |
+ void UpdateSubFrameTiming(content::RenderFrameHost* render_frame_host, |
+ const PageLoadTiming& new_timing, |
+ const PageLoadMetadata& new_metadata); |
+ |
// Update metadata for child frames. Updates for child frames arrive |
// separately from updates for the main frame, so aren't included in |
// UpdateTiming. |
- void UpdateChildFrameMetadata(const PageLoadMetadata& child_metadata); |
+ void UpdateSubFrameMetadata(const PageLoadMetadata& subframe_metadata); |
void OnStartedResource( |
const ExtraRequestStartInfo& extra_request_started_info); |
@@ -306,6 +315,8 @@ class PageLoadTracker { |
base::TimeDelta actual_delay); |
private: |
+ using FrameTreeNodeId = int; |
+ |
// This function converts a TimeTicks value taken in the browser process |
// to navigation_start_ if: |
// - base::TimeTicks is not comparable across processes because the clock |
@@ -326,6 +337,12 @@ class PageLoadTracker { |
void MaybeUpdateURL(content::NavigationHandle* navigation_handle); |
+ // Merge values from |new_paint_timing| into |merged_page_timing_|, offsetting |
+ // any new timings by the |navigation_start_offset|. |
+ void MergePaintTiming(base::TimeDelta navigation_start_offset, |
+ const page_load_metrics::PaintTiming& new_paint_timing, |
+ bool is_main_frame); |
+ |
UserInputTracker input_tracker_; |
// Whether we stopped tracking this navigation after it was initiated. We may |
@@ -375,9 +392,13 @@ class PageLoadTracker { |
base::TimeTicks foreground_time_; |
bool started_in_foreground_; |
- PageLoadTiming timing_; |
+ // PageLoadTiming for the currently tracked page. The fields in |paint_timing| |
+ // are merged across all frames in the document. All other fields are for the |
+ // main frame document. |
+ PageLoadTiming merged_page_timing_; |
+ |
PageLoadMetadata main_frame_metadata_; |
- PageLoadMetadata child_frame_metadata_; |
+ PageLoadMetadata subframe_metadata_; |
ui::PageTransition page_transition_; |
@@ -403,6 +424,10 @@ class PageLoadTracker { |
std::vector<std::unique_ptr<PageLoadMetricsObserver>> observers_; |
+ // Navigation start offsets for the most recently committed document in each |
+ // frame. |
+ std::map<FrameTreeNodeId, base::TimeDelta> subframe_navigation_start_offset_; |
+ |
DISALLOW_COPY_AND_ASSIGN(PageLoadTracker); |
}; |