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)); |
} |
} |