lists.torproject.org
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

tbb-commits

Thread Start a new thread
Download
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
tbb-commits@lists.torproject.org

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

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
0 0
[Git][tpo/applications/tor-browser] Pushed new tag mullvad-browser-115.16.0esr-13.5-1-build2
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
0 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

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&#39;s trailing garbage after an @import rule we throw, but we still trigger the load (that&#39;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
0 0
[Git][tpo/applications/tor-browser] Pushed new tag base-browser-115.16.0esr-13.5-1-build2
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
0 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

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&#39;s trailing garbage after an @import rule we throw, but we still trigger the load (that&#39;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
0 0
[Git][tpo/applications/tor-browser] Pushed new tag tor-browser-115.16.0esr-13.5-1-build2
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
0 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

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

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&#39;s trailing garbage after an @import rule we throw, but we still trigger the load (that&#39;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
0 0
[Git][tpo/applications/tor-browser][tor-browser-128.3.0esr-14.0-1] Bug_43099: 2024 YEC
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
0 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

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&#39;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
0 0
  • ← Newer
  • 1
  • 2
  • 3
  • 4
  • ...
  • 25
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.