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 |  } |