From 27e52b7e3d25a8b213e69bd97ca281db982c0e6a Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Fri, 19 Mar 2021 10:53:36 -0400 Subject: [PATCH] Closes #17956: Add top site telemetry to available search engines (#18129) --- .../SessionControlController.kt | 34 +++++++-------- .../DefaultSessionControlControllerTest.kt | 41 +++++++++++++++++++ 2 files changed, 56 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt index 711e668c5..8339d8c87 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt @@ -13,6 +13,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import mozilla.components.browser.state.selector.getNormalOrPrivateTabs +import mozilla.components.browser.state.state.availableSearchEngines import mozilla.components.browser.state.state.searchEngines import mozilla.components.browser.state.state.selectedOrDefaultSearchEngine import mozilla.components.browser.state.store.BrowserStore @@ -384,19 +385,18 @@ class DefaultSessionControlController( metrics.track(Event.PocketTopSiteClicked) } - if (SupportUtils.GOOGLE_URL.equals(url, true)) { - val availableEngines = getAvailableSearchEngines() + val availableEngines = getAvailableSearchEngines() - val searchAccessPoint = Event.PerformedSearch.SearchAccessPoint.TOPSITE - val event = - availableEngines.firstOrNull { engine -> engine.suggestUrl?.contains(url) == true } - ?.let { searchEngine -> - searchAccessPoint.let { sap -> - MetricsUtils.createSearchEvent(searchEngine, store, sap) - } - } - event?.let { activity.metrics.track(it) } - } + val searchAccessPoint = Event.PerformedSearch.SearchAccessPoint.TOPSITE + val event = + availableEngines.firstOrNull { + engine -> engine.resultUrls.firstOrNull { it.contains(url) } != null + }?.let { + searchEngine -> searchAccessPoint.let { sap -> + MetricsUtils.createSearchEvent(searchEngine, store, sap) + } + } + event?.let { activity.metrics.track(it) } addTabUseCase.invoke( url = appendSearchAttributionToUrlIfNeeded(url), @@ -407,13 +407,9 @@ class DefaultSessionControlController( } @VisibleForTesting - internal fun getAvailableSearchEngines() = activity - .components - .core - .store - .state - .search - .searchEngines + internal fun getAvailableSearchEngines() = + activity.components.core.store.state.search.searchEngines + + activity.components.core.store.state.search.availableSearchEngines /** * Append a search attribution query to any provided search engine URL based on the diff --git a/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt b/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt index 794d34039..99fbaaf96 100644 --- a/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt @@ -101,6 +101,15 @@ class DefaultSessionControlControllerTest { suggestUrl = "https://www.google.com/" ) + private val duckDuckGoSearchEngine = SearchEngine( + id = "ddgTest", + name = "DuckDuckGo Test Engine", + icon = mockk(relaxed = true), + type = SearchEngine.Type.BUNDLED, + resultUrls = listOf("https://duckduckgo.com/?q=%7BsearchTerms%7D&t=fpas"), + suggestUrl = "https://ac.duckduckgo.com/ac/?q=%7BsearchTerms%7D&type=list" + ) + private lateinit var store: BrowserStore private lateinit var controller: DefaultSessionControlController @@ -374,6 +383,7 @@ class DefaultSessionControlControllerTest { @Test fun handleSelectDefaultTopSite() { val topSiteUrl = "mozilla.org" + every { controller.getAvailableSearchEngines() } returns listOf(searchEngine) controller.handleSelectTopSite(topSiteUrl, TopSite.Type.DEFAULT) verify { metrics.track(Event.TopSiteOpenInNewTab) } @@ -391,6 +401,7 @@ class DefaultSessionControlControllerTest { @Test fun handleSelectNonDefaultTopSite() { val topSiteUrl = "mozilla.org" + every { controller.getAvailableSearchEngines() } returns listOf(searchEngine) controller.handleSelectTopSite(topSiteUrl, TopSite.Type.FRECENT) verify { metrics.track(Event.TopSiteOpenInNewTab) } @@ -466,6 +477,36 @@ class DefaultSessionControlControllerTest { ) ) ) + metrics.track(Event.TopSiteOpenGoogle) + metrics.track(Event.TopSiteOpenDefault) + } + } finally { + unmockkStatic("mozilla.components.browser.state.state.SearchStateKt") + } + } + + @Test + fun handleSelectDuckDuckGoTopSite_EventPerformedSearchTopSite() { + val topSiteUrl = "https://duckduckgo.com" + val engineSource = EngineSource.Shortcut(duckDuckGoSearchEngine, false) + every { controller.getAvailableSearchEngines() } returns listOf(googleSearchEngine, duckDuckGoSearchEngine) + try { + mockkStatic("mozilla.components.browser.state.state.SearchStateKt") + + every { any().selectedOrDefaultSearchEngine } returns googleSearchEngine + + controller.handleSelectTopSite(topSiteUrl, TopSite.Type.PINNED) + + verify { + metrics.track( + Event.PerformedSearch( + Event.PerformedSearch.EventSource.TopSite( + engineSource + ) + ) + ) + + metrics.track(Event.TopSiteOpenPinned) } } finally { unmockkStatic("mozilla.components.browser.state.state.SearchStateKt")