tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 6c789a5f050985b1a449bed31046cfdaa6212381
parent 02c08f7939b74e5bea98f2fe425f26127819504e
Author: rmalicdem <rmalicdem@mozilla.com>
Date:   Tue,  9 Dec 2025 17:01:01 +0000

Bug 2003352 - Part 1: Refactor AddressBar source into smaller subcomponents r=android-reviewers,Roger

Differential Revision: https://phabricator.services.mozilla.com/D274848

Diffstat:
Mmobile/android/android-components/components/compose/browser-toolbar/src/main/java/mozilla/components/compose/browser/toolbar/store/BrowserToolbarInteraction.kt | 34+++++++++++++++++++++++++++++++---
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMiddleware.kt | 46+++++++++++++++++++++++-----------------------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarTelemetryMiddleware.kt | 6++++--
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/toolbar/BrowserToolbarMiddleware.kt | 4++--
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/toolbar/BrowserToolbarTelemetryMiddleware.kt | 6++++--
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMiddlewareTest.kt | 58+++++++++++++++++++++++++++++-----------------------------
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/toolbar/BrowserToolbarTelemetryMiddlewareTest.kt | 94++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/toolbar/BrowserToolbarMiddlewareTest.kt | 10+++++-----
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/toolbar/BrowserToolbarTelemetryMiddlewareTest.kt | 32++++++++++++++++----------------
9 files changed, 167 insertions(+), 123 deletions(-)

diff --git a/mobile/android/android-components/components/compose/browser-toolbar/src/main/java/mozilla/components/compose/browser/toolbar/store/BrowserToolbarInteraction.kt b/mobile/android/android-components/components/compose/browser-toolbar/src/main/java/mozilla/components/compose/browser/toolbar/store/BrowserToolbarInteraction.kt @@ -26,7 +26,7 @@ sealed interface BrowserToolbarInteraction { * @see [Source] */ val source: Source - get() = Source.AddressBar + get() = Source.Unknown /** * Convenience method to combine dispatching a [BrowserToolbarEvent] with @@ -44,14 +44,42 @@ sealed interface BrowserToolbarInteraction { */ sealed interface Source { /** - * The user interacted with a address bar element. + * Sources representing parts of the address bar where an interaction originated. + * + * Use these to differentiate interactions on the browser/page start/end areas + * of the address bar. */ - data object AddressBar : Source + sealed interface AddressBar : Source { + /** + * The user interacted with a browser start toolbar element. + */ + data object BrowserStart : AddressBar + + /** + * The user interacted with a page start toolbar element. + */ + data object PageStart : AddressBar + + /** + * The user interacted with a page end toolbar element. + */ + data object PageEnd : AddressBar + + /** + * The user interacted with a browser end toolbar element. + */ + data object BrowserEnd : AddressBar + } /** * The user interacted with a navigation bar element. */ data object NavigationBar : Source + + /** + * Default/unknown source when none of the specific sources apply. + */ + data object Unknown : Source } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMiddleware.kt @@ -139,24 +139,24 @@ import mozilla.components.ui.icons.R as iconsR import mozilla.components.ui.tabcounter.R as tabcounterR @VisibleForTesting -internal sealed class DisplayActions : BrowserToolbarEvent { - data class MenuClicked(override val source: Source) : DisplayActions() - data class NavigateBackClicked(override val source: Source) : DisplayActions() - data class NavigateBackLongClicked(override val source: Source) : DisplayActions() - data object NavigateForwardClicked : DisplayActions() - data object NavigateForwardLongClicked : DisplayActions() - data class RefreshClicked(val bypassCache: Boolean) : DisplayActions() - data object StopRefreshClicked : DisplayActions() - data class AddBookmarkClicked(override val source: Source) : DisplayActions() - data class EditBookmarkClicked(override val source: Source) : DisplayActions() - data class ShareClicked(override val source: Source) : DisplayActions() - data class TranslateClicked(override val source: Source) : DisplayActions() - data class HomepageClicked(override val source: Source) : DisplayActions() +internal sealed class DisplayActions(override val source: Source) : BrowserToolbarEvent { + data class MenuClicked(override val source: Source) : DisplayActions(source) + data class NavigateBackClicked(override val source: Source) : DisplayActions(source) + data class NavigateBackLongClicked(override val source: Source) : DisplayActions(source) + data object NavigateForwardClicked : DisplayActions(Source.AddressBar.BrowserStart) + data object NavigateForwardLongClicked : DisplayActions(Source.AddressBar.BrowserStart) + data class RefreshClicked(val bypassCache: Boolean) : DisplayActions(Source.AddressBar.BrowserStart) + data object StopRefreshClicked : DisplayActions(Source.AddressBar.BrowserStart) + data class AddBookmarkClicked(override val source: Source) : DisplayActions(source) + data class EditBookmarkClicked(override val source: Source) : DisplayActions(source) + data class ShareClicked(override val source: Source) : DisplayActions(source) + data class TranslateClicked(override val source: Source) : DisplayActions(source) + data class HomepageClicked(override val source: Source) : DisplayActions(source) } @VisibleForTesting -internal sealed class StartPageActions : BrowserToolbarEvent { - data object SiteInfoClicked : StartPageActions() +internal sealed class StartPageActions(override val source: Source) : BrowserToolbarEvent { + data object SiteInfoClicked : StartPageActions(Source.AddressBar.PageStart) } @VisibleForTesting @@ -174,10 +174,10 @@ internal sealed class PageOriginInteractions : BrowserToolbarEvent { } @VisibleForTesting -internal sealed class PageEndActionsInteractions : BrowserToolbarEvent { +internal sealed class PageEndActionsInteractions(override val source: Source) : BrowserToolbarEvent { data class ReaderModeClicked( val isActive: Boolean, - ) : PageEndActionsInteractions() + ) : PageEndActionsInteractions(Source.AddressBar.PageEnd) } /** @@ -690,7 +690,7 @@ class BrowserToolbarMiddleware( ).filter { config -> config.isVisible() }.map { config -> - buildAction(config.action) + buildAction(config.action, Source.AddressBar.PageStart) } } @@ -715,7 +715,7 @@ class BrowserToolbarMiddleware( ).filter { config -> config.isVisible() }.map { config -> - buildAction(config.action) + buildAction(config.action, Source.AddressBar.BrowserStart) } } @@ -745,7 +745,7 @@ class BrowserToolbarMiddleware( ).filter { config -> config.isVisible() }.map { config -> - buildAction(config.action) + buildAction(config.action, Source.AddressBar.PageEnd) } } @@ -769,7 +769,7 @@ class BrowserToolbarMiddleware( ) return configs.mapNotNull { config -> - config.takeIf { it.isVisible() }?.let { buildAction(it.action) } + config.takeIf { it.isVisible() }?.let { buildAction(it.action, Source.AddressBar.BrowserEnd) } } } @@ -1099,7 +1099,7 @@ class BrowserToolbarMiddleware( @VisibleForTesting internal fun buildAction( toolbarAction: ToolbarAction, - source: Source = Source.AddressBar, + source: Source = Source.Unknown, ): Action = when (toolbarAction) { ToolbarAction.NewTab -> ActionButtonRes( drawableResId = iconsR.drawable.mozac_ic_plus_24, @@ -1287,7 +1287,7 @@ class BrowserToolbarMiddleware( } private fun Source.toMetricSource() = when (this) { - Source.AddressBar -> MetricsUtils.BookmarkAction.Source.BROWSER_TOOLBAR + is Source.AddressBar, Source.Unknown -> MetricsUtils.BookmarkAction.Source.BROWSER_TOOLBAR Source.NavigationBar -> MetricsUtils.BookmarkAction.Source.BROWSER_NAVBAR } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarTelemetryMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarTelemetryMiddleware.kt @@ -139,10 +139,10 @@ class BrowserToolbarTelemetryMiddleware : Middleware<BrowserToolbarState, Browse private fun trackToolbarEvent( toolbarActionRecord: ToolbarActionRecord, - source: Source = Source.AddressBar, + source: Source = Source.Unknown, ) { when (source) { - Source.AddressBar -> + is Source.AddressBar -> Toolbar.buttonTapped.record( Toolbar.ButtonTappedExtra( source = SOURCE_ADDRESS_BAR, @@ -157,6 +157,8 @@ class BrowserToolbarTelemetryMiddleware : Middleware<BrowserToolbarState, Browse item = toolbarActionRecord.action, ), ) + + Source.Unknown -> return } } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/toolbar/BrowserToolbarMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/toolbar/BrowserToolbarMiddleware.kt @@ -325,7 +325,7 @@ class BrowserToolbarMiddleware( ).filter { config -> config.isVisible() }.map { config -> - buildHomeAction(config.action, Source.AddressBar) + buildHomeAction(config.action, Source.AddressBar.BrowserEnd) } } @@ -469,7 +469,7 @@ class BrowserToolbarMiddleware( @VisibleForTesting internal fun buildHomeAction( action: HomeToolbarAction, - source: Source = Source.AddressBar, + source: Source = Source.Unknown, ): Action = when (action) { HomeToolbarAction.TabCounter -> { val isInPrivateMode = browsingModeManager.mode.isPrivate diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/toolbar/BrowserToolbarTelemetryMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/toolbar/BrowserToolbarTelemetryMiddleware.kt @@ -65,10 +65,10 @@ class BrowserToolbarTelemetryMiddleware : Middleware<BrowserToolbarState, Browse private fun trackToolbarEvent( toolbarActionRecord: ToolbarActionRecord, - source: Source = Source.AddressBar, + source: Source = Source.Unknown, ) { when (source) { - Source.AddressBar -> + is Source.AddressBar -> Toolbar.buttonTapped.record( Toolbar.ButtonTappedExtra( source = SOURCE_ADDRESS_BAR, @@ -83,6 +83,8 @@ class BrowserToolbarTelemetryMiddleware : Middleware<BrowserToolbarState, Browse item = toolbarActionRecord.action, ), ) + + Source.Unknown -> return } } } diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMiddlewareTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMiddlewareTest.kt @@ -1187,7 +1187,7 @@ class BrowserToolbarMiddlewareTest { mainLooperRule.idle() val translateButton = toolbarStore.state.displayState.pageActionsEnd[0] - assertEquals(expectedTranslateButton(), translateButton) + assertEquals(expectedTranslateButton(source = Source.AddressBar.PageEnd), translateButton) } @Test @@ -1212,7 +1212,7 @@ class BrowserToolbarMiddlewareTest { ) mainLooperRule.idle() var translateButton = toolbarStore.state.displayState.pageActionsEnd[0] - assertEquals(expectedTranslateButton(), translateButton) + assertEquals(expectedTranslateButton(source = Source.AddressBar.PageEnd), translateButton) browserScreenStore.dispatch( PageTranslationStatusUpdated( @@ -1226,7 +1226,7 @@ class BrowserToolbarMiddlewareTest { mainLooperRule.idle() translateButton = toolbarStore.state.displayState.pageActionsEnd[0] assertEquals( - expectedTranslateButton(isActive = true), + expectedTranslateButton(isActive = true, source = Source.AddressBar.PageEnd), translateButton, ) } @@ -1295,7 +1295,7 @@ class BrowserToolbarMiddlewareTest { val toolbarStore = buildStore(middleware) val shareButton = toolbarStore.state.displayState.pageActionsEnd[0] - assertEquals(expectedShareButton(), shareButton) + assertEquals(expectedShareButton(source = Source.AddressBar.PageEnd), shareButton) } @Test @@ -1490,8 +1490,8 @@ class BrowserToolbarMiddlewareTest { assertEquals( listOf( expectedReaderModeButton(false), - expectedTranslateButton(), - expectedShareButton(), + expectedTranslateButton(source = Source.AddressBar.PageEnd), + expectedShareButton(source = Source.AddressBar.PageEnd), ), toolbarStore.state.displayState.pageActionsEnd, ) @@ -1518,7 +1518,7 @@ class BrowserToolbarMiddlewareTest { val toolbarStore = buildStore(middleware) val displayGoBackButton = toolbarStore.state.displayState.browserActionsStart[0] - assertEquals(displayGoBackButton, expectedGoBackButton(isActive = false)) + assertEquals(displayGoBackButton, expectedGoBackButton(isActive = false, source = Source.AddressBar.BrowserStart)) val displayGoForwardButton = toolbarStore.state.displayState.browserActionsStart[1] assertEquals(displayGoForwardButton, expectedGoForwardButton.copy(state = ActionButton.State.DISABLED)) } @@ -2101,7 +2101,7 @@ class BrowserToolbarMiddlewareTest { assertEquals(iconsR.drawable.mozac_ic_plus_24, result.drawableResId) assertEquals(R.string.home_screen_shortcut_open_new_tab_2, result.contentDescription) assertEquals(ActionButton.State.DEFAULT, result.state) - assertEquals(AddNewTab(Source.AddressBar), result.onClick) + assertEquals(AddNewTab(Source.Unknown), result.onClick) assertNull(result.onLongClick) } @@ -2115,8 +2115,8 @@ class BrowserToolbarMiddlewareTest { assertEquals(iconsR.drawable.mozac_ic_back_24, result.drawableResId) assertEquals(R.string.browser_menu_back, result.contentDescription) assertEquals(ActionButton.State.DISABLED, result.state) - assertEquals(NavigateBackClicked(Source.AddressBar), result.onClick) - assertEquals(NavigateBackLongClicked(Source.AddressBar), result.onLongClick) + assertEquals(NavigateBackClicked(Source.Unknown), result.onClick) + assertEquals(NavigateBackLongClicked(Source.Unknown), result.onLongClick) } @Test @@ -2251,7 +2251,7 @@ class BrowserToolbarMiddlewareTest { assertEquals(iconsR.drawable.mozac_ic_ellipsis_vertical_24, result.drawableResId) assertEquals(R.string.content_description_menu, result.contentDescription) assertEquals(ActionButton.State.DEFAULT, result.state) - assertEquals(MenuClicked(Source.AddressBar), result.onClick) + assertEquals(MenuClicked(Source.Unknown), result.onClick) assertNull(result.onLongClick) } @@ -2312,7 +2312,7 @@ class BrowserToolbarMiddlewareTest { assertEquals(iconsR.drawable.mozac_ic_translate_24, result.drawableResId) assertEquals(R.string.browser_toolbar_translate, result.contentDescription) assertEquals(ActionButton.State.DEFAULT, result.state) - assertEquals(TranslateClicked(Source.AddressBar), result.onClick) + assertEquals(TranslateClicked(Source.Unknown), result.onClick) } @Test @@ -2358,7 +2358,7 @@ class BrowserToolbarMiddlewareTest { action.contentDescription, ) assertFalse(action.showPrivacyMask) - assertEquals(TabCounterClicked(Source.AddressBar), action.onClick) + assertEquals(TabCounterClicked(Source.Unknown), action.onClick) assertNotNull(action.onLongClick) } @@ -2386,7 +2386,7 @@ class BrowserToolbarMiddlewareTest { assertEquals(iconsR.drawable.mozac_ic_bookmark_fill_24, result.drawableResId) assertEquals(R.string.browser_menu_edit_bookmark, result.contentDescription) - assertEquals(EditBookmarkClicked(Source.AddressBar), result.onClick) + assertEquals(EditBookmarkClicked(Source.Unknown), result.onClick) } @Test @@ -2400,7 +2400,7 @@ class BrowserToolbarMiddlewareTest { assertEquals(iconsR.drawable.mozac_ic_bookmark_24, result.drawableResId) assertEquals(R.string.browser_menu_bookmark_this_page_2, result.contentDescription) - assertEquals(AddBookmarkClicked(Source.AddressBar), result.onClick) + assertEquals(AddBookmarkClicked(Source.Unknown), result.onClick) } @Test @@ -2725,8 +2725,8 @@ class BrowserToolbarMiddlewareTest { ) val translateButton = toolbarStore.state.displayState.pageActionsEnd[0] - assertNotEquals(expectedTranslateButton(), translateButton) - assertEquals(expectedShareButton(), translateButton) + assertNotEquals(expectedTranslateButton(source = Source.AddressBar.PageEnd), translateButton) + assertEquals(expectedShareButton(source = Source.AddressBar.PageEnd), translateButton) } @Test @@ -2787,7 +2787,7 @@ class BrowserToolbarMiddlewareTest { val toolbarStore = buildStore() val bookmarkButton = toolbarStore.state.displayState.browserActionsEnd[0] as ActionButtonRes - assertEquals(expectedBookmarkButton(Source.AddressBar), bookmarkButton) + assertEquals(expectedBookmarkButton(), bookmarkButton) } @Test @@ -2816,7 +2816,7 @@ class BrowserToolbarMiddlewareTest { mainLooperRule.idle() val editButton = toolbarStore.state.displayState.browserActionsEnd[0] as ActionButtonRes - assertEquals(expectedEditBookmarkButton(Source.AddressBar), editButton) + assertEquals(expectedEditBookmarkButton(), editButton) } @Test @@ -3104,7 +3104,7 @@ class BrowserToolbarMiddlewareTest { private fun expectedGoBackButton( isActive: Boolean = true, - source: Source = Source.AddressBar, + source: Source = Source.AddressBar.BrowserEnd, ) = ActionButtonRes( drawableResId = iconsR.drawable.mozac_ic_back_24, contentDescription = R.string.browser_menu_back, @@ -3118,7 +3118,7 @@ class BrowserToolbarMiddlewareTest { private fun expectedTranslateButton( isActive: Boolean = false, - source: Source = Source.AddressBar, + source: Source = Source.AddressBar.BrowserEnd, ) = ActionButtonRes( drawableResId = iconsR.drawable.mozac_ic_translate_24, contentDescription = R.string.browser_toolbar_translate, @@ -3133,7 +3133,7 @@ class BrowserToolbarMiddlewareTest { tabCount: Int = 0, isPrivate: Boolean = false, shouldUseBottomToolbar: Boolean = false, - source: Source = Source.AddressBar, + source: Source = Source.AddressBar.BrowserEnd, ) = TabCounterAction( count = tabCount, contentDescription = if (isPrivate) { @@ -3182,7 +3182,7 @@ class BrowserToolbarMiddlewareTest { tabCount: Int = 0, isPrivate: Boolean = false, shouldUseBottomToolbar: Boolean = false, - source: Source = Source.AddressBar, + source: Source = Source.AddressBar.BrowserEnd, ) = expectedTabCounterButton( tabCount = tabCount, isPrivate = isPrivate, @@ -3196,7 +3196,7 @@ class BrowserToolbarMiddlewareTest { ) } - private fun expectedNewTabButton(source: Source = Source.AddressBar) = ActionButtonRes( + private fun expectedNewTabButton(source: Source = Source.AddressBar.BrowserEnd) = ActionButtonRes( drawableResId = iconsR.drawable.mozac_ic_plus_24, contentDescription = R.string.home_screen_shortcut_open_new_tab_2, onClick = AddNewTab(source), @@ -3204,7 +3204,7 @@ class BrowserToolbarMiddlewareTest { private fun expectedMenuButton( highlighted: Boolean = false, - source: Source = Source.AddressBar, + source: Source = Source.AddressBar.BrowserEnd, ) = ActionButtonRes( drawableResId = iconsR.drawable.mozac_ic_ellipsis_vertical_24, contentDescription = R.string.content_description_menu, @@ -3212,26 +3212,26 @@ class BrowserToolbarMiddlewareTest { onClick = MenuClicked(source), ) - private fun expectedBookmarkButton(source: Source = Source.AddressBar) = ActionButtonRes( + private fun expectedBookmarkButton(source: Source = Source.AddressBar.BrowserEnd) = ActionButtonRes( drawableResId = iconsR.drawable.mozac_ic_bookmark_24, contentDescription = R.string.browser_menu_bookmark_this_page_2, onClick = AddBookmarkClicked(source), ) - private fun expectedEditBookmarkButton(source: Source = Source.AddressBar) = ActionButtonRes( + private fun expectedEditBookmarkButton(source: Source = Source.AddressBar.BrowserEnd) = ActionButtonRes( drawableResId = iconsR.drawable.mozac_ic_bookmark_fill_24, contentDescription = R.string.browser_menu_edit_bookmark, onClick = EditBookmarkClicked(source), state = ActionButton.State.ACTIVE, ) - private fun expectedShareButton(source: Source = Source.AddressBar) = ActionButtonRes( + private fun expectedShareButton(source: Source = Source.AddressBar.BrowserEnd) = ActionButtonRes( drawableResId = iconsR.drawable.mozac_ic_share_android_24, contentDescription = R.string.browser_menu_share, onClick = ShareClicked(source), ) - private fun expectedHomepageButton(source: Source = Source.AddressBar) = ActionButtonRes( + private fun expectedHomepageButton(source: Source = Source.AddressBar.BrowserEnd) = ActionButtonRes( drawableResId = iconsR.drawable.mozac_ic_home_24, contentDescription = R.string.browser_menu_homepage, onClick = HomepageClicked(source), diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/toolbar/BrowserToolbarTelemetryMiddlewareTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/toolbar/BrowserToolbarTelemetryMiddlewareTest.kt @@ -40,123 +40,132 @@ class BrowserToolbarTelemetryMiddlewareTest { val gleanRule = FenixGleanTestRule(testContext) @Test - fun `WHEN menu button is clicked THEN record telemetry based on addressBar or navbar source`() { - buildStore.dispatch(MenuClicked(Source.AddressBar)) - assertTelemetryRecorded(Source.AddressBar, item = ToolbarActionRecord.MenuClicked.action) + fun `WHEN menu button is clicked THEN record telemetry based on browser end or navbar source`() { + buildStore.dispatch(MenuClicked(Source.AddressBar.BrowserEnd)) + assertTelemetryRecorded(Source.AddressBar.BrowserEnd, item = ToolbarActionRecord.MenuClicked.action) buildStore.dispatch(MenuClicked(Source.NavigationBar)) assertTelemetryRecorded(Source.NavigationBar, item = ToolbarActionRecord.MenuClicked.action) } @Test - fun `WHEN tab counter is clicked THEN record telemetry based on addressBar or navbar source`() { - buildStore.dispatch(TabCounterClicked(Source.AddressBar)) - assertTelemetryRecorded(Source.AddressBar, item = ToolbarActionRecord.TabCounterClicked.action) + fun `WHEN tab counter is clicked THEN record telemetry based on browser end or navbar source`() { + buildStore.dispatch(TabCounterClicked(Source.AddressBar.BrowserEnd)) + assertTelemetryRecorded(Source.AddressBar.BrowserEnd, item = ToolbarActionRecord.TabCounterClicked.action) buildStore.dispatch(TabCounterClicked(Source.NavigationBar)) assertTelemetryRecorded(Source.NavigationBar, item = ToolbarActionRecord.TabCounterClicked.action) } @Test - fun `WHEN tab counter is long clicked THEN record telemetry based on addressBar or navbar source`() { - buildStore.dispatch(TabCounterLongClicked(Source.AddressBar)) - assertTelemetryRecorded(Source.AddressBar, item = ToolbarActionRecord.TabCounterLongClicked.action) + fun `WHEN tab counter is long clicked THEN record telemetry based on browser end or navbar source`() { + buildStore.dispatch(TabCounterLongClicked(Source.AddressBar.BrowserEnd)) + assertTelemetryRecorded(Source.AddressBar.BrowserEnd, item = ToolbarActionRecord.TabCounterLongClicked.action) buildStore.dispatch(TabCounterLongClicked(Source.NavigationBar)) assertTelemetryRecorded(Source.NavigationBar, item = ToolbarActionRecord.TabCounterLongClicked.action) } @Test - fun `WHEN adding a new tab THEN record telemetry based on addressBar or navbar source`() { - buildStore.dispatch(AddNewTab(Source.AddressBar)) - assertTelemetryRecorded(Source.AddressBar, item = ToolbarActionRecord.AddNewTab.action) + fun `WHEN adding a new tab THEN record telemetry based on browser end or navbar source`() { + buildStore.dispatch(AddNewTab(Source.AddressBar.BrowserEnd)) + assertTelemetryRecorded(Source.AddressBar.BrowserEnd, item = ToolbarActionRecord.AddNewTab.action) buildStore.dispatch(AddNewTab(Source.NavigationBar)) assertTelemetryRecorded(Source.NavigationBar, item = ToolbarActionRecord.AddNewTab.action) } @Test - fun `WHEN adding a new private tab THEN record telemetry based on addressBar or navbar source`() { - buildStore.dispatch(AddNewPrivateTab(Source.AddressBar)) - assertTelemetryRecorded(Source.AddressBar, item = ToolbarActionRecord.AddNewPrivateTab.action) + fun `WHEN adding a new private tab THEN record telemetry based on browser end or navbar source`() { + buildStore.dispatch(AddNewPrivateTab(Source.AddressBar.BrowserEnd)) + assertTelemetryRecorded(Source.AddressBar.BrowserEnd, item = ToolbarActionRecord.AddNewPrivateTab.action) buildStore.dispatch(AddNewPrivateTab(Source.NavigationBar)) assertTelemetryRecorded(Source.NavigationBar, item = ToolbarActionRecord.AddNewPrivateTab.action) } @Test - fun `WHEN navigating back THEN record telemetry based on addressBar or navbar source`() { - buildStore.dispatch(NavigateBackClicked(Source.AddressBar)) - assertTelemetryRecorded(Source.AddressBar, item = ToolbarActionRecord.NavigateBackClicked.action) + fun `WHEN navigating back THEN record telemetry based on browser start, end or navbar source`() { + buildStore.dispatch(NavigateBackClicked(Source.AddressBar.BrowserStart)) + assertTelemetryRecorded(Source.AddressBar.BrowserStart, item = ToolbarActionRecord.NavigateBackClicked.action) + + buildStore.dispatch(NavigateBackClicked(Source.AddressBar.BrowserEnd)) + assertTelemetryRecorded(Source.AddressBar.BrowserEnd, item = ToolbarActionRecord.NavigateBackClicked.action) buildStore.dispatch(NavigateBackClicked(Source.NavigationBar)) assertTelemetryRecorded(Source.NavigationBar, item = ToolbarActionRecord.NavigateBackClicked.action) } @Test - fun `WHEN navigating back is long clicked THEN record telemetry based on addressBar or navbar source`() { - buildStore.dispatch(NavigateBackLongClicked(Source.AddressBar)) - assertTelemetryRecorded(Source.AddressBar, item = ToolbarActionRecord.NavigateBackLongClicked.action) + fun `WHEN navigating back is long clicked THEN record telemetry based on browser start, end or navbar source`() { + buildStore.dispatch(NavigateBackLongClicked(Source.AddressBar.BrowserStart)) + assertTelemetryRecorded(Source.AddressBar.BrowserStart, item = ToolbarActionRecord.NavigateBackLongClicked.action) + + buildStore.dispatch(NavigateBackLongClicked(Source.AddressBar.BrowserEnd)) + assertTelemetryRecorded(Source.AddressBar.BrowserEnd, item = ToolbarActionRecord.NavigateBackLongClicked.action) buildStore.dispatch(NavigateBackLongClicked(Source.NavigationBar)) assertTelemetryRecorded(Source.NavigationBar, item = ToolbarActionRecord.NavigateBackLongClicked.action) } @Test - fun `WHEN navigating forward THEN record addressBar telemetry`() { + fun `WHEN navigating forward THEN record browser start telemetry`() { buildStore.dispatch(NavigateForwardClicked) - assertTelemetryRecorded(Source.AddressBar, item = ToolbarActionRecord.NavigateForwardClicked.action) + assertTelemetryRecorded(Source.AddressBar.BrowserStart, item = ToolbarActionRecord.NavigateForwardClicked.action) } @Test - fun `WHEN navigating forward is long clicked THEN record addressBar telemetry`() { + fun `WHEN navigating forward is long clicked THEN record browser start telemetry`() { buildStore.dispatch(NavigateForwardLongClicked) - assertTelemetryRecorded(Source.AddressBar, item = ToolbarActionRecord.NavigateForwardLongClicked.action) + assertTelemetryRecorded(Source.AddressBar.BrowserStart, item = ToolbarActionRecord.NavigateForwardLongClicked.action) } @Test - fun `WHEN refreshing the page THEN record addressBar telemetry`() { + fun `WHEN refreshing the page THEN record browser start telemetry`() { buildStore.dispatch(RefreshClicked(bypassCache = false)) - assertTelemetryRecorded(Source.AddressBar, item = ToolbarActionRecord.RefreshClicked.action) + assertTelemetryRecorded(Source.AddressBar.BrowserStart, item = ToolbarActionRecord.RefreshClicked.action) } @Test - fun `WHEN refreshing the page is stopped THEN record addressBar telemetry`() { + fun `WHEN refreshing the page is stopped THEN record browser start telemetry`() { buildStore.dispatch(StopRefreshClicked) - assertTelemetryRecorded(Source.AddressBar, item = ToolbarActionRecord.StopRefreshClicked.action) + assertTelemetryRecorded(Source.AddressBar.BrowserStart, item = ToolbarActionRecord.StopRefreshClicked.action) } @Test - fun `WHEN adding a bookmark THEN record telemetry based on addressBar or navbar source`() { - buildStore.dispatch(AddBookmarkClicked(Source.AddressBar)) - assertTelemetryRecorded(Source.AddressBar, item = ToolbarActionRecord.AddBookmarkClicked.action) + fun `WHEN adding a bookmark THEN record telemetry based on browser end or navbar source`() { + buildStore.dispatch(AddBookmarkClicked(Source.AddressBar.BrowserEnd)) + assertTelemetryRecorded(Source.AddressBar.BrowserEnd, item = ToolbarActionRecord.AddBookmarkClicked.action) buildStore.dispatch(AddBookmarkClicked(Source.NavigationBar)) assertTelemetryRecorded(Source.NavigationBar, item = ToolbarActionRecord.AddBookmarkClicked.action) } @Test - fun `WHEN navigating to edit a bookmark THEN record telemetry based on addressBar or navbar source`() { - buildStore.dispatch(EditBookmarkClicked(Source.AddressBar)) - assertTelemetryRecorded(Source.AddressBar, item = ToolbarActionRecord.EditBookmarkClicked.action) + fun `WHEN navigating to edit a bookmark THEN record telemetry based on browser end or navbar source`() { + buildStore.dispatch(EditBookmarkClicked(Source.AddressBar.BrowserEnd)) + assertTelemetryRecorded(Source.AddressBar.BrowserEnd, item = ToolbarActionRecord.EditBookmarkClicked.action) buildStore.dispatch(EditBookmarkClicked(Source.NavigationBar)) assertTelemetryRecorded(Source.NavigationBar, item = ToolbarActionRecord.EditBookmarkClicked.action) } @Test - fun `WHEN sharing a page THEN record telemetry based on addressBar or navbar source`() { - buildStore.dispatch(ShareClicked(Source.AddressBar)) - assertTelemetryRecorded(Source.AddressBar, item = ToolbarActionRecord.ShareClicked.action) + fun `WHEN sharing a page THEN record telemetry based on page end, browser end or navbar source`() { + buildStore.dispatch(ShareClicked(Source.AddressBar.PageEnd)) + assertTelemetryRecorded(Source.AddressBar.PageEnd, item = ToolbarActionRecord.ShareClicked.action) + + buildStore.dispatch(ShareClicked(Source.AddressBar.BrowserEnd)) + assertTelemetryRecorded(Source.AddressBar.BrowserEnd, item = ToolbarActionRecord.ShareClicked.action) buildStore.dispatch(ShareClicked(Source.NavigationBar)) assertTelemetryRecorded(Source.NavigationBar, item = ToolbarActionRecord.ShareClicked.action) } @Test - fun `WHEN site info is clicked THEN record addressBar telemetry`() { + fun `WHEN site info is clicked THEN record page start telemetry`() { buildStore.dispatch(SiteInfoClicked) - assertTelemetryRecorded(Source.AddressBar, item = ToolbarActionRecord.SiteInfoClicked.action) + assertTelemetryRecorded(Source.AddressBar.PageStart, item = ToolbarActionRecord.SiteInfoClicked.action) } private fun assertTelemetryRecorded( @@ -166,7 +175,10 @@ class BrowserToolbarTelemetryMiddlewareTest { assertNotNull(Toolbar.buttonTapped.testGetValue()) val snapshot = Toolbar.buttonTapped.testGetValue()!! val last = snapshot.last() - val expectedSource = if (source == Source.AddressBar) SOURCE_ADDRESS_BAR else SOURCE_NAVIGATION_BAR + val expectedSource = when (source) { + is Source.AddressBar, Source.Unknown -> SOURCE_ADDRESS_BAR + Source.NavigationBar -> SOURCE_NAVIGATION_BAR + } assertEquals(item, last.extra?.getValue("item")) assertEquals(expectedSource, last.extra?.getValue("source")) } diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/toolbar/BrowserToolbarMiddlewareTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/toolbar/BrowserToolbarMiddlewareTest.kt @@ -670,7 +670,7 @@ class BrowserToolbarMiddlewareTest { action.contentDescription, ) assertFalse(action.showPrivacyMask) - assertEquals(TabCounterClicked(Source.AddressBar), action.onClick) + assertEquals(TabCounterClicked(Source.Unknown), action.onClick) assertNotNull(action.onLongClick) } @@ -685,7 +685,7 @@ class BrowserToolbarMiddlewareTest { assertEquals(iconsR.drawable.mozac_ic_ellipsis_vertical_24, action.drawableResId) assertEquals(R.string.content_description_menu, action.contentDescription) assertEquals(ActionButton.State.DEFAULT, action.state) - assertEquals(MenuClicked(source = Source.AddressBar), action.onClick) + assertEquals(MenuClicked(source = Source.Unknown), action.onClick) assertNull(action.onLongClick) } @@ -919,7 +919,7 @@ class BrowserToolbarMiddlewareTest { private fun expectedToolbarButton( tabCount: Int = 0, isPrivate: Boolean = false, - source: Source = Source.AddressBar, + source: Source = Source.AddressBar.BrowserEnd, ) = TabCounterAction( count = tabCount, contentDescription = if (isPrivate) { @@ -960,7 +960,7 @@ class BrowserToolbarMiddlewareTest { private fun expectedMenuButton( highlighted: Boolean = false, - source: Source = Source.AddressBar, + source: Source = Source.AddressBar.BrowserEnd, ) = ActionButtonRes( drawableResId = iconsR.drawable.mozac_ic_ellipsis_vertical_24, contentDescription = R.string.content_description_menu, @@ -982,7 +982,7 @@ class BrowserToolbarMiddlewareTest { onClick = FakeClicked, ) - private fun expectedNewTabButton(source: Source = Source.AddressBar) = ActionButtonRes( + private fun expectedNewTabButton(source: Source = Source.AddressBar.BrowserEnd) = ActionButtonRes( drawableResId = iconsR.drawable.mozac_ic_plus_24, contentDescription = R.string.home_screen_shortcut_open_new_tab_2, onClick = AddNewTab(source), diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/toolbar/BrowserToolbarTelemetryMiddlewareTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/toolbar/BrowserToolbarTelemetryMiddlewareTest.kt @@ -30,45 +30,45 @@ class BrowserToolbarTelemetryMiddlewareTest { val gleanRule = FenixGleanTestRule(testContext) @Test - fun `WHEN menu button is clicked THEN record telemetry based on addressBar or navbar source`() { - buildStore.dispatch(MenuClicked(Source.AddressBar)) - assertTelemetryRecorded(Source.AddressBar, item = ToolbarActionRecord.MenuClicked.action) + fun `WHEN menu button is clicked THEN record telemetry based on browser end or navbar source`() { + buildStore.dispatch(MenuClicked(Source.AddressBar.BrowserEnd)) + assertTelemetryRecorded(Source.AddressBar.BrowserEnd, item = ToolbarActionRecord.MenuClicked.action) buildStore.dispatch(MenuClicked(Source.NavigationBar)) assertTelemetryRecorded(Source.NavigationBar, item = ToolbarActionRecord.MenuClicked.action) } @Test - fun `WHEN tab counter is clicked THEN record telemetry based on addressBar or navbar source`() { - buildStore.dispatch(TabCounterClicked(Source.AddressBar)) - assertTelemetryRecorded(Source.AddressBar, item = ToolbarActionRecord.TabCounterClicked.action) + fun `WHEN tab counter is clicked THEN record telemetry based on browser end or navbar source`() { + buildStore.dispatch(TabCounterClicked(Source.AddressBar.BrowserEnd)) + assertTelemetryRecorded(Source.AddressBar.BrowserEnd, item = ToolbarActionRecord.TabCounterClicked.action) buildStore.dispatch(TabCounterClicked(Source.NavigationBar)) assertTelemetryRecorded(Source.NavigationBar, item = ToolbarActionRecord.TabCounterClicked.action) } @Test - fun `WHEN tab counter is long clicked THEN record telemetry based on addressBar or navbar source`() { - buildStore.dispatch(TabCounterLongClicked(Source.AddressBar)) - assertTelemetryRecorded(Source.AddressBar, item = ToolbarActionRecord.TabCounterLongClicked.action) + fun `WHEN tab counter is long clicked THEN record telemetry based on browser end or navbar source`() { + buildStore.dispatch(TabCounterLongClicked(Source.AddressBar.BrowserEnd)) + assertTelemetryRecorded(Source.AddressBar.BrowserEnd, item = ToolbarActionRecord.TabCounterLongClicked.action) buildStore.dispatch(TabCounterLongClicked(Source.NavigationBar)) assertTelemetryRecorded(Source.NavigationBar, item = ToolbarActionRecord.TabCounterLongClicked.action) } @Test - fun `WHEN adding a new tab THEN record telemetry based on addressBar or navbar source`() { - buildStore.dispatch(AddNewTab(Source.AddressBar)) - assertTelemetryRecorded(Source.AddressBar, item = ToolbarActionRecord.AddNewTab.action) + fun `WHEN adding a new tab THEN record telemetry based on browser end or navbar source`() { + buildStore.dispatch(AddNewTab(Source.AddressBar.BrowserEnd)) + assertTelemetryRecorded(Source.AddressBar.BrowserEnd, item = ToolbarActionRecord.AddNewTab.action) buildStore.dispatch(AddNewTab(Source.NavigationBar)) assertTelemetryRecorded(Source.NavigationBar, item = ToolbarActionRecord.AddNewTab.action) } @Test - fun `WHEN adding a new private tab THEN record telemetry based on addressBar or navbar source`() { - buildStore.dispatch(AddNewPrivateTab(Source.AddressBar)) - assertTelemetryRecorded(Source.AddressBar, item = ToolbarActionRecord.AddNewPrivateTab.action) + fun `WHEN adding a new private tab THEN record telemetry based on browser end or navbar source`() { + buildStore.dispatch(AddNewPrivateTab(Source.AddressBar.BrowserEnd)) + assertTelemetryRecorded(Source.AddressBar.BrowserEnd, item = ToolbarActionRecord.AddNewPrivateTab.action) buildStore.dispatch(AddNewPrivateTab(Source.NavigationBar)) assertTelemetryRecorded(Source.NavigationBar, item = ToolbarActionRecord.AddNewPrivateTab.action) @@ -82,7 +82,7 @@ class BrowserToolbarTelemetryMiddlewareTest { assertNotNull(values) val last = values!!.last() val expectedSource = when (source) { - Source.AddressBar -> SOURCE_ADDRESS_BAR + is Source.AddressBar, Source.Unknown -> SOURCE_ADDRESS_BAR Source.NavigationBar -> SOURCE_NAVIGATION_BAR } assertEquals(item, last.extra?.get("item"))