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:
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
+ }
}