tbb-commits
Threads by month
- ----- 2025 -----
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
September 2024
- 1 participants
- 250 discussions

[Git][tpo/applications/tor-browser-build][maint-13.5] Bug 41245, 41235: Prepare Tor, Mullvad Browser 13.5.6
by ma1 (@ma1) 30 Sep '24
by ma1 (@ma1) 30 Sep '24
30 Sep '24
ma1 pushed to branch maint-13.5 at The Tor Project / Applications / tor-browser-build
Commits:
b32fad62 by hackademix at 2024-10-01T01:09:21+02:00
Bug 41245,41235: Prepare Tor,Mullvad Browser 13.5.6
- - - - -
8 changed files:
- projects/browser/Bundle-Data/Docs-MB/ChangeLog.txt
- projects/browser/Bundle-Data/Docs-TBB/ChangeLog.txt
- projects/browser/allowed_addons.json
- projects/browser/config
- projects/firefox/config
- projects/geckoview/config
- projects/translation/config
- rbm.conf
Changes:
=====================================
projects/browser/Bundle-Data/Docs-MB/ChangeLog.txt
=====================================
@@ -1,3 +1,93 @@
+Mullvad Browser 13.5.6 - September 30 2024
+ * All Platforms
+ * Updated Firefox to 115.16.0esr
+ * Updated NoScript to 11.4.40
+ * Bug 356: Rebase Mullvad Browser Release onto Firefox 115.16.0esr [mullvad-browser]
+ * Bug 42832: Download spam prevention should not affect browser extensions [tor-browser]
+ * Bug 43173: Backport security fixes from Firefox 131 [tor-browser]
+ * Linux
+ * Bug 334: When set as default browser on Linux in standard mode, links don't open correctly [mullvad-browser]
+ * Build System
+ * macOS
+ * Bug 41231: Use var/browser_release_date in tools/signing/gatekeeper-bundling.sh [tor-browser-build]
+
+Mullvad Browser 14.0a7 - September 27 2024
+ * All Platforms
+ * Updated Firefox to 128.3.0esr
+ * Updated NoScript to 11.4.40
+ * Bug 355: Rebase Mullvad Browser Alpha onto Firefox 128.3.0esr [mullvad-browser]
+ * Bug 42070: Backport Bugzilla 1834307 and hide smooth-scroll UX [tor-browser]
+ * Bug 42362: "New window" missing from File menu [tor-browser]
+ * Bug 42742: Inconsistent use of "New private window" vs "New window" [tor-browser]
+ * Bug 42832: Download spam prevention should not affect browser extensions [tor-browser]
+ * Bug 43163: Disable offscreen canvas until verified it is not fingerprintable [tor-browser]
+ * Bug 41248: Check and update bundled font versions [tor-browser-build]
+ * Build System
+ * All Platforms
+ * Bug 41236: Remove binutils when not needed [tor-browser-build]
+
+Mullvad Browser 14.0a6 - September 19 2024
+ * All Platforms
+ * Bug 344: set media.navigator.enabled = true [mullvad-browser]
+ * Bug 42718: Remove the firefox-view button from UI, even when always-on private-browsing mode is disabled [tor-browser]
+ * Bug 42740: Stop trying to hide "Restore previous session" [tor-browser]
+ * Bug 42831: Remove the shopping components [tor-browser]
+ * Bug 43072: moz-message-bar does not get announced on Orca screen-reader [tor-browser]
+ * Bug 43083: Backport fix for Mozilla 1436462 [tor-browser]
+ * Bug 43144: Ensure non-privacy browsing also sets the GPC header [tor-browser]
+ * Linux
+ * Bug 43141: Hardcode Arimo as a system-ui font [tor-browser]
+ * Bug 41237: Add some aliases to our Linux font config for compatibility [tor-browser-build]
+
+Mullvad Browser 14.0a5 - September 12 2024
+ * All Platforms
+ * Updated NoScript to 11.4.37
+ * Bug 328: Provide search engine icons [mullvad-browser]
+ * Bug 42255: pdfjs.disabled used to be part of RFP until Bug 1838415; lock pref to false in stable [tor-browser]
+ * Bug 42647: "Switching to a new device" regressed on 128 [tor-browser]
+ * Bug 42653: The Neterror page has a checkbox to report iframe origin errors to TPO [tor-browser]
+ * Bug 42777: Remove 'Website Privacy Preferences' and ensure sensible default prefs [tor-browser]
+ * Bug 43046: Review Mozilla 1866927: Adds ability to enable email tracker blocking protection in private mode [tor-browser]
+ * Bug 43054: check bounceTrackingProtection in PB mode does not persist to disk [tor-browser]
+ * Bug 43109: Remove mention of Firefox Relay from settings [tor-browser]
+ * Bug 43117: Hide 'Always underline links' option [tor-browser]
+ * Linux
+ * Bug 334: When set as default browser on Linux in standard mode, links don't open correctly [mullvad-browser]
+ * Build System
+ * macOS
+ * Bug 41231: Use var/browser_release_date in tools/signing/gatekeeper-bundling.sh [tor-browser-build]
+
+Mullvad Browser 14.0a4 - September 06 2024
+ * All Platforms
+ * Updated NoScript to 11.4.35
+ * Bug 329: Remove the Security Levels icon from the toolbar [mullvad-browser]
+ * Bug 30862: 10ms time precision via EXSLT date-time function [tor-browser]
+ * Bug 40147: Re-enable Picture-in-Picture mode [tor-browser]
+ * Bug 41309: Re-enable screenshots component [tor-browser]
+ * Bug 42601: Check Bug 1894779: Allow font-face urls to be resource:// urls and relax CORS for resource:// URLs [tor-browser]
+ * Bug 42617: Restore the HTML form on DDG when using safest in 128 [tor-browser]
+ * Bug 42630: Review LaterRun in 128 [tor-browser]
+ * Bug 42640: Disable Firefox Flame button due to unknown interactions with New Identity [tor-browser]
+ * Bug 42684: Disable network prefetch [tor-browser]
+ * Bug 42685: compat: ESR128: enable textmetrics [tor-browser]
+ * Bug 42686: Backport Mozilla 1885101 [tor-browser]
+ * Bug 42730: Make RemoteSettings use only local dumps [tor-browser]
+ * Bug 42735: Disable recent search suggestions [tor-browser]
+ * Bug 42745: Remove some residuals from update scripts [tor-browser]
+ * Bug 42764: Unconditionally disable find-bar transition animation [tor-browser]
+ * Bug 42867: Disable contentRelevancy component [tor-browser]
+ * Bug 43100: Backport security fixes from Firefox 130 [tor-browser]
+ * Bug 43103: Verify whether an update is unsupported before choosing one [tor-browser]
+ * macOS
+ * Bug 42494: mac: add Arial Black and Arial Narrow to allowlist [tor-browser]
+ * Linux
+ * Bug 42773: Replace ~ with the original HOME [tor-browser]
+ * Bug 43092: Disable Wayland by default in 14.0 [tor-browser]
+ * Build System
+ * All Platforms
+ * Bug 41096: Set SOURCE_DATE_EPOCH in the default env variables [tor-browser-build]
+ * Bug 41188: Upgrade binutils to 2.41 [tor-browser-build]
+
Mullvad Browser 13.5.3 - September 03 2024
* All Platforms
* Updated Firefox to 115.15.0esr
=====================================
projects/browser/Bundle-Data/Docs-TBB/ChangeLog.txt
=====================================
@@ -1,8 +1,51 @@
-Tor Browser 13.5.5 - September 25 2024
+Tor Browser 13.5.6 - September 30 2024
+ * All Platforms
+ * Updated NoScript to 11.4.40
+ * Bug 42832: Download spam prevention should not affect browser extensions [tor-browser]
+ * Bug 43167: Rebase Tor Browser Stable onto 115.16.0esr [tor-browser]
+ * Bug 43173: Backport security fixes from Firefox 131 [tor-browser]
+ * Windows + macOS + Linux
+ * Updated Firefox to 115.16.0esr
+ * Bug 42737: Drop the hash check on updates [tor-browser]
+ * Bug 43098: YEC 2024 Takeover for Desktop Stable [tor-browser]
* Windows + macOS
- * Bug 43125: Update message for legacy OS (windows ≤8.1, macOS ≤10.14) users [tor-browser]
- * Linux
- * Bug 334: When set as default browser on Linux in standard mode, links don't open correctly [mullvad-browser]
+ * Bug 42747: Windows 7/8 and macOS 10.12-10.14 Legacy/Maintenance [tor-browser]
+ * Android
+ * Updated GeckoView to 115.16.0esr
+ * Bug 43099: YEC 2024 Takeover for Android Stable [tor-browser]
+
+Tor Browser 14.0a7 - September 27 2024
+ * All Platforms
+ * Updated NoScript to 11.4.40
+ * Bug 42832: Download spam prevention should not affect browser extensions [tor-browser]
+ * Bug 43163: Disable offscreen canvas until verified it is not fingerprintable [tor-browser]
+ * Bug 43166: Rebase Tor Browser alpha onto Firefox 128.3.0esr [tor-browser]
+ * Windows + macOS + Linux
+ * Updated Firefox to 128.3.0esr
+ * Bug 42070: Backport Bugzilla 1834307 and hide smooth-scroll UX [tor-browser]
+ * Bug 42362: "New window" missing from File menu [tor-browser]
+ * Bug 42742: Inconsistent use of "New private window" vs "New window" [tor-browser]
+ * Bug 41248: Check and update bundled font versions [tor-browser-build]
+ * Android
+ * Updated GeckoView to 128.3.0esr
+ * Bug 43172: remove remote settings and SERPTelemetry [tor-browser]
+ * Build System
+ * All Platforms
+ * Updated Go to 1.23.1
+ * Bug 41236: Remove binutils when not needed [tor-browser-build]
+ * Windows + macOS + Linux
+ * Bug 41246: Add updater rewriterules to make 13.5a10 a watershed [tor-browser-build]
+
+Tor Browser 13.5a10 - September 25 2024
+ * Windows + macOS + Linux
+ * Updated Firefox to 115.15.0esr
+ * Updated NoScript to 11.4.37
+ * Updated OpenSSL to 3.0.15
+ * Windows + macOS
+ * Bug 42747: Windows 7/8 and macOS 10.12-10.14 Legacy/Maintenance [tor-browser]
+ * Build System
+ * Windows + macOS + Linux
+ * Updated Go to 1.21.12
Tor Browser 14.0a6 - September 19 2024
* All Platforms
=====================================
projects/browser/allowed_addons.json
=====================================
@@ -17,7 +17,7 @@
"picture_url": "https://addons.mozilla.org/user-media/userpics/34/9734/13299734/13299734.pn…"
}
],
- "average_daily_users": 1198801,
+ "average_daily_users": 1204514,
"categories": {
"firefox": [
"web-development",
@@ -218,10 +218,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.5264,
- "bayesian_average": 4.525326004974587,
- "count": 5857,
- "text_count": 1842
+ "average": 4.5262,
+ "bayesian_average": 4.525128945531112,
+ "count": 5874,
+ "text_count": 1848
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/darkreader/reviews/",
"requires_payment": false,
@@ -318,7 +318,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/darkreader/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/darkreader/versions/",
- "weekly_downloads": 27576
+ "weekly_downloads": 27270
},
"notes": null
},
@@ -334,7 +334,7 @@
"picture_url": "https://addons.mozilla.org/user-media/userpics/56/7656/6937656/6937656.png?…"
}
],
- "average_daily_users": 256931,
+ "average_daily_users": 257341,
"categories": {
"firefox": [
"privacy-security"
@@ -547,9 +547,9 @@
"category": "recommended"
},
"ratings": {
- "average": 4.7942,
- "bayesian_average": 4.789582900272357,
- "count": 1458,
+ "average": 4.7944,
+ "bayesian_average": 4.7897830310986445,
+ "count": 1459,
"text_count": 263
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/decentraleyes/reviews/",
@@ -635,7 +635,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/decentraleyes/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/decentraleyes/versions/",
- "weekly_downloads": 2895
+ "weekly_downloads": 2715
},
"notes": null
},
@@ -651,7 +651,7 @@
"picture_url": "https://addons.mozilla.org/user-media/userpics/73/4073/5474073/5474073.png?…"
}
],
- "average_daily_users": 1266195,
+ "average_daily_users": 1271165,
"categories": {
"firefox": [
"privacy-security"
@@ -1170,9 +1170,9 @@
"category": "recommended"
},
"ratings": {
- "average": 4.8028,
- "bayesian_average": 4.800114682839264,
- "count": 2515,
+ "average": 4.803,
+ "bayesian_average": 4.800317190701833,
+ "count": 2518,
"text_count": 474
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-badger17/reviews/",
@@ -1197,7 +1197,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-badger17/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-badger17/versions/",
- "weekly_downloads": 23651
+ "weekly_downloads": 23241
},
"notes": null
},
@@ -1213,7 +1213,7 @@
"picture_url": null
}
],
- "average_daily_users": 8366519,
+ "average_daily_users": 8420658,
"categories": {
"firefox": [
"privacy-security"
@@ -1378,7 +1378,7 @@
},
"is_disabled": false,
"is_experimental": false,
- "last_updated": "2024-09-22T16:00:37Z",
+ "last_updated": "2024-09-29T16:50:40Z",
"name": {
"ar": "uBlock Origin",
"bg": "uBlock Origin",
@@ -1523,10 +1523,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.7907,
- "bayesian_average": 4.79033490555104,
- "count": 18453,
- "text_count": 4820
+ "average": 4.791,
+ "bayesian_average": 4.790635808907738,
+ "count": 18504,
+ "text_count": 4830
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/reviews/",
"requires_payment": false,
@@ -1589,7 +1589,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/versions/",
- "weekly_downloads": 200561
+ "weekly_downloads": 199435
},
"notes": null
},
@@ -1605,7 +1605,7 @@
"picture_url": null
}
],
- "average_daily_users": 185437,
+ "average_daily_users": 186259,
"categories": {
"firefox": [
"photos-music-videos",
@@ -1701,10 +1701,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.4547,
- "bayesian_average": 4.449884980099753,
- "count": 1280,
- "text_count": 495
+ "average": 4.4528,
+ "bayesian_average": 4.447998328835177,
+ "count": 1283,
+ "text_count": 498
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/video-background-play-fix/re…",
"requires_payment": false,
@@ -1726,7 +1726,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/video-background-play-fix/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/video-background-play-fix/ve…",
- "weekly_downloads": 383
+ "weekly_downloads": 343
},
"notes": null
},
@@ -1742,7 +1742,7 @@
"picture_url": null
}
],
- "average_daily_users": 63093,
+ "average_daily_users": 63018,
"categories": {
"firefox": [
"privacy-security",
@@ -1877,7 +1877,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-possum/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-possum/versions/",
- "weekly_downloads": 315
+ "weekly_downloads": 280
},
"notes": null
},
@@ -1893,7 +1893,7 @@
"picture_url": "https://addons.mozilla.org/user-media/userpics/64/9064/12929064/12929064.pn…"
}
],
- "average_daily_users": 362010,
+ "average_daily_users": 363451,
"categories": {
"firefox": [
"search-tools",
@@ -2110,10 +2110,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.6193,
- "bayesian_average": 4.615135958292723,
- "count": 1547,
- "text_count": 309
+ "average": 4.6174,
+ "bayesian_average": 4.613245740860053,
+ "count": 1550,
+ "text_count": 310
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/search_by_image/reviews/",
"requires_payment": false,
@@ -2136,7 +2136,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/search_by_image/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/search_by_image/versions/",
- "weekly_downloads": 5685
+ "weekly_downloads": 5585
},
"notes": null
},
@@ -2159,7 +2159,7 @@
"picture_url": null
}
],
- "average_daily_users": 122255,
+ "average_daily_users": 122336,
"categories": {
"firefox": [
"search-tools",
@@ -2440,9 +2440,9 @@
"category": "recommended"
},
"ratings": {
- "average": 4.3811,
- "bayesian_average": 4.3767733606543135,
- "count": 1396,
+ "average": 4.3815,
+ "bayesian_average": 4.377175971962635,
+ "count": 1397,
"text_count": 392
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/google-search-fixer/reviews/",
@@ -2463,7 +2463,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/google-search-fixer/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/google-search-fixer/versions/",
- "weekly_downloads": 35
+ "weekly_downloads": 25
},
"notes": null
},
@@ -2479,7 +2479,7 @@
"picture_url": "https://addons.mozilla.org/user-media/userpics/43/0143/143/143.png?modified…"
}
],
- "average_daily_users": 289757,
+ "average_daily_users": 290589,
"categories": {
"firefox": [
"privacy-security",
@@ -2489,7 +2489,7 @@
"contributions_url": "https://www.paypal.com/donate/?hosted_button_id=9ERKTU5MBH4EW&utm_content=p…",
"created": "2005-05-13T10:51:32Z",
"current_version": {
- "id": 5805224,
+ "id": 5813035,
"compatibility": {
"firefox": {
"min": "59.0",
@@ -2500,7 +2500,7 @@
"max": "*"
}
},
- "edit_url": "https://addons.mozilla.org/en-US/developers/addon/noscript/versions/5805224",
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/noscript/versions/5813035",
"is_strict_compatibility_enabled": false,
"license": {
"id": 13,
@@ -2511,22 +2511,22 @@
"url": "https://www.gnu.org/licenses/gpl-2.0.html"
},
"release_notes": {
- "en-US": "v 11.4.37\n============================================================\nx [nscl] Do not patch windows with WebGLHook if webgl is\n globally disabled\nx [nscl] Do not patch workers if webgl is globally disabled\nx [L10n] Updated uk\nx [nscl] Workers-aware WebGL Hook"
+ "en-US": "11.4.40\n============================================================\nx [nscl] Fix patched workers failures caused by Firefox\n webRequest filters disconnect() breaking on large files\n (thanks barbaz for reporting)\n\nv 11.4.39\n============================================================\nx [nscl] Improved WebGL-hooking and worker patching\n stability\nx [L10n] Lower to 90% the threshold for including a new\n translation\nx [L10n] Updated he, pt_PT\nx [nscl] Prevent patchWindow from throwing on SOP violations\nx [nscl] Correctly propagate extra arguments to shadowed\n worker constructors"
},
- "reviewed": "2024-09-10T14:37:13Z",
- "version": "11.4.37",
+ "reviewed": "2024-09-26T09:59:52Z",
+ "version": "11.4.40",
"files": [
{
- "id": 4349514,
- "created": "2024-09-08T16:36:27Z",
- "hash": "sha256:5e9921599c63e0b357851ea7ca1354554b3af2c676bbbfff5687cafce4396c18",
+ "id": 4357325,
+ "created": "2024-09-22T06:25:28Z",
+ "hash": "sha256:242ead426159d871480a13062cbee08abc97da746cdc5c643aee2692e9adbbb2",
"is_restart_required": false,
"is_webextension": true,
"is_mozilla_signed_extension": false,
"platform": "all",
- "size": 964305,
+ "size": 965455,
"status": "public",
- "url": "https://addons.mozilla.org/firefox/downloads/file/4349514/noscript-11.4.37.…",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/4357325/noscript-11.4.40.…",
"permissions": [
"contextMenus",
"storage",
@@ -2593,7 +2593,7 @@
},
"is_disabled": false,
"is_experimental": false,
- "last_updated": "2024-09-21T23:20:33Z",
+ "last_updated": "2024-09-26T09:59:52Z",
"name": {
"de": "NoScript",
"el": "NoScript",
@@ -2665,10 +2665,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.409,
- "bayesian_average": 4.406329174495118,
- "count": 2279,
- "text_count": 867
+ "average": 4.4095,
+ "bayesian_average": 4.406829615955648,
+ "count": 2281,
+ "text_count": 868
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/noscript/reviews/",
"requires_payment": false,
@@ -2712,7 +2712,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/noscript/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/noscript/versions/",
- "weekly_downloads": 7547
+ "weekly_downloads": 7253
},
"notes": null
},
@@ -2728,7 +2728,7 @@
"picture_url": null
}
],
- "average_daily_users": 163291,
+ "average_daily_users": 164045,
"categories": {
"firefox": [
"photos-music-videos",
@@ -2838,9 +2838,9 @@
"category": "recommended"
},
"ratings": {
- "average": 3.8362,
- "bayesian_average": 3.832209285841853,
- "count": 1282,
+ "average": 3.8371,
+ "bayesian_average": 3.8331062194266265,
+ "count": 1283,
"text_count": 464
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/youtube-high-definition/revi…",
@@ -2860,7 +2860,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/youtube-high-definition/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/youtube-high-definition/vers…",
- "weekly_downloads": 1740
+ "weekly_downloads": 1559
},
"notes": null
}
=====================================
projects/browser/config
=====================================
@@ -104,9 +104,9 @@ input_files:
enable: '[% ! c("var/android") %]'
- filename: Bundle-Data
enable: '[% ! c("var/android") %]'
- - URL: https://addons.mozilla.org/firefox/downloads/file/4349514/noscript-11.4.37.…
+ - URL: https://addons.mozilla.org/firefox/downloads/file/4357325/noscript-11.4.40.…
name: noscript
- sha256sum: 5e9921599c63e0b357851ea7ca1354554b3af2c676bbbfff5687cafce4396c18
+ sha256sum: 242ead426159d871480a13062cbee08abc97da746cdc5c643aee2692e9adbbb2
- URL: https://addons.mozilla.org/firefox/downloads/file/4328681/ublock_origin-1.5…
name: ublock-origin
sha256sum: 1db9c676a07d141f8d36dbbc24f9e3d64a6cc2340dbfc6c848bc4395f96cfb14
=====================================
projects/firefox/config
=====================================
@@ -14,12 +14,12 @@ container:
use_container: 1
var:
- firefox_platform_version: 115.15.0
+ firefox_platform_version: 115.16.0
firefox_version: '[% c("var/firefox_platform_version") %]esr'
browser_series: '13.5'
browser_rebase: 1
browser_branch: '[% c("var/browser_series") %]-[% c("var/browser_rebase") %]'
- browser_build: 5
+ browser_build: 2
branding_directory_prefix: 'tb'
copyright_year: '[% exec("git show -s --format=%ci").remove("-.*") %]'
nightly_updates_publish_dir: '[% c("var/nightly_updates_publish_dir_prefix") %]nightly-[% c("var/osname") %]'
@@ -103,7 +103,6 @@ targets:
mullvadbrowser:
git_url: https://gitlab.torproject.org/tpo/applications/mullvad-browser.git
var:
- browser_build: 2
branding_directory_prefix: 'mb'
gitlab_project: https://gitlab.torproject.org/tpo/applications/mullvad-browser
updater_url: 'https://cdn.mullvad.net/browser/update_responses/update_1/'
=====================================
projects/geckoview/config
=====================================
@@ -14,9 +14,9 @@ container:
use_container: 1
var:
- geckoview_version: 115.15.0esr
+ geckoview_version: 115.16.0esr
browser_branch: 13.5-1
- browser_build: 5
+ browser_build: 2
copyright_year: '[% exec("git show -s --format=%ci").remove("-.*") %]'
gitlab_project: https://gitlab.torproject.org/tpo/applications/tor-browser
git_commit: '[% exec("git rev-parse HEAD") %]'
=====================================
projects/translation/config
=====================================
@@ -12,13 +12,13 @@ compress_tar: 'gz'
steps:
base-browser:
base-browser: '[% INCLUDE build %]'
- git_hash: 16446c485b3be4198a7e79bfcac6510784a18506
+ git_hash: a142f78af87f994913faa15fb4b0f34f0ce1a22b
targets:
nightly:
git_hash: 'base-browser'
tor-browser:
tor-browser: '[% INCLUDE build %]'
- git_hash: a2bf4c2f45736958ac99f60e60b9f6d0e94454c3
+ git_hash: 04f824bce1b6fb4b989bb9303949af17eab11406
targets:
nightly:
git_hash: 'tor-browser'
@@ -32,7 +32,7 @@ steps:
fenix: '[% INCLUDE build %]'
# We need to bump the commit before releasing but just pointing to a branch
# might cause too much rebuidling of the Firefox part.
- git_hash: 12b033e4192448315794f5fe8203fe91dcc29a8c
+ git_hash: 559ac499551ba78889c61b5dc0669ba10a256674
compress_tar: 'zst'
targets:
nightly:
=====================================
rbm.conf
=====================================
@@ -73,18 +73,19 @@ buildconf:
git_signtag_opt: '-s'
var:
- torbrowser_version: '13.5.5'
+ torbrowser_version: '13.5.6'
torbrowser_build: 'build1'
# This should be the date of when the build is started. For the build
# to be reproducible, browser_release_date should always be in the past.
- browser_release_date: '2024/09/25 17:40:27'
+ browser_release_date: '2024/09/30 23:05:10'
browser_release_date_timestamp: '[% USE date; date.format(c("var/browser_release_date"), "%s") %]'
updater_enabled: 1
build_mar: 1
torbrowser_incremental_from:
+ - '[% IF c("var/tor-browser") %]13.5.5[% END %]'
- '[% IF c("var/tor-browser") %]13.5.4[% END %]'
- 13.5.3
- - 13.5.2
+ - '[% IF c("var/mullvad-browser") %]13.5.2[% END %]'
- '[% IF c("var/mullvad-browser") %]13.5.1[% END %]'
mar_channel_id: '[% c("var/projectname") %]-torproject-[% c("var/channel") %]'
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/b…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/b…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser] Pushed new tag mullvad-browser-115.16.0esr-13.5-1-build2
by ma1 (@ma1) 30 Sep '24
by ma1 (@ma1) 30 Sep '24
30 Sep '24
ma1 pushed new tag mullvad-browser-115.16.0esr-13.5-1-build2 at The Tor Project / Applications / Tor Browser
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/mullvad-b…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/mullvad-browser][mullvad-browser-115.16.0esr-13.5-1] 7 commits: Bug 1881037 - Part 1: Stop showing unknown protocol error pages for...
by ma1 (@ma1) 30 Sep '24
by ma1 (@ma1) 30 Sep '24
30 Sep '24
ma1 pushed to branch mullvad-browser-115.16.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser
Commits:
eafe617f by Nika Layzell at 2024-10-01T00:57:18+02:00
Bug 1881037 - Part 1: Stop showing unknown protocol error pages for web-triggered loads, r=smaug,necko-reviewers,kershaw, a=dsmith
Differential Revision: https://phabricator.services.mozilla.com/D217495
- - - - -
db726edf by Paul Zuehlcke at 2024-10-01T00:57:20+02:00
Bug 1916659, a=diannaS
Original Revision: https://phabricator.services.mozilla.com/D222629
Differential Revision: https://phabricator.services.mozilla.com/D222934
- - - - -
be142b0d by André Bargull at 2024-10-01T00:57:21+02:00
Bug 1915249: Add more nodiscard. a=RyanVM
Original Revision: https://phabricator.services.mozilla.com/D220311
Differential Revision: https://phabricator.services.mozilla.com/D221663
- - - - -
bfc54ed4 by Emilio Cobos Álvarez at 2024-10-01T00:57:23+02:00
Bug 1914106 - Deal with insertRule edge-case. r=jwatt a=RyanVM
When there's trailing garbage after an @import rule we throw, but we
still trigger the load (that's not great but not trivial to change).
Deal with that case before calling ImportRuleLoaded().
Differential Revision: https://phabricator.services.mozilla.com/D219783
- - - - -
cb01df5c by Steve Fink at 2024-10-01T00:57:25+02:00
Bug 1912471 - Disallow deserializing structured clone buffers with transferables more than once r=iain, a=dsmith
Differential Revision: https://phabricator.services.mozilla.com/D220644
- - - - -
84dc8a8a by Nika Layzell at 2024-10-01T00:57:26+02:00
Bug 1911745 - Unify BrowsingContext flag coherency checks, r=mccr8
Previously these checks were largely diagnostic tools for finding bugs
in other code as it evolves. This unifies the checks a bit more and
makes them stronger for BrowsingContexts created over IPC, providing a
place for more coherency checks to be added in the future.
Differential Revision: https://phabricator.services.mozilla.com/D218860
- - - - -
0fe417ba by Kershaw Chang at 2024-10-01T00:57:28+02:00
Bug 1907726 - Make sure WebTransportSessionProxy::NotifyDatagramReceived is called after OnStopRequest, a=RyanVM
The crash occurs because WebTransportSessionProxy::OnDatagramReceivedInternal is called before WebTransportSessionProxy::OnStopRequest.
When this happens, WebTransportSessionProxy::mTarget is the main thread, so a task is dispatched to the main thread. This causes WebTransportSessionProxy::NotifyDatagramReceived to be called on the main thread.
If WebTransportSessionProxy::NotifyDatagramReceived is invoked while WebTransportSessionProxy::mStopRequestCalled is true, it can lead to OnDatagramReceived being called on the main thread (instead of the socket thread), resulting in a crash.
Original Revision: https://phabricator.services.mozilla.com/D220013
Differential Revision: https://phabricator.services.mozilla.com/D221661
- - - - -
22 changed files:
- browser/base/content/test/tabPrompts/browser_confirmFolderUpload.js
- browser/components/prompts/PromptCollection.sys.mjs
- docshell/base/BrowsingContext.cpp
- docshell/base/BrowsingContext.h
- docshell/base/nsDocShell.cpp
- docshell/base/nsDocShell.h
- dom/base/Document.cpp
- dom/base/Document.h
- dom/base/ShadowRoot.cpp
- dom/base/ShadowRoot.h
- dom/filesystem/tests/script_promptHandler.js
- js/public/StructuredClone.h
- js/public/friend/ErrorNumbers.msg
- js/src/jit-test/tests/structured-clone/transferable-cleanup.js
- js/src/jit/IonAnalysis.cpp
- js/src/vm/StructuredClone.cpp
- layout/style/ServoStyleSet.cpp
- layout/style/ServoStyleSet.h
- layout/style/StyleSheet.cpp
- netwerk/ipc/DocumentLoadListener.cpp
- netwerk/protocol/webtransport/WebTransportSessionProxy.cpp
- + testing/web-platform/tests/css/cssom/insertRule-import-trailing-garbage-crash.html
Changes:
=====================================
browser/base/content/test/tabPrompts/browser_confirmFolderUpload.js
=====================================
@@ -101,8 +101,29 @@ async function testUploadPrompt(confirmUpload) {
// Wait for confirmation prompt
let prompt = await promptPromise;
ok(prompt, "Shown upload confirmation prompt");
+
is(prompt.ui.button0.label, "Upload", "Accept button label");
+ ok(
+ prompt.ui.button0.disabled,
+ "Accept button should be disabled by the security delay initially."
+ );
+
ok(prompt.ui.button1.hasAttribute("default"), "Cancel is default button");
+ ok(
+ !prompt.ui.button1.disabled,
+ "Cancel button should not be disabled by the security delay."
+ );
+
+ info("Wait for the security delay to pass.");
+ let delayTime = Services.prefs.getIntPref("security.dialog_enable_delay");
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ await new Promise(resolve => setTimeout(resolve, delayTime + 100));
+
+ ok(
+ !prompt.ui.button0.disabled,
+ "Accept button should no longer be disabled."
+ );
+ ok(!prompt.ui.button1.disabled, "Cancel button should remain enabled.");
// Close confirmation prompt
await PromptTestUtils.handlePrompt(prompt, {
=====================================
browser/components/prompts/PromptCollection.sys.mjs
=====================================
@@ -156,7 +156,7 @@ export class PromptCollection {
Services.prompt.MODAL_TYPE_TAB,
title,
message,
- buttonFlags,
+ buttonFlags | Ci.nsIPrompt.BUTTON_DELAY_ENABLE,
acceptLabel,
null,
null,
=====================================
docshell/base/BrowsingContext.cpp
=====================================
@@ -572,9 +572,19 @@ mozilla::ipc::IPCResult BrowsingContext::CreateFromIPC(
context->mRequestContextId = aInit.mRequestContextId;
// NOTE: Private browsing ID is set by `SetOriginAttributes`.
+ if (const char* failure =
+ context->BrowsingContextCoherencyChecks(aOriginProcess)) {
+ mozilla::ipc::IProtocol* actor = aOriginProcess;
+ if (!actor) {
+ actor = ContentChild::GetSingleton();
+ }
+ return IPC_FAIL(actor, "Incoherent BrowsingContext");
+ }
+
Register(context);
- return context->Attach(/* aFromIPC */ true, aOriginProcess);
+ context->Attach(/* aFromIPC */ true, aOriginProcess);
+ return IPC_OK();
}
BrowsingContext::BrowsingContext(WindowContext* aParentWindow,
@@ -786,8 +796,64 @@ void BrowsingContext::Embed() {
}
}
-mozilla::ipc::IPCResult BrowsingContext::Attach(bool aFromIPC,
- ContentParent* aOriginProcess) {
+const char* BrowsingContext::BrowsingContextCoherencyChecks(
+ ContentParent* aOriginProcess) {
+#define COHERENCY_ASSERT(condition) \
+ if (!(condition)) return "Assertion " #condition " failed";
+
+ if (mGroup->IsPotentiallyCrossOriginIsolated() !=
+ (Top()->GetOpenerPolicy() ==
+ nsILoadInfo::OPENER_POLICY_SAME_ORIGIN_EMBEDDER_POLICY_REQUIRE_CORP)) {
+ return "Invalid CrossOriginIsolated state";
+ }
+
+ if (aOriginProcess && !IsContent()) {
+ return "Content cannot create chrome BCs";
+ }
+
+ // LoadContext should generally match our opener or parent.
+ if (IsContent()) {
+ if (RefPtr<BrowsingContext> opener = GetOpener()) {
+ COHERENCY_ASSERT(opener->mType == mType);
+ COHERENCY_ASSERT(opener->mGroup == mGroup);
+ COHERENCY_ASSERT(opener->mUseRemoteTabs == mUseRemoteTabs);
+ COHERENCY_ASSERT(opener->mUseRemoteSubframes == mUseRemoteSubframes);
+ COHERENCY_ASSERT(opener->mPrivateBrowsingId == mPrivateBrowsingId);
+ COHERENCY_ASSERT(
+ opener->mOriginAttributes.EqualsIgnoringFPD(mOriginAttributes));
+ }
+ }
+ if (RefPtr<BrowsingContext> parent = GetParent()) {
+ COHERENCY_ASSERT(parent->mType == mType);
+ COHERENCY_ASSERT(parent->mGroup == mGroup);
+ COHERENCY_ASSERT(parent->mUseRemoteTabs == mUseRemoteTabs);
+ COHERENCY_ASSERT(parent->mUseRemoteSubframes == mUseRemoteSubframes);
+ COHERENCY_ASSERT(parent->mPrivateBrowsingId == mPrivateBrowsingId);
+ COHERENCY_ASSERT(
+ parent->mOriginAttributes.EqualsIgnoringFPD(mOriginAttributes));
+ }
+
+ // UseRemoteSubframes and UseRemoteTabs must match.
+ if (mUseRemoteSubframes && !mUseRemoteTabs) {
+ return "Cannot set useRemoteSubframes without also setting useRemoteTabs";
+ }
+
+ // Double-check OriginAttributes/Private Browsing
+ // Chrome browsing contexts must not have a private browsing OriginAttribute
+ // Content browsing contexts must maintain the equality:
+ // mOriginAttributes.mPrivateBrowsingId == mPrivateBrowsingId
+ if (IsChrome()) {
+ COHERENCY_ASSERT(mOriginAttributes.mPrivateBrowsingId == 0);
+ } else {
+ COHERENCY_ASSERT(mOriginAttributes.mPrivateBrowsingId ==
+ mPrivateBrowsingId);
+ }
+#undef COHERENCY_ASSERT
+
+ return nullptr;
+}
+
+void BrowsingContext::Attach(bool aFromIPC, ContentParent* aOriginProcess) {
MOZ_DIAGNOSTIC_ASSERT(!mEverAttached);
MOZ_DIAGNOSTIC_ASSERT_IF(aFromIPC, aOriginProcess || XRE_IsContentProcess());
mEverAttached = true;
@@ -806,25 +872,15 @@ mozilla::ipc::IPCResult BrowsingContext::Attach(bool aFromIPC,
MOZ_DIAGNOSTIC_ASSERT(mGroup);
MOZ_DIAGNOSTIC_ASSERT(!mIsDiscarded);
- if (mGroup->IsPotentiallyCrossOriginIsolated() !=
- (Top()->GetOpenerPolicy() ==
- nsILoadInfo::OPENER_POLICY_SAME_ORIGIN_EMBEDDER_POLICY_REQUIRE_CORP)) {
- MOZ_DIAGNOSTIC_ASSERT(aFromIPC);
- if (aFromIPC) {
- auto* actor = aOriginProcess
- ? static_cast<mozilla::ipc::IProtocol*>(aOriginProcess)
- : static_cast<mozilla::ipc::IProtocol*>(
- ContentChild::GetSingleton());
- return IPC_FAIL(
- actor,
- "Invalid CrossOriginIsolated state in BrowsingContext::Attach call");
- } else {
- MOZ_CRASH(
- "Invalid CrossOriginIsolated state in BrowsingContext::Attach call");
+#ifdef MOZ_DIAGNOSTIC_ASSERT_ENABLED
+ // We'll already have checked this if `aFromIPC` is set before calling this
+ // function.
+ if (!aFromIPC) {
+ if (const char* failure = BrowsingContextCoherencyChecks(aOriginProcess)) {
+ MOZ_CRASH_UNSAFE_PRINTF("Incoherent BrowsingContext: %s", failure);
}
}
-
- AssertCoherentLoadContext();
+#endif
// Add ourselves either to our parent or BrowsingContextGroup's child list.
// Important: We shouldn't return IPC_FAIL after this point, since the
@@ -906,7 +962,6 @@ mozilla::ipc::IPCResult BrowsingContext::Attach(bool aFromIPC,
if (XRE_IsParentProcess()) {
Canonical()->CanonicalAttach();
}
- return IPC_OK();
}
void BrowsingContext::Detach(bool aFromIPC) {
@@ -1743,40 +1798,6 @@ nsresult BrowsingContext::SetOriginAttributes(const OriginAttributes& aAttrs) {
return NS_OK;
}
-void BrowsingContext::AssertCoherentLoadContext() {
-#ifdef MOZ_DIAGNOSTIC_ASSERT_ENABLED
- // LoadContext should generally match our opener or parent.
- if (IsContent()) {
- if (RefPtr<BrowsingContext> opener = GetOpener()) {
- MOZ_DIAGNOSTIC_ASSERT(opener->mType == mType);
- MOZ_DIAGNOSTIC_ASSERT(opener->mGroup == mGroup);
- MOZ_DIAGNOSTIC_ASSERT(opener->mUseRemoteTabs == mUseRemoteTabs);
- MOZ_DIAGNOSTIC_ASSERT(opener->mUseRemoteSubframes == mUseRemoteSubframes);
- MOZ_DIAGNOSTIC_ASSERT(opener->mPrivateBrowsingId == mPrivateBrowsingId);
- MOZ_DIAGNOSTIC_ASSERT(
- opener->mOriginAttributes.EqualsIgnoringFPD(mOriginAttributes));
- }
- }
- if (RefPtr<BrowsingContext> parent = GetParent()) {
- MOZ_DIAGNOSTIC_ASSERT(parent->mType == mType);
- MOZ_DIAGNOSTIC_ASSERT(parent->mGroup == mGroup);
- MOZ_DIAGNOSTIC_ASSERT(parent->mUseRemoteTabs == mUseRemoteTabs);
- MOZ_DIAGNOSTIC_ASSERT(parent->mUseRemoteSubframes == mUseRemoteSubframes);
- MOZ_DIAGNOSTIC_ASSERT(parent->mPrivateBrowsingId == mPrivateBrowsingId);
- MOZ_DIAGNOSTIC_ASSERT(
- parent->mOriginAttributes.EqualsIgnoringFPD(mOriginAttributes));
- }
-
- // UseRemoteSubframes and UseRemoteTabs must match.
- MOZ_DIAGNOSTIC_ASSERT(
- !mUseRemoteSubframes || mUseRemoteTabs,
- "Cannot set useRemoteSubframes without also setting useRemoteTabs");
-
- // Double-check OriginAttributes/Private Browsing
- AssertOriginAttributesMatchPrivateBrowsing();
-#endif
-}
-
void BrowsingContext::AssertOriginAttributesMatchPrivateBrowsing() {
// Chrome browsing contexts must not have a private browsing OriginAttribute
// Content browsing contexts must maintain the equality:
=====================================
docshell/base/BrowsingContext.h
=====================================
@@ -971,7 +971,18 @@ class BrowsingContext : public nsILoadContext, public nsWrapperCache {
bool aHasPostData);
private:
- mozilla::ipc::IPCResult Attach(bool aFromIPC, ContentParent* aOriginProcess);
+ // Assert that this BrowsingContext is coherent relative to related
+ // BrowsingContexts. This will be run before the BrowsingContext is attached.
+ //
+ // A non-null string return value indicates that there was a coherency check
+ // failure, which will be handled with either a crash or IPC failure.
+ //
+ // If provided, `aOriginProcess` is the process which is responsible for the
+ // creation of this BrowsingContext.
+ [[nodiscard]] const char* BrowsingContextCoherencyChecks(
+ ContentParent* aOriginProcess);
+
+ void Attach(bool aFromIPC, ContentParent* aOriginProcess);
// Recomputes whether we can execute scripts in this BrowsingContext based on
// the value of AllowJavascript() and whether scripts are allowed in the
@@ -985,10 +996,6 @@ class BrowsingContext : public nsILoadContext, public nsWrapperCache {
void AssertOriginAttributesMatchPrivateBrowsing();
- // Assert that the BrowsingContext's LoadContext flags appear coherent
- // relative to related BrowsingContexts.
- void AssertCoherentLoadContext();
-
friend class ::nsOuterWindowProxy;
friend class ::nsGlobalWindowOuter;
friend class WindowContext;
=====================================
docshell/base/nsDocShell.cpp
=====================================
@@ -6254,7 +6254,7 @@ already_AddRefed<nsIURI> nsDocShell::AttemptURIFixup(
nsresult nsDocShell::FilterStatusForErrorPage(
nsresult aStatus, nsIChannel* aChannel, uint32_t aLoadType,
- bool aIsTopFrame, bool aUseErrorPages, bool aIsInitialDocument,
+ bool aIsTopFrame, bool aUseErrorPages,
bool* aSkippedUnknownProtocolNavigation) {
// Errors to be shown only on top-level frames
if ((aStatus == NS_ERROR_UNKNOWN_HOST ||
@@ -6298,18 +6298,10 @@ nsresult nsDocShell::FilterStatusForErrorPage(
if (aStatus == NS_ERROR_UNKNOWN_PROTOCOL) {
// For unknown protocols we only display an error if the load is triggered
- // by the browser itself, or we're replacing the initial document (and
- // nothing else). Showing the error for page-triggered navigations causes
- // annoying behavior for users, see bug 1528305.
- //
- // We could, maybe, try to detect if this is in response to some user
- // interaction (like clicking a link, or something else) and maybe show
- // the error page in that case. But this allows for ctrl+clicking and such
- // to see the error page.
+ // by the browser itself. Showing the error for page-triggered navigations
+ // causes annoying behavior for users, see bug 1528305.
nsCOMPtr<nsILoadInfo> info = aChannel->LoadInfo();
- if (!info->TriggeringPrincipal()->IsSystemPrincipal() &&
- StaticPrefs::dom_no_unknown_protocol_error_enabled() &&
- !aIsInitialDocument) {
+ if (!info->TriggeringPrincipal()->IsSystemPrincipal()) {
if (aSkippedUnknownProtocolNavigation) {
*aSkippedUnknownProtocolNavigation = true;
}
@@ -6459,12 +6451,9 @@ nsresult nsDocShell::EndPageLoad(nsIWebProgress* aProgress,
aStatus == NS_ERROR_CONTENT_BLOCKED);
UnblockEmbedderLoadEventForFailure(fireFrameErrorEvent);
- bool isInitialDocument =
- !GetExtantDocument() || GetExtantDocument()->IsInitialDocument();
bool skippedUnknownProtocolNavigation = false;
aStatus = FilterStatusForErrorPage(aStatus, aChannel, mLoadType, isTopFrame,
mBrowsingContext->GetUseErrorPages(),
- isInitialDocument,
&skippedUnknownProtocolNavigation);
hadErrorStatus = true;
if (NS_FAILED(aStatus)) {
=====================================
docshell/base/nsDocShell.h
=====================================
@@ -464,7 +464,7 @@ class nsDocShell final : public nsDocLoader,
// navigation.
static nsresult FilterStatusForErrorPage(
nsresult aStatus, nsIChannel* aChannel, uint32_t aLoadType,
- bool aIsTopFrame, bool aUseErrorPages, bool aIsInitialDocument,
+ bool aIsTopFrame, bool aUseErrorPages,
bool* aSkippedUnknownProtocolNavigation = nullptr);
// Notify consumers of a search being loaded through the observer service:
=====================================
dom/base/Document.cpp
=====================================
@@ -8266,7 +8266,7 @@ void Document::RuleAdded(StyleSheet& aSheet, css::Rule& aRule) {
}
}
-void Document::ImportRuleLoaded(dom::CSSImportRule& aRule, StyleSheet& aSheet) {
+void Document::ImportRuleLoaded(StyleSheet& aSheet) {
if (aSheet.IsApplicable()) {
ApplicableStylesChanged();
}
=====================================
dom/base/Document.h
=====================================
@@ -2135,7 +2135,7 @@ class Document : public nsINode,
void RuleAdded(StyleSheet&, css::Rule&);
void RuleRemoved(StyleSheet&, css::Rule&);
void SheetCloned(StyleSheet&) {}
- void ImportRuleLoaded(CSSImportRule&, StyleSheet&);
+ void ImportRuleLoaded(StyleSheet&);
/**
* Flush notifications for this document and its parent documents
=====================================
dom/base/ShadowRoot.cpp
=====================================
@@ -412,7 +412,7 @@ void ShadowRoot::RuleChanged(StyleSheet& aSheet, css::Rule*,
ApplicableRulesChanged();
}
-void ShadowRoot::ImportRuleLoaded(CSSImportRule&, StyleSheet& aSheet) {
+void ShadowRoot::ImportRuleLoaded(StyleSheet& aSheet) {
if (mStyleRuleMap) {
mStyleRuleMap->SheetAdded(aSheet);
}
=====================================
dom/base/ShadowRoot.h
=====================================
@@ -86,7 +86,7 @@ class ShadowRoot final : public DocumentFragment,
void RuleAdded(StyleSheet&, css::Rule&);
void RuleRemoved(StyleSheet&, css::Rule&);
void RuleChanged(StyleSheet&, css::Rule*, StyleRuleChangeKind);
- void ImportRuleLoaded(CSSImportRule&, StyleSheet&);
+ void ImportRuleLoaded(StyleSheet&);
void SheetCloned(StyleSheet&);
void StyleSheetApplicableStateChanged(StyleSheet&);
=====================================
dom/filesystem/tests/script_promptHandler.js
=====================================
@@ -2,7 +2,45 @@
let dialogObserverTopic = "common-dialog-loaded";
-function dialogObserver(subj, topic, data) {
+function waitForButtonEnabledState(button) {
+ return new Promise(resolve => {
+ // Check if the button is already enabled (not disabled)
+ if (!button.disabled) {
+ resolve();
+ return;
+ }
+
+ // Create a MutationObserver instance
+ let win = button.ownerGlobal;
+ let { MutationObserver } = win;
+ const observer = new MutationObserver(mutationsList => {
+ for (const mutation of mutationsList) {
+ if (
+ mutation.type === "attributes" &&
+ mutation.attributeName === "disabled"
+ ) {
+ if (!button.disabled) {
+ // Resolve the promise when the button is enabled
+ observer.disconnect(); // Stop observing
+ resolve();
+ }
+ }
+ }
+ });
+
+ // Start observing the button for changes to the 'disabled' attribute
+ observer.observe(button, {
+ attributes: true,
+ attributeFilter: ["disabled"],
+ });
+ });
+}
+
+async function dialogObserver(subj) {
+ let dialog = subj.document.querySelector("dialog");
+ let acceptButton = dialog.getButton("accept");
+ await waitForButtonEnabledState(acceptButton);
+
subj.document.querySelector("dialog").acceptDialog();
sendAsyncMessage("promptAccepted");
}
=====================================
js/public/StructuredClone.h
=====================================
@@ -744,6 +744,7 @@ class JS_PUBLIC_API JSAutoStructuredCloneBuffer {
#define JS_SCERR_WASM_NO_TRANSFER 6
#define JS_SCERR_NOT_CLONABLE 7
#define JS_SCERR_NOT_CLONABLE_WITH_COOP_COEP 8
+#define JS_SCERR_TRANSFERABLE_TWICE 9
JS_PUBLIC_API bool JS_ReadUint32Pair(JSStructuredCloneReader* r, uint32_t* p1,
uint32_t* p2);
=====================================
js/public/friend/ErrorNumbers.msg
=====================================
@@ -527,6 +527,7 @@ MSG_DEF(JSMSG_SC_BAD_CLONE_VERSION, 0, JSEXN_ERR, "unsupported structured clo
MSG_DEF(JSMSG_SC_BAD_SERIALIZED_DATA, 1, JSEXN_INTERNALERR, "bad serialized structured data ({0})")
MSG_DEF(JSMSG_SC_DUP_TRANSFERABLE, 0, JSEXN_TYPEERR, "duplicate transferable for structured clone")
MSG_DEF(JSMSG_SC_NOT_TRANSFERABLE, 0, JSEXN_TYPEERR, "invalid transferable array for structured clone")
+MSG_DEF(JSMSG_SC_TRANSFERABLE_TWICE, 0, JSEXN_TYPEERR, "structured clone cannot transfer twice")
MSG_DEF(JSMSG_SC_UNSUPPORTED_TYPE, 0, JSEXN_TYPEERR, "unsupported type for structured data")
MSG_DEF(JSMSG_SC_NOT_CLONABLE, 1, JSEXN_TYPEERR, "The {0} object cannot be serialized. The Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy HTTP headers will enable this in the future.")
MSG_DEF(JSMSG_SC_NOT_CLONABLE_WITH_COOP_COEP, 1, JSEXN_TYPEERR, "The {0} object cannot be serialized. The Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy HTTP headers can be used to enable this.")
=====================================
js/src/jit-test/tests/structured-clone/transferable-cleanup.js
=====================================
@@ -160,6 +160,15 @@ function testMultiWithDeserializeReadTransferErrorHelper(g, BASE, desc) {
} catch (e) {
assertEq(e.message.includes("invalid transferable"), true);
}
+
+ try {
+ // This fails without logging anything, since the re-transfer will be caught
+ // by looking at its header before calling any callbacks.
+ let clone = deserialize(s);
+ } catch (e) {
+ assertEq(e.message.includes("cannot transfer twice"), true);
+ }
+
s = null;
gc();
printTrace(arguments.callee.name, g, BASE, obj.log, "deserialize");
@@ -170,6 +179,7 @@ function testMultiWithDeserializeReadTransferErrorHelper(g, BASE, desc) {
// which comes before the main reading. obj transfer data is now owned by its
// clone. obj3 transfer data was not successfully handed over to a new object,
// so it is still owned by the clone buffer and must be discarded with freeTransfer.
+ // 'F' means the data is freed.
BASE + 3, "F",
], "deserialize " + desc);
obj.log = null;
=====================================
js/src/jit/IonAnalysis.cpp
=====================================
@@ -29,8 +29,9 @@ using MPhiUseIteratorStack =
// Look for Phi uses with a depth-first search. If any uses are found the stack
// of MPhi instructions is returned in the |worklist| argument.
-static bool DepthFirstSearchUse(MIRGenerator* mir,
- MPhiUseIteratorStack& worklist, MPhi* phi) {
+[[nodiscard]] static bool DepthFirstSearchUse(MIRGenerator* mir,
+ MPhiUseIteratorStack& worklist,
+ MPhi* phi) {
// Push a Phi and the next use to iterate over in the worklist.
auto push = [&worklist](MPhi* phi, MUseIterator use) -> bool {
phi->setInWorklist();
@@ -131,9 +132,9 @@ static bool DepthFirstSearchUse(MIRGenerator* mir,
return true;
}
-static bool FlagPhiInputsAsImplicitlyUsed(MIRGenerator* mir, MBasicBlock* block,
- MBasicBlock* succ,
- MPhiUseIteratorStack& worklist) {
+[[nodiscard]] static bool FlagPhiInputsAsImplicitlyUsed(
+ MIRGenerator* mir, MBasicBlock* block, MBasicBlock* succ,
+ MPhiUseIteratorStack& worklist) {
// When removing an edge between 2 blocks, we might remove the ability of
// later phases to figure out that the uses of a Phi should be considered as
// a use of all its inputs. Thus we need to mark the Phi inputs as being
@@ -265,7 +266,7 @@ static MInstructionIterator FindFirstInstructionAfterBail(MBasicBlock* block) {
// Given an iterator pointing to the first removed instruction, mark
// the operands of each removed instruction as having implicit uses.
-static bool FlagOperandsAsImplicitlyUsedAfter(
+[[nodiscard]] static bool FlagOperandsAsImplicitlyUsedAfter(
MIRGenerator* mir, MBasicBlock* block, MInstructionIterator firstRemoved) {
MOZ_ASSERT(firstRemoved->block() == block);
@@ -312,8 +313,8 @@ static bool FlagOperandsAsImplicitlyUsedAfter(
return true;
}
-static bool FlagEntryResumePointOperands(MIRGenerator* mir,
- MBasicBlock* block) {
+[[nodiscard]] static bool FlagEntryResumePointOperands(MIRGenerator* mir,
+ MBasicBlock* block) {
// Flag observable operands of the entry resume point as having implicit uses.
MResumePoint* rp = block->entryResumePoint();
while (rp) {
@@ -334,8 +335,8 @@ static bool FlagEntryResumePointOperands(MIRGenerator* mir,
return true;
}
-static bool FlagAllOperandsAsImplicitlyUsed(MIRGenerator* mir,
- MBasicBlock* block) {
+[[nodiscard]] static bool FlagAllOperandsAsImplicitlyUsed(MIRGenerator* mir,
+ MBasicBlock* block) {
return FlagEntryResumePointOperands(mir, block) &&
FlagOperandsAsImplicitlyUsedAfter(mir, block, block->begin());
}
@@ -420,12 +421,16 @@ bool jit::PruneUnusedBranches(MIRGenerator* mir, MIRGraph& graph) {
if (!block->isMarked()) {
// If we are removing the block entirely, mark the operands of every
// instruction as being implicitly used.
- FlagAllOperandsAsImplicitlyUsed(mir, block);
+ if (!FlagAllOperandsAsImplicitlyUsed(mir, block)) {
+ return false;
+ }
} else if (block->alwaysBails()) {
// If we are only trimming instructions after a bail, only mark operands
// of removed instructions.
MInstructionIterator firstRemoved = FindFirstInstructionAfterBail(block);
- FlagOperandsAsImplicitlyUsedAfter(mir, block, firstRemoved);
+ if (!FlagOperandsAsImplicitlyUsedAfter(mir, block, firstRemoved)) {
+ return false;
+ }
}
}
@@ -503,7 +508,8 @@ bool jit::PruneUnusedBranches(MIRGenerator* mir, MIRGraph& graph) {
return true;
}
-static bool SplitCriticalEdgesForBlock(MIRGraph& graph, MBasicBlock* block) {
+[[nodiscard]] static bool SplitCriticalEdgesForBlock(MIRGraph& graph,
+ MBasicBlock* block) {
if (block->numSuccessors() < 2) {
return true;
}
@@ -767,8 +773,8 @@ static bool IsDiamondPattern(MBasicBlock* initialBlock) {
return true;
}
-static bool MaybeFoldDiamondConditionBlock(MIRGraph& graph,
- MBasicBlock* initialBlock) {
+[[nodiscard]] static bool MaybeFoldDiamondConditionBlock(
+ MIRGraph& graph, MBasicBlock* initialBlock) {
MOZ_ASSERT(IsDiamondPattern(initialBlock));
// Optimize the MIR graph to improve the code generated for conditional
@@ -936,8 +942,8 @@ static bool IsTrianglePattern(MBasicBlock* initialBlock) {
return false;
}
-static bool MaybeFoldTriangleConditionBlock(MIRGraph& graph,
- MBasicBlock* initialBlock) {
+[[nodiscard]] static bool MaybeFoldTriangleConditionBlock(
+ MIRGraph& graph, MBasicBlock* initialBlock) {
MOZ_ASSERT(IsTrianglePattern(initialBlock));
// Optimize the MIR graph to improve the code generated for boolean
@@ -1089,8 +1095,8 @@ static bool MaybeFoldTriangleConditionBlock(MIRGraph& graph,
return true;
}
-static bool MaybeFoldConditionBlock(MIRGraph& graph,
- MBasicBlock* initialBlock) {
+[[nodiscard]] static bool MaybeFoldConditionBlock(MIRGraph& graph,
+ MBasicBlock* initialBlock) {
if (IsDiamondPattern(initialBlock)) {
return MaybeFoldDiamondConditionBlock(graph, initialBlock);
}
@@ -1100,7 +1106,8 @@ static bool MaybeFoldConditionBlock(MIRGraph& graph,
return true;
}
-static bool MaybeFoldTestBlock(MIRGraph& graph, MBasicBlock* initialBlock) {
+[[nodiscard]] static bool MaybeFoldTestBlock(MIRGraph& graph,
+ MBasicBlock* initialBlock) {
// Handle test expressions on more than two inputs. For example
// |if ((x > 10) && (y > 20) && (z > 30)) { ... }|, which results in the below
// pattern.
@@ -2752,7 +2759,9 @@ bool jit::RemoveUnmarkedBlocks(MIRGenerator* mir, MIRGraph& graph,
continue;
}
- FlagAllOperandsAsImplicitlyUsed(mir, block);
+ if (!FlagAllOperandsAsImplicitlyUsed(mir, block)) {
+ return false;
+ }
}
// Find unmarked blocks and remove them.
@@ -4003,8 +4012,8 @@ bool jit::EliminateRedundantShapeGuards(MIRGraph& graph) {
return true;
}
-static bool TryEliminateGCBarriersForAllocation(TempAllocator& alloc,
- MInstruction* allocation) {
+[[nodiscard]] static bool TryEliminateGCBarriersForAllocation(
+ TempAllocator& alloc, MInstruction* allocation) {
MOZ_ASSERT(allocation->type() == MIRType::Object);
JitSpew(JitSpew_RedundantGCBarriers, "Analyzing allocation %s",
=====================================
js/src/vm/StructuredClone.cpp
=====================================
@@ -172,17 +172,25 @@ enum StructuredDataType : uint32_t {
/*
* Format of transfer map:
- * <SCTAG_TRANSFER_MAP_HEADER, TransferableMapHeader(UNREAD|TRANSFERRED)>
- * numTransferables (64 bits)
- * array of:
- * <SCTAG_TRANSFER_MAP_*, TransferableOwnership>
- * pointer (64 bits)
- * extraData (64 bits), eg byte length for ArrayBuffers
+ * - <SCTAG_TRANSFER_MAP_HEADER, UNREAD|TRANSFERRING|TRANSFERRED>
+ * - numTransferables (64 bits)
+ * - array of:
+ * - <SCTAG_TRANSFER_MAP_*, TransferableOwnership> pointer (64
+ * bits)
+ * - extraData (64 bits), eg byte length for ArrayBuffers
+ * - any data written for custom transferables
*/
// Data associated with an SCTAG_TRANSFER_MAP_HEADER that tells whether the
-// contents have been read out yet or not.
-enum TransferableMapHeader { SCTAG_TM_UNREAD = 0, SCTAG_TM_TRANSFERRED };
+// contents have been read out yet or not. TRANSFERRING is for the case where we
+// have started but not completed reading, which due to errors could mean that
+// there are things still owned by the clone buffer that need to be released, so
+// discarding should not just be skipped.
+enum TransferableMapHeader {
+ SCTAG_TM_UNREAD = 0,
+ SCTAG_TM_TRANSFERRING,
+ SCTAG_TM_TRANSFERRED
+};
static inline uint64_t PairToUInt64(uint32_t tag, uint32_t data) {
return uint64_t(data) | (uint64_t(tag) << 32);
@@ -693,6 +701,10 @@ static void ReportDataCloneError(JSContext* cx,
errorNumber = JSMSG_SC_SHMEM_TRANSFERABLE;
break;
+ case JS_SCERR_TRANSFERABLE_TWICE:
+ errorNumber = JSMSG_SC_TRANSFERABLE_TWICE;
+ break;
+
case JS_SCERR_TYPED_ARRAY_DETACHED:
errorNumber = JSMSG_TYPED_ARRAY_DETACHED;
break;
@@ -3209,11 +3221,21 @@ bool JSStructuredCloneReader::readTransferMap() {
return in.reportTruncated();
}
+ auto transferState = static_cast<TransferableMapHeader>(data);
+
if (tag != SCTAG_TRANSFER_MAP_HEADER ||
- TransferableMapHeader(data) == SCTAG_TM_TRANSFERRED) {
+ transferState == SCTAG_TM_TRANSFERRED) {
return true;
}
+ if (transferState == SCTAG_TM_TRANSFERRING) {
+ ReportDataCloneError(cx, callbacks, JS_SCERR_TRANSFERABLE_TWICE, closure);
+ return false;
+ }
+
+ headerPos.write(
+ PairToUInt64(SCTAG_TRANSFER_MAP_HEADER, SCTAG_TM_TRANSFERRING));
+
uint64_t numTransferables;
MOZ_ALWAYS_TRUE(in.readPair(&tag, &data));
if (!in.read(&numTransferables)) {
@@ -3329,7 +3351,7 @@ bool JSStructuredCloneReader::readTransferMap() {
#ifdef DEBUG
SCInput::getPair(headerPos.peek(), &tag, &data);
MOZ_ASSERT(tag == SCTAG_TRANSFER_MAP_HEADER);
- MOZ_ASSERT(TransferableMapHeader(data) != SCTAG_TM_TRANSFERRED);
+ MOZ_ASSERT(TransferableMapHeader(data) == SCTAG_TM_TRANSFERRING);
#endif
headerPos.write(
PairToUInt64(SCTAG_TRANSFER_MAP_HEADER, SCTAG_TM_TRANSFERRED));
=====================================
layout/style/ServoStyleSet.cpp
=====================================
@@ -954,7 +954,7 @@ static OriginFlags ToOriginFlags(StyleOrigin aOrigin) {
}
}
-void ServoStyleSet::ImportRuleLoaded(dom::CSSImportRule&, StyleSheet& aSheet) {
+void ServoStyleSet::ImportRuleLoaded(StyleSheet& aSheet) {
if (mStyleRuleMap) {
mStyleRuleMap->SheetAdded(aSheet);
}
=====================================
layout/style/ServoStyleSet.h
=====================================
@@ -133,7 +133,7 @@ class ServoStyleSet {
void RuleRemoved(StyleSheet&, css::Rule&);
void RuleChanged(StyleSheet&, css::Rule*, StyleRuleChangeKind);
void SheetCloned(StyleSheet&);
- void ImportRuleLoaded(dom::CSSImportRule&, StyleSheet&);
+ void ImportRuleLoaded(StyleSheet&);
// Runs style invalidation due to document state changes.
void InvalidateStyleForDocumentStateChanges(
=====================================
layout/style/StyleSheet.cpp
=====================================
@@ -836,15 +836,19 @@ StyleSheet::StyleSheetLoaded(StyleSheet* aSheet, bool aWasDeferred,
if (!aSheet->GetParentSheet()) {
return NS_OK; // ignore if sheet has been detached already
}
- MOZ_ASSERT(this == aSheet->GetParentSheet(),
- "We are being notified of a sheet load for a sheet that is not "
- "our child!");
+ MOZ_DIAGNOSTIC_ASSERT(this == aSheet->GetParentSheet(),
+ "We are being notified of a sheet load for a sheet "
+ "that is not our child!");
if (NS_FAILED(aStatus)) {
return NS_OK;
}
-
- MOZ_ASSERT(aSheet->GetOwnerRule());
- NOTIFY(ImportRuleLoaded, (*aSheet->GetOwnerRule(), *aSheet));
+ // The assert below should hold if we stop triggering import loads for invalid
+ // insertRule() calls, see bug 1914106.
+ // MOZ_ASSERT(aSheet->GetOwnerRule());
+ if (!aSheet->GetOwnerRule()) {
+ return NS_OK;
+ }
+ NOTIFY(ImportRuleLoaded, (*aSheet));
return NS_OK;
}
=====================================
netwerk/ipc/DocumentLoadListener.cpp
=====================================
@@ -2316,15 +2316,9 @@ bool DocumentLoadListener::DocShellWillDisplayContent(nsresult aStatus) {
auto* loadingContext = GetLoadingBrowsingContext();
- bool isInitialDocument = true;
- if (WindowGlobalParent* currentWindow =
- loadingContext->GetCurrentWindowGlobal()) {
- isInitialDocument = currentWindow->IsInitialDocument();
- }
-
nsresult rv = nsDocShell::FilterStatusForErrorPage(
aStatus, mChannel, mLoadStateLoadType, loadingContext->IsTop(),
- loadingContext->GetUseErrorPages(), isInitialDocument, nullptr);
+ loadingContext->GetUseErrorPages(), nullptr);
if (NS_SUCCEEDED(rv)) {
MOZ_LOG(gProcessIsolationLog, LogLevel::Verbose,
=====================================
netwerk/protocol/webtransport/WebTransportSessionProxy.cpp
=====================================
@@ -1042,15 +1042,6 @@ void WebTransportSessionProxy::NotifyDatagramReceived(
MutexAutoLock lock(mMutex);
MOZ_ASSERT(mTarget->IsOnCurrentThread());
- if (!mStopRequestCalled) {
- CopyableTArray<uint8_t> copied(aData);
- mPendingEvents.AppendElement(
- [self = RefPtr{this}, data = std::move(copied)]() mutable {
- self->NotifyDatagramReceived(std::move(data));
- });
- return;
- }
-
if (mState != WebTransportSessionProxyState::ACTIVE || !mListener) {
return;
}
@@ -1066,6 +1057,15 @@ NS_IMETHODIMP WebTransportSessionProxy::OnDatagramReceivedInternal(
{
MutexAutoLock lock(mMutex);
+ if (!mStopRequestCalled) {
+ CopyableTArray<uint8_t> copied(aData);
+ mPendingEvents.AppendElement(
+ [self = RefPtr{this}, data = std::move(copied)]() mutable {
+ self->OnDatagramReceivedInternal(std::move(data));
+ });
+ return NS_OK;
+ }
+
if (!mTarget->IsOnCurrentThread()) {
return mTarget->Dispatch(NS_NewRunnableFunction(
"WebTransportSessionProxy::OnDatagramReceived",
=====================================
testing/web-platform/tests/css/cssom/insertRule-import-trailing-garbage-crash.html
=====================================
@@ -0,0 +1,6 @@
+<!doctype html>
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1914106">
+<style></style>
+<script>
+document.querySelector("style").sheet.insertRule("@import url('data:text/css,:root{background:red}');html,body{/* random garbage */}");
+</script>
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/4d…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/4d…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser] Pushed new tag base-browser-115.16.0esr-13.5-1-build2
by ma1 (@ma1) 30 Sep '24
by ma1 (@ma1) 30 Sep '24
30 Sep '24
ma1 pushed new tag base-browser-115.16.0esr-13.5-1-build2 at The Tor Project / Applications / Tor Browser
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/base-brow…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][base-browser-115.16.0esr-13.5-1] 7 commits: Bug 1881037 - Part 1: Stop showing unknown protocol error pages for...
by ma1 (@ma1) 30 Sep '24
by ma1 (@ma1) 30 Sep '24
30 Sep '24
ma1 pushed to branch base-browser-115.16.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
9ce14cc7 by Nika Layzell at 2024-10-01T00:53:35+02:00
Bug 1881037 - Part 1: Stop showing unknown protocol error pages for web-triggered loads, r=smaug,necko-reviewers,kershaw, a=dsmith
Differential Revision: https://phabricator.services.mozilla.com/D217495
- - - - -
63cf9662 by Paul Zuehlcke at 2024-10-01T00:53:37+02:00
Bug 1916659, a=diannaS
Original Revision: https://phabricator.services.mozilla.com/D222629
Differential Revision: https://phabricator.services.mozilla.com/D222934
- - - - -
32373e41 by André Bargull at 2024-10-01T00:53:38+02:00
Bug 1915249: Add more nodiscard. a=RyanVM
Original Revision: https://phabricator.services.mozilla.com/D220311
Differential Revision: https://phabricator.services.mozilla.com/D221663
- - - - -
e6dfa497 by Emilio Cobos Álvarez at 2024-10-01T00:53:40+02:00
Bug 1914106 - Deal with insertRule edge-case. r=jwatt a=RyanVM
When there's trailing garbage after an @import rule we throw, but we
still trigger the load (that's not great but not trivial to change).
Deal with that case before calling ImportRuleLoaded().
Differential Revision: https://phabricator.services.mozilla.com/D219783
- - - - -
35286ac0 by Steve Fink at 2024-10-01T00:53:42+02:00
Bug 1912471 - Disallow deserializing structured clone buffers with transferables more than once r=iain, a=dsmith
Differential Revision: https://phabricator.services.mozilla.com/D220644
- - - - -
bf0a17a2 by Nika Layzell at 2024-10-01T00:53:43+02:00
Bug 1911745 - Unify BrowsingContext flag coherency checks, r=mccr8
Previously these checks were largely diagnostic tools for finding bugs
in other code as it evolves. This unifies the checks a bit more and
makes them stronger for BrowsingContexts created over IPC, providing a
place for more coherency checks to be added in the future.
Differential Revision: https://phabricator.services.mozilla.com/D218860
- - - - -
bf6b766b by Kershaw Chang at 2024-10-01T00:53:46+02:00
Bug 1907726 - Make sure WebTransportSessionProxy::NotifyDatagramReceived is called after OnStopRequest, a=RyanVM
The crash occurs because WebTransportSessionProxy::OnDatagramReceivedInternal is called before WebTransportSessionProxy::OnStopRequest.
When this happens, WebTransportSessionProxy::mTarget is the main thread, so a task is dispatched to the main thread. This causes WebTransportSessionProxy::NotifyDatagramReceived to be called on the main thread.
If WebTransportSessionProxy::NotifyDatagramReceived is invoked while WebTransportSessionProxy::mStopRequestCalled is true, it can lead to OnDatagramReceived being called on the main thread (instead of the socket thread), resulting in a crash.
Original Revision: https://phabricator.services.mozilla.com/D220013
Differential Revision: https://phabricator.services.mozilla.com/D221661
- - - - -
22 changed files:
- browser/base/content/test/tabPrompts/browser_confirmFolderUpload.js
- browser/components/prompts/PromptCollection.sys.mjs
- docshell/base/BrowsingContext.cpp
- docshell/base/BrowsingContext.h
- docshell/base/nsDocShell.cpp
- docshell/base/nsDocShell.h
- dom/base/Document.cpp
- dom/base/Document.h
- dom/base/ShadowRoot.cpp
- dom/base/ShadowRoot.h
- dom/filesystem/tests/script_promptHandler.js
- js/public/StructuredClone.h
- js/public/friend/ErrorNumbers.msg
- js/src/jit-test/tests/structured-clone/transferable-cleanup.js
- js/src/jit/IonAnalysis.cpp
- js/src/vm/StructuredClone.cpp
- layout/style/ServoStyleSet.cpp
- layout/style/ServoStyleSet.h
- layout/style/StyleSheet.cpp
- netwerk/ipc/DocumentLoadListener.cpp
- netwerk/protocol/webtransport/WebTransportSessionProxy.cpp
- + testing/web-platform/tests/css/cssom/insertRule-import-trailing-garbage-crash.html
Changes:
=====================================
browser/base/content/test/tabPrompts/browser_confirmFolderUpload.js
=====================================
@@ -101,8 +101,29 @@ async function testUploadPrompt(confirmUpload) {
// Wait for confirmation prompt
let prompt = await promptPromise;
ok(prompt, "Shown upload confirmation prompt");
+
is(prompt.ui.button0.label, "Upload", "Accept button label");
+ ok(
+ prompt.ui.button0.disabled,
+ "Accept button should be disabled by the security delay initially."
+ );
+
ok(prompt.ui.button1.hasAttribute("default"), "Cancel is default button");
+ ok(
+ !prompt.ui.button1.disabled,
+ "Cancel button should not be disabled by the security delay."
+ );
+
+ info("Wait for the security delay to pass.");
+ let delayTime = Services.prefs.getIntPref("security.dialog_enable_delay");
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ await new Promise(resolve => setTimeout(resolve, delayTime + 100));
+
+ ok(
+ !prompt.ui.button0.disabled,
+ "Accept button should no longer be disabled."
+ );
+ ok(!prompt.ui.button1.disabled, "Cancel button should remain enabled.");
// Close confirmation prompt
await PromptTestUtils.handlePrompt(prompt, {
=====================================
browser/components/prompts/PromptCollection.sys.mjs
=====================================
@@ -156,7 +156,7 @@ export class PromptCollection {
Services.prompt.MODAL_TYPE_TAB,
title,
message,
- buttonFlags,
+ buttonFlags | Ci.nsIPrompt.BUTTON_DELAY_ENABLE,
acceptLabel,
null,
null,
=====================================
docshell/base/BrowsingContext.cpp
=====================================
@@ -572,9 +572,19 @@ mozilla::ipc::IPCResult BrowsingContext::CreateFromIPC(
context->mRequestContextId = aInit.mRequestContextId;
// NOTE: Private browsing ID is set by `SetOriginAttributes`.
+ if (const char* failure =
+ context->BrowsingContextCoherencyChecks(aOriginProcess)) {
+ mozilla::ipc::IProtocol* actor = aOriginProcess;
+ if (!actor) {
+ actor = ContentChild::GetSingleton();
+ }
+ return IPC_FAIL(actor, "Incoherent BrowsingContext");
+ }
+
Register(context);
- return context->Attach(/* aFromIPC */ true, aOriginProcess);
+ context->Attach(/* aFromIPC */ true, aOriginProcess);
+ return IPC_OK();
}
BrowsingContext::BrowsingContext(WindowContext* aParentWindow,
@@ -786,8 +796,64 @@ void BrowsingContext::Embed() {
}
}
-mozilla::ipc::IPCResult BrowsingContext::Attach(bool aFromIPC,
- ContentParent* aOriginProcess) {
+const char* BrowsingContext::BrowsingContextCoherencyChecks(
+ ContentParent* aOriginProcess) {
+#define COHERENCY_ASSERT(condition) \
+ if (!(condition)) return "Assertion " #condition " failed";
+
+ if (mGroup->IsPotentiallyCrossOriginIsolated() !=
+ (Top()->GetOpenerPolicy() ==
+ nsILoadInfo::OPENER_POLICY_SAME_ORIGIN_EMBEDDER_POLICY_REQUIRE_CORP)) {
+ return "Invalid CrossOriginIsolated state";
+ }
+
+ if (aOriginProcess && !IsContent()) {
+ return "Content cannot create chrome BCs";
+ }
+
+ // LoadContext should generally match our opener or parent.
+ if (IsContent()) {
+ if (RefPtr<BrowsingContext> opener = GetOpener()) {
+ COHERENCY_ASSERT(opener->mType == mType);
+ COHERENCY_ASSERT(opener->mGroup == mGroup);
+ COHERENCY_ASSERT(opener->mUseRemoteTabs == mUseRemoteTabs);
+ COHERENCY_ASSERT(opener->mUseRemoteSubframes == mUseRemoteSubframes);
+ COHERENCY_ASSERT(opener->mPrivateBrowsingId == mPrivateBrowsingId);
+ COHERENCY_ASSERT(
+ opener->mOriginAttributes.EqualsIgnoringFPD(mOriginAttributes));
+ }
+ }
+ if (RefPtr<BrowsingContext> parent = GetParent()) {
+ COHERENCY_ASSERT(parent->mType == mType);
+ COHERENCY_ASSERT(parent->mGroup == mGroup);
+ COHERENCY_ASSERT(parent->mUseRemoteTabs == mUseRemoteTabs);
+ COHERENCY_ASSERT(parent->mUseRemoteSubframes == mUseRemoteSubframes);
+ COHERENCY_ASSERT(parent->mPrivateBrowsingId == mPrivateBrowsingId);
+ COHERENCY_ASSERT(
+ parent->mOriginAttributes.EqualsIgnoringFPD(mOriginAttributes));
+ }
+
+ // UseRemoteSubframes and UseRemoteTabs must match.
+ if (mUseRemoteSubframes && !mUseRemoteTabs) {
+ return "Cannot set useRemoteSubframes without also setting useRemoteTabs";
+ }
+
+ // Double-check OriginAttributes/Private Browsing
+ // Chrome browsing contexts must not have a private browsing OriginAttribute
+ // Content browsing contexts must maintain the equality:
+ // mOriginAttributes.mPrivateBrowsingId == mPrivateBrowsingId
+ if (IsChrome()) {
+ COHERENCY_ASSERT(mOriginAttributes.mPrivateBrowsingId == 0);
+ } else {
+ COHERENCY_ASSERT(mOriginAttributes.mPrivateBrowsingId ==
+ mPrivateBrowsingId);
+ }
+#undef COHERENCY_ASSERT
+
+ return nullptr;
+}
+
+void BrowsingContext::Attach(bool aFromIPC, ContentParent* aOriginProcess) {
MOZ_DIAGNOSTIC_ASSERT(!mEverAttached);
MOZ_DIAGNOSTIC_ASSERT_IF(aFromIPC, aOriginProcess || XRE_IsContentProcess());
mEverAttached = true;
@@ -806,25 +872,15 @@ mozilla::ipc::IPCResult BrowsingContext::Attach(bool aFromIPC,
MOZ_DIAGNOSTIC_ASSERT(mGroup);
MOZ_DIAGNOSTIC_ASSERT(!mIsDiscarded);
- if (mGroup->IsPotentiallyCrossOriginIsolated() !=
- (Top()->GetOpenerPolicy() ==
- nsILoadInfo::OPENER_POLICY_SAME_ORIGIN_EMBEDDER_POLICY_REQUIRE_CORP)) {
- MOZ_DIAGNOSTIC_ASSERT(aFromIPC);
- if (aFromIPC) {
- auto* actor = aOriginProcess
- ? static_cast<mozilla::ipc::IProtocol*>(aOriginProcess)
- : static_cast<mozilla::ipc::IProtocol*>(
- ContentChild::GetSingleton());
- return IPC_FAIL(
- actor,
- "Invalid CrossOriginIsolated state in BrowsingContext::Attach call");
- } else {
- MOZ_CRASH(
- "Invalid CrossOriginIsolated state in BrowsingContext::Attach call");
+#ifdef MOZ_DIAGNOSTIC_ASSERT_ENABLED
+ // We'll already have checked this if `aFromIPC` is set before calling this
+ // function.
+ if (!aFromIPC) {
+ if (const char* failure = BrowsingContextCoherencyChecks(aOriginProcess)) {
+ MOZ_CRASH_UNSAFE_PRINTF("Incoherent BrowsingContext: %s", failure);
}
}
-
- AssertCoherentLoadContext();
+#endif
// Add ourselves either to our parent or BrowsingContextGroup's child list.
// Important: We shouldn't return IPC_FAIL after this point, since the
@@ -906,7 +962,6 @@ mozilla::ipc::IPCResult BrowsingContext::Attach(bool aFromIPC,
if (XRE_IsParentProcess()) {
Canonical()->CanonicalAttach();
}
- return IPC_OK();
}
void BrowsingContext::Detach(bool aFromIPC) {
@@ -1743,40 +1798,6 @@ nsresult BrowsingContext::SetOriginAttributes(const OriginAttributes& aAttrs) {
return NS_OK;
}
-void BrowsingContext::AssertCoherentLoadContext() {
-#ifdef MOZ_DIAGNOSTIC_ASSERT_ENABLED
- // LoadContext should generally match our opener or parent.
- if (IsContent()) {
- if (RefPtr<BrowsingContext> opener = GetOpener()) {
- MOZ_DIAGNOSTIC_ASSERT(opener->mType == mType);
- MOZ_DIAGNOSTIC_ASSERT(opener->mGroup == mGroup);
- MOZ_DIAGNOSTIC_ASSERT(opener->mUseRemoteTabs == mUseRemoteTabs);
- MOZ_DIAGNOSTIC_ASSERT(opener->mUseRemoteSubframes == mUseRemoteSubframes);
- MOZ_DIAGNOSTIC_ASSERT(opener->mPrivateBrowsingId == mPrivateBrowsingId);
- MOZ_DIAGNOSTIC_ASSERT(
- opener->mOriginAttributes.EqualsIgnoringFPD(mOriginAttributes));
- }
- }
- if (RefPtr<BrowsingContext> parent = GetParent()) {
- MOZ_DIAGNOSTIC_ASSERT(parent->mType == mType);
- MOZ_DIAGNOSTIC_ASSERT(parent->mGroup == mGroup);
- MOZ_DIAGNOSTIC_ASSERT(parent->mUseRemoteTabs == mUseRemoteTabs);
- MOZ_DIAGNOSTIC_ASSERT(parent->mUseRemoteSubframes == mUseRemoteSubframes);
- MOZ_DIAGNOSTIC_ASSERT(parent->mPrivateBrowsingId == mPrivateBrowsingId);
- MOZ_DIAGNOSTIC_ASSERT(
- parent->mOriginAttributes.EqualsIgnoringFPD(mOriginAttributes));
- }
-
- // UseRemoteSubframes and UseRemoteTabs must match.
- MOZ_DIAGNOSTIC_ASSERT(
- !mUseRemoteSubframes || mUseRemoteTabs,
- "Cannot set useRemoteSubframes without also setting useRemoteTabs");
-
- // Double-check OriginAttributes/Private Browsing
- AssertOriginAttributesMatchPrivateBrowsing();
-#endif
-}
-
void BrowsingContext::AssertOriginAttributesMatchPrivateBrowsing() {
// Chrome browsing contexts must not have a private browsing OriginAttribute
// Content browsing contexts must maintain the equality:
=====================================
docshell/base/BrowsingContext.h
=====================================
@@ -971,7 +971,18 @@ class BrowsingContext : public nsILoadContext, public nsWrapperCache {
bool aHasPostData);
private:
- mozilla::ipc::IPCResult Attach(bool aFromIPC, ContentParent* aOriginProcess);
+ // Assert that this BrowsingContext is coherent relative to related
+ // BrowsingContexts. This will be run before the BrowsingContext is attached.
+ //
+ // A non-null string return value indicates that there was a coherency check
+ // failure, which will be handled with either a crash or IPC failure.
+ //
+ // If provided, `aOriginProcess` is the process which is responsible for the
+ // creation of this BrowsingContext.
+ [[nodiscard]] const char* BrowsingContextCoherencyChecks(
+ ContentParent* aOriginProcess);
+
+ void Attach(bool aFromIPC, ContentParent* aOriginProcess);
// Recomputes whether we can execute scripts in this BrowsingContext based on
// the value of AllowJavascript() and whether scripts are allowed in the
@@ -985,10 +996,6 @@ class BrowsingContext : public nsILoadContext, public nsWrapperCache {
void AssertOriginAttributesMatchPrivateBrowsing();
- // Assert that the BrowsingContext's LoadContext flags appear coherent
- // relative to related BrowsingContexts.
- void AssertCoherentLoadContext();
-
friend class ::nsOuterWindowProxy;
friend class ::nsGlobalWindowOuter;
friend class WindowContext;
=====================================
docshell/base/nsDocShell.cpp
=====================================
@@ -6254,7 +6254,7 @@ already_AddRefed<nsIURI> nsDocShell::AttemptURIFixup(
nsresult nsDocShell::FilterStatusForErrorPage(
nsresult aStatus, nsIChannel* aChannel, uint32_t aLoadType,
- bool aIsTopFrame, bool aUseErrorPages, bool aIsInitialDocument,
+ bool aIsTopFrame, bool aUseErrorPages,
bool* aSkippedUnknownProtocolNavigation) {
// Errors to be shown only on top-level frames
if ((aStatus == NS_ERROR_UNKNOWN_HOST ||
@@ -6298,18 +6298,10 @@ nsresult nsDocShell::FilterStatusForErrorPage(
if (aStatus == NS_ERROR_UNKNOWN_PROTOCOL) {
// For unknown protocols we only display an error if the load is triggered
- // by the browser itself, or we're replacing the initial document (and
- // nothing else). Showing the error for page-triggered navigations causes
- // annoying behavior for users, see bug 1528305.
- //
- // We could, maybe, try to detect if this is in response to some user
- // interaction (like clicking a link, or something else) and maybe show
- // the error page in that case. But this allows for ctrl+clicking and such
- // to see the error page.
+ // by the browser itself. Showing the error for page-triggered navigations
+ // causes annoying behavior for users, see bug 1528305.
nsCOMPtr<nsILoadInfo> info = aChannel->LoadInfo();
- if (!info->TriggeringPrincipal()->IsSystemPrincipal() &&
- StaticPrefs::dom_no_unknown_protocol_error_enabled() &&
- !aIsInitialDocument) {
+ if (!info->TriggeringPrincipal()->IsSystemPrincipal()) {
if (aSkippedUnknownProtocolNavigation) {
*aSkippedUnknownProtocolNavigation = true;
}
@@ -6459,12 +6451,9 @@ nsresult nsDocShell::EndPageLoad(nsIWebProgress* aProgress,
aStatus == NS_ERROR_CONTENT_BLOCKED);
UnblockEmbedderLoadEventForFailure(fireFrameErrorEvent);
- bool isInitialDocument =
- !GetExtantDocument() || GetExtantDocument()->IsInitialDocument();
bool skippedUnknownProtocolNavigation = false;
aStatus = FilterStatusForErrorPage(aStatus, aChannel, mLoadType, isTopFrame,
mBrowsingContext->GetUseErrorPages(),
- isInitialDocument,
&skippedUnknownProtocolNavigation);
hadErrorStatus = true;
if (NS_FAILED(aStatus)) {
=====================================
docshell/base/nsDocShell.h
=====================================
@@ -464,7 +464,7 @@ class nsDocShell final : public nsDocLoader,
// navigation.
static nsresult FilterStatusForErrorPage(
nsresult aStatus, nsIChannel* aChannel, uint32_t aLoadType,
- bool aIsTopFrame, bool aUseErrorPages, bool aIsInitialDocument,
+ bool aIsTopFrame, bool aUseErrorPages,
bool* aSkippedUnknownProtocolNavigation = nullptr);
// Notify consumers of a search being loaded through the observer service:
=====================================
dom/base/Document.cpp
=====================================
@@ -8266,7 +8266,7 @@ void Document::RuleAdded(StyleSheet& aSheet, css::Rule& aRule) {
}
}
-void Document::ImportRuleLoaded(dom::CSSImportRule& aRule, StyleSheet& aSheet) {
+void Document::ImportRuleLoaded(StyleSheet& aSheet) {
if (aSheet.IsApplicable()) {
ApplicableStylesChanged();
}
=====================================
dom/base/Document.h
=====================================
@@ -2135,7 +2135,7 @@ class Document : public nsINode,
void RuleAdded(StyleSheet&, css::Rule&);
void RuleRemoved(StyleSheet&, css::Rule&);
void SheetCloned(StyleSheet&) {}
- void ImportRuleLoaded(CSSImportRule&, StyleSheet&);
+ void ImportRuleLoaded(StyleSheet&);
/**
* Flush notifications for this document and its parent documents
=====================================
dom/base/ShadowRoot.cpp
=====================================
@@ -412,7 +412,7 @@ void ShadowRoot::RuleChanged(StyleSheet& aSheet, css::Rule*,
ApplicableRulesChanged();
}
-void ShadowRoot::ImportRuleLoaded(CSSImportRule&, StyleSheet& aSheet) {
+void ShadowRoot::ImportRuleLoaded(StyleSheet& aSheet) {
if (mStyleRuleMap) {
mStyleRuleMap->SheetAdded(aSheet);
}
=====================================
dom/base/ShadowRoot.h
=====================================
@@ -86,7 +86,7 @@ class ShadowRoot final : public DocumentFragment,
void RuleAdded(StyleSheet&, css::Rule&);
void RuleRemoved(StyleSheet&, css::Rule&);
void RuleChanged(StyleSheet&, css::Rule*, StyleRuleChangeKind);
- void ImportRuleLoaded(CSSImportRule&, StyleSheet&);
+ void ImportRuleLoaded(StyleSheet&);
void SheetCloned(StyleSheet&);
void StyleSheetApplicableStateChanged(StyleSheet&);
=====================================
dom/filesystem/tests/script_promptHandler.js
=====================================
@@ -2,7 +2,45 @@
let dialogObserverTopic = "common-dialog-loaded";
-function dialogObserver(subj, topic, data) {
+function waitForButtonEnabledState(button) {
+ return new Promise(resolve => {
+ // Check if the button is already enabled (not disabled)
+ if (!button.disabled) {
+ resolve();
+ return;
+ }
+
+ // Create a MutationObserver instance
+ let win = button.ownerGlobal;
+ let { MutationObserver } = win;
+ const observer = new MutationObserver(mutationsList => {
+ for (const mutation of mutationsList) {
+ if (
+ mutation.type === "attributes" &&
+ mutation.attributeName === "disabled"
+ ) {
+ if (!button.disabled) {
+ // Resolve the promise when the button is enabled
+ observer.disconnect(); // Stop observing
+ resolve();
+ }
+ }
+ }
+ });
+
+ // Start observing the button for changes to the 'disabled' attribute
+ observer.observe(button, {
+ attributes: true,
+ attributeFilter: ["disabled"],
+ });
+ });
+}
+
+async function dialogObserver(subj) {
+ let dialog = subj.document.querySelector("dialog");
+ let acceptButton = dialog.getButton("accept");
+ await waitForButtonEnabledState(acceptButton);
+
subj.document.querySelector("dialog").acceptDialog();
sendAsyncMessage("promptAccepted");
}
=====================================
js/public/StructuredClone.h
=====================================
@@ -744,6 +744,7 @@ class JS_PUBLIC_API JSAutoStructuredCloneBuffer {
#define JS_SCERR_WASM_NO_TRANSFER 6
#define JS_SCERR_NOT_CLONABLE 7
#define JS_SCERR_NOT_CLONABLE_WITH_COOP_COEP 8
+#define JS_SCERR_TRANSFERABLE_TWICE 9
JS_PUBLIC_API bool JS_ReadUint32Pair(JSStructuredCloneReader* r, uint32_t* p1,
uint32_t* p2);
=====================================
js/public/friend/ErrorNumbers.msg
=====================================
@@ -527,6 +527,7 @@ MSG_DEF(JSMSG_SC_BAD_CLONE_VERSION, 0, JSEXN_ERR, "unsupported structured clo
MSG_DEF(JSMSG_SC_BAD_SERIALIZED_DATA, 1, JSEXN_INTERNALERR, "bad serialized structured data ({0})")
MSG_DEF(JSMSG_SC_DUP_TRANSFERABLE, 0, JSEXN_TYPEERR, "duplicate transferable for structured clone")
MSG_DEF(JSMSG_SC_NOT_TRANSFERABLE, 0, JSEXN_TYPEERR, "invalid transferable array for structured clone")
+MSG_DEF(JSMSG_SC_TRANSFERABLE_TWICE, 0, JSEXN_TYPEERR, "structured clone cannot transfer twice")
MSG_DEF(JSMSG_SC_UNSUPPORTED_TYPE, 0, JSEXN_TYPEERR, "unsupported type for structured data")
MSG_DEF(JSMSG_SC_NOT_CLONABLE, 1, JSEXN_TYPEERR, "The {0} object cannot be serialized. The Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy HTTP headers will enable this in the future.")
MSG_DEF(JSMSG_SC_NOT_CLONABLE_WITH_COOP_COEP, 1, JSEXN_TYPEERR, "The {0} object cannot be serialized. The Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy HTTP headers can be used to enable this.")
=====================================
js/src/jit-test/tests/structured-clone/transferable-cleanup.js
=====================================
@@ -160,6 +160,15 @@ function testMultiWithDeserializeReadTransferErrorHelper(g, BASE, desc) {
} catch (e) {
assertEq(e.message.includes("invalid transferable"), true);
}
+
+ try {
+ // This fails without logging anything, since the re-transfer will be caught
+ // by looking at its header before calling any callbacks.
+ let clone = deserialize(s);
+ } catch (e) {
+ assertEq(e.message.includes("cannot transfer twice"), true);
+ }
+
s = null;
gc();
printTrace(arguments.callee.name, g, BASE, obj.log, "deserialize");
@@ -170,6 +179,7 @@ function testMultiWithDeserializeReadTransferErrorHelper(g, BASE, desc) {
// which comes before the main reading. obj transfer data is now owned by its
// clone. obj3 transfer data was not successfully handed over to a new object,
// so it is still owned by the clone buffer and must be discarded with freeTransfer.
+ // 'F' means the data is freed.
BASE + 3, "F",
], "deserialize " + desc);
obj.log = null;
=====================================
js/src/jit/IonAnalysis.cpp
=====================================
@@ -29,8 +29,9 @@ using MPhiUseIteratorStack =
// Look for Phi uses with a depth-first search. If any uses are found the stack
// of MPhi instructions is returned in the |worklist| argument.
-static bool DepthFirstSearchUse(MIRGenerator* mir,
- MPhiUseIteratorStack& worklist, MPhi* phi) {
+[[nodiscard]] static bool DepthFirstSearchUse(MIRGenerator* mir,
+ MPhiUseIteratorStack& worklist,
+ MPhi* phi) {
// Push a Phi and the next use to iterate over in the worklist.
auto push = [&worklist](MPhi* phi, MUseIterator use) -> bool {
phi->setInWorklist();
@@ -131,9 +132,9 @@ static bool DepthFirstSearchUse(MIRGenerator* mir,
return true;
}
-static bool FlagPhiInputsAsImplicitlyUsed(MIRGenerator* mir, MBasicBlock* block,
- MBasicBlock* succ,
- MPhiUseIteratorStack& worklist) {
+[[nodiscard]] static bool FlagPhiInputsAsImplicitlyUsed(
+ MIRGenerator* mir, MBasicBlock* block, MBasicBlock* succ,
+ MPhiUseIteratorStack& worklist) {
// When removing an edge between 2 blocks, we might remove the ability of
// later phases to figure out that the uses of a Phi should be considered as
// a use of all its inputs. Thus we need to mark the Phi inputs as being
@@ -265,7 +266,7 @@ static MInstructionIterator FindFirstInstructionAfterBail(MBasicBlock* block) {
// Given an iterator pointing to the first removed instruction, mark
// the operands of each removed instruction as having implicit uses.
-static bool FlagOperandsAsImplicitlyUsedAfter(
+[[nodiscard]] static bool FlagOperandsAsImplicitlyUsedAfter(
MIRGenerator* mir, MBasicBlock* block, MInstructionIterator firstRemoved) {
MOZ_ASSERT(firstRemoved->block() == block);
@@ -312,8 +313,8 @@ static bool FlagOperandsAsImplicitlyUsedAfter(
return true;
}
-static bool FlagEntryResumePointOperands(MIRGenerator* mir,
- MBasicBlock* block) {
+[[nodiscard]] static bool FlagEntryResumePointOperands(MIRGenerator* mir,
+ MBasicBlock* block) {
// Flag observable operands of the entry resume point as having implicit uses.
MResumePoint* rp = block->entryResumePoint();
while (rp) {
@@ -334,8 +335,8 @@ static bool FlagEntryResumePointOperands(MIRGenerator* mir,
return true;
}
-static bool FlagAllOperandsAsImplicitlyUsed(MIRGenerator* mir,
- MBasicBlock* block) {
+[[nodiscard]] static bool FlagAllOperandsAsImplicitlyUsed(MIRGenerator* mir,
+ MBasicBlock* block) {
return FlagEntryResumePointOperands(mir, block) &&
FlagOperandsAsImplicitlyUsedAfter(mir, block, block->begin());
}
@@ -420,12 +421,16 @@ bool jit::PruneUnusedBranches(MIRGenerator* mir, MIRGraph& graph) {
if (!block->isMarked()) {
// If we are removing the block entirely, mark the operands of every
// instruction as being implicitly used.
- FlagAllOperandsAsImplicitlyUsed(mir, block);
+ if (!FlagAllOperandsAsImplicitlyUsed(mir, block)) {
+ return false;
+ }
} else if (block->alwaysBails()) {
// If we are only trimming instructions after a bail, only mark operands
// of removed instructions.
MInstructionIterator firstRemoved = FindFirstInstructionAfterBail(block);
- FlagOperandsAsImplicitlyUsedAfter(mir, block, firstRemoved);
+ if (!FlagOperandsAsImplicitlyUsedAfter(mir, block, firstRemoved)) {
+ return false;
+ }
}
}
@@ -503,7 +508,8 @@ bool jit::PruneUnusedBranches(MIRGenerator* mir, MIRGraph& graph) {
return true;
}
-static bool SplitCriticalEdgesForBlock(MIRGraph& graph, MBasicBlock* block) {
+[[nodiscard]] static bool SplitCriticalEdgesForBlock(MIRGraph& graph,
+ MBasicBlock* block) {
if (block->numSuccessors() < 2) {
return true;
}
@@ -767,8 +773,8 @@ static bool IsDiamondPattern(MBasicBlock* initialBlock) {
return true;
}
-static bool MaybeFoldDiamondConditionBlock(MIRGraph& graph,
- MBasicBlock* initialBlock) {
+[[nodiscard]] static bool MaybeFoldDiamondConditionBlock(
+ MIRGraph& graph, MBasicBlock* initialBlock) {
MOZ_ASSERT(IsDiamondPattern(initialBlock));
// Optimize the MIR graph to improve the code generated for conditional
@@ -936,8 +942,8 @@ static bool IsTrianglePattern(MBasicBlock* initialBlock) {
return false;
}
-static bool MaybeFoldTriangleConditionBlock(MIRGraph& graph,
- MBasicBlock* initialBlock) {
+[[nodiscard]] static bool MaybeFoldTriangleConditionBlock(
+ MIRGraph& graph, MBasicBlock* initialBlock) {
MOZ_ASSERT(IsTrianglePattern(initialBlock));
// Optimize the MIR graph to improve the code generated for boolean
@@ -1089,8 +1095,8 @@ static bool MaybeFoldTriangleConditionBlock(MIRGraph& graph,
return true;
}
-static bool MaybeFoldConditionBlock(MIRGraph& graph,
- MBasicBlock* initialBlock) {
+[[nodiscard]] static bool MaybeFoldConditionBlock(MIRGraph& graph,
+ MBasicBlock* initialBlock) {
if (IsDiamondPattern(initialBlock)) {
return MaybeFoldDiamondConditionBlock(graph, initialBlock);
}
@@ -1100,7 +1106,8 @@ static bool MaybeFoldConditionBlock(MIRGraph& graph,
return true;
}
-static bool MaybeFoldTestBlock(MIRGraph& graph, MBasicBlock* initialBlock) {
+[[nodiscard]] static bool MaybeFoldTestBlock(MIRGraph& graph,
+ MBasicBlock* initialBlock) {
// Handle test expressions on more than two inputs. For example
// |if ((x > 10) && (y > 20) && (z > 30)) { ... }|, which results in the below
// pattern.
@@ -2752,7 +2759,9 @@ bool jit::RemoveUnmarkedBlocks(MIRGenerator* mir, MIRGraph& graph,
continue;
}
- FlagAllOperandsAsImplicitlyUsed(mir, block);
+ if (!FlagAllOperandsAsImplicitlyUsed(mir, block)) {
+ return false;
+ }
}
// Find unmarked blocks and remove them.
@@ -4003,8 +4012,8 @@ bool jit::EliminateRedundantShapeGuards(MIRGraph& graph) {
return true;
}
-static bool TryEliminateGCBarriersForAllocation(TempAllocator& alloc,
- MInstruction* allocation) {
+[[nodiscard]] static bool TryEliminateGCBarriersForAllocation(
+ TempAllocator& alloc, MInstruction* allocation) {
MOZ_ASSERT(allocation->type() == MIRType::Object);
JitSpew(JitSpew_RedundantGCBarriers, "Analyzing allocation %s",
=====================================
js/src/vm/StructuredClone.cpp
=====================================
@@ -172,17 +172,25 @@ enum StructuredDataType : uint32_t {
/*
* Format of transfer map:
- * <SCTAG_TRANSFER_MAP_HEADER, TransferableMapHeader(UNREAD|TRANSFERRED)>
- * numTransferables (64 bits)
- * array of:
- * <SCTAG_TRANSFER_MAP_*, TransferableOwnership>
- * pointer (64 bits)
- * extraData (64 bits), eg byte length for ArrayBuffers
+ * - <SCTAG_TRANSFER_MAP_HEADER, UNREAD|TRANSFERRING|TRANSFERRED>
+ * - numTransferables (64 bits)
+ * - array of:
+ * - <SCTAG_TRANSFER_MAP_*, TransferableOwnership> pointer (64
+ * bits)
+ * - extraData (64 bits), eg byte length for ArrayBuffers
+ * - any data written for custom transferables
*/
// Data associated with an SCTAG_TRANSFER_MAP_HEADER that tells whether the
-// contents have been read out yet or not.
-enum TransferableMapHeader { SCTAG_TM_UNREAD = 0, SCTAG_TM_TRANSFERRED };
+// contents have been read out yet or not. TRANSFERRING is for the case where we
+// have started but not completed reading, which due to errors could mean that
+// there are things still owned by the clone buffer that need to be released, so
+// discarding should not just be skipped.
+enum TransferableMapHeader {
+ SCTAG_TM_UNREAD = 0,
+ SCTAG_TM_TRANSFERRING,
+ SCTAG_TM_TRANSFERRED
+};
static inline uint64_t PairToUInt64(uint32_t tag, uint32_t data) {
return uint64_t(data) | (uint64_t(tag) << 32);
@@ -693,6 +701,10 @@ static void ReportDataCloneError(JSContext* cx,
errorNumber = JSMSG_SC_SHMEM_TRANSFERABLE;
break;
+ case JS_SCERR_TRANSFERABLE_TWICE:
+ errorNumber = JSMSG_SC_TRANSFERABLE_TWICE;
+ break;
+
case JS_SCERR_TYPED_ARRAY_DETACHED:
errorNumber = JSMSG_TYPED_ARRAY_DETACHED;
break;
@@ -3209,11 +3221,21 @@ bool JSStructuredCloneReader::readTransferMap() {
return in.reportTruncated();
}
+ auto transferState = static_cast<TransferableMapHeader>(data);
+
if (tag != SCTAG_TRANSFER_MAP_HEADER ||
- TransferableMapHeader(data) == SCTAG_TM_TRANSFERRED) {
+ transferState == SCTAG_TM_TRANSFERRED) {
return true;
}
+ if (transferState == SCTAG_TM_TRANSFERRING) {
+ ReportDataCloneError(cx, callbacks, JS_SCERR_TRANSFERABLE_TWICE, closure);
+ return false;
+ }
+
+ headerPos.write(
+ PairToUInt64(SCTAG_TRANSFER_MAP_HEADER, SCTAG_TM_TRANSFERRING));
+
uint64_t numTransferables;
MOZ_ALWAYS_TRUE(in.readPair(&tag, &data));
if (!in.read(&numTransferables)) {
@@ -3329,7 +3351,7 @@ bool JSStructuredCloneReader::readTransferMap() {
#ifdef DEBUG
SCInput::getPair(headerPos.peek(), &tag, &data);
MOZ_ASSERT(tag == SCTAG_TRANSFER_MAP_HEADER);
- MOZ_ASSERT(TransferableMapHeader(data) != SCTAG_TM_TRANSFERRED);
+ MOZ_ASSERT(TransferableMapHeader(data) == SCTAG_TM_TRANSFERRING);
#endif
headerPos.write(
PairToUInt64(SCTAG_TRANSFER_MAP_HEADER, SCTAG_TM_TRANSFERRED));
=====================================
layout/style/ServoStyleSet.cpp
=====================================
@@ -954,7 +954,7 @@ static OriginFlags ToOriginFlags(StyleOrigin aOrigin) {
}
}
-void ServoStyleSet::ImportRuleLoaded(dom::CSSImportRule&, StyleSheet& aSheet) {
+void ServoStyleSet::ImportRuleLoaded(StyleSheet& aSheet) {
if (mStyleRuleMap) {
mStyleRuleMap->SheetAdded(aSheet);
}
=====================================
layout/style/ServoStyleSet.h
=====================================
@@ -133,7 +133,7 @@ class ServoStyleSet {
void RuleRemoved(StyleSheet&, css::Rule&);
void RuleChanged(StyleSheet&, css::Rule*, StyleRuleChangeKind);
void SheetCloned(StyleSheet&);
- void ImportRuleLoaded(dom::CSSImportRule&, StyleSheet&);
+ void ImportRuleLoaded(StyleSheet&);
// Runs style invalidation due to document state changes.
void InvalidateStyleForDocumentStateChanges(
=====================================
layout/style/StyleSheet.cpp
=====================================
@@ -836,15 +836,19 @@ StyleSheet::StyleSheetLoaded(StyleSheet* aSheet, bool aWasDeferred,
if (!aSheet->GetParentSheet()) {
return NS_OK; // ignore if sheet has been detached already
}
- MOZ_ASSERT(this == aSheet->GetParentSheet(),
- "We are being notified of a sheet load for a sheet that is not "
- "our child!");
+ MOZ_DIAGNOSTIC_ASSERT(this == aSheet->GetParentSheet(),
+ "We are being notified of a sheet load for a sheet "
+ "that is not our child!");
if (NS_FAILED(aStatus)) {
return NS_OK;
}
-
- MOZ_ASSERT(aSheet->GetOwnerRule());
- NOTIFY(ImportRuleLoaded, (*aSheet->GetOwnerRule(), *aSheet));
+ // The assert below should hold if we stop triggering import loads for invalid
+ // insertRule() calls, see bug 1914106.
+ // MOZ_ASSERT(aSheet->GetOwnerRule());
+ if (!aSheet->GetOwnerRule()) {
+ return NS_OK;
+ }
+ NOTIFY(ImportRuleLoaded, (*aSheet));
return NS_OK;
}
=====================================
netwerk/ipc/DocumentLoadListener.cpp
=====================================
@@ -2316,15 +2316,9 @@ bool DocumentLoadListener::DocShellWillDisplayContent(nsresult aStatus) {
auto* loadingContext = GetLoadingBrowsingContext();
- bool isInitialDocument = true;
- if (WindowGlobalParent* currentWindow =
- loadingContext->GetCurrentWindowGlobal()) {
- isInitialDocument = currentWindow->IsInitialDocument();
- }
-
nsresult rv = nsDocShell::FilterStatusForErrorPage(
aStatus, mChannel, mLoadStateLoadType, loadingContext->IsTop(),
- loadingContext->GetUseErrorPages(), isInitialDocument, nullptr);
+ loadingContext->GetUseErrorPages(), nullptr);
if (NS_SUCCEEDED(rv)) {
MOZ_LOG(gProcessIsolationLog, LogLevel::Verbose,
=====================================
netwerk/protocol/webtransport/WebTransportSessionProxy.cpp
=====================================
@@ -1042,15 +1042,6 @@ void WebTransportSessionProxy::NotifyDatagramReceived(
MutexAutoLock lock(mMutex);
MOZ_ASSERT(mTarget->IsOnCurrentThread());
- if (!mStopRequestCalled) {
- CopyableTArray<uint8_t> copied(aData);
- mPendingEvents.AppendElement(
- [self = RefPtr{this}, data = std::move(copied)]() mutable {
- self->NotifyDatagramReceived(std::move(data));
- });
- return;
- }
-
if (mState != WebTransportSessionProxyState::ACTIVE || !mListener) {
return;
}
@@ -1066,6 +1057,15 @@ NS_IMETHODIMP WebTransportSessionProxy::OnDatagramReceivedInternal(
{
MutexAutoLock lock(mMutex);
+ if (!mStopRequestCalled) {
+ CopyableTArray<uint8_t> copied(aData);
+ mPendingEvents.AppendElement(
+ [self = RefPtr{this}, data = std::move(copied)]() mutable {
+ self->OnDatagramReceivedInternal(std::move(data));
+ });
+ return NS_OK;
+ }
+
if (!mTarget->IsOnCurrentThread()) {
return mTarget->Dispatch(NS_NewRunnableFunction(
"WebTransportSessionProxy::OnDatagramReceived",
=====================================
testing/web-platform/tests/css/cssom/insertRule-import-trailing-garbage-crash.html
=====================================
@@ -0,0 +1,6 @@
+<!doctype html>
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1914106">
+<style></style>
+<script>
+document.querySelector("style").sheet.insertRule("@import url('data:text/css,:root{background:red}');html,body{/* random garbage */}");
+</script>
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/b97760…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/b97760…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser] Pushed new tag tor-browser-115.16.0esr-13.5-1-build2
by ma1 (@ma1) 30 Sep '24
by ma1 (@ma1) 30 Sep '24
30 Sep '24
ma1 pushed new tag tor-browser-115.16.0esr-13.5-1-build2 at The Tor Project / Applications / Tor Browser
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/tor-brows…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] Bug 1906024 - Format download file names better a=diannaS [BP131]
by ma1 (@ma1) 30 Sep '24
by ma1 (@ma1) 30 Sep '24
30 Sep '24
ma1 pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android
Commits:
257aa5e5 by hackademix at 2024-09-30T21:41:21+02:00
Bug 1906024 - Format download file names better a=diannaS [BP131]
- - - - -
1 changed file:
- android-components/components/support/ktx/src/main/java/mozilla/components/support/ktx/kotlin/String.kt
Changes:
=====================================
android-components/components/support/ktx/src/main/java/mozilla/components/support/ktx/kotlin/String.kt
=====================================
@@ -49,6 +49,8 @@ const val MAX_URI_LENGTH = 25000
private const val FILE_PREFIX = "file://"
private const val MAX_VALID_PORT = 65_535
+private const val SPACE = " "
+private const val UNDERSCORE = "_"
/**
* Shortens URLs to be more user friendly.
@@ -303,7 +305,27 @@ fun String.sanitizeFileName(): String {
file.name.replace("\\.\\.+".toRegex(), ".")
} else {
file.name.replace(".", "")
- }
+ }.replaceContinuousSpaces()
+ .replaceEscapedCharacters()
+ .trim()
+}
+
+
+/**
+ * Replaces control characters from ASCII 0 to ASCII 19 with '_' so the file name is valid
+ * and is correctly displayed.
+ */
+private fun String.replaceEscapedCharacters(): String {
+ val escapedCharactersRegex = "[\\x00-\\x13*\"?<>:|\\\\]".toRegex()
+ return replace(escapedCharactersRegex, UNDERSCORE)
+}
+
+/**
+ * Replaces continuous spaces with a single space.
+ */
+private fun String.replaceContinuousSpaces(): String {
+ val escapedCharactersRegex = "[\\p{Z}\\s]+".toRegex()
+ return replace(escapedCharactersRegex, SPACE)
}
/**
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/257…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/257…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.16.0esr-13.5-1] 7 commits: Bug 1881037 - Part 1: Stop showing unknown protocol error pages for...
by ma1 (@ma1) 30 Sep '24
by ma1 (@ma1) 30 Sep '24
30 Sep '24
ma1 pushed to branch tor-browser-115.16.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
55489055 by Nika Layzell at 2024-09-30T22:11:11+02:00
Bug 1881037 - Part 1: Stop showing unknown protocol error pages for web-triggered loads, r=smaug,necko-reviewers,kershaw, a=dsmith
Differential Revision: https://phabricator.services.mozilla.com/D217495
- - - - -
a22b191f by Paul Zuehlcke at 2024-09-30T22:11:13+02:00
Bug 1916659, a=diannaS
Original Revision: https://phabricator.services.mozilla.com/D222629
Differential Revision: https://phabricator.services.mozilla.com/D222934
- - - - -
54c94044 by André Bargull at 2024-09-30T22:11:14+02:00
Bug 1915249: Add more nodiscard. a=RyanVM
Original Revision: https://phabricator.services.mozilla.com/D220311
Differential Revision: https://phabricator.services.mozilla.com/D221663
- - - - -
604b2140 by Emilio Cobos Álvarez at 2024-09-30T22:11:16+02:00
Bug 1914106 - Deal with insertRule edge-case. r=jwatt a=RyanVM
When there's trailing garbage after an @import rule we throw, but we
still trigger the load (that's not great but not trivial to change).
Deal with that case before calling ImportRuleLoaded().
Differential Revision: https://phabricator.services.mozilla.com/D219783
- - - - -
a5b0cd63 by Steve Fink at 2024-09-30T22:11:17+02:00
Bug 1912471 - Disallow deserializing structured clone buffers with transferables more than once r=iain, a=dsmith
Differential Revision: https://phabricator.services.mozilla.com/D220644
- - - - -
46b546e1 by Nika Layzell at 2024-09-30T23:33:48+02:00
Bug 1911745 - Unify BrowsingContext flag coherency checks, r=mccr8
Previously these checks were largely diagnostic tools for finding bugs
in other code as it evolves. This unifies the checks a bit more and
makes them stronger for BrowsingContexts created over IPC, providing a
place for more coherency checks to be added in the future.
Differential Revision: https://phabricator.services.mozilla.com/D218860
- - - - -
58bcbec1 by Kershaw Chang at 2024-09-30T23:33:56+02:00
Bug 1907726 - Make sure WebTransportSessionProxy::NotifyDatagramReceived is called after OnStopRequest, a=RyanVM
The crash occurs because WebTransportSessionProxy::OnDatagramReceivedInternal is called before WebTransportSessionProxy::OnStopRequest.
When this happens, WebTransportSessionProxy::mTarget is the main thread, so a task is dispatched to the main thread. This causes WebTransportSessionProxy::NotifyDatagramReceived to be called on the main thread.
If WebTransportSessionProxy::NotifyDatagramReceived is invoked while WebTransportSessionProxy::mStopRequestCalled is true, it can lead to OnDatagramReceived being called on the main thread (instead of the socket thread), resulting in a crash.
Original Revision: https://phabricator.services.mozilla.com/D220013
Differential Revision: https://phabricator.services.mozilla.com/D221661
- - - - -
22 changed files:
- browser/base/content/test/tabPrompts/browser_confirmFolderUpload.js
- browser/components/prompts/PromptCollection.sys.mjs
- docshell/base/BrowsingContext.cpp
- docshell/base/BrowsingContext.h
- docshell/base/nsDocShell.cpp
- docshell/base/nsDocShell.h
- dom/base/Document.cpp
- dom/base/Document.h
- dom/base/ShadowRoot.cpp
- dom/base/ShadowRoot.h
- dom/filesystem/tests/script_promptHandler.js
- js/public/StructuredClone.h
- js/public/friend/ErrorNumbers.msg
- js/src/jit-test/tests/structured-clone/transferable-cleanup.js
- js/src/jit/IonAnalysis.cpp
- js/src/vm/StructuredClone.cpp
- layout/style/ServoStyleSet.cpp
- layout/style/ServoStyleSet.h
- layout/style/StyleSheet.cpp
- netwerk/ipc/DocumentLoadListener.cpp
- netwerk/protocol/webtransport/WebTransportSessionProxy.cpp
- + testing/web-platform/tests/css/cssom/insertRule-import-trailing-garbage-crash.html
Changes:
=====================================
browser/base/content/test/tabPrompts/browser_confirmFolderUpload.js
=====================================
@@ -101,8 +101,29 @@ async function testUploadPrompt(confirmUpload) {
// Wait for confirmation prompt
let prompt = await promptPromise;
ok(prompt, "Shown upload confirmation prompt");
+
is(prompt.ui.button0.label, "Upload", "Accept button label");
+ ok(
+ prompt.ui.button0.disabled,
+ "Accept button should be disabled by the security delay initially."
+ );
+
ok(prompt.ui.button1.hasAttribute("default"), "Cancel is default button");
+ ok(
+ !prompt.ui.button1.disabled,
+ "Cancel button should not be disabled by the security delay."
+ );
+
+ info("Wait for the security delay to pass.");
+ let delayTime = Services.prefs.getIntPref("security.dialog_enable_delay");
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ await new Promise(resolve => setTimeout(resolve, delayTime + 100));
+
+ ok(
+ !prompt.ui.button0.disabled,
+ "Accept button should no longer be disabled."
+ );
+ ok(!prompt.ui.button1.disabled, "Cancel button should remain enabled.");
// Close confirmation prompt
await PromptTestUtils.handlePrompt(prompt, {
=====================================
browser/components/prompts/PromptCollection.sys.mjs
=====================================
@@ -156,7 +156,7 @@ export class PromptCollection {
Services.prompt.MODAL_TYPE_TAB,
title,
message,
- buttonFlags,
+ buttonFlags | Ci.nsIPrompt.BUTTON_DELAY_ENABLE,
acceptLabel,
null,
null,
=====================================
docshell/base/BrowsingContext.cpp
=====================================
@@ -572,9 +572,19 @@ mozilla::ipc::IPCResult BrowsingContext::CreateFromIPC(
context->mRequestContextId = aInit.mRequestContextId;
// NOTE: Private browsing ID is set by `SetOriginAttributes`.
+ if (const char* failure =
+ context->BrowsingContextCoherencyChecks(aOriginProcess)) {
+ mozilla::ipc::IProtocol* actor = aOriginProcess;
+ if (!actor) {
+ actor = ContentChild::GetSingleton();
+ }
+ return IPC_FAIL(actor, "Incoherent BrowsingContext");
+ }
+
Register(context);
- return context->Attach(/* aFromIPC */ true, aOriginProcess);
+ context->Attach(/* aFromIPC */ true, aOriginProcess);
+ return IPC_OK();
}
BrowsingContext::BrowsingContext(WindowContext* aParentWindow,
@@ -786,8 +796,64 @@ void BrowsingContext::Embed() {
}
}
-mozilla::ipc::IPCResult BrowsingContext::Attach(bool aFromIPC,
- ContentParent* aOriginProcess) {
+const char* BrowsingContext::BrowsingContextCoherencyChecks(
+ ContentParent* aOriginProcess) {
+#define COHERENCY_ASSERT(condition) \
+ if (!(condition)) return "Assertion " #condition " failed";
+
+ if (mGroup->IsPotentiallyCrossOriginIsolated() !=
+ (Top()->GetOpenerPolicy() ==
+ nsILoadInfo::OPENER_POLICY_SAME_ORIGIN_EMBEDDER_POLICY_REQUIRE_CORP)) {
+ return "Invalid CrossOriginIsolated state";
+ }
+
+ if (aOriginProcess && !IsContent()) {
+ return "Content cannot create chrome BCs";
+ }
+
+ // LoadContext should generally match our opener or parent.
+ if (IsContent()) {
+ if (RefPtr<BrowsingContext> opener = GetOpener()) {
+ COHERENCY_ASSERT(opener->mType == mType);
+ COHERENCY_ASSERT(opener->mGroup == mGroup);
+ COHERENCY_ASSERT(opener->mUseRemoteTabs == mUseRemoteTabs);
+ COHERENCY_ASSERT(opener->mUseRemoteSubframes == mUseRemoteSubframes);
+ COHERENCY_ASSERT(opener->mPrivateBrowsingId == mPrivateBrowsingId);
+ COHERENCY_ASSERT(
+ opener->mOriginAttributes.EqualsIgnoringFPD(mOriginAttributes));
+ }
+ }
+ if (RefPtr<BrowsingContext> parent = GetParent()) {
+ COHERENCY_ASSERT(parent->mType == mType);
+ COHERENCY_ASSERT(parent->mGroup == mGroup);
+ COHERENCY_ASSERT(parent->mUseRemoteTabs == mUseRemoteTabs);
+ COHERENCY_ASSERT(parent->mUseRemoteSubframes == mUseRemoteSubframes);
+ COHERENCY_ASSERT(parent->mPrivateBrowsingId == mPrivateBrowsingId);
+ COHERENCY_ASSERT(
+ parent->mOriginAttributes.EqualsIgnoringFPD(mOriginAttributes));
+ }
+
+ // UseRemoteSubframes and UseRemoteTabs must match.
+ if (mUseRemoteSubframes && !mUseRemoteTabs) {
+ return "Cannot set useRemoteSubframes without also setting useRemoteTabs";
+ }
+
+ // Double-check OriginAttributes/Private Browsing
+ // Chrome browsing contexts must not have a private browsing OriginAttribute
+ // Content browsing contexts must maintain the equality:
+ // mOriginAttributes.mPrivateBrowsingId == mPrivateBrowsingId
+ if (IsChrome()) {
+ COHERENCY_ASSERT(mOriginAttributes.mPrivateBrowsingId == 0);
+ } else {
+ COHERENCY_ASSERT(mOriginAttributes.mPrivateBrowsingId ==
+ mPrivateBrowsingId);
+ }
+#undef COHERENCY_ASSERT
+
+ return nullptr;
+}
+
+void BrowsingContext::Attach(bool aFromIPC, ContentParent* aOriginProcess) {
MOZ_DIAGNOSTIC_ASSERT(!mEverAttached);
MOZ_DIAGNOSTIC_ASSERT_IF(aFromIPC, aOriginProcess || XRE_IsContentProcess());
mEverAttached = true;
@@ -806,25 +872,15 @@ mozilla::ipc::IPCResult BrowsingContext::Attach(bool aFromIPC,
MOZ_DIAGNOSTIC_ASSERT(mGroup);
MOZ_DIAGNOSTIC_ASSERT(!mIsDiscarded);
- if (mGroup->IsPotentiallyCrossOriginIsolated() !=
- (Top()->GetOpenerPolicy() ==
- nsILoadInfo::OPENER_POLICY_SAME_ORIGIN_EMBEDDER_POLICY_REQUIRE_CORP)) {
- MOZ_DIAGNOSTIC_ASSERT(aFromIPC);
- if (aFromIPC) {
- auto* actor = aOriginProcess
- ? static_cast<mozilla::ipc::IProtocol*>(aOriginProcess)
- : static_cast<mozilla::ipc::IProtocol*>(
- ContentChild::GetSingleton());
- return IPC_FAIL(
- actor,
- "Invalid CrossOriginIsolated state in BrowsingContext::Attach call");
- } else {
- MOZ_CRASH(
- "Invalid CrossOriginIsolated state in BrowsingContext::Attach call");
+#ifdef MOZ_DIAGNOSTIC_ASSERT_ENABLED
+ // We'll already have checked this if `aFromIPC` is set before calling this
+ // function.
+ if (!aFromIPC) {
+ if (const char* failure = BrowsingContextCoherencyChecks(aOriginProcess)) {
+ MOZ_CRASH_UNSAFE_PRINTF("Incoherent BrowsingContext: %s", failure);
}
}
-
- AssertCoherentLoadContext();
+#endif
// Add ourselves either to our parent or BrowsingContextGroup's child list.
// Important: We shouldn't return IPC_FAIL after this point, since the
@@ -906,7 +962,6 @@ mozilla::ipc::IPCResult BrowsingContext::Attach(bool aFromIPC,
if (XRE_IsParentProcess()) {
Canonical()->CanonicalAttach();
}
- return IPC_OK();
}
void BrowsingContext::Detach(bool aFromIPC) {
@@ -1743,40 +1798,6 @@ nsresult BrowsingContext::SetOriginAttributes(const OriginAttributes& aAttrs) {
return NS_OK;
}
-void BrowsingContext::AssertCoherentLoadContext() {
-#ifdef MOZ_DIAGNOSTIC_ASSERT_ENABLED
- // LoadContext should generally match our opener or parent.
- if (IsContent()) {
- if (RefPtr<BrowsingContext> opener = GetOpener()) {
- MOZ_DIAGNOSTIC_ASSERT(opener->mType == mType);
- MOZ_DIAGNOSTIC_ASSERT(opener->mGroup == mGroup);
- MOZ_DIAGNOSTIC_ASSERT(opener->mUseRemoteTabs == mUseRemoteTabs);
- MOZ_DIAGNOSTIC_ASSERT(opener->mUseRemoteSubframes == mUseRemoteSubframes);
- MOZ_DIAGNOSTIC_ASSERT(opener->mPrivateBrowsingId == mPrivateBrowsingId);
- MOZ_DIAGNOSTIC_ASSERT(
- opener->mOriginAttributes.EqualsIgnoringFPD(mOriginAttributes));
- }
- }
- if (RefPtr<BrowsingContext> parent = GetParent()) {
- MOZ_DIAGNOSTIC_ASSERT(parent->mType == mType);
- MOZ_DIAGNOSTIC_ASSERT(parent->mGroup == mGroup);
- MOZ_DIAGNOSTIC_ASSERT(parent->mUseRemoteTabs == mUseRemoteTabs);
- MOZ_DIAGNOSTIC_ASSERT(parent->mUseRemoteSubframes == mUseRemoteSubframes);
- MOZ_DIAGNOSTIC_ASSERT(parent->mPrivateBrowsingId == mPrivateBrowsingId);
- MOZ_DIAGNOSTIC_ASSERT(
- parent->mOriginAttributes.EqualsIgnoringFPD(mOriginAttributes));
- }
-
- // UseRemoteSubframes and UseRemoteTabs must match.
- MOZ_DIAGNOSTIC_ASSERT(
- !mUseRemoteSubframes || mUseRemoteTabs,
- "Cannot set useRemoteSubframes without also setting useRemoteTabs");
-
- // Double-check OriginAttributes/Private Browsing
- AssertOriginAttributesMatchPrivateBrowsing();
-#endif
-}
-
void BrowsingContext::AssertOriginAttributesMatchPrivateBrowsing() {
// Chrome browsing contexts must not have a private browsing OriginAttribute
// Content browsing contexts must maintain the equality:
=====================================
docshell/base/BrowsingContext.h
=====================================
@@ -971,7 +971,18 @@ class BrowsingContext : public nsILoadContext, public nsWrapperCache {
bool aHasPostData);
private:
- mozilla::ipc::IPCResult Attach(bool aFromIPC, ContentParent* aOriginProcess);
+ // Assert that this BrowsingContext is coherent relative to related
+ // BrowsingContexts. This will be run before the BrowsingContext is attached.
+ //
+ // A non-null string return value indicates that there was a coherency check
+ // failure, which will be handled with either a crash or IPC failure.
+ //
+ // If provided, `aOriginProcess` is the process which is responsible for the
+ // creation of this BrowsingContext.
+ [[nodiscard]] const char* BrowsingContextCoherencyChecks(
+ ContentParent* aOriginProcess);
+
+ void Attach(bool aFromIPC, ContentParent* aOriginProcess);
// Recomputes whether we can execute scripts in this BrowsingContext based on
// the value of AllowJavascript() and whether scripts are allowed in the
@@ -985,10 +996,6 @@ class BrowsingContext : public nsILoadContext, public nsWrapperCache {
void AssertOriginAttributesMatchPrivateBrowsing();
- // Assert that the BrowsingContext's LoadContext flags appear coherent
- // relative to related BrowsingContexts.
- void AssertCoherentLoadContext();
-
friend class ::nsOuterWindowProxy;
friend class ::nsGlobalWindowOuter;
friend class WindowContext;
=====================================
docshell/base/nsDocShell.cpp
=====================================
@@ -6307,7 +6307,7 @@ already_AddRefed<nsIURI> nsDocShell::AttemptURIFixup(
nsresult nsDocShell::FilterStatusForErrorPage(
nsresult aStatus, nsIChannel* aChannel, uint32_t aLoadType,
- bool aIsTopFrame, bool aUseErrorPages, bool aIsInitialDocument,
+ bool aIsTopFrame, bool aUseErrorPages,
bool* aSkippedUnknownProtocolNavigation) {
// Errors to be shown only on top-level frames
if ((aStatus == NS_ERROR_UNKNOWN_HOST ||
@@ -6352,18 +6352,10 @@ nsresult nsDocShell::FilterStatusForErrorPage(
if (aStatus == NS_ERROR_UNKNOWN_PROTOCOL) {
// For unknown protocols we only display an error if the load is triggered
- // by the browser itself, or we're replacing the initial document (and
- // nothing else). Showing the error for page-triggered navigations causes
- // annoying behavior for users, see bug 1528305.
- //
- // We could, maybe, try to detect if this is in response to some user
- // interaction (like clicking a link, or something else) and maybe show
- // the error page in that case. But this allows for ctrl+clicking and such
- // to see the error page.
+ // by the browser itself. Showing the error for page-triggered navigations
+ // causes annoying behavior for users, see bug 1528305.
nsCOMPtr<nsILoadInfo> info = aChannel->LoadInfo();
- if (!info->TriggeringPrincipal()->IsSystemPrincipal() &&
- StaticPrefs::dom_no_unknown_protocol_error_enabled() &&
- !aIsInitialDocument) {
+ if (!info->TriggeringPrincipal()->IsSystemPrincipal()) {
if (aSkippedUnknownProtocolNavigation) {
*aSkippedUnknownProtocolNavigation = true;
}
@@ -6513,12 +6505,9 @@ nsresult nsDocShell::EndPageLoad(nsIWebProgress* aProgress,
aStatus == NS_ERROR_CONTENT_BLOCKED);
UnblockEmbedderLoadEventForFailure(fireFrameErrorEvent);
- bool isInitialDocument =
- !GetExtantDocument() || GetExtantDocument()->IsInitialDocument();
bool skippedUnknownProtocolNavigation = false;
aStatus = FilterStatusForErrorPage(aStatus, aChannel, mLoadType, isTopFrame,
mBrowsingContext->GetUseErrorPages(),
- isInitialDocument,
&skippedUnknownProtocolNavigation);
hadErrorStatus = true;
if (NS_FAILED(aStatus)) {
=====================================
docshell/base/nsDocShell.h
=====================================
@@ -464,7 +464,7 @@ class nsDocShell final : public nsDocLoader,
// navigation.
static nsresult FilterStatusForErrorPage(
nsresult aStatus, nsIChannel* aChannel, uint32_t aLoadType,
- bool aIsTopFrame, bool aUseErrorPages, bool aIsInitialDocument,
+ bool aIsTopFrame, bool aUseErrorPages,
bool* aSkippedUnknownProtocolNavigation = nullptr);
// Notify consumers of a search being loaded through the observer service:
=====================================
dom/base/Document.cpp
=====================================
@@ -8326,7 +8326,7 @@ void Document::RuleAdded(StyleSheet& aSheet, css::Rule& aRule) {
}
}
-void Document::ImportRuleLoaded(dom::CSSImportRule& aRule, StyleSheet& aSheet) {
+void Document::ImportRuleLoaded(StyleSheet& aSheet) {
if (aSheet.IsApplicable()) {
ApplicableStylesChanged();
}
=====================================
dom/base/Document.h
=====================================
@@ -2135,7 +2135,7 @@ class Document : public nsINode,
void RuleAdded(StyleSheet&, css::Rule&);
void RuleRemoved(StyleSheet&, css::Rule&);
void SheetCloned(StyleSheet&) {}
- void ImportRuleLoaded(CSSImportRule&, StyleSheet&);
+ void ImportRuleLoaded(StyleSheet&);
/**
* Flush notifications for this document and its parent documents
=====================================
dom/base/ShadowRoot.cpp
=====================================
@@ -412,7 +412,7 @@ void ShadowRoot::RuleChanged(StyleSheet& aSheet, css::Rule*,
ApplicableRulesChanged();
}
-void ShadowRoot::ImportRuleLoaded(CSSImportRule&, StyleSheet& aSheet) {
+void ShadowRoot::ImportRuleLoaded(StyleSheet& aSheet) {
if (mStyleRuleMap) {
mStyleRuleMap->SheetAdded(aSheet);
}
=====================================
dom/base/ShadowRoot.h
=====================================
@@ -86,7 +86,7 @@ class ShadowRoot final : public DocumentFragment,
void RuleAdded(StyleSheet&, css::Rule&);
void RuleRemoved(StyleSheet&, css::Rule&);
void RuleChanged(StyleSheet&, css::Rule*, StyleRuleChangeKind);
- void ImportRuleLoaded(CSSImportRule&, StyleSheet&);
+ void ImportRuleLoaded(StyleSheet&);
void SheetCloned(StyleSheet&);
void StyleSheetApplicableStateChanged(StyleSheet&);
=====================================
dom/filesystem/tests/script_promptHandler.js
=====================================
@@ -2,7 +2,45 @@
let dialogObserverTopic = "common-dialog-loaded";
-function dialogObserver(subj, topic, data) {
+function waitForButtonEnabledState(button) {
+ return new Promise(resolve => {
+ // Check if the button is already enabled (not disabled)
+ if (!button.disabled) {
+ resolve();
+ return;
+ }
+
+ // Create a MutationObserver instance
+ let win = button.ownerGlobal;
+ let { MutationObserver } = win;
+ const observer = new MutationObserver(mutationsList => {
+ for (const mutation of mutationsList) {
+ if (
+ mutation.type === "attributes" &&
+ mutation.attributeName === "disabled"
+ ) {
+ if (!button.disabled) {
+ // Resolve the promise when the button is enabled
+ observer.disconnect(); // Stop observing
+ resolve();
+ }
+ }
+ }
+ });
+
+ // Start observing the button for changes to the 'disabled' attribute
+ observer.observe(button, {
+ attributes: true,
+ attributeFilter: ["disabled"],
+ });
+ });
+}
+
+async function dialogObserver(subj) {
+ let dialog = subj.document.querySelector("dialog");
+ let acceptButton = dialog.getButton("accept");
+ await waitForButtonEnabledState(acceptButton);
+
subj.document.querySelector("dialog").acceptDialog();
sendAsyncMessage("promptAccepted");
}
=====================================
js/public/StructuredClone.h
=====================================
@@ -744,6 +744,7 @@ class JS_PUBLIC_API JSAutoStructuredCloneBuffer {
#define JS_SCERR_WASM_NO_TRANSFER 6
#define JS_SCERR_NOT_CLONABLE 7
#define JS_SCERR_NOT_CLONABLE_WITH_COOP_COEP 8
+#define JS_SCERR_TRANSFERABLE_TWICE 9
JS_PUBLIC_API bool JS_ReadUint32Pair(JSStructuredCloneReader* r, uint32_t* p1,
uint32_t* p2);
=====================================
js/public/friend/ErrorNumbers.msg
=====================================
@@ -527,6 +527,7 @@ MSG_DEF(JSMSG_SC_BAD_CLONE_VERSION, 0, JSEXN_ERR, "unsupported structured clo
MSG_DEF(JSMSG_SC_BAD_SERIALIZED_DATA, 1, JSEXN_INTERNALERR, "bad serialized structured data ({0})")
MSG_DEF(JSMSG_SC_DUP_TRANSFERABLE, 0, JSEXN_TYPEERR, "duplicate transferable for structured clone")
MSG_DEF(JSMSG_SC_NOT_TRANSFERABLE, 0, JSEXN_TYPEERR, "invalid transferable array for structured clone")
+MSG_DEF(JSMSG_SC_TRANSFERABLE_TWICE, 0, JSEXN_TYPEERR, "structured clone cannot transfer twice")
MSG_DEF(JSMSG_SC_UNSUPPORTED_TYPE, 0, JSEXN_TYPEERR, "unsupported type for structured data")
MSG_DEF(JSMSG_SC_NOT_CLONABLE, 1, JSEXN_TYPEERR, "The {0} object cannot be serialized. The Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy HTTP headers will enable this in the future.")
MSG_DEF(JSMSG_SC_NOT_CLONABLE_WITH_COOP_COEP, 1, JSEXN_TYPEERR, "The {0} object cannot be serialized. The Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy HTTP headers can be used to enable this.")
=====================================
js/src/jit-test/tests/structured-clone/transferable-cleanup.js
=====================================
@@ -160,6 +160,15 @@ function testMultiWithDeserializeReadTransferErrorHelper(g, BASE, desc) {
} catch (e) {
assertEq(e.message.includes("invalid transferable"), true);
}
+
+ try {
+ // This fails without logging anything, since the re-transfer will be caught
+ // by looking at its header before calling any callbacks.
+ let clone = deserialize(s);
+ } catch (e) {
+ assertEq(e.message.includes("cannot transfer twice"), true);
+ }
+
s = null;
gc();
printTrace(arguments.callee.name, g, BASE, obj.log, "deserialize");
@@ -170,6 +179,7 @@ function testMultiWithDeserializeReadTransferErrorHelper(g, BASE, desc) {
// which comes before the main reading. obj transfer data is now owned by its
// clone. obj3 transfer data was not successfully handed over to a new object,
// so it is still owned by the clone buffer and must be discarded with freeTransfer.
+ // 'F' means the data is freed.
BASE + 3, "F",
], "deserialize " + desc);
obj.log = null;
=====================================
js/src/jit/IonAnalysis.cpp
=====================================
@@ -29,8 +29,9 @@ using MPhiUseIteratorStack =
// Look for Phi uses with a depth-first search. If any uses are found the stack
// of MPhi instructions is returned in the |worklist| argument.
-static bool DepthFirstSearchUse(MIRGenerator* mir,
- MPhiUseIteratorStack& worklist, MPhi* phi) {
+[[nodiscard]] static bool DepthFirstSearchUse(MIRGenerator* mir,
+ MPhiUseIteratorStack& worklist,
+ MPhi* phi) {
// Push a Phi and the next use to iterate over in the worklist.
auto push = [&worklist](MPhi* phi, MUseIterator use) -> bool {
phi->setInWorklist();
@@ -131,9 +132,9 @@ static bool DepthFirstSearchUse(MIRGenerator* mir,
return true;
}
-static bool FlagPhiInputsAsImplicitlyUsed(MIRGenerator* mir, MBasicBlock* block,
- MBasicBlock* succ,
- MPhiUseIteratorStack& worklist) {
+[[nodiscard]] static bool FlagPhiInputsAsImplicitlyUsed(
+ MIRGenerator* mir, MBasicBlock* block, MBasicBlock* succ,
+ MPhiUseIteratorStack& worklist) {
// When removing an edge between 2 blocks, we might remove the ability of
// later phases to figure out that the uses of a Phi should be considered as
// a use of all its inputs. Thus we need to mark the Phi inputs as being
@@ -265,7 +266,7 @@ static MInstructionIterator FindFirstInstructionAfterBail(MBasicBlock* block) {
// Given an iterator pointing to the first removed instruction, mark
// the operands of each removed instruction as having implicit uses.
-static bool FlagOperandsAsImplicitlyUsedAfter(
+[[nodiscard]] static bool FlagOperandsAsImplicitlyUsedAfter(
MIRGenerator* mir, MBasicBlock* block, MInstructionIterator firstRemoved) {
MOZ_ASSERT(firstRemoved->block() == block);
@@ -312,8 +313,8 @@ static bool FlagOperandsAsImplicitlyUsedAfter(
return true;
}
-static bool FlagEntryResumePointOperands(MIRGenerator* mir,
- MBasicBlock* block) {
+[[nodiscard]] static bool FlagEntryResumePointOperands(MIRGenerator* mir,
+ MBasicBlock* block) {
// Flag observable operands of the entry resume point as having implicit uses.
MResumePoint* rp = block->entryResumePoint();
while (rp) {
@@ -334,8 +335,8 @@ static bool FlagEntryResumePointOperands(MIRGenerator* mir,
return true;
}
-static bool FlagAllOperandsAsImplicitlyUsed(MIRGenerator* mir,
- MBasicBlock* block) {
+[[nodiscard]] static bool FlagAllOperandsAsImplicitlyUsed(MIRGenerator* mir,
+ MBasicBlock* block) {
return FlagEntryResumePointOperands(mir, block) &&
FlagOperandsAsImplicitlyUsedAfter(mir, block, block->begin());
}
@@ -420,12 +421,16 @@ bool jit::PruneUnusedBranches(MIRGenerator* mir, MIRGraph& graph) {
if (!block->isMarked()) {
// If we are removing the block entirely, mark the operands of every
// instruction as being implicitly used.
- FlagAllOperandsAsImplicitlyUsed(mir, block);
+ if (!FlagAllOperandsAsImplicitlyUsed(mir, block)) {
+ return false;
+ }
} else if (block->alwaysBails()) {
// If we are only trimming instructions after a bail, only mark operands
// of removed instructions.
MInstructionIterator firstRemoved = FindFirstInstructionAfterBail(block);
- FlagOperandsAsImplicitlyUsedAfter(mir, block, firstRemoved);
+ if (!FlagOperandsAsImplicitlyUsedAfter(mir, block, firstRemoved)) {
+ return false;
+ }
}
}
@@ -503,7 +508,8 @@ bool jit::PruneUnusedBranches(MIRGenerator* mir, MIRGraph& graph) {
return true;
}
-static bool SplitCriticalEdgesForBlock(MIRGraph& graph, MBasicBlock* block) {
+[[nodiscard]] static bool SplitCriticalEdgesForBlock(MIRGraph& graph,
+ MBasicBlock* block) {
if (block->numSuccessors() < 2) {
return true;
}
@@ -767,8 +773,8 @@ static bool IsDiamondPattern(MBasicBlock* initialBlock) {
return true;
}
-static bool MaybeFoldDiamondConditionBlock(MIRGraph& graph,
- MBasicBlock* initialBlock) {
+[[nodiscard]] static bool MaybeFoldDiamondConditionBlock(
+ MIRGraph& graph, MBasicBlock* initialBlock) {
MOZ_ASSERT(IsDiamondPattern(initialBlock));
// Optimize the MIR graph to improve the code generated for conditional
@@ -936,8 +942,8 @@ static bool IsTrianglePattern(MBasicBlock* initialBlock) {
return false;
}
-static bool MaybeFoldTriangleConditionBlock(MIRGraph& graph,
- MBasicBlock* initialBlock) {
+[[nodiscard]] static bool MaybeFoldTriangleConditionBlock(
+ MIRGraph& graph, MBasicBlock* initialBlock) {
MOZ_ASSERT(IsTrianglePattern(initialBlock));
// Optimize the MIR graph to improve the code generated for boolean
@@ -1089,8 +1095,8 @@ static bool MaybeFoldTriangleConditionBlock(MIRGraph& graph,
return true;
}
-static bool MaybeFoldConditionBlock(MIRGraph& graph,
- MBasicBlock* initialBlock) {
+[[nodiscard]] static bool MaybeFoldConditionBlock(MIRGraph& graph,
+ MBasicBlock* initialBlock) {
if (IsDiamondPattern(initialBlock)) {
return MaybeFoldDiamondConditionBlock(graph, initialBlock);
}
@@ -1100,7 +1106,8 @@ static bool MaybeFoldConditionBlock(MIRGraph& graph,
return true;
}
-static bool MaybeFoldTestBlock(MIRGraph& graph, MBasicBlock* initialBlock) {
+[[nodiscard]] static bool MaybeFoldTestBlock(MIRGraph& graph,
+ MBasicBlock* initialBlock) {
// Handle test expressions on more than two inputs. For example
// |if ((x > 10) && (y > 20) && (z > 30)) { ... }|, which results in the below
// pattern.
@@ -2752,7 +2759,9 @@ bool jit::RemoveUnmarkedBlocks(MIRGenerator* mir, MIRGraph& graph,
continue;
}
- FlagAllOperandsAsImplicitlyUsed(mir, block);
+ if (!FlagAllOperandsAsImplicitlyUsed(mir, block)) {
+ return false;
+ }
}
// Find unmarked blocks and remove them.
@@ -4003,8 +4012,8 @@ bool jit::EliminateRedundantShapeGuards(MIRGraph& graph) {
return true;
}
-static bool TryEliminateGCBarriersForAllocation(TempAllocator& alloc,
- MInstruction* allocation) {
+[[nodiscard]] static bool TryEliminateGCBarriersForAllocation(
+ TempAllocator& alloc, MInstruction* allocation) {
MOZ_ASSERT(allocation->type() == MIRType::Object);
JitSpew(JitSpew_RedundantGCBarriers, "Analyzing allocation %s",
=====================================
js/src/vm/StructuredClone.cpp
=====================================
@@ -172,17 +172,25 @@ enum StructuredDataType : uint32_t {
/*
* Format of transfer map:
- * <SCTAG_TRANSFER_MAP_HEADER, TransferableMapHeader(UNREAD|TRANSFERRED)>
- * numTransferables (64 bits)
- * array of:
- * <SCTAG_TRANSFER_MAP_*, TransferableOwnership>
- * pointer (64 bits)
- * extraData (64 bits), eg byte length for ArrayBuffers
+ * - <SCTAG_TRANSFER_MAP_HEADER, UNREAD|TRANSFERRING|TRANSFERRED>
+ * - numTransferables (64 bits)
+ * - array of:
+ * - <SCTAG_TRANSFER_MAP_*, TransferableOwnership> pointer (64
+ * bits)
+ * - extraData (64 bits), eg byte length for ArrayBuffers
+ * - any data written for custom transferables
*/
// Data associated with an SCTAG_TRANSFER_MAP_HEADER that tells whether the
-// contents have been read out yet or not.
-enum TransferableMapHeader { SCTAG_TM_UNREAD = 0, SCTAG_TM_TRANSFERRED };
+// contents have been read out yet or not. TRANSFERRING is for the case where we
+// have started but not completed reading, which due to errors could mean that
+// there are things still owned by the clone buffer that need to be released, so
+// discarding should not just be skipped.
+enum TransferableMapHeader {
+ SCTAG_TM_UNREAD = 0,
+ SCTAG_TM_TRANSFERRING,
+ SCTAG_TM_TRANSFERRED
+};
static inline uint64_t PairToUInt64(uint32_t tag, uint32_t data) {
return uint64_t(data) | (uint64_t(tag) << 32);
@@ -693,6 +701,10 @@ static void ReportDataCloneError(JSContext* cx,
errorNumber = JSMSG_SC_SHMEM_TRANSFERABLE;
break;
+ case JS_SCERR_TRANSFERABLE_TWICE:
+ errorNumber = JSMSG_SC_TRANSFERABLE_TWICE;
+ break;
+
case JS_SCERR_TYPED_ARRAY_DETACHED:
errorNumber = JSMSG_TYPED_ARRAY_DETACHED;
break;
@@ -3209,11 +3221,21 @@ bool JSStructuredCloneReader::readTransferMap() {
return in.reportTruncated();
}
+ auto transferState = static_cast<TransferableMapHeader>(data);
+
if (tag != SCTAG_TRANSFER_MAP_HEADER ||
- TransferableMapHeader(data) == SCTAG_TM_TRANSFERRED) {
+ transferState == SCTAG_TM_TRANSFERRED) {
return true;
}
+ if (transferState == SCTAG_TM_TRANSFERRING) {
+ ReportDataCloneError(cx, callbacks, JS_SCERR_TRANSFERABLE_TWICE, closure);
+ return false;
+ }
+
+ headerPos.write(
+ PairToUInt64(SCTAG_TRANSFER_MAP_HEADER, SCTAG_TM_TRANSFERRING));
+
uint64_t numTransferables;
MOZ_ALWAYS_TRUE(in.readPair(&tag, &data));
if (!in.read(&numTransferables)) {
@@ -3329,7 +3351,7 @@ bool JSStructuredCloneReader::readTransferMap() {
#ifdef DEBUG
SCInput::getPair(headerPos.peek(), &tag, &data);
MOZ_ASSERT(tag == SCTAG_TRANSFER_MAP_HEADER);
- MOZ_ASSERT(TransferableMapHeader(data) != SCTAG_TM_TRANSFERRED);
+ MOZ_ASSERT(TransferableMapHeader(data) == SCTAG_TM_TRANSFERRING);
#endif
headerPos.write(
PairToUInt64(SCTAG_TRANSFER_MAP_HEADER, SCTAG_TM_TRANSFERRED));
=====================================
layout/style/ServoStyleSet.cpp
=====================================
@@ -954,7 +954,7 @@ static OriginFlags ToOriginFlags(StyleOrigin aOrigin) {
}
}
-void ServoStyleSet::ImportRuleLoaded(dom::CSSImportRule&, StyleSheet& aSheet) {
+void ServoStyleSet::ImportRuleLoaded(StyleSheet& aSheet) {
if (mStyleRuleMap) {
mStyleRuleMap->SheetAdded(aSheet);
}
=====================================
layout/style/ServoStyleSet.h
=====================================
@@ -133,7 +133,7 @@ class ServoStyleSet {
void RuleRemoved(StyleSheet&, css::Rule&);
void RuleChanged(StyleSheet&, css::Rule*, StyleRuleChangeKind);
void SheetCloned(StyleSheet&);
- void ImportRuleLoaded(dom::CSSImportRule&, StyleSheet&);
+ void ImportRuleLoaded(StyleSheet&);
// Runs style invalidation due to document state changes.
void InvalidateStyleForDocumentStateChanges(
=====================================
layout/style/StyleSheet.cpp
=====================================
@@ -836,15 +836,19 @@ StyleSheet::StyleSheetLoaded(StyleSheet* aSheet, bool aWasDeferred,
if (!aSheet->GetParentSheet()) {
return NS_OK; // ignore if sheet has been detached already
}
- MOZ_ASSERT(this == aSheet->GetParentSheet(),
- "We are being notified of a sheet load for a sheet that is not "
- "our child!");
+ MOZ_DIAGNOSTIC_ASSERT(this == aSheet->GetParentSheet(),
+ "We are being notified of a sheet load for a sheet "
+ "that is not our child!");
if (NS_FAILED(aStatus)) {
return NS_OK;
}
-
- MOZ_ASSERT(aSheet->GetOwnerRule());
- NOTIFY(ImportRuleLoaded, (*aSheet->GetOwnerRule(), *aSheet));
+ // The assert below should hold if we stop triggering import loads for invalid
+ // insertRule() calls, see bug 1914106.
+ // MOZ_ASSERT(aSheet->GetOwnerRule());
+ if (!aSheet->GetOwnerRule()) {
+ return NS_OK;
+ }
+ NOTIFY(ImportRuleLoaded, (*aSheet));
return NS_OK;
}
=====================================
netwerk/ipc/DocumentLoadListener.cpp
=====================================
@@ -2316,15 +2316,9 @@ bool DocumentLoadListener::DocShellWillDisplayContent(nsresult aStatus) {
auto* loadingContext = GetLoadingBrowsingContext();
- bool isInitialDocument = true;
- if (WindowGlobalParent* currentWindow =
- loadingContext->GetCurrentWindowGlobal()) {
- isInitialDocument = currentWindow->IsInitialDocument();
- }
-
nsresult rv = nsDocShell::FilterStatusForErrorPage(
aStatus, mChannel, mLoadStateLoadType, loadingContext->IsTop(),
- loadingContext->GetUseErrorPages(), isInitialDocument, nullptr);
+ loadingContext->GetUseErrorPages(), nullptr);
if (NS_SUCCEEDED(rv)) {
MOZ_LOG(gProcessIsolationLog, LogLevel::Verbose,
=====================================
netwerk/protocol/webtransport/WebTransportSessionProxy.cpp
=====================================
@@ -1042,15 +1042,6 @@ void WebTransportSessionProxy::NotifyDatagramReceived(
MutexAutoLock lock(mMutex);
MOZ_ASSERT(mTarget->IsOnCurrentThread());
- if (!mStopRequestCalled) {
- CopyableTArray<uint8_t> copied(aData);
- mPendingEvents.AppendElement(
- [self = RefPtr{this}, data = std::move(copied)]() mutable {
- self->NotifyDatagramReceived(std::move(data));
- });
- return;
- }
-
if (mState != WebTransportSessionProxyState::ACTIVE || !mListener) {
return;
}
@@ -1066,6 +1057,15 @@ NS_IMETHODIMP WebTransportSessionProxy::OnDatagramReceivedInternal(
{
MutexAutoLock lock(mMutex);
+ if (!mStopRequestCalled) {
+ CopyableTArray<uint8_t> copied(aData);
+ mPendingEvents.AppendElement(
+ [self = RefPtr{this}, data = std::move(copied)]() mutable {
+ self->OnDatagramReceivedInternal(std::move(data));
+ });
+ return NS_OK;
+ }
+
if (!mTarget->IsOnCurrentThread()) {
return mTarget->Dispatch(NS_NewRunnableFunction(
"WebTransportSessionProxy::OnDatagramReceived",
=====================================
testing/web-platform/tests/css/cssom/insertRule-import-trailing-garbage-crash.html
=====================================
@@ -0,0 +1,6 @@
+<!doctype html>
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1914106">
+<style></style>
+<script>
+document.querySelector("style").sheet.insertRule("@import url('data:text/css,:root{background:red}');html,body{/* random garbage */}");
+</script>
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/ec92fd…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/ec92fd…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-128.3.0esr-14.0-1] Bug_43099: 2024 YEC
by ma1 (@ma1) 30 Sep '24
by ma1 (@ma1) 30 Sep '24
30 Sep '24
ma1 pushed to branch tor-browser-128.3.0esr-14.0-1 at The Tor Project / Applications / Tor Browser
Commits:
217346c0 by clairehurst at 2024-09-30T22:03:33+00:00
Bug_43099: 2024 YEC
- - - - -
12 changed files:
- mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
- mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/HomeScreenViewModel.kt
- mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt
- + mobile/android/fenix/app/src/main/res/drawable/heart.xml
- + mobile/android/fenix/app/src/main/res/drawable/illo_green_browse.xml
- + mobile/android/fenix/app/src/main/res/drawable/illo_purple_speak.xml
- + mobile/android/fenix/app/src/main/res/drawable/illo_red_search.xml
- + mobile/android/fenix/app/src/main/res/font/spacegrotesk_bold.ttf
- mobile/android/fenix/app/src/main/res/layout/fragment_home.xml
- mobile/android/fenix/app/src/main/res/values/colors.xml
- mobile/android/fenix/app/src/main/res/values/preference_keys.xml
- mobile/android/fenix/app/src/main/res/values/torbrowser_strings.xml
Changes:
=====================================
mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
=====================================
@@ -16,23 +16,58 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.result.ActivityResultLauncher
+import androidx.annotation.ColorRes
+import androidx.annotation.DrawableRes
+import androidx.annotation.StringRes
import androidx.annotation.VisibleForTesting
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.wrapContentHeight
+import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.material.Button
import androidx.compose.material.ButtonDefaults
+import androidx.compose.material.Icon
+import androidx.compose.material.IconButton
import androidx.compose.material.Text
import androidx.compose.material.TextButton
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.drawBehind
+import androidx.compose.ui.draw.scale
+import androidx.compose.ui.geometry.CornerRadius
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.ViewCompositionStrategy
+import androidx.compose.ui.res.painterResource
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.semantics.testTag
import androidx.compose.ui.semantics.testTagsAsResourceId
+import androidx.compose.ui.text.TextLayoutResult
+import androidx.compose.ui.text.font.Font
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.content.ContextCompat
@@ -87,6 +122,7 @@ import mozilla.components.lib.state.ext.consumeFrom
import mozilla.components.service.glean.private.NoExtras
import mozilla.components.support.base.feature.UserInteractionHandler
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
+import mozilla.components.support.locale.LocaleManager
import mozilla.components.support.utils.ext.isLandscape
import mozilla.components.ui.colors.PhotonColors
import org.mozilla.fenix.BrowserDirection
@@ -155,6 +191,8 @@ import org.mozilla.fenix.nimbus.FxNimbus
import org.mozilla.fenix.perf.MarkersFragmentLifecycleCallbacks
import org.mozilla.fenix.search.toolbar.DefaultSearchSelectorController
import org.mozilla.fenix.search.toolbar.SearchSelectorMenu
+import org.mozilla.fenix.settings.SupportUtils
+import org.mozilla.fenix.settings.advanced.getSelectedLocale
import org.mozilla.fenix.tabstray.Page
import org.mozilla.fenix.tabstray.TabsTrayAccessPoint
import org.mozilla.fenix.theme.FirefoxTheme
@@ -513,6 +551,8 @@ class HomeFragment : Fragment(), UserInteractionHandler {
activity.themeManager.applyStatusBarTheme(activity)
+ setDonationScreen()
+
// FxNimbus.features.homescreen.recordExposure()
// DO NOT MOVE ANYTHING BELOW THIS addMarker CALL!
@@ -524,6 +564,19 @@ class HomeFragment : Fragment(), UserInteractionHandler {
return binding.root
}
+ private fun setDonationScreen() {
+ if (homeViewModel.shouldShowDonationScreen()) {
+ binding.exploreprivately.visibility = View.GONE
+ binding.onionPatternImage.visibility = View.GONE
+ binding.composeYec2024.apply {
+ setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
+ setContent {
+ DonationScreen()
+ }
+ }
+ }
+ }
+
private fun reinitializeNavBar() {
initializeNavBar(activity = requireActivity() as HomeActivity)
}
@@ -1402,4 +1455,311 @@ class HomeFragment : Fragment(), UserInteractionHandler {
requireActivity().finish()
return true
}
+
+ @Composable
+ fun DonationScreen() {
+ BoxWithConstraints(
+ contentAlignment = Alignment.Center,
+ modifier = Modifier
+ .fillMaxWidth()
+ .wrapContentHeight()
+ ) {
+ val alternateLayout = this.maxWidth >= 500.dp
+
+ YecLayout(
+ alternateLayout,
+ maxWidth = this.maxWidth,
+ getYecStyle(),
+ modifier = Modifier
+ .padding(top = 55.dp, bottom = 56.dp),
+ )
+ }
+ }
+
+ @Composable
+ private fun YecLayout(
+ alternateLayout: Boolean,
+ maxWidth: Dp,
+ yecStyle: YecStyle,
+ modifier: Modifier
+ ) {
+ Column(
+ modifier = modifier
+ .padding(horizontal = 22.dp)
+ .verticalScroll(rememberScrollState())
+ .fillMaxWidth(getVariableWidth(maxWidth)),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ ) {
+ PurpleYecBox(alternateLayout, yecStyle, horizontalPadding = 16.dp)
+ AlwaysFreeText()
+ }
+ }
+
+ private fun getVariableWidth(width: Dp): Float = (500.dp / width).coerceIn(0.75f, 1.0f)
+
+ @Composable
+ private fun PurpleYecBox(
+ alternateLayout: Boolean,
+ yecStyle: YecStyle,
+ horizontalPadding: Dp,
+ ) {
+ Box(
+ modifier = Modifier.background(PhotonColors.Ink90, shape = RoundedCornerShape(8.dp)),
+ ) {
+ ExitIcon()
+ DynamicYecContent(alternateLayout, yecStyle, horizontalPadding)
+ }
+ }
+
+ @Composable
+ private fun AlwaysFreeText() {
+ Text(
+ text = getString(
+ R.string.YEC_2024_tor_browser_for_android_will_always_be_free_no_donation_required,
+ getString(R.string.app_name),
+ ),
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(vertical = 8.dp),
+ color = Color(0xFFFBFBFE),
+ fontSize = 12.5.sp,
+ textAlign = TextAlign.Center,
+ lineHeight = 18.75.sp,
+ )
+ }
+
+ @Composable
+ private fun ExitIcon() {
+ Row(
+ modifier = Modifier.fillMaxWidth(),
+ horizontalArrangement = Arrangement.End,
+ ) {
+ IconButton(
+ onClick = {
+ binding.exploreprivately.visibility = View.VISIBLE
+ binding.onionPatternImage.visibility = View.VISIBLE
+ binding.composeYec2024.visibility = View.GONE
+ homeViewModel.yecDismissed = true
+ },
+ ) {
+ Icon(
+ painter = painterResource(id = R.drawable.ic_close),
+ tint = Color(
+ getColor(
+ requireContext(),
+ R.color.photonWhite,
+ ),
+ ),
+ contentDescription = getString(R.string.YEC_2024_close),
+ modifier = Modifier
+ .size(48.dp)
+ .padding(8.dp)
+ .scale(0.65f),
+ )
+ }
+ }
+ }
+
+ @Composable
+ private fun DynamicYecContent(
+ alternateLayout: Boolean,
+ yecStyle: YecStyle,
+ horizontalPadding: Dp,
+ ) {
+ Row(verticalAlignment = Alignment.CenterVertically) {
+ Column(
+ modifier = Modifier.fillMaxWidth(fraction = if (alternateLayout) .70f else 1f),
+ horizontalAlignment = if (alternateLayout) Alignment.Start else Alignment.CenterHorizontally,
+ ) {
+ if (!alternateLayout) {
+ IlloYecImage(yecStyle, false, horizontalPadding)
+ }
+
+ YecRightsText(yecStyle, alternateLayout, horizontalPadding)
+
+ DonationEncouragementText(alternateLayout, horizontalPadding)
+
+ DonationMatchText(alternateLayout, horizontalPadding)
+
+ DonateNowButton(alternateLayout, horizontalPadding)
+ }
+ if (alternateLayout) {
+ IlloYecImage(yecStyle, true, horizontalPadding)
+ }
+ }
+ }
+
+ @Composable
+ private fun IlloYecImage(yecStyle: YecStyle, alternateLayout: Boolean, horizontalPadding: Dp) {
+ Image(
+ painter = painterResource(id = yecStyle.illo),
+ contentDescription = null,
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(
+ top = if (alternateLayout) 0.dp else 41.dp,
+ bottom = if (alternateLayout) 0.dp else 25.dp,
+ end = if (alternateLayout) horizontalPadding else 0.dp,
+ ),
+ )
+ }
+
+ @Composable
+ private fun YecRightsText(
+ yecStyle: YecStyle,
+ alternateLayout: Boolean,
+ horizontalPadding: Dp,
+ ) {
+ var textLayoutResult by remember { mutableStateOf<TextLayoutResult?>(null) }
+
+ Text(
+ text = getString(yecStyle.text),
+ color = PhotonColors.Ink90,
+ textAlign = if (alternateLayout) TextAlign.Left else TextAlign.Center,
+ fontFamily = FontFamily(Font(R.font.spacegrotesk_bold, FontWeight.Bold)),
+ fontSize = 18.sp,
+ lineHeight = 30.sp,
+ onTextLayout = { textLayoutResult = it },
+ modifier = Modifier
+ .padding(
+ top = if (alternateLayout) 24.dp else 0.dp,
+ start = horizontalPadding,
+ end = if (alternateLayout) 0.dp else horizontalPadding,
+ bottom = if (alternateLayout) 8.dp else 16.dp,
+ )
+ .drawBehind {
+ textLayoutResult?.let { result ->
+ for (i in 0 until result.lineCount) {
+ val endOfLineSpacing = 4.dp
+
+ val lineTop = result.getLineTop(i)
+ val lineBottom = result.getLineBottom(i)
+ val lineLeft = result.getLineLeft(i) - endOfLineSpacing.toPx()
+ val lineRight = result.getLineRight(i) + endOfLineSpacing.toPx()
+
+ drawRoundRect(
+ color = Color(getColor(requireContext(), yecStyle.color)),
+ topLeft = Offset(
+ lineLeft,
+ lineTop + 2.dp.toPx(),
+ ),
+ size = Size(
+ lineRight - lineLeft,
+ lineBottom - lineTop - 4.dp.toPx(),
+ ),
+ cornerRadius = CornerRadius(2.dp.toPx(), 2.dp.toPx()),
+ )
+ }
+ }
+ },
+ )
+ }
+
+ @Composable
+ private fun DonationEncouragementText(alternateLayout: Boolean, horizontalPadding: Dp) {
+ Text(
+ text = getString(R.string.YEC_2024_donation_encouragement),
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(
+ start = horizontalPadding,
+ end = if (alternateLayout) 0.dp else horizontalPadding,
+ bottom = if (alternateLayout) 8.dp else 16.dp,
+ ),
+ color = Color(0xFFFBFBFE),
+ textAlign = TextAlign.Left,
+ )
+ }
+
+ @Composable
+ private fun DonationMatchText(alternateLayout: Boolean, horizontalPadding: Dp) {
+ Text(
+ text = getString(R.string.YEC_2024_donation_match_text),
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(
+ start = horizontalPadding,
+ end = if (alternateLayout) horizontalPadding else 0.dp,
+ bottom = 16.dp,
+ ),
+ color = Color(0xFFFBFBFE),
+ fontWeight = FontWeight.Bold,
+ textAlign = TextAlign.Left,
+ )
+ }
+
+ @Composable
+ private fun DonateNowButton(alternateLayout: Boolean, horizontalPadding: Dp) {
+ var locale = LocaleManager.getSelectedLocale(requireContext()).language
+ if (locale.isNotEmpty()) {
+ locale += '-'
+ }
+ Button(
+ onClick = {
+ (activity as HomeActivity).openToBrowserAndLoad(
+ searchTermOrURL = "https://www.torproject.org/donate/donate-${locale}mobile-yec2024",
+ newTab = true,
+ from = BrowserDirection.FromHome,
+ )
+ },
+ modifier = Modifier
+ .padding(bottom = if (alternateLayout) 24.dp else 40.dp)
+ .padding(horizontal = horizontalPadding),
+ colors = ButtonDefaults.buttonColors(
+ backgroundColor = Color(
+ 0xFFFFBD4F,
+ ),
+ ),
+ shape = RoundedCornerShape(4.dp),
+ ) {
+ Text(
+ text = getString(R.string.YEC_2024_donate_now),
+ color = PhotonColors.DarkGrey80,
+ modifier = Modifier.padding(
+ horizontal = if (alternateLayout) 6.dp else 8.dp,
+ vertical = if (alternateLayout) 3.dp else 6.dp,
+ ),
+ fontSize = 16.sp,
+ fontWeight = FontWeight.Bold,
+ letterSpacing = 0.sp,
+ )
+ Icon(
+ painter = painterResource(R.drawable.heart),
+ contentDescription = null,
+ modifier = Modifier.size(20.dp),
+ )
+ }
+ }
+
+ private fun getYecStyle(): YecStyle {
+ if (homeViewModel.firstYecLoad) {
+ homeViewModel.firstYecLoad = false
+ homeViewModel.yecStyleIndex = requireContext().settings().yecStyleIndex
+ requireContext().settings().yecStyleIndex =
+ (requireContext().settings().yecStyleIndex + 1) % 3
+ }
+ return YecStyle.entries[homeViewModel.yecStyleIndex]
+ }
+
+ enum class YecStyle(
+ @DrawableRes val illo: Int,
+ @StringRes val text: Int,
+ @ColorRes val color: Int,
+ ) {
+ PurpleSpeak(
+ illo = R.drawable.illo_purple_speak,
+ text = R.string.YEC_2024_right_to_speak,
+ color = R.color.YEC_2024_speak_purple,
+ ),
+ GreenBrowse(
+ illo = R.drawable.illo_green_browse,
+ text = R.string.YEC_2024_right_to_BROWSE,
+ color = R.color.YEC_2024_browse_green,
+ ),
+ RedSearch(
+ illo = R.drawable.illo_red_search,
+ text = R.string.YEC_2024_right_to_SEARCH,
+ color = R.color.YEC_2024_search_red,
+ )
+ }
}
=====================================
mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/HomeScreenViewModel.kt
=====================================
@@ -4,11 +4,35 @@
package org.mozilla.fenix.home
+import android.annotation.SuppressLint
+import androidx.annotation.IntRange
import androidx.lifecycle.ViewModel
+import org.mozilla.fenix.BuildConfig
+import java.text.SimpleDateFormat
+import java.util.Date
class HomeScreenViewModel : ViewModel() {
/**
* Used to delete a specific session once the home screen is resumed
*/
var sessionToDelete: String? = null
+
+ @IntRange(0, 2)
+ var yecStyleIndex: Int = 0
+ var firstYecLoad: Boolean = true
+ var yecDismissed: Boolean = false
+
+ fun shouldShowDonationScreen(): Boolean {
+ @SuppressLint("SimpleDateFormat")
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd")
+ val startDate = dateFormat.parse("2024-10-14") // Change to a date in the past to test
+ val endDate = dateFormat.parse("2025-1-2")
+ val currentDate = Date()
+
+ @Suppress("KotlinConstantConditions")
+ return !yecDismissed
+ && BuildConfig.BUILD_TYPE == "release" // Comment this line out to test
+ && currentDate.after(startDate)
+ && currentDate.before(endDate)
+ }
}
=====================================
mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt
=====================================
@@ -339,6 +339,11 @@ class Settings(private val appContext: Context) : PreferencesHolder {
default = false
)
+ var yecStyleIndex by intPreference(
+ appContext.getPreferenceKey(R.string.pref_key_yec_style_index),
+ default = 0
+ )
+
var defaultSearchEngineName by stringPreference(
appContext.getPreferenceKey(R.string.pref_key_search_engine),
default = "",
=====================================
mobile/android/fenix/app/src/main/res/drawable/heart.xml
=====================================
@@ -0,0 +1,7 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="16dp" android:viewportHeight="17" android:viewportWidth="17" android:width="16dp">
+
+ <path android:fillColor="#1C1B22" android:pathData="M8.5,6.5C8.5,6.5 8.5,2.5 12,2.5C15.5,2.5 15.5,5.5 15.5,6.5C15.5,11 8.5,15.5 8.5,15.5V6.5Z"/>
+
+ <path android:fillColor="#1C1B22" android:pathData="M8.5,6.5C8.5,6.5 8.5,2.5 5,2.5C1.5,2.5 1.5,5.5 1.5,6.5C1.5,11 8.5,15.5 8.5,15.5L9.5,9.5L8.5,6.5Z"/>
+
+</vector>
=====================================
mobile/android/fenix/app/src/main/res/drawable/illo_green_browse.xml
=====================================
@@ -0,0 +1,59 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="144dp" android:viewportHeight="144" android:viewportWidth="198" android:width="198dp">
+
+ <group>
+
+ <clip-path android:pathData="M8.49,0L189.97,0A8,8 0,0 1,197.97 8L197.97,136A8,8 0,0 1,189.97 144L8.49,144A8,8 0,0 1,0.49 136L0.49,8A8,8 0,0 1,8.49 0z"/>
+
+ <path android:fillColor="#1D1133" android:pathData="M8.49,0L189.97,0A8,8 0,0 1,197.97 8L197.97,136A8,8 0,0 1,189.97 144L8.49,144A8,8 0,0 1,0.49 136L0.49,8A8,8 0,0 1,8.49 0z"/>
+
+ <path android:fillAlpha="0.7" android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M41.55,66.09C42.32,66.09 42.94,66.71 42.94,67.47V74.16H90.02C90.79,74.16 91.41,74.78 91.41,75.55V82.24H91.41V90.32H99.27V82.46H99.26V75.55C99.26,74.78 99.88,74.16 100.65,74.16H138.49C138.98,74.16 139.41,74.42 139.66,74.8V74.16H178.88C179.65,74.16 180.27,74.78 180.27,75.55V81.08C180.27,81.57 180.02,82 179.63,82.24H180.27V90.54H179.63C180.02,90.79 180.27,91.22 180.27,91.7V106.49H195.05C195.81,106.49 196.43,107.1 196.43,107.87V113.4C196.43,114.16 195.81,114.78 195.05,114.78H180.27V121.46C180.27,122.22 179.65,122.84 178.89,122.84H164.11V129.54C164.11,130.3 163.49,130.92 162.73,130.92H157.2C156.43,130.92 155.81,130.3 155.81,129.54V122.84H139.88V129.54C139.88,130.3 139.26,130.92 138.49,130.92H132.96C132.2,130.92 131.58,130.3 131.58,129.54V122.84L19.87,122.84C19.1,122.84 18.48,122.22 18.48,121.46V114.54H34.64V106.7H11.79C11.02,106.7 10.4,106.08 10.4,105.31V98.62H3.71C2.94,98.62 2.32,98 2.32,97.24V91.7C2.32,90.94 2.94,90.32 3.71,90.32H10.4V83.63C10.4,82.86 11.02,82.24 11.79,82.24H18.48V75.55C18.48,74.78 19.1,74.16 19.86,74.16H34.64V67.47C34.64,66.71 35.26,66.09 36.02,66.09H41.55ZM36.02,66.31H41.55C42.19,66.31 42.72,66.83 42.72,67.47V74.16H34.86V67.47C34.86,66.83 35.38,66.31 36.02,66.31ZM171.97,122.62V114.78H164.11L164.11,122.62H171.97ZM171.98,114.54V106.71H164.12V114.54H171.98ZM180.05,114.54H172.2V106.71H180.05V114.54ZM172.19,122.62H178.89C179.53,122.62 180.05,122.1 180.05,121.46V114.78H172.19L172.19,122.62ZM163.9,106.71V114.54H156.04V106.71H163.9ZM163.89,114.78V122.62H156.04V114.78H163.89ZM155.82,114.78V122.62H147.96L147.96,114.78H155.82ZM155.82,114.54V106.71H147.96V114.54H155.82ZM139.66,122.62V114.78H131.8L131.8,122.62H139.66ZM139.66,114.54L139.66,114.54V106.71H131.8V114.54L139.66,114.54ZM147.74,114.54H139.88V106.71H147.74V114.54ZM139.88,122.62H147.74V114.78H139.88L139.88,122.62ZM131.58,106.71V114.54H123.72V106.71H131.58ZM131.58,114.78V122.62H123.72L123.72,114.78H131.58ZM123.5,122.62V114.78H115.64L115.64,122.62H123.5ZM123.5,114.54L123.5,114.54V106.71H115.65V114.54L123.5,114.54ZM115.42,114.78V122.62H107.57V114.78L115.42,114.78ZM107.35,114.54L107.35,114.54V106.71H99.49V114.54L107.35,114.54ZM115.43,114.54H107.57V106.71H115.43V114.54ZM107.35,122.62H99.49L99.49,114.78L107.35,114.78V122.62ZM91.41,114.78H99.27V122.62H91.41L91.41,114.78ZM91.19,122.62V114.78H83.33L83.33,122.62H91.19ZM91.19,114.54V106.71H83.33V114.54H91.19ZM99.27,114.54H91.41V106.71H99.27V114.54ZM83.11,106.71V114.54H75.25V106.71H83.11ZM83.11,114.78V122.62H75.25V114.78H83.11ZM75.03,114.54L75.03,114.54V106.71H67.18V114.54L75.03,114.54ZM67.17,114.78V122.62H75.03V114.78H67.17ZM66.96,106.71V114.54H59.1V106.71H66.96ZM66.95,114.78V122.62H59.09V114.78H66.95ZM58.88,114.54V106.71H51.02V114.54H58.88ZM51.02,114.78V122.62H58.87V114.78H51.02ZM50.8,106.71V114.54H42.94V106.71H50.8ZM50.8,114.78V122.62H42.94V114.78L50.8,114.78ZM42.72,114.54V106.71H34.86V114.54H42.72ZM42.72,122.62H34.86L34.86,114.78H42.72V122.62ZM34.64,114.76V122.62H26.78V114.76H34.64ZM188.13,106.71H180.27V114.56H188.13V106.71ZM188.35,114.56H195.05C195.69,114.56 196.21,114.04 196.21,113.4V107.87C196.21,107.23 195.69,106.71 195.05,106.71H188.35V114.56ZM18.7,106.48L18.7,98.62H26.56L26.56,106.48H18.7ZM18.48,98.62H10.62V105.31C10.62,105.96 11.14,106.48 11.79,106.48H18.48L18.48,98.62ZM34.64,106.48H26.78L26.78,98.62H34.64V106.48ZM34.86,106.48H42.72L42.72,98.62L34.86,98.62V106.48ZM50.79,106.48H42.94V98.62H50.79V106.48ZM66.95,106.48H59.09V98.62L66.95,98.62L66.95,106.48ZM58.87,106.48H51.01V98.62L58.87,98.62L58.87,106.48ZM67.17,106.48H75.03L75.03,98.62L67.17,98.62V106.48ZM83.11,106.48H75.25V98.62L83.11,98.62L83.11,106.48ZM83.33,106.48H91.19L91.19,98.62L83.33,98.62V106.48ZM99.26,106.48H91.41V98.62H99.26V106.48ZM115.42,106.48H107.56V98.62L115.42,98.62L115.42,106.48ZM107.34,106.48H99.48V98.62L107.34,98.62L107.34,106.48ZM115.64,106.48H123.5L123.5,98.62L115.64,98.62V106.48ZM131.58,106.48H123.72V98.62L131.58,98.62L131.58,106.48ZM131.8,106.48H139.66V98.62H131.8V106.48ZM147.96,106.48H155.81L155.81,98.62L147.96,98.62V106.48ZM147.73,98.62L139.88,98.62V106.48H147.73L147.73,98.62ZM163.89,106.48H156.03V98.62L163.89,98.62L163.89,106.48ZM164.11,106.48H171.97L171.97,98.62L164.11,98.62V106.48ZM180.05,106.48H172.19V98.62H180.05V106.48ZM18.48,98.4H10.62V90.54H18.48V98.4ZM10.4,98.4V90.54H3.71C3.06,90.54 2.54,91.06 2.54,91.7V97.24C2.54,97.88 3.06,98.4 3.71,98.4H10.4ZM10.62,90.32V83.63C10.62,82.98 11.14,82.46 11.79,82.46H18.48V90.32H10.62ZM18.7,98.4V90.54H26.56V98.4H18.7ZM34.64,98.4H26.78V90.54H34.64L34.64,98.4ZM26.56,82.46V90.32H18.7V82.46H26.56ZM26.78,90.32V82.46H34.64V90.32H26.78ZM34.86,90.54V98.4H42.72L42.72,90.54H34.86ZM50.79,98.4H42.94V90.54H50.79V98.4ZM42.72,82.46V90.32H34.86V82.46H42.72ZM42.94,90.32V82.46L50.79,82.46L50.79,90.32H42.94ZM66.95,98.4H59.09V90.54H66.95L66.95,98.4ZM58.87,82.46L58.87,90.32H51.01V82.46L58.87,82.46ZM51.01,90.54V98.4H58.87L58.87,90.54H51.01ZM59.09,90.32V82.46H66.95V90.32H59.09ZM67.17,98.4H75.03L75.03,90.54H67.17V98.4ZM83.11,98.4H75.25V90.54L75.25,90.54H83.11L83.11,98.4ZM75.03,82.46V90.32L75.03,90.32H67.17V82.46L75.03,82.46ZM75.25,90.32L83.11,90.32L83.11,90.32L83.11,82.46L75.25,82.46V90.32ZM83.33,98.4H91.19L91.19,90.54H83.33L83.33,90.54V98.4ZM99.26,98.4H91.41V90.54L91.41,90.54L99.26,90.54V98.4ZM91.19,82.46V90.32L91.19,90.32L83.33,90.32V82.46H91.19ZM50.79,74.38H42.94V82.24H50.79V74.38ZM51.01,82.24H58.87V74.38H51.01V82.24ZM172.19,74.38H178.88C179.53,74.38 180.05,74.91 180.05,75.55V81.08C180.05,81.72 179.53,82.24 178.88,82.24H172.19V74.38ZM115.42,98.4H107.56V90.54L107.56,90.54H115.42L115.42,98.4ZM107.34,82.46L107.34,90.32L107.34,90.32L99.49,90.32V82.46L107.34,82.46ZM107.34,90.54L99.48,90.54V98.4H107.34L107.34,90.54ZM107.56,90.32L115.42,90.32L115.42,90.32L115.42,82.46L107.56,82.46V90.32ZM115.64,98.4H123.5L123.5,90.54H115.64L115.64,90.54V98.4ZM131.58,98.4H123.72V90.54L123.72,90.54H131.58L131.58,98.4ZM123.5,82.46V90.32L123.5,90.32L115.64,90.32V82.46H123.5ZM123.72,90.32L131.58,90.32L131.58,90.32V82.46L123.72,82.46V90.32ZM131.8,98.4H139.66L139.66,90.54H131.8L131.8,90.54V98.4ZM139.66,82.46V90.32L139.66,90.32L131.8,90.32V82.46H139.66ZM139.88,90.32L147.73,90.32L147.74,90.32L147.74,82.46L139.88,82.46V90.32ZM147.96,98.4H155.81L155.81,90.54H147.96L147.96,90.54V98.4ZM139.88,98.4H147.73L147.73,90.54H139.88L139.88,90.54V98.4ZM163.89,98.4H156.03V90.54L156.03,90.54H163.89L163.89,98.4ZM155.81,82.46L155.81,90.32L155.81,90.32L147.96,90.32V82.46L155.81,82.46ZM156.03,90.32L163.89,90.32L163.89,90.32L163.89,82.46L156.03,82.46V90.32ZM164.11,90.54L164.11,90.54V98.4H171.97L171.97,90.54H164.11ZM180.05,98.4H172.19V90.54L172.19,90.54H178.89C179.53,90.55 180.05,91.07 180.05,91.7V98.4ZM171.97,82.46L171.97,90.32L171.97,90.32L164.11,90.32V82.46L171.97,82.46ZM178.9,90.32L178.88,90.32L172.19,90.32V82.46H180.05V90.32H178.9ZM163.89,82.24L156.03,82.24L156.03,82.24V74.38H163.89V82.24ZM115.42,74.38H107.56V82.24H115.42V74.38ZM107.34,74.38H100.65C100,74.38 99.48,74.91 99.48,75.55V82.24H107.34V74.38ZM123.5,82.24H115.64V74.38H123.5V82.24ZM139.66,82.24H131.8V74.38H138.49C139.13,74.38 139.65,74.9 139.66,75.54L139.66,75.55V82.24ZM123.72,74.38H131.58V82.24H123.72V74.38ZM147.73,74.38H139.88V75.54L139.88,75.55L139.88,82.24H147.73V74.38ZM155.81,82.24H147.96V74.38H155.81V82.24ZM171.97,82.24H164.11V74.38H171.97V82.24ZM83.33,74.38H90.02C90.66,74.38 91.19,74.91 91.19,75.55V82.24H83.33V74.38ZM66.95,82.24H59.09V74.38H66.95V82.24ZM83.11,82.24H75.25V74.38H83.11V82.24ZM67.17,74.38H75.03V82.24H67.17V74.38ZM34.86,74.38H42.72V82.24H34.86V74.38ZM34.64,74.38H26.78V82.24H34.64V74.38ZM19.86,74.38H26.56V82.24H18.7V75.55C18.7,74.91 19.22,74.38 19.86,74.38ZM26.56,122.62H19.87C19.22,122.62 18.7,122.1 18.7,121.46L18.7,114.76H26.56V122.62ZM131.8,122.84V129.54C131.8,130.18 132.32,130.7 132.96,130.7H138.49C139.13,130.7 139.66,130.18 139.66,129.54V122.84H131.8ZM156.03,129.54V122.84H163.89V129.54C163.89,130.18 163.37,130.7 162.73,130.7H157.2C156.55,130.7 156.03,130.18 156.03,129.54Z" android:strokeAlpha="0.7"/>
+
+ <path android:fillColor="#ffffff" android:pathData="M28.14,100.94a6.85,23.41 89.68,1 0,46.82 -0.26a6.85,23.41 89.68,1 0,-46.82 0.26z"/>
+
+ <path android:fillColor="#ffffff" android:pathData="M121.77,100.94a6.85,23.41 89.68,1 0,46.82 -0.26a6.85,23.41 89.68,1 0,-46.82 0.26z"/>
+
+ <path android:fillColor="#C1ED75" android:fillType="evenOdd" android:pathData="M144.92,14.5C144.92,15.23 144.33,15.82 143.6,15.82C142.87,15.82 142.27,15.23 142.27,14.5C142.27,13.76 142.87,13.17 143.6,13.17C144.33,13.17 144.92,13.76 144.92,14.5ZM144.4,14.5C144.4,14.94 144.04,15.3 143.6,15.3C143.15,15.3 142.79,14.94 142.79,14.5C142.79,14.05 143.15,13.69 143.6,13.69C144.04,13.69 144.4,14.05 144.4,14.5Z"/>
+
+ <path android:fillColor="#C1ED75" android:fillType="evenOdd" android:pathData="M143.6,16.82C144.88,16.82 145.92,15.78 145.92,14.5C145.92,13.21 144.88,12.17 143.6,12.17C142.32,12.17 141.28,13.21 141.28,14.5C141.28,15.78 142.32,16.82 143.6,16.82ZM143.6,16.3C144.59,16.3 145.4,15.49 145.4,14.5C145.4,13.5 144.59,12.69 143.6,12.69C142.6,12.69 141.8,13.5 141.8,14.5C141.8,15.49 142.6,16.3 143.6,16.3Z"/>
+
+ <path android:fillColor="#C1ED75" android:fillType="evenOdd" android:pathData="M143.6,17.81C145.43,17.81 146.91,16.33 146.91,14.5C146.91,12.66 145.43,11.18 143.6,11.18C141.77,11.18 140.29,12.66 140.29,14.5C140.29,16.33 141.77,17.81 143.6,17.81ZM143.6,17.29C145.14,17.29 146.39,16.04 146.39,14.5C146.39,12.95 145.14,11.7 143.6,11.7C142.05,11.7 140.8,12.95 140.8,14.5C140.8,16.04 142.05,17.29 143.6,17.29Z"/>
+
+ <path android:fillColor="#ffffff" android:pathData="M126.45,45.24C127.77,45.93 129.4,45.66 130.28,44.46C130.93,43.58 131.52,42.71 131.98,42C132.62,41 132.59,39.73 131.9,38.77C128.1,33.47 114.83,16.71 98.94,16.71C83.24,16.71 69.93,33.06 65.88,38.57C65.1,39.63 65.15,41.06 65.96,42.11C66.38,42.66 66.89,43.29 67.43,43.95C68.37,45.1 69.99,45.38 71.31,44.71C79.89,40.36 88.77,37.93 98.77,37.93C108.84,37.93 117.82,40.78 126.45,45.24Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M130.04,44.28C130.69,43.41 131.27,42.54 131.73,41.84C132.3,40.94 132.27,39.81 131.65,38.94C129.76,36.3 125.51,30.81 119.76,25.98C114,21.14 106.78,17 98.94,17C91.19,17 84.01,21.04 78.23,25.8C72.46,30.56 68.14,36 66.13,38.74C65.42,39.7 65.46,40.98 66.19,41.92C66.62,42.47 67.12,43.11 67.66,43.76C68.5,44.8 69.97,45.05 71.17,44.44C79.79,40.07 88.72,37.63 98.77,37.63C108.9,37.63 117.93,40.49 126.59,44.98C127.8,45.6 129.26,45.35 130.04,44.28ZM130.28,44.46C129.4,45.66 127.77,45.93 126.45,45.24C117.82,40.78 108.84,37.93 98.77,37.93C88.77,37.93 79.89,40.36 71.31,44.71C69.99,45.38 68.37,45.1 67.43,43.95C66.89,43.29 66.38,42.66 65.96,42.11C65.15,41.06 65.1,39.63 65.88,38.57C69.93,33.06 83.24,16.71 98.94,16.71C114.83,16.71 128.1,33.47 131.9,38.77C132.59,39.73 132.62,41 131.98,42C131.52,42.71 130.93,43.58 130.28,44.46Z"/>
+
+ <path android:fillColor="#212529" android:pathData="M107.52,34.94C109.36,34.94 110.94,33.86 111.68,32.3C112.69,34.16 113.31,36.26 113.43,38.49C108.65,37.37 103.71,36.79 98.68,36.79C93.74,36.79 88.88,37.35 84.18,38.43C84.63,30.74 91.01,24.63 98.81,24.63C101.18,24.63 103.42,25.2 105.4,26.21C103.92,26.97 102.9,28.52 102.9,30.31C102.9,32.87 104.96,34.94 107.52,34.94Z"/>
+
+ <path android:fillColor="#C1ED75" android:pathData="M132.12,102.6C129.93,102.6 128.16,100.82 128.16,98.63C128.16,82.31 114.9,69.04 98.6,69.04C82.3,69.04 69.04,82.31 69.04,98.63C69.04,100.82 67.27,102.6 65.08,102.6C62.9,102.6 61.12,100.82 61.12,98.63C61.12,77.94 77.93,61.11 98.6,61.11C119.27,61.11 136.08,77.94 136.08,98.63C136.08,100.82 134.31,102.6 132.12,102.6Z"/>
+
+ <path android:fillColor="#C1ED75" android:fillType="evenOdd" android:pathData="M128.46,98.63C128.46,100.65 130.1,102.3 132.12,102.3C134.14,102.3 135.78,100.65 135.78,98.63C135.78,78.11 119.1,61.41 98.6,61.41C78.1,61.41 61.42,78.11 61.42,98.63C61.42,100.65 63.06,102.3 65.08,102.3C67.1,102.3 68.74,100.65 68.74,98.63C68.74,82.15 82.13,68.74 98.6,68.74C115.07,68.74 128.46,82.15 128.46,98.63ZM128.16,98.63C128.16,100.82 129.93,102.6 132.12,102.6C134.31,102.6 136.08,100.82 136.08,98.63C136.08,77.94 119.27,61.11 98.6,61.11C77.93,61.11 61.12,77.94 61.12,98.63C61.12,100.82 62.9,102.6 65.08,102.6C67.27,102.6 69.04,100.82 69.04,98.63C69.04,82.31 82.3,69.04 98.6,69.04C114.9,69.04 128.16,82.31 128.16,98.63Z"/>
+
+ <path android:fillColor="#C1ED75" android:pathData="M158.51,102.6C156.33,102.6 154.55,100.82 154.55,98.63C154.55,67.74 129.46,42.61 98.6,42.61C67.75,42.61 42.65,67.74 42.65,98.63C42.65,100.82 40.87,102.6 38.69,102.6C36.5,102.6 34.73,100.82 34.73,98.63C34.73,81.55 41.37,65.49 53.44,53.42C65.5,41.34 81.54,34.69 98.6,34.69C115.66,34.69 131.7,41.34 143.76,53.42C155.83,65.49 162.47,81.55 162.47,98.63C162.47,100.82 160.7,102.6 158.51,102.6Z"/>
+
+ <path android:fillColor="#C1ED75" android:fillType="evenOdd" android:pathData="M154.85,98.63C154.85,100.65 156.49,102.3 158.51,102.3C160.53,102.3 162.18,100.65 162.18,98.63C162.18,81.63 155.56,65.65 143.55,53.63C131.55,41.61 115.58,34.99 98.6,34.99C81.62,34.99 65.66,41.61 53.65,53.63C41.64,65.65 35.03,81.63 35.03,98.63C35.03,100.65 36.67,102.3 38.69,102.3C40.71,102.3 42.35,100.65 42.35,98.63C42.35,67.58 67.58,42.32 98.6,42.32C129.62,42.32 154.85,67.58 154.85,98.63ZM154.55,98.63C154.55,100.82 156.33,102.6 158.51,102.6C160.7,102.6 162.47,100.82 162.47,98.63C162.47,81.55 155.83,65.49 143.76,53.42C131.7,41.34 115.66,34.69 98.6,34.69C81.54,34.69 65.5,41.34 53.44,53.42C41.37,65.49 34.73,81.55 34.73,98.63C34.73,100.82 36.5,102.6 38.69,102.6C40.87,102.6 42.65,100.82 42.65,98.63C42.65,67.74 67.75,42.61 98.6,42.61C129.46,42.61 154.55,67.74 154.55,98.63Z"/>
+
+ <path android:fillColor="#C1ED75" android:pathData="M145.32,102.6C143.13,102.6 141.36,100.82 141.36,98.63C141.36,75.03 122.18,55.83 98.6,55.83C75.02,55.83 55.84,75.03 55.84,98.63C55.84,100.82 54.07,102.6 51.88,102.6C49.7,102.6 47.92,100.82 47.92,98.63C47.92,70.66 70.66,47.9 98.6,47.9C126.54,47.9 149.28,70.66 149.28,98.63C149.28,100.82 147.5,102.6 145.32,102.6Z"/>
+
+ <path android:fillColor="#C1ED75" android:fillType="evenOdd" android:pathData="M141.66,98.63C141.66,100.65 143.3,102.3 145.32,102.3C147.34,102.3 148.98,100.65 148.98,98.63C148.98,70.82 126.38,48.2 98.6,48.2C70.82,48.2 48.22,70.82 48.22,98.63C48.22,100.65 49.86,102.3 51.88,102.3C53.9,102.3 55.54,100.65 55.54,98.63C55.54,74.86 74.86,55.53 98.6,55.53C122.34,55.53 141.66,74.86 141.66,98.63ZM141.36,98.63C141.36,100.82 143.13,102.6 145.32,102.6C147.5,102.6 149.28,100.82 149.28,98.63C149.28,70.66 126.54,47.9 98.6,47.9C70.66,47.9 47.92,70.66 47.92,98.63C47.92,100.82 49.7,102.6 51.88,102.6C54.07,102.6 55.84,100.82 55.84,98.63C55.84,75.03 75.02,55.83 98.6,55.83C122.18,55.83 141.36,75.03 141.36,98.63Z"/>
+
+ <path android:fillColor="#C1ED75" android:fillType="evenOdd" android:pathData="M166.69,66.45V55.84H166.99V66.45H166.69Z"/>
+
+ <path android:fillColor="#C1ED75" android:fillType="evenOdd" android:pathData="M171.2,61.3L162.37,61.27L162.37,60.97L171.2,61L171.2,61.3Z"/>
+
+ <path android:fillColor="#C1ED75" android:fillType="evenOdd" android:pathData="M37.89,31.19V7.2H38.19V31.19H37.89Z"/>
+
+ <path android:fillColor="#C1ED75" android:fillType="evenOdd" android:pathData="M47.98,19.45L28.1,19.4L28.1,19.1L47.98,19.15L47.98,19.45Z"/>
+
+ <path android:fillColor="#C1ED75" android:fillType="evenOdd" android:pathData="M42.05,23.48L33.74,15.15L33.95,14.94L42.26,23.26L42.05,23.48Z"/>
+
+ <path android:fillColor="#C1ED75" android:fillType="evenOdd" android:pathData="M33.95,23.48L42.26,15.15L42.05,14.94L33.74,23.26L33.95,23.48Z"/>
+
+ <path android:fillColor="#C1ED75" android:pathData="M168.11,43.01C168.11,43.75 167.52,44.34 166.79,44.34C166.05,44.34 165.46,43.75 165.46,43.01C165.46,42.28 166.05,41.69 166.79,41.69C167.52,41.69 168.11,42.28 168.11,43.01Z"/>
+
+ <path android:fillColor="#C1ED75" android:fillType="evenOdd" android:pathData="M157.07,51.42C158.41,51.42 159.5,50.33 159.5,48.98C159.5,47.64 158.41,46.55 157.07,46.55C155.73,46.55 154.64,47.64 154.64,48.98C154.64,50.33 155.73,51.42 157.07,51.42ZM157.07,51.12C158.24,51.12 159.2,50.16 159.2,48.98C159.2,47.81 158.24,46.85 157.07,46.85C155.89,46.85 154.94,47.81 154.94,48.98C154.94,50.16 155.89,51.12 157.07,51.12Z"/>
+
+ <path android:fillColor="#C1ED75" android:pathData="M33.84,62.47C33.84,63.2 33.25,63.8 32.52,63.8C31.79,63.8 31.19,63.2 31.19,62.47C31.19,61.74 31.79,61.14 32.52,61.14C33.25,61.14 33.84,61.74 33.84,62.47Z"/>
+
+ </group>
+
+</vector>
=====================================
mobile/android/fenix/app/src/main/res/drawable/illo_purple_speak.xml
=====================================
@@ -0,0 +1,97 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="127.75595dp" android:viewportHeight="127" android:viewportWidth="168" android:width="169dp">
+
+ <group>
+
+ <clip-path android:pathData="M0.17,0.74h167.66v126h-167.66z"/>
+
+ <path android:fillColor="#D898FA" android:pathData="M66.66,57.55C68.64,60.1 70.08,62.41 70.99,64.47C72.26,67.35 71.75,70.57 71.59,73.71C71.31,78.94 72.47,86.11 81.99,86.11C97.83,86.11 108.25,38.11 90.46,25.38C78.73,16.99 70.37,21.54 64.51,30.96C58.22,41.07 62.15,51.71 66.66,57.55Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M70.96,32.96C73.91,29.73 78.49,27.95 84.17,29.71C90.36,31.63 93.43,37.78 94.41,44.69C95.39,51.6 94.26,59.22 92.13,64.02C92.1,64.09 92.13,64.17 92.2,64.2C92.27,64.23 92.35,64.2 92.39,64.13C94.55,59.28 95.67,51.6 94.69,44.65C93.71,37.7 90.61,31.41 84.25,29.44C78.47,27.64 73.77,29.46 70.75,32.76C67.74,36.06 66.4,40.84 67.3,44.97C67.73,46.95 68.41,48.23 69.24,49.06C70.07,49.9 71.04,50.29 72.02,50.51C72.51,50.62 73.01,50.68 73.5,50.75C73.57,50.75 73.64,50.76 73.71,50.77C74.12,50.82 74.53,50.87 74.92,50.94C75.83,51.11 76.65,51.39 77.29,52.03C77.87,52.61 78.15,53.52 78.16,54.49C78.17,55.47 77.91,56.49 77.44,57.28C76.97,58.08 76.29,58.63 75.46,58.71C74.64,58.79 73.62,58.4 72.46,57.2C72.41,57.15 72.32,57.15 72.26,57.2C72.21,57.25 72.2,57.34 72.26,57.4C73.45,58.63 74.55,59.08 75.49,58.99C76.43,58.9 77.18,58.27 77.68,57.43C78.19,56.58 78.46,55.51 78.44,54.49C78.43,53.47 78.14,52.48 77.49,51.83C76.79,51.13 75.91,50.84 74.97,50.67C74.57,50.59 74.16,50.54 73.74,50.49C73.67,50.48 73.6,50.47 73.53,50.46C73.05,50.4 72.56,50.34 72.08,50.23C71.13,50.02 70.22,49.65 69.44,48.87C68.66,48.08 68,46.86 67.58,44.91C66.7,40.87 68.01,36.19 70.96,32.96Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M74.66,44.44C73.27,45.39 72.11,47.19 71.47,49.96C71.46,50.04 71.5,50.11 71.58,50.13C71.66,50.15 71.73,50.1 71.75,50.02C72.37,47.29 73.51,45.57 74.82,44.68C76.13,43.79 77.63,43.71 79.03,44.3C81.82,45.48 84.21,49.38 83.6,54.86C83.4,56.56 82.67,57.58 81.97,58.42C81.9,58.51 81.83,58.59 81.76,58.67C81.14,59.41 80.57,60.1 80.57,61.09C80.57,61.21 80.62,61.32 80.7,61.43C80.77,61.53 80.88,61.65 81,61.77C81.13,61.89 81.27,62.02 81.43,62.17L81.44,62.17C81.6,62.32 81.78,62.48 81.96,62.65C82.71,63.36 83.62,64.34 84.25,65.74C84.55,66.4 84.42,67.45 83.96,68.46C83.49,69.47 82.7,70.41 81.74,70.86C80.79,71.3 79.66,71.27 78.45,70.32C77.23,69.36 75.94,67.46 74.71,64.15C74.69,64.07 74.61,64.04 74.53,64.06C74.46,64.09 74.42,64.17 74.45,64.25C75.68,67.57 76.99,69.53 78.27,70.54C79.56,71.56 80.81,71.6 81.86,71.11C82.9,70.63 83.73,69.63 84.21,68.58C84.69,67.53 84.86,66.39 84.51,65.63C83.86,64.18 82.92,63.17 82.16,62.45C81.97,62.27 81.79,62.11 81.63,61.96L81.62,61.96C81.46,61.81 81.32,61.68 81.2,61.56C81.08,61.45 80.99,61.35 80.93,61.26C80.87,61.18 80.85,61.12 80.85,61.09C80.85,60.2 81.35,59.6 81.99,58.84C82.05,58.76 82.12,58.69 82.18,58.6C82.9,57.74 83.68,56.68 83.88,54.89C84.5,49.33 82.08,45.29 79.14,44.04C77.66,43.41 76.06,43.49 74.66,44.44Z"/>
+
+ <path android:fillColor="#D898FA" android:pathData="M63.18,74.94L63.62,76.88L70.34,96.04L51.86,108.67L23.05,89.16L27.26,79.04L58.45,68.17L63.18,74.94Z"/>
+
+ <path android:fillColor="#ffffff" android:pathData="M27.27,80.09C47.15,81.57 57.64,73.32 60.39,69.01L53.37,63.05L33.93,69.24L27.27,80.09Z"/>
+
+ <path android:fillColor="#ffffff" android:pathData="M57.31,95.39C58.88,94.84 63.78,89.37 66.04,86.7L68.09,93.95L60.83,103L42.92,99.83C47.06,98.58 55.73,95.94 57.31,95.39Z"/>
+
+ <path android:fillColor="#8C3EB2" android:fillType="evenOdd" android:pathData="M22.96,89.15C23.89,83.54 25.28,72.35 25.27,69.69C25.26,66.31 30.23,60.72 37.4,62.07C41.88,62.92 44.65,61.26 47.2,59.75C48.73,58.83 50.17,57.97 51.86,57.73C55.74,57.19 64.52,58.88 63.59,76.2C63.77,76.35 63.9,76.65 64.19,77.33C64.8,78.79 66.13,81.96 70.24,89.06C78.29,102.96 70.79,108.38 57.8,112.21C44.81,116.04 31.76,100.93 30.36,98.29C29.01,95.71 24.96,91.31 23,89.32C22.99,89.31 22.98,89.3 22.98,89.28C22.96,89.24 22.96,89.19 22.96,89.15ZM23.24,89.17C24.88,87.75 26.63,85.76 28.47,83.18C29.08,82.33 29.63,81.03 30.24,79.58C31.54,76.5 33.13,72.75 36.09,71.41C37.47,70.79 38.88,71.08 40.34,71.38C42.56,71.84 44.89,72.32 47.36,69.7C51.47,65.35 55.73,66.43 56.92,68.47C57.77,69.95 61.38,74.16 63.38,76.22C62.69,77.2 62.22,82.56 65.85,90.59C70.58,101.09 47.2,103.75 39.32,97.04C36.53,94.65 26.77,89.67 23.24,89.17Z"/>
+
+ <path android:fillColor="#D898FA" android:fillType="evenOdd" android:pathData="M28.73,64.22C30.84,62.59 33.84,61.54 37.38,62.21C41.9,63.07 44.72,61.39 47.26,59.87L47.27,59.87C48.8,58.95 50.23,58.11 51.88,57.87C53.79,57.61 56.9,57.89 59.43,60.37C61.95,62.84 63.9,67.52 63.46,76.1C62.46,75.07 61.08,73.52 59.83,72.04C58.57,70.54 57.46,69.13 57.04,68.4C55.79,66.25 51.41,65.21 47.26,69.6C46.04,70.89 44.87,71.41 43.74,71.56C42.59,71.7 41.48,71.47 40.37,71.24L40.35,71.24C38.9,70.94 37.45,70.64 36.04,71.28C34.52,71.97 33.36,73.27 32.42,74.77C31.49,76.27 30.76,77.98 30.11,79.52L30.11,79.53C29.49,80.98 28.95,82.27 28.36,83.1C26.52,85.67 24.78,87.66 23.15,89.06C23.13,89.07 23.12,89.08 23.12,89.1C23.58,86.29 24.15,82.13 24.61,78.33C25.07,74.5 25.42,71.03 25.41,69.69C25.41,68.06 26.61,65.85 28.73,64.22ZM23.1,89.19C23.1,89.2 23.1,89.2 23.1,89.21C23.11,89.22 23.11,89.23 23.12,89.25C23.12,89.24 23.11,89.23 23.1,89.23C23.1,89.22 23.1,89.21 23.1,89.19ZM23.16,89.28C23.18,89.29 23.2,89.3 23.22,89.31C24.09,89.43 25.35,89.83 26.8,90.4C28.25,90.98 29.88,91.72 31.5,92.52C34.73,94.13 37.85,95.96 39.23,97.14C41.23,98.85 44.19,99.95 47.43,100.48C50.68,101.01 54.2,100.98 57.34,100.41C60.47,99.84 63.23,98.72 64.91,97.07C65.75,96.25 66.32,95.28 66.53,94.19C66.74,93.09 66.58,91.87 65.97,90.54C64.17,86.53 63.38,83.2 63.14,80.75C63.01,79.52 63.02,78.52 63.11,77.76C63.19,77 63.34,76.52 63.49,76.3C63.5,76.3 63.5,76.3 63.5,76.3C63.5,76.3 63.5,76.3 63.5,76.3C63.57,76.36 63.64,76.46 63.72,76.63C63.81,76.81 63.91,77.05 64.06,77.39C64.67,78.85 66.01,82.02 70.12,89.13C74.13,96.06 74.24,100.83 71.79,104.33C69.33,107.86 64.26,110.16 57.76,112.07C51.33,113.97 44.86,111.18 39.82,107.56C37.29,105.75 35.13,103.74 33.52,102.02C31.9,100.3 30.83,98.87 30.49,98.22C29.8,96.92 28.44,95.17 27.02,93.49C25.61,91.85 24.14,90.28 23.16,89.28ZM28.56,63.99C26.4,65.66 25.12,67.94 25.13,69.69C25.14,71.01 24.79,74.46 24.33,78.3C23.87,82.13 23.29,86.33 22.82,89.13C22.81,89.19 22.82,89.27 22.84,89.34C22.86,89.37 22.87,89.4 22.9,89.42C23.88,90.41 25.38,92.01 26.8,93.68C28.23,95.35 29.57,97.08 30.24,98.36C30.6,99.03 31.68,100.49 33.31,102.21C34.94,103.95 37.11,105.97 39.65,107.79C44.72,111.43 51.28,114.28 57.84,112.34C64.33,110.43 69.5,108.11 72.02,104.49C74.56,100.86 74.4,95.96 70.36,88.99C66.26,81.9 64.93,78.73 64.32,77.28L64.32,77.27C64.17,76.94 64.07,76.69 63.98,76.5C63.9,76.35 63.83,76.23 63.74,76.14C64.19,67.5 62.23,62.72 59.63,60.17C57.02,57.61 53.81,57.32 51.84,57.59C50.13,57.83 48.66,58.71 47.14,59.62L47.12,59.63C44.58,61.14 41.85,62.77 37.43,61.93C33.8,61.25 30.72,62.32 28.56,63.99ZM36.15,71.54C37.48,70.94 38.84,71.22 40.31,71.52L40.32,71.52C41.42,71.75 42.58,71.99 43.77,71.84C44.98,71.68 46.21,71.13 47.46,69.8C51.54,65.48 55.67,66.62 56.79,68.54C57.23,69.29 58.35,70.73 59.61,72.22C60.84,73.68 62.21,75.21 63.2,76.24C63.04,76.54 62.9,77.05 62.82,77.73C62.74,78.51 62.73,79.53 62.85,80.77C63.1,83.26 63.9,86.62 65.72,90.65C66.3,91.94 66.45,93.1 66.25,94.13C66.06,95.16 65.52,96.08 64.71,96.87C63.09,98.47 60.4,99.56 57.29,100.13C54.19,100.7 50.69,100.73 47.48,100.2C44.27,99.67 41.36,98.58 39.41,96.93C38,95.73 34.85,93.88 31.62,92.27C30,91.46 28.36,90.72 26.9,90.14C25.6,89.63 24.43,89.24 23.56,89.08C25.14,87.67 26.82,85.73 28.59,83.26C29.2,82.4 29.76,81.09 30.36,79.65L30.37,79.64C31.02,78.09 31.74,76.4 32.66,74.92C33.59,73.44 34.71,72.19 36.15,71.54Z"/>
+
+ <path android:fillColor="#ffffff" android:pathData="M128.88,24.35C119.46,24.35 110.89,32.44 107.28,37.1C106.97,37.49 107.07,38.05 107.47,38.33C112.04,41.53 119.8,46.43 128.88,46.43C137.97,46.43 144.99,41.51 149.13,38.31C149.49,38.03 149.58,37.52 149.32,37.15C146.16,32.49 138.33,24.35 128.88,24.35Z"/>
+
+ <path android:fillColor="#D898FA" android:fillType="evenOdd" android:pathData="M115.98,29.09C112.22,31.69 109.19,34.87 107.39,37.19C107.13,37.51 107.21,37.98 107.55,38.22C112.12,41.41 119.85,46.29 128.88,46.29C137.92,46.29 144.91,41.39 149.04,38.2C149.35,37.96 149.42,37.54 149.2,37.23C147.63,34.91 144.89,31.72 141.37,29.12C137.85,26.51 133.56,24.49 128.88,24.49C124.21,24.49 119.74,26.5 115.98,29.09ZM115.82,28.86C119.6,26.25 124.13,24.21 128.88,24.21C133.64,24.21 137.99,26.26 141.54,28.89C145.09,31.52 147.85,34.73 149.44,37.07C149.74,37.51 149.63,38.1 149.21,38.42C145.08,41.62 138.02,46.57 128.88,46.57C119.75,46.57 111.96,41.65 107.39,38.45C106.92,38.12 106.81,37.47 107.16,37.01C108.98,34.67 112.04,31.48 115.82,28.86Z"/>
+
+ <path android:fillColor="#D898FA" android:pathData="M128.17,41.65C134.28,41.65 139.24,36.71 139.24,30.61C139.24,29.42 139.05,28.27 138.7,27.19C135.76,25.5 132.43,24.35 128.88,24.35C124.78,24.35 120.85,25.88 117.42,27.99C117.21,28.83 117.1,29.71 117.1,30.61C117.1,36.71 122.06,41.65 128.17,41.65Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M128.8,10.35C128.88,10.35 128.94,10.41 128.94,10.49V21.45C128.94,21.53 128.88,21.59 128.8,21.59C128.72,21.59 128.66,21.53 128.66,21.45V10.49C128.66,10.41 128.72,10.35 128.8,10.35Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M101.93,22.96C101.98,22.9 102.07,22.9 102.13,22.96L109.9,30.71C109.96,30.76 109.96,30.85 109.9,30.91C109.84,30.96 109.75,30.96 109.7,30.91L101.93,23.16C101.87,23.1 101.87,23.01 101.93,22.96Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M155.43,22.96C155.38,22.9 155.29,22.9 155.23,22.96L147.46,30.71C147.41,30.76 147.41,30.85 147.46,30.91C147.52,30.96 147.61,30.96 147.66,30.91L155.43,23.16C155.49,23.1 155.49,23.01 155.43,22.96Z"/>
+
+ <path android:fillColor="#D898FA" android:pathData="M124.8,105.07C124.8,116.65 115.39,126.04 103.78,126.04C92.17,126.04 82.76,116.65 82.76,105.07C82.76,93.5 92.17,84.11 103.78,84.11C115.39,84.11 124.8,93.5 124.8,105.07Z"/>
+
+ <path android:fillColor="#D898FA" android:fillType="evenOdd" android:pathData="M125.08,105.07C125.08,116.81 115.54,126.32 103.78,126.32C92.01,126.32 82.47,116.81 82.47,105.07C82.47,93.34 92.01,83.83 103.78,83.83C115.54,83.83 125.08,93.34 125.08,105.07ZM103.78,126.04C115.39,126.04 124.8,116.65 124.8,105.07C124.8,93.5 115.39,84.11 103.78,84.11C92.17,84.11 82.76,93.5 82.76,105.07C82.76,116.65 92.17,126.04 103.78,126.04Z"/>
+
+ <group>
+
+ <clip-path android:pathData="M124.8,105.07C124.8,116.65 115.39,126.04 103.78,126.04C92.17,126.04 82.76,116.65 82.76,105.07C82.76,93.5 92.17,84.11 103.78,84.11C115.39,84.11 124.8,93.5 124.8,105.07Z"/>
+
+ <path android:fillColor="#D898FA" android:pathData="M129.47,105.18C129.47,119.38 117.92,130.9 103.68,130.9C89.43,130.9 77.88,119.38 77.88,105.18C77.88,90.97 89.43,79.45 103.68,79.45C117.92,79.45 129.47,90.97 129.47,105.18Z"/>
+
+ <path android:fillColor="#D898FA" android:pathData="M129.47,105.18C129.47,119.38 117.92,130.9 103.68,130.9C89.43,130.9 77.88,119.38 77.88,105.18C77.88,90.97 89.43,79.45 103.68,79.45C117.92,79.45 129.47,90.97 129.47,105.18Z"/>
+
+ <path android:fillColor="#8C3EB2" android:pathData="M110.19,97.89C115.28,97.89 118.43,96.06 119.93,94.6C120.38,94.17 121.15,94.14 121.53,94.63L126.5,100.9C126.96,101.49 126.55,102.38 125.81,102.48C123.18,102.83 119.39,103.93 117.09,106.61C113.44,110.86 107.65,105.32 103.49,105.32C99.33,105.32 98.72,109.44 95.27,112.89C91.82,116.34 88.17,107.62 86.14,104.31C84.11,101 91.82,102.35 96.59,102.35C101.36,102.35 98.72,100.18 93.85,99.58C88.98,98.97 87.36,96.4 90.1,95.25C92.84,94.1 102.27,97.89 110.19,97.89Z"/>
+
+ <path android:fillColor="#8C3EB2" android:pathData="M98.6,119.96C97.13,119.96 94.67,121.51 92.97,122.78C92.43,123.18 92.56,124.01 93.19,124.26L104.1,128.55C104.29,128.63 104.49,128.64 104.69,128.58L119.02,124.14C119.66,123.95 119.85,123.15 119.33,122.72C117.81,121.46 115.48,119.96 113.53,119.96C110.38,119.96 107.13,121.68 104.39,121.68C101.65,121.68 100.94,119.96 98.6,119.96Z"/>
+
+ <path android:fillColor="#8C3EB2" android:pathData="M109.48,111.76C111.43,113.29 109.84,116.6 108.21,117.45C108.1,117.51 107.97,117.53 107.84,117.51C106.72,117.29 103.68,115.55 101.99,114.74C99.73,113.65 103.16,113.93 104.52,113.2C105.87,112.48 106.95,109.78 109.48,111.76Z"/>
+
+ <path android:fillColor="#8C3EB2" android:pathData="M103.58,89.78C99.95,90.75 94.7,89.85 91.21,88.94C90.42,88.73 90.37,87.67 91.13,87.36L103.3,82.3C103.48,82.23 103.68,82.21 103.86,82.26C109.28,83.66 118.99,86.23 116.68,85.83C113.73,85.33 109.26,88.26 103.58,89.78Z"/>
+
+ </group>
+
+ <path android:fillColor="#D898FA" android:pathData="M103.78,66.64C103.78,59.47 109.59,53.66 116.76,53.66H154.62C161.79,53.66 167.6,59.47 167.6,66.64C167.6,73.81 161.79,79.62 154.62,79.62H116.76C109.59,79.62 103.78,73.81 103.78,66.64Z"/>
+
+ <path android:fillColor="#ffffff" android:pathData="M132.3,72.66L132.79,70.46C133.74,70.46 134.61,70.45 135.41,70.44C136.21,70.41 136.9,70.38 137.5,70.34C138.11,70.31 138.62,70.25 139.02,70.18C139.43,70.09 139.71,69.98 139.86,69.84C140.11,69.64 140.28,69.33 140.38,68.9C140.48,68.47 140.53,67.84 140.53,67.03C140.53,66.6 140.5,66.2 140.44,65.85C140.38,65.5 140.28,65.21 140.14,64.96C140.02,64.69 139.87,64.5 139.69,64.38C139.52,64.24 139.32,64.17 139.09,64.17C138.87,64.17 138.66,64.25 138.46,64.41C138.26,64.58 138.1,64.79 137.97,65.07C137.86,65.33 137.8,65.61 137.8,65.91C137.8,66.11 137.85,66.28 137.93,66.43C138.03,66.58 138.19,66.7 138.4,66.79C138.61,66.86 138.88,66.9 139.21,66.9C139.52,66.9 139.84,66.86 140.16,66.79C140.5,66.71 140.8,66.61 141.06,66.49L141.13,68.38C140.93,68.52 140.7,68.64 140.44,68.74C140.19,68.83 139.92,68.91 139.64,68.96C139.35,69.01 139.06,69.03 138.77,69.03C138.11,69.03 137.55,68.95 137.09,68.77C136.63,68.6 136.27,68.32 136.01,67.93C135.76,67.53 135.63,67.01 135.63,66.38C135.63,65.85 135.72,65.34 135.89,64.82C136.07,64.3 136.32,63.83 136.64,63.4C136.97,62.97 137.35,62.62 137.78,62.37C138.22,62.11 138.71,61.98 139.24,61.98C140.03,61.98 140.68,62.22 141.19,62.69C141.7,63.15 142.08,63.78 142.33,64.56C142.58,65.35 142.7,66.2 142.7,67.13C142.7,67.72 142.65,68.3 142.55,68.85C142.47,69.4 142.34,69.88 142.16,70.31C141.99,70.73 141.77,71.08 141.51,71.35C141.27,71.62 140.88,71.83 140.33,72.01C139.79,72.18 139.12,72.32 138.33,72.4C137.53,72.5 136.62,72.57 135.59,72.61C134.58,72.65 133.49,72.66 132.3,72.66ZM132.3,72.66C131.04,72.66 129.96,72.57 129.07,72.38C128.18,72.21 127.45,71.95 126.88,71.6C126.3,71.25 125.88,70.82 125.6,70.33C125.33,69.83 125.19,69.25 125.19,68.6C125.19,68.24 125.22,67.87 125.29,67.5C125.35,67.11 125.43,66.74 125.53,66.38C125.63,66 125.72,65.66 125.81,65.35L127.79,65.84C127.74,66.05 127.69,66.28 127.62,66.55C127.56,66.8 127.51,67.05 127.46,67.29C127.42,67.54 127.4,67.77 127.4,67.99C127.4,68.51 127.56,68.96 127.89,69.33C128.22,69.71 128.78,69.99 129.57,70.18C130.36,70.36 131.43,70.46 132.79,70.46L133.16,72.07L132.3,72.66ZM139.07,60.17C138.74,60.17 138.45,60.05 138.21,59.83C137.98,59.59 137.86,59.31 137.86,58.97C137.86,58.63 137.98,58.35 138.21,58.11C138.45,57.86 138.74,57.73 139.07,57.73C139.4,57.73 139.68,57.86 139.92,58.11C140.15,58.35 140.27,58.63 140.27,58.97C140.27,59.31 140.15,59.59 139.92,59.83C139.68,60.05 139.4,60.17 139.07,60.17Z"/>
+
+ <path android:fillColor="#8C3EB2" android:pathData="M79.14,15.69C58.83,15.05 51.84,33.31 56.62,49.77C56.72,50.13 56.6,50.53 56.29,50.74C44.7,59.06 34.75,47.74 30.77,40.07C25.12,29.2 25.33,11.83 37.62,5.05C53.1,-3.49 74.77,3.56 79.99,14.51C80.26,15.09 79.78,15.71 79.14,15.69Z"/>
+
+ <path android:fillColor="#D898FA" android:fillType="evenOdd" android:pathData="M62.69,2.34C70.72,4.41 77.48,8.92 80.12,14.45C80.44,15.14 79.86,15.86 79.14,15.84C69.03,15.51 62.25,19.89 58.59,26.39C54.93,32.89 54.37,41.53 56.76,49.73C56.88,50.15 56.73,50.61 56.37,50.86C53.45,52.95 50.63,53.82 47.97,53.81C45.31,53.79 42.83,52.91 40.6,51.52C36.14,48.76 32.64,43.99 30.64,40.14C27.8,34.67 26.44,27.58 27.33,21.01C28.21,14.43 31.36,8.35 37.55,4.93C45.33,0.64 54.66,0.27 62.69,2.34ZM62.62,2.61C54.64,0.55 45.39,0.93 37.69,5.18C31.59,8.54 28.49,14.53 27.61,21.04C26.73,27.56 28.08,34.59 30.89,40.01C32.88,43.83 36.35,48.55 40.75,51.28C42.95,52.65 45.38,53.51 47.97,53.52C50.56,53.53 53.33,52.69 56.21,50.63C56.46,50.45 56.57,50.12 56.48,49.81C54.09,41.55 54.64,32.83 58.35,26.25C62.06,19.66 68.94,15.23 79.14,15.55C79.7,15.57 80.08,15.04 79.86,14.57C77.28,9.15 70.6,4.67 62.62,2.61Z"/>
+
+ <path android:fillColor="#ffffff" android:pathData="M49.09,24.47C49.08,24.68 49.1,24.87 49.15,25.06C49.19,25.22 49.25,25.35 49.32,25.45C49.39,25.54 49.46,25.61 49.52,25.67C49.59,25.72 49.64,25.75 49.66,25.78C49.84,25.88 49.95,26.01 49.99,26.15C49.99,26.18 50,26.25 50,26.38C49.99,26.59 49.9,26.77 49.72,26.91C49.56,27.03 49.27,27.14 48.87,27.25L43.76,28.59C43.46,28.67 43.21,28.69 43.01,28.63C42.83,28.57 42.72,28.46 42.67,28.28C42.65,28.2 42.65,28.1 42.66,27.99C42.67,27.86 42.71,27.76 42.77,27.68C42.83,27.59 42.93,27.48 43.05,27.35C43.25,27.16 43.39,26.97 43.5,26.78C43.6,26.58 43.65,26.29 43.66,25.9L43.74,23.9L40.38,24.79L40.12,26.17C40.01,26.76 40,27.21 40.08,27.52C40.12,27.69 40.19,27.82 40.27,27.92C40.36,28.01 40.47,28.09 40.62,28.18C40.75,28.27 40.84,28.35 40.89,28.43C40.95,28.49 40.99,28.59 40.99,28.73C40.99,28.96 40.91,29.14 40.74,29.27C40.59,29.39 40.32,29.5 39.93,29.6L36.72,30.45C36.39,30.53 36.12,30.54 35.92,30.47C35.72,30.39 35.59,30.25 35.53,30.05C35.47,29.82 35.51,29.61 35.65,29.44C35.77,29.25 35.98,29.04 36.27,28.79C36.64,28.47 36.93,28.17 37.14,27.9C37.34,27.61 37.49,27.26 37.57,26.84L39.33,17.88C39.6,16.49 40.06,15.41 40.71,14.66C41.36,13.89 42.35,13.33 43.65,12.98C45.12,12.6 46.33,12.6 47.29,12.99C48.25,13.37 48.87,14.09 49.14,15.16C49.26,15.6 49.31,16.08 49.29,16.59L49.09,24.47ZM43.82,21.58L43.97,17.48C43.99,17.3 43.97,17.11 43.92,16.92C43.85,16.65 43.72,16.47 43.53,16.38C43.34,16.28 43.12,16.26 42.84,16.33C42.5,16.42 42.23,16.6 42.04,16.86C41.85,17.13 41.7,17.55 41.59,18.13L40.81,22.37L43.82,21.58Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M143.43,111.19V84.11H143.71V111.19H143.43Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M154.83,97.91L132.31,97.85L132.31,97.57L154.83,97.63L154.83,97.91Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M148.13,102.46L138.72,93.07L138.92,92.87L148.34,102.26L148.13,102.46Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M138.92,102.46L148.34,93.07L148.13,92.87L138.72,102.26L138.92,102.46Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M11.29,78V50.92H11.57V78H11.29Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M22.69,64.72L0.17,64.66L0.17,64.38L22.7,64.44L22.69,64.72Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M16,69.27L6.58,59.88L6.78,59.68L16.2,69.07L16,69.27Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M6.78,69.27L16.2,59.88L16,59.68L6.58,69.07L6.78,69.27Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M14.06,45.68C15.1,45.68 15.94,44.78 15.94,43.68C15.94,42.58 15.1,41.69 14.06,41.69C13.02,41.69 12.18,42.58 12.18,43.68C12.18,44.78 13.02,45.68 14.06,45.68ZM14.06,45.4C14.93,45.4 15.65,44.65 15.65,43.68C15.65,42.72 14.93,41.97 14.06,41.97C13.2,41.97 12.47,42.72 12.47,43.68C12.47,44.65 13.2,45.4 14.06,45.4Z"/>
+
+ <path android:fillColor="#ffffff" android:pathData="M3.93,50.92C3.93,52.02 3.08,52.92 2.05,52.92C1.01,52.92 0.17,52.02 0.17,50.92C0.17,49.82 1.01,48.92 2.05,48.92C3.08,48.92 3.93,49.82 3.93,50.92Z"/>
+
+ <path android:fillColor="#ffffff" android:pathData="M154.21,108.07C155.24,108.07 156.08,107.18 156.08,106.07C156.08,104.97 155.24,104.08 154.21,104.08C153.17,104.08 152.33,104.97 152.33,106.07C152.33,107.18 153.17,108.07 154.21,108.07Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M151.83,118.55C151.83,120.07 150.6,121.29 149.08,121.29C147.56,121.29 146.32,120.07 146.32,118.55C146.32,117.03 147.56,115.81 149.08,115.81C150.6,115.81 151.83,117.03 151.83,118.55ZM151.55,118.55C151.55,119.91 150.44,121.01 149.08,121.01C147.71,121.01 146.61,119.91 146.61,118.55C146.61,117.19 147.71,116.09 149.08,116.09C150.44,116.09 151.55,117.19 151.55,118.55Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M22.61,54.66V43.68H22.9V54.66H22.61Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M27.2,49.32L18.19,49.29L18.19,49.01L27.2,49.03L27.2,49.32Z"/>
+
+ </group>
+
+</vector>
=====================================
mobile/android/fenix/app/src/main/res/drawable/illo_red_search.xml
=====================================
@@ -0,0 +1,77 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="144dp" android:viewportHeight="144" android:viewportWidth="199" android:width="199dp">
+
+ <group>
+
+ <clip-path android:pathData="M8.97,0L190.46,0A8,8 0,0 1,198.46 8L198.46,136A8,8 0,0 1,190.46 144L8.97,144A8,8 0,0 1,0.97 136L0.97,8A8,8 0,0 1,8.97 0z"/>
+
+ <path android:fillColor="#1D1133" android:pathData="M8.97,0L190.46,0A8,8 0,0 1,198.46 8L198.46,136A8,8 0,0 1,190.46 144L8.97,144A8,8 0,0 1,0.97 136L0.97,8A8,8 0,0 1,8.97 0z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M153.93,33.4V22.78H154.22V33.4H153.93Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M158.43,28.24L149.6,28.22L149.6,27.92L158.43,27.94L158.43,28.24Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M40.59,125.46V101.47H40.89V125.46H40.59Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M50.67,113.72L30.8,113.67L30.8,113.37L50.68,113.42L50.67,113.72Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M44.75,117.74L36.44,109.42L36.65,109.21L44.96,117.53L44.75,117.74Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M36.65,117.74L44.96,109.42L44.75,109.21L36.44,117.53L36.65,117.74Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M143.94,17.65C145.08,17.65 146,16.72 146,15.59C146,14.45 145.08,13.53 143.94,13.53C142.81,13.53 141.89,14.45 141.89,15.59C141.89,16.72 142.81,17.65 143.94,17.65ZM143.94,17.35C144.91,17.35 145.7,16.56 145.7,15.59C145.7,14.61 144.91,13.82 143.94,13.82C142.97,13.82 142.18,14.61 142.18,15.59C142.18,16.56 142.97,17.35 143.94,17.35Z"/>
+
+ <path android:fillColor="#ffffff" android:pathData="M49.91,96.62C49.91,97.36 49.31,97.95 48.58,97.95C47.85,97.95 47.26,97.36 47.26,96.62C47.26,95.89 47.85,95.3 48.58,95.3C49.31,95.3 49.91,95.89 49.91,96.62Z"/>
+
+ <path android:fillColor="#FF6A75" android:pathData="M57.46,51.13C57.46,26.69 77.27,6.88 101.7,6.88C126.14,6.88 145.95,26.69 145.95,51.13V134.61C145.95,135.63 145.12,136.46 144.1,136.46H59.31C58.28,136.46 57.46,135.63 57.46,134.61V51.13Z"/>
+
+ <path android:fillColor="#FF6A75" android:fillType="evenOdd" android:pathData="M146.24,51.13V134.61C146.24,135.79 145.28,136.75 144.1,136.75H59.31C58.12,136.75 57.17,135.79 57.17,134.61V51.13C57.17,26.53 77.11,6.59 101.7,6.59C126.3,6.59 146.24,26.53 146.24,51.13ZM101.7,6.88C77.27,6.88 57.46,26.69 57.46,51.13V134.61C57.46,135.63 58.28,136.46 59.31,136.46H144.1C145.12,136.46 145.95,135.63 145.95,134.61V51.13C145.95,26.69 126.14,6.88 101.7,6.88Z"/>
+
+ <group>
+
+ <clip-path android:pathData="M73.89,38.09h56.95v56.95h-56.95z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M102.37,84.36C108.27,84.36 113.05,79.58 113.05,73.69C113.05,67.79 108.27,63.01 102.37,63.01C96.47,63.01 91.69,67.79 91.69,73.69C91.69,79.58 96.47,84.36 102.37,84.36ZM102.37,87.92C110.23,87.92 116.61,81.55 116.61,73.69C116.61,65.82 110.23,59.45 102.37,59.45C94.5,59.45 88.13,65.82 88.13,73.69C88.13,81.55 94.5,87.92 102.37,87.92Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M102.37,77.24C104.33,77.24 105.93,75.65 105.93,73.69C105.93,71.72 104.33,70.13 102.37,70.13C100.4,70.13 98.81,71.72 98.81,73.69C98.81,75.65 100.4,77.24 102.37,77.24ZM102.37,80.8C106.3,80.8 109.49,77.62 109.49,73.69C109.49,69.75 106.3,66.57 102.37,66.57C98.44,66.57 95.25,69.75 95.25,73.69C95.25,77.62 98.44,80.8 102.37,80.8Z"/>
+
+ <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M116.61,57.77C120.98,61.68 123.73,67.36 123.73,73.69C123.73,85.48 114.16,95.04 102.37,95.04C90.57,95.04 81.01,85.48 81.01,73.69C81.01,67.36 83.76,61.68 88.13,57.77V52.33C88.13,44.46 94.5,38.09 102.37,38.09C110.23,38.09 116.61,44.46 116.61,52.33V57.77ZM92.58,54.7C95.51,53.18 98.84,52.33 102.37,52.33C105.9,52.33 109.22,53.18 112.16,54.7V52.33C112.16,46.92 107.78,42.54 102.37,42.54C96.96,42.54 92.58,46.92 92.58,52.33V54.7ZM120.17,73.69C120.17,83.51 112.2,91.48 102.37,91.48C92.54,91.48 84.57,83.51 84.57,73.69C84.57,63.86 92.54,55.89 102.37,55.89C112.2,55.89 120.17,63.86 120.17,73.69Z"/>
+
+ </group>
+
+ <path android:fillColor="#212529" android:fillType="evenOdd" android:pathData="M115.47,34.1V15.2H115.76V34.1H115.47Z"/>
+
+ <path android:fillColor="#212529" android:fillType="evenOdd" android:pathData="M123.54,24.88L107.69,24.84L107.69,24.55L123.54,24.59L123.54,24.88Z"/>
+
+ <path android:fillColor="#212529" android:fillType="evenOdd" android:pathData="M118.79,28.04L112.17,21.49L112.37,21.28L119,27.84L118.79,28.04Z"/>
+
+ <path android:fillColor="#212529" android:fillType="evenOdd" android:pathData="M112.37,28.04L119,21.49L118.79,21.28L112.17,27.84L112.37,28.04Z"/>
+
+ <path android:fillColor="#212529" android:fillType="evenOdd" android:pathData="M137.74,78.54V65.77H138.03V78.54H137.74Z"/>
+
+ <path android:fillColor="#212529" android:fillType="evenOdd" android:pathData="M143.19,72.3L132.44,72.28L132.44,71.99L143.19,72.01L143.19,72.3Z"/>
+
+ <path android:fillColor="#212529" android:fillType="evenOdd" android:pathData="M66.64,91.05V82.53H66.93V91.05H66.64Z"/>
+
+ <path android:fillColor="#212529" android:fillType="evenOdd" android:pathData="M70.23,86.94L63.24,86.92L63.25,86.63L70.23,86.65L70.23,86.94Z"/>
+
+ <path android:fillColor="#212529" android:pathData="M95.76,27.98C95.76,28.85 95.05,29.56 94.16,29.56C93.28,29.56 92.56,28.85 92.56,27.98C92.56,27.11 93.28,26.4 94.16,26.4C95.05,26.4 95.76,27.11 95.76,27.98ZM141.16,53.26C141.16,54.13 140.45,54.84 139.56,54.84C138.68,54.84 137.96,54.13 137.96,53.26C137.96,52.39 138.68,51.68 139.56,51.68C140.45,51.68 141.16,52.39 141.16,53.26ZM75.77,95.18C75.77,96.05 75.06,96.76 74.17,96.76C73.29,96.76 72.58,96.05 72.58,95.18C72.58,94.3 73.29,93.59 74.17,93.59C75.06,93.59 75.77,94.3 75.77,95.18Z" android:strokeColor="#212529" android:strokeWidth="0.563343"/>
+
+ <path android:fillColor="#212529" android:pathData="M57.19,118.34H146.21V134.92C146.21,135.95 145.39,136.77 144.36,136.77H59.04C58.02,136.77 57.19,135.95 57.19,134.92V118.34Z"/>
+
+ <path android:fillColor="#FF6A75" android:fillType="evenOdd" android:pathData="M145.93,118.63H57.48V134.92C57.48,135.79 58.18,136.49 59.04,136.49H144.36C145.23,136.49 145.93,135.79 145.93,134.92V118.63ZM57.19,118.34V134.92C57.19,135.95 58.02,136.77 59.04,136.77H144.36C145.39,136.77 146.21,135.95 146.21,134.92V118.34H57.19Z"/>
+
+ <path android:fillColor="#212529" android:pathData="M73.66,101.33C73.66,100.82 74.07,100.41 74.58,100.41H146.21V118.54H73.66V101.33Z"/>
+
+ <path android:fillColor="#FF6A75" android:fillType="evenOdd" android:pathData="M145.93,100.7H74.58C74.23,100.7 73.95,100.98 73.95,101.33V118.25H145.93V100.7ZM74.58,100.41C74.07,100.41 73.66,100.82 73.66,101.33V118.54H146.21V100.41H74.58Z"/>
+
+ <path android:fillColor="#212529" android:pathData="M89.42,83.57C89.42,83.06 89.83,82.65 90.35,82.65H146.21V100.66H89.42V83.57Z"/>
+
+ <path android:fillColor="#FF6A75" android:fillType="evenOdd" android:pathData="M145.93,82.94H90.35C89.99,82.94 89.71,83.22 89.71,83.57V100.37H145.93V82.94ZM90.35,82.65C89.83,82.65 89.42,83.06 89.42,83.57V100.66H146.21V82.65H90.35Z"/>
+
+ <path android:fillColor="#FF6A75" android:pathData="M129.31,83.04H146.21V134.37C146.21,135.72 145.42,136.77 144.1,136.51H95.5V118.33H112.4V100.42H129.31V83.04Z"/>
+
+ <path android:fillColor="#212529" android:fillType="evenOdd" android:pathData="M90.6,82.93L146.23,82.8L146.23,83.09L90.6,83.22L90.6,82.93Z"/>
+
+ </group>
+
+</vector>
=====================================
mobile/android/fenix/app/src/main/res/font/spacegrotesk_bold.ttf
=====================================
Binary files /dev/null and b/mobile/android/fenix/app/src/main/res/font/spacegrotesk_bold.ttf differ
=====================================
mobile/android/fenix/app/src/main/res/layout/fragment_home.xml
=====================================
@@ -53,7 +53,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
- android:layout_marginTop="18dp"
+ android:layout_marginTop="8dp"
android:layout_marginBottom="32dp"
android:clickable="false"
android:focusable="false"
@@ -134,6 +134,12 @@
</com.google.android.material.appbar.AppBarLayout>
+ <androidx.compose.ui.platform.ComposeView
+ android:id="@+id/composeYec2024"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"/>
+
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/sessionControlRecyclerView"
android:layout_width="match_parent"
=====================================
mobile/android/fenix/app/src/main/res/values/colors.xml
=====================================
@@ -382,4 +382,10 @@
<color name="connect_button_purple">#9059FF</color>
<color name="configure_connection_button_white">#E1E0E7</color>
<color name="warning_yellow">#FFA436</color>
+
+ <!-- 2024 YEC -->
+ <color name="YEC_2024_speak_purple">#D898FA</color>
+ <color name="YEC_2024_browse_green">#C1ED75</color>
+ <color name="YEC_2024_search_red">#FF6A75</color>
+
</resources>
=====================================
mobile/android/fenix/app/src/main/res/values/preference_keys.xml
=====================================
@@ -431,4 +431,5 @@
<string name="pref_key_tor_network_settings_bridges_enabled">pref_key_tor_network_settings_bridges_enabled</string>
<string name="pref_key_spoof_english" translatable="false">pref_key_spoof_english</string>
+ <string name="pref_key_yec_style_index" translatable="false">pref_key_yec_style_index</string>
</resources>
=====================================
mobile/android/fenix/app/src/main/res/values/torbrowser_strings.xml
=====================================
@@ -149,4 +149,26 @@
<string name="connection_assist_final_error_troubleshoot_connection_link">troubleshooting your connection</string>
<!-- Connection assist. -->
<string name="connection_assist_final_error_learn_more_link">Learn more</string>
+
+ <!-- 2024 YEC. -->
+ <string name="YEC_2024_right_to_speak">You have a right to SPEAK without uninvited listeners.</string>
+ <!-- 2024 YEC. -->
+ <string name="YEC_2024_right_to_BROWSE">You have a right to BROWSE without being watched.</string>
+ <!-- 2024 YEC. -->
+ <string name="YEC_2024_right_to_SEARCH">You have a right to SEARCH without being followed.</string>
+
+ <!-- 2024 YEC. -->
+ <string name="YEC_2024_donation_encouragement">Join the thousands of Tor supporters building an internet powered by privacy. Make a donation today.</string>
+
+ <!-- 2024 YEC. -->
+ <string name="YEC_2024_donation_match_text">Through December 31, your gift will be matched, up to $300,000!</string>
+
+ <!-- 2024 YEC. %1$s is the app name "Tor Browser". Since this will only ever show on release, it will always be "Tor Browser" (and not "Tor Browser Alpha" for instance) -->
+ <string name="YEC_2024_tor_browser_for_android_will_always_be_free_no_donation_required">%1$s for Android will always be free to use—no donation is required to use this app.</string>
+
+ <!-- 2024 YEC. Accessible name for the "X" button. -->
+ <string name="YEC_2024_close">Close</string>
+
+ <!-- 2024 YEC. -->
+ <string name="YEC_2024_donate_now">Donate now</string>
</resources>
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/217346c…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/217346c…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/mullvad-browser][mullvad-browser-115.16.0esr-13.5-1] fixup! Bug 4234: Use the Firefox Update Process for Base Browser.
by Pier Angelo Vendrame (@pierov) 30 Sep '24
by Pier Angelo Vendrame (@pierov) 30 Sep '24
30 Sep '24
Pier Angelo Vendrame pushed to branch mullvad-browser-115.16.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser
Commits:
4dd63a60 by Pier Angelo Vendrame at 2024-09-30T22:07:38+02:00
fixup! Bug 4234: Use the Firefox Update Process for Base Browser.
Bug 42747: Discard unsupported updates earlier.
Firefox's updater has a function to select updates, which checks mainly
the version number.
Therefore, a more recent update that is unsupported will be chosen over
a compatible one.
We patch this to be able to provide an alternative update path to
Windows 7.
- - - - -
1 changed file:
- toolkit/mozapps/update/UpdateService.sys.mjs
Changes:
=====================================
toolkit/mozapps/update/UpdateService.sys.mjs
=====================================
@@ -3680,18 +3680,20 @@ UpdateService.prototype = {
switch (aUpdate.type) {
case "major":
- if (!majorUpdate) {
+ if (!majorUpdate || majorUpdate.unsupported) {
majorUpdate = aUpdate;
} else if (
+ !aUpdate.unsupported &&
vc.compare(majorUpdate.appVersion, aUpdate.appVersion) <= 0
) {
majorUpdate = aUpdate;
}
break;
case "minor":
- if (!minorUpdate) {
+ if (!minorUpdate || minorUpdate.unsupported) {
minorUpdate = aUpdate;
} else if (
+ !aUpdate.unsupported &&
vc.compare(minorUpdate.appVersion, aUpdate.appVersion) <= 0
) {
minorUpdate = aUpdate;
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/4dd…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/4dd…
You're receiving this email because of your account on gitlab.torproject.org.
1
0