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 81b7bea17d0da384fa8252f6ae7998512b2cd9f2..b169fbfbacfc7d3bcef8dba2ed964ba2b94e8d69 100644 |
--- a/chrome/browser/page_load_metrics/page_load_tracker.h |
+++ b/chrome/browser/page_load_metrics/page_load_tracker.h |
@@ -12,6 +12,7 @@ |
#include "base/optional.h" |
#include "base/time/time.h" |
#include "chrome/browser/page_load_metrics/page_load_metrics_observer.h" |
+#include "chrome/browser/page_load_metrics/page_load_metrics_update_dispatcher.h" |
#include "chrome/browser/page_load_metrics/user_input_tracker.h" |
#include "chrome/common/page_load_metrics/page_load_timing.h" |
#include "content/public/browser/global_request_id.h" |
@@ -26,7 +27,6 @@ class WebInputEvent; |
namespace content { |
class NavigationHandle; |
-class RenderFrameHost; |
} // namespace content |
namespace page_load_metrics { |
@@ -43,49 +43,6 @@ extern const char kAbortChainSizeNewNavigation[]; |
extern const char kAbortChainSizeNoCommit[]; |
extern const char kAbortChainSizeSameURL[]; |
extern const char kPageLoadCompletedAfterAppBackground[]; |
-extern const char kPageLoadTimingStatus[]; |
- |
-// Used to track the status of PageLoadTimings received from the render process. |
-// |
-// If you add elements to this enum, make sure you update the enum value in |
-// histograms.xml. Only add elements to the end to prevent inconsistencies |
-// between versions. |
-enum PageLoadTimingStatus { |
- // The PageLoadTiming is valid (all data within the PageLoadTiming is |
- // consistent with expectations). |
- VALID, |
- |
- // All remaining status codes are for invalid PageLoadTimings. |
- |
- // The PageLoadTiming was empty. |
- INVALID_EMPTY_TIMING, |
- |
- // The PageLoadTiming had a null navigation_start. |
- INVALID_NULL_NAVIGATION_START, |
- |
- // Script load or execution durations in the PageLoadTiming were too long. |
- INVALID_SCRIPT_LOAD_LONGER_THAN_PARSE, |
- INVALID_SCRIPT_EXEC_LONGER_THAN_PARSE, |
- INVALID_SCRIPT_LOAD_DOC_WRITE_LONGER_THAN_SCRIPT_LOAD, |
- INVALID_SCRIPT_EXEC_DOC_WRITE_LONGER_THAN_SCRIPT_EXEC, |
- |
- // The order of two events in the PageLoadTiming was invalid. Either the first |
- // wasn't present when the second was present, or the second was reported as |
- // happening before the first. |
- INVALID_ORDER_RESPONSE_START_PARSE_START, |
- INVALID_ORDER_PARSE_START_PARSE_STOP, |
- INVALID_ORDER_PARSE_STOP_DOM_CONTENT_LOADED, |
- INVALID_ORDER_DOM_CONTENT_LOADED_LOAD, |
- INVALID_ORDER_PARSE_START_FIRST_LAYOUT, |
- INVALID_ORDER_FIRST_LAYOUT_FIRST_PAINT, |
- INVALID_ORDER_FIRST_PAINT_FIRST_TEXT_PAINT, |
- INVALID_ORDER_FIRST_PAINT_FIRST_IMAGE_PAINT, |
- INVALID_ORDER_FIRST_PAINT_FIRST_CONTENTFUL_PAINT, |
- INVALID_ORDER_FIRST_PAINT_FIRST_MEANINGFUL_PAINT, |
- |
- // New values should be added before this final entry. |
- LAST_PAGE_LOAD_TIMING_STATUS |
-}; |
} // namespace internal |
@@ -189,7 +146,7 @@ bool IsNavigationUserInitiated(content::NavigationHandle* handle); |
// provisional load, until a new navigation commits or the navigation fails. |
// MetricsWebContentsObserver manages a set of provisional PageLoadTrackers, as |
// well as a committed PageLoadTracker. |
-class PageLoadTracker { |
+class PageLoadTracker : public PageLoadMetricsUpdateDispatcher::Client { |
public: |
// Caller must guarantee that the embedder_interface pointer outlives this |
// class. The PageLoadTracker must not hold on to |
@@ -202,7 +159,13 @@ class PageLoadTracker { |
UserInitiatedInfo user_initiated_info, |
int aborted_chain_size, |
int aborted_chain_size_same_url); |
- ~PageLoadTracker(); |
+ ~PageLoadTracker() override; |
+ |
+ // PageLoadMetricsUpdateDispatcher::Client implementation: |
+ void OnTimingChanged() override; |
+ void OnMainFrameMetadataChanged() override; |
+ void OnSubframeMetadataChanged() override; |
+ |
void Redirect(content::NavigationHandle* navigation_handle); |
void WillProcessNavigationResponse( |
content::NavigationHandle* navigation_handle); |
@@ -226,18 +189,6 @@ class PageLoadTracker { |
void NotifyClientRedirectTo(const PageLoadTracker& destination); |
- void UpdateTiming(const mojom::PageLoadTiming& timing, |
- const mojom::PageLoadMetadata& metadata); |
- |
- void UpdateSubFrameTiming(content::RenderFrameHost* render_frame_host, |
- const mojom::PageLoadTiming& new_timing, |
- const mojom::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 UpdateSubFrameMetadata(const mojom::PageLoadMetadata& subframe_metadata); |
- |
void OnStartedResource( |
const ExtraRequestStartInfo& extra_request_started_info); |
@@ -289,7 +240,7 @@ class PageLoadTracker { |
base::TimeTicks navigation_start() const { return navigation_start_; } |
- PageLoadExtraInfo ComputePageLoadExtraInfo(); |
+ PageLoadExtraInfo ComputePageLoadExtraInfo() const; |
ui::PageTransition page_transition() const { return page_transition_; } |
@@ -297,6 +248,10 @@ class PageLoadTracker { |
UserInputTracker* input_tracker() { return &input_tracker_; } |
+ PageLoadMetricsUpdateDispatcher* metrics_update_dispatcher() { |
+ return &metrics_update_dispatcher_; |
+ } |
+ |
// Whether this PageLoadTracker has a navigation GlobalRequestID that matches |
// the given request_id. This method will return false before |
// WillProcessNavigationResponse has been invoked, as PageLoadTracker doesn't |
@@ -317,8 +272,6 @@ 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 |
@@ -339,14 +292,6 @@ 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 mojom::PaintTiming& new_paint_timing, |
- bool is_main_frame); |
- |
- void DispatchTimingUpdates(); |
- |
UserInputTracker input_tracker_; |
// Whether we stopped tracking this navigation after it was initiated. We may |
@@ -396,17 +341,8 @@ class PageLoadTracker { |
base::TimeTicks foreground_time_; |
bool started_in_foreground_; |
- // 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. |
- mojom::PageLoadTimingPtr merged_page_timing_; |
mojom::PageLoadTimingPtr last_dispatched_merged_page_timing_; |
- mojom::PageLoadMetadata main_frame_metadata_; |
- mojom::PageLoadMetadataPtr last_dispatched_main_frame_metadata_; |
- |
- mojom::PageLoadMetadata subframe_metadata_; |
- |
ui::PageTransition page_transition_; |
base::Optional<content::GlobalRequestID> navigation_request_id_; |
@@ -431,9 +367,7 @@ 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_; |
+ PageLoadMetricsUpdateDispatcher metrics_update_dispatcher_; |
DISALLOW_COPY_AND_ASSIGN(PageLoadTracker); |
}; |