ma1 pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android
Commits:
-
6271d708
by hackademix at 2024-07-09T14:38:08+02:00
4 changed files:
- android-components/.buildconfig.yml
- android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/PromptAbuserDetector.kt
- android-components/components/feature/sitepermissions/build.gradle
- android-components/components/feature/sitepermissions/src/main/java/mozilla/components/feature/sitepermissions/SitePermissionsDialogFragment.kt
Changes:
... | ... | @@ -1150,6 +1150,7 @@ projects: |
1150 | 1150 | - concept-tabstray
|
1151 | 1151 | - concept-toolbar
|
1152 | 1152 | - feature-session
|
1153 | + - feature-prompts
|
|
1153 | 1154 | - feature-tabs
|
1154 | 1155 | - lib-publicsuffixlist
|
1155 | 1156 | - lib-state
|
... | ... | @@ -9,7 +9,7 @@ import java.util.Date |
9 | 9 | /**
|
10 | 10 | * Helper class to identify if a website has shown many dialogs.
|
11 | 11 | */
|
12 | -internal class PromptAbuserDetector {
|
|
12 | +class PromptAbuserDetector(private val maxSuccessiveDialogSecondsLimit: Int = MAX_SUCCESSIVE_DIALOG_SECONDS_LIMIT) {
|
|
13 | 13 | |
14 | 14 | internal var jsAlertCount = 0
|
15 | 15 | internal var lastDialogShownAt = Date()
|
... | ... | @@ -43,7 +43,7 @@ internal class PromptAbuserDetector { |
43 | 43 | } else {
|
44 | 44 | val now = Date()
|
45 | 45 | val diffInSeconds = (now.time - lastDialogShownAt.time) / SECOND_MS
|
46 | - diffInSeconds < MAX_SUCCESSIVE_DIALOG_SECONDS_LIMIT
|
|
46 | + diffInSeconds < maxSuccessiveDialogSecondsLimit
|
|
47 | 47 | }
|
48 | 48 | }
|
49 | 49 |
... | ... | @@ -58,6 +58,7 @@ dependencies { |
58 | 58 | implementation project(':concept-engine')
|
59 | 59 | implementation project(':ui-icons')
|
60 | 60 | implementation project(':support-ktx')
|
61 | + implementation project(':feature-prompts')
|
|
61 | 62 | implementation project(':feature-tabs')
|
62 | 63 | |
63 | 64 | implementation ComponentsDependencies.kotlin_coroutines
|
... | ... | @@ -20,8 +20,10 @@ import android.widget.CheckBox |
20 | 20 | import android.widget.ImageView
|
21 | 21 | import android.widget.LinearLayout.LayoutParams
|
22 | 22 | import android.widget.TextView
|
23 | +import androidx.annotation.VisibleForTesting
|
|
23 | 24 | import androidx.appcompat.app.AppCompatDialogFragment
|
24 | 25 | import androidx.core.content.ContextCompat
|
26 | +import mozilla.components.feature.prompts.dialog.PromptAbuserDetector
|
|
25 | 27 | |
26 | 28 | internal const val KEY_SESSION_ID = "KEY_SESSION_ID"
|
27 | 29 | internal const val KEY_TITLE = "KEY_TITLE"
|
... | ... | @@ -41,6 +43,9 @@ private const val KEY_PERMISSION_ID = "KEY_PERMISSION_ID" |
41 | 43 | |
42 | 44 | internal open class SitePermissionsDialogFragment : AppCompatDialogFragment() {
|
43 | 45 | |
46 | + @VisibleForTesting
|
|
47 | + internal var promptAbuserDetector =
|
|
48 | + PromptAbuserDetector(maxSuccessiveDialogSecondsLimit = TIME_SHOWN_OFFSET_SECONDS)
|
|
44 | 49 | // Safe Arguments
|
45 | 50 | |
46 | 51 | private val safeArguments get() = requireNotNull(arguments)
|
... | ... | @@ -106,6 +111,8 @@ internal open class SitePermissionsDialogFragment : AppCompatDialogFragment() { |
106 | 111 | }
|
107 | 112 | }
|
108 | 113 | |
114 | + promptAbuserDetector.updateJSDialogAbusedState()
|
|
115 | + |
|
109 | 116 | return sheetDialog
|
110 | 117 | }
|
111 | 118 | |
... | ... | @@ -159,8 +166,16 @@ internal open class SitePermissionsDialogFragment : AppCompatDialogFragment() { |
159 | 166 | val negativeButton = rootView.findViewById<Button>(R.id.deny_button)
|
160 | 167 | |
161 | 168 | positiveButton.setOnClickListener {
|
162 | - feature?.onPositiveButtonPress(permissionRequestId, sessionId, userSelectionCheckBox)
|
|
163 | - dismiss()
|
|
169 | + if (promptAbuserDetector.areDialogsBeingAbused()) {
|
|
170 | + promptAbuserDetector.updateJSDialogAbusedState()
|
|
171 | + } else {
|
|
172 | + feature?.onPositiveButtonPress(
|
|
173 | + permissionRequestId,
|
|
174 | + sessionId,
|
|
175 | + userSelectionCheckBox,
|
|
176 | + )
|
|
177 | + dismiss()
|
|
178 | + }
|
|
164 | 179 | }
|
165 | 180 | |
166 | 181 | if (positiveButtonBackgroundColor != DEFAULT_VALUE) {
|
... | ... | @@ -255,5 +270,7 @@ internal open class SitePermissionsDialogFragment : AppCompatDialogFragment() { |
255 | 270 | fragment.arguments = arguments
|
256 | 271 | return fragment
|
257 | 272 | }
|
273 | + |
|
274 | + private const val TIME_SHOWN_OFFSET_SECONDS = 1
|
|
258 | 275 | }
|
259 | 276 | } |