diff --git a/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt b/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt index 21f19a0fdb5f..7bf6e590037e 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt @@ -7016,6 +7016,32 @@ class BrowserTabViewModelTest { assertEquals(1, fakeAddDocumentStartJavaScriptPlugins.otherPlugin.countInitted) } + @Test + fun whenPrivacyProtectionsUpdatedAndPauseWebViewBeforeUpdatingScriptEnabledThenWebViewPausedBeforeAddingScript() = + runTest { + fakeAndroidConfigBrowserFeature.updateScriptOnPageFinished().setRawStoredState(State(true)) + fakeAndroidConfigBrowserFeature.pauseWebViewBeforeUpdatingScript().setRawStoredState(State(true)) + + testee.privacyProtectionsUpdated(mockWebView) + + verify(mockWebView).stopLoading() + verify(mockWebView).pauseTimers() + verify(mockWebView).resumeTimers() + } + + @Test + fun whenPrivacyProtectionsUpdatedAndPauseWebViewBeforeUpdatingScriptDisabledThenDoNotWebViewPausedBeforeAddingScript() = + runTest { + fakeAndroidConfigBrowserFeature.updateScriptOnPageFinished().setRawStoredState(State(true)) + fakeAndroidConfigBrowserFeature.pauseWebViewBeforeUpdatingScript().setRawStoredState(State(false)) + + testee.privacyProtectionsUpdated(mockWebView) + + verify(mockWebView, never()).stopLoading() + verify(mockWebView, never()).pauseTimers() + verify(mockWebView, never()).resumeTimers() + } + @Test fun whenPrivacyProtectionsUpdatedAndUpdateScriptOnPageFinishedTrueAndUpdateScriptOnProtectionsChangedFalseThenNotAddDocumentStartJavaScript() = runTest { diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt index 1df94a6006f7..533993469ce0 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt @@ -4261,6 +4261,17 @@ class BrowserTabViewModel @Inject constructor( return } + val pauseWebViewBeforeUpdatingScript = withContext(dispatchers.io()) { + androidBrowserConfig.pauseWebViewBeforeUpdatingScript().isEnabled() + } + + if (pauseWebViewBeforeUpdatingScript) { + withContext(dispatchers.main()) { + webView.stopLoading() + webView.pauseTimers() + } + } + if (withContext(dispatchers.io()) { !androidBrowserConfig.updateScriptOnPageFinished().isEnabled() }) { addDocumentStartJavascriptPlugins .getPlugins() @@ -4272,6 +4283,10 @@ class BrowserTabViewModel @Inject constructor( } else { addDocumentStartJavaScript(webView) } + + if (pauseWebViewBeforeUpdatingScript) { + webView.resumeTimers() + } } fun onUserDismissedAutoCompleteInAppMessage() { diff --git a/app/src/main/java/com/duckduckgo/app/pixels/remoteconfig/AndroidBrowserConfigFeature.kt b/app/src/main/java/com/duckduckgo/app/pixels/remoteconfig/AndroidBrowserConfigFeature.kt index 50984d7def1d..23a97910d3e9 100644 --- a/app/src/main/java/com/duckduckgo/app/pixels/remoteconfig/AndroidBrowserConfigFeature.kt +++ b/app/src/main/java/com/duckduckgo/app/pixels/remoteconfig/AndroidBrowserConfigFeature.kt @@ -194,4 +194,7 @@ interface AndroidBrowserConfigFeature { @Toggle.DefaultValue(TRUE) fun updateScriptOnProtectionsChanged(): Toggle + + @Toggle.DefaultValue(TRUE) + fun pauseWebViewBeforeUpdatingScript(): Toggle }