├── .github └── ISSUE_TEMPLATE │ ├── bug.yml │ ├── config.yml │ ├── enhancement.yml │ └── other.yml ├── .gitignore ├── .gitlab-ci.yml ├── .gitlab └── issue_templates │ ├── default.md │ ├── enhancement.md │ └── other.md ├── Dockerfile ├── LICENSE ├── README.md ├── assets ├── accrescent.png ├── f-droid.png ├── f-droid_qr.png ├── ironfox.png └── obtainium.png ├── patches ├── a-c-overlay │ └── components │ │ └── feature │ │ └── search │ │ └── src │ │ └── main │ │ └── assets │ │ ├── search │ │ └── list.json │ │ └── searchplugins │ │ ├── ddghtml.xml │ │ ├── ddglite.xml │ │ ├── leta-brave.xml │ │ ├── leta-google.xml │ │ ├── mojeek.xml │ │ ├── no-search.xml │ │ └── startpage.xml ├── allow-build-date-override.patch ├── block-autoplay-by-default.patch ├── block-cookie-banners.patch ├── branding.patch ├── certificate-pinning.patch ├── configure-doh.patch ├── disable-accessibility-services-by-default.patch ├── disable-autocomplete.patch ├── disable-autofill.patch ├── disable-cfrs.patch ├── disable-csp-reporting.patch ├── disable-default-browser-engagement-prompts.patch ├── disable-doh-canary.patch ├── disable-firefox-suggest.patch ├── disable-geoip.patch ├── disable-hls.patch ├── disable-link-sharing.patch ├── disable-microsurveys.patch ├── disable-nimbus.patch ├── disable-pocket.patch ├── disable-search-suggestions.patch ├── disable-shipped-domains.patch ├── disable-sync-by-default.patch ├── disable-telemetry.patch ├── domain-highlighting-and-alignment.patch ├── enable-light-mode-by-default.patch ├── enable-secret-settings.patch ├── expose-aboutconfig.patch ├── fenix-liberate.patch ├── fenix-overlay │ ├── branding │ │ ├── ic_launcher-web.webp │ │ ├── ic_launcher_private-web.webp │ │ └── res │ │ │ ├── drawable-hdpi │ │ │ ├── fenix_search_widget.webp │ │ │ ├── ic_logo_wordmark_normal.webp │ │ │ ├── ic_logo_wordmark_private.webp │ │ │ ├── ic_wordmark_logo.webp │ │ │ ├── ic_wordmark_text_normal.webp │ │ │ └── ic_wordmark_text_private.webp │ │ │ ├── drawable-mdpi │ │ │ ├── ic_logo_wordmark_normal.webp │ │ │ ├── ic_logo_wordmark_private.webp │ │ │ ├── ic_wordmark_logo.webp │ │ │ ├── ic_wordmark_text_normal.webp │ │ │ └── ic_wordmark_text_private.webp │ │ │ ├── drawable-xhdpi │ │ │ ├── ic_logo_wordmark_normal.webp │ │ │ ├── ic_logo_wordmark_private.webp │ │ │ ├── ic_wordmark_logo.webp │ │ │ ├── ic_wordmark_text_normal.webp │ │ │ └── ic_wordmark_text_private.webp │ │ │ ├── drawable-xxhdpi │ │ │ ├── ic_logo_wordmark_normal.webp │ │ │ ├── ic_logo_wordmark_private.webp │ │ │ ├── ic_wordmark_logo.webp │ │ │ ├── ic_wordmark_text_normal.webp │ │ │ └── ic_wordmark_text_private.webp │ │ │ ├── drawable-xxxhdpi │ │ │ ├── ic_logo_wordmark_normal.webp │ │ │ ├── ic_logo_wordmark_private.webp │ │ │ ├── ic_wordmark_logo.webp │ │ │ ├── ic_wordmark_text_normal.webp │ │ │ └── ic_wordmark_text_private.webp │ │ │ ├── drawable │ │ │ ├── ic_launcher_foreground.xml │ │ │ ├── ic_launcher_monochrome.xml │ │ │ └── ic_launcher_private_foreground.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ ├── ic_launcher_private.xml │ │ │ ├── ic_launcher_private_round.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.webp │ │ │ ├── ic_launcher_private.webp │ │ │ ├── ic_launcher_private_round.webp │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.webp │ │ │ ├── ic_launcher_private.webp │ │ │ ├── ic_launcher_private_round.webp │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.webp │ │ │ ├── ic_launcher_private.webp │ │ │ ├── ic_launcher_private_round.webp │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.webp │ │ │ ├── ic_launcher_private.webp │ │ │ ├── ic_launcher_private_round.webp │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.webp │ │ │ ├── ic_launcher_private.webp │ │ │ ├── ic_launcher_private_round.webp │ │ │ └── ic_launcher_round.webp │ │ │ └── values │ │ │ ├── ic_launcher_background.xml │ │ │ └── ic_launcher_private_background.xml │ └── initial_experiments │ │ └── initial_experiments.json ├── force-enable-zoom.patch ├── gecko-fix-125-compile.patch ├── gecko-liberate.patch ├── gecko-localize_maven.patch ├── gecko-overlay │ ├── branding │ │ └── ironfox │ │ │ ├── configure.sh │ │ │ ├── content │ │ │ ├── favicon32.png │ │ │ ├── favicon64.png │ │ │ ├── jar.mn │ │ │ └── moz.build │ │ │ ├── locales │ │ │ ├── en-US │ │ │ │ ├── brand.ftl │ │ │ │ └── brand.properties │ │ │ ├── jar.mn │ │ │ └── moz.build │ │ │ └── moz.build │ ├── rfptargets │ │ └── RFPTargetsDefault.inc │ └── rs-dumps │ │ └── main │ │ └── ironfox-fingerprinting-protection-overrides.json ├── global-privacy-control.patch ├── harden-pdfjs.patch ├── https_only.patch ├── include-fonts.patch ├── install-ublock.patch ├── ironfox-content-settings.patch ├── ironfox-fingerprinting-protection-overrides.patch ├── ironfox-static-strings.patch ├── js-settings.patch ├── librewolf-rs-blocker.patch ├── locales ├── preferences │ ├── ironfox.js │ ├── pdf.js │ ├── phoenix-extended.js │ └── phoenix.js ├── prevent-extensions-from-changing-browser-settings.patch ├── remote-debugging.patch ├── remove-autoconfig-dependency.patch ├── remove-default-sites.patch ├── remove-webcompat-reporter.patch ├── restrict-mozaddonmanager.patch ├── rs-dumps.patch ├── safe-browsing.patch ├── sanitize-on-exit.patch ├── search-engines.patch ├── strict_etp.patch ├── tor-spoof-english.patch └── ublock-assets.patch ├── pyrightconfig.json ├── scripts ├── build.sh ├── ci-build.sh ├── ci-publish-packages.sh ├── ci-update-fdroid.sh ├── ci-update-site.sh ├── env_common.sh ├── env_fdroid.sh ├── gen_wordmark.sh ├── get_latest_version.py ├── get_sources.sh ├── localize_maven.py ├── patches.sh ├── patches.yaml ├── prebuild.sh ├── setup-android-sdk.sh └── versions.sh └── uBlock ├── assets.dev.json └── assets.main.json /.github/ISSUE_TEMPLATE/bug.yml: -------------------------------------------------------------------------------- 1 | name: Bug 2 | description: For any general issues or unexpected/unintended behavior you come across while using IronFox. 3 | title: "[BUG] PLEASE REPLACE THIS TEXT WITH A SUMMARY OF YOUR ISSUE..." 4 | labels: ["bug"] 5 | body: 6 | - type: textarea 7 | id: version 8 | attributes: 9 | label: What version of IronFox are you using? 10 | description: | 11 | An easy way to tell is by navigating to `Settings` -> `About` -> `About IronFox`. 12 | validations: 13 | required: true 14 | 15 | - type: textarea 16 | id: android 17 | attributes: 18 | label: What version of Android are you using with IronFox? 19 | description: | 20 | Steps will vary depending on your OEM, but on AOSP, this can be typically be found by navigating to your `Settings` app -> `About (`phone` or `tablet`, depending on your device)` -> `Device details` -> `Android version`. 21 | validations: 22 | required: true 23 | 24 | - type: textarea 25 | id: reason 26 | attributes: 27 | label: Please explain the issue you are experiencing. 28 | description: | 29 | Be sure to include as many relevant details as possible! :) 30 | validations: 31 | required: true 32 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Web Compat (Codeberg) 4 | url: https://codeberg.org/celenity/Phoenix/issues/new?template=.github%2fISSUE_TEMPLATE%2fweb-compat.yml 5 | about: Please report issues with breakage or unexpected/unintended behavior on specific websites here. 6 | - name: Web Compat (GitLab) 7 | url: https://gitlab.com/celenityy/Phoenix/-/issues/new?issuable_template=web-compat# 8 | about: Please report issues with breakage or unexpected/unintended behavior on specific websites here. 9 | - name: Web Compat (GitHub) 10 | url: https://github.com/celenityy/Phoenix/issues 11 | about: Please report issues with breakage or unexpected/unintended behavior on specific websites here. 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/enhancement.yml: -------------------------------------------------------------------------------- 1 | name: Enhancement 2 | description: Have any new features you want to see or any ideas to make IronFox better? Here's your place ;) 3 | title: "[ENHANCEMENT] PLEASE REPLACE THIS TEXT WITH A SUMMARY OF YOUR SUGGESTION..." 4 | labels: ["enhancement"] 5 | body: 6 | - type: textarea 7 | id: reason 8 | attributes: 9 | label: Please explain your proposal with as many details as necessary (Ex. what you're suggesting, why you're suggesting it, what need you thinks it will fill, who it will benefit, etc...). 10 | validations: 11 | required: true 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/other.yml: -------------------------------------------------------------------------------- 1 | name: Other 2 | description: Anything else not already covered by other categories. 3 | title: "[OTHER] PLEASE REPLACE THIS TEXT WITH A SUMMARY OF YOUR ISSUE..." 4 | labels: ["other"] 5 | body: 6 | - type: textarea 7 | id: reason 8 | attributes: 9 | label: Please explain your inquiry. 10 | validations: 11 | required: true 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ 2 | 3 | /env 4 | /build 5 | /gecko 6 | /glean 7 | /appservices 8 | /gmscore 9 | /wasi-sdk 10 | /scripts/env_local.sh 11 | .DS_Store 12 | -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | .build_setup_steps: &build_setup_steps 2 | before_script: 3 | - mkdir -p "$GRADLE_USER_HOME" 4 | - mkdir -p "$CARGO_HOME" 5 | - mkdir -p /opt/IronFox 6 | - echo "$SB_GAPI_KEY" > "$SB_GAPI_KEY_FILE" 7 | - | 8 | curl \ 9 | --request GET \ 10 | --header "JOB-TOKEN: $CI_JOB_TOKEN" \ 11 | "${CI_API_V4_URL}/projects/$CI_PROJECT_ID/secure_files/$KEYSTORE_SECFILEID/download" \ 12 | --output "$KEYSTORE" 13 | 14 | .build_cache: &build_cache 15 | - key: cache-cargo-$CI_COMMIT_REF_SLUG 16 | policy: pull-push 17 | paths: 18 | # Cargo cache 19 | # See: https://doc.rust-lang.org/cargo/guide/cargo-home.html#caching-the-cargo-home-in-ci 20 | - .cache/cargo/.crates.toml 21 | - .cache/cargo/.crates2.json 22 | - .cache/cargo/bin/ 23 | - .cache/cargo/registry/index/ 24 | - .cache/cargo/registry/cache/ 25 | - .cache/cargo/git/db/ 26 | - key: cache-gradle-$CI_COMMIT_REF_SLUG 27 | policy: pull-push 28 | paths: 29 | - .cache/gradle/caches 30 | - .cache/gradle/wrapper 31 | 32 | default: 33 | cache: [] 34 | 35 | variables: &build_variables 36 | PRODUCTION_BRANCH: main 37 | SB_GAPI_KEY_FILE: /opt/IronFox/sb-gapi.data 38 | KEYSTORE: /opt/IronFox/signing-key.jks 39 | GRADLE_USER_HOME: "$CI_PROJECT_DIR/.cache/gradle" 40 | CARGO_HOME: "$CI_PROJECT_DIR/.cache/cargo" 41 | BUNDLETOOL: 1.18.0 42 | 43 | stages: 44 | - build_fdroid 45 | - build_site 46 | - build_docker 47 | - build_ironfox 48 | - release 49 | 50 | update-fdroid-repo: 51 | image: fedora:42 52 | stage: build_fdroid 53 | rules: 54 | - if: $CI_COMMIT_TAG 55 | variables: 56 | TARGET_REPO_PATH: ironfox-oss/fdroid 57 | TARGET_REPO_BRANCH: dev 58 | META_FILE: "./fdroid/metadata/org.ironfoxoss.ironfox.yml" 59 | REPO_DIR: "./fdroid/repo" 60 | <<: *build_variables 61 | before_script: 62 | - sudo dnf install -y bash curl git jq make python3 python3-pip 63 | - pip install androguard 64 | - git config --global user.email "ci@ironfoxoss.org" 65 | - git config --global user.name "IronFox CI" 66 | script: 67 | - bash -x scripts/ci-update-fdroid.sh 68 | 69 | update-site-repo: 70 | image: fedora:42 71 | stage: build_site 72 | rules: 73 | - if: $CI_COMMIT_TAG 74 | - if: $CI_COMMIT_BRANCH == "dev" 75 | changes: 76 | - scripts/patches.yaml 77 | - scripts/ci-update-site.sh 78 | variables: 79 | TARGET_REPO_PATH: ironfox-oss/ironfoxoss.org 80 | TARGET_REPO_BRANCH: dev 81 | <<: *build_variables 82 | before_script: 83 | - sudo dnf install -y bash curl git make python3 python3-pip yq 84 | - pip install pyyaml 85 | - git config --global user.email "ci@ironfoxoss.org" 86 | - git config --global user.name "IronFox CI" 87 | script: 88 | - bash -x scripts/ci-update-site.sh 89 | 90 | build-docker: 91 | image: docker:cli 92 | stage: build_docker 93 | services: 94 | - docker:dind 95 | variables: 96 | DOCKER_IMAGE_NAME: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG 97 | before_script: 98 | - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY 99 | script: 100 | - docker build --pull -t "$DOCKER_IMAGE_NAME" . 101 | - docker push "$DOCKER_IMAGE_NAME" 102 | - | 103 | if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then 104 | docker tag "$DOCKER_IMAGE_NAME" "$CI_REGISTRY_IMAGE:latest" 105 | docker push "$CI_REGISTRY_IMAGE:latest" 106 | fi 107 | rules: 108 | - if: $CI_COMMIT_BRANCH 109 | exists: 110 | - Dockerfile 111 | changes: 112 | - Dockerfile 113 | - .gitlab-ci.yml 114 | - scripts/setup-android-sdk.sh 115 | - if: $CI_COMMIT_BRANCH == $PRODUCTION_BRANCH 116 | 117 | build-apk: 118 | image: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG 119 | stage: build_ironfox 120 | timeout: 2h 121 | needs: 122 | - job: "build-docker" 123 | optional: true 124 | tags: 125 | - saas-linux-xlarge-amd64 126 | parallel: 127 | matrix: 128 | - BUILD_VARIANT: ["arm", "arm64", "x86_64"] 129 | variables: 130 | <<: *build_variables 131 | <<: *build_setup_steps 132 | script: 133 | - bash -x scripts/ci-build.sh 134 | artifacts: 135 | untracked: false 136 | when: on_success 137 | access: all 138 | expire_in: "30 days" 139 | paths: 140 | - $CI_PROJECT_DIR/artifacts/apk/**/* 141 | - $CI_PROJECT_DIR/artifacts/aar/**/* 142 | rules: 143 | - changes: 144 | - patches/**/* 145 | - scripts/**/* 146 | - Dockerfile 147 | - .gitlab-ci.yml 148 | - if: $CI_COMMIT_TAG 149 | when: never 150 | 151 | build-bundle: 152 | image: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG 153 | stage: build_ironfox 154 | timeout: 2h 155 | needs: 156 | - job: "build-docker" 157 | optional: true 158 | - job: "build-apk" 159 | artifacts: true 160 | optional: false 161 | tags: 162 | - saas-linux-xlarge-amd64 163 | variables: 164 | BUILD_VARIANT: "bundle" 165 | <<: *build_variables 166 | <<: *build_setup_steps 167 | script: 168 | - bash -x scripts/ci-build.sh 169 | artifacts: 170 | untracked: false 171 | when: on_success 172 | access: all 173 | expire_in: "30 days" 174 | paths: 175 | - $CI_PROJECT_DIR/artifacts/apks/**/* 176 | rules: 177 | - changes: 178 | - patches/**/* 179 | - scripts/**/* 180 | - Dockerfile 181 | - .gitlab-ci.yml 182 | - if: $CI_COMMIT_TAG 183 | when: never 184 | 185 | prepare-release: 186 | image: alpine:latest 187 | stage: release 188 | interruptible: true 189 | needs: 190 | - job: "build-docker" 191 | optional: true 192 | - job: "build-apk" 193 | artifacts: true 194 | optional: true 195 | - job: "build-bundle" 196 | artifacts: true 197 | optional: true 198 | rules: 199 | - if: $CI_COMMIT_TAG 200 | when: never 201 | - if: $CI_COMMIT_BRANCH == $PRODUCTION_BRANCH 202 | variables: 203 | <<: *build_variables 204 | before_script: 205 | - apk add --update --no-cache bash curl jq 206 | script: 207 | - bash -x scripts/ci-publish-packages.sh 208 | artifacts: 209 | untracked: false 210 | when: on_success 211 | access: all 212 | expire_in: "30 days" 213 | paths: 214 | - build/release.yml 215 | 216 | publish-release: 217 | image: registry.gitlab.com/gitlab-org/release-cli:latest 218 | stage: release 219 | interruptible: true 220 | needs: 221 | - job: "prepare-release" 222 | artifacts: true 223 | optional: false 224 | rules: 225 | - if: $CI_COMMIT_TAG 226 | when: never 227 | - if: $CI_COMMIT_BRANCH == $PRODUCTION_BRANCH 228 | variables: 229 | <<: *build_variables 230 | script: 231 | - | 232 | release-cli \ 233 | --server-url "$CI_SERVER_URL" \ 234 | --project-id "$CI_PROJECT_ID" \ 235 | --private-token "$GITLAB_CI_API_TOKEN" \ 236 | create-from-file \ 237 | --file build/release.yml 238 | -------------------------------------------------------------------------------- /.gitlab/issue_templates/default.md: -------------------------------------------------------------------------------- 1 | # BUG 2 | 3 | 19 | 20 | ### Confirmation 21 | 23 | 24 | 26 | 27 | ### Version 28 | 32 | 33 | ### Android 34 | 38 | 39 | ### Reason 40 | 44 | -------------------------------------------------------------------------------- /.gitlab/issue_templates/enhancement.md: -------------------------------------------------------------------------------- 1 | # ENHANCEMENT 2 | 3 | 9 | 10 | ___ 11 | 12 | 14 | -------------------------------------------------------------------------------- /.gitlab/issue_templates/other.md: -------------------------------------------------------------------------------- 1 | # OTHER 2 | 3 | 9 | 10 | ___ 11 | 12 | 14 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM fedora:42 2 | 3 | # Add & enable Adoptium Repository 4 | RUN dnf install -y adoptium-temurin-java-repository && \ 5 | dnf config-manager setopt adoptium-temurin-java-repository.enabled=1 6 | 7 | # Install required packages 8 | RUN dnf install -y \ 9 | cmake \ 10 | clang \ 11 | gawk \ 12 | git \ 13 | gyp \ 14 | temurin-17-jdk \ 15 | m4 \ 16 | make \ 17 | nasm \ 18 | ninja-build \ 19 | patch \ 20 | perl \ 21 | python3.9 \ 22 | shasum \ 23 | wget \ 24 | xz \ 25 | yq \ 26 | zlib-devel 27 | 28 | ENV ENVDOCKER=/opt/env_docker.sh 29 | ENV ANDROID_HOME=/root/android-sdk 30 | ENV JAVA_HOME=/usr/lib/jvm/temurin-17-jdk 31 | 32 | RUN echo "#!/bin/bash" >> $ENVDOCKER && \ 33 | echo 'source /root/env/bin/activate' >> $ENVDOCKER 34 | 35 | # Set up Android SDK 36 | COPY scripts/setup-android-sdk.sh /tmp/setup-android-sdk.sh 37 | RUN bash -x /tmp/setup-android-sdk.sh && \ 38 | echo "export ANDROID_HOME=$ANDROID_HOME" >> $ENVDOCKER && \ 39 | echo "export ANDROID_SDK_ROOT=\$ANDROID_HOME" >> $ENVDOCKER 40 | 41 | # Set up gradle from F-Droid 42 | RUN mkdir -p /root/bin 43 | ADD https://gitlab.com/fdroid/fdroidserver/-/raw/master/gradlew-fdroid /root/bin/gradle 44 | RUN chmod +x "/root/bin/gradle" && \ 45 | echo "export PATH=\$PATH:/root/bin" >> $ENVDOCKER 46 | 47 | # Set up Python virtual environment 48 | RUN python3.9 -m venv /root/env 49 | 50 | # Set JDK 17 as default 51 | RUN echo "export JAVA_HOME=$JAVA_HOME" >> $ENVDOCKER && \ 52 | echo "export PATH=$JAVA_HOME/bin:/root/bin:/root/env/bin:\${PATH}" >> $ENVDOCKER 53 | 54 | # cd into working directory 55 | WORKDIR /app 56 | 57 | # Create entrypoint script to activate Python venv 58 | ENV ENTRYPOINT=/opt/entrypoint.sh 59 | RUN echo '#!/bin/bash' > $ENTRYPOINT && \ 60 | echo "source $ENVDOCKER" >> $ENTRYPOINT && \ 61 | echo 'exec "$@"' >> $ENTRYPOINT && \ 62 | chmod +x $ENTRYPOINT 63 | 64 | ENTRYPOINT ["/opt/entrypoint.sh"] 65 | CMD ["/bin/bash"] 66 | 67 | -------------------------------------------------------------------------------- /assets/accrescent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/assets/accrescent.png -------------------------------------------------------------------------------- /assets/f-droid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/assets/f-droid.png -------------------------------------------------------------------------------- /assets/f-droid_qr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/assets/f-droid_qr.png -------------------------------------------------------------------------------- /assets/ironfox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/assets/ironfox.png -------------------------------------------------------------------------------- /assets/obtainium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/assets/obtainium.png -------------------------------------------------------------------------------- /patches/a-c-overlay/components/feature/search/src/main/assets/searchplugins/ddghtml.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | DuckDuckGo (HTML) 7 | UTF-8 8 | data:image/png;base64,AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADVZ4Ss0Wd+PM1nf1Tpd4PM6XeDzM1nf1TRZ3481WeErAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVYD/BjRa3pRQcOP9tMLy/83q2f/m9uv//f7+//L0/P+qu+7/UHDj/TRa3pRVgP8GAAAAAAAAAAAAAAAAVYD/BjNZ372Jnuv/9/j9/8nT9v+D0pj/R71m/02+a/9Kr3z/XreM//f4/f+Jnuv/M1nfvVWA/wYAAAAAAAAAADRa3pSJnuv/4Ob6/1h25P+8yPT/ntyv/6zhuv+Fvrj/PpKY/0Cbjf9YduT/4Ob6/4me6/80Wt6UAAAAADVZ4StQcOP99/j9/1h25P8zWN7/5+z7////////////Z4Lm/zNY3v8zWd3/M1je/1h25P/3+P3/UHDj/TVZ4Ss0Wd+PrLvx/5ut7v8zWN7/Rmfh/////////////////0Jo4P8neuf/IY/s/yZ85/8yXN//m63u/6y78f80Wd+PM1nf1ert+/9ObuL/M1je/3CK5////////////9j4//8RyPv/J3vn/ytx5P8lg+n/KHjm/05u4v/p7fv/M1nf1Tpd4PP4+f3/M1je/zNY3v+bre7////////////X+P//JNL8/yDJ+v8Utvb/II/t/y9j4P8zWN7/+Pn9/zpd4PM6XeDz+Pn9/zNY3v8zWN7/w871///////////////////////k+v//T5zt/xyc7/8UtPX/L2Ph//j5/f86XeDzM1nf1ert+/9ObuL/M1je/9vi+f//////oXZf////////////oXZf/2N/5f8zWN7/M1je/05u4v/q7fv/M1nf1TRZ34+su/H/m63u/zNY3v/H0fX//////////////////////+js+/83W97/M1je/zNY3v+bre7/rLvx/zRZ3481WeErUHDj/ff4/f9YduT/X3zl//Hz/P////////////j5/f9yi+j/M1je/zNY3v9YduT/9/j9/1Bw4/01WeErAAAAADRa3pSJnuv/4Ob6/1h25P9MbOL/2N/4/73J9P9DZeD/M1je/zNY3v9YduT/4Ob6/4me6/80Wt6UAAAAAAAAAABVgP8GM1nfvYme6//3+P3/m63u/05u4v8zWN7/M1je/05u4v+bre7/9/j9/4me6/8zWd+9VYD/BgAAAAAAAAAAAAAAAFWA/wY0Wt6UUHDj/ay78f/p7fv/+Pn9//j5/f/p7fv/rLvx/1Bw4/00Wt6UVYD/BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADVZ4Ss0Wd+PM1nf1Tpd4PM6XeDzM1nf1TRZ3481WeErAAAAAAAAAAAAAAAAAAAAAPAPAADAAwAAgAEAAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIABAACAAQAAwAMAAPAPAAAoAAAAIAAAAEAAAAABACAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFWA/wY2Wt9HM1nelTRY3780WN7ZM1je8zNY3vM0WN7ZNFjfvzNZ3pU2Wt9HVYD/BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADVg3xgzWN+WNFne8TNY3v9ceuT/iJ7r/52v7/+ywPL/ssDy/52v7/+Inuv/XHrk/zNY3v80Wd7xM1jfljVg3xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAElt/wczWOCCM1nf9Ets4v+ouPH/6e37/+vv+//a4Pj/2eD4/9zi+f/c4vn/2eD4/9rg+P/m6vv/6e37/6i48f9LbOL/M1nf9DNY4IJJbf8HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1YN8YM1jfxz9i4P+js/D/8fP8/6Cx7/+7x/P/5fbp/1zEd/+o4Lb/9vz4////////////3+T5/zVZ3v9Xed3/obPu//Hz/P+js/D/P2Hf/zNY38c1YN8YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN1njLjRZ3uNTcuP/4eb6/7PB8v9IaeH/M1je/9rg+f/H69D/Rrxl/0a8Zf9NtV//RrRa/063Yv9fpqf/QqWA/0a8Zf87gqv/SGnh/7TC8v/h5vr/U3Lj/zRZ3uMzW+MtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADVg3xg0Wd7jZ4Pm/+/x/P+Emuv/M1je/zNY3v87Xt///P3+/7rmxv9GvGX/Rrxl/0azWv9GvGX/Rrxl/0a8ZP9GvGX/Rrxl/zyIo/8zWN7/M1je/4Sa6//v8fz/Z4Lm/zRZ3uM1YN8YAAAAAAAAAAAAAAAAAAAAAAAAAABJbf8HM1jfx1Ny4//v8fz/aoXm/zNY3v8zWN7/M1je/2N/5f//////tOTB/0a8Zf9HvWb/c8mH/1W+bv9IuWj/Qqp7/0a8Zf9GvGX/PIWo/zNY3v8zWN7/M1je/2qF5v/v8fz/U3Lj/zNY38dJbf8HAAAAAAAAAAAAAAAAAAAAADNY4II/YuD/4eb6/4Sa6/8zWN7/M1je/zNY3v8zWN7/j6Ps///////W8d3/pt+1/+X26v//////8/X9/zhc3v80Wdz/PIek/0a4av85d7j/M1je/zNY3v8zWN7/M1je/4Sa6//h5vr/P2Hf/zNY4IIAAAAAAAAAAAAAAAA1YN8YM1nf9KOz8P+0wvL/M1je/zNY3v8zWN7/M1je/zNY3v+6xvP///////////////////////////+zwfL/M1je/zNY3v8zWN7/NFzY/zNZ3f8zWN7/M1je/zNY3v8zWN7/M1je/7TC8v+js/D/M1nf9DVg3xgAAAAAAAAAADNY35ZLbOL/8fP8/0hp4f8zWN7/M1je/zNY3v8zWN7/M1je/+Xq+v///////////////////////////32U6v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/SGnh//Hz/P9LbOL/M1jflgAAAABVgP8GNFne8ai48f+hsu//M1je/zNY3v8zWN7/M1je/zNY3v9DZeD/////////////////////////////////V3bj/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/obLv/6i48f80Wd7xVYD/BjZa30czWN7/6e37/1Z04/8zWN7/M1je/zNY3v8zWN7/M1je/2+J5/////////////////////////////////9RcOL/Lmfi/yKN7P8XrPP/EML5/w3K+/8Suvf/HZnu/y5n4v8zWN7/M1je/zNY3v9WdOP/6e37/zNY3v82Wt9HM1nelVx65P/j6Pr/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/mavu////////////////////////////7/z//yK79v8K0v3/Fq/0/yKN7P8iiev/IY7s/xqh8P8Suff/Dcr7/y5o4v8zWN7/M1je/zNY3v/j6Pr/XHrk/zNZ3pU0WN+/iJ7r/6++8v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v/DzvX///////////////////////////9k4/7/CtL9/xK59/8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/6++8v+Inuv/NFjfvzRY3tmdr+//mqzu/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/+7x/P///////////////////////////2Xj/v8K0v3/C9D9/xmm8f8YqfP/Gafy/yKN7P8vZuH/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/mqzu/52v7/80WN7ZM1je87LA8v+Fm+v/M1je/zNY3v8zWN7/M1je/zNY3v9La+H/////////////////////////////////+P7//3Pm/v8P0/3/CtL9/wrS/f8K0v3/CtL9/wrR/f8VsvX/JYPp/zNb3v8zWN7/M1je/zNY3v+Fm+v/ssDy/zRZ3vIzWN7zssDy/4Wb6/8zWN7/M1je/zNY3v8zWN7/M1je/3SN6P////////////////////////////////////////////b+///T9///vPP//1q/9v8WrfT/DMv8/wrS/f8K0v3/DsX6/yl25v8zWN7/M1je/4Wb6/+ywPL/M1je8zRY3tmdr+//mqzu/zNY3v8zWN7/M1je/zNY3v8zWN7/m63u////////////0LWn/7qTfv/////////////////////////////+/v//////s8Dy/zNY3v8zWt7/KXbm/x2b7v8bn/D/KnPl/zNY3v8zWN7/mqzu/52v7/80WN7ZNFjfv4me6/+vvvL/M1je/zNY3v8zWN7/M1je/zNY3v+zwPL///////////+sfWT/om5R//v59///////////////////////pHFV/8Cdiv+ruvH/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v+vvvL/iJ7r/zRY378zWd6VXHrk/+Po+v8zWN7/M1je/zNY3v8zWN7/M1je/7/K9P////////////z6+f/38u/////////////////////////////NsKH/4dDH/3uT6f8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/+Po+v9ceuT/M1nelTZa30czWN7/6e37/1Z04/8zWN7/M1je/zNY3v8zWN7/p7fw///////k1c3////////////////////////////////////////////3+f3/Q2Xg/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v9WdOP/6e37/zNY3v82Wt9HVYD/BjRZ3vGouPH/oLHv/zNY3v8zWN7/M1je/zNY3v92j+j//////+7l3//gz8b/+/j2///////////////////////p3db/2MK2/6mz5P8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/6Gy7/+ouPH/NFne8VWA/wYAAAAAM1jflkts4v/x8/z/SGnh/zNY3v8zWN7/M1je/zNY3v/U3Pj////////////////////////////////////////////s7/z/RWfg/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v9IaeH/8fP8/0ts4v8zWN+WAAAAAAAAAAA1YN8YM1nf9KOz8P+zwfL/M1je/zNY3v8zWN7/M1je/0Fj4P/DzvX/////////////////////////////////8PP8/2WB5v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/7TC8v+js/D/M1nf9DVg3xgAAAAAAAAAAAAAAAAzWOCCP2Lg/+Hm+v+Emuv/M1je/zNY3v8zWN7/R2jh/0do4f97k+n/1dz4////////////7/L8/4Oa6/9CZOD/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v+Fm+v/4eb6/z9i4P8zWOCCAAAAAAAAAAAAAAAAAAAAAElt/wczWN/HU3Lj/+/x/P9qheb/M1je/zNY3v+Xqe7/7vH8/////////////////87X9/9TcuP/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/aoXm/+/x/P9TcuP/M1jfx0lt/wcAAAAAAAAAAAAAAAAAAAAAAAAAADVg3xg0Wd7jZ4Lm/+/x/P+Emuv/M1je/2J+5f+puPH/rrzx/5Kl7f9PbuL/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/4Sa6//v8fz/Z4Lm/zRZ3uM1YN8YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADdZ4y40Wd7jU3Lj/+Hm+v+0wvL/SGnh/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/0hp4f+0wvL/4eb6/1Ny4/80Wd7jM1vjLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADVg3xgzWN/HP2Lg/6Oz8P/x8/z/obLv/1Z04/8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/1Z04/+hsu//8fP8/6Oz8P8/Yd//M1jfxzVg3xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAElt/wczWOCCM1nf9Ets4v+ouPH/6e37/+Po+v+vvvL/mqzu/4Wb6/+Fm+v/mqzu/6++8v/j6Pr/6e37/6i48f9LbOL/M1nf9DNY4IJJbf8HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1YN8YM1jfljRZ3vEzWN7/XHrk/4ie6/+dr+//ssDy/7LA8v+dr+//iJ7r/1x65P8zWN7/NFne8TNY35Y1YN8YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVYD/BjZa30czWd6VNFjfvzRY3tkzWN7zM1je8zRY3tk0WN+/M1nelTZa30dVgP8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AA///AAD//AAAP/gAAB/wAAAP4AAAB8AAAAPAAAADgAAAAYAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABgAAAAcAAAAPAAAAD4AAAB/AAAA/4AAAf/AAAP/8AAP//wAP/ 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | https://html.duckduckgo.com/html 21 | 22 | -------------------------------------------------------------------------------- /patches/a-c-overlay/components/feature/search/src/main/assets/searchplugins/ddglite.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | DuckDuckGo (Lite) 7 | UTF-8 8 | data:image/png;base64,AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADVZ4Ss0Wd+PM1nf1Tpd4PM6XeDzM1nf1TRZ3481WeErAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVYD/BjRa3pRQcOP9tMLy/83q2f/m9uv//f7+//L0/P+qu+7/UHDj/TRa3pRVgP8GAAAAAAAAAAAAAAAAVYD/BjNZ372Jnuv/9/j9/8nT9v+D0pj/R71m/02+a/9Kr3z/XreM//f4/f+Jnuv/M1nfvVWA/wYAAAAAAAAAADRa3pSJnuv/4Ob6/1h25P+8yPT/ntyv/6zhuv+Fvrj/PpKY/0Cbjf9YduT/4Ob6/4me6/80Wt6UAAAAADVZ4StQcOP99/j9/1h25P8zWN7/5+z7////////////Z4Lm/zNY3v8zWd3/M1je/1h25P/3+P3/UHDj/TVZ4Ss0Wd+PrLvx/5ut7v8zWN7/Rmfh/////////////////0Jo4P8neuf/IY/s/yZ85/8yXN//m63u/6y78f80Wd+PM1nf1ert+/9ObuL/M1je/3CK5////////////9j4//8RyPv/J3vn/ytx5P8lg+n/KHjm/05u4v/p7fv/M1nf1Tpd4PP4+f3/M1je/zNY3v+bre7////////////X+P//JNL8/yDJ+v8Utvb/II/t/y9j4P8zWN7/+Pn9/zpd4PM6XeDz+Pn9/zNY3v8zWN7/w871///////////////////////k+v//T5zt/xyc7/8UtPX/L2Ph//j5/f86XeDzM1nf1ert+/9ObuL/M1je/9vi+f//////oXZf////////////oXZf/2N/5f8zWN7/M1je/05u4v/q7fv/M1nf1TRZ34+su/H/m63u/zNY3v/H0fX//////////////////////+js+/83W97/M1je/zNY3v+bre7/rLvx/zRZ3481WeErUHDj/ff4/f9YduT/X3zl//Hz/P////////////j5/f9yi+j/M1je/zNY3v9YduT/9/j9/1Bw4/01WeErAAAAADRa3pSJnuv/4Ob6/1h25P9MbOL/2N/4/73J9P9DZeD/M1je/zNY3v9YduT/4Ob6/4me6/80Wt6UAAAAAAAAAABVgP8GM1nfvYme6//3+P3/m63u/05u4v8zWN7/M1je/05u4v+bre7/9/j9/4me6/8zWd+9VYD/BgAAAAAAAAAAAAAAAFWA/wY0Wt6UUHDj/ay78f/p7fv/+Pn9//j5/f/p7fv/rLvx/1Bw4/00Wt6UVYD/BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADVZ4Ss0Wd+PM1nf1Tpd4PM6XeDzM1nf1TRZ3481WeErAAAAAAAAAAAAAAAAAAAAAPAPAADAAwAAgAEAAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIABAACAAQAAwAMAAPAPAAAoAAAAIAAAAEAAAAABACAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFWA/wY2Wt9HM1nelTRY3780WN7ZM1je8zNY3vM0WN7ZNFjfvzNZ3pU2Wt9HVYD/BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADVg3xgzWN+WNFne8TNY3v9ceuT/iJ7r/52v7/+ywPL/ssDy/52v7/+Inuv/XHrk/zNY3v80Wd7xM1jfljVg3xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAElt/wczWOCCM1nf9Ets4v+ouPH/6e37/+vv+//a4Pj/2eD4/9zi+f/c4vn/2eD4/9rg+P/m6vv/6e37/6i48f9LbOL/M1nf9DNY4IJJbf8HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1YN8YM1jfxz9i4P+js/D/8fP8/6Cx7/+7x/P/5fbp/1zEd/+o4Lb/9vz4////////////3+T5/zVZ3v9Xed3/obPu//Hz/P+js/D/P2Hf/zNY38c1YN8YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN1njLjRZ3uNTcuP/4eb6/7PB8v9IaeH/M1je/9rg+f/H69D/Rrxl/0a8Zf9NtV//RrRa/063Yv9fpqf/QqWA/0a8Zf87gqv/SGnh/7TC8v/h5vr/U3Lj/zRZ3uMzW+MtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADVg3xg0Wd7jZ4Pm/+/x/P+Emuv/M1je/zNY3v87Xt///P3+/7rmxv9GvGX/Rrxl/0azWv9GvGX/Rrxl/0a8ZP9GvGX/Rrxl/zyIo/8zWN7/M1je/4Sa6//v8fz/Z4Lm/zRZ3uM1YN8YAAAAAAAAAAAAAAAAAAAAAAAAAABJbf8HM1jfx1Ny4//v8fz/aoXm/zNY3v8zWN7/M1je/2N/5f//////tOTB/0a8Zf9HvWb/c8mH/1W+bv9IuWj/Qqp7/0a8Zf9GvGX/PIWo/zNY3v8zWN7/M1je/2qF5v/v8fz/U3Lj/zNY38dJbf8HAAAAAAAAAAAAAAAAAAAAADNY4II/YuD/4eb6/4Sa6/8zWN7/M1je/zNY3v8zWN7/j6Ps///////W8d3/pt+1/+X26v//////8/X9/zhc3v80Wdz/PIek/0a4av85d7j/M1je/zNY3v8zWN7/M1je/4Sa6//h5vr/P2Hf/zNY4IIAAAAAAAAAAAAAAAA1YN8YM1nf9KOz8P+0wvL/M1je/zNY3v8zWN7/M1je/zNY3v+6xvP///////////////////////////+zwfL/M1je/zNY3v8zWN7/NFzY/zNZ3f8zWN7/M1je/zNY3v8zWN7/M1je/7TC8v+js/D/M1nf9DVg3xgAAAAAAAAAADNY35ZLbOL/8fP8/0hp4f8zWN7/M1je/zNY3v8zWN7/M1je/+Xq+v///////////////////////////32U6v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/SGnh//Hz/P9LbOL/M1jflgAAAABVgP8GNFne8ai48f+hsu//M1je/zNY3v8zWN7/M1je/zNY3v9DZeD/////////////////////////////////V3bj/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/obLv/6i48f80Wd7xVYD/BjZa30czWN7/6e37/1Z04/8zWN7/M1je/zNY3v8zWN7/M1je/2+J5/////////////////////////////////9RcOL/Lmfi/yKN7P8XrPP/EML5/w3K+/8Suvf/HZnu/y5n4v8zWN7/M1je/zNY3v9WdOP/6e37/zNY3v82Wt9HM1nelVx65P/j6Pr/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/mavu////////////////////////////7/z//yK79v8K0v3/Fq/0/yKN7P8iiev/IY7s/xqh8P8Suff/Dcr7/y5o4v8zWN7/M1je/zNY3v/j6Pr/XHrk/zNZ3pU0WN+/iJ7r/6++8v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v/DzvX///////////////////////////9k4/7/CtL9/xK59/8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/6++8v+Inuv/NFjfvzRY3tmdr+//mqzu/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/+7x/P///////////////////////////2Xj/v8K0v3/C9D9/xmm8f8YqfP/Gafy/yKN7P8vZuH/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/mqzu/52v7/80WN7ZM1je87LA8v+Fm+v/M1je/zNY3v8zWN7/M1je/zNY3v9La+H/////////////////////////////////+P7//3Pm/v8P0/3/CtL9/wrS/f8K0v3/CtL9/wrR/f8VsvX/JYPp/zNb3v8zWN7/M1je/zNY3v+Fm+v/ssDy/zRZ3vIzWN7zssDy/4Wb6/8zWN7/M1je/zNY3v8zWN7/M1je/3SN6P////////////////////////////////////////////b+///T9///vPP//1q/9v8WrfT/DMv8/wrS/f8K0v3/DsX6/yl25v8zWN7/M1je/4Wb6/+ywPL/M1je8zRY3tmdr+//mqzu/zNY3v8zWN7/M1je/zNY3v8zWN7/m63u////////////0LWn/7qTfv/////////////////////////////+/v//////s8Dy/zNY3v8zWt7/KXbm/x2b7v8bn/D/KnPl/zNY3v8zWN7/mqzu/52v7/80WN7ZNFjfv4me6/+vvvL/M1je/zNY3v8zWN7/M1je/zNY3v+zwPL///////////+sfWT/om5R//v59///////////////////////pHFV/8Cdiv+ruvH/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v+vvvL/iJ7r/zRY378zWd6VXHrk/+Po+v8zWN7/M1je/zNY3v8zWN7/M1je/7/K9P////////////z6+f/38u/////////////////////////////NsKH/4dDH/3uT6f8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/+Po+v9ceuT/M1nelTZa30czWN7/6e37/1Z04/8zWN7/M1je/zNY3v8zWN7/p7fw///////k1c3////////////////////////////////////////////3+f3/Q2Xg/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v9WdOP/6e37/zNY3v82Wt9HVYD/BjRZ3vGouPH/oLHv/zNY3v8zWN7/M1je/zNY3v92j+j//////+7l3//gz8b/+/j2///////////////////////p3db/2MK2/6mz5P8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/6Gy7/+ouPH/NFne8VWA/wYAAAAAM1jflkts4v/x8/z/SGnh/zNY3v8zWN7/M1je/zNY3v/U3Pj////////////////////////////////////////////s7/z/RWfg/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v9IaeH/8fP8/0ts4v8zWN+WAAAAAAAAAAA1YN8YM1nf9KOz8P+zwfL/M1je/zNY3v8zWN7/M1je/0Fj4P/DzvX/////////////////////////////////8PP8/2WB5v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/7TC8v+js/D/M1nf9DVg3xgAAAAAAAAAAAAAAAAzWOCCP2Lg/+Hm+v+Emuv/M1je/zNY3v8zWN7/R2jh/0do4f97k+n/1dz4////////////7/L8/4Oa6/9CZOD/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v+Fm+v/4eb6/z9i4P8zWOCCAAAAAAAAAAAAAAAAAAAAAElt/wczWN/HU3Lj/+/x/P9qheb/M1je/zNY3v+Xqe7/7vH8/////////////////87X9/9TcuP/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/aoXm/+/x/P9TcuP/M1jfx0lt/wcAAAAAAAAAAAAAAAAAAAAAAAAAADVg3xg0Wd7jZ4Lm/+/x/P+Emuv/M1je/2J+5f+puPH/rrzx/5Kl7f9PbuL/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/4Sa6//v8fz/Z4Lm/zRZ3uM1YN8YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADdZ4y40Wd7jU3Lj/+Hm+v+0wvL/SGnh/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/0hp4f+0wvL/4eb6/1Ny4/80Wd7jM1vjLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADVg3xgzWN/HP2Lg/6Oz8P/x8/z/obLv/1Z04/8zWN7/M1je/zNY3v8zWN7/M1je/zNY3v8zWN7/M1je/1Z04/+hsu//8fP8/6Oz8P8/Yd//M1jfxzVg3xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAElt/wczWOCCM1nf9Ets4v+ouPH/6e37/+Po+v+vvvL/mqzu/4Wb6/+Fm+v/mqzu/6++8v/j6Pr/6e37/6i48f9LbOL/M1nf9DNY4IJJbf8HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1YN8YM1jfljRZ3vEzWN7/XHrk/4ie6/+dr+//ssDy/7LA8v+dr+//iJ7r/1x65P8zWN7/NFne8TNY35Y1YN8YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVYD/BjZa30czWd6VNFjfvzRY3tkzWN7zM1je8zRY3tk0WN+/M1nelTZa30dVgP8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AA///AAD//AAAP/gAAB/wAAAP4AAAB8AAAAPAAAADgAAAAYAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABgAAAAcAAAAPAAAAD4AAAB/AAAA/4AAAf/AAAP/8AAP//wAP/ 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | https://lite.duckduckgo.com/lite 21 | 22 | -------------------------------------------------------------------------------- /patches/a-c-overlay/components/feature/search/src/main/assets/searchplugins/mojeek.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | Mojeek 7 | UTF-8 8 | data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA8pJREFUeNrsVk1vG0UY3tnvtb3+SJpgO01cmkQKUhURqBCC8iE+EoSKED1QBBUKB0r7AzjwB+BSUX4AXDkhFATHCJAKKpSegDZqRVFpGtLETmI72fV+zvDsDnV2VwUu4ZY52KN55n2feZ953rEJY0z4PwfZJ9gn2EOCle7StY2Lf3ave6EzYNRnai80ytNYv7F5+ee1xXXrD8bCoXzjsdFXa+YkD7m+8cNS88K6dTMIPVMbmK7OTt/37D0I2s7qZ1feRyI3tEUiEYGELNCk3Nzk2Q17+cfbCyH1JSJjd8C8vFKef+j8oDHy+dUPlprfURZGIYRQGlKBPnXo1MtT72YJtr2ND78/aftdviSLKj6ZQP3QxUSRdCEqkyFRxEG9onZAEpWWdUuTczQWQCRiHMIcf/vNmXMPVmf7BBFgqoOPjp7oBd1qYXykOIXUEbMgqpKB7H7oYIJcPnVjem3H22o7a1iBmJpsaJLBIZQO4ku3F5IVyPzrkYOvDOcPQ0Gc4qOLr7fsZYkomEOB2Yl3jtaPEyIu3vj40sqCIuooBRBknJs4c3TkJcbo4u+f/LTyBSAZldm3nGBHlwspgopeq9Rq8ZThjJEkRPBC+4nGG8+Pn+Z7ZifO/LL+NQpCcYCebJx6bvxtDs1NnP117RufOigDGqIgXSjsSpQcvWDb9tvQFELpsvn42Mk+pMo6bp6iKoEacvFY47VdSNJ1OY9ScD6oqop66g6Sw/a3ncCCICENhnJjg7mDfcjxLS/sifAYoPwYrLwLBRYciGyQtKBWcD3/SGB5W14kAsHWslHFJA31BBJlKWrDQgLa8TbdwI7MymgpDWUJsBWuj+1Li9pQEoKboS/hkJ6G3BaHwF0xakkoS9B1W9jETV1KE3TdZkjvDXXcJo0uIPbLfxE0/+5AQkr6cCqLsx4lj/2egeIo3nFSWa/+K4HTRGq+1dQOZAj4lYiinFXPbcUQQ6MV01FZAggNm0MERdRMdSBzTBLZF42iovnT1ugQ/lowyrViAks1WtIq0cPCqCLnc2q5v44A3H/UHwz9UcgnIAx09V1dxa+una8YdUMxTzzwXrYCj/YsPzoLFRiyGLLZh+BCy2uT6JGghlJAfDKwolc5h0yU5c7VyytfXln71vY7WQLb67R7q8gFDBKhPxOVbW45dzwOSbqS6FWMh+sv4kF0AwuPBErE/eE1XN35LSsRxH36/nnoEfdqI9kvSPrM4bdI3MbDhUMZYUdLR+Znzl24+SkeWkMp1s3JqaFjY6Uje/+TyX9/9v9V7BPs7fhLgAEAm6sRCKh1afsAAAAASUVORK5CYII= 9 | 10 | 11 | 12 | https://www.mojeek.com/ 13 | 14 | -------------------------------------------------------------------------------- /patches/a-c-overlay/components/feature/search/src/main/assets/searchplugins/no-search.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | No Search 7 | UTF-8 8 | 9 | 10 | 11 | https://nosearch.invalid/ 12 | 13 | -------------------------------------------------------------------------------- /patches/a-c-overlay/components/feature/search/src/main/assets/searchplugins/startpage.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | Startpage 7 | UTF-8 8 | data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEUUlEQVRYhb2XW2xUZRDHf7NsLb1YESq0oAlGrBBqLaXFIikmggGLYCEbhWCsEhOCiZcQIMjFByKoaYmx8mQkkReBBLWGhAdQQ3igtRJBrImIFUq1BdtS6HV7trvjw+nuuezZbdHaSU72fDPfzPef78xtxTDCeSIcUtUFIvgYB1IVRKgHKsUwwnUiWjoeB8cDoV4MI6x2pgiojtdaIxIKDQ0vBXBgcfGEcBhaWuHvDjBCkJEO9+dC9mRFZGR9r3e/7UKIJ5PX1y+cPC3UnYOefnEdoczIFZaWKSWFgs+ncfrJ3uM+gZuamuHg58LtbkvVDsHu0+xZsGGdkpGezKKTkgJoaoYDBwXDGL3B6bmweaOSNnGUAKwYAPu36esX3v1QuNUjpseqIPDADJgzC9LSlI5O4cIv5l5TLihQlK+8ul4R8YoJsO5R7TEQFZh06ox5eJSbmgovBZR5j2IzrKxZIRyphYYLlpXzjXD5D8h7yO1vfBx4Fp5wWDj7gxP3K2uVooJ4r9ImKpXPK/mPgGjUR+HM985gTUQ+VQEEVetpaYXeXhBVRJVZM5WCOcTk7v0+HwSeVROBms+l3xPvt6/9UY/seXyjXYZdMb2Y/XAEEecVisvBqdlC6Xy4ecviGSFIvSvevl3fFYQmNV0VrlyD+6bAPVmQPRkyM5Jm67+mEevA6Em51tKGDnuZ4vczPXfaiFp+NyN6NeFwmM6bt2hra2cgOMjjJQWAxNX2KF1svERg/Vux9fx5czn82f64fW59f3yuQnd3H0+Vv8zt7t4Y79An7/FEaaENpPVNh4YivL//U4eNhQsKPeqA3UlT3zMNs7IyWLSwyMHbvP0DLjZetnFM48GgwbZd1Zz7sTHGnjDBx+pVSz0Pd+t7BiHA1WutrAq8xkBwMLbfnzKB8mWLKVtUTNbdmVxuaubosRO0/Hnd0SQqVi6hau+WEQAQBRDWRP36+Inv2LKjCo0M5zhWyY39Rp2xpWXVvq08t2JJnD3P9UjzQO3xb9i1p4bBQVtHUixAHgDunZRF7dEDTM+darPpPQ/YYsB7HqhYuYTaIx/zZFnJcDGxwKGmWk5OtsNMV1c3b27dh2GEHLa83u+oDrT81cbZuvM0t7QSCg2RPWUShY/NoXhePrv3fMSxr046HKx8sYKd2zbinCCcNGaFyDAM1m/Yyk8/X3Lwa6p3sPzpxYkBJJoHEs+IYO/ndrp+o5M1616nvaMrxsvMSOfLwzU8OHOGp76rDiSa4ew8TSjPmTaFmuqdpKRYBba3r583tuxlYGDQU3/M/4gUF81l9/ZNDny//naFL74+5bnfcx5wP8n6udd6baCcFwLPWKcoBIODo58HLLJ4ifq5tXbK33l7E909vXx7up7ionwCq5c5ekPSeWAsKRJRfL7EaehXJQLyv/0pFRHP9m3KzCxocDLjr9ctT37gnehLvRjGUB5wCCh1CfFOxf8uVyUiQgNQ+Q/LESVT7byGNwAAAABJRU5ErkJggg== 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | https://www.startpage.com/ 20 | 21 | -------------------------------------------------------------------------------- /patches/allow-build-date-override.patch: -------------------------------------------------------------------------------- 1 | From 7a7b1a0060d89ddf1f705b0e179de6bc30b9197f Mon Sep 17 00:00:00 2001 2 | From: Akash Yadav 3 | Date: Sun, 18 May 2025 02:17:20 +0530 4 | Subject: [PATCH] fix: allow overriding build date using system env 5 | 6 | Signed-off-by: Akash Yadav 7 | --- 8 | .../plugins/config/src/main/java/ConfigPlugin.kt | 8 +++++++- 9 | 1 file changed, 7 insertions(+), 1 deletion(-) 10 | 11 | diff --git a/mobile/android/android-components/plugins/config/src/main/java/ConfigPlugin.kt b/mobile/android/android-components/plugins/config/src/main/java/ConfigPlugin.kt 12 | index 4e86c3c8e3..252c605887 100644 13 | --- a/mobile/android/android-components/plugins/config/src/main/java/ConfigPlugin.kt 14 | +++ b/mobile/android/android-components/plugins/config/src/main/java/ConfigPlugin.kt 15 | @@ -71,7 +71,13 @@ object Config { 16 | private val fennecBaseVersionCode by lazy { 17 | val format = SimpleDateFormat("yyyyMMddHHmmss", Locale.US) 18 | val cutoff = format.parse("20141228000000") 19 | - val build = Date() 20 | + var build = Date() 21 | + 22 | + val buildDate = System.getenv("IF_BUILD_DATE") 23 | + if (!buildDate.isNullOrBlank()) { 24 | + println("[IronFox] Overriding build date to: '$buildDate'") 25 | + build = Date.from(java.time.Instant.parse(buildDate)) 26 | + } 27 | 28 | Math.floor((build.time - cutoff.time) / (1000.0 * 60.0 * 60.0)).toInt() 29 | } 30 | -- 31 | 2.49.0 32 | 33 | -------------------------------------------------------------------------------- /patches/block-autoplay-by-default.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 2 | index 72493a2c21..e3b98da6c4 100644 3 | --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 4 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 5 | @@ -1305,7 +1305,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { 6 | * either [AUTOPLAY_ALLOW_ALL] or [AUTOPLAY_BLOCK_ALL]. Because of this, we are forced to save 7 | * the user selected setting as well. 8 | */ 9 | - fun getAutoplayUserSetting() = preferences.getInt(AUTOPLAY_USER_SETTING, AUTOPLAY_BLOCK_AUDIBLE) 10 | + fun getAutoplayUserSetting() = preferences.getInt(AUTOPLAY_USER_SETTING, AUTOPLAY_BLOCK_ALL) 11 | 12 | private fun getSitePermissionsPhoneFeatureAutoplayAction( 13 | feature: PhoneFeature, 14 | @@ -1334,7 +1334,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { 15 | ), 16 | autoplayInaudible = getSitePermissionsPhoneFeatureAutoplayAction( 17 | feature = PhoneFeature.AUTOPLAY_INAUDIBLE, 18 | - default = AutoplayAction.ALLOWED, 19 | + default = AutoplayAction.BLOCKED, 20 | ), 21 | persistentStorage = getSitePermissionsPhoneFeatureAction(PhoneFeature.PERSISTENT_STORAGE), 22 | crossOriginStorageAccess = getSitePermissionsPhoneFeatureAction(PhoneFeature.CROSS_ORIGIN_STORAGE_ACCESS), 23 | -------------------------------------------------------------------------------- /patches/block-cookie-banners.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 2 | index 72493a2c21..c62c18809d 100644 3 | --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 4 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 5 | @@ -757,20 +757,17 @@ class Settings(private val appContext: Context) : PreferencesHolder { 6 | false, 7 | ) 8 | 9 | - var shouldUseCookieBannerPrivateMode by lazyFeatureFlagPreference( 10 | + var shouldUseCookieBannerPrivateMode by booleanPreference( 11 | appContext.getPreferenceKey(R.string.pref_key_cookie_banner_private_mode), 12 | - featureFlag = true, 13 | - default = { shouldUseCookieBannerPrivateModeDefaultValue }, 14 | + default = true, 15 | ) 16 | 17 | - val shouldUseCookieBannerPrivateModeDefaultValue: Boolean 18 | - get() = cookieBannersSection[CookieBannersSection.FEATURE_SETTING_VALUE_PBM] == 1 19 | + val shouldUseCookieBannerPrivateModeDefaultValue: Boolean = true 20 | 21 | val shouldUseCookieBanner: Boolean 22 | get() = cookieBannersSection[CookieBannersSection.FEATURE_SETTING_VALUE] == 1 23 | 24 | - val shouldShowCookieBannerUI: Boolean 25 | - get() = cookieBannersSection[CookieBannersSection.FEATURE_UI] == 1 26 | + val shouldShowCookieBannerUI: Boolean = true 27 | 28 | val shouldEnableCookieBannerDetectOnly: Boolean 29 | get() = cookieBannersSection[CookieBannersSection.FEATURE_SETTING_DETECT_ONLY] == 1 30 | diff --git a/mobile/android/fenix/app/src/main/res/xml/preferences.xml b/mobile/android/fenix/app/src/main/res/xml/preferences.xml 31 | index 4c6b14bf87..2e4227a392 100644 32 | --- a/mobile/android/fenix/app/src/main/res/xml/preferences.xml 33 | +++ b/mobile/android/fenix/app/src/main/res/xml/preferences.xml 34 | @@ -113,7 +113,7 @@ 35 | 41 | 42 | 20 | 26 | 27 | -------------------------------------------------------------------------------- /patches/disable-autofill.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 2 | index 72493a2c21..c0116767c7 100644 3 | --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 4 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 5 | @@ -1385,12 +1385,12 @@ class Settings(private val appContext: Context) : PreferencesHolder { 6 | 7 | var shouldPromptToSaveLogins by booleanPreference( 8 | appContext.getPreferenceKey(R.string.pref_key_save_logins), 9 | - default = true, 10 | + default = false, 11 | ) 12 | 13 | var shouldAutofillLogins by booleanPreference( 14 | appContext.getPreferenceKey(R.string.pref_key_autofill_logins), 15 | - default = true, 16 | + default = false, 17 | ) 18 | 19 | /** 20 | @@ -1722,7 +1722,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { 21 | */ 22 | var shouldAutofillCreditCardDetails by booleanPreference( 23 | appContext.getPreferenceKey(R.string.pref_key_credit_cards_save_and_autofill_cards), 24 | - default = true, 25 | + default = false, 26 | ) 27 | 28 | /** 29 | @@ -1733,7 +1733,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { 30 | */ 31 | var shouldAutofillAddressDetails by booleanPreference( 32 | appContext.getPreferenceKey(R.string.pref_key_addresses_save_and_autofill_addresses), 33 | - default = true, 34 | + default = false, 35 | ) 36 | 37 | /** 38 | diff --git a/mobile/android/fenix/app/src/main/res/xml/autofill_preferences.xml b/mobile/android/fenix/app/src/main/res/xml/autofill_preferences.xml 39 | index aa1efa9665..1ccfc1fefa 100644 40 | --- a/mobile/android/fenix/app/src/main/res/xml/autofill_preferences.xml 41 | +++ b/mobile/android/fenix/app/src/main/res/xml/autofill_preferences.xml 42 | @@ -10,7 +10,7 @@ 43 | android:title="@string/preferences_addresses"> 44 | 45 | 51 | @@ -23,7 +23,7 @@ 52 | android:layout="@layout/preference_cat_style" 53 | android:title="@string/preferences_credit_cards_2"> 54 | 60 | diff --git a/mobile/android/fenix/app/src/main/res/xml/credit_cards_preferences.xml b/mobile/android/fenix/app/src/main/res/xml/credit_cards_preferences.xml 61 | index 00caf8e1bb..b4efbb89a5 100644 62 | --- a/mobile/android/fenix/app/src/main/res/xml/credit_cards_preferences.xml 63 | +++ b/mobile/android/fenix/app/src/main/res/xml/credit_cards_preferences.xml 64 | @@ -5,7 +5,7 @@ 65 | 67 | 73 | diff --git a/mobile/android/fenix/app/src/main/res/xml/logins_preferences.xml b/mobile/android/fenix/app/src/main/res/xml/logins_preferences.xml 74 | index 1a8810eca7..1f3ad71295 100644 75 | --- a/mobile/android/fenix/app/src/main/res/xml/logins_preferences.xml 76 | +++ b/mobile/android/fenix/app/src/main/res/xml/logins_preferences.xml 77 | @@ -9,7 +9,7 @@ 78 | android:summary="@string/preferences_passwords_save_logins_ask_to_save" 79 | android:title="@string/preferences_passwords_save_logins_2" /> 80 | 86 | diff --git a/mobile/android/fenix/app/src/main/res/xml/save_logins_preferences.xml b/mobile/android/fenix/app/src/main/res/xml/save_logins_preferences.xml 87 | index 3fc38f2070..1c88040284 100644 88 | --- a/mobile/android/fenix/app/src/main/res/xml/save_logins_preferences.xml 89 | +++ b/mobile/android/fenix/app/src/main/res/xml/save_logins_preferences.xml 90 | @@ -4,11 +4,11 @@ 91 | - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> 92 | 93 | 98 | 103 | 104 | -------------------------------------------------------------------------------- /patches/disable-cfrs.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/fenix/app/nimbus.fml.yaml b/mobile/android/fenix/app/nimbus.fml.yaml 2 | index 1a47d3dcdf..4f056022c1 100644 3 | --- a/mobile/android/fenix/app/nimbus.fml.yaml 4 | +++ b/mobile/android/fenix/app/nimbus.fml.yaml 5 | @@ -103,10 +103,10 @@ features: 6 | default: 7 | { 8 | "home-onboarding-dialog-existing-users": true, 9 | - "sync-cfr": true, 10 | + "sync-cfr": false, 11 | "wallpapers-selection-tool": true, 12 | - "jump-back-in-cfr": true, 13 | - "tcp-cfr": true, 14 | + "jump-back-in-cfr": false, 15 | + "tcp-cfr": false, 16 | "tcp-feature": true, 17 | } 18 | defaults: 19 | @@ -114,9 +114,9 @@ features: 20 | value: { 21 | "sections-enabled": { 22 | "home-onboarding-dialog-existing-users": true, 23 | - "sync-cfr": true, 24 | + "sync-cfr": false, 25 | "wallpapers-selection-tool": true, 26 | - "jump-back-in-cfr": true, 27 | + "jump-back-in-cfr": false, 28 | } 29 | } 30 | query-parameter-stripping: 31 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 32 | index 72493a2c21..27da6ea281 100644 33 | --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 34 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 35 | @@ -210,8 +210,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { 36 | default = 0L, 37 | ) 38 | 39 | - val canShowCfr: Boolean 40 | - get() = (System.currentTimeMillis() - lastCfrShownTimeInMillis) > THREE_DAYS_MS 41 | + val canShowCfr: Boolean = false 42 | 43 | var forceEnableZoom by booleanPreference( 44 | appContext.getPreferenceKey(R.string.pref_key_accessibility_force_enable_zoom), 45 | @@ -910,30 +909,16 @@ class Settings(private val appContext: Context) : PreferencesHolder { 46 | /** 47 | * Indicates if the total cookie protection CRF should be shown. 48 | */ 49 | - var shouldShowEraseActionCFR by lazyFeatureFlagPreference( 50 | - appContext.getPreferenceKey(R.string.pref_key_should_show_erase_action_popup), 51 | - featureFlag = true, 52 | - default = { feltPrivateBrowsingEnabled }, 53 | - ) 54 | + var shouldShowEraseActionCFR = false 55 | 56 | /** 57 | * Indicates if the cookie banners CRF should be shown. 58 | */ 59 | - var shouldShowCookieBannersCFR by lazyFeatureFlagPreference( 60 | - appContext.getPreferenceKey(R.string.pref_key_should_show_cookie_banners_action_popup), 61 | - featureFlag = true, 62 | - default = { shouldShowCookieBannerUI }, 63 | - ) 64 | + var shouldShowCookieBannersCFR = false 65 | 66 | - var shouldShowTabSwipeCFR by booleanPreference( 67 | - appContext.getPreferenceKey(R.string.pref_key_toolbar_tab_swipe_cfr), 68 | - default = false, 69 | - ) 70 | + var shouldShowTabSwipeCFR = false 71 | 72 | - var hasShownTabSwipeCFR by booleanPreference( 73 | - appContext.getPreferenceKey(R.string.pref_key_toolbar_has_shown_tab_swipe_cfr), 74 | - default = false, 75 | - ) 76 | + var hasShownTabSwipeCFR = false 77 | 78 | val blockCookiesSelectionInCustomTrackingProtection by stringPreference( 79 | key = appContext.getPreferenceKey(R.string.pref_key_tracking_protection_custom_cookies_select), 80 | @@ -1211,23 +1196,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { 81 | private val userNeedsToVisitInstallableSites: Boolean 82 | get() = pwaInstallableVisitCount.underMaxCount() 83 | 84 | - val shouldShowPwaCfr: Boolean 85 | - get() { 86 | - if (!canShowCfr) return false 87 | - // We only want to show this on the 3rd time a user visits a site 88 | - if (userNeedsToVisitInstallableSites) return false 89 | - 90 | - // ShortcutManager::pinnedShortcuts is only available on Oreo+ 91 | - if (!userKnowsAboutPwas && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 92 | - val manager = appContext.getSystemService(ShortcutManager::class.java) 93 | - val alreadyHavePwaInstalled = manager != null && manager.pinnedShortcuts.size > 0 94 | - 95 | - // Users know about PWAs onboarding if they already have PWAs installed. 96 | - userKnowsAboutPwas = alreadyHavePwaInstalled 97 | - } 98 | - // Show dialog only if user does not know abut PWAs 99 | - return !userKnowsAboutPwas 100 | - } 101 | + val shouldShowPwaCfr: Boolean = false 102 | 103 | var userKnowsAboutPwas by booleanPreference( 104 | appContext.getPreferenceKey(R.string.pref_key_user_knows_about_pwa), 105 | @@ -1239,8 +1208,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { 106 | default = true, 107 | ) 108 | 109 | - val shouldShowOpenInAppCfr: Boolean 110 | - get() = canShowCfr && shouldShowOpenInAppBanner 111 | + val shouldShowOpenInAppCfr: Boolean = false 112 | 113 | var shouldShowAutoCloseTabsBanner by booleanPreference( 114 | appContext.getPreferenceKey(R.string.pref_key_should_show_auto_close_tabs_banner), 115 | @@ -1676,11 +1644,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { 116 | /** 117 | * Indicates if sync onboarding CFR should be shown. 118 | */ 119 | - var showSyncCFR by lazyFeatureFlagPreference( 120 | - appContext.getPreferenceKey(R.string.pref_key_should_show_sync_cfr), 121 | - featureFlag = true, 122 | - default = { mr2022Sections[Mr2022Section.SYNC_CFR] == true }, 123 | - ) 124 | + var showSyncCFR = false 125 | 126 | /** 127 | * Indicates if home onboarding dialog should be shown. 128 | @@ -1894,26 +1858,17 @@ class Settings(private val appContext: Context) : PreferencesHolder { 129 | /** 130 | * Indicates if the navigation bar CFR should be displayed to the user. 131 | */ 132 | - var shouldShowNavigationBarCFR by booleanPreference( 133 | - key = appContext.getPreferenceKey(R.string.pref_key_should_navbar_cfr), 134 | - default = true, 135 | - ) 136 | + var shouldShowNavigationBarCFR = false 137 | 138 | /** 139 | * Indicates if the search bar CFR should be displayed to the user. 140 | */ 141 | - var shouldShowSearchBarCFR by booleanPreference( 142 | - key = appContext.getPreferenceKey(R.string.pref_key_should_searchbar_cfr), 143 | - default = false, 144 | - ) 145 | + var shouldShowSearchBarCFR = false 146 | 147 | /** 148 | * Indicates Navigation Bar's Navigation buttons CFR should be displayed to the user. 149 | */ 150 | - var shouldShowNavigationButtonsCFR by booleanPreference( 151 | - key = appContext.getPreferenceKey(R.string.pref_key_toolbar_navigation_cfr), 152 | - default = true, 153 | - ) 154 | + var shouldShowNavigationButtonsCFR = false 155 | 156 | /** 157 | * Indicates whether or not to use remote server search configuration. 158 | @@ -1926,10 +1881,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { 159 | /** 160 | * Indicates if the menu CFR should be displayed to the user. 161 | */ 162 | - var shouldShowMenuCFR by booleanPreference( 163 | - key = appContext.getPreferenceKey(R.string.pref_key_menu_cfr), 164 | - default = true, 165 | - ) 166 | + var shouldShowMenuCFR = false 167 | 168 | /** 169 | * Get the current mode for how https-only is enabled. 170 | -------------------------------------------------------------------------------- /patches/disable-csp-reporting.patch: -------------------------------------------------------------------------------- 1 | diff --git a/dom/security/nsCSPContext.cpp b/dom/security/nsCSPContext.cpp 2 | index e3fb7b6e9a..81a42f99b0 100644 3 | --- a/dom/security/nsCSPContext.cpp 4 | +++ b/dom/security/nsCSPContext.cpp 5 | @@ -1218,7 +1218,6 @@ nsresult nsCSPContext::SendReports( 6 | 7 | //[Deprecated] CSP Level 2 Reporting 8 | if (!reportURIs.IsEmpty()) { 9 | - return SendReportsToURIs(reportURIs, aViolationEventInit); 10 | } 11 | 12 | return NS_OK; 13 | -------------------------------------------------------------------------------- /patches/disable-default-browser-engagement-prompts.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 2 | index 72493a2c21..024440d98a 100644 3 | --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 4 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 5 | @@ -800,12 +800,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { 6 | * This will lead to a performance regression since that function can be expensive to call. 7 | */ 8 | fun checkIfFenixIsDefaultBrowserOnAppResume(): Boolean { 9 | - val prefKey = appContext.getPreferenceKey(R.string.pref_key_default_browser) 10 | - val isDefaultBrowserNow = isDefaultBrowserBlocking() 11 | - val wasDefaultBrowserOnLastResume = 12 | - this.preferences.getBoolean(prefKey, isDefaultBrowserNow) 13 | - this.preferences.edit { putBoolean(prefKey, isDefaultBrowserNow) } 14 | - return isDefaultBrowserNow && !wasDefaultBrowserOnLastResume 15 | + return false 16 | } 17 | 18 | /** 19 | @@ -817,40 +812,31 @@ class Settings(private val appContext: Context) : PreferencesHolder { 20 | return browsers.isDefaultBrowser 21 | } 22 | 23 | - var reEngagementNotificationShown by booleanPreference( 24 | - appContext.getPreferenceKey(R.string.pref_key_re_engagement_notification_shown), 25 | - default = false, 26 | - ) 27 | + var reEngagementNotificationShown = true 28 | 29 | /** 30 | * Check if we should set the re-engagement notification. 31 | */ 32 | fun shouldSetReEngagementNotification(): Boolean { 33 | - return numberOfAppLaunches <= 1 && !reEngagementNotificationShown 34 | + return false 35 | } 36 | 37 | /** 38 | * Check if we should show the re-engagement notification. 39 | */ 40 | fun shouldShowReEngagementNotification(): Boolean { 41 | - return !reEngagementNotificationShown && !isDefaultBrowserBlocking() 42 | + return false 43 | } 44 | 45 | /** 46 | * Indicates if the re-engagement notification feature is enabled 47 | */ 48 | - var reEngagementNotificationEnabled by lazyFeatureFlagPreference( 49 | - key = appContext.getPreferenceKey(R.string.pref_key_re_engagement_notification_enabled), 50 | - default = { FxNimbus.features.reEngagementNotification.value().enabled }, 51 | - featureFlag = true, 52 | - ) 53 | + var reEngagementNotificationEnabled = false 54 | 55 | /** 56 | * Indicates if the re-engagement notification feature is enabled 57 | */ 58 | - val reEngagementNotificationType: Int 59 | - get() = 60 | - FxNimbus.features.reEngagementNotification.value().type 61 | + val reEngagementNotificationType: Int = 0 62 | 63 | val shouldUseAutoBatteryTheme by booleanPreference( 64 | appContext.getPreferenceKey(R.string.pref_key_auto_battery_theme), 65 | @@ -2327,12 +2313,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { 66 | /** 67 | * Indicates if the Set as default Browser prompt should be displayed to the user. 68 | */ 69 | - val shouldShowSetAsDefaultPrompt: Boolean 70 | - get() = 71 | - (System.currentTimeMillis() - lastSetAsDefaultPromptShownTimeInMillis) > 72 | - DAYS_BETWEEN_DEFAULT_BROWSER_PROMPTS * ONE_DAY_MS && 73 | - numberOfSetAsDefaultPromptShownTimes < MAX_NUMBER_OF_DEFAULT_BROWSER_PROMPTS && 74 | - coldStartsBetweenSetAsDefaultPrompts >= APP_COLD_STARTS_TO_SHOW_DEFAULT_PROMPT 75 | + val shouldShowSetAsDefaultPrompt: Boolean = false 76 | 77 | /** 78 | * Updates the relevant settings when the "Set as Default Browser" prompt is shown. 79 | -------------------------------------------------------------------------------- /patches/disable-doh-canary.patch: -------------------------------------------------------------------------------- 1 | diff --git a/toolkit/components/doh/DoHHeuristics.sys.mjs b/toolkit/components/doh/DoHHeuristics.sys.mjs 2 | index fd39a9be17..6bc9650775 100644 3 | --- a/toolkit/components/doh/DoHHeuristics.sys.mjs 4 | +++ b/toolkit/components/doh/DoHHeuristics.sys.mjs 5 | @@ -29,7 +29,7 @@ ChromeUtils.defineESModuleGetters(lazy, { 6 | DoHConfigController: "resource://gre/modules/DoHConfig.sys.mjs", 7 | }); 8 | 9 | -const GLOBAL_CANARY = "use-application-dns.net."; 10 | +const GLOBAL_CANARY = ""; 11 | 12 | const NXDOMAIN_ERR = "NS_ERROR_UNKNOWN_HOST"; 13 | 14 | @@ -358,7 +358,7 @@ async function safeSearch() { 15 | } 16 | 17 | async function zscalerCanary() { 18 | - const ZSCALER_CANARY = "sitereview.zscaler.com."; 19 | + const ZSCALER_CANARY = ""; 20 | 21 | let { addresses } = await dnsLookup(ZSCALER_CANARY); 22 | for (let address of addresses) { 23 | -------------------------------------------------------------------------------- /patches/disable-geoip.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/android-components/components/service/location/src/main/java/mozilla/components/service/location/MozillaLocationService.kt b/mobile/android/android-components/components/service/location/src/main/java/mozilla/components/service/location/MozillaLocationService.kt 2 | index 8bea197568..1677b822ed 100644 3 | --- a/mobile/android/android-components/components/service/location/src/main/java/mozilla/components/service/location/MozillaLocationService.kt 4 | +++ b/mobile/android/android-components/components/service/location/src/main/java/mozilla/components/service/location/MozillaLocationService.kt 5 | @@ -25,10 +25,10 @@ import org.json.JSONObject 6 | import java.io.IOException 7 | import java.util.concurrent.TimeUnit 8 | 9 | -private const val GEOIP_SERVICE_URL = "https://location.services.mozilla.com/v1/" 10 | +private const val GEOIP_SERVICE_URL = "" 11 | private const val CONNECT_TIMEOUT_SECONDS = 10L 12 | private const val READ_TIMEOUT_SECONDS = 10L 13 | -private const val USER_AGENT = "MozAC/" + Build.version 14 | +private const val USER_AGENT = "" 15 | private const val EMPTY_REQUEST_BODY = "{}" 16 | private const val CACHE_FILE = "mozac.service.location.region" 17 | private const val KEY_COUNTRY_CODE = "country_code" 18 | @@ -94,7 +94,7 @@ class MozillaLocationService( 19 | * Check to see if the cache is still valid. 20 | */ 21 | private fun isCacheValid(): Boolean { 22 | - return currentTime() < context.cachedAt() + CACHE_LIFETIME_IN_MS 23 | + return true 24 | } 25 | 26 | private fun Context.cacheRegion(region: LocationService.Region) { 27 | -------------------------------------------------------------------------------- /patches/disable-hls.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/moz.configure b/mobile/android/moz.configure 2 | index c900501ee6..dba0c2ce55 100644 3 | --- a/mobile/android/moz.configure 4 | +++ b/mobile/android/moz.configure 5 | @@ -13,7 +13,7 @@ project_flag( 6 | project_flag( 7 | "MOZ_ANDROID_HLS_SUPPORT", 8 | help="Enable HLS (HTTP Live Streaming) support (currently using the ExoPlayer library)", 9 | - default=True, 10 | + default=False, 11 | ) 12 | 13 | option( 14 | -------------------------------------------------------------------------------- /patches/disable-link-sharing.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt 2 | index 64492271c3..48d4acfaed 100644 3 | --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt 4 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt 5 | @@ -751,7 +751,7 @@ class SettingsFragment : PreferenceFragmentCompat() { 6 | @VisibleForTesting 7 | internal fun setLinkSharingPreference() { 8 | with(requirePreference(R.string.pref_key_link_sharing)) { 9 | - isVisible = FxNimbus.features.sentFromFirefox.value().enabled 10 | + isVisible = false 11 | } 12 | } 13 | 14 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 15 | index 72493a2c21..7ee4d6c8ac 100644 16 | --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 17 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 18 | @@ -691,16 +691,9 @@ class Settings(private val appContext: Context) : PreferencesHolder { 19 | } 20 | } 21 | 22 | - var whatsappLinkSharingEnabled by lazyFeatureFlagPreference( 23 | - key = appContext.getPreferenceKey(R.string.pref_key_link_sharing), 24 | - featureFlag = true, 25 | - default = { FxNimbus.features.sentFromFirefox.value().enabled }, 26 | - ) 27 | + var whatsappLinkSharingEnabled = false 28 | 29 | - var linkSharingSettingsSnackbarShown by booleanPreference( 30 | - key = appContext.getPreferenceKey(R.string.pref_key_link_sharing_settings_snackbar), 31 | - default = false, 32 | - ) 33 | + var linkSharingSettingsSnackbarShown = true 34 | 35 | /** 36 | * Get the display string for the current open links in apps setting 37 | -------------------------------------------------------------------------------- /patches/disable-microsurveys.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt 2 | index b74145eb21..01386ed75d 100644 3 | --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt 4 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt 5 | @@ -251,8 +251,8 @@ class SecretSettingsFragment : PreferenceFragmentCompat() { 6 | } 7 | 8 | requirePreference(R.string.pref_key_microsurvey_feature_enabled).apply { 9 | - isVisible = true 10 | - isChecked = context.settings().microsurveyFeatureEnabled 11 | + isVisible = false 12 | + isChecked = false 13 | onPreferenceChangeListener = SharedPreferenceUpdater() 14 | } 15 | 16 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 17 | index 72493a2c21..b352a22247 100644 18 | --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 19 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 20 | @@ -2278,19 +2278,12 @@ class Settings(private val appContext: Context) : PreferencesHolder { 21 | /** 22 | * Indicates if the microsurvey feature is enabled. 23 | */ 24 | - var microsurveyFeatureEnabled by lazyFeatureFlagPreference( 25 | - key = appContext.getPreferenceKey(R.string.pref_key_microsurvey_feature_enabled), 26 | - default = { FxNimbus.features.microsurveys.value().enabled }, 27 | - featureFlag = true, 28 | - ) 29 | + var microsurveyFeatureEnabled = false 30 | 31 | /** 32 | * Indicates if a microsurvey should be shown to the user. 33 | */ 34 | - var shouldShowMicrosurveyPrompt by booleanPreference( 35 | - appContext.getPreferenceKey(R.string.pref_key_should_show_microsurvey_prompt), 36 | - default = false, 37 | - ) 38 | + var shouldShowMicrosurveyPrompt = false 39 | 40 | /** 41 | * Last time the Set as default Browser prompt has been displayed to the user. 42 | -------------------------------------------------------------------------------- /patches/disable-search-suggestions.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 2 | index 72493a2c21..d8f647227a 100644 3 | --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 4 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 5 | @@ -1153,7 +1153,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { 6 | 7 | val shouldShowSearchSuggestions by booleanPreference( 8 | appContext.getPreferenceKey(R.string.pref_key_show_search_suggestions), 9 | - default = true, 10 | + default = false, 11 | ) 12 | 13 | val shouldAutocompleteInAwesomebar by booleanPreference( 14 | @@ -1195,10 +1195,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { 15 | val shouldShowRecentSearchSuggestions: Boolean 16 | get() = recentSearchSuggestionsEnabled && isRecentSearchesVisible 17 | 18 | - var showSearchSuggestionsInPrivateOnboardingFinished by booleanPreference( 19 | - appContext.getPreferenceKey(R.string.pref_key_show_search_suggestions_in_private_onboarding), 20 | - default = false, 21 | - ) 22 | + var showSearchSuggestionsInPrivateOnboardingFinished = true 23 | 24 | fun incrementVisitedInstallableCount() = pwaInstallableVisitCount.increment() 25 | 26 | diff --git a/mobile/android/fenix/app/src/main/res/xml/search_settings_preferences.xml b/mobile/android/fenix/app/src/main/res/xml/search_settings_preferences.xml 27 | index f7ca109331..f9820e2f98 100644 28 | --- a/mobile/android/fenix/app/src/main/res/xml/search_settings_preferences.xml 29 | +++ b/mobile/android/fenix/app/src/main/res/xml/search_settings_preferences.xml 30 | @@ -27,7 +27,7 @@ 31 | android:layout="@layout/preference_category_no_icon_style"> 32 | 38 | 7 | 8 | 14 | 15 | 21 | 22 | 28 | 29 | 35 | 36 | 42 | 43 | 44 | ( 32 | + 0, 33 | + value.length, 34 | + Toolbar.RegistrableDomainColorSpan::class.java, 35 | + ) 36 | + 37 | + if (spans.size != 1) { 38 | + return 39 | + } 40 | + 41 | + val valueUntilRegistrableDomainEnd = value.subSequence(0, value.getSpanEnd(spans[0])) 42 | + 43 | + val urlViewWidth = urlView.getWidth() 44 | + val valueWidth = urlView.getPaint().measureText(valueUntilRegistrableDomainEnd.toString()) 45 | + 46 | + if (valueWidth > urlViewWidth) { 47 | + urlView.scrollTo((valueWidth - urlViewWidth).toInt(), 0) 48 | + } 49 | + } 50 | + } 51 | 52 | /** 53 | * Sets the colour of the text to be displayed when the URL of the toolbar is empty. 54 | diff --git a/mobile/android/android-components/components/concept/toolbar/src/main/java/mozilla/components/concept/toolbar/Toolbar.kt b/mobile/android/android-components/components/concept/toolbar/src/main/java/mozilla/components/concept/toolbar/Toolbar.kt 55 | index 77ffea44d7..8bdfaea7a5 100644 56 | --- a/mobile/android/android-components/components/concept/toolbar/src/main/java/mozilla/components/concept/toolbar/Toolbar.kt 57 | +++ b/mobile/android/android-components/components/concept/toolbar/src/main/java/mozilla/components/concept/toolbar/Toolbar.kt 58 | @@ -5,11 +5,13 @@ 59 | package mozilla.components.concept.toolbar 60 | 61 | import android.graphics.drawable.Drawable 62 | +import android.text.style.ForegroundColorSpan 63 | import android.view.View 64 | import android.view.View.NO_ID 65 | import android.view.ViewGroup 66 | import android.widget.ImageButton 67 | import android.widget.ImageView 68 | +import androidx.annotation.ColorInt 69 | import androidx.annotation.ColorRes 70 | import androidx.annotation.Dimension 71 | import androidx.annotation.Dimension.Companion.DP 72 | @@ -548,6 +550,13 @@ interface Toolbar : ScrollableToolbar { 73 | */ 74 | END, 75 | } 76 | + 77 | + /** 78 | + * Registrable domain foreground color span. 79 | + * 80 | + * This simple class extension is used so that we can filter for it elsewhere. 81 | + */ 82 | + class RegistrableDomainColorSpan(@ColorInt color: Int) : ForegroundColorSpan(color) 83 | } 84 | 85 | private fun AppCompatImageButton.setTintResource(@ColorRes tintColorResource: Int) { 86 | diff --git a/mobile/android/android-components/components/feature/toolbar/src/main/java/mozilla/components/feature/toolbar/internal/URLRenderer.kt b/mobile/android/android-components/components/feature/toolbar/src/main/java/mozilla/components/feature/toolbar/internal/URLRenderer.kt 87 | index 53dcdf7bb9..83762aac98 100644 88 | --- a/mobile/android/android-components/components/feature/toolbar/src/main/java/mozilla/components/feature/toolbar/internal/URLRenderer.kt 89 | +++ b/mobile/android/android-components/components/feature/toolbar/src/main/java/mozilla/components/feature/toolbar/internal/URLRenderer.kt 90 | @@ -98,16 +98,19 @@ private suspend fun SpannableStringBuilder.colorRegistrableDomain( 91 | 92 | val registrableDomain = configuration 93 | .publicSuffixList 94 | - .getPublicSuffixPlusOne(host) 95 | + .getPublicSuffixPlusOne(host.removeSuffix(".")) 96 | .await() ?: return 97 | 98 | - val index = url.indexOf(registrableDomain) 99 | - if (index == -1) { 100 | + val indexOfHost = url.indexOf(host) 101 | + val indexOfRegistrableDomain = host.lastIndexOf(registrableDomain) 102 | + if (indexOfHost == -1 || indexOfRegistrableDomain == -1) { 103 | return 104 | } 105 | 106 | + val index = indexOfHost + indexOfRegistrableDomain 107 | + 108 | setSpan( 109 | - ForegroundColorSpan(configuration.registrableDomainColor), 110 | + Toolbar.RegistrableDomainColorSpan(configuration.registrableDomainColor), 111 | index, 112 | index + registrableDomain.length, 113 | SPAN_INCLUSIVE_INCLUSIVE, 114 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarIntegration.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarIntegration.kt 115 | index 86b6454dac..16332ef912 100644 116 | --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarIntegration.kt 117 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarIntegration.kt 118 | @@ -60,6 +60,7 @@ abstract class ToolbarIntegration( 119 | urlRenderConfiguration = ToolbarFeature.UrlRenderConfiguration( 120 | context.components.publicSuffixList, 121 | context.getColorFromAttr(R.attr.textPrimary), 122 | + context.getColorFromAttr(R.attr.textSecondary), 123 | renderStyle = renderStyle, 124 | ), 125 | ) 126 | @@ -142,7 +143,7 @@ class DefaultToolbarIntegration( 127 | interactor = interactor, 128 | customTabId = customTabId, 129 | isPrivate = isPrivate, 130 | - renderStyle = ToolbarFeature.RenderStyle.UncoloredUrl, 131 | + renderStyle = ToolbarFeature.RenderStyle.ColoredUrl, 132 | ) { 133 | 134 | @VisibleForTesting 135 | -------------------------------------------------------------------------------- /patches/enable-light-mode-by-default.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 2 | index 72493a2c21..1a0c14ddbb 100644 3 | --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 4 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 5 | @@ -455,7 +455,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { 6 | 7 | var shouldUseLightTheme by booleanPreference( 8 | appContext.getPreferenceKey(R.string.pref_key_light_theme), 9 | - default = false, 10 | + default = true, 11 | ) 12 | 13 | var shouldUseAutoSize by booleanPreference( 14 | diff --git a/mobile/android/fenix/app/src/main/res/xml/customization_preferences.xml b/mobile/android/fenix/app/src/main/res/xml/customization_preferences.xml 15 | index a24d1b7b2b..ea441ea576 100644 16 | --- a/mobile/android/fenix/app/src/main/res/xml/customization_preferences.xml 17 | +++ b/mobile/android/fenix/app/src/main/res/xml/customization_preferences.xml 18 | @@ -10,7 +10,7 @@ 19 | android:title="@string/preferences_theme" 20 | app:iconSpaceReserved="false"> 21 | 26 | 27 | @@ -26,7 +26,7 @@ 28 | app:isPreferenceVisible="@bool/underAPI28" /> 29 | 30 | 36 | -------------------------------------------------------------------------------- /patches/expose-aboutconfig.patch: -------------------------------------------------------------------------------- 1 | diff --git a/docshell/base/nsAboutRedirector.cpp b/docshell/base/nsAboutRedirector.cpp 2 | index 77491402cb..fc64d6c537 100644 3 | --- a/docshell/base/nsAboutRedirector.cpp 4 | +++ b/docshell/base/nsAboutRedirector.cpp 5 | @@ -101,8 +101,7 @@ static const RedirEntry kRedirMap[] = { 6 | nsIAboutModule::IS_SECURE_CHROME_UI}, 7 | #else 8 | {"config", "chrome://geckoview/content/config.xhtml", 9 | - nsIAboutModule::IS_SECURE_CHROME_UI | 10 | - nsIAboutModule::HIDE_FROM_ABOUTABOUT}, 11 | + nsIAboutModule::IS_SECURE_CHROME_UI}, 12 | #endif 13 | #ifdef MOZ_CRASHREPORTER 14 | {"crashes", "chrome://global/content/crashes.html", 15 | -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/ic_launcher-web.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/ic_launcher-web.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/ic_launcher_private-web.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/ic_launcher_private-web.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-hdpi/fenix_search_widget.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-hdpi/fenix_search_widget.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-hdpi/ic_logo_wordmark_normal.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-hdpi/ic_logo_wordmark_normal.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-hdpi/ic_logo_wordmark_private.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-hdpi/ic_logo_wordmark_private.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-hdpi/ic_wordmark_logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-hdpi/ic_wordmark_logo.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-hdpi/ic_wordmark_text_normal.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-hdpi/ic_wordmark_text_normal.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-hdpi/ic_wordmark_text_private.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-hdpi/ic_wordmark_text_private.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-mdpi/ic_logo_wordmark_normal.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-mdpi/ic_logo_wordmark_normal.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-mdpi/ic_logo_wordmark_private.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-mdpi/ic_logo_wordmark_private.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-mdpi/ic_wordmark_logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-mdpi/ic_wordmark_logo.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-mdpi/ic_wordmark_text_normal.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-mdpi/ic_wordmark_text_normal.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-mdpi/ic_wordmark_text_private.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-mdpi/ic_wordmark_text_private.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-xhdpi/ic_logo_wordmark_normal.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-xhdpi/ic_logo_wordmark_normal.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-xhdpi/ic_logo_wordmark_private.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-xhdpi/ic_logo_wordmark_private.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-xhdpi/ic_wordmark_logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-xhdpi/ic_wordmark_logo.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-xhdpi/ic_wordmark_text_normal.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-xhdpi/ic_wordmark_text_normal.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-xhdpi/ic_wordmark_text_private.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-xhdpi/ic_wordmark_text_private.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-xxhdpi/ic_logo_wordmark_normal.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-xxhdpi/ic_logo_wordmark_normal.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-xxhdpi/ic_logo_wordmark_private.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-xxhdpi/ic_logo_wordmark_private.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-xxhdpi/ic_wordmark_logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-xxhdpi/ic_wordmark_logo.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-xxhdpi/ic_wordmark_text_normal.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-xxhdpi/ic_wordmark_text_normal.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-xxhdpi/ic_wordmark_text_private.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-xxhdpi/ic_wordmark_text_private.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-xxxhdpi/ic_logo_wordmark_normal.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-xxxhdpi/ic_logo_wordmark_normal.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-xxxhdpi/ic_logo_wordmark_private.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-xxxhdpi/ic_logo_wordmark_private.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-xxxhdpi/ic_wordmark_logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-xxxhdpi/ic_wordmark_logo.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-xxxhdpi/ic_wordmark_text_normal.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-xxxhdpi/ic_wordmark_text_normal.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable-xxxhdpi/ic_wordmark_text_private.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/drawable-xxxhdpi/ic_wordmark_text_private.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 11 | 13 | 14 | 20 | 21 | 22 | 23 | 24 | 25 | 28 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable/ic_launcher_monochrome.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 12 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/drawable/ic_launcher_private_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 11 | 13 | 14 | 20 | 21 | 22 | 23 | 24 | 25 | 28 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-anydpi-v26/ic_launcher_private.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-anydpi-v26/ic_launcher_private_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-hdpi/ic_launcher_private.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/mipmap-hdpi/ic_launcher_private.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-hdpi/ic_launcher_private_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/mipmap-hdpi/ic_launcher_private_round.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-mdpi/ic_launcher_private.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/mipmap-mdpi/ic_launcher_private.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-mdpi/ic_launcher_private_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/mipmap-mdpi/ic_launcher_private_round.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-xhdpi/ic_launcher_private.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/mipmap-xhdpi/ic_launcher_private.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-xhdpi/ic_launcher_private_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/mipmap-xhdpi/ic_launcher_private_round.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-xxhdpi/ic_launcher_private.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/mipmap-xxhdpi/ic_launcher_private.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-xxhdpi/ic_launcher_private_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/mipmap-xxhdpi/ic_launcher_private_round.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-xxxhdpi/ic_launcher_private.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/mipmap-xxxhdpi/ic_launcher_private.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-xxxhdpi/ic_launcher_private_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/mipmap-xxxhdpi/ic_launcher_private_round.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/branding/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #ffffff 4 | 5 | -------------------------------------------------------------------------------- /patches/fenix-overlay/branding/res/values/ic_launcher_private_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #ffffff 4 | 5 | -------------------------------------------------------------------------------- /patches/fenix-overlay/initial_experiments/initial_experiments.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/fenix-overlay/initial_experiments/initial_experiments.json -------------------------------------------------------------------------------- /patches/force-enable-zoom.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 2 | index 8e271198b0..e4a1f9d7ee 100644 3 | --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 4 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 5 | @@ -215,7 +215,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { 6 | 7 | var forceEnableZoom by booleanPreference( 8 | appContext.getPreferenceKey(R.string.pref_key_accessibility_force_enable_zoom), 9 | - default = false, 10 | + default = true, 11 | ) 12 | 13 | var adjustCampaignId by stringPreference( 14 | diff --git a/mobile/android/fenix/app/src/main/res/xml/accessibility_preferences.xml b/mobile/android/fenix/app/src/main/res/xml/accessibility_preferences.xml 15 | index a810f76208..adba5368b6 100644 16 | --- a/mobile/android/fenix/app/src/main/res/xml/accessibility_preferences.xml 17 | +++ b/mobile/android/fenix/app/src/main/res/xml/accessibility_preferences.xml 18 | @@ -24,7 +24,7 @@ 19 | app:seekBarIncrement="1" 20 | app:showSeekBarValue="true" /> 21 | * mVector; 25 | } mArray[2]; 26 | -------------------------------------------------------------------------------- /patches/gecko-liberate.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/geckoview/build.gradle b/mobile/android/geckoview/build.gradle 2 | index 4afaf2493b..458ef0d0b1 100644 3 | --- a/mobile/android/geckoview/build.gradle 4 | +++ b/mobile/android/geckoview/build.gradle 5 | @@ -218,7 +218,7 @@ dependencies { 6 | implementation libs.androidx.collection 7 | implementation libs.androidx.core 8 | 9 | - implementation libs.play.services.fido 10 | + implementation "org.microg.gms:play-services-fido:v0.0.0.250932" 11 | implementation "org.yaml:snakeyaml:2.2" 12 | 13 | implementation libs.androidx.lifecycle.common 14 | diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/WebAuthnTokenManager.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/WebAuthnTokenManager.java 15 | index d688ff87f2..80b049ccac 100644 16 | --- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/WebAuthnTokenManager.java 17 | +++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/WebAuthnTokenManager.java 18 | @@ -193,27 +193,14 @@ import org.mozilla.gecko.util.WebAuthnUtils; 19 | 20 | final Task intentTask; 21 | 22 | - if (BuildConfig.MOZILLA_OFFICIAL) { 23 | - // Certain Fenix builds and signing keys are whitelisted for Web Authentication. 24 | - // See https://wiki.mozilla.org/Security/Web_Authentication 25 | - // 26 | - // Third party apps will need to get whitelisted themselves. 27 | - final Fido2PrivilegedApiClient fidoClient = 28 | - Fido.getFido2PrivilegedApiClient(GeckoAppShell.getApplicationContext()); 29 | - 30 | - intentTask = fidoClient.getRegisterPendingIntent(browserOptions); 31 | - } else { 32 | - // For non-official builds, websites have to opt-in to permit the 33 | - // particular version of Gecko to perform WebAuthn operations on 34 | - // them. See https://developers.google.com/digital-asset-links 35 | - // for the general form, and Step 1 of 36 | - // https://developers.google.com/identity/fido/android/native-apps 37 | - // for details about doing this correctly for the FIDO2 API. 38 | - final Fido2ApiClient fidoClient = 39 | - Fido.getFido2ApiClient(GeckoAppShell.getApplicationContext()); 40 | - 41 | - intentTask = fidoClient.getRegisterPendingIntent(requestOptions); 42 | - } 43 | + // The privileged FIDO2 API normally is restricted to apps with package 44 | + // names and signatures that Google knows to be a browser. microG does not 45 | + // have such a list, instead it asks the user to confirm that the app doing 46 | + // the request is indeed a browser app (only for the first request from 47 | + // that app). 48 | + final Fido2PrivilegedApiClient fidoClient = 49 | + Fido.getFido2PrivilegedApiClient(GeckoAppShell.getApplicationContext()); 50 | + intentTask = fidoClient.getRegisterPendingIntent(browserOptions); 51 | 52 | intentTask.addOnSuccessListener( 53 | pendingIntent -> { 54 | @@ -411,19 +398,12 @@ import org.mozilla.gecko.util.WebAuthnUtils; 55 | .build(); 56 | 57 | final Task intentTask; 58 | - // See the makeCredential method for documentation about this 59 | - // conditional. 60 | - if (BuildConfig.MOZILLA_OFFICIAL) { 61 | - final Fido2PrivilegedApiClient fidoClient = 62 | - Fido.getFido2PrivilegedApiClient(GeckoAppShell.getApplicationContext()); 63 | - 64 | - intentTask = fidoClient.getSignPendingIntent(browserOptions); 65 | - } else { 66 | - final Fido2ApiClient fidoClient = 67 | - Fido.getFido2ApiClient(GeckoAppShell.getApplicationContext()); 68 | + // See the makeCredential method for documentation about the FIDO2 API and 69 | + // microG. 70 | + final Fido2PrivilegedApiClient fidoClient = 71 | + Fido.getFido2PrivilegedApiClient(GeckoAppShell.getApplicationContext()); 72 | 73 | - intentTask = fidoClient.getSignPendingIntent(requestOptions); 74 | - } 75 | + intentTask = fidoClient.getSignPendingIntent(browserOptions); 76 | 77 | intentTask.addOnSuccessListener( 78 | pendingIntent -> { 79 | @@ -557,15 +537,9 @@ import org.mozilla.gecko.util.WebAuthnUtils; 80 | @WrapForJNI(calledFrom = "gecko") 81 | private static GeckoResult webAuthnIsUserVerifyingPlatformAuthenticatorAvailable() { 82 | final Task task; 83 | - if (BuildConfig.MOZILLA_OFFICIAL) { 84 | - final Fido2PrivilegedApiClient fidoClient = 85 | - Fido.getFido2PrivilegedApiClient(GeckoAppShell.getApplicationContext()); 86 | - task = fidoClient.isUserVerifyingPlatformAuthenticatorAvailable(); 87 | - } else { 88 | - final Fido2ApiClient fidoClient = 89 | - Fido.getFido2ApiClient(GeckoAppShell.getApplicationContext()); 90 | - task = fidoClient.isUserVerifyingPlatformAuthenticatorAvailable(); 91 | - } 92 | + final Fido2PrivilegedApiClient fidoClient = 93 | + Fido.getFido2PrivilegedApiClient(GeckoAppShell.getApplicationContext()); 94 | + task = fidoClient.isUserVerifyingPlatformAuthenticatorAvailable(); 95 | 96 | final GeckoResult res = new GeckoResult<>(); 97 | task.addOnSuccessListener( 98 | diff --git a/toolkit/content/jar.mn b/toolkit/content/jar.mn 99 | index d3c34b7de2..7874643f0a 100644 100 | --- a/toolkit/content/jar.mn 101 | +++ b/toolkit/content/jar.mn 102 | @@ -158,9 +158,6 @@ toolkit.jar: 103 | #ifdef XP_MACOSX 104 | content/global/macWindowMenu.js 105 | #endif 106 | - content/global/gmp-sources/openh264.json (gmp-sources/openh264.json) 107 | - content/global/gmp-sources/widevinecdm.json (gmp-sources/widevinecdm.json) 108 | - content/global/gmp-sources/widevinecdm_l1.json (gmp-sources/widevinecdm_l1.json) 109 | 110 | # Third party files 111 | content/global/third_party/d3/d3.js (/third_party/js/d3/d3.js) 112 | -------------------------------------------------------------------------------- /patches/gecko-overlay/branding/ironfox/configure.sh: -------------------------------------------------------------------------------- 1 | # This Source Code Form is subject to the terms of the Mozilla Public 2 | # License, v. 2.0. If a copy of the MPL was not distributed with this 3 | # file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 | 5 | ANDROID_PACKAGE_NAME=org.ironfoxoss.ironfox 6 | MOZ_APP_DISPLAYNAME=IronFox 7 | MOZ_APP_REMOTINGNAME=ironfox 8 | -------------------------------------------------------------------------------- /patches/gecko-overlay/branding/ironfox/content/favicon32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/gecko-overlay/branding/ironfox/content/favicon32.png -------------------------------------------------------------------------------- /patches/gecko-overlay/branding/ironfox/content/favicon64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ironfox-oss/IronFox/a4ff4bc86e5191376db533ad308c8792a1fe2279/patches/gecko-overlay/branding/ironfox/content/favicon64.png -------------------------------------------------------------------------------- /patches/gecko-overlay/branding/ironfox/content/jar.mn: -------------------------------------------------------------------------------- 1 | # This Source Code Form is subject to the terms of the Mozilla Public 2 | # License, v. 2.0. If a copy of the MPL was not distributed with this 3 | # file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 | 5 | geckoview.jar: 6 | % content branding %content/branding/ contentaccessible=yes 7 | content/branding/favicon32.png (favicon32.png) 8 | content/branding/favicon64.png (favicon64.png) 9 | -------------------------------------------------------------------------------- /patches/gecko-overlay/branding/ironfox/content/moz.build: -------------------------------------------------------------------------------- 1 | # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- 2 | # vim: set filetype=python: 3 | # This Source Code Form is subject to the terms of the Mozilla Public 4 | # License, v. 2.0. If a copy of the MPL was not distributed with this 5 | # file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 | 7 | JAR_MANIFESTS += ["jar.mn"] 8 | -------------------------------------------------------------------------------- /patches/gecko-overlay/branding/ironfox/locales/en-US/brand.ftl: -------------------------------------------------------------------------------- 1 | # This Source Code Form is subject to the terms of the Mozilla Public 2 | # License, v. 2.0. If a copy of the MPL was not distributed with this 3 | # file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 | 5 | -brand-full-name = IronFox 6 | -brand-product-name = IronFox 7 | -brand-short-name = IronFox 8 | -brand-shortcut-name = IronFox 9 | -brand-shorter-name = IronFox 10 | -vendor-short-name = IronFox OSS 11 | -------------------------------------------------------------------------------- /patches/gecko-overlay/branding/ironfox/locales/en-US/brand.properties: -------------------------------------------------------------------------------- 1 | # This Source Code Form is subject to the terms of the Mozilla Public 2 | # License, v. 2.0. If a copy of the MPL was not distributed with this 3 | # file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 | 5 | brandFullName=IronFox 6 | brandShorterName=IronFox 7 | brandShortName=IronFox 8 | -------------------------------------------------------------------------------- /patches/gecko-overlay/branding/ironfox/locales/jar.mn: -------------------------------------------------------------------------------- 1 | #filter substitution 2 | # This Source Code Form is subject to the terms of the Mozilla Public 3 | # License, v. 2.0. If a copy of the MPL was not distributed with this 4 | # file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 | 6 | [localization] @AB_CD@.jar: 7 | branding (%*.ftl) 8 | 9 | @AB_CD@.jar: 10 | % locale branding @AB_CD@ %locale/branding/ 11 | locale/branding/brand.properties (en-US/brand.properties) 12 | -------------------------------------------------------------------------------- /patches/gecko-overlay/branding/ironfox/locales/moz.build: -------------------------------------------------------------------------------- 1 | # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- 2 | # vim: set filetype=python: 3 | # This Source Code Form is subject to the terms of the Mozilla Public 4 | # License, v. 2.0. If a copy of the MPL was not distributed with this 5 | # file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 | 7 | JAR_MANIFESTS += ["jar.mn"] 8 | -------------------------------------------------------------------------------- /patches/gecko-overlay/branding/ironfox/moz.build: -------------------------------------------------------------------------------- 1 | # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- 2 | # vim: set filetype=python: 3 | # This Source Code Form is subject to the terms of the Mozilla Public 4 | # License, v. 2.0. If a copy of the MPL was not distributed with this 5 | # file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 | 7 | DIRS += ["content", "locales"] 8 | -------------------------------------------------------------------------------- /patches/gecko-overlay/rfptargets/RFPTargetsDefault.inc: -------------------------------------------------------------------------------- 1 | /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 | /* This Source Code Form is subject to the terms of the Mozilla Public 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this 4 | * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ 5 | 6 | ANDROID_DEFAULT(AudioContext) 7 | ANDROID_DEFAULT(AudioSampleRate) 8 | ANDROID_DEFAULT(CanvasExtractionFromThirdPartiesIsBlocked) 9 | ANDROID_DEFAULT(CanvasRandomization) 10 | ANDROID_DEFAULT(CSSColorInfo) 11 | ANDROID_DEFAULT(CSSDeviceSize) 12 | ANDROID_DEFAULT(CSSInvertedColors) 13 | ANDROID_DEFAULT(CSSPointerCapabilities) 14 | ANDROID_DEFAULT(CSSPrefersContrast) 15 | ANDROID_DEFAULT(CSSPrefersReducedMotion) 16 | ANDROID_DEFAULT(CSSPrefersReducedTransparency) 17 | ANDROID_DEFAULT(CSSResolution) 18 | ANDROID_DEFAULT(CSSVideoDynamicRange) 19 | ANDROID_DEFAULT(DeviceSensors) 20 | ANDROID_DEFAULT(DOMStyleOsxFontSmoothing) 21 | ANDROID_DEFAULT(FontVisibilityBaseSystem) 22 | ANDROID_DEFAULT(FontVisibilityLangPack) 23 | ANDROID_DEFAULT(FontVisibilityRestrictGenerics) 24 | ANDROID_DEFAULT(Gamepad) 25 | ANDROID_DEFAULT(HttpUserAgent) 26 | ANDROID_DEFAULT(JSDateTimeUTC) 27 | ANDROID_DEFAULT(JSLocale) 28 | ANDROID_DEFAULT(JSLocalePrompt) 29 | ANDROID_DEFAULT(JSMathFdlibm) 30 | ANDROID_DEFAULT(KeyboardEvents) 31 | ANDROID_DEFAULT(MediaCapabilities) 32 | ANDROID_DEFAULT(MediaDevices) 33 | ANDROID_DEFAULT(MediaError) 34 | ANDROID_DEFAULT(MouseEventScreenPoint) 35 | ANDROID_DEFAULT(NavigatorAppVersion) 36 | ANDROID_DEFAULT(NavigatorBuildID) 37 | ANDROID_DEFAULT(NavigatorConnection) 38 | ANDROID_DEFAULT(NavigatorHWConcurrency) 39 | ANDROID_DEFAULT(NavigatorOscpu) 40 | ANDROID_DEFAULT(NavigatorPlatform) 41 | ANDROID_DEFAULT(NavigatorUserAgent) 42 | ANDROID_DEFAULT(PointerEvents) 43 | ANDROID_DEFAULT(PointerId) 44 | ANDROID_DEFAULT(ReduceTimerPrecision) 45 | ANDROID_DEFAULT(RoundWindowSize) 46 | ANDROID_DEFAULT(ScreenAvailRect) 47 | ANDROID_DEFAULT(ScreenOrientation) 48 | ANDROID_DEFAULT(ScreenPixelDepth) 49 | ANDROID_DEFAULT(ScreenRect) 50 | ANDROID_DEFAULT(SiteSpecificZoom) 51 | ANDROID_DEFAULT(SpeechSynthesis) 52 | ANDROID_DEFAULT(StreamVideoFacingMode) 53 | ANDROID_DEFAULT(TouchEvents) 54 | ANDROID_DEFAULT(UseStandinsForNativeColors) 55 | ANDROID_DEFAULT(VideoElementMozFrameDelay) 56 | ANDROID_DEFAULT(VideoElementMozFrames) 57 | ANDROID_DEFAULT(VideoElementPlaybackQuality) 58 | ANDROID_DEFAULT(WebGLRenderCapability) 59 | ANDROID_DEFAULT(WebGLRenderInfo) 60 | ANDROID_DEFAULT(WebGPUIsFallbackAdapter) 61 | ANDROID_DEFAULT(WebGPULimits) 62 | ANDROID_DEFAULT(WebGPUSubgroupSizes) 63 | ANDROID_DEFAULT(WebVTT) 64 | ANDROID_DEFAULT(WidgetEvents) 65 | ANDROID_DEFAULT(WindowDevicePixelRatio) 66 | ANDROID_DEFAULT(WindowInnerScreenXY) 67 | ANDROID_DEFAULT(WindowOuterSize) 68 | ANDROID_DEFAULT(WindowScreenXY) 69 | -------------------------------------------------------------------------------- /patches/global-privacy-control.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/fenix/app/src/main/res/xml/tracking_protection_preferences.xml b/mobile/android/fenix/app/src/main/res/xml/tracking_protection_preferences.xml 2 | index 2760c9c367..8b8902e0c2 100644 3 | --- a/mobile/android/fenix/app/src/main/res/xml/tracking_protection_preferences.xml 4 | +++ b/mobile/android/fenix/app/src/main/res/xml/tracking_protection_preferences.xml 5 | @@ -93,7 +93,8 @@ 6 | 10 | + android:title="@string/preference_enhanced_tracking_protection_custom_global_privacy_control" 11 | + app:isPreferenceVisible="false" /> 12 | 15 | -------------------------------------------------------------------------------- /patches/harden-pdfjs.patch: -------------------------------------------------------------------------------- 1 | diff --git a/toolkit/components/pdfjs/content/build/pdf.mjs b/toolkit/components/pdfjs/content/build/pdf.mjs 2 | index d2af6ba929..335f8cfd5c 100644 3 | --- a/toolkit/components/pdfjs/content/build/pdf.mjs 4 | +++ b/toolkit/components/pdfjs/content/build/pdf.mjs 5 | @@ -456,19 +456,14 @@ function isLittleEndian() { 6 | return view32[0] === 1; 7 | } 8 | function isEvalSupported() { 9 | - try { 10 | - new Function(""); 11 | - return true; 12 | - } catch { 13 | - return false; 14 | - } 15 | + return false; 16 | } 17 | class util_FeatureTest { 18 | static get isLittleEndian() { 19 | return shadow(this, "isLittleEndian", isLittleEndian()); 20 | } 21 | static get isEvalSupported() { 22 | - return shadow(this, "isEvalSupported", isEvalSupported()); 23 | + return false; 24 | } 25 | static get isOffscreenCanvasSupported() { 26 | return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined"); 27 | @@ -10010,7 +10005,7 @@ function getDocument(src = {}) { 28 | const { 29 | docId 30 | } = task; 31 | - const url = src.url ? getUrlProp(src.url) : null; 32 | + const url = "resource://placeholder.pdf"; 33 | const data = src.data ? getDataProp(src.data) : null; 34 | const httpHeaders = src.httpHeaders || null; 35 | const withCredentials = src.withCredentials === true; 36 | @@ -10020,17 +10015,17 @@ function getDocument(src = {}) { 37 | let worker = src.worker instanceof PDFWorker ? src.worker : null; 38 | const verbosity = src.verbosity; 39 | const docBaseUrl = typeof src.docBaseUrl === "string" && !isDataScheme(src.docBaseUrl) ? src.docBaseUrl : null; 40 | - const cMapUrl = getFactoryUrlProp(src.cMapUrl); 41 | - const cMapPacked = src.cMapPacked !== false; 42 | + const cMapUrl = "resource://pdf.js/web/cmaps/"; 43 | + const cMapPacked = true; 44 | const CMapReaderFactory = src.CMapReaderFactory || DOMCMapReaderFactory; 45 | const iccUrl = getFactoryUrlProp(src.iccUrl); 46 | - const standardFontDataUrl = getFactoryUrlProp(src.standardFontDataUrl); 47 | + const standardFontDataUrl = "resource://pdf.js/web/standard_fonts/"; 48 | const StandardFontDataFactory = src.StandardFontDataFactory || DOMStandardFontDataFactory; 49 | - const wasmUrl = getFactoryUrlProp(src.wasmUrl); 50 | + const wasmUrl = "resource://pdf.js/web/wasm/"; 51 | const WasmFactory = src.WasmFactory || DOMWasmFactory; 52 | const ignoreErrors = src.stopAtErrors !== true; 53 | const maxImageSize = Number.isInteger(src.maxImageSize) && src.maxImageSize > -1 ? src.maxImageSize : -1; 54 | - const isEvalSupported = src.isEvalSupported !== false; 55 | + const isEvalSupported = false; 56 | const isOffscreenCanvasSupported = typeof src.isOffscreenCanvasSupported === "boolean" ? src.isOffscreenCanvasSupported : !isNodeJS; 57 | const isImageDecoderSupported = typeof src.isImageDecoderSupported === "boolean" ? src.isImageDecoderSupported : true; 58 | const canvasMaxAreaInBytes = Number.isInteger(src.canvasMaxAreaInBytes) ? src.canvasMaxAreaInBytes : -1; 59 | @@ -10047,7 +10042,7 @@ function getDocument(src = {}) { 60 | const enableHWA = src.enableHWA === true; 61 | const useWasm = src.useWasm !== false; 62 | const length = rangeTransport ? rangeTransport.length : src.length ?? NaN; 63 | - const useSystemFonts = typeof src.useSystemFonts === "boolean" ? src.useSystemFonts : !isNodeJS && !disableFontFace; 64 | + const useSystemFonts = false; 65 | const useWorkerFetch = typeof src.useWorkerFetch === "boolean" ? src.useWorkerFetch : true; 66 | const styleElement = null; 67 | setVerbosityLevel(verbosity); 68 | diff --git a/toolkit/components/pdfjs/content/build/pdf.worker.mjs b/toolkit/components/pdfjs/content/build/pdf.worker.mjs 69 | index 28157acd51..bee8773aec 100644 70 | --- a/toolkit/components/pdfjs/content/build/pdf.worker.mjs 71 | +++ b/toolkit/components/pdfjs/content/build/pdf.worker.mjs 72 | @@ -456,19 +456,14 @@ function isLittleEndian() { 73 | return view32[0] === 1; 74 | } 75 | function isEvalSupported() { 76 | - try { 77 | - new Function(""); 78 | - return true; 79 | - } catch { 80 | - return false; 81 | - } 82 | + return false; 83 | } 84 | class FeatureTest { 85 | static get isLittleEndian() { 86 | return shadow(this, "isLittleEndian", isLittleEndian()); 87 | } 88 | static get isEvalSupported() { 89 | - return shadow(this, "isEvalSupported", isEvalSupported()); 90 | + return false; 91 | } 92 | static get isOffscreenCanvasSupported() { 93 | return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined"); 94 | @@ -28637,10 +28632,10 @@ class GlobalImageCache { 95 | class PDFFunctionFactory { 96 | constructor({ 97 | xref, 98 | - isEvalSupported = true 99 | + isEvalSupported = false 100 | }) { 101 | this.xref = xref; 102 | - this.isEvalSupported = isEvalSupported !== false; 103 | + this.isEvalSupported = false; 104 | } 105 | create(fn, parseArray = false) { 106 | let fnRef, parsedFn; 107 | @@ -30973,18 +30968,18 @@ const DefaultPartialEvaluatorOptions = Object.freeze({ 108 | maxImageSize: -1, 109 | disableFontFace: false, 110 | ignoreErrors: false, 111 | - isEvalSupported: true, 112 | + isEvalSupported: false, 113 | isOffscreenCanvasSupported: false, 114 | isImageDecoderSupported: false, 115 | canvasMaxAreaInBytes: -1, 116 | fontExtraProperties: false, 117 | - useSystemFonts: true, 118 | + useSystemFonts: false, 119 | useWasm: true, 120 | useWorkerFetch: true, 121 | - cMapUrl: null, 122 | + cMapUrl: "resource://pdf.js/web/cmaps/", 123 | iccUrl: null, 124 | - standardFontDataUrl: null, 125 | - wasmUrl: null 126 | + standardFontDataUrl: "resource://pdf.js/web/cmaps/", 127 | + wasmUrl: "resource://pdf.js/web/wasm/" 128 | }); 129 | const PatternType = { 130 | TILING: 1, 131 | diff --git a/toolkit/components/pdfjs/content/web/viewer-geckoview.html b/toolkit/components/pdfjs/content/web/viewer-geckoview.html 132 | index 5e0a113820..e89114242e 100644 133 | --- a/toolkit/components/pdfjs/content/web/viewer-geckoview.html 134 | +++ b/toolkit/components/pdfjs/content/web/viewer-geckoview.html 135 | @@ -23,6 +23,7 @@ See https://github.com/adobe-type-tools/cmap-resources 136 | 137 | 138 | 139 | + 140 | 141 | PDF.js viewer 142 | 143 | diff --git a/toolkit/components/pdfjs/content/web/viewer-geckoview.mjs b/toolkit/components/pdfjs/content/web/viewer-geckoview.mjs 144 | index 167c6472f4..553ab04b37 100644 145 | --- a/toolkit/components/pdfjs/content/web/viewer-geckoview.mjs 146 | +++ b/toolkit/components/pdfjs/content/web/viewer-geckoview.mjs 147 | @@ -824,7 +824,7 @@ const defaultOptions = { 148 | kind: OptionKind.API 149 | }, 150 | isEvalSupported: { 151 | - value: true, 152 | + value: false, 153 | kind: OptionKind.API 154 | }, 155 | isOffscreenCanvasSupported: { 156 | -------------------------------------------------------------------------------- /patches/https_only.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 2 | index 72493a2c21..cff0c52e9d 100644 3 | --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 4 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 5 | @@ -734,7 +734,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { 6 | 7 | var shouldUseHttpsOnly by booleanPreference( 8 | appContext.getPreferenceKey(R.string.pref_key_https_only), 9 | - default = false, 10 | + default = true, 11 | ) 12 | 13 | var shouldUseHttpsOnlyInAllTabs by booleanPreference( 14 | -------------------------------------------------------------------------------- /patches/include-fonts.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/moz.configure b/mobile/android/moz.configure 2 | index c900501ee6..99a3b38bdd 100644 3 | --- a/mobile/android/moz.configure 4 | +++ b/mobile/android/moz.configure 5 | @@ -7,7 +7,7 @@ 6 | project_flag( 7 | "MOZ_ANDROID_EXCLUDE_FONTS", 8 | help="Whether to exclude font files from the build", 9 | - default=True, 10 | + default=False, 11 | ) 12 | 13 | project_flag( 14 | -------------------------------------------------------------------------------- /patches/install-ublock.patch: -------------------------------------------------------------------------------- 1 | From 51f108b2abb8808bc7196d6b7e7b4d46aaeb9013 Mon Sep 17 00:00:00 2001 2 | From: Akash Yadav 3 | Date: Mon, 28 Apr 2025 11:33:58 +0530 4 | Subject: [PATCH] fix(patches): update 'install-ublock.patch' for 5 | 'FIREFOX_138_0_BUILD1' 6 | 7 | Signed-off-by: Akash Yadav 8 | --- 9 | .../extension/WebExtensionPromptFeature.kt | 21 ++++++++++++ 10 | .../fenix/onboarding/OnboardingFragment.kt | 7 ++++ 11 | .../org/mozilla/fenix/utils/AddonUtils.kt | 34 +++++++++++++++++++ 12 | 3 files changed, 62 insertions(+) 13 | create mode 100644 mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/AddonUtils.kt 14 | 15 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/extension/WebExtensionPromptFeature.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/extension/WebExtensionPromptFeature.kt 16 | index 82e44d1abc..fe2c0dd3e3 100644 17 | --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/extension/WebExtensionPromptFeature.kt 18 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/extension/WebExtensionPromptFeature.kt 19 | @@ -121,6 +121,9 @@ class WebExtensionPromptFeature( 20 | private fun handlePostInstallationRequest( 21 | addon: Addon, 22 | ) { 23 | + if (org.mozilla.fenix.utils.isUBlock(addon)) { 24 | + return 25 | + } 26 | showPostInstallationDialog(addon) 27 | } 28 | 29 | @@ -128,6 +131,15 @@ class WebExtensionPromptFeature( 30 | addon: Addon, 31 | promptRequest: WebExtensionPromptRequest.AfterInstallation.Permissions.Required, 32 | ) { 33 | + if (org.mozilla.fenix.utils.isUBlock(addon)) { 34 | + handlePermissions( 35 | + promptRequest = promptRequest, 36 | + granted = true, 37 | + privateBrowsingAllowed = true 38 | + ) 39 | + return 40 | + } 41 | + 42 | showPermissionDialog( 43 | addon = addon, 44 | promptRequest = promptRequest, 45 | @@ -141,6 +153,15 @@ class WebExtensionPromptFeature( 46 | addon: Addon, 47 | promptRequest: WebExtensionPromptRequest.AfterInstallation.Permissions.Optional, 48 | ) { 49 | + if (org.mozilla.fenix.utils.isUBlock(addon)) { 50 | + handlePermissions( 51 | + promptRequest = promptRequest, 52 | + granted = true, 53 | + privateBrowsingAllowed = true 54 | + ) 55 | + return 56 | + } 57 | + 58 | val shouldGrantWithoutPrompt = Addon.localizePermissions( 59 | promptRequest.permissions, 60 | context, 61 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingFragment.kt 62 | index 64d09acb1a..61599172ec 100644 63 | --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingFragment.kt 64 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingFragment.kt 65 | @@ -19,8 +19,10 @@ import androidx.annotation.RequiresApi 66 | import androidx.compose.runtime.Composable 67 | import androidx.compose.ui.platform.ComposeView 68 | import androidx.fragment.app.Fragment 69 | +import androidx.lifecycle.lifecycleScope 70 | import androidx.localbroadcastmanager.content.LocalBroadcastManager 71 | import androidx.navigation.fragment.findNavController 72 | +import kotlinx.coroutines.launch 73 | import mozilla.components.concept.engine.webextension.InstallationMethod 74 | import mozilla.components.service.nimbus.evalJexlSafe 75 | import mozilla.components.service.nimbus.messaging.use 76 | @@ -118,6 +120,11 @@ class OnboardingFragment : Fragment() { 77 | override fun onCreate(savedInstanceState: Bundle?) { 78 | super.onCreate(savedInstanceState) 79 | val context = requireContext() 80 | + 81 | + lifecycleScope.launch { 82 | + org.mozilla.fenix.utils.installIFAddons(requireComponents) 83 | + } 84 | + 85 | if (pagesToDisplay.isEmpty()) { 86 | /* do not continue if there's no onboarding pages to display */ 87 | onFinish(null) 88 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/AddonUtils.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/AddonUtils.kt 89 | new file mode 100644 90 | index 0000000000..da5f74b77f 91 | --- /dev/null 92 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/AddonUtils.kt 93 | @@ -0,0 +1,34 @@ 94 | +package org.mozilla.fenix.utils 95 | + 96 | +import kotlinx.coroutines.Dispatchers 97 | +import kotlinx.coroutines.withContext 98 | +import mozilla.components.concept.engine.webextension.InstallationMethod 99 | +import mozilla.components.feature.addons.Addon 100 | +import mozilla.components.feature.addons.logger 101 | +import org.mozilla.fenix.components.Components 102 | + 103 | +private val UBLOCK = Addon( 104 | + id = "uBlock0@raymondhill.net", 105 | + downloadUrl = "https://addons.mozilla.org/firefox/downloads/latest/uBlock0@raymondhill.net/latest.xpi" 106 | +) 107 | + 108 | +fun isUBlock(addon: Addon) = addon.id == UBLOCK.id 109 | + 110 | +suspend fun installIFAddons(components: Components) = withContext(Dispatchers.IO) { 111 | + val addonManager = components.addonManager 112 | + val addons = addonManager.getAddons(waitForPendingActions = true) 113 | + if (addons.none { it.id == UBLOCK.id && it.isInstalled() }) { 114 | + withContext(Dispatchers.Main) { 115 | + addonManager.installAddon( 116 | + url = UBLOCK.downloadUrl, 117 | + installationMethod = InstallationMethod.MANAGER, 118 | + onSuccess = { 119 | + logger.info("uBlock Origin installed.") 120 | + }, 121 | + onError = { err -> 122 | + logger.error("uBlock Origin install failed.", err) 123 | + } 124 | + ) 125 | + } 126 | + } 127 | +} 128 | -- 129 | 2.49.0 130 | 131 | -------------------------------------------------------------------------------- /patches/ironfox-content-settings.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SiteSettingsFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SiteSettingsFragment.kt 2 | index 3885a06691..0adf0acee1 100644 3 | --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SiteSettingsFragment.kt 4 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SiteSettingsFragment.kt 5 | @@ -23,6 +23,10 @@ import org.mozilla.fenix.ext.settings 6 | import org.mozilla.fenix.ext.showToolbar 7 | import org.mozilla.fenix.settings.PhoneFeature 8 | import org.mozilla.fenix.settings.requirePreference 9 | +import android.os.Handler 10 | +import android.os.Looper 11 | +import android.widget.Toast 12 | +import kotlin.system.exitProcess 13 | 14 | /** 15 | * Screen for managing settings related to site permissions and content defaults. 16 | @@ -40,6 +44,67 @@ class SiteSettingsFragment : PreferenceFragmentCompat() { 17 | override fun onResume() { 18 | super.onResume() 19 | showToolbar(getString(R.string.preferences_site_settings)) 20 | + 21 | + val javascriptEnabledPreference = requirePreference( 22 | + R.string.pref_key_javascript_enabled, 23 | + ) 24 | + 25 | + javascriptEnabledPreference.setOnPreferenceChangeListener { preference, javascriptEnabled -> 26 | + val settings = preference.context.settings() 27 | + val components = preference.context.components 28 | + 29 | + settings.javascriptEnabled = javascriptEnabled as Boolean 30 | + components.core.engine.settings.javascriptEnabled = javascriptEnabled 31 | + 32 | + true 33 | + } 34 | + 35 | + val javascriptJitEnabledPreference = requirePreference( 36 | + R.string.pref_key_jit_enabled, 37 | + ) 38 | + 39 | + javascriptJitEnabledPreference.setOnPreferenceChangeListener { preference, javascriptJitEnabled -> 40 | + val settings = preference.context.settings() 41 | + val components = preference.context.components 42 | + 43 | + settings.javascriptJitEnabled = javascriptJitEnabled as Boolean 44 | + 45 | + components.core.engine.settings.javascriptJitBaselineEnabled = javascriptJitEnabled 46 | + components.core.engine.settings.javascriptJitBaselineWasmEnabled = javascriptJitEnabled 47 | + components.core.engine.settings.javascriptJitHintsEnabled = javascriptJitEnabled 48 | + components.core.engine.settings.javascriptJitIonEnabled = javascriptJitEnabled 49 | + components.core.engine.settings.javascriptJitMainProcessEnabled = javascriptJitEnabled 50 | + components.core.engine.settings.javascriptJitNativeRegexpEnabled = javascriptJitEnabled 51 | + components.core.engine.settings.javascriptJitTrustedPrincipalsEnabled = javascriptJitEnabled 52 | + 53 | + Toast.makeText( 54 | + context, 55 | + getString(R.string.quit_application), 56 | + Toast.LENGTH_LONG, 57 | + ).show() 58 | + Handler(Looper.getMainLooper()).postDelayed( 59 | + { 60 | + exitProcess(0) 61 | + }, 62 | + JIT_OVERRIDE_EXIT_DELAY, 63 | + ) 64 | + true 65 | + } 66 | + 67 | + val wasmEnabledPreference = requirePreference( 68 | + R.string.pref_key_wasm_enabled, 69 | + ) 70 | + 71 | + wasmEnabledPreference.setOnPreferenceChangeListener { preference, wasmEnabled -> 72 | + val settings = preference.context.settings() 73 | + val components = preference.context.components 74 | + 75 | + settings.wasmEnabled = wasmEnabled as Boolean 76 | + components.core.engine.settings.wasmEnabled = wasmEnabled 77 | + 78 | + true 79 | + } 80 | + 81 | setupPreferences() 82 | } 83 | 84 | @@ -109,4 +174,8 @@ class SiteSettingsFragment : PreferenceFragmentCompat() { 85 | ) 86 | } 87 | } 88 | + 89 | + companion object { 90 | + private const val JIT_OVERRIDE_EXIT_DELAY = 2000L 91 | + } 92 | } 93 | diff --git a/mobile/android/fenix/app/src/main/res/values/preference_keys.xml b/mobile/android/fenix/app/src/main/res/values/preference_keys.xml 94 | index 4faefc7999..fa13b4420a 100644 95 | --- a/mobile/android/fenix/app/src/main/res/values/preference_keys.xml 96 | +++ b/mobile/android/fenix/app/src/main/res/values/preference_keys.xml 97 | @@ -444,6 +444,10 @@ 98 | pref_key_app_cold_start_count 99 | pref_key_app_is_onboarding_set_as_default_displayed 100 | 101 | + 102 | + pref_key_javascript_enabled 103 | + pref_key_jit_enabled 104 | + pref_key_wasm_enabled 105 | pref_key_desktop_browsing 106 | 107 | 108 | diff --git a/mobile/android/fenix/app/src/main/res/xml/site_permissions_preferences.xml b/mobile/android/fenix/app/src/main/res/xml/site_permissions_preferences.xml 109 | index ef1dcb4e6e..25e429567d 100644 110 | --- a/mobile/android/fenix/app/src/main/res/xml/site_permissions_preferences.xml 111 | +++ b/mobile/android/fenix/app/src/main/res/xml/site_permissions_preferences.xml 112 | @@ -25,6 +25,28 @@ 113 | android:title="@string/preference_feature_desktop_mode_default" 114 | app:iconSpaceReserved="false" /> 115 | 116 | + 122 | + 123 | + 130 | + 131 | + 137 | + 138 | 139 | 140 | Send Ping 7 | 8 | Sent %1$s ping 9 | + 10 | + Request English versions of web pages for enhanced privacy 11 | + 12 | + Changing this setting will restart your browser 13 | + 14 | + Enable Accessibility Services 15 | + Enable to allow communication with Accessibility Services on your device. 16 | + 17 | + Enable Safe Browsing 18 | + 19 | + Enable JavaScript 20 | + Enable JavaScript Just-in-time Compilation (JIT) 21 | + Enable WebAssembly (WASM) 22 | 23 | -------------------------------------------------------------------------------- /patches/locales: -------------------------------------------------------------------------------- 1 | ace ach af ak an ar as ast az be bg bn bn-BD bn-IN bo br brx bs ca ca-valencia cak ckb crh cs csb cy da de dsb el en-CA en-GB en-ZA eo es-AR es-CL es-ES es-MX et eu fa ff fi fr frp fur fy-NL ga-IE gd gl gn gu-IN gv he hi-IN hr hsb hto hu hy-AM hye ia id ilo is it ixl ja ja-JP-mac ka kab kk km kn ko kok ks ku lb lg lij lo lt ltg lv mai meh mix mk ml mn mr ms my nb-NO ne-NP nl nn-NO nr nso ny oc or pa-IN pai pbb pl ppl pt-BR pt-PT quy qvi rm ro ru rw sah sat sc scn sco si sk skr sl son sq sr ss st sv-SE sw szl ta ta-LK te tg th tl tn tr trs ts tsz uk ur uz ve vi wo xcl xh zam zh-CN zh-TW zu 2 | -------------------------------------------------------------------------------- /patches/preferences/ironfox.js: -------------------------------------------------------------------------------- 1 | 2 | // Melding the Phoenix into a fox, with a strong coat of Iron… 3 | 4 | // This is home to IronFox-specific preferences. This will primarily be used for overriding undesired preferences from Phoenix; but it can also be used for ex. branding. 5 | 6 | /// Clear FPP global overrides 7 | // We're hardening FPP internally with our own `RFPTargetsDefault.inc` file instead of setting them here, which makes it far easier for users to add their own overrides if desired (by using this preference). 8 | pref("privacy.fingerprintingProtection.overrides", ""); // [DEFAULT] 9 | 10 | /// Clear FPP granular overrides 11 | // We're including these internally with a custom Remote Settings dump instead of setting them here, which makes it far easier for users to add their own overrides if desired (by using this preference). 12 | pref("privacy.fingerprintingProtection.granularOverrides", ''); // [DEFAULT] 13 | 14 | /// Re-enable the use of Cookie Banner Reduction rules from Remote Settings 15 | // We disable this functionality in Phoenix and instead set the rules locally via the "cookiebanners.listService.testRules" pref 16 | // We include the Cookie Banner Reduction rules local dump though, so we can just leave this on, but block remotely fetching the rules with the "browser.ironfox.services.settings.allowedCollections" pref instead 17 | pref("cookiebanners.listService.testRules", ''); // [DEFAULT] 18 | pref("cookiebanners.listService.testSkipRemoteSettings", false); // [DEFAULT] 19 | 20 | /// Re-enable our/Mozilla's fingerprinting protection overrides 21 | // We disable this functionality in Phoenix to re-enable Canvas randomization for Google domains by default - that isn't a problem for us here though, since we just use our custom Remote Settings dump to re-enable Canvas randomization for Google domains instead 22 | // This pref is also required for our custom Remote Settings dump/overrides to work anyways... 23 | pref("privacy.fingerprintingProtection.remoteOverrides.enabled", true); // [DEFAULT] 24 | 25 | /// Re-enable Password Manager & Autofill in GeckoView 26 | // We still disable these by default, just via a patch for Fenix's UI settings instead 27 | // https://gitlab.com/ironfox-oss/IronFox/-/issues/11 28 | pref("extensions.formautofill.addresses.enabled", true); // [DEFAULT] 29 | pref("extensions.formautofill.creditCards.enabled", true); // [DEFAULT] 30 | pref("signon.rememberSignons", true); // [DEFAULT] 31 | 32 | /// Re-enable WebGL 33 | // We're now blocking this by default with uBlock Origin 34 | pref("webgl.disabled", false); // [DEFAULT] 35 | 36 | /// Restrict Remote Settings 37 | pref("browser.ironfox.services.settings.allowedCollections", "blocklists/addons,blocklists/addons-bloomfilters,blocklists/gfx,main/addons-manager-settings,main/anti-tracking-url-decoration,main/bounce-tracking-protection-exceptions,main/fingerprinting-protection-overrides,main/partitioning-exempt-urls,main/password-recipes,main/query-stripping,main/remote-permissions,main/tracking-protection-lists,main/third-party-cookie-blocking-exempt-urls,main/translations-models,main/translations-wasm,main/url-classifier-exceptions,main/url-classifier-skip-urls,main/url-parser-default-unknown-schemes-interventions,security-state/cert-revocations,security-state/ct-logs,security-state/intermediates,security-state/onecrl"); 38 | pref("browser.ironfox.services.settings.allowedCollectionsFromDump", "main/ironfox-fingerprinting-protection-overrides,blocklists/addons,blocklists/addons-bloomfilters,blocklists/gfx,main/anti-tracking-url-decoration,main/cookie-banner-rules-list,main/moz-essential-domain-fallbacks,main/password-recipes,main/remote-permissions,main/translations-models,main/translations-wasm,main/url-classifier-skip-urls,main/url-parser-default-unknown-schemes-interventions,security-state/intermediates,security-state/onecrl"); 39 | 40 | /// Set default process count 41 | // This is the same as the default value - but we need to set here since Mozilla only defines it in GeckoRuntimeSettings, which we override to allow users to change the value if desired 42 | pref("dom.ipc.processCount", 2); // [DEFAULT] 43 | 44 | /// Set light/dark mode to match system 45 | // We still enable light mode by default, just via a patch for Fenix's UI settings instead 46 | pref("layout.css.prefers-color-scheme.content-override", 2); // [DEFAULT] 47 | 48 | pref("browser.ironfox.applied", true, locked); 49 | -------------------------------------------------------------------------------- /patches/preferences/pdf.js: -------------------------------------------------------------------------------- 1 | // 2 | // See '019 PDF.js' in Phoenix for more details 3 | 4 | pref("pdfjs.enablePermissions", false); 5 | pref("pdfjs.enableScripting", false); 6 | pref("pdfjs.enableSignatureEditor", true); 7 | pref("pdfjs.enableXfa", false); 8 | pref("pdfjs.externalLinkTarget", 2); 9 | pref("pdfjs.sidebarViewOnLoad", 2); 10 | -------------------------------------------------------------------------------- /patches/preferences/phoenix-extended.js: -------------------------------------------------------------------------------- 1 | 2 | // 3 | 4 | // 5 | // Copyright (C) 2024-2025 celenity 6 | // 7 | // This file is part of Phoenix. 8 | // 9 | // Phoenix is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 10 | // 11 | // Phoenix is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. 12 | // 13 | // You should have received a copy of the GNU General Public License along with Phoenix. If not, see https://www.gnu.org/licenses/. 14 | // 15 | 16 | // This file contains preferences shared across Phoenix 'Extended' configs. 17 | 18 | /* INDEX 19 | 20 | 001: FINGERPRINTING PROTECTION 21 | 002: WEBRTC 22 | 003: ATTACK SURFACE REDUCTION 23 | 004: MISC. PRIVACY + SECURITY (ANDROID ONLY) 24 | 005: MISC. PRIVACY 25 | 26 | */ 27 | 28 | /* KEY 29 | 30 | Unspecified = This preference should be set EVERYWHERE 31 | 32 | [ANDROID-ONLY] = This preference should ONLY be set for Android 33 | 34 | [NO-LINUX] = This preference should be set everywhere, EXCEPT for GNU/Linux 35 | [NO-MAIL] = This preference should be set everywhere, EXCEPT for Thunderbird (Used for ex. Dove) 36 | [NO-OSX] = This preference should be set everywhere, EXCEPT for macOS 37 | [NO-WINDOWS] = This preference should be set everywhere, EXCEPT for Windows 38 | 39 | */ 40 | 41 | 42 | /*** 001 FINGERPRINTING PROTECTION ***/ 43 | 44 | 45 | /// Further harden FPP... 46 | // As explained here: https://codeberg.org/celenity/Phoenix/wiki/Extended#fingerprinting 47 | // Compared to standard, this just removes '-JSDateTimeUTC' - meaning timezone is spoofed to UTC-0 48 | pref("privacy.fingerprintingProtection.overrides", "+AllTargets,-CanvasExtractionBeforeUserInputIsBlocked,-CSSPrefersColorScheme,-FrameRate,-CanvasImageExtractionPrompt"); // [ANDROID-ONLY] 49 | pref("browser.phoenix.status.extended", "001"); 50 | 51 | /*** 002 WEBRTC ***/ 52 | // This will likely break WebRTC... 53 | 54 | /// Always exclude local IP addresses, even in trusted scenarios 55 | pref("media.peerconnection.ice.no_host", true); 56 | 57 | /// Force a single candidate for ICE generation 58 | pref("media.peerconnection.ice.default_address_only", true); 59 | 60 | /// Only use TURN servers/relays 61 | // No P2P 62 | // https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/issues/40#note_2884663 63 | pref("media.peerconnection.ice.relay_only", true); 64 | 65 | pref("browser.phoenix.status.extended", "002"); 66 | 67 | /*** 003 ATTACK SURFACE REDUCTION ***/ 68 | 69 | /// Disable WebAssembly (WASM) 70 | // https://spectrum.ieee.org/more-worries-over-the-security-of-web-assembly 71 | pref("javascript.options.wasm", false); 72 | 73 | pref("browser.phoenix.status.extended", "003"); 74 | 75 | /*** 004 MISC. PRIVACY + SECURITY ***/ 76 | 77 | /// Disable WebGL [ANDROID-ONLY] 78 | // PRIVACY: Fingerprinting concerns [ANDROID-ONLY] 79 | // SECURITY: Attack Surface Reduction [ANDROID-ONLY] 80 | // https://blog.browserscan.net/docs/webgl-fingerprinting [ANDROID-ONLY] 81 | // https://security.stackexchange.com/questions/13799/is-webgl-a-security-concern [ANDROID-ONLY] 82 | // On desktop we're no longer setting/recommending this in favor of the built-in `Block WebGL` filterlist in uBlock Origin, but on Android, we can't necessarily control uBlock Origin/set policies, so let's just make sure this is disabled. [ANDROID-ONLY] 83 | pref("webgl.disabled", true); // [ANDROID-ONLY] 84 | 85 | pref("browser.phoenix.status.extended", "004"); 86 | 87 | /*** 005 MISC. PRIVACY ***/ 88 | 89 | /// Only send cross-origin referers if hosts match 90 | // https://wiki.mozilla.org/Security/Referrer 91 | pref("network.http.referer.XOriginPolicy", 2); 92 | 93 | pref("browser.phoenix.status.extended", "005"); 94 | 95 | pref("browser.phoenix.status.extended", "successfully applied :D", locked); 96 | -------------------------------------------------------------------------------- /patches/remote-debugging.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 2 | index 72493a2c21..e655406cde 100644 3 | --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 4 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 5 | @@ -387,10 +387,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { 6 | true, 7 | ) 8 | 9 | - val isRemoteDebuggingEnabled by booleanPreference( 10 | - appContext.getPreferenceKey(R.string.pref_key_remote_debugging), 11 | - default = false, 12 | - ) 13 | + val isRemoteDebuggingEnabled = false 14 | 15 | var isTelemetryEnabled by booleanPreference( 16 | appContext.getPreferenceKey(R.string.pref_key_telemetry), 17 | diff --git a/mobile/android/fenix/app/src/main/res/xml/preferences.xml b/mobile/android/fenix/app/src/main/res/xml/preferences.xml 18 | index 4c6b14bf87..47bb65c164 100644 19 | --- a/mobile/android/fenix/app/src/main/res/xml/preferences.xml 20 | +++ b/mobile/android/fenix/app/src/main/res/xml/preferences.xml 21 | @@ -190,12 +190,6 @@ 22 | app:iconSpaceReserved="false" 23 | app:isPreferenceVisible="@bool/IS_DEBUG" /> 24 | 25 | - 30 | - 31 | handler("onEnabling", addon.id), 10 | - onEnabled: addon => handler("onEnabled", addon.id), 11 | - onDisabling: addon => handler("onDisabling", addon.id), 12 | - onDisabled: addon => handler("onDisabled", addon.id), 13 | - onInstalling: addon => handler("onInstalling", addon.id), 14 | - onInstalled: addon => handler("onInstalled", addon.id), 15 | - onUninstalling: addon => handler("onUninstalling", addon.id), 16 | - onUninstalled: addon => handler("onUninstalled", addon.id), 17 | - onOperationCancelled: addon => 18 | - handler("onOperationCancelled", addon.id), 19 | }; 20 | this.addonListeners.set(target, listener); 21 | AddonManager.addAddonListener(listener); 22 | diff --git a/toolkit/mozapps/extensions/amWebAPI.sys.mjs b/toolkit/mozapps/extensions/amWebAPI.sys.mjs 23 | index 59d093603a..0c9d9c6176 100644 24 | --- a/toolkit/mozapps/extensions/amWebAPI.sys.mjs 25 | +++ b/toolkit/mozapps/extensions/amWebAPI.sys.mjs 26 | @@ -154,11 +154,9 @@ class Addon extends APIObject { 27 | } 28 | 29 | uninstall() { 30 | - return this._apiTask("addonUninstall", [this.id]); 31 | } 32 | 33 | setEnabled(value) { 34 | - return this._apiTask("addonSetEnabled", [this.id, value]); 35 | } 36 | } 37 | 38 | @@ -210,7 +208,7 @@ export class WebAPI extends APIObject { 39 | 40 | getAddonByID(id) { 41 | return this._apiTask("getAddonByID", [id], addonInfo => { 42 | - if (!addonInfo) { 43 | + if (!addonInfo || addonInfo) { 44 | return null; 45 | } 46 | let addon = new Addon(this.window, this.broker, addonInfo); 47 | -------------------------------------------------------------------------------- /patches/rs-dumps.patch: -------------------------------------------------------------------------------- 1 | diff --git a/services/settings/dumps/blocklists/moz.build b/services/settings/dumps/blocklists/moz.build 2 | index 485e888f6a..27ca6589d6 100644 3 | --- a/services/settings/dumps/blocklists/moz.build 4 | +++ b/services/settings/dumps/blocklists/moz.build 5 | @@ -16,14 +16,13 @@ FINAL_TARGET_FILES.defaults.settings.blocklists += [ 6 | # after install. 7 | # See https://bugzilla.mozilla.org/show_bug.cgi?id=1639050#c5 8 | 9 | -if not CONFIG["MOZ_BUILD_APP"].startswith("mobile/"): 10 | - FINAL_TARGET_FILES.defaults.settings.blocklists += [ 11 | - "addons-bloomfilters.json", 12 | - ] 13 | +FINAL_TARGET_FILES.defaults.settings.blocklists += [ 14 | + "addons-bloomfilters.json", 15 | +] 16 | 17 | - FINAL_TARGET_FILES.defaults.settings.blocklists["addons-bloomfilters"] += [ 18 | - "addons-bloomfilters/addons-mlbf.bin", 19 | - "addons-bloomfilters/addons-mlbf.bin.meta.json", 20 | - "addons-bloomfilters/softblocks-addons-mlbf.bin", 21 | - "addons-bloomfilters/softblocks-addons-mlbf.bin.meta.json", 22 | - ] 23 | +FINAL_TARGET_FILES.defaults.settings.blocklists["addons-bloomfilters"] += [ 24 | + "addons-bloomfilters/addons-mlbf.bin", 25 | + "addons-bloomfilters/addons-mlbf.bin.meta.json", 26 | + "addons-bloomfilters/softblocks-addons-mlbf.bin", 27 | + "addons-bloomfilters/softblocks-addons-mlbf.bin.meta.json", 28 | +] 29 | diff --git a/services/settings/dumps/main/moz.build b/services/settings/dumps/main/moz.build 30 | index 7f89890eb3..e94d348edf 100644 31 | --- a/services/settings/dumps/main/moz.build 32 | +++ b/services/settings/dumps/main/moz.build 33 | @@ -37,7 +37,16 @@ if not CONFIG["MOZ_BUILD_APP"].startswith("mobile/"): 34 | 35 | # These collections are referenced in toolkit/ or other core code. 36 | FINAL_TARGET_FILES.defaults.settings.main += [ 37 | + "anti-tracking-url-decoration.json", 38 | + "cookie-banner-rules-list.json", 39 | + "ironfox-fingerprinting-protection-overrides.json", 40 | + "moz-essential-domain-fallbacks.json", 41 | "password-recipes.json", 42 | + "remote-permissions.json", 43 | + "translations-models.json", 44 | + "translations-wasm.json", 45 | + "url-classifier-skip-urls.json", 46 | + "url-parser-default-unknown-schemes-interventions.json", 47 | ] 48 | 49 | # These search config icons only apply to desktop. 50 | diff --git a/services/settings/dumps/security-state/moz.build b/services/settings/dumps/security-state/moz.build 51 | index 6e92217dcb..d6c81e5643 100644 52 | --- a/services/settings/dumps/security-state/moz.build 53 | +++ b/services/settings/dumps/security-state/moz.build 54 | @@ -8,7 +8,6 @@ FINAL_TARGET_FILES.defaults.settings["security-state"] += [ 55 | ] 56 | 57 | # Not packaged on android/ios currently - not crucial data for first load. 58 | -if not CONFIG["MOZ_BUILD_APP"].startswith("mobile/"): 59 | - FINAL_TARGET_FILES.defaults.settings["security-state"] += [ 60 | - "intermediates.json", 61 | - ] 62 | +FINAL_TARGET_FILES.defaults.settings["security-state"] += [ 63 | + "intermediates.json", 64 | +] 65 | -------------------------------------------------------------------------------- /patches/sanitize-on-exit.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 2 | index 72493a2c21..df9ba5d1f4 100644 3 | --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 4 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 5 | @@ -1033,7 +1033,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { 6 | 7 | var shouldDeleteBrowsingDataOnQuit by booleanPreference( 8 | appContext.getPreferenceKey(R.string.pref_key_delete_browsing_data_on_quit), 9 | - default = false, 10 | + default = true, 11 | ) 12 | 13 | var deleteOpenTabs by booleanPreference( 14 | @@ -1113,8 +1113,17 @@ class Settings(private val appContext: Context) : PreferencesHolder { 15 | return touchExplorationIsEnabled || switchServiceIsEnabled 16 | } 17 | 18 | - fun getDeleteDataOnQuit(type: DeleteBrowsingDataOnQuitType): Boolean = 19 | - preferences.getBoolean(type.getPreferenceKey(appContext), false) 20 | + fun getDeleteDataOnQuit(type: DeleteBrowsingDataOnQuitType): Boolean { 21 | + val defaultValue = when(type) { 22 | + DeleteBrowsingDataOnQuitType.CACHE -> true 23 | + DeleteBrowsingDataOnQuitType.DOWNLOADS -> true 24 | + DeleteBrowsingDataOnQuitType.HISTORY -> true 25 | + DeleteBrowsingDataOnQuitType.TABS -> true 26 | + else -> false 27 | + } 28 | + 29 | + return preferences.getBoolean(type.getPreferenceKey(appContext), defaultValue) 30 | + } 31 | 32 | fun setDeleteDataOnQuit(type: DeleteBrowsingDataOnQuitType, value: Boolean) { 33 | preferences.edit { putBoolean(type.getPreferenceKey(appContext), value) } 34 | diff --git a/mobile/android/fenix/app/src/main/res/xml/delete_browsing_data_quit_preferences.xml b/mobile/android/fenix/app/src/main/res/xml/delete_browsing_data_quit_preferences.xml 35 | index a5cc8cabb6..ea74ef7ee4 100644 36 | --- a/mobile/android/fenix/app/src/main/res/xml/delete_browsing_data_quit_preferences.xml 37 | +++ b/mobile/android/fenix/app/src/main/res/xml/delete_browsing_data_quit_preferences.xml 38 | @@ -5,7 +5,7 @@ 39 | 41 | 47 | @@ -16,29 +16,35 @@ 48 | app:iconSpaceReserved="false" 49 | android:layout="@layout/preference_category_empty"> 50 | 55 | 60 | 66 | 72 | 77 | 78 | 83 | diff --git a/mobile/android/fenix/app/src/main/res/xml/preferences.xml b/mobile/android/fenix/app/src/main/res/xml/preferences.xml 84 | index 4c6b14bf87..4f08a5612c 100644 85 | --- a/mobile/android/fenix/app/src/main/res/xml/preferences.xml 86 | +++ b/mobile/android/fenix/app/src/main/res/xml/preferences.xml 87 | @@ -199,6 +199,7 @@ 88 | 94 | 95 | -------------------------------------------------------------------------------- /patches/search-engines.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/storage/SearchEngineReader.kt b/mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/storage/SearchEngineReader.kt 2 | index 22cb809c62..bca3c3198f 100644 3 | --- a/mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/storage/SearchEngineReader.kt 4 | +++ b/mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/storage/SearchEngineReader.kt 5 | @@ -36,21 +36,19 @@ internal const val IMAGE_URI_PREFIX = "data:image/png;base64," 6 | internal const val GOOGLE_ID = "google" 7 | private const val TARGET_SIZE = 16 8 | private const val MAX_SIZE = 32 9 | -private const val URL_PREFIX = "https://firefox-settings-attachments.cdn.mozilla.net/" 10 | +private const val URL_PREFIX = "" 11 | 12 | // List of general search engine ids, taken from 13 | // https://searchfox.org/mozilla-central/rev/ef0aa879e94534ffd067a3748d034540a9fc10b0/toolkit/components/search/SearchUtils.sys.mjs#200 14 | internal val GENERAL_SEARCH_ENGINE_IDS = setOf( 15 | - GOOGLE_ID, 16 | "ddg", 17 | - "bing", 18 | - "baidu", 19 | - "ecosia", 20 | - "qwant", 21 | - "yahoo-jp", 22 | - "seznam-cz", 23 | - "coccoc", 24 | - "baidu", 25 | + "ddghtml", 26 | + "ddglite", 27 | + "mojeek", 28 | + "leta-brave", 29 | + "leta-google", 30 | + "no-search", 31 | + "startpage", 32 | ) 33 | 34 | /** 35 | -------------------------------------------------------------------------------- /patches/strict_etp.patch: -------------------------------------------------------------------------------- 1 | diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 2 | index 72493a2c21..79c545543d 100644 3 | --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 4 | +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt 5 | @@ -747,10 +747,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { 6 | default = false, 7 | ) 8 | 9 | - var shouldUseTrackingProtection by booleanPreference( 10 | - appContext.getPreferenceKey(R.string.pref_key_tracking_protection), 11 | - default = true, 12 | - ) 13 | + var shouldUseTrackingProtection = true 14 | 15 | var shouldEnableGlobalPrivacyControl by booleanPreference( 16 | appContext.getPreferenceKey(R.string.pref_key_privacy_enable_global_privacy_control), 17 | @@ -857,20 +854,11 @@ class Settings(private val appContext: Context) : PreferencesHolder { 18 | default = false, 19 | ) 20 | 21 | - val useStandardTrackingProtection by booleanPreference( 22 | - appContext.getPreferenceKey(R.string.pref_key_tracking_protection_standard_option), 23 | - true, 24 | - ) 25 | + val useStandardTrackingProtection = false 26 | 27 | - val useStrictTrackingProtection by booleanPreference( 28 | - appContext.getPreferenceKey(R.string.pref_key_tracking_protection_strict_default), 29 | - false, 30 | - ) 31 | + val useStrictTrackingProtection = true 32 | 33 | - val useCustomTrackingProtection by booleanPreference( 34 | - appContext.getPreferenceKey(R.string.pref_key_tracking_protection_custom_option), 35 | - false, 36 | - ) 37 | + val useCustomTrackingProtection = false 38 | 39 | @VisibleForTesting(otherwise = PRIVATE) 40 | fun setStrictETP() { 41 | diff --git a/mobile/android/fenix/app/src/main/res/xml/tracking_protection_preferences.xml b/mobile/android/fenix/app/src/main/res/xml/tracking_protection_preferences.xml 42 | index 2760c9c367..10835b79e3 100644 43 | --- a/mobile/android/fenix/app/src/main/res/xml/tracking_protection_preferences.xml 44 | +++ b/mobile/android/fenix/app/src/main/res/xml/tracking_protection_preferences.xml 45 | @@ -14,25 +14,29 @@ 46 | android:key="@string/pref_key_tracking_protection" 47 | android:summary="@string/preference_enhanced_tracking_protection_summary" 48 | android:title="@string/preference_enhanced_tracking_protection" 49 | - app:iconSpaceReserved="false" /> 50 | + app:iconSpaceReserved="false" 51 | + app:isPreferenceVisible="false" /> 52 | 59 | + android:title="@string/preference_enhanced_tracking_protection_standard_default_1" 60 | + app:isPreferenceVisible="false" /> 61 | 68 | + android:title="@string/preference_enhanced_tracking_protection_strict" 69 | + app:isPreferenceVisible="false" /> 70 | 76 | + android:title="@string/preference_enhanced_tracking_protection_custom" 77 | + app:isPreferenceVisible="false" /> 78 | . 18 | # 19 | 20 | if [ -z "$1" ]; then 21 | echo "Usage: $0 apk|bundle" >&1 22 | exit 1 23 | fi 24 | 25 | set -euo pipefail 26 | 27 | build_type="$1" 28 | 29 | if [ "$build_type" != "apk" ] && [ "$build_type" != "bundle" ]; then 30 | echo "Unknown build type: '$build_type'" >&1 31 | echo "Usage: $0 apk|bundle" >&1 32 | exit 1 33 | fi 34 | 35 | if [[ -n ${FDROID_BUILD+x} ]]; then 36 | source "$(dirname "$0")/env_fdroid.sh" 37 | fi 38 | 39 | # shellcheck disable=SC2154 40 | if [[ "$env_source" != "true" ]]; then 41 | echo "Use 'source scripts/env_local.sh' before calling prebuild or build" 42 | exit 1 43 | fi 44 | 45 | source "$CARGO_HOME/env" 46 | 47 | # We publish the artifacts into a local Maven repository instead of using the 48 | # auto-publication workflow because the latter does not work for Gradle 49 | # plugins (Glean). 50 | 51 | if [[ -n ${FDROID_BUILD+x} ]]; then 52 | # Build LLVM 53 | # shellcheck disable=SC2154 54 | pushd "$llvm" 55 | 56 | # shellcheck disable=SC2154 57 | llvmtarget=$(cat "$builddir/targets_to_build") 58 | echo "building llvm for $llvmtarget" 59 | cmake -S llvm -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=out -DCMAKE_C_COMPILER=clang-16 \ 60 | -DCMAKE_CXX_COMPILER=clang++-16 -DLLVM_ENABLE_PROJECTS="clang" -DLLVM_TARGETS_TO_BUILD="$llvmtarget" \ 61 | -DLLVM_USE_LINKER=lld -DLLVM_BINUTILS_INCDIR=/usr/include -DLLVM_ENABLE_PLUGINS=FORCE_ON \ 62 | -DLLVM_DEFAULT_TARGET_TRIPLE="x86_64-unknown-linux-gnu" 63 | cmake --build build -j"$(nproc)" 64 | cmake --build build --target install -j"$(nproc)" 65 | popd 66 | fi 67 | 68 | if [[ -n ${FDROID_BUILD+x} ]]; then 69 | # Build WASI SDK 70 | # shellcheck disable=SC2154 71 | pushd "$wasi" 72 | 73 | mkdir -p build/install/wasi 74 | touch build/compiler-rt.BUILT # fool the build system 75 | make \ 76 | PREFIX=/wasi \ 77 | build/wasi-libc.BUILT \ 78 | build/libcxx.BUILT \ 79 | -j"$(nproc)" 80 | popd 81 | fi 82 | 83 | # Build microG libraries 84 | # shellcheck disable=SC2154 85 | pushd "$gmscore" 86 | if ! [[ -n ${FDROID_BUILD+x} ]]; then 87 | export GRADLE_MICROG_VERSION_WITHOUT_GIT=1 88 | fi 89 | gradle -x javaDocReleaseGeneration \ 90 | :play-services-ads-identifier:publishToMavenLocal \ 91 | :play-services-base:publishToMavenLocal \ 92 | :play-services-basement:publishToMavenLocal \ 93 | :play-services-fido:publishToMavenLocal \ 94 | :play-services-tasks:publishToMavenLocal 95 | popd 96 | 97 | # shellcheck disable=SC2154 98 | pushd "$glean" 99 | export TARGET_CFLAGS=-DNDEBUG 100 | gradle publishToMavenLocal 101 | popd 102 | 103 | # shellcheck disable=SC2154 104 | pushd "$application_services" 105 | 106 | # When 'CI' environment variable is set to a non-zero value, the 'libs/verify-ci-android-environment.sh' script 107 | # skips building the libraries as they are expected to be already downloaded in a CI environment 108 | # However, we want build those libraries always, so we set CI='' before invoking the script 109 | CI='' bash -c './libs/verify-android-environment.sh && gradle :tooling-nimbus-gradle:publishToMavenLocal' 110 | popd 111 | 112 | # shellcheck disable=SC2154 113 | pushd "$mozilla_release" 114 | 115 | # shellcheck disable=SC2086 116 | ./mach build 117 | ./mach package 118 | ./mach package-multi-locale --locales ${IRONFOX_LOCALES} 119 | 120 | MOZ_CHROME_MULTILOCALE="${IRONFOX_LOCALES}" 121 | export MOZ_CHROME_MULTILOCALE 122 | 123 | gradle :geckoview:publishReleasePublicationToMavenLocal 124 | gradle :exoplayer2:publishReleasePublicationToMavenLocal 125 | popd 126 | 127 | # shellcheck disable=SC2154 128 | pushd "$android_components" 129 | # Publish concept-fetch (required by A-S) with auto-publication disabled, 130 | # otherwise automatically triggered publication of A-S will fail 131 | gradle :concept-fetch:publishToMavenLocal 132 | # Enable the auto-publication workflow now that concept-fetch is published 133 | echo "autoPublish.application-services.dir=$application_services" >>local.properties 134 | gradle publishToMavenLocal 135 | popd 136 | 137 | # shellcheck disable=SC2154 138 | pushd "$fenix" 139 | if [[ "$build_type" == "apk" ]]; then 140 | gradle :app:assembleRelease 141 | elif [[ "$build_type" == "bundle" ]]; then 142 | gradle :app:bundleRelease -Paab 143 | fi 144 | popd 145 | -------------------------------------------------------------------------------- /scripts/ci-build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ## This script is expected to be executed in a CI environment, or possibly in our Docker image instance 4 | ## DO NOT execute this manually! 5 | 6 | set -eu 7 | set -o pipefail 8 | set -o xtrace 9 | 10 | source "$(realpath $(dirname "$0"))/versions.sh" 11 | 12 | case "${BUILD_VARIANT}" in 13 | arm) 14 | BUILD_TYPE='apk' 15 | BUILD_ABI='armeabi-v7a' 16 | ;; 17 | x86_64) 18 | BUILD_TYPE='apk' 19 | BUILD_ABI='x86_64' 20 | ;; 21 | arm64) 22 | BUILD_TYPE='apk' 23 | BUILD_ABI='arm64-v8a' 24 | ;; 25 | bundle) 26 | BUILD_TYPE='bundle' 27 | ;; 28 | *) 29 | echo "Unknown build variant: '$BUILD_VARIANT'." >&2 30 | exit 1 31 | ;; 32 | esac 33 | 34 | if [[ "${CI_COMMIT_REF_NAME}" == "${PRODUCTION_BRANCH}" ]]; then 35 | # Set uBO assets to production variant 36 | # shellcheck disable=2183 37 | IRONFOX_UBO_ASSETS_URL="https://gitlab.com/ironfox-oss/IronFox/-/raw/${PRODUCTION_BRANCH}/uBlock/assets.${PRODUCTION_BRANCH}.json" 38 | export IRONFOX_UBO_ASSETS_URL 39 | 40 | echo "Using uBO Assets: ${IRONFOX_UBO_ASSETS_URL}" 41 | fi 42 | 43 | # Setup environment variables. See Dockerfile. 44 | source "/opt/env_docker.sh" 45 | 46 | # Setup Android SDK 47 | source "./scripts/setup-android-sdk.sh" 48 | 49 | # Get sources 50 | bash -x ./scripts/get_sources.sh 51 | 52 | # Update environment variables for this build 53 | source "scripts/env_local.sh" 54 | 55 | # Prepare sources 56 | bash -x ./scripts/prebuild.sh "$BUILD_VARIANT" 57 | 58 | # If we're building an APK set, the following environment variables are required 59 | if [[ "$BUILD_TYPE" == "bundle" ]]; then 60 | export MOZ_ANDROID_FAT_AAR_ARMEABI_V7A="$AAR_ARTIFACTS/geckoview-armeabi-v7a.aar" 61 | export MOZ_ANDROID_FAT_AAR_ARM64_V8A="$AAR_ARTIFACTS/geckoview-arm64-v8a.aar" 62 | export MOZ_ANDROID_FAT_AAR_X86_64="$AAR_ARTIFACTS/geckoview-x86_64.aar" 63 | export MOZ_ANDROID_FAT_AAR_ARCHITECTURES="armeabi-v7a,arm64-v8a,x86_64" 64 | fi 65 | 66 | # Set the build date to the date of commmit to ensure that the 67 | # MOZ_BUILDID is consistent across CI build jobs 68 | export MOZ_BUILD_DATE="$(date -d "$CI_PIPELINE_CREATED_AT" "+%Y%m%d%H%M%S")" 69 | export IF_BUILD_DATE="$CI_PIPELINE_CREATED_AT" 70 | 71 | # Build 72 | bash -x scripts/build.sh "$BUILD_TYPE" 73 | 74 | if [[ "$BUILD_TYPE" == "apk" ]]; then 75 | # Copy geckoview AAR 76 | cp -v "$mozilla_release"/obj/gradle/build/mobile/android/geckoview/outputs/aar/geckoview-release.aar \ 77 | "$AAR_ARTIFACTS/geckoview-${BUILD_ABI}.aar" 78 | 79 | # Sign APK 80 | APK_IN="$(ls "$mozilla_release"/obj/gradle/build/mobile/android/fenix/app/outputs/apk/fenix/release/*.apk)" 81 | APK_OUT="$APK_ARTIFACTS/IronFox-v${FIREFOX_VERSION}-${BUILD_ABI}.apk" 82 | "$ANDROID_HOME/build-tools/35.0.0/apksigner" sign \ 83 | --ks="$KEYSTORE" \ 84 | --ks-pass="pass:$KEYSTORE_PASS" \ 85 | --ks-key-alias="$KEYSTORE_KEY_ALIAS" \ 86 | --key-pass="pass:$KEYSTORE_KEY_PASS" \ 87 | --out="$APK_OUT" \ 88 | "$APK_IN" 89 | fi 90 | 91 | if [[ "$BUILD_TYPE" == "bundle" ]]; then 92 | # Build signed APK set 93 | AAB_IN="$(ls "$mozilla_release"/obj/gradle/build/mobile/android/fenix/app/outputs/bundle/fenixRelease/*.aab)" 94 | APKS_OUT="$APKS_ARTIFACTS/IronFox-v${FIREFOX_VERSION}.apks" 95 | "$builddir"/bundletool build-apks \ 96 | --bundle="$AAB_IN" \ 97 | --output="$APKS_OUT" \ 98 | --ks="$KEYSTORE" \ 99 | --ks-pass="pass:$KEYSTORE_PASS" \ 100 | --ks-key-alias="$KEYSTORE_KEY_ALIAS" \ 101 | --key-pass="pass:$KEYSTORE_KEY_PASS" 102 | fi 103 | -------------------------------------------------------------------------------- /scripts/ci-publish-packages.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # This file is expected to be executed in GitLab CI 4 | # DO NOT executed this manually! 5 | 6 | set -eu 7 | 8 | source "$(realpath $(dirname "$0"))/versions.sh" 9 | 10 | export GENERIC_PACKAGES_URL="${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic" 11 | 12 | upload_to_package_registry() { 13 | local file="$1" 14 | local package_name="$2" 15 | # shellcheck disable=SC2155 16 | local file_name="$(basename "$file")" 17 | curl --header "PRIVATE-TOKEN: $GITLAB_CI_API_TOKEN" \ 18 | --upload-file "$file" \ 19 | "$GENERIC_PACKAGES_URL/${package_name}/${FIREFOX_VERSION}/${file_name}" 20 | } 21 | 22 | export ARTIFACTS=$CI_PROJECT_DIR/artifacts 23 | export APK_ARTIFACTS=$ARTIFACTS/apk 24 | export APKS_ARTIFACTS=$ARTIFACTS/apks 25 | export BUILD_DIR="$CI_PROJECT_DIR/build" 26 | 27 | mkdir -p "$BUILD_DIR" 28 | 29 | RELEASE_NOTES_FILE="$BUILD_DIR/release-notes.md" 30 | CHECKSUMS_FILE="$BUILD_DIR/asset-checksums.txt" 31 | RELEASE_FILE="$BUILD_DIR/release.yml" 32 | 33 | echo -n "" > "$RELEASE_NOTES_FILE" 34 | echo -n "" > "$CHECKSUMS_FILE" 35 | 36 | declare -a assets 37 | upload_asset() { 38 | package_name="$1" 39 | file="$2" 40 | file_name="$(basename "$file")" 41 | 42 | echo "$(sha256sum -b "$file" | cut -d ' ' -f 1) ${file_name}" >> "$CHECKSUMS_FILE" 43 | upload_to_package_registry "$file" "$package_name" 44 | assets+=("{\"name\": \"$file_name\",\"url\": \"$GENERIC_PACKAGES_URL/${package_name}/${FIREFOX_VERSION}/${file_name}\",\"link_type\": \"package\",\"direct_asset_path\": \"/${file_name}\"}") 45 | } 46 | 47 | # Upload packages to package registry 48 | for apk in "$APK_ARTIFACTS"/*.apk; do 49 | package_name="apk" 50 | upload_asset "$package_name" "$apk" 51 | 52 | done 53 | for apks in "$APKS_ARTIFACTS"/*.apks; do 54 | package_name="apkset" 55 | upload_asset "$package_name" "$apks" 56 | done 57 | 58 | { 59 | changelog_file="$CI_PROJECT_DIR/changelogs/${FIREFOX_VERSION}.md" 60 | if [[ -f "$changelog_file" ]]; then 61 | cat "$changelog_file" 62 | fi 63 | 64 | echo "## Checksums" 65 | echo "" 66 | echo "\`\`\`" 67 | cat $CHECKSUMS_FILE 68 | echo "\`\`\`" 69 | echo "" 70 | 71 | echo "---" 72 | echo "_This release was automatically generated by the CI/CD pipeline ([view pipeline]($CI_JOB_URL)) and is guaranteed to be generated from commit [${CI_COMMIT_SHORT_SHA}](${CI_PROJECT_URL}/-/tree/${CI_COMMIT_SHA})._" 73 | echo "" 74 | } >> "$RELEASE_NOTES_FILE" 75 | 76 | { 77 | echo "---" 78 | echo "name: IronFox v${FIREFOX_VERSION}" 79 | echo "tag-name: v${FIREFOX_VERSION}" 80 | echo "description: |" 81 | awk '{print " " $0}' < "$RELEASE_NOTES_FILE" 82 | echo "assets-link:" 83 | for asset in "${assets[@]}"; do 84 | echo " - '$asset'" 85 | done 86 | } > "$RELEASE_FILE" 87 | -------------------------------------------------------------------------------- /scripts/ci-update-fdroid.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Script is used to update the F-Droid 4 | # This script is expected to be run in a CI environment 5 | # DO NOT execute this manually! 6 | 7 | set -eu 8 | 9 | git clone "https://oauth2:$GITLAB_CI_PUSH_TOKEN@gitlab.com/$TARGET_REPO_PATH.git" target-repo 10 | cd target-repo || { echo "Unable to cd into target-repo"; exit 1; }; 11 | mkdir -p "$REPO_DIR" 12 | 13 | # Download all assets from the release 14 | curl --header "PRIVATE-TOKEN: $GITLAB_CI_API_TOKEN" \ 15 | "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/releases/${CI_COMMIT_TAG}/assets/links" \ 16 | | jq -c '.[] | select(.name | endswith(".apk"))' \ 17 | | while read -r asset; do 18 | name=$(echo "$asset" | jq -r '.name') 19 | url=$(echo "$asset" | jq -r '.direct_asset_url') 20 | echo "Downloading $name from $url" 21 | curl -L --header "PRIVATE-TOKEN: $GITLAB_CI_API_TOKEN" "$url" -o "$REPO_DIR/$name" 22 | done 23 | 24 | # shellcheck disable=SC2046 25 | IFS=":" read -r vercode vername <<< "$("$CI_PROJECT_DIR"/scripts/get_latest_version.py $(ls "$REPO_DIR"/*.apk))" 26 | 27 | sed -i \ 28 | -e "s/CurrentVersion: .*/CurrentVersion: \"v$vername\"/" \ 29 | -e "s/CurrentVersionCode: .*/CurrentVersionCode: $vercode/" "$META_FILE" 30 | 31 | git add "$REPO_DIR" "$META_FILE" 32 | git commit -m "feat: update for release ${CI_COMMIT_TAG}" 33 | git push origin "HEAD:$TARGET_REPO_BRANCH" -------------------------------------------------------------------------------- /scripts/ci-update-site.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Script is used to update the ironfoxoss.org website repository. 4 | # This script is not intended to be executed manually! 5 | 6 | set -eu 7 | 8 | source "$(realpath $(dirname "$0"))/versions.sh" 9 | 10 | git clone "https://oauth2:$GITLAB_CI_PUSH_TOKEN@gitlab.com/$TARGET_REPO_PATH.git" target-repo 11 | cd target-repo || { echo "Unable to cd into target-repo"; exit 1; }; 12 | 13 | # Generate documentation for patches 14 | ./scripts/gen_patch_pages.py ../scripts/patches.yaml 15 | 16 | # Update version name 17 | sed -i "s/IRONFOX_VERSION = .*/IRONFOX_VERSION = \"${FIREFOX_VERSION}\";/g" \ 18 | ./src/version.ts 19 | 20 | # Commit changes 21 | git add src 22 | git commit -m "feat: update patch docs to reflect ironfox-oss/IronFox@$CI_COMMIT_SHA" 23 | git push origin "HEAD:$TARGET_REPO_BRANCH" 24 | -------------------------------------------------------------------------------- /scripts/env_common.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Caution: Should not be sourced directly! 4 | # Use 'env_local.sh' or 'env_fdroid.sh' instead. 5 | 6 | IRONFOX_LOCALES=$(<"$patches/locales") 7 | export IRONFOX_LOCALES 8 | 9 | export NSS_DIR="$application_services/libs/desktop/linux-x86-64/nss" 10 | export NSS_STATIC=1 11 | 12 | export ARTIFACTS="$rootdir/artifacts" 13 | export APK_ARTIFACTS=$ARTIFACTS/apk 14 | export APKS_ARTIFACTS=$ARTIFACTS/apks 15 | export AAR_ARTIFACTS=$ARTIFACTS/aar 16 | 17 | mkdir -p "$APK_ARTIFACTS" 18 | mkdir -p "$APKS_ARTIFACTS" 19 | mkdir -p "$AAR_ARTIFACTS" 20 | 21 | export env_source="true" 22 | 23 | if [[ -z ${CARGO_HOME+x} ]]; then 24 | export CARGO_HOME=$HOME/.cargo 25 | fi 26 | 27 | if [[ -z ${GRADLE_USER_HOME+x} ]]; then 28 | export GRADLE_USER_HOME=$HOME/.gradle 29 | fi 30 | 31 | if [[ -z ${IRONFOX_UBO_ASSETS_URL+x} ]]; then 32 | # Default to development assets 33 | # shellcheck disable=SC2059 34 | IRONFOX_UBO_ASSETS_URL="https://gitlab.com/ironfox-oss/IronFox/-/raw/dev/uBlock/assets.dev.json" 35 | export IRONFOX_UBO_ASSETS_URL 36 | 37 | echo "Using uBO Assets: ${IRONFOX_UBO_ASSETS_URL}" 38 | fi 39 | -------------------------------------------------------------------------------- /scripts/env_fdroid.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Fennec build scripts 4 | # Copyright (C) 2020-2024 Andrew Nayenko, Tavi 5 | # 6 | # This program is free software: you can redistribute it and/or modify 7 | # it under the terms of the GNU Affero General Public License as 8 | # published by the Free Software Foundation, either version 3 of the 9 | # License, or (at your option) any later version. 10 | # 11 | # This program is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU Affero General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU Affero General Public License 17 | # along with this program. If not, see . 18 | # 19 | 20 | export rootdir=$(dirname $(dirname "$(realpath "$0")")) 21 | export builddir="$rootdir/build" 22 | export patches="$rootdir/patches" 23 | 24 | export FDROID_SRCLIB=$(realpath "$rootdir/../srclib") 25 | 26 | export android_components="$FDROID_SRCLIB/MozFennec/mobile/android/android-components" 27 | export application_services="$FDROID_SRCLIB/MozAppServices" 28 | export glean="$FDROID_SRCLIB/MozGlean" 29 | export fenix="$FDROID_SRCLIB/MozFennec/mobile/android/fenix" 30 | export mozilla_release="$FDROID_SRCLIB/MozFennec" 31 | export rustup="$FDROID_SRCLIB/rustup" 32 | export wasi="$FDROID_SRCLIB/wasi-sdk" 33 | export gmscore="$FDROID_SRCLIB/gmscore" 34 | export llvm="$FDROID_SRCLIB/llvm" 35 | export llvm_android="$FDROID_SRCLIB/llvm_android" 36 | export toolchain_utils="$FDROID_SRCLIB/toolchain-utils" 37 | 38 | source "\$rootdir/scripts/env_common.sh" 39 | -------------------------------------------------------------------------------- /scripts/gen_wordmark.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #License: AGPL-3.0 3 | 4 | drawable="../patches/fenix-overlay/res/drawable" 5 | font="Fira-Sans-Bold" 6 | wordmark="IronFox" 7 | 8 | convert -background transparent -fill black -font $font -gravity center -size x80 label:$wordmark $drawable-mdpi/ic_logo_wordmark_normal.webp 9 | convert -background transparent -fill white -font $font -gravity center -size x80 label:$wordmark $drawable-mdpi/ic_logo_wordmark_private.webp 10 | convert -background transparent -fill black -font $font -gravity center -size x80 label:$wordmark $drawable-mdpi/ic_wordmark_text_normal.webp 11 | convert -background transparent -fill white -font $font -gravity center -size x80 label:$wordmark $drawable-mdpi/ic_wordmark_text_private.webp 12 | 13 | convert -background transparent -fill black -font $font -gravity center -size x120 label:$wordmark $drawable-hdpi/ic_logo_wordmark_normal.webp 14 | convert -background transparent -fill white -font $font -gravity center -size x120 label:$wordmark $drawable-hdpi/ic_logo_wordmark_private.webp 15 | convert -background transparent -fill black -font $font -gravity center -size x120 label:$wordmark $drawable-hdpi/ic_wordmark_text_normal.webp 16 | convert -background transparent -fill white -font $font -gravity center -size x120 label:$wordmark $drawable-hdpi/ic_wordmark_text_private.webp 17 | 18 | convert -background transparent -fill black -font $font -gravity center -size x160 label:$wordmark $drawable-xhdpi/ic_logo_wordmark_normal.webp 19 | convert -background transparent -fill white -font $font -gravity center -size x160 label:$wordmark $drawable-xhdpi/ic_logo_wordmark_private.webp 20 | convert -background transparent -fill black -font $font -gravity center -size x160 label:$wordmark $drawable-xhdpi/ic_wordmark_text_normal.webp 21 | convert -background transparent -fill white -font $font -gravity center -size x160 label:$wordmark $drawable-xhdpi/ic_wordmark_text_private.webp 22 | 23 | convert -background transparent -fill black -font $font -gravity center -size x240 label:$wordmark $drawable-xxhdpi/ic_logo_wordmark_normal.webp 24 | convert -background transparent -fill white -font $font -gravity center -size x240 label:$wordmark $drawable-xxhdpi/ic_logo_wordmark_private.webp 25 | convert -background transparent -fill black -font $font -gravity center -size x240 label:$wordmark $drawable-xxhdpi/ic_wordmark_text_normal.webp 26 | convert -background transparent -fill white -font $font -gravity center -size x240 label:$wordmark $drawable-xxhdpi/ic_wordmark_text_private.webp 27 | 28 | convert -background transparent -fill black -font $font -gravity center -size x320 label:$wordmark $drawable-xxxhdpi/ic_logo_wordmark_normal.webp 29 | convert -background transparent -fill white -font $font -gravity center -size x320 label:$wordmark $drawable-xxxhdpi/ic_logo_wordmark_private.webp 30 | convert -background transparent -fill black -font $font -gravity center -size x320 label:$wordmark $drawable-xxxhdpi/ic_wordmark_text_normal.webp 31 | convert -background transparent -fill white -font $font -gravity center -size x320 label:$wordmark $drawable-xxxhdpi/ic_wordmark_text_private.webp 32 | -------------------------------------------------------------------------------- /scripts/get_latest_version.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # 3 | # common.py - part of the FDroid server tools 4 | # 5 | # Copyright (C) 2010-2016, Ciaran Gultnieks, ciaran@ciarang.com 6 | # Copyright (C) 2013-2017, Daniel Martí 7 | # Copyright (C) 2013-2021, Hans-Christoph Steiner 8 | # Copyright (C) 2017-2018, Torsten Grote 9 | # Copyright (C) 2017, tobiasKaminsky 10 | # Copyright (C) 2017-2021, Michael Pöhn 11 | # Copyright (C) 2017,2021, mimi89999 12 | # Copyright (C) 2019-2021, Jochen Sprickerhof 13 | # Copyright (C) 2021, Felix C. Stegerman 14 | # 15 | # This program is free software: you can redistribute it and/or modify 16 | # it under the terms of the GNU Affero General Public License as published by 17 | # the Free Software Foundation, either version 3 of the License, or 18 | # (at your option) any later version. 19 | # 20 | # This program is distributed in the hope that it will be useful, 21 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 22 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 23 | # GNU Affero General Public License for more details. 24 | # 25 | # You should have received a copy of the GNU Affero General Public License 26 | # along with this program. If not, see . 27 | 28 | import logging 29 | import os 30 | import sys 31 | import zipfile 32 | import androguard 33 | from androguard.core.apk import APK 34 | from androguard.core.axml import AXMLParser, format_value, START_TAG, END_TAG, TEXT, END_DOCUMENT 35 | import androguard.util 36 | 37 | def get_androguard_APK(apkfile, skip_analysis=False): 38 | return APK(apkfile, skip_analysis=skip_analysis) 39 | 40 | def ensure_final_value(packageName, arsc, value): 41 | """Ensure incoming value is always the value, not the resid. 42 | 43 | androguard will sometimes return the Android "resId" aka 44 | Resource ID instead of the actual value. This checks whether 45 | the value is actually a resId, then performs the Android 46 | Resource lookup as needed. 47 | """ 48 | if value: 49 | returnValue = value 50 | if value[0] == '@': 51 | try: # can be a literal value or a resId 52 | res_id = int('0x' + value[1:], 16) 53 | res_id = arsc.get_id(packageName, res_id)[1] 54 | returnValue = arsc.get_string(packageName, res_id)[1] 55 | except (ValueError, TypeError): 56 | pass 57 | return returnValue 58 | return '' 59 | 60 | 61 | def get_apk_id_androguard(apkfile): 62 | """Read (appid, versionCode, versionName) from an APK. 63 | 64 | This first tries to do quick binary XML parsing to just get the 65 | values that are needed. It will fallback to full androguard 66 | parsing, which is slow, if it can't find the versionName value or 67 | versionName is set to a Android String Resource (e.g. an integer 68 | hex value that starts with @). 69 | 70 | This function is part of androguard as get_apkid(), so this 71 | vendored and modified to return versionCode as an integer. 72 | 73 | """ 74 | if not os.path.exists(apkfile): 75 | raise Exception("Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" 76 | .format(apkfilename=apkfile)) 77 | 78 | appid = None 79 | versionCode = None 80 | versionName = None 81 | with zipfile.ZipFile(apkfile) as apk: 82 | with apk.open('AndroidManifest.xml') as manifest: 83 | axml = AXMLParser(manifest.read()) 84 | count = 0 85 | while axml.is_valid(): 86 | _type = next(axml) 87 | count += 1 88 | if _type == START_TAG: 89 | for i in range(0, axml.getAttributeCount()): 90 | name = axml.getAttributeName(i) 91 | _type = axml.getAttributeValueType(i) 92 | _data = axml.getAttributeValueData(i) 93 | value = format_value(_type, _data, lambda _: axml.getAttributeValue(i)) 94 | if appid is None and name == 'package': 95 | appid = value 96 | elif versionCode is None and name == 'versionCode': 97 | if value.startswith('0x'): 98 | versionCode = int(value, 16) 99 | else: 100 | versionCode = int(value) 101 | elif versionName is None and name == 'versionName': 102 | versionName = value 103 | 104 | if axml.getName() == 'manifest': 105 | break 106 | elif _type in (END_TAG, TEXT, END_DOCUMENT): 107 | raise RuntimeError('{path}: must be the first element in AndroidManifest.xml' 108 | .format(path=apkfile)) 109 | 110 | if not versionName or versionName[0] == '@': 111 | a = get_androguard_APK(apkfile) 112 | versionName = ensure_final_value(a.package, a.get_android_resources(), a.get_androidversion_name()) 113 | if not versionName: 114 | versionName = '' # versionName is expected to always be a str 115 | 116 | return appid, versionCode, versionName.strip('\0') 117 | 118 | def main(params): 119 | # Disable logging since the output of this script is parsed 120 | androguard.util.set_log('ERROR') 121 | 122 | latest_vercode, latest_vername = None, None 123 | for apk in params: 124 | if not os.path.exists(apk) or not os.path.isfile(apk): 125 | raise RuntimeError(f"APK file {apk} does not exist or is not a file") 126 | 127 | appid, vercode, vername = get_apk_id_androguard(apk) 128 | # print("APK:", apk) 129 | # print(" ID:", appid) 130 | # print(" Version code:", vercode) 131 | # print(" Version name:", vername) 132 | 133 | if not latest_vercode or latest_vercode < vercode: # type: ignore 134 | latest_vercode = vercode 135 | latest_vername = vername 136 | 137 | if not latest_vercode: 138 | raise RuntimeError("Failed to find latest version code") 139 | 140 | if not latest_vername: 141 | raise RuntimeError("Failed to find latest version name") 142 | 143 | print("{}:{}".format(latest_vercode, latest_vername)) 144 | 145 | if __name__ == "__main__": 146 | main(sys.argv[1:]) 147 | -------------------------------------------------------------------------------- /scripts/get_sources.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail 4 | 5 | source "$(dirname $0)/versions.sh" 6 | 7 | clone_repo() { 8 | url="$1" 9 | path="$2" 10 | tag="$3" 11 | 12 | if [[ "$url" == "" ]]; then 13 | echo "URL missing for clone" 14 | exit 1 15 | fi 16 | 17 | if [[ "$path" == "" ]]; then 18 | echo "Path is required for cloning '$url'" 19 | exit 1 20 | fi 21 | 22 | if [[ "$tag" == "" ]]; then 23 | echo "Tag name is required for cloning '$url'" 24 | exit 1 25 | fi 26 | 27 | if [[ -f "$path" ]]; then 28 | echo "'$path' exists and is not a directory" 29 | exit 1 30 | fi 31 | 32 | if [[ -d "$path" ]]; then 33 | echo "'$path' already exists" 34 | read -p "Do you want to re-clone this repository? [y/N] " -n 1 -r 35 | echo 36 | if [[ $REPLY =~ ^[Nn]$ ]]; then 37 | return 0 38 | fi 39 | fi 40 | 41 | echo "Cloning $url::$tag" 42 | git clone --branch "$tag" --depth=1 "$url" "$path" 43 | } 44 | 45 | download() { 46 | local url="$1" 47 | local filepath="$2" 48 | 49 | if [[ "$url" == "" ]]; then 50 | echo "URL is required (file: '$filepath')" 51 | exit 1 52 | fi 53 | 54 | if [ -f "$filepath" ]; then 55 | echo "$filepath already exists." 56 | read -p "Do you want to re-download? [y/N] " -n 1 -r 57 | echo 58 | if [[ $REPLY =~ ^[Yy]$ ]]; then 59 | echo "Removing $filepath..." 60 | rm -f "$filepath" 61 | else 62 | return 0 63 | fi 64 | fi 65 | 66 | mkdir -p "$(dirname "$filepath")" 67 | 68 | echo "Downloading $url" 69 | wget "$url" -O "$filepath" 70 | } 71 | 72 | # Extract zip removing top level directory 73 | extract_rmtoplevel() { 74 | local archive_path="$1" 75 | local to_name="$2" 76 | local extract_to="${ROOTDIR}/$to_name" 77 | 78 | if ! [[ -f "$archive_path" ]]; then 79 | echo "Archive '$archive_path' does not exist!" 80 | fi 81 | 82 | # Create temporary directory for extraction 83 | local temp_dir=$(mktemp -d) 84 | 85 | # Extract based on file extension 86 | case "$archive_path" in 87 | *.zip) 88 | unzip -q "$archive_path" -d "$temp_dir" 89 | ;; 90 | *.tar.gz) 91 | tar xzf "$archive_path" -C "$temp_dir" 92 | ;; 93 | *.tar.xz) 94 | tar xJf "$archive_path" -C "$temp_dir" 95 | ;; 96 | *) 97 | echo "Unsupported archive format: $archive_path" 98 | rm -rf "$temp_dir" 99 | exit 1 100 | ;; 101 | esac 102 | 103 | local top_dir=$(ls "$temp_dir") 104 | local to_parent=$(dirname "$extract_to") 105 | 106 | rm -rf "$extract_to" 107 | mkdir -p "$to_parent" 108 | mv "$temp_dir/$top_dir" "$to_parent/$to_name" 109 | 110 | rm -rf "$temp_dir" 111 | } 112 | 113 | download_and_extract() { 114 | local repo_name="$1" 115 | local url="$2" 116 | 117 | local extension 118 | if [[ "$url" =~ \.tar\.xz$ ]]; then 119 | extension=".tar.xz" 120 | elif [[ "$url" =~ \.tar\.gz$ ]]; then 121 | extension=".tar.gz" 122 | else 123 | extension=".zip" 124 | fi 125 | 126 | local repo_archive="${BUILDDIR}/${repo_name}${extension}" 127 | 128 | download "$url" "$repo_archive" 129 | 130 | if [ ! -f "$repo_archive" ]; then 131 | echo "Source archive for $repo_name does not exist." 132 | exit 1 133 | fi 134 | 135 | echo "Extracting $repo_archive" 136 | extract_rmtoplevel "$repo_archive" "$repo_name" 137 | echo 138 | } 139 | 140 | mkdir -p "$BUILDDIR" 141 | 142 | if ! [[ -f "$BUILDDIR/bundletool.jar" ]]; then 143 | echo "Downloading bundletool..." 144 | wget https://github.com/google/bundletool/releases/download/${BUNDLETOOL_TAG}/bundletool-all-${BUNDLETOOL_TAG}.jar \ 145 | -O "$BUILDDIR/bundletool.jar" 146 | fi 147 | 148 | if ! [[ -f "$BUILDDIR/bundletool" ]]; then 149 | echo "Creating bundletool script..." 150 | { 151 | echo '#!/bin/bash' 152 | echo "exec java -jar ${BUILDDIR}/bundletool.jar \"\$@\"" 153 | } > "$BUILDDIR/bundletool" 154 | chmod +x "$BUILDDIR/bundletool" 155 | fi 156 | 157 | echo "'bundletool' is set up at $BUILDDIR/bundletool" 158 | 159 | # Clone Glean 160 | clone_repo "https://github.com/mozilla/glean" "$GLEANDIR" "$GLEAN_TAG" 161 | 162 | # Clone MicroG 163 | clone_repo "https://github.com/microg/GmsCore" "$GMSCOREDIR" "$GMSCORE_TAG" 164 | 165 | # Get WebAssembly SDK 166 | if [[ -z ${FDROID_BUILD+x} ]]; then 167 | echo "Downloading prebuilt wasi-sdk..." 168 | download_and_extract "wasi-sdk" "https://github.com/itsaky/ironfox/releases/download/$WASI_TAG/$WASI_TAG-firefox.tar.xz" 169 | else 170 | echo "Cloning wasi-sdk..." 171 | clone_repo "https://github.com/WebAssembly/wasi-sdk" "$WASISDKDIR" "$WASI_TAG" 172 | (cd "$WASISDKDIR" && git submodule update --init --depth=1) 173 | fi 174 | 175 | # Clone application-services 176 | echo "Cloning appservices..." 177 | clone_repo "https://github.com/mozilla/application-services" "$APPSERVICESDIR" "$APPSERVICES_TAG" 178 | (cd "$APPSERVICESDIR" && git submodule update --init --depth=1) 179 | 180 | # Download Firefox Source 181 | download_and_extract "gecko" "https://archive.mozilla.org/pub/firefox/${FIREFOX_RELEASE_PATH}/source/firefox-${FIREFOX_VERSION}.source.tar.xz" 182 | #download_and_extract "gecko" "https://github.com/mozilla-firefox/firefox/archive/refs/tags/${FIREFOX_RELEASE_TAG}.tar.gz" 183 | 184 | # Write env_local.sh 185 | echo "Writing ${ENV_SH}..." 186 | cat > "$ENV_SH" << EOF 187 | export patches=${PATCHDIR} 188 | export rootdir=${ROOTDIR} 189 | export builddir="${BUILDDIR}" 190 | export android_components=${ANDROID_COMPONENTS} 191 | export application_services=${APPSERVICESDIR} 192 | export glean=${GLEANDIR} 193 | export fenix=${FENIX} 194 | export mozilla_release=${GECKODIR} 195 | export gmscore=${GMSCOREDIR} 196 | export wasi=${WASISDKDIR} 197 | 198 | source "\$rootdir/scripts/env_common.sh" 199 | EOF 200 | -------------------------------------------------------------------------------- /scripts/localize_maven.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import re 3 | import argparse 4 | 5 | def localize_maven(file_path): 6 | """ 7 | Localize Maven repositories, replacing non-plugin repositories with mavenLocal(). 8 | 9 | Handles: 10 | - Nested braces 11 | - Single and multi-line comments 12 | - Both Groovy and Kotlin DSL syntax 13 | """ 14 | with open(file_path, "r") as f: 15 | lines = f.readlines() 16 | 17 | processed_lines = [] 18 | maven_block_content = [] 19 | in_maven_block = False 20 | in_comment = False 21 | ignore = False 22 | brace_depth = 0 23 | 24 | for line in lines: 25 | # Handle single-line comments 26 | if not in_maven_block and re.match(r'^\s*//.*$', line): 27 | processed_lines.append(line) 28 | continue 29 | 30 | # Handle multi-line comments 31 | if not in_comment and "/*" in line: 32 | if "*/" not in line: 33 | in_comment = True 34 | if in_maven_block: 35 | maven_block_content.append(line) 36 | else: 37 | processed_lines.append(line) 38 | continue 39 | 40 | if in_comment: 41 | if "*/" in line: 42 | in_comment = False 43 | if in_maven_block: 44 | maven_block_content.append(line) 45 | else: 46 | processed_lines.append(line) 47 | continue 48 | 49 | # Track maven blocks 50 | if not in_maven_block and len(re.findall(r'maven\s*\{', line)) > 0: 51 | in_maven_block = True 52 | brace_depth = 1 53 | maven_block_content = [line] 54 | ignore = False 55 | continue 56 | 57 | if in_maven_block: 58 | brace_depth += line.count("{") - line.count("}") 59 | maven_block_content.append(line) 60 | 61 | if "plugins.gradle.org" in line: 62 | ignore = True 63 | 64 | if brace_depth == 0: 65 | if ignore: 66 | processed_lines.extend(maven_block_content) 67 | else: 68 | processed_lines.append(" mavenLocal()\n") 69 | 70 | # Reset state 71 | in_maven_block = False 72 | maven_block_content = [] 73 | ignore = False 74 | continue 75 | 76 | if not in_maven_block: 77 | processed_lines.append(line) 78 | 79 | with open(file_path, "w") as f: 80 | f.writelines(processed_lines) 81 | 82 | print(f"Processed file: {file_path}") 83 | 84 | 85 | def main(): 86 | parser = argparse.ArgumentParser( 87 | description="Localize Maven repositories in Gradle build files." 88 | ) 89 | parser.add_argument("file", help="Path to the Gradle build file") 90 | args = parser.parse_args() 91 | 92 | localize_maven(args.file) 93 | 94 | 95 | if __name__ == "__main__": 96 | main() 97 | -------------------------------------------------------------------------------- /scripts/setup-android-sdk.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | SDK_REVISION=13114758 4 | ANDROID_SDK_FILE=commandlinetools-linux-${SDK_REVISION}_latest.zip 5 | 6 | if [[ "${ANDROID_HOME+x}" == "" ]]; then 7 | export ANDROID_HOME=$HOME/android-sdk 8 | fi 9 | 10 | export ANDROID_SDK_ROOT="$ANDROID_HOME" 11 | 12 | if [ ! -d "$ANDROID_HOME" ]; then 13 | mkdir -p "$ANDROID_HOME" 14 | cd "$ANDROID_HOME/.." || exit 1 15 | rm -Rf "$(basename "$ANDROID_HOME")" 16 | 17 | # https://developer.android.com/studio/index.html#command-tools 18 | echo "Downloading Android SDK..." 19 | wget https://dl.google.com/android/repository/${ANDROID_SDK_FILE} -O tools-$SDK_REVISION.zip 20 | rm -Rf "$ANDROID_HOME" 21 | mkdir -p "$ANDROID_HOME/cmdline-tools" 22 | unzip -q tools-$SDK_REVISION.zip -d "$ANDROID_HOME/cmdline-tools" 23 | mv "$ANDROID_HOME/cmdline-tools/cmdline-tools" "$ANDROID_HOME/cmdline-tools/latest" 24 | rm -vf tools-$SDK_REVISION.zip 25 | fi 26 | 27 | if [ -x "$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" ]; then 28 | SDK_MANAGER="$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" 29 | elif [ -x "$ANDROID_HOME/cmdline-tools/bin/sdkmanager" ]; then 30 | SDK_MANAGER="$ANDROID_HOME/cmdline-tools/bin/sdkmanager" 31 | else 32 | echo "ERROR: no usable sdkmanager found in $ANDROID_HOME" >&2 33 | echo "Checking other possible paths: (empty if not found)" >&2 34 | find "$ANDROID_HOME" -type f -name sdkmanager >&2 35 | return 36 | fi 37 | 38 | PATH=$PATH:$(dirname "$SDK_MANAGER") 39 | export PATH 40 | 41 | # Accept licenses 42 | { yes || true; } | sdkmanager --sdk_root="$ANDROID_HOME" --licenses 43 | 44 | $SDK_MANAGER 'build-tools;36.0.0' # for GeckoView 45 | $SDK_MANAGER 'ndk;28.0.13004108' # for GleanAS 46 | $SDK_MANAGER 'ndk;28.1.13356709' # for mozbuild; application-services 47 | 48 | export ANDROID_NDK="$ANDROID_HOME/ndk/28.1.13356709" 49 | [ -d "$ANDROID_NDK" ] || { 50 | echo "$ANDROID_NDK does not exist." 51 | return 52 | } 53 | 54 | echo "INFO: Using sdkmanager ... $SDK_MANAGER" 55 | echo "INFO: Using NDK ... $ANDROID_NDK" 56 | -------------------------------------------------------------------------------- /scripts/versions.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # shellcheck disable=SC2034 3 | 4 | # Sources 5 | FIREFOX_VERSION="139.0" 6 | FIREFOX_RELEASE_TAG="FIREFOX-ANDROID_${FIREFOX_VERSION//./_}_RELEASE" 7 | FIREFOX_RELEASE_PATH="releases/${FIREFOX_VERSION}" 8 | #FIREFOX_RC_BUILD_NAME="build1" 9 | #FIREFOX_RELEASE_TAG="FIREFOX_${FIREFOX_VERSION//./_}_${FIREFOX_RC_BUILD_NAME^^}" 10 | #FIREFOX_RELEASE_PATH="candidates/${FIREFOX_VERSION}-candidates/${FIREFOX_RC_BUILD_NAME}" 11 | WASI_TAG="wasi-sdk-20" 12 | GLEAN_TAG="v64.1.1" 13 | GMSCORE_TAG="v0.3.7.250932" 14 | APPSERVICES_TAG="v139.0" 15 | 16 | # Tools 17 | BUNDLETOOL_TAG="1.18.0" 18 | RUST_VERSION="1.83.0" 19 | CBINDGEN_VERSION="0.28.0" 20 | 21 | # Configuration 22 | ROOTDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" 23 | ENV_SH="${ROOTDIR}/scripts/env_local.sh" 24 | BUILDDIR="${ROOTDIR}/build" 25 | PATCHDIR="${ROOTDIR}/patches" 26 | GECKODIR="${ROOTDIR}/gecko" 27 | GLEANDIR="${ROOTDIR}/glean" 28 | APPSERVICESDIR="${ROOTDIR}/appservices" 29 | GMSCOREDIR="${ROOTDIR}/gmscore" 30 | WASISDKDIR="${ROOTDIR}/wasi-sdk" 31 | ANDROID_COMPONENTS="${GECKODIR}/mobile/android/android-components" 32 | FENIX="${GECKODIR}/mobile/android/fenix" 33 | --------------------------------------------------------------------------------