| Index: chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.cc
 | 
| diff --git a/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.cc
 | 
| index 49faa4f434487bef4b222ab5f066b7375bf2426b..3cf2d12708ffabf4a0498f9c5d0d0d77c458117f 100644
 | 
| --- a/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.cc
 | 
| +++ b/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.cc
 | 
| @@ -11,7 +11,7 @@
 | 
|  #include "chrome/common/page_load_metrics/page_load_timing.h"
 | 
|  #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
 | 
|  
 | 
| -using page_load_metrics::UserAbortType;
 | 
| +using page_load_metrics::PageAbortReason;
 | 
|  
 | 
|  namespace internal {
 | 
|  
 | 
| @@ -100,114 +100,113 @@ const char kHistogramFromGWSAbortBackgroundBeforeInteraction[] =
 | 
|  
 | 
|  namespace {
 | 
|  
 | 
| -void LogCommittedAbortsBeforePaint(UserAbortType abort_type,
 | 
| -                                   base::TimeDelta time_to_abort) {
 | 
| -  switch (abort_type) {
 | 
| -    case UserAbortType::ABORT_STOP:
 | 
| +void LogCommittedAbortsBeforePaint(PageAbortReason abort_reason,
 | 
| +                                   base::TimeDelta page_end_time) {
 | 
| +  switch (abort_reason) {
 | 
| +    case PageAbortReason::ABORT_STOP:
 | 
|        PAGE_LOAD_HISTOGRAM(internal::kHistogramFromGWSAbortStopBeforePaint,
 | 
| -                          time_to_abort);
 | 
| +                          page_end_time);
 | 
|        break;
 | 
| -    case UserAbortType::ABORT_CLOSE:
 | 
| +    case PageAbortReason::ABORT_CLOSE:
 | 
|        PAGE_LOAD_HISTOGRAM(internal::kHistogramFromGWSAbortCloseBeforePaint,
 | 
| -                          time_to_abort);
 | 
| +                          page_end_time);
 | 
|        break;
 | 
| -    case UserAbortType::ABORT_NEW_NAVIGATION:
 | 
| +    case PageAbortReason::ABORT_NEW_NAVIGATION:
 | 
|        PAGE_LOAD_HISTOGRAM(
 | 
|            internal::kHistogramFromGWSAbortNewNavigationBeforePaint,
 | 
| -          time_to_abort);
 | 
| +          page_end_time);
 | 
|        break;
 | 
| -    case UserAbortType::ABORT_RELOAD:
 | 
| +    case PageAbortReason::ABORT_RELOAD:
 | 
|        PAGE_LOAD_HISTOGRAM(internal::kHistogramFromGWSAbortReloadBeforePaint,
 | 
| -                          time_to_abort);
 | 
| +                          page_end_time);
 | 
|        break;
 | 
| -    case UserAbortType::ABORT_FORWARD_BACK:
 | 
| +    case PageAbortReason::ABORT_FORWARD_BACK:
 | 
|        PAGE_LOAD_HISTOGRAM(
 | 
|            internal::kHistogramFromGWSAbortForwardBackBeforePaint,
 | 
| -          time_to_abort);
 | 
| +          page_end_time);
 | 
|        break;
 | 
| -    case UserAbortType::ABORT_BACKGROUND:
 | 
| +    case PageAbortReason::ABORT_BACKGROUND:
 | 
|        PAGE_LOAD_HISTOGRAM(internal::kHistogramFromGWSAbortBackgroundBeforePaint,
 | 
| -                          time_to_abort);
 | 
| +                          page_end_time);
 | 
|        break;
 | 
|      default:
 | 
|        // These should only be logged for provisional aborts.
 | 
| -      DCHECK_NE(abort_type, UserAbortType::ABORT_OTHER);
 | 
| +      DCHECK_NE(abort_reason, PageAbortReason::ABORT_OTHER);
 | 
|        break;
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -void LogAbortsAfterPaintBeforeInteraction(UserAbortType abort_type,
 | 
| -                                          base::TimeDelta time_to_abort) {
 | 
| -  switch (abort_type) {
 | 
| -    case UserAbortType::ABORT_STOP:
 | 
| +void LogAbortsAfterPaintBeforeInteraction(
 | 
| +    const page_load_metrics::PageAbortInfo& abort_info) {
 | 
| +  switch (abort_info.reason) {
 | 
| +    case PageAbortReason::ABORT_STOP:
 | 
|        PAGE_LOAD_HISTOGRAM(internal::kHistogramFromGWSAbortStopBeforeInteraction,
 | 
| -                          time_to_abort);
 | 
| +                          abort_info.time_to_abort);
 | 
|        break;
 | 
| -    case UserAbortType::ABORT_CLOSE:
 | 
| +    case PageAbortReason::ABORT_CLOSE:
 | 
|        PAGE_LOAD_HISTOGRAM(
 | 
|            internal::kHistogramFromGWSAbortCloseBeforeInteraction,
 | 
| -          time_to_abort);
 | 
| +          abort_info.time_to_abort);
 | 
|        break;
 | 
| -    case UserAbortType::ABORT_NEW_NAVIGATION:
 | 
| +    case PageAbortReason::ABORT_NEW_NAVIGATION:
 | 
|        PAGE_LOAD_HISTOGRAM(
 | 
|            internal::kHistogramFromGWSAbortNewNavigationBeforeInteraction,
 | 
| -          time_to_abort);
 | 
| +          abort_info.time_to_abort);
 | 
|        break;
 | 
| -    case UserAbortType::ABORT_RELOAD:
 | 
| +    case PageAbortReason::ABORT_RELOAD:
 | 
|        PAGE_LOAD_HISTOGRAM(
 | 
|            internal::kHistogramFromGWSAbortReloadBeforeInteraction,
 | 
| -          time_to_abort);
 | 
| +          abort_info.time_to_abort);
 | 
|        break;
 | 
| -    case UserAbortType::ABORT_FORWARD_BACK:
 | 
| +    case PageAbortReason::ABORT_FORWARD_BACK:
 | 
|        PAGE_LOAD_HISTOGRAM(
 | 
|            internal::kHistogramFromGWSAbortForwardBackBeforeInteraction,
 | 
| -          time_to_abort);
 | 
| +          abort_info.time_to_abort);
 | 
|        break;
 | 
| -    case UserAbortType::ABORT_BACKGROUND:
 | 
| +    case PageAbortReason::ABORT_BACKGROUND:
 | 
|        PAGE_LOAD_HISTOGRAM(
 | 
|            internal::kHistogramFromGWSAbortBackgroundBeforeInteraction,
 | 
| -          time_to_abort);
 | 
| +          abort_info.time_to_abort);
 | 
|        break;
 | 
|      default:
 | 
|        // These should only be logged for provisional aborts.
 | 
| -      DCHECK_NE(abort_type, UserAbortType::ABORT_OTHER);
 | 
| +      DCHECK_NE(abort_info.reason, PageAbortReason::ABORT_OTHER);
 | 
|        break;
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -void LogProvisionalAborts(UserAbortType abort_type,
 | 
| -                          base::TimeDelta time_to_abort) {
 | 
| -  switch (abort_type) {
 | 
| -    case UserAbortType::ABORT_STOP:
 | 
| +void LogProvisionalAborts(const page_load_metrics::PageAbortInfo& abort_info) {
 | 
| +  switch (abort_info.reason) {
 | 
| +    case PageAbortReason::ABORT_STOP:
 | 
|        PAGE_LOAD_HISTOGRAM(internal::kHistogramFromGWSAbortStopBeforeCommit,
 | 
| -                          time_to_abort);
 | 
| +                          abort_info.time_to_abort);
 | 
|        break;
 | 
| -    case UserAbortType::ABORT_CLOSE:
 | 
| +    case PageAbortReason::ABORT_CLOSE:
 | 
|        PAGE_LOAD_HISTOGRAM(internal::kHistogramFromGWSAbortCloseBeforeCommit,
 | 
| -                          time_to_abort);
 | 
| +                          abort_info.time_to_abort);
 | 
|        break;
 | 
| -    case UserAbortType::ABORT_OTHER:
 | 
| +    case PageAbortReason::ABORT_OTHER:
 | 
|        PAGE_LOAD_HISTOGRAM(internal::kHistogramFromGWSAbortOtherBeforeCommit,
 | 
| -                          time_to_abort);
 | 
| +                          abort_info.time_to_abort);
 | 
|        break;
 | 
| -    case UserAbortType::ABORT_NEW_NAVIGATION:
 | 
| +    case PageAbortReason::ABORT_NEW_NAVIGATION:
 | 
|        PAGE_LOAD_HISTOGRAM(
 | 
|            internal::kHistogramFromGWSAbortNewNavigationBeforeCommit,
 | 
| -          time_to_abort);
 | 
| +          abort_info.time_to_abort);
 | 
|        break;
 | 
| -    case UserAbortType::ABORT_RELOAD:
 | 
| +    case PageAbortReason::ABORT_RELOAD:
 | 
|        PAGE_LOAD_HISTOGRAM(internal::kHistogramFromGWSAbortReloadBeforeCommit,
 | 
| -                          time_to_abort);
 | 
| +                          abort_info.time_to_abort);
 | 
|        break;
 | 
| -    case UserAbortType::ABORT_FORWARD_BACK:
 | 
| +    case PageAbortReason::ABORT_FORWARD_BACK:
 | 
|        PAGE_LOAD_HISTOGRAM(
 | 
|            internal::kHistogramFromGWSAbortForwardBackBeforeCommit,
 | 
| -          time_to_abort);
 | 
| +          abort_info.time_to_abort);
 | 
|        break;
 | 
| -    case UserAbortType::ABORT_BACKGROUND:
 | 
| +    case PageAbortReason::ABORT_BACKGROUND:
 | 
|        PAGE_LOAD_HISTOGRAM(
 | 
|            internal::kHistogramFromGWSAbortBackgroundBeforeCommit,
 | 
| -          time_to_abort);
 | 
| +          abort_info.time_to_abort);
 | 
|        break;
 | 
|      default:
 | 
|        NOTREACHED();
 | 
| @@ -216,24 +215,21 @@ void LogProvisionalAborts(UserAbortType abort_type,
 | 
|  }
 | 
|  
 | 
|  bool WasAbortedInForeground(
 | 
| -    UserAbortType abort_type,
 | 
| -    const base::Optional<base::TimeDelta>& time_to_abort,
 | 
| -    const page_load_metrics::PageLoadExtraInfo& info) {
 | 
| -  if (!time_to_abort)
 | 
| -    return false;
 | 
| -  if (abort_type == UserAbortType::ABORT_NONE)
 | 
| +    const page_load_metrics::PageLoadExtraInfo& info,
 | 
| +    const page_load_metrics::PageAbortInfo& abort_info) {
 | 
| +  if (!info.started_in_foreground ||
 | 
| +      abort_info.reason == PageAbortReason::ABORT_NONE)
 | 
|      return false;
 | 
| +
 | 
| +  base::Optional<base::TimeDelta> time_to_abort(abort_info.time_to_abort);
 | 
|    if (WasStartedInForegroundOptionalEventInForeground(time_to_abort, info))
 | 
|      return true;
 | 
| -  if (!info.started_in_foreground)
 | 
| -    return false;
 | 
|  
 | 
| -  const base::TimeDelta time_to_abort_val = time_to_abort.value();
 | 
|    const base::TimeDelta time_to_first_background =
 | 
|        info.first_background_time.value();
 | 
| -  DCHECK_GT(time_to_abort_val, time_to_first_background);
 | 
| +  DCHECK_GT(abort_info.time_to_abort, time_to_first_background);
 | 
|    base::TimeDelta background_abort_delta =
 | 
| -      time_to_abort_val - time_to_first_background;
 | 
| +      abort_info.time_to_abort - time_to_first_background;
 | 
|    // Consider this a foregrounded abort if it occurred within 100ms of a
 | 
|    // background. This is needed for closing some tabs, where the signal for
 | 
|    // background is often slightly ahead of the signal for close.
 | 
| @@ -243,14 +239,12 @@ bool WasAbortedInForeground(
 | 
|  }
 | 
|  
 | 
|  bool WasAbortedBeforeInteraction(
 | 
| -    UserAbortType abort_type,
 | 
| -    const base::Optional<base::TimeDelta>& time_to_interaction,
 | 
| -    const base::Optional<base::TimeDelta>& time_to_abort) {
 | 
| +    const page_load_metrics::PageAbortInfo& abort_info,
 | 
| +    const base::Optional<base::TimeDelta>& time_to_interaction) {
 | 
|    // These conditions should be guaranteed by the call to
 | 
|    // WasAbortedInForeground, which is called before WasAbortedBeforeInteraction
 | 
|    // gets invoked.
 | 
| -  DCHECK(time_to_abort);
 | 
| -  DCHECK(abort_type != UserAbortType::ABORT_NONE);
 | 
| +  DCHECK(abort_info.reason != PageAbortReason::ABORT_NONE);
 | 
|  
 | 
|    if (!time_to_interaction)
 | 
|      return true;
 | 
| @@ -264,13 +258,13 @@ bool WasAbortedBeforeInteraction(
 | 
|    // 1000ms is enough to perform a pull to reload / forward_back gesture.
 | 
|    // It's also too short a time for a user to consume any content
 | 
|    // revealed by the interaction.
 | 
| -  if (abort_type == UserAbortType::ABORT_RELOAD ||
 | 
| -      abort_type == UserAbortType::ABORT_FORWARD_BACK) {
 | 
| +  if (abort_info.reason == PageAbortReason::ABORT_RELOAD ||
 | 
| +      abort_info.reason == PageAbortReason::ABORT_FORWARD_BACK) {
 | 
|      return time_to_interaction.value() +
 | 
|                 base::TimeDelta::FromMilliseconds(1000) >
 | 
| -           time_to_abort;
 | 
| +           abort_info.time_to_abort;
 | 
|    } else {
 | 
| -    return time_to_interaction > time_to_abort;
 | 
| +    return time_to_interaction > abort_info.time_to_abort;
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -532,8 +526,8 @@ void FromGWSPageLoadMetricsLogger::OnComplete(
 | 
|    if (!ShouldLogPostCommitMetrics(extra_info.url))
 | 
|      return;
 | 
|  
 | 
| -  UserAbortType abort_type = extra_info.abort_type;
 | 
| -  if (!WasAbortedInForeground(abort_type, extra_info.time_to_abort, extra_info))
 | 
| +  page_load_metrics::PageAbortInfo abort_info = GetPageAbortInfo(extra_info);
 | 
| +  if (!WasAbortedInForeground(extra_info, abort_info))
 | 
|      return;
 | 
|  
 | 
|    // If we did not receive any timing IPCs from the render process, we can't
 | 
| @@ -546,13 +540,11 @@ void FromGWSPageLoadMetricsLogger::OnComplete(
 | 
|    if (timing.IsEmpty())
 | 
|      return;
 | 
|  
 | 
| -  base::TimeDelta time_to_abort = extra_info.time_to_abort.value();
 | 
| -  if (!timing.first_paint || timing.first_paint >= time_to_abort) {
 | 
| -    LogCommittedAbortsBeforePaint(abort_type, time_to_abort);
 | 
| -  } else if (WasAbortedBeforeInteraction(abort_type,
 | 
| -                                         first_user_interaction_after_paint_,
 | 
| -                                         extra_info.time_to_abort)) {
 | 
| -    LogAbortsAfterPaintBeforeInteraction(abort_type, time_to_abort);
 | 
| +  if (!timing.first_paint || timing.first_paint >= abort_info.time_to_abort) {
 | 
| +    LogCommittedAbortsBeforePaint(abort_info.reason, abort_info.time_to_abort);
 | 
| +  } else if (WasAbortedBeforeInteraction(abort_info,
 | 
| +                                         first_user_interaction_after_paint_)) {
 | 
| +    LogAbortsAfterPaintBeforeInteraction(abort_info);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -562,11 +554,11 @@ void FromGWSPageLoadMetricsLogger::OnFailedProvisionalLoad(
 | 
|    if (!ShouldLogFailedProvisionalLoadMetrics())
 | 
|      return;
 | 
|  
 | 
| -  UserAbortType abort_type = extra_info.abort_type;
 | 
| -  if (!WasAbortedInForeground(abort_type, extra_info.time_to_abort, extra_info))
 | 
| +  page_load_metrics::PageAbortInfo abort_info = GetPageAbortInfo(extra_info);
 | 
| +  if (!WasAbortedInForeground(extra_info, abort_info))
 | 
|      return;
 | 
|  
 | 
| -  LogProvisionalAborts(abort_type, extra_info.time_to_abort.value());
 | 
| +  LogProvisionalAborts(abort_info);
 | 
|  }
 | 
|  
 | 
|  bool FromGWSPageLoadMetricsLogger::ShouldLogFailedProvisionalLoadMetrics() {
 | 
| 
 |