Closes #17956: Add top site telemetry to available search engines (#18129)

upstream-sync
Roger Yang 3 years ago committed by GitHub
parent 79794962d0
commit 27e52b7e3d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -13,6 +13,7 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import mozilla.components.browser.state.selector.getNormalOrPrivateTabs 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.searchEngines
import mozilla.components.browser.state.state.selectedOrDefaultSearchEngine import mozilla.components.browser.state.state.selectedOrDefaultSearchEngine
import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.state.store.BrowserStore
@ -384,19 +385,18 @@ class DefaultSessionControlController(
metrics.track(Event.PocketTopSiteClicked) metrics.track(Event.PocketTopSiteClicked)
} }
if (SupportUtils.GOOGLE_URL.equals(url, true)) { val availableEngines = getAvailableSearchEngines()
val availableEngines = getAvailableSearchEngines()
val searchAccessPoint = Event.PerformedSearch.SearchAccessPoint.TOPSITE val searchAccessPoint = Event.PerformedSearch.SearchAccessPoint.TOPSITE
val event = val event =
availableEngines.firstOrNull { engine -> engine.suggestUrl?.contains(url) == true } availableEngines.firstOrNull {
?.let { searchEngine -> engine -> engine.resultUrls.firstOrNull { it.contains(url) } != null
searchAccessPoint.let { sap -> }?.let {
MetricsUtils.createSearchEvent(searchEngine, store, sap) searchEngine -> searchAccessPoint.let { sap ->
} MetricsUtils.createSearchEvent(searchEngine, store, sap)
} }
event?.let { activity.metrics.track(it) } }
} event?.let { activity.metrics.track(it) }
addTabUseCase.invoke( addTabUseCase.invoke(
url = appendSearchAttributionToUrlIfNeeded(url), url = appendSearchAttributionToUrlIfNeeded(url),
@ -407,13 +407,9 @@ class DefaultSessionControlController(
} }
@VisibleForTesting @VisibleForTesting
internal fun getAvailableSearchEngines() = activity internal fun getAvailableSearchEngines() =
.components activity.components.core.store.state.search.searchEngines +
.core activity.components.core.store.state.search.availableSearchEngines
.store
.state
.search
.searchEngines
/** /**
* Append a search attribution query to any provided search engine URL based on the * Append a search attribution query to any provided search engine URL based on the

@ -101,6 +101,15 @@ class DefaultSessionControlControllerTest {
suggestUrl = "https://www.google.com/" 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 store: BrowserStore
private lateinit var controller: DefaultSessionControlController private lateinit var controller: DefaultSessionControlController
@ -374,6 +383,7 @@ class DefaultSessionControlControllerTest {
@Test @Test
fun handleSelectDefaultTopSite() { fun handleSelectDefaultTopSite() {
val topSiteUrl = "mozilla.org" val topSiteUrl = "mozilla.org"
every { controller.getAvailableSearchEngines() } returns listOf(searchEngine)
controller.handleSelectTopSite(topSiteUrl, TopSite.Type.DEFAULT) controller.handleSelectTopSite(topSiteUrl, TopSite.Type.DEFAULT)
verify { metrics.track(Event.TopSiteOpenInNewTab) } verify { metrics.track(Event.TopSiteOpenInNewTab) }
@ -391,6 +401,7 @@ class DefaultSessionControlControllerTest {
@Test @Test
fun handleSelectNonDefaultTopSite() { fun handleSelectNonDefaultTopSite() {
val topSiteUrl = "mozilla.org" val topSiteUrl = "mozilla.org"
every { controller.getAvailableSearchEngines() } returns listOf(searchEngine)
controller.handleSelectTopSite(topSiteUrl, TopSite.Type.FRECENT) controller.handleSelectTopSite(topSiteUrl, TopSite.Type.FRECENT)
verify { metrics.track(Event.TopSiteOpenInNewTab) } 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<SearchState>().selectedOrDefaultSearchEngine } returns googleSearchEngine
controller.handleSelectTopSite(topSiteUrl, TopSite.Type.PINNED)
verify {
metrics.track(
Event.PerformedSearch(
Event.PerformedSearch.EventSource.TopSite(
engineSource
)
)
)
metrics.track(Event.TopSiteOpenPinned)
} }
} finally { } finally {
unmockkStatic("mozilla.components.browser.state.state.SearchStateKt") unmockkStatic("mozilla.components.browser.state.state.SearchStateKt")

Loading…
Cancel
Save