├── .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 |
--------------------------------------------------------------------------------