Carmelo Messina 3 anni fa
parent
commit
a9fff26487
68 ha cambiato i file con 2139 aggiunte e 1344 eliminazioni
  1. 1 1
      .github/ISSUE_TEMPLATE/bug_report.yml
  2. 16 0
      CHANGELOG.md
  3. 1 3
      FAQ.md
  4. 1 1
      build/LASTCHANGE
  5. 1 1
      build/RELEASE
  6. 1 1
      build/RELEASE_COMMIT
  7. 8 7
      build/bromite_patches_list.txt
  8. 1 1
      build/patches/Add-AllowUserCertificates-flag.patch
  9. 1 1
      build/patches/Add-IsCleartextPermitted-flag.patch
  10. 1 1
      build/patches/Add-an-always-incognito-mode.patch
  11. 7 6
      build/patches/Add-bookmark-import-export-actions.patch
  12. 1 1
      build/patches/Add-custom-tab-intents-privacy-option.patch
  13. 1 1
      build/patches/Add-flag-for-omnibox-autocomplete-filtering.patch
  14. 1 1
      build/patches/Add-flag-for-save-data-header.patch
  15. 1 1
      build/patches/Add-flag-to-configure-maximum-connections-per-host.patch
  16. 1 1
      build/patches/Add-flag-to-control-video-playback-resume-feature.patch
  17. 1 1
      build/patches/Add-flag-to-disable-IPv6-probes.patch
  18. 1 1
      build/patches/Add-flag-to-disable-WebGL.patch
  19. 1 1
      build/patches/Add-flag-to-disable-external-intent-requests.patch
  20. 2 2
      build/patches/Add-flag-to-disable-vibration.patch
  21. 2 2
      build/patches/Add-history-support-in-incognito-mode.patch
  22. 1442 0
      build/patches/Add-lifetime-options-for-permissions.patch
  23. 1 1
      build/patches/Add-menu-item-to-bookmark-all-tabs.patch
  24. 1 1
      build/patches/Add-menu-item-to-view-source.patch
  25. 2 2
      build/patches/Add-option-to-force-tablet-UI.patch
  26. 1 1
      build/patches/Add-option-to-not-persist-tabs-across-sessions.patch
  27. 1 1
      build/patches/Add-option-to-use-home-page-as-NTP.patch
  28. 0 982
      build/patches/Automated-domain-substitution.patch
  29. 95 0
      build/patches/Bookmarks-select-all-menu-entry.patch
  30. 1 1
      build/patches/Bromite-AdBlockUpdaterService.patch
  31. 3 3
      build/patches/Bromite-auto-updater.patch
  32. 0 33
      build/patches/Change-default-webRTC-policy-to-not-use-any-address.patch
  33. 1 1
      build/patches/Disable-Accessibility-service-by-default.patch
  34. 1 1
      build/patches/Disable-FLoC-and-privacy-sandbox.patch
  35. 0 22
      build/patches/Disable-autofill-assistant-by-default.patch
  36. 24 0
      build/patches/Disable-crash-reporting.patch
  37. 22 5
      build/patches/Disable-safe-browsing.patch
  38. 1 1
      build/patches/Disable-safety-check.patch
  39. 2 2
      build/patches/Disable-text-fragments-by-default.patch
  40. 0 22
      build/patches/Disable-unified-autoplay-feature.patch
  41. 92 0
      build/patches/DoH-improvements.patch
  42. 0 45
      build/patches/DoH-secure-mode-by-default.patch
  43. 1 1
      build/patches/Enable-Certificate-Transparency.patch
  44. 8 8
      build/patches/Enable-native-Android-autofill.patch
  45. 3 3
      build/patches/Enable-share-intent.patch
  46. 3 3
      build/patches/Experimental-user-scripts-support.patch
  47. 12 2
      build/patches/Hide-passwords-manager-link.patch
  48. 2 2
      build/patches/History-number-of-days-privacy-setting.patch
  49. 8 6
      build/patches/Inject-scripts-for-AMP-tracking-ads-and-video.patch
  50. 1 1
      build/patches/Keep-flag-to-allow-screenshots-in-Incognito-mode.patch
  51. 1 30
      build/patches/Modify-default-preferences.patch
  52. 1 1
      build/patches/Move-some-account-settings-back-to-privacy-settings.patch
  53. 2 2
      build/patches/Multiple-fingerprinting-mitigations.patch
  54. 1 1
      build/patches/Open-YouTube-links-in-Bromite.patch
  55. 88 13
      build/patches/OpenSearch-allow-paths-and-incognito-mode.patch
  56. 65 12
      build/patches/Remove-binary-blob-integrations.patch
  57. 4 4
      build/patches/Remove-contextual-search-manager.patch
  58. 6 53
      build/patches/Remove-signin-integrations.patch
  59. 2 2
      build/patches/Restore-Search-Ready-Omnibox-flag.patch
  60. 1 1
      build/patches/Restore-Simplified-NTP-launch.patch
  61. 1 1
      build/patches/Restore-offline-indicator-v2-flag.patch
  62. 1 1
      build/patches/Revert-flags-remove-disable-pull-to-refresh-effect.patch
  63. 2 2
      build/patches/Revert-flags-remove-num-raster-threads.patch
  64. 44 0
      build/patches/Samsung-Note-9-SDK27-crazylinker-workaround.patch
  65. 6 6
      build/patches/User-agent-customization.patch
  66. 83 8
      build/patches/autofill-miscellaneous.patch
  67. 0 22
      build/patches/disable-autofill-server-communication-by-default.patch
  68. 52 0
      build/patches/webRTC-do-not-expose-local-IP-addresses.patch

+ 1 - 1
.github/ISSUE_TEMPLATE/bug_report.yml

@@ -158,7 +158,7 @@ body:
         2. Yes, I have attached the crash report dump that I downloaded from `chrome://crashes`
         2. Yes, I have attached the crash report dump that I downloaded from `chrome://crashes`
         3. Yes, I have copy/pasted the crash dump
         3. Yes, I have copy/pasted the crash dump
       placeholder: |
       placeholder: |
-        Drag the crash report dump here to attach it or paste the logcat dump individuated with `adb logcat | grep chromium`.
+        Drag the crash report dump here to attach it or paste the logcat dump individuated with `adb logcat | grep -E (bromite|chromium)`.
     validations:
     validations:
       required: true
       required: true
 
 

+ 16 - 0
CHANGELOG.md

@@ -1,3 +1,18 @@
+# 100.0.4896.83
+* update zh_CN translations (thanks to @zhmars)
+* fix custom UA reported via Javascript (thanks to @uazo, fixes https://github.com/bromite/bromite/issues/1936)
+* introduce session granularity for permissions (thanks to @uazo, fixes https://github.com/bromite/bromite/issues/1549)
+* disable crash reporting
+* avoid script injection on some sites
+* fix upstream OpenSearch bug with search engines prematurely discarded
+* fix upstream DNS bug with inconsistent Android system DNS configuration (fixes https://github.com/bromite/bromite/issues/1960)
+* use less invasive approach to protect local IP address when using webRTC (fixes https://github.com/bromite/bromite/issues/589)
+* add menu entry to select all bookmarks (fixes https://github.com/bromite/bromite/issues/1959)
+* save only ContentSettings in always-incognito mode (thanks to @uazo, fixes https://github.com/bromite/bromite/issues/1942)
+* fix Note 9 crash on startup (thanks to @uazo, fixes https://github.com/bromite/bromite/issues/1871)
+* remove passwords menu entry for leak check
+* remove privacy menu entry to use phone as a security key
+
 # 100.0.4896.57
 # 100.0.4896.57
 * allow OpenSearch search engine URLs with path
 * allow OpenSearch search engine URLs with path
 * disable AsyncDNS by default
 * disable AsyncDNS by default
@@ -7,6 +22,7 @@
 * improve description for JIT site settings (fixes https://github.com/bromite/bromite/issues/1931)
 * improve description for JIT site settings (fixes https://github.com/bromite/bromite/issues/1931)
 * remove more signin integration (fixes https://github.com/bromite/bromite/issues/1902)
 * remove more signin integration (fixes https://github.com/bromite/bromite/issues/1902)
 * miscellaneous fixes for AMP and background video playback (fixes https://github.com/bromite/bromite/issues/1921)
 * miscellaneous fixes for AMP and background video playback (fixes https://github.com/bromite/bromite/issues/1921)
+* update zh_CN translations (thanks to @zhmars)
 
 
 # 99.0.4844.77
 # 99.0.4844.77
 * fix missing adaptive icon for updates
 * fix missing adaptive icon for updates

+ 1 - 3
FAQ.md

@@ -48,9 +48,7 @@ It is not on the official F-Droid repository and there are no (more) plans to su
 You can use F-Droid client to install and receive updates via [the official Bromite F-Droid repository](https://www.bromite.org/fdroid).
 You can use F-Droid client to install and receive updates via [the official Bromite F-Droid repository](https://www.bromite.org/fdroid).
 
 
 ## Does Bromite support WebRTC?
 ## Does Bromite support WebRTC?
-Yes, since version 69. While the desktop version of Chromium has an option to disable it (video/audio site settings), the Android version cannot.
-
-The WebRTC functionality has always been using safe defaults to prevent leaks (disabled multiple routes and non-proxied UDP).
+Partially, see https://github.com/bromite/bromite/wiki/WebRTC
 
 
 ## Using Bromite will favour the monopoly of the Chromium/Blink engine, why do you develop and maintain Bromite?
 ## Using Bromite will favour the monopoly of the Chromium/Blink engine, why do you develop and maintain Bromite?
 In short, to show what a Chromium-based engine could do **for the user** if the user experience and needs were the main focus of modern browser design.
 In short, to show what a Chromium-based engine could do **for the user** if the user experience and needs were the main focus of modern browser design.

+ 1 - 1
build/LASTCHANGE

@@ -1 +1 @@
-b92e2ab3a2b6a09618543a73bb93f5f5d0576954-
+17f8da1ef67b77611d7b5bd3df25c8d47a806d40-

+ 1 - 1
build/RELEASE

@@ -1 +1 @@
-100.0.4896.57
+100.0.4896.83

+ 1 - 1
build/RELEASE_COMMIT

@@ -1 +1 @@
-0f34819c0a4181afe12f832d7248059a108e86fb
+dbf631e66a15472a4689fea5550ad16a1be64922

+ 8 - 7
build/bromite_patches_list.txt

@@ -20,7 +20,7 @@ Do-not-hide-component-extensions.patch
 Do-not-store-passwords-by-default.patch
 Do-not-store-passwords-by-default.patch
 Disable-NTP-remote-suggestions-by-default.patch
 Disable-NTP-remote-suggestions-by-default.patch
 Disable-references-to-fonts.googleapis.com.patch
 Disable-references-to-fonts.googleapis.com.patch
-Change-default-webRTC-policy-to-not-use-any-address.patch
+webRTC-do-not-expose-local-IP-addresses.patch
 Never-fetch-popular-sites.patch
 Never-fetch-popular-sites.patch
 ungoogled-chromium-Disable-webRTC-log-uploader.patch
 ungoogled-chromium-Disable-webRTC-log-uploader.patch
 ungoogled-chromium-Disable-untraceable-URLs.patch
 ungoogled-chromium-Disable-untraceable-URLs.patch
@@ -52,6 +52,7 @@ Multiple-fingerprinting-mitigations.patch
 Add-flag-to-configure-maximum-connections-per-host.patch
 Add-flag-to-configure-maximum-connections-per-host.patch
 Do-not-ignore-download-location-prompt-setting.patch
 Do-not-ignore-download-location-prompt-setting.patch
 Add-bookmark-import-export-actions.patch
 Add-bookmark-import-export-actions.patch
+Bookmarks-select-all-menu-entry.patch
 Add-an-always-incognito-mode.patch
 Add-an-always-incognito-mode.patch
 Add-history-support-in-incognito-mode.patch
 Add-history-support-in-incognito-mode.patch
 Add-option-to-not-persist-tabs-across-sessions.patch
 Add-option-to-not-persist-tabs-across-sessions.patch
@@ -68,7 +69,8 @@ dns-send-IPv6-connectivity-probes-to-RIPE-DNS.patch
 Add-flag-to-disable-IPv6-probes.patch
 Add-flag-to-disable-IPv6-probes.patch
 profile-resetter-do-not-tick-send-settings-by-default.patch
 profile-resetter-do-not-tick-send-settings-by-default.patch
 Do-not-build-API-keys-infobar.patch
 Do-not-build-API-keys-infobar.patch
-autofill-disable-autofill-download-manager.patch
+autofill-miscellaneous.patch
+Enable-native-Android-autofill.patch
 first_run-deactivate-autoupdate-globally.patch
 first_run-deactivate-autoupdate-globally.patch
 translate-disable-fetching-of-languages-from-server.patch
 translate-disable-fetching-of-languages-from-server.patch
 kill-Vision.patch
 kill-Vision.patch
@@ -101,12 +103,11 @@ Increase-number-of-autocomplete-matches-to-10.patch
 Disable-requests-for-single-word-Omnibar-searches.patch
 Disable-requests-for-single-word-Omnibar-searches.patch
 Disable-some-signed-exchange-features.patch
 Disable-some-signed-exchange-features.patch
 Add-flag-to-disable-WebGL.patch
 Add-flag-to-disable-WebGL.patch
-DoH-secure-mode-by-default.patch
+DoH-improvements.patch
 Reduce-HTTP-headers-in-DoH-requests-to-bare-minimum.patch
 Reduce-HTTP-headers-in-DoH-requests-to-bare-minimum.patch
 Revert-flags-remove-disable-pull-to-refresh-effect.patch
 Revert-flags-remove-disable-pull-to-refresh-effect.patch
 Use-dummy-DFM-installer.patch
 Use-dummy-DFM-installer.patch
 Disable-feeds-support-by-default.patch
 Disable-feeds-support-by-default.patch
-Disable-autofill-assistant-by-default.patch
 Show-site-settings-for-cookies-javascript-and-ads.patch
 Show-site-settings-for-cookies-javascript-and-ads.patch
 Disable-DRM-media-origin-IDs-preprovisioning.patch
 Disable-DRM-media-origin-IDs-preprovisioning.patch
 Disable-smart-selection-by-default.patch
 Disable-smart-selection-by-default.patch
@@ -130,10 +131,8 @@ Add-option-to-use-home-page-as-NTP.patch
 Revert-the-removal-of-an-option-to-block-autoplay.patch
 Revert-the-removal-of-an-option-to-block-autoplay.patch
 Disable-text-fragments-by-default.patch
 Disable-text-fragments-by-default.patch
 disable-WebView-variations-support.patch
 disable-WebView-variations-support.patch
-disable-autofill-server-communication-by-default.patch
 ask-permission-to-play-protected-media-by-default.patch
 ask-permission-to-play-protected-media-by-default.patch
 Enable-network-isolation-features.patch
 Enable-network-isolation-features.patch
-Disable-unified-autoplay-feature.patch
 Revert-flags-remove-num-raster-threads.patch
 Revert-flags-remove-num-raster-threads.patch
 webview-Hard-no-to-persistent-histograms.patch
 webview-Hard-no-to-persistent-histograms.patch
 Ignore-enterprise-policies-for-secure-DNS.patch
 Ignore-enterprise-policies-for-secure-DNS.patch
@@ -164,7 +163,6 @@ Enable-share-intent.patch
 Site-setting-for-images.patch
 Site-setting-for-images.patch
 Bromite-auto-updater.patch
 Bromite-auto-updater.patch
 Experimental-user-scripts-support.patch
 Experimental-user-scripts-support.patch
-Enable-native-Android-autofill.patch
 Keep-empty-tabs-between-sessions.patch
 Keep-empty-tabs-between-sessions.patch
 Disable-third-party-origin-trials.patch
 Disable-third-party-origin-trials.patch
 Never-use-HTTP-probes-for-connection-detection.patch
 Never-use-HTTP-probes-for-connection-detection.patch
@@ -189,4 +187,7 @@ Add-flag-for-save-data-header.patch
 Disable-UA-full-version.patch
 Disable-UA-full-version.patch
 Revert-Disable-Dictionary-suggestions-for-the-Omnibox.patch
 Revert-Disable-Dictionary-suggestions-for-the-Omnibox.patch
 Disable-AsyncDNS-by-default.patch
 Disable-AsyncDNS-by-default.patch
+Add-lifetime-options-for-permissions.patch
+Disable-crash-reporting.patch
 Automated-domain-substitution.patch
 Automated-domain-substitution.patch
+Samsung-Note-9-SDK27-crazylinker-workaround.patch

+ 1 - 1
build/patches/Add-AllowUserCertificates-flag.patch

@@ -49,7 +49,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/Chrom
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
-@@ -2979,7 +2979,11 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -2980,7 +2980,11 @@ const FeatureEntry kFeatureEntries[] = {
      {"enable-container-queries", flag_descriptions::kCSSContainerQueriesName,
      {"enable-container-queries", flag_descriptions::kCSSContainerQueriesName,
       flag_descriptions::kCSSContainerQueriesDescription, kOsAll,
       flag_descriptions::kCSSContainerQueriesDescription, kOsAll,
       FEATURE_VALUE_TYPE(blink::features::kCSSContainerQueries)},
       FEATURE_VALUE_TYPE(blink::features::kCSSContainerQueries)},

+ 1 - 1
build/patches/Add-IsCleartextPermitted-flag.patch

@@ -14,7 +14,7 @@ Subject: Add IsCleartextPermitted flag
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
-@@ -7948,6 +7948,10 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -7949,6 +7949,10 @@ const FeatureEntry kFeatureEntries[] = {
       flag_descriptions::kRequestDesktopSiteExceptionsName,
       flag_descriptions::kRequestDesktopSiteExceptionsName,
       flag_descriptions::kRequestDesktopSiteExceptionsDescription, kOsAndroid,
       flag_descriptions::kRequestDesktopSiteExceptionsDescription, kOsAndroid,
       FEATURE_VALUE_TYPE(features::kRequestDesktopSiteExceptions)},
       FEATURE_VALUE_TYPE(features::kRequestDesktopSiteExceptions)},

+ 1 - 1
build/patches/Add-an-always-incognito-mode.patch

@@ -672,7 +672,7 @@ diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browse
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
-@@ -1110,6 +1110,19 @@ Your Google account may have other forms of browsing history like searches and a
+@@ -1113,6 +1113,19 @@ Your Google account may have other forms of browsing history like searches and a
        <message name="IDS_CLEAR_BROWSING_HISTORY_SUMMARY_SYNCED_NO_LINK" desc="A text for the basic tab explaining browsing history for users with history sync. This version is shown when the link to MyActivity is displayed separately.">
        <message name="IDS_CLEAR_BROWSING_HISTORY_SUMMARY_SYNCED_NO_LINK" desc="A text for the basic tab explaining browsing history for users with history sync. This version is shown when the link to MyActivity is displayed separately.">
          Clears history from all synced devices.
          Clears history from all synced devices.
        </message>
        </message>

+ 7 - 6
build/patches/Add-bookmark-import-export-actions.patch

@@ -8,7 +8,7 @@ Completely remove contacts picker permission from the file dialog
 ---
 ---
  base/android/content_uri_utils.cc             |  10 +
  base/android/content_uri_utils.cc             |  10 +
  base/android/content_uri_utils.h              |   4 +
  base/android/content_uri_utils.h              |   4 +
- .../org/chromium/base/ContentUriUtils.java    |  32 ++
+ .../org/chromium/base/ContentUriUtils.java    |  33 ++
  chrome/android/java/AndroidManifest.xml       |   1 -
  chrome/android/java/AndroidManifest.xml       |   1 -
  .../res/menu/bookmark_action_bar_menu.xml     |  14 +
  .../res/menu/bookmark_action_bar_menu.xml     |  14 +
  .../browser/TabbedModeTabDelegateFactory.java |   5 +-
  .../browser/TabbedModeTabDelegateFactory.java |   5 +-
@@ -44,7 +44,7 @@ Completely remove contacts picker permission from the file dialog
  ui/shell_dialogs/select_file_dialog.h         |   2 +
  ui/shell_dialogs/select_file_dialog.h         |   2 +
  .../select_file_dialog_android.cc             |   6 +
  .../select_file_dialog_android.cc             |   6 +
  ui/shell_dialogs/select_file_dialog_android.h |   2 +
  ui/shell_dialogs/select_file_dialog_android.h |   2 +
- 38 files changed, 892 insertions(+), 29 deletions(-)
+ 38 files changed, 893 insertions(+), 29 deletions(-)
 
 
 diff --git a/base/android/content_uri_utils.cc b/base/android/content_uri_utils.cc
 diff --git a/base/android/content_uri_utils.cc b/base/android/content_uri_utils.cc
 --- a/base/android/content_uri_utils.cc
 --- a/base/android/content_uri_utils.cc
@@ -93,7 +93,7 @@ diff --git a/base/android/java/src/org/chromium/base/ContentUriUtils.java b/base
  /**
  /**
   * This class provides methods to access content URI schemes.
   * This class provides methods to access content URI schemes.
   */
   */
-@@ -89,6 +92,35 @@ public abstract class ContentUriUtils {
+@@ -89,6 +92,36 @@ public abstract class ContentUriUtils {
          return -1;
          return -1;
      }
      }
  
  
@@ -109,7 +109,7 @@ diff --git a/base/android/java/src/org/chromium/base/ContentUriUtils.java b/base
 +            client.close();
 +            client.close();
 +            return fd;
 +            return fd;
 +        } catch (Exception e) {
 +        } catch (Exception e) {
-+            Log.e(TAG, "Cannot open intermediate Uri.", e);
++            Log.e(TAG, "Cannot open intermediate URI", e);
 +        }
 +        }
 +        return -1;
 +        return -1;
 +    }
 +    }
@@ -121,7 +121,8 @@ diff --git a/base/android/java/src/org/chromium/base/ContentUriUtils.java b/base
 +            ParcelFileDescriptor pfd = resolver.openFileDescriptor(uri, "r");
 +            ParcelFileDescriptor pfd = resolver.openFileDescriptor(uri, "r");
 +            path = Os.readlink("/proc/self/fd/" + pfd.getFd());
 +            path = Os.readlink("/proc/self/fd/" + pfd.getFd());
 +            pfd.close();
 +            pfd.close();
-+        } catch (Throwable t) {
++        } catch (Exception e) {
++            Log.w(TAG, "Cannot get file path from content URI", e);
 +        }
 +        }
 +        return path;
 +        return path;
 +    }
 +    }
@@ -820,7 +821,7 @@ diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
-@@ -7993,6 +7993,12 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -7994,6 +7994,12 @@ const FeatureEntry kFeatureEntries[] = {
       FEATURE_VALUE_TYPE(features::kRequestDesktopSiteExceptions)},
       FEATURE_VALUE_TYPE(features::kRequestDesktopSiteExceptions)},
  #endif
  #endif
  
  

+ 1 - 1
build/patches/Add-custom-tab-intents-privacy-option.patch

@@ -194,7 +194,7 @@ diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabAsso
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
-@@ -4614,6 +4614,21 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
+@@ -4617,6 +4617,21 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
        <message name="IDS_NEAR_OOM_REDUCTION_DECLINE" desc="The text of the button letting the user decline the browser's intervention, so that the page can be reloaded.">
        <message name="IDS_NEAR_OOM_REDUCTION_DECLINE" desc="The text of the button letting the user decline the browser's intervention, so that the page can be reloaded.">
           Show original
           Show original
        </message>
        </message>

+ 1 - 1
build/patches/Add-flag-for-omnibox-autocomplete-filtering.patch

@@ -38,7 +38,7 @@ diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
  const FeatureEntry::FeatureParam kAdaptiveButton_AlwaysNone[] = {
  const FeatureEntry::FeatureParam kAdaptiveButton_AlwaysNone[] = {
      {"mode", "always-none"}};
      {"mode", "always-none"}};
  const FeatureEntry::FeatureParam kAdaptiveButton_AlwaysNewTab[] = {
  const FeatureEntry::FeatureParam kAdaptiveButton_AlwaysNewTab[] = {
-@@ -3616,7 +3632,11 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -3617,7 +3633,11 @@ const FeatureEntry kFeatureEntries[] = {
       kOsMac | kOsLinux | kOsWin,
       kOsMac | kOsLinux | kOsWin,
       FEATURE_VALUE_TYPE(features::kSystemNotifications)},
       FEATURE_VALUE_TYPE(features::kSystemNotifications)},
  #endif  // BUILDFLAG(ENABLE_SYSTEM_NOTIFICATIONS) && !BUILDFLAG(IS_CHROMEOS_ASH)
  #endif  // BUILDFLAG(ENABLE_SYSTEM_NOTIFICATIONS) && !BUILDFLAG(IS_CHROMEOS_ASH)

+ 1 - 1
build/patches/Add-flag-for-save-data-header.patch

@@ -14,7 +14,7 @@ Subject: Add flag for save-data-header
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
-@@ -4203,7 +4203,10 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -4204,7 +4204,10 @@ const FeatureEntry kFeatureEntries[] = {
      {"force-text-direction", flag_descriptions::kForceTextDirectionName,
      {"force-text-direction", flag_descriptions::kForceTextDirectionName,
       flag_descriptions::kForceTextDirectionDescription, kOsAll,
       flag_descriptions::kForceTextDirectionDescription, kOsAll,
       MULTI_VALUE_TYPE(kForceTextDirectionChoices)},
       MULTI_VALUE_TYPE(kForceTextDirectionChoices)},

+ 1 - 1
build/patches/Add-flag-to-configure-maximum-connections-per-host.patch

@@ -31,7 +31,7 @@ diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
  // Ensure that all effective connection types returned by Network Quality
  // Ensure that all effective connection types returned by Network Quality
  // Estimator (NQE) are also exposed via flags.
  // Estimator (NQE) are also exposed via flags.
  static_assert(net::EFFECTIVE_CONNECTION_TYPE_LAST + 2 ==
  static_assert(net::EFFECTIVE_CONNECTION_TYPE_LAST + 2 ==
-@@ -4183,6 +4188,9 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -4184,6 +4189,9 @@ const FeatureEntry kFeatureEntries[] = {
       flag_descriptions::kAndroidPictureInPictureAPIName,
       flag_descriptions::kAndroidPictureInPictureAPIName,
       flag_descriptions::kAndroidPictureInPictureAPIDescription, kOsAndroid,
       flag_descriptions::kAndroidPictureInPictureAPIDescription, kOsAndroid,
       FEATURE_VALUE_TYPE(media::kPictureInPictureAPI)},
       FEATURE_VALUE_TYPE(media::kPictureInPictureAPI)},

+ 1 - 1
build/patches/Add-flag-to-control-video-playback-resume-feature.patch

@@ -13,7 +13,7 @@ Disable it by default on Android as it is everywhere else
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
-@@ -2921,6 +2921,10 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -2922,6 +2922,10 @@ const FeatureEntry kFeatureEntries[] = {
       flag_descriptions::kWebRtcRemoteEventLogName,
       flag_descriptions::kWebRtcRemoteEventLogName,
       flag_descriptions::kWebRtcRemoteEventLogDescription, kOsDesktop,
       flag_descriptions::kWebRtcRemoteEventLogDescription, kOsDesktop,
       FEATURE_VALUE_TYPE(features::kWebRtcRemoteEventLog)},
       FEATURE_VALUE_TYPE(features::kWebRtcRemoteEventLog)},

+ 1 - 1
build/patches/Add-flag-to-disable-IPv6-probes.patch

@@ -16,7 +16,7 @@ Subject: Add flag to disable IPv6 probes
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
-@@ -5101,6 +5101,10 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -5102,6 +5102,10 @@ const FeatureEntry kFeatureEntries[] = {
      {"enable-reader-mode-in-cct", flag_descriptions::kReaderModeInCCTName,
      {"enable-reader-mode-in-cct", flag_descriptions::kReaderModeInCCTName,
       flag_descriptions::kReaderModeInCCTDescription, kOsAndroid,
       flag_descriptions::kReaderModeInCCTDescription, kOsAndroid,
       FEATURE_VALUE_TYPE(chrome::android::kReaderModeInCCT)},
       FEATURE_VALUE_TYPE(chrome::android::kReaderModeInCCT)},

+ 1 - 1
build/patches/Add-flag-to-disable-WebGL.patch

@@ -11,7 +11,7 @@ Subject: Add flag to disable WebGL
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
-@@ -2855,6 +2855,9 @@ constexpr FeatureEntry::FeatureVariation kLensStandaloneVariations[] = {
+@@ -2856,6 +2856,9 @@ constexpr FeatureEntry::FeatureVariation kLensStandaloneVariations[] = {
  // When adding a new choice, add it to the end of the list.
  // When adding a new choice, add it to the end of the list.
  const FeatureEntry kFeatureEntries[] = {
  const FeatureEntry kFeatureEntries[] = {
  // Include generated flags for flag unexpiry; see //docs/flag_expiry.md and
  // Include generated flags for flag unexpiry; see //docs/flag_expiry.md and

+ 1 - 1
build/patches/Add-flag-to-disable-external-intent-requests.patch

@@ -11,7 +11,7 @@ Subject: Add flag to disable external intent requests
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
-@@ -2909,6 +2909,9 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -2910,6 +2910,9 @@ const FeatureEntry kFeatureEntries[] = {
       flag_descriptions::kWebrtcCaptureMultiChannelApmName,
       flag_descriptions::kWebrtcCaptureMultiChannelApmName,
       flag_descriptions::kWebrtcCaptureMultiChannelApmDescription, kOsAll,
       flag_descriptions::kWebrtcCaptureMultiChannelApmDescription, kOsAll,
       FEATURE_VALUE_TYPE(features::kWebRtcEnableCaptureMultiChannelApm)},
       FEATURE_VALUE_TYPE(features::kWebRtcEnableCaptureMultiChannelApm)},

+ 2 - 2
build/patches/Add-flag-to-disable-vibration.patch

@@ -18,7 +18,7 @@ Subject: Add flag to disable vibration
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
-@@ -6454,6 +6454,10 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -6455,6 +6455,10 @@ const FeatureEntry kFeatureEntries[] = {
       FEATURE_VALUE_TYPE(features::kNewMacNotificationAPI)},
       FEATURE_VALUE_TYPE(features::kNewMacNotificationAPI)},
  #endif
  #endif
  
  
@@ -139,7 +139,7 @@ diff --git a/third_party/blink/renderer/platform/exported/web_runtime_features.c
 diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
 diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
-@@ -1639,6 +1639,10 @@
+@@ -1640,6 +1640,10 @@
        name: "OrientationEvent",
        name: "OrientationEvent",
        status: {"Android": "stable"},
        status: {"Android": "stable"},
      },
      },

+ 2 - 2
build/patches/Add-history-support-in-incognito-mode.patch

@@ -1732,7 +1732,7 @@ diff --git a/chrome/browser/ui/android/native_page/java/src/org/chromium/chrome/
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
-@@ -1123,6 +1123,12 @@ Your Google account may have other forms of browsing history like searches and a
+@@ -1126,6 +1126,12 @@ Your Google account may have other forms of browsing history like searches and a
        <message name="IDS_UI_RELAUNCH_NOTICE" desc="Summary for always incognito mode">
        <message name="IDS_UI_RELAUNCH_NOTICE" desc="Summary for always incognito mode">
          Your changes will take effect the next time you relaunch Bromite.
          Your changes will take effect the next time you relaunch Bromite.
        </message>
        </message>
@@ -1774,7 +1774,7 @@ diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
 diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
 diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
 --- a/chrome/test/BUILD.gn
 --- a/chrome/test/BUILD.gn
 +++ b/chrome/test/BUILD.gn
 +++ b/chrome/test/BUILD.gn
-@@ -5062,6 +5062,11 @@ test("unit_tests") {
+@@ -5063,6 +5063,11 @@ test("unit_tests") {
      ]
      ]
    }
    }
  
  

+ 1442 - 0
build/patches/Add-lifetime-options-for-permissions.patch

@@ -0,0 +1,1442 @@
+From: uazo <uazo@users.noreply.github.com>
+Date: Fri, 8 Apr 2022 11:04:04 +0000
+Subject: Add lifetime options for permissions
+
+Indicate the session mode for content-settings by using the constraint `content_settings::SessionModel` as
+UserSession when setting the value, and also make use of an expiration time value.
+This is used in Chromium for `ClientHints` but it is generally possible to use this functionality when a
+specific value needs to be persisted by origin.
+All content settings of this type are not saved on disk (except for the `Forever` option), allowing user to
+reset the status each time application is restarted.
+
+There are 4 main areas affected to introduce the functionality:
+* components/content_settings
+  A new `content_settings::LifetimeMode` enum value is defined to specify the user's
+  choice (Always, OnlyThisTime, UntilOriginClosed, UntilBrowserClosed).
+  Enumeration is also generated for java by adding it in `content_settings_enums_javagen` (gn).
+  This is mainly used in `content_settings_utils.cc` to create a specialised `content_settings::ContentSettingConstraints`
+  that is then used in `SetContentSettingDefaultScope()` by `PermissionContextBase::UpdateContentSetting`.
+  Existing Chromium data structures do not provide a specific property to define a choice which is instead encoded through
+  the `ContentSettingConstraints`; this approach is already used in other parts of the Chromium codebase so it is not
+  novel here.
+  Therefore, `content_settings::GetConstraintSessionExpiration()` and `content_settings::IsConstraintSessionExpiration()`
+  manage the lifetime modes of the session content-settings.
+  The modificaiton also adds the session pattern to the ContentSettingPatternSource so that it is available for the UI.
+* components/permissions
+  Lifetime support is added to the permissions; most of the changes are caused by the fact that it is necessary to report
+  the value selected by the user from the Java UI managed by `components/browser_ui` up to
+  `PermissionContextBase::UpdateContentSetting()`,   without necessarily having to modify all requests that are not
+  related to geolocation/camera/microphone. The approach used is a new
+  `PermissionRequest::PermissionDecidedCallbackWithLifetime` used by an overload of
+  `PermissionContextBase::CreatePermissionRequest` so that options are present only for the specific content-settings
+  (see `PermissionDialogModel.java`).
+  For other permissions no behaviour is changed (see `PermissionDialogDelegate::Accept`); for geolocation it was
+  necessary to act directly in the specific context, because, unlike microphone/camera, the content-setting value is
+  inserted in its specific method (`FinishNotifyPermissionSet`, that calls the callback), even if the class always
+  derives from `PermissionContextBase`.
+* components/page_info
+  Some changes needed to see in the summary of the `page_info` the text "(only this session)"
+  (aka `page_info_android_permission_session_permission`) through adding a new property "is_user_session" in
+  `PageInfoPermissionEntry` (Java).
+* components/browser_ui
+  Changes to the Settings UI to show "(only this session)" in the specific content-setting.
+  The same view is used both in the settings and in the page_info.
+
+For the management of `UntilOriginClosed` the logic used by flag `kOneTimeGeolocationPermission` was used; this flag
+is active only in the desktop (files `last_tab_standing_tracker_*`). It is a class that manages a list of the active
+origins and allows to perform operations when all the tabs relating to that origin have been closed, in this case
+deleting the session content settings of `UntilOriginClosed`.
+
+See also: https://github.com/bromite/bromite/issues/1549
+---
+ .../permissions/last_tab_standing_tracker.cc  | 33 +++++++-
+ .../permissions/last_tab_standing_tracker.h   |  4 +-
+ .../last_tab_standing_tracker_factory.cc      |  2 +-
+ ...hrome_browser_main_extra_parts_profiles.cc |  5 +-
+ chrome/browser/ui/tab_helpers.cc              |  1 +
+ .../site_settings/PermissionInfo.java         | 14 +++-
+ .../site_settings/SingleWebsiteSettings.java  | 10 +++
+ .../WebsitePreferenceBridge.java              |  6 +-
+ .../android/website_preference_bridge.cc      |  7 +-
+ .../strings/android/browser_ui_strings.grd    |  5 ++
+ components/content_settings/android/BUILD.gn  |  1 +
+ .../core/browser/content_settings_utils.cc    | 29 +++++++
+ .../core/browser/content_settings_utils.h     |  6 ++
+ .../core/browser/host_content_settings_map.cc |  2 +-
+ .../core/common/content_settings.cc           |  7 +-
+ .../core/common/content_settings.h            |  4 +-
+ .../common/content_settings_constraints.h     | 11 +++
+ .../page_info/PageInfoController.java         |  4 +-
+ .../PermissionParamsListBuilder.java          | 13 ++-
+ .../android/page_info_controller_android.cc   | 10 ++-
+ components/page_info/page_info.cc             |  2 +
+ components/page_info/page_info.h              |  1 +
+ .../permissions/PermissionDialogDelegate.java | 13 +++
+ .../permissions/PermissionDialogModel.java    | 81 ++++++++++++++++++-
+ .../android/permission_dialog_delegate.cc     | 19 +++++
+ .../android/permission_dialog_delegate.h      |  1 +
+ .../android/permission_prompt_android.cc      |  8 ++
+ .../android/permission_prompt_android.h       |  2 +
+ .../android/permissions_android_strings.grd   | 17 ++++
+ .../geolocation_permission_context_android.cc | 35 ++++++--
+ .../geolocation_permission_context_android.h  | 13 ++-
+ .../permissions/permission_context_base.cc    | 50 ++++++++++--
+ .../permissions/permission_context_base.h     | 24 +++++-
+ components/permissions/permission_prompt.h    |  3 +-
+ components/permissions/permission_request.cc  | 34 +++++++-
+ components/permissions/permission_request.h   | 17 +++-
+ .../permissions/permission_request_manager.cc | 38 ++++++---
+ .../permissions/permission_request_manager.h  | 11 ++-
+ 38 files changed, 481 insertions(+), 62 deletions(-)
+
+diff --git a/chrome/browser/permissions/last_tab_standing_tracker.cc b/chrome/browser/permissions/last_tab_standing_tracker.cc
+--- a/chrome/browser/permissions/last_tab_standing_tracker.cc
++++ b/chrome/browser/permissions/last_tab_standing_tracker.cc
+@@ -7,9 +7,35 @@
+ #include "base/observer_list.h"
+ #include "chrome/browser/profiles/profile.h"
+ #include "url/gurl.h"
++#include "components/content_settings/core/browser/host_content_settings_map.h"
++#include "components/content_settings/core/common/content_settings_utils.h"
++#include "components/permissions/permissions_client.h"
+ 
+-LastTabStandingTracker::LastTabStandingTracker() = default;
++namespace {
++  // Remove all sessions content setting by origin and type
++  void RemoveSessionSettings(HostContentSettingsMap* content_settings,
++                             const url::Origin& origin,
++                             ContentSettingsType type) {
++    ContentSettingsForOneType session_settings;
++    content_settings->GetSettingsForOneType(
++        type, &session_settings,
++        content_settings::SessionModel::UserSession);
+ 
++    GURL url = origin.GetURL();
++    for (ContentSettingPatternSource& entry : session_settings) {
++      if (content_settings::IsConstraintSessionExpiration(entry,
++              content_settings::LifetimeMode::UntilOriginClosed) &&
++          entry.primary_pattern.Matches(url)) {
++        content_settings->SetWebsiteSettingCustomScope(
++            entry.primary_pattern, entry.secondary_pattern,
++            type, base::Value());
++      }
++    }
++  }
++}
++
++LastTabStandingTracker::LastTabStandingTracker(content::BrowserContext* context)
++    : context_(context) {}
+ LastTabStandingTracker::~LastTabStandingTracker() = default;
+ 
+ void LastTabStandingTracker::Shutdown() {
+@@ -55,5 +81,10 @@ void LastTabStandingTracker::WebContentsUnloadedOrigin(
+     tab_counter_.erase(origin);
+     for (auto& observer : observer_list_)
+       observer.OnLastPageFromOriginClosed(origin);
++    HostContentSettingsMap* content_settings =
++            permissions::PermissionsClient::Get()->GetSettingsMap(context_);
++    RemoveSessionSettings(content_settings, origin, ContentSettingsType::GEOLOCATION);
++    RemoveSessionSettings(content_settings, origin, ContentSettingsType::MEDIASTREAM_MIC);
++    RemoveSessionSettings(content_settings, origin, ContentSettingsType::MEDIASTREAM_CAMERA);
+   }
+ }
+diff --git a/chrome/browser/permissions/last_tab_standing_tracker.h b/chrome/browser/permissions/last_tab_standing_tracker.h
+--- a/chrome/browser/permissions/last_tab_standing_tracker.h
++++ b/chrome/browser/permissions/last_tab_standing_tracker.h
+@@ -9,6 +9,7 @@
+ 
+ #include "base/observer_list.h"
+ #include "chrome/browser/permissions/last_tab_standing_tracker_observer.h"
++#include "chrome/browser/profiles/profile.h"
+ #include "components/keyed_service/core/keyed_service.h"
+ #include "url/origin.h"
+ 
+@@ -16,7 +17,7 @@
+ // all tabs of a particular origin have been closed or navigated away from.
+ class LastTabStandingTracker : public KeyedService {
+  public:
+-  LastTabStandingTracker();
++  explicit LastTabStandingTracker(content::BrowserContext* context);
+   ~LastTabStandingTracker() override;
+ 
+   LastTabStandingTracker(const LastTabStandingTracker&) = delete;
+@@ -33,6 +34,7 @@ class LastTabStandingTracker : public KeyedService {
+   base::ObserverList<LastTabStandingTrackerObserver> observer_list_;
+   // Tracks how many tabs of a particular origin are open at any given time.
+   std::map<url::Origin, int> tab_counter_;
++  raw_ptr<content::BrowserContext> context_;
+ };
+ 
+ #endif  // CHROME_BROWSER_PERMISSIONS_LAST_TAB_STANDING_TRACKER_H_
+diff --git a/chrome/browser/permissions/last_tab_standing_tracker_factory.cc b/chrome/browser/permissions/last_tab_standing_tracker_factory.cc
+--- a/chrome/browser/permissions/last_tab_standing_tracker_factory.cc
++++ b/chrome/browser/permissions/last_tab_standing_tracker_factory.cc
+@@ -33,7 +33,7 @@ bool LastTabStandingTrackerFactory::ServiceIsCreatedWithBrowserContext() const {
+ 
+ KeyedService* LastTabStandingTrackerFactory::BuildServiceInstanceFor(
+     content::BrowserContext* context) const {
+-  return new LastTabStandingTracker();
++  return new LastTabStandingTracker(context);
+ }
+ 
+ content::BrowserContext* LastTabStandingTrackerFactory::GetBrowserContextToUse(
+diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
+--- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
++++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
+@@ -365,10 +365,7 @@ void ChromeBrowserMainExtraPartsProfiles::
+   InstantServiceFactory::GetInstance();
+ #endif
+   LanguageModelManagerFactory::GetInstance();
+-  if (base::FeatureList::IsEnabled(
+-          permissions::features::kOneTimeGeolocationPermission)) {
+-    LastTabStandingTrackerFactory::GetInstance();
+-  }
++  LastTabStandingTrackerFactory::GetInstance();
+   login_detection::LoginDetectionKeyedServiceFactory::GetInstance();
+ #if !BUILDFLAG(IS_ANDROID)
+   LoginUIServiceFactory::GetInstance();
+diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc
+--- a/chrome/browser/ui/tab_helpers.cc
++++ b/chrome/browser/ui/tab_helpers.cc
+@@ -454,6 +454,7 @@ void TabHelpers::AttachTabHelpers(WebContents* web_contents) {
+         web_contents);
+   }
+   video_tutorials::VideoTutorialTabHelper::CreateForWebContents(web_contents);
++  LastTabStandingTrackerTabHelper::CreateForWebContents(web_contents);
+ #else
+   if (accuracy_tips::AccuracyWebContentsObserver::IsEnabled(web_contents)) {
+     accuracy_tips::AccuracyWebContentsObserver::CreateForWebContents(
+diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/PermissionInfo.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/PermissionInfo.java
+--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/PermissionInfo.java
++++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/PermissionInfo.java
+@@ -9,6 +9,7 @@ import androidx.annotation.Nullable;
+ import org.chromium.components.content_settings.ContentSettingValues;
+ import org.chromium.components.content_settings.ContentSettingsType;
+ import org.chromium.content_public.browser.BrowserContextHandle;
++import org.chromium.components.content_settings.SessionModel;
+ 
+ import java.io.Serializable;
+ 
+@@ -20,19 +21,30 @@ public class PermissionInfo implements Serializable {
+     private final String mEmbedder;
+     private final String mOrigin;
+     private final @ContentSettingsType int mContentSettingsType;
++    private final @SessionModel int mSessionModel;
+ 
+     public PermissionInfo(@ContentSettingsType int type, String origin, String embedder) {
+         this(type, origin, embedder, false);
+     }
+ 
++    public PermissionInfo(@ContentSettingsType int type, String origin, String embedder, boolean isEmbargoed) {
++        this(type, origin, embedder, isEmbargoed, 0);
++    }
++
+     public PermissionInfo(
+-            @ContentSettingsType int type, String origin, String embedder, boolean isEmbargoed) {
++            @ContentSettingsType int type, String origin, String embedder, boolean isEmbargoed,
++            @SessionModel int sessionModel) {
+         assert WebsitePermissionsFetcher.getPermissionsType(type)
+                 == WebsitePermissionsFetcher.WebsitePermissionsType.PERMISSION_INFO;
+         mOrigin = origin;
+         mEmbedder = embedder;
+         mContentSettingsType = type;
+         mIsEmbargoed = isEmbargoed;
++        mSessionModel = sessionModel;
++    }
++
++    public @SessionModel int getSessionModel() {
++        return mSessionModel;
+     }
+ 
+     public @ContentSettingsType int getContentSettingsType() {
+diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java
+--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java
++++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java
+@@ -34,6 +34,7 @@ import org.chromium.components.browser_ui.settings.ManagedPreferencesUtils;
+ import org.chromium.components.browser_ui.settings.SettingsUtils;
+ import org.chromium.components.content_settings.ContentSettingValues;
+ import org.chromium.components.content_settings.ContentSettingsType;
++import org.chromium.components.content_settings.SessionModel;
+ import org.chromium.components.embedder_support.util.Origin;
+ import org.chromium.content_public.browser.BrowserContextHandle;
+ 
+@@ -525,6 +526,11 @@ public class SingleWebsiteSettings extends SiteSettingsPreferenceFragment
+         return mSite.getPermissionInfo(type) != null && mSite.getPermissionInfo(type).isEmbargoed();
+     }
+ 
++    private boolean isSessionPermission(@ContentSettingsType int type) {
++        return mSite.getPermissionInfo(type) != null &&
++               mSite.getPermissionInfo(type).getSessionModel() == SessionModel.USER_SESSION;
++    }
++
+     private void setUpClearDataPreference() {
+         ClearWebsiteStorage preference = findPreference(PREF_CLEAR_DATA);
+         long usage = mSite.getTotalUsage();
+@@ -911,6 +917,10 @@ public class SingleWebsiteSettings extends SiteSettingsPreferenceFragment
+         if (contentType == mHighlightedPermission) {
+             switchPreference.setBackgroundColor(mHighlightColor);
+         }
++        if (isSessionPermission(contentType)) {
++            switchPreference.setSummary(switchPreference.getSummary() + " " +
++                getString(R.string.page_info_android_permission_session_permission));
++        }
+     }
+ 
+     /**
+diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsitePreferenceBridge.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsitePreferenceBridge.java
+--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsitePreferenceBridge.java
++++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsitePreferenceBridge.java
+@@ -9,6 +9,7 @@ import org.chromium.base.annotations.CalledByNative;
+ import org.chromium.base.annotations.NativeMethods;
+ import org.chromium.components.content_settings.ContentSettingValues;
+ import org.chromium.components.content_settings.ContentSettingsType;
++import org.chromium.components.content_settings.SessionModel;
+ import org.chromium.components.location.LocationUtils;
+ import org.chromium.content_public.browser.BrowserContextHandle;
+ import org.chromium.url.GURL;
+@@ -54,7 +55,8 @@ public class WebsitePreferenceBridge {
+ 
+     @CalledByNative
+     private static void insertPermissionInfoIntoList(@ContentSettingsType int type,
+-            ArrayList<PermissionInfo> list, String origin, String embedder, boolean isEmbargoed) {
++            ArrayList<PermissionInfo> list, String origin, String embedder, boolean isEmbargoed,
++            @SessionModel int sessionModel) {
+         if (type == ContentSettingsType.MEDIASTREAM_CAMERA
+                 || type == ContentSettingsType.MEDIASTREAM_MIC) {
+             for (PermissionInfo info : list) {
+@@ -63,7 +65,7 @@ public class WebsitePreferenceBridge {
+                 }
+             }
+         }
+-        list.add(new PermissionInfo(type, origin, embedder, isEmbargoed));
++        list.add(new PermissionInfo(type, origin, embedder, isEmbargoed, sessionModel));
+     }
+ 
+     @CalledByNative
+diff --git a/components/browser_ui/site_settings/android/website_preference_bridge.cc b/components/browser_ui/site_settings/android/website_preference_bridge.cc
+--- a/components/browser_ui/site_settings/android/website_preference_bridge.cc
++++ b/components/browser_ui/site_settings/android/website_preference_bridge.cc
+@@ -112,7 +112,8 @@ typedef void (*InfoListInsertionFunction)(
+     const base::android::JavaRef<jobject>&,
+     const base::android::JavaRef<jstring>&,
+     const base::android::JavaRef<jstring>&,
+-    jboolean);
++    jboolean,
++    JniIntWrapper);
+ 
+ void GetOrigins(JNIEnv* env,
+                 const JavaParamRef<jobject>& jbrowser_context_handle,
+@@ -153,7 +154,7 @@ void GetOrigins(JNIEnv* env,
+     seen_origins.push_back(origin);
+     insertionFunc(env, static_cast<int>(content_type), list,
+                   ConvertOriginToJavaString(env, origin), jembedder,
+-                  /*is_embargoed=*/false);
++                  /*is_embargoed=*/false, static_cast<int>(settings_it.session_model));
+   }
+ 
+   // Add any origins which have a default content setting value (thus skipped
+@@ -176,7 +177,7 @@ void GetOrigins(JNIEnv* env,
+       seen_origins.push_back(origin);
+       insertionFunc(env, static_cast<int>(content_type), list,
+                     ConvertOriginToJavaString(env, origin), jembedder,
+-                    /*is_embargoed=*/true);
++                    /*is_embargoed=*/true, 0);
+     }
+   }
+ }
+diff --git a/components/browser_ui/strings/android/browser_ui_strings.grd b/components/browser_ui/strings/android/browser_ui_strings.grd
+--- a/components/browser_ui/strings/android/browser_ui_strings.grd
++++ b/components/browser_ui/strings/android/browser_ui_strings.grd
+@@ -580,6 +580,11 @@
+       <message name="IDS_PAGE_INFO_URL_TRUNCATED" desc="Accessibility announcement when the URL in PageInfo switches from full to truncated display">
+         URL truncated
+       </message>
++      <message name="IDS_PAGE_INFO_ANDROID_PERMISSION_SESSION_PERMISSION"
++               desc="The label used in the About Page dialog to indicate a session permission">
++        (only this session)
++      </message>
++
+       <message name="IDS_PAGE_INFO_AD_PERSONALIZATION_TITLE" desc="The title of the 'Ad personalization' section in Page Info.">
+           Ad personalization
+       </message>
+diff --git a/components/content_settings/android/BUILD.gn b/components/content_settings/android/BUILD.gn
+--- a/components/content_settings/android/BUILD.gn
++++ b/components/content_settings/android/BUILD.gn
+@@ -57,6 +57,7 @@ java_cpp_enum("content_settings_enums_javagen") {
+     "../core/common/content_settings_types.h",
+     "../core/common/cookie_controls_enforcement.h",
+     "../core/common/cookie_controls_status.h",
++    "../core/common/content_settings_constraints.h",
+   ]
+   visibility = [ ":*" ]  # Depend on through :content_settings_enums_java
+ }
+diff --git a/components/content_settings/core/browser/content_settings_utils.cc b/components/content_settings/core/browser/content_settings_utils.cc
+--- a/components/content_settings/core/browser/content_settings_utils.cc
++++ b/components/content_settings/core/browser/content_settings_utils.cc
+@@ -185,4 +185,33 @@ base::Time GetConstraintExpiration(const base::TimeDelta duration) {
+   return base::Time::Now() + duration;
+ }
+ 
++ContentSettingConstraints GetConstraintSessionExpiration(LifetimeMode lifetime_mode) {
++  if (lifetime_mode == LifetimeMode::OnlyThisTime) {
++    // note: this content settings will be discarded immediately
++    // 1h is used as a magic constant to identify the one-time lifetime mode
++    return {base::Time() + base::Hours(1), content_settings::SessionModel::UserSession};
++  } else if (lifetime_mode == LifetimeMode::UntilOriginClosed) {
++    return {base::Time::Now() + base::Hours(24), content_settings::SessionModel::UserSession};
++  } else {
++    return {base::Time(), content_settings::SessionModel::UserSession};
++  }
++}
++
++bool IsConstraintSessionExpiration(const ContentSettingPatternSource& source,
++                                   LifetimeMode lifetime_mode) {
++  if (source.session_model != content_settings::SessionModel::UserSession)
++    return false;
++
++  LifetimeMode type;
++  if (source.expiration == base::Time()) {
++    type = LifetimeMode::UntilBrowserClosed;
++  } else if (source.expiration == (base::Time() + base::Hours(1))) {
++    type = LifetimeMode::OnlyThisTime;
++  } else {
++    type = LifetimeMode::UntilOriginClosed;
++  }
++
++  return lifetime_mode == type;
++}
++
+ }  // namespace content_settings
+diff --git a/components/content_settings/core/browser/content_settings_utils.h b/components/content_settings/core/browser/content_settings_utils.h
+--- a/components/content_settings/core/browser/content_settings_utils.h
++++ b/components/content_settings/core/browser/content_settings_utils.h
+@@ -73,6 +73,12 @@ bool IsConstraintPersistent(const ContentSettingConstraints& constraints);
+ // Returns the expiration time for a supplied |duration|.
+ base::Time GetConstraintExpiration(const base::TimeDelta duration);
+ 
++ContentSettingConstraints GetConstraintSessionExpiration(LifetimeMode lifetime_mode);
++
++bool IsConstraintSessionExpiration(
++    const ContentSettingPatternSource& source,
++    LifetimeMode lifetime_mode);
++
+ }  // namespace content_settings
+ 
+ #endif  // COMPONENTS_CONTENT_SETTINGS_CORE_BROWSER_CONTENT_SETTINGS_UTILS_H_
+diff --git a/components/content_settings/core/browser/host_content_settings_map.cc b/components/content_settings/core/browser/host_content_settings_map.cc
+--- a/components/content_settings/core/browser/host_content_settings_map.cc
++++ b/components/content_settings/core/browser/host_content_settings_map.cc
+@@ -821,7 +821,7 @@ void HostContentSettingsMap::AddSettingsForOneType(
+     settings->emplace_back(rule.primary_pattern, rule.secondary_pattern,
+                            std::move(value),
+                            kProviderNamesSourceMap[provider_type].provider_name,
+-                           incognito, rule.expiration);
++                           incognito, rule.expiration, rule.session_model);
+   }
+ }
+ 
+diff --git a/components/content_settings/core/common/content_settings.cc b/components/content_settings/core/common/content_settings.cc
+--- a/components/content_settings/core/common/content_settings.cc
++++ b/components/content_settings/core/common/content_settings.cc
+@@ -146,13 +146,15 @@ ContentSettingPatternSource::ContentSettingPatternSource(
+     base::Value setting_value,
+     const std::string& source,
+     bool incognito,
+-    base::Time expiration)
++    base::Time expiration,
++    content_settings::SessionModel session_model)
+     : primary_pattern(primary_pattern),
+       secondary_pattern(secondary_pattern),
+       setting_value(std::move(setting_value)),
+       expiration(expiration),
+       source(source),
+-      incognito(incognito) {}
++      incognito(incognito),
++      session_model(session_model) {}
+ 
+ ContentSettingPatternSource::ContentSettingPatternSource() : incognito(false) {}
+ 
+@@ -169,6 +171,7 @@ ContentSettingPatternSource& ContentSettingPatternSource::operator=(
+   expiration = other.expiration;
+   source = other.source;
+   incognito = other.incognito;
++  session_model = other.session_model;
+   return *this;
+ }
+ 
+diff --git a/components/content_settings/core/common/content_settings.h b/components/content_settings/core/common/content_settings.h
+--- a/components/content_settings/core/common/content_settings.h
++++ b/components/content_settings/core/common/content_settings.h
+@@ -49,7 +49,8 @@ struct ContentSettingPatternSource {
+                               base::Value setting_value,
+                               const std::string& source,
+                               bool incognito,
+-                              base::Time expiration = base::Time());
++                              base::Time expiration = base::Time(),
++                              content_settings::SessionModel session_model = content_settings::SessionModel::Durable);
+   ContentSettingPatternSource(const ContentSettingPatternSource& other);
+   ContentSettingPatternSource();
+   ContentSettingPatternSource& operator=(
+@@ -64,6 +65,7 @@ struct ContentSettingPatternSource {
+   base::Time expiration;
+   std::string source;
+   bool incognito;
++  content_settings::SessionModel session_model;
+ };
+ 
+ typedef std::vector<ContentSettingPatternSource> ContentSettingsForOneType;
+diff --git a/components/content_settings/core/common/content_settings_constraints.h b/components/content_settings/core/common/content_settings_constraints.h
+--- a/components/content_settings/core/common/content_settings_constraints.h
++++ b/components/content_settings/core/common/content_settings_constraints.h
+@@ -18,6 +18,8 @@ namespace content_settings {
+ //              regardless of expiry date, if set.
+ // OneTime:     Settings will persist for the current "tab session", meaning
+ //              until the last tab from the origin is closed.
++// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.content_settings
++// GENERATED_JAVA_CLASS_NAME_OVERRIDE: SessionModel
+ enum class SessionModel {
+   Durable = 0,
+   UserSession = 1,
+@@ -25,6 +27,15 @@ enum class SessionModel {
+   kMaxValue = OneTime,
+ };
+ 
++// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.content_settings
++// GENERATED_JAVA_CLASS_NAME_OVERRIDE: LifetimeMode
++enum class LifetimeMode {
++  Always = 99,
++  OnlyThisTime = 1,
++  UntilOriginClosed = 2,
++  UntilBrowserClosed = 0,
++};
++
+ // Constraints to be applied when setting a content setting.
+ struct ContentSettingConstraints {
+   // Specification of an |expiration| provides an upper bound on the time a
+diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java
+--- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java
++++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java
+@@ -378,9 +378,9 @@ public class PageInfoController implements PageInfoMainController, ModalDialogPr
+      */
+     @CalledByNative
+     private void addPermissionSection(String name, String nameMidSentence, int type,
+-            @ContentSettingValues int currentSettingValue) {
++            @ContentSettingValues int currentSettingValue, boolean is_user_session) {
+         mPermissionParamsListBuilder.addPermissionEntry(
+-                name, nameMidSentence, type, currentSettingValue);
++                name, nameMidSentence, type, currentSettingValue, is_user_session);
+     }
+ 
+     /**
+diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PermissionParamsListBuilder.java b/components/page_info/android/java/src/org/chromium/components/page_info/PermissionParamsListBuilder.java
+--- a/components/page_info/android/java/src/org/chromium/components/page_info/PermissionParamsListBuilder.java
++++ b/components/page_info/android/java/src/org/chromium/components/page_info/PermissionParamsListBuilder.java
+@@ -44,8 +44,9 @@ public class PermissionParamsListBuilder {
+     }
+ 
+     public void addPermissionEntry(
+-            String name, String nameMidSentence, int type, @ContentSettingValues int value) {
+-        mEntries.add(new PageInfoPermissionEntry(name, nameMidSentence, type, value));
++            String name, String nameMidSentence, int type, @ContentSettingValues int value,
++            boolean is_user_session) {
++        mEntries.add(new PageInfoPermissionEntry(name, nameMidSentence, type, value, is_user_session));
+     }
+ 
+     public void clearPermissionEntries() {
+@@ -86,6 +87,10 @@ public class PermissionParamsListBuilder {
+                     permissionParams.warningTextResource =
+                             R.string.page_info_android_permission_blocked;
+                 }
++                if (permission.is_user_session) {
++                    permissionParams.warningTextResource =
++                            R.string.page_info_android_permission_session_permission;
++                }
+             }
+         }
+ 
+@@ -123,13 +128,15 @@ public class PermissionParamsListBuilder {
+         public final String nameMidSentence;
+         public final int type;
+         public final @ContentSettingValues int setting;
++        public final boolean is_user_session;
+ 
+         PageInfoPermissionEntry(
+-                String name, String nameMidSentence, int type, @ContentSettingValues int setting) {
++                String name, String nameMidSentence, int type, @ContentSettingValues int setting, boolean is_user_session) {
+             this.name = name;
+             this.nameMidSentence = nameMidSentence;
+             this.type = type;
+             this.setting = setting;
++            this.is_user_session = is_user_session;
+         }
+ 
+         @Override
+diff --git a/components/page_info/android/page_info_controller_android.cc b/components/page_info/android/page_info_controller_android.cc
+--- a/components/page_info/android/page_info_controller_android.cc
++++ b/components/page_info/android/page_info_controller_android.cc
+@@ -157,6 +157,8 @@ void PageInfoControllerAndroid::SetPermissionInfo(
+ 
+   std::map<ContentSettingsType, ContentSetting>
+       user_specified_settings_to_display;
++  std::map<ContentSettingsType, bool>
++      user_specified_settings_is_user_session;
+ 
+   for (const auto& permission : permission_info_list) {
+     if (base::Contains(permissions_to_display, permission.type)) {
+@@ -165,6 +167,8 @@ void PageInfoControllerAndroid::SetPermissionInfo(
+       if (setting_to_display) {
+         user_specified_settings_to_display[permission.type] =
+             *setting_to_display;
++        user_specified_settings_is_user_session[permission.type] =
++            permission.is_user_session;
+       }
+     }
+   }
+@@ -181,7 +185,8 @@ void PageInfoControllerAndroid::SetPermissionInfo(
+           ConvertUTF16ToJavaString(env, setting_title),
+           ConvertUTF16ToJavaString(env, setting_title_mid_sentence),
+           static_cast<jint>(permission),
+-          static_cast<jint>(user_specified_settings_to_display[permission]));
++          static_cast<jint>(user_specified_settings_to_display[permission]),
++          user_specified_settings_is_user_session[permission]);
+     }
+   }
+ 
+@@ -194,7 +199,8 @@ void PageInfoControllerAndroid::SetPermissionInfo(
+         env, controller_jobject_, ConvertUTF16ToJavaString(env, object_title),
+         ConvertUTF16ToJavaString(env, object_title),
+         static_cast<jint>(chosen_object->ui_info.content_settings_type),
+-        static_cast<jint>(CONTENT_SETTING_ALLOW));
++        static_cast<jint>(CONTENT_SETTING_ALLOW),
++        /* is_user_session */ false);
+   }
+ 
+   Java_PageInfoController_updatePermissionDisplay(env, controller_jobject_);
+diff --git a/components/page_info/page_info.cc b/components/page_info/page_info.cc
+--- a/components/page_info/page_info.cc
++++ b/components/page_info/page_info.cc
+@@ -979,6 +979,8 @@ void PageInfo::PresentSitePermissions() {
+     permission_info.source = info.source;
+     permission_info.is_one_time =
+         (info.session_model == content_settings::SessionModel::OneTime);
++    permission_info.is_user_session =
++        (info.session_model == content_settings::SessionModel::UserSession);
+ 
+     if (info.primary_pattern == ContentSettingsPattern::Wildcard() &&
+         info.secondary_pattern == ContentSettingsPattern::Wildcard()) {
+diff --git a/components/page_info/page_info.h b/components/page_info/page_info.h
+--- a/components/page_info/page_info.h
++++ b/components/page_info/page_info.h
+@@ -173,6 +173,7 @@ class PageInfo {
+     content_settings::SettingSource source =
+         content_settings::SETTING_SOURCE_NONE;
+     bool is_one_time = false;
++    bool is_user_session = false;
+   };
+ 
+   // Creates a PageInfo for the passed |url| using the given |ssl| status
+diff --git a/components/permissions/android/java/src/org/chromium/components/permissions/PermissionDialogDelegate.java b/components/permissions/android/java/src/org/chromium/components/permissions/PermissionDialogDelegate.java
+--- a/components/permissions/android/java/src/org/chromium/components/permissions/PermissionDialogDelegate.java
++++ b/components/permissions/android/java/src/org/chromium/components/permissions/PermissionDialogDelegate.java
+@@ -8,6 +8,7 @@ import org.chromium.base.annotations.CalledByNative;
+ import org.chromium.base.annotations.JNINamespace;
+ import org.chromium.base.annotations.NativeMethods;
+ import org.chromium.ui.base.WindowAndroid;
++import org.chromium.components.content_settings.LifetimeMode;
+ 
+ /**
+  * Delegate class for modal permission dialogs. Contains all of the data displayed in a prompt,
+@@ -43,6 +44,9 @@ public class PermissionDialogDelegate {
+     /** The {@link ContentSettingsType}s requested in this dialog.  */
+     private int[] mContentSettingsTypes;
+ 
++    /** Lifetime option selected by the user. */
++    private int mSelectedLifetimeOption = LifetimeMode.ALWAYS;
++
+     public WindowAndroid getWindow() {
+         return mWindow;
+     }
+@@ -72,6 +76,15 @@ public class PermissionDialogDelegate {
+         PermissionDialogDelegateJni.get().accept(mNativeDelegatePtr, PermissionDialogDelegate.this);
+     }
+ 
++    public void setSelectedLifetimeOption(int idx) {
++        mSelectedLifetimeOption = idx;
++    }
++
++    @CalledByNative
++    public int getSelectedLifetimeOption() {
++        return mSelectedLifetimeOption;
++    }
++
+     public void onCancel() {
+         assert mNativeDelegatePtr != 0;
+         PermissionDialogDelegateJni.get().cancel(mNativeDelegatePtr, PermissionDialogDelegate.this);
+diff --git a/components/permissions/android/java/src/org/chromium/components/permissions/PermissionDialogModel.java b/components/permissions/android/java/src/org/chromium/components/permissions/PermissionDialogModel.java
+--- a/components/permissions/android/java/src/org/chromium/components/permissions/PermissionDialogModel.java
++++ b/components/permissions/android/java/src/org/chromium/components/permissions/PermissionDialogModel.java
+@@ -16,6 +16,17 @@ import org.chromium.ui.LayoutInflaterUtils;
+ import org.chromium.ui.modaldialog.ModalDialogProperties;
+ import org.chromium.ui.modelutil.PropertyModel;
+ 
++import java.util.Arrays;
++import java.util.List;
++import android.view.ViewGroup.LayoutParams;
++import android.widget.LinearLayout;
++import android.widget.RadioButton;
++import android.widget.RadioGroup;
++import org.chromium.base.ApiCompatibilityUtils;
++import org.chromium.ui.base.ViewUtils;
++import org.chromium.components.content_settings.ContentSettingsType;
++import org.chromium.components.content_settings.LifetimeMode;
++
+ /**
+  * This class creates the model for permission dialog.
+  */
+@@ -34,7 +45,7 @@ class PermissionDialogModel {
+         TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(
+                 messageTextView, delegate.getDrawableId(), 0, 0, 0);
+ 
+-        return new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS)
++        PropertyModel pm = new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS)
+                 .with(ModalDialogProperties.CONTROLLER, controller)
+                 .with(ModalDialogProperties.CUSTOM_VIEW, customView)
+                 .with(ModalDialogProperties.POSITIVE_BUTTON_TEXT, delegate.getPrimaryButtonText())
+@@ -43,6 +54,74 @@ class PermissionDialogModel {
+                 .with(ModalDialogProperties.FILTER_TOUCH_FOR_SECURITY, true)
+                 .with(ModalDialogProperties.TOUCH_FILTERED_CALLBACK, touchFilteredCallback)
+                 .build();
++
++        int[] types = delegate.getContentSettingsTypes();
++        if (contains(types, ContentSettingsType.GEOLOCATION) ||
++            contains(types, ContentSettingsType.MEDIASTREAM_MIC) ||
++            contains(types, ContentSettingsType.MEDIASTREAM_CAMERA))
++        {
++            LinearLayout layout = (LinearLayout) customView;
++
++            // Create a text label before the lifetime selector.
++            TextView lifetimeOptionsText = new TextView(context);
++            lifetimeOptionsText.setText(context.getString(
++                        org.chromium.components.permissions.R.string.session_permissions_title));
++            ApiCompatibilityUtils.setTextAppearance(
++                    lifetimeOptionsText, R.style.TextAppearance_TextMedium_Primary);
++
++            LinearLayout.LayoutParams lifetimeOptionsTextLayoutParams =
++                    new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
++            lifetimeOptionsTextLayoutParams.setMargins(0, 0, 0, ViewUtils.dpToPx(context, 8));
++            lifetimeOptionsText.setLayoutParams(lifetimeOptionsTextLayoutParams);
++            layout.addView(lifetimeOptionsText);
++
++            // Create radio buttons with lifetime options.
++            RadioGroup radioGroup = new RadioGroup(context);
++
++            RadioButton radioButon = new RadioButton(context);
++            radioButon.setText(context.getString(
++                        org.chromium.components.permissions.R.string.session_permissions_only_this_this));
++            radioButon.setId(LifetimeMode.ONLY_THIS_TIME);
++            radioGroup.addView(radioButon);
++
++            radioButon = new RadioButton(context);
++            radioButon.setText(context.getString(
++                        org.chromium.components.permissions.R.string.session_permissions_until_page_close));
++            radioButon.setId(LifetimeMode.UNTIL_ORIGIN_CLOSED);
++            radioGroup.addView(radioButon);
++
++            radioButon = new RadioButton(context);
++            radioButon.setText(context.getString(
++                        org.chromium.components.permissions.R.string.session_permissions_until_browser_close));
++            radioButon.setId(LifetimeMode.UNTIL_BROWSER_CLOSED);
++            radioGroup.addView(radioButon);
++
++            radioButon = new RadioButton(context);
++            radioButon.setText(context.getString(
++                        org.chromium.components.permissions.R.string.session_permissions_forever));
++            radioButon.setId(LifetimeMode.ALWAYS);
++            radioGroup.addView(radioButon);
++
++            radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
++                @Override
++                public void onCheckedChanged(RadioGroup group, int checkedId) {
++                    delegate.setSelectedLifetimeOption(checkedId);
++                }
++            });
++            radioGroup.check(1);
++            layout.addView(radioGroup);
++        }
++
++        return pm;
++    }
++
++    private static boolean contains(final int[] array, final int key) {
++        int length = array.length;
++        for(int i = 0; i < length; i++) {
++            if (array[i] == key)
++                return true;
++        }
++        return false;
+     }
+ 
+     private static View loadDialogView(Context context) {
+diff --git a/components/permissions/android/permission_dialog_delegate.cc b/components/permissions/android/permission_dialog_delegate.cc
+--- a/components/permissions/android/permission_dialog_delegate.cc
++++ b/components/permissions/android/permission_dialog_delegate.cc
+@@ -67,6 +67,11 @@ void PermissionDialogJavaDelegate::DismissDialog() {
+   Java_PermissionDialogDelegate_dismissFromNative(env, j_delegate_);
+ }
+ 
++int PermissionDialogJavaDelegate::GetSelectedLifetimeOption() {
++  JNIEnv* env = base::android::AttachCurrentThread();
++  return Java_PermissionDialogDelegate_getSelectedLifetimeOption(env, j_delegate_);
++}
++
+ // static
+ void PermissionDialogDelegate::Create(
+     content::WebContents* web_contents,
+@@ -95,12 +100,26 @@ PermissionDialogDelegate* PermissionDialogDelegate::CreateForTesting(
+ void PermissionDialogDelegate::Accept(JNIEnv* env,
+                                       const JavaParamRef<jobject>& obj) {
+   DCHECK(permission_prompt_);
++  content_settings::LifetimeMode lifetimeOption =
++    static_cast<content_settings::LifetimeMode>(
++      java_delegate_->GetSelectedLifetimeOption());
++  if (lifetimeOption != content_settings::LifetimeMode::Always) {
++    permission_prompt_->AcceptThisTime(lifetimeOption);
++    return;
++  }
+   permission_prompt_->Accept();
+ }
+ 
+ void PermissionDialogDelegate::Cancel(JNIEnv* env,
+                                       const JavaParamRef<jobject>& obj) {
+   DCHECK(permission_prompt_);
++  content_settings::LifetimeMode lifetimeOption =
++    static_cast<content_settings::LifetimeMode>(
++      java_delegate_->GetSelectedLifetimeOption());
++  if (lifetimeOption != content_settings::LifetimeMode::Always) {
++    permission_prompt_->DenyThisTime(lifetimeOption);
++    return;
++  }
+   permission_prompt_->Deny();
+ }
+ 
+diff --git a/components/permissions/android/permission_dialog_delegate.h b/components/permissions/android/permission_dialog_delegate.h
+--- a/components/permissions/android/permission_dialog_delegate.h
++++ b/components/permissions/android/permission_dialog_delegate.h
+@@ -35,6 +35,7 @@ class PermissionDialogJavaDelegate {
+                                   PermissionDialogDelegate* owner);
+   virtual void CreateDialog();
+   virtual void DismissDialog();
++  virtual int GetSelectedLifetimeOption();
+ 
+  private:
+   base::android::ScopedJavaGlobalRef<jobject> j_delegate_;
+diff --git a/components/permissions/android/permission_prompt_android.cc b/components/permissions/android/permission_prompt_android.cc
+--- a/components/permissions/android/permission_prompt_android.cc
++++ b/components/permissions/android/permission_prompt_android.cc
+@@ -83,6 +83,14 @@ void PermissionPromptAndroid::Accept() {
+   delegate_->Accept();
+ }
+ 
++void PermissionPromptAndroid::AcceptThisTime(content_settings::LifetimeMode lifetimeOption) {
++  delegate_->AcceptThisTime(lifetimeOption);
++}
++
++void PermissionPromptAndroid::DenyThisTime(content_settings::LifetimeMode lifetimeOption) {
++  delegate_->DenyThisTime(lifetimeOption);
++}
++
+ void PermissionPromptAndroid::Deny() {
+   delegate_->Deny();
+ }
+diff --git a/components/permissions/android/permission_prompt_android.h b/components/permissions/android/permission_prompt_android.h
+--- a/components/permissions/android/permission_prompt_android.h
++++ b/components/permissions/android/permission_prompt_android.h
+@@ -50,7 +50,9 @@ class PermissionPromptAndroid : public permissions::PermissionPrompt,
+ 
+   void Closing();
+   void Accept();
++  void AcceptThisTime(content_settings::LifetimeMode lifetimeOption);
+   void Deny();
++  void DenyThisTime(content_settings::LifetimeMode lifetimeOption);
+   void SetManageClicked();
+   void SetLearnMoreClicked();
+   bool ShouldCurrentRequestUseQuietUI();
+diff --git a/components/permissions/android/permissions_android_strings.grd b/components/permissions/android/permissions_android_strings.grd
+--- a/components/permissions/android/permissions_android_strings.grd
++++ b/components/permissions/android/permissions_android_strings.grd
+@@ -260,6 +260,23 @@
+         Unknown or unsupported device (<ph name="DEVICE_ID">%1$s<ex>A1:B2:C3:D4:E5:F6</ex></ph>)
+       </message>
+ 
++      <!-- Session permissions -->
++      <message name="IDS_SESSION_PERMISSIONS_TITLE" desc="Title for the session section in the permission request">
++        Remeber my decision
++      </message>
++      <message name="IDS_SESSION_PERMISSIONS_ONLY_THIS_THIS" desc="Message indicating that the permission is only for this time">
++        Only this time
++      </message>
++      <message name="IDS_SESSION_PERMISSIONS_UNTIL_PAGE_CLOSE" desc="Message indicating that the permission is deleted after navigating away from the page">
++        Until all pages of this origin are closed
++      </message>
++      <message name="IDS_SESSION_PERMISSIONS_UNTIL_BROWSER_CLOSE" desc="Message indicating that the permission is for the session only">
++        Until Bromite is closed
++      </message>
++      <message name="IDS_SESSION_PERMISSIONS_FOREVER" desc="Message indicating that the permission is for all sessions">
++        Forever
++      </message>
++
+       <!-- Item Chooser UI strings -->
+       <message name="IDS_ITEM_CHOOSER_ITEM_NAME_WITH_ID" desc="To distinguish items with the same name, the item chooser shows the item name with id.">
+         <ph name="ITEM_NAME">%1$s<ex>item_name</ex></ph> (<ph name="ITEM_ID">%2$s<ex>item id</ex></ph>)
+diff --git a/components/permissions/contexts/geolocation_permission_context_android.cc b/components/permissions/contexts/geolocation_permission_context_android.cc
+--- a/components/permissions/contexts/geolocation_permission_context_android.cc
++++ b/components/permissions/contexts/geolocation_permission_context_android.cc
+@@ -158,6 +158,19 @@ void GeolocationPermissionContextAndroid::NotifyPermissionSet(
+     ContentSetting content_setting,
+     bool is_one_time) {
+   DCHECK(!is_one_time);
++  NotifyPermissionSetWithLifetime(id, requesting_origin, embedding_origin,
++    std::move(callback), persist, content_setting, is_one_time,
++    content_settings::LifetimeMode::Always);
++}
++
++void GeolocationPermissionContextAndroid::NotifyPermissionSetWithLifetime(
++    const PermissionRequestID& id,
++    const GURL& requesting_origin,
++    const GURL& embedding_origin,
++    BrowserPermissionCallback callback,
++    bool persist,
++    ContentSetting content_setting,
++    bool is_one_time, content_settings::LifetimeMode lifetime_option) {
+   bool is_default_search = IsRequestingOriginDSE(requesting_origin);
+   if (content_setting == CONTENT_SETTING_ALLOW &&
+       !location_settings_->IsSystemLocationSettingEnabled()) {
+@@ -170,7 +183,8 @@ void GeolocationPermissionContextAndroid::NotifyPermissionSet(
+     if (IsInLocationSettingsBackOff(is_default_search)) {
+       FinishNotifyPermissionSet(id, requesting_origin, embedding_origin,
+                                 std::move(callback), false /* persist */,
+-                                CONTENT_SETTING_BLOCK);
++                                CONTENT_SETTING_BLOCK,
++                                is_one_time, lifetime_option);
+       LogLocationSettingsMetric(
+           kLocationSettingsSuppressMetricBase, is_default_search,
+           LocationSettingsBackOffLevel(is_default_search));
+@@ -195,7 +209,8 @@ void GeolocationPermissionContextAndroid::NotifyPermissionSet(
+         !location_settings_dialog_callback_.is_null()) {
+       FinishNotifyPermissionSet(id, requesting_origin, embedding_origin,
+                                 std::move(callback), false /* persist */,
+-                                CONTENT_SETTING_BLOCK);
++                                CONTENT_SETTING_BLOCK,
++                                is_one_time, lifetime_option);
+       // This case should be very rare, so just pretend it was a denied prompt
+       // for metrics purposes.
+       LogLocationSettingsMetric(
+@@ -212,12 +227,13 @@ void GeolocationPermissionContextAndroid::NotifyPermissionSet(
+         base::BindOnce(
+             &GeolocationPermissionContextAndroid::OnLocationSettingsDialogShown,
+             weak_factory_.GetWeakPtr(), requesting_origin, embedding_origin,
+-            persist, content_setting));
++            persist, content_setting, is_one_time, lifetime_option));
+     return;
+   }
+ 
+   FinishNotifyPermissionSet(id, requesting_origin, embedding_origin,
+-                            std::move(callback), persist, content_setting);
++                            std::move(callback), persist, content_setting,
++                            is_one_time, lifetime_option);
+ }
+ 
+ PermissionResult
+@@ -384,6 +400,7 @@ void GeolocationPermissionContextAndroid::OnLocationSettingsDialogShown(
+     const GURL& embedding_origin,
+     bool persist,
+     ContentSetting content_setting,
++    bool is_one_time, content_settings::LifetimeMode lifetime_option,
+     LocationSettingsDialogOutcome prompt_outcome) {
+   bool is_default_search = IsRequestingOriginDSE(requesting_origin);
+   if (prompt_outcome == GRANTED) {
+@@ -411,7 +428,8 @@ void GeolocationPermissionContextAndroid::OnLocationSettingsDialogShown(
+ 
+   FinishNotifyPermissionSet(
+       location_settings_dialog_request_id_, requesting_origin, embedding_origin,
+-      std::move(location_settings_dialog_callback_), persist, content_setting);
++      std::move(location_settings_dialog_callback_), persist, content_setting,
++      is_one_time, lifetime_option);
+ 
+   location_settings_dialog_request_id_ =
+       PermissionRequestID(0, 0, PermissionRequestID::RequestLocalId());
+@@ -423,10 +441,11 @@ void GeolocationPermissionContextAndroid::FinishNotifyPermissionSet(
+     const GURL& embedding_origin,
+     BrowserPermissionCallback callback,
+     bool persist,
+-    ContentSetting content_setting) {
+-  GeolocationPermissionContext::NotifyPermissionSet(
++    ContentSetting content_setting,
++    bool is_one_time, content_settings::LifetimeMode lifetime_option) {
++  GeolocationPermissionContext::NotifyPermissionSetWithLifetime(
+       id, requesting_origin, embedding_origin, std::move(callback), persist,
+-      content_setting, /*is_one_time=*/false);
++      content_setting, is_one_time, lifetime_option);
+ }
+ 
+ void GeolocationPermissionContextAndroid::SetLocationSettingsForTesting(
+diff --git a/components/permissions/contexts/geolocation_permission_context_android.h b/components/permissions/contexts/geolocation_permission_context_android.h
+--- a/components/permissions/contexts/geolocation_permission_context_android.h
++++ b/components/permissions/contexts/geolocation_permission_context_android.h
+@@ -88,6 +88,14 @@ class GeolocationPermissionContextAndroid
+                            bool persist,
+                            ContentSetting content_setting,
+                            bool is_one_time) override;
++  void NotifyPermissionSetWithLifetime(const PermissionRequestID& id,
++                           const GURL& requesting_origin,
++                           const GURL& embedding_origin,
++                           BrowserPermissionCallback callback,
++                           bool persist,
++                           ContentSetting content_setting,
++                           bool is_one_time,
++                           content_settings::LifetimeMode lifetime_option) override;
+   PermissionResult UpdatePermissionStatusWithDeviceStatus(
+       PermissionResult result,
+       const GURL& requesting_origin,
+@@ -130,6 +138,7 @@ class GeolocationPermissionContextAndroid
+       const GURL& embedding_origin,
+       bool persist,
+       ContentSetting content_setting,
++      bool is_one_time, content_settings::LifetimeMode lifetime_option,
+       LocationSettingsDialogOutcome prompt_outcome);
+ 
+   void FinishNotifyPermissionSet(const PermissionRequestID& id,
+@@ -137,7 +146,9 @@ class GeolocationPermissionContextAndroid
+                                  const GURL& embedding_origin,
+                                  BrowserPermissionCallback callback,
+                                  bool persist,
+-                                 ContentSetting content_setting);
++                                 ContentSetting content_setting,
++                                 bool is_one_time,
++                                 content_settings::LifetimeMode lifetime_option);
+ 
+   std::unique_ptr<LocationSettings> location_settings_;
+ 
+diff --git a/components/permissions/permission_context_base.cc b/components/permissions/permission_context_base.cc
+--- a/components/permissions/permission_context_base.cc
++++ b/components/permissions/permission_context_base.cc
+@@ -242,6 +242,20 @@ PermissionContextBase::CreatePermissionRequest(
+       std::move(delete_callback));
+ }
+ 
++std::unique_ptr<PermissionRequest>
++PermissionContextBase::CreatePermissionRequest(
++    const GURL& request_origin,
++    ContentSettingsType content_settings_type,
++    bool has_gesture,
++    content::WebContents* web_contents,
++    PermissionRequest::PermissionDecidedCallbackWithLifetime permission_decided_callback,
++    base::OnceClosure delete_callback) const {
++  return std::make_unique<PermissionRequest>(
++      request_origin, ContentSettingsTypeToRequestType(content_settings_type),
++      has_gesture, std::move(permission_decided_callback),
++      std::move(delete_callback));
++}
++
+ PermissionResult PermissionContextBase::GetPermissionStatus(
+     content::RenderFrameHost* render_frame_host,
+     const GURL& requesting_origin,
+@@ -434,7 +448,8 @@ void PermissionContextBase::PermissionDecided(
+     const GURL& embedding_origin,
+     BrowserPermissionCallback callback,
+     ContentSetting content_setting,
+-    bool is_one_time) {
++    bool is_one_time,
++    content_settings::LifetimeMode lifetime_option) {
+   DCHECK(content_setting == CONTENT_SETTING_ALLOW ||
+          content_setting == CONTENT_SETTING_BLOCK ||
+          content_setting == CONTENT_SETTING_DEFAULT);
+@@ -442,9 +457,9 @@ void PermissionContextBase::PermissionDecided(
+                              content_setting);
+ 
+   bool persist = content_setting != CONTENT_SETTING_DEFAULT;
+-  NotifyPermissionSet(id, requesting_origin, embedding_origin,
++  NotifyPermissionSetWithLifetime(id, requesting_origin, embedding_origin,
+                       std::move(callback), persist, content_setting,
+-                      is_one_time);
++                      is_one_time, lifetime_option);
+ }
+ 
+ content::BrowserContext* PermissionContextBase::browser_context() const {
+@@ -494,11 +509,26 @@ void PermissionContextBase::NotifyPermissionSet(
+     bool persist,
+     ContentSetting content_setting,
+     bool is_one_time) {
++  DCHECK(is_one_time == false);
++  NotifyPermissionSetWithLifetime(id, requesting_origin, embedding_origin, std::move(callback),
++     persist, content_setting, is_one_time,
++     content_settings::LifetimeMode::Always);
++}
++
++void PermissionContextBase::NotifyPermissionSetWithLifetime(
++    const PermissionRequestID& id,
++    const GURL& requesting_origin,
++    const GURL& embedding_origin,
++    BrowserPermissionCallback callback,
++    bool persist,
++    ContentSetting content_setting,
++    bool is_one_time,
++    content_settings::LifetimeMode lifetime_option) {
+   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ 
+   if (persist) {
+     UpdateContentSetting(requesting_origin, embedding_origin, content_setting,
+-                         is_one_time);
++                         is_one_time, lifetime_option);
+   }
+ 
+   UpdateTabContext(id, requesting_origin,
+@@ -519,6 +549,15 @@ void PermissionContextBase::UpdateContentSetting(const GURL& requesting_origin,
+                                                  const GURL& embedding_origin,
+                                                  ContentSetting content_setting,
+                                                  bool is_one_time) {
++  UpdateContentSetting(requesting_origin, embedding_origin, content_setting,
++    is_one_time, content_settings::LifetimeMode::Always);
++}
++
++void PermissionContextBase::UpdateContentSetting(const GURL& requesting_origin,
++                                                 const GURL& embedding_origin,
++                                                 ContentSetting content_setting,
++                                                 bool is_one_time,
++                                                 content_settings::LifetimeMode lifetime_option) {
+   DCHECK_EQ(requesting_origin, requesting_origin.DeprecatedGetOriginAsURL());
+   DCHECK_EQ(embedding_origin, embedding_origin.DeprecatedGetOriginAsURL());
+   DCHECK(content_setting == CONTENT_SETTING_ALLOW ||
+@@ -530,8 +569,7 @@ void PermissionContextBase::UpdateContentSetting(const GURL& requesting_origin,
+       ->SetContentSettingDefaultScope(
+           requesting_origin, embedding_origin, content_settings_type_,
+           content_setting,
+-          is_one_time ? Constraints{base::Time(),
+-                                    content_settings::SessionModel::OneTime}
++          is_one_time ? content_settings::GetConstraintSessionExpiration(lifetime_option)
+                       : Constraints());
+ }
+ 
+diff --git a/components/permissions/permission_context_base.h b/components/permissions/permission_context_base.h
+--- a/components/permissions/permission_context_base.h
++++ b/components/permissions/permission_context_base.h
+@@ -143,6 +143,14 @@ class PermissionContextBase : public KeyedService,
+ 
+   // Updates stored content setting if persist is set, updates tab indicators
+   // and runs the callback to finish the request.
++  virtual void NotifyPermissionSetWithLifetime(const PermissionRequestID& id,
++                                   const GURL& requesting_origin,
++                                   const GURL& embedding_origin,
++                                   BrowserPermissionCallback callback,
++                                   bool persist,
++                                   ContentSetting content_setting,
++                                   bool is_one_time,
++                                   content_settings::LifetimeMode lifetime_option);
+   virtual void NotifyPermissionSet(const PermissionRequestID& id,
+                                    const GURL& requesting_origin,
+                                    const GURL& embedding_origin,
+@@ -163,6 +171,11 @@ class PermissionContextBase : public KeyedService,
+   // Store the decided permission as a content setting.
+   // virtual since the permission might be stored with different restrictions
+   // (for example for desktop notifications).
++  void UpdateContentSetting(const GURL& requesting_origin,
++                                    const GURL& embedding_origin,
++                                    ContentSetting content_setting,
++                                    bool is_one_time,
++                                    content_settings::LifetimeMode lifetime_option);
+   virtual void UpdateContentSetting(const GURL& requesting_origin,
+                                     const GURL& embedding_origin,
+                                     ContentSetting content_setting,
+@@ -195,6 +208,14 @@ class PermissionContextBase : public KeyedService,
+       PermissionRequest::PermissionDecidedCallback permission_decided_callback,
+       base::OnceClosure delete_callback) const;
+ 
++  virtual std::unique_ptr<PermissionRequest> CreatePermissionRequest(
++      const GURL& request_origin,
++      ContentSettingsType content_settings_type,
++      bool has_gesture,
++      content::WebContents* web_contents,
++      PermissionRequest::PermissionDecidedCallbackWithLifetime permission_decided_callback,
++      base::OnceClosure delete_callback) const;
++
+   ContentSettingsType content_settings_type() const {
+     return content_settings_type_;
+   }
+@@ -221,7 +242,8 @@ class PermissionContextBase : public KeyedService,
+                          const GURL& embedding_origin,
+                          BrowserPermissionCallback callback,
+                          ContentSetting content_setting,
+-                         bool is_one_time);
++                         bool is_one_time,
++                         content_settings::LifetimeMode lifetime_option);
+ 
+   raw_ptr<content::BrowserContext> browser_context_;
+   const ContentSettingsType content_settings_type_;
+diff --git a/components/permissions/permission_prompt.h b/components/permissions/permission_prompt.h
+--- a/components/permissions/permission_prompt.h
++++ b/components/permissions/permission_prompt.h
+@@ -59,8 +59,9 @@ class PermissionPrompt {
+     virtual GURL GetEmbeddingOrigin() const = 0;
+ 
+     virtual void Accept() = 0;
+-    virtual void AcceptThisTime() = 0;
++    virtual void AcceptThisTime(content_settings::LifetimeMode lifetime_option) = 0;
+     virtual void Deny() = 0;
++    virtual void DenyThisTime(content_settings::LifetimeMode lifetime_option) = 0;
+     virtual void Dismiss() = 0;
+     virtual void Ignore() = 0;
+ 
+diff --git a/components/permissions/permission_request.cc b/components/permissions/permission_request.cc
+--- a/components/permissions/permission_request.cc
++++ b/components/permissions/permission_request.cc
+@@ -30,6 +30,18 @@ PermissionRequest::PermissionRequest(
+       permission_decided_callback_(std::move(permission_decided_callback)),
+       delete_callback_(std::move(delete_callback)) {}
+ 
++PermissionRequest::PermissionRequest(
++    const GURL& requesting_origin,
++    RequestType request_type,
++    bool has_gesture,
++    PermissionDecidedCallbackWithLifetime permission_decided_callback,
++    base::OnceClosure delete_callback)
++    : requesting_origin_(requesting_origin),
++      request_type_(request_type),
++      has_gesture_(has_gesture),
++      permission_decided_callback_withlifetime_(std::move(permission_decided_callback)),
++      delete_callback_(std::move(delete_callback)) {}
++
+ PermissionRequest::~PermissionRequest() {
+   DCHECK(delete_callback_.is_null());
+ }
+@@ -237,17 +249,35 @@ std::u16string PermissionRequest::GetMessageTextFragment() const {
+ }
+ #endif
+ 
+-void PermissionRequest::PermissionGranted(bool is_one_time) {
++void PermissionRequest::PermissionGranted(bool is_one_time,
++                            content_settings::LifetimeMode lifetime_option) {
++  if (permission_decided_callback_withlifetime_) {
++    std::move(permission_decided_callback_withlifetime_)
++        .Run(CONTENT_SETTING_ALLOW, is_one_time, lifetime_option);
++    return;
++  }
+   std::move(permission_decided_callback_)
+       .Run(CONTENT_SETTING_ALLOW, is_one_time);
+ }
+ 
+-void PermissionRequest::PermissionDenied() {
++void PermissionRequest::PermissionDenied(bool is_one_time,
++                            content_settings::LifetimeMode lifetime_option) {
++  if (permission_decided_callback_withlifetime_) {
++    std::move(permission_decided_callback_withlifetime_)
++        .Run(CONTENT_SETTING_BLOCK, is_one_time, lifetime_option);
++    return;
++  }
+   std::move(permission_decided_callback_)
+       .Run(CONTENT_SETTING_BLOCK, /*is_one_time=*/false);
+ }
+ 
+ void PermissionRequest::Cancelled() {
++  if (permission_decided_callback_withlifetime_) {
++    std::move(permission_decided_callback_withlifetime_)
++        .Run(CONTENT_SETTING_DEFAULT, false,
++             content_settings::LifetimeMode::Always);
++    return;
++  }
+   std::move(permission_decided_callback_)
+       .Run(CONTENT_SETTING_DEFAULT, /*is_one_time=*/false);
+ }
+diff --git a/components/permissions/permission_request.h b/components/permissions/permission_request.h
+--- a/components/permissions/permission_request.h
++++ b/components/permissions/permission_request.h
+@@ -39,6 +39,10 @@ class PermissionRequest {
+   using PermissionDecidedCallback =
+       base::OnceCallback<void(ContentSetting /*result*/, bool /*is_one_time*/)>;
+ 
++  using PermissionDecidedCallbackWithLifetime =
++      base::OnceCallback<void(ContentSetting /*result*/, bool /*is_one_time*/,
++        content_settings::LifetimeMode /*lifetime_option*/)>;
++
+   // `permission_decided_callback` is called when the permission request is
+   // resolved by the user (see comment on PermissionDecidedCallback above).
+   // `delete_callback` is called when the permission request is no longer needed
+@@ -54,6 +58,12 @@ class PermissionRequest {
+                     PermissionDecidedCallback permission_decided_callback,
+                     base::OnceClosure delete_callback);
+ 
++  PermissionRequest(const GURL& requesting_origin,
++                    RequestType request_type,
++                    bool has_gesture,
++                    PermissionDecidedCallbackWithLifetime permission_decided_callback,
++                    base::OnceClosure delete_callback);
++
+   PermissionRequest(const PermissionRequest&) = delete;
+   PermissionRequest& operator=(const PermissionRequest&) = delete;
+ 
+@@ -97,10 +107,10 @@ class PermissionRequest {
+   // If |is_one_time| is true the permission will last until all tabs of
+   // |origin| are closed or navigated away from, and then the permission will
+   // automatically expire after 1 day.
+-  void PermissionGranted(bool is_one_time);
++  void PermissionGranted(bool is_one_time, content_settings::LifetimeMode lifetime_option);
+ 
+   // Called when the user has denied the requested permission.
+-  void PermissionDenied();
++  void PermissionDenied(bool is_one_time, content_settings::LifetimeMode lifetime_option);
+ 
+   // Called when the user has cancelled the permission request. This
+   // corresponds to a denial, but is segregated in case the context needs to
+@@ -138,6 +148,9 @@ class PermissionRequest {
+   // Called once a decision is made about the permission.
+   PermissionDecidedCallback permission_decided_callback_;
+ 
++  // Called once a decision is made about the permission (with lifetime option).
++  PermissionDecidedCallbackWithLifetime permission_decided_callback_withlifetime_;
++
+   // Called when the request is no longer in use so it can be deleted by the
+   // caller.
+   base::OnceClosure delete_callback_;
+diff --git a/components/permissions/permission_request_manager.cc b/components/permissions/permission_request_manager.cc
+--- a/components/permissions/permission_request_manager.cc
++++ b/components/permissions/permission_request_manager.cc
+@@ -156,7 +156,7 @@ void PermissionRequestManager::AddRequest(
+ 
+   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+           switches::kDenyPermissionPrompts)) {
+-    request->PermissionDenied();
++    request->PermissionDenied(/*is_one_time*/false, content_settings::LifetimeMode::Always);
+     request->RequestFinished();
+     return;
+   }
+@@ -210,7 +210,7 @@ void PermissionRequestManager::AddRequest(
+   if (auto_approval_origin) {
+     if (url::Origin::Create(request->requesting_origin()) ==
+         auto_approval_origin.value()) {
+-      request->PermissionGranted(/*is_one_time=*/false);
++      request->PermissionGranted(/*is_one_time=*/false, content_settings::LifetimeMode::Always);
+     }
+     request->RequestFinished();
+     return;
+@@ -469,12 +469,13 @@ void PermissionRequestManager::Accept() {
+   for (requests_iter = requests_.begin(); requests_iter != requests_.end();
+        requests_iter++) {
+     PermissionGrantedIncludingDuplicates(*requests_iter,
+-                                         /*is_one_time=*/false);
++                                         /*is_one_time=*/false,
++                                         content_settings::LifetimeMode::Always);
+   }
+   FinalizeCurrentRequests(PermissionAction::GRANTED);
+ }
+ 
+-void PermissionRequestManager::AcceptThisTime() {
++void PermissionRequestManager::AcceptThisTime(content_settings::LifetimeMode mode) {
+   if (ignore_callbacks_from_prompt_)
+     return;
+   DCHECK(view_);
+@@ -482,12 +483,22 @@ void PermissionRequestManager::AcceptThisTime() {
+   for (requests_iter = requests_.begin(); requests_iter != requests_.end();
+        requests_iter++) {
+     PermissionGrantedIncludingDuplicates(*requests_iter,
+-                                         /*is_one_time=*/true);
++                                         /*is_one_time=*/true,
++                                         mode);
+   }
+   FinalizeCurrentRequests(PermissionAction::GRANTED_ONCE);
+ }
+ 
+ void PermissionRequestManager::Deny() {
++  Deny_(/*is_one_time*/ false, content_settings::LifetimeMode::Always);
++}
++
++void PermissionRequestManager::DenyThisTime(content_settings::LifetimeMode mode) {
++  Deny_(/*is_one_time*/ true, mode);
++}
++
++void PermissionRequestManager::Deny_(bool is_one_time,
++                                     content_settings::LifetimeMode lifetime_option) {
+   if (ignore_callbacks_from_prompt_)
+     return;
+   DCHECK(view_);
+@@ -509,7 +520,7 @@ void PermissionRequestManager::Deny() {
+   std::vector<PermissionRequest*>::iterator requests_iter;
+   for (requests_iter = requests_.begin(); requests_iter != requests_.end();
+        requests_iter++) {
+-    PermissionDeniedIncludingDuplicates(*requests_iter);
++    PermissionDeniedIncludingDuplicates(*requests_iter, is_one_time, lifetime_option);
+   }
+   FinalizeCurrentRequests(PermissionAction::DENIED);
+ }
+@@ -858,25 +869,26 @@ PermissionRequest* PermissionRequestManager::GetExistingRequest(
+ 
+ void PermissionRequestManager::PermissionGrantedIncludingDuplicates(
+     PermissionRequest* request,
+-    bool is_one_time) {
++    bool is_one_time, content_settings::LifetimeMode lifetime_option) {
+   DCHECK_EQ(1, base::STLCount(requests_, request) +
+                    base::STLCount(queued_requests_, request))
+       << "Only requests in [queued_[frame_]]requests_ can have duplicates";
+-  request->PermissionGranted(is_one_time);
++  request->PermissionGranted(is_one_time, lifetime_option);
+   auto range = duplicate_requests_.equal_range(request);
+   for (auto it = range.first; it != range.second; ++it)
+-    it->second->PermissionGranted(is_one_time);
++    it->second->PermissionGranted(is_one_time, lifetime_option);
+ }
+ 
+ void PermissionRequestManager::PermissionDeniedIncludingDuplicates(
+-    PermissionRequest* request) {
++    PermissionRequest* request, bool is_one_time,
++    content_settings::LifetimeMode lifetime_option) {
+   DCHECK_EQ(1, base::STLCount(requests_, request) +
+                    base::STLCount(queued_requests_, request))
+       << "Only requests in [queued_]requests_ can have duplicates";
+-  request->PermissionDenied();
++  request->PermissionDenied(is_one_time, lifetime_option);
+   auto range = duplicate_requests_.equal_range(request);
+   for (auto it = range.first; it != range.second; ++it)
+-    it->second->PermissionDenied();
++    it->second->PermissionDenied(is_one_time, lifetime_option);
+ }
+ 
+ void PermissionRequestManager::CancelledIncludingDuplicates(
+@@ -1044,7 +1056,7 @@ void PermissionRequestManager::LogWarningToConsole(const char* message) {
+ void PermissionRequestManager::DoAutoResponseForTesting() {
+   switch (auto_response_for_test_) {
+     case ACCEPT_ONCE:
+-      AcceptThisTime();
++      AcceptThisTime(content_settings::LifetimeMode::Always);
+       break;
+     case ACCEPT_ALL:
+       Accept();
+diff --git a/components/permissions/permission_request_manager.h b/components/permissions/permission_request_manager.h
+--- a/components/permissions/permission_request_manager.h
++++ b/components/permissions/permission_request_manager.h
+@@ -136,8 +136,10 @@ class PermissionRequestManager
+   GURL GetRequestingOrigin() const override;
+   GURL GetEmbeddingOrigin() const override;
+   void Accept() override;
+-  void AcceptThisTime() override;
++  void AcceptThisTime(content_settings::LifetimeMode lifetime_option) override;
+   void Deny() override;
++  void Deny_(bool is_one_time, content_settings::LifetimeMode lifetime_option);
++  void DenyThisTime(content_settings::LifetimeMode lifetime_option) override;
+   void Dismiss() override;
+   void Ignore() override;
+   bool WasCurrentRequestAlreadyDisplayed() override;
+@@ -268,9 +270,12 @@ class PermissionRequestManager
+ 
+   // Calls PermissionGranted on a request and all its duplicates.
+   void PermissionGrantedIncludingDuplicates(PermissionRequest* request,
+-                                            bool is_one_time);
++                                            bool is_one_time,
++                                            content_settings::LifetimeMode lifetime_option);
+   // Calls PermissionDenied on a request and all its duplicates.
+-  void PermissionDeniedIncludingDuplicates(PermissionRequest* request);
++  void PermissionDeniedIncludingDuplicates(PermissionRequest* request,
++                                           bool is_one_time,
++                                           content_settings::LifetimeMode lifetime_option);
+   // Calls Cancelled on a request and all its duplicates.
+   void CancelledIncludingDuplicates(PermissionRequest* request);
+   // Calls RequestFinished on a request and all its duplicates.
+--
+2.25.1

+ 1 - 1
build/patches/Add-menu-item-to-bookmark-all-tabs.patch

@@ -349,7 +349,7 @@ diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browse
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
-@@ -3396,6 +3396,9 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
+@@ -3405,6 +3405,9 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
        <message name="IDS_MENU_TRACK_PRICES" desc="Menu item for tracking prices on tabs. [CHAR_LIMIT=27]">
        <message name="IDS_MENU_TRACK_PRICES" desc="Menu item for tracking prices on tabs. [CHAR_LIMIT=27]">
          Track prices
          Track prices
        </message>
        </message>

+ 1 - 1
build/patches/Add-menu-item-to-view-source.patch

@@ -110,7 +110,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/Cust
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
-@@ -302,6 +302,10 @@ CHAR_LIMIT guidelines:
+@@ -305,6 +305,10 @@ CHAR_LIMIT guidelines:
          Chrome tips
          Chrome tips
        </message>
        </message>
  
  

+ 2 - 2
build/patches/Add-option-to-force-tablet-UI.patch

@@ -52,7 +52,7 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
-@@ -1344,6 +1344,12 @@ Your Google account may have other forms of browsing history like searches and a
+@@ -1353,6 +1353,12 @@ Your Google account may have other forms of browsing history like searches and a
        <message name="IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_SEVEN" desc="Seventh bullet point that describes the details of the Safe Browsing control.">
        <message name="IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_SEVEN" desc="Seventh bullet point that describes the details of the Safe Browsing control.">
          Temporarily links this data to your Google Account when you’re signed in, to protect you across Google apps
          Temporarily links this data to your Google Account when you’re signed in, to protect you across Google apps
        </message>
        </message>
@@ -173,7 +173,7 @@ diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/c
 diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn
 diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn
 --- a/ui/android/BUILD.gn
 --- a/ui/android/BUILD.gn
 +++ b/ui/android/BUILD.gn
 +++ b/ui/android/BUILD.gn
-@@ -358,6 +358,8 @@ android_library("ui_no_recycler_view_java") {
+@@ -360,6 +360,8 @@ android_library("ui_no_recycler_view_java") {
      ":ui_java_resources",
      ":ui_java_resources",
      ":ui_utils_java",
      ":ui_utils_java",
      "//base:base_java",
      "//base:base_java",

+ 1 - 1
build/patches/Add-option-to-not-persist-tabs-across-sessions.patch

@@ -96,7 +96,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/privacy/setting
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
-@@ -4302,6 +4302,12 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
+@@ -4305,6 +4305,12 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
        <message name="IDS_CONTEXTMENU_IMAGE_TITLE" desc="The title of a context menu tab when the item pressed contains more than one type. This indicates that all the actions are related to the image.">
        <message name="IDS_CONTEXTMENU_IMAGE_TITLE" desc="The title of a context menu tab when the item pressed contains more than one type. This indicates that all the actions are related to the image.">
          IMAGE
          IMAGE
        </message>
        </message>

+ 1 - 1
build/patches/Add-option-to-use-home-page-as-NTP.patch

@@ -154,7 +154,7 @@ diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/bro
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
-@@ -1159,6 +1159,9 @@ Your Google account may have other forms of browsing history like searches and a
+@@ -1168,6 +1168,9 @@ Your Google account may have other forms of browsing history like searches and a
        <message name="IDS_CLEAR_BROWSING_DATA_TAB_PERIOD_HOUR" desc="The option to delete browsing data from the last hour.">
        <message name="IDS_CLEAR_BROWSING_DATA_TAB_PERIOD_HOUR" desc="The option to delete browsing data from the last hour.">
          Last hour
          Last hour
        </message>
        </message>

File diff suppressed because it is too large
+ 0 - 982
build/patches/Automated-domain-substitution.patch


+ 95 - 0
build/patches/Bookmarks-select-all-menu-entry.patch

@@ -0,0 +1,95 @@
+From: csagan5 <32685696+csagan5@users.noreply.github.com>
+Date: Sat, 9 Apr 2022 23:01:55 +0200
+Subject: Bookmarks select all menu entry
+
+---
+ .../java/res/menu/bookmark_action_bar_menu.xml    |  7 +++++++
+ .../browser/bookmarks/BookmarkActionBar.java      | 15 +++++++++++++++
+ .../ui/android/strings/android_chrome_strings.grd |  3 +++
+ 3 files changed, 25 insertions(+)
+
+diff --git a/chrome/android/java/res/menu/bookmark_action_bar_menu.xml b/chrome/android/java/res/menu/bookmark_action_bar_menu.xml
+--- a/chrome/android/java/res/menu/bookmark_action_bar_menu.xml
++++ b/chrome/android/java/res/menu/bookmark_action_bar_menu.xml
+@@ -21,6 +21,13 @@
+             android:visible="false"
+             app:showAsAction="ifRoom"
+             app:iconTint="@color/default_icon_color_secondary_tint_list" />
++        <item
++            android:id="@+id/select_all_menu_id"
++            android:icon="@drawable/ic_done_blue"
++            android:title="@string/select_all_bookmarks"
++            android:visible="true"
++            app:showAsAction="ifRoom"
++            app:iconTint="@color/default_icon_color_tint_list" />
+         <item
+             android:id="@+id/import_menu_id"
+             android:icon="@drawable/ic_folder_blue_24dp"
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkActionBar.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkActionBar.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkActionBar.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkActionBar.java
+@@ -29,6 +29,7 @@ import org.chromium.content_public.browser.LoadUrlParams;
+ import org.chromium.url.GURL;
+ 
+ import java.util.List;
++import java.util.HashSet;
+ 
+ /**
+  * Main action bar of bookmark UI. It is responsible for displaying title and buttons
+@@ -134,6 +135,17 @@ public class BookmarkActionBar extends SelectableListToolbar<BookmarkId>
+                     new TabDelegate(true), mDelegate.getModel());
+             selectionDelegate.clearSelection();
+             return true;
++        } else if (menuItem.getItemId() == R.id.select_all_menu_id) {
++            BookmarkModel bookmarkModel = mDelegate.getModel();
++            if (bookmarkModel.isBookmarkModelLoaded()) {
++                List<BookmarkItem> items = bookmarkModel.getBookmarksForFolder(mCurrentFolder.getId());
++                HashSet<BookmarkId> ids = new HashSet<>(items.size());
++                for (BookmarkItem item : items) {
++                    ids.add(item.getId());
++                }
++                selectionDelegate.setSelectedItems(ids);
++            }
++            return true;
+         }
+ 
+         assert false : "Unhandled menu click.";
+@@ -143,6 +155,7 @@ public class BookmarkActionBar extends SelectableListToolbar<BookmarkId>
+     void showLoadingUi() {
+         setTitle(null);
+         setNavigationButton(NAVIGATION_BUTTON_NONE);
++        getMenu().findItem(R.id.select_all_menu_id).setVisible(false);
+         getMenu().findItem(R.id.import_menu_id).setVisible(false);
+         getMenu().findItem(R.id.export_menu_id).setVisible(false);
+         getMenu().findItem(R.id.search_menu_id).setVisible(false);
+@@ -154,6 +167,7 @@ public class BookmarkActionBar extends SelectableListToolbar<BookmarkId>
+         super.showNormalView();
+ 
+         if (mDelegate == null) {
++            getMenu().findItem(R.id.select_all_menu_id).setVisible(false);
+             getMenu().findItem(R.id.import_menu_id).setVisible(false);
+             getMenu().findItem(R.id.export_menu_id).setVisible(false);
+             getMenu().findItem(R.id.search_menu_id).setVisible(false);
+@@ -185,6 +199,7 @@ public class BookmarkActionBar extends SelectableListToolbar<BookmarkId>
+     @Override
+     public void onFolderStateSet(BookmarkId folder) {
+         mCurrentFolder = mDelegate.getModel().getBookmarkById(folder);
++        getMenu().findItem(R.id.select_all_menu_id).setVisible(true);
+         getMenu().findItem(R.id.import_menu_id).setVisible(true);
+         getMenu().findItem(R.id.export_menu_id).setVisible(true);
+         getMenu().findItem(R.id.search_menu_id).setVisible(true);
+diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
+--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
++++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
+@@ -242,6 +242,9 @@ CHAR_LIMIT guidelines:
+       <message name="IDS_NOTIFICATION_CATEGORY_SITES" desc="Label for notifications from websites, within a list of notification categories. [CHAR_LIMIT=32]">
+         Sites
+       </message>
++      <message name="IDS_SELECT_ALL_BOOKMARKS" desc="The label for the select all bookmarks button.">
++        Select all
++      </message>
+       <message name="IDS_IMPORT_BOOKMARKS" desc="The label for the import bookmarks button.">
+         Import
+       </message>
+--
+2.25.1

+ 1 - 1
build/patches/Bromite-AdBlockUpdaterService.patch

@@ -77,7 +77,7 @@ diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_ja
 diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
 diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
 --- a/chrome/android/chrome_java_sources.gni
 --- a/chrome/android/chrome_java_sources.gni
 +++ b/chrome/android/chrome_java_sources.gni
 +++ b/chrome/android/chrome_java_sources.gni
-@@ -900,6 +900,8 @@ chrome_java_sources = [
+@@ -902,6 +902,8 @@ chrome_java_sources = [
    "java/src/org/chromium/chrome/browser/permissions/PermissionSettingsBridge.java",
    "java/src/org/chromium/chrome/browser/permissions/PermissionSettingsBridge.java",
    "java/src/org/chromium/chrome/browser/permissions/PermissionUpdateRequester.java",
    "java/src/org/chromium/chrome/browser/permissions/PermissionUpdateRequester.java",
    "java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceImpl.java",
    "java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceImpl.java",

+ 3 - 3
build/patches/Bromite-auto-updater.patch

@@ -1555,7 +1555,7 @@ diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/f
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
-@@ -1825,6 +1825,12 @@ Your Google account may have other forms of browsing history like searches and a
+@@ -1834,6 +1834,12 @@ Your Google account may have other forms of browsing history like searches and a
        <message name="IDS_DEPRECATION_WARNING" desc="Warning about Chrome updates no longer being supported">
        <message name="IDS_DEPRECATION_WARNING" desc="Warning about Chrome updates no longer being supported">
          Chrome updates are no longer supported for this version of Android
          Chrome updates are no longer supported for this version of Android
        </message>
        </message>
@@ -1568,7 +1568,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro
  
  
        <!-- Account management UI strings. -->
        <!-- Account management UI strings. -->
        <message name="IDS_ACCOUNT_MANAGEMENT_TITLE" desc="Header title for the account management screen. [CHAR_LIMIT=32]">
        <message name="IDS_ACCOUNT_MANAGEMENT_TITLE" desc="Header title for the account management screen. [CHAR_LIMIT=32]">
-@@ -3312,7 +3318,10 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
+@@ -3321,7 +3327,10 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
  
  
        <!-- Main menu items -->
        <!-- Main menu items -->
        <message name="IDS_MENU_UPDATE" desc="Menu item for updating chrome. [CHAR_LIMIT=24]">
        <message name="IDS_MENU_UPDATE" desc="Menu item for updating chrome. [CHAR_LIMIT=24]">
@@ -1580,7 +1580,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro
        </message>
        </message>
        <message name="IDS_MENU_UPDATE_SUMMARY_DEFAULT" desc="Summary string for update menu item explaining that a newer version of Chrome is available. [CHAR_LIMIT=30]">
        <message name="IDS_MENU_UPDATE_SUMMARY_DEFAULT" desc="Summary string for update menu item explaining that a newer version of Chrome is available. [CHAR_LIMIT=30]">
          Newer version is available
          Newer version is available
-@@ -3323,6 +3332,18 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
+@@ -3332,6 +3341,18 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
        <message name="IDS_MENU_UPDATE_UNSUPPORTED_SUMMARY_DEFAULT" desc="Summary string for update menu item explaining that the Android version on the device is unsupported. [CHAR_LIMIT=30]">
        <message name="IDS_MENU_UPDATE_UNSUPPORTED_SUMMARY_DEFAULT" desc="Summary string for update menu item explaining that the Android version on the device is unsupported. [CHAR_LIMIT=30]">
          Android version is unsupported
          Android version is unsupported
        </message>
        </message>

+ 0 - 33
build/patches/Change-default-webRTC-policy-to-not-use-any-address.patch

@@ -1,33 +0,0 @@
-From: csagan5 <32685696+csagan5@users.noreply.github.com>
-Date: Sat, 9 May 2020 14:42:37 +0200
-Subject: Change default webRTC policy to not use any address
-
-This prevents leakage of the local IP address.
-
-See also: https://github.com/bromite/bromite/issues/553
----
- .../peerconnection/peer_connection_dependency_factory.cc   | 7 ++++---
- 1 file changed, 4 insertions(+), 3 deletions(-)
-
-diff --git a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc
---- a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc
-+++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc
-@@ -821,12 +821,13 @@ PeerConnectionDependencyFactory::CreatePortAllocator(
-           port_config.enable_nonproxied_udp = false;
-           break;
-         case kDefault:
--          port_config.enable_multiple_routes = true;
--          port_config.enable_nonproxied_udp = true;
-+          port_config.enable_multiple_routes = false;
-+          port_config.enable_nonproxied_udp = false;
-+          port_config.enable_default_local_candidate = false;
-           break;
-       }
- 
--      VLOG(3) << "WebRTC routing preferences: "
-+      LOG(INFO) << "WebRTC routing preferences: "
-               << "policy: " << policy
-               << ", multiple_routes: " << port_config.enable_multiple_routes
-               << ", nonproxied_udp: " << port_config.enable_nonproxied_udp
---
-2.25.1

+ 1 - 1
build/patches/Disable-Accessibility-service-by-default.patch

@@ -12,7 +12,7 @@ Subject: Disable Accessibility service by default
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
-@@ -1411,6 +1411,12 @@ Your Google account may have other forms of browsing history like searches and a
+@@ -1414,6 +1414,12 @@ Your Google account may have other forms of browsing history like searches and a
        <message name="IDS_SAFETY_CHECK_BUTTON" desc="Text for the button to start Safety check.">
        <message name="IDS_SAFETY_CHECK_BUTTON" desc="Text for the button to start Safety check.">
          Check now
          Check now
        </message>
        </message>

+ 1 - 1
build/patches/Disable-FLoC-and-privacy-sandbox.patch

@@ -100,7 +100,7 @@ diff --git a/chrome/browser/privacy_sandbox/generated_floc_pref.cc b/chrome/brow
 diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc
 diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc
 --- a/components/history/core/browser/history_backend.cc
 --- a/components/history/core/browser/history_backend.cc
 +++ b/components/history/core/browser/history_backend.cc
 +++ b/components/history/core/browser/history_backend.cc
-@@ -486,18 +486,7 @@ void HistoryBackend::SetBrowsingTopicsAllowed(ContextID context_id,
+@@ -495,18 +495,7 @@ void HistoryBackend::SetBrowsingTopicsAllowed(ContextID context_id,
    if (!visit_id)
    if (!visit_id)
      return;
      return;
  
  

+ 0 - 22
build/patches/Disable-autofill-assistant-by-default.patch

@@ -1,22 +0,0 @@
-From: csagan5 <32685696+csagan5@users.noreply.github.com>
-Date: Thu, 19 Dec 2019 21:46:10 +0100
-Subject: Disable autofill assistant by default
-
----
- .../autofill_assistant/AutofillAssistantPreferencesUtil.java    | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java
---- a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java
-+++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java
-@@ -32,7 +32,7 @@ public class AutofillAssistantPreferencesUtil {
- 
-     /** Checks whether the Autofill Assistant switch preference in settings is on. */
-     static boolean isAutofillAssistantSwitchOn() {
--        return getAssistantEnabledPreference(true);
-+        return getAssistantEnabledPreference(false);
-     }
- 
-     /** Checks whether proactive help is enabled. */
---
-2.25.1

+ 24 - 0
build/patches/Disable-crash-reporting.patch

@@ -0,0 +1,24 @@
+From: csagan5 <32685696+csagan5@users.noreply.github.com>
+Date: Sat, 9 Apr 2022 21:43:35 +0200
+Subject: Disable crash reporting
+
+---
+ content/public/common/content_features.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
+--- a/content/public/common/content_features.cc
++++ b/content/public/common/content_features.cc
+@@ -226,8 +226,8 @@ const base::Feature kCooperativeScheduling{"CooperativeScheduling",
+ 
+ // Enables crash reporting via Reporting API.
+ // https://www.w3.org/TR/reporting/#crash-report
+-const base::Feature kCrashReporting{"CrashReporting",
+-                                    base::FEATURE_ENABLED_BY_DEFAULT};
++const base::Feature kCrashReporting{"CrashReporting",                      // disabled by default on Bromite
++                                    base::FEATURE_DISABLED_BY_DEFAULT};    // ^
+ 
+ // Enables support for the `Critical-CH` response header.
+ // https://github.com/WICG/client-hints-infrastructure/blob/master/reliability.md#critical-ch
+--
+2.25.1

+ 22 - 5
build/patches/Disable-safe-browsing.patch

@@ -13,7 +13,7 @@ Disable CrowdDeny feature
  .../SafeBrowsingSettingsLauncher.java         |  8 --
  .../SafeBrowsingSettingsLauncher.java         |  8 --
  .../usage_stats/UsageStatsConsentDialog.java  |  5 --
  .../usage_stats/UsageStatsConsentDialog.java  |  5 --
  .../android/chrome_main_delegate_android.cc   |  1 +
  .../android/chrome_main_delegate_android.cc   |  1 +
- chrome/browser/BUILD.gn                       | 26 ------
+ chrome/browser/BUILD.gn                       | 28 -------
  .../tab_web_contents_delegate_android.cc      |  8 ++
  .../tab_web_contents_delegate_android.cc      |  8 ++
  chrome/browser/browser_process.h              |  7 --
  chrome/browser/browser_process.h              |  7 --
  chrome/browser/browser_process_impl.cc        | 29 -------
  chrome/browser/browser_process_impl.cc        | 29 -------
@@ -71,7 +71,7 @@ Disable CrowdDeny feature
  .../ui/webui/interstitials/interstitial_ui.cc | 12 +--
  .../ui/webui/interstitials/interstitial_ui.cc | 12 +--
  chrome/common/safe_browsing/BUILD.gn          |  7 --
  chrome/common/safe_browsing/BUILD.gn          |  7 --
  .../chrome_content_renderer_client.cc         |  2 +
  .../chrome_content_renderer_client.cc         |  2 +
- chrome/test/BUILD.gn                          |  1 -
+ chrome/test/BUILD.gn                          |  2 -
  .../installer_policies/BUILD.gn               |  2 -
  .../installer_policies/BUILD.gn               |  2 -
  .../permissions/permission_request_manager.cc |  5 +-
  .../permissions/permission_request_manager.cc |  5 +-
  .../safe_browsing/content/browser/BUILD.gn    |  1 -
  .../safe_browsing/content/browser/BUILD.gn    |  1 -
@@ -87,7 +87,7 @@ Disable CrowdDeny feature
  .../file_system_access_permission_context.h   |  6 --
  .../file_system_access_permission_context.h   |  6 --
  weblayer/BUILD.gn                             |  1 -
  weblayer/BUILD.gn                             |  1 -
  weblayer/test/BUILD.gn                        |  1 -
  weblayer/test/BUILD.gn                        |  1 -
- 81 files changed, 188 insertions(+), 692 deletions(-)
+ 81 files changed, 188 insertions(+), 695 deletions(-)
 
 
 diff --git a/chrome/android/java/res/xml/google_services_preferences.xml b/chrome/android/java/res/xml/google_services_preferences.xml
 diff --git a/chrome/android/java/res/xml/google_services_preferences.xml b/chrome/android/java/res/xml/google_services_preferences.xml
 --- a/chrome/android/java/res/xml/google_services_preferences.xml
 --- a/chrome/android/java/res/xml/google_services_preferences.xml
@@ -355,6 +355,15 @@ diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
        "download/download_dir_policy_handler.cc",
        "download/download_dir_policy_handler.cc",
        "download/download_dir_policy_handler.h",
        "download/download_dir_policy_handler.h",
        "download/download_dir_util.cc",
        "download/download_dir_util.cc",
+@@ -7673,8 +7647,6 @@ static_library("test_support") {
+     "//components/reporting/util:status_macros",
+     "//components/reporting/util:status_proto",
+     "//components/reporting/util:task_runner_context",
+-    "//components/reputation/core",
+-    "//components/reputation/core:proto",
+     "//components/safe_browsing/core/common/proto:csd_proto",
+     "//components/search_engines:test_support",
+     "//components/security_interstitials/content:security_interstitial_page",
 diff --git a/chrome/browser/android/tab_web_contents_delegate_android.cc b/chrome/browser/android/tab_web_contents_delegate_android.cc
 diff --git a/chrome/browser/android/tab_web_contents_delegate_android.cc b/chrome/browser/android/tab_web_contents_delegate_android.cc
 --- a/chrome/browser/android/tab_web_contents_delegate_android.cc
 --- a/chrome/browser/android/tab_web_contents_delegate_android.cc
 +++ b/chrome/browser/android/tab_web_contents_delegate_android.cc
 +++ b/chrome/browser/android/tab_web_contents_delegate_android.cc
@@ -1962,7 +1971,7 @@ diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/p
  #include "chrome/browser/sessions/exit_type_service.h"
  #include "chrome/browser/sessions/exit_type_service.h"
  #include "chrome/browser/sharing/sharing_service_factory.h"
  #include "chrome/browser/sharing/sharing_service_factory.h"
  #include "chrome/browser/signin/identity_manager_factory.h"
  #include "chrome/browser/signin/identity_manager_factory.h"
-@@ -627,6 +626,7 @@ void ProfileImpl::LoadPrefsForNormalStartup(bool async_prefs) {
+@@ -621,6 +620,7 @@ void ProfileImpl::LoadPrefsForNormalStartup(bool async_prefs) {
  
  
    mojo::PendingRemote<prefs::mojom::TrackedPreferenceValidationDelegate>
    mojo::PendingRemote<prefs::mojom::TrackedPreferenceValidationDelegate>
        pref_validation_delegate;
        pref_validation_delegate;
@@ -1970,7 +1979,7 @@ diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/p
    scoped_refptr<safe_browsing::SafeBrowsingService> safe_browsing_service(
    scoped_refptr<safe_browsing::SafeBrowsingService> safe_browsing_service(
        g_browser_process->safe_browsing_service());
        g_browser_process->safe_browsing_service());
    if (safe_browsing_service.get()) {
    if (safe_browsing_service.get()) {
-@@ -638,7 +638,7 @@ void ProfileImpl::LoadPrefsForNormalStartup(bool async_prefs) {
+@@ -632,7 +632,7 @@ void ProfileImpl::LoadPrefsForNormalStartup(bool async_prefs) {
            pref_validation_delegate.InitWithNewPipeAndPassReceiver());
            pref_validation_delegate.InitWithNewPipeAndPassReceiver());
      }
      }
    }
    }
@@ -2607,6 +2616,14 @@ diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
        "//components/safe_browsing/content/browser:safe_browsing_service",
        "//components/safe_browsing/content/browser:safe_browsing_service",
        "//components/safe_browsing/content/browser/password_protection",
        "//components/safe_browsing/content/browser/password_protection",
        "//components/safe_browsing/content/browser/password_protection:test_support",
        "//components/safe_browsing/content/browser/password_protection:test_support",
+@@ -5540,7 +5539,6 @@ test("unit_tests") {
+     "//components/resources",
+     "//components/safe_browsing:buildflags",
+     "//components/safe_browsing/content/browser",
+-    "//components/safe_browsing/content/browser:client_side_detection",
+     "//components/safe_browsing/content/browser/password_protection",
+     "//components/safe_browsing/content/browser/password_protection:mock_password_protection",
+     "//components/safe_browsing/content/browser/web_ui",
 diff --git a/components/component_updater/installer_policies/BUILD.gn b/components/component_updater/installer_policies/BUILD.gn
 diff --git a/components/component_updater/installer_policies/BUILD.gn b/components/component_updater/installer_policies/BUILD.gn
 --- a/components/component_updater/installer_policies/BUILD.gn
 --- a/components/component_updater/installer_policies/BUILD.gn
 +++ b/components/component_updater/installer_policies/BUILD.gn
 +++ b/components/component_updater/installer_policies/BUILD.gn

+ 1 - 1
build/patches/Disable-safety-check.patch

@@ -40,7 +40,7 @@ diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
 diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
 diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
 --- a/chrome/android/chrome_java_sources.gni
 --- a/chrome/android/chrome_java_sources.gni
 +++ b/chrome/android/chrome_java_sources.gni
 +++ b/chrome/android/chrome_java_sources.gni
-@@ -936,7 +936,6 @@ chrome_java_sources = [
+@@ -938,7 +938,6 @@ chrome_java_sources = [
    "java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingPasswordReuseDialogBridge.java",
    "java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingPasswordReuseDialogBridge.java",
    "java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingReferringAppBridge.java",
    "java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingReferringAppBridge.java",
    "java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingSettingsLauncher.java",
    "java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingSettingsLauncher.java",

+ 2 - 2
build/patches/Disable-text-fragments-by-default.patch

@@ -19,7 +19,7 @@ Revert "[Text Fragment] Unflag fragment directive removal."
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
-@@ -5603,6 +5603,11 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -5604,6 +5604,11 @@ const FeatureEntry kFeatureEntries[] = {
           "CCTResizableThirdPartiesDefaultPolicy")},
           "CCTResizableThirdPartiesDefaultPolicy")},
  #endif
  #endif
  
  
@@ -178,7 +178,7 @@ diff --git a/third_party/blink/renderer/core/fragment_directive/text_fragment_an
 diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
 diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
-@@ -2258,8 +2258,7 @@
+@@ -2259,8 +2259,7 @@
      },
      },
      {
      {
        name: "TextFragmentIdentifiers",
        name: "TextFragmentIdentifiers",

+ 0 - 22
build/patches/Disable-unified-autoplay-feature.patch

@@ -1,22 +0,0 @@
-From: csagan5 <32685696+csagan5@users.noreply.github.com>
-Date: Sat, 19 Dec 2020 20:04:14 +0100
-Subject: Disable unified autoplay feature
-
----
- media/base/media_switches.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
---- a/media/base/media_switches.cc
-+++ b/media/base/media_switches.cc
-@@ -469,7 +469,7 @@ const base::Feature kUseR16Texture{"use-r16-texture",
- // Enables the Unified Autoplay policy by overriding the platform's default
- // autoplay policy.
- const base::Feature kUnifiedAutoplay{"UnifiedAutoplay",
--                                     base::FEATURE_ENABLED_BY_DEFAULT};
-+                                     base::FEATURE_DISABLED_BY_DEFAULT};
- 
- #if BUILDFLAG(IS_LINUX)
- // Enable vaapi video decoding on linux. This is already enabled by default on
---
-2.25.1

+ 92 - 0
build/patches/DoH-improvements.patch

@@ -0,0 +1,92 @@
+From: csagan5 <32685696+csagan5@users.noreply.github.com>
+Date: Sat, 26 Sep 2020 14:23:19 +0100
+Subject: DoH improvements
+
+Enable secure mode by default
+Always enforce DoH even with inconsistent system DNS configuration
+---
+ .../browser/net/stub_resolver_config_reader.cc  | 17 +----------------
+ net/dns/dns_client.cc                           | 11 ++++++++---
+ net/dns/host_resolver_manager.cc                |  1 +
+ 3 files changed, 10 insertions(+), 19 deletions(-)
+
+diff --git a/chrome/browser/net/stub_resolver_config_reader.cc b/chrome/browser/net/stub_resolver_config_reader.cc
+--- a/chrome/browser/net/stub_resolver_config_reader.cc
++++ b/chrome/browser/net/stub_resolver_config_reader.cc
+@@ -155,7 +155,7 @@ StubResolverConfigReader::StubResolverConfigReader(PrefService* local_state,
+       if (entries.count("dns-over-https@1")) {
+         // The user has "Enabled" selected.
+         local_state_->SetString(prefs::kDnsOverHttpsMode,
+-                                SecureDnsConfig::kModeAutomatic);
++                                SecureDnsConfig::kModeSecure);
+       } else if (entries.count("dns-over-https@2")) {
+         // The user has "Disabled" selected.
+         local_state_->SetString(prefs::kDnsOverHttpsMode,
+@@ -335,22 +335,7 @@ SecureDnsConfig StubResolverConfigReader::GetAndUpdateConfiguration(
+     check_parental_controls = false;
+   }
+ 
+-  // Check parental controls last because it can be expensive and should only be
+-  // checked if necessary for the otherwise-determined mode.
+   if (check_parental_controls) {
+-    if (ShouldDisableDohForParentalControls()) {
+-      forced_management_mode =
+-          SecureDnsConfig::ManagementMode::kDisabledParentalControls;
+-      secure_dns_mode = net::SecureDnsMode::kOff;
+-      mode_details =
+-          SecureDnsModeDetailsForHistogram::kOffByDetectedParentalControls;
+-
+-      // If parental controls had not previously been checked, need to update
+-      // network service.
+-      if (!parental_controls_checked_)
+-        update_network_service = true;
+-    }
+-
+     parental_controls_checked_ = true;
+   }
+ 
+diff --git a/net/dns/dns_client.cc b/net/dns/dns_client.cc
+--- a/net/dns/dns_client.cc
++++ b/net/dns/dns_client.cc
+@@ -241,11 +241,14 @@ class DnsClientImpl : public DnsClient {
+  private:
+   absl::optional<DnsConfig> BuildEffectiveConfig() const {
+     DnsConfig config;
+-    if (config_overrides_.OverridesEverything()) {
++    // in Bromite it is sufficient to have secure DoH enabled to give the overrides priority
++    if (config_overrides_.dns_over_https_config && config_overrides_.secure_dns_mode) {
+       config = config_overrides_.ApplyOverrides(DnsConfig());
+     } else {
+-      if (!system_config_)
++      if (!system_config_) {
++        LOG(WARNING) << "BuildEffectiveConfig(): no system configuration";
+         return absl::nullopt;
++      }
+ 
+       config = config_overrides_.ApplyOverrides(system_config_.value());
+     }
+@@ -260,8 +263,10 @@ class DnsClientImpl : public DnsClient {
+     if (config.unhandled_options)
+       config.nameservers.clear();
+ 
+-    if (!config.IsValid())
++    if (!config.IsValid()) {
++        LOG(WARNING) << "BuildEffectiveConfig(): invalid configuration";
+       return absl::nullopt;
++    }
+ 
+     return config;
+   }
+diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc
+--- a/net/dns/host_resolver_manager.cc
++++ b/net/dns/host_resolver_manager.cc
+@@ -3120,6 +3120,7 @@ void HostResolverManager::SetDnsConfigOverrides(DnsConfigOverrides overrides) {
+   bool changed = dns_client_->SetConfigOverrides(std::move(overrides));
+ 
+   if (changed) {
++    LOG(INFO) << "triggering non-system DNS change";
+     NetworkChangeNotifier::TriggerNonSystemDnsChange();
+ 
+     // Only invalidate cache if new overrides have resulted in a config change.
+--
+2.25.1

+ 0 - 45
build/patches/DoH-secure-mode-by-default.patch

@@ -1,45 +0,0 @@
-From: csagan5 <32685696+csagan5@users.noreply.github.com>
-Date: Sat, 26 Sep 2020 14:23:19 +0100
-Subject: DoH secure mode by default
-
----
- .../browser/net/stub_resolver_config_reader.cc  | 17 +----------------
- 1 file changed, 1 insertion(+), 16 deletions(-)
-
-diff --git a/chrome/browser/net/stub_resolver_config_reader.cc b/chrome/browser/net/stub_resolver_config_reader.cc
---- a/chrome/browser/net/stub_resolver_config_reader.cc
-+++ b/chrome/browser/net/stub_resolver_config_reader.cc
-@@ -155,7 +155,7 @@ StubResolverConfigReader::StubResolverConfigReader(PrefService* local_state,
-       if (entries.count("dns-over-https@1")) {
-         // The user has "Enabled" selected.
-         local_state_->SetString(prefs::kDnsOverHttpsMode,
--                                SecureDnsConfig::kModeAutomatic);
-+                                SecureDnsConfig::kModeSecure);
-       } else if (entries.count("dns-over-https@2")) {
-         // The user has "Disabled" selected.
-         local_state_->SetString(prefs::kDnsOverHttpsMode,
-@@ -335,22 +335,7 @@ SecureDnsConfig StubResolverConfigReader::GetAndUpdateConfiguration(
-     check_parental_controls = false;
-   }
- 
--  // Check parental controls last because it can be expensive and should only be
--  // checked if necessary for the otherwise-determined mode.
-   if (check_parental_controls) {
--    if (ShouldDisableDohForParentalControls()) {
--      forced_management_mode =
--          SecureDnsConfig::ManagementMode::kDisabledParentalControls;
--      secure_dns_mode = net::SecureDnsMode::kOff;
--      mode_details =
--          SecureDnsModeDetailsForHistogram::kOffByDetectedParentalControls;
--
--      // If parental controls had not previously been checked, need to update
--      // network service.
--      if (!parental_controls_checked_)
--        update_network_service = true;
--    }
--
-     parental_controls_checked_ = true;
-   }
- 
---
-2.25.1

+ 1 - 1
build/patches/Enable-Certificate-Transparency.patch

@@ -22,7 +22,7 @@ Disable CT reporting
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
-@@ -7902,6 +7902,11 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -7903,6 +7903,11 @@ const FeatureEntry kFeatureEntries[] = {
       flag_descriptions::kWebBluetoothBondOnDemandDescription, kOsWin | kOsLinux,
       flag_descriptions::kWebBluetoothBondOnDemandDescription, kOsWin | kOsLinux,
       FEATURE_VALUE_TYPE(features::kWebBluetoothBondOnDemand)},
       FEATURE_VALUE_TYPE(features::kWebBluetoothBondOnDemand)},
  
  

+ 8 - 8
build/patches/Enable-native-Android-autofill.patch

@@ -49,7 +49,7 @@ diff --git a/android_webview/browser/aw_contents.cc b/android_webview/browser/aw
 diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
 diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
 --- a/chrome/android/BUILD.gn
 --- a/chrome/android/BUILD.gn
 +++ b/chrome/android/BUILD.gn
 +++ b/chrome/android/BUILD.gn
-@@ -450,6 +450,7 @@ android_library("chrome_java") {
+@@ -456,6 +456,7 @@ android_library("chrome_java") {
      "//chrome/browser/xsurface:java",
      "//chrome/browser/xsurface:java",
      "//components/autofill/android:autofill_java",
      "//components/autofill/android:autofill_java",
      "//components/autofill_assistant/browser:proto_java",
      "//components/autofill_assistant/browser:proto_java",
@@ -185,7 +185,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manage
 diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
 diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
 +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
 +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
-@@ -74,6 +74,17 @@ import org.chromium.ui.base.WindowAndroid;
+@@ -70,6 +70,17 @@ import org.chromium.ui.base.WindowAndroid;
  import org.chromium.ui.util.ColorUtils;
  import org.chromium.ui.util.ColorUtils;
  import org.chromium.url.GURL;
  import org.chromium.url.GURL;
  
  
@@ -203,7 +203,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
  /**
  /**
   * Implementation of the interface {@link Tab}. Contains and manages a {@link ContentView}.
   * Implementation of the interface {@link Tab}. Contains and manages a {@link ContentView}.
   * This class is not intended to be extended.
   * This class is not intended to be extended.
-@@ -211,6 +222,8 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
+@@ -207,6 +218,8 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
      private int mThemeColor;
      private int mThemeColor;
      private boolean mUsedCriticalPersistedTabData;
      private boolean mUsedCriticalPersistedTabData;
  
  
@@ -212,7 +212,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
      /**
      /**
       * Creates an instance of a {@link TabImpl}.
       * Creates an instance of a {@link TabImpl}.
       *
       *
-@@ -765,6 +778,11 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
+@@ -736,6 +749,11 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
          for (TabObserver observer : mObservers) observer.onDestroyed(this);
          for (TabObserver observer : mObservers) observer.onDestroyed(this);
          mObservers.clear();
          mObservers.clear();
  
  
@@ -224,7 +224,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
          mUserDataHost.destroy();
          mUserDataHost.destroy();
          mTabViewManager.destroy();
          mTabViewManager.destroy();
          hideNativePage(false, null);
          hideNativePage(false, null);
-@@ -1342,6 +1360,16 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
+@@ -1313,6 +1331,16 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
          return tabsPtrArray;
          return tabsPtrArray;
      }
      }
  
  
@@ -241,7 +241,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
      /**
      /**
       * Initializes the {@link WebContents}. Completes the browser content components initialization
       * Initializes the {@link WebContents}. Completes the browser content components initialization
       * around a native WebContents pointer.
       * around a native WebContents pointer.
-@@ -1391,6 +1419,27 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
+@@ -1362,6 +1390,27 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
                              mDelegateFactory.createContextMenuPopulatorFactory(this), this));
                              mDelegateFactory.createContextMenuPopulatorFactory(this), this));
  
  
              mWebContents.notifyRendererPreferenceUpdate();
              mWebContents.notifyRendererPreferenceUpdate();
@@ -269,7 +269,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
              TabHelpers.initWebContentsHelpers(this);
              TabHelpers.initWebContentsHelpers(this);
              notifyContentChanged();
              notifyContentChanged();
          } finally {
          } finally {
-@@ -1775,5 +1824,6 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
+@@ -1705,5 +1754,6 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
          void setActiveNavigationEntryTitleForUrl(long nativeTabAndroid, String url, String title);
          void setActiveNavigationEntryTitleForUrl(long nativeTabAndroid, String url, String title);
          void loadOriginalImage(long nativeTabAndroid);
          void loadOriginalImage(long nativeTabAndroid);
          boolean handleNonNavigationAboutURL(GURL url);
          boolean handleNonNavigationAboutURL(GURL url);
@@ -392,7 +392,7 @@ diff --git a/chrome/browser/android/tab_web_contents_delegate_android.cc b/chrom
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
-@@ -639,6 +639,12 @@ CHAR_LIMIT guidelines:
+@@ -589,6 +589,12 @@ CHAR_LIMIT guidelines:
        <message name="IDS_PASSWORD_SETTINGS_SAVE_PASSWORDS" desc="Title for the checkbox toggling whether passwords are saved or not. [CHAR_LIMIT=32]">
        <message name="IDS_PASSWORD_SETTINGS_SAVE_PASSWORDS" desc="Title for the checkbox toggling whether passwords are saved or not. [CHAR_LIMIT=32]">
          Save passwords
          Save passwords
        </message>
        </message>

+ 3 - 3
build/patches/Enable-share-intent.patch

@@ -38,7 +38,7 @@ diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_ja
 diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
 diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
 --- a/chrome/android/chrome_java_sources.gni
 --- a/chrome/android/chrome_java_sources.gni
 +++ b/chrome/android/chrome_java_sources.gni
 +++ b/chrome/android/chrome_java_sources.gni
-@@ -960,6 +960,7 @@ chrome_java_sources = [
+@@ -962,6 +962,7 @@ chrome_java_sources = [
    "java/src/org/chromium/chrome/browser/sharing/shared_clipboard/SharedClipboardMessageHandler.java",
    "java/src/org/chromium/chrome/browser/sharing/shared_clipboard/SharedClipboardMessageHandler.java",
    "java/src/org/chromium/chrome/browser/sharing/shared_clipboard/SharedClipboardMetrics.java",
    "java/src/org/chromium/chrome/browser/sharing/shared_clipboard/SharedClipboardMetrics.java",
    "java/src/org/chromium/chrome/browser/sharing/shared_clipboard/SharedClipboardShareActivity.java",
    "java/src/org/chromium/chrome/browser/sharing/shared_clipboard/SharedClipboardShareActivity.java",
@@ -308,7 +308,7 @@ new file mode 100644
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
-@@ -5812,6 +5812,10 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -5813,6 +5813,10 @@ const FeatureEntry kFeatureEntries[] = {
       FEATURE_VALUE_TYPE(share::kSharingDesktopScreenshotsEdit)},
       FEATURE_VALUE_TYPE(share::kSharingDesktopScreenshotsEdit)},
  #endif
  #endif
  
  
@@ -393,7 +393,7 @@ diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/f
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
-@@ -4654,6 +4654,19 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
+@@ -4663,6 +4663,19 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
          Send text to Your Devices
          Send text to Your Devices
        </message>
        </message>
  
  

+ 3 - 3
build/patches/Experimental-user-scripts-support.patch

@@ -236,7 +236,7 @@ diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
  }
  }
  
  
  if (enable_vr) {
  if (enable_vr) {
-@@ -556,6 +560,7 @@ android_library("chrome_java") {
+@@ -557,6 +561,7 @@ android_library("chrome_java") {
      "//components/ukm/android:java",
      "//components/ukm/android:java",
      "//components/url_formatter/android:url_formatter_java",
      "//components/url_formatter/android:url_formatter_java",
      "//components/user_prefs/android:java",
      "//components/user_prefs/android:java",
@@ -322,7 +322,7 @@ diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
 diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
 diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
 --- a/chrome/browser/BUILD.gn
 --- a/chrome/browser/BUILD.gn
 +++ b/chrome/browser/BUILD.gn
 +++ b/chrome/browser/BUILD.gn
-@@ -3486,6 +3486,11 @@ static_library("browser") {
+@@ -3494,6 +3494,11 @@ static_library("browser") {
        ]
        ]
        deps += [ "//chrome/android/modules/dev_ui/provider:native" ]
        deps += [ "//chrome/android/modules/dev_ui/provider:native" ]
      }
      }
@@ -345,7 +345,7 @@ diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
  #include "components/version_info/version_info.h"
  #include "components/version_info/version_info.h"
  #include "components/viz/common/features.h"
  #include "components/viz/common/features.h"
  #include "components/viz/common/switches.h"
  #include "components/viz/common/switches.h"
-@@ -6712,6 +6713,10 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -6713,6 +6714,10 @@ const FeatureEntry kFeatureEntries[] = {
       FEATURE_VALUE_TYPE(chromeos::features::kClipboardHistoryScreenshotNudge)},
       FEATURE_VALUE_TYPE(chromeos::features::kClipboardHistoryScreenshotNudge)},
  #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
  #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
  
  

+ 12 - 2
build/patches/Hide-passwords-manager-link.patch

@@ -2,13 +2,23 @@ From: Daniel Micay <danielmicay@gmail.com>
 Date: Sun, 13 Aug 2017 19:33:04 -0400
 Date: Sun, 13 Aug 2017 19:33:04 -0400
 Subject: Hide passwords manager link
 Subject: Hide passwords manager link
 
 
+Hide leak check menu entry (csagan5)
 ---
 ---
- .../browser/password_manager/settings/PasswordSettings.java   | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
+ .../browser/password_manager/settings/PasswordSettings.java | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
 
 
 diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java
 diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java
 --- a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java
 --- a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java
 +++ b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java
 +++ b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java
+@@ -186,7 +186,7 @@ public class PasswordSettings extends PreferenceFragmentCompat
+     @Override
+     public void onCreate(Bundle savedInstanceState) {
+         super.onCreate(savedInstanceState);
+-        mPasswordCheck = PasswordCheckFactory.getOrCreate(new SettingsLauncherImpl());
++        // password leak check is always disabled on Bromite
+         computeTrustedVaultBannerState();
+     }
+ 
 @@ -338,7 +338,7 @@ public class PasswordSettings extends PreferenceFragmentCompat
 @@ -338,7 +338,7 @@ public class PasswordSettings extends PreferenceFragmentCompat
              return;
              return;
          }
          }

+ 2 - 2
build/patches/History-number-of-days-privacy-setting.patch

@@ -224,7 +224,7 @@ diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/p
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
-@@ -1056,6 +1056,18 @@ Your Google account may have other forms of browsing history like searches and a
+@@ -1059,6 +1059,18 @@ Your Google account may have other forms of browsing history like searches and a
        <message name="IDS_CLEAR_HISTORY_TITLE" desc="Title for Clear History in Clear Browsing Data dialog">
        <message name="IDS_CLEAR_HISTORY_TITLE" desc="Title for Clear History in Clear Browsing Data dialog">
          Browsing history
          Browsing history
        </message>
        </message>
@@ -354,7 +354,7 @@ diff --git a/components/history/core/browser/expire_history_backend.h b/componen
 diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc
 diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc
 --- a/components/history/core/browser/history_backend.cc
 --- a/components/history/core/browser/history_backend.cc
 +++ b/components/history/core/browser/history_backend.cc
 +++ b/components/history/core/browser/history_backend.cc
-@@ -962,6 +962,20 @@ void HistoryBackend::InitImpl(
+@@ -971,6 +971,20 @@ void HistoryBackend::InitImpl(
    LOCAL_HISTOGRAM_TIMES("History.InitTime", TimeTicks::Now() - beginning_time);
    LOCAL_HISTOGRAM_TIMES("History.InitTime", TimeTicks::Now() - beginning_time);
  }
  }
  
  

+ 8 - 6
build/patches/Inject-scripts-for-AMP-tracking-ads-and-video.patch

@@ -8,13 +8,13 @@ Set proper injection script nonce
 Send a random key press to circumvent idle status detection
 Send a random key press to circumvent idle status detection
 ---
 ---
  third_party/blink/renderer/core/dom/build.gni |  2 +
  third_party/blink/renderer/core/dom/build.gni |  2 +
- .../blink/renderer/core/dom/document.cc       | 63 +++++++++++++++++++
+ .../blink/renderer/core/dom/document.cc       | 65 +++++++++++++++++++
  .../blink/renderer/core/dom/document.h        |  3 +
  .../blink/renderer/core/dom/document.h        |  3 +
  .../core/dom/extensions/anti_amp_cure.h       |  6 ++
  .../core/dom/extensions/anti_amp_cure.h       |  6 ++
  .../core/dom/extensions/video_bg_play.h       |  6 ++
  .../core/dom/extensions/video_bg_play.h       |  6 ++
  .../renderer/core/html/html_script_element.cc |  5 ++
  .../renderer/core/html/html_script_element.cc |  5 ++
  .../renderer/core/html/html_script_element.h  |  1 +
  .../renderer/core/html/html_script_element.h  |  1 +
- 7 files changed, 86 insertions(+)
+ 7 files changed, 88 insertions(+)
  create mode 100644 third_party/blink/renderer/core/dom/extensions/anti_amp_cure.h
  create mode 100644 third_party/blink/renderer/core/dom/extensions/anti_amp_cure.h
  create mode 100644 third_party/blink/renderer/core/dom/extensions/video_bg_play.h
  create mode 100644 third_party/blink/renderer/core/dom/extensions/video_bg_play.h
 
 
@@ -50,7 +50,7 @@ diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink
  #ifndef NDEBUG
  #ifndef NDEBUG
  using WeakDocumentSet = blink::HeapHashSet<blink::WeakMember<blink::Document>>;
  using WeakDocumentSet = blink::HeapHashSet<blink::WeakMember<blink::Document>>;
  static WeakDocumentSet& LiveDocumentSet();
  static WeakDocumentSet& LiveDocumentSet();
-@@ -6521,6 +6524,62 @@ void Document::setAllowDeclarativeShadowRoots(bool val) {
+@@ -6521,6 +6524,64 @@ void Document::setAllowDeclarativeShadowRoots(bool val) {
        val ? AllowState::kAllow : AllowState::kDeny;
        val ? AllowState::kAllow : AllowState::kDeny;
  }
  }
  
  
@@ -69,7 +69,10 @@ diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink
 +    LOG(INFO) << "injecting AMP removal Javascript payload";
 +    LOG(INFO) << "injecting AMP removal Javascript payload";
 +    selected = 1;
 +    selected = 1;
 +    // check for eligibility of the video bg fix
 +    // check for eligibility of the video bg fix
-+  } else if ((WTF::kNotFound != host.Find("youtube.com")) || (WTF::kNotFound != host.Find("vimeo.com"))) {
++  } else if (
++              ((WTF::kNotFound != host.Find("youtube.com")) && (WTF::kNotFound == host.Find("accounts.youtube.com"))) ||
++              (WTF::kNotFound != host.Find("vimeo.com"))
++            ) {
 +    LOG(INFO) << "injecting video-bg-play Javascript payload";
 +    LOG(INFO) << "injecting video-bg-play Javascript payload";
 +    selected = 2;
 +    selected = 2;
 +  } else
 +  } else
@@ -87,7 +90,6 @@ diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink
 +    NOTREACHED();
 +    NOTREACHED();
 +
 +
 +  if (nonce != g_null_atom) {
 +  if (nonce != g_null_atom) {
-+    LOG(INFO) << "using script nonce '" << nonce << "'";
 +    e->setNonce(nonce);
 +    e->setNonce(nonce);
 +  } else
 +  } else
 +    LOG(WARNING) << "could not find script nonce to use";
 +    LOG(WARNING) << "could not find script nonce to use";
@@ -113,7 +115,7 @@ diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink
  void Document::FinishedParsing() {
  void Document::FinishedParsing() {
    DCHECK(!GetScriptableDocumentParser() || !parser_->IsParsing());
    DCHECK(!GetScriptableDocumentParser() || !parser_->IsParsing());
    DCHECK(!GetScriptableDocumentParser() || ready_state_ != kLoading);
    DCHECK(!GetScriptableDocumentParser() || ready_state_ != kLoading);
-@@ -6579,6 +6638,10 @@ void Document::FinishedParsing() {
+@@ -6579,6 +6640,10 @@ void Document::FinishedParsing() {
      if (frame->IsMainFrame() && ShouldMarkFontPerformance())
      if (frame->IsMainFrame() && ShouldMarkFontPerformance())
        FontPerformance::MarkDomContentLoaded();
        FontPerformance::MarkDomContentLoaded();
  
  

+ 1 - 1
build/patches/Keep-flag-to-allow-screenshots-in-Incognito-mode.patch

@@ -13,7 +13,7 @@ See also:
 diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
 diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
 --- a/chrome/browser/flag-metadata.json
 --- a/chrome/browser/flag-metadata.json
 +++ b/chrome/browser/flag-metadata.json
 +++ b/chrome/browser/flag-metadata.json
-@@ -3688,9 +3688,9 @@
+@@ -3689,9 +3689,9 @@
      "expiry_milestone": 100
      "expiry_milestone": 100
    },
    },
    {
    {

+ 1 - 30
build/patches/Modify-default-preferences.patch

@@ -9,12 +9,10 @@ Subject: Modify default preferences
  chrome/browser/profiles/profile.cc                          | 2 +-
  chrome/browser/profiles/profile.cc                          | 2 +-
  .../resources/settings/reset_page/reset_profile_dialog.html | 2 +-
  .../resources/settings/reset_page/reset_profile_dialog.html | 2 +-
  chrome/browser/ui/browser_ui_prefs.cc                       | 6 +++---
  chrome/browser/ui/browser_ui_prefs.cc                       | 6 +++---
- components/autofill/core/browser/browser_autofill_manager.h | 4 ++--
- components/autofill/core/common/autofill_prefs.cc           | 2 +-
  components/bookmarks/browser/bookmark_utils.cc              | 2 +-
  components/bookmarks/browser/bookmark_utils.cc              | 2 +-
  components/bookmarks/browser/features.cc                    | 2 +-
  components/bookmarks/browser/features.cc                    | 2 +-
  components/safe_browsing/core/common/safe_browsing_prefs.cc | 4 ++--
  components/safe_browsing/core/common/safe_browsing_prefs.cc | 4 ++--
- 11 files changed, 15 insertions(+), 15 deletions(-)
+ 9 files changed, 12 insertions(+), 12 deletions(-)
 
 
 diff --git a/chrome/browser/background/background_mode_manager.cc b/chrome/browser/background/background_mode_manager.cc
 diff --git a/chrome/browser/background/background_mode_manager.cc b/chrome/browser/background/background_mode_manager.cc
 --- a/chrome/browser/background/background_mode_manager.cc
 --- a/chrome/browser/background/background_mode_manager.cc
@@ -94,33 +92,6 @@ diff --git a/chrome/browser/ui/browser_ui_prefs.cc b/chrome/browser/ui/browser_u
    registry->RegisterDictionaryPref(prefs::kBrowserWindowPlacement);
    registry->RegisterDictionaryPref(prefs::kBrowserWindowPlacement);
    registry->RegisterDictionaryPref(prefs::kBrowserWindowPlacementPopup);
    registry->RegisterDictionaryPref(prefs::kBrowserWindowPlacementPopup);
    registry->RegisterDictionaryPref(prefs::kAppWindowPlacement);
    registry->RegisterDictionaryPref(prefs::kAppWindowPlacement);
-diff --git a/components/autofill/core/browser/browser_autofill_manager.h b/components/autofill/core/browser/browser_autofill_manager.h
---- a/components/autofill/core/browser/browser_autofill_manager.h
-+++ b/components/autofill/core/browser/browser_autofill_manager.h
-@@ -701,9 +701,9 @@ class BrowserAutofillManager : public AutofillManager,
-   std::unique_ptr<CreditCardFormEventLogger> credit_card_form_event_logger_;
- 
-   // Have we logged whether Autofill is enabled for this page load?
--  bool has_logged_autofill_enabled_ = false;
-+  bool has_logged_autofill_enabled_ = true;
-   // Have we logged an address suggestions count metric for this page?
--  bool has_logged_address_suggestions_count_ = false;
-+  bool has_logged_address_suggestions_count_ = true;
-   // Have we shown Autofill suggestions at least once?
-   bool did_show_suggestions_ = false;
-   // Has the user manually edited at least one form field among the autofillable
-diff --git a/components/autofill/core/common/autofill_prefs.cc b/components/autofill/core/common/autofill_prefs.cc
---- a/components/autofill/core/common/autofill_prefs.cc
-+++ b/components/autofill/core/common/autofill_prefs.cc
-@@ -147,7 +147,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
-       prefs::kAutofillLastVersionDisusedAddressesDeleted, 0,
-       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
-   registry->RegisterBooleanPref(
--      prefs::kAutofillCreditCardEnabled, true,
-+      prefs::kAutofillCreditCardEnabled, false,
-       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
-   registry->RegisterStringPref(
-       prefs::kAutofillProfileValidity, "",
 diff --git a/components/bookmarks/browser/bookmark_utils.cc b/components/bookmarks/browser/bookmark_utils.cc
 diff --git a/components/bookmarks/browser/bookmark_utils.cc b/components/bookmarks/browser/bookmark_utils.cc
 --- a/components/bookmarks/browser/bookmark_utils.cc
 --- a/components/bookmarks/browser/bookmark_utils.cc
 +++ b/components/bookmarks/browser/bookmark_utils.cc
 +++ b/components/bookmarks/browser/bookmark_utils.cc

+ 1 - 1
build/patches/Move-some-account-settings-back-to-privacy-settings.patch

@@ -104,7 +104,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/privacy/setting
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
-@@ -435,6 +435,10 @@ CHAR_LIMIT guidelines:
+@@ -438,6 +438,10 @@ CHAR_LIMIT guidelines:
          No statistics or crash reports are sent to Google
          No statistics or crash reports are sent to Google
        </message>
        </message>
  
  

+ 2 - 2
build/patches/Multiple-fingerprinting-mitigations.patch

@@ -74,7 +74,7 @@ diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
  #include "storage/browser/quota/quota_features.h"
  #include "storage/browser/quota/quota_features.h"
  #include "third_party/blink/public/common/features.h"
  #include "third_party/blink/public/common/features.h"
  #include "third_party/blink/public/common/forcedark/forcedark_switches.h"
  #include "third_party/blink/public/common/forcedark/forcedark_switches.h"
-@@ -2944,6 +2945,20 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -2945,6 +2946,20 @@ const FeatureEntry kFeatureEntries[] = {
       flag_descriptions::kWebrtcUseMinMaxVEADimensionsName,
       flag_descriptions::kWebrtcUseMinMaxVEADimensionsName,
       flag_descriptions::kWebrtcUseMinMaxVEADimensionsDescription, kOsAll,
       flag_descriptions::kWebrtcUseMinMaxVEADimensionsDescription, kOsAll,
       FEATURE_VALUE_TYPE(blink::features::kWebRtcUseMinMaxVEADimensions)},
       FEATURE_VALUE_TYPE(blink::features::kWebRtcUseMinMaxVEADimensions)},
@@ -638,7 +638,7 @@ diff --git a/third_party/blink/renderer/platform/graphics/static_bitmap_image.h
 diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
 diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
-@@ -1075,6 +1075,15 @@
+@@ -1076,6 +1076,15 @@
        origin_trial_allows_third_party: true,
        origin_trial_allows_third_party: true,
        status: "experimental",
        status: "experimental",
      },
      },

+ 1 - 1
build/patches/Open-YouTube-links-in-Bromite.patch

@@ -10,7 +10,7 @@ See https://github.com/bromite/bromite/issues/1472
 diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java
 diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java
 --- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java
 --- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java
 +++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java
 +++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java
-@@ -1311,6 +1311,12 @@ public class ExternalNavigationHandler {
+@@ -1328,6 +1328,12 @@ public class ExternalNavigationHandler {
                      OverrideUrlLoadingAsyncActionType.UI_GATING_BROWSER_NAVIGATION);
                      OverrideUrlLoadingAsyncActionType.UI_GATING_BROWSER_NAVIGATION);
          }
          }
  
  

+ 88 - 13
build/patches/OpenSearch-allow-paths-and-incognito-mode.patch

@@ -2,13 +2,33 @@ From: csagan5 <32685696+csagan5@users.noreply.github.com>
 Date: Sun, 6 Mar 2022 18:55:58 +0100
 Date: Sun, 6 Mar 2022 18:55:58 +0100
 Subject: OpenSearch: allow paths and incognito mode
 Subject: OpenSearch: allow paths and incognito mode
 
 
+Fix bug with recently added engines prematurely discarded
+because they have no last-visit timestamp
 Allow adding search engines in incognito mode
 Allow adding search engines in incognito mode
 Allow using search engine URLs with non-empty paths
 Allow using search engine URLs with non-empty paths
-Add debug logging
+Add verbose logging
 ---
 ---
- .../search_engine_tab_helper.cc               | 37 +++++++++++++------
- 1 file changed, 26 insertions(+), 11 deletions(-)
+ .../settings/SearchEngineAdapter.java         |  4 ++-
+ .../search_engine_tab_helper.cc               | 34 +++++++++++++------
+ .../renderer/chrome_render_frame_observer.cc  |  2 ++
+ .../search_engines/template_url_fetcher.cc    | 19 ++++++++---
+ .../search_engines/template_url_service.cc    |  1 -
+ 5 files changed, 44 insertions(+), 16 deletions(-)
 
 
+diff --git a/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter.java b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter.java
+--- a/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter.java
++++ b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter.java
+@@ -247,7 +247,9 @@ public class SearchEngineAdapter extends BaseAdapter
+                 continue;
+             }
+             if (recentEngineNum < MAX_RECENT_ENGINE_NUM
+-                    && templateUrl.getLastVisitedTime() > displayTime) {
++                    // just-added search engines have never been visited
++                    && (templateUrl.getLastVisitedTime() == 0 ||
++                        templateUrl.getLastVisitedTime() > displayTime)) {
+                 recentEngineNum++;
+             } else {
+                 iterator.remove();
 diff --git a/chrome/browser/ui/search_engines/search_engine_tab_helper.cc b/chrome/browser/ui/search_engines/search_engine_tab_helper.cc
 diff --git a/chrome/browser/ui/search_engines/search_engine_tab_helper.cc b/chrome/browser/ui/search_engines/search_engine_tab_helper.cc
 --- a/chrome/browser/ui/search_engines/search_engine_tab_helper.cc
 --- a/chrome/browser/ui/search_engines/search_engine_tab_helper.cc
 +++ b/chrome/browser/ui/search_engines/search_engine_tab_helper.cc
 +++ b/chrome/browser/ui/search_engines/search_engine_tab_helper.cc
@@ -90,7 +110,7 @@ diff --git a/chrome/browser/ui/search_engines/search_engine_tab_helper.cc b/chro
  
  
    // If the current page is a form submit, find the last page that was not a
    // If the current page is a form submit, find the last page that was not a
    // form submit and use its url to generate the keyword from.
    // form submit and use its url to generate the keyword from.
-@@ -141,14 +152,17 @@ void SearchEngineTabHelper::PageHasOpenSearchDescriptionDocument(
+@@ -141,8 +152,10 @@ void SearchEngineTabHelper::PageHasOpenSearchDescriptionDocument(
         (index > 0) && IsFormSubmit(entry);
         (index > 0) && IsFormSubmit(entry);
         entry = controller.GetEntryAtIndex(index))
         entry = controller.GetEntryAtIndex(index))
      --index;
      --index;
@@ -102,15 +122,7 @@ diff --git a/chrome/browser/ui/search_engines/search_engine_tab_helper.cc b/chro
  
  
    // Autogenerate a keyword for the autodetected case; in the other cases we'll
    // Autogenerate a keyword for the autodetected case; in the other cases we'll
    // generate a keyword later after fetching the OSDD.
    // generate a keyword later after fetching the OSDD.
-   std::u16string keyword = GenerateKeywordFromNavigationEntry(entry);
--  if (keyword.empty())
-+  if (keyword.empty()) {
-     return;
-+  }
- 
-   auto* frame = web_contents()->GetMainFrame();
-   mojo::Remote<network::mojom::URLLoaderFactory> url_loader_factory;
-@@ -157,6 +171,7 @@ void SearchEngineTabHelper::PageHasOpenSearchDescriptionDocument(
+@@ -157,6 +170,7 @@ void SearchEngineTabHelper::PageHasOpenSearchDescriptionDocument(
  
  
    // Download the OpenSearch description document. If this is successful, a
    // Download the OpenSearch description document. If this is successful, a
    // new keyword will be created when done.
    // new keyword will be created when done.
@@ -118,5 +130,68 @@ diff --git a/chrome/browser/ui/search_engines/search_engine_tab_helper.cc b/chro
    TemplateURLFetcherFactory::GetForProfile(profile)->ScheduleDownload(
    TemplateURLFetcherFactory::GetForProfile(profile)->ScheduleDownload(
        keyword, osdd_url, entry->GetFavicon().url,
        keyword, osdd_url, entry->GetFavicon().url,
        frame->GetLastCommittedOrigin(), url_loader_factory.get(),
        frame->GetLastCommittedOrigin(), url_loader_factory.get(),
+diff --git a/chrome/renderer/chrome_render_frame_observer.cc b/chrome/renderer/chrome_render_frame_observer.cc
+--- a/chrome/renderer/chrome_render_frame_observer.cc
++++ b/chrome/renderer/chrome_render_frame_observer.cc
+@@ -13,6 +13,7 @@
+ 
+ #include "base/bind.h"
+ #include "base/command_line.h"
++#include "base/logging.h"
+ #include "base/metrics/histogram_macros.h"
+ #include "base/no_destructor.h"
+ #include "base/strings/string_number_conversions.h"
+@@ -202,6 +203,7 @@ void ChromeRenderFrameObserver::DidFinishLoad() {
+ 
+   GURL osdd_url = frame->GetDocument().OpenSearchDescriptionURL();
+   if (!osdd_url.is_empty()) {
++    LOG(INFO) << "OpenSearch: found OSDD URL: " << osdd_url;
+     mojo::AssociatedRemote<chrome::mojom::OpenSearchDescriptionDocumentHandler>
+         osdd_handler;
+     render_frame()->GetRemoteAssociatedInterfaces()->GetInterface(
+diff --git a/components/search_engines/template_url_fetcher.cc b/components/search_engines/template_url_fetcher.cc
+--- a/components/search_engines/template_url_fetcher.cc
++++ b/components/search_engines/template_url_fetcher.cc
+@@ -260,14 +260,25 @@ void TemplateURLFetcher::ScheduleDownload(
+ 
+   const TemplateURL* template_url =
+       template_url_service_->GetTemplateURLForKeyword(keyword);
+-  if (template_url && (!template_url->safe_for_autoreplace() ||
+-                       template_url->originating_url() == osdd_url))
+-    return;
++  if (template_url) {
++    if (!template_url->safe_for_autoreplace()) {
++      LOG(INFO) << "OpenSearch: OSDD URL not safe for autoreplace: " << osdd_url;
++      return;
++    }
++    if (template_url->originating_url() == osdd_url) {
++      // Either there is a user created TemplateURL for this keyword, or the
++      // keyword has the same OSDD url and we've parsed it.
++      LOG(INFO) << "OpenSearch: OSDD URL was already parsed: " << osdd_url;
++      return;
++    }
++  }
+ 
+   // Make sure we aren't already downloading this request.
+   for (const auto& request : requests_) {
+-    if ((request->url() == osdd_url) || (request->keyword() == keyword))
++    if ((request->url() == osdd_url) || (request->keyword() == keyword)) {
++      LOG(INFO) << "OpenSearch: already downloading OSDD URL: " << osdd_url;
+       return;
++    }
+   }
+ 
+   requests_.push_back(std::make_unique<RequestDelegate>(
+diff --git a/components/search_engines/template_url_service.cc b/components/search_engines/template_url_service.cc
+--- a/components/search_engines/template_url_service.cc
++++ b/components/search_engines/template_url_service.cc
+@@ -462,7 +462,6 @@ TemplateURL* TemplateURLService::Add(
+       (!FindTemplateURLForExtension(template_url->extension_info_->extension_id,
+                                     template_url->type()) &&
+        template_url->id() == kInvalidTemplateURLID));
+-
+   return Add(std::move(template_url), true);
+ }
+ 
 --
 --
 2.25.1
 2.25.1

+ 65 - 12
build/patches/Remove-binary-blob-integrations.patch

@@ -18,6 +18,7 @@ Remove dependency on auth, signin, dynamic and tasks
 Remove google_services_gcm
 Remove google_services_gcm
 ungoogled-chromium: Disable GCM
 ungoogled-chromium: Disable GCM
 Disable Google Cloud Messaging (GCM) client
 Disable Google Cloud Messaging (GCM) client
+Disable web authentication phone support
 
 
 Parts of this patch were developed by csagan5, uazo and others.
 Parts of this patch were developed by csagan5, uazo and others.
 ---
 ---
@@ -26,6 +27,7 @@ Parts of this patch were developed by csagan5, uazo and others.
  chrome/android/chrome_java_sources.gni        |   5 -
  chrome/android/chrome_java_sources.gni        |   5 -
  .../features/cablev2_authenticator/BUILD.gn   |   2 -
  .../features/cablev2_authenticator/BUILD.gn   |   2 -
  chrome/android/java/AndroidManifest.xml       |  68 ---
  chrome/android/java/AndroidManifest.xml       |  68 ---
+ .../java/res/xml/privacy_preferences.xml      |   5 -
  .../org/chromium/chrome/browser/AppHooks.java |  14 +-
  .../org/chromium/chrome/browser/AppHooks.java |  14 +-
  .../browser/PlayServicesVersionInfo.java      |  12 +-
  .../browser/PlayServicesVersionInfo.java      |  12 +-
  .../ChromeBackgroundTaskFactory.java          |   3 -
  .../ChromeBackgroundTaskFactory.java          |   3 -
@@ -34,6 +36,7 @@ Parts of this patch were developed by csagan5, uazo and others.
  .../browser/gcore/GoogleApiClientHelper.java  |  82 +--
  .../browser/gcore/GoogleApiClientHelper.java  |  82 +--
  .../instantapps/InstantAppsHandler.java       |  57 +-
  .../instantapps/InstantAppsHandler.java       |  57 +-
  .../browser/omaha/UpdateStatusProvider.java   |  10 +-
  .../browser/omaha/UpdateStatusProvider.java   |  10 +-
+ .../privacy/settings/PrivacySettings.java     |   5 -
  .../modules/chrome_feature_modules.gni        |   3 -
  .../modules/chrome_feature_modules.gni        |   3 -
  chrome/browser/BUILD.gn                       |   2 -
  chrome/browser/BUILD.gn                       |   2 -
  .../chromium/chrome/browser/gsa/GSAState.java |   4 +-
  .../chromium/chrome/browser/gsa/GSAState.java |   4 +-
@@ -90,6 +93,7 @@ Parts of this patch were developed by csagan5, uazo and others.
  content/public/common/content_features.cc     |   2 +-
  content/public/common/content_features.cc     |   2 +-
  content/test/BUILD.gn                         |   4 -
  content/test/BUILD.gn                         |   4 -
  device/BUILD.gn                               |   3 -
  device/BUILD.gn                               |   3 -
+ device/fido/features.cc                       |   4 +-
  remoting/android/client_java_tmpl.gni         |   3 -
  remoting/android/client_java_tmpl.gni         |   3 -
  services/BUILD.gn                             |   9 -
  services/BUILD.gn                             |   9 -
  services/device/geolocation/BUILD.gn          |   3 -
  services/device/geolocation/BUILD.gn          |   3 -
@@ -97,7 +101,7 @@ Parts of this patch were developed by csagan5, uazo and others.
  third_party/android_deps/BUILD.gn             | 540 +-----------------
  third_party/android_deps/BUILD.gn             | 540 +-----------------
  .../preconditions/javatests/BUILD.gn          |   1 -
  .../preconditions/javatests/BUILD.gn          |   1 -
  .../gms/ChromiumPlayServicesAvailability.java |  10 +-
  .../gms/ChromiumPlayServicesAvailability.java |  10 +-
- 76 files changed, 65 insertions(+), 2306 deletions(-)
+ 79 files changed, 67 insertions(+), 2318 deletions(-)
  delete mode 100644 components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskGcmTaskService.java
  delete mode 100644 components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskGcmTaskService.java
  delete mode 100644 components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerGcmNetworkManager.java
  delete mode 100644 components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerGcmNetworkManager.java
 
 
@@ -141,7 +145,7 @@ diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
      "//base:base_java",
      "//base:base_java",
      "//cc:cc_java",
      "//cc:cc_java",
      "//chrome/android/features/autofill_assistant:public_java",
      "//chrome/android/features/autofill_assistant:public_java",
-@@ -601,7 +593,6 @@ android_library("chrome_java") {
+@@ -602,7 +594,6 @@ android_library("chrome_java") {
      "//skia/public/mojom:mojom_java",
      "//skia/public/mojom:mojom_java",
      "//third_party/android_deps:android_support_v7_appcompat_java",
      "//third_party/android_deps:android_support_v7_appcompat_java",
      "//third_party/android_deps:chromium_play_services_availability_java",
      "//third_party/android_deps:chromium_play_services_availability_java",
@@ -149,7 +153,7 @@ diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
      "//third_party/android_deps:com_google_code_findbugs_jsr305_java",
      "//third_party/android_deps:com_google_code_findbugs_jsr305_java",
      "//third_party/android_deps:com_google_guava_listenablefuture_java",
      "//third_party/android_deps:com_google_guava_listenablefuture_java",
      "//third_party/android_deps:dagger_java",
      "//third_party/android_deps:dagger_java",
-@@ -933,10 +924,6 @@ junit_binary("chrome_junit_tests") {
+@@ -934,10 +925,6 @@ junit_binary("chrome_junit_tests") {
      ":chrome_jni_headers",
      ":chrome_jni_headers",
      ":chrome_public_android_manifest",
      ":chrome_public_android_manifest",
      ":delegate_public_impl_java",
      ":delegate_public_impl_java",
@@ -160,7 +164,7 @@ diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
      "//base:base_java",
      "//base:base_java",
      "//base:base_java_test_support",
      "//base:base_java_test_support",
      "//base:base_junit_test_support",
      "//base:base_junit_test_support",
-@@ -1310,13 +1297,6 @@ android_library("chrome_test_java") {
+@@ -1311,13 +1298,6 @@ android_library("chrome_test_java") {
      ":chrome_test_util_java",
      ":chrome_test_util_java",
      ":chrome_test_util_jni",
      ":chrome_test_util_jni",
      ":delegate_public_impl_java",
      ":delegate_public_impl_java",
@@ -174,7 +178,7 @@ diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
      "//base:base_java",
      "//base:base_java",
      "//base:base_java_test_support",
      "//base:base_java_test_support",
      "//base/test:test_support_java",
      "//base/test:test_support_java",
-@@ -2390,7 +2370,6 @@ android_library("browser_java_test_support") {
+@@ -2391,7 +2371,6 @@ android_library("browser_java_test_support") {
    ]
    ]
    deps = [
    deps = [
      ":chrome_java",
      ":chrome_java",
@@ -182,7 +186,7 @@ diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
      "//base:base_java",
      "//base:base_java",
      "//base:base_java_test_support",
      "//base:base_java_test_support",
      "//base:jni_java",
      "//base:jni_java",
-@@ -2539,9 +2518,7 @@ android_library("base_monochrome_module_java") {
+@@ -2540,9 +2519,7 @@ android_library("base_monochrome_module_java") {
  android_library("base_module_java") {
  android_library("base_module_java") {
    sources = [
    sources = [
      "../browser/attribution_reporting/android/java/src/org/chromium/chrome/browser/attribution_reporting/AttributionReportingProvider.java",
      "../browser/attribution_reporting/android/java/src/org/chromium/chrome/browser/attribution_reporting/AttributionReportingProvider.java",
@@ -192,7 +196,7 @@ diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
      "java/src/org/chromium/chrome/browser/ChromeBackupAgent.java",
      "java/src/org/chromium/chrome/browser/ChromeBackupAgent.java",
      "java/src/org/chromium/chrome/browser/DeferredStartupHandler.java",
      "java/src/org/chromium/chrome/browser/DeferredStartupHandler.java",
      "java/src/org/chromium/chrome/browser/base/DexFixer.java",
      "java/src/org/chromium/chrome/browser/base/DexFixer.java",
-@@ -2552,8 +2529,6 @@ android_library("base_module_java") {
+@@ -2553,8 +2530,6 @@ android_library("base_module_java") {
      "java/src/org/chromium/chrome/browser/base/SplitCompatBackupAgent.java",
      "java/src/org/chromium/chrome/browser/base/SplitCompatBackupAgent.java",
      "java/src/org/chromium/chrome/browser/base/SplitCompatContentProvider.java",
      "java/src/org/chromium/chrome/browser/base/SplitCompatContentProvider.java",
      "java/src/org/chromium/chrome/browser/base/SplitCompatCustomTabsService.java",
      "java/src/org/chromium/chrome/browser/base/SplitCompatCustomTabsService.java",
@@ -201,7 +205,7 @@ diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
      "java/src/org/chromium/chrome/browser/base/SplitCompatIntentService.java",
      "java/src/org/chromium/chrome/browser/base/SplitCompatIntentService.java",
      "java/src/org/chromium/chrome/browser/base/SplitCompatJobService.java",
      "java/src/org/chromium/chrome/browser/base/SplitCompatJobService.java",
      "java/src/org/chromium/chrome/browser/base/SplitCompatMinidumpUploadJobService.java",
      "java/src/org/chromium/chrome/browser/base/SplitCompatMinidumpUploadJobService.java",
-@@ -2578,16 +2553,10 @@ android_library("base_module_java") {
+@@ -2579,16 +2554,10 @@ android_library("base_module_java") {
      "java/src/org/chromium/chrome/browser/photo_picker/DecoderService.java",
      "java/src/org/chromium/chrome/browser/photo_picker/DecoderService.java",
      "java/src/org/chromium/chrome/browser/prerender/ChromePrerenderService.java",
      "java/src/org/chromium/chrome/browser/prerender/ChromePrerenderService.java",
      "java/src/org/chromium/chrome/browser/provider/ChromeBrowserProvider.java",
      "java/src/org/chromium/chrome/browser/provider/ChromeBrowserProvider.java",
@@ -218,7 +222,7 @@ diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
      "//base:base_java",
      "//base:base_java",
      "//chrome/browser/download/android:file_provider_java",
      "//chrome/browser/download/android:file_provider_java",
      "//chrome/browser/flags:java",
      "//chrome/browser/flags:java",
-@@ -2600,7 +2569,6 @@ android_library("base_module_java") {
+@@ -2601,7 +2570,6 @@ android_library("base_module_java") {
      "//components/media_router/browser/android:cast_options_provider_java",
      "//components/media_router/browser/android:cast_options_provider_java",
      "//components/minidump_uploader:minidump_uploader_java",
      "//components/minidump_uploader:minidump_uploader_java",
      "//components/module_installer/android:module_installer_java",
      "//components/module_installer/android:module_installer_java",
@@ -226,7 +230,7 @@ diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
      "//third_party/androidx:androidx_annotation_annotation_java",
      "//third_party/androidx:androidx_annotation_annotation_java",
      "//third_party/androidx:androidx_collection_collection_java",
      "//third_party/androidx:androidx_collection_collection_java",
      "//third_party/androidx:androidx_fragment_fragment_java",
      "//third_party/androidx:androidx_fragment_fragment_java",
-@@ -2622,7 +2590,6 @@ android_library("base_module_java") {
+@@ -2623,7 +2591,6 @@ android_library("base_module_java") {
      # Deps to pull services into base module.
      # Deps to pull services into base module.
      # TODO(crbug.com/1126301): Consider moving these to the chrome module to
      # TODO(crbug.com/1126301): Consider moving these to the chrome module to
      # reduce base dex size.
      # reduce base dex size.
@@ -245,7 +249,7 @@ diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java
    "java/src/org/chromium/chrome/browser/ChromeBackupAgentImpl.java",
    "java/src/org/chromium/chrome/browser/ChromeBackupAgentImpl.java",
    "java/src/org/chromium/chrome/browser/ChromeBackupWatcher.java",
    "java/src/org/chromium/chrome/browser/ChromeBackupWatcher.java",
    "java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java",
    "java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java",
-@@ -937,10 +936,6 @@ chrome_java_sources = [
+@@ -939,10 +938,6 @@ chrome_java_sources = [
    "java/src/org/chromium/chrome/browser/searchwidget/SearchType.java",
    "java/src/org/chromium/chrome/browser/searchwidget/SearchType.java",
    "java/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProvider.java",
    "java/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProvider.java",
    "java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivity.java",
    "java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivity.java",
@@ -395,6 +399,19 @@ diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/Andro
        <!-- These providers are declared in the base module to give the chrome
        <!-- These providers are declared in the base module to give the chrome
             split preloader more time to work. -->
             split preloader more time to work. -->
        <provider android:name="org.chromium.chrome.browser.util.ChromeFileProvider"
        <provider android:name="org.chromium.chrome.browser.util.ChromeFileProvider"
+diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml
+--- a/chrome/android/java/res/xml/privacy_preferences.xml
++++ b/chrome/android/java/res/xml/privacy_preferences.xml
+@@ -85,9 +85,4 @@
+           android:summary="@string/autocomplete_searches_and_urls_summary"
+           android:persistent="false"/>
+     </PreferenceCategory>
+-    <Preference
+-        android:key="phone_as_a_security_key"
+-        android:title="@string/cablev2_paask_title"
+-        android:summary="@string/cablev2_paask_body"
+-        android:fragment="org.chromium.chrome.browser.webauthn.PrivacySettingsFragment"/>
+ </PreferenceScreen>
 diff --git a/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java b/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
 diff --git a/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java b/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
 --- a/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
 --- a/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
 +++ b/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
 +++ b/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
@@ -842,6 +859,28 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateSta
          }
          }
  
  
          private long getSize(StatFs statFs) {
          private long getSize(StatFs statFs) {
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
+@@ -79,7 +79,6 @@ public class PrivacySettings
+     private static final String PREF_CLEAR_BROWSING_DATA = "clear_browsing_data";
+     private static final String PREF_PRIVACY_REVIEW = "privacy_review";
+     private static final String PREF_INCOGNITO_LOCK = "incognito_lock";
+-    private static final String PREF_PHONE_AS_A_SECURITY_KEY = "phone_as_a_security_key";
+ 
+     private static final String PREF_CLOSE_TABS_ON_EXIT = "close_tabs_on_exit";
+ 
+@@ -184,10 +183,6 @@ public class PrivacySettings
+             return true;
+         });
+ 
+-        Preference phoneAsASecurityKey = findPreference(PREF_PHONE_AS_A_SECURITY_KEY);
+-        phoneAsASecurityKey.setVisible(
+-                ChromeFeatureList.isEnabled(ChromeFeatureList.WEB_AUTH_PHONE_SUPPORT));
+-
+         ChromeSwitchPreference historyInIncognitoPref =
+                 (ChromeSwitchPreference) findPreference(PREF_INCOGNITO_TAB_HISTORY_ENABLED);
+         historyInIncognitoPref.setOnPreferenceChangeListener(this);
 diff --git a/chrome/android/modules/chrome_feature_modules.gni b/chrome/android/modules/chrome_feature_modules.gni
 diff --git a/chrome/android/modules/chrome_feature_modules.gni b/chrome/android/modules/chrome_feature_modules.gni
 --- a/chrome/android/modules/chrome_feature_modules.gni
 --- a/chrome/android/modules/chrome_feature_modules.gni
 +++ b/chrome/android/modules/chrome_feature_modules.gni
 +++ b/chrome/android/modules/chrome_feature_modules.gni
@@ -865,7 +904,7 @@ diff --git a/chrome/android/modules/chrome_feature_modules.gni b/chrome/android/
 diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
 diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
 --- a/chrome/browser/BUILD.gn
 --- a/chrome/browser/BUILD.gn
 +++ b/chrome/browser/BUILD.gn
 +++ b/chrome/browser/BUILD.gn
-@@ -6731,8 +6731,6 @@ static_library("browser") {
+@@ -6739,8 +6739,6 @@ static_library("browser") {
        "offline_pages/offliner_helper.h",
        "offline_pages/offliner_helper.h",
        "offline_pages/offliner_user_data.cc",
        "offline_pages/offliner_user_data.cc",
        "offline_pages/offliner_user_data.h",
        "offline_pages/offliner_user_data.h",
@@ -3626,6 +3665,20 @@ diff --git a/device/BUILD.gn b/device/BUILD.gn
        "//base:base_java",
        "//base:base_java",
        "//base:base_java_test_support",
        "//base:base_java_test_support",
        "//base:base_junit_test_support",
        "//base:base_junit_test_support",
+diff --git a/device/fido/features.cc b/device/fido/features.cc
+--- a/device/fido/features.cc
++++ b/device/fido/features.cc
+@@ -22,8 +22,8 @@ const base::Feature kWebAuthUseNativeWinApi{"WebAuthenticationUseNativeWinApi",
+ extern const base::Feature kWebAuthCableSecondFactor{
+     "WebAuthenticationCableSecondFactor", base::FEATURE_ENABLED_BY_DEFAULT};
+ 
+-extern const base::Feature kWebAuthPhoneSupport{
+-    "WebAuthenticationPhoneSupport", base::FEATURE_ENABLED_BY_DEFAULT};
++extern const base::Feature kWebAuthPhoneSupport{                          // disabled by default in Bromite
++    "WebAuthenticationPhoneSupport", base::FEATURE_DISABLED_BY_DEFAULT};  // ^
+ 
+ extern const base::Feature kWebAuthCableDisco{
+     "WebAuthenticationCableDisco", base::FEATURE_DISABLED_BY_DEFAULT};
 diff --git a/remoting/android/client_java_tmpl.gni b/remoting/android/client_java_tmpl.gni
 diff --git a/remoting/android/client_java_tmpl.gni b/remoting/android/client_java_tmpl.gni
 --- a/remoting/android/client_java_tmpl.gni
 --- a/remoting/android/client_java_tmpl.gni
 +++ b/remoting/android/client_java_tmpl.gni
 +++ b/remoting/android/client_java_tmpl.gni

+ 4 - 4
build/patches/Remove-contextual-search-manager.patch

@@ -70,7 +70,7 @@ Subject: Remove contextual search manager
 diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn
 diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn
 --- a/chrome/BUILD.gn
 --- a/chrome/BUILD.gn
 +++ b/chrome/BUILD.gn
 +++ b/chrome/BUILD.gn
-@@ -1647,20 +1647,10 @@ group("strings") {
+@@ -1650,20 +1650,10 @@ group("strings") {
  }
  }
  
  
  if (is_android) {
  if (is_android) {
@@ -1479,7 +1479,7 @@ diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
  
  
  const FeatureEntry::FeatureParam kRelatedSearchesUrl = {"stamp", "1Ru"};
  const FeatureEntry::FeatureParam kRelatedSearchesUrl = {"stamp", "1Ru"};
  const FeatureEntry::FeatureParam kRelatedSearchesContent = {"stamp", "1Rc"};
  const FeatureEntry::FeatureParam kRelatedSearchesContent = {"stamp", "1Rc"};
-@@ -2985,70 +2968,6 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -2986,70 +2969,6 @@ const FeatureEntry kFeatureEntries[] = {
       flag_descriptions::kCSSContainerQueriesDescription, kOsAll,
       flag_descriptions::kCSSContainerQueriesDescription, kOsAll,
       FEATURE_VALUE_TYPE(blink::features::kCSSContainerQueries)},
       FEATURE_VALUE_TYPE(blink::features::kCSSContainerQueries)},
  #if BUILDFLAG(IS_ANDROID)
  #if BUILDFLAG(IS_ANDROID)
@@ -1576,7 +1576,7 @@ diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
 +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
-@@ -785,49 +785,6 @@ CHAR_LIMIT guidelines:
+@@ -788,49 +788,6 @@ CHAR_LIMIT guidelines:
        <message name="IDS_PREFS_PRIVACY_SECURITY" desc="Title for the Privacy and Security preferences. [CHAR_LIMIT=32]">
        <message name="IDS_PREFS_PRIVACY_SECURITY" desc="Title for the Privacy and Security preferences. [CHAR_LIMIT=32]">
          Privacy and security
          Privacy and security
        </message>
        </message>
@@ -1626,7 +1626,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro
        <message name="IDS_DO_NOT_TRACK_TITLE" desc="Title for 'Do Not Track' preference">
        <message name="IDS_DO_NOT_TRACK_TITLE" desc="Title for 'Do Not Track' preference">
          “Do Not Track”
          “Do Not Track”
        </message>
        </message>
-@@ -3859,41 +3816,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
+@@ -3862,41 +3819,6 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
          Tabs
          Tabs
        </message>
        </message>
  
  

+ 6 - 53
build/patches/Remove-signin-integrations.patch

@@ -18,7 +18,7 @@ ld.lld: error: undefined symbol: notifier::NotifierOptions::NotifierOptions()
 >>>               impl/invalidation_service_util.o:(invalidation::ParseNotifierOptions(base::CommandLine const&)) in archive obj/components/invalidation/impl/libimpl.a
 >>>               impl/invalidation_service_util.o:(invalidation::ParseNotifierOptions(base::CommandLine const&)) in archive obj/components/invalidation/impl/libimpl.a
 ---
 ---
  chrome/android/BUILD.gn                       |   1 -
  chrome/android/BUILD.gn                       |   1 -
- chrome/android/chrome_java_sources.gni        |  34 ----
+ chrome/android/chrome_java_sources.gni        |  32 ----
  .../PriceTrackingUtilities.java               |   5 +-
  .../PriceTrackingUtilities.java               |   5 +-
  .../browser/feed/FeedSurfaceCoordinator.java  |   5 +-
  .../browser/feed/FeedSurfaceCoordinator.java  |   5 +-
  .../browser/feed/FeedSurfaceMediator.java     |  79 +-------
  .../browser/feed/FeedSurfaceMediator.java     |  79 +-------
@@ -56,7 +56,7 @@ ld.lld: error: undefined symbol: notifier::NotifierOptions::NotifierOptions()
  .../tasks/ReturnToChromeExperimentsUtil.java  |   9 +-
  .../tasks/ReturnToChromeExperimentsUtil.java  |   9 +-
  chrome/browser/BUILD.gn                       |  10 -
  chrome/browser/BUILD.gn                       |  10 -
  .../browser/firstrun/MobileFreProgress.java   |   4 +-
  .../browser/firstrun/MobileFreProgress.java   |   4 +-
- .../chrome_password_manager_client.cc         |  24 ---
+ .../chrome_password_manager_client.cc         |   7 -
  .../chrome_password_manager_client.h          |   1 -
  .../chrome_password_manager_client.h          |   1 -
  .../res/layout/privacy_review_msbb_step.xml   |   8 -
  .../res/layout/privacy_review_msbb_step.xml   |   8 -
  .../identity_services_provider_android.cc     |   9 -
  .../identity_services_provider_android.cc     |   9 -
@@ -77,7 +77,7 @@ ld.lld: error: undefined symbol: notifier::NotifierOptions::NotifierOptions()
  .../signin/SystemAccountManagerDelegate.java  |  25 +--
  .../signin/SystemAccountManagerDelegate.java  |  25 +--
  .../net/HttpNegotiateAuthenticator.java       |  88 +--------
  .../net/HttpNegotiateAuthenticator.java       |  88 +--------
  .../chromoting/base/OAuthTokenFetcher.java    |   2 -
  .../chromoting/base/OAuthTokenFetcher.java    |   2 -
- 60 files changed, 48 insertions(+), 1391 deletions(-)
+ 60 files changed, 48 insertions(+), 1372 deletions(-)
 
 
 diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
 diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
 --- a/chrome/android/BUILD.gn
 --- a/chrome/android/BUILD.gn
@@ -124,16 +124,7 @@ diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java
    "java/src/org/chromium/chrome/browser/ntp/search/SearchBoxContainerView.java",
    "java/src/org/chromium/chrome/browser/ntp/search/SearchBoxContainerView.java",
    "java/src/org/chromium/chrome/browser/ntp/search/SearchBoxCoordinator.java",
    "java/src/org/chromium/chrome/browser/ntp/search/SearchBoxCoordinator.java",
    "java/src/org/chromium/chrome/browser/ntp/search/SearchBoxMediator.java",
    "java/src/org/chromium/chrome/browser/ntp/search/SearchBoxMediator.java",
-@@ -887,8 +882,6 @@ chrome_java_sources = [
-   "java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksShim.java",
-   "java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java",
-   "java/src/org/chromium/chrome/browser/password_manager/AccountChooserDialog.java",
--  "java/src/org/chromium/chrome/browser/password_manager/AutoSigninFirstRunDialog.java",
--  "java/src/org/chromium/chrome/browser/password_manager/AutoSigninSnackbarController.java",
-   "java/src/org/chromium/chrome/browser/password_manager/Credential.java",
-   "java/src/org/chromium/chrome/browser/password_manager/CredentialLeakDialogBridge.java",
-   "java/src/org/chromium/chrome/browser/password_manager/GooglePasswordManagerUIProvider.java",
-@@ -1028,16 +1021,6 @@ chrome_java_sources = [
+@@ -1028,16 +1023,6 @@ chrome_java_sources = [
    "java/src/org/chromium/chrome/browser/sharing/shared_clipboard/SharedClipboardMetrics.java",
    "java/src/org/chromium/chrome/browser/sharing/shared_clipboard/SharedClipboardMetrics.java",
    "java/src/org/chromium/chrome/browser/sharing/shared_clipboard/SharedClipboardShareActivity.java",
    "java/src/org/chromium/chrome/browser/sharing/shared_clipboard/SharedClipboardShareActivity.java",
    "java/src/org/chromium/chrome/browser/sharing/sms_fetcher/SmsFetcherMessageHandler.java",
    "java/src/org/chromium/chrome/browser/sharing/sms_fetcher/SmsFetcherMessageHandler.java",
@@ -150,7 +141,7 @@ diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java
    "java/src/org/chromium/chrome/browser/site_settings/ChromeSiteSettingsDelegate.java",
    "java/src/org/chromium/chrome/browser/site_settings/ChromeSiteSettingsDelegate.java",
    "java/src/org/chromium/chrome/browser/site_settings/CookieControlsServiceBridge.java",
    "java/src/org/chromium/chrome/browser/site_settings/CookieControlsServiceBridge.java",
    "java/src/org/chromium/chrome/browser/site_settings/ManageSpaceActivity.java",
    "java/src/org/chromium/chrome/browser/site_settings/ManageSpaceActivity.java",
-@@ -1076,23 +1059,6 @@ chrome_java_sources = [
+@@ -1076,23 +1061,6 @@ chrome_java_sources = [
    "java/src/org/chromium/chrome/browser/survey/ChromeSurveyController.java",
    "java/src/org/chromium/chrome/browser/survey/ChromeSurveyController.java",
    "java/src/org/chromium/chrome/browser/survey/SurveyController.java",
    "java/src/org/chromium/chrome/browser/survey/SurveyController.java",
    "java/src/org/chromium/chrome/browser/survey/SurveyHttpClientBridge.java",
    "java/src/org/chromium/chrome/browser/survey/SurveyHttpClientBridge.java",
@@ -2319,45 +2310,7 @@ diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b
  #include "components/site_isolation/site_isolation_policy.h"
  #include "components/site_isolation/site_isolation_policy.h"
  #include "components/sync/driver/sync_service.h"
  #include "components/sync/driver/sync_service.h"
  #include "components/sync/driver/sync_user_settings.h"
  #include "components/sync/driver/sync_user_settings.h"
-@@ -122,8 +119,6 @@
- #include "chrome/browser/android/tab_android.h"
- #include "chrome/browser/autofill/manual_filling_controller.h"
- #include "chrome/browser/password_manager/android/account_chooser_dialog_android.h"
--#include "chrome/browser/password_manager/android/auto_signin_first_run_dialog_android.h"
--#include "chrome/browser/password_manager/android/auto_signin_prompt_controller.h"
- #include "chrome/browser/password_manager/android/credential_leak_controller_android.h"
- #include "chrome/browser/password_manager/android/generated_password_saved_infobar_delegate_android.h"
- #include "chrome/browser/password_manager/android/password_accessory_controller.h"
-@@ -488,12 +483,6 @@ void ChromePasswordManagerClient::NotifyUserAutoSignin(
-     const url::Origin& origin) {
-   DCHECK(!local_forms.empty());
-   helper_.NotifyUserAutoSignin();
--#if BUILDFLAG(IS_ANDROID)
--  ShowAutoSigninPrompt(web_contents(), local_forms[0]->username_value);
--#else
--  PasswordsClientUIDelegateFromWebContents(web_contents())
--      ->OnAutoSignin(std::move(local_forms), origin);
--#endif
- }
- 
- void ChromePasswordManagerClient::NotifyUserCouldBeAutoSignedIn(
-@@ -695,15 +684,6 @@ net::CertStatus ChromePasswordManagerClient::GetMainFrameCertStatus() const {
- }
- 
- void ChromePasswordManagerClient::PromptUserToEnableAutosignin() {
--#if BUILDFLAG(IS_ANDROID)
--  // Dialog is deleted by the Java counterpart after user interacts with it.
--  AutoSigninFirstRunDialogAndroid* auto_signin_first_run_dialog =
--      new AutoSigninFirstRunDialogAndroid(web_contents());
--  auto_signin_first_run_dialog->ShowDialog();
--#else
--  PasswordsClientUIDelegateFromWebContents(web_contents())
--      ->OnPromptEnableAutoSignin();
--#endif
- }
- 
- // TODO(https://crbug.com/1225171): If off-the-record Guest is not deprecated,
-@@ -893,10 +873,6 @@ favicon::FaviconService* ChromePasswordManagerClient::GetFaviconService() {
+@@ -893,10 +890,6 @@ favicon::FaviconService* ChromePasswordManagerClient::GetFaviconService() {
        profile_, ServiceAccessType::EXPLICIT_ACCESS);
        profile_, ServiceAccessType::EXPLICIT_ACCESS);
  }
  }
  
  

+ 2 - 2
build/patches/Restore-Search-Ready-Omnibox-flag.patch

@@ -20,7 +20,7 @@ Disable search-ready omnibox by default
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
-@@ -3499,8 +3499,8 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -3500,8 +3500,8 @@ const FeatureEntry kFeatureEntries[] = {
  #if defined(USE_AURA)
  #if defined(USE_AURA)
      {"overscroll-history-navigation",
      {"overscroll-history-navigation",
       flag_descriptions::kOverscrollHistoryNavigationName,
       flag_descriptions::kOverscrollHistoryNavigationName,
@@ -30,7 +30,7 @@ diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
      {"pull-to-refresh", flag_descriptions::kPullToRefreshName,
      {"pull-to-refresh", flag_descriptions::kPullToRefreshName,
       flag_descriptions::kPullToRefreshDescription, kOsAura,
       flag_descriptions::kPullToRefreshDescription, kOsAura,
       MULTI_VALUE_TYPE(kPullToRefreshChoices)},
       MULTI_VALUE_TYPE(kPullToRefreshChoices)},
-@@ -7818,6 +7818,9 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -7819,6 +7819,9 @@ const FeatureEntry kFeatureEntries[] = {
       flag_descriptions::kDesksTrackpadSwipeImprovementsDescription, kOsCrOS,
       flag_descriptions::kDesksTrackpadSwipeImprovementsDescription, kOsCrOS,
       FEATURE_VALUE_TYPE(ash::features::kEnableDesksTrackpadSwipeImprovements)},
       FEATURE_VALUE_TYPE(ash::features::kEnableDesksTrackpadSwipeImprovements)},
  #endif
  #endif

+ 1 - 1
build/patches/Restore-Simplified-NTP-launch.patch

@@ -310,7 +310,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/Sug
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
-@@ -4173,6 +4173,9 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -4174,6 +4174,9 @@ const FeatureEntry kFeatureEntries[] = {
       SINGLE_VALUE_TYPE_AND_VALUE(
       SINGLE_VALUE_TYPE_AND_VALUE(
           switches::kForceShowUpdateMenuItemCustomSummary,
           switches::kForceShowUpdateMenuItemCustomSummary,
           "Custom Summary")},
           "Custom Summary")},

+ 1 - 1
build/patches/Restore-offline-indicator-v2-flag.patch

@@ -9,7 +9,7 @@ Subject: Restore offline-indicator-v2 flag
 diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
 diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
 --- a/chrome/browser/flag-metadata.json
 --- a/chrome/browser/flag-metadata.json
 +++ b/chrome/browser/flag-metadata.json
 +++ b/chrome/browser/flag-metadata.json
-@@ -4335,9 +4335,9 @@
+@@ -4336,9 +4336,9 @@
      "expiry_milestone": 98
      "expiry_milestone": 98
    },
    },
    {
    {

+ 1 - 1
build/patches/Revert-flags-remove-disable-pull-to-refresh-effect.patch

@@ -13,7 +13,7 @@ This reverts commit 4e598f38a0e6dd3dbede009c6a99b2a520a94e1f.
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 --- a/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
 +++ b/chrome/browser/about_flags.cc
-@@ -3545,6 +3545,10 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -3546,6 +3546,10 @@ const FeatureEntry kFeatureEntries[] = {
       flag_descriptions::kEnableVulkanDescription,
       flag_descriptions::kEnableVulkanDescription,
       kOsWin | kOsLinux | kOsAndroid, FEATURE_VALUE_TYPE(features::kVulkan)},
       kOsWin | kOsLinux | kOsAndroid, FEATURE_VALUE_TYPE(features::kVulkan)},
  #if BUILDFLAG(IS_ANDROID)
  #if BUILDFLAG(IS_ANDROID)

+ 2 - 2
build/patches/Revert-flags-remove-num-raster-threads.patch

@@ -29,7 +29,7 @@ diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
  const FeatureEntry::Choice kTouchTextSelectionStrategyChoices[] = {
  const FeatureEntry::Choice kTouchTextSelectionStrategyChoices[] = {
      {flags_ui::kGenericExperimentChoiceDefault, "", ""},
      {flags_ui::kGenericExperimentChoiceDefault, "", ""},
      {flag_descriptions::kTouchSelectionStrategyCharacter,
      {flag_descriptions::kTouchSelectionStrategyCharacter,
-@@ -3775,6 +3784,9 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -3776,6 +3785,9 @@ const FeatureEntry kFeatureEntries[] = {
      {"restricted-api-origins", flag_descriptions::kRestrictedApiOriginsName,
      {"restricted-api-origins", flag_descriptions::kRestrictedApiOriginsName,
       flag_descriptions::kRestrictedApiOriginsDescription, kOsAll,
       flag_descriptions::kRestrictedApiOriginsDescription, kOsAll,
       ORIGIN_LIST_VALUE_TYPE(switches::kRestrictedApiOrigins, "")},
       ORIGIN_LIST_VALUE_TYPE(switches::kRestrictedApiOrigins, "")},
@@ -42,7 +42,7 @@ diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
 diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
 diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
 --- a/chrome/browser/flag-metadata.json
 --- a/chrome/browser/flag-metadata.json
 +++ b/chrome/browser/flag-metadata.json
 +++ b/chrome/browser/flag-metadata.json
-@@ -4294,6 +4294,11 @@
+@@ -4295,6 +4295,11 @@
      "owners": [ "mahmadi", "mfacey" ],
      "owners": [ "mahmadi", "mfacey" ],
      "expiry_milestone": 100
      "expiry_milestone": 100
    },
    },

+ 44 - 0
build/patches/Samsung-Note-9-SDK27-crazylinker-workaround.patch

@@ -0,0 +1,44 @@
+From: uazo <uazo@users.noreply.github.com>
+Date: Thu, 3 Feb 2022 19:48:49 +0000
+Subject: Samsung Note 9 SDK27 crazylinker workaround
+
+---
+ .../base/library_loader/LibraryLoader.java    | 23 ++++++++++++++++++-
+ 1 file changed, 22 insertions(+), 1 deletion(-)
+
+diff --git a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
+--- a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
++++ b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
+@@ -507,8 +507,29 @@ public class LibraryLoader {
+     // Note: This cannot be done in the build configuration, as otherwise chrome_public_apk cannot
+     // both be used as the basis to ship on L, and the default APK used by developers on 10+.
+     private boolean forceSystemLinker() {
+-        return mUseChromiumLinker && !mUseModernLinker
++        boolean result = false;
++        String manufacturer = Build.MANUFACTURER.toLowerCase(Locale.US);
++        if (manufacturer.equals("samsung")
++                && Build.MODEL != null
++                && Build.MODEL.equals("SM-N960F")) {
++            // Samsung Galaxy Note 9 (on Android 8.1) - Model SM-N960F
++            // crashes on startup (base::MessagePumpForUI::MessagePumpForUI) due to
++            // some odd RELRO incompatibility in the device ROM.
++            // This workaround disables relocation sharing but allows device to start up.
++            // See also:
++            // * https://bugs.chromium.org/p/chromium/issues/detail?id=980304
++            // * https://groups.google.com/a/chromium.org/g/chromium-dev/c/iAb7QUiNPLw
++            result = true;
++        } else {
++            result = mUseChromiumLinker && !mUseModernLinker
+                 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q;
++        }
++        if (result) {
++            Log.d(TAG,
++                    "Forcing system linker, relocations will not be shared. "
++                            + "This negatively impacts memory usage.");
++        }
++        return result;
+     }
+ 
+     // Whether a Linker subclass is used for loading. Even if returns |true|, the Linker can
+--
+2.25.1

+ 6 - 6
build/patches/User-agent-customization.patch

@@ -80,7 +80,7 @@ diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_ja
 diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
 diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
 --- a/chrome/android/chrome_java_sources.gni
 --- a/chrome/android/chrome_java_sources.gni
 +++ b/chrome/android/chrome_java_sources.gni
 +++ b/chrome/android/chrome_java_sources.gni
-@@ -888,6 +888,7 @@ chrome_java_sources = [
+@@ -890,6 +890,7 @@ chrome_java_sources = [
    "java/src/org/chromium/chrome/browser/payments/ui/DimmingDialog.java",
    "java/src/org/chromium/chrome/browser/payments/ui/DimmingDialog.java",
    "java/src/org/chromium/chrome/browser/payments/ui/LineItem.java",
    "java/src/org/chromium/chrome/browser/payments/ui/LineItem.java",
    "java/src/org/chromium/chrome/browser/payments/ui/PaymentAppComparator.java",
    "java/src/org/chromium/chrome/browser/payments/ui/PaymentAppComparator.java",
@@ -539,7 +539,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
  import org.chromium.base.supplier.Supplier;
  import org.chromium.base.supplier.Supplier;
  import org.chromium.chrome.R;
  import org.chromium.chrome.R;
  import org.chromium.chrome.browser.ActivityUtils;
  import org.chromium.chrome.browser.ActivityUtils;
-@@ -495,6 +499,31 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
+@@ -508,6 +512,31 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
              // Request desktop sites for large screen tablets if necessary.
              // Request desktop sites for large screen tablets if necessary.
              params.setOverrideUserAgent(calculateUserAgentOverrideOption());
              params.setOverrideUserAgent(calculateUserAgentOverrideOption());
  
  
@@ -571,7 +571,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
              @TabLoadStatus
              @TabLoadStatus
              int result = loadUrlInternal(params);
              int result = loadUrlInternal(params);
  
  
-@@ -1485,6 +1514,10 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
+@@ -1534,6 +1563,10 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
              if (mWebContents != null) mWebContents.getNavigationController().loadIfNecessary();
              if (mWebContents != null) mWebContents.getNavigationController().loadIfNecessary();
              mIsBeingRestored = true;
              mIsBeingRestored = true;
              for (TabObserver observer : mObservers) observer.onRestoreStarted(this);
              for (TabObserver observer : mObservers) observer.onRestoreStarted(this);
@@ -582,7 +582,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
          } finally {
          } finally {
              TraceEvent.end("Tab.restoreIfNeeded");
              TraceEvent.end("Tab.restoreIfNeeded");
          }
          }
-@@ -1687,6 +1720,43 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
+@@ -1736,6 +1769,43 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
                  /* forcedByUser */ false);
                  /* forcedByUser */ false);
      }
      }
  
  
@@ -629,7 +629,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
 diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.java
 diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.java
 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.java
 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.java
 +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.java
 +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.java
-@@ -30,6 +30,10 @@ import org.chromium.ui.base.WindowAndroid;
+@@ -28,6 +28,10 @@ import org.chromium.ui.base.WindowAndroid;
  import org.chromium.ui.display.DisplayAndroidManager;
  import org.chromium.ui.display.DisplayAndroidManager;
  import org.chromium.url.GURL;
  import org.chromium.url.GURL;
  
  
@@ -640,7 +640,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUtils.ja
  /**
  /**
   * Collection of utility methods that operates on Tab.
   * Collection of utility methods that operates on Tab.
   */
   */
-@@ -93,18 +97,15 @@ public class TabUtils {
+@@ -90,18 +94,15 @@ public class TabUtils {
       * @param forcedByUser Whether this was triggered by users action.
       * @param forcedByUser Whether this was triggered by users action.
       */
       */
      public static void switchUserAgent(Tab tab, boolean switchToDesktop, boolean forcedByUser) {
      public static void switchUserAgent(Tab tab, boolean switchToDesktop, boolean forcedByUser) {

+ 83 - 8
build/patches/autofill-disable-autofill-download-manager.patch → build/patches/autofill-miscellaneous.patch

@@ -1,17 +1,35 @@
-From: Jan Engelhardt <jengelh@inai.de>
-Date: Thu, 11 Sep 2014 16:37:32 +0200
-Subject: autofill: disable autofill download manager
+From: csagan5 <32685696+csagan5@users.noreply.github.com>
+Date:   Mon Apr 11 23:29:29 2022 +0200
+Subject: autofill: miscellaneous
 
 
-Disables the autofill download manager (trk:158).
-
-Make sure that autofill is disabled by default
+Make sure that autofill is disabled by default (Jan Engelhardt <jengelh@inai.de>)
+Disable autofill download manager (Jan Engelhardt <jengelh@inai.de>)
+Disable autofill assistant and CC (csagan5)
+Disable autofill server communication by default (Daniel Micay <danielmicay@gmail.com>)
+Do not skip google.com domains for password generation (csagan5)
 ---
 ---
+ .../AutofillAssistantPreferencesUtil.java     |  2 +-
  .../core/browser/autofill_download_manager.cc | 35 +++----------------
  .../core/browser/autofill_download_manager.cc | 35 +++----------------
  .../core/browser/autofill_download_manager.h  |  2 --
  .../core/browser/autofill_download_manager.h  |  2 --
  .../autofill/core/browser/autofill_manager.cc | 20 -----------
  .../autofill/core/browser/autofill_manager.cc | 20 -----------
- .../autofill/core/common/autofill_prefs.cc    |  2 +-
- 4 files changed, 6 insertions(+), 53 deletions(-)
+ .../core/browser/browser_autofill_manager.h   |  4 +--
+ .../autofill/core/common/autofill_features.cc |  2 +-
+ .../autofill/core/common/autofill_prefs.cc    |  4 +--
+ .../password_generation_frame_helper.cc       |  4 ---
+ 8 files changed, 11 insertions(+), 62 deletions(-)
 
 
+diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java
+--- a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java
++++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java
+@@ -32,7 +32,7 @@ public class AutofillAssistantPreferencesUtil {
+ 
+     /** Checks whether the Autofill Assistant switch preference in settings is on. */
+     static boolean isAutofillAssistantSwitchOn() {
+-        return getAssistantEnabledPreference(true);
++        return getAssistantEnabledPreference(false);
+     }
+ 
+     /** Checks whether proactive help is enabled. */
 diff --git a/components/autofill/core/browser/autofill_download_manager.cc b/components/autofill/core/browser/autofill_download_manager.cc
 diff --git a/components/autofill/core/browser/autofill_download_manager.cc b/components/autofill/core/browser/autofill_download_manager.cc
 --- a/components/autofill/core/browser/autofill_download_manager.cc
 --- a/components/autofill/core/browser/autofill_download_manager.cc
 +++ b/components/autofill/core/browser/autofill_download_manager.cc
 +++ b/components/autofill/core/browser/autofill_download_manager.cc
@@ -120,6 +138,33 @@ diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/a
    if (client) {
    if (client) {
      translate::TranslateDriver* translate_driver = client->GetTranslateDriver();
      translate::TranslateDriver* translate_driver = client->GetTranslateDriver();
      if (translate_driver) {
      if (translate_driver) {
+diff --git a/components/autofill/core/browser/browser_autofill_manager.h b/components/autofill/core/browser/browser_autofill_manager.h
+--- a/components/autofill/core/browser/browser_autofill_manager.h
++++ b/components/autofill/core/browser/browser_autofill_manager.h
+@@ -701,9 +701,9 @@ class BrowserAutofillManager : public AutofillManager,
+   std::unique_ptr<CreditCardFormEventLogger> credit_card_form_event_logger_;
+ 
+   // Have we logged whether Autofill is enabled for this page load?
+-  bool has_logged_autofill_enabled_ = false;
++  bool has_logged_autofill_enabled_ = true;
+   // Have we logged an address suggestions count metric for this page?
+-  bool has_logged_address_suggestions_count_ = false;
++  bool has_logged_address_suggestions_count_ = true;
+   // Have we shown Autofill suggestions at least once?
+   bool did_show_suggestions_ = false;
+   // Has the user manually edited at least one form field among the autofillable
+diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc
+--- a/components/autofill/core/common/autofill_features.cc
++++ b/components/autofill/core/common/autofill_features.cc
+@@ -384,7 +384,7 @@ const base::Feature kAutofillSectionUponRedundantNameInfo{
+ // "upload" resources.
+ // i.e., https://other.autofill.server:port/tbproxy/af/
+ const base::Feature kAutofillServerCommunication{
+-    "AutofillServerCommunication", base::FEATURE_ENABLED_BY_DEFAULT};
++    "AutofillServerCommunication", base::FEATURE_DISABLED_BY_DEFAULT};
+ 
+ // Controls whether Autofill may fill across origins as part of the
+ // AutofillAcrossIframes experiment.
 diff --git a/components/autofill/core/common/autofill_prefs.cc b/components/autofill/core/common/autofill_prefs.cc
 diff --git a/components/autofill/core/common/autofill_prefs.cc b/components/autofill/core/common/autofill_prefs.cc
 --- a/components/autofill/core/common/autofill_prefs.cc
 --- a/components/autofill/core/common/autofill_prefs.cc
 +++ b/components/autofill/core/common/autofill_prefs.cc
 +++ b/components/autofill/core/common/autofill_prefs.cc
@@ -132,5 +177,35 @@ diff --git a/components/autofill/core/common/autofill_prefs.cc b/components/auto
        user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
        user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
    registry->RegisterIntegerPref(
    registry->RegisterIntegerPref(
        prefs::kAutofillLastVersionDeduped, 0,
        prefs::kAutofillLastVersionDeduped, 0,
+@@ -147,7 +147,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
+       prefs::kAutofillLastVersionDisusedAddressesDeleted, 0,
+       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
+   registry->RegisterBooleanPref(
+-      prefs::kAutofillCreditCardEnabled, true,
++      prefs::kAutofillCreditCardEnabled, false,
+       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
+   registry->RegisterStringPref(
+       prefs::kAutofillProfileValidity, "",
+diff --git a/components/password_manager/core/browser/password_generation_frame_helper.cc b/components/password_manager/core/browser/password_generation_frame_helper.cc
+--- a/components/password_manager/core/browser/password_generation_frame_helper.cc
++++ b/components/password_manager/core/browser/password_generation_frame_helper.cc
+@@ -85,7 +85,6 @@ void PasswordGenerationFrameHelper::ProcessPasswordRequirements(
+ // In order for password generation to be enabled, we need to make sure:
+ // (1) Password sync is enabled, and
+ // (2) Password saving is enabled
+-// (3) The current page is not *.google.com.
+ bool PasswordGenerationFrameHelper::IsGenerationEnabled(
+     bool log_debug_data) const {
+   std::unique_ptr<Logger> logger;
+@@ -95,9 +94,6 @@ bool PasswordGenerationFrameHelper::IsGenerationEnabled(
+   }
+ 
+   GURL url = driver_->GetLastCommittedURL();
+-  if (url.DomainIs("google.com"))
+-    return false;
+-
+   if (!client_->IsSavingAndFillingEnabled(url)) {
+     if (logger)
+       logger->LogMessage(Logger::STRING_GENERATION_DISABLED_SAVING_DISABLED);
 --
 --
 2.25.1
 2.25.1

+ 0 - 22
build/patches/disable-autofill-server-communication-by-default.patch

@@ -1,22 +0,0 @@
-From: Daniel Micay <danielmicay@gmail.com>
-Date: Tue, 1 Dec 2020 00:56:57 -0500
-Subject: disable autofill server communication by default
-
----
- components/autofill/core/common/autofill_features.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc
---- a/components/autofill/core/common/autofill_features.cc
-+++ b/components/autofill/core/common/autofill_features.cc
-@@ -384,7 +384,7 @@ const base::Feature kAutofillSectionUponRedundantNameInfo{
- // "upload" resources.
- // i.e., https://other.autofill.server:port/tbproxy/af/
- const base::Feature kAutofillServerCommunication{
--    "AutofillServerCommunication", base::FEATURE_ENABLED_BY_DEFAULT};
-+    "AutofillServerCommunication", base::FEATURE_DISABLED_BY_DEFAULT};
- 
- // Controls whether Autofill may fill across origins as part of the
- // AutofillAcrossIframes experiment.
---
-2.25.1

+ 52 - 0
build/patches/webRTC-do-not-expose-local-IP-addresses.patch

@@ -0,0 +1,52 @@
+From: csagan5 <32685696+csagan5@users.noreply.github.com>
+Date: Sat, 9 May 2020 14:42:37 +0200
+Subject: webRTC: do not expose local IP addresses
+
+Prevent leaks of local IP address and public IP address (when using VPN)
+
+See also:
+* build/patches/Change-default-webRTC-policy-to-not-use-any-address.patch
+* https://github.com/bromite/bromite/issues/553
+* https://github.com/bromite/bromite/issues/589
+---
+ chrome/browser/ui/browser_ui_prefs.cc                       | 2 +-
+ .../peerconnection/peer_connection_dependency_factory.cc    | 6 ++++--
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/chrome/browser/ui/browser_ui_prefs.cc b/chrome/browser/ui/browser_ui_prefs.cc
+--- a/chrome/browser/ui/browser_ui_prefs.cc
++++ b/chrome/browser/ui/browser_ui_prefs.cc
+@@ -93,7 +93,7 @@ void RegisterBrowserUserPrefs(user_prefs::PrefRegistrySyncable* registry) {
+                                 false);
+ #endif
+   registry->RegisterStringPref(prefs::kWebRTCIPHandlingPolicy,
+-                               blink::kWebRTCIPHandlingDefault);
++                               blink::kWebRTCIPHandlingDisableNonProxiedUdp);
+   registry->RegisterStringPref(prefs::kWebRTCUDPPortRange, std::string());
+   registry->RegisterBooleanPref(prefs::kWebRtcEventLogCollectionAllowed, false);
+   registry->RegisterListPref(prefs::kWebRtcLocalIpsAllowedUrls);
+diff --git a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc
+--- a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc
++++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc
+@@ -106,7 +106,9 @@ WebRTCIPHandlingPolicy GetWebRTCIPHandlingPolicy(const String& preference) {
+     return kDefaultPublicInterfaceOnly;
+   if (preference == kWebRTCIPHandlingDisableNonProxiedUdp)
+     return kDisableNonProxiedUdp;
+-  return kDefault;
++  if (preference == kWebRTCIPHandlingDefault)
++    return kDefault;
++  return kDisableNonProxiedUdp;
+ }
+ 
+ bool IsValidPortRange(uint16_t min_port, uint16_t max_port) {
+@@ -826,7 +828,7 @@ PeerConnectionDependencyFactory::CreatePortAllocator(
+           break;
+       }
+ 
+-      VLOG(3) << "WebRTC routing preferences: "
++      LOG(INFO) << "WebRTC routing preferences: "
+               << "policy: " << policy
+               << ", multiple_routes: " << port_config.enable_multiple_routes
+               << ", nonproxied_udp: " << port_config.enable_nonproxied_udp
+--
+2.25.1

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