v121
harvey186 2023-12-24 13:38:45 +01:00
parent 35dc7b49a9
commit 7cd623870e
560 changed files with 18125 additions and 176467 deletions

88
.github/workflows/ci.yml vendored Normal file
View File

@ -0,0 +1,88 @@
name: CI
on:
push:
branches:
- iceraven
jobs:
release-automation:
name: Build App
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
submodules: 'true'
fetch-depth: 0
- name: Setup Java
uses: actions/setup-java@v3
with:
java-version: 17
distribution: temurin
- name: Install Android SDK with pieces Gradle skips
run: ./automation/iceraven/install-sdk.sh
- name: Inspect memory
run: free -h
- name: Create version name
run: echo "VERSION_NAME=$(git describe --tags HEAD)" >> $GITHUB_ENV
- name: Patch on the fly
run: |
sed -i 's#\.\./version.txt#\./version.txt#g' android-components/plugins/config/src/main/java/ConfigPlugin.kt
./automation/iceraven/patch_android_components.sh
- name: Relpace strings
run: |
sed -i 's/Firefox/Iceraven/g' app/src/*/res/values*/*strings.xml
sed -i '/about_content/s/Mozilla/@forkmaintainers/' app/src/*/res/values*/*strings.xml
- name: Build forkRelease variant of app
uses: gradle/gradle-build-action@v2
env:
# Try to stop the daemon from magically vanishing by adding random memory-related arguments.
# See <https://stackoverflow.com/a/70010526> and <https://stackoverflow.com/a/70756876>
# The runner seems to have ~6 gigs of memory, so we make sure to stay under that.
# We have Java 11 so we don't have a perm size anymore.
GRADLE_OPTS: -Dorg.gradle.jvmargs="-XX:MaxMetaspaceSize=2g -Xms1g -Xmx3g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/dev/stderr"
with:
gradle-home-cache-cleanup: true
gradle-executable: /usr/bin/time
arguments: -v ./gradlew app:assemblefenixForkRelease -x lintVitalFenixForkRelease -PversionName=${{ env.VERSION_NAME }} --stacktrace
- name: Create signed APKs
uses: abhijitvalluri/sign-apks@v0.8
with:
releaseDirectory: app/build/outputs/apk/fenix/forkRelease/
signingKeyBase64: ${{ secrets.DEBUG_SIGNING_KEY }}
alias: ${{ secrets.DEBUG_ALIAS }}
keyStorePassword: ${{ secrets.DEBUG_KEY_STORE_PASSWORD }}
keyPassword: ${{ secrets.DEBUG_KEY_PASSWORD }}
- name: Upload arm64 apk
uses: actions/upload-artifact@v3
with:
path: app/build/outputs/apk/fenix/forkRelease/app-fenix-arm64-v8a-forkRelease.apk
name: ${{ env.VERSION_NAME }}-browser-arm64-v8a-forkRelease.apk
- name: Upload armeabi apk
uses: actions/upload-artifact@v3
with:
path: app/build/outputs/apk/fenix/forkRelease/app-fenix-armeabi-v7a-forkRelease.apk
name: ${{ env.VERSION_NAME }}-browser-armeabi-v7a-forkRelease.apk
- name: Upload x86 apk
uses: actions/upload-artifact@v3
with:
path: app/build/outputs/apk/fenix/forkRelease/app-fenix-x86-forkRelease.apk
name: ${{ env.VERSION_NAME }}-browser-x86-forkRelease.apk
- name: Upload x86_64 apk
uses: actions/upload-artifact@v3
with:
path: app/build/outputs/apk/fenix/forkRelease/app-fenix-x86_64-forkRelease.apk
name: ${{ env.VERSION_NAME }}-browser-x86_64-forkRelease.apk

View File

@ -0,0 +1,133 @@
name: Android build PR
on: [pull_request]
jobs:
run-build:
runs-on: ubuntu-20.04
if: ${{ false }}
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Setup Java
uses: actions/setup-java@v1
with:
java-version: 11
- name: "Clean & Assemble Debug"
uses: eskatos/gradle-command-action@v1
with:
wrapper-cache-enabled: true
dependencies-cache-enabled: true
configuration-cache-enabled: true
arguments: clean app:assembleDebug
run-testDebugUnitTest:
runs-on: ubuntu-20.04
if: github.event.pull_request.head.repo.full_name != github.repository && github.actor != 'MickeyMoz'
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Setup Java
uses: actions/setup-java@v1
with:
java-version: 11
- name: "Test Debug Unit Tests"
uses: eskatos/gradle-command-action@v1
with:
wrapper-cache-enabled: true
dependencies-cache-enabled: true
configuration-cache-enabled: true
arguments: testDebugUnitTest
run-detekt:
runs-on: ubuntu-20.04
if: github.event.pull_request.head.repo.full_name != github.repository && github.actor != 'MickeyMoz'
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Setup Java
uses: actions/setup-java@v1
with:
java-version: 11
- name: "Detekt"
uses: eskatos/gradle-command-action@v1
with:
wrapper-cache-enabled: true
dependencies-cache-enabled: true
configuration-cache-enabled: true
arguments: detekt
- name: Archive detekt results
uses: actions/upload-artifact@v2
with:
name: detekt report
path: build/reports/detekt.html
run-ktlint:
runs-on: ubuntu-20.04
if: github.event.pull_request.head.repo.full_name != github.repository && github.actor != 'MickeyMoz'
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Setup Java
uses: actions/setup-java@v1
with:
java-version: 11
- name: "Ktlint"
uses: eskatos/gradle-command-action@v1
with:
wrapper-cache-enabled: true
dependencies-cache-enabled: true
configuration-cache-enabled: true
arguments: ktlint
run-lintDebug:
runs-on: ubuntu-20.04
if: github.event.pull_request.head.repo.full_name != github.repository && github.actor != 'MickeyMoz'
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Setup Java
uses: actions/setup-java@v1
with:
java-version: 11
- name: "Lint Debug"
uses: eskatos/gradle-command-action@v1
with:
wrapper-cache-enabled: true
dependencies-cache-enabled: true
configuration-cache-enabled: true
arguments: lintDebug
- name: Archive lint results
uses: actions/upload-artifact@v2
with:
name: lintDebug report
path: app/build/reports/lint-results-debug.html
run-ui:
runs-on: macos-11
if: ${{ false }}
timeout-minutes: 60
strategy:
matrix:
api-level: [28]
target: [google_apis]
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Run subset of UI Tests
uses: reactivecircus/android-emulator-runner@v2.21.0
with:
api-level: ${{ matrix.api-level }}
target: ${{ matrix.target }}
arch: x86_64
profile: pixel_2
script:
"JAVA_HOME=$JAVA_HOME_11_X64 && ./gradlew connectedDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=\
org.mozilla.fenix.ui.NavigationToolbarTest#visitURLTest"
- name: Upload Test Artifacts
uses: actions/upload-artifact@v2
with:
name: test-report
path: app/build/reports

View File

@ -0,0 +1,44 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/
name: "Fenix - Sync Strings"
on:
schedule:
- cron: '0 2 * * *'
jobs:
main:
name: "Sync Strings"
runs-on: ubuntu-20.04
steps:
- name: "Discover Fenix Beta Version"
id: fenix-beta-version
uses: mozilla-mobile/fenix-beta-version@4.1.0
- name: "Skip non-beta versions"
uses: andymckay/cancel-action@0.2
if: ${{ steps.fenix-beta-version.outputs.beta_version == '' }}
- name: "Checkout Master Branch"
uses: actions/checkout@v2
with:
path: main
ref: main
- name: "Checkout Beta Branch"
uses: actions/checkout@v2
with:
path: beta
ref: "releases_v${{ steps.fenix-beta-version.outputs.beta_version }}.0.0"
- name: "Sync Strings"
uses: mozilla-mobile/sync-strings-action@1.0.1
with:
src: main
dst: beta
- name: Create Pull Request
uses: peter-evans/create-pull-request@v3
with:
token: ${{ secrets.GITHUB_TOKEN }}
path: beta
branch: automation/sync-strings-${{ steps.fenix-beta-version.outputs.beta_version }}
title: "Sync Strings from main to releases_${{steps.fenix-beta-version.outputs.beta_version}}.0"
body: "This (automated) PR syncs strings from `main` to `releases_${{steps.fenix-beta-version.outputs.beta_version}}.0.0`"

View File

@ -0,0 +1,23 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/
name: "Fenix - Update Android-Components"
on:
schedule:
- cron: '*/15 * * * *'
jobs:
main:
name: "Update Android-Components"
runs-on: ubuntu-20.04
steps:
- name: "Update Android-Components"
uses: mozilla-mobile/relbot@5.0.2
if: github.repository == 'mozilla-mobile/fenix'
with:
project: fenix
command: update-android-components
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -0,0 +1,42 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/
name: "Fenix - Update Nimbus Experiments"
on:
schedule:
- cron: '*/30 * * * *'
workflow_dispatch: {}
jobs:
update-nimbus-experiments:
name: "Update Nimbus Experiments"
runs-on: ubuntu-latest
steps:
- name: "Checkout Main Branch"
uses: actions/checkout@v3
with:
path: fenix
ref: main
fetch-depth: 0
- name: "Update Experiments JSON"
id: update-experiments-json
uses: mozilla-mobile/update-experiments@v3
with:
repo-path: fenix
output-path: app/src/main/res/raw/initial_experiments.json
experimenter-url: https://experimenter.services.mozilla.com/api/v6/experiments-first-run/
app-name: fenix
branch: automation/update-nimbus-experiments
- name: Create Pull Request
uses: peter-evans/create-pull-request@v4
if: steps.update-experiments-json.outputs.changed == 1 && steps.update-experiments-json.outputs.changed-branch == 1
with:
token: ${{ secrets.GITHUB_TOKEN }}
path: fenix
branch: automation/update-nimbus-experiments
commit-message: "update initial_experiments.json based on the current first-run experiments in experimenter"
title: "Update initial experiments JSON for Nimbus"
body: "This (automated) PR updates the initial_experiments.json on the `main` branch"
delete-branch: true

View File

@ -0,0 +1,10 @@
---
name: Glean probe-scraper
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
glean-probe-scraper:
uses: mozilla/probe-scraper/.github/workflows/glean.yaml@main

View File

@ -0,0 +1,21 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/
name: Issue Linker
on:
pull_request_target:
branches:
- main
jobs:
issue_linker:
runs-on: ubuntu-latest
steps:
- name: Issue Linker
uses: gabrielluong/issue-linker@1.0.0
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
commit-regexp: "#(\\d+)+"
section: "### GitHub Automation"

View File

@ -0,0 +1,20 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/
name: Tag Milestone
on:
issues:
types:
- closed
jobs:
milestone:
runs-on: ubuntu-latest
if: github.actor == 'mergify[bot]'
steps:
- name: Tag Milestone
uses: gabrielluong/milestone@1.0.0
with:
github-token: ${{ secrets.GITHUB_TOKEN }}

View File

@ -0,0 +1,22 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/
name: QA Needed
on:
pull_request_target:
branches:
- main
jobs:
qa_needed:
runs-on: ubuntu-latest
steps:
- name: QA Needed
uses: gabrielluong/qa-needed@1.0.1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
label: "eng:reopen-for-qa"
check-regexp: "- \\[([ xX]?)\\] \\*\\*QA Needed\\*\\*"
commit-regexp: "#(\\d+)+"

View File

@ -0,0 +1,21 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/
name: Reopen for QA Needed
on:
issues:
types:
- closed
jobs:
reopen_qa_needed:
runs-on: ubuntu-latest
steps:
- name: Reopen for QA Needed
uses: gabrielluong/reopen-for-qa-needed@1.0.0
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
reopen-label: "eng:reopen-for-qa"
qa-label: "eng:qa:needed"

142
.github/workflows/release.yml vendored Normal file
View File

@ -0,0 +1,142 @@
name: Release
on:
create:
jobs:
release-automation:
name: Build App
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
submodules: 'true'
fetch-depth: 0
- name: Setup Java
uses: actions/setup-java@v3
with:
java-version: 17
distribution: temurin
- name: Install Android SDK with pieces Gradle skips
run: ./automation/iceraven/install-sdk.sh
- name: Inspect memory
run: free -h
- name: Create version name
run: echo "VERSION_NAME=$(git describe --tags HEAD)" >> $GITHUB_ENV
- name: Patch on the fly
run: |
sed -i 's#\.\./version.txt#\./version.txt#g' android-components/plugins/config/src/main/java/ConfigPlugin.kt
./automation/iceraven/patch_android_components.sh
- name: Relpace strings
run: |
sed -i 's/Firefox/Iceraven/g' app/src/*/res/values*/*strings.xml
sed -i '/about_content/s/Mozilla/@forkmaintainers/' app/src/*/res/values*/*strings.xml
- name: Build forkRelease variant of app
uses: gradle/gradle-build-action@v2
env:
# Try to stop the daemon from magically vanishing by adding random memory-related arguments.
# See <https://stackoverflow.com/a/70010526> and <https://stackoverflow.com/a/70756876>
# The runner seems to have ~6 gigs of memory, so we make sure to stay under that.
# We have Java 11 so we don't have a perm size anymore.
GRADLE_OPTS: -Dorg.gradle.jvmargs="-XX:MaxMetaspaceSize=2g -Xms1g -Xmx3g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/dev/stderr"
with:
gradle-home-cache-cleanup: true
gradle-executable: /usr/bin/time
arguments: -v ./gradlew app:assemblefenixForkRelease -x lintVitalFenixForkRelease -PversionName=${{ env.VERSION_NAME }} --stacktrace
- name: Create signed APKs
if: "contains(toJSON(github.event.ref_type), 'tag') && contains(toJSON(github.event.ref), 'iceraven')"
uses: abhijitvalluri/sign-apks@v0.8
with:
releaseDirectory: app/build/outputs/apk/fenix/forkRelease/
signingKeyBase64: ${{ secrets.DEBUG_SIGNING_KEY }}
alias: ${{ secrets.DEBUG_ALIAS }}
keyStorePassword: ${{ secrets.DEBUG_KEY_STORE_PASSWORD }}
keyPassword: ${{ secrets.DEBUG_KEY_PASSWORD }}
- name: Create changelog
if: "contains(toJSON(github.event.ref_type), 'tag') && contains(toJSON(github.event.ref), 'iceraven')"
run: |
PREVIOUS_RELEASE_TAG=$(git tag --list iceraven-* --sort=-creatordate | tail -n+2 | head -n 1)
CURRENT_RELEASE_TAG=${{ github.event.ref }}
CURRENT_RELEASE_TAG_CAPITALIZE=${CURRENT_RELEASE_TAG^}
CURRENT_RELEASE_TAG_CAPITALIZE=$(echo $CURRENT_RELEASE_TAG_CAPITALIZE | tr '-' ' ')
echo "CURRENT_RELEASE_TAG_CAPITALIZE=${CURRENT_RELEASE_TAG_CAPITALIZE}" >> $GITHUB_ENV
FENIX_TAG=$(cat version.txt | tr -d '\n')
echo -e "## Release info\n" >> temp_changelog.md
echo '```' >> temp_changelog.md
echo "Iceraven: $(echo $CURRENT_RELEASE_TAG | tr -d 'iceraven-')" >> temp_changelog.md
echo "Fenix: ${FENIX_TAG}" >> temp_changelog.md
echo -e '```\n' >> temp_changelog.md
echo -e "## News\n" >> temp_changelog.md
echo -e "## Change log\n" >> temp_changelog.md
echo "[${PREVIOUS_RELEASE_TAG}...${CURRENT_RELEASE_TAG}](https://github.com/${{ github.repository }}/compare/${PREVIOUS_RELEASE_TAG}...${CURRENT_RELEASE_TAG})" >> temp_changelog.md
- name: Create Release
if: "contains(toJSON(github.event.ref_type), 'tag') && contains(toJSON(github.event.ref), 'iceraven')"
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.event.ref }}
release_name: "${{ env.CURRENT_RELEASE_TAG_CAPITALIZE }}"
draft: false
prerelease: false
body_path: temp_changelog.md
- name: Upload arm64 apk
if: "contains(toJSON(github.event.ref_type), 'tag') && contains(toJSON(github.event.ref), 'iceraven')"
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: app/build/outputs/apk/fenix/forkRelease/app-fenix-arm64-v8a-forkRelease.apk
asset_name: ${{ github.event.ref }}-browser-arm64-v8a-forkRelease.apk
asset_content_type: application/vnd.android.package-archive
- name: Upload armeabi apk
if: "contains(toJSON(github.event.ref_type), 'tag') && contains(toJSON(github.event.ref), 'iceraven')"
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: app/build/outputs/apk/fenix/forkRelease/app-fenix-armeabi-v7a-forkRelease.apk
asset_name: ${{ github.event.ref }}-browser-armeabi-v7a-forkRelease.apk
asset_content_type: application/vnd.android.package-archive
- name: Upload x86 apk
if: "contains(toJSON(github.event.ref_type), 'tag') && contains(toJSON(github.event.ref), 'iceraven')"
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: app/build/outputs/apk/fenix/forkRelease/app-fenix-x86-forkRelease.apk
asset_name: ${{ github.event.ref }}-browser-x86-forkRelease.apk
asset_content_type: application/vnd.android.package-archive
- name: Upload x86_64 apk
if: "contains(toJSON(github.event.ref_type), 'tag') && contains(toJSON(github.event.ref), 'iceraven')"
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: app/build/outputs/apk/fenix/forkRelease/app-fenix-x86_64-forkRelease.apk
asset_name: ${{ github.event.ref }}-browser-x86_64-forkRelease.apk
asset_content_type: application/vnd.android.package-archive

File diff suppressed because it is too large Load Diff

View File

@ -1,156 +0,0 @@
Subject: [PATCH] name and icon
---
Index: app/build.gradle
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/app/build.gradle b/app/build.gradle
--- a/app/build.gradle (revision 4dca5f634ae61ddeead5fc3444c3ab692ad98536)
+++ b/app/build.gradle (revision 31c3e83236b2bd980d168f651af7a022b5e6a8b3)
@@ -31,7 +31,7 @@
}
defaultConfig {
- applicationId "io.github.forkmaintainers"
+ applicationId "com.leos"
minSdkVersion config.minSdkVersion
compileSdk config.compileSdkVersion
targetSdkVersion config.targetSdkVersion
@@ -159,15 +159,15 @@
forkDebug {
shrinkResources false
minifyEnabled false
- applicationIdSuffix ".iceraven.debug"
+ applicationIdSuffix ".leosium.debug"
pseudoLocalesEnabled true
// Need to replicate default debug config features
signingConfig signingConfigs.debug
debuggable true
- def deepLinkSchemeValue = "iceraven-debug"
+ def deepLinkSchemeValue = "leosium-debug"
buildConfigField "String", "DEEP_LINK_SCHEME", "\"$deepLinkSchemeValue\""
manifestPlaceholders.putAll([
- "sharedUserId": "io.github.forkmaintainers.iceraven.sharedID",
+ "sharedUserId": "io.github.forkmaintainers.leosium.sharedID",
"deepLinkScheme": deepLinkSchemeValue,
])
// Use custom default allowed addon list
@@ -178,11 +178,11 @@
}
forkRelease releaseTemplate >> {
buildConfigField "boolean", "USE_RELEASE_VERSIONING", "true"
- applicationIdSuffix ".iceraven"
- def deepLinkSchemeValue = "iceraven"
+ applicationIdSuffix ".leosium"
+ def deepLinkSchemeValue = "leosium"
buildConfigField "String", "DEEP_LINK_SCHEME", "\"$deepLinkSchemeValue\""
manifestPlaceholders.putAll([
- "sharedUserId": "io.github.forkmaintainers.iceraven.sharedID",
+ "sharedUserId": "io.github.forkmaintainers.leosium.sharedID",
"deepLinkScheme": deepLinkSchemeValue,
])
// Use custom default allowed addon list
Index: app/src/forkRelease/res/values/static_strings.xml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/app/src/forkRelease/res/values/static_strings.xml b/app/src/forkRelease/res/values/static_strings.xml
--- a/app/src/forkRelease/res/values/static_strings.xml (revision 4dca5f634ae61ddeead5fc3444c3ab692ad98536)
+++ b/app/src/forkRelease/res/values/static_strings.xml (revision 31c3e83236b2bd980d168f651af7a022b5e6a8b3)
@@ -4,5 +4,5 @@
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<resources>
<!-- Name of the application -->
- <string name="app_name" translatable="false">Iceraven</string>
+ <string name="app_name" translatable="false">LeOSium</string>
</resources>
Index: app/src/main/java/org/mozilla/fenix/settings/quicksettings/protections/cookiebanners/dialog/CookieBannerReEngagementDialogCompose.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/protections/cookiebanners/dialog/CookieBannerReEngagementDialogCompose.kt b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/protections/cookiebanners/dialog/CookieBannerReEngagementDialogCompose.kt
--- a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/protections/cookiebanners/dialog/CookieBannerReEngagementDialogCompose.kt (revision 4dca5f634ae61ddeead5fc3444c3ab692ad98536)
+++ b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/protections/cookiebanners/dialog/CookieBannerReEngagementDialogCompose.kt (revision 31c3e83236b2bd980d168f651af7a022b5e6a8b3)
@@ -42,7 +42,7 @@
private fun CookieBannerReEngagementDialogComposePreview() {
FirefoxTheme {
CookieBannerReEngagementDialogCompose(
- dialogTitle = "Allow Iceraven to reject cookie banners?",
+ dialogTitle = "Allow LeOSium to reject cookie banners?",
dialogText =
"Automatically reject cookie requests, when possible. Otherwise, " +
"accept all cookies to dismiss cookie banners.",
Index: app/src/main/res/values/static_strings.xml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/app/src/main/res/values/static_strings.xml b/app/src/main/res/values/static_strings.xml
--- a/app/src/main/res/values/static_strings.xml (revision 4dca5f634ae61ddeead5fc3444c3ab692ad98536)
+++ b/app/src/main/res/values/static_strings.xml (revision 31c3e83236b2bd980d168f651af7a022b5e6a8b3)
@@ -4,8 +4,8 @@
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<resources>
<!-- Name of the application -->
- <string name="app_name" translatable="false">Iceraven Fenix</string>
- <string name="firefox" translatable="false">Iceraven</string>
+ <string name="app_name" translatable="false">LeOSium</string>
+ <string name="firefox" translatable="false">LeOSium</string>
<!-- Preference for developers -->
<string name="preference_leakcanary" translatable="false">LeakCanary</string>
@@ -21,7 +21,7 @@
<!-- Default title for pinned Wikipedia top site that links to Wikipedia home page -->
<string name="default_top_site_wikipedia" translatable="false">Wikipedia</string>
<!-- Default title for pinned Google top site that links to Google home page -->
- <string name="default_top_site_google" translatable="false">Google</string>
+ <string name="default_top_site_google" translatable="false">Goolag</string>
<!-- Application Services abbreviation used in AboutFragment -->
<string name="app_services_abbreviation" translatable="false">AS</string>
<!-- Name for the Pocket product -->
@@ -59,17 +59,17 @@
<!-- Preference to override the Push server -->
<string name="preferences_override_push_server">Custom Push server</string>
<!-- Quit app button title for the Sync Debug preferences -->
- <string name="preferences_sync_debug_quit_button_title">Stop Firefox</string>
+ <string name="preferences_sync_debug_quit_button_title">Stop LeOSium</string>
<!-- Quit app button summary for the Sync Debug preferences -->
- <string name="preferences_sync_debug_quit_button_summary">Custom server changes will take effect on the next Firefox run.</string>
+ <string name="preferences_sync_debug_quit_button_summary">Custom server changes will take effect on the next LeOSium run.</string>
<!-- Label for enabling the Tabs Tray to Compose changes -->
<string name="preferences_debug_settings_tabs_tray_to_compose" translatable="false">Enable Tabs Tray to Compose rewrite</string>
<!-- Label for enabling the Compose Top Sites -->
<string name="preferences_debug_settings_compose_top_sites" translatable="false">Enable Compose Top Sites</string>
<!-- Label for enabling translations -->
- <string name="preferences_debug_settings_translations" translatable="false">Enable Firefox Translations</string>
+ <string name="preferences_debug_settings_translations" translatable="false">Enable LeOSium Translations</string>
<!-- Label for enabling Firefox Suggest -->
- <string name="preferences_debug_settings_fxsuggest" translatable="false">Enable Firefox Suggest</string>
+ <string name="preferences_debug_settings_fxsuggest" translatable="false">Enable LeOSium Suggest</string>
<!-- A secret menu option in the tabs tray for making a tab inactive for testing. -->
<string name="inactive_tabs_menu_item">Make inactive</string>
@@ -86,15 +86,15 @@
<string name="profiler_stop">Stop Profiler</string>
<string name="profiler_settings_title">Profiler Settings</string>
- <string name="profiler_filter_firefox">Firefox</string>
+ <string name="profiler_filter_firefox">LeOSium</string>
<string name="profiler_running">Profiler is currently running</string>
- <string name="profiler_filter_firefox_explain">Recommended preset for profiling Firefox</string>
+ <string name="profiler_filter_firefox_explain">Recommended preset for profiling LeOSium</string>
<string name="profiler_filter_graphics">Graphics</string>
- <string name="profiler_filter_graphics_explain">Preset for investigating graphics bugs in Firefox</string>
+ <string name="profiler_filter_graphics_explain">Preset for investigating graphics bugs in LeOSium</string>
<string name="profiler_filter_media">Media</string>
- <string name="profiler_filter_media_explain">Preset for investigating audio and video bugs in Firefox</string>
+ <string name="profiler_filter_media_explain">Preset for investigating audio and video bugs in LeOSium</string>
<string name="profiler_filter_networking">Networking</string>
- <string name="profiler_filter_networking_explain">Preset for investigating networking bugs in Firefox</string>
+ <string name="profiler_filter_networking_explain">Preset for investigating networking bugs in LeOSium</string>
<string name="profiler_start_dialog_started">Profiler started</string>

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -1,75 +0,0 @@
Subject: [PATCH] Homescreen Name change LeOSium
---
Index: app/src/main/res/values/strings.xml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
--- a/app/src/main/res/values/strings.xml (revision eadb87d91b869ff759556dafdc6c7388ddcdbab0)
+++ b/app/src/main/res/values/strings.xml (revision 46413d074bd41596719d59a4779eaf591f84af41)
@@ -301,7 +301,7 @@
<!-- Notification pre-permission dialog -->
<!-- Enable notification pre permission dialog title
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
- <string name="onboarding_home_enable_notifications_title">Notifications help you do more with %s</string>
+ <string name="onboarding_home_enable_notifications_title">Notifications help you do more with LeOSium</string>
<!-- Enable notification pre permission dialog description with rationale
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="onboarding_home_enable_notifications_description">Sync your tabs between devices, manage downloads, get tips about making the most of %ss privacy protection, and more.</string>
@@ -346,13 +346,13 @@
<string name="juno_onboarding_enable_notifications_title_nimbus" moz:removedIn="120" tools:ignore="UnusedResources">Notifications help you do more with LeOSium</string>
<!-- Title for enable notification permission screen used by Nimbus experiments. Nimbus experiments do not support string placeholders.
Note: The word "LeOSium" should NOT be translated -->
- <string name="juno_onboarding_enable_notifications_title_nimbus_2">Notifications help you stay safer with Firefox</string>
+ <string name="juno_onboarding_enable_notifications_title_nimbus_2">Notifications help you stay safer with LeOSium</string>
<!-- Description for enable notification permission screen used by Nimbus experiments. Nimbus experiments do not support string placeholders.
Note: The word "Firefox" should NOT be translated -->
<string name="juno_onboarding_enable_notifications_description_nimbus" moz:removedIn="120" tools:ignore="UnusedResources">Send tabs between devices, manage downloads, and get tips on getting the most out of LeOSium.</string>
<!-- Description for enable notification permission screen used by Nimbus experiments. Nimbus experiments do not support string placeholders.
Note: The word "Firefox" should NOT be translated -->
- <string name="juno_onboarding_enable_notifications_description_nimbus_2">Securely send tabs between your devices and discover other privacy features in Firefox.</string>
+ <string name="juno_onboarding_enable_notifications_description_nimbus_2">Securely send tabs between your devices and discover other privacy features in LeOSium.</string>
<!-- Text for the button to request notification permission on the device -->
<string name="juno_onboarding_enable_notifications_positive_button" tools:ignore="UnusedResources">Turn on notifications</string>
<!-- Text for the button dismiss the screen and move on with the flow -->
@@ -672,7 +672,7 @@
<!-- Title of the Nimbus message for add-ons general availability-->
<string name="addon_ga_message_title" tools:ignore="UnusedResources">New add-ons now available</string>
<!-- Body of the Nimbus message for add-ons general availability. 'Firefox' intentionally hardcoded here-->
- <string name="addon_ga_message_body" tools:ignore="UnusedResources">Check out 100+ new extensions that let you make Firefox your own.</string>
+ <string name="addon_ga_message_body" tools:ignore="UnusedResources">Check out 100+ new extensions that let you make LeOSium your own.</string>
<!-- Button text of the Nimbus message for add-ons general availability. -->
<string name="addon_ga_message_button" tools:ignore="UnusedResources">Explore add-ons</string>
@@ -738,7 +738,7 @@
<!-- Name of the "receive tabs" notification channel. Displayed in the "App notifications" system settings for the app -->
<string name="fxa_received_tab_channel_name">Received tabs</string>
<!-- Description of the "receive tabs" notification channel. Displayed in the "App notifications" system settings for the app -->
- <string name="fxa_received_tab_channel_description">Notifications for tabs received from other Firefox devices.</string>
+ <string name="fxa_received_tab_channel_description">Notifications for tabs received from other LeOSium devices.</string>
<!-- The body for these is the URL of the tab received -->
<string name="fxa_tab_received_notification_name">Tab Received</string>
<!-- %s is the device name -->
@@ -1302,10 +1302,10 @@
<string name="notification_marketing_channel_name">Marketing</string>
<!-- Title shown in the notification that pops up to remind the user to set fenix as default browser.
The app name is in the text, due to limitations with localizing Nimbus experiments -->
- <string name="nimbus_notification_default_browser_title" tools:ignore="UnusedResources">Firefox is fast and private</string>
+ <string name="nimbus_notification_default_browser_title" tools:ignore="UnusedResources">LeOSium is fast and private</string>
<!-- Text shown in the notification that pops up to remind the user to set fenix as default browser.
The app name is in the text, due to limitations with localizing Nimbus experiments -->
- <string name="nimbus_notification_default_browser_text" tools:ignore="UnusedResources">Make Firefox your default browser</string>
+ <string name="nimbus_notification_default_browser_text" tools:ignore="UnusedResources">Make LeOSium your default browser</string>
<!-- Title shown in the notification that pops up to re-engage the user -->
<string name="notification_re_engagement_title">Try private browsing</string>
<!-- Text shown in the notification that pops up to re-engage the user.
@@ -1324,7 +1324,7 @@
<!-- Survey -->
<!-- Text shown in the fullscreen message that pops up to ask user to take a short survey.
The app name is in the text, due to limitations with localizing Nimbus experiments -->
- <string name="nimbus_survey_message_text">Please help make Firefox better by taking a short survey.</string>
+ <string name="nimbus_survey_message_text">Please help make LeOSium better by taking a short survey.</string>
<!-- Preference for taking the short survey. -->
<string name="preferences_take_survey">Take Survey</string>
<!-- Preference for not taking the short survey. -->

File diff suppressed because it is too large Load Diff

View File

@ -1,40 +0,0 @@
Subject: [PATCH] mull changes
---
Index: android-components
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/android-components b/android-components
--- a/android-components (revision 74a70efef04b9054656ee084aea0d719dda2bfad)
+++ b/android-components (revision 17814c1db3be943336f191ead73b1c08f67e8b56)
@@ -1,1 +1,1 @@
-c16aea836d4ca3525cdb7d571d264d6c8d49c609
\ No newline at end of file
+5956319a9bbae9daedd519fcd60f435e8ccbbe37
\ No newline at end of file
Index: app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt b/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt
--- a/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt (revision 74a70efef04b9054656ee084aea0d719dda2bfad)
+++ b/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt (revision 17814c1db3be943336f191ead73b1c08f67e8b56)
@@ -116,7 +116,6 @@
@Suppress("ComplexMethod")
private fun coreMenuItems(): List<BrowserMenuItem> {
- val settings = context.components.settings
val bookmarksItem = BrowserMenuImageText(
context.getString(R.string.library_bookmarks),
@@ -228,7 +227,7 @@
helpItem,
customizeHomeItem,
settingsItem,
- if (settings.shouldDeleteBrowsingDataOnQuit) quitItem else null,
+ quitItem,
).also { items ->
items.getHighlight()?.let { onHighlightPresent(it) }
}

File diff suppressed because it is too large Load Diff

View File

@ -1,25 +0,0 @@
Subject: [PATCH] search changes
---
Index: components/feature/search/src/main/java/mozilla/components/feature/search/storage/SearchEngineReader.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/components/feature/search/src/main/java/mozilla/components/feature/search/storage/SearchEngineReader.kt b/components/feature/search/src/main/java/mozilla/components/feature/search/storage/SearchEngineReader.kt
--- a/components/feature/search/src/main/java/mozilla/components/feature/search/storage/SearchEngineReader.kt (revision 5956319a9bbae9daedd519fcd60f435e8ccbbe37)
+++ b/components/feature/search/src/main/java/mozilla/components/feature/search/storage/SearchEngineReader.kt (revision 9db93731521a490cd943a530870beaa308c64612)
@@ -39,13 +39,13 @@
"leit-is",
"coccoc",
"brave",
- "ddghtml",
"ddglite",
"metager",
"mojeek",
"qwantlite",
"startpage",
"baidu",
+ "leosearch"
)
/**

View File

@ -1,986 +0,0 @@
Subject: [PATCH] search changes
---
Index: android-components
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/android-components b/android-components
--- a/android-components (revision 17814c1db3be943336f191ead73b1c08f67e8b56)
+++ b/android-components (revision 47a15ec0995100b316f7a3ccf319c8d17b4633ca)
@@ -1,1 +1,1 @@
-5956319a9bbae9daedd519fcd60f435e8ccbbe37
\ No newline at end of file
+9db93731521a490cd943a530870beaa308c64612
\ No newline at end of file
Index: app/src/main/java/org/mozilla/fenix/utils/Settings.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt
--- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt (revision 17814c1db3be943336f191ead73b1c08f67e8b56)
+++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt (revision 47a15ec0995100b316f7a3ccf319c8d17b4633ca)
@@ -733,12 +733,12 @@
val useStandardTrackingProtection by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_tracking_protection_standard_option),
- true,
+ false,
)
val useStrictTrackingProtection by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_tracking_protection_strict_default),
- false,
+ true,
)
val useCustomTrackingProtection by booleanPreference(
Index: app/src/main/res/xml/tracking_protection_preferences.xml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/app/src/main/res/xml/tracking_protection_preferences.xml b/app/src/main/res/xml/tracking_protection_preferences.xml
--- a/app/src/main/res/xml/tracking_protection_preferences.xml (revision 17814c1db3be943336f191ead73b1c08f67e8b56)
+++ b/app/src/main/res/xml/tracking_protection_preferences.xml (revision 47a15ec0995100b316f7a3ccf319c8d17b4633ca)
@@ -16,13 +16,13 @@
android:title="@string/preference_enhanced_tracking_protection"
app:iconSpaceReserved="false" />
<org.mozilla.fenix.settings.RadioButtonInfoPreference
- android:defaultValue="true"
+ android:defaultValue="false"
android:dependency="@string/pref_key_tracking_protection"
android:key="@string/pref_key_tracking_protection_standard_option"
android:summary="@string/preference_enhanced_tracking_protection_standard_description_5"
android:title="@string/preference_enhanced_tracking_protection_standard_default_1" />
<org.mozilla.fenix.settings.RadioButtonInfoPreference
- android:defaultValue="false"
+ android:defaultValue="true"
android:dependency="@string/pref_key_tracking_protection"
android:key="@string/pref_key_tracking_protection_strict_default"
android:summary="@string/preference_enhanced_tracking_protection_strict_description_4"
Index: automation/iceraven/assets/list.json
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/automation/iceraven/assets/list.json b/automation/iceraven/assets/list.json
--- a/automation/iceraven/assets/list.json (revision 17814c1db3be943336f191ead73b1c08f67e8b56)
+++ b/automation/iceraven/assets/list.json (revision 47a15ec0995100b316f7a3ccf319c8d17b4633ca)
@@ -1,9 +1,9 @@
{
"default": {
- "searchDefault": "DuckDuckGo",
- "searchOrder": ["Google", "Bing"],
+ "searchDefault": "LeOSearch",
+ "searchOrder": ["ddg", "brave"],
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "wikipedia", "startpage", "brave"
]
},
"regionOverrides": {
@@ -12,49 +12,49 @@
"ach": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia", "startpage", "brave"
]
}
},
"an": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-an", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-an", "startpage", "brave"
]
}
},
"ar": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-ar", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "wikipedia-ar", "startpage", "brave"
]
}
},
"as": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-in", "ddg", "wikipedia-as", "startpage", "brave"
+ "leosearch", "bing", "amazon-in", "ddg", "wikipedia-as", "startpage", "brave"
]
}
},
"ast": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-ast", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "wikipedia-ast", "startpage", "brave"
]
}
},
"az": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "azerdict", "wikipedia-az", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "azerdict", "wikipedia-az", "startpage", "brave"
]
}
},
"be": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-be", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-be", "startpage", "brave"
]
},
"BY": {
@@ -81,133 +81,133 @@
"bg": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "pazaruvaj", "wikipedia-bg", "startpage", "brave"
+ "leosearch", "bing", "ddg", "pazaruvaj", "wikipedia-bg", "startpage", "brave"
]
}
},
"bn": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-bn", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-bn", "startpage", "brave"
]
}
},
"bn-BD": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-bn", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-bn", "startpage", "brave"
]
}
},
"bn-IN": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "rediff", "wikipedia-bn", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "rediff", "wikipedia-bn", "startpage", "brave"
]
}
},
"br": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-br", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-br", "startpage", "brave"
]
}
},
"bs": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-bs", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-bs", "startpage", "brave"
]
}
},
"ca": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "ddg", "wikipedia-ca", "startpage", "brave"
+ "leosearch", "ddg", "wikipedia-ca", "startpage", "brave"
]
}
},
"cak": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "amazondotcom", "ddg", "wikipedia-es", "startpage", "brave"
+ "leosearch", "amazondotcom", "ddg", "wikipedia-es", "startpage", "brave"
]
}
},
"cs": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "mapy-cz", "seznam-cz", "wikipedia-cz", "startpage", "brave"
+ "leosearch", "bing", "ddg", "mapy-cz", "seznam-cz", "wikipedia-cz", "startpage", "brave"
]
}
},
"cy": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-co-uk", "ddg", "wikipedia-cy", "startpage", "brave"
+ "leosearch", "bing", "amazon-co-uk", "ddg", "wikipedia-cy", "startpage", "brave"
]
}
},
"da": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "amazon-co-uk", "ddg", "wikipedia-da", "startpage", "brave"
+ "leosearch", "amazon-co-uk", "ddg", "wikipedia-da", "startpage", "brave"
]
}
},
"de": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-de", "ddg", "ecosia", "qwant", "wikipedia-de", "ebay-de", "startpage", "brave"
+ "leosearch", "bing", "amazon-de", "ddg", "ecosia", "qwant", "wikipedia-de", "ebay-de", "startpage", "brave"
]
}
},
"de-AT": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-de", "ddg", "ecosia", "qwant", "wikipedia-de", "ebay-at", "startpage", "brave"
+ "leosearch", "bing", "amazon-de", "ddg", "ecosia", "qwant", "wikipedia-de", "ebay-at", "startpage", "brave"
]
}
},
"dsb": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-de", "ddg", "wikipedia-dsb", "ebay-de", "startpage", "brave"
+ "leosearch", "bing", "amazon-de", "ddg", "wikipedia-dsb", "ebay-de", "startpage", "brave"
]
}
},
"el": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "skroutz", "wikipedia-el", "startpage", "brave"
+ "leosearch", "bing", "ddg", "skroutz", "wikipedia-el", "startpage", "brave"
]
}
},
"en-AU": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-au", "ddg", "wikipedia", "ebay-au", "startpage", "brave"
+ "leosearch", "bing", "amazon-au", "ddg", "wikipedia", "ebay-au", "startpage", "brave"
]
}
},
"en-CA": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-ca", "ddg", "wikipedia", "ebay-ca", "startpage", "brave"
+ "leosearch", "bing", "amazon-ca", "ddg", "wikipedia", "ebay-ca", "startpage", "brave"
]
}
},
"en-IE": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-co-uk", "ddg", "qwant", "wikipedia", "ebay-ie", "startpage", "brave"
+ "leosearch", "bing", "amazon-co-uk", "ddg", "qwant", "wikipedia", "ebay-ie", "startpage", "brave"
]
}
},
"en-GB": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-co-uk", "ddg", "qwant", "wikipedia", "ebay-co-uk", "startpage", "brave"
+ "leosearch", "bing", "amazon-co-uk", "ddg", "qwant", "wikipedia", "ebay-co-uk", "startpage", "brave"
]
},
"BY": {
@@ -234,7 +234,7 @@
"en-US": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "ebay", "wikipedia", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "ebay", "wikipedia", "startpage", "brave"
]
},
"BY": {
@@ -261,245 +261,245 @@
"en-ZA": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "ddg", "wikipedia", "startpage", "brave"
+ "leosearch", "ddg", "wikipedia", "startpage", "brave"
]
}
},
"eo": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "reta-vortaro", "wikipedia-eo", "startpage", "brave"
+ "leosearch", "bing", "ddg", "reta-vortaro", "wikipedia-eo", "startpage", "brave"
]
}
},
"es-AR": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "ddg", "mercadolibre-ar", "wikipedia-es", "startpage", "brave"
+ "leosearch", "ddg", "mercadolibre-ar", "wikipedia-es", "startpage", "brave"
]
}
},
"es-CL": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "mercadolibre-cl", "wikipedia-es", "startpage", "brave"
+ "leosearch", "bing", "ddg", "mercadolibre-cl", "wikipedia-es", "startpage", "brave"
]
}
},
"es-ES": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-es", "amazon-es", "ebay-es", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-es", "amazon-es", "ebay-es", "startpage", "brave"
]
}
},
"es-MX": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "mercadolibre-mx", "wikipedia-es", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "mercadolibre-mx", "wikipedia-es", "startpage", "brave"
]
}
},
"et": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "amazon-co-uk", "ddg", "wikipedia-et", "startpage", "brave"
+ "leosearch", "amazon-co-uk", "ddg", "wikipedia-et", "startpage", "brave"
]
}
},
"eu": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "elebila", "wikipedia-eu", "startpage", "brave"
+ "leosearch", "bing", "ddg", "elebila", "wikipedia-eu", "startpage", "brave"
]
}
},
"fa": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-fa", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-fa", "startpage", "brave"
]
}
},
"ff": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-fr", "ddg", "wikipedia-fr", "startpage", "brave"
+ "leosearch", "bing", "amazon-fr", "ddg", "wikipedia-fr", "startpage", "brave"
]
}
},
"fi": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "amazondotcom", "ddg", "wikipedia-fi", "startpage", "brave"
+ "leosearch", "amazondotcom", "ddg", "wikipedia-fi", "startpage", "brave"
]
}
},
"fr-BE": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "qwant", "wikipedia-fr", "ebay-befr", "startpage", "brave"
+ "leosearch", "bing", "ddg", "qwant", "wikipedia-fr", "ebay-befr", "startpage", "brave"
]
}
},
"fr-CA": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-ca", "ddg", "wikipedia-fr", "ebay-ca", "startpage", "brave"
+ "leosearch", "bing", "amazon-ca", "ddg", "wikipedia-fr", "ebay-ca", "startpage", "brave"
]
}
},
"fr-FR": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "qwant", "wikipedia-fr", "amazon-fr", "ebay-fr", "startpage", "brave"
+ "leosearch", "bing", "ddg", "qwant", "wikipedia-fr", "amazon-fr", "ebay-fr", "startpage", "brave"
]
}
},
"fr": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "qwant", "wikipedia-fr", "startpage", "brave"
+ "leosearch", "bing", "ddg", "qwant", "wikipedia-fr", "startpage", "brave"
]
}
},
"fy-NL": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "ddg", "wikipedia-fy-NL", "startpage", "brave"
+ "leosearch", "ddg", "wikipedia-fy-NL", "startpage", "brave"
]
}
},
"ga-IE": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "amazon-co-uk", "ddg", "wikipedia-ga-IE", "startpage", "brave"
+ "leosearch", "amazon-co-uk", "ddg", "wikipedia-ga-IE", "startpage", "brave"
]
}
},
"gd": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "faclair-beag", "wikipedia-gd", "startpage", "brave"
+ "leosearch", "bing", "ddg", "faclair-beag", "wikipedia-gd", "startpage", "brave"
]
}
},
"gl": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-gl", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "wikipedia-gl", "startpage", "brave"
]
}
},
"gn": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-gn", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "wikipedia-gn", "startpage", "brave"
]
}
},
"gu-IN": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-in", "ddg", "wikipedia-gu", "startpage", "brave"
+ "leosearch", "bing", "amazon-in", "ddg", "wikipedia-gu", "startpage", "brave"
]
}
},
"he": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-he", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "wikipedia-he", "startpage", "brave"
]
}
},
"hi-IN": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-in", "ddg", "wikipedia-hi", "startpage", "brave"
+ "leosearch", "bing", "amazon-in", "ddg", "wikipedia-hi", "startpage", "brave"
]
}
},
"hr": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-co-uk", "ddg", "wikipedia-hr", "startpage", "brave"
+ "leosearch", "bing", "amazon-co-uk", "ddg", "wikipedia-hr", "startpage", "brave"
]
}
},
"hsb": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-de", "ddg", "wikipedia-hsb", "ebay-de", "startpage", "brave"
+ "leosearch", "bing", "amazon-de", "ddg", "wikipedia-hsb", "ebay-de", "startpage", "brave"
]
}
},
"hu": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "ddg", "sztaki-en-hu", "vatera", "wikipedia-hu", "startpage", "brave"
+ "leosearch", "ddg", "sztaki-en-hu", "vatera", "wikipedia-hu", "startpage", "brave"
]
}
},
"hy-AM": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-hy-AM", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "wikipedia-hy-AM", "startpage", "brave"
]
}
},
"ia": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-ia", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "wikipedia-ia", "startpage", "brave"
]
}
},
"id": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-id", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-id", "startpage", "brave"
]
}
},
"is": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "leit-is", "wikipedia-is", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "leit-is", "wikipedia-is", "startpage", "brave"
]
}
},
"it": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-it", "amazon-it", "ebay-it", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-it", "amazon-it", "ebay-it", "startpage", "brave"
]
}
},
"ja": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "amazon-jp", "bing", "ddg", "wikipedia-ja", "yahoo-jp", "startpage", "brave"
+ "leosearch", "amazon-jp", "bing", "ddg", "wikipedia-ja", "yahoo-jp", "startpage", "brave"
]
}
},
"ka": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-ka", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "wikipedia-ka", "startpage", "brave"
]
}
},
"kab": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-kab", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-kab", "startpage", "brave"
]
}
},
"kk": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-kk", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-kk", "startpage", "brave"
]
},
"KZ": {
@@ -526,203 +526,203 @@
"km": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-km", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "wikipedia-km", "startpage", "brave"
]
}
},
"kn": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-in", "ddg", "wikipedia-kn", "wiktionary-kn", "startpage", "brave"
+ "leosearch", "bing", "amazon-in", "ddg", "wikipedia-kn", "wiktionary-kn", "startpage", "brave"
]
}
},
"ko": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "ddg", "danawa-kr", "daum-kr", "startpage", "brave"
+ "leosearch", "ddg", "danawa-kr", "daum-kr", "startpage", "brave"
]
}
},
"lij": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-it", "ddg", "wikipedia-lij", "ebay-it", "startpage", "brave"
+ "leosearch", "bing", "amazon-it", "ddg", "wikipedia-lij", "ebay-it", "startpage", "brave"
]
}
},
"lo": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-lo", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-lo", "startpage", "brave"
]
}
},
"lt": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "ddg", "wikipedia-lt", "startpage", "brave"
+ "leosearch", "ddg", "wikipedia-lt", "startpage", "brave"
]
}
},
"ltg": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-co-uk", "wikipedia-ltg", "startpage", "brave"
+ "leosearch", "bing", "amazon-co-uk", "wikipedia-ltg", "startpage", "brave"
]
}
},
"lv": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "ddg", "salidzinilv", "wikipedia-lv", "startpage", "brave"
+ "leosearch", "ddg", "salidzinilv", "wikipedia-lv", "startpage", "brave"
]
}
},
"mai": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-in", "ddg", "wikipedia-hi", "startpage", "brave"
+ "leosearch", "bing", "amazon-in", "ddg", "wikipedia-hi", "startpage", "brave"
]
}
},
"meh": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-es", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "wikipedia-es", "startpage", "brave"
]
}
},
"mix": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-es", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "wikipedia-es", "startpage", "brave"
]
}
},
"ml": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-ml", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-ml", "startpage", "brave"
]
}
},
"mr": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-in", "ddg", "rediff", "wikipedia-mr", "startpage", "brave"
+ "leosearch", "bing", "amazon-in", "ddg", "rediff", "wikipedia-mr", "startpage", "brave"
]
}
},
"ms": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-ms", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "wikipedia-ms", "startpage", "brave"
]
}
},
"my": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-my", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "wikipedia-my", "startpage", "brave"
]
}
},
"nb-NO": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "ddg", "gulesider-mobile-NO", "wikipedia-NO", "startpage", "brave"
+ "leosearch", "ddg", "gulesider-mobile-NO", "wikipedia-NO", "startpage", "brave"
]
}
},
"ne-NP": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-ne", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-ne", "startpage", "brave"
]
}
},
"nl-NL": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-nl", "amazon-nl", "ebay-nl", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-nl", "amazon-nl", "ebay-nl", "startpage", "brave"
]
}
},
"nl": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-nl", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-nl", "startpage", "brave"
]
}
},
"nn-NO": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "ddg", "gulesider-mobile-NO", "wikipedia-NN", "startpage", "brave"
+ "leosearch", "ddg", "gulesider-mobile-NO", "wikipedia-NN", "startpage", "brave"
]
}
},
"oc": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-oc", "wiktionary-oc", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-oc", "wiktionary-oc", "startpage", "brave"
]
}
},
"or": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-in", "ddg", "wikipedia-or", "wiktionary-or", "startpage", "brave"
+ "leosearch", "bing", "amazon-in", "ddg", "wikipedia-or", "wiktionary-or", "startpage", "brave"
]
}
},
"pa-IN": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-pa", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-pa", "startpage", "brave"
]
}
},
"pl": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-pl", "ebay-pl", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-pl", "ebay-pl", "startpage", "brave"
]
}
},
"pt-BR": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-pt", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-pt", "startpage", "brave"
]
}
},
"pt-PT": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "ddg", "wikipedia-pt", "startpage", "brave"
+ "leosearch", "ddg", "wikipedia-pt", "startpage", "brave"
]
}
},
"rm": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "leo_ende_de", "pledarigrond", "wikipedia-rm", "startpage", "brave"
+ "leosearch", "bing", "ddg", "leo_ende_de", "pledarigrond", "wikipedia-rm", "startpage", "brave"
]
}
},
"ro": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "ddg", "wikipedia-ro", "startpage", "brave"
+ "leosearch", "ddg", "wikipedia-ro", "startpage", "brave"
]
}
},
"ru": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "ddg", "wikipedia-ru", "startpage", "brave"
+ "leosearch", "ddg", "wikipedia-ru", "startpage", "brave"
]
},
"RU": {
@@ -749,77 +749,77 @@
"sk": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "ddg", "slovnik-sk", "wikipedia-sk", "startpage", "brave"
+ "leosearch", "ddg", "slovnik-sk", "wikipedia-sk", "startpage", "brave"
]
}
},
"sl": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "ddg", "ceneje", "odpiralni", "wikipedia-sl", "startpage", "brave"
+ "leosearch", "ddg", "ceneje", "odpiralni", "wikipedia-sl", "startpage", "brave"
]
}
},
"son": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "ddg", "bing", "amazon-fr", "wikipedia-fr", "startpage", "brave"
+ "leosearch", "ddg", "bing", "amazon-fr", "wikipedia-fr", "startpage", "brave"
]
}
},
"sq": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-co-uk", "ddg", "wikipedia-sq", "startpage", "brave"
+ "leosearch", "bing", "amazon-co-uk", "ddg", "wikipedia-sq", "startpage", "brave"
]
}
},
"sr": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-sr", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-sr", "startpage", "brave"
]
}
},
"sv-SE": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "prisjakt-sv-SE", "ddg", "wikipedia-sv-SE", "amazon-se", "ebay-ch", "startpage", "brave"
+ "leosearch", "prisjakt-sv-SE", "ddg", "wikipedia-sv-SE", "amazon-se", "ebay-ch", "startpage", "brave"
]
}
},
"ta": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-in", "ddg", "wikipedia-ta", "wiktionary-ta", "startpage", "brave"
+ "leosearch", "bing", "amazon-in", "ddg", "wikipedia-ta", "wiktionary-ta", "startpage", "brave"
]
}
},
"te": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-in", "ddg", "wikipedia-te", "wiktionary-te", "startpage", "brave"
+ "leosearch", "bing", "amazon-in", "ddg", "wikipedia-te", "wiktionary-te", "startpage", "brave"
]
}
},
"th": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "ddg", "wikipedia-th", "startpage", "brave"
+ "leosearch", "ddg", "wikipedia-th", "startpage", "brave"
]
}
},
"tl": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "startpage", "brave"
]
}
},
"tr": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "ddg", "wikipedia-tr", "startpage", "brave"
+ "leosearch", "ddg", "wikipedia-tr", "startpage", "brave"
]
},
"TR": {
@@ -846,70 +846,70 @@
"trs": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-es", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "wikipedia-es", "startpage", "brave"
]
}
},
"uk": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "ddg", "wikipedia-uk", "startpage", "brave"
+ "leosearch", "ddg", "wikipedia-uk", "startpage", "brave"
]
}
},
"ur": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazon-in", "ddg", "wikipedia-ur", "startpage", "brave"
+ "leosearch", "bing", "amazon-in", "ddg", "wikipedia-ur", "startpage", "brave"
]
}
},
"uz": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-uz", "startpage", "brave"
+ "leosearch", "bing", "amazondotcom", "ddg", "wikipedia-uz", "startpage", "brave"
]
}
},
"vi": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "coccoc", "ddg", "wikipedia-vi", "startpage", "brave"
+ "leosearch", "coccoc", "ddg", "wikipedia-vi", "startpage", "brave"
]
}
},
"wo": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-wo", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-wo", "startpage", "brave"
]
}
},
"xh": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia", "startpage", "brave"
]
}
},
"zam": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-es", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-es", "startpage", "brave"
]
}
},
"zh-CN": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "baidu", "bing", "ddg", "wikipedia-zh-CN", "startpage", "brave"
+ "leosearch", "baidu", "bing", "ddg", "wikipedia-zh-CN", "startpage", "brave"
]
}
},
"zh-TW": {
"default": {
"visibleDefaultEngines": [
- "google-b-m", "bing", "ddg", "wikipedia-zh-TW", "startpage", "brave"
+ "leosearch", "bing", "ddg", "wikipedia-zh-TW", "startpage", "brave"
]
}
}

File diff suppressed because one or more lines are too long

112813
013-x.patch

File diff suppressed because it is too large Load Diff

View File

@ -1,15 +0,0 @@
Subject: [PATCH] x
---
Index: blobs.sh
===================================================================
diff --git a/blobs.sh b/blobs.sh
deleted file mode 100644
--- a/blobs.sh (revision c577fca8445181a70382fe6c12544a47d5092b92)
+++ /dev/null (revision c577fca8445181a70382fe6c12544a47d5092b92)
@@ -1,6 +0,0 @@
-sed -i \
- -e '/Deps.mozilla_lib_push_firebase/d' \
- -e '/Deps.adjust/d; /Deps.installreferrer/d; /Deps.google_ads_id/d' \
- -e '/Deps.google_play_store/d' \
- app/build.gradle
-

View File

@ -1,9 +0,0 @@
Subject: [PATCH] x
---
diff --git a/app/src/main/res.tar.gz b/app/src/main/res.tar.gz
deleted file mode 100644
index e7b09525829f66e1cfb9c04c03ea1c3a9a2615f7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001

View File

@ -1,997 +0,0 @@
Subject: [PATCH] v120
---
Index: fenix-liberate.patch
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/fenix-liberate.patch b/fenix-liberate.patch
new file mode 100644
--- /dev/null (revision 2d11da25be368a0d5b2a0cf89e09aa073fcb0cd0)
+++ b/fenix-liberate.patch (revision 2d11da25be368a0d5b2a0cf89e09aa073fcb0cd0)
@@ -0,0 +1,985 @@
+diff --git a/fenix/app/build.gradle b/fenix/app/build.gradle
+index 78d698dad9..0fbf4cb1cf 100644
+--- a/fenix/app/build.gradle
++++ b/fenix/app/build.gradle
+@@ -576,7 +576,6 @@ dependencies {
+
+ implementation project(':lib-crash')
+ implementation project(':lib-crash-sentry')
+- implementation project(':lib-push-firebase')
+ implementation project(':lib-state')
+ implementation project(':lib-dataprotect')
+
+@@ -615,15 +614,6 @@ dependencies {
+ implementation FenixDependencies.protobuf_javalite
+ implementation ComponentsDependencies.google_material
+
+- implementation FenixDependencies.adjust
+- implementation FenixDependencies.installreferrer // Required by Adjust
+-
+- implementation FenixDependencies.google_ads_id // Required for the Google Advertising ID
+-
+- // Required for in-app reviews
+- implementation FenixDependencies.google_play_review
+- implementation FenixDependencies.google_play_review_ktx
+-
+ implementation FenixDependencies.androidx_profileinstaller
+
+ androidTestImplementation ComponentsDependencies.androidx_test_uiautomator
+diff --git a/fenix/app/proguard-rules.pro b/fenix/app/proguard-rules.pro
+index e269f65775..e870f06bef 100644
+--- a/fenix/app/proguard-rules.pro
++++ b/fenix/app/proguard-rules.pro
+@@ -1,22 +1,5 @@
+ -dontobfuscate
+
+-####################################################################################################
+-# Sentry
+-####################################################################################################
+-
+-# Recommended config via https://docs.sentry.io/clients/java/modules/android/#manual-integration
+-# Since we don't obfuscate, we don't need to use their Gradle plugin to upload ProGuard mappings.
+--keepattributes LineNumberTable,SourceFile
+--dontwarn org.slf4j.**
+--dontwarn javax.**
+-
+-# Our addition: this class is saved to disk via Serializable, which ProGuard doesn't like.
+-# If we exclude this, upload silently fails (Sentry swallows a NPE so we don't crash).
+-# I filed https://github.com/getsentry/sentry-java/issues/572
+-#
+-# If Sentry ever mysteriously stops working after we upgrade it, this could be why.
+--keep class io.sentry.event.Event { *; }
+-
+ ####################################################################################################
+ # Android and GeckoView built-ins
+ ####################################################################################################
+@@ -69,58 +52,6 @@
+
+ -keep class org.mozilla.fenix.**ViewModel { *; }
+
+-####################################################################################################
+-# Adjust
+-####################################################################################################
+-
+--keep public class com.adjust.sdk.** { *; }
+--keep class com.google.android.gms.common.ConnectionResult {
+- int SUCCESS;
+-}
+--keep class com.google.android.gms.ads.identifier.AdvertisingIdClient {
+- com.google.android.gms.ads.identifier.AdvertisingIdClient$Info getAdvertisingIdInfo(android.content.Context);
+-}
+--keep class com.google.android.gms.ads.identifier.AdvertisingIdClient$Info {
+- java.lang.String getId();
+- boolean isLimitAdTrackingEnabled();
+-}
+--keep public class com.android.installreferrer.** { *; }
+--keep class dalvik.system.VMRuntime {
+- java.lang.String getRuntime();
+-}
+--keep class android.os.Build {
+- java.lang.String[] SUPPORTED_ABIS;
+- java.lang.String CPU_ABI;
+-}
+--keep class android.content.res.Configuration {
+- android.os.LocaledList getLocales();
+- java.util.Locale locale;
+-}
+--keep class android.os.LocaleList {
+- java.util.Locale get(int);
+-}
+-
+-# Keep code generated from Glean Metrics
+--keep class org.mozilla.fenix.GleanMetrics.** { *; }
+-
+-# Keep motionlayout internal methods
+-# https://github.com/mozilla-mobile/fenix/issues/2094
+--keep class androidx.constraintlayout.** { *; }
+-
+-# Keep adjust relevant classes
+--keep class com.adjust.sdk.** { *; }
+--keep class com.google.android.gms.common.ConnectionResult {
+- int SUCCESS;
+-}
+--keep class com.google.android.gms.ads.identifier.AdvertisingIdClient {
+- com.google.android.gms.ads.identifier.AdvertisingIdClient$Info getAdvertisingIdInfo(android.content.Context);
+-}
+--keep class com.google.android.gms.ads.identifier.AdvertisingIdClient$Info {
+- java.lang.String getId();
+- boolean isLimitAdTrackingEnabled();
+-}
+--keep public class com.android.installreferrer.** { *; }
+-
+ # Keep Android Lifecycle methods
+ # https://bugzilla.mozilla.org/show_bug.cgi?id=1596302
+ -keep class androidx.lifecycle.** { *; }
+diff --git a/fenix/app/src/main/java/com/adjust/sdk/Adjust.java b/fenix/app/src/main/java/com/adjust/sdk/Adjust.java
+new file mode 100644
+index 0000000000..7e644e2fa2
+--- /dev/null
++++ b/fenix/app/src/main/java/com/adjust/sdk/Adjust.java
+@@ -0,0 +1,44 @@
++/*
++ * Copyright (c) 2012-2017 adjust GmbH,
++ * http://www.adjust.com
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining
++ * a copy of this software and associated documentation files (the
++ * "Software"), to deal in the Software without restriction, including
++ * without limitation the rights to use, copy, modify, merge, publish,
++ * distribute, sublicense, and/or sell copies of the Software, and to
++ * permit persons to whom the Software is furnished to do so, subject to
++ * the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be
++ * included in all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
++ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
++ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
++ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
++ */
++
++package com.adjust.sdk;
++
++import android.content.Context;
++
++public class Adjust {
++ public static void onCreate(AdjustConfig adjustConfig) {
++ }
++
++ public static void onResume() {
++ }
++
++ public static void onPause() {
++ }
++
++ public static void setEnabled(boolean enabled) {
++ }
++
++ public static void gdprForgetMe(final Context context) {
++ }
++}
+diff --git a/fenix/app/src/main/java/com/adjust/sdk/AdjustAttribution.java b/fenix/app/src/main/java/com/adjust/sdk/AdjustAttribution.java
+new file mode 100644
+index 0000000000..ab6b3badbd
+--- /dev/null
++++ b/fenix/app/src/main/java/com/adjust/sdk/AdjustAttribution.java
+@@ -0,0 +1,49 @@
++/*
++ * Copyright (c) 2012-2017 adjust GmbH,
++ * http://www.adjust.com
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining
++ * a copy of this software and associated documentation files (the
++ * "Software"), to deal in the Software without restriction, including
++ * without limitation the rights to use, copy, modify, merge, publish,
++ * distribute, sublicense, and/or sell copies of the Software, and to
++ * permit persons to whom the Software is furnished to do so, subject to
++ * the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be
++ * included in all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
++ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
++ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
++ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
++ */
++
++package com.adjust.sdk;
++
++import java.io.Serializable;
++
++public class AdjustAttribution implements Serializable {
++ public String network;
++ public String campaign;
++ public String adgroup;
++ public String creative;
++
++ @Override
++ public boolean equals(Object other) {
++ return false;
++ }
++
++ @Override
++ public int hashCode() {
++ return 0;
++ }
++
++ @Override
++ public String toString() {
++ return "";
++ }
++}
+diff --git a/fenix/app/src/main/java/com/adjust/sdk/AdjustConfig.java b/fenix/app/src/main/java/com/adjust/sdk/AdjustConfig.java
+new file mode 100644
+index 0000000000..6753dd7d9f
+--- /dev/null
++++ b/fenix/app/src/main/java/com/adjust/sdk/AdjustConfig.java
+@@ -0,0 +1,46 @@
++/*
++ * Copyright (c) 2012-2017 adjust GmbH,
++ * http://www.adjust.com
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining
++ * a copy of this software and associated documentation files (the
++ * "Software"), to deal in the Software without restriction, including
++ * without limitation the rights to use, copy, modify, merge, publish,
++ * distribute, sublicense, and/or sell copies of the Software, and to
++ * permit persons to whom the Software is furnished to do so, subject to
++ * the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be
++ * included in all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
++ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
++ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
++ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
++ */
++
++package com.adjust.sdk;
++
++import android.content.Context;
++
++import java.util.List;
++
++public class AdjustConfig {
++ public static final String ENVIRONMENT_SANDBOX = "sandbox";
++ public static final String ENVIRONMENT_PRODUCTION = "production";
++
++ public AdjustConfig(Context context, String appToken, String environment) {
++ }
++
++ public AdjustConfig(Context context, String appToken, String environment, boolean allowSuppressLogLevel) {
++ }
++
++ public void setOnAttributionChangedListener(OnAttributionChangedListener onAttributionChangedListener) {
++ }
++
++ public void setLogLevel(LogLevel logLevel) {
++ }
++}
+diff --git a/fenix/app/src/main/java/com/adjust/sdk/LogLevel.java b/fenix/app/src/main/java/com/adjust/sdk/LogLevel.java
+new file mode 100644
+index 0000000000..27ac3de544
+--- /dev/null
++++ b/fenix/app/src/main/java/com/adjust/sdk/LogLevel.java
+@@ -0,0 +1,43 @@
++/*
++ * Copyright (c) 2012-2017 adjust GmbH,
++ * http://www.adjust.com
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining
++ * a copy of this software and associated documentation files (the
++ * "Software"), to deal in the Software without restriction, including
++ * without limitation the rights to use, copy, modify, merge, publish,
++ * distribute, sublicense, and/or sell copies of the Software, and to
++ * permit persons to whom the Software is furnished to do so, subject to
++ * the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be
++ * included in all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
++ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
++ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
++ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
++ */
++
++package com.adjust.sdk;
++
++import android.util.Log;
++
++/**
++ * Created by pfms on 11/03/15.
++ */
++public enum LogLevel {
++ VERBOSE(Log.VERBOSE), DEBUG(Log.DEBUG), INFO(Log.INFO), WARN(Log.WARN), ERROR(Log.ERROR), ASSERT(Log.ASSERT), SUPRESS(8);
++ final int androidLogLevel;
++
++ LogLevel(final int androidLogLevel) {
++ this.androidLogLevel = androidLogLevel;
++ }
++
++ public int getAndroidLogLevel() {
++ return androidLogLevel;
++ }
++}
+diff --git a/fenix/app/src/main/java/com/adjust/sdk/OnAttributionChangedListener.java b/fenix/app/src/main/java/com/adjust/sdk/OnAttributionChangedListener.java
+new file mode 100644
+index 0000000000..7efa1c6804
+--- /dev/null
++++ b/fenix/app/src/main/java/com/adjust/sdk/OnAttributionChangedListener.java
+@@ -0,0 +1,29 @@
++/*
++ * Copyright (c) 2012-2017 adjust GmbH,
++ * http://www.adjust.com
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining
++ * a copy of this software and associated documentation files (the
++ * "Software"), to deal in the Software without restriction, including
++ * without limitation the rights to use, copy, modify, merge, publish,
++ * distribute, sublicense, and/or sell copies of the Software, and to
++ * permit persons to whom the Software is furnished to do so, subject to
++ * the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be
++ * included in all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
++ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
++ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
++ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
++ */
++
++package com.adjust.sdk;
++
++public interface OnAttributionChangedListener {
++ void onAttributionChanged(AdjustAttribution attribution);
++}
+diff --git a/fenix/app/src/main/java/com/google/android/gms/ads/identifier/AdvertisingIdClient.java b/fenix/app/src/main/java/com/google/android/gms/ads/identifier/AdvertisingIdClient.java
+new file mode 100644
+index 0000000000..0f2a47b141
+--- /dev/null
++++ b/fenix/app/src/main/java/com/google/android/gms/ads/identifier/AdvertisingIdClient.java
+@@ -0,0 +1,23 @@
++/* This Source Code Form is subject to the terms of the Mozilla Public
++ * License, v. 2.0. If a copy of the MPL was not distributed with this
++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
++
++package com.google.android.gms.ads.identifier;
++
++import android.content.Context;
++
++public class AdvertisingIdClient {
++
++ public static final class Info {
++
++ public String getId() {
++ return "";
++ }
++
++ }
++
++ public static Info getAdvertisingIdInfo(Context context) {
++ return new Info();
++ }
++
++}
+diff --git a/fenix/app/src/main/java/com/google/android/gms/common/GooglePlayServicesNotAvailableException.java b/fenix/app/src/main/java/com/google/android/gms/common/GooglePlayServicesNotAvailableException.java
+new file mode 100644
+index 0000000000..d3bff12497
+--- /dev/null
++++ b/fenix/app/src/main/java/com/google/android/gms/common/GooglePlayServicesNotAvailableException.java
+@@ -0,0 +1,8 @@
++/* This Source Code Form is subject to the terms of the Mozilla Public
++ * License, v. 2.0. If a copy of the MPL was not distributed with this
++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
++
++package com.google.android.gms.common;
++
++public class GooglePlayServicesNotAvailableException extends Exception {
++}
+diff --git a/fenix/app/src/main/java/com/google/android/gms/common/GooglePlayServicesRepairableException.java b/fenix/app/src/main/java/com/google/android/gms/common/GooglePlayServicesRepairableException.java
+new file mode 100644
+index 0000000000..b72a7cdb16
+--- /dev/null
++++ b/fenix/app/src/main/java/com/google/android/gms/common/GooglePlayServicesRepairableException.java
+@@ -0,0 +1,8 @@
++/* This Source Code Form is subject to the terms of the Mozilla Public
++ * License, v. 2.0. If a copy of the MPL was not distributed with this
++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
++
++package com.google.android.gms.common;
++
++public class GooglePlayServicesRepairableException extends Exception {
++}
+diff --git a/fenix/app/src/main/java/com/google/firebase/messaging/FirebaseMessagingService.java b/fenix/app/src/main/java/com/google/firebase/messaging/FirebaseMessagingService.java
+new file mode 100644
+index 0000000000..4d5fd8153d
+--- /dev/null
++++ b/fenix/app/src/main/java/com/google/firebase/messaging/FirebaseMessagingService.java
+@@ -0,0 +1,42 @@
++// Copyright 2020 Google LLC
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++//
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing, software
++// distributed under the License is distributed on an "AS IS" BASIS,
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++// See the License for the specific language governing permissions and
++// limitations under the License.
++package com.google.firebase.messaging;
++
++import android.app.Service;
++import android.content.Intent;
++import android.os.Binder;
++import android.os.IBinder;
++
++public class FirebaseMessagingService extends Service {
++
++ private final IBinder mBinder = new Binder();
++
++ public void onMessageReceived(RemoteMessage message) {
++ }
++
++ public void onMessageSent(String msgId) {
++ }
++
++ public void onNewToken(String token) {
++ }
++
++ public void onSendError(String msgId, Exception exception) {
++ }
++
++ @Override
++ public IBinder onBind(Intent intent) {
++ return mBinder;
++ }
++
++}
+diff --git a/fenix/app/src/main/java/com/google/firebase/messaging/RemoteMessage.java b/fenix/app/src/main/java/com/google/firebase/messaging/RemoteMessage.java
+new file mode 100644
+index 0000000000..9ad59a31e4
+--- /dev/null
++++ b/fenix/app/src/main/java/com/google/firebase/messaging/RemoteMessage.java
+@@ -0,0 +1,33 @@
++// Copyright 2020 Google LLC
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++//
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing, software
++// distributed under the License is distributed on an "AS IS" BASIS,
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++// See the License for the specific language governing permissions and
++// limitations under the License.
++package com.google.firebase.messaging;
++
++import android.os.Parcel;
++import android.os.Parcelable;
++import java.util.Map;
++
++public class RemoteMessage implements Parcelable {
++
++ public int describeContents() {
++ return 0;
++ }
++
++ public void writeToParcel(Parcel out, int flags) {
++ }
++
++ public Map<String, String> getData() {
++ return null;
++ }
++
++}
+diff --git a/fenix/app/src/main/java/mozilla/components/lib/push/firebase/AbstractFirebasePushService.kt b/fenix/app/src/main/java/mozilla/components/lib/push/firebase/AbstractFirebasePushService.kt
+new file mode 100644
+index 0000000000..b50a6f03a2
+--- /dev/null
++++ b/fenix/app/src/main/java/mozilla/components/lib/push/firebase/AbstractFirebasePushService.kt
+@@ -0,0 +1,32 @@
++/* This Source Code Form is subject to the terms of the Mozilla Public
++ * License, v. 2.0. If a copy of the MPL was not distributed with this
++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
++
++package mozilla.components.lib.push.firebase
++
++import android.content.Context
++import com.google.firebase.messaging.FirebaseMessagingService
++import com.google.firebase.messaging.RemoteMessage
++import mozilla.components.concept.push.PushService
++
++abstract class AbstractFirebasePushService() : FirebaseMessagingService(), PushService {
++
++ override fun start(context: Context) {
++ }
++
++ override fun onNewToken(newToken: String) {
++ }
++
++ override fun onMessageReceived(remoteMessage: RemoteMessage?) {
++ }
++
++ final override fun stop() {
++ }
++
++ override fun deleteToken() {
++ }
++
++ override fun isServiceAvailable(context: Context): Boolean {
++ return false
++ }
++}
+diff --git a/fenix/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/fenix/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt
+index d3d63c17b9..7228e67716 100644
+--- a/fenix/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt
++++ b/fenix/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt
+@@ -18,7 +18,7 @@ object FeatureFlags {
+ * This feature does not only depend on this flag. It requires the AMO collection override to
+ * be enabled which is behind the Secret Settings.
+ * */
+- val customExtensionCollectionFeature = Config.channel.isNightlyOrDebug || Config.channel.isBeta
++ val customExtensionCollectionFeature = true
+
+ /**
+ * Pull-to-refresh allows you to pull the web content down far enough to have the page to
+@@ -37,7 +37,7 @@ object FeatureFlags {
+ fun isPocketRecommendationsFeatureEnabled(context: Context): Boolean {
+ val langTag = LocaleManager.getCurrentLocale(context)
+ ?.toLanguageTag() ?: getSystemDefault().toLanguageTag()
+- return listOf("en-US", "en-CA").contains(langTag)
++ return false && listOf("en-US", "en-CA").contains(langTag)
+ }
+
+ /**
+diff --git a/fenix/app/src/main/java/org/mozilla/fenix/components/Analytics.kt b/fenix/app/src/main/java/org/mozilla/fenix/components/Analytics.kt
+index 3cd954a5bb..31f4e6fe34 100644
+--- a/fenix/app/src/main/java/org/mozilla/fenix/components/Analytics.kt
++++ b/fenix/app/src/main/java/org/mozilla/fenix/components/Analytics.kt
+@@ -137,11 +137,7 @@ class Analytics(
+ MetricController.create(
+ listOf(
+ GleanMetricsService(context),
+- AdjustMetricsService(
+- application = context as Application,
+- storage = metricsStorage,
+- crashReporter = crashReporter,
+- ),
++ AdjustMetricsService(context as Application),
+ InstallReferrerMetricsService(context),
+ ),
+ isDataTelemetryEnabled = { context.settings().isTelemetryEnabled },
+diff --git a/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt b/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt
+index d077ca2972..a55a167ad5 100644
+--- a/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt
++++ b/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt
+@@ -10,7 +10,6 @@ import android.content.Context
+ import androidx.compose.runtime.Composable
+ import androidx.compose.ui.platform.LocalContext
+ import androidx.core.app.NotificationManagerCompat
+-import com.google.android.play.core.review.ReviewManagerFactory
+ import mozilla.components.feature.addons.AddonManager
+ import mozilla.components.feature.addons.amo.AMOAddonsProvider
+ import mozilla.components.feature.addons.migration.DefaultSupportedAddonsChecker
+@@ -171,7 +170,6 @@ class Components(private val context: Context) {
+
+ val reviewPromptController by lazyMonitored {
+ ReviewPromptController(
+- manager = ReviewManagerFactory.create(context),
+ reviewSettings = FenixReviewSettings(settings),
+ )
+ }
+diff --git a/fenix/app/src/main/java/org/mozilla/fenix/components/Core.kt b/fenix/app/src/main/java/org/mozilla/fenix/components/Core.kt
+index f6d7a2b0df..366c256bdb 100644
+--- a/fenix/app/src/main/java/org/mozilla/fenix/components/Core.kt
++++ b/fenix/app/src/main/java/org/mozilla/fenix/components/Core.kt
+@@ -510,8 +510,14 @@ class Core(
+ } else {
+ defaultTopSites.add(
+ Pair(
+- context.getString(R.string.default_top_site_google),
+- SupportUtils.GOOGLE_URL,
++ context.getString(R.string.default_top_site_fdroid),
++ SupportUtils.FDROID_URL,
++ ),
++ )
++ defaultTopSites.add(
++ Pair(
++ context.getString(R.string.default_top_site_eff),
++ SupportUtils.EFF_URL,
+ ),
+ )
+
+diff --git a/fenix/app/src/main/java/org/mozilla/fenix/components/ReviewPromptController.kt b/fenix/app/src/main/java/org/mozilla/fenix/components/ReviewPromptController.kt
+index 33e8704adc..ffa85e3e46 100644
+--- a/fenix/app/src/main/java/org/mozilla/fenix/components/ReviewPromptController.kt
++++ b/fenix/app/src/main/java/org/mozilla/fenix/components/ReviewPromptController.kt
+@@ -6,8 +6,6 @@ package org.mozilla.fenix.components
+
+ import android.app.Activity
+ import androidx.annotation.VisibleForTesting
+-import com.google.android.play.core.review.ReviewInfo
+-import com.google.android.play.core.review.ReviewManager
+ import kotlinx.coroutines.Dispatchers.Main
+ import kotlinx.coroutines.withContext
+ import org.mozilla.fenix.GleanMetrics.ReviewPrompt
+@@ -45,24 +43,9 @@ class FenixReviewSettings(
+ * Controls the Review Prompt behavior.
+ */
+ class ReviewPromptController(
+- private val manager: ReviewManager,
+ private val reviewSettings: ReviewSettings,
+ private val timeNowInMillis: () -> Long = { System.currentTimeMillis() },
+- private val tryPromptReview: suspend (Activity) -> Unit = { activity ->
+- val flow = manager.requestReviewFlow()
+-
+- withContext(Main) {
+- flow.addOnCompleteListener {
+- if (it.isSuccessful) {
+- manager.launchReviewFlow(activity, it.result)
+- recordReviewPromptEvent(
+- it.result.toString(),
+- reviewSettings.numberOfAppLaunches,
+- Date(),
+- )
+- }
+- }
+- }
++ private val tryPromptReview: suspend (Activity) -> Unit = { _ ->
+ },
+ ) {
+ @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+diff --git a/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt b/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt
+index b979a08026..ae125ebd52 100644
+--- a/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt
++++ b/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt
+@@ -10,25 +10,13 @@ import android.os.Bundle
+ import android.util.Log
+ import com.adjust.sdk.Adjust
+ import com.adjust.sdk.AdjustConfig
+-import com.adjust.sdk.AdjustEvent
+-import com.adjust.sdk.Constants.ADJUST_PREINSTALL_SYSTEM_PROPERTY_PATH
+ import com.adjust.sdk.LogLevel
+-import kotlinx.coroutines.CoroutineDispatcher
+-import kotlinx.coroutines.CoroutineScope
+-import kotlinx.coroutines.Dispatchers
+-import kotlinx.coroutines.launch
+-import mozilla.components.lib.crash.CrashReporter
+ import org.mozilla.fenix.BuildConfig
+ import org.mozilla.fenix.Config
+ import org.mozilla.fenix.GleanMetrics.FirstSession
+ import org.mozilla.fenix.ext.settings
+
+-class AdjustMetricsService(
+- private val application: Application,
+- private val storage: MetricsStorage,
+- private val crashReporter: CrashReporter,
+- private val dispatcher: CoroutineDispatcher = Dispatchers.IO,
+-) : MetricsService {
++class AdjustMetricsService(private val application: Application) : MetricsService {
+ override val type = MetricServiceType.Marketing
+
+ override fun start() {
+@@ -42,15 +30,12 @@ class AdjustMetricsService(
+ return
+ }
+
+- System.setProperty(ADJUST_PREINSTALL_SYSTEM_PROPERTY_PATH, "/preload/etc/adjust.preinstall")
+-
+ val config = AdjustConfig(
+ application,
+ BuildConfig.ADJUST_TOKEN,
+ AdjustConfig.ENVIRONMENT_PRODUCTION,
+ true,
+ )
+- config.setPreinstallTrackingEnabled(true)
+
+ val installationPing = FirstSessionPing(application)
+
+@@ -94,26 +79,8 @@ class AdjustMetricsService(
+ Adjust.gdprForgetMe(application.applicationContext)
+ }
+
+- @Suppress("TooGenericExceptionCaught")
+- override fun track(event: Event) {
+- CoroutineScope(dispatcher).launch {
+- try {
+- if (event is Event.GrowthData) {
+- if (storage.shouldTrack(event)) {
+- Adjust.trackEvent(AdjustEvent(event.tokenName))
+- storage.updateSentState(event)
+- } else {
+- storage.updatePersistentState(event)
+- }
+- }
+- } catch (e: Exception) {
+- crashReporter.submitCaughtException(e)
+- }
+- }
+- }
+-
+- override fun shouldTrack(event: Event): Boolean =
+- event is Event.GrowthData
++ override fun track(event: Event) { /* noop */ }
++ override fun shouldTrack(event: Event): Boolean = false
+
+ companion object {
+ private const val LOGTAG = "AdjustMetricsService"
+diff --git a/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/InstallReferrerMetricsService.kt b/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/InstallReferrerMetricsService.kt
+index a65690bdce..5e88212347 100644
+--- a/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/InstallReferrerMetricsService.kt
++++ b/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/InstallReferrerMetricsService.kt
+@@ -8,8 +8,6 @@ import android.content.Context
+ import android.net.UrlQuerySanitizer
+ import android.os.RemoteException
+ import androidx.annotation.VisibleForTesting
+-import com.android.installreferrer.api.InstallReferrerClient
+-import com.android.installreferrer.api.InstallReferrerStateListener
+ import org.mozilla.fenix.GleanMetrics.PlayStoreAttribution
+ import org.mozilla.fenix.ext.settings
+ import org.mozilla.fenix.utils.Settings
+@@ -23,60 +21,13 @@ import java.net.URLDecoder
+ class InstallReferrerMetricsService(private val context: Context) : MetricsService {
+ override val type = MetricServiceType.Marketing
+
+- private var referrerClient: InstallReferrerClient? = null
+-
+ override fun start() {
+ if (context.settings().utmParamsKnown) {
+ return
+ }
+-
+- val timerId = PlayStoreAttribution.attributionTime.start()
+- val client = InstallReferrerClient.newBuilder(context).build()
+- referrerClient = client
+-
+- client.startConnection(
+- object : InstallReferrerStateListener {
+- override fun onInstallReferrerSetupFinished(responseCode: Int) {
+- PlayStoreAttribution.attributionTime.stopAndAccumulate(timerId)
+- when (responseCode) {
+- InstallReferrerClient.InstallReferrerResponse.OK -> {
+- // Connection established.
+- try {
+- val response = client.installReferrer
+- recordInstallReferrer(context.settings(), response.installReferrer)
+- context.settings().utmParamsKnown = true
+- } catch (e: RemoteException) {
+- // NOOP.
+- // We can't do anything about this.
+- }
+- }
+-
+- InstallReferrerClient.InstallReferrerResponse.FEATURE_NOT_SUPPORTED -> {
+- // API not available on the current Play Store app.
+- context.settings().utmParamsKnown = true
+- }
+-
+- InstallReferrerClient.InstallReferrerResponse.SERVICE_UNAVAILABLE -> {
+- // Connection couldn't be established.
+- }
+- }
+- // End the connection, and null out the client.
+- stop()
+- }
+-
+- override fun onInstallReferrerServiceDisconnected() {
+- // Try to restart the connection on the next request to
+- // Google Play by calling the startConnection() method.
+- referrerClient = null
+- }
+- },
+- )
+ }
+
+- override fun stop() {
+- referrerClient?.endConnection()
+- referrerClient = null
+- }
++ override fun stop() { /* noop */ }
+
+ override fun track(event: Event) = Unit
+
+diff --git a/fenix/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt b/fenix/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt
+index d69f27e570..171f54a6d5 100644
+--- a/fenix/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt
++++ b/fenix/app/src/main/java/org/mozilla/fenix/home/topsites/TopSiteItemViewHolder.kt
+@@ -176,6 +176,12 @@ class TopSiteItemViewHolder(
+ SupportUtils.MEITUAN_URL -> {
+ binding.faviconImage.setImageDrawable(getDrawable(itemView.context, R.drawable.ic_meituan))
+ }
++ SupportUtils.FDROID_URL -> {
++ binding.faviconImage.setImageDrawable(getDrawable(itemView.context, R.drawable.ic_fdroid))
++ }
++ SupportUtils.EFF_URL -> {
++ binding.faviconImage.setImageDrawable(getDrawable(itemView.context, R.drawable.ic_eff))
++ }
+ else -> {
+ itemView.context.components.core.icons.loadIntoView(binding.faviconImage, topSite.url)
+ }
+diff --git a/fenix/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt b/fenix/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt
+index e867be39f2..a1667b1c2b 100644
+--- a/fenix/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt
++++ b/fenix/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt
+@@ -38,6 +38,8 @@ object SupportUtils {
+ const val GOOGLE_US_URL = "https://www.google.com/webhp?client=firefox-b-1-m&channel=ts"
+ const val GOOGLE_XX_URL = "https://www.google.com/webhp?client=firefox-b-m&channel=ts"
+ const val WHATS_NEW_URL = "https://www.mozilla.org/firefox/android/notes"
++ const val FDROID_URL = "https://f-droid.org/"
++ const val EFF_URL = "https://www.eff.org/"
+
+ enum class SumoTopic(internal val topicStr: String) {
+ HELP("faq-android"),
+diff --git a/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt
+index 01ed68bbe6..c35ab607f7 100644
+--- a/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt
++++ b/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt
+@@ -332,17 +332,17 @@ class Settings(private val appContext: Context) : PreferencesHolder {
+
+ var isTelemetryEnabled by booleanPreference(
+ appContext.getPreferenceKey(R.string.pref_key_telemetry),
+- default = true,
++ default = false,
+ )
+
+ var isMarketingTelemetryEnabled by booleanPreference(
+ appContext.getPreferenceKey(R.string.pref_key_marketing_telemetry),
+- default = !Config.channel.isMozillaOnline,
++ default = false,
+ )
+
+ var isExperimentationEnabled by booleanPreference(
+ appContext.getPreferenceKey(R.string.pref_key_experimentation),
+- default = true,
++ default = false,
+ )
+
+ var isOverrideTPPopupsForPerformanceTest = false
+@@ -1553,7 +1553,7 @@ class Settings(private val appContext: Context) : PreferencesHolder {
+ var showPocketRecommendationsFeature by lazyFeatureFlagPreference(
+ appContext.getPreferenceKey(R.string.pref_key_pocket_homescreen_recommendations),
+ featureFlag = FeatureFlags.isPocketRecommendationsFeatureEnabled(appContext),
+- default = { homescreenSections[HomeScreenSection.POCKET] == true },
++ default = { false },
+ )
+
+ /**
+@@ -1611,7 +1611,7 @@ class Settings(private val appContext: Context) : PreferencesHolder {
+ */
+ var showContileFeature by booleanPreference(
+ key = appContext.getPreferenceKey(R.string.pref_key_enable_contile),
+- default = true,
++ default = false,
+ )
+
+ /**
+diff --git a/fenix/app/src/main/res/values/static_strings_extra.xml b/fenix/app/src/main/res/values/static_strings_extra.xml
+new file mode 100644
+index 0000000000..101f4e0d0a
+--- /dev/null
++++ b/fenix/app/src/main/res/values/static_strings_extra.xml
+@@ -0,0 +1,8 @@
++<?xml version="1.0" encoding="utf-8" standalone="yes"?>
++<!-- This Source Code Form is subject to the terms of the Mozilla Public
++ - License, v. 2.0. If a copy of the MPL was not distributed with this
++ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
++<resources>
++ <string name="default_top_site_fdroid" translatable="false">F-Droid</string>
++ <string name="default_top_site_eff" translatable="false">EFF</string>
++</resources>
+diff --git a/fenix/app/src/main/res/xml/preferences.xml b/fenix/app/src/main/res/xml/preferences.xml
+index 2e0366e11b..4a684b7fb6 100644
+--- a/fenix/app/src/main/res/xml/preferences.xml
++++ b/fenix/app/src/main/res/xml/preferences.xml
+@@ -133,11 +133,6 @@
+ app:iconSpaceReserved="false"
+ android:title="@string/preferences_notifications" />
+
+- <androidx.preference.Preference
+- android:key="@string/pref_key_data_choices"
+- app:iconSpaceReserved="false"
+- android:title="@string/preferences_data_collection" />
+-
+ </androidx.preference.PreferenceCategory>
+
+ <PreferenceCategory
+@@ -189,11 +184,6 @@
+ android:title="@string/preferences_category_about"
+ app:iconSpaceReserved="false"
+ android:layout="@layout/preference_category_no_icon_style">
+- <androidx.preference.Preference
+- android:key="@string/pref_key_rate"
+- app:iconSpaceReserved="false"
+- android:title="@string/preferences_rate" />
+-
+ <androidx.preference.Preference
+ android:key="@string/pref_key_about"
+ app:iconSpaceReserved="false"
+diff --git a/fenix/app/src/main/res/xml/site_permissions_details_exceptions_preferences.xml b/fenix/app/src/main/res/xml/site_permissions_details_exceptions_preferences.xml
+index 6bb8cfbbe6..1c15b5897c 100644
+--- a/fenix/app/src/main/res/xml/site_permissions_details_exceptions_preferences.xml
++++ b/fenix/app/src/main/res/xml/site_permissions_details_exceptions_preferences.xml
+@@ -3,7 +3,8 @@
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+ <androidx.preference.PreferenceScreen
+- xmlns:android="http://schemas.android.com/apk/res/android">
++ xmlns:android="http://schemas.android.com/apk/res/android"
++ xmlns:app="http://schemas.android.com/apk/res-auto">
+ <androidx.preference.Preference
+ android:icon="@drawable/ic_camera_enabled"
+ android:key="@string/pref_key_phone_feature_camera"
+@@ -44,7 +45,8 @@
+ android:icon="@drawable/ic_link"
+ android:key="@string/pref_key_browser_feature_media_key_system_access"
+ android:title="@string/preference_phone_feature_media_key_system_access"
+- android:summary="@string/preference_option_phone_feature_ask_to_allow"/>
++ android:summary="@string/preference_option_phone_feature_ask_to_allow"
++ app:isPreferenceVisible="false"/>
+
+ <androidx.preference.Preference
+ android:icon="@drawable/ic_autoplay"
+diff --git a/fenix/app/src/main/res/xml/site_permissions_preferences.xml b/fenix/app/src/main/res/xml/site_permissions_preferences.xml
+index 64c90b599b..621f184e68 100644
+--- a/fenix/app/src/main/res/xml/site_permissions_preferences.xml
++++ b/fenix/app/src/main/res/xml/site_permissions_preferences.xml
+@@ -64,6 +64,7 @@
+ android:key="@string/pref_key_browser_feature_media_key_system_access"
+ android:title="@string/preference_phone_feature_media_key_system_access"
+ android:summary="@string/preference_option_phone_feature_ask_to_allow"
++ app:isPreferenceVisible="false"
+ app:allowDividerBelow="true"/>
+
+ <androidx.preference.Preference
+diff --git a/fenix/plugins/fenixdependencies/src/main/java/FenixDependenciesPlugin.kt b/fenix/plugins/fenixdependencies/src/main/java/FenixDependenciesPlugin.kt
+index fff754c099..35599805e6 100644
+--- a/fenix/plugins/fenixdependencies/src/main/java/FenixDependenciesPlugin.kt
++++ b/fenix/plugins/fenixdependencies/src/main/java/FenixDependenciesPlugin.kt
+@@ -70,9 +70,6 @@ object FenixDependencies {
+ const val protobuf_javalite = "com.google.protobuf:protobuf-javalite:${FenixVersions.protobuf}"
+ const val protobuf_compiler = "com.google.protobuf:protoc:${FenixVersions.protobuf}"
+
+- const val adjust = "com.adjust.sdk:adjust-android:${FenixVersions.adjust}"
+- const val installreferrer = "com.android.installreferrer:installreferrer:${FenixVersions.installreferrer}"
+-
+ const val mockk = "io.mockk:mockk:${FenixVersions.mockk}"
+ const val mockk_android = "io.mockk:mockk-android:${FenixVersions.mockk}"
+ const val falcon = "com.jraska:falcon:${FenixVersions.falcon}"
+@@ -97,12 +94,6 @@ object FenixDependencies {
+
+ const val mockwebserver = "com.squareup.okhttp3:mockwebserver:${FenixVersions.mockwebserver}"
+
+- const val google_ads_id = "com.google.android.gms:play-services-ads-identifier:${FenixVersions.google_ads_id_version}"
+-
+- // Required for in-app reviews
+- const val google_play_review = "com.google.android.play:review:${FenixVersions.google_play_review_version}"
+- const val google_play_review_ktx = "com.google.android.play:review-ktx:${FenixVersions.google_play_review_version}"
+-
+ const val junitApi = "org.junit.jupiter:junit-jupiter-api:${FenixVersions.junit}"
+ const val junitParams = "org.junit.jupiter:junit-jupiter-params:${FenixVersions.junit}"
+ const val junitEngine = "org.junit.jupiter:junit-jupiter-engine:${FenixVersions.junit}"

127
README.md
View File

@ -1,27 +1,134 @@
# LeOSium Browser!
# Iceraven Browser! [![CI](https://github.com/fork-maintainers/iceraven-browser/actions/workflows/ci.yml/badge.svg)](https://github.com/fork-maintainers/iceraven-browser/actions/workflows/ci.yml) ![Release](https://img.shields.io/github/v/release/fork-maintainers/iceraven-browser)
Definitely not brought to you by Mozilla!
LeOSium Browser is a fork of LeOSium.... thx fork-maintainer for the sources !!!!
LeOSium Browser is a web browser for Android, based on [Mozilla's Fenix version of Firefox](https://github.com/mozilla-mobile/fenix/), [GeckoView](https://mozilla.github.io/geckoview/) and [Mozilla Android Components](https://mozac.org/).
Iceraven Browser is a web browser for Android, based on [Mozilla's Fenix version of Firefox](https://github.com/mozilla-mobile/fenix/), [GeckoView](https://mozilla.github.io/geckoview/) and [Mozilla Android Components](https://mozac.org/).
Our goal is to be a close fork of the new Firefox for Android that seeks to provide users with more options, more opportunities to customize (including a broad extension library), and more information about the pages they visit and how their browsers are interacting with those pages.
Notable features include:
* `about:config` support
* The ability to *attempt* to install a much longer list of add-ons than Mozilla's Fenix version of Firefox accepts. Currently the browser queries [this AMO collection](https://addons.mozilla.org/en-US/firefox/collections/16201230/What-I-want-on-Fenix/) **Most of them will not work**, because they depend on code that Mozilla is still working on writing in `android-components`, but you may attempt to install them. If you don't see an add-on you want, you can [request it](https://github.com/fork-maintainers/LeOSium-browser/issues/new).
* The ability to *attempt* to install a much longer list of add-ons than Mozilla's Fenix version of Firefox accepts. Currently the browser queries [this AMO collection](https://addons.mozilla.org/en-US/firefox/collections/16201230/What-I-want-on-Fenix/) **Most of them will not work**, because they depend on code that Mozilla is still working on writing in `android-components`, but you may attempt to install them. If you don't see an add-on you want, you can [request it](https://github.com/fork-maintainers/iceraven-browser/issues/new).
* Option to suspend tabs to avoid being killed for memory (https://bugzilla.mozilla.org/show_bug.cgi?id=1807364)
* **No warranties or guarantees of security or updates or even stability**! Note that LeOSium Browser includes some unstable code written by Mozilla, with our own added modifications on top, all shipped with the stable version of GeckoView engine. Hence, the browser may contain bugs introduced upstream. Binaries are currently built automatically by our Github release automation. These binaries are signed with a debug key. When we finally publish this somewhere official like F-droid, we will sign the apks with a proper key suitable for public release. Due to the current way we create the releases and sign them, you may not want to rely on such "alpha" quality software as your primary web browser, as it will have bugs. So, use this browser only if you are comfortable with these limitations/potential risks.
* **No warranties or guarantees of security or updates or even stability**! Note that Iceraven Browser includes some unstable code written by Mozilla, with our own added modifications on top, all shipped with the stable version of GeckoView engine. Hence, the browser may contain bugs introduced upstream. Binaries are currently built automatically by our Github release automation. These binaries are signed with a debug key. When we finally publish this somewhere official like F-droid, we will sign the apks with a proper key suitable for public release. Due to the current way we create the releases and sign them, you may not want to rely on such "alpha" quality software as your primary web browser, as it will have bugs. So, use this browser only if you are comfortable with these limitations/potential risks.
**Note/Disclaimer:** LeOSium Browser could not exist without the hardworking folks at the Mozilla Corporation who work on the Mozilla Android Components and Firefox projects, but it is not an official Mozilla product, and is not provided, endorsed, vetted, approved, or secured by Mozilla.
**Note/Disclaimer:** Iceraven Browser could not exist without the hardworking folks at the Mozilla Corporation who work on the Mozilla Android Components and Firefox projects, but it is not an official Mozilla product, and is not provided, endorsed, vetted, approved, or secured by Mozilla.
In addition, we intend to try to cut down on telemetry and proprietary code to as great of an extent as possible as long as doing so does not compromise the user experience or make the fork too hard to maintain. Right now, we believe that no telemetry should be being sent to Mozilla anymore, but we cannot guarantee this; data may still be sent. Because of the way we have implemented this, the app may still appear to contain trackers when analyzed by tools that look for the presence of known tracking libraries. These detected trackers should actually be non-functional substitutes, many of which are sourced [from here](https://gitlab.com/relan/fennecbuild/-/blob/master/fenix-liberate.patch). **If you catch the app actually sending data to Mozilla, Adjust, Leanplum, Firebase, or any other such service, please open an issue!** Presumably any data that reaches Mozilla is governed by Mozilla's privacy policy, but as LeOSium Browser is, again **not a Mozilla product**, we can make no promises.
In addition, we intend to try to cut down on telemetry and proprietary code to as great of an extent as possible as long as doing so does not compromise the user experience or make the fork too hard to maintain. Right now, we believe that no telemetry should be being sent to Mozilla anymore, but we cannot guarantee this; data may still be sent. Because of the way we have implemented this, the app may still appear to contain trackers when analyzed by tools that look for the presence of known tracking libraries. These detected trackers should actually be non-functional substitutes, many of which are sourced [from here](https://gitlab.com/relan/fennecbuild/-/blob/master/fenix-liberate.patch). **If you catch the app actually sending data to Mozilla, Adjust, Leanplum, Firebase, or any other such service, please open an issue!** Presumably any data that reaches Mozilla is governed by Mozilla's privacy policy, but as Iceraven Browser is, again **not a Mozilla product**, we can make no promises.
LeOSium Browser combines the power of Fenix (of which we are a fork) and the spirit of Fennec, with a respectful nod toward the grand tradition of Netscape Navigator, from which all Gecko-based projects came, including the earliest of our predecessors, the old Mozilla Phoenix and Mozilla Firefox desktop browsers.
Iceraven Browser combines the power of Fenix (of which we are a fork) and the spirit of Fennec, with a respectful nod toward the grand tradition of Netscape Navigator, from which all Gecko-based projects came, including the earliest of our predecessors, the old Mozilla Phoenix and Mozilla Firefox desktop browsers.
That said, LeOSium Browser is an independent all-volunteer project, and has no affiliation with Netscape, Netscape Navigator, Mozilla, Mozilla Firefox, Mozila Phoenix, Debian, Debian Iceweasel, Parabola GNU/Linux-libre Iceweasel, America Online, or Verizon, among others. :) Basically, if you don't like the browser, it's not their fault. :)
That said, Iceraven Browser is an independent all-volunteer project, and has no affiliation with Netscape, Netscape Navigator, Mozilla, Mozilla Firefox, Mozila Phoenix, Debian, Debian Iceweasel, Parabola GNU/Linux-libre Iceweasel, America Online, or Verizon, among others. :) Basically, if you don't like the browser, it's not their fault. :)
## 📥 Installation
Right now, releases are published as `.apk` files, through Github. You should download and install the appropriate one for your device.
1. **Determine what version you need**. If you have a newer, 64-bit device, or a device with more than 4 GB of memory, you probably want the `arm64-v8a` version. **Any ordinary phone or tablet should be able to use the `armeabi-v7a` version**, but it will be limited to using no more than 4 GB of memory. You almost certainly don't want the `x86` or `x86_64` versions; they are in case you are running Android on a PC.
2. [**Download the APK for the latest release from the Releases page**](https://github.com/fork-maintainers/iceraven-browser/releases). Make sure to pick the version you chose in step 1.
3. **Install the APK**. You will need to enable installation of apps from "unknown" (to Google) sources, and installatiuon of apps *by* whatever app you used to open the downloaded APK (i.e. your browser or file manager). Android will try to dissuade you from doing this, and suggest that it is dangerous. Iceraven is a browser for people who enjoy danger.
4. **Enjoy Iceraven**. Make sure to install the add-ons that are essential for you in the main menu under "Add-Ons". You may want to set Iceraven as your device's default browser app. If you do this, it will be able to provide so-called "Chrome" [custom tabs](https://developers.google.com/web/android/custom-tabs) for other applications, allowing you to use your add-ons there.
## 🔨 Building
1. Set up the environment. We need the Android SDK at `$ANDROID_SDK_ROOT` and a Java JDK at `$JAVA_HOME` that isn't the Ubuntu Java 8 one. We want environment variables that look something like:
```sh
# Where does our system install the JDK? This is the right path for the Ubuntu Java 11 JDK, if it is installed.
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
# Where did we install the Android SDK?
export ANDROID_SDK_ROOT=$HOME/android-sdk/android-sdk-linux/
```
If we don't have the Android SDK, we can install it thusly on Linux:
```sh
mkdir -p $HOME/android-sdk/android-sdk-linux
cd $HOME/android-sdk/android-sdk-linux
mkdir -p licenses
echo "8933bad161af4178b1185d1a37fbf41ea5269c55" >> licenses/android-sdk-license
echo "d56f5187479451eabf01fb78af6dfcb131a6481e" >> licenses/android-sdk-license
echo "24333f8a63b6825ea9c5514f83c2829b004d1fee" >> licenses/android-sdk-license
mkdir cmdline-tools
cd cmdline-tools
wget "$(curl -s https://developer.android.com/studio | grep -oP "https://dl.google.com/android/repository/commandlinetools-linux-[0-9]+_latest.zip")"
unzip commandlinetools-linux-*_latest.zip
cd ..
```
2. Clone the project.
```sh
git clone --recursive https://github.com/fork-maintainers/iceraven-browser
```
4. Go inside `iceraven-browser`. That's where the build is coordinated from.
```sh
cd iceraven-browser
```
5. Configure the project. For your personal use you need to sign the apk file. The simplest way to do this is to use the debug key that is auto-generated by Android SDK. This is not a great idea for releasing, but acceptable for your personal use. You can configure it as follows:
```sh
echo "autosignReleaseWithDebugKey=" >> local.properties
```
6. Build the project. To build the Iceraven-branded release APKs, you can do:
```sh
./gradlew app:assemblefenixForkRelease -PversionName="$(git describe --tags HEAD)"
```
(If you don't use the `app:` prefix, you might get complaints about the build system being `unable to locate the objcopy executable`.)
The APKs will show up in `app/build/outputs/apk/fenix/forkRelease/`.
## Getting Involved
This is an all-volunteer project. No one is getting paid (at least not by the project itself.).
Therefore, everyone should feel free to open issues and pull requests. Join the club!
Developers are especially welcome, wanted, and needed.
## I want to open a Pull Request!
We encourage you to participate in this open source project. We love Pull Requests, Bug Reports, ideas, (security) code reviews or any other kind of positive contribution.
### How to Appease the Linter
If you are getting errors form `./gradelw ktlint`, try running `./gradlew ktlintFormat` to let `ktlint` decide how to lay out your code, instead of just yelling at you that you can't read its mind.
### 🙅 How to skip CI checks for PRs 🙅
If you want to skip Github CI checks in a PR, please add the following to the PR title exactly: `[skip ci]`.
Also, please include the exact phrase `[skip ci]` in every commit message. This is to avoid Travis CI checks as well as skipping Github CI checks after merging the commits to the `fork` branch.
This is useful to do **if** you are sure that your changes do not effect the app's code (ex: changes to `README.md`).
## 🚀 Release automation 🚀
We have now setup release automation so that Github actions automatically trigger a release build and publish a release when we push a tag to the repository.
**NOTE**: The tag should be of the format `iceraven-x.y.z`, where `x.y.z` is the release version, for the automation to kick in and also so that the built app will have the correct version name.
## ✏️ I want to file an issue!
Great! We encourage you to participate in this open source project. We love Pull Requests, Bug Reports, ideas, (security) code reviews or any other kind of positive contribution.
To make it easier to triage, we have these issue requirements:
* Please do your best to search for duplicate issues before filing a new issue so we can keep our issue board clean.
* Every issue should have **exactly** one bug/feature request described in it. Please do not file meta feedback list tickets as it is difficult to parse them and address their individual points.
* Feature Requests are better when theyre open-ended instead of demanding a specific solution -ie “I want an easier way to do X” instead of “add Y”
* Issues are not the place to go off topic or debate.
* While we do not yet have Community Participation Guidelines of our own, we ask that you show respect to everyone and treat others as you would like to be treated. Behavior that would violate [Mozilla's Community Participation Guidelines](https://www.mozilla.org/en-US/about/governance/policies/participation/) is almost certainly unwelcome. However, as a small project without community managers, we cannot promise prompt and consistent enforcement.
Please keep in mind that even though a feature you have in mind may seem like a small ask, as a small team, we have to prioritize our planned work and every new feature adds complexity and maintenance and may take up design, research, product, and engineering time. We appreciate everyones passion but we will not be able to incorporate every feature request or even fix every bug. That being said, just because we haven't replied, doesn't mean we don't care about the issue, please be patient with our response times as we're very busy.
## License

View File

@ -58,6 +58,9 @@ juno-onboarding:
cards:
type: json
description: Collection of user facing onboarding cards.
conditions:
type: json
description: "A collection of out the box conditional expressions to be used in determining whether a card should show or not. Each entry maps to a valid JEXL expression.\n"
messaging:
description: "The in-app messaging system.\n"
hasExposure: true

File diff suppressed because it is too large Load Diff

View File

@ -7489,6 +7489,25 @@ first_session:
- Performance
- Attribution
play_store_attribution:
install_referrer_response:
type: text
send_in_pings:
- first-session
description: |
The full install referrer response.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1862737
data_reviews:
- https://github.com/mozilla-mobile/firefox-android/pull/4343
data_sensitivity:
# - technical
- web_activity # This is a workaround so we can use Text type for technical data.
notification_emails:
- android-probes@mozilla.com
expires: never
metadata:
tags:
- Attribution
source:
type: string
send_in_pings:
@ -7611,6 +7630,80 @@ play_store_attribution:
tags:
- Attribution
- Performance
meta_attribution:
app:
type: string
send_in_pings:
- first-session
description: |
The mobile application ID in Meta's attribution.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1860133
data_reviews:
- https://github.com/mozilla-mobile/firefox-android/pull/4171
data_sensitivity:
- technical
notification_emails:
- android-probes@mozilla.com
expires: never
metadata:
tags:
- Attribution
t:
type: string
send_in_pings:
- first-session
description: |
Value tracking user interaction with Meta attribution.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1860133
data_reviews:
- https://github.com/mozilla-mobile/firefox-android/pull/4171
data_sensitivity:
- technical
notification_emails:
- android-probes@mozilla.com
expires: never
metadata:
tags:
- Attribution
data:
type: text
send_in_pings:
- first-session
description: |
The Meta attribution data in encrypted format.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1860133
data_reviews:
- https://github.com/mozilla-mobile/firefox-android/pull/4171
data_sensitivity:
# - technical
- web_activity # This is a workaround so we can use Text type for technical data.
notification_emails:
- android-probes@mozilla.com
expires: never
metadata:
tags:
- Attribution
nonce:
type: string
send_in_pings:
- first-session
description: |
Nonce used to decrypt the encrypted Meta attribution data.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1860133
data_reviews:
- https://github.com/mozilla-mobile/firefox-android/pull/4171
data_sensitivity:
- technical
notification_emails:
- android-probes@mozilla.com
expires: never
metadata:
tags:
- Attribution
browser.search:
with_ads:
type: labeled_counter
@ -8296,27 +8389,10 @@ autoplay:
- SitePermissions
cookie_banners:
visited_setting:
type: event
description: A user visited the cookie banner handling screen
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1796146
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/27561
- https://github.com/mozilla-mobile/firefox-android/pull/2597
- https://github.com/mozilla-mobile/firefox-android/pull/4039
data_sensitivity:
- interaction
notification_emails:
- android-probes@mozilla.com
expires: never
metadata:
tags:
- Privacy&Security
setting_changed:
setting_changed_pmb:
type: event
description: |
A user changed their setting.
A user changed their setting in private mode.
extra_keys:
cookie_banner_setting:
description: |
@ -8392,80 +8468,6 @@ cookie_banners:
metadata:
tags:
- Privacy&Security
visited_re_engagement_dialog:
type: event
description: An user visited the cookie banner re-engagement dialog
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1797593
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/28405#issuecomment-1372489596
- https://github.com/mozilla-mobile/firefox-android/pull/2597
- https://github.com/mozilla-mobile/firefox-android/pull/4039
data_sensitivity:
- interaction
notification_emails:
- android-probes@mozilla.com
expires: never
metadata:
tags:
- Privacy&Security
opt_out_re_engagement_dialog:
type: event
description: |
An user opt out the cookie banner re-engagement
dialog by clicking the X button
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1797593
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/28405#issuecomment-1372489596
- https://github.com/mozilla-mobile/firefox-android/pull/2597
- https://github.com/mozilla-mobile/firefox-android/pull/4039
data_sensitivity:
- interaction
notification_emails:
- android-probes@mozilla.com
expires: never
metadata:
tags:
- Privacy&Security
not_now_re_engagement_dialog:
type: event
description: |
An user clicked the not now button on
the cookie banner re-engagement dialog
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1797593
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/28405#issuecomment-1372489596
- https://github.com/mozilla-mobile/firefox-android/pull/2597
- https://github.com/mozilla-mobile/firefox-android/pull/4039
data_sensitivity:
- interaction
notification_emails:
- android-probes@mozilla.com
expires: never
metadata:
tags:
- Privacy&Security
allow_re_engagement_dialog:
type: event
description: |
An user clicked the dismiss banner button
on the cookie banner re-engagement dialog
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1797593
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/28405#issuecomment-1372489596
- https://github.com/mozilla-mobile/firefox-android/pull/2597
- https://github.com/mozilla-mobile/firefox-android/pull/4039
data_sensitivity:
- interaction
notification_emails:
- android-probes@mozilla.com
expires: never
metadata:
tags:
- Privacy&Security
report_site_domain:
type: url
description: |
@ -8528,7 +8530,38 @@ cookie_banners:
metadata:
tags:
- Privacy&Security
cfr_shown:
type: event
description: The cookie banner cfr has been shown
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1859393
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1859393#c2
data_sensitivity:
- interaction
notification_emails:
- android-probes@mozilla.com
expires: never
metadata:
tags:
- Privacy&Security
cfr_dismissal:
type: event
description: |
The cookie banners CFR was dismissed by the user by interacting
with the outside of the popup
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1859393
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1859393#c2
data_sensitivity:
- interaction
notification_emails:
- android-probes@mozilla.com
expires: never
metadata:
tags:
- Privacy&Security
site_permissions:
prompt_shown:
type: event
@ -10812,6 +10845,126 @@ shopping:
metadata:
tags:
- Shopping
surface_stale_analysis_shown:
type: event
description: |
Records an event when the "New info to check" card is shown.
send_in_pings:
- events
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1862776
data_reviews:
- https://github.com/mozilla-mobile/firefox-android/pull/4379#issuecomment-1794925138
data_sensitivity:
- interaction
notification_emails:
- android-probes@mozilla.com
expires: never
metadata:
tags:
- Shopping
surface_ads_impression:
type: event
description: |
The user viewed an ad in review checker for at least 1.5 seconds.
send_in_pings:
- events
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1865854
data_reviews:
- https://github.com/mozilla-mobile/firefox-android/pull/4604#issuecomment-1827890623
data_sensitivity:
- interaction
notification_emails:
- android-probes@mozilla.com
expires: never
metadata:
tags:
- Shopping
surface_ads_clicked:
type: event
description: |
The user clicked an ad in review checker.
send_in_pings:
- events
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1865854
data_reviews:
- https://github.com/mozilla-mobile/firefox-android/pull/4604#issuecomment-1827890623
data_sensitivity:
- interaction
notification_emails:
- android-probes@mozilla.com
expires: never
metadata:
tags:
- Shopping
surface_ads_setting_toggled:
type: event
description: |
The user toggled the ads display setting.
send_in_pings:
- events
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1865854
data_reviews:
- https://github.com/mozilla-mobile/firefox-android/pull/4604#issuecomment-1827890623
data_sensitivity:
- interaction
notification_emails:
- android-probes@mozilla.com
expires: never
extra_keys:
action:
type: string
description: |
Whether the toggle was used to enable or disable ads. Possible values
are `enabled` and `disabled`.
metadata:
tags:
- Shopping
ads_exposure:
type: event
description: |
On a supported product page, the review checker showed analysis,
and the ads exposure pref was enabled, or review checker ads were enabled,
and when we tried to fetch an ad from the ad server, an ad was available.
Does not indicate whether the ad was actually shown.
send_in_pings:
- events
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1866992
data_reviews:
- https://github.com/mozilla-mobile/firefox-android/pull/4622#issuecomment-1829905076
data_sensitivity:
- interaction
notification_emails:
- android-probes@mozilla.com
expires: never
metadata:
tags:
- Shopping
surface_no_ads_available:
type: event
description: |
On a supported product page, the review checker
showed analysis, and review checker ads were enabled,
but when we tried to fetch an ad from the ad server,
no ad was available.
send_in_pings:
- events
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1866992
data_reviews:
- https://github.com/mozilla-mobile/firefox-android/pull/4622#issuecomment-1829905076
data_sensitivity:
- interaction
notification_emails:
- android-probes@mozilla.com
expires: never
metadata:
tags:
- Shopping
shopping.settings:
component_opted_out:
@ -10871,6 +11024,24 @@ shopping.settings:
metadata:
tags:
- Shopping
disabled_ads:
type: boolean
description: |
Indicates if the user has disabled ads.
send_in_pings:
- metrics
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1865854
data_reviews:
- https://github.com/mozilla-mobile/firefox-android/pull/4604#issuecomment-1827890623
data_sensitivity:
- interaction
notification_emails:
- android-probes@mozilla.com
expires: never
metadata:
tags:
- Shopping
fx_suggest:
ping_type:
type: string

View File

@ -234,7 +234,38 @@ features:
"jump-back-in-cfr": true,
}
}
query-parameter-stripping:
description: Features for query parameter stripping.
variables:
sections-enabled:
description: "This property provides a lookup table of whether or not the given section should be enabled."
type: Map<QueryParameterStrippingSection, String>
default:
{
"query-parameter-stripping": "0",
"query-parameter-stripping-pmb": "0",
"query-parameter-stripping-allow-list": "",
"query-parameter-stripping-strip-list": "",
}
defaults:
- channel: developer
value: {
"sections-enabled": {
"query-parameter-stripping": "0",
"query-parameter-stripping-pmb": "0",
"query-parameter-stripping-allow-list": "",
"query-parameter-stripping-strip-list": "",
}
}
- channel: nightly
value: {
"sections-enabled": {
"query-parameter-stripping": "0",
"query-parameter-stripping-pmb": "0",
"query-parameter-stripping-allow-list": "",
"query-parameter-stripping-strip-list": "",
}
}
cookie-banners:
description: Features for cookie banner handling.
variables:
@ -245,8 +276,10 @@ features:
{
"feature-ui": 0,
"feature-setting-value": 0,
"dialog-re-engage-time": 4,
"feature-setting-value-pbm": 0
"feature-setting-value-pbm": 0,
"feature-setting-detect-only": 0,
"feature-setting-global-rules": 0,
"feature-setting-global-rules-sub-frames": 0,
}
defaults:
- channel: developer
@ -254,8 +287,10 @@ features:
"sections-enabled": {
"feature-ui": 1,
"feature-setting-value": 0,
"dialog-re-engage-time": 4,
"feature-setting-value-pbm": 0
"feature-setting-value-pbm": 1,
"feature-setting-detect-only": 0,
"feature-setting-global-rules": 0,
"feature-setting-global-rules-sub-frames": 0,
}
}
- channel: nightly
@ -263,8 +298,21 @@ features:
"sections-enabled": {
"feature-ui": 1,
"feature-setting-value": 0,
"dialog-re-engage-time": 4,
"feature-setting-value-pbm": 0
"feature-setting-value-pbm": 1,
"feature-setting-detect-only": 0,
"feature-setting-global-rules": 0,
"feature-setting-global-rules-sub-frames": 0,
}
}
- channel: beta
value: {
"sections-enabled": {
"feature-ui": 1,
"feature-setting-value": 0,
"feature-setting-value-pbm": 1,
"feature-setting-detect-only": 0,
"feature-setting-global-rules": 0,
"feature-setting-global-rules-sub-frames": 0,
}
}
unified-search:
@ -359,10 +407,16 @@ features:
description: if true, recommended products feature is enabled to be shown to the user based on their preference.
type: Boolean
default: false
product-recommendations-exposure:
description: if true, we want to record recommended products inventory for opted-in users, even if product recommendations are disabled.
type: Boolean
default: false
defaults:
- channel: developer
value:
enabled: true
product-recommendations: true
product-recommendations-exposure: true
print:
description: A feature for printing from the share or browser menu.
@ -461,13 +515,38 @@ types:
feature-setting-value:
description: An integer either 0 or 1 indicating if cookie banner setting should be enabled or disabled,
0 for setting the value to disabled, 1 for enabling the setting with the value reject_all.
dialog-re-engage-time:
description: An integer indicating the number of hours that needs to happen before
the re-engagement dialog shows again since the last seen, for example if set to 4
that means if the users has seen the dialog, it will see it 4 hours later.
feature-setting-value-pbm:
description: An integer either 0 or 1 indicating if cookie banner setting should be enabled or disabled,
0 for setting the value to disabled, 1 for enabling the setting with the value reject_all.
feature-setting-detect-only:
description: An integer either 0 or 1 indicating if cookie banner detect only mode
should be enabled or disabled. 0 for setting to be disabled, and 1 for enabling the setting.
feature-setting-global-rules:
description: An integer either 0 or 1 indicating if cookie banner global rules
should be enabled or disabled. 0 for setting to be disabled, and 1 for enabling the setting.
feature-setting-global-rules-sub-frames:
description: An integer either 0 or 1 indicating if cookie banner global rules sub-frames
should be enabled or disabled. 0 for setting to be disabled, and 1 for enabling the setting.
QueryParameterStrippingSection:
description: The identifiers for the options for the Query Parameter Stripping feature.
variants:
query-parameter-stripping:
description: An integer either 0 or 1 indicating if query parameter stripping
should be enabled or disabled in normal mode. 0 for setting to be disabled,
and 1 for enabling the setting.
query-parameter-stripping-pmb:
description: An integer either 0 or 1 indicating if query parameter stripping
should be enabled or disabled in private mode. 0 for setting to be disabled,
and 1 for enabling the setting.
query-parameter-stripping-allow-list:
description: An string separated by commas indicating the sites where should
from query stripping should be exempted.
query-parameter-stripping-strip-list:
description: An string separated by commas indicating the list of query params
to be stripped from URIs. This list will be merged with records
coming from RemoteSettings.
OnboardingPanel:
description: The types of onboarding panels in the onboarding page
variants:

View File

@ -5,6 +5,16 @@ features:
description: A feature that shows juno onboarding flow.
variables:
conditions:
description: >
A collection of out the box conditional expressions to be
used in determining whether a card should show or not.
Each entry maps to a valid JEXL expression.
type: Map<String, String>
default: {
ALWAYS: "true",
NEVER: "false"
}
cards:
description: Collection of user facing onboarding cards.
type: Map<String, OnboardingCardData>
@ -98,6 +108,20 @@ objects:
description: The text to display on the secondary button.
# This should never be defaulted.
default: ""
prerequisites:
type: List<String>
description: >
A list of strings corresponding to targeting expressions.
The card will be shown if all expressions are `true` and if
no expressions in the `disqualifiers` table are true, or
if the `disqualifiers` table is empty.
default: [ ALWAYS ]
disqualifiers:
type: List<String>
description: >
A list of strings corresponding to targeting expressions.
The card will not be shown if any expression is `true`.
default: [ NEVER ]
enums:

View File

@ -5,8 +5,8 @@
package org.mozilla.fenix.components
import android.content.Context
import mozilla.components.service.fxa.ServerConfig
import mozilla.components.service.fxa.ServerConfig.Server
import mozilla.appservices.fxaclient.FxaConfig
import mozilla.appservices.fxaclient.FxaServer
/**
* Utility to configure Firefox Account stage servers.
@ -17,7 +17,7 @@ object FxaServer {
private const val REDIRECT_URL = "urn:ietf:wg:oauth:2.0:oob:oauth-redirect-webchannel"
@Suppress("UNUSED_PARAMETER")
fun config(context: Context): ServerConfig {
return ServerConfig(Server.STAGE, CLIENT_ID, REDIRECT_URL)
fun config(context: Context): FxaConfig {
return FxaConfig(FxaServer.Stage, CLIENT_ID, REDIRECT_URL)
}
}

View File

@ -33,7 +33,8 @@ class GenericExperimentIntegrationTest {
TestHelper.appContext.settings().showSecretDebugMenuThisSession = false
}
private fun disableStudiesViaStudiesToggle() {
@Test
fun disableStudiesViaStudiesToggle() {
homeScreen {
}.openThreeDotMenu {
}.openSettings {

View File

@ -1,9 +1,14 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"
[packages]
pydantic = "*"
pytest = "*"
pytest-html = "*"
pytest-metadata = "*"

View File

@ -1,7 +1,7 @@
{
"_meta": {
"hash": {
"sha256": "53501c7e751ae79697bf8c7289b6095f49fed97242fe186fea42989e800c39d5"
"sha256": "6dae5ac51aa7817578a25597da1ef783475050538443ba344c88a78969e68fd9"
},
"pipfile-spec": 6,
"requires": {
@ -16,6 +16,14 @@
]
},
"default": {
"annotated-types": {
"hashes": [
"sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43",
"sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"
],
"markers": "python_version >= '3.8'",
"version": "==0.6.0"
},
"certifi": {
"hashes": [
"sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082",
@ -226,23 +234,144 @@
"markers": "python_version >= '3.8'",
"version": "==1.3.0"
},
"pytest": {
"pydantic": {
"hashes": [
"sha256:2f2301e797521b23e4d2585a0a3d7b5e50fdddaaf7e7d6773ea26ddb17c213ab",
"sha256:460c9a59b14e27c602eb5ece2e47bec99dc5fc5f6513cf924a7d03a578991b1f"
"sha256:94f336138093a5d7f426aac732dcfe7ab4eb4da243c88f891d65deb4a2556ee7",
"sha256:bc3ddf669d234f4220e6e1c4d96b061abe0998185a8d7855c0126782b7abc8c1"
],
"index": "pypi",
"markers": "python_version >= '3.7'",
"version": "==7.4.1"
"version": "==2.4.2"
},
"pydantic-core": {
"hashes": [
"sha256:042462d8d6ba707fd3ce9649e7bf268633a41018d6a998fb5fbacb7e928a183e",
"sha256:0523aeb76e03f753b58be33b26540880bac5aa54422e4462404c432230543f33",
"sha256:05560ab976012bf40f25d5225a58bfa649bb897b87192a36c6fef1ab132540d7",
"sha256:0675ba5d22de54d07bccde38997e780044dcfa9a71aac9fd7d4d7a1d2e3e65f7",
"sha256:073d4a470b195d2b2245d0343569aac7e979d3a0dcce6c7d2af6d8a920ad0bea",
"sha256:07ec6d7d929ae9c68f716195ce15e745b3e8fa122fc67698ac6498d802ed0fa4",
"sha256:0880e239827b4b5b3e2ce05e6b766a7414e5f5aedc4523be6b68cfbc7f61c5d0",
"sha256:0c27f38dc4fbf07b358b2bc90edf35e82d1703e22ff2efa4af4ad5de1b3833e7",
"sha256:0d8a8adef23d86d8eceed3e32e9cca8879c7481c183f84ed1a8edc7df073af94",
"sha256:0e2a35baa428181cb2270a15864ec6286822d3576f2ed0f4cd7f0c1708472aff",
"sha256:0f8682dbdd2f67f8e1edddcbffcc29f60a6182b4901c367fc8c1c40d30bb0a82",
"sha256:0fa467fd300a6f046bdb248d40cd015b21b7576c168a6bb20aa22e595c8ffcdd",
"sha256:128552af70a64660f21cb0eb4876cbdadf1a1f9d5de820fed6421fa8de07c893",
"sha256:1396e81b83516b9d5c9e26a924fa69164156c148c717131f54f586485ac3c15e",
"sha256:149b8a07712f45b332faee1a2258d8ef1fb4a36f88c0c17cb687f205c5dc6e7d",
"sha256:14ac492c686defc8e6133e3a2d9eaf5261b3df26b8ae97450c1647286750b901",
"sha256:14cfbb00959259e15d684505263d5a21732b31248a5dd4941f73a3be233865b9",
"sha256:14e09ff0b8fe6e46b93d36a878f6e4a3a98ba5303c76bb8e716f4878a3bee92c",
"sha256:154ea7c52e32dce13065dbb20a4a6f0cc012b4f667ac90d648d36b12007fa9f7",
"sha256:15d6bca84ffc966cc9976b09a18cf9543ed4d4ecbd97e7086f9ce9327ea48891",
"sha256:1d40f55222b233e98e3921df7811c27567f0e1a4411b93d4c5c0f4ce131bc42f",
"sha256:25bd966103890ccfa028841a8f30cebcf5875eeac8c4bde4fe221364c92f0c9a",
"sha256:2cf5bb4dd67f20f3bbc1209ef572a259027c49e5ff694fa56bed62959b41e1f9",
"sha256:2e0e2959ef5d5b8dc9ef21e1a305a21a36e254e6a34432d00c72a92fdc5ecda5",
"sha256:320f14bd4542a04ab23747ff2c8a778bde727158b606e2661349557f0770711e",
"sha256:3625578b6010c65964d177626fde80cf60d7f2e297d56b925cb5cdeda6e9925a",
"sha256:39215d809470f4c8d1881758575b2abfb80174a9e8daf8f33b1d4379357e417c",
"sha256:3f0ac9fb8608dbc6eaf17956bf623c9119b4db7dbb511650910a82e261e6600f",
"sha256:417243bf599ba1f1fef2bb8c543ceb918676954734e2dcb82bf162ae9d7bd514",
"sha256:420a692b547736a8d8703c39ea935ab5d8f0d2573f8f123b0a294e49a73f214b",
"sha256:443fed67d33aa85357464f297e3d26e570267d1af6fef1c21ca50921d2976302",
"sha256:48525933fea744a3e7464c19bfede85df4aba79ce90c60b94d8b6e1eddd67096",
"sha256:485a91abe3a07c3a8d1e082ba29254eea3e2bb13cbbd4351ea4e5a21912cc9b0",
"sha256:4a5be350f922430997f240d25f8219f93b0c81e15f7b30b868b2fddfc2d05f27",
"sha256:4d966c47f9dd73c2d32a809d2be529112d509321c5310ebf54076812e6ecd884",
"sha256:524ff0ca3baea164d6d93a32c58ac79eca9f6cf713586fdc0adb66a8cdeab96a",
"sha256:53df009d1e1ba40f696f8995683e067e3967101d4bb4ea6f667931b7d4a01357",
"sha256:5994985da903d0b8a08e4935c46ed8daf5be1cf217489e673910951dc533d430",
"sha256:5cabb9710f09d5d2e9e2748c3e3e20d991a4c5f96ed8f1132518f54ab2967221",
"sha256:5fdb39f67c779b183b0c853cd6b45f7db84b84e0571b3ef1c89cdb1dfc367325",
"sha256:600d04a7b342363058b9190d4e929a8e2e715c5682a70cc37d5ded1e0dd370b4",
"sha256:631cb7415225954fdcc2a024119101946793e5923f6c4d73a5914d27eb3d3a05",
"sha256:63974d168b6233b4ed6a0046296803cb13c56637a7b8106564ab575926572a55",
"sha256:64322bfa13e44c6c30c518729ef08fda6026b96d5c0be724b3c4ae4da939f875",
"sha256:655f8f4c8d6a5963c9a0687793da37b9b681d9ad06f29438a3b2326d4e6b7970",
"sha256:6835451b57c1b467b95ffb03a38bb75b52fb4dc2762bb1d9dbed8de31ea7d0fc",
"sha256:6db2eb9654a85ada248afa5a6db5ff1cf0f7b16043a6b070adc4a5be68c716d6",
"sha256:7c4d1894fe112b0864c1fa75dffa045720a194b227bed12f4be7f6045b25209f",
"sha256:7eb037106f5c6b3b0b864ad226b0b7ab58157124161d48e4b30c4a43fef8bc4b",
"sha256:8282bab177a9a3081fd3d0a0175a07a1e2bfb7fcbbd949519ea0980f8a07144d",
"sha256:82f55187a5bebae7d81d35b1e9aaea5e169d44819789837cdd4720d768c55d15",
"sha256:8572cadbf4cfa95fb4187775b5ade2eaa93511f07947b38f4cd67cf10783b118",
"sha256:8cdbbd92154db2fec4ec973d45c565e767ddc20aa6dbaf50142676484cbff8ee",
"sha256:8f6e6aed5818c264412ac0598b581a002a9f050cb2637a84979859e70197aa9e",
"sha256:92f675fefa977625105708492850bcbc1182bfc3e997f8eecb866d1927c98ae6",
"sha256:962ed72424bf1f72334e2f1e61b68f16c0e596f024ca7ac5daf229f7c26e4208",
"sha256:9badf8d45171d92387410b04639d73811b785b5161ecadabf056ea14d62d4ede",
"sha256:9c120c9ce3b163b985a3b966bb701114beb1da4b0468b9b236fc754783d85aa3",
"sha256:9f6f3e2598604956480f6c8aa24a3384dbf6509fe995d97f6ca6103bb8c2534e",
"sha256:a1254357f7e4c82e77c348dabf2d55f1d14d19d91ff025004775e70a6ef40ada",
"sha256:a1392e0638af203cee360495fd2cfdd6054711f2db5175b6e9c3c461b76f5175",
"sha256:a1c311fd06ab3b10805abb72109f01a134019739bd3286b8ae1bc2fc4e50c07a",
"sha256:a5cb87bdc2e5f620693148b5f8f842d293cae46c5f15a1b1bf7ceeed324a740c",
"sha256:a7a7902bf75779bc12ccfc508bfb7a4c47063f748ea3de87135d433a4cca7a2f",
"sha256:aad7bd686363d1ce4ee930ad39f14e1673248373f4a9d74d2b9554f06199fb58",
"sha256:aafdb89fdeb5fe165043896817eccd6434aee124d5ee9b354f92cd574ba5e78f",
"sha256:ae8a8843b11dc0b03b57b52793e391f0122e740de3df1474814c700d2622950a",
"sha256:b00bc4619f60c853556b35f83731bd817f989cba3e97dc792bb8c97941b8053a",
"sha256:b1f22a9ab44de5f082216270552aa54259db20189e68fc12484873d926426921",
"sha256:b3c01c2fb081fced3bbb3da78510693dc7121bb893a1f0f5f4b48013201f362e",
"sha256:b3dcd587b69bbf54fc04ca157c2323b8911033e827fffaecf0cafa5a892a0904",
"sha256:b4a6db486ac8e99ae696e09efc8b2b9fea67b63c8f88ba7a1a16c24a057a0776",
"sha256:bec7dd208a4182e99c5b6c501ce0b1f49de2802448d4056091f8e630b28e9a52",
"sha256:c0877239307b7e69d025b73774e88e86ce82f6ba6adf98f41069d5b0b78bd1bf",
"sha256:caa48fc31fc7243e50188197b5f0c4228956f97b954f76da157aae7f67269ae8",
"sha256:cfe1090245c078720d250d19cb05d67e21a9cd7c257698ef139bc41cf6c27b4f",
"sha256:d43002441932f9a9ea5d6f9efaa2e21458221a3a4b417a14027a1d530201ef1b",
"sha256:d64728ee14e667ba27c66314b7d880b8eeb050e58ffc5fec3b7a109f8cddbd63",
"sha256:d6495008733c7521a89422d7a68efa0a0122c99a5861f06020ef5b1f51f9ba7c",
"sha256:d8f1ebca515a03e5654f88411420fea6380fc841d1bea08effb28184e3d4899f",
"sha256:d99277877daf2efe074eae6338453a4ed54a2d93fb4678ddfe1209a0c93a2468",
"sha256:da01bec0a26befab4898ed83b362993c844b9a607a86add78604186297eb047e",
"sha256:db9a28c063c7c00844ae42a80203eb6d2d6bbb97070cfa00194dff40e6f545ab",
"sha256:dda81e5ec82485155a19d9624cfcca9be88a405e2857354e5b089c2a982144b2",
"sha256:e357571bb0efd65fd55f18db0a2fb0ed89d0bb1d41d906b138f088933ae618bb",
"sha256:e544246b859f17373bed915182ab841b80849ed9cf23f1f07b73b7c58baee5fb",
"sha256:e562617a45b5a9da5be4abe72b971d4f00bf8555eb29bb91ec2ef2be348cd132",
"sha256:e570ffeb2170e116a5b17e83f19911020ac79d19c96f320cbfa1fa96b470185b",
"sha256:e6f31a17acede6a8cd1ae2d123ce04d8cca74056c9d456075f4f6f85de055607",
"sha256:e9121b4009339b0f751955baf4543a0bfd6bc3f8188f8056b1a25a2d45099934",
"sha256:ebedb45b9feb7258fac0a268a3f6bec0a2ea4d9558f3d6f813f02ff3a6dc6698",
"sha256:ecaac27da855b8d73f92123e5f03612b04c5632fd0a476e469dfc47cd37d6b2e",
"sha256:ecdbde46235f3d560b18be0cb706c8e8ad1b965e5c13bbba7450c86064e96561",
"sha256:ed550ed05540c03f0e69e6d74ad58d026de61b9eaebebbaaf8873e585cbb18de",
"sha256:eeb3d3d6b399ffe55f9a04e09e635554012f1980696d6b0aca3e6cf42a17a03b",
"sha256:ef337945bbd76cce390d1b2496ccf9f90b1c1242a3a7bc242ca4a9fc5993427a",
"sha256:f1365e032a477c1430cfe0cf2856679529a2331426f8081172c4a74186f1d595",
"sha256:f23b55eb5464468f9e0e9a9935ce3ed2a870608d5f534025cd5536bca25b1402",
"sha256:f2e9072d71c1f6cfc79a36d4484c82823c560e6f5599c43c1ca6b5cdbd54f881",
"sha256:f323306d0556351735b54acbf82904fe30a27b6a7147153cbe6e19aaaa2aa429",
"sha256:f36a3489d9e28fe4b67be9992a23029c3cec0babc3bd9afb39f49844a8c721c5",
"sha256:f64f82cc3443149292b32387086d02a6c7fb39b8781563e0ca7b8d7d9cf72bd7",
"sha256:f6defd966ca3b187ec6c366604e9296f585021d922e666b99c47e78738b5666c",
"sha256:f7c2b8eb9fc872e68b46eeaf835e86bccc3a58ba57d0eedc109cbb14177be531",
"sha256:fa7db7558607afeccb33c0e4bf1c9a9a835e26599e76af6fe2fcea45904083a6",
"sha256:fcb83175cc4936a5425dde3356f079ae03c0802bbdf8ff82c035f8a54b333521"
],
"markers": "python_version >= '3.7'",
"version": "==2.10.1"
},
"pytest": {
"hashes": [
"sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002",
"sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"
],
"index": "pypi",
"markers": "python_version >= '3.7'",
"version": "==7.4.2"
},
"pytest-html": {
"hashes": [
"sha256:3b473cc278272f8b5a34cd3bf10f88ac5fcb17cb5af22f9323514af00c310e64",
"sha256:79c4677ed6196417bf290d8b81f706342ae49f726f623728efa3f7dfff09f8eb"
"sha256:88682b9e8e51392472546a70a2139b27d6bc1834a4afd3e41da33c9d9f91e4a4",
"sha256:907c3e68462df129d3ee96dee58bd63f70216b06421836b22fd3fd57ef314acb"
],
"index": "pypi",
"markers": "python_version >= '3.8'",
"version": "==4.0.0"
"version": "==4.0.2"
},
"pytest-metadata": {
"hashes": [
@ -328,12 +457,19 @@
"markers": "python_version >= '3.7'",
"version": "==2.31.0"
},
"typing-extensions": {
"hashes": [
"sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0",
"sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"
],
"markers": "python_version >= '3.8'",
"version": "==4.8.0"
},
"urllib3": {
"hashes": [
"sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84",
"sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"
],
"index": "pypi",
"markers": "python_version >= '3.7'",
"version": "==2.0.7"
}
@ -341,32 +477,28 @@
"develop": {
"black": {
"hashes": [
"sha256:01ede61aac8c154b55f35301fac3e730baf0c9cf8120f65a9cd61a81cfb4a0c3",
"sha256:022a582720b0d9480ed82576c920a8c1dde97cc38ff11d8d8859b3bd6ca9eedb",
"sha256:25cc308838fe71f7065df53aedd20327969d05671bac95b38fdf37ebe70ac087",
"sha256:27eb7a0c71604d5de083757fbdb245b1a4fae60e9596514c6ec497eb63f95320",
"sha256:327a8c2550ddc573b51e2c352adb88143464bb9d92c10416feb86b0f5aee5ff6",
"sha256:47e56d83aad53ca140da0af87678fb38e44fd6bc0af71eebab2d1f59b1acf1d3",
"sha256:501387a9edcb75d7ae8a4412bb8749900386eaef258f1aefab18adddea1936bc",
"sha256:552513d5cd5694590d7ef6f46e1767a4df9af168d449ff767b13b084c020e63f",
"sha256:5c4bc552ab52f6c1c506ccae05681fab58c3f72d59ae6e6639e8885e94fe2587",
"sha256:642496b675095d423f9b8448243336f8ec71c9d4d57ec17bf795b67f08132a91",
"sha256:6d1c6022b86f83b632d06f2b02774134def5d4d4f1dac8bef16d90cda18ba28a",
"sha256:7f3bf2dec7d541b4619b8ce526bda74a6b0bffc480a163fed32eb8b3c9aed8ad",
"sha256:831d8f54c3a8c8cf55f64d0422ee875eecac26f5f649fb6c1df65316b67c8926",
"sha256:8417dbd2f57b5701492cd46edcecc4f9208dc75529bcf76c514864e48da867d9",
"sha256:86cee259349b4448adb4ef9b204bb4467aae74a386bce85d56ba4f5dc0da27be",
"sha256:893695a76b140881531062d48476ebe4a48f5d1e9388177e175d76234ca247cd",
"sha256:9fd59d418c60c0348505f2ddf9609c1e1de8e7493eab96198fc89d9f865e7a96",
"sha256:ad0014efc7acf0bd745792bd0d8857413652979200ab924fbf239062adc12491",
"sha256:b5b0ee6d96b345a8b420100b7d71ebfdd19fab5e8301aff48ec270042cd40ac2",
"sha256:c333286dc3ddca6fdff74670b911cccedacb4ef0a60b34e491b8a67c833b343a",
"sha256:f9062af71c59c004cd519e2fb8f5d25d39e46d3af011b41ab43b9c74e27e236f",
"sha256:fb074d8b213749fa1d077d630db0d5f8cc3b2ae63587ad4116e8a436e9bbe995"
"sha256:0e232f24a337fed7a82c1185ae46c56c4a6167fb0fe37411b43e876892c76699",
"sha256:30b78ac9b54cf87bcb9910ee3d499d2bc893afd52495066c49d9ee6b21eee06e",
"sha256:31946ec6f9c54ed7ba431c38bc81d758970dd734b96b8e8c2b17a367d7908171",
"sha256:31b9f87b277a68d0e99d2905edae08807c007973eaa609da5f0c62def6b7c0bd",
"sha256:47c4510f70ec2e8f9135ba490811c071419c115e46f143e4dce2ac45afdcf4c9",
"sha256:481167c60cd3e6b1cb8ef2aac0f76165843a374346aeeaa9d86765fe0dd0318b",
"sha256:6901631b937acbee93c75537e74f69463adaf34379a04eef32425b88aca88a23",
"sha256:76baba9281e5e5b230c9b7f83a96daf67a95e919c2dfc240d9e6295eab7b9204",
"sha256:7fb5fc36bb65160df21498d5a3dd330af8b6401be3f25af60c6ebfe23753f747",
"sha256:960c21555be135c4b37b7018d63d6248bdae8514e5c55b71e994ad37407f45b8",
"sha256:a3c2ddb35f71976a4cfeca558848c2f2f89abc86b06e8dd89b5a65c1e6c0f22a",
"sha256:c870bee76ad5f7a5ea7bd01dc646028d05568d33b0b09b7ecfc8ec0da3f3f39c",
"sha256:d3d9129ce05b0829730323bdcb00f928a448a124af5acf90aa94d9aba6969604",
"sha256:db451a3363b1e765c172c3fd86213a4ce63fb8524c938ebd82919bf2a6e28c6a",
"sha256:e223b731a0e025f8ef427dd79d8cd69c167da807f5710add30cdf131f13dd62e",
"sha256:f20ff03f3fdd2fd4460b4f631663813e57dc277e37fb216463f3b907aa5a9bdd",
"sha256:f74892b4b836e5162aa0452393112a574dac85e13902c57dfbaaf388e4eda37c",
"sha256:f8dc7d50d94063cdfd13c82368afd8588bac4ce360e4224ac399e769d6704e98"
],
"index": "pypi",
"markers": "python_version >= '3.8'",
"version": "==23.7.0"
"version": "==23.10.0"
},
"click": {
"hashes": [

View File

@ -1,3 +1,7 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
import json
import logging
import os
@ -9,6 +13,7 @@ import pytest
import requests
from experimentintegration.gradlewbuild import GradlewBuild
from experimentintegration.models.models import TelemetryModel
KLAATU_SERVER_URL = "http://localhost:1378"
KLAATU_LOCAL_SERVER_URL = "http://localhost:1378"
@ -25,7 +30,6 @@ def pytest_addoption(parser):
)
@pytest.fixture(name="load_branches")
def fixture_load_branches(experiment_url):
branches = []
@ -68,7 +72,7 @@ def fixture_experiment_data(experiment_url):
item["style"] = "URGENT"
for count, trigger in enumerate(item["trigger"]):
if "USER_EN_SPEAKER" not in trigger:
del(item["trigger"][count])
del item["trigger"][count]
return [data]
@ -157,9 +161,50 @@ def fixture_send_test_results():
pass
@pytest.fixture(name="check_ping_for_experiment")
def fixture_check_ping_for_experiment(experiment_slug, variables):
def _check_ping_for_experiment(
branch=None, experiment=experiment_slug, reason=None
):
model = TelemetryModel(branch=branch, experiment=experiment)
timeout = time.time() + 60 * 5
while time.time() < timeout:
data = requests.get(f"{variables['urls']['telemetry_server']}/pings").json()
events = []
for item in data:
event_items = item.get("events")
if event_items:
for event in event_items:
if (
"category" in event
and "nimbus_events" in event["category"]
and "extra" in event
and "branch" in event["extra"]
):
events.append(event)
for event in events:
event_name = event.get("name")
if (reason == "enrollment" and event_name == "enrollment") or (
reason == "unenrollment"
and event_name in ["unenrollment", "disqualification"]
):
telemetry_model = TelemetryModel(
branch=event["extra"]["branch"],
experiment=event["extra"]["experiment"],
)
if model == telemetry_model:
return True
time.sleep(5)
return False
return _check_ping_for_experiment
@pytest.fixture(name="setup_experiment")
def fixture_setup_experiment(experiment_slug, json_data, gradlewbuild_log):
def fixture_setup_experiment(experiment_slug, json_data, gradlewbuild_log, variables):
def _(branch):
requests.delete(f"{variables['urls']['telemetry_server']}/pings")
logging.info(f"Testing experiment {experiment_slug}, BRANCH: {branch[0]}")
command = f"nimbus-cli --app fenix --channel developer enroll {experiment_slug} --branch {branch[0]} --file {json_data} --reset-app"
logging.info(f"Running command {command}")

View File

@ -0,0 +1,82 @@
from pathlib import Path
import subprocess
import yaml
def search_for_smoke_tests(tests_name):
"""Searches for smoke tests within the requested test module."""
path = Path("../ui")
files = sorted([x for x in path.iterdir() if x.is_file()])
locations = []
file_name = None
test_names = []
for name in files:
if tests_name in name.name:
file_name = name
break
with open(file_name, "r") as file:
code = file.read().split(" ")
code = [item for item in code if item != ""]
for count, item in enumerate(code):
if "class" in item or "@SmokeTest" in item:
locations.append(count)
for location in locations:
if len(test_names) == 0:
class_name = code[location + 1]
test_names.append(class_name)
else:
test_names.append(f"{class_name}#{code[location+3].strip('()')}")
return test_names
def create_test_file():
"""Create the python file to hold the tests."""
path = Path("tests/")
filename = "test_smoke_scenarios.py"
final_path = path / filename
if final_path.exists():
print("File Exists, you need to delete it to create a new one.")
return
# file exists
subprocess.run([f"touch {final_path}"], encoding="utf8", shell=True)
assert final_path.exists()
with open(final_path, "w") as file:
file.write("import pytest\n\n")
def generate_smoke_tests(tests_names=None):
"""Generate pytest code for the requested tests."""
pytest_file = "tests/test_smoke_scenarios.py"
tests = []
for test in tests_names[1:]:
test_name = test.replace("#", "_").lower()
tests.append(
f"""
@pytest.mark.smoke_test
def test_smoke_{test_name}(setup_experiment, gradlewbuild, load_branches, check_ping_for_experiment):
setup_experiment(load_branches)
gradlewbuild.test("{test}", smoke=True)
assert check_ping_for_experiment
"""
)
with open(pytest_file, "a") as file:
for item in tests:
file.writelines(f"{item}")
if __name__ == "__main__":
test_modules = None
create_test_file()
with open("variables.yaml", "r") as file:
test_modules = yaml.safe_load(file)
for item in test_modules.get("smoke_tests"):
tests = search_for_smoke_tests(item)
generate_smoke_tests(tests)

View File

@ -16,12 +16,17 @@ class GradlewBuild(object):
def __init__(self, log):
self.log = log
def test(self, identifier):
def test(self, identifier, smoke=None):
# self.adbrun.launch()
# Change path accordingly to go to root folder to run gradlew
os.chdir("../../../../../../../..")
cmd = f"adb shell am instrument -w -e class org.mozilla.fenix.experimentintegration.{identifier} org.mozilla.fenix.debug.test/androidx.test.runner.AndroidJUnitRunner"
test_type = "ui" if smoke else "experimentintegration"
cmd = f"adb shell am instrument -w -e class org.mozilla.fenix.{test_type}.{identifier} org.mozilla.fenix.debug.test/androidx.test.runner.AndroidJUnitRunner"
# if smoke:
# cmd = f"adb shell am instrument -w -e class org.mozilla.fenix.ui.{identifier} org.mozilla.fenix.debug.test/androidx.test.runner.AndroidJUnitRunner"
# else:
# cmd = f"adb shell am instrument -w -e class org.mozilla.fenix.experimentintegration.{identifier} org.mozilla.fenix.debug.test/androidx.test.runner.AndroidJUnitRunner"
self.logger.info("Running cmd: {}".format(cmd))

View File

@ -0,0 +1,3 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

View File

@ -0,0 +1,14 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
"""Data class Models"""
from pydantic import BaseModel
class TelemetryModel(BaseModel):
"""Experiment Telemetry model"""
branch: str
experiment: str

View File

@ -1,12 +1,17 @@
import pytest
@pytest.mark.parametrize("load_branches", [("branch")], indirect=True)
def test_experiment_unenrolls_via_studies_toggle(setup_experiment, gradlewbuild, load_branches):
def test_experiment_unenrolls_via_studies_toggle(setup_experiment, gradlewbuild, load_branches, check_ping_for_experiment):
setup_experiment(load_branches)
gradlewbuild.test("GenericExperimentIntegrationTest#disableStudiesViaStudiesToggle")
gradlewbuild.test("GenericExperimentIntegrationTest#testExperimentUnenrolls")
assert check_ping_for_experiment(reason="enrollment", branch=load_branches[0])
gradlewbuild.test("GenericExperimentIntegrationTest#testExperimentUnenrolled")
assert check_ping_for_experiment(reason="unenrollment", branch=load_branches[0])
@pytest.mark.parametrize("load_branches", [("branch")], indirect=True)
def test_experiment_unenrolls_via_secret_menu(setup_experiment, gradlewbuild, load_branches):
def test_experiment_unenrolls_via_secret_menu(setup_experiment, gradlewbuild, load_branches, check_ping_for_experiment):
setup_experiment(load_branches)
gradlewbuild.test("GenericExperimentIntegrationTest#testExperimentUnenrollsViaSecretMenu")
gradlewbuild.test("GenericExperimentIntegrationTest#testExperimentUnenrolledViaSecretMenu")
assert check_ping_for_experiment(reason="enrollment", branch=load_branches[0])
gradlewbuild.test("GenericExperimentIntegrationTest#testExperimentUnenrolled")
assert check_ping_for_experiment(reason="unenrollment", branch=load_branches[0])

View File

@ -1,22 +1,47 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
import pytest
@pytest.mark.parametrize("load_branches", [("branch")], indirect=True)
def test_survey_navigates_correctly(setup_experiment, gradlewbuild, load_branches):
def test_survey_navigates_correctly(
setup_experiment, gradlewbuild, load_branches, check_ping_for_experiment
):
setup_experiment(load_branches)
gradlewbuild.test("SurveyExperimentIntegrationTest#checkSurveyNavigatesCorrectly")
assert check_ping_for_experiment(reason="enrollment", branch=load_branches[0])
@pytest.mark.parametrize("load_branches", [("branch")], indirect=True)
def test_survey_no_thanks_navigates_correctly(setup_experiment, gradlewbuild, load_branches):
def test_survey_no_thanks_navigates_correctly(
setup_experiment, gradlewbuild, load_branches, check_ping_for_experiment
):
setup_experiment(load_branches)
gradlewbuild.test("SurveyExperimentIntegrationTest#checkSurveyNoThanksNavigatesCorrectly")
gradlewbuild.test(
"SurveyExperimentIntegrationTest#checkSurveyNoThanksNavigatesCorrectly"
)
assert check_ping_for_experiment(reason="enrollment", branch=load_branches[0])
@pytest.mark.parametrize("load_branches", [("branch")], indirect=True)
def test_homescreen_survey_dismisses_correctly(setup_experiment, gradlewbuild, load_branches):
def test_homescreen_survey_dismisses_correctly(
setup_experiment, gradlewbuild, load_branches, check_ping_for_experiment
):
setup_experiment(load_branches)
gradlewbuild.test("SurveyExperimentIntegrationTest#checkHomescreenSurveyDismissesCorrectly")
gradlewbuild.test(
"SurveyExperimentIntegrationTest#checkHomescreenSurveyDismissesCorrectly"
)
assert check_ping_for_experiment(reason="enrollment", branch=load_branches[0])
@pytest.mark.parametrize("load_branches", [("branch")], indirect=True)
def test_survey_landscape_looks_correct(setup_experiment, gradlewbuild, load_branches):
def test_survey_landscape_looks_correct(
setup_experiment, gradlewbuild, load_branches, check_ping_for_experiment
):
setup_experiment(load_branches)
gradlewbuild.test("SurveyExperimentIntegrationTest#checkSurveyLandscapeLooksCorrect")
gradlewbuild.test(
"SurveyExperimentIntegrationTest#checkSurveyLandscapeLooksCorrect"
)
assert check_ping_for_experiment(reason="enrollment", branch=load_branches[0])

View File

@ -1,3 +1,10 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
urls:
stage_server: "https://stage.experimenter.nonprod.dataops.mozgcp.net"
prod_server: "https://experimenter.services.mozilla.com"
telemetry_server: "http://172.25.58.187:5000"
smoke_tests:
- "AddressAutofillTest"

View File

@ -0,0 +1,362 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
@file:Suppress("DEPRECATION")
package org.mozilla.fenix.helpers
import android.Manifest
import android.app.ActivityManager
import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.content.res.Configuration
import android.net.Uri
import android.os.Build
import android.os.storage.StorageManager
import android.os.storage.StorageVolume
import android.provider.Settings
import android.util.Log
import androidx.annotation.RequiresApi
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.test.espresso.Espresso
import androidx.test.espresso.IdlingRegistry
import androidx.test.espresso.IdlingResource
import androidx.test.espresso.intent.Intents.intended
import androidx.test.espresso.intent.matcher.IntentMatchers.toPackage
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.ActivityTestRule
import androidx.test.runner.permission.PermissionRequester
import androidx.test.uiautomator.By
import androidx.test.uiautomator.UiObject
import androidx.test.uiautomator.UiSelector
import androidx.test.uiautomator.Until
import junit.framework.AssertionFailedError
import org.junit.Assert
import org.junit.Assert.assertEquals
import org.mozilla.fenix.Config
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.customtabs.ExternalAppBrowserActivity
import org.mozilla.fenix.helpers.Constants.PackageName.YOUTUBE_APP
import org.mozilla.fenix.helpers.Constants.TAG
import org.mozilla.fenix.helpers.TestHelper.mDevice
import org.mozilla.fenix.helpers.ext.waitNotNull
import org.mozilla.fenix.helpers.idlingresource.NetworkConnectionIdlingResource
import org.mozilla.fenix.ui.robots.BrowserRobot
import org.mozilla.gecko.util.ThreadUtils
import java.io.File
import java.util.Locale
object AppAndSystemHelper {
fun getPermissionAllowID(): String {
return when
(Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
true -> "com.android.permissioncontroller"
false -> "com.android.packageinstaller"
}
}
@RequiresApi(Build.VERSION_CODES.R)
fun deleteDownloadedFileOnStorage(fileName: String) {
val storageManager: StorageManager? = TestHelper.appContext.getSystemService(Context.STORAGE_SERVICE) as StorageManager?
val storageVolumes = storageManager!!.storageVolumes
val storageVolume: StorageVolume = storageVolumes[0]
val file = File(storageVolume.directory!!.path + "/Download/" + fileName)
try {
if (file.exists()) {
file.delete()
Log.d("TestLog", "File delete try 1")
Assert.assertFalse("The file was not deleted", file.exists())
}
} catch (e: AssertionError) {
file.delete()
Log.d("TestLog", "File delete retried")
Assert.assertFalse("The file was not deleted", file.exists())
}
}
@RequiresApi(Build.VERSION_CODES.R)
fun clearDownloadsFolder() {
val storageManager: StorageManager? = TestHelper.appContext.getSystemService(Context.STORAGE_SERVICE) as StorageManager?
val storageVolumes = storageManager!!.storageVolumes
val storageVolume: StorageVolume = storageVolumes[0]
val downloadsFolder = File(storageVolume.directory!!.path + "/Download/")
// Check if the downloads folder exists
if (downloadsFolder.exists() && downloadsFolder.isDirectory) {
Log.i(TAG, "clearDownloadsFolder: Verified that \"DOWNLOADS\" folder exists")
val files = downloadsFolder.listFiles()
// Check if the folder is not empty
if (files != null && files.isNotEmpty()) {
Log.i(TAG, "clearDownloadsFolder: Verified that \"DOWNLOADS\" folder is not empty")
// Delete all files in the folder
for (file in files) {
file.delete()
Log.i(TAG, "clearDownloadsFolder: Deleted $file from \"DOWNLOADS\" folder")
}
}
}
}
fun setNetworkEnabled(enabled: Boolean) {
val networkDisconnectedIdlingResource = NetworkConnectionIdlingResource(false)
val networkConnectedIdlingResource = NetworkConnectionIdlingResource(true)
when (enabled) {
true -> {
mDevice.executeShellCommand("svc data enable")
mDevice.executeShellCommand("svc wifi enable")
// Wait for network connection to be completely enabled
IdlingRegistry.getInstance().register(networkConnectedIdlingResource)
Espresso.onIdle {
IdlingRegistry.getInstance().unregister(networkConnectedIdlingResource)
}
Log.i(TAG, "setNetworkEnabled: Network connection was enabled")
}
false -> {
mDevice.executeShellCommand("svc data disable")
mDevice.executeShellCommand("svc wifi disable")
// Wait for network connection to be completely disabled
IdlingRegistry.getInstance().register(networkDisconnectedIdlingResource)
Espresso.onIdle {
IdlingRegistry.getInstance().unregister(networkDisconnectedIdlingResource)
}
Log.i(TAG, "setNetworkEnabled: Network connection was disabled")
}
}
}
fun isPackageInstalled(packageName: String): Boolean {
return try {
val packageManager = InstrumentationRegistry.getInstrumentation().context.packageManager
packageManager.getApplicationInfo(packageName, 0).enabled
} catch (e: PackageManager.NameNotFoundException) {
Log.i(TAG, "isPackageInstalled: Catch block - ${e.message}")
false
}
}
fun assertExternalAppOpens(appPackageName: String) {
if (isPackageInstalled(appPackageName)) {
Log.i(TAG, "assertExternalAppOpens: $appPackageName is installed on device")
try {
Log.i(TAG, "assertExternalAppOpens: Try block")
intended(toPackage(appPackageName))
Log.i(TAG, "assertExternalAppOpens: Matched intent to $appPackageName")
} catch (e: AssertionFailedError) {
Log.i(TAG, "assertExternalAppOpens: Catch block - ${e.message}")
}
} else {
mDevice.waitNotNull(
Until.findObject(By.text("Could not open file")),
TestAssetHelper.waitingTime,
)
Log.i(TAG, "assertExternalAppOpens: Verified \"Could not open file\" message")
}
}
fun assertNativeAppOpens(appPackageName: String, url: String = "") {
if (isPackageInstalled(appPackageName)) {
mDevice.waitForIdle(TestAssetHelper.waitingTimeShort)
Assert.assertTrue(
TestHelper.mDevice.findObject(UiSelector().packageName(appPackageName))
.waitForExists(TestAssetHelper.waitingTime),
)
} else {
BrowserRobot().verifyUrl(url)
}
}
fun assertYoutubeAppOpens() = intended(toPackage(YOUTUBE_APP))
/**
* Checks whether the latest activity of the application is used for custom tabs or PWAs.
*
* @return Boolean value that helps us know if the current activity supports custom tabs or PWAs.
*/
fun isExternalAppBrowserActivityInCurrentTask(): Boolean {
val activityManager = TestHelper.appContext.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
mDevice.waitForIdle(TestAssetHelper.waitingTimeShort)
return activityManager.appTasks[0].taskInfo.topActivity!!.className == ExternalAppBrowserActivity::class.java.name
}
/**
* Run test with automatically registering idling resources and cleanup.
*
* @param idlingResources zero or more [IdlingResource] to be used when running [testBlock].
* @param testBlock test code to execute.
*/
fun registerAndCleanupIdlingResources(
vararg idlingResources: IdlingResource,
testBlock: () -> Unit,
) {
idlingResources.forEach {
IdlingRegistry.getInstance().register(it)
}
try {
testBlock()
} finally {
idlingResources.forEach {
IdlingRegistry.getInstance().unregister(it)
}
}
}
// Permission allow dialogs differ on various Android APIs
fun grantSystemPermission() {
val whileUsingTheAppPermissionButton: UiObject =
mDevice.findObject(UiSelector().textContains("While using the app"))
val allowPermissionButton: UiObject =
mDevice.findObject(
UiSelector()
.textContains("Allow")
.className("android.widget.Button"),
)
if (Build.VERSION.SDK_INT >= 23) {
if (whileUsingTheAppPermissionButton.waitForExists(TestAssetHelper.waitingTimeShort)) {
whileUsingTheAppPermissionButton.click()
} else if (allowPermissionButton.waitForExists(TestAssetHelper.waitingTimeShort)) {
allowPermissionButton.click()
}
}
}
// Permission deny dialogs differ on various Android APIs
fun denyPermission() {
mDevice.findObject(UiSelector().textContains("Deny")).waitForExists(TestAssetHelper.waitingTime)
mDevice.findObject(UiSelector().textContains("Deny")).click()
}
fun isTestLab(): Boolean {
return Settings.System.getString(TestHelper.appContext.contentResolver, "firebase.test.lab").toBoolean()
}
/**
* Changes the default language of the entire device, not just the app.
* Runs on Debug variant as we don't want to adjust Release permission manifests
* Runs the test in its testBlock.
* Cleans up and sets the default locale after it's done.
*/
fun runWithSystemLocaleChanged(locale: Locale, testRule: ActivityTestRule<HomeActivity>, testBlock: () -> Unit) {
if (Config.channel.isDebug) {
/* Sets permission to change device language */
PermissionRequester().apply {
addPermissions(
Manifest.permission.CHANGE_CONFIGURATION,
)
requestPermissions()
}
val defaultLocale = Locale.getDefault()
try {
setSystemLocale(locale)
testBlock()
ThreadUtils.runOnUiThread { testRule.activity.recreate() }
} catch (e: Exception) {
e.printStackTrace()
} finally {
setSystemLocale(defaultLocale)
}
}
}
/**
* Changes the default language of the entire device, not just the app.
*/
fun setSystemLocale(locale: Locale) {
val activityManagerNative = Class.forName("android.app.ActivityManagerNative")
val am = activityManagerNative.getMethod("getDefault", *arrayOfNulls(0))
.invoke(activityManagerNative, *arrayOfNulls(0))
val config = InstrumentationRegistry.getInstrumentation().context.resources.configuration
config.javaClass.getDeclaredField("locale")[config] = locale
config.javaClass.getDeclaredField("userSetLocale").setBoolean(config, true)
am.javaClass.getMethod(
"updateConfiguration",
Configuration::class.java,
).invoke(am, config)
}
fun putAppToBackground() {
mDevice.pressRecentApps()
mDevice.findObject(UiSelector().resourceId("${TestHelper.packageName}:id/container")).waitUntilGone(
TestAssetHelper.waitingTime,
)
}
fun bringAppToForeground() {
mDevice.pressRecentApps()
mDevice.findObject(UiSelector().resourceId("${TestHelper.packageName}:id/container")).waitForExists(
TestAssetHelper.waitingTime,
)
}
fun verifyKeyboardVisibility(isExpectedToBeVisible: Boolean = true) {
mDevice.waitForIdle()
assertEquals(
"Keyboard not shown",
isExpectedToBeVisible,
mDevice
.executeShellCommand("dumpsys input_method | grep mInputShown")
.contains("mInputShown=true"),
)
}
fun openAppFromExternalLink(url: String) {
val context = InstrumentationRegistry.getInstrumentation().getTargetContext()
val intent = Intent().apply {
action = Intent.ACTION_VIEW
data = Uri.parse(url)
`package` = TestHelper.packageName
flags = Intent.FLAG_ACTIVITY_NEW_TASK
}
try {
context.startActivity(intent)
} catch (ex: ActivityNotFoundException) {
intent.setPackage(null)
context.startActivity(intent)
}
}
/**
* Wrapper for tests to run only when certain conditions are met.
* For example: this method will avoid accidentally running a test on GV versions where the feature is disabled.
*/
fun runWithCondition(condition: Boolean, testBlock: () -> Unit) {
if (condition) {
testBlock()
}
}
/**
* Wrapper to launch the app using the launcher intent.
*/
fun runWithLauncherIntent(
activityTestRule: AndroidComposeTestRule<HomeActivityIntentTestRule, HomeActivity>,
testBlock: () -> Unit,
) {
val launcherIntent = Intent(Intent.ACTION_MAIN).apply {
addCategory(Intent.CATEGORY_LAUNCHER)
}
activityTestRule.activityRule.withIntent(launcherIntent).launchActivity(launcherIntent)
try {
testBlock()
} catch (e: Exception) {
e.printStackTrace()
}
}
}

View File

@ -4,10 +4,13 @@
package org.mozilla.fenix.helpers
import org.mozilla.fenix.helpers.TestHelper.getSponsoredShortcutTitle
import org.mozilla.fenix.helpers.DataGenerationHelper.getSponsoredShortcutTitle
object Constants {
// Tag used for logging
const val TAG = "MozUITestLog"
// Device or AVD requires a Google Services Android OS installation
object PackageName {
const val GOOGLE_PLAY_SERVICES = "com.android.vending"
@ -18,6 +21,7 @@ object Constants {
const val GMAIL_APP = "com.google.android.gm"
const val PHONE_APP = "com.android.dialer"
const val ANDROID_SETTINGS = "com.android.settings"
const val PRINT_SPOOLER = "com.android.printspooler"
}
const val SPEECH_RECOGNITION = "android.speech.action.RECOGNIZE_SPEECH"

View File

@ -0,0 +1,113 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.helpers
import android.app.PendingIntent
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.net.Uri
import androidx.browser.customtabs.CustomTabsIntent
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiSelector
import mozilla.components.browser.state.search.SearchEngine
import mozilla.components.browser.state.state.availableSearchEngines
import org.junit.Assert
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.TestHelper.mDevice
import org.mozilla.fenix.utils.IntentUtils
object DataGenerationHelper {
val appContext: Context = InstrumentationRegistry.getInstrumentation().targetContext
fun createCustomTabIntent(
pageUrl: String,
customMenuItemLabel: String = "",
customActionButtonDescription: String = "",
): Intent {
val appContext = InstrumentationRegistry.getInstrumentation()
.targetContext
.applicationContext
val pendingIntent = PendingIntent.getActivity(appContext, 0, Intent(), IntentUtils.defaultIntentPendingFlags)
val customTabsIntent = CustomTabsIntent.Builder()
.addMenuItem(customMenuItemLabel, pendingIntent)
.setShareState(CustomTabsIntent.SHARE_STATE_ON)
.setActionButton(
createTestBitmap(),
customActionButtonDescription,
pendingIntent,
true,
)
.build()
customTabsIntent.intent.data = Uri.parse(pageUrl)
return customTabsIntent.intent
}
private fun createTestBitmap(): Bitmap {
val bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
canvas.drawColor(Color.GREEN)
return bitmap
}
fun getStringResource(id: Int, argument: String = TestHelper.appName) = TestHelper.appContext.resources.getString(id, argument)
private val charPool: List<Char> = ('a'..'z') + ('A'..'Z') + ('0'..'9')
fun generateRandomString(stringLength: Int) =
(1..stringLength)
.map { kotlin.random.Random.nextInt(0, charPool.size) }
.map(charPool::get)
.joinToString("")
/**
* Creates clipboard data.
*/
fun setTextToClipBoard(context: Context, message: String) {
val clipBoard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clipData = ClipData.newPlainText("label", message)
clipBoard.setPrimaryClip(clipData)
}
/**
* Returns sponsored shortcut title based on the index.
*/
fun getSponsoredShortcutTitle(position: Int): String {
val sponsoredShortcut = mDevice.findObject(
UiSelector()
.resourceId("${TestHelper.packageName}:id/top_site_item")
.index(position - 1),
).getChild(
UiSelector()
.resourceId("${TestHelper.packageName}:id/top_site_title"),
).text
return sponsoredShortcut
}
/**
* The list of Search engines for the "home" region of the user.
* For en-us it will return the 6 engines selected by default: Google, Bing, DuckDuckGo, Amazon, Ebay, Wikipedia.
*/
fun getRegionSearchEnginesList(): List<SearchEngine> {
val searchEnginesList = appContext.components.core.store.state.search.regionSearchEngines
Assert.assertTrue("Search engines list returned nothing", searchEnginesList.isNotEmpty())
return searchEnginesList
}
/**
* The list of Search engines available to be added by user choice.
* For en-us it will return the 2 engines: Reddit, Youtube.
*/
fun getAvailableSearchEngines(): List<SearchEngine> {
val searchEnginesList = TestHelper.appContext.components.core.store.state.search.availableSearchEngines
Assert.assertTrue("Search engines list returned nothing", searchEnginesList.isNotEmpty())
return searchEnginesList
}
}

View File

@ -67,11 +67,6 @@ interface FeatureSettingsHelper {
*/
var etpPolicy: ETPPolicy
/**
* Enable or disable cookie banner reduction dialog.
*/
var isCookieBannerReductionDialogEnabled: Boolean
/**
* Enable or disable open in app banner.
*/

View File

@ -33,7 +33,6 @@ class FeatureSettingsHelperDelegate() : FeatureSettingsHelper {
isTCPCFREnabled = settings.shouldShowTotalCookieProtectionCFR,
isWallpaperOnboardingEnabled = settings.showWallpaperOnboarding,
isDeleteSitePermissionsEnabled = settings.deleteSitePermissions,
isCookieBannerReductionDialogEnabled = !settings.userOptOutOfReEngageCookieBannerDialog,
isOpenInAppBannerEnabled = settings.shouldShowOpenInAppBanner,
etpPolicy = getETPPolicy(settings),
tabsTrayRewriteEnabled = settings.enableTabsTrayToCompose,
@ -63,7 +62,6 @@ class FeatureSettingsHelperDelegate() : FeatureSettingsHelper {
override var isRecentlyVisitedFeatureEnabled: Boolean by updatedFeatureFlags::isRecentlyVisitedFeatureEnabled
override var isPWAsPromptEnabled: Boolean by updatedFeatureFlags::isPWAsPromptEnabled
override var isTCPCFREnabled: Boolean by updatedFeatureFlags::isTCPCFREnabled
override var isCookieBannerReductionDialogEnabled: Boolean by updatedFeatureFlags::isCookieBannerReductionDialogEnabled
override var isOpenInAppBannerEnabled: Boolean by updatedFeatureFlags::isOpenInAppBannerEnabled
override var etpPolicy: ETPPolicy by updatedFeatureFlags::etpPolicy
override var tabsTrayRewriteEnabled: Boolean by updatedFeatureFlags::tabsTrayRewriteEnabled
@ -90,7 +88,6 @@ class FeatureSettingsHelperDelegate() : FeatureSettingsHelper {
settings.shouldShowTotalCookieProtectionCFR = featureFlags.isTCPCFREnabled
settings.showWallpaperOnboarding = featureFlags.isWallpaperOnboardingEnabled
settings.deleteSitePermissions = featureFlags.isDeleteSitePermissionsEnabled
settings.userOptOutOfReEngageCookieBannerDialog = !featureFlags.isCookieBannerReductionDialogEnabled
settings.shouldShowOpenInAppBanner = featureFlags.isOpenInAppBannerEnabled
settings.enableTabsTrayToCompose = featureFlags.tabsTrayRewriteEnabled
settings.enableComposeTopSites = featureFlags.composeTopSitesEnabled
@ -109,7 +106,6 @@ private data class FeatureFlags(
var isTCPCFREnabled: Boolean,
var isWallpaperOnboardingEnabled: Boolean,
var isDeleteSitePermissionsEnabled: Boolean,
var isCookieBannerReductionDialogEnabled: Boolean,
var isOpenInAppBannerEnabled: Boolean,
var etpPolicy: ETPPolicy,
var tabsTrayRewriteEnabled: Boolean,

View File

@ -52,7 +52,6 @@ class HomeActivityTestRule(
isTCPCFREnabled: Boolean = settings.shouldShowTotalCookieProtectionCFR,
isWallpaperOnboardingEnabled: Boolean = settings.showWallpaperOnboarding,
isDeleteSitePermissionsEnabled: Boolean = settings.deleteSitePermissions,
isCookieBannerReductionDialogEnabled: Boolean = !settings.userOptOutOfReEngageCookieBannerDialog,
isOpenInAppBannerEnabled: Boolean = settings.shouldShowOpenInAppBanner,
etpPolicy: ETPPolicy = getETPPolicy(settings),
tabsTrayRewriteEnabled: Boolean = false,
@ -67,7 +66,6 @@ class HomeActivityTestRule(
this.isTCPCFREnabled = isTCPCFREnabled
this.isWallpaperOnboardingEnabled = isWallpaperOnboardingEnabled
this.isDeleteSitePermissionsEnabled = isDeleteSitePermissionsEnabled
this.isCookieBannerReductionDialogEnabled = isCookieBannerReductionDialogEnabled
this.isOpenInAppBannerEnabled = isOpenInAppBannerEnabled
this.etpPolicy = etpPolicy
this.tabsTrayRewriteEnabled = tabsTrayRewriteEnabled
@ -126,7 +124,6 @@ class HomeActivityTestRule(
isPWAsPromptEnabled = false,
isTCPCFREnabled = false,
isWallpaperOnboardingEnabled = false,
isCookieBannerReductionDialogEnabled = false,
isOpenInAppBannerEnabled = false,
composeTopSitesEnabled = composeTopSitesEnabled,
)
@ -164,7 +161,6 @@ class HomeActivityIntentTestRule internal constructor(
isTCPCFREnabled: Boolean = settings.shouldShowTotalCookieProtectionCFR,
isWallpaperOnboardingEnabled: Boolean = settings.showWallpaperOnboarding,
isDeleteSitePermissionsEnabled: Boolean = settings.deleteSitePermissions,
isCookieBannerReductionDialogEnabled: Boolean = !settings.userOptOutOfReEngageCookieBannerDialog,
isOpenInAppBannerEnabled: Boolean = settings.shouldShowOpenInAppBanner,
etpPolicy: ETPPolicy = getETPPolicy(settings),
tabsTrayRewriteEnabled: Boolean = false,
@ -179,7 +175,6 @@ class HomeActivityIntentTestRule internal constructor(
this.isTCPCFREnabled = isTCPCFREnabled
this.isWallpaperOnboardingEnabled = isWallpaperOnboardingEnabled
this.isDeleteSitePermissionsEnabled = isDeleteSitePermissionsEnabled
this.isCookieBannerReductionDialogEnabled = isCookieBannerReductionDialogEnabled
this.isOpenInAppBannerEnabled = isOpenInAppBannerEnabled
this.etpPolicy = etpPolicy
this.tabsTrayRewriteEnabled = tabsTrayRewriteEnabled
@ -244,7 +239,6 @@ class HomeActivityIntentTestRule internal constructor(
isTCPCFREnabled = settings.shouldShowTotalCookieProtectionCFR
isWallpaperOnboardingEnabled = settings.showWallpaperOnboarding
isDeleteSitePermissionsEnabled = settings.deleteSitePermissions
isCookieBannerReductionDialogEnabled = !settings.userOptOutOfReEngageCookieBannerDialog
isOpenInAppBannerEnabled = settings.shouldShowOpenInAppBanner
etpPolicy = getETPPolicy(settings)
}
@ -275,7 +269,6 @@ class HomeActivityIntentTestRule internal constructor(
isPWAsPromptEnabled = false,
isTCPCFREnabled = false,
isWallpaperOnboardingEnabled = false,
isCookieBannerReductionDialogEnabled = false,
isOpenInAppBannerEnabled = false,
composeTopSitesEnabled = composeTopSitesEnabled,
)

View File

@ -4,10 +4,12 @@
package org.mozilla.fenix.helpers
import android.util.Log
import androidx.test.uiautomator.UiObject
import androidx.test.uiautomator.UiSelector
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.mozilla.fenix.helpers.Constants.TAG
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort
import org.mozilla.fenix.helpers.TestHelper.mDevice
@ -17,101 +19,131 @@ import org.mozilla.fenix.helpers.TestHelper.mDevice
*/
object MatcherHelper {
fun itemWithResId(resourceId: String) =
mDevice.findObject(UiSelector().resourceId(resourceId))
fun itemWithResId(resourceId: String): UiObject {
Log.i(TAG, "Looking for item with resource id: $resourceId")
return mDevice.findObject(UiSelector().resourceId(resourceId))
}
fun itemContainingText(itemText: String) =
mDevice.findObject(UiSelector().textContains(itemText))
fun itemContainingText(itemText: String): UiObject {
Log.i(TAG, "Looking for item with text: $itemText")
return mDevice.findObject(UiSelector().textContains(itemText))
}
fun itemWithText(itemText: String) =
mDevice.findObject(UiSelector().text(itemText))
fun itemWithText(itemText: String): UiObject {
Log.i(TAG, "Looking for item with text: $itemText")
return mDevice.findObject(UiSelector().text(itemText))
}
fun itemWithDescription(description: String) =
mDevice.findObject(UiSelector().descriptionContains(description))
fun itemWithDescription(description: String): UiObject {
Log.i(TAG, "Looking for item with description: $description")
return mDevice.findObject(UiSelector().descriptionContains(description))
}
fun checkedItemWithResId(resourceId: String, isChecked: Boolean) =
mDevice.findObject(UiSelector().resourceId(resourceId).checked(isChecked))
fun itemWithIndex(index: Int): UiObject {
Log.i(TAG, "Looking for item with index: $index")
return mDevice.findObject(UiSelector().index(index))
}
fun checkedItemWithResIdAndText(resourceId: String, text: String, isChecked: Boolean) =
mDevice.findObject(
fun itemWithClassName(className: String): UiObject {
Log.i(TAG, "Looking for item with class name: $className")
return mDevice.findObject(UiSelector().className(className))
}
fun itemWithResIdAndIndex(resourceId: String, index: Int): UiObject {
Log.i(TAG, "Looking for item with resource id: $resourceId and index: $index")
return mDevice.findObject(UiSelector().resourceId(resourceId).index(index))
}
fun itemWithClassNameAndIndex(className: String, index: Int): UiObject {
Log.i(TAG, "Looking for item with class name: $className and index: $index")
return mDevice.findObject(UiSelector().className(className).index(index))
}
fun checkedItemWithResId(resourceId: String, isChecked: Boolean): UiObject {
Log.i(TAG, "Looking for checked item with resource id: $resourceId")
return mDevice.findObject(UiSelector().resourceId(resourceId).checked(isChecked))
}
fun checkedItemWithResIdAndText(resourceId: String, text: String, isChecked: Boolean): UiObject {
Log.i(TAG, "Looking for checked item with resource id: $resourceId and text: $text")
return mDevice.findObject(
UiSelector()
.resourceId(resourceId)
.textContains(text)
.checked(isChecked),
)
fun itemWithResIdAndDescription(resourceId: String, description: String) =
mDevice.findObject(UiSelector().resourceId(resourceId).descriptionContains(description))
fun itemWithResIdAndText(resourceId: String, text: String) =
mDevice.findObject(UiSelector().resourceId(resourceId).text(text))
fun itemWithResIdContainingText(resourceId: String, text: String) =
mDevice.findObject(UiSelector().resourceId(resourceId).textContains(text))
fun assertItemWithResIdExists(vararg appItems: UiObject, exists: Boolean = true) {
if (exists) {
for (appItem in appItems) {
assertTrue(appItem.waitForExists(waitingTime))
}
} else {
for (appItem in appItems) {
assertFalse(appItem.waitForExists(waitingTimeShort))
}
}
}
fun assertItemContainingTextExists(vararg appItems: UiObject, exists: Boolean = true) {
fun itemWithResIdAndDescription(resourceId: String, description: String): UiObject {
Log.i(TAG, "Looking for item with resource id: $resourceId and description: $description")
return mDevice.findObject(UiSelector().resourceId(resourceId).descriptionContains(description))
}
fun itemWithResIdAndText(resourceId: String, text: String): UiObject {
Log.i(TAG, "Looking for item with resource id: $resourceId and text: $text")
return mDevice.findObject(UiSelector().resourceId(resourceId).text(text))
}
fun itemWithResIdContainingText(resourceId: String, text: String): UiObject {
Log.i(TAG, "Looking for item with resource id: $resourceId and containing text: $text")
return mDevice.findObject(UiSelector().resourceId(resourceId).textContains(text))
}
fun assertUIObjectExists(
vararg appItems: UiObject,
exists: Boolean = true,
waitingTime: Long = TestAssetHelper.waitingTime,
) {
for (appItem in appItems) {
if (exists) {
assertTrue(appItem.waitForExists(waitingTime))
assertTrue("${appItem.selector} does not exist", appItem.waitForExists(waitingTime))
Log.i(TAG, "assertUIObjectExists: Verified ${appItem.selector} exists")
} else {
assertFalse(appItem.waitForExists(waitingTimeShort))
assertFalse("${appItem.selector} exists", appItem.waitForExists(waitingTimeShort))
Log.i(TAG, "assertUIObjectExists: Verified ${appItem.selector} does not exist")
}
}
}
fun assertItemWithDescriptionExists(vararg appItems: UiObject, exists: Boolean = true) {
fun assertUIObjectIsGone(vararg appItems: UiObject) {
for (appItem in appItems) {
if (exists) {
assertTrue(appItem.waitForExists(waitingTime))
assertTrue("${appItem.selector} is not gone", appItem.waitUntilGone(waitingTime))
Log.i(TAG, "assertUIObjectIsGone: Verified ${appItem.selector} is gone")
}
}
fun assertItemTextEquals(vararg appItems: UiObject, expectedText: String, isEqual: Boolean = true) {
for (appItem in appItems) {
if (isEqual) {
assertTrue(
"${appItem.selector} text does not equal to $expectedText",
appItem.text.equals(expectedText),
)
Log.i(TAG, "assertItemTextEquals: Verified ${appItem.selector} text equals to $expectedText")
} else {
assertFalse(appItem.waitForExists(waitingTimeShort))
assertFalse(
"${appItem.selector} text equals to $expectedText",
appItem.text.equals(expectedText),
)
Log.i(TAG, "assertItemTextEquals: Verified ${appItem.selector} text does not equal to $expectedText")
}
}
}
fun assertCheckedItemWithResIdExists(vararg appItems: UiObject) {
fun assertItemTextContains(vararg appItems: UiObject, itemText: String) {
for (appItem in appItems) {
assertTrue(appItem.waitForExists(waitingTime))
}
}
fun assertCheckedItemWithResIdAndTextExists(vararg appItems: UiObject) {
for (appItem in appItems) {
assertTrue(appItem.waitForExists(waitingTime))
}
}
fun assertItemWithResIdAndDescriptionExists(vararg appItems: UiObject) {
for (appItem in appItems) {
assertTrue(appItem.waitForExists(waitingTime))
}
}
fun assertItemWithResIdAndTextExists(vararg appItems: UiObject, exists: Boolean = true) {
for (appItem in appItems) {
if (exists) {
assertTrue(appItem.waitForExists(waitingTime))
} else {
assertFalse(appItem.waitForExists(waitingTimeShort))
}
assertTrue(
"${appItem.selector} text does not contain $itemText",
appItem.text.contains(itemText),
)
Log.i(TAG, "assertItemTextContains: Verified ${appItem.selector} text contains $itemText")
}
}
fun assertItemIsEnabledAndVisible(vararg appItems: UiObject) {
for (appItem in appItems) {
assertTrue(appItem.waitForExists(waitingTime) && appItem.isEnabled)
Log.i(TAG, "assertItemIsEnabledAndVisible: Verified ${appItem.selector} is visible and enabled")
}
}
}

View File

@ -13,9 +13,9 @@ import org.junit.rules.TestRule
import org.junit.runner.Description
import org.junit.runners.model.Statement
import org.mozilla.fenix.components.PermissionStorage
import org.mozilla.fenix.helpers.AppAndSystemHelper.setNetworkEnabled
import org.mozilla.fenix.helpers.IdlingResourceHelper.unregisterAllIdlingResources
import org.mozilla.fenix.helpers.TestHelper.appContext
import org.mozilla.fenix.helpers.TestHelper.setNetworkEnabled
/**
* Rule to retry flaky tests for a given number of times, catching some of the more common exceptions.

View File

@ -2,83 +2,43 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
@file:Suppress("DEPRECATION")
package org.mozilla.fenix.helpers
import android.Manifest
import android.app.ActivityManager
import android.app.PendingIntent
import android.content.ActivityNotFoundException
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.content.res.Configuration
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.net.Uri
import android.os.Build
import android.os.storage.StorageManager
import android.os.storage.StorageVolume
import android.provider.Settings
import android.util.Log
import android.view.View
import androidx.annotation.RequiresApi
import androidx.browser.customtabs.CustomTabsIntent
import androidx.test.espresso.Espresso
import androidx.test.core.app.launchActivity
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.IdlingRegistry
import androidx.test.espresso.IdlingResource
import androidx.test.espresso.action.ViewActions.longClick
import androidx.test.espresso.assertion.ViewAssertions
import androidx.test.espresso.intent.Intents
import androidx.test.espresso.intent.Intents.intended
import androidx.test.espresso.intent.matcher.IntentMatchers.toPackage
import androidx.test.espresso.matcher.ViewMatchers.hasSibling
import androidx.test.espresso.matcher.ViewMatchers.withChild
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withParent
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.ActivityTestRule
import androidx.test.runner.permission.PermissionRequester
import androidx.test.uiautomator.By
import androidx.test.uiautomator.UiDevice
import androidx.test.uiautomator.UiObject
import androidx.test.uiautomator.UiScrollable
import androidx.test.uiautomator.UiSelector
import androidx.test.uiautomator.Until
import junit.framework.AssertionFailedError
import mozilla.components.browser.state.search.SearchEngine
import mozilla.components.browser.state.state.availableSearchEngines
import mozilla.components.support.ktx.android.content.appName
import org.hamcrest.CoreMatchers
import org.hamcrest.CoreMatchers.allOf
import org.hamcrest.Matcher
import org.junit.Assert
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.mozilla.fenix.Config
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.customtabs.ExternalAppBrowserActivity
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.Constants.PackageName.YOUTUBE_APP
import org.mozilla.fenix.helpers.Constants.TAG
import org.mozilla.fenix.helpers.MatcherHelper.itemWithResIdAndText
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort
import org.mozilla.fenix.helpers.ext.waitNotNull
import org.mozilla.fenix.helpers.idlingresource.NetworkConnectionIdlingResource
import org.mozilla.fenix.ui.robots.BrowserRobot
import org.mozilla.fenix.ui.robots.clickPageObject
import org.mozilla.fenix.utils.IntentUtils
import org.mozilla.gecko.util.ThreadUtils
import java.io.File
import java.util.Locale
object TestHelper {
@ -125,14 +85,6 @@ object TestHelper {
activity.launchActivity(null)
}
fun getPermissionAllowID(): String {
return when
(Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
true -> "com.android.permissioncontroller"
false -> "com.android.packageinstaller"
}
}
fun waitUntilObjectIsFound(resourceName: String) {
mDevice.waitNotNull(
Until.findObjects(By.res(resourceName)),
@ -164,180 +116,13 @@ object TestHelper {
onView(withId(resId)).check(ViewAssertions.matches(withText(CoreMatchers.containsString(urlSubstring))))
}
fun openAppFromExternalLink(url: String) {
val context = InstrumentationRegistry.getInstrumentation().getTargetContext()
val intent = Intent().apply {
action = Intent.ACTION_VIEW
data = Uri.parse(url)
`package` = packageName
flags = Intent.FLAG_ACTIVITY_NEW_TASK
}
try {
context.startActivity(intent)
} catch (ex: ActivityNotFoundException) {
intent.setPackage(null)
context.startActivity(intent)
}
}
@RequiresApi(Build.VERSION_CODES.R)
fun deleteDownloadedFileOnStorage(fileName: String) {
val storageManager: StorageManager? = appContext.getSystemService(Context.STORAGE_SERVICE) as StorageManager?
val storageVolumes = storageManager!!.storageVolumes
val storageVolume: StorageVolume = storageVolumes[0]
val file = File(storageVolume.directory!!.path + "/Download/" + fileName)
try {
if (file.exists()) {
file.delete()
Log.d("TestLog", "File delete try 1")
assertFalse("The file was not deleted", file.exists())
}
} catch (e: AssertionError) {
file.delete()
Log.d("TestLog", "File delete retried")
assertFalse("The file was not deleted", file.exists())
}
}
fun setNetworkEnabled(enabled: Boolean) {
val networkDisconnectedIdlingResource = NetworkConnectionIdlingResource(false)
val networkConnectedIdlingResource = NetworkConnectionIdlingResource(true)
when (enabled) {
true -> {
mDevice.executeShellCommand("svc data enable")
mDevice.executeShellCommand("svc wifi enable")
// Wait for network connection to be completely enabled
IdlingRegistry.getInstance().register(networkConnectedIdlingResource)
Espresso.onIdle {
IdlingRegistry.getInstance().unregister(networkConnectedIdlingResource)
}
}
false -> {
mDevice.executeShellCommand("svc data disable")
mDevice.executeShellCommand("svc wifi disable")
// Wait for network connection to be completely disabled
IdlingRegistry.getInstance().register(networkDisconnectedIdlingResource)
Espresso.onIdle {
IdlingRegistry.getInstance().unregister(networkDisconnectedIdlingResource)
}
}
}
}
fun createCustomTabIntent(
pageUrl: String,
customMenuItemLabel: String = "",
customActionButtonDescription: String = "",
): Intent {
val appContext = InstrumentationRegistry.getInstrumentation()
.targetContext
.applicationContext
val pendingIntent = PendingIntent.getActivity(appContext, 0, Intent(), IntentUtils.defaultIntentPendingFlags)
val customTabsIntent = CustomTabsIntent.Builder()
.addMenuItem(customMenuItemLabel, pendingIntent)
.setShareState(CustomTabsIntent.SHARE_STATE_ON)
.setActionButton(
createTestBitmap(),
customActionButtonDescription,
pendingIntent,
true,
)
.build()
customTabsIntent.intent.data = Uri.parse(pageUrl)
return customTabsIntent.intent
}
private fun createTestBitmap(): Bitmap {
val bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
canvas.drawColor(Color.GREEN)
return bitmap
}
fun isPackageInstalled(packageName: String): Boolean {
return try {
val packageManager = InstrumentationRegistry.getInstrumentation().context.packageManager
packageManager.getApplicationInfo(packageName, 0).enabled
} catch (exception: PackageManager.NameNotFoundException) {
false
}
}
fun assertExternalAppOpens(appPackageName: String) {
if (isPackageInstalled(appPackageName)) {
try {
intended(toPackage(appPackageName))
} catch (e: AssertionFailedError) {
e.printStackTrace()
}
} else {
mDevice.waitNotNull(
Until.findObject(By.text("Could not open file")),
waitingTime,
)
}
}
fun assertNativeAppOpens(appPackageName: String, url: String = "") {
if (isPackageInstalled(appPackageName)) {
mDevice.waitForIdle(waitingTimeShort)
assertTrue(
mDevice.findObject(UiSelector().packageName(appPackageName))
.waitForExists(waitingTime),
)
} else {
BrowserRobot().verifyUrl(url)
}
}
fun assertYoutubeAppOpens() = intended(toPackage(YOUTUBE_APP))
/**
* Checks whether the latest activity of the application is used for custom tabs or PWAs.
*
* @return Boolean value that helps us know if the current activity supports custom tabs or PWAs.
*/
fun isExternalAppBrowserActivityInCurrentTask(): Boolean {
val activityManager = appContext.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
mDevice.waitForIdle(waitingTimeShort)
return activityManager.appTasks[0].taskInfo.topActivity!!.className == ExternalAppBrowserActivity::class.java.name
}
/**
* Run test with automatically registering idling resources and cleanup.
*
* @param idlingResources zero or more [IdlingResource] to be used when running [testBlock].
* @param testBlock test code to execute.
*/
fun registerAndCleanupIdlingResources(
vararg idlingResources: IdlingResource,
testBlock: () -> Unit,
) {
idlingResources.forEach {
IdlingRegistry.getInstance().register(it)
}
try {
testBlock()
} finally {
idlingResources.forEach {
IdlingRegistry.getInstance().unregister(it)
}
}
}
// exit from Menus to home screen or browser
fun exitMenu() {
val toolbar =
mDevice.findObject(UiSelector().resourceId("$packageName:id/toolbar"))
while (!toolbar.waitForExists(waitingTimeShort)) {
mDevice.pressBack()
Log.i(TAG, "exitMenu: Exiting app settings menus using device back button")
}
}
@ -356,172 +141,8 @@ object TestHelper {
)
}
fun getStringResource(id: Int, argument: String = appName) = appContext.resources.getString(id, argument)
// Permission allow dialogs differ on various Android APIs
fun grantSystemPermission() {
val whileUsingTheAppPermissionButton: UiObject =
mDevice.findObject(UiSelector().textContains("While using the app"))
val allowPermissionButton: UiObject =
mDevice.findObject(
UiSelector()
.textContains("Allow")
.className("android.widget.Button"),
)
if (Build.VERSION.SDK_INT >= 23) {
if (whileUsingTheAppPermissionButton.waitForExists(waitingTimeShort)) {
whileUsingTheAppPermissionButton.click()
} else if (allowPermissionButton.waitForExists(waitingTimeShort)) {
allowPermissionButton.click()
}
}
}
// Permission deny dialogs differ on various Android APIs
fun denyPermission() {
mDevice.findObject(UiSelector().textContains("Deny")).waitForExists(waitingTime)
mDevice.findObject(UiSelector().textContains("Deny")).click()
}
fun isTestLab(): Boolean {
return Settings.System.getString(appContext.contentResolver, "firebase.test.lab").toBoolean()
}
private val charPool: List<Char> = ('a'..'z') + ('A'..'Z') + ('0'..'9')
fun generateRandomString(stringLength: Int) =
(1..stringLength)
.map { kotlin.random.Random.nextInt(0, charPool.size) }
.map(charPool::get)
.joinToString("")
/**
* Changes the default language of the entire device, not just the app.
* Runs on Debug variant as we don't want to adjust Release permission manifests
* Runs the test in its testBlock.
* Cleans up and sets the default locale after it's done.
*/
fun runWithSystemLocaleChanged(locale: Locale, testRule: ActivityTestRule<HomeActivity>, testBlock: () -> Unit) {
if (Config.channel.isDebug) {
/* Sets permission to change device language */
PermissionRequester().apply {
addPermissions(
Manifest.permission.CHANGE_CONFIGURATION,
)
requestPermissions()
}
val defaultLocale = Locale.getDefault()
try {
setSystemLocale(locale)
testBlock()
ThreadUtils.runOnUiThread { testRule.activity.recreate() }
} catch (e: Exception) {
e.printStackTrace()
} finally {
setSystemLocale(defaultLocale)
}
}
}
/**
* Changes the default language of the entire device, not just the app.
*/
fun setSystemLocale(locale: Locale) {
val activityManagerNative = Class.forName("android.app.ActivityManagerNative")
val am = activityManagerNative.getMethod("getDefault", *arrayOfNulls(0))
.invoke(activityManagerNative, *arrayOfNulls(0))
val config = InstrumentationRegistry.getInstrumentation().context.resources.configuration
config.javaClass.getDeclaredField("locale")[config] = locale
config.javaClass.getDeclaredField("userSetLocale").setBoolean(config, true)
am.javaClass.getMethod(
"updateConfiguration",
Configuration::class.java,
).invoke(am, config)
}
/**
* Creates clipboard data.
*/
fun setTextToClipBoard(context: Context, message: String) {
val clipBoard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clipData = ClipData.newPlainText("label", message)
clipBoard.setPrimaryClip(clipData)
}
/**
* Returns sponsored shortcut title based on the index.
*/
fun getSponsoredShortcutTitle(position: Int): String {
val sponsoredShortcut = mDevice.findObject(
UiSelector()
.resourceId("$packageName:id/top_site_item")
.index(position - 1),
).getChild(
UiSelector()
.resourceId("$packageName:id/top_site_title"),
).text
return sponsoredShortcut
}
fun verifyLightThemeApplied(expected: Boolean) =
assertFalse("Light theme not selected", expected)
fun verifyDarkThemeApplied(expected: Boolean) = assertTrue("Dark theme not selected", expected)
/**
* Wrapper for tests to run only when certain conditions are met.
* For example: this method will avoid accidentally running a test on GV versions where the feature is disabled.
*/
fun runWithCondition(condition: Boolean, testBlock: () -> Unit) {
if (condition) {
testBlock()
}
}
fun putAppToBackground() {
mDevice.pressRecentApps()
mDevice.findObject(UiSelector().resourceId("$packageName:id/container")).waitUntilGone(waitingTime)
}
fun bringAppToForeground() {
mDevice.pressRecentApps()
mDevice.findObject(UiSelector().resourceId("$packageName:id/container")).waitForExists(waitingTime)
}
fun verifyKeyboardVisibility(isExpectedToBeVisible: Boolean = true) {
mDevice.waitForIdle()
assertEquals(
"Keyboard not shown",
isExpectedToBeVisible,
mDevice
.executeShellCommand("dumpsys input_method | grep mInputShown")
.contains("mInputShown=true"),
)
}
/**
* The list of Search engines for the "home" region of the user.
* For en-us it will return the 6 engines selected by default: Google, Bing, DuckDuckGo, Amazon, Ebay, Wikipedia.
*/
fun getRegionSearchEnginesList(): List<SearchEngine> {
val searchEnginesList = appContext.components.core.store.state.search.regionSearchEngines
assertTrue("Search engines list returned nothing", searchEnginesList.isNotEmpty())
return searchEnginesList
}
/**
* The list of Search engines available to be added by user choice.
* For en-us it will return the 2 engines: Reddit, Youtube.
*/
fun getAvailableSearchEngines(): List<SearchEngine> {
val searchEnginesList = appContext.components.core.store.state.search.availableSearchEngines
assertTrue("Search engines list returned nothing", searchEnginesList.isNotEmpty())
return searchEnginesList
}
}

View File

@ -4,9 +4,11 @@
package org.mozilla.fenix.helpers.ext
import android.util.Log
import androidx.test.uiautomator.SearchCondition
import androidx.test.uiautomator.UiDevice
import org.junit.Assert.assertNotNull
import org.mozilla.fenix.helpers.Constants.TAG
import org.mozilla.fenix.helpers.TestAssetHelper
/**
@ -17,4 +19,8 @@ import org.mozilla.fenix.helpers.TestAssetHelper
fun UiDevice.waitNotNull(
searchCondition: SearchCondition<*>,
waitTime: Long = TestAssetHelper.waitingTime,
) = assertNotNull(wait(searchCondition, waitTime))
) {
Log.i(TAG, "Wait not null: $searchCondition")
assertNotNull(wait(searchCondition, waitTime))
Log.i(TAG, "Found $searchCondition not null")
}

View File

@ -4,12 +4,19 @@
package org.mozilla.fenix.onboarding.view
import io.mockk.every
import io.mockk.mockk
import mozilla.components.service.nimbus.evalJexlSafe
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mozilla.experiments.nimbus.GleanPlumbMessageHelper
import org.mozilla.experiments.nimbus.StringHolder
import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.nimbus.FxNimbus
import org.mozilla.fenix.nimbus.JunoOnboarding
import org.mozilla.fenix.nimbus.OnboardingCardData
import org.mozilla.fenix.nimbus.OnboardingCardType
@ -19,28 +26,242 @@ class JunoOnboardingMapperTest {
val activityTestRule =
HomeActivityIntentTestRule.withDefaultSettingsOverrides(skipOnboarding = true)
private lateinit var junoOnboardingFeature: JunoOnboarding
private lateinit var jexlConditions: Map<String, String>
private lateinit var jexlHelper: GleanPlumbMessageHelper
private lateinit var evalFunction: (String) -> Boolean
@Before
fun setup() {
junoOnboardingFeature = FxNimbus.features.junoOnboarding.value()
jexlConditions = junoOnboardingFeature.conditions
jexlHelper = mockk(relaxed = true)
evalFunction = { condition -> jexlHelper.evalJexlSafe(condition) }
every { evalFunction("true") } returns true
every { evalFunction("false") } returns false
}
@Test
fun showNotificationTrue_showAddWidgetFalse_pagesToDisplay_returnsSortedListOfAllConvertedPages_withoutAddWidgetPage() {
val expected = listOf(defaultBrowserPageUiData, syncPageUiData, notificationPageUiData)
assertEquals(expected, unsortedAllKnownCardData.toPageUiData(true, false))
assertEquals(
expected,
unsortedAllKnownCardData.toPageUiData(
showNotificationPage = true,
showAddWidgetPage = false,
jexlConditions = jexlConditions,
func = evalFunction,
),
)
}
@Test
fun showNotificationFalse_showAddWidgetFalse_pagesToDisplay_returnsSortedListOfConvertedPages_withoutNotificationPage_and_addWidgetPage() {
val expected = listOf(defaultBrowserPageUiData, syncPageUiData)
assertEquals(expected, unsortedAllKnownCardData.toPageUiData(false, false))
assertEquals(
expected,
unsortedAllKnownCardData.toPageUiData(
showNotificationPage = false,
showAddWidgetPage = false,
jexlConditions = jexlConditions,
func = evalFunction,
),
)
}
@Test
fun showNotificationFalse_showAddWidgetTrue_pagesToDisplay_returnsSortedListOfAllConvertedPages_withoutNotificationPage() {
val expected = listOf(defaultBrowserPageUiData, addSearchWidgetPageUiData, syncPageUiData)
assertEquals(expected, unsortedAllKnownCardData.toPageUiData(false, true))
assertEquals(
expected,
unsortedAllKnownCardData.toPageUiData(
showNotificationPage = false,
showAddWidgetPage = true,
jexlConditions = jexlConditions,
func = evalFunction,
),
)
}
@Test
fun showNotificationTrue_and_showAddWidgetTrue_pagesToDisplay_returnsSortedListOfConvertedPages() {
val expected = listOf(defaultBrowserPageUiData, addSearchWidgetPageUiData, syncPageUiData, notificationPageUiData)
assertEquals(expected, unsortedAllKnownCardData.toPageUiData(true, true))
val expected = listOf(
defaultBrowserPageUiData,
addSearchWidgetPageUiData,
syncPageUiData,
notificationPageUiData,
)
assertEquals(
expected,
unsortedAllKnownCardData.toPageUiData(
showNotificationPage = true,
showAddWidgetPage = true,
jexlConditions = jexlConditions,
func = evalFunction,
),
)
}
@Test
fun cardConditionsMatchJexlConditions_shouldDisplayCard_returnsConvertedPage() {
val jexlConditions = mapOf("ALWAYS" to "true", "NEVER" to "false")
val expected = listOf(defaultBrowserPageUiData)
assertEquals(
expected,
listOf(defaultBrowserCardData).toPageUiData(
showNotificationPage = false,
showAddWidgetPage = false,
jexlConditions = jexlConditions,
func = evalFunction,
),
)
}
@Test
fun noJexlConditionsAndNoCardConditions_shouldDisplayCard_returnsNoPage() {
val jexlConditions = mapOf<String, String>()
val expected = emptyList<OnboardingPageUiData>()
assertEquals(
expected,
listOf(addSearchWidgetCardDataNoConditions).toPageUiData(
showNotificationPage = false,
showAddWidgetPage = false,
jexlConditions = jexlConditions,
func = evalFunction,
),
)
}
@Test
fun noJexlConditions_shouldDisplayCard_returnsNoPage() {
val jexlConditions = mapOf<String, String>()
val expected = emptyList<OnboardingPageUiData>()
assertEquals(
expected,
listOf(defaultBrowserCardData).toPageUiData(
showNotificationPage = false,
showAddWidgetPage = false,
jexlConditions = jexlConditions,
func = evalFunction,
),
)
}
@Test
fun prerequisitesMatchJexlConditions_shouldDisplayCard_returnsConvertedPage() {
val jexlConditions = mapOf("ALWAYS" to "true")
val expected = listOf(defaultBrowserPageUiData)
assertEquals(
expected,
listOf(defaultBrowserCardData).toPageUiData(
showNotificationPage = false,
showAddWidgetPage = false,
jexlConditions = jexlConditions,
func = evalFunction,
),
)
}
@Test
fun prerequisitesDontMatchJexlConditions_shouldDisplayCard_returnsNoPage() {
val jexlConditions = mapOf("NEVER" to "false")
val expected = emptyList<OnboardingPageUiData>()
assertEquals(
expected,
listOf(defaultBrowserCardData).toPageUiData(
showNotificationPage = false,
showAddWidgetPage = false,
jexlConditions = jexlConditions,
func = evalFunction,
),
)
}
@Test
fun noCardConditions_shouldDisplayCard_returnsNoPage() {
val jexlConditions = mapOf("ALWAYS" to "true", "NEVER" to "false")
val expected = emptyList<OnboardingPageUiData>()
assertEquals(
expected,
listOf(addSearchWidgetCardDataNoConditions).toPageUiData(
showNotificationPage = false,
showAddWidgetPage = false,
jexlConditions = jexlConditions,
func = evalFunction,
),
)
}
@Test
fun noDisqualifiers_shouldDisplayCard_returnsConvertedPage() {
val jexlConditions = mapOf("ALWAYS" to "true", "NEVER" to "false")
val expected = listOf(defaultBrowserPageUiData)
assertEquals(
expected,
listOf(defaultBrowserCardDataNoDisqualifiers).toPageUiData(
showNotificationPage = false,
showAddWidgetPage = false,
jexlConditions = jexlConditions,
func = evalFunction,
),
)
}
@Test
fun disqualifiersMatchJexlConditions_shouldDisplayCard_returnsConvertedPage() {
val jexlConditions = mapOf("NEVER" to "false")
val expected = listOf(syncPageUiData)
assertEquals(
expected,
listOf(syncCardData).toPageUiData(
showNotificationPage = false,
showAddWidgetPage = false,
jexlConditions = jexlConditions,
func = evalFunction,
),
)
}
@Test
fun disqualifiersDontMatchJexlConditions_shouldDisplayCard_returnsNoPage() {
val jexlConditions = mapOf("NEVER" to "false")
val expected = listOf<OnboardingPageUiData>()
assertEquals(
expected,
listOf(notificationCardData).toPageUiData(
showNotificationPage = false,
showAddWidgetPage = false,
jexlConditions = jexlConditions,
func = evalFunction,
),
)
}
@Test
fun noPrerequisites_shouldDisplayCard_returnsConvertedPage() {
val jexlConditions = mapOf("ALWAYS" to "true", "NEVER" to "false")
val expected = listOf(syncPageUiData)
assertEquals(
expected,
listOf(syncCardData).toPageUiData(
showNotificationPage = false,
showAddWidgetPage = false,
jexlConditions = jexlConditions,
func = evalFunction,
),
)
}
}
@ -88,7 +309,36 @@ private val defaultBrowserCardData = OnboardingCardData(
primaryButtonLabel = StringHolder(null, "default browser primary button text"),
secondaryButtonLabel = StringHolder(null, "default browser secondary button text"),
ordering = 10,
prerequisites = listOf("ALWAYS"),
disqualifiers = listOf("NEVER"),
)
private val defaultBrowserCardDataNoDisqualifiers = OnboardingCardData(
cardType = OnboardingCardType.DEFAULT_BROWSER,
imageRes = R.drawable.ic_onboarding_welcome,
title = StringHolder(null, "default browser title"),
body = StringHolder(null, "default browser body with link text"),
linkText = StringHolder(null, "link text"),
primaryButtonLabel = StringHolder(null, "default browser primary button text"),
secondaryButtonLabel = StringHolder(null, "default browser secondary button text"),
ordering = 10,
prerequisites = listOf("ALWAYS"),
disqualifiers = listOf(),
)
private val addSearchWidgetCardDataNoConditions = OnboardingCardData(
cardType = OnboardingCardType.ADD_SEARCH_WIDGET,
imageRes = R.drawable.ic_onboarding_search_widget,
title = StringHolder(null, "add search widget title"),
body = StringHolder(null, "add search widget body with link text"),
linkText = StringHolder(null, "link text"),
primaryButtonLabel = StringHolder(null, "add search widget primary button text"),
secondaryButtonLabel = StringHolder(null, "add search widget secondary button text"),
ordering = 15,
prerequisites = listOf(),
disqualifiers = listOf(),
)
private val addSearchWidgetCardData = OnboardingCardData(
cardType = OnboardingCardType.ADD_SEARCH_WIDGET,
imageRes = R.drawable.ic_onboarding_search_widget,
@ -99,6 +349,7 @@ private val addSearchWidgetCardData = OnboardingCardData(
secondaryButtonLabel = StringHolder(null, "add search widget secondary button text"),
ordering = 15,
)
private val syncCardData = OnboardingCardData(
cardType = OnboardingCardType.SYNC_SIGN_IN,
imageRes = R.drawable.ic_onboarding_sync,
@ -107,7 +358,10 @@ private val syncCardData = OnboardingCardData(
primaryButtonLabel = StringHolder(null, "sync primary button text"),
secondaryButtonLabel = StringHolder(null, "sync secondary button text"),
ordering = 20,
prerequisites = listOf(),
disqualifiers = listOf("NEVER"),
)
private val notificationCardData = OnboardingCardData(
cardType = OnboardingCardType.NOTIFICATION_PERMISSION,
imageRes = R.drawable.ic_notification_permission,
@ -116,6 +370,8 @@ private val notificationCardData = OnboardingCardData(
primaryButtonLabel = StringHolder(null, "notification primary button text"),
secondaryButtonLabel = StringHolder(null, "notification secondary button text"),
ordering = 30,
prerequisites = listOf(),
disqualifiers = listOf("NEVER", "OTHER"),
)
private val unsortedAllKnownCardData = listOf(

View File

@ -26,11 +26,9 @@ import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.HomeActivityTestRule
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.ext.toUri
import org.mozilla.fenix.helpers.ext.waitNotNull
import org.mozilla.fenix.ui.robots.accountSettings
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.navigationToolbar
import org.mozilla.fenix.ui.robots.settingsSubMenuLoginsAndPassword
@Suppress("RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")
@ -55,9 +53,10 @@ class SyncIntegrationTest {
mockWebServer.shutdown()
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/352905
// History item Desktop -> Fenix
@Test
fun checkHistoryFromDesktopTest() {
fun syncHistoryBetweenMobileAndDesktopTest() {
signInFxSync()
tapReturnToPreviousApp()
// Let's wait until homescreen is shown to go to three dot menu
@ -70,9 +69,10 @@ class SyncIntegrationTest {
historyAfterSyncIsShown()
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/330146
// Bookmark item Desktop -> Fenix
@Test
fun checkBookmarkFromDesktopTest() {
fun syncBookmarksTest() {
signInFxSync()
tapReturnToPreviousApp()
homeScreen {
@ -81,9 +81,10 @@ class SyncIntegrationTest {
bookmarkAfterSyncIsShown()
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/243353
@SmokeTest
@Test
fun checkAccountSettings() {
fun manageAccountSettingsTest() {
signInFxSync()
mDevice.waitNotNull(Until.findObjects(By.text("Account")), TestAssetHelper.waitingTime)
@ -104,9 +105,10 @@ class SyncIntegrationTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/466387
// Login item Desktop -> Fenix
@Test
fun checkLoginsFromDesktopTest() {
fun synLoginsTest() {
homeScreen {
}.openThreeDotMenu {
}.openSettings {
@ -136,44 +138,6 @@ class SyncIntegrationTest {
}
}
// Bookmark item Fenix -> Desktop
@Test
fun checkBookmarkFromDeviceTest() {
val defaultWebPage = "example.com".toUri()!!
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage) {
}.openThreeDotMenu {
}.bookmarkPage {
}.openThreeDotMenu {
}.openSettings {
}.openTurnOnSyncMenu {
useEmailInsteadButton()
typeEmail()
tapOnContinueButton()
typePassword()
sleep(TestAssetHelper.waitingTimeShort)
tapOnSignIn()
}
}
// History item Fenix -> Desktop
@Test
fun checkHistoryFromDeviceTest() {
val defaultWebPage = "example.com".toUri()!!
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage) {
}.openThreeDotMenu {
}.openSettings {
}.openTurnOnSyncMenu {
useEmailInsteadButton()
typeEmail()
tapOnContinueButton()
typePassword()
sleep(TestAssetHelper.waitingTimeShort)
tapOnSignIn()
}
}
// Useful functions for the tests
fun typeEmail() {
val emailInput = mDevice.findObject(

View File

@ -1,91 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.ui
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import okhttp3.mockwebserver.MockWebServer
import org.junit.After
import org.junit.Before
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.HomeActivityTestRule
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.searchScreen
class AddToHomeScreenTest {
private lateinit var mockWebServer: MockWebServer
@get:Rule
val composeTestRule =
AndroidComposeTestRule(HomeActivityTestRule.withDefaultSettingsOverrides()) { it.activity }
@Before
fun setUp() {
mockWebServer = MockWebServer().apply {
dispatcher = AndroidAssetDispatcher()
start()
}
}
@After
fun tearDown() {
mockWebServer.shutdown()
}
// Verifies the Add to home screen option in a tab's 3 dot menu
@SmokeTest
@Test
fun mainMenuAddToHomeScreenTest() {
val website = TestAssetHelper.getGenericAsset(mockWebServer, 1)
val shortcutTitle = TestHelper.generateRandomString(5)
homeScreen {
}.openNavigationToolbar {
}.enterURLAndEnterToBrowser(website.url) {
}.openThreeDotMenu {
expandMenu()
}.openAddToHomeScreen {
clickCancelShortcutButton()
}
browserScreen {
}.openThreeDotMenu {
expandMenu()
}.openAddToHomeScreen {
verifyShortcutTextFieldTitle("Test_Page_1")
addShortcutName(shortcutTitle)
clickAddShortcutButton()
clickAddAutomaticallyButton()
}.openHomeScreenShortcut(shortcutTitle) {
verifyUrl(website.url.toString())
verifyTabCounter("1")
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/414970
@Ignore("Failure, more details at: https://bugzilla.mozilla.org/show_bug.cgi?id=1830005")
@SmokeTest
@Test
fun addPrivateBrowsingShortcutFromHomeScreenCFRTest() {
homeScreen {
}.triggerPrivateBrowsingShortcutPrompt {
verifyNoThanksPrivateBrowsingShortcutButton(composeTestRule)
verifyAddPrivateBrowsingShortcutButton(composeTestRule)
clickAddPrivateBrowsingShortcutButton(composeTestRule)
clickAddAutomaticallyButton()
}.openHomeScreenShortcut("Private ${TestHelper.appName}") {}
searchScreen {
verifySearchView()
}.dismissSearchBar {
verifyCommonMythsLink()
}
}
}

View File

@ -18,6 +18,7 @@ import org.mozilla.fenix.helpers.MatcherHelper.itemWithResIdContainingText
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.exitMenu
import org.mozilla.fenix.helpers.TestHelper.packageName
import org.mozilla.fenix.ui.robots.autofillScreen
import org.mozilla.fenix.ui.robots.clickPageObject
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.navigationToolbar
@ -25,6 +26,36 @@ import org.mozilla.fenix.ui.robots.navigationToolbar
class AddressAutofillTest {
private lateinit var mockWebServer: MockWebServer
object FirstAddressAutofillDetails {
var navigateToAutofillSettings = true
var isAddressAutofillEnabled = true
var userHasSavedAddress = false
var firstName = "Mozilla"
var middleName = "Fenix"
var lastName = "Firefox"
var streetAddress = "Harrison Street"
var city = "San Francisco"
var state = "Alaska"
var zipCode = "94105"
var country = "United States"
var phoneNumber = "555-5555"
var emailAddress = "foo@bar.com"
}
object SecondAddressAutofillDetails {
var navigateToAutofillSettings = false
var firstName = "Android"
var middleName = "Test"
var lastName = "Name"
var streetAddress = "Fort Street"
var city = "San Jose"
var state = "Arizona"
var zipCode = "95141"
var country = "United States"
var phoneNumber = "777-7777"
var emailAddress = "fuu@bar.org"
}
@get:Rule
val activityIntentTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides()
@ -48,22 +79,21 @@ class AddressAutofillTest {
val addressFormPage =
TestAssetHelper.getAddressFormAsset(mockWebServer)
homeScreen {
}.openThreeDotMenu {
}.openSettings {
}.openAutofillSubMenu {
clickAddAddressButton()
autofillScreen {
fillAndSaveAddress(
"Mozilla",
"Fenix",
"Firefox",
"Harrison Street",
"San Francisco",
"Alaska",
"94105",
"United States",
"555-5555",
"foo@bar.com",
navigateToAutofillSettings = FirstAddressAutofillDetails.navigateToAutofillSettings,
isAddressAutofillEnabled = FirstAddressAutofillDetails.isAddressAutofillEnabled,
userHasSavedAddress = FirstAddressAutofillDetails.userHasSavedAddress,
firstName = FirstAddressAutofillDetails.firstName,
middleName = FirstAddressAutofillDetails.middleName,
lastName = FirstAddressAutofillDetails.lastName,
streetAddress = FirstAddressAutofillDetails.streetAddress,
city = FirstAddressAutofillDetails.city,
state = FirstAddressAutofillDetails.state,
zipCode = FirstAddressAutofillDetails.zipCode,
country = FirstAddressAutofillDetails.country,
phoneNumber = FirstAddressAutofillDetails.phoneNumber,
emailAddress = FirstAddressAutofillDetails.emailAddress,
)
}.goBack {
}.goBack {
@ -86,22 +116,21 @@ class AddressAutofillTest {
@SmokeTest
@Test
fun deleteSavedAddressTest() {
homeScreen {
}.openThreeDotMenu {
}.openSettings {
}.openAutofillSubMenu {
clickAddAddressButton()
autofillScreen {
fillAndSaveAddress(
"Mozilla",
"Fenix",
"Firefox",
"Harrison Street",
"San Francisco",
"Alaska",
"94105",
"United States",
"555-5555",
"foo@bar.com",
navigateToAutofillSettings = FirstAddressAutofillDetails.navigateToAutofillSettings,
isAddressAutofillEnabled = FirstAddressAutofillDetails.isAddressAutofillEnabled,
userHasSavedAddress = FirstAddressAutofillDetails.userHasSavedAddress,
firstName = FirstAddressAutofillDetails.firstName,
middleName = FirstAddressAutofillDetails.middleName,
lastName = FirstAddressAutofillDetails.lastName,
streetAddress = FirstAddressAutofillDetails.streetAddress,
city = FirstAddressAutofillDetails.city,
state = FirstAddressAutofillDetails.state,
zipCode = FirstAddressAutofillDetails.zipCode,
country = FirstAddressAutofillDetails.country,
phoneNumber = FirstAddressAutofillDetails.phoneNumber,
emailAddress = FirstAddressAutofillDetails.emailAddress,
)
clickManageAddressesButton()
clickSavedAddress("Mozilla")
@ -130,22 +159,21 @@ class AddressAutofillTest {
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1836841
@Test
fun verifyEditAddressViewTest() {
homeScreen {
}.openThreeDotMenu {
}.openSettings {
}.openAutofillSubMenu {
clickAddAddressButton()
autofillScreen {
fillAndSaveAddress(
"Mozilla",
"Fenix",
"Firefox",
"Harrison Street",
"San Francisco",
"Alaska",
"94105",
"United States",
"555-5555",
"foo@bar.com",
navigateToAutofillSettings = FirstAddressAutofillDetails.navigateToAutofillSettings,
isAddressAutofillEnabled = FirstAddressAutofillDetails.isAddressAutofillEnabled,
userHasSavedAddress = FirstAddressAutofillDetails.userHasSavedAddress,
firstName = FirstAddressAutofillDetails.firstName,
middleName = FirstAddressAutofillDetails.middleName,
lastName = FirstAddressAutofillDetails.lastName,
streetAddress = FirstAddressAutofillDetails.streetAddress,
city = FirstAddressAutofillDetails.city,
state = FirstAddressAutofillDetails.state,
zipCode = FirstAddressAutofillDetails.zipCode,
country = FirstAddressAutofillDetails.country,
phoneNumber = FirstAddressAutofillDetails.phoneNumber,
emailAddress = FirstAddressAutofillDetails.emailAddress,
)
clickManageAddressesButton()
clickSavedAddress("Mozilla")
@ -159,23 +187,21 @@ class AddressAutofillTest {
val addressFormPage =
TestAssetHelper.getAddressFormAsset(mockWebServer)
homeScreen {
}.openThreeDotMenu {
}.openSettings {
}.openAutofillSubMenu {
verifyAddressAutofillSection(true, false)
clickAddAddressButton()
autofillScreen {
fillAndSaveAddress(
"Mozilla",
"Fenix",
"Firefox",
"Harrison Street",
"San Francisco",
"Alaska",
"94105",
"United States",
"555-5555",
"foo@bar.com",
navigateToAutofillSettings = FirstAddressAutofillDetails.navigateToAutofillSettings,
isAddressAutofillEnabled = FirstAddressAutofillDetails.isAddressAutofillEnabled,
userHasSavedAddress = FirstAddressAutofillDetails.userHasSavedAddress,
firstName = FirstAddressAutofillDetails.firstName,
middleName = FirstAddressAutofillDetails.middleName,
lastName = FirstAddressAutofillDetails.lastName,
streetAddress = FirstAddressAutofillDetails.streetAddress,
city = FirstAddressAutofillDetails.city,
state = FirstAddressAutofillDetails.state,
zipCode = FirstAddressAutofillDetails.zipCode,
country = FirstAddressAutofillDetails.country,
phoneNumber = FirstAddressAutofillDetails.phoneNumber,
emailAddress = FirstAddressAutofillDetails.emailAddress,
)
}
@ -207,23 +233,21 @@ class AddressAutofillTest {
val addressFormPage =
TestAssetHelper.getAddressFormAsset(mockWebServer)
homeScreen {
}.openThreeDotMenu {
}.openSettings {
}.openAutofillSubMenu {
verifyAddressAutofillSection(true, false)
clickAddAddressButton()
autofillScreen {
fillAndSaveAddress(
"Mozilla",
"Fenix",
"Firefox",
"Harrison Street",
"San Francisco",
"Alaska",
"94105",
"United States",
"555-5555",
"foo@bar.com",
navigateToAutofillSettings = FirstAddressAutofillDetails.navigateToAutofillSettings,
isAddressAutofillEnabled = FirstAddressAutofillDetails.isAddressAutofillEnabled,
userHasSavedAddress = FirstAddressAutofillDetails.userHasSavedAddress,
firstName = FirstAddressAutofillDetails.firstName,
middleName = FirstAddressAutofillDetails.middleName,
lastName = FirstAddressAutofillDetails.lastName,
streetAddress = FirstAddressAutofillDetails.streetAddress,
city = FirstAddressAutofillDetails.city,
state = FirstAddressAutofillDetails.state,
zipCode = FirstAddressAutofillDetails.zipCode,
country = FirstAddressAutofillDetails.country,
phoneNumber = FirstAddressAutofillDetails.phoneNumber,
emailAddress = FirstAddressAutofillDetails.emailAddress,
)
}
@ -247,37 +271,36 @@ class AddressAutofillTest {
val addressFormPage =
TestAssetHelper.getAddressFormAsset(mockWebServer)
homeScreen {
}.openThreeDotMenu {
}.openSettings {
}.openAutofillSubMenu {
verifyAddressAutofillSection(true, false)
clickAddAddressButton()
autofillScreen {
fillAndSaveAddress(
"Mozilla",
"Fenix",
"Firefox",
"Harrison Street",
"San Francisco",
"Alaska",
"94105",
"United States",
"555-5555",
"foo@bar.com",
navigateToAutofillSettings = FirstAddressAutofillDetails.navigateToAutofillSettings,
isAddressAutofillEnabled = FirstAddressAutofillDetails.isAddressAutofillEnabled,
userHasSavedAddress = FirstAddressAutofillDetails.userHasSavedAddress,
firstName = FirstAddressAutofillDetails.firstName,
middleName = FirstAddressAutofillDetails.middleName,
lastName = FirstAddressAutofillDetails.lastName,
streetAddress = FirstAddressAutofillDetails.streetAddress,
city = FirstAddressAutofillDetails.city,
state = FirstAddressAutofillDetails.state,
zipCode = FirstAddressAutofillDetails.zipCode,
country = FirstAddressAutofillDetails.country,
phoneNumber = FirstAddressAutofillDetails.phoneNumber,
emailAddress = FirstAddressAutofillDetails.emailAddress,
)
clickManageAddressesButton()
clickAddAddressButton()
fillAndSaveAddress(
"Android",
"Test",
"Name",
"Fort Street",
"San Jose",
"Arizona",
"95141",
"United States",
"777-7777",
"fuu@bar.org",
navigateToAutofillSettings = SecondAddressAutofillDetails.navigateToAutofillSettings,
firstName = SecondAddressAutofillDetails.firstName,
middleName = SecondAddressAutofillDetails.middleName,
lastName = SecondAddressAutofillDetails.lastName,
streetAddress = SecondAddressAutofillDetails.streetAddress,
city = SecondAddressAutofillDetails.city,
state = SecondAddressAutofillDetails.state,
zipCode = SecondAddressAutofillDetails.zipCode,
country = SecondAddressAutofillDetails.country,
phoneNumber = SecondAddressAutofillDetails.phoneNumber,
emailAddress = SecondAddressAutofillDetails.emailAddress,
)
verifyManageAddressesToolbarTitle()
}
@ -311,37 +334,36 @@ class AddressAutofillTest {
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1836850
@Test
fun verifySavedAddressCanBeEditedTest() {
homeScreen {
}.openThreeDotMenu {
}.openSettings {
}.openAutofillSubMenu {
verifyAddressAutofillSection(true, false)
clickAddAddressButton()
autofillScreen {
fillAndSaveAddress(
"Mozilla",
"Fenix",
"Firefox",
"Harrison Street",
"San Francisco",
"Alaska",
"94105",
"United States",
"555-5555",
"foo@bar.com",
navigateToAutofillSettings = FirstAddressAutofillDetails.navigateToAutofillSettings,
isAddressAutofillEnabled = FirstAddressAutofillDetails.isAddressAutofillEnabled,
userHasSavedAddress = FirstAddressAutofillDetails.userHasSavedAddress,
firstName = FirstAddressAutofillDetails.firstName,
middleName = FirstAddressAutofillDetails.middleName,
lastName = FirstAddressAutofillDetails.lastName,
streetAddress = FirstAddressAutofillDetails.streetAddress,
city = FirstAddressAutofillDetails.city,
state = FirstAddressAutofillDetails.state,
zipCode = FirstAddressAutofillDetails.zipCode,
country = FirstAddressAutofillDetails.country,
phoneNumber = FirstAddressAutofillDetails.phoneNumber,
emailAddress = FirstAddressAutofillDetails.emailAddress,
)
clickManageAddressesButton()
clickSavedAddress("Mozilla")
fillAndSaveAddress(
"Android",
"Test",
"Name",
"Fort Street",
"San Jose",
"Arizona",
"95141",
"United States",
"777-7777",
"fuu@bar.org",
navigateToAutofillSettings = SecondAddressAutofillDetails.navigateToAutofillSettings,
firstName = SecondAddressAutofillDetails.firstName,
middleName = SecondAddressAutofillDetails.middleName,
lastName = SecondAddressAutofillDetails.lastName,
streetAddress = SecondAddressAutofillDetails.streetAddress,
city = SecondAddressAutofillDetails.city,
state = SecondAddressAutofillDetails.state,
zipCode = SecondAddressAutofillDetails.zipCode,
country = SecondAddressAutofillDetails.country,
phoneNumber = SecondAddressAutofillDetails.phoneNumber,
emailAddress = SecondAddressAutofillDetails.emailAddress,
)
verifyManageAddressesToolbarTitle()
}
@ -370,22 +392,21 @@ class AddressAutofillTest {
val addressFormPage =
TestAssetHelper.getAddressFormAsset(mockWebServer)
homeScreen {
}.openThreeDotMenu {
}.openSettings {
}.openAutofillSubMenu {
clickAddAddressButton()
autofillScreen {
fillAndSaveAddress(
"Mozilla",
"Fenix",
"Firefox",
"Harrison Street",
"San Francisco",
"Alaska",
"94105",
"United States",
"555-5555",
"foo@bar.com",
navigateToAutofillSettings = FirstAddressAutofillDetails.navigateToAutofillSettings,
isAddressAutofillEnabled = FirstAddressAutofillDetails.isAddressAutofillEnabled,
userHasSavedAddress = FirstAddressAutofillDetails.userHasSavedAddress,
firstName = FirstAddressAutofillDetails.firstName,
middleName = FirstAddressAutofillDetails.middleName,
lastName = FirstAddressAutofillDetails.lastName,
streetAddress = FirstAddressAutofillDetails.streetAddress,
city = FirstAddressAutofillDetails.city,
state = FirstAddressAutofillDetails.state,
zipCode = FirstAddressAutofillDetails.zipCode,
country = FirstAddressAutofillDetails.country,
phoneNumber = FirstAddressAutofillDetails.phoneNumber,
emailAddress = FirstAddressAutofillDetails.emailAddress,
)
}
@ -410,23 +431,21 @@ class AddressAutofillTest {
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1836838
@Test
fun verifyAutofillAddressSectionTest() {
homeScreen {
}.openThreeDotMenu {
}.openSettings {
}.openAutofillSubMenu {
verifyAddressAutofillSection(true, false)
clickAddAddressButton()
autofillScreen {
fillAndSaveAddress(
"Mozilla",
"Fenix",
"Firefox",
"Harrison Street",
"San Francisco",
"Alaska",
"94105",
"United States",
"555-5555",
"foo@bar.com",
navigateToAutofillSettings = FirstAddressAutofillDetails.navigateToAutofillSettings,
isAddressAutofillEnabled = FirstAddressAutofillDetails.isAddressAutofillEnabled,
userHasSavedAddress = FirstAddressAutofillDetails.userHasSavedAddress,
firstName = FirstAddressAutofillDetails.firstName,
middleName = FirstAddressAutofillDetails.middleName,
lastName = FirstAddressAutofillDetails.lastName,
streetAddress = FirstAddressAutofillDetails.streetAddress,
city = FirstAddressAutofillDetails.city,
state = FirstAddressAutofillDetails.state,
zipCode = FirstAddressAutofillDetails.zipCode,
country = FirstAddressAutofillDetails.country,
phoneNumber = FirstAddressAutofillDetails.phoneNumber,
emailAddress = FirstAddressAutofillDetails.emailAddress,
)
verifyAddressAutofillSection(true, true)
clickManageAddressesButton()

View File

@ -22,6 +22,7 @@ import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.ext.bookmarkStorage
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.registerAndCleanupIdlingResources
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.MockBrowserDataHelper.createBookmarkItem
import org.mozilla.fenix.helpers.RecyclerViewIdlingResource
@ -30,7 +31,6 @@ import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.appContext
import org.mozilla.fenix.helpers.TestHelper.clickSnackbarButton
import org.mozilla.fenix.helpers.TestHelper.longTapSelectItem
import org.mozilla.fenix.helpers.TestHelper.registerAndCleanupIdlingResources
import org.mozilla.fenix.helpers.TestHelper.restartApp
import org.mozilla.fenix.ui.robots.bookmarksMenu
import org.mozilla.fenix.ui.robots.browserScreen

View File

@ -13,12 +13,12 @@ import org.junit.Test
import org.mozilla.fenix.R
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.setNetworkEnabled
import org.mozilla.fenix.helpers.DataGenerationHelper.getStringResource
import org.mozilla.fenix.helpers.HomeActivityTestRule
import org.mozilla.fenix.helpers.MatcherHelper.itemWithResId
import org.mozilla.fenix.helpers.RetryTestRule
import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset
import org.mozilla.fenix.helpers.TestHelper.getStringResource
import org.mozilla.fenix.helpers.TestHelper.setNetworkEnabled
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.clickPageObject
import org.mozilla.fenix.ui.robots.navigationToolbar

View File

@ -20,6 +20,7 @@ import org.mozilla.fenix.R
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.ext.bookmarkStorage
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.registerAndCleanupIdlingResources
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.RecyclerViewIdlingResource
import org.mozilla.fenix.helpers.RetryTestRule
@ -27,7 +28,6 @@ import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.clickSnackbarButton
import org.mozilla.fenix.helpers.TestHelper.exitMenu
import org.mozilla.fenix.helpers.TestHelper.longTapSelectItem
import org.mozilla.fenix.helpers.TestHelper.registerAndCleanupIdlingResources
import org.mozilla.fenix.ui.robots.bookmarksMenu
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.homeScreen
@ -78,6 +78,7 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/522919
@Test
fun verifyEmptyBookmarksMenuTest() {
homeScreen {
@ -101,6 +102,7 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/522920
@Test
fun cancelCreateBookmarkFolderTest() {
homeScreen {
@ -114,6 +116,7 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2299619
@Test
fun cancelingChangesInEditModeAreNotSavedTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -138,6 +141,7 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/325633
@SmokeTest
@Test
fun editBookmarksNameAndUrlTest() {
@ -165,6 +169,7 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/341696
@Test
fun copyBookmarkURLTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -191,8 +196,9 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/325634
@Test
fun threeDotMenuShareBookmarkTest() {
fun shareBookmarkTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
browserScreen {
@ -211,6 +217,7 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/325636
@Test
fun openBookmarkInNewTabTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -229,6 +236,7 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1919261
@Test
fun verifyOpenAllInNewTabsOptionTest() {
val webPages = listOf(
@ -271,6 +279,7 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1919262
@Test
fun verifyOpenAllInPrivateTabsTest() {
val webPages = listOf(
@ -306,6 +315,7 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/325637
@Test
fun openBookmarkInPrivateTabTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -324,6 +334,7 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/325635
@Test
fun deleteBookmarkTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -351,6 +362,7 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2300275
@Test
fun bookmarksMultiSelectionToolbarItemsTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -376,6 +388,7 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2300276
@SmokeTest
@Test
fun openMultipleSelectedBookmarksInANewTabTest() {
@ -406,6 +419,7 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2300277
@Test
fun openMultipleSelectedBookmarksInPrivateTabTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -429,6 +443,7 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/325644
@SmokeTest
@Test
fun deleteMultipleSelectedBookmarksTest() {
@ -476,8 +491,9 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2301355
@Test
fun multipleSelectionShareButtonTest() {
fun shareMultipleSelectedBookmarksTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
browserScreen {
@ -500,6 +516,7 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/325639
@Test
fun createBookmarkFolderTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -524,6 +541,7 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/325645
@Test
fun navigateBookmarksFoldersTest() {
homeScreen {
@ -547,8 +565,9 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/374855
@Test
fun cantSelectDesktopFoldersTest() {
fun cantSelectDefaultFoldersTest() {
homeScreen {
}.openThreeDotMenu {
}.openBookmarks {
@ -561,6 +580,7 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2299703
@Test
fun deleteBookmarkInEditModeTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -583,6 +603,7 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1715710
@Test
fun verifySearchBookmarksViewTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -654,6 +675,7 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1715711
@Test
fun verifyVoiceSearchInBookmarksTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -707,6 +729,7 @@ class ComposeBookmarksTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/325642
// Verifies that deleting a Bookmarks folder also removes the item from inside it.
@SmokeTest
@Test

View File

@ -65,6 +65,7 @@ class ComposeCollectionTest {
mockWebServer.shutdown()
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/353823
@SmokeTest
@Test
fun createFirstCollectionUsingHomeScreenButtonTest() {
@ -97,6 +98,7 @@ class ComposeCollectionTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/343422
@SmokeTest
@Test
fun verifyExpandedCollectionItemsTest() {
@ -147,6 +149,7 @@ class ComposeCollectionTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/343425
@SmokeTest
@Test
fun openAllTabsFromACollectionTest() {
@ -181,6 +184,7 @@ class ComposeCollectionTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/343426
@SmokeTest
@Test
fun shareAllTabsFromACollectionTest() {
@ -208,6 +212,7 @@ class ComposeCollectionTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/343428
// Test running on beta/release builds in CI:
// caution when making changes to it, so they don't block the builds
@SmokeTest
@ -248,6 +253,7 @@ class ComposeCollectionTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2319453
// open a webpage, and add currently opened tab to existing collection
@Test
fun saveTabToExistingCollectionFromMainMenuTest() {
@ -276,8 +282,9 @@ class ComposeCollectionTest {
}
}
// Testrail link: https://testrail.stage.mozaws.net/index.php?/cases/view/343423
@Test
fun verifyAddTabButtonOfCollectionMenu() {
fun saveTabToExistingCollectionUsingTheAddTabButtonTest() {
val firstWebPage = getGenericAsset(mockWebServer, 1)
val secondWebPage = getGenericAsset(mockWebServer, 2)
@ -303,6 +310,7 @@ class ComposeCollectionTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/343424
@Test
fun renameCollectionTest() {
val webPage = getGenericAsset(mockWebServer, 1)
@ -325,6 +333,7 @@ class ComposeCollectionTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/991248
@Test
fun createCollectionUsingSelectTabsButtonTest() {
val firstWebPage = getGenericAsset(mockWebServer, 1)
@ -347,6 +356,7 @@ class ComposeCollectionTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2319455
@Test
fun removeTabFromCollectionUsingTheCloseButtonTest() {
val webPage = getGenericAsset(mockWebServer, 1)
@ -378,6 +388,7 @@ class ComposeCollectionTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/343427
@Test
fun removeTabFromCollectionUsingSwipeLeftActionTest() {
val testPage = getGenericAsset(mockWebServer, 1)
@ -410,6 +421,7 @@ class ComposeCollectionTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/991278
@Test
fun removeTabFromCollectionUsingSwipeRightActionTest() {
val testPage = getGenericAsset(mockWebServer, 1)
@ -442,6 +454,7 @@ class ComposeCollectionTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/991276
@Test
fun createCollectionByLongPressingOpenTabsTest() {
val firstWebPage = getGenericAsset(mockWebServer, 1)
@ -474,6 +487,7 @@ class ComposeCollectionTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/344897
@Test
fun navigateBackInCollectionFlowTest() {
val webPage = getGenericAsset(mockWebServer, 1)

View File

@ -15,13 +15,13 @@ import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.assertExternalAppOpens
import org.mozilla.fenix.helpers.Constants
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText
import org.mozilla.fenix.helpers.MatcherHelper.itemWithText
import org.mozilla.fenix.helpers.RetryTestRule
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.assertExternalAppOpens
import org.mozilla.fenix.helpers.TestHelper.clickSnackbarButton
import org.mozilla.fenix.ui.robots.clickContextMenuItem
import org.mozilla.fenix.ui.robots.clickPageObject
@ -75,6 +75,7 @@ class ComposeContextMenusTest {
mockWebServer.shutdown()
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/243837
@Test
fun verifyOpenLinkNewTabContextMenuOptionTest() {
val pageLinks =
@ -98,6 +99,7 @@ class ComposeContextMenusTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/244655
@Test
fun verifyOpenLinkInNewPrivateTabContextMenuOptionTest() {
val pageLinks =
@ -120,6 +122,7 @@ class ComposeContextMenusTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/243832
@Test
fun verifyCopyLinkContextMenuOptionTest() {
val pageLinks =
@ -140,6 +143,7 @@ class ComposeContextMenusTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/243838
@Test
fun verifyShareLinkContextMenuOptionTest() {
val pageLinks =
@ -159,6 +163,7 @@ class ComposeContextMenusTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/243833
@Test
fun verifyOpenImageNewTabContextMenuOptionTest() {
val pageLinks =
@ -178,6 +183,7 @@ class ComposeContextMenusTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/243834
@Test
fun verifyCopyImageLocationContextMenuOptionTest() {
val pageLinks =
@ -198,6 +204,7 @@ class ComposeContextMenusTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/243835
@Test
fun verifySaveImageContextMenuOptionTest() {
val pageLinks =
@ -221,6 +228,7 @@ class ComposeContextMenusTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/352050
@Test
fun verifyContextMenuLinkVariationsTest() {
val pageLinks =
@ -244,6 +252,7 @@ class ComposeContextMenusTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2333840
@Test
fun verifyPDFContextMenuLinkVariationsTest() {
val genericURL =
@ -264,6 +273,7 @@ class ComposeContextMenusTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/832094
@Test
fun verifyOpenLinkInAppContextMenuOptionTest() {
val defaultWebPage = TestAssetHelper.getExternalLinksAsset(mockWebServer)

View File

@ -22,12 +22,12 @@ import org.mozilla.fenix.R
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.registerAndCleanupIdlingResources
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.RecyclerViewIdlingResource
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.exitMenu
import org.mozilla.fenix.helpers.TestHelper.longTapSelectItem
import org.mozilla.fenix.helpers.TestHelper.registerAndCleanupIdlingResources
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.historyMenu
import org.mozilla.fenix.ui.robots.homeScreen
@ -74,6 +74,7 @@ class ComposeHistoryTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/243285
@Test
fun verifyEmptyHistoryMenuTest() {
homeScreen {
@ -85,6 +86,7 @@ class ComposeHistoryTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2302742
// Test running on beta/release builds in CI:
// caution when making changes to it, so they don't block the builds
@SmokeTest
@ -110,6 +112,7 @@ class ComposeHistoryTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/243288
@Test
fun deleteHistoryItemTest() {
val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -130,6 +133,7 @@ class ComposeHistoryTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1848881
@SmokeTest
@Test
fun deleteAllHistoryTest() {
@ -154,6 +158,7 @@ class ComposeHistoryTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/339690
@SmokeTest
@Test
fun historyMultiSelectionToolbarItemsTest() {
@ -182,6 +187,7 @@ class ComposeHistoryTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/339696
@Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1807268")
@Test
fun openMultipleSelectedHistoryItemsInANewTabTest() {
@ -212,6 +218,7 @@ class ComposeHistoryTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/346098
@Test
fun openMultipleSelectedHistoryItemsInPrivateTabTest() {
val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -237,6 +244,7 @@ class ComposeHistoryTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/346099
@Test
fun deleteMultipleSelectedHistoryItemsTest() {
val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -271,6 +279,7 @@ class ComposeHistoryTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/339701
@Test
fun shareMultipleSelectedHistoryItemsTest() {
val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -297,6 +306,7 @@ class ComposeHistoryTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1715627
@Test
fun verifySearchHistoryViewTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -339,6 +349,7 @@ class ComposeHistoryTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1715631
@Test
fun verifyVoiceSearchInHistoryTest() {
homeScreen {
@ -351,6 +362,7 @@ class ComposeHistoryTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1715632
@Test
fun verifySearchForHistoryItemsTest() {
val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -376,6 +388,7 @@ class ComposeHistoryTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1715634
@Test
fun verifyDeletedHistoryItemsCanNotBeSearchedTest() {
val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -418,6 +431,7 @@ class ComposeHistoryTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903590
// Test running on beta/release builds in CI:
// caution when making changes to it, so they don't block the builds
@SmokeTest

View File

@ -146,22 +146,6 @@ class ComposeHomeScreenTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1569867
@Test
fun verifyJumpBackInContextualHintTest() {
activityTestRule.activityRule.applySettingsExceptions {
it.isJumpBackInCFREnabled = true
}
val genericPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
navigationToolbar {
}.enterURLAndEnterToBrowser(genericPage.url) {
}.goToHomescreen {
verifyJumpBackInMessage(activityTestRule)
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1569839
@Test
fun verifyCustomizeHomepageButtonTest() {

View File

@ -139,7 +139,7 @@ class ComposeMediaNotificationTest {
mDevice.pressBack()
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903595
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903595
@Test
fun mediaSystemNotificationInPrivateModeTest() {
val audioTestPage = TestAssetHelper.getAudioPageAsset(mockWebServer)

View File

@ -14,9 +14,9 @@ import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.runWithSystemLocaleChanged
import org.mozilla.fenix.helpers.HomeActivityTestRule
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.runWithSystemLocaleChanged
import org.mozilla.fenix.ui.robots.navigationToolbar
import java.util.Locale
@ -56,6 +56,7 @@ class ComposeNavigationToolbarTest {
mockWebServer.shutdown()
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/987326
// Swipes the nav bar left/right to switch between tabs
@SmokeTest
@Test
@ -75,6 +76,7 @@ class ComposeNavigationToolbarTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/987327
// Because it requires changing system prefs, this test will run only on Debug builds
@Test
fun swipeToSwitchTabInRTLTest() {

View File

@ -17,6 +17,10 @@ import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AppAndSystemHelper.assertNativeAppOpens
import org.mozilla.fenix.helpers.AppAndSystemHelper.denyPermission
import org.mozilla.fenix.helpers.AppAndSystemHelper.grantSystemPermission
import org.mozilla.fenix.helpers.AppAndSystemHelper.verifyKeyboardVisibility
import org.mozilla.fenix.helpers.Constants
import org.mozilla.fenix.helpers.HomeActivityTestRule
import org.mozilla.fenix.helpers.MatcherHelper
@ -27,7 +31,6 @@ import org.mozilla.fenix.helpers.SearchDispatcher
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper
import org.mozilla.fenix.helpers.TestHelper.exitMenu
import org.mozilla.fenix.helpers.TestHelper.verifyKeyboardVisibility
import org.mozilla.fenix.ui.robots.clickContextMenuItem
import org.mozilla.fenix.ui.robots.clickPageObject
import org.mozilla.fenix.ui.robots.homeScreen
@ -61,7 +64,6 @@ class ComposeSearchTest {
isRecentTabsFeatureEnabled = false,
isTCPCFREnabled = false,
isWallpaperOnboardingEnabled = false,
isCookieBannerReductionDialogEnabled = false,
tabsTrayRewriteEnabled = true,
),
) { it.activity }
@ -79,13 +81,14 @@ class ComposeSearchTest {
searchMockServer.shutdown()
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2154189
@Test
fun verifySearchBarItemsTest() {
navigationToolbar {
verifyDefaultSearchEngine("Google")
verifySearchBarPlaceholder("Search or enter address")
}.clickUrlbar {
TestHelper.verifyKeyboardVisibility(isExpectedToBeVisible = true)
verifyKeyboardVisibility(isExpectedToBeVisible = true)
verifyScanButtonVisibility(visible = true)
verifyVoiceSearchButtonVisibility(enabled = true)
verifySearchBarPlaceholder("Search or enter address")
@ -95,6 +98,7 @@ class ComposeSearchTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2154190
@Test
fun verifySearchSelectorMenuItemsTest() {
homeScreen {
@ -109,6 +113,7 @@ class ComposeSearchTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2154194
@Test
fun verifySearchPlaceholderForGeneralDefaultSearchEnginesTest() {
generalEnginesList.forEach {
@ -126,6 +131,7 @@ class ComposeSearchTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2154195
@Test
fun verifySearchPlaceholderForNotDefaultGeneralSearchEnginesTest() {
val generalEnginesList = listOf("DuckDuckGo", "Bing")
@ -140,6 +146,7 @@ class ComposeSearchTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2154196
@Test
fun verifySearchPlaceholderForTopicSpecificSearchEnginesTest() {
val topicEnginesList = listOf("Amazon.com", "Wikipedia", "eBay")
@ -154,6 +161,7 @@ class ComposeSearchTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1059459
@SmokeTest
@Test
fun verifyQRScanningCameraAccessDialogTest() {
@ -163,7 +171,7 @@ class ComposeSearchTest {
homeScreen {
}.openSearch {
clickScanButton()
TestHelper.denyPermission()
denyPermission()
clickScanButton()
clickDismissPermissionRequiredDialog()
}
@ -171,10 +179,11 @@ class ComposeSearchTest {
}.openSearch {
clickScanButton()
clickGoToPermissionsSettings()
TestHelper.assertNativeAppOpens(Constants.PackageName.ANDROID_SETTINGS)
assertNativeAppOpens(Constants.PackageName.ANDROID_SETTINGS)
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/235397
@SmokeTest
@Test
fun scanQRCodeToOpenAWebpageTest() {
@ -184,11 +193,12 @@ class ComposeSearchTest {
homeScreen {
}.openSearch {
clickScanButton()
TestHelper.grantSystemPermission()
grantSystemPermission()
verifyScannerOpen()
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2154191
@Test
fun verifyScanButtonAvailableOnlyForGeneralSearchEnginesTest() {
generalEnginesList.forEach {
@ -210,6 +220,7 @@ class ComposeSearchTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/235395
// Verifies a temporary change of search engine from the Search shortcut menu
@SmokeTest
@Test
@ -229,6 +240,7 @@ class ComposeSearchTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/233589
@Test
fun defaultSearchEnginesCanBeSetFromSearchSelectorMenuTest() {
searchScreen {
@ -246,6 +258,7 @@ class ComposeSearchTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/522918
@Test
fun verifyClearSearchButtonTest() {
homeScreen {
@ -256,6 +269,7 @@ class ComposeSearchTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1623441
@Ignore("Test run timing out: https://github.com/mozilla-mobile/fenix/issues/27704")
@SmokeTest
@Test
@ -284,6 +298,7 @@ class ComposeSearchTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1592229
@Ignore("Test run timing out: https://github.com/mozilla-mobile/fenix/issues/27704")
@Test
fun verifyAPageIsAddedToASearchGroupOnlyOnceTest() {
@ -329,6 +344,7 @@ class ComposeSearchTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1591782
@Ignore("Failing due to known bug, see https://github.com/mozilla-mobile/fenix/issues/23818")
@Test
fun searchGroupIsGeneratedWhenNavigatingInTheSameTabTest() {
@ -352,6 +368,7 @@ class ComposeSearchTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1591781
@SmokeTest
@Test
fun searchGroupIsNotGeneratedForLinksOpenedInPrivateTabsTest() {
@ -383,6 +400,7 @@ class ComposeSearchTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1592269
@Ignore("Test run timing out: https://github.com/mozilla-mobile/fenix/issues/27704")
@SmokeTest
@Test
@ -425,6 +443,7 @@ class ComposeSearchTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1592242
@Ignore("Test run timing out: https://github.com/mozilla-mobile/fenix/issues/27704")
@Test
fun deleteSearchGroupFromHomeScreenTest() {
@ -465,6 +484,7 @@ class ComposeSearchTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1592235
@Ignore("Test run timing out: https://github.com/mozilla-mobile/fenix/issues/27704")
@Test
fun openAPageFromHomeScreenSearchGroupTest() {
@ -513,6 +533,7 @@ class ComposeSearchTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1592238
@Ignore("Test run timing out: https://github.com/mozilla-mobile/fenix/issues/27704")
@Test
fun shareAPageFromHomeScreenSearchGroupTest() {
@ -551,6 +572,7 @@ class ComposeSearchTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1232633
// Default search code for Google-US
@Test
fun defaultSearchCodeGoogleUS() {
@ -571,6 +593,7 @@ class ComposeSearchTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1232637
// Default search code for Bing-US
@Test
fun defaultSearchCodeBingUS() {
@ -600,6 +623,7 @@ class ComposeSearchTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1232638
// Default search code for DuckDuckGo-US
@Test
fun defaultSearchCodeDuckDuckGoUS() {

View File

@ -17,17 +17,18 @@ import org.junit.Test
import org.mozilla.fenix.R
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.clearDownloadsFolder
import org.mozilla.fenix.helpers.AppAndSystemHelper.setNetworkEnabled
import org.mozilla.fenix.helpers.DataGenerationHelper.getStringResource
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.MatcherHelper
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestAssetHelper.getStorageTestAsset
import org.mozilla.fenix.helpers.TestHelper
import org.mozilla.fenix.helpers.TestHelper.deleteDownloadedFileOnStorage
import org.mozilla.fenix.helpers.TestHelper.exitMenu
import org.mozilla.fenix.helpers.TestHelper.mDevice
import org.mozilla.fenix.helpers.TestHelper.restartApp
import org.mozilla.fenix.helpers.TestHelper.setNetworkEnabled
import org.mozilla.fenix.ui.robots.clickPageObject
import org.mozilla.fenix.ui.robots.downloadRobot
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.navigationToolbar
@ -65,8 +66,12 @@ class ComposeSettingsDeleteBrowsingDataOnQuitTest {
@After
fun tearDown() {
mockWebServer.shutdown()
// Check and clear the downloads folder
clearDownloadsFolder()
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/416048
@Test
fun deleteBrowsingDataOnQuitSettingTest() {
homeScreen {
@ -95,6 +100,7 @@ class ComposeSettingsDeleteBrowsingDataOnQuitTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/416049
@Test
fun deleteOpenTabsOnQuitTest() {
val testPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -119,6 +125,7 @@ class ComposeSettingsDeleteBrowsingDataOnQuitTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/416050
@Test
fun deleteBrowsingHistoryOnQuitTest() {
val genericPage =
@ -182,6 +189,7 @@ class ComposeSettingsDeleteBrowsingDataOnQuitTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1243096
@SmokeTest
@Test
fun deleteDownloadsOnQuitTest() {
@ -194,13 +202,10 @@ class ComposeSettingsDeleteBrowsingDataOnQuitTest {
clickDeleteBrowsingOnQuitButtonSwitch()
exitMenu()
}
navigationToolbar {
}.enterURLAndEnterToBrowser(downloadTestPage.toUri()) {
}.clickDownloadLink("smallZip.zip") {
verifyDownloadPrompt("smallZip.zip")
}.clickDownload {
downloadRobot {
openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "smallZip.zip")
verifyDownloadCompleteNotificationPopup()
}.closeCompletedDownloadPrompt {
}.closeDownloadPrompt {
}.goToHomescreen {
}.openThreeDotMenu {
clickQuit()
@ -212,9 +217,9 @@ class ComposeSettingsDeleteBrowsingDataOnQuitTest {
}.openDownloadsManager {
verifyEmptyDownloadsList()
}
deleteDownloadedFileOnStorage("smallZip.zip")
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/416053
@SmokeTest
@Test
fun deleteSitePermissionsOnQuitTest() {
@ -250,9 +255,10 @@ class ComposeSettingsDeleteBrowsingDataOnQuitTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/416052
@Test
fun deleteCachedFilesOnQuitTest() {
val pocketTopArticles = TestHelper.getStringResource(R.string.pocket_pinned_top_articles)
val pocketTopArticles = getStringResource(R.string.pocket_pinned_top_articles)
homeScreen {
}.openThreeDotMenu {

View File

@ -13,15 +13,15 @@ import org.junit.Test
import org.mozilla.fenix.R
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.setNetworkEnabled
import org.mozilla.fenix.helpers.DataGenerationHelper.getStringResource
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.MatcherHelper.itemWithResId
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestAssetHelper.getStorageTestAsset
import org.mozilla.fenix.helpers.TestHelper.exitMenu
import org.mozilla.fenix.helpers.TestHelper.getStringResource
import org.mozilla.fenix.helpers.TestHelper.mDevice
import org.mozilla.fenix.helpers.TestHelper.restartApp
import org.mozilla.fenix.helpers.TestHelper.setNetworkEnabled
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.clickPageObject
import org.mozilla.fenix.ui.robots.homeScreen
@ -58,6 +58,7 @@ class ComposeSettingsDeleteBrowsingDataTest {
mockWebServer.shutdown()
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/937561
@Test
fun deleteBrowsingDataOptionStatesTest() {
homeScreen {
@ -116,6 +117,7 @@ class ComposeSettingsDeleteBrowsingDataTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/517811
@Test
fun deleteOpenTabsBrowsingDataWithNoOpenTabsTest() {
homeScreen {
@ -133,6 +135,7 @@ class ComposeSettingsDeleteBrowsingDataTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/353531
@SmokeTest
@Test
fun deleteOpenTabsBrowsingDataTest() {
@ -165,6 +168,7 @@ class ComposeSettingsDeleteBrowsingDataTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/378864
@SmokeTest
@Test
fun deleteBrowsingHistoryTest() {
@ -195,6 +199,7 @@ class ComposeSettingsDeleteBrowsingDataTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/416041
@SmokeTest
@Test
fun deleteCookiesAndSiteDataTest() {
@ -233,6 +238,7 @@ class ComposeSettingsDeleteBrowsingDataTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/416042
@SmokeTest
@Test
fun deleteCachedFilesTest() {

View File

@ -25,7 +25,6 @@ import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.clickSnackbarButton
import org.mozilla.fenix.helpers.TestHelper.closeApp
import org.mozilla.fenix.helpers.TestHelper.restartApp
import org.mozilla.fenix.helpers.TestHelper.verifyKeyboardVisibility
import org.mozilla.fenix.helpers.TestHelper.verifySnackBarText
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.clickPageObject
@ -86,7 +85,7 @@ class ComposeTabbedBrowsingTest {
mockWebServer.shutdown()
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903599
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903599
@Test
fun closeAllTabsTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -118,9 +117,9 @@ class ComposeTabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903604
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2349580
@Test
fun closingTabsMethodsTest() {
fun closingTabsTest() {
val genericURL = TestAssetHelper.getGenericAsset(mockWebServer, 1)
navigationToolbar {
@ -133,36 +132,43 @@ class ComposeTabbedBrowsingTest {
}
browserScreen {
verifyTabCounter("1")
}.openComposeTabDrawer(composeTestRule) {
closeTab()
}
homeScreen {
verifyTabCounter("0")
}.openNavigationToolbar {
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903604
@Test
fun swipeToCloseTabsTest() {
val genericURL = TestAssetHelper.getGenericAsset(mockWebServer, 1)
navigationToolbar {
}.enterURLAndEnterToBrowser(genericURL.url) {
waitForPageToLoad()
}.openComposeTabDrawer(composeTestRule) {
verifyExistingOpenTabs("Test_Page_1")
swipeTabRight("Test_Page_1")
verifySnackBarText("Tab closed")
}
homeScreen {
verifyTabCounter("0")
}.openNavigationToolbar {
}.enterURLAndEnterToBrowser(genericURL.url) {
waitForPageToLoad()
}.openComposeTabDrawer(composeTestRule) {
verifyExistingOpenTabs("Test_Page_1")
swipeTabLeft("Test_Page_1")
verifySnackBarText("Tab closed")
}
homeScreen {
verifyTabCounter("0")
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903591
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903591
@Test
fun closingPrivateTabsMethodsTest() {
fun closingPrivateTabsTest() {
val genericURL = TestAssetHelper.getGenericAsset(mockWebServer, 1)
homeScreen { }.togglePrivateBrowsingMode()
homeScreen { }.togglePrivateBrowsingMode(switchPBModeOn = true)
navigationToolbar {
}.enterURLAndEnterToBrowser(genericURL.url) {
}.openComposeTabDrawer(composeTestRule) {
@ -173,33 +179,10 @@ class ComposeTabbedBrowsingTest {
}
browserScreen {
verifyTabCounter("1")
}.openComposeTabDrawer(composeTestRule) {
closeTab()
}
homeScreen {
verifyTabCounter("0")
}.openNavigationToolbar {
}.enterURLAndEnterToBrowser(genericURL.url) {
}.openComposeTabDrawer(composeTestRule) {
verifyExistingOpenTabs("Test_Page_1")
swipeTabRight("Test_Page_1")
verifySnackBarText("Private tab closed")
}
homeScreen {
verifyTabCounter("0")
}.openNavigationToolbar {
}.enterURLAndEnterToBrowser(genericURL.url) {
}.openComposeTabDrawer(composeTestRule) {
verifyExistingOpenTabs("Test_Page_1")
swipeTabLeft("Test_Page_1")
verifySnackBarText("Private tab closed")
}
homeScreen {
verifyTabCounter("0")
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903606
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903606
@SmokeTest
@Test
fun tabMediaControlButtonTest() {
@ -240,6 +223,7 @@ class ComposeTabbedBrowsingTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903602
@Test
fun verifyTabTrayNotShowingStateHalfExpanded() {
homeScreen {
@ -263,7 +247,7 @@ class ComposeTabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903600
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903600
@Test
fun verifyEmptyTabTray() {
homeScreen {
@ -280,7 +264,7 @@ class ComposeTabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903585
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903585
@Test
fun verifyEmptyPrivateTabsTrayTest() {
homeScreen {
@ -298,7 +282,7 @@ class ComposeTabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903601
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903601
@Test
fun verifyTabsTrayWithOpenTabTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -322,7 +306,7 @@ class ComposeTabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903587
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903587
@SmokeTest
@Test
fun verifyPrivateTabsTrayWithOpenTabTest() {
@ -347,78 +331,133 @@ class ComposeTabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/927314
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/927314
@Test
fun tabsCounterShortcutMenuTest() {
fun tabsCounterShortcutMenuCloseTabTest() {
val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2)
navigationToolbar {
}.enterURLAndEnterToBrowser(firstWebPage.url) {
waitForPageToLoad()
}.goToHomescreen {
}.openNavigationToolbar {
}.enterURLAndEnterToBrowser(secondWebPage.url) {
waitForPageToLoad()
}
navigationToolbar {
}.openTabButtonShortcutsMenu {
verifyTabButtonShortcutMenuItems()
}.closeTabFromShortcutsMenu {
browserScreen {
verifyTabCounter("1")
verifyPageContent(firstWebPage.content)
}
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2343663
@Test
fun tabsCounterShortcutMenuNewPrivateTabTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {}
navigationToolbar {
}.openTabButtonShortcutsMenu {
verifyTabButtonShortcutMenuItems()
}.closeTabFromShortcutsMenu {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {}
navigationToolbar {
}.openTabButtonShortcutsMenu {
}.openNewPrivateTabFromShortcutsMenu {
verifyKeyboardVisibility()
verifySearchBarPlaceholder("Search or enter address")
// dismiss search dialog
}.dismissSearchBar {
verifyPrivateBrowsingHomeScreenItems()
}
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {}
navigationToolbar {
}.openTabButtonShortcutsMenu {
}.openNewTabFromShortcutsMenu {
verifyKeyboardVisibility()
verifySearchBarPlaceholder("Search or enter address")
// dismiss search dialog
}.dismissSearchBar {
verifyHomeWordmark()
verifyNavigationToolbar()
verifyIfInPrivateOrNormalMode(privateBrowsingEnabled = true)
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/927314
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2343662
@Test
fun privateTabsCounterShortcutMenuTest() {
fun tabsCounterShortcutMenuNewTabTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
homeScreen {}.togglePrivateBrowsingMode()
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {}
navigationToolbar {
}.openTabButtonShortcutsMenu {
verifyTabButtonShortcutMenuItems()
}.closeTabFromShortcutsMenu {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {}
navigationToolbar {
}.openTabButtonShortcutsMenu {
}.openNewPrivateTabFromShortcutsMenu {
verifyKeyboardVisibility()
verifySearchBarPlaceholder("Search or enter address")
// dismiss search dialog
}.dismissSearchBar {
verifyCommonMythsLink()
}
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {}
navigationToolbar {
}.openTabButtonShortcutsMenu {
}.openNewTabFromShortcutsMenu {
verifyKeyboardVisibility()
verifySearchBarPlaceholder("Search or enter address")
// dismiss search dialog
}.dismissSearchBar {
// Verify normal browsing homescreen
verifyExistingTopSitesList()
verifyIfInPrivateOrNormalMode(privateBrowsingEnabled = false)
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/1046683
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/927315
@Test
fun privateTabsCounterShortcutMenuCloseTabTest() {
val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2)
homeScreen {}.togglePrivateBrowsingMode(switchPBModeOn = true)
navigationToolbar {
}.enterURLAndEnterToBrowser(firstWebPage.url) {
waitForPageToLoad()
}.goToHomescreen {
}.openNavigationToolbar {
}.enterURLAndEnterToBrowser(secondWebPage.url) {
waitForPageToLoad()
}
navigationToolbar {
}.openTabButtonShortcutsMenu {
verifyTabButtonShortcutMenuItems()
}.closeTabFromShortcutsMenu {
browserScreen {
verifyTabCounter("1")
verifyPageContent(firstWebPage.content)
}
}.openTabButtonShortcutsMenu {
}.closeTabFromShortcutsMenu {
homeScreen {
verifyIfInPrivateOrNormalMode(privateBrowsingEnabled = true)
}
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2344199
@Test
fun privateTabsCounterShortcutMenuNewPrivateTabTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
homeScreen {}.togglePrivateBrowsingMode(switchPBModeOn = true)
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
waitForPageToLoad()
}
navigationToolbar {
}.openTabButtonShortcutsMenu {
}.openNewPrivateTabFromShortcutsMenu {
verifySearchBarPlaceholder("Search or enter address")
}.dismissSearchBar {
verifyIfInPrivateOrNormalMode(privateBrowsingEnabled = true)
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2344198
@Test
fun privateTabsCounterShortcutMenuNewTabTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
homeScreen {}.togglePrivateBrowsingMode(switchPBModeOn = true)
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content)
}
navigationToolbar {
}.openTabButtonShortcutsMenu {
}.openNewTabFromShortcutsMenu {
verifySearchToolbar(isDisplayed = true)
}.dismissSearchBar {
verifyIfInPrivateOrNormalMode(privateBrowsingEnabled = false)
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1046683
@Test
fun verifySyncedTabsWhenUserIsNotSignedInTest() {
navigationToolbar {
@ -432,7 +471,7 @@ class ComposeTabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903598
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903598
@SmokeTest
@Test
fun shareTabsFromTabsTrayTest() {

View File

@ -15,11 +15,11 @@ import org.junit.Test
import org.mozilla.fenix.R
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.DataGenerationHelper.generateRandomString
import org.mozilla.fenix.helpers.DataGenerationHelper.getStringResource
import org.mozilla.fenix.helpers.HomeActivityTestRule
import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset
import org.mozilla.fenix.helpers.TestHelper.clickSnackbarButton
import org.mozilla.fenix.helpers.TestHelper.generateRandomString
import org.mozilla.fenix.helpers.TestHelper.getStringResource
import org.mozilla.fenix.helpers.TestHelper.waitUntilSnackbarGone
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.homeScreenWithComposeTopSites
@ -60,6 +60,7 @@ class ComposeTopSitesTest {
mockWebServer.shutdown()
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/532598
@SmokeTest
@Test
fun addAWebsiteAsATopSiteTest() {
@ -78,6 +79,7 @@ class ComposeTopSitesTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/532599
@Test
fun openTopSiteInANewTabTest() {
val defaultWebPage = getGenericAsset(mockWebServer, 1)
@ -105,6 +107,7 @@ class ComposeTopSitesTest {
mDevice.pressBack()
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/532600
@Test
fun openTopSiteInANewPrivateTabTest() {
val defaultWebPage = getGenericAsset(mockWebServer, 1)
@ -126,6 +129,7 @@ class ComposeTopSitesTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1110321
@Test
fun renameATopSiteTest() {
val defaultWebPage = getGenericAsset(mockWebServer, 1)
@ -150,6 +154,7 @@ class ComposeTopSitesTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/532601
@Test
fun removeTopSiteUsingMenuButtonTest() {
val defaultWebPage = getGenericAsset(mockWebServer, 1)
@ -176,6 +181,7 @@ class ComposeTopSitesTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2323641
@Test
fun removeTopSiteFromMainMenuTest() {
val defaultWebPage = getGenericAsset(mockWebServer, 1)
@ -199,6 +205,7 @@ class ComposeTopSitesTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/561582
// Expected for en-us defaults
@Test
fun verifyENLocalesDefaultTopSitesListTest() {
@ -211,6 +218,7 @@ class ComposeTopSitesTest {
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1050642
@SmokeTest
@Test
fun addAndRemoveMostViewedTopSiteTest() {

View File

@ -14,13 +14,13 @@ import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.assertExternalAppOpens
import org.mozilla.fenix.helpers.Constants.PackageName.YOUTUBE_APP
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText
import org.mozilla.fenix.helpers.MatcherHelper.itemWithText
import org.mozilla.fenix.helpers.RetryTestRule
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.assertExternalAppOpens
import org.mozilla.fenix.helpers.TestHelper.clickSnackbarButton
import org.mozilla.fenix.ui.robots.clickContextMenuItem
import org.mozilla.fenix.ui.robots.clickPageObject

View File

@ -1,72 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.ui
import androidx.core.net.toUri
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.TestHelper.exitMenu
import org.mozilla.fenix.helpers.TestHelper.restartApp
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.homeScreen
class CookieBannerReductionTest {
@get:Rule
val activityTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides(skipOnboarding = true)
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1980504
// Bug causing flakiness https://bugzilla.mozilla.org/show_bug.cgi?id=1807440
@Ignore("Disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1852803")
@SmokeTest
@Test
fun verifyCookieBannerReductionFunctionalityTest() {
val webSite = "startsiden.no"
homeScreen {
}.openNavigationToolbar {
}.enterURLAndEnterToBrowser(webSite.toUri()) {
waitForPageToLoad()
verifyCookieBannerExists(exists = true)
}.openThreeDotMenu {
}.openSettings {
verifySettingsOptionSummary("Cookie banner reduction", "Off")
}.openCookieBannerReductionSubMenu {
verifyCookieBannerView(isCookieBannerReductionChecked = false)
clickCookieBannerReductionToggle()
verifyCheckedCookieBannerReductionToggle(isCookieBannerReductionChecked = true)
}.goBack {
verifySettingsOptionSummary("Cookie banner reduction", "On")
}
exitMenu()
browserScreen {
verifyCookieBannerExists(exists = false)
}
restartApp(activityTestRule)
browserScreen {
verifyCookieBannerExists(exists = false)
}.openThreeDotMenu {
}.openSettings {
}.openCookieBannerReductionSubMenu {
clickCookieBannerReductionToggle()
verifyCheckedCookieBannerReductionToggle(false)
}
exitMenu()
browserScreen {
waitForPageToLoad()
}.openThreeDotMenu {
}.refreshPage {
verifyCookieBannerExists(exists = false)
}
}
}

View File

@ -16,10 +16,10 @@ import org.junit.Test
import org.mozilla.fenix.R
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.DataGenerationHelper.getStringResource
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.MatcherHelper.itemWithResId
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.getStringResource
import org.mozilla.fenix.helpers.TestHelper.packageName
import org.mozilla.fenix.ui.robots.clickPageObject
import org.mozilla.fenix.ui.robots.homeScreen

View File

@ -12,14 +12,14 @@ import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.bringAppToForeground
import org.mozilla.fenix.helpers.AppAndSystemHelper.putAppToBackground
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.MatcherHelper.itemWithResId
import org.mozilla.fenix.helpers.MatcherHelper.itemWithResIdContainingText
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.bringAppToForeground
import org.mozilla.fenix.helpers.TestHelper.exitMenu
import org.mozilla.fenix.helpers.TestHelper.packageName
import org.mozilla.fenix.helpers.TestHelper.putAppToBackground
import org.mozilla.fenix.ui.robots.clickPageObject
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.navigationToolbar
@ -369,6 +369,7 @@ class CreditCardAutofillTest {
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1512794
@Ignore("Failing, see https://bugzilla.mozilla.org/show_bug.cgi?id=1853625")
@Test
fun verifyMultipleCreditCardsCanBeAddedTest() {
val creditCardFormPage = TestAssetHelper.getCreditCardFormAsset(mockWebServer)

View File

@ -19,14 +19,14 @@ import org.junit.Test
import org.mozilla.fenix.IntentReceiverActivity
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.openAppFromExternalLink
import org.mozilla.fenix.helpers.DataGenerationHelper.createCustomTabIntent
import org.mozilla.fenix.helpers.FeatureSettingsHelperDelegate
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.MatcherHelper.itemWithResIdAndText
import org.mozilla.fenix.helpers.MatcherHelper.itemWithText
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.createCustomTabIntent
import org.mozilla.fenix.helpers.TestHelper.exitMenu
import org.mozilla.fenix.helpers.TestHelper.openAppFromExternalLink
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.clickPageObject
import org.mozilla.fenix.ui.robots.customTabScreen

View File

@ -5,13 +5,15 @@
package org.mozilla.fenix.ui
import androidx.core.net.toUri
import org.junit.After
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AppAndSystemHelper.clearDownloadsFolder
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.ui.robots.navigationToolbar
import org.mozilla.fenix.ui.robots.downloadRobot
/**
* Test for verifying downloading a list of different file types:
@ -28,6 +30,12 @@ class DownloadFileTypesTest(fileName: String) {
@get:Rule
val activityTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides()
@After
fun tearDown() {
// Check and clear the downloads folder
clearDownloadsFolder()
}
companion object {
// Creating test data. The test will take each file name as a parameter and run it individually.
@JvmStatic
@ -45,17 +53,14 @@ class DownloadFileTypesTest(fileName: String) {
)
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/251028&group_by=cases:section_id&group_id=31659&group_order=asc
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/251028
@SmokeTest
@Test
fun allFilesAppearInDownloadsMenuTest() {
navigationToolbar {
}.enterURLAndEnterToBrowser(downloadTestPage.toUri()) {
}.clickDownloadLink(downloadFile) {
verifyDownloadPrompt(downloadFile)
}.clickDownload {
downloadRobot {
openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = downloadFile)
verifyDownloadCompleteNotificationPopup()
}.closeCompletedDownloadPrompt {
}.closeDownloadPrompt {
}.openThreeDotMenu {
}.openDownloadsManager {
waitForDownloadsListToExist()

View File

@ -13,17 +13,18 @@ import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.assertExternalAppOpens
import org.mozilla.fenix.helpers.AppAndSystemHelper.clearDownloadsFolder
import org.mozilla.fenix.helpers.AppAndSystemHelper.deleteDownloadedFileOnStorage
import org.mozilla.fenix.helpers.AppAndSystemHelper.setNetworkEnabled
import org.mozilla.fenix.helpers.Constants.PackageName.GOOGLE_APPS_PHOTOS
import org.mozilla.fenix.helpers.Constants.PackageName.GOOGLE_DOCS
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.MatcherHelper.itemWithText
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.assertExternalAppOpens
import org.mozilla.fenix.helpers.TestHelper.clickSnackbarButton
import org.mozilla.fenix.helpers.TestHelper.deleteDownloadedFileOnStorage
import org.mozilla.fenix.helpers.TestHelper.exitMenu
import org.mozilla.fenix.helpers.TestHelper.mDevice
import org.mozilla.fenix.helpers.TestHelper.setNetworkEnabled
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.clickPageObject
import org.mozilla.fenix.ui.robots.downloadRobot
@ -72,63 +73,45 @@ class DownloadTest {
mockWebServer.shutdown()
setNetworkEnabled(enabled = true)
// Check and clear the downloads folder
clearDownloadsFolder()
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/243844
@Test
fun verifyTheDownloadPromptsTest() {
downloadFile = "web_icon.png"
navigationToolbar {
}.enterURLAndEnterToBrowser(downloadTestPage.toUri()) {
waitForPageToLoad()
}.clickDownloadLink(downloadFile) {
verifyDownloadPrompt(downloadFile)
}.clickDownload {
downloadRobot {
openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "web_icon.png")
verifyDownloadCompleteNotificationPopup()
}.clickOpen("image/png") {}
downloadRobot {
verifyPhotosAppOpens()
}
mDevice.pressBack()
deleteDownloadedFileOnStorage(downloadFile)
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2299405
@Test
fun verifyTheDownloadFailedNotificationsTest() {
downloadFile = "1GB.zip"
navigationToolbar {
}.enterURLAndEnterToBrowser(downloadTestPage.toUri()) {
waitForPageToLoad()
}.clickDownloadLink(downloadFile) {
verifyDownloadPrompt(downloadFile)
}.clickDownload {
downloadRobot {
openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "1GB.zip")
setNetworkEnabled(enabled = false)
verifyDownloadFailedPrompt(downloadFile)
verifyDownloadFailedPrompt("1GB.zip")
setNetworkEnabled(enabled = true)
clickTryAgainButton()
}
mDevice.openNotification()
notificationShade {
verifySystemNotificationDoesNotExist("Download failed")
verifySystemNotificationExists(downloadFile)
verifySystemNotificationExists("1GB.zip")
}.closeNotificationTray {}
deleteDownloadedFileOnStorage(downloadFile)
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2298616
@Test
fun verifyDownloadCompleteNotificationTest() {
downloadFile = "web_icon.png"
navigationToolbar {
}.enterURLAndEnterToBrowser(downloadTestPage.toUri()) {
waitForPageToLoad()
}.clickDownloadLink(downloadFile) {
verifyDownloadPrompt(downloadFile)
}.clickDownload {
downloadRobot {
openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "web_icon.png")
verifyDownloadCompleteNotificationPopup()
}
mDevice.openNotification()
@ -146,7 +129,6 @@ class DownloadTest {
)
verifySystemNotificationDoesNotExist("Firefox Fenix")
}.closeNotificationTray {}
deleteDownloadedFileOnStorage(downloadFile)
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/451563
@ -154,19 +136,9 @@ class DownloadTest {
@SmokeTest
@Test
fun pauseResumeCancelDownloadTest() {
// Clear the "Firefox Fenix default browser notification"
notificationShade {
cancelAllShownNotifications()
downloadRobot {
openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "1GB.zip")
}
downloadFile = "1GB.zip"
navigationToolbar {
}.enterURLAndEnterToBrowser(downloadTestPage.toUri()) {
waitForPageToLoad()
}.clickDownloadLink(downloadFile) {
verifyDownloadPrompt(downloadFile)
}.clickDownload {}
mDevice.openNotification()
notificationShade {
verifySystemNotificationExists("Firefox Fenix")
@ -175,7 +147,7 @@ class DownloadTest {
verifySystemNotificationExists("Download paused")
clickDownloadNotificationControlButton("RESUME")
clickDownloadNotificationControlButton("CANCEL")
verifySystemNotificationDoesNotExist(downloadFile)
verifySystemNotificationDoesNotExist("1GB.zip")
mDevice.pressBack()
}
browserScreen {
@ -183,79 +155,41 @@ class DownloadTest {
}.openDownloadsManager {
verifyEmptyDownloadsList()
}
deleteDownloadedFileOnStorage(downloadFile)
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2301474
@Test
fun openDownloadedFileFromDownloadsMenuTest() {
downloadFile = "web_icon.png"
navigationToolbar {
}.enterURLAndEnterToBrowser(downloadTestPage.toUri()) {
waitForPageToLoad()
}.clickDownloadLink(downloadFile) {
verifyDownloadPrompt(downloadFile)
}.clickDownload {
downloadRobot {
openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "web_icon.png")
verifyDownloadCompleteNotificationPopup()
}
browserScreen {
}.openThreeDotMenu {
}.openDownloadsManager {
verifyDownloadedFileName(downloadFile)
openDownloadedFile(downloadFile)
verifyDownloadedFileName("web_icon.png")
openDownloadedFile("web_icon.png")
verifyPhotosAppOpens()
mDevice.pressBack()
}
deleteDownloadedFileOnStorage(downloadFile)
}
// Save PDF file from the share overlay
@SmokeTest
@Test
fun saveAndOpenPdfTest() {
val genericURL =
TestAssetHelper.getGenericAsset(mockWebServer, 3)
downloadFile = "pdfForm.pdf"
navigationToolbar {
}.enterURLAndEnterToBrowser(genericURL.url) {
clickPageObject(itemWithText("PDF form file"))
}.openThreeDotMenu {
}.clickShareButton {
}.clickSaveAsPDF {
verifyDownloadPrompt(downloadFile)
}.clickDownload {
}.clickOpen("application/pdf") {
assertExternalAppOpens(GOOGLE_DOCS)
}
deleteDownloadedFileOnStorage(downloadFile)
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1114970
@Test
fun deleteDownloadedFileTest() {
downloadFile = "smallZip.zip"
navigationToolbar {
}.enterURLAndEnterToBrowser(downloadTestPage.toUri()) {
waitForPageToLoad()
}.clickDownloadLink(downloadFile) {
verifyDownloadPrompt(downloadFile)
}.clickDownload {
verifyDownloadedFileName(downloadFile)
downloadRobot {
openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "smallZip.zip")
}
browserScreen {
}.openThreeDotMenu {
}.openDownloadsManager {
verifyDownloadedFileName(downloadFile)
deleteDownloadedItem(downloadFile)
verifyDownloadedFileName("smallZip.zip")
deleteDownloadedItem("smallZip.zip")
clickSnackbarButton("UNDO")
verifyDownloadedFileName(downloadFile)
deleteDownloadedItem(downloadFile)
verifyDownloadedFileName("smallZip.zip")
deleteDownloadedItem("smallZip.zip")
verifyEmptyDownloadsList()
}
deleteDownloadedFileOnStorage(downloadFile)
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2302662
@ -264,14 +198,10 @@ class DownloadTest {
val firstDownloadedFile = "smallZip.zip"
val secondDownloadedFile = "textfile.txt"
navigationToolbar {
}.enterURLAndEnterToBrowser(downloadTestPage.toUri()) {
waitForPageToLoad()
}.clickDownloadLink(firstDownloadedFile) {
verifyDownloadPrompt(firstDownloadedFile)
}.clickDownload {
downloadRobot {
openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = firstDownloadedFile)
verifyDownloadedFileName(firstDownloadedFile)
}.closeCompletedDownloadPrompt {
}.closeDownloadPrompt {
}.clickDownloadLink(secondDownloadedFile) {
verifyDownloadPrompt(secondDownloadedFile)
}.clickDownload {
@ -295,29 +225,21 @@ class DownloadTest {
clickMultiSelectRemoveButton()
verifyEmptyDownloadsList()
}
deleteDownloadedFileOnStorage(firstDownloadedFile)
deleteDownloadedFileOnStorage(secondDownloadedFile)
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2301537
@Test
fun fileDeletedFromStorageIsDeletedEverywhereTest() {
val downloadFile = "smallZip.zip"
navigationToolbar {
}.enterURLAndEnterToBrowser(downloadTestPage.toUri()) {
waitForPageToLoad()
}.clickDownloadLink(downloadFile) {
verifyDownloadPrompt(downloadFile)
}.clickDownload {
downloadRobot {
openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "smallZip.zip")
verifyDownloadCompleteNotificationPopup()
}
browserScreen {
}.openThreeDotMenu {
}.openDownloadsManager {
waitForDownloadsListToExist()
verifyDownloadedFileName(downloadFile)
deleteDownloadedFileOnStorage(downloadFile)
verifyDownloadedFileName("smallZip.zip")
deleteDownloadedFileOnStorage("smallZip.zip")
}.exitDownloadsManagerToBrowser {
}.openThreeDotMenu {
}.openDownloadsManager {
@ -325,39 +247,24 @@ class DownloadTest {
exitMenu()
}
navigationToolbar {
}.enterURLAndEnterToBrowser(downloadTestPage.toUri()) {
waitForPageToLoad()
}.clickDownloadLink(downloadFile) {
verifyDownloadPrompt(downloadFile)
}.clickDownload {
downloadRobot {
openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "smallZip.zip")
verifyDownloadCompleteNotificationPopup()
}
browserScreen {
}.openThreeDotMenu {
}.openDownloadsManager {
waitForDownloadsListToExist()
verifyDownloadedFileName(downloadFile)
verifyDownloadedFileName("smallZip.zip")
}
deleteDownloadedFileOnStorage(downloadFile)
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/457112
@Ignore("Failing: https://bugzilla.mozilla.org/show_bug.cgi?id=1840994")
@Test
fun systemNotificationCantBeDismissedWhileInProgressTest() {
// Clear the "Firefox Fenix default browser notification"
notificationShade {
cancelAllShownNotifications()
}
downloadFile = "1GB.zip"
navigationToolbar {
}.enterURLAndEnterToBrowser(downloadTestPage.toUri()) {
waitForPageToLoad()
}.clickDownloadLink(downloadFile) {
verifyDownloadPrompt(downloadFile)
}.clickDownload {
downloadRobot {
openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "1GB.zip")
}
browserScreen {
}.openNotificationShade {
@ -368,31 +275,21 @@ class DownloadTest {
swipeDownloadNotification(direction = "Right", shouldDismissNotification = false)
clickDownloadNotificationControlButton("CANCEL")
}
deleteDownloadedFileOnStorage(downloadFile)
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2299297
@Test
fun notificationCanBeDismissedIfDownloadIsInterruptedTest() {
// Clear the "Firefox Fenix default browser notification"
notificationShade {
cancelAllShownNotifications()
downloadRobot {
openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "1GB.zip")
}
downloadFile = "1GB.zip"
navigationToolbar {
}.enterURLAndEnterToBrowser(downloadTestPage.toUri()) {
waitForPageToLoad()
}.clickDownloadLink(downloadFile) {
verifyDownloadPrompt(downloadFile)
}.clickDownload {}
setNetworkEnabled(enabled = false)
browserScreen {
}.openNotificationShade {
verifySystemNotificationExists("Download failed")
expandNotificationMessage()
verifySystemNotificationExists("Download failed")
swipeDownloadNotification("Left", true)
verifySystemNotificationDoesNotExist("Firefox Fenix")
}.closeNotificationTray {}
@ -401,26 +298,16 @@ class DownloadTest {
}.closeDownloadPrompt {
verifyDownloadPromptIsDismissed()
}
deleteDownloadedFileOnStorage(downloadFile)
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1632384
@Test
fun warningWhenClosingPrivateTabsWhileDownloadingTest() {
downloadFile = "1GB.zip"
// Clear the "Firefox Fenix default browser notification"
notificationShade {
cancelAllShownNotifications()
}
homeScreen {
}.togglePrivateBrowsingMode()
navigationToolbar {
}.enterURLAndEnterToBrowser(downloadTestPage.toUri()) {
waitForPageToLoad()
}.clickDownloadLink(downloadFile) {
verifyDownloadPrompt(downloadFile)
}.clickDownload {}
downloadRobot {
openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "1GB.zip")
}
browserScreen {
}.openTabDrawer {
closeTab()
@ -431,28 +318,16 @@ class DownloadTest {
}.openNotificationShade {
verifySystemNotificationExists("Firefox Fenix")
}
deleteDownloadedFileOnStorage(downloadFile)
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2302663
@Test
fun cancelActivePrivateBrowsingDownloadsTest() {
downloadFile = "1GB.zip"
// Clear the "Firefox Fenix default browser notification"
notificationShade {
cancelAllShownNotifications()
}
homeScreen {
}.togglePrivateBrowsingMode()
navigationToolbar {
}.enterURLAndEnterToBrowser(downloadTestPage.toUri()) {
waitForPageToLoad()
}.clickDownloadLink(downloadFile) {
verifyDownloadPrompt(downloadFile)
}.clickDownload {}
downloadRobot {
openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "1GB.zip")
}
browserScreen {
}.openTabDrawer {
closeTab()
@ -463,12 +338,13 @@ class DownloadTest {
}.openNotificationShade {
verifySystemNotificationDoesNotExist("Firefox Fenix")
}
deleteDownloadedFileOnStorage(downloadFile)
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2048448
// Save edited PDF file from the share overlay
@SmokeTest
@Test
fun saveEditedPdfTest() {
fun saveAsPdfFunctionalityTest() {
val genericURL =
TestAssetHelper.getGenericAsset(mockWebServer, 3)
downloadFile = "pdfForm.pdf"
@ -486,6 +362,29 @@ class DownloadTest {
}.clickOpen("application/pdf") {
assertExternalAppOpens(GOOGLE_DOCS)
}
deleteDownloadedFileOnStorage(downloadFile)
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/244125
@Test
fun restartDownloadFromAppNotificationAfterConnectionIsInterruptedTest() {
downloadFile = "1GB.zip"
navigationToolbar {
}.enterURLAndEnterToBrowser(downloadTestPage.toUri()) {
waitForPageToLoad()
}.clickDownloadLink(downloadFile) {
verifyDownloadPrompt(downloadFile)
setNetworkEnabled(false)
}.clickDownload {
verifyDownloadFailedPrompt(downloadFile)
setNetworkEnabled(true)
clickTryAgainButton()
}
browserScreen {
}.openNotificationShade {
verifySystemNotificationExists("Firefox Fenix")
expandNotificationMessage()
clickDownloadNotificationControlButton("CANCEL")
}
}
}

View File

@ -351,8 +351,6 @@ class EnhancedTrackingProtectionTest {
enhancedTrackingProtection {
}.openEnhancedTrackingProtectionSheet {
}.openDetails {
verifyCrossSiteCookiesBlocked(true)
navigateBackToDetails()
verifyCryptominersBlocked(true)
navigateBackToDetails()
verifyFingerprintersBlocked(true)

View File

@ -22,13 +22,13 @@ import org.mozilla.fenix.R
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.registerAndCleanupIdlingResources
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.MockBrowserDataHelper
import org.mozilla.fenix.helpers.RecyclerViewIdlingResource
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.exitMenu
import org.mozilla.fenix.helpers.TestHelper.longTapSelectItem
import org.mozilla.fenix.helpers.TestHelper.registerAndCleanupIdlingResources
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.historyMenu
import org.mozilla.fenix.ui.robots.homeScreen
@ -466,4 +466,18 @@ class HistoryTest {
verifyEmptyHistoryView()
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/243287
@Test
fun openHistoryItemTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
}.openThreeDotMenu {
}.openHistory {
}.openWebsite(defaultWebPage.url) {
verifyUrl(defaultWebPage.url.toString())
}
}
}

View File

@ -10,6 +10,7 @@ import androidx.test.uiautomator.UiDevice
import okhttp3.mockwebserver.MockWebServer
import org.junit.After
import org.junit.Before
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.customannotations.SmokeTest
@ -17,8 +18,10 @@ import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.HomeActivityTestRule
import org.mozilla.fenix.helpers.RetryTestRule
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.navigationToolbar
import org.mozilla.fenix.ui.robots.searchScreen
/**
* Tests for verifying the presence of home screen and first-run homescreen elements
@ -166,4 +169,39 @@ class HomeScreenTest {
verifyCustomizeHomepageButton(true)
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/414970
@Ignore("Failure, more details at: https://bugzilla.mozilla.org/show_bug.cgi?id=1830005")
@SmokeTest
@Test
fun addPrivateBrowsingShortcutFromHomeScreenCFRTest() {
homeScreen {
}.triggerPrivateBrowsingShortcutPrompt {
verifyNoThanksPrivateBrowsingShortcutButton(activityTestRule)
verifyAddPrivateBrowsingShortcutButton(activityTestRule)
clickAddPrivateBrowsingShortcutButton(activityTestRule)
clickAddAutomaticallyButton()
}.openHomeScreenShortcut("Private ${TestHelper.appName}") {}
searchScreen {
verifySearchView()
}.dismissSearchBar {
verifyCommonMythsLink()
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1569867
@Test
fun verifyJumpBackInContextualHintTest() {
activityTestRule.activityRule.applySettingsExceptions {
it.isJumpBackInCFREnabled = true
}
val genericPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
navigationToolbar {
}.enterURLAndEnterToBrowser(genericPage.url) {
}.goToHomescreen {
verifyJumpBackInMessage(activityTestRule)
}
}
}

View File

@ -16,12 +16,15 @@ import org.junit.Test
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.assertNativeAppOpens
import org.mozilla.fenix.helpers.AppAndSystemHelper.assertYoutubeAppOpens
import org.mozilla.fenix.helpers.AppAndSystemHelper.runWithCondition
import org.mozilla.fenix.helpers.Constants.PackageName.PRINT_SPOOLER
import org.mozilla.fenix.helpers.DataGenerationHelper.generateRandomString
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.MatcherHelper
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper
import org.mozilla.fenix.helpers.TestHelper.assertYoutubeAppOpens
import org.mozilla.fenix.helpers.TestHelper.runWithCondition
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.clickContextMenuItem
import org.mozilla.fenix.ui.robots.clickPageObject
@ -260,7 +263,7 @@ class MainMenuTest {
@Test
fun addPageShortcutToHomeScreenTest() {
val website = TestAssetHelper.getGenericAsset(mockWebServer, 1)
val shortcutTitle = TestHelper.generateRandomString(5)
val shortcutTitle = generateRandomString(5)
homeScreen {
}.openNavigationToolbar {
@ -351,4 +354,33 @@ class MainMenuTest {
verifyPageContent("REFRESHED")
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2282411
@Test
fun printWebPageFromMainMenuTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
mDevice.waitForIdle()
}.openThreeDotMenu {
}.clickPrintButton {
assertNativeAppOpens(PRINT_SPOOLER)
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2282408
@Test
fun printWebPageFromShareMenuTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
mDevice.waitForIdle()
}.openThreeDotMenu {
}.clickShareButton {
}.clickPrintButton {
assertNativeAppOpens(PRINT_SPOOLER)
}
}
}

View File

@ -0,0 +1,119 @@
package org.mozilla.fenix.ui
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.test.junit4.ComposeTestRule
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.performScrollToIndex
import androidx.compose.ui.unit.dp
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.compose.ext.onShown
private const val ON_SHOWN_ROOT_TAG = "onShownRoot"
private const val ON_SHOWN_SETTLE_TIME_MS = 1000
private const val ON_SHOWN_INDEX = 15
private const val ON_SHOWN_NODE_COUNT = 30
class ModifierTest {
@get:Rule
val composeTestRule = createComposeRule()
@Test
fun verifyModifierOnShownWhenScrolledToWithNoSettleTime() {
var onShown = false
composeTestRule.setContent {
ModifierOnShownContent(
settleTime = 0,
onVisible = {
onShown = true
},
)
}
composeTestRule.scrollToOnShownIndex()
assertTrue(onShown)
}
@Test
fun verifyModifierOnShownAfterSettled() {
var onShown = false
composeTestRule.setContent {
ModifierOnShownContent(
onVisible = {
onShown = true
},
)
}
composeTestRule.scrollToOnShownIndex()
assertFalse(onShown)
composeTestRule.waitUntil(ON_SHOWN_SETTLE_TIME_MS + 500L) { onShown }
assertTrue(onShown)
}
@Test
fun verifyModifierOnShownWhenNotVisible() {
val indexToValidate = ON_SHOWN_NODE_COUNT - 1
var onShown = false
composeTestRule.setContent {
ModifierOnShownContent(
indexToValidate = indexToValidate,
settleTime = 0,
onVisible = {
onShown = true
},
)
}
assertFalse(onShown)
}
private fun ComposeTestRule.scrollToOnShownIndex(index: Int = ON_SHOWN_INDEX) {
this.onNodeWithTag(ON_SHOWN_ROOT_TAG)
.performScrollToIndex(index)
}
@Composable
private fun ModifierOnShownContent(
indexToValidate: Int = ON_SHOWN_INDEX,
settleTime: Int = ON_SHOWN_SETTLE_TIME_MS,
onVisible: () -> Unit,
) {
LazyColumn(
modifier = Modifier.testTag(ON_SHOWN_ROOT_TAG),
) {
items(ON_SHOWN_NODE_COUNT) { index ->
val modifier = if (index == indexToValidate) {
Modifier.onShown(
threshold = 1.0f,
settleTime = settleTime,
onVisible = onVisible,
)
} else {
Modifier
}
Text(
text = "Test item $index",
modifier = modifier
.fillMaxWidth()
.height(50.dp),
)
}
}
}
}

View File

@ -14,9 +14,9 @@ import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.runWithSystemLocaleChanged
import org.mozilla.fenix.helpers.HomeActivityTestRule
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.runWithSystemLocaleChanged
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.navigationToolbar
import java.util.Locale

View File

@ -10,9 +10,9 @@ import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.R
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AppAndSystemHelper.setNetworkEnabled
import org.mozilla.fenix.helpers.HomeActivityTestRule
import org.mozilla.fenix.helpers.TestHelper.packageName
import org.mozilla.fenix.helpers.TestHelper.setNetworkEnabled
import org.mozilla.fenix.helpers.TestHelper.verifyUrl
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.homeScreen

View File

@ -0,0 +1,70 @@
package org.mozilla.fenix.ui
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AppAndSystemHelper.runWithLauncherIntent
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.ui.robots.homeScreen
class OnboardingTest {
@get:Rule
val activityTestRule =
AndroidComposeTestRule(
HomeActivityIntentTestRule.withDefaultSettingsOverrides(launchActivity = false),
) { it.activity }
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2122321
@Test
fun verifyFirstOnboardingCardItemsTest() {
runWithLauncherIntent(activityTestRule) {
homeScreen {
verifyFirstOnboardingCard(activityTestRule)
}
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2122334
@SmokeTest
@Test
fun verifyFirstOnboardingCardItemsFunctionalityTest() {
runWithLauncherIntent(activityTestRule) {
homeScreen {
clickNotNowOnboardingButton(activityTestRule)
verifySecondOnboardingCard(activityTestRule)
swipeSecondOnboardingCardToRight()
}.clickSetAsDefaultBrowserOnboardingButton(activityTestRule) {
verifyAndroidDefaultAppsMenuAppears()
}.goBackToOnboardingScreen {
verifySecondOnboardingCard(activityTestRule)
}
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2122343
@Test
fun verifySecondOnboardingCardItemsTest() {
runWithLauncherIntent(activityTestRule) {
homeScreen {
clickNotNowOnboardingButton(activityTestRule)
verifySecondOnboardingCard(activityTestRule)
}
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2122344
@SmokeTest
@Test
fun verifySecondOnboardingCardSignInFunctionalityTest() {
runWithLauncherIntent(activityTestRule) {
homeScreen {
clickNotNowOnboardingButton(activityTestRule)
verifySecondOnboardingCard(activityTestRule)
}.clickSignInOnboardingButton(activityTestRule) {
verifyTurnOnSyncMenu()
}
}
}
}

View File

@ -14,6 +14,8 @@ import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.assertExternalAppOpens
import org.mozilla.fenix.helpers.AppAndSystemHelper.clearDownloadsFolder
import org.mozilla.fenix.helpers.Constants.PackageName.GOOGLE_DOCS
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.MatcherHelper
@ -21,8 +23,6 @@ import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText
import org.mozilla.fenix.helpers.MatcherHelper.itemWithResIdAndText
import org.mozilla.fenix.helpers.MatcherHelper.itemWithText
import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset
import org.mozilla.fenix.helpers.TestHelper.assertExternalAppOpens
import org.mozilla.fenix.helpers.TestHelper.deleteDownloadedFileOnStorage
import org.mozilla.fenix.helpers.TestHelper.mDevice
import org.mozilla.fenix.ui.robots.clickPageObject
import org.mozilla.fenix.ui.robots.navigationToolbar
@ -50,6 +50,9 @@ class PDFViewerTest {
@After
fun tearDown() {
mockWebServer.shutdown()
// Check and clear the downloads folder
clearDownloadsFolder()
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2048140
@ -96,7 +99,6 @@ class PDFViewerTest {
}.clickOpen("application/pdf") {
assertExternalAppOpens(GOOGLE_DOCS)
}
deleteDownloadedFileOnStorage(downloadFile)
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2283305

View File

@ -15,10 +15,10 @@ import org.junit.Test
import org.mozilla.fenix.R
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.registerAndCleanupIdlingResources
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.RetryTestRule
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.registerAndCleanupIdlingResources
import org.mozilla.fenix.helpers.ViewVisibilityIdlingResource
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.navigationToolbar

View File

@ -15,12 +15,12 @@ import org.junit.Test
import org.mozilla.fenix.R
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.registerAndCleanupIdlingResources
import org.mozilla.fenix.helpers.HomeActivityTestRule
import org.mozilla.fenix.helpers.RecyclerViewIdlingResource
import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset
import org.mozilla.fenix.helpers.TestHelper.longTapSelectItem
import org.mozilla.fenix.helpers.TestHelper.mDevice
import org.mozilla.fenix.helpers.TestHelper.registerAndCleanupIdlingResources
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.navigationToolbar

View File

@ -21,6 +21,12 @@ import org.junit.Test
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.helpers.AppAndSystemHelper.assertNativeAppOpens
import org.mozilla.fenix.helpers.AppAndSystemHelper.denyPermission
import org.mozilla.fenix.helpers.AppAndSystemHelper.grantSystemPermission
import org.mozilla.fenix.helpers.AppAndSystemHelper.runWithCondition
import org.mozilla.fenix.helpers.AppAndSystemHelper.runWithSystemLocaleChanged
import org.mozilla.fenix.helpers.AppAndSystemHelper.verifyKeyboardVisibility
import org.mozilla.fenix.helpers.Constants.PackageName.ANDROID_SETTINGS
import org.mozilla.fenix.helpers.Constants.searchEngineCodes
import org.mozilla.fenix.helpers.HomeActivityTestRule
@ -32,17 +38,11 @@ import org.mozilla.fenix.helpers.MockBrowserDataHelper.createTabItem
import org.mozilla.fenix.helpers.MockBrowserDataHelper.setCustomSearchEngine
import org.mozilla.fenix.helpers.SearchDispatcher
import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset
import org.mozilla.fenix.helpers.TestHelper
import org.mozilla.fenix.helpers.TestHelper.appContext
import org.mozilla.fenix.helpers.TestHelper.assertNativeAppOpens
import org.mozilla.fenix.helpers.TestHelper.clickSnackbarButton
import org.mozilla.fenix.helpers.TestHelper.denyPermission
import org.mozilla.fenix.helpers.TestHelper.exitMenu
import org.mozilla.fenix.helpers.TestHelper.grantSystemPermission
import org.mozilla.fenix.helpers.TestHelper.longTapSelectItem
import org.mozilla.fenix.helpers.TestHelper.mDevice
import org.mozilla.fenix.helpers.TestHelper.runWithCondition
import org.mozilla.fenix.helpers.TestHelper.verifyKeyboardVisibility
import org.mozilla.fenix.ui.robots.clickContextMenuItem
import org.mozilla.fenix.ui.robots.clickPageObject
import org.mozilla.fenix.ui.robots.homeScreen
@ -77,7 +77,6 @@ class SearchTest {
isRecentTabsFeatureEnabled = false,
isTCPCFREnabled = false,
isWallpaperOnboardingEnabled = false,
isCookieBannerReductionDialogEnabled = false,
tabsTrayRewriteEnabled = false,
),
) { it.activity }
@ -792,7 +791,7 @@ class SearchTest {
fun verifySearchEnginesFunctionalityUsingRTLLocaleTest() {
val arabicLocale = Locale("ar", "AR")
TestHelper.runWithSystemLocaleChanged(arabicLocale, activityTestRule.activityRule) {
runWithSystemLocaleChanged(arabicLocale, activityTestRule.activityRule) {
homeScreen {
}.openSearch {
verifyTranslatedFocusedNavigationToolbar("ابحث أو أدخِل عنوانا")

View File

@ -13,16 +13,15 @@ import org.mozilla.fenix.R
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.registerAndCleanupIdlingResources
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.RecyclerViewIdlingResource
import org.mozilla.fenix.helpers.TestAssetHelper.getEnhancedTrackingProtectionAsset
import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset
import org.mozilla.fenix.helpers.TestHelper.registerAndCleanupIdlingResources
import org.mozilla.fenix.helpers.TestHelper
import org.mozilla.fenix.helpers.TestHelper.verifySnackBarText
import org.mozilla.fenix.helpers.TestHelper.waitUntilSnackbarGone
import org.mozilla.fenix.ui.robots.addonsMenu
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.navigationToolbar
/**
* Tests for verifying the functionality of installing or removing addons
@ -101,8 +100,7 @@ class SettingsAddonsTest {
val addonName = "uBlock Origin"
addonsMenu {
installAddon(addonName)
verifyAddonInstallCompleted(addonName, activityTestRule)
installAddon(addonName, activityTestRule)
closeAddonInstallCompletePrompt()
}.openDetailedMenuForAddon(addonName) {
}.removeAddon(activityTestRule) {
@ -115,25 +113,34 @@ class SettingsAddonsTest {
}
}
// TODO: Harden to dynamically install addons from position
// in list of detected addons on screen instead of hard-coded values.
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/561600
// Installs uBlock add-on and checks that the app doesn't crash while loading pages with trackers
// Installs 2 add-on and checks that the app doesn't crash while navigating the app
@SmokeTest
@Test
fun noCrashWithAddonInstalledTest() {
// setting ETP to Strict mode to test it works with add-ons
activityTestRule.activity.settings().setStrictETP()
val addonName = "uBlock Origin"
val uBlockAddon = "uBlock Origin"
val darkReaderAddon = "Dark Reader"
val trackingProtectionPage = getEnhancedTrackingProtectionAsset(mockWebServer)
addonsMenu {
installAddon(addonName)
verifyAddonInstallCompleted(addonName, activityTestRule)
installAddon(uBlockAddon, activityTestRule)
closeAddonInstallCompletePrompt()
installAddon(darkReaderAddon, activityTestRule)
closeAddonInstallCompletePrompt()
}.goBack {
}.openNavigationToolbar {
}.enterURLAndEnterToBrowser(trackingProtectionPage.url) {
verifyUrl(trackingProtectionPage.url.toString())
}.goToHomescreen {
}.openTopSiteTabWithTitle("Top Articles") {
}.openThreeDotMenu {
}.openSettings {
verifySettingsView()
}
}
@ -141,22 +148,38 @@ class SettingsAddonsTest {
@SmokeTest
@Test
fun verifyUBlockWorksInPrivateModeTest() {
TestHelper.appContext.settings().shouldShowCookieBannersCFR = false
val addonName = "uBlock Origin"
val genericPage = getGenericAsset(mockWebServer, 1)
addonsMenu {
installAddon(addonName)
verifyAddonInstallCompleted(addonName, activityTestRule)
installAddon(addonName, activityTestRule)
selectAllowInPrivateBrowsing()
closeAddonInstallCompletePrompt()
}.goBack {
}.togglePrivateBrowsingMode()
navigationToolbar {
}.enterURLAndEnterToBrowser(genericPage.url) {
verifyPageContent(genericPage.content)
}.openContextMenuOnSponsoredShortcut("Top Articles") {
}.openTopSiteInPrivateTab {
waitForPageToLoad()
}.openThreeDotMenu {
openAddonsSubList()
verifyAddonAvailableInMainMenu(addonName)
verifyTrackersBlockedByUblock()
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/875785
@Test
fun verifyUBlockWorksInNormalModeTest() {
val addonName = "uBlock Origin"
addonsMenu {
installAddon(addonName, activityTestRule)
closeAddonInstallCompletePrompt()
}.goBack {
}.openTopSiteTabWithTitle("Top Articles") {
waitForPageToLoad()
}.openThreeDotMenu {
openAddonsSubList()
verifyTrackersBlockedByUblock()
}
}
}

View File

@ -13,12 +13,14 @@ import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.assertYoutubeAppOpens
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText
import org.mozilla.fenix.helpers.MatcherHelper.itemWithResIdAndText
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.assertYoutubeAppOpens
import org.mozilla.fenix.helpers.TestHelper
import org.mozilla.fenix.helpers.TestHelper.exitMenu
import org.mozilla.fenix.ui.robots.clickPageObject
import org.mozilla.fenix.ui.robots.homeScreen
@ -201,6 +203,7 @@ class SettingsAdvancedTest {
// Assumes Youtube is installed and enabled
@Test
fun privateBrowsingAskBeforeOpeningLinkInAppCancelTest() {
TestHelper.appContext.settings().shouldShowCookieBannersCFR = false
val externalLinksPage = TestAssetHelper.getExternalLinksAsset(mockWebServer)
homeScreen {

View File

@ -16,17 +16,18 @@ import org.junit.Test
import org.mozilla.fenix.R
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper
import org.mozilla.fenix.helpers.AppAndSystemHelper.setNetworkEnabled
import org.mozilla.fenix.helpers.DataGenerationHelper.getStringResource
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.MatcherHelper
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestAssetHelper.getStorageTestAsset
import org.mozilla.fenix.helpers.TestHelper
import org.mozilla.fenix.helpers.TestHelper.deleteDownloadedFileOnStorage
import org.mozilla.fenix.helpers.TestHelper.exitMenu
import org.mozilla.fenix.helpers.TestHelper.mDevice
import org.mozilla.fenix.helpers.TestHelper.restartApp
import org.mozilla.fenix.helpers.TestHelper.setNetworkEnabled
import org.mozilla.fenix.ui.robots.clickPageObject
import org.mozilla.fenix.ui.robots.downloadRobot
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.navigationToolbar
@ -58,6 +59,9 @@ class SettingsDeleteBrowsingDataOnQuitTest {
@After
fun tearDown() {
mockWebServer.shutdown()
// Check and clear the downloads folder
AppAndSystemHelper.clearDownloadsFolder()
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/416048
@ -191,13 +195,10 @@ class SettingsDeleteBrowsingDataOnQuitTest {
clickDeleteBrowsingOnQuitButtonSwitch()
exitMenu()
}
navigationToolbar {
}.enterURLAndEnterToBrowser(downloadTestPage.toUri()) {
}.clickDownloadLink("smallZip.zip") {
verifyDownloadPrompt("smallZip.zip")
}.clickDownload {
downloadRobot {
openPageAndDownloadFile(url = downloadTestPage.toUri(), downloadFile = "smallZip.zip")
verifyDownloadCompleteNotificationPopup()
}.closeCompletedDownloadPrompt {
}.closeDownloadPrompt {
}.goToHomescreen {
}.openThreeDotMenu {
clickQuit()
@ -209,7 +210,6 @@ class SettingsDeleteBrowsingDataOnQuitTest {
}.openDownloadsManager {
verifyEmptyDownloadsList()
}
deleteDownloadedFileOnStorage("smallZip.zip")
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/416053
@ -251,7 +251,7 @@ class SettingsDeleteBrowsingDataOnQuitTest {
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/416052
@Test
fun deleteCachedFilesOnQuitTest() {
val pocketTopArticles = TestHelper.getStringResource(R.string.pocket_pinned_top_articles)
val pocketTopArticles = getStringResource(R.string.pocket_pinned_top_articles)
homeScreen {
}.openThreeDotMenu {

View File

@ -13,15 +13,15 @@ import org.junit.Test
import org.mozilla.fenix.R
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.setNetworkEnabled
import org.mozilla.fenix.helpers.DataGenerationHelper.getStringResource
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.MatcherHelper.itemWithResId
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestAssetHelper.getStorageTestAsset
import org.mozilla.fenix.helpers.TestHelper.exitMenu
import org.mozilla.fenix.helpers.TestHelper.getStringResource
import org.mozilla.fenix.helpers.TestHelper.mDevice
import org.mozilla.fenix.helpers.TestHelper.restartApp
import org.mozilla.fenix.helpers.TestHelper.setNetworkEnabled
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.clickPageObject
import org.mozilla.fenix.ui.robots.homeScreen

View File

@ -1,100 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.ui
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
import okhttp3.mockwebserver.MockWebServer
import org.junit.After
import org.junit.Before
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.HomeActivityTestRule
import org.mozilla.fenix.ui.robots.homeScreen
/**
* Tests for verifying the main three dot menu options
*
*/
class SettingsDeveloperToolsTest {
private lateinit var mDevice: UiDevice
private lateinit var mockWebServer: MockWebServer
@get:Rule
val activityTestRule = HomeActivityTestRule()
@Before
fun setUp() {
mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
mockWebServer = MockWebServer().apply {
dispatcher = AndroidAssetDispatcher()
start()
}
}
@After
fun tearDown() {
mockWebServer.shutdown()
}
// Walks through settings developer tools menu and sub-menus to ensure all items are present
@Test
fun settingsDeveloperToolsItemsTest() {
homeScreen {
}.openThreeDotMenu {
}.openSettings {
verifyRemoteDebuggingButton()
}
}
// DEVELOPER TOOLS
@Ignore("This is a stub test, ignore for now")
@Test
fun turnOnRemoteDebuggingViaUsb() {
// Open terminal
// Verify USB debugging is off
// Open 3dot (main) menu
// Select settings
// Toggle Remote debugging via USB to 'on'
// Open terminal
// Verify USB debugging is on
}
// ABOUT
@Ignore("This is a stub test, ignore for now")
@Test
fun verifyHelpRedirect() {
// Open 3dot (main) menu
// Select settings
// Click on "Help"
// Verify redirect to: https://support.mozilla.org/
}
@Ignore("This is a stub test, ignore for now")
@Test
fun verifyRateOnGooglePlayRedirect() {
// Open 3dot (main) menu
// Select settings
// Click on "Rate on Google Play"
// Verify Android "Open with Google Play Store" sub menu
}
@Ignore("This is a stub test, ignore for now")
@Test
fun verifyAboutFirefoxPreview() {
// Open 3dot (main) menu
// Select settings
// Click on "Verify About Firefox Preview"
// Verify about page contains....
// Build #
// Version #
// "Firefox Preview is produced by Mozilla"
// Day, Date, timestamp
// "Open source libraries we use"
}
}

View File

@ -14,14 +14,14 @@ import org.mozilla.fenix.FenixApplication
import org.mozilla.fenix.R
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.registerAndCleanupIdlingResources
import org.mozilla.fenix.helpers.AppAndSystemHelper.runWithSystemLocaleChanged
import org.mozilla.fenix.helpers.DataGenerationHelper.getStringResource
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.RecyclerViewIdlingResource
import org.mozilla.fenix.helpers.TestAssetHelper.getLoremIpsumAsset
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeLong
import org.mozilla.fenix.helpers.TestHelper.getStringResource
import org.mozilla.fenix.helpers.TestHelper.mDevice
import org.mozilla.fenix.helpers.TestHelper.registerAndCleanupIdlingResources
import org.mozilla.fenix.helpers.TestHelper.runWithSystemLocaleChanged
import org.mozilla.fenix.ui.robots.checkTextSizeOnWebsite
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.util.FRENCH_LANGUAGE_HEADER

View File

@ -12,11 +12,11 @@ import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.AppAndSystemHelper.openAppFromExternalLink
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.RetryTestRule
import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset
import org.mozilla.fenix.helpers.TestHelper.mDevice
import org.mozilla.fenix.helpers.TestHelper.openAppFromExternalLink
import org.mozilla.fenix.helpers.TestHelper.restartApp
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.homeScreen
@ -103,12 +103,12 @@ class SettingsHomepageTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(genericURL.url) {
}.goToHomescreen {
verifyRecentlyVisitedSectionIsDisplayed()
verifyRecentlyVisitedSectionIsDisplayed(true)
}.openThreeDotMenu {
}.openCustomizeHome {
clickRecentlyVisited()
}.goBackToHomeScreen {
verifyRecentlyVisitedSectionIsNotDisplayed()
verifyRecentlyVisitedSectionIsDisplayed(false)
}
}
@ -141,12 +141,12 @@ class SettingsHomepageTest {
}.openThreeDotMenu {
}.bookmarkPage {
}.goToHomescreen {
verifyRecentBookmarksSectionIsDisplayed()
verifyRecentBookmarksSectionIsDisplayed(exists = true)
}.openThreeDotMenu {
}.openCustomizeHome {
clickRecentBookmarksButton()
}.goBackToHomeScreen {
verifyRecentBookmarksSectionIsNotDisplayed()
verifyRecentBookmarksSectionIsDisplayed(exists = false)
}
}

Some files were not shown because too many files have changed in this diff Show More