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`
         3. Yes, I have copy/pasted the crash dump
       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:
       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
 * allow OpenSearch search engine URLs with path
 * disable AsyncDNS by default
@@ -7,6 +22,7 @@
 * 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)
 * 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
 * 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).
 
 ## 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?
 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
 Disable-NTP-remote-suggestions-by-default.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
 ungoogled-chromium-Disable-webRTC-log-uploader.patch
 ungoogled-chromium-Disable-untraceable-URLs.patch
@@ -52,6 +52,7 @@ Multiple-fingerprinting-mitigations.patch
 Add-flag-to-configure-maximum-connections-per-host.patch
 Do-not-ignore-download-location-prompt-setting.patch
 Add-bookmark-import-export-actions.patch
+Bookmarks-select-all-menu-entry.patch
 Add-an-always-incognito-mode.patch
 Add-history-support-in-incognito-mode.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
 profile-resetter-do-not-tick-send-settings-by-default.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
 translate-disable-fetching-of-languages-from-server.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-some-signed-exchange-features.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
 Revert-flags-remove-disable-pull-to-refresh-effect.patch
 Use-dummy-DFM-installer.patch
 Disable-feeds-support-by-default.patch
-Disable-autofill-assistant-by-default.patch
 Show-site-settings-for-cookies-javascript-and-ads.patch
 Disable-DRM-media-origin-IDs-preprovisioning.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
 Disable-text-fragments-by-default.patch
 disable-WebView-variations-support.patch
-disable-autofill-server-communication-by-default.patch
 ask-permission-to-play-protected-media-by-default.patch
 Enable-network-isolation-features.patch
-Disable-unified-autoplay-feature.patch
 Revert-flags-remove-num-raster-threads.patch
 webview-Hard-no-to-persistent-histograms.patch
 Ignore-enterprise-policies-for-secure-DNS.patch
@@ -164,7 +163,6 @@ Enable-share-intent.patch
 Site-setting-for-images.patch
 Bromite-auto-updater.patch
 Experimental-user-scripts-support.patch
-Enable-native-Android-autofill.patch
 Keep-empty-tabs-between-sessions.patch
 Disable-third-party-origin-trials.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
 Revert-Disable-Dictionary-suggestions-for-the-Omnibox.patch
 Disable-AsyncDNS-by-default.patch
+Add-lifetime-options-for-permissions.patch
+Disable-crash-reporting.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
 --- a/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,
       flag_descriptions::kCSSContainerQueriesDescription, kOsAll,
       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
 --- a/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::kRequestDesktopSiteExceptionsDescription, kOsAndroid,
       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
 --- a/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.">
          Clears history from all synced devices.
        </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.h              |   4 +
- .../org/chromium/base/ContentUriUtils.java    |  32 ++
+ .../org/chromium/base/ContentUriUtils.java    |  33 ++
  chrome/android/java/AndroidManifest.xml       |   1 -
  .../res/menu/bookmark_action_bar_menu.xml     |  14 +
  .../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 +
  .../select_file_dialog_android.cc             |   6 +
  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
 --- 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.
   */
-@@ -89,6 +92,35 @@ public abstract class ContentUriUtils {
+@@ -89,6 +92,36 @@ public abstract class ContentUriUtils {
          return -1;
      }
  
@@ -109,7 +109,7 @@ diff --git a/base/android/java/src/org/chromium/base/ContentUriUtils.java b/base
 +            client.close();
 +            return fd;
 +        } catch (Exception e) {
-+            Log.e(TAG, "Cannot open intermediate Uri.", e);
++            Log.e(TAG, "Cannot open intermediate URI", e);
 +        }
 +        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");
 +            path = Os.readlink("/proc/self/fd/" + pfd.getFd());
 +            pfd.close();
-+        } catch (Throwable t) {
++        } catch (Exception e) {
++            Log.w(TAG, "Cannot get file path from content URI", e);
 +        }
 +        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
 --- a/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)},
  #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
 --- a/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.">
           Show original
        </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[] = {
      {"mode", "always-none"}};
  const FeatureEntry::FeatureParam kAdaptiveButton_AlwaysNewTab[] = {
-@@ -3616,7 +3632,11 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -3617,7 +3633,11 @@ const FeatureEntry kFeatureEntries[] = {
       kOsMac | kOsLinux | kOsWin,
       FEATURE_VALUE_TYPE(features::kSystemNotifications)},
  #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
 --- a/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,
       flag_descriptions::kForceTextDirectionDescription, kOsAll,
       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
  // Estimator (NQE) are also exposed via flags.
  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::kAndroidPictureInPictureAPIDescription, kOsAndroid,
       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
 --- a/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::kWebRtcRemoteEventLogDescription, kOsDesktop,
       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
 --- a/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,
       flag_descriptions::kReaderModeInCCTDescription, kOsAndroid,
       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
 --- a/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.
  const FeatureEntry kFeatureEntries[] = {
  // 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
 --- a/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::kWebrtcCaptureMultiChannelApmDescription, kOsAll,
       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
 --- a/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)},
  #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
 --- a/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",
        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
 --- a/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">
          Your changes will take effect the next time you relaunch Bromite.
        </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
 --- a/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
 --- a/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]">
          Track prices
        </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
 --- a/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
        </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
 --- a/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.">
          Temporarily links this data to your Google Account when you’re signed in, to protect you across Google apps
        </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
 --- a/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_utils_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
 --- a/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.">
          IMAGE
        </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
 --- a/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.">
          Last hour
        </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
 --- a/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/PermissionUpdateRequester.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
 --- a/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">
          Chrome updates are no longer supported for this version of Android
        </message>
@@ -1568,7 +1568,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro
  
        <!-- Account management UI strings. -->
        <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 -->
        <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 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
-@@ -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]">
          Android version is unsupported
        </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
 --- a/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.">
          Check now
        </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
 --- a/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)
      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 --
  .../usage_stats/UsageStatsConsentDialog.java  |  5 --
  .../android/chrome_main_delegate_android.cc   |  1 +
- chrome/browser/BUILD.gn                       | 26 ------
+ chrome/browser/BUILD.gn                       | 28 -------
  .../tab_web_contents_delegate_android.cc      |  8 ++
  chrome/browser/browser_process.h              |  7 --
  chrome/browser/browser_process_impl.cc        | 29 -------
@@ -71,7 +71,7 @@ Disable CrowdDeny feature
  .../ui/webui/interstitials/interstitial_ui.cc | 12 +--
  chrome/common/safe_browsing/BUILD.gn          |  7 --
  .../chrome_content_renderer_client.cc         |  2 +
- chrome/test/BUILD.gn                          |  1 -
+ chrome/test/BUILD.gn                          |  2 -
  .../installer_policies/BUILD.gn               |  2 -
  .../permissions/permission_request_manager.cc |  5 +-
  .../safe_browsing/content/browser/BUILD.gn    |  1 -
@@ -87,7 +87,7 @@ Disable CrowdDeny feature
  .../file_system_access_permission_context.h   |  6 --
  weblayer/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
 --- 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.h",
        "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
 --- a/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/sharing/sharing_service_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>
        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(
        g_browser_process->safe_browsing_service());
    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());
      }
    }
@@ -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/password_protection",
        "//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
 --- a/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
 --- a/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/SafeBrowsingReferringAppBridge.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
 --- a/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")},
  #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
 --- a/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",

+ 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
 --- a/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,
       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
 --- a/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",
      "//components/autofill/android:autofill_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
 --- a/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.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}.
   * 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 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}.
       *
-@@ -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);
          mObservers.clear();
  
@@ -224,7 +224,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
          mUserDataHost.destroy();
          mTabViewManager.destroy();
          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;
      }
  
@@ -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
       * 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));
  
              mWebContents.notifyRendererPreferenceUpdate();
@@ -269,7 +269,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
              TabHelpers.initWebContentsHelpers(this);
              notifyContentChanged();
          } 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 loadOriginalImage(long nativeTabAndroid);
          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
 --- a/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]">
          Save passwords
        </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
 --- a/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/SharedClipboardMetrics.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
 --- a/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)},
  #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
 --- a/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
        </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) {
-@@ -556,6 +560,7 @@ android_library("chrome_java") {
+@@ -557,6 +561,7 @@ android_library("chrome_java") {
      "//components/ukm/android:java",
      "//components/url_formatter/android:url_formatter_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
 --- a/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" ]
      }
@@ -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/viz/common/features.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)},
  #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
 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
 --- 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
+@@ -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
              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
 --- a/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">
          Browsing history
        </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
 --- a/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);
  }
  

+ 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
 ---
  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 +
  .../core/dom/extensions/anti_amp_cure.h       |  6 ++
  .../core/dom/extensions/video_bg_play.h       |  6 ++
  .../renderer/core/html/html_script_element.cc |  5 ++
  .../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/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
  using WeakDocumentSet = blink::HeapHashSet<blink::WeakMember<blink::Document>>;
  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;
  }
  
@@ -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";
 +    selected = 1;
 +    // 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";
 +    selected = 2;
 +  } else
@@ -87,7 +90,6 @@ diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink
 +    NOTREACHED();
 +
 +  if (nonce != g_null_atom) {
-+    LOG(INFO) << "using script nonce '" << nonce << "'";
 +    e->setNonce(nonce);
 +  } else
 +    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() {
    DCHECK(!GetScriptableDocumentParser() || !parser_->IsParsing());
    DCHECK(!GetScriptableDocumentParser() || ready_state_ != kLoading);
-@@ -6579,6 +6638,10 @@ void Document::FinishedParsing() {
+@@ -6579,6 +6640,10 @@ void Document::FinishedParsing() {
      if (frame->IsMainFrame() && ShouldMarkFontPerformance())
        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
 --- a/chrome/browser/flag-metadata.json
 +++ b/chrome/browser/flag-metadata.json
-@@ -3688,9 +3688,9 @@
+@@ -3689,9 +3689,9 @@
      "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 +-
  .../resources/settings/reset_page/reset_profile_dialog.html | 2 +-
  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/features.cc                    | 2 +-
  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
 --- 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::kBrowserWindowPlacementPopup);
    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
 --- a/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
 --- a/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
        </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 "third_party/blink/public/common/features.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::kWebrtcUseMinMaxVEADimensionsDescription, kOsAll,
       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
 --- a/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,
        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
 --- 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
-@@ -1311,6 +1311,12 @@ public class ExternalNavigationHandler {
+@@ -1328,6 +1328,12 @@ public class ExternalNavigationHandler {
                      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
 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 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
 --- a/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
    // 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);
         entry = controller.GetEntryAtIndex(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
    // 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
    // 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(
        keyword, osdd_url, entry->GetFavicon().url,
        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

+ 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
 ungoogled-chromium: Disable GCM
 Disable Google Cloud Messaging (GCM) client
+Disable web authentication phone support
 
 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 -
  .../features/cablev2_authenticator/BUILD.gn   |   2 -
  chrome/android/java/AndroidManifest.xml       |  68 ---
+ .../java/res/xml/privacy_preferences.xml      |   5 -
  .../org/chromium/chrome/browser/AppHooks.java |  14 +-
  .../browser/PlayServicesVersionInfo.java      |  12 +-
  .../ChromeBackgroundTaskFactory.java          |   3 -
@@ -34,6 +36,7 @@ Parts of this patch were developed by csagan5, uazo and others.
  .../browser/gcore/GoogleApiClientHelper.java  |  82 +--
  .../instantapps/InstantAppsHandler.java       |  57 +-
  .../browser/omaha/UpdateStatusProvider.java   |  10 +-
+ .../privacy/settings/PrivacySettings.java     |   5 -
  .../modules/chrome_feature_modules.gni        |   3 -
  chrome/browser/BUILD.gn                       |   2 -
  .../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/test/BUILD.gn                         |   4 -
  device/BUILD.gn                               |   3 -
+ device/fido/features.cc                       |   4 +-
  remoting/android/client_java_tmpl.gni         |   3 -
  services/BUILD.gn                             |   9 -
  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 +-----------------
  .../preconditions/javatests/BUILD.gn          |   1 -
  .../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/BackgroundTaskSchedulerGcmNetworkManager.java
 
@@ -141,7 +145,7 @@ diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
      "//base:base_java",
      "//cc:cc_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",
      "//third_party/android_deps:android_support_v7_appcompat_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_guava_listenablefuture_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_public_android_manifest",
      ":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_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_jni",
      ":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_test_support",
      "//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 = [
      ":chrome_java",
@@ -182,7 +186,7 @@ diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
      "//base:base_java",
      "//base:base_java_test_support",
      "//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") {
    sources = [
      "../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/DeferredStartupHandler.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/SplitCompatContentProvider.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/SplitCompatJobService.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/prerender/ChromePrerenderService.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",
      "//chrome/browser/download/android:file_provider_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/minidump_uploader:minidump_uploader_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_collection_collection_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.
      # TODO(crbug.com/1126301): Consider moving these to the chrome module to
      # 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/ChromeBackupWatcher.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/SearchWidgetProvider.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
             split preloader more time to work. -->
        <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
 --- a/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) {
+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
 --- a/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
 --- a/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_user_data.cc",
        "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_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
 --- a/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
 --- a/chrome/BUILD.gn
 +++ b/chrome/BUILD.gn
-@@ -1647,20 +1647,10 @@ group("strings") {
+@@ -1650,20 +1650,10 @@ group("strings") {
  }
  
  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 kRelatedSearchesContent = {"stamp", "1Rc"};
-@@ -2985,70 +2968,6 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -2986,70 +2969,6 @@ const FeatureEntry kFeatureEntries[] = {
       flag_descriptions::kCSSContainerQueriesDescription, kOsAll,
       FEATURE_VALUE_TYPE(blink::features::kCSSContainerQueries)},
  #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
 --- a/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]">
          Privacy and security
        </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">
          “Do Not Track”
        </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
        </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
 ---
  chrome/android/BUILD.gn                       |   1 -
- chrome/android/chrome_java_sources.gni        |  34 ----
+ chrome/android/chrome_java_sources.gni        |  32 ----
  .../PriceTrackingUtilities.java               |   5 +-
  .../browser/feed/FeedSurfaceCoordinator.java  |   5 +-
  .../browser/feed/FeedSurfaceMediator.java     |  79 +-------
@@ -56,7 +56,7 @@ ld.lld: error: undefined symbol: notifier::NotifierOptions::NotifierOptions()
  .../tasks/ReturnToChromeExperimentsUtil.java  |   9 +-
  chrome/browser/BUILD.gn                       |  10 -
  .../browser/firstrun/MobileFreProgress.java   |   4 +-
- .../chrome_password_manager_client.cc         |  24 ---
+ .../chrome_password_manager_client.cc         |   7 -
  .../chrome_password_manager_client.h          |   1 -
  .../res/layout/privacy_review_msbb_step.xml   |   8 -
  .../identity_services_provider_android.cc     |   9 -
@@ -77,7 +77,7 @@ ld.lld: error: undefined symbol: notifier::NotifierOptions::NotifierOptions()
  .../signin/SystemAccountManagerDelegate.java  |  25 +--
  .../net/HttpNegotiateAuthenticator.java       |  88 +--------
  .../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
 --- 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/SearchBoxCoordinator.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/SharedClipboardShareActivity.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/CookieControlsServiceBridge.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/SurveyController.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/sync/driver/sync_service.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);
  }
  

+ 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
 --- a/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)
      {"overscroll-history-navigation",
       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,
       flag_descriptions::kPullToRefreshDescription, kOsAura,
       MULTI_VALUE_TYPE(kPullToRefreshChoices)},
-@@ -7818,6 +7818,9 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -7819,6 +7819,9 @@ const FeatureEntry kFeatureEntries[] = {
       flag_descriptions::kDesksTrackpadSwipeImprovementsDescription, kOsCrOS,
       FEATURE_VALUE_TYPE(ash::features::kEnableDesksTrackpadSwipeImprovements)},
  #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
 --- a/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(
           switches::kForceShowUpdateMenuItemCustomSummary,
           "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
 --- a/chrome/browser/flag-metadata.json
 +++ b/chrome/browser/flag-metadata.json
-@@ -4335,9 +4335,9 @@
+@@ -4336,9 +4336,9 @@
      "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
 --- a/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,
       kOsWin | kOsLinux | kOsAndroid, FEATURE_VALUE_TYPE(features::kVulkan)},
  #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[] = {
      {flags_ui::kGenericExperimentChoiceDefault, "", ""},
      {flag_descriptions::kTouchSelectionStrategyCharacter,
-@@ -3775,6 +3784,9 @@ const FeatureEntry kFeatureEntries[] = {
+@@ -3776,6 +3785,9 @@ const FeatureEntry kFeatureEntries[] = {
      {"restricted-api-origins", flag_descriptions::kRestrictedApiOriginsName,
       flag_descriptions::kRestrictedApiOriginsDescription, kOsAll,
       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
 --- a/chrome/browser/flag-metadata.json
 +++ b/chrome/browser/flag-metadata.json
-@@ -4294,6 +4294,11 @@
+@@ -4295,6 +4295,11 @@
      "owners": [ "mahmadi", "mfacey" ],
      "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
 --- a/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/LineItem.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.chrome.R;
  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.
              params.setOverrideUserAgent(calculateUserAgentOverrideOption());
  
@@ -571,7 +571,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav
              @TabLoadStatus
              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();
              mIsBeingRestored = true;
              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 {
              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);
      }
  
@@ -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
 --- a/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.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.
   */
-@@ -93,18 +97,15 @@ public class TabUtils {
+@@ -90,18 +94,15 @@ public class TabUtils {
       * @param forcedByUser Whether this was triggered by users action.
       */
      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.h  |  2 --
  .../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
 --- a/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) {
      translate::TranslateDriver* translate_driver = client->GetTranslateDriver();
      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
 --- a/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);
    registry->RegisterIntegerPref(
        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

+ 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