Chromium Code Reviews| Index: chrome/browser/engagement/site_engagement_helper.h |
| diff --git a/chrome/browser/engagement/site_engagement_helper.h b/chrome/browser/engagement/site_engagement_helper.h |
| index c3883d5cf41a1363e67469f1c0e0bcf2d7635844..b0a18a0260a80ba3b02a5cbd40dc1b0279d972da 100644 |
| --- a/chrome/browser/engagement/site_engagement_helper.h |
| +++ b/chrome/browser/engagement/site_engagement_helper.h |
| @@ -6,6 +6,8 @@ |
| #define CHROME_BROWSER_ENGAGEMENT_SITE_ENGAGEMENT_HELPER_H_ |
| #include "base/macros.h" |
| +#include "base/timer/timer.h" |
| +#include "content/public/browser/render_view_host.h" |
| #include "content/public/browser/web_contents_observer.h" |
| #include "content/public/browser/web_contents_user_data.h" |
| @@ -16,21 +18,89 @@ class WebContents; |
| class GURL; |
| // Per-WebContents class to handle updating the site engagement scores for |
| -// origins as the user navigates. |
| +// origins based on the time spent on site. |
| +// |
| +// Time on site is recorded by detecting any user input (mouse or keypress) per |
| +// some discrete time unit. If there is user input, then record a positive site |
| +// engagement. |
| +// |
| +// TODO(dominickn): account for use cases where user input is not a good proxy |
| +// for time on site: e.g. watching videos. |
| class SiteEngagementHelper |
| : public content::WebContentsObserver, |
| public content::WebContentsUserData<SiteEngagementHelper> { |
| public: |
| ~SiteEngagementHelper() override; |
| + static void SetSecondsBetweenUserInputCheck(double seconds); |
| + static void DisableCallbackRegistrationForTesting(); |
|
calamity
2015/09/22 02:57:21
If these are for testing and the test class is fri
dominickn
2015/09/23 00:06:44
Done.
|
| + |
| private: |
| + // Class to encapsulate the user input listening. |
| + // |
| + // User input is used to record time-on-site. When input is detected, |
| + // SiteEngagementHelper::RecordUserInput is called, and the input detection |
| + // callbacks are paused for a duration of gSecondsBetweenUserInputCheck. This |
| + // ensures that there is minimal overhead in input listening, and that input |
| + // over an extended length of time is required to continually increase the |
| + // engagement score. |
| + class InputTracker { |
| + public: |
| + explicit InputTracker(SiteEngagementHelper* helper); |
| + ~InputTracker(); |
| + |
| + // Callback to handle key press events from the RenderViewHost. |
| + bool HandleKeyPressEvent(const content::NativeWebKeyboardEvent& event); |
| + |
| + // Callback to handle mouse events from the RenderViewHost. |
| + bool HandleMouseEvent(const blink::WebMouseEvent& event); |
| + |
| + // Register callbacks to listen for user input. |
| + void StartTracking(content::RenderViewHost* host); |
| + |
| + // Pause listening for user input, restarting listening after |
| + // gSecondsBetweenUserInputCheck seconds. |
| + void PauseTracking(content::RenderViewHost* host); |
| + |
| + // Restart listening for user input. |
| + void ResumeTracking(); |
| + |
| + // Stop listening for user input. |
| + void StopTracking(content::RenderViewHost* host); |
| + |
| + // Set the timer object for testing purposes. |
| + void SetTimerForTesting(scoped_ptr<base::Timer> timer); |
| + |
| + private: |
| + SiteEngagementHelper* helper_; |
| + scoped_ptr<base::Timer> timer_; |
| + content::RenderWidgetHost::KeyPressEventCallback key_press_event_callback_; |
| + content::RenderWidgetHost::MouseEventCallback mouse_event_callback_; |
| + bool callbacks_added_; |
| + }; |
| + |
| explicit SiteEngagementHelper(content::WebContents* web_contents); |
| friend class content::WebContentsUserData<SiteEngagementHelper>; |
| + friend class SiteEngagementServiceBrowserTest; |
| + |
| + // Ask the SiteEngagementService to record engagement via user input at the |
| + // current contents location. |
| + void RecordUserInput(); |
| + |
| // content::WebContentsObserver overrides. |
| - void DidStartNavigationToPendingEntry( |
| - const GURL& url, |
| - content::NavigationController::ReloadType reload_type) override; |
| + void DidNavigateMainFrame( |
| + const content::LoadCommittedDetails& details, |
| + const content::FrameNavigateParams& params) override; |
| + |
| + void RenderViewHostChanged(content::RenderViewHost* old_host, |
| + content::RenderViewHost* new_host) override; |
| + |
| + void WasShown() override; |
| + void WasHidden() override; |
| + |
| + scoped_ptr<InputTracker> tracker_; |
| + bool record_engagement_; |
| DISALLOW_COPY_AND_ASSIGN(SiteEngagementHelper); |
| }; |