Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • android-components-102.0.14-12.5-1
  • android-components-102.0.14-12.0-1
  • android-components-102.0.14-11.5-1
  • android-components-99.0.3-11.5-1
  • android-components-100.0.8-11.5-1
  • android-components-99.0.10-11.0-1
  • android-components-96.0.15-11.0-1
  • android-components-96.0.15-11.5-1
  • android-components-96.0.13-11.5-1
  • android-components-95.0.10-11.5-1
  • android-components-95.0.14-11.5-1
  • android-components-94.0.12-11.5-1
  • android-components-95.0.10-11.0-1
  • android-components-94.0.12-11.0-1
  • android-components-93.0.12-11.0-1
  • android-components-91.0.13-10.5-1
  • android-components-91.0.13-11.0-1
  • android-components-91.0.12-10.5-1
  • android-components-91.0.12-11.0-1
  • android-components-91.0.8-11.0-1
  • android-components-91.0.7-11.0-1
  • android-components-91.0.1-11.0-1
  • android-components-90.0.12-11.0-1
  • android-components-90.0.12-10.5-1
  • android-components-90.0.11-10.5-1
  • android-components-90.0.11-11.0-1
  • android-components-75.0.22-10.0-1
  • android-components-75.0.22-10.5-1
  • android-components-75.0.21-10.5-1
  • android-components-75.0.11-10.5-1
  • android-components-74.0.13-10.0-1
  • android-components-74.0.13-10.5-1
  • android-components-74.0.11-10.5-1
  • android-components-74.0.10-10.5-1
  • android-components-74.0.6-10.5-1
  • android-components-73.0.11-10.0-1
  • android-components-73.0.11-10.5-1
  • android-components-73.0.3-10.5-1
  • android-components-72.0.15-10.0-1
  • android-components-72.0.15-10.5-1
  • android-components-72.0.14-10.5-1
  • android-components-72.0.5-10.5-1
  • android-components-72.0.1-10.5-1
  • android-components-70.0.16-10.0-1
  • android-components-70.0.16-10.5-1
  • android-components-70.0.11-10.5-1
  • android-components-67.0.17-10.0-1
  • android-components-70.0.0-10.5-1
  • android-components-67.0.11-10.0-1
  • android-components-67.0.11-10.5-1
  • android-components-67.0.10-10.5-1
  • android-components-67.0.10-10.0-1
  • android-components-67.0.3-10.5-1
  • android-components-63.0.9-10.0-1
  • android-components-63.0.8-10.5-1
  • android-components-60.0.5-10.5-1
  • android-components-63.0.1-10.5-1
  • android-components-60.0.5-10.0-1
  • android-components-63.0.1-10.0-1
  • android-components-60.0.3-10.0-1
  • android-components-63.0.0-10.0-1
  • android-components-57.0.7-10.0-1
  • android-components-57.0.6-10.0-2
  • android-components-57.0.6-10.0-1
  • android-components-57.0.0-10.0-1
  • releases/57.0
  • android-components-102.0.14-11.5-1-build1
  • android-components-102.0.14-11.5-1-build2
  • android-components-102.0.14-11.5-1-build3
  • android-components-102.0.14-12.0-1-build1
  • android-components-102.0.14-12.0-1-build2
  • android-components-102.0.14-12.0-1-build3
  • android-components-102.0.14-12.0-1-build4
  • android-components-102.0.14-12.0-1-build5
  • android-components-102.0.14-12.0-1-build6
  • android-components-102.0.14-12.5-1-build1
  • android-components-102.0.14-12.5-1-build2
  • android-components-102.0.14-12.5-1-build3
  • android-components-57.0.7-10.0-1-build1
  • android-components-60.0.5-10.0-1-build1
  • android-components-63.0.8-10.5-1-build1
  • android-components-63.0.9-10.0-1-build1
  • android-components-67.0.11-10.0-1-build1
  • android-components-67.0.11-10.5-1-build1
  • android-components-67.0.17-10.0-1-build1
  • android-components-67.0.3-10.5-1-build1
  • android-components-70.0.11-10.5-1-build1
  • android-components-70.0.16-10.0-1-build1
  • android-components-70.0.16-10.5-1-build1
  • android-components-72.0.15-10.0-1-build1
  • android-components-72.0.15-10.5-1-build1
  • android-components-72.0.5-10.5-1-build1
  • android-components-73.0.11-10.0-1-build1
  • android-components-73.0.11-10.5-1-build1
  • android-components-73.0.3-10.5-1-build1
  • android-components-74.0.11-10.5-1-build1
  • android-components-74.0.13-10.0-1-build1
  • android-components-74.0.13-10.5-1-build1
  • android-components-75.0.22-10.0-1-build1
  • android-components-75.0.22-10.5-1-build1
  • android-components-90.0.11-11.0-1-build1
  • android-components-90.0.12-10.5-1-build1
  • android-components-90.0.12-11.0-1-build1
  • android-components-91.0.12-11.0-1-build1
  • android-components-91.0.13-10.5-1-build1
  • android-components-91.0.13-11.0-1-build1
  • android-components-91.0.8-11.0-1-build1
  • android-components-94.0.12-11.0-1-build1
  • android-components-94.0.12-11.5-1-build1
  • android-components-96.0.15-11.0-1-build1
  • android-components-96.0.15-11.0-1-build2
  • android-components-96.0.15-11.5-1-build1
  • android-components-99.0.3-11.5-1-build1
  • android-components-99.0.3-11.5-1-build2
  • android-components-99.0.3-11.5-1-build3
  • android-components-99.0.3-11.5-1-build4
  • v102.0.14
  • v57.0.0
118 results

Target

Select target project
  • aguestuser / android-components
  • Matthew Finkel / android-components
  • Alex Catarineu / android-components
  • Georg Koppen / android-components
  • Gaba / android-components
  • boklm / android-components
  • ma1 / android-components
  • morgan / android-components
  • Tommy Webb / android-components
  • cypherpunks1 / android-components
  • Dan Ballard / android-components
11 results
Select Git revision
  • android-components-102.0.14-12.5-1
  • android-components-102.0.14-12.0-1
  • android-components-102.0.14-11.5-1
  • android-components-99.0.3-11.5-1
  • android-components-100.0.8-11.5-1
  • android-components-99.0.10-11.0-1
  • android-components-96.0.15-11.0-1
  • android-components-96.0.15-11.5-1
  • android-components-96.0.13-11.5-1
  • android-components-95.0.10-11.5-1
  • android-components-95.0.14-11.5-1
  • android-components-94.0.12-11.5-1
  • android-components-95.0.10-11.0-1
  • android-components-94.0.12-11.0-1
  • android-components-93.0.12-11.0-1
  • android-components-91.0.13-10.5-1
  • android-components-91.0.13-11.0-1
  • android-components-91.0.12-10.5-1
  • android-components-91.0.12-11.0-1
  • android-components-91.0.8-11.0-1
  • android-components-91.0.7-11.0-1
  • android-components-91.0.1-11.0-1
  • android-components-90.0.12-11.0-1
  • android-components-90.0.12-10.5-1
  • android-components-90.0.11-10.5-1
  • android-components-90.0.11-11.0-1
  • android-components-75.0.22-10.0-1
  • android-components-75.0.22-10.5-1
  • android-components-75.0.21-10.5-1
  • android-components-75.0.11-10.5-1
  • android-components-74.0.13-10.0-1
  • android-components-74.0.13-10.5-1
  • android-components-74.0.11-10.5-1
  • android-components-74.0.10-10.5-1
  • android-components-74.0.6-10.5-1
  • android-components-73.0.11-10.0-1
  • android-components-73.0.11-10.5-1
  • android-components-73.0.3-10.5-1
  • android-components-72.0.15-10.0-1
  • android-components-72.0.15-10.5-1
  • android-components-72.0.14-10.5-1
  • android-components-72.0.5-10.5-1
  • android-components-72.0.1-10.5-1
  • android-components-70.0.16-10.0-1
  • android-components-70.0.16-10.5-1
  • android-components-70.0.11-10.5-1
  • android-components-67.0.17-10.0-1
  • android-components-70.0.0-10.5-1
  • android-components-67.0.11-10.0-1
  • android-components-67.0.11-10.5-1
  • android-components-67.0.10-10.5-1
  • android-components-67.0.10-10.0-1
  • android-components-67.0.3-10.5-1
  • android-components-63.0.9-10.0-1
  • android-components-63.0.8-10.5-1
  • android-components-60.0.5-10.5-1
  • android-components-63.0.1-10.5-1
  • android-components-60.0.5-10.0-1
  • android-components-63.0.1-10.0-1
  • android-components-60.0.3-10.0-1
  • android-components-63.0.0-10.0-1
  • android-components-57.0.7-10.0-1
  • android-components-57.0.6-10.0-2
  • android-components-57.0.6-10.0-1
  • android-components-57.0.0-10.0-1
  • releases/57.0
  • android-components-102.0.14-11.5-1-build1
  • android-components-102.0.14-11.5-1-build2
  • android-components-102.0.14-11.5-1-build3
  • android-components-102.0.14-12.0-1-build1
  • android-components-102.0.14-12.0-1-build2
  • android-components-102.0.14-12.0-1-build3
  • android-components-102.0.14-12.0-1-build4
  • android-components-102.0.14-12.0-1-build5
  • android-components-102.0.14-12.0-1-build6
  • android-components-102.0.14-12.5-1-build1
  • android-components-102.0.14-12.5-1-build2
  • android-components-102.0.14-12.5-1-build3
  • android-components-57.0.7-10.0-1-build1
  • android-components-60.0.5-10.0-1-build1
  • android-components-63.0.8-10.5-1-build1
  • android-components-63.0.9-10.0-1-build1
  • android-components-67.0.11-10.0-1-build1
  • android-components-67.0.11-10.5-1-build1
  • android-components-67.0.17-10.0-1-build1
  • android-components-67.0.3-10.5-1-build1
  • android-components-70.0.11-10.5-1-build1
  • android-components-70.0.16-10.0-1-build1
  • android-components-70.0.16-10.5-1-build1
  • android-components-72.0.15-10.0-1-build1
  • android-components-72.0.15-10.5-1-build1
  • android-components-72.0.5-10.5-1-build1
  • android-components-73.0.11-10.0-1-build1
  • android-components-73.0.11-10.5-1-build1
  • android-components-73.0.3-10.5-1-build1
  • android-components-74.0.11-10.5-1-build1
  • android-components-74.0.13-10.0-1-build1
  • android-components-74.0.13-10.5-1-build1
  • android-components-75.0.22-10.0-1-build1
  • android-components-75.0.22-10.5-1-build1
  • android-components-90.0.11-11.0-1-build1
  • android-components-90.0.12-10.5-1-build1
  • android-components-90.0.12-11.0-1-build1
  • android-components-91.0.12-11.0-1-build1
  • android-components-91.0.13-10.5-1-build1
  • android-components-91.0.13-11.0-1-build1
  • android-components-91.0.8-11.0-1-build1
  • android-components-94.0.12-11.0-1-build1
  • android-components-94.0.12-11.5-1-build1
  • android-components-96.0.15-11.0-1-build1
  • android-components-96.0.15-11.0-1-build2
  • android-components-96.0.15-11.5-1-build1
  • android-components-99.0.3-11.5-1-build1
  • android-components-99.0.3-11.5-1-build2
  • android-components-99.0.3-11.5-1-build3
  • android-components-99.0.3-11.5-1-build4
  • v102.0.14
  • v57.0.0
118 results
Show changes

Commits on Source 12

38 files
+ 228
914
Compare changes
  • Side-by-side
  • Inline

Files

+7 −1
Original line number Diff line number Diff line
@@ -106,7 +106,13 @@ subprojects {
            rename { 'manifest.json' }
            into extDir

            def values = ['version': rootProject.ext.config.componentsVersion + "." + new Date().format('MMddHHmmss')]
            def systemEnvBuildDate = System.getenv('MOZ_BUILD_DATE')
            // MOZ_BUILD_DATE is in the YYYYMMDDHHMMSS format. Thus, we only use a
            // substring of it if it is available.
            def values = ['version': rootProject.ext.config.componentsVersion + "." +
                          (systemEnvBuildDate != null ?
                           systemEnvBuildDate.substring(4) :
                           new Date().format('MMddHHmmss'))]
            inputs.properties(values)
            expand(values)
        }
+18 −0
Original line number Diff line number Diff line
@@ -634,6 +634,22 @@ class GeckoEngine(
        override var enterpriseRootsEnabled: Boolean
            get() = runtime.settings.enterpriseRootsEnabled
            set(value) { runtime.settings.enterpriseRootsEnabled = value }

        override var torSecurityLevel: Int
            get() = runtime.settings.torSecurityLevel
            set(value) {
                value.let {
                    runtime.settings.torSecurityLevel = it
                }
            }
        override var spoofEnglish: Boolean
            get() = runtime.settings.spoofEnglish
            set(value) {
                value.let {
                    runtime.settings.spoofEnglish = it
                    localeUpdater.updateValue()
                }
            }
    }.apply {
        defaultSettings?.let {
            this.javascriptEnabled = it.javascriptEnabled
@@ -652,6 +668,8 @@ class GeckoEngine(
            this.clearColor = it.clearColor
            this.loginAutofillEnabled = it.loginAutofillEnabled
            this.enterpriseRootsEnabled = it.enterpriseRootsEnabled
            this.torSecurityLevel = it.torSecurityLevel
            this.spoofEnglish = it.spoofEnglish
        }
    }

+1 −0
Original line number Diff line number Diff line
@@ -88,6 +88,7 @@ private fun Request.toWebRequest(): WebRequest = WebRequest.Builder(url)
    .addHeadersFrom(this)
    .addBodyFrom(this)
    .cacheMode(if (useCaches) CACHE_MODE_DEFAULT else CACHE_MODE_RELOAD)
    .origin(origin)
    .build()

private fun WebRequest.Builder.addHeadersFrom(request: Request): WebRequest.Builder {
+2 −1
Original line number Diff line number Diff line
@@ -52,7 +52,8 @@ class HttpIconLoader(
            connectTimeout = Pair(CONNECT_TIMEOUT, TimeUnit.SECONDS),
            readTimeout = Pair(READ_TIMEOUT, TimeUnit.SECONDS),
            redirect = Request.Redirect.FOLLOW,
            useCaches = true)
            useCaches = true,
            origin = request.url)

        return try {
            val response = httpClient.fetch(downloadRequest)
+6 −21
Original line number Diff line number Diff line
@@ -9,7 +9,6 @@ import androidx.annotation.ColorRes
import androidx.annotation.DrawableRes
import mozilla.components.browser.menu.item.BackPressMenuItem
import mozilla.components.browser.menu.item.BrowserMenuDivider
import mozilla.components.browser.menu.item.BrowserMenuImageText
import mozilla.components.browser.menu.item.NO_ID
import mozilla.components.browser.menu.item.ParentBrowserMenuItem
import mozilla.components.browser.menu.item.WebExtensionBrowserMenuItem
@@ -96,20 +95,10 @@ class WebExtensionBrowserMenuBuilder(
                iconTintColorResource = style.webExtIconTintColorResource
            )

            val addonsManagerMenuItem = BrowserMenuImageText(
                label = context.getString(R.string.mozac_browser_menu_addons_manager),
                imageResource = style.addonsManagerMenuItemDrawableRes,
                iconTintColorResource = style.webExtIconTintColorResource
            ) {
                onAddonsManagerTapped.invoke()
            }

            val webExtSubMenuItems = if (appendExtensionSubMenuAtStart) {
                listOf(backPressMenuItem) + BrowserMenuDivider() +
                filteredExtensionMenuItems +
                BrowserMenuDivider() + addonsManagerMenuItem
                filteredExtensionMenuItems
            } else {
                listOf(addonsManagerMenuItem) + BrowserMenuDivider() +
                filteredExtensionMenuItems +
                BrowserMenuDivider() + backPressMenuItem
            }
@@ -125,25 +114,21 @@ class WebExtensionBrowserMenuBuilder(
                endOfMenuAlwaysVisible = endOfMenuAlwaysVisible
            )
        } else {
            BrowserMenuImageText(
                label = context.getString(R.string.mozac_browser_menu_addons),
                imageResource = style.addonsManagerMenuItemDrawableRes,
                iconTintColorResource = style.webExtIconTintColorResource
            ) {
                onAddonsManagerTapped.invoke()
            }
            null
        }
        val mainMenuIndex = items.indexOfFirst { browserMenuItem ->
            (browserMenuItem as? WebExtensionPlaceholderMenuItem)?.id ==
                WebExtensionPlaceholderMenuItem.MAIN_EXTENSIONS_MENU_ID
        }

        return if (mainMenuIndex != -1) {
        return if (mainMenuIndex != -1 && addonsMenuItem != null) {
            items[mainMenuIndex] = addonsMenuItem
            items
            // if we do not have a placeholder we should add the extension submenu at top or bottom
        } else {
            if (appendExtensionSubMenuAtStart) {
            if (addonsMenuItem == null) {
                items
            } else if (appendExtensionSubMenuAtStart) {
                listOf(addonsMenuItem) + items
            } else {
                items + addonsMenuItem
+1 −0
Original line number Diff line number Diff line
@@ -499,6 +499,7 @@ class DisplayToolbar internal constructor(
        @ColorInt val color = when (siteSecurity) {
            Toolbar.SiteSecurity.INSECURE -> colors.securityIconInsecure
            Toolbar.SiteSecurity.SECURE -> colors.securityIconSecure
            Toolbar.SiteSecurity.ONION -> colors.securityIconSecure
        }
        if (color == Color.TRANSPARENT) {
            views.securityIndicator.clearColorFilter()
+5 −0
Original line number Diff line number Diff line
@@ -43,6 +43,11 @@ internal class SiteSecurityIconView @JvmOverloads constructor(
                View.mergeDrawableStates(drawableState, intArrayOf(R.attr.state_site_secure))
                drawableState
            }
            SiteSecurity.ONION -> {
                val drawableState = super.onCreateDrawableState(extraSpace + 1)
                View.mergeDrawableStates(drawableState, intArrayOf(R.attr.state_site_onion))
                drawableState
            }
        }
    }
}
+3 −0
Original line number Diff line number Diff line
@@ -3,6 +3,9 @@
   - 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/. -->
<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ac="http://schemas.android.com/apk/res-auto">
    <item
        android:drawable="@drawable/mozac_ic_onion"
        ac:state_site_onion="true" />
    <item
        android:drawable="@drawable/mozac_ic_lock"
        ac:state_site_secure="true" />
+4 −0
Original line number Diff line number Diff line
@@ -27,6 +27,10 @@
    <attr name="state_site_secure" format="boolean"/>
  </declare-styleable>

  <declare-styleable name="BrowserToolbarSiteOnionState">
    <attr name="state_site_onion" format="boolean"/>
  </declare-styleable>

  <declare-styleable name="ActionContainer">
    <attr name="actionContainerItemSize" format="dimension" />
  </declare-styleable>
+4 −1
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ import android.graphics.Bitmap
import androidx.annotation.CallSuper
import mozilla.components.concept.engine.EngineSession.TrackingProtectionPolicy.CookiePolicy.ACCEPT_ALL
import mozilla.components.concept.engine.EngineSession.TrackingProtectionPolicy.CookiePolicy.ACCEPT_NON_TRACKERS
import mozilla.components.concept.engine.EngineSession.TrackingProtectionPolicy.CookiePolicy.ACCEPT_ONLY_FIRST_PARTY
import mozilla.components.concept.engine.content.blocking.Tracker
import mozilla.components.concept.engine.history.HistoryItem
import mozilla.components.concept.engine.manifest.WebAppManifest
@@ -384,7 +385,9 @@ abstract class EngineSession(
        companion object {
            fun none() = TrackingProtectionPolicy(
                trackingCategories = arrayOf(TrackingCategory.NONE),
                cookiePolicy = ACCEPT_ALL
                useForPrivateSessions = false,
                useForRegularSessions = false,
                cookiePolicy = ACCEPT_ONLY_FIRST_PARTY
            )

            /**
+10 −1
Original line number Diff line number Diff line
@@ -184,6 +184,13 @@ abstract class Settings {
     * Setting to control whether enterprise root certs are enabled.
     */
    open var enterpriseRootsEnabled: Boolean by UnsupportedSetting()

    /**
     * Setting to control the current security level
     */
    open var torSecurityLevel: Int by UnsupportedSetting()

    open var spoofEnglish: Boolean by UnsupportedSetting()
}

/**
@@ -220,7 +227,9 @@ data class DefaultSettings(
    override var forceUserScalableContent: Boolean = false,
    override var loginAutofillEnabled: Boolean = false,
    override var clearColor: Int? = null,
    override var enterpriseRootsEnabled: Boolean = false
    override var enterpriseRootsEnabled: Boolean = false,
    override var torSecurityLevel: Int = 4,
    override var spoofEnglish: Boolean = false
) : Settings()

class UnsupportedSetting<T> {
+2 −1
Original line number Diff line number Diff line
@@ -48,7 +48,8 @@ data class Request(
    val redirect: Redirect = Redirect.FOLLOW,
    val cookiePolicy: CookiePolicy = CookiePolicy.INCLUDE,
    val useCaches: Boolean = true,
    val private: Boolean = false
    val private: Boolean = false,
    val origin: String? = null
) {
    /**
     * A [Body] to be send with the [Request].
+1 −0
Original line number Diff line number Diff line
@@ -414,6 +414,7 @@ interface Toolbar {
    enum class SiteSecurity {
        INSECURE,
        SECURE,
        ONION,
    }

    /**
+3 −3
Original line number Diff line number Diff line
@@ -58,7 +58,7 @@ internal const val PAGE_SIZE = 50
 * cache is being used by default
 */
@Suppress("LongParameterList")
class AddonCollectionProvider(
open class AddonCollectionProvider(
    private val context: Context,
    private val client: Client,
    private val serverURL: String = DEFAULT_SERVER_URL,
@@ -173,7 +173,7 @@ class AddonCollectionProvider(
     * a connectivity problem or a timeout.
     */
    @Throws(IOException::class)
    suspend fun getAddonIconBitmap(addon: Addon): Bitmap? {
    open suspend fun getAddonIconBitmap(addon: Addon): Bitmap? {
        var bitmap: Bitmap? = null
        if (addon.iconUrl != "") {
            client.fetch(
@@ -191,7 +191,7 @@ class AddonCollectionProvider(
    }

    @VisibleForTesting
    internal fun writeToDiskCache(collectionResponse: String, language: String?) {
    protected fun writeToDiskCache(collectionResponse: String, language: String?) {
        synchronized(diskCacheLock) {
            getCacheFile(context, language, useFallbackFile = false).writeString { collectionResponse }
        }
+1 −0
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@
        />

    <androidx.appcompat.widget.AppCompatCheckBox
        android:visibility="gone"
        android:id="@+id/allow_in_private_browsing"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
+1 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ dependencies {

    implementation Dependencies.kotlin_stdlib
    implementation Dependencies.kotlin_coroutines
    implementation project(path: ':support-utils')

    testImplementation project(':support-test')
    testImplementation project(':support-test-libstate')
+1 −1
Original line number Diff line number Diff line
@@ -100,7 +100,7 @@ class AppLinksFeature(
            )
        }

        if (!tab.content.private || fragmentManager == null) {
        if (true || !tab.content.private || fragmentManager == null) {
            doOpenApp()
            return
        }
+2 −1
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import mozilla.components.support.ktx.android.net.isHttpOrHttps
import java.lang.Exception
import java.lang.NullPointerException
import java.net.URISyntaxException
import mozilla.components.support.utils.TorUtils

private const val EXTRA_BROWSER_FALLBACK_URL = "browser_fallback_url"
private const val MARKET_INTENT_URI_PACKAGE_PREFIX = "market://details?id="
@@ -211,7 +212,7 @@ class AppLinksUseCases(
                    if (launchInNewTask) {
                        it.flags = it.flags or Intent.FLAG_ACTIVITY_NEW_TASK
                    }
                    context.startActivity(it)
                    TorUtils.startActivityPrompt(context, it)
                } catch (e: Exception) {
                    when (e) {
                        is ActivityNotFoundException, is SecurityException, is NullPointerException -> {
+2 −1
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import mozilla.components.support.ktx.android.content.addContact
import mozilla.components.support.ktx.android.content.share
import mozilla.components.support.ktx.kotlin.stripMailToProtocol
import mozilla.components.support.ktx.kotlin.takeOrReplace
import mozilla.components.support.utils.TorUtils

/**
 * A candidate for an item to be displayed in the context menu.
@@ -358,7 +359,7 @@ data class ContextMenuCandidate(
                    context.getString(R.string.mozac_feature_contextmenu_share_link)
                ).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

                context.startActivity(shareIntent)
                TorUtils.startActivityPrompt(context, shareIntent)
            }
        )

+2 −0
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ android {
                arg("room.schemaLocation", "$projectDir/schemas".toString())
            }
        }

        buildConfigField("boolean", "ANDROID_DOWNLOADS_INTEGRATION", "false")
    }

    buildTypes {
+8 −3
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@ import mozilla.components.support.ktx.kotlin.ifNullOrEmpty
import mozilla.components.support.ktx.kotlin.sanitizeURL
import mozilla.components.support.ktx.kotlinx.coroutines.throttleLatest
import mozilla.components.support.utils.DownloadUtils
import mozilla.components.support.utils.TorUtils
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
@@ -370,7 +371,9 @@ abstract class AbstractFetchDownloadService : Service() {
                style.notificationAccentColor
            )
            COMPLETED -> {
                if (BuildConfig.ANDROID_DOWNLOADS_INTEGRATION) {
                    addToDownloadSystemDatabaseCompat(download.state, scope)
                }
                DownloadNotification.createDownloadCompletedNotification(
                    context,
                    download,
@@ -835,7 +838,9 @@ abstract class AbstractFetchDownloadService : Service() {
    }

    @VisibleForTesting
    internal fun shouldUseScopedStorage() = getSdkVersion() >= Build.VERSION_CODES.Q
    internal fun shouldUseScopedStorage() =
            BuildConfig.ANDROID_DOWNLOADS_INTEGRATION &&
            getSdkVersion() >= Build.VERSION_CODES.Q

    /**
     * Gets the SDK version from the system.
@@ -947,7 +952,7 @@ abstract class AbstractFetchDownloadService : Service() {
            }

            return try {
                applicationContext.startActivity(newIntent)
                TorUtils.startActivityPrompt(applicationContext, newIntent)
                true
            } catch (error: ActivityNotFoundException) {
                false
+1 −2
Original line number Diff line number Diff line
@@ -25,7 +25,6 @@ import mozilla.components.browser.state.state.SessionState
import mozilla.components.browser.state.state.content.DownloadState
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.feature.downloads.DownloadDialogFragment.Companion.FRAGMENT_TAG
import mozilla.components.feature.downloads.manager.AndroidDownloadManager
import mozilla.components.feature.downloads.manager.DownloadManager
import mozilla.components.feature.downloads.manager.noop
import mozilla.components.feature.downloads.manager.onDownloadStopped
@@ -70,7 +69,7 @@ class DownloadsFeature(
    internal val useCases: DownloadsUseCases,
    override var onNeedToRequestPermissions: OnNeedToRequestPermissions = { },
    onDownloadStopped: onDownloadStopped = noop,
    private val downloadManager: DownloadManager = AndroidDownloadManager(applicationContext, store),
    private val downloadManager: DownloadManager,
    private val tabId: String? = null,
    private val fragmentManager: FragmentManager? = null,
    private val promptsStyling: PromptsStyling? = null,
+1 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ class PrivateNotificationFeature<T : AbstractPrivateNotificationService>(
    }

    override fun stop() {
        applicationContext.stopService(Intent(applicationContext, notificationServiceClass.java))
        scope?.cancel()
    }
}
+3 −851

File changed.

Preview size limit exceeded, changes collapsed.

+11 −0
Original line number Diff line number Diff line
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
<ShortName>DuckDuckGoOnion</ShortName>
<Description>Duck Duck Go Onion</Description>
<InputEncoding>UTF-8</InputEncoding>
<Image height="16" width="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAB8lBMVEUAAADkRQzjPwPjQQXkRQ3iPwTiQQXgPQPeQgrcOwPVNgDVNQDWOgbTMwDRMgDQMwDSMwDRNwTQLgDRJgDSJwDSLgDSNwTjOgDiOADjOQDkPADhQAXzs5v+/fv////0vKbiRQvgPQHpdUr85NzuknPdKgDcIwDnZzj2w7HqeU/gPQLsimb/+PftjWn97Obpb0LdJQDeLQDtjmvsi2jgSBDnbULgOQD/39HgLQDeMgDpeFLgSBH0v670uqbaJQD2qImWvP/G1Ob5+/3u//+fvvXyp47dMwDaLwD0u6v0v6/aNQDiXi/aKQD3qozU7/8gSY2vvtg0ZK/OqLDaKQHYKgLgWTfaNADZMgDZMADZLADzqpD7//+xwdz//9H/5Bn/7Bn//ADofADYMADYMQDZOgPXLgDiZDj//97/0AD3tQDvlgHZOgbXLATXMADWMgDfXjLVLQD///z+0AD/3Rn/yRnwnQDcVjbVMQDyv67wuKTSJwDRHQD+8O/tg3/iQQDwhAHnawHWMADvtKfyva7XQxHga0bQGQD2vbH/u8LXIQCmPQzja07XQxLliGn99fPkcVHvhnGZ5VguvUU5wktBwCcAgxzydVv/8/XmiGngdlL+ysi3+I8LtCE80V6P3YmX4sDleljSNQLzr6D7sKPXNQTSIwAEAbMrAAAAF3RSTlMARqSkRvPz80PTpKRG3fPe3hio9/eoGP50jNsAAAABYktHRB5yCiArAAAAyElEQVQYGQXBvUqCYRiA4fu2V9Tn+UQddI3aCpxaOoU6iU4gcqqpoYbALXBuCuoYmttamqJDiEoh4YP+MOi6BNCh+uYKEGiOVNCXXxA2XDVV/UyfKbRCXTLQWAxbP2vt8Ue/uYDvfim91615sb2um6rqtrr/NFb1cUf1Ybd06areU6lSlYpK79jzK1SyJOkfhOl8JGEcqV5zoKrTRqO6yUzIzNu46ijdM1VV9bhuUJ/nZURExLRzUiPQm3kKXHi4BAEGOmOi78A/L1QoU/VHoTsAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTQtMDEtMTlUMjA6MDE6MTEtMDU6MDAuET6cAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE0LTAxLTE5VDIwOjAxOjExLTA1OjAwX0yGIAAAAABJRU5ErkJggg==</Image>
<Url type="text/html" method="POST" template="https://duckduckgogg42xjoc72x3sjasowoarfbgcmvfimaftt6twagswzczad.onion">
  <Param name="q" value="{searchTerms}"/>
</Url>
<SearchForm>https://duckduckgogg42xjoc72x3sjasowoarfbgcmvfimaftt6twagswzczad.onion</SearchForm>
</SearchPlugin>
+2 −11
Original line number Diff line number Diff line
@@ -4,20 +4,11 @@

<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
<ShortName>DuckDuckGo</ShortName>
<Description>Duck Duck Go</Description>
<InputEncoding>UTF-8</InputEncoding>
<Image width="16" height="16">data:image/png;base64,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</Image>
<Url type="application/x-suggestions+json" method="GET" template="https://ac.duckduckgo.com/ac/">
<Url type="text/html" method="POST" template="https://duckduckgo.com">
  <Param name="q" value="{searchTerms}"/>
  <Param name="type" value="list"/>
</Url>
<!-- this is effectively x-moz-phonesearch, but search service expects a text/html entry -->
<Url type="text/html" method="GET" template="https://duckduckgo.com/">
  <Param name="q" value="{searchTerms}" />
  <Param name="t" value="fpas" />
</Url>
<Url type="application/x-moz-tabletsearch" method="GET" template="https://duckduckgo.com/">
  <Param name="q" value="{searchTerms}" />
  <Param name="t" value="ftas" />
</Url>
<SearchForm>https://duckduckgo.com</SearchForm>
</SearchPlugin>
+11 −0
Original line number Diff line number Diff line
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
<ShortName>Startpage</ShortName>
<Description>Start Page</Description>
<InputEncoding>UTF-8</InputEncoding>
<Image width="16" height="16">data:image/png;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2jkj+9YtD/vWLQ/71i0P+9otD/vaLRP72i0T+9YtE/vWLRP72i0T+9otD/vaNRP72jUT+9otF/vaLRf73kkv+9Yc///WJP//1iT//9Yk///rAmf/94Mz/+sCa//aRTv/1iUH/9ok///aJP//2i0H/9otB//aJQv/2iUL/9otC//aNRP/2jUT/9o1E//aNRP/6wpv////////////96dr/95dQ//aNRP/2kET/9pBG//aQRv/2kEb/9pBG//aRR//3lEz/95BH//mueP/7xJ3/959g//efYf/4p23//vDm//3p2//3kEr/95FJ//aRSf/niFH/95FK//aRSv/2mE//95hS/vq4iP/////////////////81bj/95xZ//q4iP//////+bF+//eZT//njFT/PSqi/2xGjv/2mVD/951V/vedVv783cX///////vQrf/++PP///////748//+8uj///////m3gf/olFr/PSuj/w8Pt/9sSJD/951V//eeWf73oVv++8ul///////5sXf/+KRi//vRsf////////////3r3v/olF//Piyk/w8Pt/9sSJH/+J5Z//ieWv/3oV/++KZf/vihXP/97N7//vn0//zTs//6wJP/+bBy//q6iP/onW//Piyl/w8Pt/8fGbH/m2iB/+icY//4pGD/96hl/viqZf74pmD/+Kxr//3iy/////////n1//ivbP/onGj/Pi2m/w8Pt/8uJKz/fFeQ/x8Zsf8+Lqb/6J9r//ivbP74rm3++Klm//mpZv/5q2f/+bR9//m0e//poW7/Pi6n/w8Pt/9sTZj/+Ktp//ira/+rd4P/Dw+3/4xijv/5snH++LN1/vmvbf/5r23/+a5t//mvb//4r2//TTuk/w8Pt/8fGrL/6ah1//ivcP/4r3P/q3yI/w8Pt/+MZpP/+bN5/vm4ev75t3X/+bV1//m1df/5t3X/+Ld3/8qUhP98XZn/Hxqz/+mse//5t3f/2p+B/x8as/8PD7f/u4qK//m7fv76u4D++bl7//m3fP/5uXz/+bl8//m5fP/5t3z/+bl//x8as/9NPKf/fWCb/x8as/8PD7f/bVOh//q5f//6v4X++sGI/vm9g//5voX/+b6F//m9hf/6vYX/+r6F//nCh/+bepr/Hxu0/w8Pt/8PD7f/fWOh//q+hf/6wof/+saN/vrGjf75xIv/+ceL//nEi//5xIv/+sSL//rHi//6x43/+ceN/+m7kP+7lpj/6ruQ//rHkP/6x43/+seQ//rLlf76ypT++seR//rJkf/6yZH/+seR//rJkf/6yZH/+8mR//vJlP/7yZT/+smU//rJlP/6yZT/+8yV//rJlf/6zpn+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</Image>

<Url type="text/html" method="POST" template="https://startpage.com/rto/search">
  <Param name="q" value="{searchTerms}"/>
</Url>
<SearchForm>https://startpage.com/rto/search/</SearchForm>
</SearchPlugin>
+22 −0
Original line number Diff line number Diff line
<!-- 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/. -->

<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
<ShortName>Yahoo</ShortName>
<Description>Yahoo Search</Description>
<InputEncoding>UTF-8</InputEncoding>
<Image width="16" height="16">data:image/png;base64,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</Image>
<Url type="application/x-suggestions+json" method="GET"
     template="https://search.yahoo.com/sugg/ff">
  <Param name="output"  value="fxjson" />
  <Param name="appid"   value="ffd" />
  <Param name="command" value="{searchTerms}" />
</Url>
<Url type="text/html" method="GET" template="https://search.yahoo.com/yhs/search"
     resultdomain="yahoo.com" rel="searchform">
  <Param name="p" value="{searchTerms}"/>
  <Param name="ei" value="UTF-8"/>
  <Param name="hspart" value="mozilla"/>
</Url>
</SearchPlugin>
+6 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ import mozilla.components.concept.toolbar.Toolbar.Highlight
import mozilla.components.concept.toolbar.Toolbar.SiteTrackingProtection
import mozilla.components.feature.toolbar.internal.URLRenderer
import mozilla.components.lib.state.ext.flowScoped
import mozilla.components.support.ktx.kotlin.isOnionUrl
import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifChanged

/**
@@ -65,7 +66,11 @@ class ToolbarPresenter(
            toolbar.displayProgress(tab.content.progress)

            toolbar.siteSecure = if (tab.content.securityInfo.secure) {
                if (tab.content.url.isOnionUrl()) {
                    Toolbar.SiteSecurity.ONION
                } else {
                    Toolbar.SiteSecurity.SECURE
                }
            } else {
                Toolbar.SiteSecurity.INSECURE
            }
+5 −4
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import mozilla.components.support.base.log.Log
import mozilla.components.support.base.log.logger.Logger
import mozilla.components.support.ktx.R
import mozilla.components.support.ktx.android.content.res.resolveAttribute
import mozilla.components.support.utils.TorUtils
import java.io.File

/**
@@ -110,7 +111,7 @@ fun Context.share(text: String, subject: String = getString(R.string.mozac_suppo
            flags = FLAG_ACTIVITY_NEW_TASK
        }

        startActivity(shareIntent)
        TorUtils.startActivityPrompt(this, shareIntent)
        true
    } catch (e: ActivityNotFoundException) {
        Log.log(Log.Priority.WARN, message = "No activity to share to found", throwable = e, tag = "Reference-Browser")
@@ -191,7 +192,7 @@ fun Context.email(
            flags = FLAG_ACTIVITY_NEW_TASK
        }

        startActivity(emailIntent)
        TorUtils.startActivityPrompt(this, emailIntent)
        true
    } catch (e: ActivityNotFoundException) {
        Logger.warn("No activity found to handle email intent", throwable = e)
@@ -222,7 +223,7 @@ fun Context.call(
            flags = FLAG_ACTIVITY_NEW_TASK
        }

        startActivity(callIntent)
        TorUtils.startActivityPrompt(this, callIntent)
        true
    } catch (e: ActivityNotFoundException) {
        Logger.warn("No activity found to handle dial intent", throwable = e)
@@ -250,7 +251,7 @@ fun Context.addContact(
            addFlags(FLAG_ACTIVITY_NEW_TASK)
        }

        startActivity(intent)
        TorUtils.startActivityPrompt(this, intent)
        true
    } catch (e: ActivityNotFoundException) {
        Logger.warn("No activity found to handle dial intent", throwable = e)
+9 −0
Original line number Diff line number Diff line
@@ -113,6 +113,15 @@ fun String.tryGetHostFromUrl(): String = try {
    this
}

/**
 * Returns whether the string is an .onion URL.
 */
fun String.isOnionUrl(): Boolean = try {
    URL(this).host.endsWith(".onion")
} catch (e: MalformedURLException) {
    false
}

/**
 * Compares 2 URLs and returns true if they have the same origin,
 * which means: same protocol, same host, same port.
+2 −2
Original line number Diff line number Diff line
@@ -93,7 +93,7 @@ sealed class Migration(val currentVersion: Int) {
    /**
     * Migrates all Fennec settings backed by SharedPreferences.
     */
    object Settings : Migration(currentVersion = 2)
    object Settings : Migration(currentVersion = 3)

    /**
     * Migrates / Disables all currently unsupported Add-ons.
@@ -989,7 +989,7 @@ class FennecMigrator private constructor(

        return try {
            logger.debug("Migrating gecko files...")
            val result = GeckoMigration.migrate(profile.path, migrationVersion)
            val result = GeckoMigration.migrate(profile.path, migrationVersion, context)
            logger.debug("Migrated gecko files.")

            if (result is Result.Failure<GeckoMigrationResult>) {
+2 −7
Original line number Diff line number Diff line
@@ -44,16 +44,11 @@ internal object FennecSettingsMigration {
        return migrateTelemetryOptInStatus(fennecAppPrefs, fenixAppPrefs)
    }

    @Suppress("UNUSED_PARAMETER")
    private fun migrateTelemetryOptInStatus(
        fennecPrefs: SharedPreferences,
        fenixPrefs: SharedPreferences
    ): Result<SettingsMigrationResult> {
        // Sanity check: make sure we actually have an FHR value set.
        if (!fennecPrefs.contains(FENNEC_PREFS_FHR_KEY)) {
            logger.warn("Missing FHR pref value")
            return Result.Failure(SettingsMigrationException(SettingsMigrationResult.Failure.MissingFHRPrefValue))
        }

        // Fennec has two telemetry settings:
        // - Firefox Health Report (FHR) - defaults to 'on',
        // - Telemetry - defaults to 'off'.
@@ -66,7 +61,7 @@ internal object FennecSettingsMigration {
        // If FHR is disabled by the user, we'll disable telemetry in Fenix. Otherwise, it will be enabled.

        // Read Fennec prefs.
        val fennecFHRState = fennecPrefs.getBoolean(FENNEC_PREFS_FHR_KEY, false)
        val fennecFHRState = false
        logger.info("Fennec FHR state is: $fennecFHRState")

        // Update Fenix prefs.
+26 −1
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@

package mozilla.components.support.migration

import android.content.Context
import android.util.AtomicFile
import androidx.annotation.VisibleForTesting
import mozilla.components.support.ktx.util.writeString
@@ -12,6 +13,9 @@ import java.io.IOException

private const val PREFS_FILE = "prefs.js"
private const val PREFS_BACKUP_FILE = "prefs.js.backup.v"
private const val SEC_LEVEL_OFFSET = 50
private const val SEC_LEVEL_MIN = 0
private const val SEC_LEVEL_MAX = 4

@VisibleForTesting
internal var userPrefsToKeep = setOf("extensions.webextensions.uuids")
@@ -95,7 +99,8 @@ internal object GeckoMigration {
     */
    fun migrate(
        profilePath: String,
        migrationVersion: Int
        migrationVersion: Int,
        context: Context
    ): Result<GeckoMigrationResult> {
        // GeckoView will happily pick up the profile from Fennec and reuse all data in it. So this
        // migration is mostly focused on removing all prefs that we do not want to reuse.
@@ -118,6 +123,26 @@ internal object GeckoMigration {
            }.toList()
        }

        val secLevel = prefsjs.useLines {
            // The prefs are auto-generated, so we can expect the offset to be always the same
            it.find { line -> line.startsWith("$USER_PREF(\"extensions.torbutton.security_slider\"") }
                    ?.substring(SEC_LEVEL_OFFSET, SEC_LEVEL_OFFSET + 1)?.toIntOrNull()
        }

        if (secLevel != null && secLevel > SEC_LEVEL_MIN && secLevel < SEC_LEVEL_MAX) {
            val prefVal = when (secLevel) {
                1 -> "pref_key_tor_security_level_safest_option"
                else -> "pref_key_tor_security_level_safer_option"
            }
            val fenixAppPrefs = context.getSharedPreferences(
                FennecSettingsMigration.FENIX_SHARED_PREFS_NAME, Context.MODE_PRIVATE
            )
            fenixAppPrefs.edit()
                    .putBoolean("pref_key_tor_security_level_standard_option", false)
                    .putBoolean(prefVal, true)
                    .apply()
        }

        return if (transformed.isEmpty()) {
            removePrefsFile(prefsjs)
        } else {
+26 −0
Original line number Diff line number Diff line
/* 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 mozilla.components.support.utils

import android.app.PendingIntent
import android.content.Context
import android.content.Intent

object TorUtils {
    const val TORBROWSER_START_ACTIVITY_PROMPT = "torbrowser_start_activity_prompt"

    // Delegates showing prompt and possibly starting the activity to the main app activity.
    // Highly dependant on Fenix/Tor Browser for Android.
    // One downside of this implementation is that it does not throw exceptions like the
    // direct context.startActivity, so the UI will behave as if the startActivity call was
    // done successfully, which may not always be the case.
    fun startActivityPrompt(context: Context, intent: Intent) {
        val intentContainer = Intent()
        intentContainer.setPackage(context.applicationContext.packageName)
        intentContainer.putExtra(TORBROWSER_START_ACTIVITY_PROMPT, PendingIntent.getActivity(context, 0, intent, 0))
        intentContainer.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        context.startActivity(intentContainer)
    }
}
+14 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!-- 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/. -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24"
        android:viewportHeight="24">
    <path
        android:pathData="m12.0215,20.5903c0,0 0,-1.2728 0,-1.2728 4.0319,-0.0117 7.2965,-3.283 7.2965,-7.3177 0,-4.0345 -3.2646,-7.3058 -7.2965,-7.3175 0,0 0,-1.2728 0,-1.2728 4.7348,0.0119 8.5691,3.8529 8.5691,8.5903 0,4.7377 -3.8342,8.5789 -8.5691,8.5906 0,0 0,0 0,0m0,-4.4551c2.2741,-0.012 4.1148,-1.8582 4.1148,-4.1355 0,-2.277 -1.8407,-4.1233 -4.1148,-4.1352 0,0 0,-1.2726 0,-1.2726 2.9773,0.0116 5.3877,2.4278 5.3877,5.4078 0,2.9802 -2.4103,5.3964 -5.3877,5.408 0,0 0,-1.2725 0,-1.2725m0,-6.3616c1.2199,0.0116 2.2057,1.0033 2.2057,2.2261 0,1.2231 -0.9858,2.2147 -2.2057,2.2264 0,0 0,-4.4525 0,-4.4525M1.5,11.9997C1.5,17.799 6.2008,22.5 12,22.5 17.799,22.5 22.5,17.799 22.5,11.9997 22.5,6.2008 17.799,1.5 12,1.5 6.2008,1.5 1.5,6.2008 1.5,11.9997c0,0 0,0 0,0"
        android:strokeWidth="1.49999"
        android:fillColor="@color/mozac_ui_icons_fill"/>
</vector>
+2 −0
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@
    <ID>ComplexMethod:Browsers.kt$Browsers$findKnownBrowsers</ID>
    <ID>ComplexMethod:Evaluator.kt$Evaluator$filterStatic</ID>
    <ID>ComplexMethod:ExperimentEvaluator.kt$ExperimentEvaluator$matches</ID>
    <ID>ComplexMethod:GeckoMigration.kt$GeckoMigration$migrate</ID>
    <ID>ComplexMethod:InlineAutocompleteEditText.kt$InlineAutocompleteEditText$addAutocompleteText</ID>
    <ID>ComplexMethod:InlineAutocompleteEditText.kt$InlineAutocompleteEditText.TextChangeListener$afterTextChanged</ID>
    <ID>ComplexMethod:LegacySessionManager.kt$LegacySessionManager$findNearbySession</ID>
@@ -253,6 +254,7 @@
    <ID>UndocumentedPublicClass:ToolbarFeature.kt$ToolbarFeature.RenderStyle$ColoredUrl : RenderStyle</ID>
    <ID>UndocumentedPublicClass:ToolbarFeature.kt$ToolbarFeature.RenderStyle$RegistrableDomain : RenderStyle</ID>
    <ID>UndocumentedPublicClass:ToolbarFeature.kt$ToolbarFeature.RenderStyle$UncoloredUrl : RenderStyle</ID>
    <ID>UndocumentedPublicClass:TorUtils.kt$TorUtils</ID>
    <ID>UndocumentedPublicClass:URLStringUtils.kt$URLStringUtils</ID>
    <ID>UndocumentedPublicClass:WebAppManifest.kt$WebAppManifest.Icon$Purpose</ID>
    <ID>UndocumentedPublicClass:WorkManagerSyncManager.kt$WorkManagerSyncDispatcher : SyncDispatcherObservableCloseable</ID>
+1 −0
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@
                app:drawableStartCompat="@drawable/mozac_ic_permissions" />

        <androidx.appcompat.widget.SwitchCompat
            android:visibility="gone"
            android:id="@+id/allow_in_private_browsing_switch"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"