| Index: components/page_load_metrics/browser/metrics_web_contents_observer.h | 
| diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.h b/components/page_load_metrics/browser/metrics_web_contents_observer.h | 
| index 291958a24c9ee45a1fa14b4026b3e85fb6c083cf..dee13cbd092303adb4215e68fe72b96bb8c9f222 100644 | 
| --- a/components/page_load_metrics/browser/metrics_web_contents_observer.h | 
| +++ b/components/page_load_metrics/browser/metrics_web_contents_observer.h | 
| @@ -92,6 +92,11 @@ enum InternalErrorLoadEvent { | 
| // Receives user input before navigation start | 
| ERR_USER_INPUT_WITH_NO_RELEVANT_LOAD, | 
|  | 
| +  // A TimeTicks value in the browser process has value less than | 
| +  // navigation_start_. This could happen if navigation_start_ was computed in | 
| +  // renderer process and the system clock has inter process time tick skew. | 
| +  ERR_INTER_PROCESS_TIME_TICK_SKEW, | 
| + | 
| // Add values before this final count. | 
| ERR_LAST_ENTRY, | 
| }; | 
| @@ -150,8 +155,16 @@ class PageLoadTracker { | 
| // If the user performs some abort-like action while we are tracking this page | 
| // load, notify the tracker. Note that we may not classify this as an abort if | 
| // we've already performed a first paint. | 
| -  void NotifyAbort(UserAbortType abort_type, base::TimeTicks timestamp); | 
| -  void UpdateAbort(UserAbortType abort_type, base::TimeTicks timestamp); | 
| +  // is_certainly_browser_timestamp signifies if the timestamp passed is taken | 
| +  // in the | 
| +  // browser process or not. We need this to possibly clamp browser timestamp on | 
| +  // a machine with inter process time tick skew. | 
| +  void NotifyAbort(UserAbortType abort_type, | 
| +                   base::TimeTicks timestamp, | 
| +                   bool is_certainly_browser_timestamp); | 
| +  void UpdateAbort(UserAbortType abort_type, | 
| +                   base::TimeTicks timestamp, | 
| +                   bool is_certainly_browser_timestamp); | 
|  | 
| // This method returns true if this page load has been aborted with type of | 
| // ABORT_OTHER, and the |abort_cause_time| is within a sufficiently close | 
| @@ -168,11 +181,20 @@ class PageLoadTracker { | 
| return url_; | 
| } | 
|  | 
| +  PageLoadExtraInfo ComputePageLoadExtraInfo(); | 
| + | 
| private: | 
| -  PageLoadExtraInfo GetPageLoadMetricsInfo(); | 
| +  // 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 | 
| +  // is not system wide monotonic. | 
| +  // - *event_time < navigation_start_ | 
| +  void ClampBrowserTimestampIfInterProcessTimeTickSkew( | 
| +      base::TimeTicks* event_time); | 
|  | 
| void UpdateAbortInternal(UserAbortType abort_type, | 
| -                           base::TimeTicks timestamp); | 
| +                           base::TimeTicks timestamp, | 
| +                           bool is_certainly_browser_timestamp); | 
|  | 
| // If |final_navigation| is null, then this is an "unparented" abort chain, | 
| // and represents a sequence of provisional aborts that never ends with a | 
| @@ -262,6 +284,9 @@ class MetricsWebContentsObserver | 
| void RenderViewHostChanged(content::RenderViewHost* old_host, | 
| content::RenderViewHost* new_host) override; | 
|  | 
| +  // This getter function is required for testing. | 
| +  const PageLoadExtraInfo GetPageLoadExtraInfoForCommittedLoad(); | 
| + | 
| private: | 
| friend class content::WebContentsUserData<MetricsWebContentsObserver>; | 
|  | 
| @@ -269,7 +294,8 @@ class MetricsWebContentsObserver | 
| // that might abort them. | 
| void NotifyAbortAllLoads(UserAbortType abort_type); | 
| void NotifyAbortAllLoadsWithTimestamp(UserAbortType abort_type, | 
| -                                        base::TimeTicks timestamp); | 
| +                                        base::TimeTicks timestamp, | 
| +                                        bool is_certainly_browser_timestamp); | 
|  | 
| // Register / Unregister input event callback to given RenderViewHost | 
| void RegisterInputEventObserver(content::RenderViewHost* host); | 
|  |