2
0
mirror of https://github.com/fork-maintainers/iceraven-browser synced 2024-11-19 09:25:34 +00:00

[fenix] Complete browser-state migration and remove browser-session dependency.

Co-authored-by: Christian Sadilek <christian.sadilek@gmail.com>
This commit is contained in:
Sebastian Kaspari 2021-05-06 13:47:46 +02:00
parent 4e7c93e6f6
commit e25cfcdc48
29 changed files with 108 additions and 261 deletions

View File

@ -420,7 +420,6 @@ dependencies {
implementation Deps.mozilla_browser_icons implementation Deps.mozilla_browser_icons
implementation Deps.mozilla_browser_menu implementation Deps.mozilla_browser_menu
implementation Deps.mozilla_browser_menu2 implementation Deps.mozilla_browser_menu2
implementation Deps.mozilla_browser_session
implementation Deps.mozilla_browser_session_storage implementation Deps.mozilla_browser_session_storage
implementation Deps.mozilla_browser_state implementation Deps.mozilla_browser_state
implementation Deps.mozilla_browser_storage_sync implementation Deps.mozilla_browser_storage_sync

View File

@ -467,19 +467,12 @@ open class FenixApplication : LocaleAwareApplication(), Provider {
components.core.store.state.selectedTab?.content?.private components.core.store.state.selectedTab?.content?.private
?: components.settings.openLinksInAPrivateTab ?: components.settings.openLinksInAPrivateTab
if (shouldCreatePrivateSession) { components.useCases.tabsUseCases.addTab(
components.useCases.tabsUseCases.addPrivateTab( url = url,
url = url, selectTab = true,
selectTab = true, engineSession = engineSession,
engineSession = engineSession private = shouldCreatePrivateSession
) )
} else {
components.useCases.tabsUseCases.addTab(
url = url,
selectTab = true,
engineSession = engineSession
)
}
}, },
onCloseTabOverride = { onCloseTabOverride = {
_, sessionId -> components.useCases.tabsUseCases.removeTab(sessionId) _, sessionId -> components.useCases.tabsUseCases.removeTab(sessionId)

View File

@ -834,18 +834,27 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
val startTime = components.core.engine.profiler?.getProfilerTime() val startTime = components.core.engine.profiler?.getProfilerTime()
val mode = browsingModeManager.mode val mode = browsingModeManager.mode
val loadUrlUseCase = if (newTab) { val private = when (mode) {
when (mode) { BrowsingMode.Private -> true
BrowsingMode.Private -> components.useCases.tabsUseCases.addPrivateTab BrowsingMode.Normal -> false
BrowsingMode.Normal -> components.useCases.tabsUseCases.addTab }
}
} else components.useCases.sessionUseCases.loadUrl
// In situations where we want to perform a search but have no search engine (e.g. the user // In situations where we want to perform a search but have no search engine (e.g. the user
// has removed all of them, or we couldn't load any) we will pass searchTermOrURL to Gecko // has removed all of them, or we couldn't load any) we will pass searchTermOrURL to Gecko
// and let it try to load whatever was entered. // and let it try to load whatever was entered.
if ((!forceSearch && searchTermOrURL.isUrl()) || engine == null) { if ((!forceSearch && searchTermOrURL.isUrl()) || engine == null) {
loadUrlUseCase.invoke(searchTermOrURL.toNormalizedUrl(), flags) if (newTab) {
components.useCases.tabsUseCases.addTab(
url = searchTermOrURL.toNormalizedUrl(),
flags = flags,
private = private
)
} else {
components.useCases.sessionUseCases.loadUrl(
url = searchTermOrURL.toNormalizedUrl(),
flags = flags
)
}
if (requestDesktopMode) { if (requestDesktopMode) {
handleRequestDesktopMode() handleRequestDesktopMode()

View File

@ -205,11 +205,7 @@ class InstalledAddonDetailsFragment : Fragment() {
val shouldCreatePrivateSession = val shouldCreatePrivateSession =
(activity as HomeActivity).browsingModeManager.mode.isPrivate (activity as HomeActivity).browsingModeManager.mode.isPrivate
if (shouldCreatePrivateSession) { components.useCases.tabsUseCases.addTab(settingUrl, private = shouldCreatePrivateSession)
components.useCases.tabsUseCases.addPrivateTab(settingUrl)
} else {
components.useCases.tabsUseCases.addTab(settingUrl)
}
InstalledAddonDetailsFragmentDirections.actionGlobalBrowser(null) InstalledAddonDetailsFragmentDirections.actionGlobalBrowser(null)
} else { } else {

View File

@ -70,7 +70,6 @@ class Components(private val context: Context) {
UseCases( UseCases(
context, context,
core.engine, core.engine,
core.sessionManager,
core.store, core.store,
core.webAppShortcutManager, core.webAppShortcutManager,
core.topSitesStorage, core.topSitesStorage,

View File

@ -14,9 +14,7 @@ import io.sentry.Sentry
import mozilla.components.browser.engine.gecko.GeckoEngine import mozilla.components.browser.engine.gecko.GeckoEngine
import mozilla.components.browser.engine.gecko.fetch.GeckoViewFetchClient import mozilla.components.browser.engine.gecko.fetch.GeckoViewFetchClient
import mozilla.components.browser.icons.BrowserIcons import mozilla.components.browser.icons.BrowserIcons
import mozilla.components.browser.session.Session import mozilla.components.browser.state.engine.EngineMiddleware
import mozilla.components.browser.session.SessionManager
import mozilla.components.browser.session.engine.EngineMiddleware
import mozilla.components.browser.session.storage.SessionStorage import mozilla.components.browser.session.storage.SessionStorage
import mozilla.components.browser.state.state.BrowserState import mozilla.components.browser.state.state.BrowserState
import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.state.store.BrowserStore
@ -191,7 +189,7 @@ class Core(
metrics metrics
), ),
ThumbnailsMiddleware(thumbnailStorage), ThumbnailsMiddleware(thumbnailStorage),
UndoMiddleware(::lookupSessionManager, context.getUndoDelay()), UndoMiddleware(context.getUndoDelay()),
RegionMiddleware(context, locationService), RegionMiddleware(context, locationService),
SearchMiddleware( SearchMiddleware(
context, context,
@ -203,18 +201,24 @@ class Core(
) )
BrowserStore( BrowserStore(
middleware = middlewareList + EngineMiddleware.create(engine, ::findSessionById) middleware = middlewareList + EngineMiddleware.create(engine)
) ).apply {
} // Install the "icons" WebExtension to automatically load icons for every visited website.
icons.install(engine, this)
@Suppress("Deprecation") // Install the "ads" WebExtension to get the links in an partner page.
private fun lookupSessionManager(): SessionManager { adsTelemetry.install(engine, this)
return sessionManager
}
@Suppress("Deprecation") // Install the "cookies" WebExtension and tracks user interaction with SERPs.
private fun findSessionById(tabId: String): Session? { searchTelemetry.install(engine, this)
return sessionManager.findSessionById(tabId)
WebNotificationFeature(
context, engine, icons, R.drawable.ic_status_logo,
permissionStorage.permissionsStorage, HomeActivity::class.java
)
MediaSessionFeature(context, MediaSessionService::class.java, this).start()
}
} }
/** /**
@ -229,33 +233,6 @@ class Core(
StatementRelationChecker(StatementApi(client)) StatementRelationChecker(StatementApi(client))
} }
/**
* The session manager component provides access to a centralized registry of
* all browser sessions (i.e. tabs). It is initialized here to persist and restore
* sessions from the [SessionStorage], and with a default session (about:blank) in
* case all sessions/tabs are closed.
*/
@Deprecated("Use browser store (for reading) and use cases (for writing) instead")
val sessionManager by lazyMonitored {
SessionManager(engine, store).also {
// Install the "icons" WebExtension to automatically load icons for every visited website.
icons.install(engine, store)
// Install the "ads" WebExtension to get the links in an partner page.
adsTelemetry.install(engine, store)
// Install the "cookies" WebExtension and tracks user interaction with SERPs.
searchTelemetry.install(engine, store)
WebNotificationFeature(
context, engine, icons, R.drawable.ic_status_logo,
permissionStorage.permissionsStorage, HomeActivity::class.java
)
MediaSessionFeature(context, MediaSessionService::class.java, store).start()
}
}
/** /**
* Icons component for loading, caching and processing website icons. * Icons component for loading, caching and processing website icons.
*/ */

View File

@ -66,13 +66,13 @@ class IntentProcessors(
val externalAppIntentProcessors by lazyMonitored { val externalAppIntentProcessors by lazyMonitored {
listOf( listOf(
TrustedWebActivityIntentProcessor( TrustedWebActivityIntentProcessor(
addNewTabUseCase = tabsUseCases.addTab, addNewTabUseCase = customTabsUseCases.add,
packageManager = context.packageManager, packageManager = context.packageManager,
relationChecker = relationChecker, relationChecker = relationChecker,
store = customTabsStore store = customTabsStore
), ),
WebAppIntentProcessor(store, tabsUseCases.addTab, sessionUseCases.loadUrl, manifestStorage), WebAppIntentProcessor(store, customTabsUseCases.addWebApp, sessionUseCases.loadUrl, manifestStorage),
FennecWebAppIntentProcessor(context, tabsUseCases.addTab, manifestStorage) FennecWebAppIntentProcessor(context, customTabsUseCases, manifestStorage)
) )
} }

View File

@ -5,7 +5,6 @@
package org.mozilla.fenix.components package org.mozilla.fenix.components
import android.content.Context import android.content.Context
import mozilla.components.browser.session.SessionManager
import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.concept.engine.Engine import mozilla.components.concept.engine.Engine
import mozilla.components.concept.storage.BookmarksStorage import mozilla.components.concept.storage.BookmarksStorage
@ -36,7 +35,6 @@ import org.mozilla.fenix.utils.Mockable
class UseCases( class UseCases(
private val context: Context, private val context: Context,
private val engine: Engine, private val engine: Engine,
private val sessionManager: SessionManager,
private val store: BrowserStore, private val store: BrowserStore,
private val shortcutManager: WebAppShortcutManager, private val shortcutManager: WebAppShortcutManager,
private val topSitesStorage: TopSitesStorage, private val topSitesStorage: TopSitesStorage,
@ -45,18 +43,18 @@ class UseCases(
/** /**
* Use cases that provide engine interactions for a given browser session. * Use cases that provide engine interactions for a given browser session.
*/ */
val sessionUseCases by lazyMonitored { SessionUseCases(store, sessionManager) } val sessionUseCases by lazyMonitored { SessionUseCases(store) }
/** /**
* Use cases that provide tab management. * Use cases that provide tab management.
*/ */
val tabsUseCases: TabsUseCases by lazyMonitored { TabsUseCases(store, sessionManager) } val tabsUseCases: TabsUseCases by lazyMonitored { TabsUseCases(store) }
/** /**
* Use cases for managing custom tabs. * Use cases for managing custom tabs.
*/ */
val customTabsUseCases: CustomTabsUseCases by lazyMonitored { val customTabsUseCases: CustomTabsUseCases by lazyMonitored {
CustomTabsUseCases(sessionManager, sessionUseCases.loadUrl) CustomTabsUseCases(store, sessionUseCases.loadUrl)
} }
/** /**

View File

@ -11,7 +11,6 @@ import androidx.annotation.VisibleForTesting
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import mozilla.components.browser.state.state.CustomTabConfig import mozilla.components.browser.state.state.CustomTabConfig
import mozilla.components.browser.state.state.SessionState import mozilla.components.browser.state.state.SessionState
import mozilla.components.concept.engine.EngineSession
import mozilla.components.concept.engine.manifest.WebAppManifest import mozilla.components.concept.engine.manifest.WebAppManifest
import mozilla.components.concept.engine.manifest.WebAppManifestParser import mozilla.components.concept.engine.manifest.WebAppManifestParser
import mozilla.components.concept.engine.manifest.getOrNull import mozilla.components.concept.engine.manifest.getOrNull
@ -20,7 +19,7 @@ import mozilla.components.feature.intent.processing.IntentProcessor
import mozilla.components.feature.pwa.ManifestStorage import mozilla.components.feature.pwa.ManifestStorage
import mozilla.components.feature.pwa.ext.putWebAppManifest import mozilla.components.feature.pwa.ext.putWebAppManifest
import mozilla.components.feature.pwa.ext.toCustomTabConfig import mozilla.components.feature.pwa.ext.toCustomTabConfig
import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.feature.tabs.CustomTabsUseCases
import mozilla.components.support.base.log.logger.Logger import mozilla.components.support.base.log.logger.Logger
import mozilla.components.support.utils.SafeIntent import mozilla.components.support.utils.SafeIntent
import mozilla.components.support.utils.toSafeIntent import mozilla.components.support.utils.toSafeIntent
@ -36,7 +35,7 @@ import java.io.IOException
*/ */
class FennecWebAppIntentProcessor( class FennecWebAppIntentProcessor(
private val context: Context, private val context: Context,
private val addNewTabUseCase: TabsUseCases.AddNewTabUseCase, private val useCases: CustomTabsUseCases,
private val storage: ManifestStorage private val storage: ManifestStorage
) : IntentProcessor { ) : IntentProcessor {
val logger = Logger("FennecWebAppIntentProcessor") val logger = Logger("FennecWebAppIntentProcessor")
@ -59,13 +58,20 @@ class FennecWebAppIntentProcessor(
return if (!url.isNullOrEmpty() && matches(intent)) { return if (!url.isNullOrEmpty() && matches(intent)) {
val webAppManifest = runBlockingIncrement { loadManifest(safeIntent, url) } val webAppManifest = runBlockingIncrement { loadManifest(safeIntent, url) }
val sessionId = addNewTabUseCase( val sessionId = if (webAppManifest != null) {
url = url, useCases.addWebApp(
source = SessionState.Source.HOME_SCREEN, url = url,
flags = EngineSession.LoadUrlFlags.external(), source = SessionState.Source.HOME_SCREEN,
webAppManifest = webAppManifest, webAppManifest = webAppManifest,
customTabConfig = webAppManifest?.toCustomTabConfig() ?: createFallbackCustomTabConfig() customTabConfig = webAppManifest.toCustomTabConfig()
) )
} else {
useCases.add(
url = url,
source = SessionState.Source.HOME_SCREEN,
customTabConfig = createFallbackCustomTabConfig()
)
}
intent.putSessionId(sessionId) intent.putSessionId(sessionId)
if (webAppManifest != null) { if (webAppManifest != null) {

View File

@ -1,22 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.ext
import mozilla.components.browser.session.SessionManager
/**
* Returns only normal or only private sessions.
*/
fun SessionManager.sessionsOfType(private: Boolean) =
sessions.asSequence().filter { it.private == private }
/**
* @return the number of currently active sessions that are neither custom nor private
*/
fun SessionManager.normalSessionSize(): Int {
return this.sessions.filter { session ->
(!session.isCustomTabSession() && !session.private)
}.size
}

View File

@ -26,11 +26,10 @@ abstract class LibraryPageFragment<T> : Fragment() {
protected fun openItemsInNewTab(private: Boolean = false, toUrl: (T) -> String?) { protected fun openItemsInNewTab(private: Boolean = false, toUrl: (T) -> String?) {
context?.components?.useCases?.tabsUseCases?.let { tabsUseCases -> context?.components?.useCases?.tabsUseCases?.let { tabsUseCases ->
val addTab = if (private) tabsUseCases.addPrivateTab else tabsUseCases.addTab
selectedItems.asSequence() selectedItems.asSequence()
.mapNotNull(toUrl) .mapNotNull(toUrl)
.forEach { url -> .forEach { url ->
addTab.invoke(url) tabsUseCases.addTab.invoke(url, private = private)
} }
} }

View File

@ -192,10 +192,7 @@ class DefaultBookmarkController(
) { ) {
invokePendingDeletion.invoke() invokePendingDeletion.invoke()
activity.browsingModeManager.mode = BrowsingMode.fromBoolean(mode == BrowsingMode.Private) activity.browsingModeManager.mode = BrowsingMode.fromBoolean(mode == BrowsingMode.Private)
tabsUseCases?.let { tabsUseCases -> tabsUseCases?.addTab?.invoke(url, private = (mode == BrowsingMode.Private))
val addTab = if (mode == BrowsingMode.Private) tabsUseCases.addPrivateTab else tabsUseCases.addTab
addTab.invoke(url)
}
} }
private fun navigateToGivenDirection(directions: NavDirections) { private fun navigateToGivenDirection(directions: NavDirections) {

View File

@ -266,10 +266,9 @@ class HistoryFragment : LibraryPageFragment<HistoryItem>(), UserInteractionHandl
val homeActivity = activity as HomeActivity val homeActivity = activity as HomeActivity
homeActivity.browsingModeManager.mode = mode homeActivity.browsingModeManager.mode = mode
homeActivity.components.useCases.tabsUseCases.let { tabsUseCases -> homeActivity.components.useCases.tabsUseCases.addTab.invoke(
val addTab = if (mode == BrowsingMode.Private) tabsUseCases.addPrivateTab else tabsUseCases.addTab item.url, private = (mode == BrowsingMode.Private)
addTab.invoke(item.url) )
}
showTabTray() showTabTray()
} }

View File

@ -10,7 +10,6 @@ import androidx.core.net.toUri
import androidx.navigation.NavController import androidx.navigation.NavController
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import mozilla.components.browser.session.Session
import mozilla.components.browser.state.selector.findTabOrCustomTab import mozilla.components.browser.state.selector.findTabOrCustomTab
import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.feature.session.SessionUseCases.ReloadUrlUseCase import mozilla.components.feature.session.SessionUseCases.ReloadUrlUseCase
@ -66,7 +65,6 @@ interface QuickSettingsController {
* in this Controller's Fragment. * in this Controller's Fragment.
* @param ioScope [CoroutineScope] with an IO dispatcher used for structured concurrency. * @param ioScope [CoroutineScope] with an IO dispatcher used for structured concurrency.
* @param navController NavController] used for navigation. * @param navController NavController] used for navigation.
* @param session [Session]? current browser state.
* @param sitePermissions [SitePermissions]? list of website permissions and their status. * @param sitePermissions [SitePermissions]? list of website permissions and their status.
* @param settings [Settings] application settings. * @param settings [Settings] application settings.
* @param permissionStorage [PermissionStorage] app state for website permissions exception. * @param permissionStorage [PermissionStorage] app state for website permissions exception.

View File

@ -24,8 +24,8 @@ class RemoveTabUseCaseWrapper(
private val metrics: MetricController, private val metrics: MetricController,
private val onRemove: (String) -> Unit private val onRemove: (String) -> Unit
) : TabsUseCases.RemoveTabUseCase { ) : TabsUseCases.RemoveTabUseCase {
override fun invoke(sessionId: String) { override fun invoke(tabId: String) {
metrics.track(Event.ClosedExistingTab) metrics.track(Event.ClosedExistingTab)
onRemove(sessionId) onRemove(tabId)
} }
} }

View File

@ -101,7 +101,7 @@ class TelemetryMiddleware(
metrics.track(Event.DownloadAdded) metrics.track(Event.DownloadAdded)
} }
is EngineAction.KillEngineSessionAction -> { is EngineAction.KillEngineSessionAction -> {
val tab = context.state.findTabOrCustomTab(action.sessionId) val tab = context.state.findTabOrCustomTab(action.tabId)
onEngineSessionKilled(context.state, tab) onEngineSessionKilled(context.state, tab)
} }
} }

View File

@ -21,7 +21,6 @@ class TestComponents(private val context: Context) : Components(context) {
UseCases( UseCases(
context, context,
core.engine, core.engine,
core.sessionManager,
core.store, core.store,
core.webAppShortcutManager, core.webAppShortcutManager,
core.topSitesStorage, core.topSitesStorage,

View File

@ -7,7 +7,6 @@ package org.mozilla.fenix.components
import android.content.Context import android.content.Context
import io.mockk.every import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
import mozilla.components.browser.session.SessionManager
import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.browser.storage.sync.PlacesBookmarksStorage import mozilla.components.browser.storage.sync.PlacesBookmarksStorage
import mozilla.components.browser.thumbnails.storage.ThumbnailStorage import mozilla.components.browser.thumbnails.storage.ThumbnailStorage
@ -27,7 +26,6 @@ class TestCore(context: Context, crashReporter: CrashReporting) : Core(
override val engine = mockk<Engine>(relaxed = true) { override val engine = mockk<Engine>(relaxed = true) {
every { this@mockk getProperty "settings" } returns mockk<Settings>(relaxed = true) every { this@mockk getProperty "settings" } returns mockk<Settings>(relaxed = true)
} }
override val sessionManager = SessionManager(engine)
override val store = mockk<BrowserStore>() override val store = mockk<BrowserStore>()
override val client = mockk<Client>() override val client = mockk<Client>()
override val webAppShortcutManager = mockk<WebAppShortcutManager>() override val webAppShortcutManager = mockk<WebAppShortcutManager>()

View File

@ -6,7 +6,7 @@ package org.mozilla.fenix.customtabs
import io.mockk.mockk import io.mockk.mockk
import mozilla.components.feature.pwa.ManifestStorage import mozilla.components.feature.pwa.ManifestStorage
import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.feature.tabs.CustomTabsUseCases
import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertFalse import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
@ -59,7 +59,7 @@ class FennecWebAppIntentProcessorTest {
} }
private fun createFennecWebAppIntentProcessor(): FennecWebAppIntentProcessor { private fun createFennecWebAppIntentProcessor(): FennecWebAppIntentProcessor {
val useCase: TabsUseCases.AddNewTabUseCase = mockk(relaxed = true) val useCase: CustomTabsUseCases = mockk(relaxed = true)
val storage: ManifestStorage = mockk(relaxed = true) val storage: ManifestStorage = mockk(relaxed = true)
return FennecWebAppIntentProcessor( return FennecWebAppIntentProcessor(

View File

@ -1,86 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.ext
import io.mockk.every
import io.mockk.mockk
import mozilla.components.browser.session.Session
import mozilla.components.browser.session.SessionManager
import org.junit.Assert.assertEquals
import org.junit.Test
class SessionManagerTest {
@Test
fun `returns all normal sessions`() {
val sessions = listOf(
Session("https://example.com", private = false),
Session("https://mozilla.org", private = true),
Session("https://github.com", private = false)
)
val sessionManager = mockSessionManager(sessions)
assertEquals(
listOf(sessions[0], sessions[2]),
sessionManager.sessionsOfType(private = false).toList()
)
}
@Test
fun `returns all private sessions`() {
val sessions = listOf(
Session("https://example.com", private = false),
Session("https://mozilla.org", private = true),
Session("https://github.com", private = false)
)
val sessionManager = mockSessionManager(sessions)
assertEquals(
listOf(sessions[1]),
sessionManager.sessionsOfType(private = true).toList()
)
}
@Test
fun `normalSessionSize only counts non-private non-custom sessions`() {
val normal1 = mockSession()
val normal2 = mockSession()
val normal3 = mockSession()
val private1 = mockSession(isPrivate = true)
val private2 = mockSession(isPrivate = true)
val custom1 = mockSession(isCustom = true)
val custom2 = mockSession(isCustom = true)
val custom3 = mockSession(isCustom = true)
val privateCustom = mockSession(isPrivate = true, isCustom = true)
val sessionManager = mockSessionManager(
listOf(
normal1, private1, private2, custom1,
normal2, normal3, custom2, custom3, privateCustom
)
)
assertEquals(3, sessionManager.normalSessionSize())
}
private fun mockSessionManager(sessions: List<Session>): SessionManager {
val sessionManager: SessionManager = mockk()
every { sessionManager.sessions } returns sessions
return sessionManager
}
private fun mockSession(
sessionId: String? = null,
isPrivate: Boolean = false,
isCustom: Boolean = false
) = mockk<Session> {
sessionId?.let { every { id } returns it }
every { private } returns isPrivate
every { isCustomTabSession() } returns isCustom
}
}

View File

@ -66,7 +66,6 @@ class BookmarkControllerTest {
private val homeActivity: HomeActivity = mockk(relaxed = true) private val homeActivity: HomeActivity = mockk(relaxed = true)
private val services: Services = mockk(relaxed = true) private val services: Services = mockk(relaxed = true)
private val addNewTabUseCase: TabsUseCases.AddNewTabUseCase = mockk(relaxed = true) private val addNewTabUseCase: TabsUseCases.AddNewTabUseCase = mockk(relaxed = true)
private val addNewPrivateTabUseCase: TabsUseCases.AddNewPrivateTabUseCase = mockk(relaxed = true)
private val item = private val item =
BookmarkNode(BookmarkNodeType.ITEM, "456", "123", 0, "Mozilla", "http://mozilla.org", null) BookmarkNode(BookmarkNodeType.ITEM, "456", "123", 0, "Mozilla", "http://mozilla.org", null)
@ -106,7 +105,6 @@ class BookmarkControllerTest {
every { bookmarkStore.dispatch(any()) } returns mockk() every { bookmarkStore.dispatch(any()) } returns mockk()
every { sharedViewModel.selectedFolder = any() } just runs every { sharedViewModel.selectedFolder = any() } just runs
every { tabsUseCases.addTab } returns addNewTabUseCase every { tabsUseCases.addTab } returns addNewTabUseCase
every { tabsUseCases.addPrivateTab } returns addNewPrivateTabUseCase
controller = DefaultBookmarkController( controller = DefaultBookmarkController(
activity = homeActivity, activity = homeActivity,
@ -293,8 +291,7 @@ class BookmarkControllerTest {
verifyOrder { verifyOrder {
invokePendingDeletion.invoke() invokePendingDeletion.invoke()
homeActivity.browsingModeManager.mode = BrowsingMode.Normal homeActivity.browsingModeManager.mode = BrowsingMode.Normal
tabsUseCases.addTab addNewTabUseCase.invoke(item.url!!, private = false)
addNewTabUseCase.invoke(item.url!!)
showTabTray showTabTray
} }
} }
@ -306,8 +303,7 @@ class BookmarkControllerTest {
verifyOrder { verifyOrder {
invokePendingDeletion.invoke() invokePendingDeletion.invoke()
homeActivity.browsingModeManager.mode = BrowsingMode.Private homeActivity.browsingModeManager.mode = BrowsingMode.Private
tabsUseCases.addPrivateTab addNewTabUseCase.invoke(item.url!!, private = true)
addNewPrivateTabUseCase.invoke(item.url!!)
showTabTray showTabTray
} }
} }

View File

@ -83,7 +83,7 @@ private fun newFact(
action: Action, action: Action,
item: String = "itemName" item: String = "itemName"
) = Fact( ) = Fact(
Component.BROWSER_SESSION, Component.BROWSER_STATE,
action, action,
item item
) )

View File

@ -8,10 +8,8 @@ import androidx.appcompat.app.AlertDialog
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.NavDirections import androidx.navigation.NavDirections
import io.mockk.MockKAnnotations import io.mockk.MockKAnnotations
import io.mockk.Runs
import io.mockk.every import io.mockk.every
import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.MockK
import io.mockk.just
import io.mockk.mockk import io.mockk.mockk
import io.mockk.mockkObject import io.mockk.mockkObject
import io.mockk.spyk import io.mockk.spyk
@ -19,12 +17,15 @@ import io.mockk.unmockkObject
import io.mockk.verify import io.mockk.verify
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runBlockingTest import kotlinx.coroutines.test.runBlockingTest
import mozilla.components.browser.session.Session import mozilla.components.browser.state.action.BrowserAction
import mozilla.components.browser.session.SessionManager import mozilla.components.browser.state.action.TabListAction
import mozilla.components.browser.state.search.SearchEngine import mozilla.components.browser.state.search.SearchEngine
import mozilla.components.browser.state.state.BrowserState
import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.feature.tabs.TabsUseCases
import mozilla.components.support.test.middleware.CaptureActionsMiddleware
import org.junit.After import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Before import org.junit.Before
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
@ -50,13 +51,13 @@ class SearchDialogControllerTest {
@MockK private lateinit var searchEngine: SearchEngine @MockK private lateinit var searchEngine: SearchEngine
@MockK(relaxed = true) private lateinit var metrics: MetricController @MockK(relaxed = true) private lateinit var metrics: MetricController
@MockK(relaxed = true) private lateinit var settings: Settings @MockK(relaxed = true) private lateinit var settings: Settings
@MockK private lateinit var sessionManager: SessionManager
@MockK(relaxed = true) private lateinit var clearToolbarFocus: () -> Unit @MockK(relaxed = true) private lateinit var clearToolbarFocus: () -> Unit
@MockK(relaxed = true) private lateinit var focusToolbar: () -> Unit @MockK(relaxed = true) private lateinit var focusToolbar: () -> Unit
@MockK(relaxed = true) private lateinit var clearToolbar: () -> Unit @MockK(relaxed = true) private lateinit var clearToolbar: () -> Unit
@MockK(relaxed = true) private lateinit var dismissDialog: () -> Unit @MockK(relaxed = true) private lateinit var dismissDialog: () -> Unit
private lateinit var controller: SearchDialogController private lateinit var controller: SearchDialogController
private lateinit var middleware: CaptureActionsMiddleware<BrowserState, BrowserAction>
@get:Rule @get:Rule
val disableNavGraphProviderAssertionRule = DisableNavGraphProviderAssertionRule() val disableNavGraphProviderAssertionRule = DisableNavGraphProviderAssertionRule()
@ -65,16 +66,18 @@ class SearchDialogControllerTest {
fun setUp() { fun setUp() {
MockKAnnotations.init(this) MockKAnnotations.init(this)
mockkObject(MetricsUtils) mockkObject(MetricsUtils)
val browserStore = BrowserStore() middleware = CaptureActionsMiddleware()
val browserStore = BrowserStore(
middleware = listOf(middleware)
)
every { store.state.tabId } returns "test-tab-id" every { store.state.tabId } returns "test-tab-id"
every { store.state.searchEngineSource.searchEngine } returns searchEngine every { store.state.searchEngineSource.searchEngine } returns searchEngine
every { sessionManager.select(any()) } just Runs
every { navController.currentDestination } returns mockk { every { navController.currentDestination } returns mockk {
every { id } returns R.id.searchDialogFragment every { id } returns R.id.searchDialogFragment
} }
every { MetricsUtils.createSearchEvent(searchEngine, browserStore, any()) } returns null every { MetricsUtils.createSearchEvent(searchEngine, browserStore, any()) } returns null
val tabsUseCases = TabsUseCases(browserStore, sessionManager) val tabsUseCases = TabsUseCases(browserStore)
controller = SearchDialogController( controller = SearchDialogController(
activity = activity, activity = activity,
@ -331,34 +334,22 @@ class SearchDialogControllerTest {
@Test @Test
fun handleExistingSessionSelected() { fun handleExistingSessionSelected() {
val session = mockk<Session>()
every { sessionManager.findSessionById("selected") } returns session
controller.handleExistingSessionSelected("selected") controller.handleExistingSessionSelected("selected")
verify { sessionManager.select(session) } middleware.assertFirstAction(TabListAction.SelectTabAction::class) { action ->
verify { activity.openToBrowser(from = BrowserDirection.FromSearchDialog) } assertEquals("selected", action.tabId)
} }
@Test
fun handleExistingSessionSelected_tabId_nullSession() {
every { sessionManager.findSessionById("tab-id") } returns null
controller.handleExistingSessionSelected("tab-id")
verify(inverse = true) { sessionManager.select(any()) }
verify { activity.openToBrowser(from = BrowserDirection.FromSearchDialog) } verify { activity.openToBrowser(from = BrowserDirection.FromSearchDialog) }
} }
@Test @Test
fun handleExistingSessionSelected_tabId() { fun handleExistingSessionSelected_tabId() {
val session = mockk<Session>()
every { sessionManager.findSessionById("tab-id") } returns session
controller.handleExistingSessionSelected("tab-id") controller.handleExistingSessionSelected("tab-id")
verify { sessionManager.select(any()) } middleware.assertFirstAction(TabListAction.SelectTabAction::class) { action ->
assertEquals("tab-id", action.tabId)
}
verify { activity.openToBrowser(from = BrowserDirection.FromSearchDialog) } verify { activity.openToBrowser(from = BrowserDirection.FromSearchDialog) }
} }

View File

@ -8,7 +8,6 @@ import io.mockk.mockk
import io.mockk.verify import io.mockk.verify
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runBlockingTest import kotlinx.coroutines.test.runBlockingTest
import mozilla.components.browser.session.Session
import mozilla.components.browser.state.search.SearchEngine import mozilla.components.browser.state.search.SearchEngine
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
@ -98,12 +97,12 @@ class SearchDialogInteractorTest {
@Test @Test
fun onExistingSessionSelected() { fun onExistingSessionSelected() {
val session = Session("http://mozilla.org", false) val sessionId = "mozilla"
interactor.onExistingSessionSelected(session.id) interactor.onExistingSessionSelected(sessionId)
verify { verify {
searchController.handleExistingSessionSelected(session.id) searchController.handleExistingSessionSelected(sessionId)
} }
} }

View File

@ -6,7 +6,9 @@ package org.mozilla.fenix.tabhistory
import androidx.navigation.NavController import androidx.navigation.NavController
import io.mockk.mockk import io.mockk.mockk
import io.mockk.spyk
import io.mockk.verify import io.mockk.verify
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.feature.session.SessionUseCases import mozilla.components.feature.session.SessionUseCases
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
@ -16,11 +18,13 @@ class TabHistoryControllerTest {
private lateinit var navController: NavController private lateinit var navController: NavController
private lateinit var goToHistoryIndexUseCase: SessionUseCases.GoToHistoryIndexUseCase private lateinit var goToHistoryIndexUseCase: SessionUseCases.GoToHistoryIndexUseCase
private lateinit var currentItem: TabHistoryItem private lateinit var currentItem: TabHistoryItem
private lateinit var store: BrowserStore
@Before @Before
fun setUp() { fun setUp() {
store = BrowserStore()
navController = mockk(relaxed = true) navController = mockk(relaxed = true)
goToHistoryIndexUseCase = mockk(relaxed = true) goToHistoryIndexUseCase = spyk(SessionUseCases(store).goToHistoryIndex)
currentItem = TabHistoryItem( currentItem = TabHistoryItem(
index = 0, index = 0,
title = "", title = "",
@ -28,7 +32,6 @@ class TabHistoryControllerTest {
isSelected = true isSelected = true
) )
} }
@Test @Test
fun handleGoToHistoryIndexNormalBrowsing() { fun handleGoToHistoryIndexNormalBrowsing() {
val controller = DefaultTabHistoryController( val controller = DefaultTabHistoryController(

View File

@ -6,8 +6,8 @@ package org.mozilla.fenix.telemetry
import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ApplicationProvider
import io.mockk.mockk import io.mockk.mockk
import mozilla.components.browser.session.engine.EngineMiddleware
import mozilla.components.browser.state.action.EngineAction import mozilla.components.browser.state.action.EngineAction
import mozilla.components.browser.state.engine.EngineMiddleware
import mozilla.components.browser.state.state.BrowserState import mozilla.components.browser.state.state.BrowserState
import mozilla.components.browser.state.state.createTab import mozilla.components.browser.state.state.createTab
import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.state.store.BrowserStore
@ -85,7 +85,7 @@ class TelemetryLifecycleObserverTest {
createTab("https://getpocket.com", id = "pocket", crashed = true) createTab("https://getpocket.com", id = "pocket", crashed = true)
) )
), ),
middleware = EngineMiddleware.create(engine = mockk(), sessionLookup = { null }) middleware = EngineMiddleware.create(engine = mockk())
) )
val observer = TelemetryLifecycleObserver(store) val observer = TelemetryLifecycleObserver(store)

View File

@ -9,7 +9,7 @@ import io.mockk.mockk
import io.mockk.verify import io.mockk.verify
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestCoroutineDispatcher import kotlinx.coroutines.test.TestCoroutineDispatcher
import mozilla.components.browser.session.engine.EngineMiddleware import mozilla.components.browser.state.engine.EngineMiddleware
import mozilla.components.browser.state.action.ContentAction import mozilla.components.browser.state.action.ContentAction
import mozilla.components.browser.state.action.DownloadAction import mozilla.components.browser.state.action.DownloadAction
import mozilla.components.browser.state.action.EngineAction import mozilla.components.browser.state.action.EngineAction
@ -73,7 +73,7 @@ class TelemetryMiddlewareTest {
metrics metrics
) )
store = BrowserStore( store = BrowserStore(
middleware = listOf(telemetryMiddleware) + EngineMiddleware.create(engine = mockk(), sessionLookup = { null }), middleware = listOf(telemetryMiddleware) + EngineMiddleware.create(engine = mockk()),
initialState = BrowserState() initialState = BrowserState()
) )
} }
@ -340,7 +340,7 @@ class TelemetryMiddlewareTest {
clock.elapsedTime = 100 clock.elapsedTime = 100
store.dispatch(EngineAction.LinkEngineSessionAction( store.dispatch(EngineAction.LinkEngineSessionAction(
sessionId = "foreground", tabId = "foreground",
engineSession = mock() engineSession = mock()
)).joinBlocking() )).joinBlocking()
@ -372,7 +372,7 @@ class TelemetryMiddlewareTest {
clock.elapsedTime = 100 clock.elapsedTime = 100
store.dispatch(EngineAction.LinkEngineSessionAction( store.dispatch(EngineAction.LinkEngineSessionAction(
sessionId = "background_pocket", tabId = "background_pocket",
engineSession = mock() engineSession = mock()
)).joinBlocking() )).joinBlocking()

View File

@ -3,5 +3,5 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
object AndroidComponents { object AndroidComponents {
const val VERSION = "91.0.20210607143102" const val VERSION = "91.0.20210609144806"
} }

View File

@ -78,7 +78,6 @@ object Deps {
const val mozilla_browser_engine_gecko = "org.mozilla.components:browser-engine-gecko:${Versions.mozilla_android_components}" const val mozilla_browser_engine_gecko = "org.mozilla.components:browser-engine-gecko:${Versions.mozilla_android_components}"
const val mozilla_browser_domains = "org.mozilla.components:browser-domains:${Versions.mozilla_android_components}" const val mozilla_browser_domains = "org.mozilla.components:browser-domains:${Versions.mozilla_android_components}"
const val mozilla_browser_icons = "org.mozilla.components:browser-icons:${Versions.mozilla_android_components}" const val mozilla_browser_icons = "org.mozilla.components:browser-icons:${Versions.mozilla_android_components}"
const val mozilla_browser_session = "org.mozilla.components:browser-session:${Versions.mozilla_android_components}"
const val mozilla_browser_session_storage = "org.mozilla.components:browser-session-storage:${Versions.mozilla_android_components}" const val mozilla_browser_session_storage = "org.mozilla.components:browser-session-storage:${Versions.mozilla_android_components}"
const val mozilla_browser_state = "org.mozilla.components:browser-state:${Versions.mozilla_android_components}" const val mozilla_browser_state = "org.mozilla.components:browser-state:${Versions.mozilla_android_components}"
const val mozilla_browser_tabstray = "org.mozilla.components:browser-tabstray:${Versions.mozilla_android_components}" const val mozilla_browser_tabstray = "org.mozilla.components:browser-tabstray:${Versions.mozilla_android_components}"