Skip to content

Commit b38944f

Browse files
authored
Fix wrong favicon issue (#1200)
* we only save the favicon if it comes from the site we are visiting * fixing tests * spotless * fixed placeholder * fixing test dependencies
1 parent 2ea0400 commit b38944f

File tree

7 files changed

+59
-14
lines changed

7 files changed

+59
-14
lines changed

app/src/androidTest/java/com/duckduckgo/app/browser/BrowserChromeClientTest.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,13 +117,17 @@ class BrowserChromeClientTest {
117117
fun whenOnReceivedIconThenIconReceived() {
118118
val bitmap: Bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.RGB_565)
119119
testee.onReceivedIcon(webView, bitmap)
120-
verify(mockWebViewClientListener).iconReceived(bitmap)
120+
verify(mockWebViewClientListener).iconReceived(webView.url, bitmap)
121121
}
122122

123123
private val mockMsg = Message().apply {
124124
target = mock()
125125
obj = mock<WebView.WebViewTransport>()
126126
}
127127

128-
private class TestWebView(context: Context) : WebView(context)
128+
private class TestWebView(context: Context) : WebView(context) {
129+
override fun getUrl(): String {
130+
return "https://example.com"
131+
}
132+
}
129133
}

app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,12 @@ import com.duckduckgo.app.browser.session.WebViewSessionStorage
5959
import com.duckduckgo.app.cta.db.DismissedCtaDao
6060
import com.duckduckgo.app.cta.model.CtaId
6161
import com.duckduckgo.app.cta.model.DismissedCta
62-
import com.duckduckgo.app.cta.ui.*
62+
import com.duckduckgo.app.cta.ui.Cta
63+
import com.duckduckgo.app.cta.ui.CtaViewModel
64+
import com.duckduckgo.app.cta.ui.DaxBubbleCta
65+
import com.duckduckgo.app.cta.ui.DaxDialogCta
66+
import com.duckduckgo.app.cta.ui.HomePanelCta
67+
import com.duckduckgo.app.cta.ui.UseOurAppCta
6368
import com.duckduckgo.app.email.EmailManager
6469
import com.duckduckgo.app.fire.fireproofwebsite.data.FireproofWebsiteDao
6570
import com.duckduckgo.app.fire.fireproofwebsite.data.FireproofWebsiteEntity
@@ -109,7 +114,16 @@ import com.duckduckgo.app.trackerdetection.EntityLookup
109114
import com.duckduckgo.app.trackerdetection.model.TrackingEvent
110115
import com.duckduckgo.app.usage.search.SearchCountDao
111116
import com.duckduckgo.app.widget.ui.WidgetCapabilities
112-
import com.nhaarman.mockitokotlin2.*
117+
import com.nhaarman.mockitokotlin2.any
118+
import com.nhaarman.mockitokotlin2.anyOrNull
119+
import com.nhaarman.mockitokotlin2.atLeastOnce
120+
import com.nhaarman.mockitokotlin2.doAnswer
121+
import com.nhaarman.mockitokotlin2.doReturn
122+
import com.nhaarman.mockitokotlin2.eq
123+
import com.nhaarman.mockitokotlin2.firstValue
124+
import com.nhaarman.mockitokotlin2.lastValue
125+
import com.nhaarman.mockitokotlin2.mock
126+
import com.nhaarman.mockitokotlin2.whenever
113127
import dagger.Lazy
114128
import io.reactivex.Observable
115129
import io.reactivex.Single
@@ -129,13 +143,17 @@ import org.junit.Assert.*
129143
import org.junit.Before
130144
import org.junit.Rule
131145
import org.junit.Test
132-
import org.mockito.*
146+
import org.mockito.ArgumentCaptor
133147
import org.mockito.ArgumentMatchers.anyString
148+
import org.mockito.Captor
149+
import org.mockito.Mock
150+
import org.mockito.Mockito
134151
import org.mockito.Mockito.never
135152
import org.mockito.Mockito.verify
153+
import org.mockito.MockitoAnnotations
136154
import org.mockito.internal.util.DefaultMockingDetails
137155
import java.io.File
138-
import java.util.*
156+
import java.util.Locale
139157
import java.util.concurrent.TimeUnit
140158

141159
@FlowPreview
@@ -2895,7 +2913,7 @@ class BrowserTabViewModelTest {
28952913
givenOneActiveTabSelected()
28962914
val bitmap: Bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.RGB_565)
28972915

2898-
testee.iconReceived(bitmap)
2916+
testee.iconReceived("https://example.com", bitmap)
28992917

29002918
verify(mockFaviconManager).saveToTemp("TAB_ID", bitmap, "https://example.com")
29012919
}
@@ -2907,7 +2925,7 @@ class BrowserTabViewModelTest {
29072925
val file = File("test")
29082926
whenever(mockFaviconManager.saveToTemp(any(), any(), any())).thenReturn(file)
29092927

2910-
testee.iconReceived(bitmap)
2928+
testee.iconReceived("https://example.com", bitmap)
29112929

29122930
verify(mockTabRepository).updateTabFavicon("TAB_ID", file.name)
29132931
}
@@ -2918,11 +2936,24 @@ class BrowserTabViewModelTest {
29182936
val bitmap: Bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.RGB_565)
29192937
whenever(mockFaviconManager.saveToTemp(any(), any(), any())).thenReturn(null)
29202938

2921-
testee.iconReceived(bitmap)
2939+
testee.iconReceived("https://example.com", bitmap)
29222940

29232941
verify(mockTabRepository, never()).updateTabFavicon(any(), any())
29242942
}
29252943

2944+
@Test
2945+
fun whenIconReceivedFromPreviousUrkThenDontUpdateTabFavicon() = coroutineRule.runBlocking {
2946+
givenOneActiveTabSelected()
2947+
val bitmap: Bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.RGB_565)
2948+
val file = File("test")
2949+
whenever(mockFaviconManager.saveToTemp(any(), any(), any())).thenReturn(file)
2950+
2951+
testee.iconReceived("https://notexample.com", bitmap)
2952+
2953+
verify(mockPixel).enqueueFire(AppPixelName.FAVICON_WRONG_URL_ERROR)
2954+
verify(mockTabRepository, never()).updateTabFavicon("TAB_ID", file.name)
2955+
}
2956+
29262957
@Test
29272958
fun whenOnSiteLocationPermissionSelectedAndPermissionIsAllowAlwaysThenPersistFavicon() = coroutineRule.runBlocking {
29282959
val url = "http://example.com"

app/src/main/java/com/duckduckgo/app/browser/BrowserChromeClient.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ class BrowserChromeClient @Inject constructor(private val uncaughtExceptionRepos
8585
}
8686

8787
override fun onReceivedIcon(webView: WebView, icon: Bitmap) {
88-
webViewClientListener?.iconReceived(icon)
88+
webViewClientListener?.iconReceived(webView.url, icon)
8989
}
9090

9191
override fun onReceivedTitle(view: WebView, title: String) {

app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -627,9 +627,15 @@ class BrowserTabViewModel(
627627
}
628628
}
629629

630-
override fun iconReceived(icon: Bitmap) {
630+
override fun iconReceived(url: String, icon: Bitmap) {
631631
val currentTab = tabRepository.liveSelectedTab.value ?: return
632-
val url = currentTab.url ?: return
632+
val currentUrl = currentTab.url ?: return
633+
if (currentUrl != url) {
634+
pixel.enqueueFire(AppPixelName.FAVICON_WRONG_URL_ERROR)
635+
Timber.d("Favicon received for a url $url, different than the current one $currentUrl")
636+
return
637+
}
638+
633639
viewModelScope.launch {
634640
val faviconFile = faviconManager.saveToTemp(currentTab.tabId, icon, url)
635641
faviconFile?.let {

app/src/main/java/com/duckduckgo/app/browser/WebViewClientListener.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,6 @@ interface WebViewClientListener {
5959

6060
fun loginDetected()
6161
fun dosAttackDetected()
62-
fun iconReceived(icon: Bitmap)
62+
fun iconReceived(url: String, icon: Bitmap)
6363
fun prefetchFavicon(url: String)
6464
}

app/src/main/java/com/duckduckgo/app/browser/favicon/FaviconDownloader.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,5 @@ class GlideFaviconDownloader @Inject constructor(
8484
view.setImageDrawable(ContextCompat.getDrawable(view.context, R.drawable.ic_globe_gray_16dp))
8585
}
8686
}
87+
8788
}

app/src/main/java/com/duckduckgo/app/pixels/AppPixelName.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,5 +212,8 @@ enum class AppPixelName(override val pixelName: String) : Pixel.PixelName {
212212

213213
EMAIL_TOOLTIP_DISMISSED("m_e_t_d"),
214214
EMAIL_USE_ALIAS("m_e_ua"),
215-
EMAIL_USE_ADDRESS("m_e_uad")
215+
EMAIL_USE_ADDRESS("m_e_uad"),
216+
217+
FAVICON_WRONG_URL_ERROR("m_fwu_r")
218+
216219
}

0 commit comments

Comments
 (0)