| Index: chrome/browser/engagement/site_engagement_helper.cc
 | 
| diff --git a/chrome/browser/engagement/site_engagement_helper.cc b/chrome/browser/engagement/site_engagement_helper.cc
 | 
| index 46602b57dc89cbeccb1e90e19163f57bebae7d39..8da594f16f4c846ec56071c62afdb6a24a550a6f 100644
 | 
| --- a/chrome/browser/engagement/site_engagement_helper.cc
 | 
| +++ b/chrome/browser/engagement/site_engagement_helper.cc
 | 
| @@ -8,7 +8,6 @@
 | 
|  #include "base/trace_event/trace_event.h"
 | 
|  #include "chrome/browser/engagement/site_engagement_service.h"
 | 
|  #include "chrome/browser/engagement/site_engagement_service_factory.h"
 | 
| -#include "chrome/browser/prerender/prerender_contents.h"
 | 
|  #include "chrome/browser/profiles/profile.h"
 | 
|  #include "content/public/browser/navigation_entry.h"
 | 
|  #include "content/public/browser/web_contents.h"
 | 
| @@ -23,90 +22,28 @@ int g_seconds_tracking_delay_after_show = 5;
 | 
|  
 | 
|  DEFINE_WEB_CONTENTS_USER_DATA_KEY(SiteEngagementHelper);
 | 
|  
 | 
| -SiteEngagementHelper::InputTracker::InputTracker(SiteEngagementHelper* helper)
 | 
| -    : helper_(helper),
 | 
| +SiteEngagementHelper::InputTracker::InputTracker(
 | 
| +    content::WebContents* web_contents,
 | 
| +    SiteEngagementHelper* helper)
 | 
| +    : WebContentsObserver(web_contents),
 | 
| +      helper_(helper),
 | 
|        pause_timer_(new base::Timer(true, false)),
 | 
| -      host_(nullptr),
 | 
| -      is_tracking_(false) {
 | 
| -  key_press_event_callback_ =
 | 
| -      base::Bind(&SiteEngagementHelper::InputTracker::HandleKeyPressEvent,
 | 
| -                 base::Unretained(this));
 | 
| -  mouse_event_callback_ =
 | 
| -      base::Bind(&SiteEngagementHelper::InputTracker::HandleMouseEvent,
 | 
| -                 base::Unretained(this));
 | 
| -}
 | 
| +      is_tracking_(false) {}
 | 
|  
 | 
|  SiteEngagementHelper::InputTracker::~InputTracker() {}
 | 
|  
 | 
| -// Record that there was some user input, and defer handling of the input event.
 | 
| -// web_contents() will return nullptr if the observed contents have been
 | 
| -// deleted; if the contents exist, record engagement for the site. Once the
 | 
| -// timer finishes running, the callbacks detecting user input will be registered
 | 
| -// again.
 | 
| -bool SiteEngagementHelper::InputTracker::HandleKeyPressEvent(
 | 
| -    const content::NativeWebKeyboardEvent& event) {
 | 
| -  // Only respond to raw key down to avoid multiple triggering on a single input
 | 
| -  // (e.g. keypress is a key down then key up).
 | 
| -  if (event.type == blink::WebInputEvent::RawKeyDown) {
 | 
| -    Pause();
 | 
| -    helper_->RecordUserInput(SiteEngagementMetrics::ENGAGEMENT_KEYPRESS);
 | 
| -  }
 | 
| -  return false;
 | 
| -}
 | 
| -
 | 
| -bool SiteEngagementHelper::InputTracker::HandleMouseEvent(
 | 
| -    const blink::WebMouseEvent& event) {
 | 
| -  // Only respond to mouse down with a button or mouse move events (e.g. a click
 | 
| -  // is a mouse down and mouse up) to avoid cases where multiple events come in
 | 
| -  // before we can pause tracking.
 | 
| -  if ((event.button != blink::WebMouseEvent::ButtonNone &&
 | 
| -       event.type == blink::WebInputEvent::MouseDown) ||
 | 
| -      event.type == blink::WebInputEvent::MouseWheel) {
 | 
| -    Pause();
 | 
| -    helper_->RecordUserInput(SiteEngagementMetrics::ENGAGEMENT_MOUSE);
 | 
| -  }
 | 
| -  return false;
 | 
| -}
 | 
| -
 | 
| -void SiteEngagementHelper::InputTracker::Start(content::RenderViewHost* host,
 | 
| -                                               base::TimeDelta initial_delay) {
 | 
| -  DCHECK(!host_);
 | 
| -  DCHECK(host);
 | 
| -  host_ = host;
 | 
| +void SiteEngagementHelper::InputTracker::Start(base::TimeDelta initial_delay) {
 | 
|    StartTimer(initial_delay);
 | 
|  }
 | 
|  
 | 
|  void SiteEngagementHelper::InputTracker::Pause() {
 | 
| -  RemoveCallbacks();
 | 
| +  is_tracking_ = false;
 | 
|    StartTimer(base::TimeDelta::FromSeconds(g_seconds_between_user_input_check));
 | 
|  }
 | 
|  
 | 
| -void SiteEngagementHelper::InputTracker::SwitchRenderViewHost(
 | 
| -    content::RenderViewHost* old_host,
 | 
| -    content::RenderViewHost* new_host) {
 | 
| -  DCHECK(host_);
 | 
| -  DCHECK(new_host);
 | 
| -
 | 
| -  bool was_tracking = is_tracking_;
 | 
| -  if (old_host) {
 | 
| -    DCHECK_EQ(host_, old_host);
 | 
| -    RemoveCallbacks();
 | 
| -  }
 | 
| -
 | 
| -  host_ = new_host;
 | 
| -
 | 
| -  if (was_tracking)
 | 
| -    AddCallbacks();
 | 
| -}
 | 
| -
 | 
|  void SiteEngagementHelper::InputTracker::Stop() {
 | 
| +  is_tracking_ = false;
 | 
|    pause_timer_->Stop();
 | 
| -  RemoveCallbacks();
 | 
| -  host_ = nullptr;
 | 
| -}
 | 
| -
 | 
| -bool SiteEngagementHelper::InputTracker::IsActive() const {
 | 
| -  return host_ != nullptr;
 | 
|  }
 | 
|  
 | 
|  void SiteEngagementHelper::InputTracker::SetPauseTimerForTesting(
 | 
| @@ -117,26 +54,41 @@ void SiteEngagementHelper::InputTracker::SetPauseTimerForTesting(
 | 
|  void SiteEngagementHelper::InputTracker::StartTimer(base::TimeDelta delay) {
 | 
|    pause_timer_->Start(
 | 
|        FROM_HERE, delay,
 | 
| -      base::Bind(&SiteEngagementHelper::InputTracker::AddCallbacks,
 | 
| +      base::Bind(&SiteEngagementHelper::InputTracker::StartTracking,
 | 
|                   base::Unretained(this)));
 | 
|  }
 | 
|  
 | 
| -void SiteEngagementHelper::InputTracker::AddCallbacks() {
 | 
| -  content::WebContents* contents = helper_->web_contents();
 | 
| -  if (!contents)
 | 
| -    return;
 | 
| -
 | 
| -  host_->GetWidget()->AddKeyPressEventCallback(key_press_event_callback_);
 | 
| -  host_->GetWidget()->AddMouseEventCallback(mouse_event_callback_);
 | 
| +void SiteEngagementHelper::InputTracker::StartTracking() {
 | 
|    is_tracking_ = true;
 | 
|  }
 | 
|  
 | 
| -void SiteEngagementHelper::InputTracker::RemoveCallbacks() {
 | 
| -  if (is_tracking_) {
 | 
| -    host_->GetWidget()->RemoveKeyPressEventCallback(key_press_event_callback_);
 | 
| -    host_->GetWidget()->RemoveMouseEventCallback(mouse_event_callback_);
 | 
| -    is_tracking_ = false;
 | 
| +// Record that there was some user input, and defer handling of the input event.
 | 
| +// Once the timer finishes running, the callbacks detecting user input will be
 | 
| +// registered again.
 | 
| +void SiteEngagementHelper::InputTracker::DidGetUserInteraction(
 | 
| +    const blink::WebInputEvent::Type type) {
 | 
| +  // Only respond to raw key down to avoid multiple triggering on a single input
 | 
| +  // (e.g. keypress is a key down then key up).
 | 
| +  if (!is_tracking_)
 | 
| +    return;
 | 
| +
 | 
| +  // This switch has a default NOTREACHED case because it will not test all
 | 
| +  // of the values of the WebInputEvent::Type enum (hence it won't require the
 | 
| +  // compiler verifying that all cases are covered).
 | 
| +  switch (type) {
 | 
| +    case blink::WebInputEvent::RawKeyDown:
 | 
| +      helper_->RecordUserInput(SiteEngagementMetrics::ENGAGEMENT_KEYPRESS);
 | 
| +      break;
 | 
| +    case blink::WebInputEvent::MouseDown:
 | 
| +      helper_->RecordUserInput(SiteEngagementMetrics::ENGAGEMENT_MOUSE);
 | 
| +      break;
 | 
| +    case blink::WebInputEvent::GestureTapDown:
 | 
| +      helper_->RecordUserInput(SiteEngagementMetrics::ENGAGEMENT_TOUCH_GESTURE);
 | 
| +      break;
 | 
| +    default:
 | 
| +      NOTREACHED();
 | 
|    }
 | 
| +  Pause();
 | 
|  }
 | 
|  
 | 
|  SiteEngagementHelper::~SiteEngagementHelper() {
 | 
| @@ -145,9 +97,9 @@ SiteEngagementHelper::~SiteEngagementHelper() {
 | 
|      input_tracker_.Stop();
 | 
|  }
 | 
|  
 | 
| -SiteEngagementHelper::SiteEngagementHelper(content::WebContents* contents)
 | 
| -    : content::WebContentsObserver(contents),
 | 
| -      input_tracker_(this),
 | 
| +SiteEngagementHelper::SiteEngagementHelper(content::WebContents* web_contents)
 | 
| +    : content::WebContentsObserver(web_contents),
 | 
| +      input_tracker_(web_contents, this),
 | 
|        record_engagement_(false) {}
 | 
|  
 | 
|  void SiteEngagementHelper::RecordUserInput(
 | 
| @@ -186,25 +138,13 @@ void SiteEngagementHelper::DidNavigateMainFrame(
 | 
|      service->HandleNavigation(params.url, params.transition);
 | 
|  
 | 
|    input_tracker_.Start(
 | 
| -      web_contents()->GetRenderViewHost(),
 | 
|        base::TimeDelta::FromSeconds(g_seconds_tracking_delay_after_navigation));
 | 
|  }
 | 
|  
 | 
| -void SiteEngagementHelper::RenderViewHostChanged(
 | 
| -    content::RenderViewHost* old_host,
 | 
| -    content::RenderViewHost* new_host) {
 | 
| -  // On changing the render view host, we need to re-register the callbacks
 | 
| -  // listening for user input.
 | 
| -  if (input_tracker_.IsActive()) {
 | 
| -    input_tracker_.SwitchRenderViewHost(old_host, new_host);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
|  void SiteEngagementHelper::WasShown() {
 | 
|    // Ensure that the input callbacks are registered when we come into view.
 | 
|    if (record_engagement_) {
 | 
|      input_tracker_.Start(
 | 
| -        web_contents()->GetRenderViewHost(),
 | 
|          base::TimeDelta::FromSeconds(g_seconds_tracking_delay_after_show));
 | 
|    }
 | 
|  }
 | 
| 
 |