Skip to content

Commit

Permalink
Fix back behavior, leavesite flash, loading progress
Browse files Browse the repository at this point in the history
  • Loading branch information
laghee authored and CrisBarreiro committed Jan 30, 2025
1 parent 830e5dc commit 6ea4903
Show file tree
Hide file tree
Showing 8 changed files with 53 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5089,16 +5089,16 @@ class BrowserTabViewModelTest {
}

@Test
fun whenRecoveringFromSSLWarningPageAndBrowserShouldShowThenViewStatesUpdated() {
testee.recoverFromSSLWarningPage(true)
fun whenRecoveringFromWarningPageAndBrowserShouldShowThenViewStatesUpdated() {
testee.recoverFromWarningPage(true)

assertEquals(NONE, browserViewState().sslError)
assertEquals(true, browserViewState().browserShowing)
}

@Test
fun whenRecoveringFromSSLWarningPageAndBrowserShouldNotShowThenViewStatesUpdated() = runTest {
testee.recoverFromSSLWarningPage(false)
fun whenRecoveringFromWarningPageAndBrowserShouldNotShowThenViewStatesUpdated() = runTest {
testee.recoverFromWarningPage(false)

assertEquals(NONE, browserViewState().sslError)
assertEquals(false, browserViewState().browserShowing)
Expand Down
24 changes: 20 additions & 4 deletions app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -1359,11 +1359,26 @@ class BrowserTabFragment :
binding.focusDummy.requestFocus()
}

private fun hideMaliciousWarning() {
val navList = webView?.safeCopyBackForwardList()
val currentIndex = navList?.currentIndex ?: 0

if (currentIndex >= 0) {
Timber.d("MaliciousSite: hiding warning page and triggering a reload of the previous")
viewModel.recoverFromWarningPage(true)
refresh()
} else {
Timber.d("MaliciousSite: no previous page to load, showing home")
viewModel.recoverFromWarningPage(false)
renderer.showNewTab()
maliciousWarningView.gone()
}
}

private fun onEscapeMaliciousSite() {
maliciousWarningView.gone()
viewModel.openNewTab()
viewModel.closeCurrentTab()
viewModel.userRequestedOpeningNewTab()
renderer.showNewTab()
}

private fun onBypassMaliciousWarning(url: Uri) {
Expand Down Expand Up @@ -1396,11 +1411,11 @@ class BrowserTabFragment :

if (currentIndex >= 0) {
Timber.d("SSLError: hiding warning page and triggering a reload of the previous")
viewModel.recoverFromSSLWarningPage(true)
viewModel.recoverFromWarningPage(true)
refresh()
} else {
Timber.d("SSLError: no previous page to load, showing home")
viewModel.recoverFromSSLWarningPage(false)
viewModel.recoverFromWarningPage(false)
}
}

Expand Down Expand Up @@ -1715,6 +1730,7 @@ class BrowserTabFragment :

is Command.WebViewError -> showError(it.errorType, it.url)
is Command.ShowWarningMaliciousSite -> showMaliciousWarning(it.url)
is Command.HideWarningMaliciousSite -> hideMaliciousWarning()
is Command.EscapeMaliciousSite -> onEscapeMaliciousSite()
is Command.BypassMaliciousSiteWarning -> onBypassMaliciousWarning(it.url)
is Command.SendResponseToJs -> contentScopeScripts.onResponse(it.data)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ import com.duckduckgo.app.browser.commands.Command.HideBrokenSitePromptCta
import com.duckduckgo.app.browser.commands.Command.HideKeyboard
import com.duckduckgo.app.browser.commands.Command.HideOnboardingDaxDialog
import com.duckduckgo.app.browser.commands.Command.HideSSLError
import com.duckduckgo.app.browser.commands.Command.HideWarningMaliciousSite
import com.duckduckgo.app.browser.commands.Command.HideWebContent
import com.duckduckgo.app.browser.commands.Command.InjectEmailAddress
import com.duckduckgo.app.browser.commands.Command.LaunchAddWidget
Expand Down Expand Up @@ -1196,6 +1197,11 @@ class BrowserTabViewModel @Inject constructor(
}
}

fun openNewTab() {
command.value = GenerateWebViewPreviewImage
command.value = LaunchNewTab
}

fun closeAndReturnToSourceIfBlankTab() {
if (url == null) {
closeAndSelectSourceTab()
Expand Down Expand Up @@ -1291,6 +1297,11 @@ class BrowserTabViewModel @Inject constructor(
return true
}

if (currentBrowserViewState().maliciousSiteDetected) {
command.postValue(HideWarningMaliciousSite)
return true
}

if (!currentBrowserViewState().browserShowing) {
return false
}
Expand Down Expand Up @@ -3064,6 +3075,9 @@ class BrowserTabViewModel @Inject constructor(
if (currentBrowserViewState().sslError != NONE) {
browserViewState.value = currentBrowserViewState().copy(browserShowing = true, sslError = NONE)
}
if (currentBrowserViewState().maliciousSiteDetected) {
browserViewState.value = currentBrowserViewState().copy(browserShowing = true, maliciousSiteDetected = false)
}
}

fun onWebViewRefreshed() {
Expand Down Expand Up @@ -3141,11 +3155,12 @@ class BrowserTabViewModel @Inject constructor(

override fun onReceivedMaliciousSiteWarning(url: Uri) {
// TODO (cbarreiro): Fire pixel
loadingViewState.postValue(currentLoadingViewState().copy(isLoading = false, url = url.toString()))
loadingViewState.postValue(currentLoadingViewState().copy(isLoading = false, progress = 100, url = url.toString()))
browserViewState.postValue(
currentBrowserViewState().copy(
browserShowing = false,
showPrivacyShield = HighlightableButton.Visible(enabled = false),
maliciousSiteDetected = true,
),
)
command.postValue(ShowWarningMaliciousSite(url))
Expand Down Expand Up @@ -3441,9 +3456,9 @@ class BrowserTabViewModel @Inject constructor(
}
}

fun recoverFromSSLWarningPage(showBrowser: Boolean) {
fun recoverFromWarningPage(showBrowser: Boolean) {
if (showBrowser) {
browserViewState.value = currentBrowserViewState().copy(browserShowing = true, sslError = NONE)
browserViewState.value = currentBrowserViewState().copy(browserShowing = true, sslError = NONE, maliciousSiteDetected = false)
} else {
omnibarViewState.value = currentOmnibarViewState().copy(
omnibarText = "",
Expand All @@ -3455,6 +3470,7 @@ class BrowserTabViewModel @Inject constructor(
showPrivacyShield = HighlightableButton.Visible(enabled = false),
browserShowing = showBrowser,
sslError = NONE,
maliciousSiteDetected = false,
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,8 @@ sealed class Command {
val url: Uri,
) : Command()

data object HideWarningMaliciousSite : Command()

data object EscapeMaliciousSite : Command()

data class BypassMaliciousSiteWarning(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ data class BrowserViewState(
val showAutofill: Boolean = false,
val browserError: WebViewErrorResponse = WebViewErrorResponse.OMITTED,
val sslError: SSLErrorType = SSLErrorType.NONE,
val maliciousSiteDetected: Boolean = false,
val privacyProtectionsPopupViewState: PrivacyProtectionsPopupViewState = PrivacyProtectionsPopupViewState.Gone,
val showDuckChatOption: Boolean = false,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ class MaliciousSiteBlockedWarningLayout @JvmOverloads constructor(

private fun formatCopy() {
with(binding) {
errorHeadline.text = HtmlCompat.fromHtml(context.getString(R.string.maliciousSiteMalwareHeadline), HtmlCompat.FROM_HTML_MODE_LEGACY)
expandedHeadline.text = HtmlCompat.fromHtml(context.getString(R.string.maliciousSiteExpandedHeadline), HtmlCompat.FROM_HTML_MODE_LEGACY)
expandedCTA.text = HtmlCompat.fromHtml(context.getString(R.string.maliciousSiteExpandedCTA), HtmlCompat.FROM_HTML_MODE_LEGACY)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/errorTitle"
app:typography="body1"
android:text="@string/maliciousSiteHeadline" />
android:text="@string/maliciousSiteMalwareHeadline" />


<com.duckduckgo.common.ui.view.button.DaxButtonPrimary
android:id="@+id/leaveSiteCTA"
Expand Down
5 changes: 3 additions & 2 deletions app/src/main/res/values/donottranslate.xml
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,11 @@

<!-- Malicious Site -->
<string name="maliciousSiteTitle">Warning: This site may put your personal information at risk</string>
<string name="maliciousSiteHeadline">DuckDuckGo blocked this page because it may be distributing malware designed to compromise your device or steal your personal information. Learn more</string>
<string name="maliciousSiteMalwareHeadline"><![CDATA[DuckDuckGo blocked this page because it may be distributing malware designed to compromise your device or steal your personal information.\n<a href="">Learn more</a>]]></string>
<string name="maliciousSitePhishingHeadline"><![CDATA[This website may be impersonating a legitimate site in order to trick you into providing personal information, such as passwords or credit card numbers.\n<a href="">Learn more</a>]]></string>
<string name="maliciousSiteLeaveCTA">Leave This Site</string>
<string name="maliciousSiteAdvancedCTA">Advanced</string>
<string name="maliciousSiteExpandedHeadline">If you believe this website is safe, you can report an error. You can still visit the website at your own risk.</string>
<string name="maliciousSiteExpandedHeadline"><![CDATA[If you believe this website is safe, you can <a href="">report an error</a>. You can still visit the website at your own risk.]]></string>
<string name="maliciousSiteExpandedCTA"><![CDATA[<u>Accept Risk and Visit Site</u>]]></string>

<!-- Broken Sites-->
Expand Down

0 comments on commit 6ea4903

Please sign in to comment.