Index: chrome/browser/engagement/site_engagement_service_unittest.cc |
diff --git a/chrome/browser/engagement/site_engagement_service_unittest.cc b/chrome/browser/engagement/site_engagement_service_unittest.cc |
index 85e709da56e3038918725d5fd517713441c19ae2..3af889d0182068ff610808f72cac801f9b2e4252 100644 |
--- a/chrome/browser/engagement/site_engagement_service_unittest.cc |
+++ b/chrome/browser/engagement/site_engagement_service_unittest.cc |
@@ -97,6 +97,46 @@ std::unique_ptr<KeyedService> BuildTestHistoryService( |
} // namespace |
+class ObserverTester : public SiteEngagementObserver { |
+ public: |
+ ObserverTester(SiteEngagementService* service, |
+ content::WebContents* web_contents, |
+ const GURL& url, |
+ double score) |
+ : SiteEngagementObserver(service), |
+ web_contents_(web_contents), |
+ url_(url), |
+ score_(score), |
+ callback_called_(false), |
+ run_loop_() {} |
+ |
+ void OnEngagementIncreased(content::WebContents* web_contents, |
+ const GURL& url, |
+ double score) override { |
+ EXPECT_EQ(web_contents_, web_contents); |
+ EXPECT_EQ(url_, url); |
+ EXPECT_DOUBLE_EQ(score_, score); |
+ set_callback_called(true); |
+ run_loop_.Quit(); |
+ } |
+ |
+ void Wait() { run_loop_.Run(); } |
+ |
+ bool callback_called() { return callback_called_; } |
+ void set_callback_called(bool callback_called) { |
+ callback_called_ = callback_called; |
+ } |
+ |
+ private: |
+ content::WebContents* web_contents_; |
+ GURL url_; |
+ double score_; |
+ bool callback_called_; |
+ base::RunLoop run_loop_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ObserverTester); |
+}; |
+ |
class SiteEngagementServiceTest : public ChromeRenderViewHostTestHarness { |
public: |
void SetUp() override { |
@@ -1016,6 +1056,69 @@ TEST_F(SiteEngagementServiceTest, EngagementLevel) { |
url2, SiteEngagementService::ENGAGEMENT_LEVEL_MAX)); |
} |
+TEST_F(SiteEngagementServiceTest, Observers) { |
+ SiteEngagementService* service = SiteEngagementService::Get(profile()); |
+ |
+ GURL url_score_1("http://www.google.com/maps"); |
+ GURL url_score_2("http://www.google.com/drive"); |
+ GURL url_score_3("http://www.google.com/"); |
+ GURL url_not_called("https://www.google.com/"); |
+ |
+ // Create an observer and Observe(nullptr). |
+ ObserverTester tester_not_called(service, web_contents(), url_not_called, 1); |
+ tester_not_called.Observe(nullptr); |
+ |
+ { |
+ // Create an observer for navigation. |
+ ObserverTester tester(service, web_contents(), url_score_1, 0.5); |
+ NavigateAndCommit(url_score_1); |
+ service->HandleNavigation(web_contents(), ui::PAGE_TRANSITION_TYPED); |
+ tester.Wait(); |
+ EXPECT_TRUE(tester.callback_called()); |
+ EXPECT_FALSE(tester_not_called.callback_called()); |
+ tester.Observe(nullptr); |
+ } |
+ |
+ { |
+ // Update observer for a user input. |
+ ObserverTester tester(service, web_contents(), url_score_2, 0.55); |
+ NavigateAndCommit(url_score_2); |
+ service->HandleUserInput(web_contents(), |
+ SiteEngagementMetrics::ENGAGEMENT_MOUSE); |
+ tester.Wait(); |
+ EXPECT_TRUE(tester.callback_called()); |
+ EXPECT_FALSE(tester_not_called.callback_called()); |
+ tester.Observe(nullptr); |
+ } |
+ |
+ // Add two observers for media playing in the foreground. |
+ { |
+ ObserverTester tester_1(service, web_contents(), url_score_3, 0.57); |
+ ObserverTester tester_2(service, web_contents(), url_score_3, 0.57); |
+ NavigateAndCommit(url_score_3); |
+ service->HandleMediaPlaying(web_contents(), false); |
+ tester_1.Wait(); |
+ tester_2.Wait(); |
+ |
+ EXPECT_TRUE(tester_1.callback_called()); |
+ EXPECT_TRUE(tester_2.callback_called()); |
+ EXPECT_FALSE(tester_not_called.callback_called()); |
+ tester_1.Observe(nullptr); |
+ tester_2.Observe(nullptr); |
+ } |
+ |
+ // Add an observer for media playing in the background. |
+ { |
+ ObserverTester tester(service, web_contents(), url_score_3, 0.58); |
+ service->HandleMediaPlaying(web_contents(), true); |
+ tester.Wait(); |
+ |
+ EXPECT_TRUE(tester.callback_called()); |
+ EXPECT_FALSE(tester_not_called.callback_called()); |
+ tester.Observe(nullptr); |
+ } |
+} |
+ |
TEST_F(SiteEngagementServiceTest, ScoreDecayHistograms) { |
base::SimpleTestClock* clock = new base::SimpleTestClock(); |
std::unique_ptr<SiteEngagementService> service( |