| Index: content/browser/web_contents/aura/overscroll_navigation_overlay.cc
 | 
| diff --git a/content/browser/web_contents/aura/overscroll_navigation_overlay.cc b/content/browser/web_contents/aura/overscroll_navigation_overlay.cc
 | 
| index e5e2019d223d977ce9c96489f49e0188db760615..b227d9b75c72b97147c7e5154cb355c6adf66d24 100644
 | 
| --- a/content/browser/web_contents/aura/overscroll_navigation_overlay.cc
 | 
| +++ b/content/browser/web_contents/aura/overscroll_navigation_overlay.cc
 | 
| @@ -13,10 +13,12 @@
 | 
|  #include "content/browser/frame_host/navigation_entry_impl.h"
 | 
|  #include "content/browser/renderer_host/render_view_host_impl.h"
 | 
|  #include "content/browser/web_contents/aura/overscroll_window_delegate.h"
 | 
| +#include "content/browser/web_contents/aura/uma_navigation_type.h"
 | 
|  #include "content/browser/web_contents/web_contents_impl.h"
 | 
|  #include "content/common/view_messages.h"
 | 
|  #include "content/public/browser/browser_thread.h"
 | 
|  #include "content/public/browser/render_widget_host_view.h"
 | 
| +#include "content/public/browser/user_metrics.h"
 | 
|  #include "ui/aura/window.h"
 | 
|  #include "ui/base/layout.h"
 | 
|  #include "ui/compositor/layer.h"
 | 
| @@ -46,6 +48,34 @@ bool DoesEntryMatchURL(NavigationEntry* entry, const GURL& url) {
 | 
|    return false;
 | 
|  }
 | 
|  
 | 
| +UmaNavigationType GetUmaNavigationType(
 | 
| +    OverscrollNavigationOverlay::NavigationDirection direction,
 | 
| +    OverscrollSource source) {
 | 
| +  if (direction == OverscrollNavigationOverlay::NONE ||
 | 
| +      source == OverscrollSource::NONE)
 | 
| +    return NAVIGATION_TYPE_NONE;
 | 
| +  if (direction == OverscrollNavigationOverlay::BACK)
 | 
| +    return source == OverscrollSource::TOUCHPAD
 | 
| +               ? UmaNavigationType::BACK_TOUCHPAD
 | 
| +               : UmaNavigationType::BACK_TOUCHSCREEN;
 | 
| +  DCHECK_EQ(direction, OverscrollNavigationOverlay::FORWARD);
 | 
| +  return source == OverscrollSource::TOUCHPAD
 | 
| +             ? UmaNavigationType::FORWARD_TOUCHPAD
 | 
| +             : UmaNavigationType::FORWARD_TOUCHSCREEN;
 | 
| +}
 | 
| +
 | 
| +// Records UMA historgram and also user action for the cancelled overscroll.
 | 
| +void RecordCancelled(OverscrollNavigationOverlay::NavigationDirection direction,
 | 
| +                     OverscrollSource source) {
 | 
| +  UMA_HISTOGRAM_ENUMERATION("Overscroll.Cancelled3",
 | 
| +                            GetUmaNavigationType(direction, source),
 | 
| +                            NAVIGATION_TYPE_COUNT);
 | 
| +  if (direction == OverscrollNavigationOverlay::BACK)
 | 
| +    RecordAction(base::UserMetricsAction("Overscroll_Cancelled.Back"));
 | 
| +  else
 | 
| +    RecordAction(base::UserMetricsAction("Overscroll_Cancelled.Forward"));
 | 
| +}
 | 
| +
 | 
|  }  // namespace
 | 
|  
 | 
|  // Responsible for fading out and deleting the layer of the overlay window.
 | 
| @@ -144,7 +174,9 @@ void OverscrollNavigationOverlay::StopObservingIfDone() {
 | 
|  std::unique_ptr<aura::Window> OverscrollNavigationOverlay::CreateOverlayWindow(
 | 
|      const gfx::Rect& bounds) {
 | 
|    UMA_HISTOGRAM_ENUMERATION(
 | 
| -      "Overscroll.Started2", direction_, NAVIGATION_COUNT);
 | 
| +      "Overscroll.Started3",
 | 
| +      GetUmaNavigationType(direction_, owa_->overscroll_source()),
 | 
| +      NAVIGATION_TYPE_COUNT);
 | 
|    OverscrollWindowDelegate* overscroll_delegate = new OverscrollWindowDelegate(
 | 
|        owa_.get(), GetImageForDirection(direction_));
 | 
|    std::unique_ptr<aura::Window> window(new aura::Window(overscroll_delegate));
 | 
| @@ -218,8 +250,7 @@ void OverscrollNavigationOverlay::OnOverscrollCompleted(
 | 
|    DCHECK(direction_ != NONE);
 | 
|    aura::Window* main_window = GetMainWindow();
 | 
|    if (!main_window) {
 | 
| -    UMA_HISTOGRAM_ENUMERATION(
 | 
| -        "Overscroll.Cancelled", direction_, NAVIGATION_COUNT);
 | 
| +    RecordCancelled(direction_, owa_->overscroll_source());
 | 
|      return;
 | 
|    }
 | 
|  
 | 
| @@ -244,14 +275,19 @@ void OverscrollNavigationOverlay::OnOverscrollCompleted(
 | 
|    } else {
 | 
|      // We need to dismiss the overlay without navigating as soon as the
 | 
|      // overscroll finishes.
 | 
| -    UMA_HISTOGRAM_ENUMERATION(
 | 
| -        "Overscroll.Cancelled", direction_, NAVIGATION_COUNT);
 | 
| +    RecordCancelled(direction_, owa_->overscroll_source());
 | 
|      loading_complete_ = true;
 | 
|    }
 | 
|  
 | 
|    if (navigated) {
 | 
|      UMA_HISTOGRAM_ENUMERATION(
 | 
| -        "Overscroll.Navigated2", direction_, NAVIGATION_COUNT);
 | 
| +        "Overscroll.Navigated3",
 | 
| +        GetUmaNavigationType(direction_, owa_->overscroll_source()),
 | 
| +        NAVIGATION_TYPE_COUNT);
 | 
| +    if (direction_ == BACK)
 | 
| +      RecordAction(base::UserMetricsAction("Overscroll_Navigated.Back"));
 | 
| +    else
 | 
| +      RecordAction(base::UserMetricsAction("Overscroll_Navigated.Forward"));
 | 
|      StartObserving();
 | 
|    }
 | 
|  
 | 
| @@ -260,8 +296,7 @@ void OverscrollNavigationOverlay::OnOverscrollCompleted(
 | 
|  }
 | 
|  
 | 
|  void OverscrollNavigationOverlay::OnOverscrollCancelled() {
 | 
| -  UMA_HISTOGRAM_ENUMERATION(
 | 
| -      "Overscroll.Cancelled", direction_, NAVIGATION_COUNT);
 | 
| +  RecordCancelled(direction_, owa_->overscroll_source());
 | 
|    aura::Window* main_window = GetMainWindow();
 | 
|    if (!main_window)
 | 
|      return;
 | 
| 
 |