tor-browser

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

commit d9f4fd8a093465ee2a854e3332d3368329ff0343
parent 8b5cc877329dc07df7e752d6a78d74dc02961a12
Author: Andrey Zinovyev <azinovyev@mozilla.com>
Date:   Wed, 19 Nov 2025 17:54:07 +0000

Bug 1997999 - Fix passing private property to FenixBrowserUseCases r=android-reviewers,android-addons-reviewers,pollymce,willdurand

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

Diffstat:
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt | 2--
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/addons/Extensions.kt | 2--
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragmentTest.kt | 91+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
3 files changed, 73 insertions(+), 22 deletions(-)

diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt @@ -203,11 +203,9 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management) private fun openAMO() { findNavController().openToBrowser() - val isPrivate = requireComponents.appStore.state.mode.isPrivate requireComponents.useCases.fenixBrowserUseCases.loadUrlOrSearch( searchTermOrURL = AMO_HOMEPAGE_FOR_ANDROID, newTab = true, - private = isPrivate, ) } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/addons/Extensions.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/addons/Extensions.kt @@ -42,11 +42,9 @@ internal fun View.openLearnMoreLink( ) { val url = resolveLearnMoreUrl(link, addon) ?: return findNavController().openToBrowser() - val isPrivate = context.components.appStore.state.mode.isPrivate context.components.useCases.fenixBrowserUseCases.loadUrlOrSearch( searchTermOrURL = url, newTab = true, - private = isPrivate, ) } diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragmentTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragmentTest.kt @@ -20,9 +20,13 @@ import io.mockk.slot import io.mockk.spyk import io.mockk.verify import kotlinx.coroutines.Dispatchers +import mozilla.components.concept.base.profiler.Profiler +import mozilla.components.concept.engine.EngineSession import mozilla.components.concept.engine.webextension.EnableSource import mozilla.components.feature.addons.Addon import mozilla.components.feature.addons.AddonManager +import mozilla.components.feature.search.SearchUseCases +import mozilla.components.feature.session.SessionUseCases import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.rule.MainCoroutineRule @@ -36,6 +40,7 @@ import org.junit.runner.RunWith import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R +import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.components.appstate.AppState import org.mozilla.fenix.components.usecases.FenixBrowserUseCases @@ -50,11 +55,24 @@ class InstalledAddonDetailsFragmentTest { @get:Rule val coroutineRule = MainCoroutineRule() private lateinit var fragment: InstalledAddonDetailsFragment + private lateinit var addNewTabUseCase: TabsUseCases.AddNewTabUseCase + private lateinit var loadUrlUseCase: SessionUseCases.DefaultLoadUrlUseCase + private lateinit var searchUseCases: SearchUseCases + private lateinit var homepageTitle: String + private lateinit var profiler: Profiler private val addonManager = mockk<AddonManager>() @Before fun setup() { fragment = spyk(InstalledAddonDetailsFragment()) + addNewTabUseCase = mockk(relaxed = true) + loadUrlUseCase = mockk(relaxed = true) + searchUseCases = mockk(relaxed = true) + homepageTitle = testContext.getString(R.string.tab_tray_homepage_tab) + profiler = mockk(relaxed = true) { + every { getProfilerTime() } returns PROFILER_START_TIME + every { isProfilerActive() } returns true + } } @Test @@ -340,9 +358,16 @@ class InstalledAddonDetailsFragmentTest { val navController = mockk<NavController>(relaxed = true) Navigation.setViewNavController(binding.root, navController) - val fenix = mockk<FenixBrowserUseCases>(relaxed = true) - every { testContext.components.useCases.fenixBrowserUseCases } returns fenix - every { testContext.components.appStore.state.mode.isPrivate } returns false + val appStore = AppStore(initialState = AppState(mode = BrowsingMode.Normal)) + val useCases = FenixBrowserUseCases( + appStore = appStore, + addNewTabUseCase = addNewTabUseCase, + loadUrlUseCase = loadUrlUseCase, + searchUseCases = searchUseCases, + homepageTitle = homepageTitle, + profiler = profiler, + ) + every { testContext.components.useCases.fenixBrowserUseCases } returns useCases val warningView = binding.root.findViewById<View>(addonsR.id.add_on_messagebar_warning) @@ -354,11 +379,15 @@ class InstalledAddonDetailsFragmentTest { .performClick() verify { navController.navigate(R.id.browserFragment) } + val url = "${BuildConfig.AMO_BASE_URL}/android/blocked-addon/some-addon-id/1.2.3/" + verify { - fenix.loadUrlOrSearch( - searchTermOrURL = "${BuildConfig.AMO_BASE_URL}/android/blocked-addon/some-addon-id/1.2.3/", - newTab = true, + addNewTabUseCase.invoke( + url = url, + flags = EngineSession.LoadUrlFlags.none(), private = false, + historyMetadata = null, + originalInput = url, ) } } @@ -381,9 +410,16 @@ class InstalledAddonDetailsFragmentTest { val navController = mockk<NavController>(relaxed = true) Navigation.setViewNavController(binding.root, navController) - val fenix = mockk<FenixBrowserUseCases>(relaxed = true) - every { testContext.components.useCases.fenixBrowserUseCases } returns fenix - every { testContext.components.appStore.state.mode.isPrivate } returns false + val appStore = AppStore(initialState = AppState(mode = BrowsingMode.Normal)) + val useCases = FenixBrowserUseCases( + appStore = appStore, + addNewTabUseCase = addNewTabUseCase, + loadUrlUseCase = loadUrlUseCase, + searchUseCases = searchUseCases, + homepageTitle = homepageTitle, + profiler = profiler, + ) + every { testContext.components.useCases.fenixBrowserUseCases } returns useCases val warningView = binding.root.findViewById<View>(addonsR.id.add_on_messagebar_warning) @@ -395,11 +431,16 @@ class InstalledAddonDetailsFragmentTest { .performClick() verify { navController.navigate(R.id.browserFragment) } + + val url = SupportUtils.getGenericSumoURLForTopic(SupportUtils.SumoTopic.UNSIGNED_ADDONS) + verify { - fenix.loadUrlOrSearch( - searchTermOrURL = SupportUtils.getGenericSumoURLForTopic(SupportUtils.SumoTopic.UNSIGNED_ADDONS), - newTab = true, + addNewTabUseCase.invoke( + url = url, + flags = EngineSession.LoadUrlFlags.none(), private = false, + historyMetadata = null, + originalInput = url, ) } } @@ -422,9 +463,16 @@ class InstalledAddonDetailsFragmentTest { val navController = mockk<NavController>(relaxed = true) Navigation.setViewNavController(binding.root, navController) - val fenix = mockk<FenixBrowserUseCases>(relaxed = true) - every { testContext.components.useCases.fenixBrowserUseCases } returns fenix - every { testContext.components.appStore.state.mode.isPrivate } returns false + val appStore = AppStore(initialState = AppState(mode = BrowsingMode.Normal)) + val useCases = FenixBrowserUseCases( + appStore = appStore, + addNewTabUseCase = addNewTabUseCase, + loadUrlUseCase = loadUrlUseCase, + searchUseCases = searchUseCases, + homepageTitle = homepageTitle, + profiler = profiler, + ) + every { testContext.components.useCases.fenixBrowserUseCases } returns useCases val warningView = binding.root.findViewById<View>(addonsR.id.add_on_messagebar_warning) assertTrue(warningView.isVisible) @@ -435,11 +483,15 @@ class InstalledAddonDetailsFragmentTest { .performClick() verify { navController.navigate(R.id.browserFragment) } + val url = "${BuildConfig.AMO_BASE_URL}/android/blocked-addon/some-addon-id/1.2.3/" + verify { - fenix.loadUrlOrSearch( - searchTermOrURL = "${BuildConfig.AMO_BASE_URL}/android/blocked-addon/some-addon-id/1.2.3/", - newTab = true, + addNewTabUseCase.invoke( + url = url, + flags = EngineSession.LoadUrlFlags.none(), private = false, + historyMetadata = null, + originalInput = url, ) } } @@ -459,4 +511,7 @@ class InstalledAddonDetailsFragmentTest { every { addon.defaultLocale } returns "en-US" return addon } + companion object { + private const val PROFILER_START_TIME = Double.MAX_VALUE + } }