diff --git a/DEPS b/DEPS
index 71b5bee..c58c2beb 100644
--- a/DEPS
+++ b/DEPS
@@ -269,15 +269,15 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '3c34161973a2396203ab832872ea0cd97177f332',
+  'skia_revision': '431f305d513e2cc5cf4ea87d9f423c9840fc2e99',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '18ae8ecba33cb0900d3961802d6392829eaef916',
+  'v8_revision': '604c352530225612480362bcfbbb12a04bbd0386',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '48b1f07b0fcb14d78deb4e5fb98bc905a4df0aa3',
+  'angle_revision': '459c367ed5a524ce0aad1877c1e39e82126f2707',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -296,7 +296,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Fuchsia sdk
   # and whatever else without interference from each other.
-  'fuchsia_version': 'version:8.20220515.3.1',
+  'fuchsia_version': 'version:8.20220516.1.1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling google-toolbox-for-mac
   # and whatever else without interference from each other.
@@ -348,7 +348,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': '325f21804f21c3826aee2dec0bfe2e9f4f26f270',
+  'devtools_frontend_revision': '6a4cbb4946a41c98db679e417c763843dc0c5584',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -384,7 +384,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': 'e831fb61046b648895a5d429a6dbca76b7843c3f',
+  'dawn_revision': '5a695976989b0cb30ba4b320af07951b08ad3c16',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -835,7 +835,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/linux-amd64',
-          'version': 'Dc4RjEwwwbHzwZvVdiZSLMjtTkiPMJuJoCHvI80i1FgC',
+          'version': 'C0si8n5gB8sPEw57Wq-j61r3JkrdgS19EbwNqluU4o4C',
         },
       ],
       'dep_type': 'cipd',
@@ -857,7 +857,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/windows-amd64',
-          'version': 'UcnmLSHkQCLJJGPGTleOoJgQ0z5FDqFyWzYnr1A24lgC',
+          'version': 'cbFuxx-0q7HA2Pqr-bmFoJOrLV-cz1Wc55yChrjuOA4C',
         },
       ],
       'dep_type': 'cipd',
@@ -914,7 +914,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'GFFcbQiZc4RpAtuTiDatE9n-TscfDIeynLmz84iC0yUC',
+          'version': 'rDwcNUcalxE4oDXQjUyJUWv381pDqXoZNHb_1Dgv2qcC',
       },
     ],
     'condition': 'checkout_android',
@@ -1110,7 +1110,7 @@
   # Tools used when building Chrome for Chrome OS. This affects both the Simple
   # Chrome workflow, as well as the chromeos-chrome ebuild.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '08d341808f71e2effb79a8d08b4905cb6429d672',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'ed0799ae4f6aca32848dc1e35fa831d70ec1ce63',
       'condition': 'checkout_chromeos',
   },
 
@@ -1530,7 +1530,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '378c48e919baf08561d11f8261629bf007779131',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'c585628f4537d88115684c5ab5827cdfff90f7df',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1654,7 +1654,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/turbine',
-              'version': 'FJ-IOPRGQsHUZwVeYmVw_idRk5mUUP6_Uj2i6mKQlEMC',
+              'version': 'aSG-acwWsASjZaTfSzYcOuM9qoD6S_o3JL6iIFslVdUC',
           },
       ],
       'condition': 'checkout_android',
@@ -1666,7 +1666,7 @@
       'condition': 'checkout_android',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@131de3fd9ec7dca8b5fca3aed5b8fe198560c578',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@b5c0eec3336c1eb6cafd9a999fdb356308847620',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907',
@@ -1705,7 +1705,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '9f4227be09ee268c508e9d5841c4f76772036264',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '0e2221eb2f02ed950f4fd9c7fea40b382ea0a0c8',
+    Var('webrtc_git') + '/src.git' + '@' + 'dab50c6fe8f13a19f4dee31a5338ad70a81f4f74',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1808,7 +1808,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': '5sjFTaHL1L8pY84jHJfwVghpS8HvJc3sgzgm-9RH4D8C',
+        'version': 'CT5eE6ua1xs_O8SzdkKg51WGIHJbT0tGmCKW6RQ_6i4C',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index f0e4622a..dae6073 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -1115,6 +1115,7 @@
     'build/android/gyp/prepare_resources.pydeps',
     'build/android/gyp/process_native_prebuilt.pydeps',
     'build/android/gyp/proguard.pydeps',
+    'build/android/gyp/system_image_apks.pydeps',
     'build/android/gyp/trace_event_bytecode_rewriter.pydeps',
     'build/android/gyp/turbine.pydeps',
     'build/android/gyp/unused_resources.pydeps',
diff --git a/android_webview/browser/network_service/aw_proxying_url_loader_factory.cc b/android_webview/browser/network_service/aw_proxying_url_loader_factory.cc
index e3f41a4..24097ac 100644
--- a/android_webview/browser/network_service/aw_proxying_url_loader_factory.cc
+++ b/android_webview/browser/network_service/aw_proxying_url_loader_factory.cc
@@ -89,8 +89,6 @@
                         OnUploadProgressCallback callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   // network::mojom::URLLoader
@@ -606,11 +604,6 @@
   target_client_->OnTransferSizeUpdated(transfer_size_diff);
 }
 
-void InterceptedRequest::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle body) {
-  target_client_->OnStartLoadingResponseBody(std::move(body));
-}
-
 void InterceptedRequest::OnComplete(
     const network::URLLoaderCompletionStatus& status) {
   // Only wait for the original loader to possibly have a custom error if the
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
index 0fb82759..74f044d 100644
--- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
+++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -234,8 +234,6 @@
                             + " number in the minor version position in the User-Agent string."),
             Flag.baseFeature(NetworkServiceFeatures.URL_LOADER_SYNC_CLIENT,
                     "Optimizes communication between URLLoader and CorsURLLoader."),
-            Flag.baseFeature(NetworkServiceFeatures.COMBINE_RESPONSE_BODY,
-                    "Reduces URLLoaderClient mojo calls."),
             Flag.baseFeature(NetworkServiceFeatures.FASTER_SET_COOKIE, "Optimizes cookie access."),
             Flag.baseFeature(NetworkServiceFeatures.OPTIMIZE_NETWORK_BUFFERS,
                     "Optimizes buffer size for reading from the network or InputStream."),
diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc
index 43c16177..681b4cc 100644
--- a/ash/app_list/app_list_controller_impl.cc
+++ b/ash/app_list/app_list_controller_impl.cc
@@ -583,6 +583,9 @@
         FeatureDiscoveryDurationReporter::GetInstance();
     reporter->MaybeFinishObservation(feature_discovery::TrackableFeature::
                                          kAppListReorderAfterEducationNudge);
+    reporter->MaybeFinishObservation(
+        feature_discovery::TrackableFeature::
+            kAppListReorderAfterEducationNudgePerTabletMode);
     reporter->MaybeFinishObservation(feature_discovery::TrackableFeature::
                                          kAppListReorderAfterSessionActivation);
   }
diff --git a/ash/app_list/views/app_list_toast_container_view.cc b/ash/app_list/views/app_list_toast_container_view.cc
index d877986..701fb367 100644
--- a/ash/app_list/views/app_list_toast_container_view.cc
+++ b/ash/app_list/views/app_list_toast_container_view.cc
@@ -148,8 +148,13 @@
                             base::Unretained(this)));
   }
 
-  FeatureDiscoveryDurationReporter::GetInstance()->MaybeActivateObservation(
+  FeatureDiscoveryDurationReporter* reporter =
+      FeatureDiscoveryDurationReporter::GetInstance();
+  reporter->MaybeActivateObservation(
       feature_discovery::TrackableFeature::kAppListReorderAfterEducationNudge);
+  reporter->MaybeActivateObservation(
+      feature_discovery::TrackableFeature::
+          kAppListReorderAfterEducationNudgePerTabletMode);
 
   toast_view_ = AddChildView(
       toast_view_builder.SetStyleForTabletMode(tablet_mode_)
diff --git a/ash/components/drivefs/BUILD.gn b/ash/components/drivefs/BUILD.gn
index 411fdcb..c8a79f4d 100644
--- a/ash/components/drivefs/BUILD.gn
+++ b/ash/components/drivefs/BUILD.gn
@@ -16,6 +16,8 @@
     "drivefs_host.cc",
     "drivefs_host.h",
     "drivefs_host_observer.h",
+    "drivefs_http_client.cc",
+    "drivefs_http_client.h",
     "drivefs_search.cc",
     "drivefs_search.h",
     "drivefs_session.cc",
@@ -73,6 +75,7 @@
     "drivefs_auth_unittest.cc",
     "drivefs_bootstrap_unittest.cc",
     "drivefs_host_unittest.cc",
+    "drivefs_http_client_unittest.cc",
     "drivefs_search_unittest.cc",
     "drivefs_session_unittest.cc",
   ]
diff --git a/ash/components/drivefs/drivefs_host.cc b/ash/components/drivefs/drivefs_host.cc
index 8a8f785..dc89e90 100644
--- a/ash/components/drivefs/drivefs_host.cc
+++ b/ash/components/drivefs/drivefs_host.cc
@@ -10,6 +10,7 @@
 
 #include "ash/components/drivefs/drivefs_bootstrap.h"
 #include "ash/components/drivefs/drivefs_host_observer.h"
+#include "ash/components/drivefs/drivefs_http_client.h"
 #include "ash/components/drivefs/drivefs_search.h"
 #include "ash/constants/ash_features.h"
 #include "base/bind.h"
@@ -55,6 +56,8 @@
         bool{host->account_token_delegate_->GetCachedAccessToken()};
     search_ = std::make_unique<DriveFsSearch>(
         drivefs_interface(), host_->network_connection_tracker_, host_->clock_);
+    http_client_ = std::make_unique<DriveFsHttpClient>(
+        host_->delegate_->GetURLLoaderFactory());
   }
 
   MountState(const MountState&) = delete;
@@ -178,6 +181,12 @@
                     std::move(callback), mojom::DialogResult::kNotDisplayed));
   }
 
+  void ExecuteHttpRequest(
+      mojom::HttpRequestPtr request,
+      mojo::PendingRemote<mojom::HttpDelegate> delegate) override {
+    http_client_->ExecuteHttpRequest(std::move(request), std::move(delegate));
+  }
+
   // DriveNotificationObserver overrides:
   void OnNotificationReceived(
       const std::map<std::string, int64_t>& invalidations) override {
@@ -198,6 +207,7 @@
   DriveFsHost* const host_;
 
   std::unique_ptr<DriveFsSearch> search_;
+  std::unique_ptr<DriveFsHttpClient> http_client_;
 
   bool token_fetch_attempted_ = false;
   bool team_drives_fetched_ = false;
diff --git a/ash/components/drivefs/drivefs_http_client.cc b/ash/components/drivefs/drivefs_http_client.cc
new file mode 100644
index 0000000..839e1e1
--- /dev/null
+++ b/ash/components/drivefs/drivefs_http_client.cc
@@ -0,0 +1,211 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/components/drivefs/drivefs_http_client.h"
+
+#include <cstdint>
+#include <memory>
+#include <type_traits>
+#include <utility>
+
+#include "ash/components/drivefs/mojom/drivefs.mojom.h"
+#include "base/bind.h"
+#include "base/containers/enum_set.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/mojom/data_pipe_getter.mojom.h"
+#include "services/network/public/mojom/url_loader.mojom.h"
+#include "services/network/public/mojom/url_loader_factory.mojom.h"
+#include "services/network/public/mojom/url_response_head.mojom.h"
+
+namespace drivefs {
+namespace {
+
+constexpr net::NetworkTrafficAnnotationTag kTrafficAnnotation =
+    net::DefineNetworkTrafficAnnotation("...", R"pb(
+      semantics {
+          sender: "Files App - Google Drive"
+          description: "Files App integrates with Google Drive to provide a
+          local view of what is available on the Google Drive Web interface.
+          This allows users to navigate Google Drive as if it was a local
+          file system."
+          trigger: "User navigates through the Google Drive directory in the
+          Files App. User opens a file in the Google Drive directory in the
+          Files App. Additionally, the Files App will sync Google Drive data
+          in the background as changes are made on the web or on other devices."
+          data: "All metadata related to files stored in Google Drive as well
+          as content of files stored in Google Drive."
+          destination: GOOGLE_OWNED_SERVICE
+          }
+        policy {
+          cookies_allowed: NO
+          chrome_policy {
+            DriveDisabled: {
+                DriveDisabled: true
+            }
+          }
+        }
+        comments: "There are two policies that control this integration.
+        DriveDisabled will disable all communications while
+        DriveDisabledOverCellular will disable communication over cellular
+        networks"
+    )pb");
+
+class DriveFsURLLoaderClient : public network::mojom::URLLoaderClient,
+                               public network::mojom::DataPipeGetter {
+ public:
+  DriveFsURLLoaderClient(
+      mojo::PendingRemote<mojom::HttpDelegate> http_delegate_remote,
+      const mojom::HttpRequestPtr& request,
+      mojo::PendingReceiver<network::mojom::DataPipeGetter> data_pipe_receiver,
+      mojo::PendingRemote<network::mojom::URLLoader> loader_remote)
+      : request_body_bytes_(request->request_body_bytes),
+        loader_remote_(std::move(loader_remote)),
+        http_delegate_remote_(std::move(http_delegate_remote)) {
+    Clone(std::move(data_pipe_receiver));
+    http_delegate_remote_.set_disconnect_handler(
+        base::BindOnce(&DriveFsURLLoaderClient::OnHttpDelegateDisconnect,
+                       weak_ptr_factory_.GetWeakPtr()));
+  }
+
+ private:
+  enum class CallbackState : size_t {
+    kBodyRequested,
+    kResponseReceived,
+    kRequestComplete,
+    // Add new states above.
+    kMin = kBodyRequested,
+    kMax = kRequestComplete,
+  };
+
+  bool IsFirstCall(CallbackState state) {
+    if (callback_state_.Has(state)) {
+      return false;
+    }
+    callback_state_.Put(state);
+    return true;
+  }
+
+  void OnHttpDelegateDisconnect() {
+    // Cancel the request: The DriveFS side disconnected.
+    loader_remote_.reset();
+  }
+
+  // URLLoaderClient Impl
+  void OnReceiveEarlyHints(network::mojom::EarlyHintsPtr early_hints) override {
+  }
+
+  void OnReceiveResponse(network::mojom::URLResponseHeadPtr response_head,
+                         mojo::ScopedDataPipeConsumerHandle body) override {
+    DCHECK(IsFirstCall(CallbackState::kResponseReceived));
+    std::vector<mojom::HttpHeaderPtr> headers;
+    size_t iter = 0;
+    std::string name;
+    std::string value;
+    while (response_head->headers->EnumerateHeaderLines(&iter, &name, &value)) {
+      headers.push_back(mojom::HttpHeader::New(name, value));
+    }
+    http_delegate_remote_->OnReceiveResponse(mojom::HttpResponse::New(
+        response_head->headers->response_code(), std::move(headers)));
+    if (body) {
+      http_delegate_remote_->OnReceiveBody(std::move(body));
+    }
+  }
+
+  void OnReceiveRedirect(
+      const net::RedirectInfo& redirect_info,
+      network::mojom::URLResponseHeadPtr response_head) override {
+    // Cancel the request: Redirects are not permitted for security reasons.
+    loader_remote_.reset();
+  }
+
+  void OnUploadProgress(int64_t current_position,
+                        int64_t total_size,
+                        OnUploadProgressCallback ack_callback) override {
+    std::move(ack_callback).Run();
+  }
+
+  void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override {}
+
+  void OnTransferSizeUpdated(int32_t transfer_size_diff) override {}
+
+  void OnComplete(const network::URLLoaderCompletionStatus& status) override {
+    DCHECK(IsFirstCall(CallbackState::kRequestComplete));
+    http_delegate_remote_->OnRequestComplete(mojom::HttpCompletionStatus::New(
+        static_cast<mojom::NetError>(status.error_code),
+        status.decoded_body_length));
+  }
+
+  // DataPipeGetter Impl
+  void Read(mojo::ScopedDataPipeProducerHandle pipe,
+            ReadCallback callback) override {
+    DCHECK(request_body_bytes_);
+    DCHECK(IsFirstCall(CallbackState::kBodyRequested));
+    std::move(callback).Run(net::OK, request_body_bytes_);
+    http_delegate_remote_->GetRequestBody(std::move(pipe));
+  }
+
+  void Clone(
+      mojo::PendingReceiver<network::mojom::DataPipeGetter> receiver) override {
+    data_pipe_receivers_.Add(this, std::move(receiver));
+  }
+
+  const int64_t request_body_bytes_;
+  base::EnumSet<CallbackState, CallbackState::kMin, CallbackState::kMax>
+      callback_state_;
+  mojo::ReceiverSet<network::mojom::DataPipeGetter> data_pipe_receivers_;
+  mojo::Remote<network::mojom::URLLoader> loader_remote_;
+  mojo::Remote<mojom::HttpDelegate> http_delegate_remote_;
+  base::WeakPtrFactory<DriveFsURLLoaderClient> weak_ptr_factory_{this};
+};
+
+}  // namespace
+
+DriveFsHttpClient::DriveFsHttpClient(
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
+    : url_loader_factory_(std::move(url_loader_factory)) {}
+
+DriveFsHttpClient::~DriveFsHttpClient() = default;
+
+void DriveFsHttpClient::ExecuteHttpRequest(
+    mojom::HttpRequestPtr request,
+    mojo::PendingRemote<mojom::HttpDelegate> delegate) {
+  // Build a `URLLoaderClient` for the request. This client will bridge
+  // communication between DriveFS and Chrome OS.
+  mojo::PendingRemote<network::mojom::URLLoaderClient> url_loader_client;
+  mojo::PendingRemote<network::mojom::DataPipeGetter> data_pipe_getter;
+  mojo::PendingRemote<network::mojom::URLLoader> url_loader;
+  mojo::PendingReceiver<network::mojom::URLLoader> url_loader_reciever =
+      url_loader.InitWithNewPipeAndPassReceiver();
+  mojo::ReceiverId client_id =
+      clients_.Add(std::make_unique<DriveFsURLLoaderClient>(
+                       std::move(delegate), request,
+                       data_pipe_getter.InitWithNewPipeAndPassReceiver(),
+                       std::move(url_loader)),
+                   url_loader_client.InitWithNewPipeAndPassReceiver());
+  // Translate the `HttpRequest` from DriveFS into a `network::ResourceRequest`.
+  network::ResourceRequest resource_request;
+  resource_request.url = GURL(request->url);
+  resource_request.method = request->method;
+  for (const auto& header : request->headers) {
+    resource_request.headers.SetHeader(header->key, header->value);
+  }
+  if (request->request_body_bytes > 0) {
+    resource_request.request_body = new network::ResourceRequestBody();
+    resource_request.request_body->AppendDataPipe(std::move(data_pipe_getter));
+  }
+  // Start execution, the `DriveFsURLLoaderClient` will remove itself from the
+  // `clients_` map on completion.
+  url_loader_factory_->CreateLoaderAndStart(
+      std::move(url_loader_reciever), /*request_id=*/client_id,
+      /*options=*/network::mojom::kURLLoadOptionBlockAllCookies,
+      std::move(resource_request), std::move(url_loader_client),
+      net::MutableNetworkTrafficAnnotationTag(kTrafficAnnotation));
+}
+
+}  // namespace drivefs
diff --git a/ash/components/drivefs/drivefs_http_client.h b/ash/components/drivefs/drivefs_http_client.h
new file mode 100644
index 0000000..58c1068
--- /dev/null
+++ b/ash/components/drivefs/drivefs_http_client.h
@@ -0,0 +1,37 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_COMPONENTS_DRIVEFS_DRIVEFS_HTTP_CLIENT_H_
+#define ASH_COMPONENTS_DRIVEFS_DRIVEFS_HTTP_CLIENT_H_
+
+#include "ash/components/drivefs/mojom/drivefs.mojom.h"
+#include "base/component_export.h"
+#include "mojo/public/cpp/bindings/unique_receiver_set.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
+
+namespace drivefs {
+
+// Handles HTTP requests for DriveFS by translating them to a URLLoader
+// request and passing the responses back to DriveFS.
+class COMPONENT_EXPORT(DRIVEFS) DriveFsHttpClient {
+ public:
+  explicit DriveFsHttpClient(
+      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
+
+  DriveFsHttpClient(const DriveFsHttpClient&) = delete;
+  DriveFsHttpClient& operator=(const DriveFsHttpClient&) = delete;
+
+  ~DriveFsHttpClient();
+
+  void ExecuteHttpRequest(mojom::HttpRequestPtr request,
+                          mojo::PendingRemote<mojom::HttpDelegate> delegate);
+
+ private:
+  mojo::UniqueReceiverSet<network::mojom::URLLoaderClient> clients_;
+  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
+};
+
+}  // namespace drivefs
+
+#endif  // ASH_COMPONENTS_DRIVEFS_DRIVEFS_HTTP_CLIENT_H_
diff --git a/ash/components/drivefs/drivefs_http_client_unittest.cc b/ash/components/drivefs/drivefs_http_client_unittest.cc
new file mode 100644
index 0000000..18fbbede
--- /dev/null
+++ b/ash/components/drivefs/drivefs_http_client_unittest.cc
@@ -0,0 +1,250 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/components/drivefs/drivefs_http_client.h"
+
+#include <initializer_list>
+#include <utility>
+
+#include "ash/components/drivefs/mojom/drivefs.mojom-shared.h"
+#include "ash/components/drivefs/mojom/drivefs.mojom-test-utils.h"
+#include "ash/components/drivefs/mojom/drivefs.mojom.h"
+#include "base/strings/stringprintf.h"
+#include "base/test/bind.h"
+#include "base/test/gmock_callback_support.h"
+#include "base/test/gmock_move_support.h"
+#include "base/test/task_environment.h"
+#include "mojo/public/cpp/system/data_pipe.h"
+#include "mojo/public/cpp/system/data_pipe_utils.h"
+#include "net/http/http_status_code.h"
+#include "net/http/http_util.h"
+#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
+#include "services/network/public/mojom/data_pipe_getter.mojom.h"
+#include "services/network/public/mojom/url_response_head.mojom.h"
+#include "services/network/test/test_url_loader_factory.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace drivefs {
+namespace mojom {
+
+// This HttpResponsePtr ostream printer pretty prints the response in test
+// failures.
+std::ostream& operator<<(std::ostream& os, const HttpResponsePtr& response) {
+  os << "response_code: " << response->response_code << std::endl;
+  os << "headers: " << std::endl;
+  for (const auto& header : response->headers) {
+    os << "  " << header->key << ": " << header->value << std::endl;
+  }
+  return os;
+}
+
+}  // namespace mojom
+
+namespace {
+
+using testing::_;
+using testing::Eq;
+using testing::IsEmpty;
+using testing::NiceMock;
+using testing::Pointee;
+
+using HttpHeaders = std::vector<mojom::HttpHeaderPtr>;
+using HttpHeadersInitializerList =
+    std::initializer_list<std::pair<base::StringPiece, base::StringPiece>>;
+
+class MockHttpDelegate : public mojom::HttpDelegate {
+ public:
+  MOCK_METHOD(void,
+              GetRequestBody,
+              (mojo::ScopedDataPipeProducerHandle),
+              (override));
+  MOCK_METHOD(void, OnReceiveResponse, (mojom::HttpResponsePtr), (override));
+  MOCK_METHOD(void,
+              OnReceiveBody,
+              (mojo::ScopedDataPipeConsumerHandle),
+              (override));
+  MOCK_METHOD(void,
+              OnRequestComplete,
+              (mojom::HttpCompletionStatusPtr),
+              (override));
+};
+
+class DriveFsHttpClientTest : public testing::Test {
+ public:
+  DriveFsHttpClientTest()
+      : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME),
+        http_client_(
+            base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
+                &test_url_loader_factory_)) {}
+
+  void BlockingCopyToString(std::string* result,
+                            mojo::ScopedDataPipeConsumerHandle source) {
+    EXPECT_TRUE(mojo::BlockingCopyToString(std::move(source), result));
+  }
+
+ protected:
+  base::test::TaskEnvironment task_environment_;
+  scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
+  network::TestURLLoaderFactory test_url_loader_factory_;
+
+  DriveFsHttpClient http_client_;
+};
+
+struct ConsumeAllDataAndCompareWith {
+  void operator()(mojo::ScopedDataPipeConsumerHandle handle) {
+    std::string data;
+    EXPECT_TRUE(mojo::BlockingCopyToString(std::move(handle), &data));
+    EXPECT_EQ(data, expected_data);
+  }
+
+  base::StringPiece expected_data;
+};
+
+struct ProduceAllData {
+  void operator()(mojo::ScopedDataPipeProducerHandle handle) {
+    EXPECT_TRUE(mojo::BlockingCopyFromString(std::string(data), handle));
+  }
+
+  base::StringPiece data;
+};
+
+HttpHeaders HttpHeadersFromInitializerList(
+    HttpHeadersInitializerList input_headers) {
+  HttpHeaders headers;
+  for (const auto& header : input_headers) {
+    headers.push_back(mojom::HttpHeader::New(std::string{header.first},
+                                             std::string{header.second}));
+  }
+  return headers;
+}
+
+network::mojom::URLResponseHeadPtr CreateURLResponseHead(
+    net::HttpStatusCode http_status,
+    HttpHeadersInitializerList input_headers) {
+  auto head = network::mojom::URLResponseHead::New();
+  const std::string status_line(
+      base::StringPrintf("HTTP/1.1 %d %s", static_cast<int>(http_status),
+                         net::GetHttpReasonPhrase(http_status)));
+  head->headers = base::MakeRefCounted<net::HttpResponseHeaders>(
+      net::HttpUtil::AssembleRawHeaders(status_line));
+  for (const auto& header : input_headers) {
+    head->headers->AddHeader(header.first, header.second);
+  }
+  return head;
+}
+
+TEST_F(DriveFsHttpClientTest, RequestHandlesRequestData) {
+  constexpr char kTestURL[] = "https://drive.google.com";
+  constexpr base::StringPiece kTestRequestData = "Test Request Data";
+  const HttpHeadersInitializerList kTestRequestHeaders = {
+      {"Test-Request-Header", "Test-Value"},
+  };
+  base::RunLoop run_loop;
+  NiceMock<MockHttpDelegate> http_delegate;
+  mojom::HttpCompletionStatus expected_status(mojom::NetError::kOk, 0);
+  EXPECT_CALL(http_delegate,
+              OnRequestComplete(Pointee(Eq(std::ref(expected_status)))))
+      .WillOnce(base::test::RunClosure(run_loop.QuitClosure()));
+  EXPECT_CALL(http_delegate, GetRequestBody)
+      .WillOnce(ProduceAllData{kTestRequestData});
+  mojo::Receiver<mojom::HttpDelegate> http_receiver(&http_delegate);
+  mojo::ScopedDataPipeProducerHandle producer;
+  mojo::ScopedDataPipeConsumerHandle consumer;
+  ASSERT_EQ(mojo::CreateDataPipe(nullptr, producer, consumer), MOJO_RESULT_OK);
+  test_url_loader_factory_.SetInterceptor(
+      base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
+        const std::vector<network::DataElement>* elements =
+            request.request_body->elements();
+        ASSERT_EQ(elements->size(), 1UL);
+        const network::DataElement& element = elements->front();
+        mojo::Remote<network::mojom::DataPipeGetter> remote(
+            element.As<network::DataElementDataPipe>().CloneDataPipeGetter());
+        remote->Read(std::move(producer),
+                     base::BindOnce([](int32_t, uint64_t) {}));
+      }));
+  http_client_.ExecuteHttpRequest(
+      mojom::HttpRequest::New(
+          /*method=*/"GET",
+          /*url=*/kTestURL,
+          /*headers=*/HttpHeadersFromInitializerList(kTestRequestHeaders),
+          /*request_body_bytes=*/kTestRequestData.size()),
+      http_receiver.BindNewPipeAndPassRemote());
+  EXPECT_TRUE(
+      test_url_loader_factory_.SimulateResponseForPendingRequest(kTestURL, ""));
+  run_loop.Run();
+  EXPECT_EQ(test_url_loader_factory_.NumPending(), 0);
+  std::string data;
+  EXPECT_TRUE(mojo::BlockingCopyToString(std::move(consumer), &data));
+  EXPECT_EQ(data, kTestRequestData);
+}
+
+TEST_F(DriveFsHttpClientTest, RequestHandlesResponseData) {
+  constexpr char kTestURL[] = "https://drive.google.com";
+  constexpr base::StringPiece kTestResponseData = "Test Response Data";
+  const HttpHeadersInitializerList kTestResponseHeaders = {
+      {"Test-Response-Header", "Test-Value"},
+  };
+  base::RunLoop run_loop;
+  NiceMock<MockHttpDelegate> http_delegate;
+  mojom::HttpCompletionStatus expected_status(mojom::NetError::kOk,
+                                              kTestResponseData.size());
+  EXPECT_CALL(http_delegate,
+              OnRequestComplete(Pointee(Eq(std::ref(expected_status)))))
+      .WillOnce(base::test::RunClosure(run_loop.QuitClosure()));
+  mojom::HttpResponse expected_response(
+      net::HTTP_OK, HttpHeadersFromInitializerList(kTestResponseHeaders));
+  EXPECT_CALL(http_delegate,
+              OnReceiveResponse(Pointee(Eq(std::ref(expected_response)))));
+  EXPECT_CALL(http_delegate, OnReceiveBody)
+      .WillOnce(ConsumeAllDataAndCompareWith{kTestResponseData});
+  mojo::Receiver<mojom::HttpDelegate> http_receiver(&http_delegate);
+  http_client_.ExecuteHttpRequest(mojom::HttpRequest::New(
+                                      /*method=*/"GET",
+                                      /*url=*/kTestURL,
+                                      /*headers=*/HttpHeaders(),
+                                      /*request_body_bytes=*/0),
+                                  http_receiver.BindNewPipeAndPassRemote());
+  EXPECT_TRUE(test_url_loader_factory_.SimulateResponseForPendingRequest(
+      GURL(kTestURL), network::URLLoaderCompletionStatus(net::OK),
+      CreateURLResponseHead(net::HTTP_OK, kTestResponseHeaders),
+      std::string(kTestResponseData)));
+  run_loop.Run();
+  EXPECT_EQ(test_url_loader_factory_.NumPending(), 0);
+}
+
+TEST_F(DriveFsHttpClientTest, RequestCancelledOnRedirect) {
+  constexpr char kTestURL[] = "https://drive.google.com";
+  // Populate the URLLoaderFactory with a redirect.
+  net::RedirectInfo redirect;
+  redirect.status_code = 301;
+  redirect.new_url = GURL("https://not_a_virus.google.com/");
+  network::TestURLLoaderFactory::Redirects redirects;
+  redirects.push_back({redirect, network::mojom::URLResponseHead::New()});
+  test_url_loader_factory_.AddResponse(
+      GURL(kTestURL), network::mojom::URLResponseHead::New(),
+      /*content=*/"", network::URLLoaderCompletionStatus(),
+      std::move(redirects),
+      network::TestURLLoaderFactory::kResponseOnlyRedirectsNoDestination);
+  // Run until the delegate is disconnected, there should be no callbacks.
+  base::RunLoop run_loop;
+  NiceMock<MockHttpDelegate> http_delegate;
+  EXPECT_CALL(http_delegate, OnReceiveResponse).Times(0);
+  EXPECT_CALL(http_delegate, OnRequestComplete).Times(0);
+  mojo::Receiver<mojom::HttpDelegate> http_receiver(&http_delegate);
+  mojo::PendingRemote<mojom::HttpDelegate> http_remote =
+      http_receiver.BindNewPipeAndPassRemote();
+  http_receiver.set_disconnect_handler(run_loop.QuitClosure());
+  http_client_.ExecuteHttpRequest(mojom::HttpRequest::New(
+                                      /*method=*/"GET",
+                                      /*url=*/kTestURL,
+                                      /*headers=*/HttpHeaders(),
+                                      /*request_body_bytes=*/0),
+                                  std::move(http_remote));
+  run_loop.Run();
+  EXPECT_EQ(test_url_loader_factory_.NumPending(), 0);
+}
+
+}  // namespace
+}  // namespace drivefs
diff --git a/ash/components/drivefs/drivefs_session_unittest.cc b/ash/components/drivefs/drivefs_session_unittest.cc
index 0657dc5e..72bf3365 100644
--- a/ash/components/drivefs/drivefs_session_unittest.cc
+++ b/ash/components/drivefs/drivefs_session_unittest.cc
@@ -245,6 +245,9 @@
       ConnectToExtensionCallback callback) override {}
   void DisplayConfirmDialog(mojom::DialogReasonPtr error,
                             DisplayConfirmDialogCallback callback) override {}
+  void ExecuteHttpRequest(
+      mojom::HttpRequestPtr request,
+      mojo::PendingRemote<mojom::HttpDelegate> delegate) override {}
 };
 
 class DriveFsSessionTest : public ::testing::Test,
diff --git a/ash/components/drivefs/mojom/drivefs.mojom b/ash/components/drivefs/mojom/drivefs.mojom
index 3fba6be6..4ac2cf6 100644
--- a/ash/components/drivefs/mojom/drivefs.mojom
+++ b/ash/components/drivefs/mojom/drivefs.mojom
@@ -179,6 +179,11 @@
 
   // Invoked when Drive wants to display a confirmation dialog.
   DisplayConfirmDialog(DialogReason reason) => (DialogResult result);
+
+  // Executes the given request on Chrome's networking stack and
+  // calls the necessary callbacks on the |delegate|.
+  ExecuteHttpRequest(
+    HttpRequest request, pending_remote<HttpDelegate> delegate);
 };
 
 // Next MinVersion: 6
@@ -571,3 +576,63 @@
   uint64 free_cloud_bytes;
   uint64 total_cloud_bytes;
 };
+
+// Matches errors from //net/base/net_error_list.h
+enum NetError {
+  kOk = 0,
+  kIOPending = -1,
+  kFailed = -2,
+  kAborted = -3,
+  kInvalidArgument = -4,
+  kInvalidHandle = -5,
+  kFileNotFound = -6,
+  kTimedOut = -7,
+  kNameNotResolved = -105,
+  kInternetDisconnected = -106,
+  kAddressUnreachable = -109,
+};
+
+struct HttpHeader  {
+  string key;
+  string value;
+};
+
+struct HttpRequest {
+  string method;
+  string url;
+  array<HttpHeader> headers;
+  int64 request_body_bytes;
+};
+
+struct HttpResponse {
+  int32 response_code;
+  array<HttpHeader> headers;
+};
+
+struct HttpCompletionStatus {
+  NetError error;
+  int64 response_body_bytes;
+};
+
+// This interface is backed by a |cello:HttpDelegate| on the DriveFS side and is
+// called from a |URLLoaderClient| on the Chrome side.
+interface HttpDelegate {
+  // Fetches a pipe that will provide the request body.
+  // This method should only be called once.
+  GetRequestBody(handle<data_pipe_producer> request_body);
+
+  // Called once when the response code and headers have been received.
+  // See |URLLoaderClient::OnReceiveResponse|
+  OnReceiveResponse(HttpResponse response);
+
+  // Called once after |OnReceiveResponse| when the body has been received.
+  // Provides a pipe for the response body to be read from.
+  // See |URLLoaderClient::OnStartLoadingResponseBody'
+  OnReceiveBody(handle<data_pipe_consumer> response_body);
+
+  // Called once after the URLLoader is done.
+  // NOTE: There may still be data remaining in the data pipe, so destruction
+  // should be deferred until all data is read.
+  // See |URLLoaderClient::OnComplete|
+  OnRequestComplete(HttpCompletionStatus status);
+};
diff --git a/ash/public/cpp/app_list/app_list_metrics.cc b/ash/public/cpp/app_list/app_list_metrics.cc
index 403e146..b3d18be 100644
--- a/ash/public/cpp/app_list/app_list_metrics.cc
+++ b/ash/public/cpp/app_list/app_list_metrics.cc
@@ -70,6 +70,11 @@
     "Apps.AppList."
     "AppListSortDiscoveryDurationAfterActivation";
 
+constexpr char kAppListSortDiscoveryDurationAfterNudgeClamshell[] =
+    "Apps.AppList.SortDiscoveryDurationAfterEducationNudgeV2.ClamshellMode";
+constexpr char kAppListSortDiscoveryDurationAfterNudgeTablet[] =
+    "Apps.AppList.SortDiscoveryDurationAfterEducationNudgeV2.TabletMode";
+
 void RecordSearchResultOpenTypeHistogram(AppListLaunchedFrom launch_location,
                                          SearchResultType type,
                                          bool is_tablet_mode) {
diff --git a/ash/public/cpp/app_list/app_list_metrics.h b/ash/public/cpp/app_list/app_list_metrics.h
index 8a2233f..493abad 100644
--- a/ash/public/cpp/app_list/app_list_metrics.h
+++ b/ash/public/cpp/app_list/app_list_metrics.h
@@ -27,6 +27,14 @@
 // education nudge show and the first sort usage.
 ASH_PUBLIC_EXPORT extern const char kAppListSortDiscoveryDurationAfterNudge[];
 
+// Similar to `kAppListSortDiscoveryDurationAfterNudge`. The only difference is
+// that the metric data is separated by the tablet mode state under which the
+// reorder education nudge shows.
+ASH_PUBLIC_EXPORT extern const char
+    kAppListSortDiscoveryDurationAfterNudgeClamshell[];
+ASH_PUBLIC_EXPORT extern const char
+    kAppListSortDiscoveryDurationAfterNudgeTablet[];
+
 // The UMA histogram that records the time duration between the earliest user
 // session activation with the app list sort enabled and the first sort usage.
 ASH_PUBLIC_EXPORT extern const char
diff --git a/ash/public/cpp/feature_discovery_metric_util.cc b/ash/public/cpp/feature_discovery_metric_util.cc
index 6f7b814..788ffa5 100644
--- a/ash/public/cpp/feature_discovery_metric_util.cc
+++ b/ash/public/cpp/feature_discovery_metric_util.cc
@@ -69,6 +69,11 @@
         TrackableFeatureInfo{
             TrackableFeature::kAppListReorderAfterSessionActivation,
             "AppListReorderAfterSessionActivation",
-            kAppListSortDiscoveryDurationAfterActivation}};
+            kAppListSortDiscoveryDurationAfterActivation},
+        TrackableFeatureInfo{
+            TrackableFeature::kAppListReorderAfterEducationNudgePerTabletMode,
+            "AppListReorderAfterEducationNudgeSeparated",
+            kAppListSortDiscoveryDurationAfterNudgeClamshell,
+            kAppListSortDiscoveryDurationAfterNudgeTablet}};
 
 }  // namespace ash::feature_discovery
diff --git a/ash/public/cpp/feature_discovery_metric_util.h b/ash/public/cpp/feature_discovery_metric_util.h
index 9f3e0979..2f05571b 100644
--- a/ash/public/cpp/feature_discovery_metric_util.h
+++ b/ash/public/cpp/feature_discovery_metric_util.h
@@ -29,6 +29,11 @@
   // clamshell and another one for tablet.
   kAppListReorderAfterEducationNudge,
 
+  // Similar to `kAppListReorderAfterEducationNudge`. The only difference
+  // is that the collected data is separated by the tablet mode state under
+  // which the reorder education nudge shows.
+  kAppListReorderAfterEducationNudgePerTabletMode,
+
   // App list reorder after the user session activation.
   // TODO(https://crbug.com/1316185): split this histogram into the one for
   // clamshell and another one for tablet.
diff --git a/ash/shelf/home_to_overview_nudge_controller_unittest.cc b/ash/shelf/home_to_overview_nudge_controller_unittest.cc
index 62e9d15..6d25190 100644
--- a/ash/shelf/home_to_overview_nudge_controller_unittest.cc
+++ b/ash/shelf/home_to_overview_nudge_controller_unittest.cc
@@ -19,6 +19,7 @@
 #include "ash/wm/tablet_mode/tablet_mode_controller_test_api.h"
 #include "ash/wm/window_state.h"
 #include "base/bind.h"
+#include "base/memory/weak_ptr.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/simple_test_clock.h"
@@ -30,34 +31,21 @@
 #include "ui/gfx/geometry/rect_f.h"
 #include "ui/gfx/geometry/transform.h"
 #include "ui/views/widget/widget.h"
-#include "ui/views/widget/widget_observer.h"
 #include "ui/wm/core/window_util.h"
 
 namespace ash {
 
-class WidgetCloseObserver : public views::WidgetObserver {
+class WidgetCloseObserver {
  public:
-  explicit WidgetCloseObserver(views::Widget* widget) : widget_(widget) {
-    if (widget_)
-      widget_->AddObserver(this);
-  }
+  explicit WidgetCloseObserver(views::Widget* widget)
+      : widget_(widget->GetWeakPtr()) {}
 
-  ~WidgetCloseObserver() override { CleanupWidget(); }
+  ~WidgetCloseObserver() = default;
 
-  bool WidgetClosed() const { return !widget_; }
-
-  // views::WidgetObserver:
-  void OnWidgetClosing(views::Widget* widget) override { CleanupWidget(); }
-
-  void CleanupWidget() {
-    if (widget_) {
-      widget_->RemoveObserver(this);
-      widget_ = nullptr;
-    }
-  }
+  bool WidgetClosed() const { return !widget_ || widget_->IsClosed(); }
 
  private:
-  views::Widget* widget_;
+  base::WeakPtr<views::Widget> widget_;
 };
 
 class HomeToOverviewNudgeControllerWithNudgesDisabledTest : public AshTestBase {
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb
index bab4290b..9eca78b 100644
--- a/ash/strings/ash_strings_az.xtb
+++ b/ash/strings/ash_strings_az.xtb
@@ -176,6 +176,7 @@
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1972950159383891558">Salam, <ph name="USERNAME" /></translation>
 <translation id="1978498689038657292">Mətn daxiletməsi</translation>
+<translation id="1982717156487272186">Əvvəlki həftəni göstərin</translation>
 <translation id="1989113344093894667">Məzmunu çəkmək olmur</translation>
 <translation id="1990046457226896323">Nitq faylları endirilib</translation>
 <translation id="1993072747612765854">Ən son <ph name="SYSTEM_APP_NAME" /> güncəlləməsi ilə bağlı ətraflı məlumat əldə edin</translation>
@@ -622,6 +623,7 @@
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, Ulduz reytinqi <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{Bir gün ərzində cihazı əvvəlki versiyaya dəyişdirin}other{# gün ərzində cihazı əvvəlki versiyaya dəyişdirin}}</translation>
 <translation id="4642092649622328492">Natamam skrinşot çəkin</translation>
+<translation id="4644727592819780893">Region kameraya yerləşdirmək üçün çox kiçikdir</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, Tətbiq tövsiyəsi</translation>
 <translation id="4657775630156561295">Aşağıdakı təklif hesabınızın təklif tarixçəsindən həmişəlik silinəcək:
 
@@ -776,6 +778,7 @@
 <translation id="5673434351075758678">Ayarları sinxronizasiya etdikdən sonra "<ph name="FROM_LOCALE" />" dilindən "<ph name="TO_LOCALE" />" dilinə.</translation>
 <translation id="5675363643668471212">Rəf elementi</translation>
 <translation id="5677928146339483299">Bloklananlar</translation>
+<translation id="5678564054339031017">Növbəti həftəni göstərin</translation>
 <translation id="5679050765726761783">Enerjiye qənaət edən adapter qoşuldu</translation>
 <translation id="5682642926269496722">Google Assistent cari istifadəçi hesabında əlçatan deyil.</translation>
 <translation id="5689633613396158040">Gecə İşığı zəif işıqda ekrana baxmağı və ya oxumağı asanlaşdırır. Gecə İşığının yandığı vaxtı dəyişmək və ya onu birdəfəlik söndürmək üçün toxunun.</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb
index 09f6e37..1b334d4 100644
--- a/ash/strings/ash_strings_bs.xtb
+++ b/ash/strings/ash_strings_bs.xtb
@@ -326,6 +326,7 @@
 <translation id="2970920913501714344">Instaliranje aplikacija, proširenja i tema</translation>
 <translation id="2977598380246111477">Sljedeći broj</translation>
 <translation id="2981684127883932071">Prikaz prijedloga</translation>
+<translation id="2985148236010982088">Pogledajte sve aplikacije</translation>
 <translation id="2992327365391326550">Dugme za mikrofon uređaja je isključeno.</translation>
 <translation id="2995447421581609334">Prikaz uređaja za emitiranje.</translation>
 <translation id="2996462380875591307">Omogućeno je priključeno uvećalo. Pritisnite ponovo Ctrl + tipku za pretraživanje + D da ga isključite.</translation>
@@ -464,6 +465,7 @@
 <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> i još <ph name="UNAVAILABLE_APPS_COUNT" /> aplikacije(a) nisu na ovom uređaju.</translation>
 <translation id="3735740477244556633">Poredaj po</translation>
 <translation id="3742055079367172538">Snimak ekrana je napravljen</translation>
+<translation id="3761848338953536304">Administrator traži da isključite postavku zaključavanja SIM-a</translation>
 <translation id="3765841986579723851">Uređeno danas</translation>
 <translation id="3771549900096082774">Način rada visokog kontrasta</translation>
 <translation id="3773700760453577392">Administrator nije dozvolio višestruku prijavu za korisnika <ph name="USER_EMAIL" />. Svi korisnici se moraju odjaviti kako bi se nastavilo.</translation>
@@ -828,6 +830,7 @@
 <translation id="598407983968395253">Koristi šablon</translation>
 <translation id="598882571027504733">Za primanje ažuriranja, ponovo pokrenite Chromebook dok je tastatura priključena.</translation>
 <translation id="5992218262414051481">Omogućen je način rada u visokom kontrastu. Pritisnite ponovo Ctrl + tipku za pretraživanje + H da ga onemogućite.</translation>
+<translation id="6009656393242168182">Onemogućite postavku zaključavanja SIM-a</translation>
 <translation id="6012623610530968780">Stranica <ph name="SELECTED_PAGE" /> od <ph name="TOTAL_PAGE_NUM" /></translation>
 <translation id="6018164090099858612">Izlazak iz načina rada za preslikavanje</translation>
 <translation id="602001110135236999">Listaj ulijevo</translation>
@@ -862,6 +865,7 @@
 <translation id="6165508094623778733">Saznajte više</translation>
 <translation id="6166852626429024716">Pretražite uređaj, aplikacije, postavke, web...</translation>
 <translation id="6179832488876878285">Ovdje možete zakačiti važne fajlove. Otvorite aplikaciju Fajlovi da započnete.</translation>
+<translation id="6182592640011875895">Otvori radnu površinu</translation>
 <translation id="619279033188484792">Pregledajte nedavne fotografije, medije i obavještenja telefona na uređaju <ph name="DEVICE_TYPE" /></translation>
 <translation id="619335566042889110">Potpuno napuni sada</translation>
 <translation id="6220928844947387476">Sada istovremeno možete snimati sebe i svoj ekran</translation>
@@ -1168,6 +1172,7 @@
 <translation id="8052898407431791827">Kopirano u međumemoriju</translation>
 <translation id="8054466585765276473">Izračunava se vrijeme baterije.</translation>
 <translation id="8061464966246066292">Visoki kontrast</translation>
+<translation id="8083540854303889870">Spremljeno za kasnije</translation>
 <translation id="8098591350844501178">Prestanak emitiranja ekrana na prijemniku <ph name="RECEIVER_NAME" /></translation>
 <translation id="8113423164597455979">Uključeno, sve</translation>
 <translation id="8120151603115102514">Vaš telefon nema zaključavanje ekrana. Da otključate Chromebook, unesite lozinku.</translation>
@@ -1329,7 +1334,7 @@
 <translation id="9077515519330855811">Kontrole medija, trenutno se reproducira: <ph name="MEDIA_TITLE" /></translation>
 <translation id="9079731690316798640">WiFi: <ph name="ADDRESS" /></translation>
 <translation id="9080073830732419341">Kamera se uklopila u gornji lijevi ugao</translation>
-<translation id="9080132581049224423">Prevucite prema gore da odete na početnu stranicu</translation>
+<translation id="9080132581049224423">Prevucite prema gore da odete na početni ekran</translation>
 <translation id="9080206825613744995">Mikrofon je u upotrebi.</translation>
 <translation id="9084606467167974638">Promijenite položaj menija</translation>
 <translation id="9085962983642906571">Vaša baterija će ostati na 80% dok je priključena na napajanje radi produženja vijeka trajanja baterije.</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb
index f95fae77..c4b2a7b8 100644
--- a/ash/strings/ash_strings_et.xtb
+++ b/ash/strings/ash_strings_et.xtb
@@ -326,6 +326,7 @@
 <translation id="2970920913501714344">Installige rakendusi, laiendusi ja teemasid</translation>
 <translation id="2977598380246111477">Järgmine number</translation>
 <translation id="2981684127883932071">Soovitused on kuvatud</translation>
+<translation id="2985148236010982088">Vaadake kõiki rakendusi</translation>
 <translation id="2992327365391326550">Seadme mikrofoninupp on välja lülitatud.</translation>
 <translation id="2995447421581609334">Kuvab ülekandeseadmed.</translation>
 <translation id="2996462380875591307">Dokitud luup on lubatud. Vajutage selle väljalülitamiseks klahvikombinatsiooni Ctrl + otsinguklahv + D.</translation>
@@ -464,6 +465,7 @@
 <translation id="3726171378575546917">Rakendusi <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ja veel <ph name="UNAVAILABLE_APPS_COUNT" /> rakendust pole selles seadmes.</translation>
 <translation id="3735740477244556633">Sortimisalus:</translation>
 <translation id="3742055079367172538">Ekraanipilt on tehtud</translation>
+<translation id="3761848338953536304">Teie administraator nõuab, et lülitaksite SIM-kaardi luku seade välja</translation>
 <translation id="3765841986579723851">Täna muudetud</translation>
 <translation id="3771549900096082774">Suure kontrastsusega režiim</translation>
 <translation id="3773700760453577392">Administraator on keelanud e-posti aadressi <ph name="USER_EMAIL" /> puhul mitmele kontole sisselogimise.
@@ -829,6 +831,7 @@
 <translation id="598407983968395253">Kasuta malli</translation>
 <translation id="598882571027504733">Värskenduse hankimiseks taaskäivitage Chromebook koos ühendatud klaviatuuriga.</translation>
 <translation id="5992218262414051481">Suure kontrastsusega režiim on lubatud. Vajutage selle väljalülitamiseks uuesti klahvikombinatsiooni Ctrl + otsinguklahv + H.</translation>
+<translation id="6009656393242168182">Keelake SIM-kaardi luku seade</translation>
 <translation id="6012623610530968780">Leht <ph name="SELECTED_PAGE" />/<ph name="TOTAL_PAGE_NUM" /></translation>
 <translation id="6018164090099858612">Peeglirežiimist väljumine</translation>
 <translation id="602001110135236999">Keri vasakule</translation>
@@ -863,6 +866,7 @@
 <translation id="6165508094623778733">Lisateave</translation>
 <translation id="6166852626429024716">Otsige oma seadmest, rakendustest, seadetest, veebist …</translation>
 <translation id="6179832488876878285">Saate oma olulised failid siia kinnitada. Alustamiseks avage rakendus Failid.</translation>
+<translation id="6182592640011875895">Ava töölaud</translation>
 <translation id="619279033188484792">Seadmes <ph name="DEVICE_TYPE" /> oma telefoni hiljutiste fotode, meedia ja märguannete vaatamine</translation>
 <translation id="619335566042889110">Laadi nüüd täielikult täis</translation>
 <translation id="6220928844947387476">Saate nüüd ennast ja oma ekraanikuva salvestada samaaegselt</translation>
@@ -1169,6 +1173,7 @@
 <translation id="8052898407431791827">Lõikelauale kopeeritud</translation>
 <translation id="8054466585765276473">Aku tööaja arvutamine.</translation>
 <translation id="8061464966246066292">Kõrge kontrast</translation>
+<translation id="8083540854303889870">Salvestatud hilisemaks</translation>
 <translation id="8098591350844501178">Peata ekraani ülekandmine vastuvõtjasse <ph name="RECEIVER_NAME" /></translation>
 <translation id="8113423164597455979">Sees, kõik rak.</translation>
 <translation id="8120151603115102514">Teie telefonil pole lukustuskuva. Chromebooki avamiseks sisestage parool.</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb
index 1fce813..583acca 100644
--- a/ash/strings/ash_strings_fil.xtb
+++ b/ash/strings/ash_strings_fil.xtb
@@ -176,6 +176,7 @@
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1972950159383891558">Kumusta, <ph name="USERNAME" /></translation>
 <translation id="1978498689038657292">Pag-input ng text</translation>
+<translation id="1982717156487272186">Ipakita ang nakaraang linggo</translation>
 <translation id="1989113344093894667">Hindi ma-capture ang content</translation>
 <translation id="1990046457226896323">Na-download na ang mga speech file</translation>
 <translation id="1993072747612765854">Matuto pa tungkol sa pinakabagong update sa <ph name="SYSTEM_APP_NAME" /></translation>
@@ -622,6 +623,7 @@
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, Star na rating <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{Ibalik sa nakaraang bersyon ang device sa loob ng isang araw}one{Ibalik sa nakaraang bersyon ang device sa loob ng # araw}other{Ibalik sa nakaraang bersyon ang device sa loob ng # na araw}}</translation>
 <translation id="4642092649622328492">Kumuha ng screenshot ng bahagi ng screen</translation>
+<translation id="4644727592819780893">Masyadong maliit ang rehiyon para ipakita ang preview ng camera</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, Rekomendasyon sa app</translation>
 <translation id="4657775630156561295">Permanenteng aalisin ang sumusunod na mungkahi sa history ng suhestyon ng iyong account:
 
@@ -776,6 +778,7 @@
 <translation id="5673434351075758678">Gagawing "<ph name="TO_LOCALE" />" mula "<ph name="FROM_LOCALE" />" pagkatapos i-sync ang iyong mga setting.</translation>
 <translation id="5675363643668471212">Item sa shelf</translation>
 <translation id="5677928146339483299">Naka-block</translation>
+<translation id="5678564054339031017">Ipakita ang susunod na linggo</translation>
 <translation id="5679050765726761783">Nakakonekta ang low-power adapter</translation>
 <translation id="5682642926269496722">Hindi available ang Google Assistant para sa kasalukuyang user account.</translation>
 <translation id="5689633613396158040">Mas pinapadali ng Night Light na tumingin sa iyong screen o magbasa sa dilim. I-tap para baguhin kung anong oras mao-on ang Night Light o tuluyan itong i-off.</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb
index 788e4d2..7f47f31 100644
--- a/ash/strings/ash_strings_hr.xtb
+++ b/ash/strings/ash_strings_hr.xtb
@@ -326,6 +326,7 @@
 <translation id="2970920913501714344">Instaliranje aplikacija, proširenja i tema</translation>
 <translation id="2977598380246111477">Sljedeći broj</translation>
 <translation id="2981684127883932071">Prikazuju se prijedlozi</translation>
+<translation id="2985148236010982088">Pogledajte sve aplikacije</translation>
 <translation id="2992327365391326550">Gumb mikrofona na uređaju je isključen.</translation>
 <translation id="2995447421581609334">Prikaz uređaja za emitiranje.</translation>
 <translation id="2996462380875591307">Usidreno je povećalo omogućeno. Ponovo pritisnite Ctrl + Search + D da biste ga isključili.</translation>
@@ -464,6 +465,7 @@
 <translation id="3726171378575546917">Aplikacije <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> i njih još <ph name="UNAVAILABLE_APPS_COUNT" /> nisu instalirane na ovom uređaju.</translation>
 <translation id="3735740477244556633">Poredaj po</translation>
 <translation id="3742055079367172538">Izrađena je snimka zaslona</translation>
+<translation id="3761848338953536304">Administrator traži da isključite postavku zaključavanja SIM-a</translation>
 <translation id="3765841986579723851">Uređeno danas</translation>
 <translation id="3771549900096082774">Način visokog kontrasta</translation>
 <translation id="3773700760453577392">Administrator je onemogućio višestruku prijavu za <ph name="USER_EMAIL" />. Svi se korisnici moraju odjaviti da bi nastavili.</translation>
@@ -828,6 +830,7 @@
 <translation id="598407983968395253">Koristi predložak</translation>
 <translation id="598882571027504733">Da biste preuzeli ažuriranje, ponovo pokrenite Chromebook dok je tipkovnica priključena.</translation>
 <translation id="5992218262414051481">Način visokog kontrasta omogućen je. Ponovo pritisnite Ctrl + Search + H da biste ga isključili.</translation>
+<translation id="6009656393242168182">Onemogućite postavku zaključavanja SIM-a</translation>
 <translation id="6012623610530968780"><ph name="SELECTED_PAGE" />. stranica od <ph name="TOTAL_PAGE_NUM" /></translation>
 <translation id="6018164090099858612">Izlaz iz zrcalnog načina</translation>
 <translation id="602001110135236999">Pomicanje ulijevo</translation>
@@ -862,6 +865,7 @@
 <translation id="6165508094623778733">Saznajte više</translation>
 <translation id="6166852626429024716">Pretražite uređaj, aplikacije, postavke, web...</translation>
 <translation id="6179832488876878285">Ovdje možete prikvačiti svoje važne datoteke. Da biste započeli, otvorite aplikaciju Datoteke.</translation>
+<translation id="6182592640011875895">Otvori radnu površinu</translation>
 <translation id="619279033188484792">Pregledajte nedavne fotografije, medije i obavijesti telefona na uređaju <ph name="DEVICE_TYPE" />.</translation>
 <translation id="619335566042889110">Odmah napunite do kraja</translation>
 <translation id="6220928844947387476">Sad možete snimiti sebe i zaslon istovremeno.</translation>
@@ -1168,6 +1172,7 @@
 <translation id="8052898407431791827">Kopirano u međuspremnik</translation>
 <translation id="8054466585765276473">Izračun vremena baterije.</translation>
 <translation id="8061464966246066292">Visoki kontrast</translation>
+<translation id="8083540854303889870">Spremljeno za kasnije</translation>
 <translation id="8098591350844501178">Zaustavi emitiranje zaslona na prijamniku <ph name="RECEIVER_NAME" /></translation>
 <translation id="8113423164597455979">Uklj., sve ap.</translation>
 <translation id="8120151603115102514">Telefon nema zaključan zaslon. Da biste otključali Chromebook, unesite zaporku.</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb
index 5edabe5..80faf41e 100644
--- a/ash/strings/ash_strings_ja.xtb
+++ b/ash/strings/ash_strings_ja.xtb
@@ -326,6 +326,7 @@
 <translation id="2970920913501714344">アプリ、拡張機能、テーマをインストールする</translation>
 <translation id="2977598380246111477">次の番号</translation>
 <translation id="2981684127883932071">候補を表示しています</translation>
+<translation id="2985148236010982088">アプリをすべて表示</translation>
 <translation id="2992327365391326550">デバイスのマイクボタンはオフになっています。</translation>
 <translation id="2995447421581609334">キャスト デバイスを表示します。</translation>
 <translation id="2996462380875591307">ドッキング拡大鏡がオンになっています。オフにするには Ctrl+検索+D キーをもう一度押します。</translation>
@@ -464,6 +465,7 @@
 <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />、<ph name="UNAVAILABLE_APPS_TWO" />、<ph name="UNAVAILABLE_APPS_COUNT" /> はこのデバイスにありません。</translation>
 <translation id="3735740477244556633">並べ替え</translation>
 <translation id="3742055079367172538">スクリーンショット撮影完了</translation>
+<translation id="3761848338953536304">管理者が SIM ロック設定を無効にするよう求めています</translation>
 <translation id="3765841986579723851">今日編集したファイル</translation>
 <translation id="3771549900096082774">ハイ コントラスト モード</translation>
 <translation id="3773700760453577392"><ph name="USER_EMAIL" /> へのマルチログインは、管理者によって禁止されています。続行するには、すべてのユーザーがログアウトする必要があります。</translation>
@@ -828,6 +830,7 @@
 <translation id="598407983968395253">テンプレートを使用</translation>
 <translation id="598882571027504733">アップデートを取得するには、キーボードを接続した状態で Chromebook を再起動してください。</translation>
 <translation id="5992218262414051481">ハイコントラスト モードが有効になりました。無効にするには、Ctrl+検索+H キーをもう一度押します。</translation>
+<translation id="6009656393242168182">SIM ロック設定を無効にしてください</translation>
 <translation id="6012623610530968780"><ph name="SELECTED_PAGE" /> / <ph name="TOTAL_PAGE_NUM" /> ページ</translation>
 <translation id="6018164090099858612">ミラーモードを終了しています</translation>
 <translation id="602001110135236999">左にスクロール</translation>
@@ -862,6 +865,7 @@
 <translation id="6165508094623778733">詳細</translation>
 <translation id="6166852626429024716">デバイス、アプリ、設定、ウェブを検索...</translation>
 <translation id="6179832488876878285">重要なファイルをここに固定できます。この機能を使用するには、ファイルアプリを開いてください。</translation>
+<translation id="6182592640011875895">デスクを開く</translation>
 <translation id="619279033188484792"><ph name="DEVICE_TYPE" /> でスマートフォンの最近の写真、メディア、通知を表示します</translation>
 <translation id="619335566042889110">今すぐ完全に充電</translation>
 <translation id="6220928844947387476">画面と自分を同時に録画できるようになりました</translation>
@@ -1169,6 +1173,7 @@
 <translation id="8052898407431791827">クリップボードにコピーしました</translation>
 <translation id="8054466585765276473">バッテリーの残り時間を計算しています。</translation>
 <translation id="8061464966246066292">ハイコントラスト</translation>
+<translation id="8083540854303889870">後で実行するために保存</translation>
 <translation id="8098591350844501178"><ph name="RECEIVER_NAME" /> への画面のキャストを停止する</translation>
 <translation id="8113423164597455979">オン: 全アプリ</translation>
 <translation id="8120151603115102514">スマートフォンにロック画面が設定されていません。パスワードを入力してChromebookのロックを解除してください</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb
index ab85e4e3..8d0a3e1 100644
--- a/ash/strings/ash_strings_ka.xtb
+++ b/ash/strings/ash_strings_ka.xtb
@@ -176,6 +176,7 @@
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1972950159383891558">გამარჯობა, <ph name="USERNAME" /></translation>
 <translation id="1978498689038657292">ტექსტის შეყვანა</translation>
+<translation id="1982717156487272186">წინა კვირის ჩვენება</translation>
 <translation id="1989113344093894667">კონტენტის აღბეჭდვა ვერ ხერხდება</translation>
 <translation id="1990046457226896323">მეტყველების ფაილები ჩამოიტვირთა</translation>
 <translation id="1993072747612765854">შეიტყვეთ მეტი <ph name="SYSTEM_APP_NAME" />-ის ბოლო განახლების შესახებ</translation>
@@ -326,6 +327,7 @@
 <translation id="2970920913501714344">აპების, გაფართოებებისა და თემების ინსტალაცია</translation>
 <translation id="2977598380246111477">შემდეგი ციფრი</translation>
 <translation id="2981684127883932071">ნაჩვენებია შემოთავაზებები</translation>
+<translation id="2985148236010982088">ყველა აპის ნახვა</translation>
 <translation id="2992327365391326550">მოწყობილობის მიკროფონის ღილაკი გამორთულია.</translation>
 <translation id="2995447421581609334">ტრანსლირების მოწყობილობების ჩვენება.</translation>
 <translation id="2996462380875591307">ჩამაგრებული ლუპა ჩართულია. გამოსართავად ხელახლა დააჭირეთ კლავიშთა კომბინაციას: Ctrl+Search+D.</translation>
@@ -464,6 +466,7 @@
 <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> და <ph name="UNAVAILABLE_APPS_COUNT" /> სხვა აპი არ არის ამ მოწყობილობაზე.</translation>
 <translation id="3735740477244556633">დალაგება</translation>
 <translation id="3742055079367172538">ეკრანის ანაბეჭდი გადაღებულია</translation>
+<translation id="3761848338953536304">თქვენი ადმინისტრატორი ითხოვს, გამორთოთ SIM ბარათის ჩაკეტვის პარამეტრი</translation>
 <translation id="3765841986579723851">დღეს რედაქტირებული</translation>
 <translation id="3771549900096082774">მაღალკონტრასტული რეჟიმი</translation>
 <translation id="3773700760453577392">ადმინისტრატორმა აკრძალა მრავალჯერადი შესვლა <ph name="USER_EMAIL" />-ისთვის. გასაგრძელებლად საჭიროა ყველა მომხმარებლის გამოსვლა სისტემიდან.</translation>
@@ -620,6 +623,7 @@
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, შეფასებულია <ph name="RATING_SCORE" /> ვარსკვლავით</translation>
 <translation id="4633185660152240791">{0,plural, =1{დააბრუნეთ მოწყობილობა წინა ვერსიაზე ერთი დღის განმავლობაში}other{დააბრუნეთ მოწყობილობა წინა ვერსიაზე # დღის განმავლობაში}}</translation>
 <translation id="4642092649622328492">ეკრანის ნაწილობრივი ანაბეჭდის გადაღება</translation>
+<translation id="4644727592819780893">რეგიონი ზედმეტად პატარაა კამერის მოსათავსებლად</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, აპის რეკომენდაცია</translation>
 <translation id="4657775630156561295">თქვენი ანგარიშის შემოთავაზებების ისტორიიდან სამუდამოდ ამოიშლება შემდეგი შემოთავაზება:
 
@@ -774,6 +778,7 @@
 <translation id="5673434351075758678">„<ph name="FROM_LOCALE" />“ გახდა „<ph name="TO_LOCALE" />“ თქვენი პარამეტრების სინქრონიზაციის შემდეგ.</translation>
 <translation id="5675363643668471212">თაროს ელემენტი</translation>
 <translation id="5677928146339483299">დაბლოკილი</translation>
+<translation id="5678564054339031017">შემდეგი კვირის ჩვენება</translation>
 <translation id="5679050765726761783">დაკავშირებულია დაბალი სიმძლავრის ელკვების ადაპტერი</translation>
 <translation id="5682642926269496722">Google ასისტენტი მიუწვდომელია მომხმარებლის ამჟამინდელი ანგარიშისთვის.</translation>
 <translation id="5689633613396158040">ღამის განათება გაგიმარტივებთ ეკრანზე კითხვას ან მის ყურებას მკრთალი განათების პირობებში. შეეხეთ ღამის განათების ჩართვის დროის შესაცვლელად ან მის მთლიანად გამოსართავად.</translation>
@@ -828,6 +833,7 @@
 <translation id="598407983968395253">შაბლონის გამოყენება</translation>
 <translation id="598882571027504733">განახლების ჩამოსატვირთად გადატვირთეთ თქვენი Chromebook და არ გამოართოთ კლავიატურა.</translation>
 <translation id="5992218262414051481">მაღალკონტრასტული რეჟიმი ჩართულია. გამოსართავად ხელახლა დააჭირეთ კლავიშთა კომბინაციას: Ctrl+Search+H.</translation>
+<translation id="6009656393242168182">გათიშეთ SIM ბარათის ჩაკეტვის პარამეტრი</translation>
 <translation id="6012623610530968780">გვერდი <ph name="SELECTED_PAGE" /> / <ph name="TOTAL_PAGE_NUM" />-დან</translation>
 <translation id="6018164090099858612">მიმდინარეობს სარკის რეჟიმიდან გამოსვლა</translation>
 <translation id="602001110135236999">გადაადგილება მარცხნივ</translation>
@@ -862,6 +868,7 @@
 <translation id="6165508094623778733">შეიტყვეთ მეტი</translation>
 <translation id="6166852626429024716">წამოიწყეთ ძიება თქვენს მოწყობილობაში, აპებში, პარამეტრებსა და ვებში...</translation>
 <translation id="6179832488876878285">აქ შეგიძლიათ მნიშვნელოვანი ფაილების ჩამაგრება. დასაწყებად გახსენით ფაილების აპი.</translation>
+<translation id="6182592640011875895">სამუშაო მაგიდის გახსნა</translation>
 <translation id="619279033188484792">ნახეთ თქვენი ტელეფონის ბოლოდროინდელი ფოტოები, მედიაფაილები და შეტყობინებები თქვენს <ph name="DEVICE_TYPE" />-ზე</translation>
 <translation id="619335566042889110">სრულად დატენა ახლავე</translation>
 <translation id="6220928844947387476">ახლა თქვენი თავის და ეკრანის ჩაწერა ერთდროულად შეგიძლიათ</translation>
@@ -1168,6 +1175,7 @@
 <translation id="8052898407431791827">დაკოპირდა გაცვლის ბუფერში</translation>
 <translation id="8054466585765276473">ბატარეის დროის გამოთვლა.</translation>
 <translation id="8061464966246066292">მაღალკონტრასტული რეჟიმი</translation>
+<translation id="8083540854303889870">შენახულია სამომავლოდ</translation>
 <translation id="8098591350844501178"><ph name="RECEIVER_NAME" />-ში ეკრანის ტრანსლირების შეწყვეტა</translation>
 <translation id="8113423164597455979">ჩართული, ყველა აპისთვის</translation>
 <translation id="8120151603115102514">თქვენს ტელეფონს არ აქვს ეკრანის დაბლოკვა. თქვენი Chromebook-ის განსაბლოკად შეიყვანეთ პაროლი.</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb
index 99158db1..86f0605d 100644
--- a/ash/strings/ash_strings_ky.xtb
+++ b/ash/strings/ash_strings_ky.xtb
@@ -176,6 +176,7 @@
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1972950159383891558">Салам <ph name="USERNAME" />,</translation>
 <translation id="1978498689038657292">Текст киргизүү</translation>
+<translation id="1982717156487272186">Мурунку аптаны көрсөтүү</translation>
 <translation id="1989113344093894667">Мазмун сүрөткө тартылган жок</translation>
 <translation id="1990046457226896323">Кеп файлдары жүктөлүп алынды</translation>
 <translation id="1993072747612765854"><ph name="SYSTEM_APP_NAME" /> колдонмосундагы жаңыртуу жөнүндө кененирээк маалымат алуу</translation>
@@ -622,6 +623,7 @@
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, Рейтинги: <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{Түзмөктү бир күндүн ичинде мурунку версияга өзгөртүңүз}other{Түзмөктү # күндүн ичинде мурунку версияга өзгөртүңүз}}</translation>
 <translation id="4642092649622328492">Экрандын бир бөлүгүн тартып алуу</translation>
+<translation id="4644727592819780893">Аймак камера үчүн өтө кичинекей</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, Сунушталган колдонмо</translation>
 <translation id="4657775630156561295">Төмөнкү сунуш аккаунтуңуздагы сунуштар таржымалынан биротоло өчүрүлөт:
 
@@ -776,6 +778,7 @@
 <translation id="5673434351075758678">Жөндөөлөр шайкештештирилгенден кийин тил "<ph name="FROM_LOCALE" />" тилинен "<ph name="TO_LOCALE" />" тилине өзгөртүлдү.</translation>
 <translation id="5675363643668471212">Текчедеги нерсе</translation>
 <translation id="5677928146339483299">Бөгөттөлгөн</translation>
+<translation id="5678564054339031017">Кийинки аптаны көрсөтүү</translation>
 <translation id="5679050765726761783">Кубаты төмөн адаптер туташтырылды</translation>
 <translation id="5682642926269496722">Google Жардамчы учурдагы колдонуучунун аккаунтунда жеткиликсиз.</translation>
 <translation id="5689633613396158040">Түнкү режим күңүрт жерде көзүңүзгө күч келтирбөөгө жардам берет. Түнкү режим күйгүзүлө турган убакытты өзгөртүү же биротоло өчүрүп салуу үчүн таптап коюңуз.</translation>
diff --git a/ash/strings/ash_strings_mn.xtb b/ash/strings/ash_strings_mn.xtb
index 976fd17..3627a1e 100644
--- a/ash/strings/ash_strings_mn.xtb
+++ b/ash/strings/ash_strings_mn.xtb
@@ -135,6 +135,7 @@
 <translation id="1715293566947629045">Профайлыг идэвхгүй болгож байна. Цөөн хэдэн минут хүлээнэ үү.</translation>
 <translation id="1719094688023114093">Шууд тайлбар асаалттай байна.</translation>
 <translation id="1720011244392820496">Wi-Fi синкийг асаана уу</translation>
+<translation id="1733996486177697563">Бараан болон цайвар загварын хооронд сэлгэнэ үү. Дэлгэц дээр хүрээд удаан дарж, дараа нь Дэлгэцийн зураг &amp; стилийг сонгоно уу.</translation>
 <translation id="1736898441010944794">"<ph name="NAME" />" нь Bluetooth төхөөрөмжүүдэд харагдана.</translation>
 <translation id="174102739345480129">Тэмдэглэгч унтраалттай байна.</translation>
 <translation id="1743570585616704562">Танихгүй байна</translation>
@@ -264,6 +265,7 @@
 <translation id="2573588302192866788"><ph name="NAME" />-тай холбогдож чадсангүй</translation>
 <translation id="2575685495496069081">Олон зэрэг нэвтрэлтийг идэвхгүй болголоо</translation>
 <translation id="2582112259361606227">Шинэчлэхийн тулд дахин эхлүүлэх</translation>
+<translation id="2586561057878260610"><ph name="DESK_NAME" />-тай нэгтгэхийн тулд Ctrl + W дээр дарна уу. Дэлгэц болон цонхыг хаахын тулд Ctrl + Shift + W дээр дарна уу.</translation>
 <translation id="2595239820337756193">5 км милиэр</translation>
 <translation id="2596078834055697711">Цонхны дэлгэцийн зургийг дарах</translation>
 <translation id="2607678425161541573">Онлайнаар нэвтрэх шаардлагатай</translation>
@@ -670,6 +672,7 @@
 <translation id="4917385247580444890">Хүчтэй</translation>
 <translation id="4918086044614829423">Хүлээн зөвшөөрөх</translation>
 <translation id="4925542575807923399">Энэ хаягийг хариуцсан ажилтан нь олон хаягаар зэрэг нэвтрэх тохиолдолд зөвхөн энэ хаягаар түрүүлж нэвтэрсний дараагаар бусад хаягт нэвтрэх боломжтой байхаар тохируулсан байна.</translation>
+<translation id="4938176435186993759">Бүх зөвлөмжийг нуух</translation>
 <translation id="4945196315133970626">Мэдэгдлийг унтраах</translation>
 <translation id="4946376291507881335">Зураг авах</translation>
 <translation id="495046168593986294">Дээш гүйлгэх</translation>
@@ -736,6 +739,7 @@
 <translation id="5331975486040154427">USB-C төхөөрөмж (ард талын портны зүүн тал)</translation>
 <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (Баруун)</translation>
 <translation id="5352250171825660495">Бараан загвар асаалттай байна</translation>
+<translation id="5356963482258194581">Бараан болон цайвар загварын хооронд сэлгэнэ үү. Дэлгэц дээр баруун талыг товшиж, Дэлгэцийн зураг &amp; стилийг сонгоно уу.</translation>
 <translation id="5379115545237091094">Хэт олон удаа оролдлоо</translation>
 <translation id="5393156353051693207">Аппуудаа дахин эрэмбэлэхийн тулд хүссэн газраа удаан дарна уу</translation>
 <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" />-г <ph name="IN_PLACE_APP" /> дээр тавьсан байна. Фолдер үүсгэхийн тулд чөлөөлнө үү.</translation>
@@ -757,6 +761,7 @@
 <translation id="5520229639206813572">Танай администратор бүх eSIM профайлыг хассан. Нэмэлт мэдээлэл авах бол администратортайгаа холбогдоно уу.</translation>
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> холбогдож байна.</translation>
 <translation id="5532994612895037630">Бүтэн дэлгэцийг бичихийн тулд дурын газар товшино уу</translation>
+<translation id="5536723544185013515">Саяхны аппууд, саяхны бүх аппад хандахын тулд зүүн эсвэл баруун суман товчоор шилжинэ үү</translation>
 <translation id="553675580533261935">Харилцан үйлдлээс гарч байна</translation>
 <translation id="5537725057119320332">Cast</translation>
 <translation id="554893713779400387">Диктафоныг асаах/унтраах</translation>
@@ -784,6 +789,7 @@
 <translation id="5682642926269496722">Одоогийн хэрэглэгчийн бүртгэл дээр Google Туслах боломжгүй байна.</translation>
 <translation id="5689633613396158040">Шөнийн гэрэл нь бүдэг гэрэлтэй үед дэлгэцээ харах эсвэл уншихад илүү хялбар болгодог. Аль цагт Шөнийн гэрлийг бүрмөсөн асааж эсвэл унтраахыг өөрчлөхийн тулд товшино уу.</translation>
 <translation id="5691772641933328258">Хурууны хээг таньсангүй</translation>
+<translation id="570390244361237317">Бүх апп, бүх аппад хандахын тулд суман товчоор шилжинэ үү</translation>
 <translation id="5707775774148071965">Таны төхөөрөмж кабелиас тань өндөр дата хурдыг дэмжинэ. Төхөөрөмжийн гүйцэтгэл хязгаарлагдмал байж магадгүй.</translation>
 <translation id="5710450975648804523">Бүү саад бол горим асаалттай байна</translation>
 <translation id="571295407079589142">Мобайл дата унтраалттай байна</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb
index 6ca4444..d8a4bd0 100644
--- a/ash/strings/ash_strings_nl.xtb
+++ b/ash/strings/ash_strings_nl.xtb
@@ -323,6 +323,7 @@
 <translation id="2970920913501714344">Apps, extensies en thema's installeren</translation>
 <translation id="2977598380246111477">Volgend cijfer</translation>
 <translation id="2981684127883932071">Suggesties bekijken</translation>
+<translation id="2985148236010982088">Alle apps bekijken</translation>
 <translation id="2992327365391326550">De microfoonknop van het apparaat staat uit.</translation>
 <translation id="2995447421581609334">Cast-apparaten bekijken.</translation>
 <translation id="2996462380875591307">Vastgezet vergrootglas aanstaat. Druk nogmaals op Ctrl+Zoeken+D om dit uit te zetten.</translation>
@@ -461,6 +462,7 @@
 <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> en nog <ph name="UNAVAILABLE_APPS_COUNT" /> staan niet op dit apparaat.</translation>
 <translation id="3735740477244556633">Sorteren op</translation>
 <translation id="3742055079367172538">Screenshot gemaakt</translation>
+<translation id="3761848338953536304">Je beheerder vraagt je om de simlockinstelling uit te zetten</translation>
 <translation id="3765841986579723851">Vandaag bewerkt</translation>
 <translation id="3771549900096082774">Modus voor hoog contrast</translation>
 <translation id="3773700760453577392">Een beheerder heeft geen toestemming gegeven voor toegang tot meerdere accounts voor <ph name="USER_EMAIL" />. Alle gebruikers moeten uitloggen om door te gaan.</translation>
@@ -825,6 +827,7 @@
 <translation id="598407983968395253">Template gebruiken</translation>
 <translation id="598882571027504733">Als je de update wilt downloaden, sluit je het toetsenbord aan en start je je Chromebook opnieuw op</translation>
 <translation id="5992218262414051481">De modus voor hoog contrast staat aan. Druk nogmaals op Ctrl+Zoeken+H om deze uit te zetten.</translation>
+<translation id="6009656393242168182">Je simlockinstelling uitzetten</translation>
 <translation id="6012623610530968780">Pagina <ph name="SELECTED_PAGE" /> van <ph name="TOTAL_PAGE_NUM" /></translation>
 <translation id="6018164090099858612">Mirrormodus wordt gesloten</translation>
 <translation id="602001110135236999">Naar links scrollen</translation>
@@ -859,6 +862,7 @@
 <translation id="6165508094623778733">Meer informatie</translation>
 <translation id="6166852626429024716">Zoek op je apparaat, in apps en instellingen en op internet...</translation>
 <translation id="6179832488876878285">Je kunt hier je belangrijke bestanden vastzetten. Open de app Bestanden om aan de slag te gaan.</translation>
+<translation id="6182592640011875895">Bureau openen</translation>
 <translation id="619279033188484792">Recente foto's, media en meldingen van je telefoon bekijken op je <ph name="DEVICE_TYPE" /></translation>
 <translation id="619335566042889110">Nu volledig opladen</translation>
 <translation id="6220928844947387476">Je kunt jezelf en je scherm nu tegelijkertijd opnemen</translation>
@@ -1164,6 +1168,7 @@
 <translation id="8052898407431791827">Gekopieerd naar klembord</translation>
 <translation id="8054466585765276473">Accuduur berekenen.</translation>
 <translation id="8061464966246066292">Hoog contrast</translation>
+<translation id="8083540854303889870">Opgeslagen voor later</translation>
 <translation id="8098591350844501178">Schermcast naar <ph name="RECEIVER_NAME" /> stopzetten</translation>
 <translation id="8113423164597455979">Aan, alle apps</translation>
 <translation id="8120151603115102514">Je telefoon heeft geen vergrendelscherm. Geef het wachtwoord op om je Chromebook te ontgrendelen.</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb
index 50ee6b40..28858a1 100644
--- a/ash/strings/ash_strings_pl.xtb
+++ b/ash/strings/ash_strings_pl.xtb
@@ -326,6 +326,7 @@
 <translation id="2970920913501714344">instalować aplikacje, rozszerzenia i motywy;</translation>
 <translation id="2977598380246111477">Następny numer</translation>
 <translation id="2981684127883932071">Wyświetlam sugestie</translation>
+<translation id="2985148236010982088">Zobacz wszystkie aplikacje</translation>
 <translation id="2992327365391326550">Przycisk mikrofonu urządzenia jest wyłączony.</translation>
 <translation id="2995447421581609334">Pokaż urządzenia przesyłające.</translation>
 <translation id="2996462380875591307">Lupa zadokowana została włączona. Aby ją wyłączyć, naciśnij ponownie Ctrl+Search+D.</translation>
@@ -464,6 +465,7 @@
 <translation id="3726171378575546917">Aplikacji <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ani jeszcze <ph name="UNAVAILABLE_APPS_COUNT" /> nie ma na tym urządzeniu.</translation>
 <translation id="3735740477244556633">Sortuj według</translation>
 <translation id="3742055079367172538">Wykonano zrzut ekranu</translation>
+<translation id="3761848338953536304">Administrator prosi o wyłączenie ustawienia blokady SIM</translation>
 <translation id="3765841986579723851">Edytowane dzisiaj</translation>
 <translation id="3771549900096082774">Tryb wysokiego kontrastu</translation>
 <translation id="3773700760453577392">Administrator nie zezwolił na wielokrotne logowanie użytkownika <ph name="USER_EMAIL" />. Aby kontynuować, wszyscy użytkownicy muszą się wylogować.</translation>
@@ -828,6 +830,7 @@
 <translation id="598407983968395253">Użyj szablonu</translation>
 <translation id="598882571027504733">Aby pobrać aktualizację, uruchom Chromebooka ponownie z podłączoną klawiaturą.</translation>
 <translation id="5992218262414051481">Tryb wysokiego kontrastu został włączony. Aby go wyłączyć, naciśnij ponownie Ctrl+Search+H.</translation>
+<translation id="6009656393242168182">Wyłącz ustawienie blokady SIM</translation>
 <translation id="6012623610530968780">Strona <ph name="SELECTED_PAGE" /> z <ph name="TOTAL_PAGE_NUM" /></translation>
 <translation id="6018164090099858612">Wyłączam tryb odbicia lustrzanego</translation>
 <translation id="602001110135236999">Przewiń w lewo</translation>
@@ -862,6 +865,7 @@
 <translation id="6165508094623778733">Dowiedz się więcej</translation>
 <translation id="6166852626429024716">Przeszukaj urządzenie, aplikacje, ustawienia, internet…</translation>
 <translation id="6179832488876878285">Tutaj możesz przypiąć ważne pliki. Aby rozpocząć, otwórz aplikację Pliki.</translation>
+<translation id="6182592640011875895">Otwórz biurko</translation>
 <translation id="619279033188484792">Wyświetlaj najnowsze zdjęcia, pliki multimedialne i powiadomienia z telefonu na urządzeniu <ph name="DEVICE_TYPE" /></translation>
 <translation id="619335566042889110">Naładuj do pełna teraz</translation>
 <translation id="6220928844947387476">Teraz możesz jednocześnie nagrywać siebie i swój ekran</translation>
@@ -1167,6 +1171,7 @@
 <translation id="8052898407431791827">Skopiowano do schowka</translation>
 <translation id="8054466585765276473">Obliczanie czasu pracy na baterii.</translation>
 <translation id="8061464966246066292">Wysoki kontrast</translation>
+<translation id="8083540854303889870">Zapisane na później</translation>
 <translation id="8098591350844501178">Zakończ przesyłanie ekranu do: <ph name="RECEIVER_NAME" /></translation>
 <translation id="8113423164597455979">Włączono (wszystkie aplikacje)</translation>
 <translation id="8120151603115102514">Twój telefon nie ma ekranu blokady. Aby odblokować Chromebooka, wpisz hasło.</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb
index 1d01cb9..1a982b7 100644
--- a/ash/strings/ash_strings_ro.xtb
+++ b/ash/strings/ash_strings_ro.xtb
@@ -176,6 +176,7 @@
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1972950159383891558">Bună ziua, <ph name="USERNAME" /></translation>
 <translation id="1978498689038657292">Introducere text</translation>
+<translation id="1982717156487272186">Afișează săptămâna trecută</translation>
 <translation id="1989113344093894667">Nu se poate captura conținutul</translation>
 <translation id="1990046457226896323">Fișierele de redare în scris a vorbirii s-au descărcat</translation>
 <translation id="1993072747612765854">Află mai multe despre cea mai recentă actualizare <ph name="SYSTEM_APP_NAME" /></translation>
@@ -326,6 +327,7 @@
 <translation id="2970920913501714344">să instaleze aplicații, extensii și teme;</translation>
 <translation id="2977598380246111477">Următorul număr</translation>
 <translation id="2981684127883932071">Se afișează sugestiile</translation>
+<translation id="2985148236010982088">Vezi toate aplicațiile</translation>
 <translation id="2992327365391326550">Butonul pentru microfonul dispozitivului este dezactivat.</translation>
 <translation id="2995447421581609334">Afișează dispozitivele de proiecție.</translation>
 <translation id="2996462380875591307">Lupa andocată este activată. Apasă din nou pe Ctrl + tasta de căutare + D pentru a o dezactiva.</translation>
@@ -464,6 +466,7 @@
 <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> și încă <ph name="UNAVAILABLE_APPS_COUNT" /> nu sunt disponibile pe acest dispozitiv.</translation>
 <translation id="3735740477244556633">Sortează după</translation>
 <translation id="3742055079367172538">Captură de ecran efectuată</translation>
+<translation id="3761848338953536304">Administratorul solicită să dezactivezi setarea de blocare a cardului SIM</translation>
 <translation id="3765841986579723851">Editat astăzi</translation>
 <translation id="3771549900096082774">Mod de contrast ridicat</translation>
 <translation id="3773700760453577392">Un administrator a interzis conectarea multiplă pentru <ph name="USER_EMAIL" />. Toți utilizatorii trebuie să se deconecteze pentru a continua.</translation>
@@ -620,6 +623,7 @@
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, evaluare cu stele: <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{Treci la versiunea anterioară a dispozitivului în cel mult o zi}few{Treci la versiunea anterioară a dispozitivului în # zile}other{Treci la versiunea anterioară a dispozitivului în # de zile}}</translation>
 <translation id="4642092649622328492">Realizează o captură de ecran parțială</translation>
+<translation id="4644727592819780893">Regiunea este prea mică pentru cameră</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, aplicație recomandată</translation>
 <translation id="4657775630156561295">Următoarea sugestie va fi eliminată definitiv din istoricul de sugestii al contului:
 
@@ -774,6 +778,7 @@
 <translation id="5673434351075758678">Din „<ph name="FROM_LOCALE" />” în „<ph name="TO_LOCALE" />” după sincronizarea setărilor.</translation>
 <translation id="5675363643668471212">Elementul din raft</translation>
 <translation id="5677928146339483299">Blocat</translation>
+<translation id="5678564054339031017">Afișează săptămâna următoare</translation>
 <translation id="5679050765726761783">A fost conectat un adaptor de curent de putere joasă</translation>
 <translation id="5682642926269496722">Asistentul Google nu este disponibil pentru contul de utilizator actual.</translation>
 <translation id="5689633613396158040">Lumină de noapte îți oferă mai multă comoditate când privești ecranul sau citești într-o lumină slabă. Atinge pentru a schimba ora la care se activează Lumina de noapte sau dezactiveaz-o complet.</translation>
@@ -828,6 +833,7 @@
 <translation id="598407983968395253">Folosește șablonul</translation>
 <translation id="598882571027504733">Pentru a obține actualizarea, repornește Chromebookul cu tastatura atașată.</translation>
 <translation id="5992218262414051481">Modul Contrast ridicat este activat. Apasă din nou pe Ctrl + tasta de căutare + H pentru a-l dezactiva.</translation>
+<translation id="6009656393242168182">Dezactivează setarea de blocare a cardului SIM</translation>
 <translation id="6012623610530968780">Pagina <ph name="SELECTED_PAGE" /> din <ph name="TOTAL_PAGE_NUM" /></translation>
 <translation id="6018164090099858612">Se iese din modul oglindă</translation>
 <translation id="602001110135236999">Derulează la stânga</translation>
@@ -862,6 +868,7 @@
 <translation id="6165508094623778733">Află mai multe</translation>
 <translation id="6166852626429024716">Caută pe dispozitiv, în aplicații, în setări și pe web...</translation>
 <translation id="6179832488876878285">Poți să fixezi fișierele importante aici. Deschide aplicația Fișiere pentru a începe.</translation>
+<translation id="6182592640011875895">Deschide desktopul</translation>
 <translation id="619279033188484792">Afișează fotografiile, elementele media și notificările recente ale telefonului pe <ph name="DEVICE_TYPE" /></translation>
 <translation id="619335566042889110">Încarcă complet acum</translation>
 <translation id="6220928844947387476">Acum poți să te înregistrezi pe tine și ecranul tău în același timp</translation>
@@ -1168,6 +1175,7 @@
 <translation id="8052898407431791827">S-a copiat în clipboard</translation>
 <translation id="8054466585765276473">Se calculează durata bateriei.</translation>
 <translation id="8061464966246066292">Contrast ridicat</translation>
+<translation id="8083540854303889870">Salvate pentru mai târziu</translation>
 <translation id="8098591350844501178">Nu mai proiecta ecranul pe dispozitivul <ph name="RECEIVER_NAME" /></translation>
 <translation id="8113423164597455979">Activat, toate</translation>
 <translation id="8120151603115102514">Telefonul nu are ecran de blocare. Pentru a debloca Chromebookul, introdu parola.</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb
index 8cec160..bbc0379 100644
--- a/ash/strings/ash_strings_ru.xtb
+++ b/ash/strings/ash_strings_ru.xtb
@@ -326,6 +326,7 @@
 <translation id="2970920913501714344">Устанавливать приложения, расширения и темы.</translation>
 <translation id="2977598380246111477">Следующая цифра</translation>
 <translation id="2981684127883932071">Показаны подсказки</translation>
+<translation id="2985148236010982088">Посмотреть все приложения</translation>
 <translation id="2992327365391326550">Кнопка микрофона на устройстве отключена</translation>
 <translation id="2995447421581609334">Показать устройства Google Cast</translation>
 <translation id="2996462380875591307">Закрепленная лупа включена. Чтобы отключить ее, нажмите Ctrl + Поиск + D.</translation>
@@ -464,6 +465,7 @@
 <translation id="3726171378575546917">Приложения "<ph name="UNAVAILABLE_APPS_ONE" />", "<ph name="UNAVAILABLE_APPS_TWO" />" и ещё несколько сервисов (<ph name="UNAVAILABLE_APPS_COUNT" />) не установлены на этом устройстве.</translation>
 <translation id="3735740477244556633">Сортировать по:</translation>
 <translation id="3742055079367172538">Сделан скриншот</translation>
+<translation id="3761848338953536304">Администратор просит вас отключить блокировку SIM-карты.</translation>
 <translation id="3765841986579723851">Изменено сегодня</translation>
 <translation id="3771549900096082774">Режим высокой контрастности</translation>
 <translation id="3773700760453577392">Администратор отключил множественный вход для аккаунта <ph name="USER_EMAIL" />. Чтобы продолжить, все пользователи должны выйти из аккаунтов.</translation>
@@ -828,6 +830,7 @@
 <translation id="598407983968395253">Использовать шаблон</translation>
 <translation id="598882571027504733">Чтобы выполнить обновление, перезагрузите устройство Chromebook, не отключая от него клавиатуру.</translation>
 <translation id="5992218262414051481">Режим высокой контрастности включен. Чтобы отключить его, нажмите CTRL + ПОИСК + H.</translation>
+<translation id="6009656393242168182">Разблокируйте SIM-карту</translation>
 <translation id="6012623610530968780">Страница <ph name="SELECTED_PAGE" /> из <ph name="TOTAL_PAGE_NUM" /></translation>
 <translation id="6018164090099858612">Выход из режима трансляции…</translation>
 <translation id="602001110135236999">Влево</translation>
@@ -862,6 +865,7 @@
 <translation id="6165508094623778733">Подробнее</translation>
 <translation id="6166852626429024716">Поиск на устройстве, в приложениях, настройках и Интернете…</translation>
 <translation id="6179832488876878285">Вы можете закрепить здесь важные документы. Чтобы начать, откройте приложение "Файлы".</translation>
+<translation id="6182592640011875895">Открыть рабочий стол</translation>
 <translation id="619279033188484792">Позволяет просматривать на устройстве <ph name="DEVICE_TYPE" /> уведомления с телефона, а также недавно добавленные на телефон фотографии и медиафайлы</translation>
 <translation id="619335566042889110">Зарядить до конца сейчас</translation>
 <translation id="6220928844947387476">Теперь можно вести запись экрана и изображения с веб-камеры одновременно.</translation>
@@ -1168,6 +1172,7 @@
 <translation id="8052898407431791827">Скопировано в буфер обмена</translation>
 <translation id="8054466585765276473">Подсчет оставшегося времени работы от батареи…</translation>
 <translation id="8061464966246066292">Высокая контрастность</translation>
+<translation id="8083540854303889870">Сохранено</translation>
 <translation id="8098591350844501178">Остановить трансляцию содержимого экрана на устройство "<ph name="RECEIVER_NAME" />"</translation>
 <translation id="8113423164597455979">Вкл. для всех</translation>
 <translation id="8120151603115102514">На телефоне нет блокировки экрана. Чтобы разблокировать Chromebook, введите пароль.</translation>
diff --git a/ash/strings/ash_strings_sr-Latn.xtb b/ash/strings/ash_strings_sr-Latn.xtb
index f20da3b..4b299ea 100644
--- a/ash/strings/ash_strings_sr-Latn.xtb
+++ b/ash/strings/ash_strings_sr-Latn.xtb
@@ -326,6 +326,7 @@
 <translation id="2970920913501714344">Instalirajte aplikacije, dodatke i teme</translation>
 <translation id="2977598380246111477">Sledeći broj</translation>
 <translation id="2981684127883932071">Prikazuju se predlozi</translation>
+<translation id="2985148236010982088">Prikaži sve aplikacije</translation>
 <translation id="2992327365391326550">Dugme za mikrofon na uređaju je isključeno.</translation>
 <translation id="2995447421581609334">Pregledajte uređaje za prebacivanje.</translation>
 <translation id="2996462380875591307">Montirana lupa ekrana je omogućena. Pritisnite Ctrl + taster za pretragu + D ponovo da biste je isključili.</translation>
@@ -464,6 +465,7 @@
 <translation id="3726171378575546917">Aplikacije <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> i još <ph name="UNAVAILABLE_APPS_COUNT" /> nisu na ovom uređaju.</translation>
 <translation id="3735740477244556633">Sortiraj prema</translation>
 <translation id="3742055079367172538">Snimak ekrana je napravljen</translation>
+<translation id="3761848338953536304">Administrator zahteva da isključite podešavanje zaključavanja SIM kartice</translation>
 <translation id="3765841986579723851">Izmenjeno danas</translation>
 <translation id="3771549900096082774">Režim visokog kontrasta</translation>
 <translation id="3773700760453577392">Administrator je zabranio višestruko prijavljivanje za <ph name="USER_EMAIL" />. Svi korisnici moraju da se odjave da bismo nastavili sa sesijom.</translation>
@@ -828,6 +830,7 @@
 <translation id="598407983968395253">Koristi šablon</translation>
 <translation id="598882571027504733">Da biste preuzeli ažuriranje, restartujte Chromebook sa priključenom tastasturom.</translation>
 <translation id="5992218262414051481">Režim visokog kontrasta je omogućen. Pritisnite Ctrl + taster za pretragu + H ponovo da biste ga isključili.</translation>
+<translation id="6009656393242168182">Onemogućite podešavanje zaključavanja SIM kartice</translation>
 <translation id="6012623610530968780"><ph name="SELECTED_PAGE" />. stranica od <ph name="TOTAL_PAGE_NUM" /></translation>
 <translation id="6018164090099858612">Izlazak iz režima sa preslikavanjem</translation>
 <translation id="602001110135236999">Pomeri nalevo</translation>
@@ -862,6 +865,7 @@
 <translation id="6165508094623778733">Saznajte više</translation>
 <translation id="6166852626429024716">Pretražujte uređaj, aplikacije, podešavanja, veb...</translation>
 <translation id="6179832488876878285">Ovde možete da zakačite najvažnije fajlove. Otvorite aplikaciju Fajlovi da biste započeli.</translation>
+<translation id="6182592640011875895">Otvori radnu površinu</translation>
 <translation id="619279033188484792">Pregledajte nedavne slike, medijski sadržaj i obaveštenja telefona na uređaju <ph name="DEVICE_TYPE" /></translation>
 <translation id="619335566042889110">Odmah napunite do kraja</translation>
 <translation id="6220928844947387476">Sada istovremeno možete da snimate sebe i ekran</translation>
@@ -1168,6 +1172,7 @@
 <translation id="8052898407431791827">Kopirano je u privremenu memoriju</translation>
 <translation id="8054466585765276473">Izračunavanje vremena trajanja baterije.</translation>
 <translation id="8061464966246066292">Visoki kontrast</translation>
+<translation id="8083540854303889870">Sačuvano za kasnije</translation>
 <translation id="8098591350844501178">Zaustavi prebacivanje ekrana na <ph name="RECEIVER_NAME" /></translation>
 <translation id="8113423164597455979">Uključeno, sve</translation>
 <translation id="8120151603115102514">Telefon nema zaključani ekran. Da biste otključali Chromebook, unesite lozinku.</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb
index 9a4f49e..801000e3 100644
--- a/ash/strings/ash_strings_sr.xtb
+++ b/ash/strings/ash_strings_sr.xtb
@@ -326,6 +326,7 @@
 <translation id="2970920913501714344">Инсталирајте апликације, додатке и теме</translation>
 <translation id="2977598380246111477">Следећи број</translation>
 <translation id="2981684127883932071">Приказују се предлози</translation>
+<translation id="2985148236010982088">Прикажи све апликације</translation>
 <translation id="2992327365391326550">Дугме за микрофон на уређају је искључено.</translation>
 <translation id="2995447421581609334">Прегледајте уређаје за пребацивање.</translation>
 <translation id="2996462380875591307">Монтирана лупа екрана је омогућена. Притисните Ctrl + тастер за претрагу + D поново да бисте је искључили.</translation>
@@ -464,6 +465,7 @@
 <translation id="3726171378575546917">Апликације <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> и још <ph name="UNAVAILABLE_APPS_COUNT" /> нису на овом уређају.</translation>
 <translation id="3735740477244556633">Сортирај према</translation>
 <translation id="3742055079367172538">Снимак екрана је направљен</translation>
+<translation id="3761848338953536304">Администратор захтева да искључите подешавање закључавања SIM картице</translation>
 <translation id="3765841986579723851">Измењено данас</translation>
 <translation id="3771549900096082774">Режим високог контраста</translation>
 <translation id="3773700760453577392">Администратор је забранио вишеструко пријављивање за <ph name="USER_EMAIL" />. Сви корисници морају да се одјаве да бисмо наставили са сесијом.</translation>
@@ -828,6 +830,7 @@
 <translation id="598407983968395253">Користи шаблон</translation>
 <translation id="598882571027504733">Да бисте преузели ажурирање, рестартујте Chromebook са прикљученом тастастуром.</translation>
 <translation id="5992218262414051481">Режим високог контраста је омогућен. Притисните Ctrl + тастер за претрагу + H поново да бисте га искључили.</translation>
+<translation id="6009656393242168182">Онемогућите подешавање закључавања SIM картице</translation>
 <translation id="6012623610530968780"><ph name="SELECTED_PAGE" />. страница од <ph name="TOTAL_PAGE_NUM" /></translation>
 <translation id="6018164090099858612">Излазак из режима са пресликавањем</translation>
 <translation id="602001110135236999">Помери налево</translation>
@@ -862,6 +865,7 @@
 <translation id="6165508094623778733">Сазнајте више</translation>
 <translation id="6166852626429024716">Претражујте уређај, апликације, подешавања, веб...</translation>
 <translation id="6179832488876878285">Овде можете да закачите најважније фајлове. Отворите апликацију Фајлови да бисте започели.</translation>
+<translation id="6182592640011875895">Отвори радну површину</translation>
 <translation id="619279033188484792">Прегледајте недавне слике, медијски садржај и обавештења телефона на уређају <ph name="DEVICE_TYPE" /></translation>
 <translation id="619335566042889110">Одмах напуните до краја</translation>
 <translation id="6220928844947387476">Сада истовремено можете да снимате себе и екран</translation>
@@ -1168,6 +1172,7 @@
 <translation id="8052898407431791827">Копирано је у привремену меморију</translation>
 <translation id="8054466585765276473">Израчунавање времена трајања батерије.</translation>
 <translation id="8061464966246066292">Високи контраст</translation>
+<translation id="8083540854303889870">Сачувано за касније</translation>
 <translation id="8098591350844501178">Заустави пребацивање екрана на <ph name="RECEIVER_NAME" /></translation>
 <translation id="8113423164597455979">Укључено, све</translation>
 <translation id="8120151603115102514">Телефон нема закључани екран. Да бисте откључали Chromebook, унесите лозинку.</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb
index 0630a08..c8c8eef 100644
--- a/ash/strings/ash_strings_sw.xtb
+++ b/ash/strings/ash_strings_sw.xtb
@@ -326,6 +326,7 @@
 <translation id="2970920913501714344">Kusakinisha programu, viendelezi na mandhari</translation>
 <translation id="2977598380246111477">Nambari inayofuata</translation>
 <translation id="2981684127883932071">Inaonyesha mapendekezo</translation>
+<translation id="2985148236010982088">Angalia programu zote</translation>
 <translation id="2992327365391326550">Kitufe cha maikrofoni ya kifaa kimezimwa.</translation>
 <translation id="2995447421581609334">Onyesha vifaa vinavyotuma maudhui.</translation>
 <translation id="2996462380875591307">Umewasha Kikuzaji Kilichoambatishwa. Bonyeza Ctrl+Search+D tena ili ukizime.</translation>
@@ -464,6 +465,7 @@
 <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> na zingine <ph name="UNAVAILABLE_APPS_COUNT" /> hazipo kwenye kifaa hiki.</translation>
 <translation id="3735740477244556633">Panga kwa</translation>
 <translation id="3742055079367172538">Picha ya skrini imepigwa</translation>
+<translation id="3761848338953536304">Msimamizi wako anakuomba uzime mipangilio ya kufunga SIM</translation>
 <translation id="3765841986579723851">Imebadilishwa leo</translation>
 <translation id="3771549900096082774">Hali ya Juu ya Utofautishaji</translation>
 <translation id="3773700760453577392">Msimamizi ameondoa uwezo wa <ph name="USER_EMAIL" /> wa kuingia katika akaunti nyingi kwa wakati mmoja. Watumiaji wote lazima waondoke katika akaunti ili waendelee.</translation>
@@ -828,6 +830,7 @@
 <translation id="598407983968395253">Tumia kiolezo</translation>
 <translation id="598882571027504733">Ili upate sasisho, washa Chromebook yako upya huku kibodi ikiwa imeunganishwa.</translation>
 <translation id="5992218262414051481">Hali ya Utofautishaji wa Juu imewashwa. Bonyeza Ctrl+Search+H tena ili ugeuze na kuizima.</translation>
+<translation id="6009656393242168182">Zima mipangilio yako ya kufunga SIM</translation>
 <translation id="6012623610530968780">Ukurasa wa <ph name="SELECTED_PAGE" /> kati ya <ph name="TOTAL_PAGE_NUM" /></translation>
 <translation id="6018164090099858612">Inaondoka kwenye hali ya kuakisi</translation>
 <translation id="602001110135236999">Sogeza kushoto</translation>
@@ -862,6 +865,7 @@
 <translation id="6165508094623778733">Pata maelezo zaidi</translation>
 <translation id="6166852626429024716">Tafuta kwenye programu, mipangilio, wavuti, kifaa chako...</translation>
 <translation id="6179832488876878285">Unaweza kubandika faili zako muhimu hapa. Fungua programu ya Faili ili uanze.</translation>
+<translation id="6182592640011875895">Fungua eneokazi</translation>
 <translation id="619279033188484792">Tazama picha, maudhui na arifa za hivi karibuni za simu yako kwenye <ph name="DEVICE_TYPE" /> yako</translation>
 <translation id="619335566042889110">Chaji betri kikamilifu sasa</translation>
 <translation id="6220928844947387476">Sasa unaweza kujirekodi wewe mwenyewe na skrini yako kwa wakati mmoja</translation>
@@ -1169,6 +1173,7 @@
 <translation id="8052898407431791827">Imewekwa kwenye ubao wa kunakili</translation>
 <translation id="8054466585765276473">Inakokotoa muda wa betri.</translation>
 <translation id="8061464966246066292">Kilinganushi kikubwa</translation>
+<translation id="8083540854303889870">Imehifadhiwa kwa ajili ya baadaye</translation>
 <translation id="8098591350844501178">Acha kutuma skrini kwenye <ph name="RECEIVER_NAME" /></translation>
 <translation id="8113423164597455979">Imewashwa: zote</translation>
 <translation id="8120151603115102514">Simu yako haina kipengele cha kufunga skrini. Ili ufungue Chromebook yako, weka nenosiri.</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb
index 8cafb34b..70fc628 100644
--- a/ash/strings/ash_strings_uz.xtb
+++ b/ash/strings/ash_strings_uz.xtb
@@ -135,6 +135,7 @@
 <translation id="1715293566947629045">Profil faolsizlantirilmoqda. Bir necha daqiqa kuting.</translation>
 <translation id="1719094688023114093">Jonli izoh yoniq.</translation>
 <translation id="1720011244392820496">Wi-Fi Sync funksiyasini yoqish</translation>
+<translation id="1733996486177697563">Tungi va kunduzni mavzularni almashtirish. Ish stolini bosib turib, Fon rasmi va uslub bandini tanlang.</translation>
 <translation id="1736898441010944794">“<ph name="NAME" />” Bluetooth qurilmalariga koʻrinadi.</translation>
 <translation id="174102739345480129">Marker oʻchiq.</translation>
 <translation id="1743570585616704562">Barmoq izi aniqlanmadi</translation>
@@ -176,6 +177,7 @@
 <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
 <translation id="1972950159383891558">Salom <ph name="USERNAME" /></translation>
 <translation id="1978498689038657292">Matn kiritish</translation>
+<translation id="1982717156487272186">Avvalgi hafta jadvalini ochish</translation>
 <translation id="1989113344093894667">Kontent tasvirga olinmadi</translation>
 <translation id="1990046457226896323">Avtomatik subtitr fayllari yuklab olindi</translation>
 <translation id="1993072747612765854"><ph name="SYSTEM_APP_NAME" /> oxirgi yangilanishi haqida batafsil axborot</translation>
@@ -263,6 +265,7 @@
 <translation id="2573588302192866788"><ph name="NAME" /> qurilmasi ulanmadi</translation>
 <translation id="2575685495496069081">Bir nechta hisobdan kirish funksiyasi yoqilmagan</translation>
 <translation id="2582112259361606227">Yangilash uchun qayta ishga tushiring</translation>
+<translation id="2586561057878260610"><ph name="DESK_NAME" /> bilan birlashtirish uchun Ctrl+W tugmalarini bosing. Ish stoli va oynalarni yopish uchun Ctrl+Shift+W tugmalarini bosing.</translation>
 <translation id="2595239820337756193">5 mil kilometrda</translation>
 <translation id="2596078834055697711">Oynadan skrinshot olish</translation>
 <translation id="2607678425161541573">Onlayn kirish zarur</translation>
@@ -326,6 +329,7 @@
 <translation id="2970920913501714344">Ilovalar, kengaytmalar va mavzularni oʻrnating</translation>
 <translation id="2977598380246111477">Keyingi raqam</translation>
 <translation id="2981684127883932071">Takliflar chiqarildi</translation>
+<translation id="2985148236010982088">Barcha ilovalar</translation>
 <translation id="2992327365391326550">Qurilmaning mikrofon tugmasi faolsizlantirildi.</translation>
 <translation id="2995447421581609334">Translatsiya qurilmalarini ochish.</translation>
 <translation id="2996462380875591307">Mahkamlangan lupa yoniq. Uni olib tashlash uchun Ctrl+Qidiruv+D tugmalarini bosing.</translation>
@@ -464,6 +468,7 @@
 <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> va yana <ph name="UNAVAILABLE_APPS_COUNT" /> ta ilova bu qurilmada emas.</translation>
 <translation id="3735740477244556633">Saralash tartibi</translation>
 <translation id="3742055079367172538">Ekran suratga olindi</translation>
+<translation id="3761848338953536304">Administratoringiz SIM kartani qulflash sozlamasini faolsizlantirishni talab qilmoqda</translation>
 <translation id="3765841986579723851">Bugun tahrirlangan</translation>
 <translation id="3771549900096082774">Yuqori kontrastli rejim</translation>
 <translation id="3773700760453577392">Administrator <ph name="USER_EMAIL" /> hisobi uchun bir multi-kirish imkoniyatini o‘chirib qo‘ydi. Hisobga kirishingizdan avval barcha foydalanuvchilar hisobdan chiqishi kerak.</translation>
@@ -620,6 +625,7 @@
 <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, Bahosi: <ph name="RATING_SCORE" /></translation>
 <translation id="4633185660152240791">{0,plural, =1{Qurilma tizimini bir kun ichida eski versiyaga qaytaring}other{Qurilma tizimini # kun ichida eski versiyaga qaytaring}}</translation>
 <translation id="4642092649622328492">Qisman skrinshot olish</translation>
+<translation id="4644727592819780893">Hudud razm solish uchun biroz kichik</translation>
 <translation id="4648249871170053485"><ph name="APP_NAME" />, Ilova tavsiyasi</translation>
 <translation id="4657775630156561295">Quyidagi soʻrov taklifi hisobingizdagi takliflar tarixidan butunlay oʻchib ketadi:
 
@@ -665,6 +671,7 @@
 <translation id="4917385247580444890">Kuchli</translation>
 <translation id="4918086044614829423">Qabul qilish</translation>
 <translation id="4925542575807923399">Bu hisobning administratori ko‘plab tizimga kirish seanslarida birinchi bo‘lib shu hisobga kirishni talab qiladi.</translation>
+<translation id="4938176435186993759">Barcha takliflarni berkitish</translation>
 <translation id="4945196315133970626">Bildirishnoma kelmasin</translation>
 <translation id="4946376291507881335">Tasvirga olish</translation>
 <translation id="495046168593986294">Tepaga chiqish</translation>
@@ -731,6 +738,7 @@
 <translation id="5331975486040154427">USB-C qurilma (chap tomondagi orqa port)</translation>
 <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (oʻng)</translation>
 <translation id="5352250171825660495">Tungi mavzu yoniq</translation>
+<translation id="5356963482258194581">Tungi va kunduzni mavzularni almashtirish. Ish stolida oʻng klikni bosib, Fon rasmi va uslub bandini tanlang.</translation>
 <translation id="5379115545237091094">Juda ko‘p urinishlar bo‘ldi</translation>
 <translation id="5393156353051693207">Ilovalarni qayta saralash uchun istalgan joyni bosib turing</translation>
 <translation id="5395308026110844773">Jild yaratish uchun <ph name="DRAGGED_APP_NAME" /> ilovaisini <ph name="IN_PLACE_APP" /> ustiga sudrang.</translation>
@@ -752,6 +760,7 @@
 <translation id="5520229639206813572">Administrator barcha eSIM profillarni olib tashladi. Batafsil axborot uchun administratorga murojaat qiling.</translation>
 <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> ulanmoqda.</translation>
 <translation id="5532994612895037630">Butun ekranni yozib olish uchun istalgan joyga bosing</translation>
+<translation id="5536723544185013515">Oxirgi ilovalarni koʻrish uchun chapga yoki oʻngga strelka tugmalarini bosing</translation>
 <translation id="553675580533261935">Seans yakunlanmoqda</translation>
 <translation id="5537725057119320332">Cast</translation>
 <translation id="554893713779400387">Diktovkani yoqish</translation>
@@ -774,10 +783,12 @@
 <translation id="5673434351075758678">Sinxronlash natijasida “<ph name="FROM_LOCALE" />” o‘rniga “<ph name="TO_LOCALE" />” asosiy til etib tayinlandi.</translation>
 <translation id="5675363643668471212">Javondagi element</translation>
 <translation id="5677928146339483299">Bloklangan</translation>
+<translation id="5678564054339031017">Keyingi hafta jadvalini ochish</translation>
 <translation id="5679050765726761783">Kuchsiz quvvat adapteri ulandi</translation>
 <translation id="5682642926269496722">Google Assistent bu foydalanuvchi hisobida ishlamaydi.</translation>
 <translation id="5689633613396158040">Tungi rejim xira yorugʻlikda koʻzlarni charchatmaslikka yordam beradi. Tungi rejimni rejalashtirish yoki undan butunlay chiqish uchun bu yerga bosing.</translation>
 <translation id="5691772641933328258">Barmoq izi aniqlanmadi</translation>
+<translation id="570390244361237317">Barcha ilovalarni koʻrish uchun strelka tugmalarini bosing</translation>
 <translation id="5707775774148071965">Qurilmangizga maʼlumot uzatish tezligi yuqoriroq kabellarni ulash mumkin. Qurilma samaradorligi cheklanishi mumkin.</translation>
 <translation id="5710450975648804523">Bezovta qilinmasin rejimi yoniq</translation>
 <translation id="571295407079589142">Mobil internet yoqilmagan</translation>
@@ -828,6 +839,7 @@
 <translation id="598407983968395253">Andozadan foydalanish</translation>
 <translation id="598882571027504733">Yangilanishni o‘rnatish uchun Chromebook qurilmangizni tashqi klavuatura orqali o‘chirib yoqing.</translation>
 <translation id="5992218262414051481">Yuqori kontrastli rejim yoniq. O‘chirib qo‘yish uchun Ctrl+Qidiruv+H tugmalarini bosing.</translation>
+<translation id="6009656393242168182">SIM karta qulfi sozlamasini faolsizlantiring</translation>
 <translation id="6012623610530968780">Sahifa: <ph name="SELECTED_PAGE" /> / <ph name="TOTAL_PAGE_NUM" /></translation>
 <translation id="6018164090099858612">Translatsiya rejimidan chiqish</translation>
 <translation id="602001110135236999">Chapga aylantirish</translation>
@@ -862,6 +874,7 @@
 <translation id="6165508094623778733">Batafsil</translation>
 <translation id="6166852626429024716">Qurilma, ilovalar va internetdan qidirish...</translation>
 <translation id="6179832488876878285">Bu yerga muhim fayllarni mahkamlash mumkin. Boshlash uchun Files ilovasini oching.</translation>
+<translation id="6182592640011875895">Ish stolini ochish</translation>
 <translation id="619279033188484792">Telefoningizdagi oxirgi rasmlar, media va bildirishnomalarni <ph name="DEVICE_TYPE" /> qurilmasida koʻring</translation>
 <translation id="619335566042889110">Toʻliq quvvatlang</translation>
 <translation id="6220928844947387476">Endi siz bir vaqtda ekran va veb kamera tasvirlarini yozib olishingiz mumkin.</translation>
@@ -1168,6 +1181,7 @@
 <translation id="8052898407431791827">Vaqtinchalik xotiraga nusxalandi</translation>
 <translation id="8054466585765276473">Batareyadan ishlash mumkin bo‘lgan vaqt hisoblanmoqda.</translation>
 <translation id="8061464966246066292">Yuqori kontrast</translation>
+<translation id="8083540854303889870">Keyinroqqa saqlangan</translation>
 <translation id="8098591350844501178">Ekranni “<ph name="RECEIVER_NAME" />” qurilmasiga translatsiya qilishni to‘xtatish</translation>
 <translation id="8113423164597455979">Yoniq, hammasi</translation>
 <translation id="8120151603115102514">Telefoningizda ekran qulfi yoqilmagan. Chromebook qulfini ochish uchun parolni kiriting.</translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb
index 4cd8024..3cccd49d 100644
--- a/ash/strings/ash_strings_zh-HK.xtb
+++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -326,6 +326,7 @@
 <translation id="2970920913501714344">安裝應用程式、擴充程式和主題</translation>
 <translation id="2977598380246111477">下一個號碼</translation>
 <translation id="2981684127883932071">顯示緊建議</translation>
+<translation id="2985148236010982088">查看所有應用程式</translation>
 <translation id="2992327365391326550">裝置的麥克風按鈕已關閉。</translation>
 <translation id="2995447421581609334">顯示投放裝置。</translation>
 <translation id="2996462380875591307">已啟用固定的放大鏡。再次按下 Search+Shift+D 鍵即可停用。</translation>
@@ -464,6 +465,7 @@
 <translation id="3726171378575546917">此裝置上未安裝「<ph name="UNAVAILABLE_APPS_ONE" />」、「<ph name="UNAVAILABLE_APPS_TWO" />」和另外 <ph name="UNAVAILABLE_APPS_COUNT" /> 個應用程式。</translation>
 <translation id="3735740477244556633">排序方式</translation>
 <translation id="3742055079367172538">已拍攝螢幕擷圖</translation>
+<translation id="3761848338953536304">管理員要求您關閉 SIM 卡鎖定設定</translation>
 <translation id="3765841986579723851">今天編輯過</translation>
 <translation id="3771549900096082774">高對比模式</translation>
 <translation id="3773700760453577392">管理員已禁止 <ph name="USER_EMAIL" /> 的多重登入功能。所有使用者都必須登出,才能繼續操作。</translation>
@@ -827,6 +829,7 @@
 <translation id="598407983968395253">使用範本</translation>
 <translation id="598882571027504733">如要下載更新,請連接鍵盤並重新啟動 Chromebook。</translation>
 <translation id="5992218262414051481">已啟用高對比模式。再次按下 Ctrl+Search+H 鍵即可停用。</translation>
+<translation id="6009656393242168182">停用 SIM 卡鎖定設定</translation>
 <translation id="6012623610530968780">第 <ph name="SELECTED_PAGE" /> 頁 (共 <ph name="TOTAL_PAGE_NUM" /> 頁)</translation>
 <translation id="6018164090099858612">正在退出鏡像模式</translation>
 <translation id="602001110135236999">向左捲動</translation>
@@ -861,6 +864,7 @@
 <translation id="6165508094623778733">瞭解更多資料</translation>
 <translation id="6166852626429024716">搜尋您的裝置、應用程式、設定、網絡…</translation>
 <translation id="6179832488876878285">您可將重要的檔案固定至此處。開啟「檔案」應用程式即可開始使用。</translation>
+<translation id="6182592640011875895">開啟桌面</translation>
 <translation id="619279033188484792">在 <ph name="DEVICE_TYPE" /> 上查看手機最近的相片、媒體和通知</translation>
 <translation id="619335566042889110">現已完全充滿</translation>
 <translation id="6220928844947387476">您現在可以錄製鏡頭畫面和螢幕畫面</translation>
@@ -1166,6 +1170,7 @@
 <translation id="8052898407431791827">已複製到剪貼簿</translation>
 <translation id="8054466585765276473">正在計算電池使用時間。</translation>
 <translation id="8061464966246066292">高對比模式</translation>
+<translation id="8083540854303889870">已儲存以供日後使用</translation>
 <translation id="8098591350844501178">停止將畫面投放到「<ph name="RECEIVER_NAME" />」</translation>
 <translation id="8113423164597455979">已在所有應用程式上啟用通知</translation>
 <translation id="8120151603115102514">您的手機沒有上鎖畫面。如要解鎖 Chromebook,請輸入密碼。</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb
index b38799e9..ff10b0c8 100644
--- a/ash/strings/ash_strings_zh-TW.xtb
+++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -323,6 +323,7 @@
 <translation id="2970920913501714344">安裝應用程式、擴充功能和主題</translation>
 <translation id="2977598380246111477">下一個號碼</translation>
 <translation id="2981684127883932071">目前正顯示建議項目</translation>
+<translation id="2985148236010982088">查看所有應用程式</translation>
 <translation id="2992327365391326550">裝置的麥克風按鈕已關閉。</translation>
 <translation id="2995447421581609334">顯示投放裝置。</translation>
 <translation id="2996462380875591307">停駐放大鏡已啟用。再次按下 Ctrl 鍵 + 搜尋鍵 + D 鍵即可停用。</translation>
@@ -461,6 +462,7 @@
 <translation id="3726171378575546917">這部裝置未安裝「<ph name="UNAVAILABLE_APPS_ONE" />」、「<ph name="UNAVAILABLE_APPS_TWO" />」和另外 <ph name="UNAVAILABLE_APPS_COUNT" /> 個應用程式。</translation>
 <translation id="3735740477244556633">排序依據</translation>
 <translation id="3742055079367172538">已拍攝螢幕截圖</translation>
+<translation id="3761848338953536304">系統管理員要求你關閉 SIM 卡鎖定設定</translation>
 <translation id="3765841986579723851">今天編輯過</translation>
 <translation id="3771549900096082774">高對比模式</translation>
 <translation id="3773700760453577392">管理員已禁止 <ph name="USER_EMAIL" /> 的多重登入功能。所有使用者都必須登出,才能繼續操作。</translation>
@@ -825,6 +827,7 @@
 <translation id="598407983968395253">使用範本</translation>
 <translation id="598882571027504733">如要更新,請連接鍵盤並重新啟動 Chromebook。</translation>
 <translation id="5992218262414051481">高對比模式已啟用。再次按下 Ctrl 鍵 + 搜尋鍵 + H 鍵即可停用。</translation>
+<translation id="6009656393242168182">停用 SIM 卡鎖定設定</translation>
 <translation id="6012623610530968780">第 <ph name="SELECTED_PAGE" /> 頁 (共 <ph name="TOTAL_PAGE_NUM" /> 頁)</translation>
 <translation id="6018164090099858612">退出鏡像模式</translation>
 <translation id="602001110135236999">向左捲動</translation>
@@ -859,6 +862,7 @@
 <translation id="6165508094623778733">瞭解詳情</translation>
 <translation id="6166852626429024716">搜尋你的裝置、應用程式、設定、網路...</translation>
 <translation id="6179832488876878285">你可以將重要的檔案固定在這裡,只要開啟「檔案」應用程式即可開始使用。</translation>
+<translation id="6182592640011875895">開啟桌面</translation>
 <translation id="619279033188484792">透過 <ph name="DEVICE_TYPE" /> 查看手機上最近的相片、媒體和通知</translation>
 <translation id="619335566042889110">立即充飽電</translation>
 <translation id="6220928844947387476">你現在可以同時錄製鏡頭畫面和螢幕畫面</translation>
@@ -1163,6 +1167,7 @@
 <translation id="8052898407431791827">已複製到剪貼簿</translation>
 <translation id="8054466585765276473">正在計算電池使用時間。</translation>
 <translation id="8061464966246066292">高對比模式</translation>
+<translation id="8083540854303889870">已儲存待稍後使用</translation>
 <translation id="8098591350844501178">停止將畫面投放到「<ph name="RECEIVER_NAME" />」</translation>
 <translation id="8113423164597455979">開啟,所有應用程式</translation>
 <translation id="8120151603115102514">你的手機未設定螢幕鎖定。如要解鎖 Chromebook,請輸入密碼。</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb
index a8ca771..1a47557f 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb
@@ -82,6 +82,7 @@
 <translation id="4445542136948522167">Zaustavi fotografiranje</translation>
 <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapiksela</translation>
 <translation id="4570032796877367747">Prednja kamera</translation>
+<translation id="4620818268515773682">Prebacivanje isključivanja zvuka mikrofona. Isključivanje zvuka je isključeno</translation>
 <translation id="4628948037717959914">Fotografija</translation>
 <translation id="4649291346448517080">Nije moguće sačuvati fajl</translation>
 <translation id="4695379108709712600">Pomjeranje nagore</translation>
@@ -158,6 +159,7 @@
 <translation id="8425673304802773841">Nagni dolje</translation>
 <translation id="8428213095426709021">Postavke</translation>
 <translation id="8687491812650032292">HD <ph name="HEIGHT" /> p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation>
+<translation id="8711011893539266636">Prebacivanje isključivanja zvuka mikrofona. Isključivanje zvuka je uključeno</translation>
 <translation id="8712637175834984815">Razumijem</translation>
 <translation id="8730621377337864115">Gotovo</translation>
 <translation id="8732462232047530626">Prikaži metapodatke</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_et.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_et.xtb
index af153fd8..18b91ce 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_et.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_et.xtb
@@ -82,6 +82,7 @@
 <translation id="4445542136948522167">Peata foto jäädvustamine</translation>
 <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" /> : <ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapikslit</translation>
 <translation id="4570032796877367747">Esikaamera</translation>
+<translation id="4620818268515773682">Mikrofoni vaigistuse sisse-/väljalülitamine. Vaigistus on välja lülitatud</translation>
 <translation id="4628948037717959914">Foto</translation>
 <translation id="4649291346448517080">Faili salvestamine ebaõnnestus</translation>
 <translation id="4695379108709712600">Liigub üles</translation>
@@ -158,6 +159,7 @@
 <translation id="8425673304802773841">Kalluta alla</translation>
 <translation id="8428213095426709021">Seaded</translation>
 <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" /> : <ph name="HEIGHT" />)</translation>
+<translation id="8711011893539266636">Mikrofoni vaigistuse sisse-/väljalülitamine. Vaigistus on sisse lülitatud</translation>
 <translation id="8712637175834984815">Selge</translation>
 <translation id="8730621377337864115">Valmis</translation>
 <translation id="8732462232047530626">Metaandmete eelvaade</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_hr.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_hr.xtb
index e7ce1f8..a83078b 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_hr.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_hr.xtb
@@ -82,6 +82,7 @@
 <translation id="4445542136948522167">Zaustavi snimanje fotografije</translation>
 <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapiksel</translation>
 <translation id="4570032796877367747">Prednji fotoaparat</translation>
+<translation id="4620818268515773682">Prebacivanje isključivanja zvuka mikrofona. Isključivanje zvuka je isključeno</translation>
 <translation id="4628948037717959914">Fotografija</translation>
 <translation id="4649291346448517080">Spremanje datoteke nije uspjelo</translation>
 <translation id="4695379108709712600">Kreće se prema gore</translation>
@@ -158,6 +159,7 @@
 <translation id="8425673304802773841">Nagni dolje</translation>
 <translation id="8428213095426709021">Postavke</translation>
 <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation>
+<translation id="8711011893539266636">Prebacivanje isključivanja zvuka mikrofona. Isključivanje zvuka je uključeno</translation>
 <translation id="8712637175834984815">Shvaćam</translation>
 <translation id="8730621377337864115">Gotovo</translation>
 <translation id="8732462232047530626">Pregled metapodataka</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ja.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ja.xtb
index de463735..d0b4dc4 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ja.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ja.xtb
@@ -82,6 +82,7 @@
 <translation id="4445542136948522167">写真の撮影をキャンセル</translation>
 <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />)<ph name="MEGAPIXEL" /> メガピクセル</translation>
 <translation id="4570032796877367747">前面カメラ</translation>
+<translation id="4620818268515773682">マイクのミュートを切り替えます。ミュートはオフです</translation>
 <translation id="4628948037717959914">写真</translation>
 <translation id="4649291346448517080">ファイルを保存できません</translation>
 <translation id="4695379108709712600">上に移動しています</translation>
@@ -158,6 +159,7 @@
 <translation id="8425673304802773841">下にティルト</translation>
 <translation id="8428213095426709021">設定</translation>
 <translation id="8687491812650032292">HD <ph name="HEIGHT" />p(<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation>
+<translation id="8711011893539266636">マイクのミュートを切り替えます。ミュートはオンです</translation>
 <translation id="8712637175834984815">閉じる</translation>
 <translation id="8730621377337864115">完了</translation>
 <translation id="8732462232047530626">メタデータのプレビュー</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ka.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ka.xtb
index 499b9756..0bc5384 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ka.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ka.xtb
@@ -82,6 +82,7 @@
 <translation id="4445542136948522167">ფოტოს გადაღების შეწყვეტა</translation>
 <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> მეგაპიქსელი</translation>
 <translation id="4570032796877367747">წინა კამერა</translation>
+<translation id="4620818268515773682">მიკროფონის დადუმების გადართვა. დადუმების რეჟიმი გამორთულია</translation>
 <translation id="4628948037717959914">ფოტო</translation>
 <translation id="4649291346448517080">ფაილის შენახვა ვერ მოხერხდა</translation>
 <translation id="4695379108709712600">გადატანა ხდება ზედა მიმართულებით</translation>
@@ -158,6 +159,7 @@
 <translation id="8425673304802773841">ქვემოთკენ დახრა</translation>
 <translation id="8428213095426709021">პარამეტრები</translation>
 <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation>
+<translation id="8711011893539266636">მიკროფონის დადუმების გადართვა. დადუმების რეჟიმი ჩართულია</translation>
 <translation id="8712637175834984815">კარგი</translation>
 <translation id="8730621377337864115">მზადაა</translation>
 <translation id="8732462232047530626">მეტამონაცემების გადახედვა</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb
index 71622c5..7c64af9e 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb
@@ -146,6 +146,7 @@
 <translation id="7658239707568436148">Болих</translation>
 <translation id="7670511624014457267">60 FPS</translation>
 <translation id="7671804233658741790">Документын баруун доод булан</translation>
+<translation id="7692090236657809299">Чиглүүлэгчийн хазайлт томруулалтыг идэвхжүүлэх</translation>
 <translation id="7726641833034062494">Энгийн видео бичих</translation>
 <translation id="7748344063862150053">Документын баруун дээд булан</translation>
 <translation id="7933675232020478311">Баруун доош зөөж байна</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb
index d3935d4d..8ed322e 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb
@@ -82,6 +82,7 @@
 <translation id="4445542136948522167">Foto maken stoppen</translation>
 <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapixel</translation>
 <translation id="4570032796877367747">Camera aan voorzijde</translation>
+<translation id="4620818268515773682">Geluid uitzetten voor microfoon schakelen. Geluid uit staat uit</translation>
 <translation id="4628948037717959914">Foto</translation>
 <translation id="4649291346448517080">Kan het bestand niet opslaan</translation>
 <translation id="4695379108709712600">Beweegt naar boven</translation>
@@ -158,6 +159,7 @@
 <translation id="8425673304802773841">Naar beneden kantelen</translation>
 <translation id="8428213095426709021">Instellingen</translation>
 <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation>
+<translation id="8711011893539266636">Geluid uitzetten voor microfoon schakelen. Geluid uit staat aan</translation>
 <translation id="8712637175834984815">Begrepen</translation>
 <translation id="8730621377337864115">Klaar</translation>
 <translation id="8732462232047530626">Voorbeeld van metadata bekijken</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb
index 8bff393..fb84136 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb
@@ -82,6 +82,7 @@
 <translation id="4445542136948522167">Nie rób zdjęcia</translation>
 <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> Mpix</translation>
 <translation id="4570032796877367747">Przedni aparat</translation>
+<translation id="4620818268515773682">Przełącz przycisk wyciszenia mikrofonu. Wyciszenie jest wyłączone</translation>
 <translation id="4628948037717959914">Zdjęcie</translation>
 <translation id="4649291346448517080">Nie udało się zapisać pliku</translation>
 <translation id="4695379108709712600">Przesuwam w górę</translation>
@@ -158,6 +159,7 @@
 <translation id="8425673304802773841">Pochyl w dół</translation>
 <translation id="8428213095426709021">Ustawienia</translation>
 <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation>
+<translation id="8711011893539266636">Przełącz przycisk wyciszenia mikrofonu. Wyciszenie jest włączone</translation>
 <translation id="8712637175834984815">Rozumiem</translation>
 <translation id="8730621377337864115">Gotowe</translation>
 <translation id="8732462232047530626">Wyświetl podgląd metadanych</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ro.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ro.xtb
index 9d978b8..ff47849 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ro.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ro.xtb
@@ -82,6 +82,7 @@
 <translation id="4445542136948522167">Nu mai fotografia</translation>
 <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapixeli</translation>
 <translation id="4570032796877367747">Camera foto frontală</translation>
+<translation id="4620818268515773682">Comută dezactivarea sunetului microfonului. Dezactivarea sunetului este dezactivată</translation>
 <translation id="4628948037717959914">Fotografie</translation>
 <translation id="4649291346448517080">Fișierul nu poate fi salvat</translation>
 <translation id="4695379108709712600">Se deplasează în sus</translation>
@@ -158,6 +159,7 @@
 <translation id="8425673304802773841">Înclină în jos</translation>
 <translation id="8428213095426709021">Setări</translation>
 <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation>
+<translation id="8711011893539266636">Comută dezactivarea sunetului microfonului. Dezactivarea sunetului este activată</translation>
 <translation id="8712637175834984815">Am înțeles</translation>
 <translation id="8730621377337864115">Terminat</translation>
 <translation id="8732462232047530626">Metadatele de previzualizare</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb
index 4906a06..345d10a 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb
@@ -82,6 +82,7 @@
 <translation id="4445542136948522167">Отменить съемку</translation>
 <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> Мп</translation>
 <translation id="4570032796877367747">Фронтальная камера</translation>
+<translation id="4620818268515773682">Микрофон включен.</translation>
 <translation id="4628948037717959914">Фото</translation>
 <translation id="4649291346448517080">Не удалось сохранить файл.</translation>
 <translation id="4695379108709712600">Перемещение вверх</translation>
@@ -158,6 +159,7 @@
 <translation id="8425673304802773841">Наклонить вниз</translation>
 <translation id="8428213095426709021">Настройки</translation>
 <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation>
+<translation id="8711011893539266636">Микрофон отключен.</translation>
 <translation id="8712637175834984815">Готово</translation>
 <translation id="8730621377337864115">Готово</translation>
 <translation id="8732462232047530626">Просмотр метаданных</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb
index b1fd0743..e5a650f 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb
@@ -82,6 +82,7 @@
 <translation id="4445542136948522167">Zaustavi snimanje slike</translation>
 <translation id="4497569853498380347">Megapikseli: <ph name="MEGAPIXEL" /> (<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />)</translation>
 <translation id="4570032796877367747">Prednja kamera</translation>
+<translation id="4620818268515773682">Isključite zvuk mikrofona. Dugme za isključivanje zvuka je isključeno</translation>
 <translation id="4628948037717959914">Slika</translation>
 <translation id="4649291346448517080">Čuvanje datoteke nije uspelo</translation>
 <translation id="4695379108709712600">Kreće se nagore</translation>
@@ -158,6 +159,7 @@
 <translation id="8425673304802773841">Naginjanje nadole</translation>
 <translation id="8428213095426709021">Podešavanja</translation>
 <translation id="8687491812650032292">HD <ph name="HEIGHT" /> piksela (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation>
+<translation id="8711011893539266636">Uključite zvuk mikrofona. Dugme za isključivanje zvuka je uključeno</translation>
 <translation id="8712637175834984815">Važi</translation>
 <translation id="8730621377337864115">Gotovo</translation>
 <translation id="8732462232047530626">Prikaži metapodatke</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sr.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sr.xtb
index 334c5ba..0a2ada1 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sr.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sr.xtb
@@ -82,6 +82,7 @@
 <translation id="4445542136948522167">Заустави снимање слике</translation>
 <translation id="4497569853498380347">Мегапиксели: <ph name="MEGAPIXEL" /> (<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />)</translation>
 <translation id="4570032796877367747">Предња камера</translation>
+<translation id="4620818268515773682">Искључите звук микрофона. Дугме за искључивање звука је искључено</translation>
 <translation id="4628948037717959914">Слика</translation>
 <translation id="4649291346448517080">Чување датотеке није успело</translation>
 <translation id="4695379108709712600">Креће се нагоре</translation>
@@ -158,6 +159,7 @@
 <translation id="8425673304802773841">Нагињање надоле</translation>
 <translation id="8428213095426709021">Подешавања</translation>
 <translation id="8687491812650032292">HD <ph name="HEIGHT" /> пиксела (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation>
+<translation id="8711011893539266636">Укључите звук микрофона. Дугме за искључивање звука је укључено</translation>
 <translation id="8712637175834984815">Важи</translation>
 <translation id="8730621377337864115">Готово</translation>
 <translation id="8732462232047530626">Прикажи метаподатке</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb
index 50407ff4..44a5b7f 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb
@@ -82,6 +82,7 @@
 <translation id="4445542136948522167">Acha kupiga picha</translation>
 <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) megapikseli <ph name="MEGAPIXEL" /></translation>
 <translation id="4570032796877367747">Kamera ya mbele</translation>
+<translation id="4620818268515773682">Geuza ili uzime sauti ya maikrofoni. Sauti haijazimwa</translation>
 <translation id="4628948037717959914">Picha</translation>
 <translation id="4649291346448517080">Imeshindwa kuhifadhi faili</translation>
 <translation id="4695379108709712600">Inasogezwa upande wa juu</translation>
@@ -158,6 +159,7 @@
 <translation id="8425673304802773841">Inamisha chini</translation>
 <translation id="8428213095426709021">Mipangilio</translation>
 <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation>
+<translation id="8711011893539266636">Geuza ili uzime sauti ya maikrofoni. Sauti imezimwa</translation>
 <translation id="8712637175834984815">Nimeelewa</translation>
 <translation id="8730621377337864115">Nimemaliza</translation>
 <translation id="8732462232047530626">Kagua kwanza metadata</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_uz.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_uz.xtb
index a6329fd..323c77e3 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_uz.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_uz.xtb
@@ -82,6 +82,7 @@
 <translation id="4445542136948522167">Suratga olishni toʻxtatish</translation>
 <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> mega piksel</translation>
 <translation id="4570032796877367747">Old kamera</translation>
+<translation id="4620818268515773682">Mikrofonni ovozsiz qilish. Ovoz yoqildi</translation>
 <translation id="4628948037717959914">Rasm</translation>
 <translation id="4649291346448517080">Fayl saqlanmadi</translation>
 <translation id="4695379108709712600">Tepaga surish</translation>
@@ -145,6 +146,7 @@
 <translation id="7658239707568436148">Bekor qilish</translation>
 <translation id="7670511624014457267">60 kadr/s</translation>
 <translation id="7671804233658741790">Hujjatning quyi oʻng burchagi</translation>
+<translation id="7692090236657809299">Kamerani qiyalash va masshtab</translation>
 <translation id="7726641833034062494">Normal video yozib olish</translation>
 <translation id="7748344063862150053">Hujjatning yuqori oʻng burchagi</translation>
 <translation id="7933675232020478311">Pastga va oʻngga surish</translation>
@@ -158,6 +160,7 @@
 <translation id="8425673304802773841">Pastga qiyalang</translation>
 <translation id="8428213095426709021">Sozlamalar</translation>
 <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation>
+<translation id="8711011893539266636">Mikrofonni ovozsiz qilish. Ovozsiz qilindi</translation>
 <translation id="8712637175834984815">Tushunarli</translation>
 <translation id="8730621377337864115">Tayyor</translation>
 <translation id="8732462232047530626">Meta-maʼlumotlarga razm solish</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb
index 5929045..900dcd6f 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-HK.xtb
@@ -82,6 +82,7 @@
 <translation id="4445542136948522167">停止拍照</translation>
 <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> 百萬像素</translation>
 <translation id="4570032796877367747">前置鏡頭</translation>
+<translation id="4620818268515773682">將個咪校去靜音。閂咗靜音</translation>
 <translation id="4628948037717959914">相片</translation>
 <translation id="4649291346448517080">無法儲存檔案</translation>
 <translation id="4695379108709712600">向上移</translation>
@@ -158,6 +159,7 @@
 <translation id="8425673304802773841">向下傾斜</translation>
 <translation id="8428213095426709021">設定</translation>
 <translation id="8687491812650032292">高清畫質 <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation>
+<translation id="8711011893539266636">將個咪校去靜音。開咗靜音</translation>
 <translation id="8712637175834984815">我知道了</translation>
 <translation id="8730621377337864115">完成</translation>
 <translation id="8732462232047530626">預覽元數據</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb
index de7dcc1..cf978ac 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb
@@ -82,6 +82,7 @@
 <translation id="4445542136948522167">停止拍照</translation>
 <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> 百萬像素</translation>
 <translation id="4570032796877367747">前置鏡頭</translation>
+<translation id="4620818268515773682">將麥克風切換為靜音。靜音功能已關閉</translation>
 <translation id="4628948037717959914">相片</translation>
 <translation id="4649291346448517080">無法儲存檔案</translation>
 <translation id="4695379108709712600">向上移動</translation>
@@ -158,6 +159,7 @@
 <translation id="8425673304802773841">向下傾斜</translation>
 <translation id="8428213095426709021">設定</translation>
 <translation id="8687491812650032292">HD 高畫質 <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation>
+<translation id="8711011893539266636">將麥克風切換為靜音。靜音功能已開啟</translation>
 <translation id="8712637175834984815">我瞭解了</translation>
 <translation id="8730621377337864115">完成</translation>
 <translation id="8732462232047530626">預覽中繼資料</translation>
diff --git a/base/process/launch_mac.cc b/base/process/launch_mac.cc
index 184cfa2..e12c3638 100644
--- a/base/process/launch_mac.cc
+++ b/base/process/launch_mac.cc
@@ -9,7 +9,6 @@
 #include <os/availability.h>
 #include <spawn.h>
 #include <string.h>
-#include <sys/syscall.h>
 #include <sys/wait.h>
 
 #include "base/command_line.h"
@@ -96,21 +95,13 @@
 };
 
 int ChangeCurrentThreadDirectory(const char* path) {
-  if (__builtin_available(macOS 10.12, *)) {
-    return pthread_chdir_np(path);
-  } else {
-    return syscall(SYS___pthread_chdir, path);
-  }
+  return pthread_chdir_np(path);
 }
 
 // The recommended way to unset a per-thread cwd is to set a new value to an
 // invalid file descriptor, per libpthread-218.1.3/private/private.h.
 int ResetCurrentThreadDirectory() {
-  if (__builtin_available(macOS 10.12, *)) {
-    return pthread_fchdir_np(-1);
-  } else {
-    return syscall(SYS___pthread_fchdir, -1);
-  }
+  return pthread_fchdir_np(-1);
 }
 
 struct GetAppOutputOptions {
diff --git a/build/android/gyp/compile_resources.py b/build/android/gyp/compile_resources.py
index e8613a9..a7907b4 100755
--- a/build/android/gyp/compile_resources.py
+++ b/build/android/gyp/compile_resources.py
@@ -12,6 +12,7 @@
 This will crunch images with aapt2.
 """
 
+import argparse
 import collections
 import contextlib
 import filecmp
@@ -51,7 +52,26 @@
   Returns:
     An options object as from argparse.ArgumentParser.parse_args()
   """
-  parser, input_opts, output_opts = resource_utils.ResourceArgsParser()
+  parser = argparse.ArgumentParser(description=__doc__)
+
+  input_opts = parser.add_argument_group('Input options')
+  output_opts = parser.add_argument_group('Output options')
+
+  input_opts.add_argument('--include-resources',
+                          action='append',
+                          required=True,
+                          help='Paths to arsc resource files used to link '
+                          'against. Can be specified multiple times.')
+
+  input_opts.add_argument(
+      '--dependencies-res-zips',
+      default=[],
+      help='Resources zip archives from dependents. Required to '
+      'resolve @type/foo references into dependent libraries.')
+
+  input_opts.add_argument(
+      '--extra-res-packages',
+      help='Additional package names to generate R.java files for.')
 
   input_opts.add_argument(
       '--aapt2-path', required=True, help='Path to the Android aapt2 tool.')
@@ -176,6 +196,21 @@
       action='store_true',
       help='Whether to strip xml namespaces from processed xml resources.')
 
+  input_opts.add_argument(
+      '--is-bundle-module',
+      action='store_true',
+      help='Whether resources are being generated for a bundle module.')
+
+  input_opts.add_argument(
+      '--uses-split',
+      help='Value to set uses-split to in the AndroidManifest.xml.')
+
+  input_opts.add_argument(
+      '--extra-verification-manifest',
+      help='Path to AndroidManifest.xml which should be merged into base '
+      'manifest when performing verification.')
+
+  build_utils.AddDepfileOption(output_opts)
   output_opts.add_argument('--arsc-path', help='Apk output for arsc format.')
   output_opts.add_argument('--proto-path', help='Apk output for proto format.')
 
@@ -184,7 +219,6 @@
 
   output_opts.add_argument(
       '--srcjar-out',
-      required=True,
       help='Path to srcjar to contain generated R.java.')
 
   output_opts.add_argument('--r-text-out',
@@ -200,25 +234,14 @@
   output_opts.add_argument(
       '--emit-ids-out', help='Path to file produced by aapt2 --emit-ids.')
 
-  input_opts.add_argument(
-      '--is-bundle-module',
-      action='store_true',
-      help='Whether resources are being generated for a bundle module.')
-
-  input_opts.add_argument(
-      '--uses-split',
-      help='Value to set uses-split to in the AndroidManifest.xml.')
-
-  input_opts.add_argument(
-      '--extra-verification-manifest',
-      help='Path to AndroidManifest.xml which should be merged into base '
-      'manifest when performing verification.')
-
   diff_utils.AddCommandLineFlags(parser)
   options = parser.parse_args(args)
 
-  resource_utils.HandleCommonOptions(options)
-
+  options.include_resources = build_utils.ParseGnList(options.include_resources)
+  options.dependencies_res_zips = build_utils.ParseGnList(
+      options.dependencies_res_zips)
+  options.extra_res_packages = build_utils.ParseGnList(
+      options.extra_res_packages)
   options.locale_allowlist = build_utils.ParseGnList(options.locale_allowlist)
   options.shared_resources_allowlist_locales = build_utils.ParseGnList(
       options.shared_resources_allowlist_locales)
@@ -830,9 +853,10 @@
   link_proc = subprocess.Popen(link_command)
 
   # Create .res.info file in parallel.
-  _CreateResourceInfoFile(path_info, build.info_path,
-                          options.dependencies_res_zips)
-  logging.debug('Created .res.info file')
+  if options.info_path:
+    logging.debug('Creating .res.info file')
+    _CreateResourceInfoFile(path_info, build.info_path,
+                            options.dependencies_res_zips)
 
   exit_code = link_proc.wait()
   assert exit_code == 0, f'aapt2 link cmd failed with {exit_code=}'
@@ -1010,18 +1034,20 @@
       # will be created in the base module.
       apk_package_name = None
 
-    logging.debug('Creating R.srcjar')
-    resource_utils.CreateRJavaFiles(
-        build.srcjar_dir, apk_package_name, build.r_txt_path,
-        options.extra_res_packages, rjava_build_options, options.srcjar_out,
-        custom_root_package_name, grandparent_custom_package_name,
-        options.extra_main_r_text_files)
-    build_utils.ZipDir(build.srcjar_path, build.srcjar_dir)
+    if options.srcjar_out:
+      logging.debug('Creating R.srcjar')
+      resource_utils.CreateRJavaFiles(
+          build.srcjar_dir, apk_package_name, build.r_txt_path,
+          options.extra_res_packages, rjava_build_options, options.srcjar_out,
+          custom_root_package_name, grandparent_custom_package_name,
+          options.extra_main_r_text_files)
+      build_utils.ZipDir(build.srcjar_path, build.srcjar_dir)
 
     logging.debug('Copying outputs')
     _WriteOutputs(options, build)
 
   if options.depfile:
+    assert options.srcjar_out, 'Update first output below and remove assert.'
     depfile_deps = (options.dependencies_res_zips +
                     options.dependencies_res_zip_overlays +
                     options.extra_main_r_text_files + options.include_resources)
diff --git a/build/android/gyp/system_image_apks.py b/build/android/gyp/system_image_apks.py
new file mode 100755
index 0000000..09ab95fe
--- /dev/null
+++ b/build/android/gyp/system_image_apks.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python3
+
+# Copyright 2022 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""Generates APKs for use on system images."""
+
+import argparse
+import os
+import pathlib
+import tempfile
+import shutil
+import sys
+import zipfile
+
+_DIR_SOURCE_ROOT = str(pathlib.Path(__file__).parents[2])
+sys.path.append(os.path.join(_DIR_SOURCE_ROOT, 'build', 'android', 'gyp'))
+from util import build_utils
+
+
+def main():
+  parser = argparse.ArgumentParser()
+  parser.add_argument('--input', required=True, help='Input path')
+  parser.add_argument('--output', required=True, help='Output path')
+  parser.add_argument('--bundle-wrapper', help='APK operations script path')
+  parser.add_argument('--fuse-apk',
+                      help='Create single .apk rather than using apk splits',
+                      action='store_true')
+  args = parser.parse_args()
+
+  if not args.bundle_wrapper:
+    shutil.copyfile(args.input, args.output)
+    return
+
+  with tempfile.NamedTemporaryFile(suffix='.apks') as tmp_file:
+    cmd = [
+        args.bundle_wrapper, 'build-bundle-apks', '--output-apks', tmp_file.name
+    ]
+    cmd += ['--build-mode', 'system' if args.fuse_apk else 'system_apks']
+
+    # Creates a .apks zip file that contains the system image APK(s).
+    build_utils.CheckOutput(cmd)
+
+    if args.fuse_apk:
+      with zipfile.ZipFile(tmp_file.name) as z:
+        pathlib.Path(args.output).write_bytes(z.read('system/system.apk'))
+      return
+
+    # Rename .apk files and remove toc.pb to make it clear that system apks
+    # should not be installed via bundletool.
+    with zipfile.ZipFile(tmp_file.name) as z_input, \
+        zipfile.ZipFile(args.output, 'w') as z_output:
+      for info in z_input.infolist():
+        if info.filename.endswith('.apk'):
+          data = z_input.read(info)
+          info.filename = (info.filename.replace('splits/',
+                                                 '').replace('-master', ''))
+          z_output.writestr(info, data)
+
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/build/android/gyp/system_image_apks.pydeps b/build/android/gyp/system_image_apks.pydeps
new file mode 100644
index 0000000..35f1dc9
--- /dev/null
+++ b/build/android/gyp/system_image_apks.pydeps
@@ -0,0 +1,6 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/system_image_apks.pydeps build/android/gyp/system_image_apks.py
+../../gn_helpers.py
+system_image_apks.py
+util/__init__.py
+util/build_utils.py
diff --git a/build/android/gyp/util/resource_utils.py b/build/android/gyp/util/resource_utils.py
index db724bfb..d2d3986 100644
--- a/build/android/gyp/util/resource_utils.py
+++ b/build/android/gyp/util/resource_utils.py
@@ -2,7 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import argparse
 import collections
 import contextlib
 import itertools
@@ -951,60 +950,6 @@
       context.Close()
 
 
-def ResourceArgsParser():
-  """Create an argparse.ArgumentParser instance with common argument groups.
-
-  Returns:
-    A tuple of (parser, in_group, out_group) corresponding to the parser
-    instance, and the input and output argument groups for it, respectively.
-  """
-  parser = argparse.ArgumentParser(description=__doc__)
-
-  input_opts = parser.add_argument_group('Input options')
-  output_opts = parser.add_argument_group('Output options')
-
-  build_utils.AddDepfileOption(output_opts)
-
-  input_opts.add_argument('--include-resources', required=True, action="append",
-                        help='Paths to arsc resource files used to link '
-                             'against. Can be specified multiple times.')
-
-  input_opts.add_argument('--dependencies-res-zips', required=True,
-                    help='Resources zip archives from dependents. Required to '
-                         'resolve @type/foo references into dependent '
-                         'libraries.')
-
-  input_opts.add_argument(
-      '--extra-res-packages',
-      help='Additional package names to generate R.java files for.')
-
-  return (parser, input_opts, output_opts)
-
-
-def HandleCommonOptions(options):
-  """Handle common command-line options after parsing.
-
-  Args:
-    options: the result of parse_args() on the parser returned by
-        ResourceArgsParser(). This function updates a few common fields.
-  """
-  options.include_resources = [build_utils.ParseGnList(r) for r in
-                               options.include_resources]
-  # Flatten list of include resources list to make it easier to use.
-  options.include_resources = [r for resources in options.include_resources
-                               for r in resources]
-
-  options.dependencies_res_zips = (
-      build_utils.ParseGnList(options.dependencies_res_zips))
-
-  # Don't use [] as default value since some script explicitly pass "".
-  if options.extra_res_packages:
-    options.extra_res_packages = (
-        build_utils.ParseGnList(options.extra_res_packages))
-  else:
-    options.extra_res_packages = []
-
-
 def ParseAndroidResourceStringsFromXml(xml_data):
   """Parse and Android xml resource file and extract strings from it.
 
diff --git a/build/android/gyp/write_build_config.py b/build/android/gyp/write_build_config.py
index c5cee47..b75da57 100755
--- a/build/android/gyp/write_build_config.py
+++ b/build/android/gyp/write_build_config.py
@@ -1167,16 +1167,8 @@
       'for modules that are part of the bundle.')
 
   parser.add_option(
-      '--add-view-trace-events',
-      action='store_true',
-      help=
-      'Specifies that trace events will be added with an additional bytecode '
-      'rewriting step.')
-  parser.add_option(
-      '--base-module-gen-dir',
-      help=
-      'Path to base module\'s target_gen_dir. Needed for bundles and modules '
-      'when --add-view-trace-events is set.')
+      '--trace-events-jar-dir',
+      help='Directory of rewritten .jar files for trace event rewriting.')
 
   parser.add_option('--version-name', help='Version name for this APK.')
   parser.add_option('--version-code', help='Version code for this APK.')
@@ -1771,6 +1763,7 @@
       if c['is_base_module']:
         assert 'base_module_config' not in deps_info, (
             'Must have exactly 1 base module!')
+        deps_info['package_name'] = c['package_name']
         deps_info['base_module_config'] = c['path']
         # Use the base module's android manifest for linting.
         deps_info['lint_android_manifest'] = c['android_manifest']
@@ -1993,14 +1986,14 @@
   if options.type in ('android_apk', 'android_app_bundle',
                       'android_app_bundle_module', 'dist_aar', 'dist_jar'):
     deps_info['device_classpath'] = device_classpath
-    if options.add_view_trace_events:
+    if options.trace_events_jar_dir:
       trace_event_rewritten_device_classpath = []
       for jar_path in device_classpath:
         file_path = jar_path.replace('../', '')
         file_path = file_path.replace('obj/', '')
         file_path = file_path.replace('gen/', '')
         file_path = file_path.replace('.jar', '.tracing_rewritten.jar')
-        rewritten_jar_path = os.path.join(options.base_module_gen_dir,
+        rewritten_jar_path = os.path.join(options.trace_events_jar_dir,
                                           file_path)
         trace_event_rewritten_device_classpath.append(rewritten_jar_path)
 
@@ -2118,7 +2111,7 @@
     RemoveObjDups(config, base, 'deps_info', 'jni', 'all_source')
     RemoveObjDups(config, base, 'final_dex', 'all_dex_files')
     RemoveObjDups(config, base, 'extra_android_manifests')
-    if options.add_view_trace_events:
+    if options.trace_events_jar_dir:
       RemoveObjDups(config, base, 'deps_info',
                     'trace_event_rewritten_device_classpath')
 
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index 93d1ce9..0d5b1a3 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -553,8 +553,6 @@
     }
     if (defined(invoker.add_view_trace_events) &&
         invoker.add_view_trace_events) {
-      args += [ "--add-view-trace-events" ]
-
       # Adding trace events involves rewriting bytecode and generating a new set
       # of jar files. In order to avoid conflicts between bundles we save the
       # new jars in a bundle specific gen/ directory. The build config for the
@@ -563,24 +561,22 @@
       # We use the base module's target_gen_dir because non-base modules and the
       # app bundle targets have a reference to it (base_module_target).
       if (_type == "android_app_bundle") {
-        _base_module_target_name =
+        _trace_events_target_name =
             get_label_info(_parent_invoker.base_module_target, "name")
-        _base_module_gen_dir =
-            get_label_info(_base_module_target_name, "target_gen_dir")
+      } else if (defined(invoker.base_module_target)) {
+        _trace_events_target_name =
+            get_label_info(invoker.base_module_target, "name")
       } else {
-        if (defined(invoker.base_module_target)) {
-          _base_module_name = get_label_info(invoker.base_module_target, "name")
-          _base_module_gen_dir =
-              get_label_info(_base_module_name, "target_gen_dir")
-        } else {
-          _grandparent_invoker = _parent_invoker.invoker
-          _base_module_gen_dir =
-              get_label_info(_grandparent_invoker.target_name, "target_gen_dir")
-        }
+        _grandparent_invoker = _parent_invoker.invoker
+        _trace_events_target_name = _grandparent_invoker.target_name
       }
+
+      # FIXME: This should likely be using the base module's target_out_dir
+      #     rather than the current target's.
       args += [
-        "--base-module-gen-dir",
-        rebase_path(_base_module_gen_dir, root_build_dir),
+        "--trace-events-jar-dir",
+        rebase_path("$target_out_dir/$_trace_events_target_name",
+                    root_build_dir),
       ]
     }
     if (defined(invoker.version_name)) {
@@ -2441,13 +2437,13 @@
 
     action_with_pydeps(target_name) {
       script = _script
-      depfile = "$target_gen_dir/${target_name}.d"
+      _depfile = "$target_gen_dir/${target_name}.d"
       inputs = _inputs
       outputs = _outputs
       deps = _deps
       args = _args + [
                "--depfile",
-               rebase_path(depfile, root_build_dir),
+               rebase_path(_depfile, root_build_dir),
              ]
     }
   }
@@ -2683,9 +2679,18 @@
     _apksigner = "$android_sdk_build_tools/lib/apksigner.jar"
     _zipalign = "$android_sdk_build_tools/zipalign"
 
+    _keystore_path = android_keystore_path
+    _keystore_name = android_keystore_name
+    _keystore_password = android_keystore_password
+
+    if (defined(invoker.keystore_path)) {
+      _keystore_path = invoker.keystore_path
+      _keystore_name = invoker.keystore_name
+      _keystore_password = invoker.keystore_password
+    }
+
     _inputs = [
-      invoker.build_config,
-      invoker.keystore_path,
+      _keystore_path,
       invoker.packaged_resources_path,
       _apksigner,
       _zipalign,
@@ -2698,28 +2703,30 @@
         rebase_path(invoker.packaged_resources_path, root_build_dir)
     _rebased_packaged_apk_path =
         rebase_path(invoker.output_apk_path, root_build_dir)
-    _rebased_build_config = rebase_path(invoker.build_config, root_build_dir)
     _args = [
       "--resource-apk=$_rebased_compiled_resources_path",
       "--output-apk=$_rebased_packaged_apk_path",
-      "--assets=@FileArg($_rebased_build_config:assets)",
-      "--uncompressed-assets=@FileArg($_rebased_build_config:uncompressed_assets)",
       "--apksigner-jar",
       rebase_path(_apksigner, root_build_dir),
       "--zipalign-path",
       rebase_path(_zipalign, root_build_dir),
       "--key-path",
-      rebase_path(invoker.keystore_path, root_build_dir),
+      rebase_path(_keystore_path, root_build_dir),
       "--key-name",
-      invoker.keystore_name,
+      _keystore_name,
       "--key-passwd",
-      invoker.keystore_password,
+      _keystore_password,
       "--min-sdk-version=${invoker.min_sdk_version}",
-
-      # TODO(mlopatkin) We are relying on the fact that build_config is an APK
-      # build_config.
-      "--java-resources=@FileArg($_rebased_build_config:java_resources_jars)",
     ]
+    if (defined(invoker.build_config)) {
+      _inputs += [ invoker.build_config ]
+      _rebased_build_config = rebase_path(invoker.build_config, root_build_dir)
+      _args += [
+        "--assets=@FileArg($_rebased_build_config:assets)",
+        "--uncompressed-assets=@FileArg($_rebased_build_config:uncompressed_assets)",
+        "--java-resources=@FileArg($_rebased_build_config:java_resources_jars)",
+      ]
+    }
     if (is_official_build) {
       _args += [ "--best-compression" ]
     }
@@ -2798,10 +2805,10 @@
         _failure_file =
             "$expectations_failure_dir/" +
             string_replace(invoker.expected_libs_and_assets, "/", "_")
-        inputs = [
-          invoker.build_config,
-          invoker.expected_libs_and_assets,
-        ]
+        inputs = [ invoker.expected_libs_and_assets ]
+        if (defined(invoker.build_config)) {
+          inputs += [ invoker.build_config ]
+        }
         deps = [ invoker.build_config_dep ]
         outputs = [
           _actual_file,
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index e2cf909..882b82a 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -1353,7 +1353,7 @@
       _package_name = "org.chromium.test"
     }
 
-    _resource_arsc_output = "${target_gen_dir}/${target_name}.ap_"
+    _resource_arsc_output = "${target_out_dir}/${target_name}.ap_"
     _compile_resources_target = "${target_name}__compile_resources"
     compile_resources(_compile_resources_target) {
       forward_variables_from(invoker, [ "android_manifest" ])
@@ -2194,7 +2194,7 @@
   #     with this file as the base.
   template("android_apk_or_module") {
     forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
-    assert(defined(invoker.android_manifest))
+    _template_name = target_name
     _base_path = "$target_out_dir/$target_name/$target_name"
     _build_config = "$target_gen_dir/$target_name.build_config.json"
     _build_config_target = "$target_name$build_config_target_suffix"
@@ -2208,8 +2208,6 @@
       _target_sdk_version = invoker.target_sdk_version
     }
 
-    _template_name = target_name
-
     _is_bundle_module =
         defined(invoker.is_bundle_module) && invoker.is_bundle_module
     if (_is_bundle_module) {
@@ -3141,16 +3139,6 @@
         }
       }
 
-      _keystore_path = android_keystore_path
-      _keystore_name = android_keystore_name
-      _keystore_password = android_keystore_password
-
-      if (defined(invoker.keystore_path)) {
-        _keystore_path = invoker.keystore_path
-        _keystore_name = invoker.keystore_name
-        _keystore_password = invoker.keystore_password
-      }
-
       if (_incremental_apk) {
         _incremental_compiled_resources_path = "${_base_path}_incremental.ap_"
         _incremental_compile_resources_target_name =
@@ -3193,6 +3181,9 @@
                                [
                                  "expected_libs_and_assets",
                                  "expected_libs_and_assets_base",
+                                 "keystore_name",
+                                 "keystore_path",
+                                 "keystore_password",
                                  "native_lib_placeholders",
                                  "secondary_abi_loadable_modules",
                                  "secondary_native_lib_placeholders",
@@ -3208,9 +3199,6 @@
         }
 
         build_config = _build_config
-        keystore_name = _keystore_name
-        keystore_path = _keystore_path
-        keystore_password = _keystore_password
         min_sdk_version = _min_sdk_version
         uncompress_shared_libraries = _uncompress_shared_libraries
 
@@ -4840,7 +4828,7 @@
               "//build/android/bytecode:trace_event_adder"
           _rewritten_jar_target_name = "${target_name}__trace_event_rewritten"
           _rewriter_path = root_build_dir + "/bin/helper/trace_event_adder"
-          _stamp = "${target_gen_dir}/${target_name}.trace_event_rewrite.stamp"
+          _stamp = "${target_out_dir}/${target_name}.trace_event_rewrite.stamp"
           action_with_pydeps(_rewritten_jar_target_name) {
             script = "//build/android/gyp/trace_event_bytecode_rewriter.py"
             inputs = [
@@ -4920,7 +4908,7 @@
       # the internal module name inside the final bundle, in other words,
       # this file *must* be named ${_module.name}.zip
       _create_module_target = "${_target_name}__${_module.name}__create"
-      _module_zip_path = "$target_gen_dir/$target_name/${_module.name}.zip"
+      _module_zip_path = "$target_out_dir/$target_name/${_module.name}.zip"
       create_android_app_bundle_module(_create_module_target) {
         forward_variables_from(invoker,
                                [
diff --git a/build/config/android/system_image.gni b/build/config/android/system_image.gni
new file mode 100644
index 0000000..cf344a2
--- /dev/null
+++ b/build/config/android/system_image.gni
@@ -0,0 +1,124 @@
+# Copyright 2022 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/rules.gni")
+
+# Creates a stub .apk suitable for use with compressed system APKs.
+#
+# Variables:
+#   package_name: Package name to use for the stub.
+#   package_name_from_target: Use the package name from this apk/bundle target.
+#   stub_output: Path to output stub apk (default: do not create a stub).
+#
+# package_name and package_name_from_target are mutually exclusive.
+template("system_image_stub_apk") {
+  # Android requires stubs end with -Stub.apk.
+  assert(filter_exclude([ invoker.stub_output ], [ "*-Stub.apk" ]) == [],
+         "stub_output \"${invoker.stub_output}\" must end with \"-Stub.apk\"")
+
+  _resource_apk_path = "${target_out_dir}/$target_name.ap_"
+  _resource_apk_target_name = "${target_name}__compile_resources"
+  action_with_pydeps(_resource_apk_target_name) {
+    _manifest_path = "//build/android/AndroidManifest.xml"
+    script = "//build/android/gyp/compile_resources.py"
+    inputs = [
+      _manifest_path,
+      android_sdk_jar,
+    ]
+    outputs = [ _resource_apk_path ]
+    args = [
+      "--aapt2-path",
+      rebase_path(android_sdk_tools_bundle_aapt2, root_build_dir),
+      "--min-sdk-version=$default_min_sdk_version",
+      "--target-sdk-version=$default_min_sdk_version",
+      "--android-manifest",
+      rebase_path(_manifest_path, root_build_dir),
+      "--arsc-path",
+      rebase_path(_resource_apk_path, root_build_dir),
+    ]
+    if (defined(invoker.package_name)) {
+      _package_name = invoker.package_name
+    } else {
+      _target = invoker.package_name_from_target
+      deps = [ "${_target}$build_config_target_suffix" ]
+      _build_config = get_label_info(_target, "target_gen_dir") + "/" +
+                      get_label_info(_target, "name") + ".build_config.json"
+      inputs += [ _build_config ]
+      _rebased_build_config = rebase_path(_build_config, root_build_dir)
+      _package_name = "@FileArg($_rebased_build_config:deps_info:package_name)"
+    }
+    args += [
+      "--rename-manifest-package=$_package_name",
+      "--arsc-package-name=$_package_name",
+      "--include-resources",
+      rebase_path(android_sdk_jar, root_build_dir),
+    ]
+  }
+
+  package_apk(target_name) {
+    forward_variables_from(invoker,
+                           [
+                             "keystore_name",
+                             "keystore_path",
+                             "keystore_password",
+                           ])
+    min_sdk_version = default_min_sdk_version
+    deps = [ ":$_resource_apk_target_name" ]
+
+    packaged_resources_path = _resource_apk_path
+    output_apk_path = invoker.stub_output
+  }
+}
+
+# Generates artifacts for system APKs.
+#
+# Variables:
+#   apk_or_bundle_target: Target that creates input bundle or apk.
+#   input_apk_or_bundle: Path to input .apk or .aab.
+#   output: Path to the output system .apk or .zip.
+#   fuse_apk: Fuse all apk splits into a single .apk (default: false).
+#   stub_output: Path to output stub apk (default: do not create a stub).
+#
+template("system_image_apks") {
+  if (defined(invoker.stub_output)) {
+    _stub_apk_target_name = "${target_name}__stub"
+    system_image_stub_apk(_stub_apk_target_name) {
+      package_name_from_target = invoker.apk_or_bundle_target
+      stub_output = invoker.stub_output
+    }
+  }
+
+  action_with_pydeps(target_name) {
+    script = "//build/android/gyp/system_image_apks.py"
+    deps = [ invoker.apk_or_bundle_target ]
+    inputs = [ invoker.input_apk_or_bundle ]
+    if (defined(invoker.stub_output)) {
+      public_deps = [ ":$_stub_apk_target_name" ]
+    }
+    outputs = [ invoker.output ]
+    args = [
+      "--input",
+      rebase_path(invoker.input_apk_or_bundle, root_out_dir),
+      "--output",
+      rebase_path(invoker.output, root_out_dir),
+    ]
+
+    _is_bundle =
+        filter_exclude([ invoker.input_apk_or_bundle ], [ "*.aab" ]) == []
+
+    if (_is_bundle) {
+      _wrapper_path = "$root_out_dir/bin/" +
+                      get_label_info(invoker.apk_or_bundle_target, "name")
+      args += [
+        "--bundle-wrapper",
+        rebase_path(_wrapper_path, root_out_dir),
+      ]
+      inputs += [ _wrapper_path ]
+      deps += [ "//build/android:apk_operations_py" ]
+      if (defined(invoker.fuse_apk) && invoker.fuse_apk) {
+        args += [ "--fuse-apk" ]
+      }
+    }
+  }
+}
diff --git a/build/config/dcheck_always_on.gni b/build/config/dcheck_always_on.gni
index 9e7e943e..de40c04 100644
--- a/build/config/dcheck_always_on.gni
+++ b/build/config/dcheck_always_on.gni
@@ -21,20 +21,11 @@
   # Other clients typically set this to false. If another client wants to use
   # the same default value as Chromium, we'd need to add a separate gclient
   # variable to replace build_with_chromium here.
-  # Note: If you are here to revert because DCHECKs are failing on a specific OS
-  # please prefer excluding OSes rather than reverting . I.e. if Mac builds
-  # break badly but other platforms are reasonably stable, add "&& !is_mac"
-  # instead of reverting.
   dcheck_always_on =
       (build_with_chromium && !is_official_build) || dcheck_is_configurable
 }
 
 declare_args() {
   # Set to false to disable EXPENSIVE_DCHECK()s.
-  # TODO(crbug.com/1225701): Hash out whether expensive DCHECKs need to be
-  # disabled for developers by default. There's concern that disabling these
-  # globally by default effectively reduces them to zero coverage. This is
-  # in place so that you can disable expensive DCHECKs while retaining some
-  # DCHECK coverage, which is especially important in user-facing builds.
   enable_expensive_dchecks = is_debug || dcheck_always_on
 }
diff --git a/build/config/mac/mac_sdk.gni b/build/config/mac/mac_sdk.gni
index 7e178c0..7b176160 100644
--- a/build/config/mac/mac_sdk.gni
+++ b/build/config/mac/mac_sdk.gni
@@ -12,29 +12,27 @@
 assert(current_os == "mac" || current_toolchain == default_toolchain)
 
 declare_args() {
-  # The MACOSX_DEPLOYMENT_TARGET variable used when compiling. This partially
+  # The `MACOSX_DEPLOYMENT_TARGET` variable used when compiling. This partially
   # controls the minimum supported version of macOS for Chromium by
   # affecting the symbol availability rules. This may differ from
-  # mac_min_system_version when dropping support for older macOSes but where
+  # `mac_min_system_version` when dropping support for older macOSes but where
   # additional code changes are required to be compliant with the availability
   # rules.
-  # Must be of the form x.x.x for Info.plist files.
-  mac_deployment_target = "10.11.0"
+  mac_deployment_target = "10.13"
 
-  # The value of the LSMinimmumSystemVersion in Info.plist files. This partially
-  # controls the minimum supported version of macOS for Chromium by
-  # affecting the Info.plist. This may differ from mac_deployment_target when
-  # dropping support for older macOSes. This should be greater than or equal to
-  # the mac_deployment_target version.
-  # Must be of the form x.x.x for Info.plist files.
-  mac_min_system_version = "10.11.0"
+  # The value of the `LSMinimumSystemVersion` in `Info.plist` files. This
+  # partially controls the minimum supported version of macOS for Chromium by
+  # affecting the `Info.plist`. This may differ from `mac_deployment_target`
+  # when dropping support for older macOSes. This must be greater than or equal
+  # to the `mac_deployment_target` version.
+  mac_min_system_version = "10.13"
 
   # Path to a specific version of the Mac SDK, not including a slash at the end.
   # If empty, the path to the lowest version greater than or equal to
-  # mac_sdk_min is used.
+  # `mac_sdk_min` is used.
   mac_sdk_path = ""
 
-  # The SDK name as accepted by xcodebuild.
+  # The SDK name as accepted by `xcodebuild`.
   mac_sdk_name = "macosx"
 
   # The SDK version used when making official builds. This is a single exact
diff --git a/cc/layers/painted_overlay_scrollbar_layer.cc b/cc/layers/painted_overlay_scrollbar_layer.cc
index 281d8d4..33ff15f 100644
--- a/cc/layers/painted_overlay_scrollbar_layer.cc
+++ b/cc/layers/painted_overlay_scrollbar_layer.cc
@@ -121,10 +121,8 @@
 bool PaintedOverlayScrollbarLayer::Update() {
   // These properties should never change.
   DCHECK_EQ(orientation(), scrollbar_.Read(*this)->Orientation());
-  // TODO(bokan): This is tripping on bots, re-enable once the root cause is
-  // understood: https://crbug.com/1323876.
-  //DCHECK_EQ(is_left_side_vertical_scrollbar(),
-  //          scrollbar_.Read(*this)->IsLeftSideVerticalScrollbar());
+  DCHECK_EQ(is_left_side_vertical_scrollbar(),
+            scrollbar_.Read(*this)->IsLeftSideVerticalScrollbar());
   DCHECK(scrollbar_.Read(*this)->HasThumb());
   DCHECK(scrollbar_.Read(*this)->IsOverlay());
   DCHECK(scrollbar_.Read(*this)->UsesNinePatchThumbResource());
diff --git a/cc/layers/painted_scrollbar_layer.cc b/cc/layers/painted_scrollbar_layer.cc
index 85c2dfd..fb570bf 100644
--- a/cc/layers/painted_scrollbar_layer.cc
+++ b/cc/layers/painted_scrollbar_layer.cc
@@ -124,10 +124,8 @@
   // These properties should never change.
   DCHECK_EQ(supports_drag_snap_back_,
             scrollbar_.Read(*this)->SupportsDragSnapBack());
-  // TODO(bokan): This is tripping on bots, re-enable once the root cause is
-  // understood: https://crbug.com/1323876.
-  // DCHECK_EQ(is_left_side_vertical_scrollbar(),
-  //          scrollbar_.Read(*this)->IsLeftSideVerticalScrollbar());
+  DCHECK_EQ(is_left_side_vertical_scrollbar(),
+            scrollbar_.Read(*this)->IsLeftSideVerticalScrollbar());
   DCHECK_EQ(is_overlay_, scrollbar_.Read(*this)->IsOverlay());
   DCHECK_EQ(orientation(), scrollbar_.Read(*this)->Orientation());
 
diff --git a/cc/layers/solid_color_scrollbar_layer.cc b/cc/layers/solid_color_scrollbar_layer.cc
index be0c4bb..e2b9103 100644
--- a/cc/layers/solid_color_scrollbar_layer.cc
+++ b/cc/layers/solid_color_scrollbar_layer.cc
@@ -36,10 +36,8 @@
       existing_layer->track_start() == track_start) {
     // These fields have been checked in ScrollbarLayerBase::CreateOrReuse().
     DCHECK_EQ(scrollbar->Orientation(), existing_layer->orientation());
-    // TODO(bokan): This is tripping on bots, re-enable once the root cause is
-    // understood: https://crbug.com/1323876.
-    // DCHECK_EQ(scrollbar->IsLeftSideVerticalScrollbar(),
-    //          existing_layer->is_left_side_vertical_scrollbar());
+    DCHECK_EQ(scrollbar->IsLeftSideVerticalScrollbar(),
+              existing_layer->is_left_side_vertical_scrollbar());
     return existing_layer;
   }
 
diff --git a/chrome/VERSION b/chrome/VERSION
index 965c3f1..ce13c36b 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=104
 MINOR=0
-BUILD=5066
+BUILD=5067
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 7cc19e7..3b2502c 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -5,6 +5,7 @@
 import("//build/android/resource_sizes.gni")
 import("//build/config/android/config.gni")
 import("//build/config/android/rules.gni")
+import("//build/config/android/system_image.gni")
 import("//build/config/python.gni")
 import("//build/util/process_version.gni")
 import("//build/util/version.gni")
@@ -2862,6 +2863,12 @@
       expected_libs_and_assets = "expectations/trichrome_library_apk.$target_cpu.libs_and_assets.expected"
     }
   }
+
+  # Can be used to install compressed apks on system images.
+  system_image_stub_apk("trichrome_library_system_stub_apk") {
+    package_name = chrome_public_manifest_package
+    stub_output = "$root_out_dir/apks/TrichromeLibrary-Stub.apk"
+  }
 }
 
 if (android_64bit_target_cpu) {
@@ -3696,6 +3703,22 @@
     }
   }
 
+  # Creates .zip of .apk splits suitable for the Android system image.
+  system_image_apks("trichrome_chrome_system_zip") {
+    apk_or_bundle_target = ":trichrome_chrome_bundle"
+    input_apk_or_bundle = "$root_out_dir/apks/TrichromeChrome.aab"
+    output = "$root_out_dir/apks/TrichromeChromeSystem.zip"
+    stub_output = "$root_out_dir/apks/TrichromeChrome-Stub.apk"
+  }
+
+  # Combines all splits into a single .apk for the Android system image.
+  system_image_apks("trichrome_chrome_system_apk") {
+    apk_or_bundle_target = ":trichrome_chrome_bundle"
+    input_apk_or_bundle = "$root_out_dir/apks/TrichromeChrome.aab"
+    output = "$root_out_dir/apks/TrichromeChromeSystem.apk"
+    fuse_apk = true
+  }
+
   if (is_official_build) {
     _trichrome_library_basename = "TrichromeLibrary.apk"
     _trichrome_chrome_basename = "TrichromeChrome.minimal.apks"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
index 425fd0a..c468852 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
@@ -839,7 +839,8 @@
             final int backgroundColor = getBackground().getColor();
             if (ThemeUtils.isUsingDefaultToolbarColor(
                         context, /*isIncognito=*/false, backgroundColor)) {
-                progressBar.setBackgroundColor(context.getColor(R.color.progress_bar_bg_color));
+                progressBar.setBackgroundColor(
+                        context.getColor(R.color.progress_bar_bg_color_list));
                 progressBar.setForegroundColor(
                         SemanticColorUtils.getProgressBarForeground(context));
             } else {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2ApiTestHelper.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2ApiTestHelper.java
index 1eb994a..457269d9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2ApiTestHelper.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2ApiTestHelper.java
@@ -39,9 +39,9 @@
 import org.chromium.components.payments.PaymentFeatureList;
 import org.chromium.components.payments.PaymentFeatureListJni;
 import org.chromium.components.webauthn.Fido2Api;
+import org.chromium.components.webauthn.WebAuthnCredentialDetails;
 import org.chromium.content.browser.ClientDataJsonImpl;
 import org.chromium.content.browser.ClientDataJsonImplJni;
-import org.chromium.content_public.browser.WebAuthnCredentialDetails;
 import org.chromium.mojo_base.mojom.TimeDelta;
 import org.chromium.payments.mojom.PaymentCurrencyAmount;
 import org.chromium.url.internal.mojom.Origin;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestTest.java
index cf39210f..7080c77c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestTest.java
@@ -60,9 +60,10 @@
 import org.chromium.components.webauthn.InternalAuthenticatorJni;
 import org.chromium.components.webauthn.IsUvpaaResponseCallback;
 import org.chromium.components.webauthn.MakeCredentialResponseCallback;
+import org.chromium.components.webauthn.WebAuthnBrowserBridge;
+import org.chromium.components.webauthn.WebAuthnCredentialDetails;
 import org.chromium.content_public.browser.RenderFrameHost;
 import org.chromium.content_public.browser.WebAuthenticationDelegate;
-import org.chromium.content_public.browser.WebAuthnCredentialDetails;
 import org.chromium.content_public.browser.test.mock.MockRenderFrameHost;
 import org.chromium.content_public.browser.test.mock.MockWebContents;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
@@ -101,6 +102,7 @@
     private MockIntentSender mIntentSender;
     private EmbeddedTestServer mTestServer;
     private MockAuthenticatorRenderFrameHost mFrameHost;
+    private MockBrowserBridge mMockBrowserBridge;
     private Origin mOrigin;
     private InternalAuthenticator.Natives mTestAuthenticatorImplJni;
     private Fido2CredentialRequest mRequest;
@@ -350,37 +352,12 @@
         }
     }
 
-    private static class MockAuthenticatorRenderFrameHost extends MockRenderFrameHost {
-        private GURL mLastUrl;
-        private boolean mIsPaymentCredentialCreation;
+    private static class MockBrowserBridge extends WebAuthnBrowserBridge {
         private byte[] mSelectedCredentialId;
         private List<WebAuthnCredentialDetails> mExpectedCredentialList;
 
         @Override
-        public GURL getLastCommittedURL() {
-            return mLastUrl;
-        }
-
-        @Override
-        public Origin getLastCommittedOrigin() {
-            return new MockOrigin(mLastUrl);
-        }
-
-        public void setLastCommittedURL(GURL url) {
-            mLastUrl = url;
-        }
-
-        @Override
-        public int performMakeCredentialWebAuthSecurityChecks(String relyingPartyId,
-                Origin effectiveOrigin, boolean isPaymentCredentialCreation) {
-            super.performMakeCredentialWebAuthSecurityChecks(
-                    relyingPartyId, effectiveOrigin, isPaymentCredentialCreation);
-            mIsPaymentCredentialCreation = isPaymentCredentialCreation;
-            return 0;
-        }
-
-        @Override
-        public void onCredentialsDetailsListReceived(
+        public void onCredentialsDetailsListReceived(RenderFrameHost frameHost,
                 List<WebAuthnCredentialDetails> credentialList, Callback<byte[]> callback) {
             Assert.assertEquals(mExpectedCredentialList.size(), credentialList.size());
             for (int i = 0; i < credentialList.size(); i++) {
@@ -423,6 +400,36 @@
         }
     }
 
+    private static class MockAuthenticatorRenderFrameHost extends MockRenderFrameHost {
+        private GURL mLastUrl;
+        private boolean mIsPaymentCredentialCreation;
+
+        MockAuthenticatorRenderFrameHost() {}
+
+        @Override
+        public GURL getLastCommittedURL() {
+            return mLastUrl;
+        }
+
+        @Override
+        public Origin getLastCommittedOrigin() {
+            return new MockOrigin(mLastUrl);
+        }
+
+        public void setLastCommittedURL(GURL url) {
+            mLastUrl = url;
+        }
+
+        @Override
+        public int performMakeCredentialWebAuthSecurityChecks(String relyingPartyId,
+                Origin effectiveOrigin, boolean isPaymentCredentialCreation) {
+            super.performMakeCredentialWebAuthSecurityChecks(
+                    relyingPartyId, effectiveOrigin, isPaymentCredentialCreation);
+            mIsPaymentCredentialCreation = isPaymentCredentialCreation;
+            return 0;
+        }
+    }
+
     @Before
     public void setUp() throws Exception {
         Assume.assumeTrue(gmsVersionSupported());
@@ -450,6 +457,9 @@
 
         Fido2ApiCallHelper.overrideInstanceForTesting(new MockFido2ApiCallHelper());
 
+        mMockBrowserBridge = new MockBrowserBridge();
+        mRequest.overrideBrowserBridgeForTesting(mMockBrowserBridge);
+
         mRequest.setWebContentsForTesting(mMockWebContents);
         mStartTimeMs = SystemClock.elapsedRealtime();
     }
@@ -1294,7 +1304,7 @@
     @SmallTest
     public void testGetAssertion_conditionalUi_success() {
         mIntentSender.setNextResultIntent(Fido2ApiTestHelper.createSuccessfulGetAssertionIntent());
-        mFrameHost.setExpectedCredentialDetailsList(Arrays.asList(
+        mMockBrowserBridge.setExpectedCredentialDetailsList(Arrays.asList(
                 new WebAuthnCredentialDetails[] {Fido2ApiTestHelper.getCredentialDetails()}));
 
         mRequestOptions.allowCredentials = new PublicKeyCredentialDescriptor[0];
@@ -1313,8 +1323,8 @@
     @Test
     @SmallTest
     public void testGetAssertion_conditionalUi_failureEmptyCredential() {
-        mFrameHost.setSelectedCredentialId(new byte[0]);
-        mFrameHost.setExpectedCredentialDetailsList(Arrays.asList(
+        mMockBrowserBridge.setSelectedCredentialId(new byte[0]);
+        mMockBrowserBridge.setExpectedCredentialDetailsList(Arrays.asList(
                 new WebAuthnCredentialDetails[] {Fido2ApiTestHelper.getCredentialDetails()}));
         mRequestOptions.allowCredentials = new PublicKeyCredentialDescriptor[0];
         mRequestOptions.isConditional = true;
diff --git a/chrome/app/chromium_strings.grd b/chrome/app/chromium_strings.grd
index 2baa61a..e377d73c 100644
--- a/chrome/app/chromium_strings.grd
+++ b/chrome/app/chromium_strings.grd
@@ -1350,7 +1350,7 @@
             To access your Chromium browser stuff across all your devices, sign in, then turn on sync
           </message>
           <message name="IDS_PROFILE_PICKER_PROFILE_CREATION_FLOW_ACCOUNT_SELECTION_LACROS_SUBTITLE" desc="Profile picker, account selection screen subtitle">
-            The following accounts are available for this Chromium profile
+            Sign in to Chromium
           </message>
         </if>
         <if expr="not chromeos_lacros">
diff --git a/chrome/app/chromium_strings_grd/IDS_PROFILE_PICKER_PROFILE_CREATION_FLOW_ACCOUNT_SELECTION_LACROS_SUBTITLE.png.sha1 b/chrome/app/chromium_strings_grd/IDS_PROFILE_PICKER_PROFILE_CREATION_FLOW_ACCOUNT_SELECTION_LACROS_SUBTITLE.png.sha1
index 9f195a2..3ca7669 100644
--- a/chrome/app/chromium_strings_grd/IDS_PROFILE_PICKER_PROFILE_CREATION_FLOW_ACCOUNT_SELECTION_LACROS_SUBTITLE.png.sha1
+++ b/chrome/app/chromium_strings_grd/IDS_PROFILE_PICKER_PROFILE_CREATION_FLOW_ACCOUNT_SELECTION_LACROS_SUBTITLE.png.sha1
@@ -1 +1 @@
-6a9d17c50313f1d953fad9ed64a392d0ebcbbf0d
\ No newline at end of file
+484512579029384cb85df01bacfb97f8cfe31e37
\ No newline at end of file
diff --git a/chrome/app/google_chrome_strings.grd b/chrome/app/google_chrome_strings.grd
index 854b6daa..c33b66a6 100644
--- a/chrome/app/google_chrome_strings.grd
+++ b/chrome/app/google_chrome_strings.grd
@@ -1445,7 +1445,7 @@
           </message>
 
           <message name="IDS_PROFILE_PICKER_PROFILE_CREATION_FLOW_ACCOUNT_SELECTION_LACROS_SUBTITLE" desc="Profile picker, account selection screen subtitle">
-            The following accounts are available for this Chrome profile
+            Sign in to Chrome
           </message>
         </if>
         <if expr="not chromeos_lacros">
diff --git a/chrome/app/google_chrome_strings_grd/IDS_PROFILE_PICKER_PROFILE_CREATION_FLOW_ACCOUNT_SELECTION_LACROS_SUBTITLE.png.sha1 b/chrome/app/google_chrome_strings_grd/IDS_PROFILE_PICKER_PROFILE_CREATION_FLOW_ACCOUNT_SELECTION_LACROS_SUBTITLE.png.sha1
index 9f195a2..3ca7669 100644
--- a/chrome/app/google_chrome_strings_grd/IDS_PROFILE_PICKER_PROFILE_CREATION_FLOW_ACCOUNT_SELECTION_LACROS_SUBTITLE.png.sha1
+++ b/chrome/app/google_chrome_strings_grd/IDS_PROFILE_PICKER_PROFILE_CREATION_FLOW_ACCOUNT_SELECTION_LACROS_SUBTITLE.png.sha1
@@ -1 +1 @@
-6a9d17c50313f1d953fad9ed64a392d0ebcbbf0d
\ No newline at end of file
+484512579029384cb85df01bacfb97f8cfe31e37
\ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_bs.xtb b/chrome/app/resources/chromium_strings_bs.xtb
index b1fe9544..f76162fa 100644
--- a/chrome/app/resources/chromium_strings_bs.xtb
+++ b/chrome/app/resources/chromium_strings_bs.xtb
@@ -317,6 +317,7 @@
 <translation id="8133124826068723441">ChromiumOS nije mogao sinhronizirati podatke zato što sinhronizacija nije dostupna za vašu domenu.</translation>
 <translation id="813913629614996137">Pokretanje…</translation>
 <translation id="81770708095080097">Ovaj fajl je opasan pa ga je Chromium blokirao.</translation>
+<translation id="8213374284266571500">Chromium je blokirao datoteku jer je ta vrsta datoteke opasna</translation>
 <translation id="8248265253516264921">Ako slika ne sadrži koristan opis, Chromium će ga pokušati pružiti. Slike se šalju Googleu radi kreiranja opisa. To možete isključiti u postavkama kad god želite.</translation>
 <translation id="8266560134891435528">Chromium ne može provjeravati vaše lozinke jer niste prijavljeni</translation>
 <translation id="8276522524898344151">Chromium pokušava kopirati lozinke.</translation>
diff --git a/chrome/app/resources/chromium_strings_et.xtb b/chrome/app/resources/chromium_strings_et.xtb
index 76c3897..1665c22 100644
--- a/chrome/app/resources/chromium_strings_et.xtb
+++ b/chrome/app/resources/chromium_strings_et.xtb
@@ -314,6 +314,7 @@
 <translation id="8133124826068723441">Chromium OS ei saanud teie andmeid sünkroonida, sest teie domeenil pole sünkroonimine saadaval.</translation>
 <translation id="813913629614996137">Lähtestamine …</translation>
 <translation id="81770708095080097">Chromium blokeeris faili, kuna see on ohtlik.</translation>
+<translation id="8213374284266571500">Chromium blokeeris selle faili, kuna see failitüüp on ohtlik</translation>
 <translation id="8248265253516264921">Kui pildil puudub kasulik kirjeldus, üritab Chromium selle ise luua. Kirjelduste loomiseks saadetakse pildid Google'ile. Võite selle seadetes igal ajal välja lülitada.</translation>
 <translation id="8266560134891435528">Chromium ei saa teie paroole kontrollida, kuna te pole sisse logitud</translation>
 <translation id="8276522524898344151">Chromium üritab kopeerida paroole.</translation>
diff --git a/chrome/app/resources/chromium_strings_hr.xtb b/chrome/app/resources/chromium_strings_hr.xtb
index 3c72910..acefc23 100644
--- a/chrome/app/resources/chromium_strings_hr.xtb
+++ b/chrome/app/resources/chromium_strings_hr.xtb
@@ -314,6 +314,7 @@
 <translation id="8133124826068723441">Chromium OS nije mogao sinkronizirati vaše podatke jer sinkronizacija nije dostupna za vašu domenu.</translation>
 <translation id="813913629614996137">Pokretanje...</translation>
 <translation id="81770708095080097">Datoteka je opasna i Chromium ju je blokirao.</translation>
+<translation id="8213374284266571500">Chromium je blokirao datoteku jer je ta vrsta datoteke opasna</translation>
 <translation id="8248265253516264921">Ako slika nema koristan opis, Chromium će ga pokušati pružiti. Da bi se izradili opisi, slike se šalju Googleu. To možete isključiti u bilo kojem trenutku u postavkama.</translation>
 <translation id="8266560134891435528">Chromium ne može provjeriti vaše zaporke jer niste prijavljeni</translation>
 <translation id="8276522524898344151">Chromium pokušava kopirati zaporke.</translation>
diff --git a/chrome/app/resources/chromium_strings_ja.xtb b/chrome/app/resources/chromium_strings_ja.xtb
index 774c14f4..9c0eef1 100644
--- a/chrome/app/resources/chromium_strings_ja.xtb
+++ b/chrome/app/resources/chromium_strings_ja.xtb
@@ -313,6 +313,7 @@
 <translation id="8133124826068723441">ご使用のドメインでは同期を利用できないため、Chromium OS はデータを同期できませんでした。</translation>
 <translation id="813913629614996137">初期化しています...</translation>
 <translation id="81770708095080097">このファイルは危険なファイルであるため、Chromium でブロックしました。</translation>
+<translation id="8213374284266571500">危険なファイル形式のため Chromium でブロックされました</translation>
 <translation id="8248265253516264921">画像に有効な説明が設定されていない場合に、Chromium で説明を自動的に生成できるよう Google に画像が送信されます。この機能は設定でいつでも無効にできます。</translation>
 <translation id="8266560134891435528">ログインしていないため、Chromium でパスワードを確認できません</translation>
 <translation id="8276522524898344151">Chromium がパスワードをコピーしようとしています。</translation>
diff --git a/chrome/app/resources/chromium_strings_ka.xtb b/chrome/app/resources/chromium_strings_ka.xtb
index 9b7f967..d0f404c 100644
--- a/chrome/app/resources/chromium_strings_ka.xtb
+++ b/chrome/app/resources/chromium_strings_ka.xtb
@@ -315,6 +315,7 @@
 <translation id="8133124826068723441">ChromiumOS-ის საშუალებით ვერ მოხერხდა თქვენი მონაცემების სინქრონიზაცია, რადგან თქვენს დომენზე სინქრონიზაცია მიუწვდომელია.</translation>
 <translation id="813913629614996137">მიმდინარეობს ინიცირება…</translation>
 <translation id="81770708095080097">Chromium-მა დაბლოკა ეს ფაილი, რადგან ის სახიფათოა.</translation>
+<translation id="8213374284266571500">Chromium-მა დაბლოკა ეს ფაილი, რადგან ამ ტიპის ფაილი სახიფათოა</translation>
 <translation id="8248265253516264921">თუ სურათს არ ექნება სასარგებლო აღწერილობა, Chromium შეეცდება მის უზრუნველყოფას. აღწერილობების შესაქმნელად სურათები იგზავნება Google-ში. ამის გამორთვა ნებისმიერ დროს შეგიძლიათ პარამეტრებიდან.</translation>
 <translation id="8266560134891435528">Chromium ვერ ახერხებს თქვენი პაროლების შემოწმებას, რადგან შესული არ ხართ</translation>
 <translation id="8276522524898344151">Chromium ცდილობს პაროლების კოპირებას.</translation>
diff --git a/chrome/app/resources/chromium_strings_nl.xtb b/chrome/app/resources/chromium_strings_nl.xtb
index 4869458f..2b1d562 100644
--- a/chrome/app/resources/chromium_strings_nl.xtb
+++ b/chrome/app/resources/chromium_strings_nl.xtb
@@ -315,6 +315,7 @@
 <translation id="8133124826068723441">Chromium OS kan je gegevens niet synchroniseren, omdat synchronisatie niet beschikbaar is voor je domein.</translation>
 <translation id="813913629614996137">Starten...</translation>
 <translation id="81770708095080097">Dit bestand is gevaarlijk en is daarom door Chromium geblokkeerd.</translation>
+<translation id="8213374284266571500">Chromium heeft dit bestand geblokkeerd omdat dit type bestand gevaarlijk is</translation>
 <translation id="8248265253516264921">Als een afbeelding geen nuttige beschrijving bevat, probeert Chromium je er een te geven. Afbeeldingen worden naar Google gestuurd om beschrijvingen te maken. Je kunt dit op elk gewenst moment uitzetten in Instellingen.</translation>
 <translation id="8266560134891435528">Chromium kan je wachtwoorden niet checken omdat je niet bent ingelogd.</translation>
 <translation id="8276522524898344151">Chromium probeert wachtwoorden te kopiëren.</translation>
diff --git a/chrome/app/resources/chromium_strings_pl.xtb b/chrome/app/resources/chromium_strings_pl.xtb
index b19f993..0c97b24f 100644
--- a/chrome/app/resources/chromium_strings_pl.xtb
+++ b/chrome/app/resources/chromium_strings_pl.xtb
@@ -311,6 +311,7 @@
 <translation id="8133124826068723441">System operacyjny Chromium nie może zsynchronizować danych, ponieważ synchronizacja jest niedostępna w Twojej domenie.</translation>
 <translation id="813913629614996137">Inicjuję…</translation>
 <translation id="81770708095080097">Ten plik jest niebezpieczny, dlatego został zablokowany przez Chromium.</translation>
+<translation id="8213374284266571500">Plik został zablokowany przez Chromium, bo ten typ pliku jest niebezpieczny</translation>
 <translation id="8248265253516264921">Jeśli obraz nie ma przydatnego opisu, Chromium spróbuje go dla Ciebie stworzyć. W tym celu obrazy zostaną wysłane do Google. W każdej chwili możesz wyłączyć tę funkcję w ustawieniach.</translation>
 <translation id="8266560134891435528">Chromium nie może sprawdzić haseł, jeśli się nie zalogujesz</translation>
 <translation id="8276522524898344151">Chromium próbuje skopiować hasła.</translation>
diff --git a/chrome/app/resources/chromium_strings_ro.xtb b/chrome/app/resources/chromium_strings_ro.xtb
index f20e44ef..47cb378 100644
--- a/chrome/app/resources/chromium_strings_ro.xtb
+++ b/chrome/app/resources/chromium_strings_ro.xtb
@@ -313,6 +313,7 @@
 <translation id="8133124826068723441">Sistemul de operare Chromium nu a putut sincroniza datele, deoarece sincronizarea nu este disponibilă pentru domeniu.</translation>
 <translation id="813913629614996137">Se inițializează...</translation>
 <translation id="81770708095080097">Fișierul este periculos, așadar Chromium l-a blocat.</translation>
+<translation id="8213374284266571500">Chromium a blocat fișierul deoarece acest tip de fișier este periculos</translation>
 <translation id="8248265253516264921">Dacă o imagine nu are o descriere utilă, Chromium va încerca să o completeze. Pentru a crea descrieri, imaginile sunt trimise la Google. Poți dezactiva această opțiune oricând din setări.</translation>
 <translation id="8266560134891435528">Chromium nu îți poate verifica parolele, deoarece nu te-ai conectat</translation>
 <translation id="8276522524898344151">Chromium încearcă să copieze parolele.</translation>
diff --git a/chrome/app/resources/chromium_strings_ru.xtb b/chrome/app/resources/chromium_strings_ru.xtb
index fddd1c85..69cfe79f 100644
--- a/chrome/app/resources/chromium_strings_ru.xtb
+++ b/chrome/app/resources/chromium_strings_ru.xtb
@@ -310,6 +310,7 @@
 <translation id="8133124826068723441">Не удалось синхронизировать данные, так как эта функция недоступна для вашего домена.</translation>
 <translation id="813913629614996137">Инициализация...</translation>
 <translation id="81770708095080097">Chromium заблокировал этот файл как опасный.</translation>
+<translation id="8213374284266571500">Chromium заблокировал файл с опасным расширением.</translation>
 <translation id="8248265253516264921">Если у изображения нет понятного описания, Chromium попытается его найти. Для создания описаний изображения отправляются в Google. Эту функцию можно отключить в настройках в любое время.</translation>
 <translation id="8266560134891435528">Не удается запустить проверку паролей в Chromium, поскольку вы не вошли в аккаунт.</translation>
 <translation id="8276522524898344151">Chromium пытается скопировать пароли</translation>
diff --git a/chrome/app/resources/chromium_strings_sr-Latn.xtb b/chrome/app/resources/chromium_strings_sr-Latn.xtb
index a3c59b3a..395f725 100644
--- a/chrome/app/resources/chromium_strings_sr-Latn.xtb
+++ b/chrome/app/resources/chromium_strings_sr-Latn.xtb
@@ -317,6 +317,7 @@
 <translation id="8133124826068723441">Chromium OS ne može da sinhronizuje podatke jer Sinhronizacija nije dostupna za domen.</translation>
 <translation id="813913629614996137">Pokreće se…</translation>
 <translation id="81770708095080097">Ova datoteka je opasna, pa ju je Chromium blokirao.</translation>
+<translation id="8213374284266571500">Chromium je blokirao ovaj fajl jer je ovaj tip fajla opasan</translation>
 <translation id="8248265253516264921">Ako slika nema koristan opis, Chromium će probati da vam ga pruži. Slike se šalju Google-u radi pravljenja opisa. To možete da isključite u podešavanjima u svakom trenutku.</translation>
 <translation id="8266560134891435528">Chromium ne može da vam proverava lozinke zato što niste prijavljeni</translation>
 <translation id="8276522524898344151">Chromium pokušava da kopira lozinke.</translation>
diff --git a/chrome/app/resources/chromium_strings_sr.xtb b/chrome/app/resources/chromium_strings_sr.xtb
index 2141e428..5ebb3ba 100644
--- a/chrome/app/resources/chromium_strings_sr.xtb
+++ b/chrome/app/resources/chromium_strings_sr.xtb
@@ -317,6 +317,7 @@
 <translation id="8133124826068723441">Chromium ОС не може да синхронизује податке јер Синхронизација није доступна за домен.</translation>
 <translation id="813913629614996137">Покреће се…</translation>
 <translation id="81770708095080097">Ова датотека је опасна, па ју је Chromium блокирао.</translation>
+<translation id="8213374284266571500">Chromium је блокирао овај фајл јер је овај тип фајла опасан</translation>
 <translation id="8248265253516264921">Ако слика нема користан опис, Chromium ће пробати да вам га пружи. Слике се шаљу Google-у ради прављења описа. То можете да искључите у подешавањима у сваком тренутку.</translation>
 <translation id="8266560134891435528">Chromium не може да вам проверава лозинке зато што нисте пријављени</translation>
 <translation id="8276522524898344151">Chromium покушава да копира лозинке.</translation>
diff --git a/chrome/app/resources/chromium_strings_sw.xtb b/chrome/app/resources/chromium_strings_sw.xtb
index 1e036bc..044091e 100644
--- a/chrome/app/resources/chromium_strings_sw.xtb
+++ b/chrome/app/resources/chromium_strings_sw.xtb
@@ -317,6 +317,7 @@
 <translation id="8133124826068723441">Mfumo wa Uendeshaji wa Chromium haukusawazisha data yako kwa sababu Usawazishaji haupatikani kwa kikoa chako.</translation>
 <translation id="813913629614996137">Inaanzisha…</translation>
 <translation id="81770708095080097">Faili hii ni hatari, kwa hivyo Chromium imeizuia.</translation>
+<translation id="8213374284266571500">Chromium imezuia faili hii kwa sababu aina hii ya faili si salama</translation>
 <translation id="8248265253516264921">Ikiwa picha haina ufafanuzi muhimu, Chromium itajaribu kukuwekea. Ili kuweka ufafanuzi, tutatuma picha kwa Google. Unaweza kuzima mipangilio hii wakati wowote.</translation>
 <translation id="8266560134891435528">Chromium imeshindwa kukagua manenosiri yako kwa sababu hujaingia katika akaunti</translation>
 <translation id="8276522524898344151">Chromium inajaribu kunakili manenosiri.</translation>
diff --git a/chrome/app/resources/chromium_strings_uz.xtb b/chrome/app/resources/chromium_strings_uz.xtb
index 97025b8e..3256963 100644
--- a/chrome/app/resources/chromium_strings_uz.xtb
+++ b/chrome/app/resources/chromium_strings_uz.xtb
@@ -313,6 +313,7 @@
 <translation id="8133124826068723441">Domeningizda Sinxronlash xizmati mavjud emasligi sababli ChromiumOS maʼlumotlaringizni sinxronlay olmadi.</translation>
 <translation id="813913629614996137">Ishga tushirilmoqda...</translation>
 <translation id="81770708095080097">Bu fayl xavfli edi va u Chromium tomonidan bloklandi.</translation>
+<translation id="8213374284266571500">Bu fayl turi zararli boʻlgani sababli Chromium uni blokladi</translation>
 <translation id="8248265253516264921">Agar rasmga foydali tavsif berilmagan boʻlsa, Chromium uni sizga tavsiflaydi. Tavsif yaratish uchun rasmlar Googlega yuboriladi. Bu sozlamani istalgan vaqtda faolsizlantirish mumkin.</translation>
 <translation id="8266560134891435528">Chromium parollaringizni faqat hisobingizga kirganingizdan keyin tekshira oladi</translation>
 <translation id="8276522524898344151">Chromium parollarni nusxalashga urinmoqda.</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-HK.xtb b/chrome/app/resources/chromium_strings_zh-HK.xtb
index 29de6a47..9135f9b 100644
--- a/chrome/app/resources/chromium_strings_zh-HK.xtb
+++ b/chrome/app/resources/chromium_strings_zh-HK.xtb
@@ -316,6 +316,7 @@
 <translation id="8133124826068723441">您的網域無法使用「同步功能」,因此 Chromium 作業系統無法同步處理您的資料。</translation>
 <translation id="813913629614996137">正在初始化…</translation>
 <translation id="81770708095080097">此檔案不安全,因此 Chromium 已封鎖此檔案。</translation>
+<translation id="8213374284266571500">由於此檔案類型不安全,因此 Chromium 已封鎖此檔案</translation>
 <translation id="8248265253516264921">如果圖片並無有用的說明,Chromium 會嘗試為您提供說明。因此,圖片將傳送至 Google 以建立說明。您可以隨時在設定中關閉此功能。</translation>
 <translation id="8266560134891435528">由於您尚未登入帳戶,因此 Chromium 無法檢查密碼</translation>
 <translation id="8276522524898344151">Chromium 正在嘗試複製密碼。</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-TW.xtb b/chrome/app/resources/chromium_strings_zh-TW.xtb
index 6756a864..5fc31ed 100644
--- a/chrome/app/resources/chromium_strings_zh-TW.xtb
+++ b/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -314,6 +314,7 @@
 <translation id="8133124826068723441">你的網域無法使用同步功能,因此 Chromium OS 無法同步處理你的資料。</translation>
 <translation id="813913629614996137">正在初始化...</translation>
 <translation id="81770708095080097">這個檔案並不安全,因此遭到 Chromium 封鎖。</translation>
+<translation id="8213374284266571500">這個類型的檔案有安全疑慮,因此 Chromium 已封鎖這個檔案</translation>
 <translation id="8248265253516264921">如果圖片缺少有用的說明,Chromium 會嘗試為你提供說明。系統會將圖片傳送給 Google,以便產生說明。你隨時可以在設定中關閉這項功能。</translation>
 <translation id="8266560134891435528">你尚未登入帳戶,因此 Chromium 無法檢查你的密碼</translation>
 <translation id="8276522524898344151">Chromium 正在嘗試複製密碼。</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb
index b2d825d..e6486cf 100644
--- a/chrome/app/resources/generated_resources_az.xtb
+++ b/chrome/app/resources/generated_resources_az.xtb
@@ -87,6 +87,9 @@
 <translation id="1082214733466244292">Administratorunuz bu cihaz üçün bəzi funksiyaları blok edib</translation>
 <translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" /> Chrome ayarlarını orijinal defolt ayarlarına sıfırlamaq istəyir. Bu əsas səhifənizi, yeni panel səhifəsi və axtarış sisteminizi sıfırlayacaq, artırmalarınızı deaktiv edəcək və bütün panelləri çıxaracaq. O, həmçinin, kuki, məzmun və sayt datası kimi müvəqqəti və keşlənmiş datanı siləcək.</translation>
 <translation id="1084096383128641877">Bu parolu sildikdə <ph name="DOMAIN" /> saytından hesabınız silinməyəcək. Hesabınızı digərlərindən qorumaq üçün parolunuzu dəyişin, ya da onu <ph name="DOMAIN_LINK" /> saytından silin.</translation>
+<translation id="1084288067399862432">Oğurlanmış parol uğurla dəyişdirildi.
+
+Parollarınızı istənilən vaxt <ph name="GOOGLE_PASSWORD_MANAGER" /> bölməsində yoxlaya bilərsiniz.</translation>
 <translation id="1084824384139382525">Link ünvanını kopyalayın</translation>
 <translation id="1085064499066015002">Həmişə bütün saytlarda</translation>
 <translation id="1085697365578766383">Virtual cihaz işə düşmədi. Sonra yenidən cəhd edin.</translation>
@@ -1677,6 +1680,7 @@
 <translation id="2554553592469060349">Seçilmiş fayl çox böyükdür. (maks ölçü: 3mb).</translation>
 <translation id="2558569818338050235">Baxış tarixçəniz gördüyünüz reklamlara təsir edir</translation>
 <translation id="2558896001721082624">Sistem menyusunda əlçatımlılıq seçimlərini göstərin</translation>
+<translation id="2559889124253841528">Cihazda yadda saxlayın</translation>
 <translation id="2564520396658920462">AppleScript ilə JavaScript'in işə salınması deaktivdir. Onu aktiv etmək üçün menyuda Görünüş &gt; Developer &gt; Tətbiq Tədbirlərdində JavaScript' ə icazə verin seçimini edin. Ətraflı məlumat: https://support.google.com/chrome/?p=applescript</translation>
 <translation id="2564653188463346023">Qabaqcıl orfoqrafik yoxlama</translation>
 <translation id="2568774940984945469">Məlumat paneli konteyneri</translation>
@@ -1687,6 +1691,7 @@
 <translation id="2575247648642144396">Artırmalar cari səhifədə fəaliyyət göstərəndə bu ikona görünəcək. İkonaya klikləməklə və ya <ph name="EXTENSION_SHORTCUT" /> bu artırmanı istifadə edin.</translation>
 <translation id="2575407791320728464">Yanlış URL. Onun düzgün format edildiyinə əmin olun.</translation>
 <translation id="2575441894380764255">Müdaxiləçi və ya yanıldıcı reklamların göstərilməsinə icazə verilməyib</translation>
+<translation id="2575713839157415345">{YEARS,plural, =1{Bu cihaz 1 il saxlanacaq və növbəti dəfə kod olmadan qoşula bilərsiniz. Bu, administratorunuz tərəfindən ayarlanıb.}other{Bu cihaz {YEARS} il saxlanacaq və növbəti dəfə kod olmadan qoşula bilərsiniz. Bu, administratorunuz tərəfindən ayarlanıb.}}</translation>
 <translation id="257779572837908839">Görüşlər üçün Chromebox olaraq ayarlayın</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> hostuna çoxsaylı faylları endirməyə həmişə icazə verin</translation>
 <translation id="258095186877893873">Uzun</translation>
@@ -2984,6 +2989,7 @@
 <translation id="3856800405688283469">Vaxt zonası seçin</translation>
 <translation id="3857807444929313943">Qaldırın və təkrar toxunun</translation>
 <translation id="3858860766373142691">Ad</translation>
+<translation id="385939467708172187">Güclü paroldan istifadə edin</translation>
 <translation id="3861638017150647085">"<ph name="USERNAME" />" istifadəçi adı əlçatan deyil</translation>
 <translation id="3861977424605124250">Başlanğıcda göstərin</translation>
 <translation id="386239283124269513">&amp;Qrupu Bərpa edin</translation>
@@ -3225,6 +3231,7 @@
 <translation id="4089235344645910861">Ayar yadda saxlandı. Sinxronizasiya başladı.</translation>
 <translation id="4090103403438682346">Doğrulanmış Girişi Aktiv edin</translation>
 <translation id="4090947011087001172"><ph name="SITE" /> üçün sayt icazələri sıfırlansın?</translation>
+<translation id="4092636882861724179">Yadda saxlanmış parollara burada baxa və idarə edə bilərsiniz: <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation>
 <translation id="4093865285251893588">Profil şəkli</translation>
 <translation id="4093955363990068916">Yerli fayl:</translation>
 <translation id="4094647278880271855">Dəstəklənməyən mühitin dəyişənindən istifadə edirsiniz: <ph name="BAD_VAR" />. Bu, stabillik və təhlükəsizliyə təsir edə bilər.</translation>
@@ -3515,6 +3522,7 @@
 <translation id="4392896746540753732">Konfiqurasiya faylına düzəliş edin</translation>
 <translation id="4394049700291259645">Deaktiv edin</translation>
 <translation id="4396956294839002702">{COUNT,plural, =0{&amp;Hamısını açın}=1{&amp;Əlfəcini açın}other{&amp;Hamısını açın ({COUNT})}}</translation>
+<translation id="4397372003838952832">Bu parolu yadda saxlamağa ehtiyac yoxdur. <ph name="EMAIL" /> üçün burada saxlanılacaq: <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation>
 <translation id="439817266247065935">Cihazınız düzgün qaydada söndürülməyib. Linux tətbiqlərindən istifadə etmək üçün Linux'u yenidən başladın.</translation>
 <translation id="4400367121200150367">Parolları heç vaxt yadda saxlamayan saytlar burada görünəcək</translation>
 <translation id="4400632832271803360">Üst sıradakı düymələrin funksiyasını dəyişmək üçün Başladıcı düyməsini basıb saxlayın</translation>
@@ -3528,6 +3536,7 @@
 <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation>
 <translation id="440653823335387109">OXUDUĞUNUZ SƏHİFƏLƏR</translation>
 <translation id="4406883609789734330">Avtomatik subtitrlər</translation>
+<translation id="4407039574263172582">Davam etmək üçün <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ad, e-poçt ünvanı və profil şəklinizi bu sayt ilə paylaşacaq. Bu saytın <ph name="BEGIN_LINK" />xidmət şərtlərinə<ph name="END_LINK" /> baxın.</translation>
 <translation id="4408599188496843485">Yardım</translation>
 <translation id="4409271659088619928">Axtarış sisteminiz <ph name="DSE" />. Axtarış tarixçənizi silmək üçün onun təlimatlarına (təmin edilibsə) baxın.</translation>
 <translation id="4409697491990005945">Kənar boşluqlar</translation>
@@ -3711,6 +3720,7 @@
 <translation id="4579453506923101210">Qoşulmuş telefonu unudun</translation>
 <translation id="4579581181964204535"><ph name="HOST_NAME" /> hostunu yayımlamaq mümkün olmadı.</translation>
 <translation id="4579876313423027742">Brauzer bildirişləri üçün <ph name="LINK_BEGIN" />Chrome brauzer Ayarlarına<ph name="LINK_END" /> keçin</translation>
+<translation id="4580596421317071374">Parollar bu cihazda <ph name="GOOGLE_PASSWORD_MANAGER" /> bölməsində saxlanılır.</translation>
 <translation id="4581774856936278355">Linux bərpa edilərkən xəta baş verdi</translation>
 <translation id="4582297591746054421">Saytlar adətən kopyaladığınız mətnin formatını saxlamaq kimi xüsusiyyətlər üçün mübadilə buferinizi oxuyur</translation>
 <translation id="4582563038311694664">Bütün ayarları sıfırlayın</translation>
@@ -3883,6 +3893,7 @@
 <translation id="4761104368405085019">Mikrofon işlədin</translation>
 <translation id="4762718786438001384">Cihaz disk yaddaşı çox azdır</translation>
 <translation id="4763408175235639573">Bu səhifəyə baxdığınız zaman aşağıdakı kukilər ayarlandı</translation>
+<translation id="4765524037138975789">{MONTHS,plural, =1{Bu cihaz 1 ay saxlanacaq və növbəti dəfə kod olmadan qoşula bilərsiniz. Bu, administratorunuz tərəfindən ayarlanıb.}other{Bu cihaz {MONTHS} ay saxlanacaq və növbəti dəfə kod olmadan qoşula bilərsiniz. Bu, administratorunuz tərəfindən ayarlanıb.}}</translation>
 <translation id="4765582662863429759">Android Mesajın telefonunuzdan Chromebook'a mesaj ötürməsinə icazə verir</translation>
 <translation id="4768332406694066911">Bu təşkilatlardan Sizi tanıdacaq sertifikatlarınız var</translation>
 <translation id="4770119228883592393">İcazə tələb edilib, cavablandırmaq üçün ⌘ + Seçim + Aşağı ox düyməsini basın</translation>
@@ -4497,6 +4508,7 @@
 <translation id="5398497406011404839">Gizli əlfəcinlər</translation>
 <translation id="5398572795982417028">Həddindən çox səhifə istinadı, limit <ph name="MAXIMUM_PAGE" /> qədərdir</translation>
 <translation id="5401426944298678474">Saytı İzləməyin</translation>
+<translation id="5401851137404501592">Davam etmək üçün <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ad, e-poçt ünvanı və profil şəklinizi bu sayt ilə paylaşacaq.</translation>
 <translation id="5402815541704507626">Mobil data istifadə edərək güncəlləmə endirin</translation>
 <translation id="540296380408672091"><ph name="HOST" /> saytında kukiləri həmişə blok edin</translation>
 <translation id="5404740137318486384">Keçirici və ya klaviatura düyməsinə basaraq onu “<ph name="ACTION" />” əməliyyatına təyin edin.
@@ -5350,6 +5362,7 @@
 <translation id="6250186368828697007">Ekranınızı paylaşdığınız zaman detallar gizlədilir</translation>
 <translation id="6251870443722440887">GDI dəstəkləri</translation>
 <translation id="625369703868467034">Şəbəkə Vəziyyəti</translation>
+<translation id="6253801023880399036">Parollar burada saxlanılır: <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation>
 <translation id="6254503684448816922">Açar Kompromisi</translation>
 <translation id="6254892857036829079">Mükəmməl</translation>
 <translation id="6257602895346497974">Sinxronizasiyanı aktiv edin...</translation>
@@ -6374,6 +6387,7 @@
 <translation id="7282547042039404307">Problemsiz</translation>
 <translation id="7282992757463864530">Məlumat paneli</translation>
 <translation id="7283555985781738399">Qonaq rejimi</translation>
+<translation id="7284307451964417957">{DAYS,plural, =1{Bu cihaz 1 gün saxlanacaq və növbəti dəfə kod olmadan qoşula bilərsiniz. Bu, administratorunuz tərəfindən ayarlanıb.}other{Bu cihaz {DAYS} gün saxlanacaq və növbəti dəfə kod olmadan qoşula bilərsiniz. Bu, administratorunuz tərəfindən ayarlanıb.}}</translation>
 <translation id="7284411326658527427">Hər bir şəxs öz hesabını fərdiləşdirə və datanı məxfi saxlaya bilər.</translation>
 <translation id="7287143125007575591">Giriş rədd edildi.</translation>
 <translation id="7287411021188441799">Defolt arxa fonu bərpa edin</translation>
@@ -6578,6 +6592,7 @@
 <translation id="7488682689406685343">Bu sayt təhlükəli bildirişlərə icazə verməniz üçün sizi cəlb etmiş ola bilər.</translation>
 <translation id="7489761397368794366">Cihazınızdan zəng</translation>
 <translation id="749028671485790643">Şəxs <ph name="VALUE" /></translation>
+<translation id="7490683549040131791">Qalan Parolları Yoxlayın</translation>
 <translation id="7491962110804786152">tab</translation>
 <translation id="7491963308094506985">{NUM_COOKIES,plural, =1{1 kuki}other{{NUM_COOKIES} kuki}}</translation>
 <translation id="7493386493263658176"><ph name="EXTENSION_NAME" /> artırması parol və kredit kart nömrələri kimi şəxsi data daxil olmaqla yazdığınız bütün mətni toplaya bilər. Bu artırmanı istifadə etmək istəyirsiniz?</translation>
@@ -7468,6 +7483,7 @@
 <translation id="8335587457941836791">Buferdən çıxarın</translation>
 <translation id="8336407002559723354">Güncəlləmələr <ph name="MONTH_AND_YEAR" /> tarixində bitir</translation>
 <translation id="8336739000755212683">Cihazın hesab şəklini dəyişin</translation>
+<translation id="8337020675372081178">{HOURS,plural, =1{Bu cihaz 1 saat saxlanacaq və növbəti dəfə kod olmadan qoşula bilərsiniz. Bu, administratorunuz tərəfindən ayarlanıb.}other{Bu cihaz {HOURS} saat saxlanacaq və növbəti dəfə kod olmadan qoşula bilərsiniz. Bu, administratorunuz tərəfindən ayarlanıb.}}</translation>
 <translation id="8337047789441383384">Artıq bu təhlükəsizlik açarını qeydiyyatdan keçirmisiniz. Onu yenidən qeydiyyatdan keçirməyə ehtiyac yoxdur.</translation>
 <translation id="8338952601723052325">Developer veb saytı</translation>
 <translation id="8339059274628563283"><ph name="SITE" /> yerli saxlanılan data</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb
index d96bbe0..d6eb3f2 100644
--- a/chrome/app/resources/generated_resources_bs.xtb
+++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -3794,6 +3794,7 @@
 <translation id="4648491805942548247">Nedovoljno odobrenja</translation>
 <translation id="4650591383426000695">Prekinite povezanost telefona i uređaja <ph name="DEVICE_TYPE" /></translation>
 <translation id="4651484272688821107">Nije moguće učitati online komponentu pomoću resursa u načinu rada za demonstraciju.</translation>
+<translation id="4651921906638302153">Ne možete se prijaviti tim računom</translation>
 <translation id="4652935475563630866">Da promijenite postavku kamere, potrebno je ponovo pokrenuti Parallels Desktop. Ponovo pokrenite Parallels Desktop da nastavite.</translation>
 <translation id="4653405415038586100">Greška prilikom konfiguriranja Linuxa</translation>
 <translation id="465406513924180949">Prikazuju vam se kolica pomoću kojih ćete se lakše vratiti na artikle koji su vam ostali u kolicima za kupovinu na webu.
@@ -5450,6 +5451,7 @@
 <translation id="6327785803543103246">Automatsko otkrivanje web proksi servera</translation>
 <translation id="6331818708794917058">Web lokacije mogu tražiti da se povežu s MIDI uređajima</translation>
 <translation id="6333064448949140209">Fajl će se poslati Googleu radi otklanjanje grešaka</translation>
+<translation id="6333170995003625229">Vaša e-adresa ili zaporka nije se mogla potvrditi. Ponovo se pokušajte prijaviti.</translation>
 <translation id="6335920438823100346">Da pokrenete Linux, <ph name="MANAGER" /> zahtijeva da napravite sigurnosnu kopiju podataka i vratite ovaj Chromebook na fabričke postavke.</translation>
 <translation id="6336038146639916978">Domena <ph name="MANAGER" /> je onemogućila otklanjanje grešaka putem ADB-a. Ovim će se <ph name="DEVICE_TYPE" /> vratiti na zadano za 24 sata. Napravite kopiju svih fajlova koje želite sačuvati.</translation>
 <translation id="6338981933082930623">Sve web lokacije vam mogu prikazivati bilo koje oglase</translation>
@@ -5862,6 +5864,7 @@
 <translation id="6735304988756581115">Prikaži kolačiće i druge podatke o web lokaciji...</translation>
 <translation id="6736243959894955139">Adresa</translation>
 <translation id="6737663862851963468">Ukloni tiket za Kerberos</translation>
+<translation id="6738430949033571771">Potvrđivanje računa...</translation>
 <translation id="6739923123728562974">Prikaži prečicu na radnoj površini</translation>
 <translation id="6740234557573873150">Pauziran je fajl <ph name="FILE_NAME" /></translation>
 <translation id="6741063444351041466"><ph name="BEGIN_LINK" />Vaš administrator<ph name="END_LINK" /> je isključio Sigurno pregledanje</translation>
@@ -7681,6 +7684,8 @@
 <translation id="8546306075665861288">Keš memorija slike</translation>
 <translation id="8546930481464505581">Prilagodite traku za dodir</translation>
 <translation id="8547013269961688403">Omogući povećalo za cijeli ekran</translation>
+<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" />Računom <ph name="USER_EMAIL" /> upravlja <ph name="MANAGER" />. Tu e-adresu ne možete dodati kao dodatni račun.<ph name="END_PARAGRAPH1" />
+    <ph name="BEGIN_PARAGRAPH2" />Da biste koristili <ph name="USER_EMAIL" />, najprije se odjavite s uređaja <ph name="DEVICE_TYPE" />. Zatim pri dnu zaslona za prijavu odaberite Dodaj osobu.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="85486688517848470">Držite tipku za pretraživanje da promijenite ponašanje tipki u gornjem redu</translation>
 <translation id="8549316893834449916">Koristit ćete svoj Google račun da se prijavite na Chromebook – isti račun koji koristite za Gmail, Disk, YouTube i druge usluge.</translation>
 <translation id="8551388862522347954">Licence</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 17efcf4..eb1f3fc7 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -8089,7 +8089,7 @@
 <translation id="89720367119469899">Esc</translation>
 <translation id="8972513834460200407">Consulta al administrador de tu red para asegurarte de que el cortafuegos no está bloqueando las descargas procedentes de los servidores de Google.</translation>
 <translation id="8973557916016709913">Quitar el nivel de zoom</translation>
-<translation id="8973596347849323817">Personaliza este dispositivo para adaptarlo a tus necesidades. Puedes modificar las funciones de accesibilidad más tarde en Configuración.</translation>
+<translation id="8973596347849323817">Puedes personalizar este dispositivo para adaptarlo a tus necesidades. Estas funciones de accesibilidad se pueden cambiar más tarde en Configuración.</translation>
 <translation id="897414447285476047">El archivo de destino está incompleto debido a un problema relacionado con la conexión.</translation>
 <translation id="897525204902889653">Servicio de cuarentena</translation>
 <translation id="8975396729541388937">Puedes cancelar la suscripción en cualquier momento haciendo clic en el enlace de los correos que recibas.</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 7966cd68..cea791f 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -3786,6 +3786,7 @@
 <translation id="4648491805942548247">Ebapiisav luba</translation>
 <translation id="4650591383426000695">Katkestage telefoni ja seadme <ph name="DEVICE_TYPE" /> ühendus</translation>
 <translation id="4651484272688821107">Demorežiimi ressurssidega veebipõhist komponenti ei saanud laadida.</translation>
+<translation id="4651921906638302153">Selle kontoga ei saa sisse logida</translation>
 <translation id="4652935475563630866">Kaamera seade muudatuse jõustumiseks tuleb Parallels Desktop uuesti käivitada. Jätkamiseks käivitage Parallels Desktop uuesti.</translation>
 <translation id="4653405415038586100">Viga Linuxi seadistamisel</translation>
 <translation id="465406513924180949">Näete kaarte, mis aitavad teil hõlpsalt naasta üksuste juurde, mille veebis ostukorvidesse jätsite.
@@ -5442,6 +5443,7 @@
 <translation id="6327785803543103246">Veebipõhise puhverserveri automaattuvastamine</translation>
 <translation id="6331818708794917058">Saidid saavad küsida luba MIDI-seadmetega ühenduse loomiseks</translation>
 <translation id="6333064448949140209">Fail saadetakse silumiseks Google'ile</translation>
+<translation id="6333170995003625229">Teie e-posti aadressi või parooli ei saanud kinnitada. Proovige uuesti sisse logida.</translation>
 <translation id="6335920438823100346">Linuxi käivitamiseks nõuab <ph name="MANAGER" />, et varundaksite oma andmed ja lähtestaksite selle Chromebooki tehaseseadetele.</translation>
 <translation id="6336038146639916978"><ph name="MANAGER" /> keelas ADB silumise. See lähtestab 24 tunni jooksul teie seadme <ph name="DEVICE_TYPE" />. Varundage kõik failid, mille soovite säilitada.</translation>
 <translation id="6338981933082930623">Kõik saidid saavad teile kuvada mis tahes reklaame</translation>
@@ -5850,6 +5852,7 @@
 <translation id="6735304988756581115">Kuva küpsisefaile ja muid saidi andmeid...</translation>
 <translation id="6736243959894955139">Aadress</translation>
 <translation id="6737663862851963468">Kerberose pileti eemaldamine</translation>
+<translation id="6738430949033571771">Konto kinnitamine …</translation>
 <translation id="6739923123728562974">Kuva töölaua otsetee</translation>
 <translation id="6740234557573873150">Peatati fail <ph name="FILE_NAME" /></translation>
 <translation id="6741063444351041466"><ph name="BEGIN_LINK" />Administraator<ph name="END_LINK" /> lülitas Google'i ohutu sirvimise välja</translation>
@@ -7669,6 +7672,8 @@
 <translation id="8546306075665861288">Kujutise vahemälu</translation>
 <translation id="8546930481464505581">Puuteriba kohandamine</translation>
 <translation id="8547013269961688403">Luba täisekraani luup</translation>
+<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" />Kontot <ph name="USER_EMAIL" /> haldab <ph name="MANAGER" />. Te ei saa seda e-posti aadressi lisakontona lisada.<ph name="END_PARAGRAPH1" />
+    <ph name="BEGIN_PARAGRAPH2" />Konto <ph name="USER_EMAIL" /> kasutamiseks logige kõigepealt välja oma seadmest <ph name="DEVICE_TYPE" />. Seejärel tehke sisselogimiskuva allosas valik Lisa inimene.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="85486688517848470">Ülemise rea klahvide toimingu vahetamiseks hoidke all otsinguklahvi</translation>
 <translation id="8549316893834449916">Chromebooki sisselogimiseks kasutate oma Google'i kontot – sama kontot, mida kasutate Gmaili, Drive'i, YouTube'i ja muude jaoks.</translation>
 <translation id="8551388862522347954">Litsentsid</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 71cb421..14263dee 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -89,6 +89,9 @@
 <translation id="1082214733466244292">Na-block ng iyong administrator ang ilang functionality para sa device na ito</translation>
 <translation id="1082398631555931481">Gustong ibalik ng <ph name="THIRD_PARTY_TOOL_NAME" /> ang mga setting ng iyong Chrome sa mga orihinal na default ng mga ito. Kapag isinagawa mo ito, mare-reset ang iyong home page, page ng bagong tab at search engine, madi-disable ang iyong mga extension at maa-unpin ang lahat ng tab. Maki-clear din nito ang iba pang pansamantala at naka-cache na data, gaya ng cookies, content at data ng site.</translation>
 <translation id="1084096383128641877">Kapag inalis ang password na ito, hindi ide-delete ang iyong account sa <ph name="DOMAIN" />. Palitan ang iyong password o i-delete ang account mo sa <ph name="DOMAIN_LINK" /> para mapanatili itong ligtas mula sa iba.</translation>
+<translation id="1084288067399862432">Napalitan ang nakompromisong password.
+
+Suriin ang iyong mga password anumang oras sa <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation>
 <translation id="1084824384139382525">Kopyahin ang addr&amp;ess ng link</translation>
 <translation id="1085064499066015002">Palagi sa lahat ng site</translation>
 <translation id="1085697365578766383">Nagkaroon ng error sa pagpapagana sa virtual machine. Pakisubukang muli.</translation>
@@ -1694,6 +1697,7 @@
 <translation id="2554553592469060349">Masyadong malaki ang napiling file (max na laki: 3mb).</translation>
 <translation id="2558569818338050235">Naaapektuhan ng iyong history ng pag-browse ang mga ad na nakikita mo</translation>
 <translation id="2558896001721082624">Ipakita ang mga opsyon sa accessibility sa menu ng system</translation>
+<translation id="2559889124253841528">I-save sa Device</translation>
 <translation id="2564520396658920462">Na-off ang pagpapatupad ng JavaScript sa pamamagitan ng AppleScript. Para i-on ito, mula sa menu bar, pumunta sa Tingnan &gt; Developer &gt; Payagan ang JavaScript mula sa Mga Event ng Apple. Para sa higit pang impormasyon: https://support.google.com/chrome/?p=applescript</translation>
 <translation id="2564653188463346023">Pinahusay na pang-check ng pagbabaybay</translation>
 <translation id="2568774940984945469">Infobar Container</translation>
@@ -1704,6 +1708,7 @@
 <translation id="2575247648642144396">Makikita ang icon na ito kapag makakakilos ang extension sa kasalukuyang pahina. Gamitin ang extension na ito sa pamamagitan ng pag-click sa icon o sa pamamagitan ng pagpindot sa <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2575407791320728464">Invalid na URL. Tiyaking naka-format ito nang maayos.</translation>
 <translation id="2575441894380764255">Hindi pinapayagang magpakita ng mga nakakasagabal o nakakapanlinlang na ad</translation>
+<translation id="2575713839157415345">{YEARS,plural, =1{Ise-save ang device na ito sa loob ng 1 taon at puwede kang kumonekta nang walang code sa susunod na pagkakataon. Itatakda ito ng iyong administrator.}one{Ise-save ang device na ito sa loob ng {YEARS} taon at puwede kang kumonekta nang walang code sa susunod na pagkakataon. Itatakda ito ng iyong administrator.}other{Ise-save ang device na ito sa loob ng {YEARS} na taon at puwede kang kumonekta nang walang code sa susunod na pagkakataon. Itatakda ito ng iyong administrator.}}</translation>
 <translation id="257779572837908839">I-set up bilang Chromebox for meetings</translation>
 <translation id="2580889980133367162">Palaging payagan ang <ph name="HOST" /> na mag-download ng maraming file</translation>
 <translation id="258095186877893873">Matagal</translation>
@@ -3002,6 +3007,7 @@
 <translation id="3856800405688283469">Pumili ng timezone</translation>
 <translation id="3857807444929313943">Iangat, pagkatapos ay pindutin muli</translation>
 <translation id="3858860766373142691">Pangalan</translation>
+<translation id="385939467708172187">Gumamit ng Malakas na Password</translation>
 <translation id="3861638017150647085">Hindi available ang username na "<ph name="USERNAME" />"</translation>
 <translation id="3861977424605124250">Ipakita sa startup</translation>
 <translation id="386239283124269513">&amp;I-restore ang Grupo</translation>
@@ -3245,6 +3251,7 @@
 <translation id="4089235344645910861">Na-save ang mga setting. Nasimulan ang pag-sync.</translation>
 <translation id="4090103403438682346">I-enable ang Bine-verify na Access</translation>
 <translation id="4090947011087001172">I-reset ang mga pahintulot sa site para sa <ph name="SITE" />?</translation>
+<translation id="4092636882861724179">Puwede mong tingnan at pamahalaan ang mga naka-save na password sa <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation>
 <translation id="4093865285251893588">Larawan sa profile</translation>
 <translation id="4093955363990068916">Lokal na file:</translation>
 <translation id="4094647278880271855">Gumagamit ka ng hindi sinusuportahang variable ng environment: <ph name="BAD_VAR" />. Magkakaproblema sa stability at seguridad.</translation>
@@ -3535,6 +3542,7 @@
 <translation id="4392896746540753732">I-edit ang file ng configuration</translation>
 <translation id="4394049700291259645">Huwag paganahin</translation>
 <translation id="4396956294839002702">{COUNT,plural, =0{&amp;Buksan lahat}=1{&amp;Buksan ang bookmark}one{&amp;Buksan lahat ({COUNT})}other{&amp;Buksan lahat ({COUNT})}}</translation>
+<translation id="4397372003838952832">Hindi mo kailangang tandaan ang password na ito. Mase-save ito sa <ph name="GOOGLE_PASSWORD_MANAGER" /> para sa <ph name="EMAIL" />.</translation>
 <translation id="439817266247065935">Hindi na-shut down nang tama ang iyong device. I-restart ang Linux para magamit ang mga Linux app.</translation>
 <translation id="4400367121200150367">Lalabas dito ang mga site na hindi kailanman nagse-save ng mga password</translation>
 <translation id="4400632832271803360">Pindutin nang matagal ang key ng Launcher upang mapalitan ang gawi ng mga key sa itaas na row</translation>
@@ -3548,6 +3556,7 @@
 <translation id="4405117686468554883">*.jpeg, *.jpg, at *.png</translation>
 <translation id="440653823335387109">MGA PAGE NA NABASA MO NA</translation>
 <translation id="4406883609789734330">Instant Caption</translation>
+<translation id="4407039574263172582">Para magpatuloy, ibabahagi ng <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ang iyong pangalan, email address, at larawan sa profile sa site na ito. Tingnan ang <ph name="BEGIN_LINK" />mga tuntunin ng serbisyo<ph name="END_LINK" /> ng site na ito.</translation>
 <translation id="4408599188496843485">T&amp;ulong</translation>
 <translation id="4409271659088619928"><ph name="DSE" /> ang iyong search engine. Tingnan ang mga tagubilin nito para sa pag-delete sa iyong history ng paghahanap, kung naaangkop.</translation>
 <translation id="4409697491990005945">Mga Margin</translation>
@@ -3732,6 +3741,7 @@
 <translation id="4579453506923101210">Kalimutan ang nakakonektang telepono</translation>
 <translation id="4579581181964204535">Hindi ma-cast ang <ph name="HOST_NAME" />.</translation>
 <translation id="4579876313423027742">Para sa mga notification ng browser, pumunta sa <ph name="LINK_BEGIN" />Mga Setting ng Chrome browser<ph name="LINK_END" /></translation>
+<translation id="4580596421317071374">Sine-save ang mga password sa <ph name="GOOGLE_PASSWORD_MANAGER" /> sa device na ito.</translation>
 <translation id="4581774856936278355">Error habang nire-restore ang Linux</translation>
 <translation id="4582297591746054421">Karaniwang binabasa ng mga site ang iyong clipboard para sa mga feature gaya ng pagpapanatili ng pag-format ng text na kinopya mo</translation>
 <translation id="4582563038311694664">I-reset lahat ng setting</translation>
@@ -3904,6 +3914,7 @@
 <translation id="4761104368405085019">Gamitin ang iyong mikropono</translation>
 <translation id="4762718786438001384">Sobrang kaunti na lang ang espasyo sa disk ng device</translation>
 <translation id="4763408175235639573">Itinakda ang sumusunod na cookies noong tiningnan mo ang page na ito</translation>
+<translation id="4765524037138975789">{MONTHS,plural, =1{Ise-save ang device na ito sa loob ng 1 buwan at puwede kang kumonekta nang walang code sa susunod na pagkakataon. Itatakda ito ng iyong administrator.}one{Ise-save ang device na ito sa loob ng {MONTHS} buwan at puwede kang kumonekta nang walang code sa susunod na pagkakataon. Itatakda ito ng iyong administrator.}other{Ise-save ang device na ito sa loob ng {MONTHS} na buwan at puwede kang kumonekta nang walang code sa susunod na pagkakataon. Itatakda ito ng iyong administrator.}}</translation>
 <translation id="4765582662863429759">Binibigyang-daan ang Android Messages na mag-relay ng mga text mula sa iyong telepono papunta sa Chromebook mo</translation>
 <translation id="4768332406694066911">Mayroon kang mga certificate mula sa mga organisasyong ito na tutukoy sa iyo</translation>
 <translation id="4770119228883592393">Humiling ng pahintulot, pindutin ang ⌘ + Option + Pababang arrow para tumugon</translation>
@@ -4518,6 +4529,7 @@
 <translation id="5398497406011404839">Mga nakatagong bookmark</translation>
 <translation id="5398572795982417028">Lampas sa hangganan ang tinukoy na page, ang limitasyon ay <ph name="MAXIMUM_PAGE" /></translation>
 <translation id="5401426944298678474">Huwag Nang Subaybayan ang Site</translation>
+<translation id="5401851137404501592">Para magpatuloy, ibabahagi ng <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ang iyong pangalan, email address, at larawan sa profile sa site na ito.</translation>
 <translation id="5402815541704507626">I-download ang update gamit ang mobile data</translation>
 <translation id="540296380408672091">Laging i-block ang cookies sa <ph name="HOST" /></translation>
 <translation id="5404740137318486384">Pumindot ng switch o key sa keyboard para italaga ito sa “<ph name="ACTION" />.”
@@ -5373,6 +5385,7 @@
 <translation id="6250186368828697007">Nakatago ang mga detalye habang ibinabahagi mo ang iyong screen</translation>
 <translation id="6251870443722440887">Mga GDI handle</translation>
 <translation id="625369703868467034">Kalagayan ng Network</translation>
+<translation id="6253801023880399036">Sine-save ang mga password sa <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation>
 <translation id="6254503684448816922">Kompromisong Key</translation>
 <translation id="6254892857036829079">Perfect</translation>
 <translation id="6257602895346497974">I-on ang pag-sync...</translation>
@@ -6399,6 +6412,7 @@
 <translation id="7282547042039404307">Pantay</translation>
 <translation id="7282992757463864530">Infobar</translation>
 <translation id="7283555985781738399">Guest mode</translation>
+<translation id="7284307451964417957">{DAYS,plural, =1{Ise-save ang device na ito sa loob ng 1 araw at puwede kang kumonekta nang walang code sa susunod na pagkakataon. Itatakda ito ng iyong administrator.}one{Ise-save ang device na ito sa loob ng {DAYS} araw at puwede kang kumonekta nang walang code sa susunod na pagkakataon. Itatakda ito ng iyong administrator.}other{Ise-save ang device na ito sa loob ng {DAYS} na araw at puwede kang kumonekta nang walang code sa susunod na pagkakataon. Itatakda ito ng iyong administrator.}}</translation>
 <translation id="7284411326658527427">Magagawa ng bawat taong i-personalize ang kanyang account at panatilihing pribado ang data.</translation>
 <translation id="7287143125007575591">Tinanggihan ang access.</translation>
 <translation id="7287411021188441799">I-restore ang default na background</translation>
@@ -6603,6 +6617,7 @@
 <translation id="7488682689406685343">Posibleng sinusubukan kang linlangin ng site na ito para payagan ang mga nakakasagabal na notification.</translation>
 <translation id="7489761397368794366">Tumawag mula sa iyong device</translation>
 <translation id="749028671485790643">Tao <ph name="VALUE" /></translation>
+<translation id="7490683549040131791">Suriin ang Mga Natitirang Password</translation>
 <translation id="7491962110804786152">tab</translation>
 <translation id="7491963308094506985">{NUM_COOKIES,plural, =1{1 cookie}one{{NUM_COOKIES} cookies}other{{NUM_COOKIES} na cookies}}</translation>
 <translation id="7493386493263658176">Maaaring kolektahin ng extension ng <ph name="EXTENSION_NAME" /> ang lahat ng text na ita-type mo, kabilang ang personal na data tulad ng mga password at numero ng credit card. Gusto mo bang gamitin ang extension na ito?</translation>
@@ -7495,6 +7510,7 @@
 <translation id="8335587457941836791">I-unpin mula sa shelf</translation>
 <translation id="8336407002559723354">Matatapos ang mga pag-update sa <ph name="MONTH_AND_YEAR" /></translation>
 <translation id="8336739000755212683">Baguhin ang larawan ng account ng device</translation>
+<translation id="8337020675372081178">{HOURS,plural, =1{Ise-save ang device na ito sa loob ng 1 oras at puwede kang kumonekta nang walang code sa susunod na pagkakataon. Itatakda ito ng iyong administrator.}one{Ise-save ang device na ito sa loob ng {HOURS} oras at puwede kang kumonekta nang walang code sa susunod na pagkakataon. Itatakda ito ng iyong administrator.}other{Ise-save ang device na ito sa loob ng {HOURS} na oras at puwede kang kumonekta nang walang code sa susunod na pagkakataon. Itatakda ito ng iyong administrator.}}</translation>
 <translation id="8337047789441383384">Naiparehistro mo na ang security key na ito. Hindi mo na ito kailangang muling iparehistro.</translation>
 <translation id="8338952601723052325">Website ng developer</translation>
 <translation id="8339059274628563283">Lokal na naka-store na data ng <ph name="SITE" /></translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index 02cf623ae..744c9ed 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -3783,6 +3783,7 @@
 <translation id="4648491805942548247">Nedovoljne dozvole</translation>
 <translation id="4650591383426000695">Prekinite vezu između svog telefona i uređaja <ph name="DEVICE_TYPE" /></translation>
 <translation id="4651484272688821107">Nije uspjelo učitavanje online komponente s resursima demo načina.</translation>
+<translation id="4651921906638302153">Ne možete se prijaviti tim računom</translation>
 <translation id="4652935475563630866">Za promjenu postavke fotoaparata potrebno je ponovno pokrenuti Parallels Desktop. Ponovo pokrenite Parallels Desktop da biste nastavili.</translation>
 <translation id="4653405415038586100">Pogreška prilikom konfiguriranja Linuxa</translation>
 <translation id="465406513924180949">Prikazuju vam se košarice pomoću kojih se možete lako vratiti na artikle koje ste ostavili u košaricama na webu.
@@ -5436,6 +5437,7 @@
 <translation id="6327785803543103246">Automatsko otkrivanje putem web-proxyja</translation>
 <translation id="6331818708794917058">Web-lokacije mogu tražiti dopuštenje za povezivanje s MIDI uređajima</translation>
 <translation id="6333064448949140209">Datoteka će se poslati Googleu radi uklanjanja pogrešaka</translation>
+<translation id="6333170995003625229">Vaša e-adresa ili zaporka nije se mogla potvrditi. Ponovo se pokušajte prijaviti.</translation>
 <translation id="6335920438823100346">Da biste pokrenuli Linux, <ph name="MANAGER" /> zahtijeva da sigurnosno kopirate svoje podatke i vratite ovaj Chromebook na tvorničke postavke.</translation>
 <translation id="6336038146639916978">Domena <ph name="MANAGER" /> onemogućila je ADB otklanjanje pogrešaka. Zbog toga će se uređaj <ph name="DEVICE_TYPE" /> vratiti na zadano za 24 sata. Sigurnosno kopirajte sve datoteke koje želite zadržati.</translation>
 <translation id="6338981933082930623">Sve vam web-lokacije mogu prikazivati bilo kakve oglase</translation>
@@ -5848,6 +5850,7 @@
 <translation id="6735304988756581115">Prikaži kolačiće i ostale podatke o web-lokaciji...</translation>
 <translation id="6736243959894955139">Adresa</translation>
 <translation id="6737663862851963468">Uklanjanje Kerberosovog tiketa</translation>
+<translation id="6738430949033571771">Potvrđivanje računa...</translation>
 <translation id="6739923123728562974">Prikaži prečac na radnoj površini</translation>
 <translation id="6740234557573873150">Dokument <ph name="FILE_NAME" /> pauziran</translation>
 <translation id="6741063444351041466"><ph name="BEGIN_LINK" />Vaš administrator<ph name="END_LINK" /> isključio je Sigurno pregledavanje</translation>
@@ -7666,6 +7669,8 @@
 <translation id="8546306075665861288">Predmemorija slike</translation>
 <translation id="8546930481464505581">Prilagodba dodirne trake</translation>
 <translation id="8547013269961688403">Omogući povećalo za cijeli zaslon</translation>
+<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" />Računom <ph name="USER_EMAIL" /> upravlja <ph name="MANAGER" />. Tu e-adresu ne možete dodati kao dodatni račun.<ph name="END_PARAGRAPH1" />
+    <ph name="BEGIN_PARAGRAPH2" />Da biste koristili <ph name="USER_EMAIL" />, najprije se odjavite s uređaja <ph name="DEVICE_TYPE" />. Zatim pri dnu zaslona za prijavu odaberite Dodaj osobu.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="85486688517848470">Držite tipku Pretraživanje da biste izmjenjivali ponašanje tipki u najvišem retku</translation>
 <translation id="8549316893834449916">Na Chromebook se prijavljujete svojim Google računom – istim računom koji upotrebljavate za Gmail, Disk, YouTube itd.</translation>
 <translation id="8551388862522347954">Licence</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index f18a5de..1ebd17a 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -3769,6 +3769,7 @@
 <translation id="4648491805942548247">十分な権限がありません</translation>
 <translation id="4650591383426000695">スマートフォンを <ph name="DEVICE_TYPE" /> から切断します</translation>
 <translation id="4651484272688821107">デモモード リソースでオンライン コンポーネントを読み込めませんでした。</translation>
+<translation id="4651921906638302153">このアカウントではログインできません</translation>
 <translation id="4652935475563630866">カメラの設定を変更するには、Parallels Desktop を再起動する必要があります。続行するには、Parallels Desktop を再起動してください。</translation>
 <translation id="4653405415038586100">Linux の設定中にエラーが発生しました</translation>
 <translation id="465406513924180949">ウェブ上でショッピング カートに入れた商品に簡単にアクセスできるよう、カートが表示されています。
@@ -5419,6 +5420,7 @@
 <translation id="6327785803543103246">ウェブプロキシ自動検出</translation>
 <translation id="6331818708794917058">サイトが MIDI デバイスへの接続を要求できるようにする</translation>
 <translation id="6333064448949140209">ファイルはデバッグのため Google に送信されます</translation>
+<translation id="6333170995003625229">メールアドレスまたはパスワードを確認できませんでした。もう一度ログインしてみてください。</translation>
 <translation id="6335920438823100346">Linux を起動するため、<ph name="MANAGER" /> がデータをバックアップし、この Chromebook を初期状態にリセットするよう求めています。</translation>
 <translation id="6336038146639916978"><ph name="MANAGER" /> により ADB デバッグが無効になりました。<ph name="DEVICE_TYPE" /> は 24 時間以内にリセットされます。必要なファイルがあればバックアップしてください。</translation>
 <translation id="6338981933082930623">すべてのサイトであらゆる広告を表示できるようにする</translation>
@@ -5826,6 +5828,7 @@
 <translation id="6735304988756581115">Cookie と他のサイトのデータを表示...</translation>
 <translation id="6736243959894955139">アドレス</translation>
 <translation id="6737663862851963468">Kerberos チケットの削除</translation>
+<translation id="6738430949033571771">アカウントを確認しています...</translation>
 <translation id="6739923123728562974">デスクトップ ショートカットを表示</translation>
 <translation id="6740234557573873150"><ph name="FILE_NAME" /> を一時停止しました</translation>
 <translation id="6741063444351041466"><ph name="BEGIN_LINK" />管理者<ph name="END_LINK" />がセーフ ブラウジングをオフにしました</translation>
@@ -7641,6 +7644,8 @@
 <translation id="8546306075665861288">画像キャッシュ</translation>
 <translation id="8546930481464505581">Touch Bar をカスタマイズ</translation>
 <translation id="8547013269961688403">全画面拡大鏡を有効にする</translation>
+<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> は <ph name="MANAGER" /> により管理されています。このメールアドレスを追加アカウントとして設定することはできません。<ph name="END_PARAGRAPH1" />
+    <ph name="BEGIN_PARAGRAPH2" /><ph name="USER_EMAIL" /> を使用するには、まず <ph name="DEVICE_TYPE" /> にログインします。次に、ログイン画面の一番下にある [ユーザーを追加] を選択します。<ph name="END_PARAGRAPH2" /></translation>
 <translation id="85486688517848470">キーボードの最上段にあるキーの動作を切り替えるには、検索キーを押したままにします</translation>
 <translation id="8549316893834449916">Chromebook には Google アカウント(Gmail、ドライブ、YouTube などで使用しているのと同じアカウント)を使用してログインします。</translation>
 <translation id="8551388862522347954">ライセンス</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb
index 32bbf45..de289f5 100644
--- a/chrome/app/resources/generated_resources_ka.xtb
+++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -89,6 +89,9 @@
 <translation id="1082214733466244292">თქვენმა ადმინისტრატორმა დაბლოკა ზოგიერთი ფუნქცია ამ მოწყობილობისთვის</translation>
 <translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" />-ს სურს თქვენი პარამეტრების საწყის მნიშვნელობებზე დაბრუნდება. ეს მოქმედება გადააყენებს თქვენს მთავარ გვერდს, ახალი ჩანართის გვერდსა და საძიებო სისტემას, ასევე გაითიშება გაფართოებები და მოიხსენება ყველა ჩანართის ჩამაგრება. ეს მოქმედება გაასუფთავებს სხვა დროებით და ქეშირებულ მონაცემებსაც, როგორიცაა ქუქი-ჩანაწერები, კონტენტი და საიტების მონაცემები.</translation>
 <translation id="1084096383128641877">ამ პაროლის ამოშლის შემთხვევაში თქვენი ანგარიში <ph name="DOMAIN" />-ზე არ წაიშლება. თქვენი პაროლი სხვის ხელში რომ არ აღმოჩნდეს, შეცვალეთ ან წაშალეთ ის <ph name="DOMAIN_LINK" />-ზე.</translation>
+<translation id="1084288067399862432">გატეხილი პაროლები წარმატებით შეიცვალა.
+
+პაროლების ნებისმიერ დროს შესამოწმებლად მოინახულეთ <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation>
 <translation id="1084824384139382525">&amp;მისამართების ბმულების კოპირება</translation>
 <translation id="1085064499066015002">ყოველთვის ყველა საიტზე</translation>
 <translation id="1085697365578766383">ვირტუალური მოწყობილობის გაშვება ვერ ხერხდება. გთხოვთ, ცადოთ ხელახლა.</translation>
@@ -1678,6 +1681,7 @@
 <translation id="2554553592469060349">არჩეული ფაილი ძალიან დიდია (მაქს. ზომა: 3 მბ).</translation>
 <translation id="2558569818338050235">თქვენ მიერ ვების დათვალიერების ისტორია აისახება თქვენთვის ხილულ რეკლამაზე</translation>
 <translation id="2558896001721082624">სისტემის მენიუში მარტივი წვდომის ვარიანტების ყოველთვის ჩვენება</translation>
+<translation id="2559889124253841528">მოწყობილობაში შენახვა</translation>
 <translation id="2564520396658920462">AppleScript-ის მეშვეობით JavaScript-ის შესრულების ფუნქცია გამორთულია. მის ჩასართავად მენიუს ზოლიან გადადით აქ: ხედი &gt; დეველოპერი &gt; Apple-ის მოვლენებიდან JavaScript-ის დაშვება. დამატებითი ინფორმაციისთვის იხილეთ: https://support.google.com/chrome/?p=applescript</translation>
 <translation id="2564653188463346023">გაძლიერებული მართლწერის შემოწმება</translation>
 <translation id="2568774940984945469">საინფორმაციო ზოლის კონტეინერი</translation>
@@ -1688,6 +1692,7 @@
 <translation id="2575247648642144396">ეს ხატულა ხილული იქნება, როდესაც გაფართოება შეძლებს მიმდინარე გვერდზე მოქმედებას. გამოიყენეთ ეს გაფართოება ხატულაზე დაწკაპუნებით ან <ph name="EXTENSION_SHORTCUT" />-ზე დაჭერით.</translation>
 <translation id="2575407791320728464">URL არასწორია. დარწმუნდით, რომ ის სწორად არის ფორმატირებული.</translation>
 <translation id="2575441894380764255">მომაბეზრებელი ან შეცდომაში შემყვანი რეკლამის ჩვენება დაუშვებელია</translation>
+<translation id="2575713839157415345">{YEARS,plural, =1{ეს მოწყობილობა შეინახება 1 წლის განმავლობაში. შემდეგში დაკავშირება კოდის გარეშე შეგეძლებათ. აღნიშნული დადგენილია თქვენი ადმინისტრატორის მიერ.}other{ეს მოწყობილობა შეინახება {YEARS} წლის განმავლობაში. შემდეგში დაკავშირება კოდის გარეშე შეგეძლებათ. აღნიშნული დადგენილია თქვენი ადმინისტრატორის მიერ.}}</translation>
 <translation id="257779572837908839">დაყენდეს, როგორც Chromebox შეხვედრებისთვის</translation>
 <translation id="2580889980133367162">ყოველთვის დართეთ ნება <ph name="HOST" />-ს ჩამოტვირთოს რამოდენიმე ფაილი</translation>
 <translation id="258095186877893873">ხანგრძლივი</translation>
@@ -2986,6 +2991,7 @@
 <translation id="3856800405688283469">აირჩიეთ დროის სარტყელი</translation>
 <translation id="3857807444929313943">აიღეთ თითი, შემდეგ კი ხელახლა შეეხეთ</translation>
 <translation id="3858860766373142691">სახელი</translation>
+<translation id="385939467708172187">ძლიერი პაროლის გამოყენება</translation>
 <translation id="3861638017150647085">მომხმარებლის სახელი „<ph name="USERNAME" />“ მიუწვდომელია</translation>
 <translation id="3861977424605124250">გაშვებისას ჩვენება</translation>
 <translation id="386239283124269513">ჯგუფის &amp;აღდგენა</translation>
@@ -3229,6 +3235,7 @@
 <translation id="4089235344645910861">პარამეტრები შენახულია. სინქრონიზაცია დაიწყო.</translation>
 <translation id="4090103403438682346">ჩართეთ შემოწმებული წვდომა</translation>
 <translation id="4090947011087001172">გსურთ, გადააყენოთ საიტის ნებართვები <ph name="SITE" />-ისთვის?</translation>
+<translation id="4092636882861724179">შენახული პაროლების სანახავად და სამართავად მოინახულეთ <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation>
 <translation id="4093865285251893588">პროფილის სურათი</translation>
 <translation id="4093955363990068916">ლოკალური ფაილი:</translation>
 <translation id="4094647278880271855">თქვენ იყენებთ გარემოს მხარდაუჭერელ ცვლადს: <ph name="BAD_VAR" />. აღნიშნული უარყოფითად იმოქმედებს სტაბილურობასა და უსაფრთხოებაზე.</translation>
@@ -3519,6 +3526,7 @@
 <translation id="4392896746540753732">კონფიგურაციის ფაილის რედაქტირება</translation>
 <translation id="4394049700291259645">გამორთვა</translation>
 <translation id="4396956294839002702">{COUNT,plural, =0{ყველას &amp;გახსნა}=1{სანიშნეს &amp;გახსნა}other{{COUNT}-ვეს &amp;გახსნა}}</translation>
+<translation id="4397372003838952832">ამ პაროლის დამახსოვრება არ დაგჭირდებათ. მას შეინახავს <ph name="GOOGLE_PASSWORD_MANAGER" /> <ph name="EMAIL" />-ისთვის.</translation>
 <translation id="439817266247065935">თქვენი მოწყობილობა სათანადოდ არ გაითიშა. Linux აპების გამოსაყენებლად გადატვირთეთ Linux.</translation>
 <translation id="4400367121200150367">საიტები, რომლებიც არასოდეს იმახსოვრებს პაროლებს, აქ გამოჩნდება</translation>
 <translation id="4400632832271803360">ზედა მწკრივის კლავიშების რეჟიმის გადასართავად ხანგრძლივად დააჭირეთ გამშვების კლავიშს</translation>
@@ -3532,6 +3540,7 @@
 <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation>
 <translation id="440653823335387109">თქვენ მიერ წაკითხული გვერდები</translation>
 <translation id="4406883609789734330">ავტოსუბტიტრები</translation>
+<translation id="4407039574263172582">გასაგრძელებლად <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ამ საიტს გაუზიარებს თქვენს სახელს, ელფოსტის მისამართსა და პროფილის სურათს. გაეცანით ამ საიტის <ph name="BEGIN_LINK" />მომსახურების პირობებს<ph name="END_LINK" />.</translation>
 <translation id="4408599188496843485">&amp;დახმარება</translation>
 <translation id="4409271659088619928">თქვენი საძიებო სისტემაა <ph name="DSE" />. გაეცანით მის ინსტრუქციას იმის თაობაზე, როგორ წაშალოთ თქვენი ძიების ისტორია, თუ ეს შესაძლებელია.</translation>
 <translation id="4409697491990005945">მინდვრები</translation>
@@ -3715,6 +3724,7 @@
 <translation id="4579453506923101210">დაკავშირებული ტელეფონის დავიწყება</translation>
 <translation id="4579581181964204535"><ph name="HOST_NAME" /> ვერ ტრანსლირდება.</translation>
 <translation id="4579876313423027742">ბრაუზერიდან მიღებული შეტყობინებებისთვის გადადით <ph name="LINK_BEGIN" />Chrome ბრაუზერის პარამეტრებზე<ph name="LINK_END" /></translation>
+<translation id="4580596421317071374">პაროლები ინახება სექციაში „<ph name="GOOGLE_PASSWORD_MANAGER" />“ ამ მოწყობილობაზე.</translation>
 <translation id="4581774856936278355">შეცდომა Linux-ის აღდგენისას</translation>
 <translation id="4582297591746054421">როგორც წესი, საიტებს თქვენი გაცვლის ბუფერის წაკითხვა სჭირდება ისეთი ფუნქციების უზრუნველსაყოფად, როგორიცაა, მაგალითად, დაკოპირებული ტექსტის ფორმატირების შენარჩუნება</translation>
 <translation id="4582563038311694664">ყველა პარამეტრის აღდგენა</translation>
@@ -3780,6 +3790,7 @@
 <translation id="4648491805942548247">არასაკმარისი ნებართვები</translation>
 <translation id="4650591383426000695">თქვენი ტელეფონის კავშირის გაწვეტა <ph name="DEVICE_TYPE" />-თან</translation>
 <translation id="4651484272688821107">დემო-რეჟიმის რესურსებიანი ონლაინ-კომპონენტის ჩატვირთვა ვერ მოხერხდა.</translation>
+<translation id="4651921906638302153">ამ ანგარიშით შესვლა ვერ ხერხდება</translation>
 <translation id="4652935475563630866">კამერის პარამეტრის ეს ცვლილება მოითხოვს Parallels Desktop-ის ხელახლა გაშვებას. გასაგრძელებლად ხელახლა გაუშვით Parallels Desktop.</translation>
 <translation id="4653405415038586100">შეცდომა Linux-ის კონფიგურაციისას</translation>
 <translation id="465406513924180949">თქვენ ხედავთ კალათებს, რომლებიც დაგეხმარებათ, მარტივად დაუბრუნდეთ პროდუქციას, რომელიც საყიდლების სხვადასხვა კალათაში დატოვეთ ონლაინ.
@@ -3886,6 +3897,7 @@
 <translation id="4761104368405085019">გამოიყენეთ თქვენი მიკროფონი</translation>
 <translation id="4762718786438001384">მოწყობილობის დისკზე ხელმისაწვდომი მეხსიერება კრიტიკულად არასაკმარისია</translation>
 <translation id="4763408175235639573">ამ გვერდის დათვალიერებისას შეიქმნა შემდეგი ქუქი-ჩანაწერები</translation>
+<translation id="4765524037138975789">{MONTHS,plural, =1{ეს მოწყობილობა შეინახება 1 თვის განმავლობაში. შემდეგში დაკავშირება კოდის გარეშე შეგეძლებათ. აღნიშნული დადგენილია თქვენი ადმინისტრატორის მიერ.}other{ეს მოწყობილობა შეინახება {MONTHS} თვის განმავლობაში. შემდეგში დაკავშირება კოდის გარეშე შეგეძლებათ. აღნიშნული დადგენილია თქვენი ადმინისტრატორის მიერ.}}</translation>
 <translation id="4765582662863429759">საშუალებას აძლევს Android Messages-ს, მოახდინოს ტექსტური შეტყობინებების რეტრანსლირება ტელეფონიდან თქვენს Chromebook-ში</translation>
 <translation id="4768332406694066911">თქვენ შენახული გაქვთ ქვემოთ ჩამოთვლილი ორგანიზაციების სერტიფიკატები, რომლებიც თქვენს ამოცნობას ახორციელებს</translation>
 <translation id="4770119228883592393">მოთხოვნილია ნებართვა, გამოხმაურებისთვის დააჭირეთ კლავიშთა კომბინაციას ⌘ + Option + ქვემოთ მიმართული ისარი</translation>
@@ -4500,6 +4512,7 @@
 <translation id="5398497406011404839">დამალული სანიშნეები</translation>
 <translation id="5398572795982417028">გვერდზე მითითება საზღვრებს სცდება. ლიმიტი არის <ph name="MAXIMUM_PAGE" /></translation>
 <translation id="5401426944298678474">საიტისთვის თვალის მიდევნების გაუქმება</translation>
+<translation id="5401851137404501592">გასაგრძელებლად <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ამ საიტს გაუზიარებს თქვენს სახელს, ელფოსტის მისამართსა და პროფილის სურათს.</translation>
 <translation id="5402815541704507626">განახლების ჩამოტვირთვა მობილური ინტერნეტით</translation>
 <translation id="540296380408672091"><ph name="HOST" />-ზე ქუქი-ჩანაწერების ყოველთვის დაბლოკვა</translation>
 <translation id="5404740137318486384">დააჭირეთ გადამრთველს ან კლავიატურის კლავიშს, „<ph name="ACTION" />“ რომ მიაკუთვნოთ.
@@ -5355,6 +5368,7 @@
 <translation id="6250186368828697007">ეკრანის გაზიარებისას დეტალები დამალულია</translation>
 <translation id="6251870443722440887">GDI მარკერები</translation>
 <translation id="625369703868467034">ქსელის სტატუსი</translation>
+<translation id="6253801023880399036">პაროლები შეინახება სექციაში „<ph name="GOOGLE_PASSWORD_MANAGER" />“.</translation>
 <translation id="6254503684448816922">გასაღების კომპრომეტაცია</translation>
 <translation id="6254892857036829079">იდეალური</translation>
 <translation id="6257602895346497974">სინქრონიზაციის ჩართვა...</translation>
@@ -5436,6 +5450,7 @@
 <translation id="6327785803543103246">ვებ პროქსი-სერვერის ავტომატური აღმოჩენა</translation>
 <translation id="6331818708794917058">საიტებს შეუძლია MIDI-მოწყობილობებთან დაკავშირების თხოვნა</translation>
 <translation id="6333064448949140209">ფაილი, გამართვის მიზნით, Google-ს გაეგზავნება</translation>
+<translation id="6333170995003625229">თქვენი ელფოსტის მისამართის ან პაროლის დადასტურება ვერ მოხერხდა. ცადეთ სისტემაში ხელახლა შესვლა.</translation>
 <translation id="6335920438823100346">Linux-ის გასაშვებად <ph name="MANAGER" /> საჭიროებს თქვენი მონაცემების სარეზერვო ასლის შექმნასა და ამ Chromebook-ის ქარხნულ პარამეტრებზე დაბრუნებას.</translation>
 <translation id="6336038146639916978"><ph name="MANAGER" />-მა გაითიშა ADB გამართვა. ამის გამო თქვენი <ph name="DEVICE_TYPE" /> გადაიტვირთება 24 საათში. შექმენით იმ ფაილების სარეზერვო ასლები, რომელთა შენარჩუნებაც გსურთ.</translation>
 <translation id="6338981933082930623">ყველა საიტს შეუძლია ნებისმიერი ტიპის რეკლამის ჩვენება</translation>
@@ -5844,6 +5859,7 @@
 <translation id="6735304988756581115">ქუქის და საიტის სხვა მონაცემების ჩვენება…</translation>
 <translation id="6736243959894955139">მისამართი</translation>
 <translation id="6737663862851963468">Kerberos ბილეთის ამოშლა</translation>
+<translation id="6738430949033571771">მიმდინარეობს ანგარიშის დადასტურება...</translation>
 <translation id="6739923123728562974">დესკტოპზე მალსახმობის ჩვენება</translation>
 <translation id="6740234557573873150"><ph name="FILE_NAME" /> დაპაუზებულია</translation>
 <translation id="6741063444351041466"><ph name="BEGIN_LINK" />თქვენმა ადმინისტრატორმა<ph name="END_LINK" /> გამორთო Safe Browsing</translation>
@@ -6377,6 +6393,7 @@
 <translation id="7282547042039404307">გლუვი</translation>
 <translation id="7282992757463864530">საინფორმაციო ზოლი</translation>
 <translation id="7283555985781738399">სტუმრის რეჟიმი</translation>
+<translation id="7284307451964417957">{DAYS,plural, =1{ეს მოწყობილობა შეინახება 1 დღის განმავლობაში. შემდეგში დაკავშირება კოდის გარეშე შეგეძლებათ. აღნიშნული დადგენილია თქვენი ადმინისტრატორის მიერ.}other{ეს მოწყობილობა შეინახება {DAYS} დღის განმავლობაში. შემდეგში დაკავშირება კოდის გარეშე შეგეძლებათ. აღნიშნული დადგენილია თქვენი ადმინისტრატორის მიერ.}}</translation>
 <translation id="7284411326658527427">თითოეულ ადამიანს შეეძლება თავისი ანგარიშის პერსონალიზება და მონაცემების განცალკევებით შენახვა.</translation>
 <translation id="7287143125007575591">წვდომა აკრძალულია.</translation>
 <translation id="7287411021188441799">ნაგულისხმევი ფონის აღდგენა</translation>
@@ -6581,6 +6598,7 @@
 <translation id="7488682689406685343">შესაძლოა, ეს საიტი ცდილობდეს თქვენს შეცდომაში შეყვანას, რომ მომაბეზრებელი შეტყობინებების მიღება დაუშვათ.</translation>
 <translation id="7489761397368794366">თქვენი მოწყობილობიდან დარეკვა</translation>
 <translation id="749028671485790643">ადამიანი <ph name="VALUE" /></translation>
+<translation id="7490683549040131791">დანარჩენი პაროლების შემოწმება</translation>
 <translation id="7491962110804786152">ჩანართი</translation>
 <translation id="7491963308094506985">{NUM_COOKIES,plural, =1{1 ქუქი-ჩანაწერი}other{{NUM_COOKIES} ქუქი-ჩანაწერი}}</translation>
 <translation id="7493386493263658176">გაფართოება „<ph name="EXTENSION_NAME" />“ თქვენ მიერ აკრეფილი ნებისმიერი ტექსტის შეგროვებას შეძლებს, მათ შორის, ისეთი პირადი ინფორმაციის, როგორიც არის პაროლები და საკრედიტო ბარათების ნომრები. გსურთ ამ გაფართოების გამოყენება?</translation>
@@ -7471,6 +7489,7 @@
 <translation id="8335587457941836791">მოხსენით თაროდან</translation>
 <translation id="8336407002559723354">განახლებების დასასრული: <ph name="MONTH_AND_YEAR" /></translation>
 <translation id="8336739000755212683">მოწყობილობის ანგარიშის სურათის შეცვლა</translation>
+<translation id="8337020675372081178">{HOURS,plural, =1{ეს მოწყობილობა შეინახება 1 საათის განმავლობაში. შემდეგში დაკავშირება კოდის გარეშე შეგეძლებათ. აღნიშნული დადგენილია თქვენი ადმინისტრატორის მიერ.}other{ეს მოწყობილობა შეინახება {HOURS} საათის განმავლობაში. შემდეგში დაკავშირება კოდის გარეშე შეგეძლებათ. აღნიშნული დადგენილია თქვენი ადმინისტრატორის მიერ.}}</translation>
 <translation id="8337047789441383384">უსაფრთხოების ეს გასაღები უკვე რეგისტრირებული გაქვთ. მისი ხელახლა რეგისტრაცია არ არის აუცილებელი.</translation>
 <translation id="8338952601723052325">შემმუშავებლის ვებსაიტი</translation>
 <translation id="8339059274628563283"><ph name="SITE" />-ის ადგილობრივად შენახული მონაცემები</translation>
@@ -7661,6 +7680,8 @@
 <translation id="8546306075665861288">გამოსახულების კეშირება</translation>
 <translation id="8546930481464505581">შეხების ზოლის მორგება</translation>
 <translation id="8547013269961688403">სრულეკრანიანი ლუპის ჩართვა</translation>
+<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" />-ს მართავს <ph name="MANAGER" />. ამ ელფოსტას ვერ დაამატებთ დამატებითი ანგარიშის სახით.<ph name="END_PARAGRAPH1" />
+    <ph name="BEGIN_PARAGRAPH2" /><ph name="USER_EMAIL" /> რომ გამოიყენოთ, პირველ რიგში, გამოდით თქვენი <ph name="DEVICE_TYPE" />-დან. ამის შემდეგ, შესვლის ეკრანის ქვედა ნაწილიდან, აირჩიეთ „ადამიანის დამატება“.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="85486688517848470">ზედა მწკრივის ღილაკების რეჟიმის გადასართავად ხანგრძლივად დააჭირეთ ძიების კლავიშს</translation>
 <translation id="8549316893834449916">Chromebook-ში შესასვლელად გამოიყენეთ თქვენი Google ანგარიში, რომლითაც Gmail-ისთვის, Drive-ისთვის, YouTube-ისა თუ სხვა პლატფორმებისთვის სარგებლობთ.</translation>
 <translation id="8551388862522347954">ლიცენზიები</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb
index 31024a706..817433f 100644
--- a/chrome/app/resources/generated_resources_ky.xtb
+++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -89,6 +89,9 @@
 <translation id="1082214733466244292">Администраторуңуз бул түзмөктөгү айрым функцияларды бөгөттөп койду</translation>
 <translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" /> Chrome жөндөөлөрүңүздү демейки жөндөөлөргө кайтарайын деп жатат. Ушуну менен башкы барагыңыз, жаңы өтмөк барагыңыз жана издөө каражатыңыз кайра коюлуп, кеңейтүүлөрүңүз өчүрүлөт жана өтмөктөрдүн баары бошотулат. Мындан тышкары, кукилер, мазмун жана сайт дайындары сыяктуу убактылуу жана кештелген дайындардын баары тазаланат.</translation>
 <translation id="1084096383128641877">Бул сырсөздү өзгөртүү менен <ph name="DOMAIN" /> аккаунтуңуз өчпөйт. <ph name="DOMAIN_LINK" /> аккаунтуңузду башкалардан коргоо үчүн сырсөздү өзгөртүңүз же аккаунтуңузду жок кылыңыз.</translation>
+<translation id="1084288067399862432">Уурдалган сырсөз ийгиликтүү өзгөртүлдү.
+
+Сырсөздөрүңүздү <ph name="GOOGLE_PASSWORD_MANAGER" /> бөлүмүнөн каалаган убакта текшерип туруңуз.</translation>
 <translation id="1084824384139382525">Шилтеме даре&amp;гин көчүрүү</translation>
 <translation id="1085064499066015002">Бардык сайттарда ар дайым күйүк</translation>
 <translation id="1085697365578766383">Виртуалдык машина иштеп баштабай калды. Кайталап көрүңүз.</translation>
@@ -1693,6 +1696,7 @@
 <translation id="2554553592469060349">Тандалган файл өтө чоң (эң чоң өлчөмү: 3 мб).</translation>
 <translation id="2558569818338050235">Жарнамалар көрүлгөн вебсайттарга жараша көрсөтүлөт</translation>
 <translation id="2558896001721082624">Тутум менюсунан атайын мүмкүнчүлүктөрдүн параметрлери дайыма көрүнсүн</translation>
+<translation id="2559889124253841528">Түзмөккө сактоо</translation>
 <translation id="2564520396658920462">AppleScript аркылуу JavaScript файлдарын иштетүү өчүрүлгөн. Аны күйгүзүү үчүн меню тилкесинен Көрүнүш &gt; Иштеп чыгуучу &gt; Apple Events'теги JavaScript'ке уруксат берүү дегенди тандаңыз. Кеңири маалымат: https://support.google.com/chrome/?p=applescript</translation>
 <translation id="2564653188463346023">Жакшыртылган орфографиялык текшерүү</translation>
 <translation id="2568774940984945469">Маалымат тилкесинин контейнери</translation>
@@ -1703,6 +1707,7 @@
 <translation id="2575247648642144396">Бул сүрөтчө ушул беттеги кеңейтүү иштеп баштаганда көрүнөт. Бул кеңейтүүнү колдонуу үчүн сүрөтчөнү чыкылдатыңыз же <ph name="EXTENSION_SHORTCUT" /> басып коюңуз.</translation>
 <translation id="2575407791320728464">Жараксыз URL. Ал туура форматталганын текшериңиз.</translation>
 <translation id="2575441894380764255">Тажатма же адаштыруучу жарнамаларды көрсөтө албайт</translation>
+<translation id="2575713839157415345">{YEARS,plural, =1{Түзмөк 1 жыл сакталып, кийинки жолу кодсуз туташа аласыз. Бул параметрди администраторуңуз орноткон.}other{Түзмөк {YEARS} жыл сакталып, кийинки жолу кодсуз туташа аласыз. Бул параметрди администраторуңуз орноткон.}}</translation>
 <translation id="257779572837908839">Жыйналыштар үчүн Chromebox'ту жөндөө</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> бир нече файлды жүктөп алууга ар дайым уруксат берилсин</translation>
 <translation id="258095186877893873">Узак</translation>
@@ -3001,6 +3006,7 @@
 <translation id="3856800405688283469">Убакыт алкагын тандоо</translation>
 <translation id="3857807444929313943">Көтөрүп, кайра тийип коюңуз</translation>
 <translation id="3858860766373142691">Аталышы</translation>
+<translation id="385939467708172187">Татаал сырсөздү колдонуу</translation>
 <translation id="3861638017150647085">"<ph name="USERNAME" />" колдонуучунун аты жеткиликсиз</translation>
 <translation id="3861977424605124250">Башында көрсөтүү</translation>
 <translation id="386239283124269513">&amp;Топту калыбына келтирүү</translation>
@@ -3244,6 +3250,7 @@
 <translation id="4089235344645910861">Жөндөөлөр сакталды. Шайкештирүү башталды.</translation>
 <translation id="4090103403438682346">Текшерилген кирүү мүмкүнчүлүгүн иштетүү</translation>
 <translation id="4090947011087001172"><ph name="SITE" /> үчүн уруксаттарды өзгөртөсүзбү?</translation>
+<translation id="4092636882861724179">Сакталган сырсөздөрдү <ph name="GOOGLE_PASSWORD_MANAGER" /> бөлүмүндө көрүп жана башкара аласыз.</translation>
 <translation id="4093865285251893588">Профиль сүрөтү</translation>
 <translation id="4093955363990068916">Жергиликтүү файл:</translation>
 <translation id="4094647278880271855">Колдоого алынбаган чөйрөнүн өзгөрмө маанисин колдонуп жатасыз: <ph name="BAD_VAR" />. Туруктуулук менен коопсуздук үчүн коркунуч бар.</translation>
@@ -3534,6 +3541,7 @@
 <translation id="4392896746540753732">Конфигурациялоо файлын түзөтүү</translation>
 <translation id="4394049700291259645">Ө</translation>
 <translation id="4396956294839002702">{COUNT,plural, =0{&amp;Баарын ачуу}=1{&amp;Кыстарманы ачуу}other{&amp;Баарын ачуу ({COUNT})}}</translation>
+<translation id="4397372003838952832">Бул сырсөздү эстеп калуунун кереги жок. Ал <ph name="EMAIL" /> аккаунту үчүн <ph name="GOOGLE_PASSWORD_MANAGER" /> бөлүмүнө сакталат.</translation>
 <translation id="439817266247065935">Түзмөк туура өчүрүлгөн жок. Linux колдонмолорун иштетүү үчүн Linux'ту өчүрүп күйгүзүңүз.</translation>
 <translation id="4400367121200150367">Сырсөздөрдү эч качан сактабаган сайттар бул жерде көрүнөт</translation>
 <translation id="4400632832271803360">Жогорку катардагы баскычтардын аракеттерин которуштуруу үчүн, Жүргүзгүч баскычын басып туруңуз</translation>
@@ -3547,6 +3555,7 @@
 <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation>
 <translation id="440653823335387109">СИЗ ОКУГАН БАРАКТАР</translation>
 <translation id="4406883609789734330">Ыкчам коштомо жазуулар</translation>
+<translation id="4407039574263172582">Улантуу үчүн <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> аты-жөнүңүздү, электрондук почтаңыздын дарегин жана профилиңиздин сүрөтүн ушул сайт менен бөлүшөт. Бул сайттын <ph name="BEGIN_LINK" />тейлөө шарттарын<ph name="END_LINK" /> карап көрүңүз.</translation>
 <translation id="4408599188496843485">Ж&amp;ардам</translation>
 <translation id="4409271659088619928">Издөө каражатыңыз: <ph name="DSE" />. Издөө таржымалын өчүрүү үчүн бар болсо, издөө каражатындагы нускамаларды караңыз.</translation>
 <translation id="4409697491990005945">Чектер</translation>
@@ -3731,6 +3740,7 @@
 <translation id="4579453506923101210">Туташтырылган телефон унутулсун</translation>
 <translation id="4579581181964204535"><ph name="HOST_NAME" /> тышкы экранга чыгарылбай жатат.</translation>
 <translation id="4579876313423027742">Серепчинин билдирмелерин көрүү үчүн <ph name="LINK_BEGIN" />Chrome серепчисинин жөндөөлөрүнө<ph name="LINK_END" /> өтүңүз</translation>
+<translation id="4580596421317071374">Сырсөздөр ушул түзмөктөгү <ph name="GOOGLE_PASSWORD_MANAGER" /> бөлүмүнө сакталат.</translation>
 <translation id="4581774856936278355">Linux'ту калыбына келтирүүдө ката кетти</translation>
 <translation id="4582297591746054421">Сайттар адатта көчүрүлгөн тексттин форматын сактоо сыяктуу функциялар үчүн алмашуу буфериңизди окуйт</translation>
 <translation id="4582563038311694664">Бардык жөндөөлөрдү кайра коюу</translation>
@@ -3903,6 +3913,7 @@
 <translation id="4761104368405085019">Микрофонуңузду колдонуңуз</translation>
 <translation id="4762718786438001384">Түзмөктүн дискинде бош орун өтө аз</translation>
 <translation id="4763408175235639573">Бул барак каралганда төмөнкү кукилер коюлган</translation>
+<translation id="4765524037138975789">{MONTHS,plural, =1{Түзмөк 1 ай сакталып, кийинки жолу кодсуз туташа аласыз. Бул параметрди администраторуңуз орноткон.}other{Түзмөк {MONTHS} ай сакталып, кийинки жолу кодсуз туташа аласыз. Бул параметрди администраторуңуз орноткон.}}</translation>
 <translation id="4765582662863429759">Android жазышууларындагы билдирүүлөрдү телефонуңуздан Chromebook'уңузга өткөрүп берип турат</translation>
 <translation id="4768332406694066911">Сизде ушул уюмдардын сиздин аныктыгыңызды текшерген тастыктамалары бар</translation>
 <translation id="4770119228883592393">Уруксат суралды. Жооп берүү үчүн ⌘ + Параметр + Ылдый жебе баскычтарын басыңыз</translation>
@@ -4517,6 +4528,7 @@
 <translation id="5398497406011404839">Жашырылган кыстармалар</translation>
 <translation id="5398572795982417028">Чектен ашкан барактар жөнүндө маалымдама, чеги – <ph name="MAXIMUM_PAGE" /></translation>
 <translation id="5401426944298678474">Сайтка жазылууну токтотуу</translation>
+<translation id="5401851137404501592">Улантуу үчүн <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> аты-жөнүңүздү, электрондук почтаңыздын дарегин жана профилиңиздин сүрөтүн ушул сайт менен бөлүшөт.</translation>
 <translation id="5402815541704507626">Жаңыртууну мобилдик Интернет аркылуу жүктөп алыңыз</translation>
 <translation id="540296380408672091"><ph name="HOST" /> ичиндеги кукилер ар дайым бөгөттөлсүн</translation>
 <translation id="5404740137318486384">Которгучту же баскычтоптогу баскычты “<ph name="ACTION" />” аракетине дайындоо үчүн аны таптаңыз.
@@ -5372,6 +5384,7 @@
 <translation id="6250186368828697007">Экраныңызды бөлүшүп жатканда чоо-жайы жашырылып турат</translation>
 <translation id="6251870443722440887">GDI маркерлери</translation>
 <translation id="625369703868467034">Тармак абалы</translation>
+<translation id="6253801023880399036">Сырсөздөр <ph name="GOOGLE_PASSWORD_MANAGER" /> бөлүмүнө сакталат.</translation>
 <translation id="6254503684448816922">Ачкычтын купуялыгын ачуу</translation>
 <translation id="6254892857036829079">Кынтыксыз</translation>
 <translation id="6257602895346497974">Шайкештирүүнү күйгүзүү...</translation>
@@ -6396,6 +6409,7 @@
 <translation id="7282547042039404307">Жылма</translation>
 <translation id="7282992757463864530">Маалымат тилкеси</translation>
 <translation id="7283555985781738399">Конок режими</translation>
+<translation id="7284307451964417957">{DAYS,plural, =1{Түзмөк 1 күн сакталып, кийинки жолу кодсуз туташа аласыз. Бул параметрди администраторуңуз орноткон.}other{Бул түзмөк {DAYS} күн сакталып, кийинки жолу кодсуз туташа аласыз. Бул параметрди администраторуңуз орноткон.}}</translation>
 <translation id="7284411326658527427">Ар бир адам аккаунтун жекелештирип, маалыматын купуя сактай алат.</translation>
 <translation id="7287143125007575591">Кирүү мүмкүнчүлүгү четке кагылды.</translation>
 <translation id="7287411021188441799">Демейки фонду калыбына келтирүү</translation>
@@ -6600,6 +6614,7 @@
 <translation id="7488682689406685343">Бул сайт тажатма билдирүүлөрдү көрсөтүүгө аракет кылып жатышы мүмкүн</translation>
 <translation id="7489761397368794366">Түзмөктөрүңүздөн чалуу</translation>
 <translation id="749028671485790643">Адам <ph name="VALUE" /></translation>
+<translation id="7490683549040131791">Калган сырсөздөрдү текшерүү</translation>
 <translation id="7491962110804786152">өтмөк</translation>
 <translation id="7491963308094506985">{NUM_COOKIES,plural, =1{1 cookie файлы}other{{NUM_COOKIES} cookie файлы}}</translation>
 <translation id="7493386493263658176"><ph name="EXTENSION_NAME" /> кеңейтүүсү терген текстиңиздин баарын, анын ичинде сырсөздөр жана насыя картаңыздын номерлери сыяктуу жеке дайын-даректериңизди топтошу мүмкүн. Бул кеңейтүүнү колдоносузбу?</translation>
@@ -7491,6 +7506,7 @@
 <translation id="8335587457941836791">Текчеден бошотуу</translation>
 <translation id="8336407002559723354">Жаңыртуулар <ph name="MONTH_AND_YEAR" /> аяктайт</translation>
 <translation id="8336739000755212683">Түзмөктөгү аккаунттун сүрөтүн өзгөртүү</translation>
+<translation id="8337020675372081178">{HOURS,plural, =1{Түзмөк 1 саат сакталып, кийинки жолу кодсуз туташа аласыз. Бул параметрди администраторуңуз орноткон.}other{Түзмөк {HOURS} саат сакталып, кийинки жолу кодсуз туташа аласыз. Бул параметрди администраторуңуз орноткон.}}</translation>
 <translation id="8337047789441383384">Бул коопсуздук ачкычын мурунтан эле каттап койгонсуз. Аны кайра каттоонун кажети жок.</translation>
 <translation id="8338952601723052325">Иштеп чыгуучунун вебсайты</translation>
 <translation id="8339059274628563283"><ph name="SITE" /> жергиликтүү сакталган дайындар</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb
index 60d0ae2..bc8f03ab 100644
--- a/chrome/app/resources/generated_resources_mn.xtb
+++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -1718,6 +1718,7 @@
 <translation id="25899519884572181">Уншигчийн горимоос гарах</translation>
 <translation id="2593499352046705383">Эхлэхээсээ өмнө өгөгдлөө нөөцөлсөн эсэхээ шалгана уу. <ph name="DEVICE_OS" />-г суулгаснаар таны хатуу дискийг дарж бичнэ. Та g.co/flex/InstallGuide дээрээс нэмэлт мэдээлэл авна уу.</translation>
 <translation id="2594999711683503743">Google-с хайх эсвэл URL бичих</translation>
+<translation id="2597976513418770460">Chrome хөтчийн зүйлсээ <ph name="ACCOUNT_EMAIL" />-с авна уу</translation>
 <translation id="2602501489742255173">Эхлүүлэхийн тулд дээш шударна уу</translation>
 <translation id="2603115962224169880">Компьютерийг цэвэрлэх</translation>
 <translation id="2603355571917519942">Voice Match бэлэн байна</translation>
@@ -3457,6 +3458,7 @@
 <translation id="4307992518367153382">Үндэс</translation>
 <translation id="4309165024397827958">Байршлын зөвшөөрөлтэй Android аппууд болон үйлчилгээнүүдэд таны төхөөрөмжийн байршлыг ашиглахыг зөвшөөрнө үү. Google нь байршлын нарийвчлал болон байршилд тулгуурласан үйлчилгээг сайжруулахын тулд байршлын өгөгдлийг үе үе цуглуулж, энэ өгөгдлийг нэргүй байдлаар ашиглаж магадгүй.</translation>
 <translation id="4309420042698375243"><ph name="NUM_KILOBYTES" />K (<ph name="NUM_KILOBYTES_LIVE" />K live)</translation>
+<translation id="4310132194679586591">Энэ холбоосыг нээхийн тулд төхөөрөмж дээрээ апп сонгоно уу</translation>
 <translation id="4310139701823742692">Файлын формат буруу байна. PPD файлыг шалгаад дахин оролдоно уу.</translation>
 <translation id="431076611119798497">Дэлгэрэнгүй мэдээлэл</translation>
 <translation id="4312701113286993760">{COUNT,plural, =1{1 Google Бүртгэл}other{<ph name="EXTRA_ACCOUNTS" /> Google Бүртгэл}}</translation>
@@ -4687,6 +4689,7 @@
 <translation id="5554403733534868102">Үүнээс хойш шинэчлэлт хийхийн тулд хүлээх шаардлагагүй болно</translation>
 <translation id="5554489410841842733">Өргөтгөл нь одоо байгаа хуудсан дээр ажиллаж чадаж байгаа үед энэ дүрс харагдах болно.</translation>
 <translation id="5554720593229208774">Имэйл Certification Authority</translation>
+<translation id="5554866693883022680">Энэ холбоосыг нээхийн тулд <ph name="DEVICE_TYPE" /> дээрээ апп сонгоно уу</translation>
 <translation id="5555363196923735206">Камерыг хөнтрөх</translation>
 <translation id="5555525474779371165">Аюулгүй үзэх хамгаалалтаа сонгоно уу</translation>
 <translation id="5556459405103347317">Дахин ачаал</translation>
@@ -7451,6 +7454,7 @@
 <translation id="8275080796245127762">Төхөөрөмжөөсөө дуудлага хийх</translation>
 <translation id="8275339871947079271">Хаанаас ч нэвтэрсэн нууц үгэндээ аюулгүй хандахын тулд үүнийг Google Бүртгэл рүүгээ зөөнө үү</translation>
 <translation id="8276560076771292512">Хоосон кэш ба эрчтэйгээр дахин ачаалах</translation>
+<translation id="8281721647184388851">Chrome хөтчийн синк хийхийг асаах уу?</translation>
 <translation id="8281886186245836920">Алгасах</translation>
 <translation id="8283475148136688298">"<ph name="DEVICE_NAME" />" руу холбогдож байх явцад таниулах кодыг буцаасан.</translation>
 <translation id="8284279544186306258">бүх <ph name="WEBSITE_1" /> сайтууд</translation>
@@ -7606,6 +7610,7 @@
 <translation id="8448729345478502352">Дэлгэц дээрх зүйлсийг жижигрүүлэх эсвэл томруулах</translation>
 <translation id="8449008133205184768">Зөөж тавиад, хэлбэршүүлэлттэй нийцүүл</translation>
 <translation id="8449036207308062757">Хадгалах санг удирдах</translation>
+<translation id="8451192282033883849">Таны бүртгэлийг <ph name="MANAGER_NAME" /> удирддаг. Танай администратор энэ Chrome хөтчийн профайл болон үүний хавчуурга, түүх, нууц үг зэрэг өгөгдлийг харах болон засах боломжтой.</translation>
 <translation id="8456512334795994339">Ажиллах болон тоглоход зориулсан аппуудыг олох</translation>
 <translation id="845702320058262034">Холбогдож чадсангүй. Утасныхаа Bluetooth-г асаасан эсэхээ шалгана уу.</translation>
 <translation id="8457451314607652708">Хавчуургыг татаж авчрах</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 4860a0d3..b642a1c 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -3778,6 +3778,7 @@
 <translation id="4648491805942548247">Onvoldoende rechten</translation>
 <translation id="4650591383426000695">Je telefoon ontkoppelen van je <ph name="DEVICE_TYPE" /></translation>
 <translation id="4651484272688821107">Kan online component niet laden met bronnen van demomodus.</translation>
+<translation id="4651921906638302153">Kan niet inloggen met dit account</translation>
 <translation id="4652935475563630866">Parallels Desktop moet worden herstart om de camera-instelling te wijzigen. Herstart Parallels Desktop om door te gaan.</translation>
 <translation id="4653405415038586100">Fout bij configureren van Linux</translation>
 <translation id="465406513924180949">Je ziet winkelwagens waarmee je snel kunt teruggaan naar artikelen die je in winkelwagens op internet hebt achtergelaten.
@@ -5429,6 +5430,7 @@
 <translation id="6327785803543103246">Webproxy automatisch vinden</translation>
 <translation id="6331818708794917058">Sites kunnen vragen of ze verbinding mogen maken met MIDI-apparaten</translation>
 <translation id="6333064448949140209">Bestanden worden naar Google gestuurd voor foutopsporing</translation>
+<translation id="6333170995003625229">Je e-mailadres of wachtwoord kan niet worden geverifieerd. Probeer opnieuw in te loggen.</translation>
 <translation id="6335920438823100346">Als je Linux wilt starten, vereist <ph name="MANAGER" /> dat je een back-up maakt van je gegevens en dat je deze Chromebook terugzet naar de fabrieksinstellingen.</translation>
 <translation id="6336038146639916978"><ph name="MANAGER" /> heeft ADB-foutopsporing uitgezet. Hierdoor wordt je <ph name="DEVICE_TYPE" /> over 24 uur gereset. Maak een back-up van de bestanden die je wilt houden.</translation>
 <translation id="6338981933082930623">Alle sites kunnen alle soorten advertenties aan je laten zien</translation>
@@ -5837,6 +5839,7 @@
 <translation id="6735304988756581115">Cookies en andere sitegegevens bekijken...</translation>
 <translation id="6736243959894955139">Adres</translation>
 <translation id="6737663862851963468">Kerberos-ticket verwijderen</translation>
+<translation id="6738430949033571771">Account verifiëren...</translation>
 <translation id="6739923123728562974">Bureaubladsnelkoppeling bekijken</translation>
 <translation id="6740234557573873150"><ph name="FILE_NAME" /> onderbroken</translation>
 <translation id="6741063444351041466"><ph name="BEGIN_LINK" />Je beheerder<ph name="END_LINK" /> heeft Safe Browsing uitgezet</translation>
@@ -7653,6 +7656,8 @@
 <translation id="8546306075665861288">Cachegeheugen met afbeeldingen</translation>
 <translation id="8546930481464505581">Aanraakbalk aanpassen</translation>
 <translation id="8547013269961688403">Vergrootglas voor volledig scherm aanzetten</translation>
+<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> wordt beheerd door <ph name="MANAGER" />. Je kunt dit e-mailadres niet toevoegen als extra account.<ph name="END_PARAGRAPH1" />
+    <ph name="BEGIN_PARAGRAPH2" />Als je <ph name="USER_EMAIL" /> wilt gebruiken, log je eerst uit van je <ph name="DEVICE_TYPE" />. Selecteer daarna onderaan het inlogscherm de optie Persoon toevoegen.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="85486688517848470">Houd de zoektoets ingedrukt om het gedrag van de toetsen in de bovenste rij om te schakelen</translation>
 <translation id="8549316893834449916">Je gebruikt je Google-account om in te loggen op je Chromebook. Dit is hetzelfde account dat je gebruikt voor Gmail, Drive, YouTube en meer.</translation>
 <translation id="8551388862522347954">Licenties</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index c5ed3496..1d264fa 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -3766,6 +3766,7 @@
 <translation id="4648491805942548247">Niewystarczające uprawnienia</translation>
 <translation id="4650591383426000695">Odłącz telefon od urządzenia <ph name="DEVICE_TYPE" /></translation>
 <translation id="4651484272688821107">Nie udało się załadować komponentu online z zasobami trybu demonstracyjnego.</translation>
+<translation id="4651921906638302153">Nie można się zalogować przy użyciu tego konta</translation>
 <translation id="4652935475563630866">Zmiana ustawienia kamery wymaga ponownego uruchomienia aplikacji Parallels Desktop. Aby kontynuować, uruchom ponownie Parallels Desktop.</translation>
 <translation id="4653405415038586100">Błąd podczas konfigurowania Linuksa</translation>
 <translation id="465406513924180949">Widzisz koszyki, aby łatwiej Ci było wrócić do produktów dodanych do koszyków na zakupy w sklepach internetowych.
@@ -5421,6 +5422,7 @@
 <translation id="6327785803543103246">Automatyczne wykrywanie internetowego serwera proxy</translation>
 <translation id="6331818708794917058">Strony mogą prosić o zgodę na połączenie z urządzeniami MIDI</translation>
 <translation id="6333064448949140209">Plik zostanie wysłany do Google w celu debugowania</translation>
+<translation id="6333170995003625229">Nie udało się zweryfikować Twojego adresu e-mail ani hasła. Zaloguj się jeszcze raz.</translation>
 <translation id="6335920438823100346">Przed uruchomieniem Linuksa <ph name="MANAGER" /> wymaga utworzenia kopii zapasowej danych oraz przywrócenia na tym Chromebooku ustawień fabrycznych.</translation>
 <translation id="6336038146639916978">Domena <ph name="MANAGER" /> wyłączyła debugowanie ADB. W związku z tym za 24 godziny Twoje urządzenie <ph name="DEVICE_TYPE" /> zostanie zresetowane. Utwórz kopie zapasowe plików, które chcesz zachować.</translation>
 <translation id="6338981933082930623">Wszystkie strony mogą wyświetlać wszystkie reklamy</translation>
@@ -5833,6 +5835,7 @@
 <translation id="6735304988756581115">Pokaż pliki cookie i inne dane witryn...</translation>
 <translation id="6736243959894955139">Adres</translation>
 <translation id="6737663862851963468">Usuwanie zgłoszenia Kerberos</translation>
+<translation id="6738430949033571771">Weryfikuję konto…</translation>
 <translation id="6739923123728562974">Pokaż skrót na pulpicie</translation>
 <translation id="6740234557573873150">Wstrzymano pobieranie <ph name="FILE_NAME" /></translation>
 <translation id="6741063444351041466"><ph name="BEGIN_LINK" />Twój administrator<ph name="END_LINK" /> wyłączył Bezpieczne przeglądanie</translation>
@@ -7652,6 +7655,8 @@
 <translation id="8546306075665861288">Pamięć podręczna grafiki</translation>
 <translation id="8546930481464505581">Dostosuj pasek dotykowy</translation>
 <translation id="8547013269961688403">Włącz lupę pełnego ekranu</translation>
+<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" />Adres <ph name="USER_EMAIL" /> jest zarządzany w domenie <ph name="MANAGER" />. Nie może być on kontem dodatkowym.<ph name="END_PARAGRAPH1" />
+    <ph name="BEGIN_PARAGRAPH2" />Aby skorzystać z adresu <ph name="USER_EMAIL" />, najpierw musisz wylogować się z urządzenia <ph name="DEVICE_TYPE" />. Potem u dołu ekranu logowania wybierz Dodaj osobę.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="85486688517848470">Przytrzymaj klawisz wyszukiwania, by zmienić działanie klawiszy z górnego rzędu</translation>
 <translation id="8549316893834449916">Do logowania się na Chromebooku będziesz używać swojego konta Google – tego samego co w Gmailu, na Dysku, w YouTube i w innych usługach Google.</translation>
 <translation id="8551388862522347954">Licencje</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 8a41a90..a5cccfbc 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -89,6 +89,9 @@
 <translation id="1082214733466244292">Administratorul a blocat unele funcții pentru acest dispozitiv</translation>
 <translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" /> dorește să restabilească setările Chrome la valorile inițiale. Astfel, pagina de pornire, pagina Filă nouă și motorul de căutare vor fi resetate, extensiile vor fi dezactivate și fixarea filelor va fi anulată. De asemenea, vor fi șterse alte date temporare și memorate în cache, cum ar fi cookie-urile, conținutul și datele despre site-uri.</translation>
 <translation id="1084096383128641877">Eliminarea acestei parole nu îți va șterge contul din <ph name="DOMAIN" />. Schimbă-ți parola sau șterge contul din <ph name="DOMAIN_LINK" /> ca să-l păstrezi în siguranță.</translation>
+<translation id="1084288067399862432">Parola compromisă a fost schimbată.
+
+Verifică parolele oricând în <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation>
 <translation id="1084824384139382525">Copiază adresa linkului</translation>
 <translation id="1085064499066015002">Întotdeauna pe toate site-urile</translation>
 <translation id="1085697365578766383">A apărut o eroare la pornirea mașinii virtuale. Încearcă din nou.</translation>
@@ -1679,6 +1682,7 @@
 <translation id="2554553592469060349">Fișierul selectat este prea mare (dimensiune maximă: 3 MB).</translation>
 <translation id="2558569818338050235">Istoricul tău de navigare influențează anunțurile pe care le vezi</translation>
 <translation id="2558896001721082624">Afișează mereu opțiunile de accesibilitate în meniul de sistem</translation>
+<translation id="2559889124253841528">Salvează pe dispozitiv</translation>
 <translation id="2564520396658920462">Rularea JavaScript prin AppleScript este dezactivată. Pentru a o activa, din bara de meniu, accesează Vizualizare &gt; Dezvoltator &gt; Permite JavaScript de la Apple Events. Pentru mai multe informații: https://support.google.com/chrome/?p=applescript</translation>
 <translation id="2564653188463346023">Verificarea îmbunătățită a ortografiei</translation>
 <translation id="2568774940984945469">Container bară de informații</translation>
@@ -1689,6 +1693,7 @@
 <translation id="2575247648642144396">Această pictogramă va fi vizibilă atunci când extensia poate acționa pe pagina actuală. Utilizați această extensie dând clic pe pictogramă sau apăsând pe <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2575407791320728464">Adresă URL nevalidă. Verifică dacă este formatată corect.</translation>
 <translation id="2575441894380764255">Nu au permisiunea de a afișa anunțuri deranjante sau înșelătoare</translation>
+<translation id="2575713839157415345">{YEARS,plural, =1{Dispozitivul va fi salvat timp de un an și te poți conecta fără cod data viitoare. Setarea este configurată de administrator.}few{Dispozitivul va fi salvat timp de {YEARS} ani și te poți conecta fără cod data viitoare. Setarea este configurată de administrator.}other{Dispozitivul va fi salvat timp de {YEARS} de ani și te poți conecta fără cod data viitoare. Setarea este configurată de administrator.}}</translation>
 <translation id="257779572837908839">Configurează ca Chromebox pentru videoconferințe</translation>
 <translation id="2580889980133367162">Permiteți întotdeauna <ph name="HOST" /> să descarce mai multe fișiere</translation>
 <translation id="258095186877893873">Lungă</translation>
@@ -2987,6 +2992,7 @@
 <translation id="3856800405688283469">Selectează fusul orar</translation>
 <translation id="3857807444929313943">Ridică, apoi atinge din nou</translation>
 <translation id="3858860766373142691">Nume</translation>
+<translation id="385939467708172187">Folosește o parolă puternică</translation>
 <translation id="3861638017150647085">Numele de utilizator „<ph name="USERNAME" />” nu este disponibil</translation>
 <translation id="3861977424605124250">Afișează la pornire</translation>
 <translation id="386239283124269513">&amp;Restabilește grupul</translation>
@@ -3230,6 +3236,7 @@
 <translation id="4089235344645910861">Setările au fost salvate. Sincronizarea a început.</translation>
 <translation id="4090103403438682346">Activați Acces verificat</translation>
 <translation id="4090947011087001172">Resetezi permisiunile la nivel de site pentru <ph name="SITE" />?</translation>
+<translation id="4092636882861724179">Poți să vezi și să gestionezi parolele salvate în <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation>
 <translation id="4093865285251893588">Imagine de profil</translation>
 <translation id="4093955363990068916">Fișier local:</translation>
 <translation id="4094647278880271855">Folosești o variabilă de mediu neacceptată: <ph name="BAD_VAR" />. Stabilitatea și securitatea vor avea de suferit.</translation>
@@ -3520,6 +3527,7 @@
 <translation id="4392896746540753732">Editează fișierul de configurare</translation>
 <translation id="4394049700291259645">Dezactivează</translation>
 <translation id="4396956294839002702">{COUNT,plural, =0{&amp;Deschide-le pe toate}=1{&amp;Deschide marcajul}few{&amp;Deschide-le pe toate ({COUNT})}other{&amp;Deschide-le pe toate ({COUNT})}}</translation>
+<translation id="4397372003838952832">Nu va trebui să reții această parolă. Ea se va salva în <ph name="GOOGLE_PASSWORD_MANAGER" /> pentru <ph name="EMAIL" />.</translation>
 <translation id="439817266247065935">Dispozitivul nu s-a închis corect. Repornește Linux ca să folosești aplicațiile Linux.</translation>
 <translation id="4400367121200150367">Site-urile care nu salvează niciodată parole vor apărea aici</translation>
 <translation id="4400632832271803360">Ține apăsată tasta Lansator pentru a schimba comportamentul tastelor de pe rândul de sus</translation>
@@ -3533,6 +3541,7 @@
 <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation>
 <translation id="440653823335387109">PAGINI CITITE</translation>
 <translation id="4406883609789734330">Subtitrări live</translation>
+<translation id="4407039574263172582">Pentru a continua, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> va permite accesul site-ului la numele, adresa de e-mail și fotografia ta de profil. Vezi <ph name="BEGIN_LINK" />termenii și condițiile<ph name="END_LINK" /> acestui site.</translation>
 <translation id="4408599188496843485">&amp;Ajutor</translation>
 <translation id="4409271659088619928">Motorul tău de căutare este <ph name="DSE" />. Vezi instrucțiunile pentru ștergerea istoricului căutărilor, dacă este cazul.</translation>
 <translation id="4409697491990005945">Margini</translation>
@@ -3716,6 +3725,7 @@
 <translation id="4579453506923101210">Elimină telefonul conectat</translation>
 <translation id="4579581181964204535">Nu se poate proiecta <ph name="HOST_NAME" />.</translation>
 <translation id="4579876313423027742">Pentru notificările din browser, accesează <ph name="LINK_BEGIN" />Setările browserului Chrome<ph name="LINK_END" /></translation>
+<translation id="4580596421317071374">Parolele se salvează în <ph name="GOOGLE_PASSWORD_MANAGER" /> pe acest dispozitiv.</translation>
 <translation id="4581774856936278355">Eroare la restabilirea Linux</translation>
 <translation id="4582297591746054421">Site-urile citesc de obicei clipboardul pentru a face acțiuni precum păstrarea formatării textului pe care l-ai copiat</translation>
 <translation id="4582563038311694664">Restabilește toate setările</translation>
@@ -3781,6 +3791,7 @@
 <translation id="4648491805942548247">Permisiuni insuficiente</translation>
 <translation id="4650591383426000695">Deconectează telefonul de la <ph name="DEVICE_TYPE" /></translation>
 <translation id="4651484272688821107">Componenta online nu a putut fi încărcată cu resurse pentru modul demo.</translation>
+<translation id="4651921906638302153">Nu te poți conecta cu acest cont</translation>
 <translation id="4652935475563630866">Modificarea setării pentru cameră necesită relansarea Parallels Desktop. Relansează Parallels Desktop pentru a continua.</translation>
 <translation id="4653405415038586100">Eroare la configurarea Linux</translation>
 <translation id="465406513924180949">Vezi coșuri care te ajută să revii ușor la articolele pe care le-ai lăsat în coșuri de cumpărături pe web.
@@ -3887,6 +3898,7 @@
 <translation id="4761104368405085019">Utilizează microfonul</translation>
 <translation id="4762718786438001384">Spațiul de pe hard diskul dispozitivului este foarte redus</translation>
 <translation id="4763408175235639573">La afișarea paginii au fost setate următoarele cookie-uri</translation>
+<translation id="4765524037138975789">{MONTHS,plural, =1{Dispozitivul va fi salvat timp de o lună și te poți conecta fără cod data viitoare. Setarea este configurată de administrator.}few{Dispozitivul va fi salvat timp de {MONTHS} luni și te poți conecta fără cod data viitoare. Setarea este configurată de administrator.}other{Dispozitivul va fi salvat timp de {MONTHS} de luni și te poți conecta fără cod data viitoare. Setarea este configurată de administrator.}}</translation>
 <translation id="4765582662863429759">Permite Android Messages să retransmită mesaje text din telefonul tău în Chromebook</translation>
 <translation id="4768332406694066911">Ai certificate de la aceste organizații care te identifică</translation>
 <translation id="4770119228883592393">Permisiune necesară, apasă ⌘ + Option + săgeată în jos pentru a răspunde</translation>
@@ -4501,6 +4513,7 @@
 <translation id="5398497406011404839">Marcaje ascunse</translation>
 <translation id="5398572795982417028">Referința privind pagina este în afara limitelor (limita este <ph name="MAXIMUM_PAGE" />)</translation>
 <translation id="5401426944298678474">Anulează urmărirea site-ului</translation>
+<translation id="5401851137404501592">Pentru a continua, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> va permite accesul site-ului la numele, adresa de e-mail și fotografia ta de profil.</translation>
 <translation id="5402815541704507626">Descarcă actualizarea folosind datele mobile</translation>
 <translation id="540296380408672091">Blochează întotdeauna cookie-urile pe <ph name="HOST" /></translation>
 <translation id="5404740137318486384">Apasă un comutator sau o tastă de pe tastatură ca să o atribui acțiunii „<ph name="ACTION" />”.
@@ -5356,6 +5369,7 @@
 <translation id="6250186368828697007">Detaliile sunt ascunse cât timp permiți accesul la ecran</translation>
 <translation id="6251870443722440887">Handle-uri GDI</translation>
 <translation id="625369703868467034">Starea rețelei</translation>
+<translation id="6253801023880399036">Parolele se salvează în <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation>
 <translation id="6254503684448816922">Compromiterea cheii</translation>
 <translation id="6254892857036829079">Perfectă</translation>
 <translation id="6257602895346497974">Activează sincronizarea...</translation>
@@ -5437,6 +5451,7 @@
 <translation id="6327785803543103246">Web Proxy Auto-Discovery</translation>
 <translation id="6331818708794917058">Site-urile pot solicita permisiunea de a se conecta la dispozitive MIDI</translation>
 <translation id="6333064448949140209">Fișierul va fi trimis la Google pentru remedierea erorilor</translation>
+<translation id="6333170995003625229">Adresa de e-mail sau parola nu a putut fi confirmată. Încearcă să te conectezi din nou.</translation>
 <translation id="6335920438823100346">Pentru a inițializa Linux, <ph name="MANAGER" /> îți solicită să faci backup datelor și să revii la setările din fabrică ale Chromebookului.</translation>
 <translation id="6336038146639916978"><ph name="MANAGER" /> a dezactivat remedierea erorilor prin ADB. Astfel, <ph name="DEVICE_TYPE" /> se va reseta în termen de 24 de ore. Fă backup pentru fișierele pe care vrei să le păstrezi.</translation>
 <translation id="6338981933082930623">Toate site-urile pot afișa orice anunțuri</translation>
@@ -5847,6 +5862,7 @@
 <translation id="6735304988756581115">Afișează cookie-uri și alte date privind site-ul...</translation>
 <translation id="6736243959894955139">Adresă</translation>
 <translation id="6737663862851963468">Elimină un tichet Kerberos</translation>
+<translation id="6738430949033571771">Se realizează verificarea contului...</translation>
 <translation id="6739923123728562974">Afișează comanda rapidă pe desktop</translation>
 <translation id="6740234557573873150">Descărcarea fișierului <ph name="FILE_NAME" /> a fost întreruptă</translation>
 <translation id="6741063444351041466"><ph name="BEGIN_LINK" />Administratorul<ph name="END_LINK" /> a dezactivat Navigarea sigură</translation>
@@ -6380,6 +6396,7 @@
 <translation id="7282547042039404307">Mișcare lină</translation>
 <translation id="7282992757463864530">Bară de informații</translation>
 <translation id="7283555985781738399">Modul pentru invitați</translation>
+<translation id="7284307451964417957">{DAYS,plural, =1{Dispozitivul va fi salvat timp de o zi și te poți conecta fără cod data viitoare. Setarea este configurată de administrator.}few{Dispozitivul va fi salvat timp de {DAYS} zile și te poți conecta fără cod data viitoare. Setarea este configurată de administrator.}other{Dispozitivul va fi salvat timp de {DAYS} de zile și te poți conecta fără cod data viitoare. Setarea este configurată de administrator.}}</translation>
 <translation id="7284411326658527427">Fiecare persoană poate să-și personalizeze contul și să-și păstreze datele private.</translation>
 <translation id="7287143125007575591">Acces refuzat.</translation>
 <translation id="7287411021188441799">Restabilește fundalul prestabilit</translation>
@@ -6584,6 +6601,7 @@
 <translation id="7488682689406685343">Acest site ar putea încerca să te păcălească, astfel încât să permiți notificările deranjante.</translation>
 <translation id="7489761397368794366">Apelează de pe dispozitivul tău</translation>
 <translation id="749028671485790643">Persoana <ph name="VALUE" /></translation>
+<translation id="7490683549040131791">Verifică parolele rămase</translation>
 <translation id="7491962110804786152">filă</translation>
 <translation id="7491963308094506985">{NUM_COOKIES,plural, =1{Un cookie}few{{NUM_COOKIES} cookie-uri}other{{NUM_COOKIES} de cookie-uri}}</translation>
 <translation id="7493386493263658176">Extensia <ph name="EXTENSION_NAME" /> poate să culeagă integral textul introdus, inclusiv datele cu caracter personal, cum ar fi parolele și numerele cardurilor de credit. Dorești să folosești această extensie?</translation>
@@ -7475,6 +7493,7 @@
 <translation id="8335587457941836791">Anulați fixarea din raft</translation>
 <translation id="8336407002559723354">Actualizările se încheie în <ph name="MONTH_AND_YEAR" /></translation>
 <translation id="8336739000755212683">Schimbă imaginea contului de pe dispozitiv</translation>
+<translation id="8337020675372081178">{HOURS,plural, =1{Dispozitivul va fi salvat timp de o oră și te poți conecta fără cod data viitoare. Setarea este configurată de administrator.}few{Dispozitivul va fi salvat timp de {HOURS} ore și te poți conecta fără cod data viitoare. Setarea este configurată de administrator.}other{Dispozitivul va fi salvat timp de {HOURS} de ore și te poți conecta fără cod data viitoare. Setarea este configurată de administrator.}}</translation>
 <translation id="8337047789441383384">Ai înregistrat deja această cheie de securitate. Nu trebuie să o înregistrezi din nou.</translation>
 <translation id="8338952601723052325">Site-ul dezvoltatorului</translation>
 <translation id="8339059274628563283">Date salvate local de <ph name="SITE" /></translation>
@@ -7665,6 +7684,8 @@
 <translation id="8546306075665861288">Memorie cache de imagini</translation>
 <translation id="8546930481464505581">Personalizează bara de atingere</translation>
 <translation id="8547013269961688403">Activează lupa de ecran complet</translation>
+<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> este gestionată de <ph name="MANAGER" />. Nu poți adăuga această adresă de e-mail drept cont suplimentar.<ph name="END_PARAGRAPH1" />
+    <ph name="BEGIN_PARAGRAPH2" />Pentru a folosi <ph name="USER_EMAIL" />, mai întâi deconectează-te de la <ph name="DEVICE_TYPE" />. Apoi, în partea de jos a ecranului de conectare, selectează Adaugă o persoană.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="85486688517848470">Apasă lung pe tasta de căutare pentru a schimba comportamentul tastelor de pe rândul de sus</translation>
 <translation id="8549316893834449916">Vei folosi Contul Google ca să te conectezi la Chromebook; e același cont pe care îl folosești pentru Gmail, Drive, YouTube și altele.</translation>
 <translation id="8551388862522347954">Licențe</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index cd2ccc1..1fcc3fb 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -3781,6 +3781,7 @@
 <translation id="4648491805942548247">Недостаточно прав</translation>
 <translation id="4650591383426000695">Телефон будет отключен от устройства <ph name="DEVICE_TYPE" /></translation>
 <translation id="4651484272688821107">Не удалось загрузить онлайн-компонент с ресурсами демонстрационного режима.</translation>
+<translation id="4651921906638302153">Не удалось войти в аккаунт</translation>
 <translation id="4652935475563630866">Изменено разрешение на доступ к камере. Чтобы продолжить, перезапустите Parallels Desktop.</translation>
 <translation id="4653405415038586100">Ошибка при настройке Linux</translation>
 <translation id="465406513924180949">Эти корзины помогут вам вернуться к товарам, которые вы добавляли в заказы в интернет-магазинах.
@@ -5437,6 +5438,7 @@
 <translation id="6327785803543103246">Автоматическое определение настроек прокси-сервера</translation>
 <translation id="6331818708794917058">Разрешить сайтам отправлять запрос на подключение к MIDI-устройствам</translation>
 <translation id="6333064448949140209">Файл будет отправлен в Google для отладки</translation>
+<translation id="6333170995003625229">Введен недействительный адрес электронной почты или пароль. Повторите попытку.</translation>
 <translation id="6335920438823100346">Для запуска Linux требуется (источник правила: <ph name="MANAGER" />) выполнить резервное копирование данных и сбросить настройки устройства Chromebook до заводских.</translation>
 <translation id="6336038146639916978">Отладка с помощью ADB отключена администратором (<ph name="MANAGER" />). Настройки устройства <ph name="DEVICE_TYPE" /> будут сброшены через 24 часа. Чтобы сохранить нужные файлы, создайте их резервную копию.</translation>
 <translation id="6338981933082930623">Разрешить всем сайтам показывать любые объявления</translation>
@@ -5851,6 +5853,7 @@
 <translation id="6735304988756581115">Показать cookie и другие данные...</translation>
 <translation id="6736243959894955139">Адрес</translation>
 <translation id="6737663862851963468">Удалить билет Kerberos</translation>
+<translation id="6738430949033571771">Проверка аккаунта…</translation>
 <translation id="6739923123728562974">Показывать ярлык на рабочем столе</translation>
 <translation id="6740234557573873150">Скачивание файла "<ph name="FILE_NAME" />" приостановлено</translation>
 <translation id="6741063444351041466"><ph name="BEGIN_LINK" />Администратор<ph name="END_LINK" /> отключил Безопасный просмотр.</translation>
@@ -7669,6 +7672,8 @@
 <translation id="8546306075665861288">Кеш изображений</translation>
 <translation id="8546930481464505581">Настроить Touch Bar</translation>
 <translation id="8547013269961688403">Включить полноэкранную лупу</translation>
+<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> управляется менеджером <ph name="MANAGER" />. Вы не можете использовать этот адрес электронной почты как дополнительный аккаунт.<ph name="END_PARAGRAPH1" />
+    <ph name="BEGIN_PARAGRAPH2" />Чтобы войти как <ph name="USER_EMAIL" />, сперва выйдите из аккаунта на устройстве <ph name="DEVICE_TYPE" />. Затем в нижней части экрана входа нажмите "Добавить пользователя".<ph name="END_PARAGRAPH2" /></translation>
 <translation id="85486688517848470">Чтобы сменить режим клавиш верхнего ряда, удерживайте кнопку поиска</translation>
 <translation id="8549316893834449916">Это тот же аккаунт, что и в других сервисах Google, таких как Gmail, Диск или YouTube.</translation>
 <translation id="8551388862522347954">Лицензии</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb
index cc8a6023..7e30c7c 100644
--- a/chrome/app/resources/generated_resources_sr-Latn.xtb
+++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -3779,6 +3779,7 @@
 <translation id="4648491805942548247">Nedovoljan broj dozvola</translation>
 <translation id="4650591383426000695">Prekinite vezu između telefona i uređaja <ph name="DEVICE_TYPE" /></translation>
 <translation id="4651484272688821107">Učitavanje onlajn komponente sa resursima za režim demonstracije nije uspelo.</translation>
+<translation id="4651921906638302153">Ne možete da se prijavite pomoću ovog naloga</translation>
 <translation id="4652935475563630866">Promena podešavanja kamere zahteva ponovno pokretanje Parallels Desktop-a. Ponovo pokrenite Parallels Desktop da biste nastavili.</translation>
 <translation id="4653405415038586100">Greška pri konfigurisanju Linux-a</translation>
 <translation id="465406513924180949">Prikazuju vam se korpe koje vam pomažu da se lako vratite na stavke koje ste ostavili u korpama za kupovinu širom veba.
@@ -5435,6 +5436,7 @@
 <translation id="6327785803543103246">Automatsko otkrivanje veb-proksija</translation>
 <translation id="6331818708794917058">Sajtovi mogu da traže da se povezuju sa MIDI uređajima</translation>
 <translation id="6333064448949140209">Datoteka će biti poslata Google-u radi otklanjanja grešaka</translation>
+<translation id="6333170995003625229">Verifikacija imejl adrese ili lozinke nije uspela. Probajte ponovo da se prijavite.</translation>
 <translation id="6335920438823100346">Da biste pokrenuli Linux, <ph name="MANAGER" /> zahteva da napravite rezervnu kopiju podataka i resetujete ovaj Chromebook na fabrička podešavanja.</translation>
 <translation id="6336038146639916978"><ph name="MANAGER" /> je onemogućio ADB otklanjanje grešaka. To će resetovati <ph name="DEVICE_TYPE" /> za 24 sata. Napravite rezervne kopije svih fajlova koje želite da zadržite.</translation>
 <translation id="6338981933082930623">Svi sajtovi mogu da prikazuju sve oglase</translation>
@@ -5847,6 +5849,7 @@
 <translation id="6735304988756581115">Prikaži kolačiće i ostale podatke sa sajta...</translation>
 <translation id="6736243959894955139">Adresa</translation>
 <translation id="6737663862851963468">Uklonite Kerberos tiket</translation>
+<translation id="6738430949033571771">Verifikuje se nalog…</translation>
 <translation id="6739923123728562974">Prikaži prečicu na radnoj površini</translation>
 <translation id="6740234557573873150">Preuzimanje datoteke <ph name="FILE_NAME" /> je pauzirano</translation>
 <translation id="6741063444351041466"><ph name="BEGIN_LINK" />Administrator<ph name="END_LINK" /> je isključio bezbedno pregledanje</translation>
@@ -7665,6 +7668,8 @@
 <translation id="8546306075665861288">Keš slike</translation>
 <translation id="8546930481464505581">Prilagodi dodirnu traku</translation>
 <translation id="8547013269961688403">Omogući lupu za ceo ekran</translation>
+<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" />Imejlom <ph name="USER_EMAIL" /> upravlja <ph name="MANAGER" />. Ne možete da dodate ovaj imejl kao dodatni nalog.<ph name="END_PARAGRAPH1" />
+    <ph name="BEGIN_PARAGRAPH2" />Da biste koristili <ph name="USER_EMAIL" />, prvo se odjavite sa uređaja <ph name="DEVICE_TYPE" />. Zatim u dnu ekrana za prijavljivanje izaberite Dodaj osobu.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="85486688517848470">Zadržite taster za pretragu da biste promenili ponašanje tastera u gornjem redu</translation>
 <translation id="8549316893834449916">Za prijavljivanje na Chromebook ćete koristiti Google nalog – isti koji koristite i za Gmail, Disk, YouTube i drugo.</translation>
 <translation id="8551388862522347954">Licence</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index 5431883e..5b517496d 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -3779,6 +3779,7 @@
 <translation id="4648491805942548247">Недовољан број дозвола</translation>
 <translation id="4650591383426000695">Прекините везу између телефона и уређаја <ph name="DEVICE_TYPE" /></translation>
 <translation id="4651484272688821107">Учитавање онлајн компоненте са ресурсима за режим демонстрације није успело.</translation>
+<translation id="4651921906638302153">Не можете да се пријавите помоћу овог налога</translation>
 <translation id="4652935475563630866">Промена подешавања камере захтева поновно покретање Parallels Desktop-а. Поново покрените Parallels Desktop да бисте наставили.</translation>
 <translation id="4653405415038586100">Грешка при конфигурисању Linux-а</translation>
 <translation id="465406513924180949">Приказују вам се корпе које вам помажу да се лако вратите на ставке које сте оставили у корпама за куповину широм веба.
@@ -5435,6 +5436,7 @@
 <translation id="6327785803543103246">Аутоматско откривање веб-проксија</translation>
 <translation id="6331818708794917058">Сајтови могу да траже да се повезују са MIDI уређајима</translation>
 <translation id="6333064448949140209">Датотека ће бити послата Google-у ради отклањања грешака</translation>
+<translation id="6333170995003625229">Верификација имејл адресе или лозинке није успела. Пробајте поново да се пријавите.</translation>
 <translation id="6335920438823100346">Да бисте покренули Linux, <ph name="MANAGER" /> захтева да направите резервну копију података и ресетујете овај Chromebook на фабричка подешавања.</translation>
 <translation id="6336038146639916978"><ph name="MANAGER" /> је онемогућио ADB отклањање грешака. То ће ресетовати <ph name="DEVICE_TYPE" /> за 24 сата. Направите резервне копије свих фајлова које желите да задржите.</translation>
 <translation id="6338981933082930623">Сви сајтови могу да приказују све огласе</translation>
@@ -5847,6 +5849,7 @@
 <translation id="6735304988756581115">Прикажи колачиће и остале податке са сајта...</translation>
 <translation id="6736243959894955139">Адреса</translation>
 <translation id="6737663862851963468">Уклоните Kerberos тикет</translation>
+<translation id="6738430949033571771">Верификује се налог…</translation>
 <translation id="6739923123728562974">Прикажи пречицу на радној површини</translation>
 <translation id="6740234557573873150">Преузимање датотеке <ph name="FILE_NAME" /> је паузирано</translation>
 <translation id="6741063444351041466"><ph name="BEGIN_LINK" />Администратор<ph name="END_LINK" /> је искључио безбедно прегледање</translation>
@@ -7665,6 +7668,8 @@
 <translation id="8546306075665861288">Кеш слике</translation>
 <translation id="8546930481464505581">Прилагоди додирну траку</translation>
 <translation id="8547013269961688403">Омогући лупу за цео екран</translation>
+<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" />Имејлом <ph name="USER_EMAIL" /> управља <ph name="MANAGER" />. Не можете да додате овај имејл као додатни налог.<ph name="END_PARAGRAPH1" />
+    <ph name="BEGIN_PARAGRAPH2" />Да бисте користили <ph name="USER_EMAIL" />, прво се одјавите са уређаја <ph name="DEVICE_TYPE" />. Затим у дну екрана за пријављивање изаберите Додај особу.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="85486688517848470">Задржите тастер за претрагу да бисте променили понашање тастера у горњем реду</translation>
 <translation id="8549316893834449916">За пријављивање на Chromebook ћете користити Google налог – исти који користите и за Gmail, Диск, YouTube и друго.</translation>
 <translation id="8551388862522347954">Лиценце</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index fd0fcb91..ab7392d 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -3791,6 +3791,7 @@
 <translation id="4648491805942548247">Idhini isiyotosha</translation>
 <translation id="4650591383426000695">Tenganisha simu yako na <ph name="DEVICE_TYPE" /></translation>
 <translation id="4651484272688821107">Imeshindwa kupakia kipengele cha mtandaoni chenye nyenzo za hali ya onyesho.</translation>
+<translation id="4651921906638302153">Huwezi kuingia kwa kutumia akaunti hii</translation>
 <translation id="4652935475563630866">Mabadiliko kwenye mipangilio ya kamera yanahitaji ufungue tena Parallels Desktop. Fungua tena Parallels Desktop ili uendelee.</translation>
 <translation id="4653405415038586100">Hitilafu ya kuweka mipangilio ya Linux</translation>
 <translation id="465406513924180949">Unaona vikapu vinavyokusaidia kurejea kwa urahisi kwenye bidhaa ulizoacha kwenye vikapu vya ununuzi kwenye wavuti.
@@ -5447,6 +5448,7 @@
 <translation id="6327785803543103246">Ugunduzi wa seva mbadala za wavuti kiotomatiki</translation>
 <translation id="6331818708794917058">Tovuti zinaweza kuomba ruhusa ya kuunganisha kwenye vifaa vya MIDI</translation>
 <translation id="6333064448949140209">Faili itatumwa kwa Google kwa ajili ya utatuzi</translation>
+<translation id="6333170995003625229">Imeshindwa kuthibitisha anwani ya barua pepe au nenosiri. Jaribu kuingia tena katika akaunti.</translation>
 <translation id="6335920438823100346">Ili uweze kufungua Linux, <ph name="MANAGER" /> inahitaji uhifadhi nakala ya data yako na urejeshe mipangilio ambayo Chromebook hii ilitoka nayo kiwandani.</translation>
 <translation id="6336038146639916978"><ph name="MANAGER" /> imezima utatuzi wa ADB. Hatua hii itarejesha mipangilio ambayo <ph name="DEVICE_TYPE" /> yako ilitoka nayo kiwandani, baada ya saa 24. Hifadhi nakala za faili zozote ambazo ungependa zisipotee.</translation>
 <translation id="6338981933082930623">Tovuti zote zinaweza kukuonyesha matangazo yoyote</translation>
@@ -5855,6 +5857,7 @@
 <translation id="6735304988756581115">Onyesha vidakuzi na data ya tovuti zingine...</translation>
 <translation id="6736243959894955139">Anwani</translation>
 <translation id="6737663862851963468">Ondoa tiketi ya Kerberos</translation>
+<translation id="6738430949033571771">Inathibitisha akaunti...</translation>
 <translation id="6739923123728562974">Onyesha mkato wa eneo-kazi</translation>
 <translation id="6740234557573873150">Imesitisha <ph name="FILE_NAME" /></translation>
 <translation id="6741063444351041466"><ph name="BEGIN_LINK" />Msimamizi wako<ph name="END_LINK" /> amezima mipangilio ya Kuvinjari Salama</translation>
@@ -7675,6 +7678,8 @@
 <translation id="8546306075665861288">Akiba ya picha</translation>
 <translation id="8546930481464505581">Badilisha Upau Mguso Utakavyo</translation>
 <translation id="8547013269961688403">Washa kikuzaji cha skrini nzima</translation>
+<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> inadhibitiwa na <ph name="MANAGER" />. Huwezi kuongeza barua pepe hii kuwa akaunti ya ziada.<ph name="END_PARAGRAPH1" />
+    <ph name="BEGIN_PARAGRAPH2" />Ili utumie <ph name="USER_EMAIL" />, ondoka kwanza katika akaunti kwenye <ph name="DEVICE_TYPE" /> yako. Kisha chini ya skrini ya kuingia katika akaunti, chagua Ongeza Wasifu.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="85486688517848470">Shikilia kitufe cha Utafutaji ili ubadilishe tabia ya vitufe vya juu vya safu mlalo</translation>
 <translation id="8549316893834449916">Utatumia Akaunti yako ya Google kuingia katika Chromebook yako – akaunti ile ile unayotumia kuingia kwenye Gmail, Hifadhi, YouTube na zaidi.</translation>
 <translation id="8551388862522347954">Leseni</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index caf7d1ef..607a0495 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -2136,7 +2136,7 @@
 <translation id="2989805286512600854">కొత్త ట్యాబ్‌లో తెరువు</translation>
 <translation id="2990313168615879645">Google ఖాతాను జోడించు</translation>
 <translation id="2990583317361835189">మోషన్ సెన్సార్‌లను ఉపయోగించడానికి సైట్‌లను అనుమతించకండి</translation>
-<translation id="2992931425024192067">మొత్తం నోటిఫికేషన్ కంటెంట్‌ను చూపు</translation>
+<translation id="2992931425024192067">మొత్తం నోటిఫికేషన్ కంటెంట్‌ను చూపించండి</translation>
 <translation id="2993517869960930405">యాప్‌ సమాచారం</translation>
 <translation id="2996286169319737844">మీ సింక్‌ రహస్య పదబంధంతో డేటా ఎన్‌క్రిప్ట్ చేయబడింది. Google Payకి చెందిన పేమెంట్ ఆప్షన్‌లు మరియు అడ్రస్‌లు ఇందులో ఉండవు.</translation>
 <translation id="2996722619877761919">పొడవైన అంచులో తిప్పు</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb
index 4a6c999b..dd4c436 100644
--- a/chrome/app/resources/generated_resources_uz.xtb
+++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -89,6 +89,9 @@
 <translation id="1082214733466244292">Administrator bu qurilma uchun ayrim funksiyalarni bloklagan</translation>
 <translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" /> brauzerning dastlabki sozlamalarini tiklamoqchi. Bosh sahifa, tezkor havolalar, qidiruv tizimi kabi sozlamalar qayta tayinlanadi, kengaytmalar o‘chirib qo‘yiladi va ochiq sahifalar yopiladi. Bundan tashqari, barcha cookie-fayllar kabi vaqtinchalik va keshlangan sayt ma’lumotlari o‘chiriladi.</translation>
 <translation id="1084096383128641877">Bu parol olib tashlangani bilan <ph name="DOMAIN" /> hisobingiz oʻchib ketmaydi. Boshqalardan himoyalash maqsadida <ph name="DOMAIN_LINK" /> hisobingiz parolini almashtiring yoki olib tashlang.</translation>
+<translation id="1084288067399862432">Oshkor qilingan parol almashtirildi.
+
+Parollarni istalgan vaqtda <ph name="GOOGLE_PASSWORD_MANAGER" /> orqali tekshirish mumkin.</translation>
 <translation id="1084824384139382525">Havola manzilini &amp;nusxalash</translation>
 <translation id="1085064499066015002">Doim barcha saytlarda</translation>
 <translation id="1085697365578766383">Virtual mashinani ishga tushirishda xatolik yuz berdi. Qaytadan urining.</translation>
@@ -1680,6 +1683,7 @@
 <translation id="2554553592469060349">Tanlangan fayl juda katta (maksimal hajm: 3mb).</translation>
 <translation id="2558569818338050235">Ochilgan saytlar tarixi chiqadigan reklamaga taʼsir qiladi</translation>
 <translation id="2558896001721082624">Maxsus imkoniyatlarni tizim menyusida ko‘rsatish</translation>
+<translation id="2559889124253841528">Qurilmaga saqlash</translation>
 <translation id="2564520396658920462">JavaScriptni AppleScript orqali bajarish funksiyasi o‘chiq. Uni yoqish uchun menyudagi  “Ko‘rish &gt; Dasturchilar uchun” sahifasi orqali Apple Events uchun JavaScript ishlatishga ruxsat bering. Batafsil axborot: https://support.google.com/chrome/?p=applescript</translation>
 <translation id="2564653188463346023">Kengaytirilgan imlo tekshiruvi</translation>
 <translation id="2568774940984945469">Ma’lumotlar paneli konteyneri</translation>
@@ -1690,6 +1694,7 @@
 <translation id="2575247648642144396">Agar kengaytma joriy sahifada ishlay olsa, uning ikonkasi paydo bo‘ladi. Bu kengaytmani ikonkasi ustiga bosib yoki <ph name="EXTENSION_SHORTCUT" /> tugmalar birkmasini bosib faollashtiring.</translation>
 <translation id="2575407791320728464">URL manzil yaroqsiz. Bexato formatlanganini tekshiring.</translation>
 <translation id="2575441894380764255">Yoqimsiz yoki befoyda reklamalar chiqishi taqiqlangan</translation>
+<translation id="2575713839157415345">{YEARS,plural, =1{Bu qurilma 1 yil davomida saqlanadi va unga keyingi safar kodsiz ulanish mumkin. Bu administrator tomonidan sozlangan.}other{Bu qurilma {YEARS} yil davomida saqlanadi va unga keyingi safar kodsiz ulanish mumkin. Bu administrator tomonidan sozlangan.}}</translation>
 <translation id="257779572837908839">Video muloqotlar uchun Chromebox sifatida foydalanish</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> saytidan har doim birdaniga bir nechta fayl yuklab olishga ruxsat berilsin</translation>
 <translation id="258095186877893873">Uzoq</translation>
@@ -1704,6 +1709,7 @@
 <translation id="25899519884572181">Mutolaa rejimidan chiqish</translation>
 <translation id="2593499352046705383">Boshlashdan oldin maʼlumotlaringizni zaxiralang. <ph name="DEVICE_OS" /> oʻrnatilsa, qattiq diskdagi barcha maʼlumotlar tozalanadi. Batafsil: g.co/flex/InstallGuide.</translation>
 <translation id="2594999711683503743">Qidiring yoki veb-sahifa manzilini kiriting</translation>
+<translation id="2597976513418770460">Chrome brauzeri maʼlumotlarini <ph name="ACCOUNT_EMAIL" /> profilidan oling</translation>
 <translation id="2602501489742255173">Boshlash uchun tepaga suring</translation>
 <translation id="2603115962224169880">Kompyuterni tozalash vositasi</translation>
 <translation id="2603355571917519942">Voice Match tayyor</translation>
@@ -2988,6 +2994,7 @@
 <translation id="3856800405688283469">Vaqt mintaqasini tanlang</translation>
 <translation id="3857807444929313943">Barmoqni oling va qaytadan tekkizing</translation>
 <translation id="3858860766373142691">Ism</translation>
+<translation id="385939467708172187">Kuchli parol ishlatish</translation>
 <translation id="3861638017150647085">“<ph name="USERNAME" />” nomi band</translation>
 <translation id="3861977424605124250">Boshlanishida koʻrsatilsin</translation>
 <translation id="386239283124269513">Guruhni tiklash</translation>
@@ -3231,6 +3238,7 @@
 <translation id="4089235344645910861">Sozlamalar saqlandi. Sinxronizatsiya boshlandi.</translation>
 <translation id="4090103403438682346">Tekshirilgan ruxsat xizmatini yoqish</translation>
 <translation id="4090947011087001172"><ph name="SITE" /> saytidagi ruxsatlar asliga qaytarilsinmi?</translation>
+<translation id="4092636882861724179">Saqlangan parollarni <ph name="GOOGLE_PASSWORD_MANAGER" /> orqali koʻrish va boshqarish mumkin.</translation>
 <translation id="4093865285251893588">Profil rasmi</translation>
 <translation id="4093955363990068916">Lokal fayl:</translation>
 <translation id="4094647278880271855">Siz moslanmagan muhit qiymatidan foydalanyapsiz: <ph name="BAD_VAR" />. Barqarorlik va xavfsizlikka zarar tegishi mumkin.</translation>
@@ -3442,6 +3450,7 @@
 <translation id="4307992518367153382">Asosiy</translation>
 <translation id="4309165024397827958">Joylashuv axborotiga ruxsati bor Android ilova va xizmatlariga qurilmangiz joylashuvi haqidagi axborotdan foydalanishiga ruxsat bering. Joylashuv axborotining aniqligini oshirish hamda ayrim xizmatlar sifatini yaxshilash maqsadida Google vaqti-vaqti bilan foydalanuvchilarning joylashuvi haqidagi anonimlashtirilgan axborotni olib turishi ham mumkin.</translation>
 <translation id="4309420042698375243"><ph name="NUM_KILOBYTES" /> KB (<ph name="NUM_KILOBYTES_LIVE" /> KB faol)</translation>
+<translation id="4310132194679586591">Bu havolani ochish uchun qurilmangizdagi ilovani tanlang</translation>
 <translation id="4310139701823742692">Fayl formati nosoz. PPD faylni tekshiring va yana urinib ko‘ring.</translation>
 <translation id="431076611119798497">&amp;Tafsilotlar</translation>
 <translation id="4312701113286993760">{COUNT,plural, =1{1 ta Google hisobi}other{<ph name="EXTRA_ACCOUNTS" /> ta Google hisobi}}</translation>
@@ -3521,6 +3530,7 @@
 <translation id="4392896746540753732">Konfiguratsiya faylini tahrirlash</translation>
 <translation id="4394049700291259645">Faolsizlantirish</translation>
 <translation id="4396956294839002702">{COUNT,plural, =0{Barchasini &amp;ochish}=1{Bukmarkni &amp;ochish}other{Barchasini ({COUNT}) &amp;ochish}}</translation>
+<translation id="4397372003838952832">Bu parolni eslab qolishingiz shart emas. <ph name="EMAIL" /> hisobining paroli <ph name="GOOGLE_PASSWORD_MANAGER" />ga saqlanadi</translation>
 <translation id="439817266247065935">Qurilmangiz seansi xato yakunlangan. Linux ilovalarini ishlatish uchun Linuxni qaytadan ishga tushiring.</translation>
 <translation id="4400367121200150367">Bu yerda parollarni saqlash hech qachon taklif qilinmaydigan saytlar ko‘rsatiladi</translation>
 <translation id="4400632832271803360">Yuqori qatordagi tugmalar rejimni almashtirish uchun qidiruv tugmasini bosib turing</translation>
@@ -3534,6 +3544,7 @@
 <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation>
 <translation id="440653823335387109">SIZ OʻQIGAN SAHIFALAR</translation>
 <translation id="4406883609789734330">Jonli izoh</translation>
+<translation id="4407039574263172582">Davom etish uchun <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ism, email manzil va profil rasmingizni bu sayt bilan ulashadi. Bu saytning <ph name="BEGIN_LINK" />xizmat shartlari<ph name="END_LINK" />.</translation>
 <translation id="4408599188496843485">&amp;Yordam</translation>
 <translation id="4409271659088619928">Qidiruv tizimingiz: <ph name="DSE" />. Imkon boʻlsa, qidiruv tarixini qanday tozalash haqidagi koʻrsatmalarni oching.</translation>
 <translation id="4409697491990005945">Maydonlar</translation>
@@ -3718,6 +3729,7 @@
 <translation id="4579453506923101210">Ulangan telefonni oʻchirish</translation>
 <translation id="4579581181964204535"><ph name="HOST_NAME" /> translatsiya qilinmadi.</translation>
 <translation id="4579876313423027742">Brauzer bildirishnomalari <ph name="LINK_BEGIN" />Chrome brauzeri sozlamalari<ph name="LINK_END" /> sahifasida boshqariladi</translation>
+<translation id="4580596421317071374">Bu qurilmadagi parollar <ph name="GOOGLE_PASSWORD_MANAGER" />ga saqlanadi.</translation>
 <translation id="4581774856936278355">Linux tiklanmadi</translation>
 <translation id="4582297591746054421">Saytlar odatda nusxalanayotgan matn formatini saqlab qolish uchun klipbord axborotini oʻqiydi</translation>
 <translation id="4582563038311694664">Barcha sozlamalarni dastlabki holatga qaytarish</translation>
@@ -3783,6 +3795,7 @@
 <translation id="4648491805942548247">Ruxsatnomalar yetarli emas</translation>
 <translation id="4650591383426000695">Telefoningizni <ph name="DEVICE_TYPE" /> qurilmasidan uzing</translation>
 <translation id="4651484272688821107">Demo rejim manbalari bilan onlayn komponent yuklanmadi.</translation>
+<translation id="4651921906638302153">Bu hisob orqali kirilmadi</translation>
 <translation id="4652935475563630866">Kamera sozlamasi oʻzgarishi uchun Parallels Desktopni qaytadan ishga tushiring. Davom etish uchun Parallels Desktopni qayta ishga tushiring.</translation>
 <translation id="4653405415038586100">Linux tizimini sozlashda xatolik</translation>
 <translation id="465406513924180949">Xarid savatchalarida qoldirgan narsalaringizga osongina qaytishingiz uchun internetda xarid savatchasi chiqyapti.
@@ -3889,6 +3902,7 @@
 <translation id="4761104368405085019">Mikrofoningizni ishlatish</translation>
 <translation id="4762718786438001384">Qurilma diskida bo‘sh joy deyarli qolmadi</translation>
 <translation id="4763408175235639573">Bu sahifaga tashrif buyurish vaqtida kompyuteringizga quyidagi cookie fayllari saqlandi:</translation>
+<translation id="4765524037138975789">{MONTHS,plural, =1{Bu qurilma 1 oy davomida saqlanadi va unga keyingi safar kodsiz ulanish mumkin. Bu administrator tomonidan sozlangan.}other{Bu qurilma {MONTHS} oy davomida saqlanadi va unga keyingi safar kodsiz ulanish mumkin. Bu administrator tomonidan sozlangan.}}</translation>
 <translation id="4765582662863429759">Android Xabarlar ilovasi matnlarni telefoningizdan Chromebook qurilmasiga retranslatsiya qilish imkonini beradi</translation>
 <translation id="4768332406694066911">Sizda haqiqiyligingizni tasdiqlovchi quyidagi tashkilotlar sertifikatlari mavjud</translation>
 <translation id="4770119228883592393">Ruxsat talabi keldi, javob berish uchun ⌘ + Option + Pastga strelka tugmalarini bosing</translation>
@@ -4503,6 +4517,7 @@
 <translation id="5398497406011404839">Yashirin bukmarklar</translation>
 <translation id="5398572795982417028">Sahifa raqami noto‘g‘ri kiritildi, maksimal raqam: <ph name="MAXIMUM_PAGE" /></translation>
 <translation id="5401426944298678474">Saytga obunani bekor qilish</translation>
+<translation id="5401851137404501592">Davom etish uchun <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ism, email manzil va profil rasmingizni bu sayt bilan ulashadi.</translation>
 <translation id="5402815541704507626">Yangilanish mobil internet orqali yuklanmoqda</translation>
 <translation id="540296380408672091"><ph name="HOST" /> saytida cookie-fayllar doim bloklansin</translation>
 <translation id="5404740137318486384">“<ph name="ACTION" />” amali uchun belgilanadigan kalit yoki klaviatura tugmasini bosing.
@@ -4666,6 +4681,7 @@
 <translation id="5554403733534868102">Bundan keyin yangilanishlar kutilmaydi</translation>
 <translation id="5554489410841842733">Agar kengaytma joriy sahifada ishlay olsa, uning nishochasi ko‘rinadi.</translation>
 <translation id="5554720593229208774">Email sertifikatlash markasi</translation>
+<translation id="5554866693883022680">Bu havolani ochish uchun <ph name="DEVICE_TYPE" /> qurilmangizdagi ilovani tanlang</translation>
 <translation id="5555363196923735206">Kamerani almashtirish</translation>
 <translation id="5555525474779371165">Saytlarni xavfsiz kezish himoyasini tanlang</translation>
 <translation id="5556459405103347317">Qayta yuklash</translation>
@@ -5358,6 +5374,7 @@
 <translation id="6250186368828697007">Ekran namoyishida tafsilotlar berkitiladi</translation>
 <translation id="6251870443722440887">GDI-deskriptorlar</translation>
 <translation id="625369703868467034">Tarmoq holati</translation>
+<translation id="6253801023880399036">Parollar <ph name="GOOGLE_PASSWORD_MANAGER" />ga saqlanadi</translation>
 <translation id="6254503684448816922">Kalit oshkor bo‘lishi</translation>
 <translation id="6254892857036829079">Aʼlo darajada</translation>
 <translation id="6257602895346497974">Sinxronizatsiyani yoqish...</translation>
@@ -5439,6 +5456,7 @@
 <translation id="6327785803543103246">Proksi-server avtomatik aniqlanishi</translation>
 <translation id="6331818708794917058">Saytlar MIDI qurilmarga ulanishga ruxsat soʻray oladi</translation>
 <translation id="6333064448949140209">Fayl batafsil ko‘rib chiqilishi uchun Google serverlariga yuboriladi</translation>
+<translation id="6333170995003625229">Email manzil yoki parolingiz tekshirilmadi. Qaytadan kirishga urining.</translation>
 <translation id="6335920438823100346">Linux ishga tushirilishi uchun <ph name="MANAGER" /> maʼlumotlaringizni zaxiralash va bu Chromebookni zavod sozlamalariga qaytarishni talab qiladi.</translation>
 <translation id="6336038146639916978">ADB tuzatish vositasi <ph name="MANAGER" /> tomonidan faolsizlantirildi. Barcha <ph name="DEVICE_TYPE" /> parametrlari 24 soatdan keyin asl holatiga qaytariladi. Kerakli fayllarni saqlab qolish uchun ularni zaxiralang.</translation>
 <translation id="6338981933082930623">Barcha saytlar har qanday reklama chiqarishi mumkin</translation>
@@ -5847,6 +5865,7 @@
 <translation id="6735304988756581115">Cookie fayllari va boshqa sayt ma‘lumotlarini ko‘rsatish...</translation>
 <translation id="6736243959894955139">Manzil</translation>
 <translation id="6737663862851963468">Kerberos chiptasini olib tashlash</translation>
+<translation id="6738430949033571771">Hisob tekshirilmoqda...</translation>
 <translation id="6739923123728562974">Yorliqni ish stolida ko‘rsatish</translation>
 <translation id="6740234557573873150">“<ph name="FILE_NAME" />” faylini yuklab olish vaqtincha to‘xtatildi</translation>
 <translation id="6741063444351041466">Saytlarni xavfsiz kezish rejimini <ph name="BEGIN_LINK" />administrator<ph name="END_LINK" /> faolsizlantirgan</translation>
@@ -6380,6 +6399,7 @@
 <translation id="7282547042039404307">Ravon</translation>
 <translation id="7282992757463864530">Axborot paneli</translation>
 <translation id="7283555985781738399">Mehmon rejimi</translation>
+<translation id="7284307451964417957">{DAYS,plural, =1{Bu qurilma 1 kun davomida saqlanadi va unga keyingi safar kodsiz ulanish mumkin. Bu administrator tomonidan sozlangan.}other{Bu qurilma {DAYS} kun davomida saqlanadi va unga keyingi safar kodsiz ulanish mumkin. Bu administrator tomonidan sozlangan.}}</translation>
 <translation id="7284411326658527427">Har bir odamning hisobi alohida moslashtiriladi va ularning maʼlumotlari xavfsiz saqlanadi.</translation>
 <translation id="7287143125007575591">Ruxsat berilmadi.</translation>
 <translation id="7287411021188441799">Standart fonni tiklash</translation>
@@ -6584,6 +6604,7 @@
 <translation id="7488682689406685343">Bu saytda asabga teguvchi bildirishnomalarga ruxsat berilishi mumkin.</translation>
 <translation id="7489761397368794366">Qurilmangizdan telefon qilish</translation>
 <translation id="749028671485790643"><ph name="VALUE" /> ta foydalanuvchi</translation>
+<translation id="7490683549040131791">Qolgan parollarni tekshirish</translation>
 <translation id="7491962110804786152">tab</translation>
 <translation id="7491963308094506985">{NUM_COOKIES,plural, =1{1 ta cookie fayl}other{{NUM_COOKIES} ta cookie fayl}}</translation>
 <translation id="7493386493263658176">“<ph name="EXTENSION_NAME" />” kengaytmasi parollar va bank kartalaringiz kabi barcha matnlarni saqlay oladi. Ishga tushirilsinmi?</translation>
@@ -7426,6 +7447,7 @@
 <translation id="8275080796245127762">Qurilmangizdan telefon qilish</translation>
 <translation id="8275339871947079271">Istalgan joydan xavfsiz kirish uchun parolingizni Google hisobingizga saqlang</translation>
 <translation id="8276560076771292512">Keshni tozalash va qurilmani qaytadan ishga tushirish</translation>
+<translation id="8281721647184388851">Chrome brauzeri sinxronizatsiyasi yoqilsinmi?</translation>
 <translation id="8281886186245836920">Tashlab ketish</translation>
 <translation id="8283475148136688298">“<ph name="DEVICE_NAME" />” qurilmasiga ulanishda haqiqiylik tekshiruvi kodi rad etildi.</translation>
 <translation id="8284279544186306258">barcha <ph name="WEBSITE_1" /> saytlari</translation>
@@ -7474,6 +7496,7 @@
 <translation id="8335587457941836791">Javondan olib tashlash</translation>
 <translation id="8336407002559723354">Yangilanishlar <ph name="MONTH_AND_YEAR" /> sanasigacha</translation>
 <translation id="8336739000755212683">Qurilmadagi hisob rasmini almashtirish</translation>
+<translation id="8337020675372081178">{HOURS,plural, =1{Bu qurilma 1 soat davomida saqlanadi va unga keyingi safar kodsiz ulanish mumkin. Bu administrator tomonidan sozlangan.}other{Bu qurilma {HOURS} soat davomida saqlanadi va unga keyingi safar kodsiz ulanish mumkin. Bu administrator tomonidan sozlangan.}}</translation>
 <translation id="8337047789441383384">Bu elektron kalit allaqachon registratsiya qilingan. Uni qaytadan registratsiya qilish shart emas.</translation>
 <translation id="8338952601723052325">Dasturchi sayti</translation>
 <translation id="8339059274628563283"><ph name="SITE" /> saytining mahalliy ma’lumotlari</translation>
@@ -7580,6 +7603,7 @@
 <translation id="8448729345478502352">Ekrandagi elementlarni kichiklashtirish yoki kattalashtirish</translation>
 <translation id="8449008133205184768">Uslubni solishtirib joylash</translation>
 <translation id="8449036207308062757">Xotirani boshqarish</translation>
+<translation id="8451192282033883849">Hisobingiz <ph name="MANAGER_NAME" /> domenida boshqariladi. Administrator Chrome brauzeri profili va undagi bukmarklar, tarix va parollar kabi maʼlumotlarni koʻrib, tahrirlay oladi.</translation>
 <translation id="8456512334795994339">Ish va hordiq uchun ilovalar</translation>
 <translation id="845702320058262034">Ulanilmadi. Telefoningizda Bluetooth yoniqligini tekshiring</translation>
 <translation id="8457451314607652708">Xatcho‘plarni import qilish</translation>
@@ -7664,6 +7688,8 @@
 <translation id="8546306075665861288">Tasvirlar keshi</translation>
 <translation id="8546930481464505581">Tegish panelini sozlash</translation>
 <translation id="8547013269961688403">Lupani butun ekranda ochish</translation>
+<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> manzili <ph name="MANAGER" /> tomonidan boshqariladi. Bu email manzildan qoʻshimcha hisob sifatida kirita olmaysiz.<ph name="END_PARAGRAPH1" />
+    <ph name="BEGIN_PARAGRAPH2" /><ph name="USER_EMAIL" /> ishlatish uchun avval <ph name="DEVICE_TYPE" /> qurilmangizdagi hisobingizdan chiqing. Keyin kirish ekranining quyi qismida Foydalanuvchini kiritish tugmasini bosing.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="85486688517848470">Yuqori qatordagi tugmalar rejimni almashtirish uchun qidiruv tugmasini bosib turing</translation>
 <translation id="8549316893834449916">Chromebook qurilmangizga – Gmail, Drive, YouTube va boshqa xizmatlarda ishlatadigan Google hisobingizdan kirish mumkin.</translation>
 <translation id="8551388862522347954">Litsenziyalar</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb
index 3cd805a..5bde0c66 100644
--- a/chrome/app/resources/generated_resources_zh-HK.xtb
+++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -3796,6 +3796,7 @@
 <translation id="4648491805942548247">權限不足</translation>
 <translation id="4650591383426000695">中斷手機與 <ph name="DEVICE_TYPE" /> 的連線</translation>
 <translation id="4651484272688821107">無法使用示範模式的資源載入網上組件。</translation>
+<translation id="4651921906638302153">無法使用此帳戶登入</translation>
 <translation id="4652935475563630866">Parallels Desktop 需要重新啟動,相機設定的變更才會生效。重新啟動 Parallels Desktop 即可繼續。</translation>
 <translation id="4653405415038586100">設定 Linux 時發生錯誤</translation>
 <translation id="465406513924180949">畫面會顯示購物車,以便您在網絡上輕鬆查看購物車中的商品。
@@ -5450,6 +5451,7 @@
 <translation id="6327785803543103246">Web Proxy Autodiscovery</translation>
 <translation id="6331818708794917058">網站可要求連接 MIDI 裝置</translation>
 <translation id="6333064448949140209">檔案將傳送至 Google 執行偵錯</translation>
+<translation id="6333170995003625229">無法驗證您的電郵地址或密碼,請再試一次。</translation>
 <translation id="6335920438823100346">「<ph name="MANAGER" />」要求您備份資料並將此 Chromebook 回復原廠設定,才能啟動 Linux。</translation>
 <translation id="6336038146639916978"><ph name="MANAGER" /> 已停用 ADB 偵錯。這會讓系統在 24 小時後重設您的 <ph name="DEVICE_TYPE" />。請備份您想保留的檔案。</translation>
 <translation id="6338981933082930623">所有網站都可向您顯示任何廣告</translation>
@@ -5858,6 +5860,7 @@
 <translation id="6735304988756581115">顯示 Cookie 和其他網站數據…</translation>
 <translation id="6736243959894955139">位址</translation>
 <translation id="6737663862851963468">移除 Kerberos 票證</translation>
+<translation id="6738430949033571771">正在驗證帳戶…</translation>
 <translation id="6739923123728562974">顯示桌面捷徑</translation>
 <translation id="6740234557573873150">已暫停下載「<ph name="FILE_NAME" />」</translation>
 <translation id="6741063444351041466"><ph name="BEGIN_LINK" />您的管理員<ph name="END_LINK" />已停用「安全瀏覽」功能</translation>
@@ -7677,6 +7680,8 @@
 <translation id="8546306075665861288">圖片快取</translation>
 <translation id="8546930481464505581">自訂 Touch Bar</translation>
 <translation id="8547013269961688403">啟用全螢幕放大鏡</translation>
+<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> 由 <ph name="MANAGER" /> 管理。您無法將此電郵新增為其他帳戶。<ph name="END_PARAGRAPH1" />
+    <ph name="BEGIN_PARAGRAPH2" />如要使用 <ph name="USER_EMAIL" />,請先登出 <ph name="DEVICE_TYPE" />,然後在登入畫面的底部選取 [新增使用者]。<ph name="END_PARAGRAPH2" /></translation>
 <translation id="85486688517848470">按住搜尋鍵即可切換最上排按鍵的執行動作</translation>
 <translation id="8549316893834449916">您將使用 Google 帳戶登入 Chromebook,Google 帳戶是您用於 Gmail、雲端硬碟、YouTube 和其他服務的帳戶。</translation>
 <translation id="8551388862522347954">授權</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index e6949418..94b1f733 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -3777,6 +3777,7 @@
 <translation id="4648491805942548247">權限不足</translation>
 <translation id="4650591383426000695">中斷手機與 <ph name="DEVICE_TYPE" /> 的連線</translation>
 <translation id="4651484272688821107">無法使用示範模式的資源載入線上元件。</translation>
+<translation id="4651921906638302153">無法登入這個帳戶</translation>
 <translation id="4652935475563630866">必須重新啟動 Parallels Desktop,攝影機設定的變更才會生效。請重新啟動 Parallels Desktop 以繼續操作。</translation>
 <translation id="4653405415038586100">設定 Linux 時發生錯誤</translation>
 <translation id="465406513924180949">畫面上會顯示購物車,方便你在網路上輕鬆查看購物車中的商品。
@@ -5430,6 +5431,7 @@
 <translation id="6327785803543103246">網路 Proxy 自動探索</translation>
 <translation id="6331818708794917058">網站可以要求連線至 MIDI 裝置</translation>
 <translation id="6333064448949140209">檔案會傳送給 Google 進行偵錯</translation>
+<translation id="6333170995003625229">無法驗證你的電子郵件地址或密碼,請再試一次。</translation>
 <translation id="6335920438823100346"><ph name="MANAGER" /> 要求你備份資料,並將這部 Chromebook 恢復原廠設定,才能啟動 Linux。</translation>
 <translation id="6336038146639916978"><ph name="MANAGER" /> 已停用 ADB 偵錯,這會讓系統在 24 小時後重設 <ph name="DEVICE_TYPE" />。請備份你要保留的檔案。</translation>
 <translation id="6338981933082930623">所有網站都可以向你顯示任何廣告</translation>
@@ -5837,6 +5839,7 @@
 <translation id="6735304988756581115">顯示 Cookie 和其他網站資料...</translation>
 <translation id="6736243959894955139">位址</translation>
 <translation id="6737663862851963468">移除 Kerberos 票證</translation>
+<translation id="6738430949033571771">正在驗證帳戶...</translation>
 <translation id="6739923123728562974">顯示桌面捷徑</translation>
 <translation id="6740234557573873150">已暫停下載 <ph name="FILE_NAME" /></translation>
 <translation id="6741063444351041466"><ph name="BEGIN_LINK" />系統管理員<ph name="END_LINK" />已停用安全瀏覽功能</translation>
@@ -7656,6 +7659,8 @@
 <translation id="8546306075665861288">圖片快取</translation>
 <translation id="8546930481464505581">自訂 Touch Bar</translation>
 <translation id="8547013269961688403">啟用全螢幕放大鏡</translation>
+<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> 是由 <ph name="MANAGER" /> 管理。你無法將這個電子郵件地址新增為其他帳戶。<ph name="END_PARAGRAPH1" />
+    <ph name="BEGIN_PARAGRAPH2" />如要使用 <ph name="USER_EMAIL" />,請先登出 <ph name="DEVICE_TYPE" />,然後在登入畫面底部選取「新增使用者」。<ph name="END_PARAGRAPH2" /></translation>
 <translation id="85486688517848470">按住搜尋鍵即可切換最上排按鍵的行為</translation>
 <translation id="8549316893834449916">你將使用 Google 帳戶登入 Chromebook,Google 帳戶是你用於 Gmail、雲端硬碟、YouTube 和其他服務的帳戶。</translation>
 <translation id="8551388862522347954">授權</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bs.xtb b/chrome/app/resources/google_chrome_strings_bs.xtb
index d6a70909..df792a98 100644
--- a/chrome/app/resources/google_chrome_strings_bs.xtb
+++ b/chrome/app/resources/google_chrome_strings_bs.xtb
@@ -191,6 +191,7 @@
 <translation id="4969674060580488087">ChromeOS Flex nije mogao sinhronizirati vaše podatke jer su detalji za prijavu na vaš račun zastarjeli.</translation>
 <translation id="4970761609246024540">Dobro došli u Chrome profile</translation>
 <translation id="4970880042055371251">Verzija ChromeOS-a</translation>
+<translation id="4970947549776831107">Chrome je blokirao datoteku jer je ta vrsta datoteke opasna</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
 <translation id="5037581483200764584">Da primate buduća ažuriranja za Google Chrome, trebat će vam macOS 10.13 ili novija verzija. Ovaj računar koristi OS X 10.11.</translation>
 <translation id="5112116809696021727">Da vidite je li vaš uređaj ažuriran, idite u <ph name="LINK_BEGIN" />Postavke ChromeOS-a<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_et.xtb b/chrome/app/resources/google_chrome_strings_et.xtb
index c958418..c0959b74 100644
--- a/chrome/app/resources/google_chrome_strings_et.xtb
+++ b/chrome/app/resources/google_chrome_strings_et.xtb
@@ -189,6 +189,7 @@
 <translation id="4969674060580488087">Chrome OS Flex ei saanud andmeid sünkroonida, sest teie konto sisselogimisandmed on aegunud.</translation>
 <translation id="4970761609246024540">Tere tulemast kasutama Chrome'i profiile</translation>
 <translation id="4970880042055371251">Chrome OS-i versioon</translation>
+<translation id="4970947549776831107">Chrome blokeeris selle faili, kuna see failitüüp on ohtlik</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
 <translation id="5037581483200764584">Google Chrome'i tulevaste värskenduste saamiseks on teil vaja operatsioonisüsteemi macOS 10.13 või uuemat versiooni. See arvuti kasutab operatsioonisüsteemi OS X 10.11.</translation>
 <translation id="5112116809696021727">Kui soovite teada saada, kas teie seade on ajakohane, avage <ph name="LINK_BEGIN" />Chromium OS-i seaded<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_hr.xtb b/chrome/app/resources/google_chrome_strings_hr.xtb
index b15215a..a187e64 100644
--- a/chrome/app/resources/google_chrome_strings_hr.xtb
+++ b/chrome/app/resources/google_chrome_strings_hr.xtb
@@ -188,6 +188,7 @@
 <translation id="4969674060580488087">ChromeOS Flex nije mogao sinkronizirati vaše podatke jer su vaši podaci za prijavu na račun zastarjeli.</translation>
 <translation id="4970761609246024540">Dobro došli u Chromeove profile</translation>
 <translation id="4970880042055371251">Verzija Chrome OS-a</translation>
+<translation id="4970947549776831107">Chrome je blokirao datoteku jer je ta vrsta datoteke opasna</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
 <translation id="5037581483200764584">Da biste primali buduća ažuriranja Google Chromea, trebat će vam macOS 10.13 ili novija verzija. Na ovom se računalu upotrebljava OS X 10.11.</translation>
 <translation id="5112116809696021727">Ažuriranost uređaja možete provjeriti u <ph name="LINK_BEGIN" />postavkama Chrome OS-a<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_ja.xtb b/chrome/app/resources/google_chrome_strings_ja.xtb
index bdc8709..eb61540 100644
--- a/chrome/app/resources/google_chrome_strings_ja.xtb
+++ b/chrome/app/resources/google_chrome_strings_ja.xtb
@@ -187,6 +187,7 @@
 <translation id="4969674060580488087">アカウントのログイン情報が最新ではないため、ChromeOS Flex はデータを同期できませんでした。</translation>
 <translation id="4970761609246024540">Chrome プロフィールへようこそ</translation>
 <translation id="4970880042055371251">Chrome OS のバージョン</translation>
+<translation id="4970947549776831107">危険なファイル形式のため Chrome でブロックされました</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
 <translation id="5037581483200764584">今後、Google Chrome のアップデートを受信するには、macOS 10.13 以降が必要となります。このコンピュータでは OS X 10.11 が実行されています。</translation>
 <translation id="5112116809696021727">デバイスが最新の状態かどうかを確認するには、<ph name="LINK_BEGIN" />Chrome OS の設定<ph name="LINK_END" />をご覧ください</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ka.xtb b/chrome/app/resources/google_chrome_strings_ka.xtb
index f0b4105..4bf004f8 100644
--- a/chrome/app/resources/google_chrome_strings_ka.xtb
+++ b/chrome/app/resources/google_chrome_strings_ka.xtb
@@ -191,6 +191,7 @@
 <translation id="4969674060580488087">ChromeOS Flex-მა ვერ მოახერხა თქვენი მონაცემების სინქრონიზაცია, რადგან თქვენი ანგარიშის სისტემაში შესვლის მონაცემები მოძველდა.</translation>
 <translation id="4970761609246024540">მოგესალმებათ Chrome პროფილები</translation>
 <translation id="4970880042055371251">ChromeOS ვერსია</translation>
+<translation id="4970947549776831107">Chrome-მა დაბლოკა ეს ფაილი, რადგან ამ ტიპის ფაილი სახიფათოა</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
 <translation id="5037581483200764584">Google Chrome-ის მომავალი განახლებების მისაღებად დაგჭირდებათ macOS 10.13 ან უფრო ახალი ვერსია. ეს კომპიუტერი იყენებს OS X 10.11-ს.</translation>
 <translation id="5112116809696021727">თქვენი მოწყობილობის განახლების სტატუსის სანახავად გადადით <ph name="LINK_BEGIN" />ChromeOS-ის პარამეტრებზე<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb
index c4f224b..15123f1e 100644
--- a/chrome/app/resources/google_chrome_strings_nl.xtb
+++ b/chrome/app/resources/google_chrome_strings_nl.xtb
@@ -190,6 +190,7 @@
 <translation id="4969674060580488087">Chrome OS Flex kan je gegevens niet synchroniseren omdat de inloggegevens voor je account zijn verouderd.</translation>
 <translation id="4970761609246024540">Welkom bij Chrome-profielen</translation>
 <translation id="4970880042055371251">Chrome OS-versie</translation>
+<translation id="4970947549776831107">Chrome heeft dit bestand geblokkeerd omdat dit type bestand gevaarlijk is</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
 <translation id="5037581483200764584">Als je toekomstige Google Chrome-updates wilt krijgen, heb je macOS 10.13 of hoger nodig. Deze computer gebruikt OS X 10.11.</translation>
 <translation id="5112116809696021727">Ga naar de <ph name="LINK_BEGIN" />instellingen van Chrome OS<ph name="LINK_END" /> om te kijken of je apparaat up-to-date is</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pl.xtb b/chrome/app/resources/google_chrome_strings_pl.xtb
index db47905..b7065e4 100644
--- a/chrome/app/resources/google_chrome_strings_pl.xtb
+++ b/chrome/app/resources/google_chrome_strings_pl.xtb
@@ -186,6 +186,7 @@
 <translation id="4969674060580488087">W ChromeOS Flex nie udało się zsynchronizować danych, ponieważ dane logowania na Twoje konto są nieaktualne.</translation>
 <translation id="4970761609246024540">Witamy w profilach Chrome</translation>
 <translation id="4970880042055371251">Wersja Chrome OS</translation>
+<translation id="4970947549776831107">Plik został zablokowany przez Chrome, bo ten typ pliku jest niebezpieczny</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
 <translation id="5037581483200764584">Aby otrzymywać w przyszłości aktualizacje Google Chrome, musisz mieć system macOS 10.13 lub nowszy. Na komputerze jest zainstalowany system OS X 10.11.</translation>
 <translation id="5112116809696021727">Aby sprawdzić, czy urządzenie jest zaktualizowane, otwórz <ph name="LINK_BEGIN" />ustawienia Chrome OS<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_ro.xtb b/chrome/app/resources/google_chrome_strings_ro.xtb
index 0fca574..f0a70131d 100644
--- a/chrome/app/resources/google_chrome_strings_ro.xtb
+++ b/chrome/app/resources/google_chrome_strings_ro.xtb
@@ -186,6 +186,7 @@
 <translation id="4969674060580488087">Sistemul de operare Chrome Flex nu a putut sincroniza datele, deoarece detaliile de conectare pentru cont nu sunt actualizate.</translation>
 <translation id="4970761609246024540">Bun venit la profilurile Chrome</translation>
 <translation id="4970880042055371251">Versiunea sistemului de operare Chrome</translation>
+<translation id="4970947549776831107">Chrome a blocat fișierul deoarece acest tip de fișier este periculos</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
 <translation id="5037581483200764584">Pentru a primi actualizările Google Chrome viitoare, vei avea nevoie de macOS 10.13 sau o versiune ulterioară. Acest computer folosește OS X 10.11.</translation>
 <translation id="5112116809696021727">Pentru a verifica dacă dispozitivul este actualizat, accesează <ph name="LINK_BEGIN" />Setările sistemului de operare Chrome<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb
index 8296070..58b7be46 100644
--- a/chrome/app/resources/google_chrome_strings_ru.xtb
+++ b/chrome/app/resources/google_chrome_strings_ru.xtb
@@ -187,6 +187,7 @@
 <translation id="4969674060580488087">Chrome OS Flex не удалось выполнить синхронизацию, так как учетные данные устарели.</translation>
 <translation id="4970761609246024540">Представляем профили Chrome</translation>
 <translation id="4970880042055371251">Версия Chrome OS</translation>
+<translation id="4970947549776831107">Chrome заблокировал файл с опасным расширением.</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
 <translation id="5037581483200764584">На вашем компьютере используется OS X 10.11. Чтобы получать обновления Google Chrome, установите на устройство macOS 10.13 или более поздней версии.</translation>
 <translation id="5112116809696021727">Чтобы посмотреть, обновлена ли операционная система устройства, перейдите в <ph name="LINK_BEGIN" />настройки Chrome OS<ph name="LINK_END" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr-Latn.xtb b/chrome/app/resources/google_chrome_strings_sr-Latn.xtb
index 56e045d..e8dff21 100644
--- a/chrome/app/resources/google_chrome_strings_sr-Latn.xtb
+++ b/chrome/app/resources/google_chrome_strings_sr-Latn.xtb
@@ -192,6 +192,7 @@
 <translation id="4969674060580488087">Chrome OS Flex ne može da sinhronizuje podatke zato što su podaci za prijavljivanje na nalog zastareli.</translation>
 <translation id="4970761609246024540">Dobro došli u Chrome profile</translation>
 <translation id="4970880042055371251">Verzija Chrome OS-a</translation>
+<translation id="4970947549776831107">Chrome je blokirao ovaj fajl jer je ovaj tip fajla opasan</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
 <translation id="5037581483200764584">Da biste dobijali buduća Google Chrome ažuriranja, treba vam macOS 10.13 ili novija verzija. Ovaj računar koristi OS X 10.11.</translation>
 <translation id="5112116809696021727">Da biste proverili da li je uređaj ažuriran, idite u <ph name="LINK_BEGIN" />Podešavanja Chrome OS-a<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr.xtb b/chrome/app/resources/google_chrome_strings_sr.xtb
index 8898b4b..64e6760 100644
--- a/chrome/app/resources/google_chrome_strings_sr.xtb
+++ b/chrome/app/resources/google_chrome_strings_sr.xtb
@@ -192,6 +192,7 @@
 <translation id="4969674060580488087">Chrome OS Flex не може да синхронизује податке зато што су подаци за пријављивање на налог застарели.</translation>
 <translation id="4970761609246024540">Добро дошли у Chrome профиле</translation>
 <translation id="4970880042055371251">Верзија Chrome ОС-а</translation>
+<translation id="4970947549776831107">Chrome је блокирао овај фајл јер је овај тип фајла опасан</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
 <translation id="5037581483200764584">Да бисте добијали будућа Google Chrome ажурирања, треба вам macOS 10.13 или новија верзија. Овај рачунар користи ОС X 10.11.</translation>
 <translation id="5112116809696021727">Да бисте проверили да ли је уређај ажуриран, идите у <ph name="LINK_BEGIN" />Подешавања Chrome ОС-а<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb
index c1fd042..5b89539 100644
--- a/chrome/app/resources/google_chrome_strings_sw.xtb
+++ b/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -192,6 +192,7 @@
 <translation id="4969674060580488087">ChromeOS Flex haikuweza kusawazisha data yako kwa sababu maelezo ya kuingia kwenye akaunti yako yamepitwa na wakati.</translation>
 <translation id="4970761609246024540">Karibu kwenye kipengele cha wasifu kwenye Chrome</translation>
 <translation id="4970880042055371251">Toleo la Mfumo wa Uendeshaji wa Chrome</translation>
+<translation id="4970947549776831107">Chrome imezuia faili hii kwa sababu aina hii ya faili si salama</translation>
 <translation id="4990567037958725628">Kanari ya Google Chrome</translation>
 <translation id="5037581483200764584">Ili upate masasisho ya Google Chrome ya hapo baadaye, utahitaji toleo la macOS 10.13 au toleo jipya zaidi. Kompyuta hii inatumia OS X 10.11.</translation>
 <translation id="5112116809696021727">Ili kuona kama kifaa chako kimesasishwa, nenda kwenye <ph name="LINK_BEGIN" />Mipangilio ya Mfumo wa Uendeshaji wa Chrome<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_uz.xtb b/chrome/app/resources/google_chrome_strings_uz.xtb
index 3659db5..98bda7a 100644
--- a/chrome/app/resources/google_chrome_strings_uz.xtb
+++ b/chrome/app/resources/google_chrome_strings_uz.xtb
@@ -189,6 +189,7 @@
 <translation id="4969674060580488087">Hisobga kirish maʼlumotlaringiz eskirgani sababli ChromeOS Flex maʼlumotlaringizni sinxronlay olmadi.</translation>
 <translation id="4970761609246024540">Chrome profillariga xush kelibsiz</translation>
 <translation id="4970880042055371251">ChromeOS versiyasi</translation>
+<translation id="4970947549776831107">Bu fayl turi zararli boʻlgani sababli Chrome uni blokladi</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
 <translation id="5037581483200764584">Google Chrome yangilanishlari macOS 10.13 yoki undan yuqori versiyalarda ishlaydi. Bu kompyuterdagi versiya: OS X 10.11.</translation>
 <translation id="5112116809696021727">Qurilmangiz tizimi yangilanganligini <ph name="LINK_BEGIN" />ChromeOS sozlamalari<ph name="LINK_END" /> orqali bilish mumkin</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-HK.xtb b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
index 7f901c2..39519d88 100644
--- a/chrome/app/resources/google_chrome_strings_zh-HK.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
@@ -190,6 +190,7 @@
 <translation id="4969674060580488087">您的帳戶登入詳情已過時,因此 ChromeOS Flex 無法同步處理您的資料。</translation>
 <translation id="4970761609246024540">歡迎使用 Chrome 設定檔</translation>
 <translation id="4970880042055371251">Chrome OS 版本</translation>
+<translation id="4970947549776831107">由於此檔案類型不安全,因此 Chrome 已封鎖此檔案</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
 <translation id="5037581483200764584">如要取得日後的 Google Chrome 更新,您將需要 macOS 10.13 或以上版本。此電腦正在使用 OS X 10.11。</translation>
 <translation id="5112116809696021727">如要查看裝置是否已更新,請前往 <ph name="LINK_BEGIN" />Chrome OS 設定<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
index e9786f8..72dfd42 100644
--- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -187,6 +187,7 @@
 <translation id="4969674060580488087">帳戶登入詳細資料尚未更新,因此 ChromeOS Flex 無法同步處理你的資料。</translation>
 <translation id="4970761609246024540">歡迎使用 Chrome 設定檔</translation>
 <translation id="4970880042055371251">Chrome OS 版本</translation>
+<translation id="4970947549776831107">這個類型的檔案有安全疑慮,因此 Chrome 已封鎖這個檔案</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
 <translation id="5037581483200764584">如要取得日後的 Google Chrome 更新,必須使用 macOS 10.13 以上版本。這部電腦目前版本為 OS X 10.11。</translation>
 <translation id="5112116809696021727">如要查看裝置是否為最新版,請前往 <ph name="LINK_BEGIN" />Chrome OS 設定<ph name="LINK_END" /></translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index ac4d9e4a..016e8099 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -3384,8 +3384,10 @@
       "video_tutorials/internal/android/video_tutorial_service_bridge_factory.cc",
       "webapps/web_app_offline_android.cc",
       "webauthn/android/cable_module_android.cc",
-      "webauthn/chrome_conditional_ui_delegate_android.cc",
-      "webauthn/chrome_conditional_ui_delegate_android.h",
+      "webauthn/android/chrome_webauthn_client_android.cc",
+      "webauthn/android/chrome_webauthn_client_android.h",
+      "webauthn/android/conditional_ui_delegate_android.cc",
+      "webauthn/android/conditional_ui_delegate_android.h",
     ]
     public_deps += [
       "//chrome/android/features/dev_ui:buildflags",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS
index 9324b64..ff83265 100644
--- a/chrome/browser/DEPS
+++ b/chrome/browser/DEPS
@@ -366,6 +366,7 @@
   "+components/web_resource",
   "+components/webapps/browser",
   "+components/webapps/common",
+  "+components/webauthn",
   "+components/webdata/common",
   "+components/webdata_services",
   "+components/webrtc_logging/browser",
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_key_manager.cc b/chrome/browser/ash/login/easy_unlock/easy_unlock_key_manager.cc
index 4c76711..8bc6914 100644
--- a/chrome/browser/ash/login/easy_unlock/easy_unlock_key_manager.cc
+++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_key_manager.cc
@@ -156,11 +156,9 @@
     base::ListValue* device_list) {
   device_list->ClearList();
   for (size_t i = 0; i < data_list.size(); ++i) {
-    std::unique_ptr<base::DictionaryValue> device_dict(
-        new base::DictionaryValue);
-    DeviceDataToRemoteDeviceDictionary(account_id, data_list[i],
-                                       device_dict.get());
-    device_list->Append(std::move(device_dict));
+    base::DictionaryValue device_dict;
+    DeviceDataToRemoteDeviceDictionary(account_id, data_list[i], &device_dict);
+    device_list->GetList().Append(std::move(device_dict));
   }
 }
 
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.cc b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.cc
index e5cee636..161b6484 100644
--- a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.cc
+++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.cc
@@ -202,9 +202,9 @@
   local_and_remote_devices.push_back(remote_devices[0]);
   local_and_remote_devices.push_back(*local_device);
 
-  std::unique_ptr<base::ListValue> device_list(new base::ListValue());
+  base::ListValue device_list;
   for (const auto& device : local_and_remote_devices) {
-    std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
+    base::Value::Dict dict;
     std::string b64_public_key, b64_psk;
     base::Base64UrlEncode(device.public_key(),
                           base::Base64UrlEncodePolicy::INCLUDE_PADDING,
@@ -213,59 +213,58 @@
                           base::Base64UrlEncodePolicy::INCLUDE_PADDING,
                           &b64_psk);
 
-    dict->SetStringKey(key_names::kKeyPsk, b64_psk);
+    dict.Set(key_names::kKeyPsk, b64_psk);
 
     // TODO(jhawkins): Remove the bluetoothAddress field from this proto.
-    dict->SetStringKey(key_names::kKeyBluetoothAddress, std::string());
+    dict.Set(key_names::kKeyBluetoothAddress, std::string());
 
-    dict->SetStringPath(
+    dict.SetByDottedPath(
         key_names::kKeyPermitPermitId,
         base::StringPrintf(
             key_names::kPermitPermitIdFormat,
             gaia::CanonicalizeEmail(GetAccountId().GetUserEmail()).c_str()));
 
-    dict->SetStringPath(key_names::kKeyPermitId, b64_public_key);
-    dict->SetStringPath(key_names::kKeyPermitType,
-                        key_names::kPermitTypeLicence);
-    dict->SetStringPath(key_names::kKeyPermitData, b64_public_key);
+    dict.SetByDottedPath(key_names::kKeyPermitId, b64_public_key);
+    dict.SetByDottedPath(key_names::kKeyPermitType,
+                         key_names::kPermitTypeLicence);
+    dict.SetByDottedPath(key_names::kKeyPermitData, b64_public_key);
 
-    std::unique_ptr<base::ListValue> beacon_seed_list(new base::ListValue());
+    base::Value::List beacon_seed_list;
     for (const auto& beacon_seed : device.beacon_seeds()) {
       std::string b64_beacon_seed;
       base::Base64UrlEncode(
           multidevice::ToCryptAuthSeed(beacon_seed).SerializeAsString(),
           base::Base64UrlEncodePolicy::INCLUDE_PADDING, &b64_beacon_seed);
-      beacon_seed_list->Append(b64_beacon_seed);
+      beacon_seed_list.Append(b64_beacon_seed);
     }
 
     std::string serialized_beacon_seeds;
     JSONStringValueSerializer serializer(&serialized_beacon_seeds);
-    serializer.Serialize(*beacon_seed_list);
-    dict->SetStringKey(key_names::kKeySerializedBeaconSeeds,
-                       serialized_beacon_seeds);
+    serializer.Serialize(beacon_seed_list);
+    dict.Set(key_names::kKeySerializedBeaconSeeds, serialized_beacon_seeds);
 
     // This differentiates the local device from the remote device.
     bool unlock_key = device.GetSoftwareFeatureState(
                           multidevice::SoftwareFeature::kSmartLockHost) ==
                       multidevice::SoftwareFeatureState::kEnabled;
-    dict->SetBoolKey(key_names::kKeyUnlockKey, unlock_key);
+    dict.Set(key_names::kKeyUnlockKey, unlock_key);
 
     PA_LOG(VERBOSE) << "Storing RemoteDevice: { "
                     << "name: " << device.name()
                     << ", unlock_key: " << unlock_key
                     << ", id: " << device.GetTruncatedDeviceIdForLogs()
                     << " }.";
-    device_list->Append(std::move(dict));
+    device_list.GetList().Append(std::move(dict));
   }
 
-  if (device_list->GetListDeprecated().size() != 2u) {
+  if (device_list.GetList().size() != 2u) {
     PA_LOG(ERROR) << "There should only be 2 devices persisted, the host and "
                      "the client, but there are: "
-                  << device_list->GetListDeprecated().size();
+                  << device_list.GetList().size();
     NOTREACHED();
   }
 
-  SetStoredRemoteDevices(*device_list);
+  SetStoredRemoteDevices(device_list);
 }
 
 void EasyUnlockServiceRegular::SetStoredRemoteDevices(
diff --git a/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_impl.cc b/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_impl.cc
index 6b8be2f..f3a870b 100644
--- a/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_impl.cc
+++ b/chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_impl.cc
@@ -288,8 +288,6 @@
   // Though enrollment handler calls this method, it's "fine" do delete the
   // handler here as it does not do anyhting after that callback in
   // |EnrollmentHandler::ReportResult()|.
-  // TODO(crbug.com/1236167): Enrollment handler calls this method.  Deal with
-  // removing caller from callee.
   enrollment_handler_.reset();
 
   // TODO(crbug.com/1271134): Logging as "WARNING" to make sure it's preserved
diff --git a/chrome/browser/ash/login/reset_browsertest.cc b/chrome/browser/ash/login/reset_browsertest.cc
index be11d09..7596e9b 100644
--- a/chrome/browser/ash/login/reset_browsertest.cc
+++ b/chrome/browser/ash/login/reset_browsertest.cc
@@ -281,7 +281,7 @@
   EXPECT_TRUE(LoginScreenTestApi::IsGuestButtonShown());
 }
 
-IN_PROC_BROWSER_TEST_F(ResetTest, DISABLED_RestartBeforePowerwash) {
+IN_PROC_BROWSER_TEST_F(ResetTest, RestartBeforePowerwash) {
   EXPECT_TRUE(LoginScreenTestApi::IsGuestButtonShown());
   PrefService* prefs = g_browser_process->local_state();
 
diff --git a/chrome/browser/ash/policy/dlp/dlp_content_manager_ash.cc b/chrome/browser/ash/policy/dlp/dlp_content_manager_ash.cc
index 96df908..bf3e6a8 100644
--- a/chrome/browser/ash/policy/dlp/dlp_content_manager_ash.cc
+++ b/chrome/browser/ash/policy/dlp/dlp_content_manager_ash.cc
@@ -113,6 +113,11 @@
   MaybeChangeOnScreenRestrictions();
 }
 
+void DlpContentManagerAsh::OnWindowTitleChanged(aura::Window* window) {
+  CheckRunningVideoCapture();
+  CheckRunningScreenShares();
+}
+
 DlpContentRestrictionSet DlpContentManagerAsh::GetOnScreenPresentRestrictions()
     const {
   return on_screen_restrictions_;
diff --git a/chrome/browser/ash/policy/dlp/dlp_content_manager_ash.h b/chrome/browser/ash/policy/dlp/dlp_content_manager_ash.h
index 2bb658f..81d58818 100644
--- a/chrome/browser/ash/policy/dlp/dlp_content_manager_ash.h
+++ b/chrome/browser/ash/policy/dlp/dlp_content_manager_ash.h
@@ -52,6 +52,7 @@
   // DlpWindowObserver::Delegate overrides:
   void OnWindowOcclusionChanged(aura::Window* window) override;
   void OnWindowDestroying(aura::Window* window) override;
+  void OnWindowTitleChanged(aura::Window* window) override;
 
   // Returns which restrictions are applied to the WebContents which are
   // currently visible.
diff --git a/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_browsertest.cc b/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_browsertest.cc
index 2e4bb17..bbcb5e8 100644
--- a/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_browsertest.cc
+++ b/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_browsertest.cc
@@ -112,6 +112,7 @@
 }  // namespace
 
 // TODO(crbug.com/1262948): Enable and modify for lacros.
+// TODO(crbug.com/1322094): Add tests for OnWindowTitleChanged().
 class DlpContentManagerAshBrowserTest : public InProcessBrowserTest {
  public:
   DlpContentManagerAshBrowserTest() = default;
@@ -1505,8 +1506,9 @@
       kScreenShareBlockedNotificationId));
 }
 
+// TODO(crbug.com/1319941): Enable after fixing.
 IN_PROC_BROWSER_TEST_F(DlpContentManagerAshScreenShareBrowserTest,
-                       NavigateWebContents) {
+                       DISABLED_NavigateWebContents) {
   SetupReporting();
   const GURL restricted_url(kGoogleUrl);
   const GURL reported_url(kExampleUrl);
diff --git a/chrome/browser/ash/policy/dlp/dlp_window_observer.cc b/chrome/browser/ash/policy/dlp/dlp_window_observer.cc
index c6203c1e..1317e8a 100644
--- a/chrome/browser/ash/policy/dlp/dlp_window_observer.cc
+++ b/chrome/browser/ash/policy/dlp/dlp_window_observer.cc
@@ -31,4 +31,9 @@
   delegate_->OnWindowOcclusionChanged(window_);
 }
 
+void DlpWindowObserver::OnWindowTitleChanged(aura::Window* window) {
+  DCHECK_EQ(window_, window);
+  delegate_->OnWindowTitleChanged(window_);
+}
+
 }  // namespace policy
diff --git a/chrome/browser/ash/policy/dlp/dlp_window_observer.h b/chrome/browser/ash/policy/dlp/dlp_window_observer.h
index 2432670..bb0ce4fb 100644
--- a/chrome/browser/ash/policy/dlp/dlp_window_observer.h
+++ b/chrome/browser/ash/policy/dlp/dlp_window_observer.h
@@ -24,19 +24,21 @@
     virtual void OnWindowOcclusionChanged(aura::Window* window) = 0;
 
     virtual void OnWindowDestroying(aura::Window* window) = 0;
+
+    virtual void OnWindowTitleChanged(aura::Window* window) = 0;
   };
 
   DlpWindowObserver(aura::Window* window, Delegate* delegate);
+  DlpWindowObserver(const DlpWindowObserver&) = delete;
+  DlpWindowObserver& operator=(const DlpWindowObserver&) = delete;
   ~DlpWindowObserver() override;
 
   // aura::WindowObserver overrides:
   void OnWindowDestroying(aura::Window* window) override;
   void OnWindowOcclusionChanged(aura::Window* window) override;
+  void OnWindowTitleChanged(aura::Window* window) override;
 
  private:
-  DlpWindowObserver(const DlpWindowObserver&) = delete;
-  DlpWindowObserver& operator=(const DlpWindowObserver&) = delete;
-
   aura::Window* window_;
   Delegate* delegate_;
 };
diff --git a/chrome/browser/ash/preferences.cc b/chrome/browser/ash/preferences.cc
index abe1a08d..1d99aec 100644
--- a/chrome/browser/ash/preferences.cc
+++ b/chrome/browser/ash/preferences.cc
@@ -488,9 +488,6 @@
       ::prefs::kTextToSpeechVolume, blink::mojom::kSpeechSynthesisDefaultVolume,
       user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF);
 
-  // By default showing Sync Consent is set to true. It can changed by policy.
-  registry->RegisterBooleanPref(::prefs::kEnableSyncConsent, true);
-
   registry->RegisterBooleanPref(prefs::kSyncOobeCompleted, false);
 
   registry->RegisterBooleanPref(::prefs::kTPMFirmwareUpdateCleanupDismissed,
diff --git a/chrome/browser/ash/sync/sync_error_notifier_factory.cc b/chrome/browser/ash/sync/sync_error_notifier_factory.cc
index e4791ae1..b49465c 100644
--- a/chrome/browser/ash/sync/sync_error_notifier_factory.cc
+++ b/chrome/browser/ash/sync/sync_error_notifier_factory.cc
@@ -38,8 +38,9 @@
   syncer::SyncService* sync_service =
       SyncServiceFactory::GetForProfile(profile);
 
-  if (!sync_service)
+  if (!sync_service) {
     return nullptr;
+  }
 
   return new SyncErrorNotifier(sync_service, profile);
 }
diff --git a/chrome/browser/ash/web_applications/media_app/media_app_integration_browsertest.cc b/chrome/browser/ash/web_applications/media_app/media_app_integration_browsertest.cc
index f2319c23..b408ea96b 100644
--- a/chrome/browser/ash/web_applications/media_app/media_app_integration_browsertest.cc
+++ b/chrome/browser/ash/web_applications/media_app/media_app_integration_browsertest.cc
@@ -333,7 +333,10 @@
 
 // Test that the MediaApp successfully loads a file passed in on its launch
 // params. This exercises only web_applications logic.
-IN_PROC_BROWSER_TEST_P(MediaAppIntegrationTest, MediaAppLaunchWithFile) {
+//
+// TODO(https://crbug.com/1325739): Re-enable once flakiness is fixed.
+IN_PROC_BROWSER_TEST_P(MediaAppIntegrationTest,
+                       DISABLED_MediaAppLaunchWithFile) {
   WaitForTestSystemAppInstall();
   // Launch the App for the first time.
   content::WebContents* app = LaunchAppWithFile(web_app::SystemAppType::MEDIA,
@@ -356,8 +359,10 @@
 // Test that the MediaApp successfully loads a file using
 // LaunchSystemWebAppAsync. This exercises high level integration with SWA
 // platform (a different code path than MediaAppLaunchWithFile test).
+//
+// TODO(https://crbug.com/1325739): Re-enable once flakiness is fixed.
 IN_PROC_BROWSER_TEST_P(MediaAppIntegrationTest,
-                       MediaAppWithLaunchSystemWebAppAsync) {
+                       DISABLED_MediaAppWithLaunchSystemWebAppAsync) {
   WaitForTestSystemAppInstall();
   // Launch the App for the first time.
   web_app::SystemAppLaunchParams audio_params;
@@ -384,7 +389,10 @@
 }
 
 // Test that the Media App launches a single window for images.
-IN_PROC_BROWSER_TEST_P(MediaAppIntegrationTest, MediaAppLaunchImageMulti) {
+//
+// TODO(https://crbug.com/1325739): Re-enable once flakiness is fixed.
+IN_PROC_BROWSER_TEST_P(MediaAppIntegrationTest,
+                       DISABLED_MediaAppLaunchImageMulti) {
   WaitForTestSystemAppInstall();
   web_app::SystemAppLaunchParams image_params;
   image_params.launch_paths = {TestFile(kFilePng800x600),
@@ -404,7 +412,10 @@
 }
 
 // Test that the Media App launches multiple windows for PDFs.
-IN_PROC_BROWSER_TEST_P(MediaAppIntegrationTest, MediaAppLaunchPdfMulti) {
+//
+// TODO(https://crbug.com/1325739): Re-enable once flakiness is fixed.
+IN_PROC_BROWSER_TEST_P(MediaAppIntegrationTest,
+                       DISABLED_MediaAppLaunchPdfMulti) {
   WaitForTestSystemAppInstall();
   web_app::SystemAppLaunchParams pdf_params;
   pdf_params.launch_paths = {TestFile(kFilePdfTall), TestFile(kFilePdfImg)};
@@ -789,7 +800,10 @@
 }
 
 // Test that the MediaApp can load RAW files passed on launch params.
-IN_PROC_BROWSER_TEST_P(MediaAppIntegrationWithFilesAppTest, HandleRawFiles) {
+//
+// TODO(https://crbug.com/1325739): Re-enable once flakiness is fixed.
+IN_PROC_BROWSER_TEST_P(MediaAppIntegrationWithFilesAppTest,
+                       DISABLED_HandleRawFiles) {
   WaitForTestSystemAppInstall();
 
   // Initialize a folder with 2 RAW images. Note this approach doesn't guarantee
@@ -1022,8 +1036,10 @@
 // End-to-end test to ensure that the MediaApp successfully registers as a file
 // handler with the ChromeOS file manager on startup and acts as the default
 // handler for a given file.
+//
+// TODO(https://crbug.com/1325739): Re-enable once flakiness is fixed.
 IN_PROC_BROWSER_TEST_P(MediaAppIntegrationWithFilesAppAllProfilesTest,
-                       FileOpenUsesMediaApp) {
+                       DISABLED_FileOpenUsesMediaApp) {
   base::HistogramTester histograms;
 
   WaitForTestSystemAppInstall();
@@ -1085,8 +1101,10 @@
 
 // Ensures both the "audio" and "gallery" flavours of the MediaApp can be
 // launched at the same time when launched via the files app.
+//
+// TODO(https://crbug.com/1325739): Re-enable once flakiness is fixed.
 IN_PROC_BROWSER_TEST_P(MediaAppIntegrationTest,
-                       FileOpenCanLaunchBothAudioAndImages) {
+                       DISABLED_FileOpenCanLaunchBothAudioAndImages) {
   base::HistogramTester histograms;
 
   WaitForTestSystemAppInstall();
@@ -1132,7 +1150,9 @@
 }
 
 // Ensures audio files opened in the media app successfully autoplay.
-IN_PROC_BROWSER_TEST_P(MediaAppIntegrationTest, Autoplay) {
+//
+// TODO(https://crbug.com/1325739): Re-enable once flakiness is fixed.
+IN_PROC_BROWSER_TEST_P(MediaAppIntegrationTest, DISABLED_Autoplay) {
   content::WebContents* web_ui = LaunchWithOneTestFile(kFileAudioOgg);
 
   EXPECT_EQ(kFileAudioOgg, WaitForAudioTrackTitle(web_ui));
@@ -1157,7 +1177,9 @@
 
 // Ensures the autoplay on audio file launch updates the global media controls
 // with an appropriate media source name.
-IN_PROC_BROWSER_TEST_P(MediaAppIntegrationTest, MediaControls) {
+//
+// TODO(https://crbug.com/1325739): Re-enable once flakiness is fixed.
+IN_PROC_BROWSER_TEST_P(MediaAppIntegrationTest, DISABLED_MediaControls) {
   using absl::optional;
   class MediaControlsObserver
       : public media_session::mojom::MediaControllerObserver {
@@ -1208,8 +1230,10 @@
 
 // Test that the MediaApp can traverse other files in the directory of a file
 // that was opened, even if those files have changed since launch.
+//
+// TODO(https://crbug.com/1325739): Re-enable once flakiness is fixed.
 IN_PROC_BROWSER_TEST_P(MediaAppIntegrationWithFilesAppAllProfilesTest,
-                       FileOpenCanTraverseDirectory) {
+                       DISABLED_FileOpenCanTraverseDirectory) {
   WaitForTestSystemAppInstall();
 
   // Initialize a folder with 2 files: 1 JPEG, 1 PNG. Note this approach doesn't
@@ -1267,8 +1291,10 @@
 }
 
 // Integration test for rename using the WritableFileSystem and Streams APIs.
+//
+// TODO(https://crbug.com/1325739): Re-enable once flakiness is fixed.
 IN_PROC_BROWSER_TEST_P(MediaAppIntegrationWithFilesAppAllProfilesTest,
-                       RenameFile) {
+                       DISABLED_RenameFile) {
   WaitForTestSystemAppInstall();
 
   file_manager::test::FolderInMyFiles folder(profile());
@@ -1303,7 +1329,10 @@
 }
 
 // Integration test for deleting a file using the WritableFiles API.
-IN_PROC_BROWSER_TEST_P(MediaAppIntegrationWithFilesAppTest, DeleteFile) {
+//
+// TODO(https://crbug.com/1325739): Re-enable once flakiness is fixed.
+IN_PROC_BROWSER_TEST_P(MediaAppIntegrationWithFilesAppTest,
+                       DISABLED_DeleteFile) {
   WaitForTestSystemAppInstall();
 
   file_manager::test::FolderInMyFiles folder(profile());
@@ -1331,8 +1360,10 @@
 }
 
 // Integration test for deleting a special file using the WritableFiles API.
+//
+// TODO(https://crbug.com/1325739): Re-enable once flakiness is fixed.
 IN_PROC_BROWSER_TEST_P(MediaAppIntegrationWithFilesAppTest,
-                       FailToDeleteReservedFile) {
+                       DISABLED_FailToDeleteReservedFile) {
   WaitForTestSystemAppInstall();
 
   file_manager::test::FolderInMyFiles folder(profile());
@@ -1364,8 +1395,9 @@
   EXPECT_EQ("thumbs.db", folder.files()[0].BaseName().value());
 }
 
+// TODO(https://crbug.com/1325739): Re-enable once flakiness is fixed.
 IN_PROC_BROWSER_TEST_P(MediaAppIntegrationWithFilesAppTest,
-                       CheckBrowserWritable) {
+                       DISABLED_CheckBrowserWritable) {
   WaitForTestSystemAppInstall();
 
   file_manager::test::FolderInMyFiles folder(profile());
diff --git a/chrome/browser/autofill_assistant/password_change/OWNERS b/chrome/browser/autofill_assistant/password_change/OWNERS
index cfdb75d..f30decde 100644
--- a/chrome/browser/autofill_assistant/password_change/OWNERS
+++ b/chrome/browser/autofill_assistant/password_change/OWNERS
@@ -1 +1 @@
-hluca@google.com
+jkeitel@google.com
diff --git a/chrome/browser/autofill_assistant/password_change/apc_external_action_delegate.cc b/chrome/browser/autofill_assistant/password_change/apc_external_action_delegate.cc
index 6a07baa..d71361b 100644
--- a/chrome/browser/autofill_assistant/password_change/apc_external_action_delegate.cc
+++ b/chrome/browser/autofill_assistant/password_change/apc_external_action_delegate.cc
@@ -10,9 +10,11 @@
 
 void ApcExternalActionDelegate::OnActionRequested(
     const autofill_assistant::external::Action& action_info,
-    base::OnceCallback<void(
-        autofill_assistant::ExternalActionDelegate::ActionResult)> callback) {
+    base::OnceCallback<void()> start_dom_checks_callback,
+    base::OnceCallback<
+        void(autofill_assistant::ExternalActionDelegate::ActionResult)>
+        end_action_callback) {
   autofill_assistant::ExternalActionDelegate::ActionResult result;
   result.success = true;
-  std::move(callback).Run(result);
+  std::move(end_action_callback).Run(result);
 }
diff --git a/chrome/browser/autofill_assistant/password_change/apc_external_action_delegate.h b/chrome/browser/autofill_assistant/password_change/apc_external_action_delegate.h
index dcc6ee4..079376cf4 100644
--- a/chrome/browser/autofill_assistant/password_change/apc_external_action_delegate.h
+++ b/chrome/browser/autofill_assistant/password_change/apc_external_action_delegate.h
@@ -19,9 +19,10 @@
   // ExternalActionDelegate
   void OnActionRequested(
       const autofill_assistant::external::Action& action_info,
-      base::OnceCallback<void(
-          autofill_assistant::ExternalActionDelegate::ActionResult)> callback)
-      override;
+      base::OnceCallback<void()> start_dom_checks_callback,
+      base::OnceCallback<
+          void(autofill_assistant::ExternalActionDelegate::ActionResult)>
+          end_action_callback) override;
 };
 
 #endif  // CHROME_BROWSER_AUTOFILL_ASSISTANT_PASSWORD_CHANGE_APC_EXTERNAL_ACTION_DELEGATE_H_
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
index b678123..5cf44ff9 100644
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
@@ -162,6 +162,8 @@
 #if BUILDFLAG(IS_ANDROID)
 #include "chrome/browser/flags/android/chrome_feature_list.h"
 #include "chrome/browser/ssl/chrome_security_state_client.h"
+#include "chrome/browser/webauthn/android/chrome_webauthn_client_android.h"
+#include "components/webauthn/android/webauthn_client_android.h"
 #else
 #include "chrome/browser/devtools/devtools_auto_opener.h"
 #include "chrome/browser/gcm/gcm_product_util.h"
@@ -350,6 +352,13 @@
 #if BUILDFLAG(IS_MAC)
   system_media_permissions::LogSystemMediaPermissionsStartupStats();
 #endif
+
+#if BUILDFLAG(IS_ANDROID)
+  if (base::FeatureList::IsEnabled(features::kWebAuthConditionalUI)) {
+    components::WebAuthnClientAndroid::SetClient(
+        std::make_unique<ChromeWebAuthnClientAndroid>());
+  }
+#endif
 }
 
 #if !BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/chrome_browser_main_parts_lacros.cc b/chrome/browser/chrome_browser_main_parts_lacros.cc
index af8c31b..d958a76 100644
--- a/chrome/browser/chrome_browser_main_parts_lacros.cc
+++ b/chrome/browser/chrome_browser_main_parts_lacros.cc
@@ -66,9 +66,11 @@
 void ChromeBrowserMainPartsLacros::PreProfileInit() {
   ChromeBrowserMainPartsLinux::PreProfileInit();
 
-  // Apply specific flags if this is a Web Kiosk session.
+  // Apply specific flags if this is a Kiosk session.
   if (chromeos::LacrosService::Get()->init_params()->session_type ==
-      crosapi::mojom::SessionType::kWebKioskSession) {
+          crosapi::mojom::SessionType::kWebKioskSession ||
+      chromeos::LacrosService::Get()->init_params()->session_type ==
+          crosapi::mojom::SessionType::kAppKioskSession) {
     // Hide certain system UI elements.
     base::CommandLine::ForCurrentProcess()->AppendSwitch(
         switches::kForceAppMode);
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index d1e3d8f..803e172 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -399,7 +399,6 @@
 #include "chrome/browser/download/android/intercept_oma_download_navigation_throttle.h"
 #include "chrome/browser/flags/android/chrome_feature_list.h"
 #include "chrome/browser/ui/android/tab_model/tab_model_list.h"
-#include "chrome/browser/webauthn/chrome_conditional_ui_delegate_android.h"
 #include "chrome/common/chrome_descriptors.h"
 #include "components/autofill_assistant/content/common/switches.h"
 #include "components/browser_ui/accessibility/android/font_size_prefs_android.h"
@@ -6584,12 +6583,3 @@
 
   return web_app::GetOfflinePageInfo(url, browser_context);
 }
-
-#if BUILDFLAG(IS_ANDROID)
-content::ConditionalUiDelegateAndroid*
-ChromeContentBrowserClient::GetConditionalUiDelegate(
-    content::RenderFrameHost* host) {
-  return ChromeConditionalUiDelegateAndroid::GetConditionalUiDelegate(
-      content::WebContents::FromRenderFrameHost(host));
-}
-#endif
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index d9b8140e..aa45e0fa 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -798,11 +798,6 @@
                                       content::BrowserContext* browser_context,
                                       int32_t error_code) override;
 
-#if BUILDFLAG(IS_ANDROID)
-  content::ConditionalUiDelegateAndroid* GetConditionalUiDelegate(
-      content::RenderFrameHost* host) override;
-#endif
-
  protected:
   static bool HandleWebUI(GURL* url, content::BrowserContext* browser_context);
   static bool HandleWebUIReverse(GURL* url,
diff --git a/chrome/browser/chromeos/fileapi/external_file_url_loader_factory.cc b/chrome/browser/chromeos/fileapi/external_file_url_loader_factory.cc
index 78efe284..cb5285b 100644
--- a/chrome/browser/chromeos/fileapi/external_file_url_loader_factory.cc
+++ b/chrome/browser/chromeos/fileapi/external_file_url_loader_factory.cc
@@ -288,9 +288,7 @@
       return;
     }
     head_.response_start = base::TimeTicks::Now();
-    client_->OnReceiveResponse(head_.Clone(),
-                               mojo::ScopedDataPipeConsumerHandle());
-    client_->OnStartLoadingResponseBody(std::move(consumer_handle));
+    client_->OnReceiveResponse(head_.Clone(), std::move(consumer_handle));
 
     data_producer_ = std::make_unique<FileSystemReaderDataPipeProducer>(
         std::move(producer_handle), std::move(stream_reader), size,
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_content_manager.cc b/chrome/browser/chromeos/policy/dlp/dlp_content_manager.cc
index bc73354..bd0e73b 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_content_manager.cc
+++ b/chrome/browser/chromeos/policy/dlp/dlp_content_manager.cc
@@ -290,6 +290,12 @@
   return web_contents_;
 }
 
+void DlpContentManager::ScreenShareInfo::set_dialog_widget(
+    base::WeakPtr<views::Widget> dialog_widget) {
+  DCHECK(!HasOpenDialogWidget());
+  dialog_widget_ = dialog_widget;
+}
+
 void DlpContentManager::ScreenShareInfo::set_latest_confidential_contents_info(
     ConfidentialContentsInfo confidential_contents_info) {
   latest_confidential_contents_info_ = confidential_contents_info;
@@ -373,10 +379,8 @@
   }
 }
 
-void DlpContentManager::ScreenShareInfo::SetDialogWidget(
-    base::WeakPtr<views::Widget> dialog_widget) {
-  DCHECK(!dialog_widget_ || dialog_widget_->IsClosed());
-  dialog_widget_ = dialog_widget;
+bool DlpContentManager::ScreenShareInfo::HasOpenDialogWidget() {
+  return dialog_widget_ && !dialog_widget_->IsClosed();
 }
 
 base::WeakPtr<DlpContentManager::ScreenShareInfo>
@@ -687,13 +691,29 @@
     if (screen_share->GetLatestRestriction() == info.restriction_info &&
         screen_share->GetConfidentialContents() == info.confidential_contents) {
       // No change in restrictions that apply to this screen share.
+      // Additional information, such as the titles, might have changed so we
+      // check if need to update the warning.
+      if (screen_share->HasOpenDialogWidget()) {
+        if (EqualWithTitles(screen_share->GetConfidentialContents(),
+                            info.confidential_contents))
+          continue;
+
+        screen_share->set_latest_confidential_contents_info(info);
+        screen_share->MaybeCloseDialogWidget();
+        RemoveAllowedContents(info.confidential_contents,
+                              DlpRulesManager::Restriction::kScreenShare);
+        // base::Unretained(this) is safe here because DlpContentManager is
+        // initialized as a singleton that's always available in the system.
+        screen_share->set_dialog_widget(
+            warn_notifier_->ShowDlpScreenShareWarningDialog(
+                base::BindOnce(
+                    &DlpContentManager::OnDlpScreenShareWarnDialogReply,
+                    base::Unretained(this), info, screen_share->GetWeakPtr()),
+                info.confidential_contents, screen_share->application_title()));
+      }
       continue;
     }
 
-    if (IsWarn(screen_share->GetLatestRestriction())) {
-      // Close previously opened dialog, if any.
-      screen_share->MaybeCloseDialogWidget();
-    }
     screen_share->set_latest_confidential_contents_info(info);
 
     DlpBooleanHistogram(dlp::kScreenShareBlockedUMA,
@@ -710,6 +730,8 @@
     }
 
     if (IsWarn(info.restriction_info)) {
+      // Close previously opened dialog, if any.
+      screen_share->MaybeCloseDialogWidget();
       // Check which of the contents were already allowed and don't warn for
       // those.
       RemoveAllowedContents(info.confidential_contents,
@@ -740,7 +762,7 @@
 
       // base::Unretained(this) is safe here because DlpContentManager is
       // initialized as a singleton that's always available in the system.
-      screen_share->SetDialogWidget(
+      screen_share->set_dialog_widget(
           warn_notifier_->ShowDlpScreenShareWarningDialog(
               base::BindOnce(
                   &DlpContentManager::OnDlpScreenShareWarnDialogReply,
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_content_manager.h b/chrome/browser/chromeos/policy/dlp/dlp_content_manager.h
index 0f2daa0..7df8177 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_content_manager.h
+++ b/chrome/browser/chromeos/policy/dlp/dlp_content_manager.h
@@ -170,6 +170,11 @@
     const std::u16string& application_title() const;
     State state() const;
     base::WeakPtr<content::WebContents> web_contents() const;
+    // Saves the |dialog_widget| as the current dialog handle.
+    // Assumes that the previous widget is closed or not set. It's
+    // responsibility of the called to ensure that the restriction level is
+    // WARN.
+    void set_dialog_widget(base::WeakPtr<views::Widget> dialog_widget);
     void set_latest_confidential_contents_info(
         ConfidentialContentsInfo confidential_contents_info);
     // Returns the restriction information that was the last enforced on this
@@ -205,11 +210,9 @@
 
     // If currently opened, closes the associated DlpWarnDialog widget.
     void MaybeCloseDialogWidget();
-    // Saves the |dialog_widget| as the current dialog handle.
-    // Assumes that the previous widget is closed or not set. It's
-    // responsibility of the called to ensure that the restriction level is
-    // WARN.
-    void SetDialogWidget(base::WeakPtr<views::Widget> dialog_widget);
+    // Returns true if there is an associated DlpWarnDialog object, false
+    // otherwise.
+    bool HasOpenDialogWidget();
 
     base::WeakPtr<ScreenShareInfo> GetWeakPtr();
 
diff --git a/chrome/browser/content_settings/content_settings_browsertest.cc b/chrome/browser/content_settings/content_settings_browsertest.cc
index ea68a934..2e9bf11 100644
--- a/chrome/browser/content_settings/content_settings_browsertest.cc
+++ b/chrome/browser/content_settings/content_settings_browsertest.cc
@@ -476,7 +476,10 @@
 }
 
 // Verify that cookies can be blocked for a specific website using exceptions.
-IN_PROC_BROWSER_TEST_P(CookieSettingsTest, BlockCookiesUsingExceptions) {
+//
+// TODO(https://crbug.com/931080): Re-enable test once flakiness is fixed.
+IN_PROC_BROWSER_TEST_P(CookieSettingsTest,
+                       DISABLED_BlockCookiesUsingExceptions) {
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GetPageURL()));
   content_settings::CookieSettings* settings =
       CookieSettingsFactory::GetForProfile(browser()->profile()).get();
diff --git a/chrome/browser/devtools/devtools_browsertest.cc b/chrome/browser/devtools/devtools_browsertest.cc
index 89d8f36..d659350 100644
--- a/chrome/browser/devtools/devtools_browsertest.cc
+++ b/chrome/browser/devtools/devtools_browsertest.cc
@@ -1795,15 +1795,13 @@
   if (url.query() != kPushUseNullEndTime)
     load_timing.push_end = base::TimeTicks::Now();
 
-  params->client->OnReceiveResponse(std::move(response),
-                                    mojo::ScopedDataPipeConsumerHandle());
-
   // The response's body is empty. The pipe is not filled.
   mojo::ScopedDataPipeProducerHandle producer_handle;
   mojo::ScopedDataPipeConsumerHandle consumer_handle;
   EXPECT_EQ(mojo::CreateDataPipe(nullptr, producer_handle, consumer_handle),
             MOJO_RESULT_OK);
-  params->client->OnStartLoadingResponseBody(std::move(consumer_handle));
+  params->client->OnReceiveResponse(std::move(response),
+                                    std::move(consumer_handle));
   params->client->OnComplete(network::URLLoaderCompletionStatus());
   return true;
 }
diff --git a/chrome/browser/devtools/devtools_eye_dropper.cc b/chrome/browser/devtools/devtools_eye_dropper.cc
index eba9681..f052086 100644
--- a/chrome/browser/devtools/devtools_eye_dropper.cc
+++ b/chrome/browser/devtools/devtools_eye_dropper.cc
@@ -37,7 +37,7 @@
     : content::WebContentsObserver(web_contents), callback_(callback) {
   mouse_event_callback_ = base::BindRepeating(
       &DevToolsEyeDropper::HandleMouseEvent, base::Unretained(this));
-  if (web_contents->GetMainFrame()->IsRenderFrameCreated())
+  if (web_contents->GetMainFrame()->IsRenderFrameLive())
     AttachToHost(web_contents->GetMainFrame());
 }
 
@@ -49,7 +49,7 @@
 }
 
 void DevToolsEyeDropper::AttachToHost(content::RenderFrameHost* frame_host) {
-  DCHECK(frame_host->IsRenderFrameCreated());
+  DCHECK(frame_host->IsRenderFrameLive());
   // Historically, (see https://crbug.com/847363) this code handled the
   // RenderWidgetHostView being null, but now it is listening to creation of the
   // frame which includes creation of the widget so it is implied that
@@ -120,7 +120,7 @@
     // has its renderer frame. Since `old_host` is null only when this observer
     // method is called at startup, it should be before the renderer frame is
     // created.
-    DCHECK(!new_host->IsRenderFrameCreated());
+    DCHECK(!new_host->IsRenderFrameLive());
     return;
   }
   DCHECK(host_);
diff --git a/chrome/browser/devtools/devtools_ui_bindings.cc b/chrome/browser/devtools/devtools_ui_bindings.cc
index aa7f18a..c702b387 100644
--- a/chrome/browser/devtools/devtools_ui_bindings.cc
+++ b/chrome/browser/devtools/devtools_ui_bindings.cc
@@ -1657,7 +1657,7 @@
     return;
   // If the client renderer is gone (e.g., the window was closed with both the
   // inspector and client being destroyed), the message can not be sent.
-  if (!web_contents_->GetMainFrame()->IsRenderFrameCreated())
+  if (!web_contents_->GetMainFrame()->IsRenderFrameLive())
     return;
   base::Value::List arguments;
   if (!arg1.is_none()) {
diff --git a/chrome/browser/download/notification/download_notification_browsertest.cc b/chrome/browser/download/notification/download_notification_browsertest.cc
index 05fc44b..fd7a255 100644
--- a/chrome/browser/download/notification/download_notification_browsertest.cc
+++ b/chrome/browser/download/notification/download_notification_browsertest.cc
@@ -174,16 +174,16 @@
   }
 
   void HandleKnownSize(content::URLLoaderInterceptor::RequestParams* params) {
-    SendHead(params, "application/octet-stream", /*content_length=*/1024);
-    SendBody(params, "some random data");
+    SendHead(params, "application/octet-stream", /*content_length=*/1024,
+             "some random data");
     base::AutoLock lock(lock_);
     pending_requests_.push_back(
         std::make_unique<PendingRequest>(std::move(*params)));
   }
 
   void HandleUnknownSize(content::URLLoaderInterceptor::RequestParams* params) {
-    SendHead(params, "application/octet-stream", /*content_length=*/-1);
-    SendBody(params, "some random data");
+    SendHead(params, "application/octet-stream", /*content_length=*/-1,
+             "some random data");
     base::AutoLock lock(lock_);
     pending_requests_.push_back(
         std::make_unique<PendingRequest>(std::move(*params)));
@@ -208,8 +208,7 @@
 
   static void SendOk(content::URLLoaderInterceptor::RequestParams* params) {
     std::string response = "OK";
-    SendHead(params, "text/http", response.size());
-    SendBody(params, response);
+    SendHead(params, "text/http", response.size(), response);
     network::URLLoaderCompletionStatus status;
     status.error_code = net::OK;
     params->client->OnComplete(status);
@@ -217,7 +216,8 @@
 
   static void SendHead(content::URLLoaderInterceptor::RequestParams* params,
                        std::string mime_type,
-                       int64_t content_length) {
+                       int64_t content_length,
+                       std::string data) {
     auto head = network::mojom::URLResponseHead::New();
     std::string headers =
         "HTTP/1.1 200 OK\n"
@@ -231,12 +231,7 @@
     head->headers = base::MakeRefCounted<net::HttpResponseHeaders>(
         net::HttpUtil::AssembleRawHeaders(headers));
     head->headers->GetMimeType(&head->mime_type);
-    params->client->OnReceiveResponse(std::move(head),
-                                      mojo::ScopedDataPipeConsumerHandle());
-  }
 
-  static void SendBody(content::URLLoaderInterceptor::RequestParams* params,
-                       std::string data) {
     mojo::ScopedDataPipeProducerHandle producer_handle;
     mojo::ScopedDataPipeConsumerHandle consumer_handle;
     ASSERT_EQ(
@@ -249,7 +244,8 @@
     ASSERT_EQ(MOJO_RESULT_OK, result);
     ASSERT_EQ(data.size(), write_size);
     ASSERT_TRUE(consumer_handle.is_valid());
-    params->client->OnStartLoadingResponseBody(std::move(consumer_handle));
+    params->client->OnReceiveResponse(std::move(head),
+                                      std::move(consumer_handle));
   }
 
   const std::map<std::string, Handler> handlers_;
diff --git a/chrome/browser/extensions/chrome_url_request_util.cc b/chrome/browser/extensions/chrome_url_request_util.cc
index cf6acb9..717f3ca1 100644
--- a/chrome/browser/extensions/chrome_url_request_util.cc
+++ b/chrome/browser/extensions/chrome_url_request_util.cc
@@ -177,9 +177,7 @@
       head->headers->AddHeader(net::HttpRequestHeaders::kContentType,
                                head->mime_type.c_str());
     }
-    client_->OnReceiveResponse(std::move(head),
-                               mojo::ScopedDataPipeConsumerHandle());
-    client_->OnStartLoadingResponseBody(std::move(consumer_handle));
+    client_->OnReceiveResponse(std::move(head), std::move(consumer_handle));
 
     uint32_t write_size = data->size();
     MojoResult result = producer_handle->WriteData(data->front(), &write_size,
diff --git a/chrome/browser/extensions/external_provider_impl.cc b/chrome/browser/extensions/external_provider_impl.cc
index ce67284e..0f3918a 100644
--- a/chrome/browser/extensions/external_provider_impl.cc
+++ b/chrome/browser/extensions/external_provider_impl.cc
@@ -35,6 +35,7 @@
 #include "chrome/browser/extensions/forced_extensions/install_stage_tracker.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profiles_state.h"
 #include "chrome/browser/web_applications/preinstalled_app_install_features.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_switches.h"
@@ -52,6 +53,10 @@
 #include "extensions/common/manifest.h"
 #include "ui/base/l10n/l10n_util.h"
 
+#if BUILDFLAG(IS_CHROMEOS)
+#include "chrome/browser/chromeos/app_mode/kiosk_app_external_loader.h"
+#endif  // BUIDLFLAG(IS_CHROMEOS)
+
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "ash/components/arc/arc_util.h"
 #include "ash/constants/ash_paths.h"
@@ -63,7 +68,6 @@
 #include "chrome/browser/ash/policy/core/device_local_account.h"
 #include "chrome/browser/ash/policy/core/device_local_account_policy_service.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
-#include "chrome/browser/chromeos/app_mode/kiosk_app_external_loader.h"
 #include "chrome/browser/chromeos/extensions/device_local_account_external_policy_loader.h"
 #include "chrome/browser/chromeos/extensions/signin_screen_extensions_external_loader.h"
 #include "extensions/common/constants.h"
@@ -701,16 +705,16 @@
   // Load the KioskAppExternalProvider when running in the Chrome App kiosk
   // mode.
   if (chrome::IsRunningInForcedAppMode()) {
+#if BUILDFLAG(IS_CHROMEOS)
+    if (profiles::IsChromeAppKioskSession()) {
+      ManifestLocation location = ManifestLocation::kExternalPolicy;
+
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-    if (user && user->GetType() == user_manager::USER_TYPE_KIOSK_APP) {
-      // Kiosk primary app external provider.
-      // For enterprise managed kiosk apps, change the location to
-      // "force-installed by policy".
       policy::BrowserPolicyConnectorAsh* const connector =
           g_browser_process->platform_part()->browser_policy_connector_ash();
-      ManifestLocation location = ManifestLocation::kExternalPref;
-      if (connector && connector->IsDeviceEnterpriseManaged())
-        location = ManifestLocation::kExternalPolicy;
+      if (!connector || !connector->IsDeviceEnterpriseManaged())
+        location = ManifestLocation::kExternalPref;
+#endif
 
       auto kiosk_app_provider = std::make_unique<ExternalProviderImpl>(
           service,
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 14b23961..3ea0ba2 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -2007,6 +2007,11 @@
     "expiry_milestone": 106
   },
   {
+    "name": "enable-discover-feed-top-sync-promo",
+    "owners": [ "mrefaat", "sczs"],
+    "expiry_milestone": 106
+  },
+  {
     "name": "enable-dns-proxy",
     "owners": [ "garrick", "jasongustaman", "cros-networking@google.com" ],
     "expiry_milestone": 104
diff --git a/chrome/browser/offline_pages/offline_page_request_handler_unittest.cc b/chrome/browser/offline_pages/offline_page_request_handler_unittest.cc
index 092921b1..1c8bcf04 100644
--- a/chrome/browser/offline_pages/offline_page_request_handler_unittest.cc
+++ b/chrome/browser/offline_pages/offline_page_request_handler_unittest.cc
@@ -154,7 +154,6 @@
     virtual void OnReceiveRedirect(const GURL& redirected_url) = 0;
     virtual void OnReceiveResponse(
         network::mojom::URLResponseHeadPtr response_head) = 0;
-    virtual void OnStartLoadingResponseBody() = 0;
     virtual void OnComplete() = 0;
 
    protected:
@@ -173,9 +172,8 @@
 
   void OnReceiveResponse(network::mojom::URLResponseHeadPtr response_head,
                          mojo::ScopedDataPipeConsumerHandle body) override {
+    response_body_ = std::move(body);
     observer_->OnReceiveResponse(std::move(response_head));
-    if (body)
-      OnStartLoadingResponseBody(std::move(body));
   }
 
   void OnReceiveRedirect(
@@ -192,12 +190,6 @@
                         int64_t total_size,
                         OnUploadProgressCallback ack_callback) override {}
 
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override {
-    response_body_ = std::move(body);
-    observer_->OnStartLoadingResponseBody();
-  }
-
   void OnComplete(const network::URLLoaderCompletionStatus& status) override {
     completion_status_ = status;
     observer_->OnComplete();
@@ -263,7 +255,6 @@
   void OnReceiveRedirect(const GURL& redirected_url) override;
   void OnReceiveResponse(
       network::mojom::URLResponseHeadPtr response_head) override;
-  void OnStartLoadingResponseBody() override;
   void OnComplete() override;
 
   void InterceptRequest(const GURL& url,
@@ -954,9 +945,6 @@
 void OfflinePageURLLoaderBuilder::OnReceiveResponse(
     network::mojom::URLResponseHeadPtr response_head) {
   mime_type_ = response_head->mime_type;
-}
-
-void OfflinePageURLLoaderBuilder::OnStartLoadingResponseBody() {
   ReadBody();
 }
 
diff --git a/chrome/browser/offline_pages/offline_page_url_loader.cc b/chrome/browser/offline_pages/offline_page_url_loader.cc
index 47d4e93..4ac6dca 100644
--- a/chrome/browser/offline_pages/offline_page_url_loader.cc
+++ b/chrome/browser/offline_pages/offline_page_url_loader.cc
@@ -283,8 +283,7 @@
   response_head->content_length = file_size;
 
   client_->OnReceiveResponse(std::move(response_head),
-                             mojo::ScopedDataPipeConsumerHandle());
-  client_->OnStartLoadingResponseBody(std::move(consumer_handle));
+                             std::move(consumer_handle));
 
   handle_watcher_ = std::make_unique<mojo::SimpleWatcher>(
       FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::MANUAL,
diff --git a/chrome/browser/password_manager/chrome_webauthn_credentials_delegate.cc b/chrome/browser/password_manager/chrome_webauthn_credentials_delegate.cc
index a76481f..d04f9b1 100644
--- a/chrome/browser/password_manager/chrome_webauthn_credentials_delegate.cc
+++ b/chrome/browser/password_manager/chrome_webauthn_credentials_delegate.cc
@@ -17,7 +17,7 @@
 #endif  // !BUILDFLAG(IS_ANDROID)
 
 #if BUILDFLAG(IS_ANDROID)
-#include "chrome/browser/webauthn/chrome_conditional_ui_delegate_android.h"
+#include "chrome/browser/webauthn/android/conditional_ui_delegate_android.h"
 #endif
 
 ChromeWebAuthnCredentialsDelegate::ChromeWebAuthnCredentialsDelegate(
@@ -35,7 +35,7 @@
     std::string backend_id) {
 #if BUILDFLAG(IS_ANDROID)
   auto* credentials_delegate =
-      ChromeConditionalUiDelegateAndroid::GetConditionalUiDelegate(
+      ConditionalUiDelegateAndroid::GetConditionalUiDelegate(
           client_->web_contents());
   if (!credentials_delegate) {
     std::move(retrieve_suggestions_callback_).Run();
@@ -66,7 +66,7 @@
 
 #if BUILDFLAG(IS_ANDROID)
   auto* credentials_delegate =
-      ChromeConditionalUiDelegateAndroid::GetConditionalUiDelegate(
+      ConditionalUiDelegateAndroid::GetConditionalUiDelegate(
           client_->web_contents());
   if (!credentials_delegate) {
     std::move(retrieve_suggestions_callback_).Run();
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index 3608f024..8e9cb19 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -1162,9 +1162,6 @@
   { key::kArcAppInstallEventLoggingEnabled,
     prefs::kArcAppInstallEventLoggingEnabled,
     base::Value::Type::BOOLEAN },
-  { key::kEnableSyncConsent,
-    prefs::kEnableSyncConsent,
-    base::Value::Type::BOOLEAN },
   { key::kNetworkFileSharesAllowed,
     prefs::kNetworkFileSharesAllowed,
     base::Value::Type::BOOLEAN },
@@ -1554,6 +1551,9 @@
   { key::kInsightsExtensionEnabled,
     prefs::kInsightsExtensionEnabled,
     base::Value::Type::BOOLEAN },
+  { key::kEnableSyncConsent,
+    prefs::kEnableSyncConsent,
+    base::Value::Type::BOOLEAN },
 #endif // BUILDFLAG(IS_CHROMEOS)
 
 #if !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_CHROMEOS)
diff --git a/chrome/browser/prefetch/no_state_prefetch/prerender_nostate_prefetch_browsertest.cc b/chrome/browser/prefetch/no_state_prefetch/prerender_nostate_prefetch_browsertest.cc
index c9c0b3b..1e1e95f 100644
--- a/chrome/browser/prefetch/no_state_prefetch/prerender_nostate_prefetch_browsertest.cc
+++ b/chrome/browser/prefetch/no_state_prefetch/prerender_nostate_prefetch_browsertest.cc
@@ -282,7 +282,7 @@
     command_line->AppendSwitchASCII(embedder_support::kOriginTrialPublicKey,
                                     kOriginTrialPublicKeyForTesting);
     command_line->AppendSwitchASCII(switches::kEnableBlinkFeatures,
-                                    "SpeculationRulesPrefetchProxy");
+                                    "SpeculationRulesPrefetchWithSubresources");
   }
 
   void SetUpOnMainThread() override {
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc
index c3b506c5..68508d68 100644
--- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc
+++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc
@@ -556,7 +556,8 @@
     cmd->AppendSwitchASCII("isolated-prerender-tunnel-proxy",
                            GetProxyURL().spec());
     cmd->AppendSwitchASCII(switches::kEnableBlinkFeatures,
-                           "SpeculationRulesPrefetchProxy");
+                           "SpeculationRulesPrefetchProxy,"
+                           "SpeculationRulesPrefetchWithSubresources");
   }
 
   content::WebContents* GetWebContents() const {
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_from_string_url_loader.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_from_string_url_loader.cc
index 97431484..c247439 100644
--- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_from_string_url_loader.cc
+++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_from_string_url_loader.cc
@@ -104,9 +104,7 @@
     return;
   }
 
-  client_->OnReceiveResponse(std::move(head_),
-                             mojo::ScopedDataPipeConsumerHandle());
-  client_->OnStartLoadingResponseBody(std::move(consumer_handle));
+  client_->OnReceiveResponse(std::move(head_), std::move(consumer_handle));
 
   producer_handle_ = std::move(producer_handle);
 
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxying_url_loader_factory.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxying_url_loader_factory.cc
index c0622bb..86a7c49 100644
--- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxying_url_loader_factory.cc
+++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxying_url_loader_factory.cc
@@ -212,11 +212,6 @@
 }
 
 void PrefetchProxyProxyingURLLoaderFactory::InProgressRequest::
-    OnStartLoadingResponseBody(mojo::ScopedDataPipeConsumerHandle body) {
-  target_client_->OnStartLoadingResponseBody(std::move(body));
-}
-
-void PrefetchProxyProxyingURLLoaderFactory::InProgressRequest::
     SetOnCompleteRecordMetricsCallback(
         OnCompleteRecordMetricsCallback callback) {
   on_complete_metrics_callback_ = std::move(callback);
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxying_url_loader_factory.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxying_url_loader_factory.h
index a1fd5fa..3f92f2f 100644
--- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxying_url_loader_factory.h
+++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxying_url_loader_factory.h
@@ -153,8 +153,6 @@
                           OnUploadProgressCallback callback) override;
     void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
     void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-    void OnStartLoadingResponseBody(
-        mojo::ScopedDataPipeConsumerHandle body) override;
     void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
    private:
diff --git a/chrome/browser/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.cc b/chrome/browser/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.cc
index 773c7da..a2a9068 100644
--- a/chrome/browser/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.cc
+++ b/chrome/browser/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.cc
@@ -219,13 +219,6 @@
   forwarding_client_->OnTransferSizeUpdated(transfer_size_diff);
 }
 
-void CacheAliasSearchPrefetchURLLoader::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle body) {
-  DCHECK(forwarding_client_);
-  forwarding_client_->OnStartLoadingResponseBody(std::move(body));
-  return;
-}
-
 void CacheAliasSearchPrefetchURLLoader::OnComplete(
     const network::URLLoaderCompletionStatus& status) {
   if (status.error_code != net::OK && can_fallback_) {
diff --git a/chrome/browser/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.h b/chrome/browser/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.h
index 38a53d4..974883e 100644
--- a/chrome/browser/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.h
+++ b/chrome/browser/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.h
@@ -67,8 +67,6 @@
                         OnUploadProgressCallback callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   // Restarts the request to go directly to |resource_request_|.
diff --git a/chrome/browser/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc b/chrome/browser/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc
index 1aac2680..f10594b 100644
--- a/chrome/browser/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc
+++ b/chrome/browser/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc
@@ -253,7 +253,17 @@
   if (estimated_length_ > 0)
     body_content_.reserve(estimated_length_);
 
-  OnStartLoadingResponseBody(std::move(body));
+  if (!body)
+    return;
+
+  serving_from_data_ = true;
+
+  pipe_drainer_ =
+      std::make_unique<mojo::DataPipeDrainer>(this, std::move(body));
+
+  event_queue_.push_back(base::BindOnce(
+      &StreamingSearchPrefetchURLLoader::OnStartLoadingResponseBodyFromData,
+      base::Unretained(this)));
 }
 
 void StreamingSearchPrefetchURLLoader::OnReceiveRedirect(
@@ -299,19 +309,6 @@
                      base::Unretained(this), transfer_size_diff));
 }
 
-void StreamingSearchPrefetchURLLoader::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle body) {
-  DCHECK(!forwarding_client_);
-  serving_from_data_ = true;
-
-  pipe_drainer_ =
-      std::make_unique<mojo::DataPipeDrainer>(this, std::move(body));
-
-  event_queue_.push_back(base::BindOnce(
-      &StreamingSearchPrefetchURLLoader::OnStartLoadingResponseBodyFromData,
-      base::Unretained(this)));
-}
-
 void StreamingSearchPrefetchURLLoader::OnDataAvailable(const void* data,
                                                        size_t num_bytes) {
   body_content_.append(std::string(static_cast<const char*>(data), num_bytes));
diff --git a/chrome/browser/prefetch/search_prefetch/streaming_search_prefetch_url_loader.h b/chrome/browser/prefetch/search_prefetch/streaming_search_prefetch_url_loader.h
index 29207bf..13f6908 100644
--- a/chrome/browser/prefetch/search_prefetch/streaming_search_prefetch_url_loader.h
+++ b/chrome/browser/prefetch/search_prefetch/streaming_search_prefetch_url_loader.h
@@ -98,8 +98,6 @@
                         OnUploadProgressCallback callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   // When a disconnection occurs in the network URLLoader mojo pipe, this
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index d6c5b01..fee7f37 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -1395,6 +1395,8 @@
   certificate_manager::CertificatesHandler::RegisterProfilePrefs(registry);
   policy::PolicyCertService::RegisterProfilePrefs(registry);
   registry->RegisterBooleanPref(prefs::kInsightsExtensionEnabled, false);
+  // By default showing Sync Consent is set to true. It can changed by policy.
+  registry->RegisterBooleanPref(prefs::kEnableSyncConsent, true);
 #if defined(USE_CUPS)
   extensions::PrintingAPIHandler::RegisterProfilePrefs(registry);
 #endif  // defined(USE_CUPS)
diff --git a/chrome/browser/profiles/profile_attributes_entry.cc b/chrome/browser/profiles/profile_attributes_entry.cc
index 2acab0b..0760f6af 100644
--- a/chrome/browser/profiles/profile_attributes_entry.cc
+++ b/chrome/browser/profiles/profile_attributes_entry.cc
@@ -703,11 +703,6 @@
   return GetBool(kUserAcceptedAccountManagement);
 }
 
-void ProfileAttributesEntry::SetIsUsingDefaultName(bool value) {
-  if (SetBool(kIsUsingDefaultNameKey, value))
-    profile_attributes_storage_->NotifyIfProfileNamesHaveChanged();
-}
-
 void ProfileAttributesEntry::SetIsUsingDefaultAvatar(bool value) {
   SetBool(kIsUsingDefaultAvatarKey, value);
 }
diff --git a/chrome/browser/profiles/profile_attributes_entry.h b/chrome/browser/profiles/profile_attributes_entry.h
index abd0560..632bf6bb 100644
--- a/chrome/browser/profiles/profile_attributes_entry.h
+++ b/chrome/browser/profiles/profile_attributes_entry.h
@@ -183,8 +183,6 @@
   void SetIsEphemeral(bool value);
   void SetUserAcceptedAccountManagement(bool value);
   bool UserAcceptedAccountManagement() const;
-  // TODO(msalama): Remove this function.
-  void SetIsUsingDefaultName(bool value);
   void SetIsUsingDefaultAvatar(bool value);
   void SetAvatarIconIndex(size_t icon_index);
   // absl::nullopt resets colors to default.
diff --git a/chrome/browser/profiles/profile_attributes_storage_unittest.cc b/chrome/browser/profiles/profile_attributes_storage_unittest.cc
index fe9d34a..2670136 100644
--- a/chrome/browser/profiles/profile_attributes_storage_unittest.cc
+++ b/chrome/browser/profiles/profile_attributes_storage_unittest.cc
@@ -750,10 +750,6 @@
 
   TEST_BOOL_ACCESSORS(ProfileAttributesEntry, entry, IsEphemeral);
 
-  EXPECT_CALL(observer(), OnProfileNameChanged(path, _)).Times(2);
-  TEST_BOOL_ACCESSORS(ProfileAttributesEntry, entry, IsUsingDefaultName);
-  VerifyAndResetCallExpectations();
-
   TEST_BOOL_ACCESSORS(ProfileAttributesEntry, entry, IsUsingDefaultAvatar);
   TEST_STRING_ACCESSORS(ProfileAttributesEntry, entry,
                         LastDownloadedGAIAPictureUrlWithSize);
@@ -1885,7 +1881,8 @@
     storage()->AddProfile(std::move(params));
     entry = storage()->GetProfileAttributesWithPath(profile_path);
     EXPECT_TRUE(entry);
-    entry->SetIsUsingDefaultName(kTestCases[i].is_using_default_name);
+    entry->SetLocalProfileName(entry->GetLocalProfileName(),
+                               kTestCases[i].is_using_default_name);
   }
 
   EXPECT_EQ(kNumProfiles, storage()->GetNumberOfProfiles());
@@ -1923,47 +1920,3 @@
   EXPECT_EQ(actual_profile_names, expected_profile_names);
 }
 #endif  // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_ASH)
-
-#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_ANDROID)
-TEST_F(ProfileAttributesStorageTest,
-       DontMigrateLegacyProfileNamesWithoutNewAvatarMenu) {
-  DisableObserver();  // This test doesn't test observers.
-  EXPECT_EQ(0U, storage()->GetNumberOfProfiles());
-
-  const struct {
-    const char* profile_path;
-    const char* profile_name;
-  } kTestCases[] = {{"path_1", "Default Profile"},
-                    {"path_2", "First user"},
-                    {"path_3", "Lemonade"},
-                    {"path_4", "Batman"}};
-  const size_t kNumProfiles = std::size(kTestCases);
-
-  for (size_t i = 0; i < kNumProfiles; ++i) {
-    base::FilePath profile_path = GetProfilePath(kTestCases[i].profile_path);
-    ProfileAttributesInitParams params;
-    params.profile_path = profile_path;
-    params.profile_name = base::ASCIIToUTF16(kTestCases[i].profile_name);
-    params.icon_index = i;
-    storage()->AddProfile(std::move(params));
-    ProfileAttributesEntry* entry =
-        storage()->GetProfileAttributesWithPath(profile_path);
-    EXPECT_TRUE(entry);
-    entry->SetIsUsingDefaultName(true);
-  }
-  EXPECT_EQ(kNumProfiles, storage()->GetNumberOfProfiles());
-
-  ResetProfileAttributesStorage();
-
-  // Profile names should have been preserved.
-  for (size_t i = 0; i < kNumProfiles; ++i) {
-    base::FilePath profile_path = GetProfilePath(kTestCases[i].profile_path);
-    std::u16string profile_name =
-        base::ASCIIToUTF16(kTestCases[i].profile_name);
-    ProfileAttributesEntry* entry =
-        storage()->GetProfileAttributesWithPath(profile_path);
-    EXPECT_TRUE(entry);
-    EXPECT_EQ(profile_name, entry->GetName());
-  }
-}
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/profiles/profile_manager_unittest.cc b/chrome/browser/profiles/profile_manager_unittest.cc
index 31314399..02bebf0 100644
--- a/chrome/browser/profiles/profile_manager_unittest.cc
+++ b/chrome/browser/profiles/profile_manager_unittest.cc
@@ -2059,7 +2059,7 @@
   // not considered default profile names for newly created profiles.
   // We use "Person %n" as the default profile name. Set |SetIsUsingDefaultName|
   // manually to mimick pre-existing profiles.
-  entry->SetIsUsingDefaultName(true);
+  entry->SetLocalProfileName(u"Default Profile", true);
 #endif  // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_ASH)
 
   entry->SetAuthInfo("23456", email2, true);
diff --git a/chrome/browser/profiles/profiles_state.cc b/chrome/browser/profiles/profiles_state.cc
index 3f7d28c..92154a3 100644
--- a/chrome/browser/profiles/profiles_state.cc
+++ b/chrome/browser/profiles/profiles_state.cc
@@ -29,6 +29,7 @@
 #include "components/prefs/pref_service.h"
 #include "components/signin/public/identity_manager/account_info.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
+#include "components/user_manager/user_manager.h"
 #include "content/public/browser/browsing_data_remover.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -308,6 +309,19 @@
 #endif
 }
 
+bool IsChromeAppKioskSession() {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  return user_manager::UserManager::Get()->IsLoggedInAsKioskApp();
+#elif BUILDFLAG(IS_CHROMEOS_LACROS)
+  DCHECK(chromeos::LacrosService::Get());
+  crosapi::mojom::SessionType session_type =
+      chromeos::LacrosService::Get()->init_params()->session_type;
+  return session_type == crosapi::mojom::SessionType::kAppKioskSession;
+#else
+  return false;
+#endif
+}
+
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
 // Implemented to have the same logic as user_manager::User::HasGaiaAccount()
 bool SessionHasGaiaAccount() {
diff --git a/chrome/browser/profiles/profiles_state.h b/chrome/browser/profiles/profiles_state.h
index 26c0cb8..df28aeb 100644
--- a/chrome/browser/profiles/profiles_state.h
+++ b/chrome/browser/profiles/profiles_state.h
@@ -117,6 +117,9 @@
 // Returns whether a kiosk session is being run currently.
 bool IsKioskSession();
 
+// Returns true if the current session is a Chrome App Kiosk session
+bool IsChromeAppKioskSession();
+
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
 // Returns whether it's a regular session (with gaia account)
 bool SessionHasGaiaAccount();
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ky.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ky.xtb
index 730e3f3..6bd9f2f 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ky.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ky.xtb
@@ -479,7 +479,7 @@
 <translation id="4161104397932142764">{COUNT,plural, =1{секунд}other{секунд}}</translation>
 <translation id="4161663686871496107">ChromeVox айтылуучу жооп пикири даяр</translation>
 <translation id="4176463684765177261">Өчүк</translation>
-<translation id="4187322598335821254">Кийинки же мурунку сапка өтүү үчүн, өйдө же ылдый сүрүңүз</translation>
+<translation id="4187322598335821254">Кийинки же мурунку сапка өтүү үчүн өйдө же ылдый сүрүңүз</translation>
 <translation id="4188530942454211480">Мурунку сүйлөм</translation>
 <translation id="4191918948604314587">Баскыч</translation>
 <translation id="419265409837491189">Мурунку тилкеге өтүү</translation>
diff --git a/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.js b/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.js
index d7fbba52..50f6d6a 100644
--- a/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.js
+++ b/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.js
@@ -21,23 +21,6 @@
   },
 
   /**
-   * See documentation for I18nBehavior.i18n(...)
-   * @param {string} id The ID of the string to translate.
-   * @param {...string|number} var_args Values to replace the placeholders $1
-   *     to $9 in the string.
-   * @return {string} A translated, sanitized, substituted string.
-   */
-  i18n(id, var_args) {
-    if (typeof this.locale === 'undefined') {
-      return '';
-    }
-    if (typeof id === 'undefined') {
-      return '';
-    }
-    return I18nBehavior.i18n.apply(this, arguments);
-  },
-
-  /**
    * Similar to 'i18nAdvanced', with an unused |locale| parameter used to
    * trigger updates when |this.locale| changes.
    * @param {string} locale The UI language used.
diff --git a/chrome/browser/resources/chromeos/login/components/buttons/oobe_back_button.html b/chrome/browser/resources/chromeos/login/components/buttons/oobe_back_button.html
index 566e93a..e4a3502 100644
--- a/chrome/browser/resources/chromeos/login/components/buttons/oobe_back_button.html
+++ b/chrome/browser/resources/chromeos/login/components/buttons/oobe_back_button.html
@@ -80,7 +80,9 @@
       <div class="flex horizontal layout center-justified center">
         <iron-icon icon="oobe-20:button-arrow-forward"></iron-icon>
         <slot name="text">
-          <div class="fallback">[[i18nDynamic(locale, textKey)]]</div>
+          <template is="dom-if" if="[[textKey]]">
+            <div class="fallback">[[i18nDynamic(locale, textKey)]]</div>
+          </template>
         </slot>
       </div>
     </cr-button>
diff --git a/chrome/browser/resources/chromeos/login/components/buttons/oobe_back_button.js b/chrome/browser/resources/chromeos/login/components/buttons/oobe_back_button.js
index c544b168..c73af3d 100644
--- a/chrome/browser/resources/chromeos/login/components/buttons/oobe_back_button.js
+++ b/chrome/browser/resources/chromeos/login/components/buttons/oobe_back_button.js
@@ -3,53 +3,51 @@
 // found in the LICENSE file.
 
 Polymer({
-    is: 'oobe-back-button',
+  is: 'oobe-back-button',
 
-    behaviors: [
-      OobeI18nBehavior
-    ],
+  behaviors: [OobeI18nBehavior],
 
-    properties: {
-      disabled: {
-        type: Boolean,
-        value: false,
-        reflectToAttribute: true,
-      },
-
-      /* The ID of the localized string to be used as button text.
-       */
-      textKey: {
-        type: String,
-        value: 'back',
-      },
-
-      labelForAria: {
-        type: String,
-      },
-
-      labelForAria_: {
-        type: String,
-        computed: 'ariaLabel_(labelForAria, locale, textKey)',
-      },
+  properties: {
+    disabled: {
+      type: Boolean,
+      value: false,
+      reflectToAttribute: true,
     },
 
-    focus() {
-      this.$.button.focus();
-    },
-
-    /**
-     * @param {!Event} e
-     * @private
+    /* The ID of the localized string to be used as button text.
      */
-    onClick_(e) {
-      // Just checking here. The event is propagated further.
-      assert(!this.disabled);
+    textKey: {
+      type: String,
+      value: 'back',
     },
 
-    ariaLabel_(labelForAria, locale, textKey) {
-      if ((typeof labelForAria !== 'undefined') && (labelForAria !== '')) {
-        return labelForAria;
-      }
-      return this.i18n(textKey);
+    labelForAria: {
+      type: String,
     },
-  });
+
+    labelForAria_: {
+      type: String,
+      computed: 'ariaLabel_(labelForAria, locale, textKey)',
+    },
+  },
+
+  focus() {
+    this.$.button.focus();
+  },
+
+  /**
+   * @param {!Event} e
+   * @private
+   */
+  onClick_(e) {
+    // Just checking here. The event is propagated further.
+    assert(!this.disabled);
+  },
+
+  ariaLabel_(labelForAria, locale, textKey) {
+    if (labelForAria) {
+      return labelForAria;
+    }
+    return this.i18n(textKey);
+  },
+});
diff --git a/chrome/browser/resources/chromeos/login/components/buttons/oobe_icon_button.html b/chrome/browser/resources/chromeos/login/components/buttons/oobe_icon_button.html
index efdac245..e95bf58 100644
--- a/chrome/browser/resources/chromeos/login/components/buttons/oobe_icon_button.html
+++ b/chrome/browser/resources/chromeos/login/components/buttons/oobe_icon_button.html
@@ -3,6 +3,8 @@
      found in the LICENSE file. -->
 
 <link rel="import" href="chrome://resources/html/polymer.html">
+
+<link rel="import" href="chrome://resources/html/assert.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_icons_css.html">
 <link rel="import" href="chrome://resources/cr_elements/shared_style_css.html">
@@ -69,7 +71,9 @@
               class="oobe-icon" hidden>
           </hd-iron-icon>
           <slot name="text">
-            <div class="fallback">[[i18nDynamic(locale, textKey)]]</div>
+            <template is="dom-if" if="[[textKey]]">
+              <div class="fallback">[[i18nDynamic(locale, textKey)]]</div>
+            </template>
           </slot>
         </div>
       </div>
diff --git a/chrome/browser/resources/chromeos/login/components/buttons/oobe_icon_button.js b/chrome/browser/resources/chromeos/login/components/buttons/oobe_icon_button.js
index c583c93e..04d280f9 100644
--- a/chrome/browser/resources/chromeos/login/components/buttons/oobe_icon_button.js
+++ b/chrome/browser/resources/chromeos/login/components/buttons/oobe_icon_button.js
@@ -3,43 +3,43 @@
 // found in the LICENSE file.
 
 Polymer({
-    is: 'oobe-icon-button',
+  is: 'oobe-icon-button',
 
-    behaviors: [OobeI18nBehavior],
+  behaviors: [OobeI18nBehavior],
 
-    properties: {
-      icon1x: {type: String, observer: 'updateIconVisibility_'},
-      icon2x: String,
+  properties: {
+    icon1x: {type: String, observer: 'updateIconVisibility_'},
+    icon2x: String,
 
 
-      /* The ID of the localized string to be used as button text.
-       */
-      textKey: {
-        type: String,
-      },
-
-      labelForAria: {
-        type: String,
-      },
-
-      labelForAriaText_: {
-        type: String,
-        computed: 'ariaLabel_(labelForAria, locale, textKey)',
-      },
+    /* The ID of the localized string to be used as button text.
+     */
+    textKey: {
+      type: String,
     },
 
-    focus() {
-      this.$.button.focus();
+    labelForAria: {
+      type: String,
     },
 
-    updateIconVisibility_() {
-      this.$.icon.hidden = (this.icon1x === undefined || this.icon1x.length == 0);
+    labelForAriaText_: {
+      type: String,
+      computed: 'ariaLabel_(labelForAria, locale, textKey)',
     },
+  },
 
-    ariaLabel_(labelForAria, locale, textKey) {
-      if ((typeof labelForAria !== 'undefined') && (labelForAria !== '')) {
-        return labelForAria;
-      }
-      return this.i18n(textKey);
-    },
-  });
+  focus() {
+    this.$.button.focus();
+  },
+
+  updateIconVisibility_() {
+    this.$.icon.hidden = (this.icon1x === undefined || this.icon1x.length == 0);
+  },
+
+  ariaLabel_(labelForAria, locale, textKey) {
+    if (labelForAria) {
+      return labelForAria;
+    }
+    return (!textKey) ? '' : this.i18n(textKey);
+  },
+});
diff --git a/chrome/browser/resources/chromeos/login/components/buttons/oobe_next_button.html b/chrome/browser/resources/chromeos/login/components/buttons/oobe_next_button.html
index 20e8fddb..7019cd3 100644
--- a/chrome/browser/resources/chromeos/login/components/buttons/oobe_next_button.html
+++ b/chrome/browser/resources/chromeos/login/components/buttons/oobe_next_button.html
@@ -80,7 +80,9 @@
         aria-label$="[[labelForAria_]]" class="action-button">
       <div class="flex horizontal layout center-justified center">
         <slot name="text">
-          <div class="fallback">[[i18nDynamic(locale, textKey)]]</div>
+          <template is="dom-if" if="[[textKey]]">
+            <div class="fallback">[[i18nDynamic(locale, textKey)]]</div>
+          </template>
         </slot>
         <iron-icon icon="oobe-20:button-arrow-forward"></iron-icon>
       </div>
diff --git a/chrome/browser/resources/chromeos/login/components/buttons/oobe_next_button.js b/chrome/browser/resources/chromeos/login/components/buttons/oobe_next_button.js
index b162cbc..8f83fcd 100644
--- a/chrome/browser/resources/chromeos/login/components/buttons/oobe_next_button.js
+++ b/chrome/browser/resources/chromeos/login/components/buttons/oobe_next_button.js
@@ -37,7 +37,7 @@
   },
 
   ariaLabel_(labelForAria, locale, textKey) {
-    if ((typeof labelForAria !== 'undefined') && (labelForAria !== '')) {
+    if (labelForAria) {
       return labelForAria;
     }
     return this.i18n(textKey);
diff --git a/chrome/browser/resources/chromeos/login/components/buttons/oobe_text_button.html b/chrome/browser/resources/chromeos/login/components/buttons/oobe_text_button.html
index c7b504c..ff348fd 100644
--- a/chrome/browser/resources/chromeos/login/components/buttons/oobe_text_button.html
+++ b/chrome/browser/resources/chromeos/login/components/buttons/oobe_text_button.html
@@ -65,7 +65,9 @@
       <div id="container"
           class="flex layout horizontal center center-justified self-stretch">
         <slot name="text">
-          <div class="fallback">[[i18nDynamic(locale, textKey)]]</div>
+          <template is="dom-if" if="[[textKey]]">
+            <div class="fallback">[[i18nDynamic(locale, textKey)]]</div>
+          </template>
         </slot>
       </div>
     </cr-button>
diff --git a/chrome/browser/resources/chromeos/login/components/buttons/oobe_text_button.js b/chrome/browser/resources/chromeos/login/components/buttons/oobe_text_button.js
index fe0d985..f575b5f 100644
--- a/chrome/browser/resources/chromeos/login/components/buttons/oobe_text_button.js
+++ b/chrome/browser/resources/chromeos/login/components/buttons/oobe_text_button.js
@@ -47,9 +47,9 @@
   },
 
   ariaLabel_(labelForAria, locale, textKey) {
-    if ((typeof labelForAria !== 'undefined') && (labelForAria !== '')) {
+    if (labelForAria) {
       return labelForAria;
     }
-    return this.i18n(textKey);
+    return (!textKey) ? '' : this.i18n(textKey);
   },
 });
diff --git a/chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.html b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.html
index 2b06673..4d87e5b2 100644
--- a/chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.html
+++ b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.html
@@ -29,11 +29,15 @@
     <oobe-adaptive-dialog id="dialog" role="dialog">
       <slot slot="icon" name="icon"></slot>
       <h1 slot="title">
-        <slot name="title" aria-label="[[i18nDynamic(locale, titleLabelKey)]]">
-          [[i18nDynamic(locale, titleKey)]]
+        <slot name="title" aria-label="[[getAriaLabel(locale, titleLabelKey, titleKey)]]">
+          <template is="dom-if" if="[[titleKey]]">
+            [[i18nDynamic(locale, titleKey)]]
+          </template>
         </slot>
       </h1>
-      <div slot="subtitle">[[localizeSubtitle_(locale, subtitleKey)]]</div>
+      <template is="dom-if" if="[[subtitleKey]]">
+        <div slot="subtitle">[[i18nDynamic(locale, subtitleKey)]]</div>
+      </template>
       <div slot="content" class="flex layout vertical center center-justified">
         <oobe-cr-lottie id="spinner" animation-url="spinner.json">
         </oobe-cr-lottie>
diff --git a/chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.js b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.js
index e4a7d327..76647e4f 100644
--- a/chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.js
+++ b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.js
@@ -38,14 +38,11 @@
     this.$.spinner.playing = false;
   },
 
-  /**
-   * Localize subtitle message
-   * @private
-   * @param {string} locale  i18n locale data
-   * @param {string} messageId
-   */
-  localizeSubtitle_(locale, messageId) {
-    return messageId ? this.i18nDynamic(locale, messageId) : '';
+  // Returns either the passed 'title-label-key', or uses the 'title-key'.
+  getAriaLabel(locale, titleLabelKey, titleKey) {
+    assert(this.titleLabelKey || this.titleKey,
+           'OOBE Loading dialog requires a title or a label for a11y!');
+    return (titleLabelKey) ? this.i18n(titleLabelKey) : this.i18n(titleKey);
   },
 
   cancel() {
diff --git a/chrome/browser/resources/chromeos/login/components/dialogs/oobe_modal_dialog.html b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_modal_dialog.html
index d3f795f0..1f409453 100644
--- a/chrome/browser/resources/chromeos/login/components/dialogs/oobe_modal_dialog.html
+++ b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_modal_dialog.html
@@ -59,13 +59,19 @@
     <cr-dialog id="modalDialog" on-close="onClose_">
       <!-- Title -->
       <div id="modalDialogTitle" slot="title">
-        <slot name="title">[[i18nDynamic(locale, titleKey)]]</slot>
+        <slot name="title">
+          <template is="dom-if" if="[[titleKey]]">
+            [[i18nDynamic(locale, titleKey)]]
+          </template>
+        </slot>
       </div>
       <!-- Content to be shown -->
       <div id="contentContainer" slot="body"
           class="flex-grow layout vertical not-resizable">
         <slot name="content">
-          [[i18nDynamic(locale, contentKey)]]
+          <template is="dom-if" if="[[contentKey]]">
+            [[i18nDynamic(locale, contentKey)]]
+          </template>
         </slot>
       </div>
       <!-- Close Button -->
diff --git a/chrome/browser/resources/chromeos/login/components/throbber_notice.html b/chrome/browser/resources/chromeos/login/components/throbber_notice.html
index fdfb727..c4f46bc 100644
--- a/chrome/browser/resources/chromeos/login/components/throbber_notice.html
+++ b/chrome/browser/resources/chromeos/login/components/throbber_notice.html
@@ -35,8 +35,10 @@
     </style>
     <paper-spinner-lite dir="ltr" active></paper-spinner-lite>
     <div id="comment" aria-live="polite"
-        aria-label$="[[i18nDynamic(locale, textKey)]]">
-      [[i18nDynamic(locale, textKey)]]
+        aria-label$="[[getAriaLabel(locale, textKey)]]">
+      <template is="dom-if" if="[[textKey]]">
+        [[i18nDynamic(locale, textKey)]]
+      </template>
     </div>
   </template>
   <script src="throbber_notice.js"></script>
diff --git a/chrome/browser/resources/chromeos/login/components/throbber_notice.js b/chrome/browser/resources/chromeos/login/components/throbber_notice.js
index f2b95353..0dd489f 100644
--- a/chrome/browser/resources/chromeos/login/components/throbber_notice.js
+++ b/chrome/browser/resources/chromeos/login/components/throbber_notice.js
@@ -27,6 +27,15 @@
   constructor() {
     super();
   }
+
+  /**
+   * Returns the a11y message to be shown on this throbber, if the textkey is set.
+   * @param {string} locale
+   * @returns
+   */
+  getAriaLabel(locale) {
+    return (!this.textKey) ? '' : this.i18n(this.textKey);
+  }
 }
 
 customElements.define(ThrobberNotice.is, ThrobberNotice);
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/login/screens/common/offline_ad_login.js b/chrome/browser/resources/chromeos/login/screens/common/offline_ad_login.js
index 17480de..7a733e9e 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/offline_ad_login.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/offline_ad_login.js
@@ -114,7 +114,7 @@
       /**
        * ID of localized welcome message on top of the UI.
        */
-      adWelcomeMessageKey: String,
+      adWelcomeMessageKey: {type: String, value: 'loginWelcomeMessage'},
       /**
        * Error message for the machine name input.
        */
@@ -269,9 +269,6 @@
         this.userRealm = '@' + data['emailDomain'];
       }
     }
-    if (!this.adWelcomeMessageKey) {
-      this.adWelcomeMessageKey = 'loginWelcomeMessage';
-    }
     this.focus();
   }
 
@@ -570,14 +567,14 @@
 
   getMachineNameError_(locale, errorState) {
     if (errorState == ActiveDirectoryErrorState.MACHINE_NAME_TOO_LONG) {
-      return this.i18nDynamic(locale, 'adJoinErrorMachineNameTooLong');
+      return this.i18n('adJoinErrorMachineNameTooLong');
     }
     if (errorState == ActiveDirectoryErrorState.MACHINE_NAME_INVALID) {
       if (this.machineNameInputPattern_) {
-        return this.i18nDynamic(locale, 'adJoinErrorMachineNameInvalidFormat');
+        return this.i18n('adJoinErrorMachineNameInvalidFormat');
       }
     }
-    return this.i18nDynamic(locale, 'adJoinErrorMachineNameInvalid');
+    return this.i18n('adJoinErrorMachineNameInvalid');
   }
 
   onKeydownUnlockPassword_(e) {
diff --git a/chrome/browser/resources/chromeos/login/screens/common/os_install.html b/chrome/browser/resources/chromeos/login/screens/common/os_install.html
index 1bc4cf9..e7d4245 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/os_install.html
+++ b/chrome/browser/resources/chromeos/login/screens/common/os_install.html
@@ -111,10 +111,9 @@
     <oobe-loading-dialog id="osInstallDialogInProgress"
         role="dialog" for-step="in-progress"
         subtitle-key="osInstallDialogInProgressSubtitle"
+        title-key="osInstallDialogInProgressTitle"
         aria-label$="[[i18nDynamic(locale, 'osInstallDialogInProgressTitle')]]">
       <iron-icon slot="icon" icon="oobe-32:googleg"></iron-icon>
-      <div slot="title" id="osInstallDialogInProgressTitleId">
-        [[i18nDynamic(locale, 'osInstallDialogInProgressTitle')]]</div>
     </oobe-loading-dialog>
 
     <oobe-adaptive-dialog id="osInstallDialogError"
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/quick_start.html b/chrome/browser/resources/chromeos/login/screens/oobe/quick_start.html
index f444530..912ff77 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/quick_start.html
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/quick_start.html
@@ -41,7 +41,8 @@
         font-size: 22px;
       }
     </style>
-    <oobe-loading-dialog id="loadingDialog" for-step="loading">
+    <oobe-loading-dialog id="loadingDialog" for-step="loading"
+        title-key="gaiaLoading">
     </oobe-loading-dialog>
     <oobe-adaptive-dialog for-step="verification">
       <h1 slot="title">
diff --git a/chrome/browser/resources/profile_internals/profile_internals_app.html b/chrome/browser/resources/profile_internals/profile_internals_app.html
index 26b2949..9484f35 100644
--- a/chrome/browser/resources/profile_internals/profile_internals_app.html
+++ b/chrome/browser/resources/profile_internals/profile_internals_app.html
@@ -92,6 +92,10 @@
         <td>Loaded in Memory</td>
         <td>[[item.profileState.isLoaded]]</td>
       </tr>
+      <tr>
+        <td>Has Incognito Profile</td>
+        <td>[[item.profileState.hasOffTheRecord]]</td>
+      </tr>
     </table>
   </iron-collapse>
 </template>
diff --git a/chrome/browser/resources/profile_internals/profile_internals_browser_proxy.ts b/chrome/browser/resources/profile_internals/profile_internals_browser_proxy.ts
index aace5840..2abeee4b 100644
--- a/chrome/browser/resources/profile_internals/profile_internals_browser_proxy.ts
+++ b/chrome/browser/resources/profile_internals/profile_internals_browser_proxy.ts
@@ -23,6 +23,7 @@
   keepAlives: Array<KeepAlive>,
   signedAccounts: Array<string>,
   isLoaded: boolean,
+  hasOffTheRecord: boolean,
 };
 
 export type ProfileStateElement = {
diff --git a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.cc b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.cc
index 68668559..48dc4533 100644
--- a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.cc
+++ b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.cc
@@ -171,11 +171,6 @@
     target_client_->OnTransferSizeUpdated(transfer_size_diff);
   }
 
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override {
-    target_client_->OnStartLoadingResponseBody(std::move(body));
-  }
-
   void OnComplete(const network::URLLoaderCompletionStatus& status) override {
     target_client_->OnComplete(status);
   }
diff --git a/chrome/browser/sync/chrome_sync_client.cc b/chrome/browser/sync/chrome_sync_client.cc
index b949c22..ac64a1e 100644
--- a/chrome/browser/sync/chrome_sync_client.cc
+++ b/chrome/browser/sync/chrome_sync_client.cc
@@ -520,8 +520,9 @@
   invalidation::ProfileInvalidationProvider* provider =
       invalidation::ProfileInvalidationProviderFactory::GetForProfile(profile_);
 
-  if (provider)
+  if (provider) {
     return provider->GetInvalidationService();
+  }
   return nullptr;
 }
 
diff --git a/chrome/browser/sync/glue/extensions_activity_monitor.cc b/chrome/browser/sync/glue/extensions_activity_monitor.cc
index 5758d18b..893d7bb 100644
--- a/chrome/browser/sync/glue/extensions_activity_monitor.cc
+++ b/chrome/browser/sync/glue/extensions_activity_monitor.cc
@@ -41,8 +41,9 @@
     const extensions::Extension* extension,
     const extensions::BookmarksFunction* func) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  if (!extension)
+  if (!extension) {
     return;
+  }
 
   switch (func->histogram_value()) {
     case extensions::functions::BOOKMARKS_UPDATE:
diff --git a/chrome/browser/sync/sessions/browser_list_router_helper.cc b/chrome/browser/sync/sessions/browser_list_router_helper.cc
index dd48b991..1d1a06f 100644
--- a/chrome/browser/sync/sessions/browser_list_router_helper.cc
+++ b/chrome/browser/sync/sessions/browser_list_router_helper.cc
@@ -48,8 +48,9 @@
   std::vector<content::WebContents*> web_contents;
   if (change.type() == TabStripModelChange::kInserted) {
     for (const TabStripModelChange::ContentsWithIndex& contents :
-         change.GetInsert()->contents)
+         change.GetInsert()->contents) {
       web_contents.push_back(contents.contents);
+    }
   } else if (change.type() == TabStripModelChange::kReplaced) {
     web_contents.push_back(change.GetReplace()->new_contents);
   } else {
diff --git a/chrome/browser/sync/sessions/sync_sessions_router_tab_helper.cc b/chrome/browser/sync/sessions/sync_sessions_router_tab_helper.cc
index bbca69e..73f511f 100644
--- a/chrome/browser/sync/sessions/sync_sessions_router_tab_helper.cc
+++ b/chrome/browser/sync/sessions/sync_sessions_router_tab_helper.cc
@@ -28,22 +28,25 @@
   chrome_translate_client_ =
       ChromeTranslateClient::FromWebContents(web_contents);
   // A translate client is not always attached to web contents (e.g. tests).
-  if (chrome_translate_client_)
+  if (chrome_translate_client_) {
     chrome_translate_client_->GetTranslateDriver()
         ->AddLanguageDetectionObserver(this);
+  }
 
   favicon_driver_ =
       favicon::ContentFaviconDriver::FromWebContents(web_contents);
-  if (favicon_driver_)
+  if (favicon_driver_) {
     favicon_driver_->AddObserver(this);
+  }
 }
 
 SyncSessionsRouterTabHelper::~SyncSessionsRouterTabHelper() = default;
 
 void SyncSessionsRouterTabHelper::DidFinishNavigation(
     content::NavigationHandle* navigation_handle) {
-  if (navigation_handle && navigation_handle->IsInPrimaryMainFrame())
+  if (navigation_handle && navigation_handle->IsInPrimaryMainFrame()) {
     NotifyRouter();
+  }
 }
 
 void SyncSessionsRouterTabHelper::TitleWasSet(content::NavigationEntry* entry) {
@@ -52,11 +55,13 @@
 
 void SyncSessionsRouterTabHelper::WebContentsDestroyed() {
   NotifyRouter();
-  if (chrome_translate_client_)
+  if (chrome_translate_client_) {
     chrome_translate_client_->GetTranslateDriver()
         ->RemoveLanguageDetectionObserver(this);
-  if (favicon_driver_)
+  }
+  if (favicon_driver_) {
     favicon_driver_->RemoveObserver(this);
+  }
 }
 
 void SyncSessionsRouterTabHelper::DidFinishLoad(
@@ -84,13 +89,15 @@
 
 void SyncSessionsRouterTabHelper::OnLanguageDetermined(
     const translate::LanguageDetectionDetails& details) {
-  if (base::FeatureList::IsEnabled(language::kNotifySyncOnLanguageDetermined))
+  if (base::FeatureList::IsEnabled(language::kNotifySyncOnLanguageDetermined)) {
     NotifyRouter();
+  }
 }
 
 void SyncSessionsRouterTabHelper::NotifyRouter(bool page_load_completed) {
-  if (router_)
+  if (router_) {
     router_->NotifyTabModified(web_contents(), page_load_completed);
+  }
 }
 
 void SyncSessionsRouterTabHelper::OnFaviconUpdated(
diff --git a/chrome/browser/sync/sessions/sync_sessions_router_tab_helper_browsertest.cc b/chrome/browser/sync/sessions/sync_sessions_router_tab_helper_browsertest.cc
index 1921c71..3e4ac6c 100644
--- a/chrome/browser/sync/sessions/sync_sessions_router_tab_helper_browsertest.cc
+++ b/chrome/browser/sync/sessions/sync_sessions_router_tab_helper_browsertest.cc
@@ -32,8 +32,9 @@
   void OnLocalTabModified(
       sync_sessions::SyncedTabDelegate* modified_tab) override {
     local_tab_updated_ = true;
-    if (quit_closure_)
+    if (quit_closure_) {
       std::move(quit_closure_).Run();
+    }
   }
 
   bool local_tab_updated() { return local_tab_updated_; }
@@ -49,16 +50,19 @@
  public:
   void OnLanguageDetermined(
       const translate::LanguageDetectionDetails& details) override {
-    if (interested_url_ != details.url)
+    if (interested_url_ != details.url) {
       return;
+    }
     language_determined_ = true;
-    if (quit_closure_)
+    if (quit_closure_) {
       std::move(quit_closure_).Run();
+    }
   }
 
   void WaitForLanguageDetermined() {
-    if (language_determined_)
+    if (language_determined_) {
       return;
+    }
     base::RunLoop run_loop;
     quit_closure_ = run_loop.QuitClosure();
     run_loop.Run();
@@ -96,8 +100,9 @@
     observer_.SetInterestedURL(url);
     ChromeTranslateClient* chrome_translate_client =
         ChromeTranslateClient::FromWebContents(web_contents());
-    if (!chrome_translate_client)
+    if (!chrome_translate_client) {
       return;
+    }
     chrome_translate_client->GetTranslateDriver()->AddLanguageDetectionObserver(
         &observer_);
   }
@@ -106,8 +111,9 @@
     observer_.SetInterestedURL(GURL::EmptyGURL());
     ChromeTranslateClient* chrome_translate_client =
         ChromeTranslateClient::FromWebContents(web_contents());
-    if (!chrome_translate_client)
+    if (!chrome_translate_client) {
       return;
+    }
     chrome_translate_client->GetTranslateDriver()
         ->RemoveLanguageDetectionObserver(&observer_);
   }
diff --git a/chrome/browser/sync/sessions/sync_sessions_web_contents_router.cc b/chrome/browser/sync/sessions/sync_sessions_web_contents_router.cc
index 8f6ed3b3..6be1b49d 100644
--- a/chrome/browser/sync/sessions/sync_sessions_web_contents_router.cc
+++ b/chrome/browser/sync/sessions/sync_sessions_web_contents_router.cc
@@ -49,8 +49,9 @@
     content::WebContents* web_contents,
     bool page_load_completed) {
   SyncedTabDelegate* delegate = nullptr;
-  if (web_contents)
+  if (web_contents) {
     delegate = GetSyncedTabDelegateFromWebContents(web_contents);
+  }
 
   if (handler_ && delegate) {
     handler_->OnLocalTabModified(delegate);
diff --git a/chrome/browser/sync/sync_encryption_keys_tab_helper.cc b/chrome/browser/sync/sync_encryption_keys_tab_helper.cc
index ee66160..a1aaf3c 100644
--- a/chrome/browser/sync/sync_encryption_keys_tab_helper.cc
+++ b/chrome/browser/sync/sync_encryption_keys_tab_helper.cc
@@ -151,8 +151,9 @@
       EncryptionKeyApi::GetForPage(rfh->GetPage());
   // The page has a correspond EncryptionKeyApi instance for the main frame.
   // See DidFinishNavigation.
-  if (!encryption_key_api)
+  if (!encryption_key_api) {
     return;
+  }
   encryption_key_api->BindReceiver(std::move(receiver), rfh);
 }
 
@@ -194,8 +195,9 @@
 
 bool SyncEncryptionKeysTabHelper::HasEncryptionKeysApiForTesting(
     content::RenderFrameHost* render_frame_host) {
-  if (!render_frame_host)
+  if (!render_frame_host) {
     return false;
+  }
   return EncryptionKeyApi::GetForPage(render_frame_host->GetPage());
 }
 
diff --git a/chrome/browser/sync/sync_service_factory.cc b/chrome/browser/sync/sync_service_factory.cc
index ac1fca3..581e57a 100644
--- a/chrome/browser/sync/sync_service_factory.cc
+++ b/chrome/browser/sync/sync_service_factory.cc
@@ -122,8 +122,9 @@
     // roaming profile location the sync service will not be created.
     UMA_HISTOGRAM_BOOLEAN("Sync.Local.RoamingProfileUnavailable",
                           local_sync_backend_folder.empty());
-    if (local_sync_backend_folder.empty())
+    if (local_sync_backend_folder.empty()) {
       return nullptr;
+    }
 
     init_params.start_behavior = syncer::SyncServiceImpl::AUTO_START;
   }
diff --git a/chrome/browser/sync/sync_startup_tracker.cc b/chrome/browser/sync/sync_startup_tracker.cc
index 49b3f73..9c95a587 100644
--- a/chrome/browser/sync/sync_startup_tracker.cc
+++ b/chrome/browser/sync/sync_startup_tracker.cc
@@ -10,15 +10,17 @@
 SyncStartupTracker::SyncStartupTracker(syncer::SyncService* sync_service,
                                        Observer* observer)
     : sync_service_(sync_service), observer_(observer) {
-  if (sync_service_)
+  if (sync_service_) {
     sync_service_->AddObserver(this);
+  }
 
   CheckServiceState();
 }
 
 SyncStartupTracker::~SyncStartupTracker() {
-  if (sync_service_)
+  if (sync_service_) {
     sync_service_->RemoveObserver(this);
+  }
 }
 
 void SyncStartupTracker::OnStateChanged(syncer::SyncService* sync) {
@@ -45,20 +47,24 @@
 SyncStartupTracker::SyncServiceState SyncStartupTracker::GetSyncServiceState(
     syncer::SyncService* sync_service) {
   // If no service exists or it can't be started, treat as a startup error.
-  if (!sync_service || !sync_service->CanSyncFeatureStart())
+  if (!sync_service || !sync_service->CanSyncFeatureStart()) {
     return SYNC_STARTUP_ERROR;
+  }
 
   // If the sync engine has started up, notify the callback.
-  if (sync_service->IsEngineInitialized())
+  if (sync_service->IsEngineInitialized()) {
     return SYNC_STARTUP_COMPLETE;
+  }
 
   // If the sync service has some kind of error, report to the user.
-  if (sync_service->HasUnrecoverableError())
+  if (sync_service->HasUnrecoverableError()) {
     return SYNC_STARTUP_ERROR;
+  }
 
   // If we have an auth error, exit.
-  if (sync_service->GetAuthError().state() != GoogleServiceAuthError::NONE)
+  if (sync_service->GetAuthError().state() != GoogleServiceAuthError::NONE) {
     return SYNC_STARTUP_ERROR;
+  }
 
   // No error detected yet, but the sync engine hasn't started up yet, so
   // we're in the pending state.
diff --git a/chrome/browser/sync/sync_ui_util.cc b/chrome/browser/sync/sync_ui_util.cc
index 630a40ebe..11f4c8b9 100644
--- a/chrome/browser/sync/sync_ui_util.cc
+++ b/chrome/browser/sync/sync_ui_util.cc
@@ -184,8 +184,9 @@
 void FocusWebContents(Browser* browser) {
   content::WebContents* const contents =
       browser->tab_strip_model()->GetActiveWebContents();
-  if (contents)
+  if (contents) {
     contents->Focus();
+  }
 }
 
 void OpenTabForSyncTrustedVaultUserAction(Browser* browser, const GURL& url) {
diff --git a/chrome/browser/sync/test/integration/apps_helper.cc b/chrome/browser/sync/test/integration/apps_helper.cc
index 5217aaf2..29ca3f6c 100644
--- a/chrome/browser/sync/test/integration/apps_helper.cc
+++ b/chrome/browser/sync/test/integration/apps_helper.cc
@@ -199,8 +199,9 @@
     std::unique_ptr<web_app::WebAppTestInstallObserver> install_observer =
         SetupSyncInstallObserverForProfile(profile);
     // This actually waits for all observed apps to be installed.
-    if (install_observer)
+    if (install_observer) {
       install_observer->Wait();
+    }
 
     std::unique_ptr<web_app::WebAppTestUninstallObserver> uninstall_observer =
         SetupSyncUninstallObserverForProfile(profile);
diff --git a/chrome/browser/sync/test/integration/bookmarks_helper.cc b/chrome/browser/sync/test/integration/bookmarks_helper.cc
index 0042c94b..6d04637 100644
--- a/chrome/browser/sync/test/integration/bookmarks_helper.cc
+++ b/chrome/browser/sync/test/integration/bookmarks_helper.cc
@@ -90,8 +90,9 @@
     const GURL& icon_url,
     const scoped_refptr<base::RefCountedMemory>& bitmap_data) {
   // Some tests use no services.
-  if (favicon_service == nullptr)
+  if (favicon_service == nullptr) {
     return;
+  }
 
   favicon_service->AddPageNoVisitForBookmark(bookmark_node->url(),
                                              bookmark_node->GetTitle());
@@ -162,15 +163,17 @@
 
   void BookmarkNodeChanged(BookmarkModel* model,
                            const BookmarkNode* node) override {
-    if (model == model_ && node == node_)
+    if (model == model_ && node == node_) {
       model->GetFavicon(node);
+    }
   }
   void BookmarkNodeChildrenReordered(BookmarkModel* model,
                                      const BookmarkNode* node) override {}
   void BookmarkNodeFaviconChanged(BookmarkModel* model,
                                   const BookmarkNode* node) override {
-    if (model == model_ && node == node_)
+    if (model == model_ && node == node_) {
       run_loop_.Quit();
+    }
   }
 
  private:
@@ -190,8 +193,9 @@
   size_t count = 0;
   while (iterator.has_next()) {
     const BookmarkNode* node = iterator.Next();
-    if ((node->type() == node_type) && (node->GetTitle() == title))
+    if ((node->type() == node_type) && (node->GetTitle() == title)) {
       ++count;
+    }
   }
   return count;
 }
@@ -204,8 +208,9 @@
   size_t count = 0;
   while (iterator.has_next()) {
     const BookmarkNode* node = iterator.Next();
-    if (node->type() == node_type)
+    if (node->type() == node_type) {
       ++count;
+    }
   }
   return count;
 }
@@ -214,8 +219,9 @@
 // Returns true if they match.
 bool FaviconRawBitmapsMatch(const SkBitmap& bitmap_a,
                             const SkBitmap& bitmap_b) {
-  if (bitmap_a.computeByteSize() == 0U && bitmap_b.computeByteSize() == 0U)
+  if (bitmap_a.computeByteSize() == 0U && bitmap_b.computeByteSize() == 0U) {
     return true;
+  }
   if ((bitmap_a.computeByteSize() != bitmap_b.computeByteSize()) ||
       (bitmap_a.width() != bitmap_b.width()) ||
       (bitmap_a.height() != bitmap_b.height())) {
@@ -363,8 +369,9 @@
   gfx::Image image_a = favicon_data_a->image;
   gfx::Image image_b = favicon_data_b->image;
 
-  if (image_a.IsEmpty() && image_b.IsEmpty())
+  if (image_a.IsEmpty() && image_b.IsEmpty()) {
     return true;  // Two empty images are equivalent.
+  }
 
   if (image_a.IsEmpty() != image_b.IsEmpty()) {
     return false;
@@ -379,8 +386,9 @@
 // Does a deep comparison of BookmarkNode fields in |model_a| and |model_b|.
 // Returns true if they are all equal.
 bool NodesMatch(const BookmarkNode* node_a, const BookmarkNode* node_b) {
-  if (node_a == nullptr || node_b == nullptr)
+  if (node_a == nullptr || node_b == nullptr) {
     return node_a == node_b;
+  }
   if (node_a->is_folder() != node_b->is_folder()) {
     LOG(ERROR) << "Cannot compare folder with bookmark";
     return false;
@@ -686,8 +694,9 @@
                << "Profile " << profile;
     return nullptr;
   }
-  if (node->is_url())
+  if (node->is_url()) {
     model->SetURL(node, new_url);
+  }
   return node;
 }
 
@@ -756,8 +765,9 @@
       GetBookmarkModel(profile)->root_node());
   while (iterator.has_next()) {
     const BookmarkNode* node = iterator.Next();
-    if (node->is_folder())
+    if (node->is_folder()) {
       continue;
+    }
     std::vector<const BookmarkNode*> nodes;
     GetBookmarkModel(profile)->GetNodesByURL(node->url(), &nodes);
     EXPECT_GE(nodes.size(), 1U);
@@ -782,8 +792,9 @@
   std::vector<const BookmarkNode*> nodes;
   GetBookmarkModel(profile)->GetNodesByURL(url, &nodes);
   EXPECT_EQ(1U, nodes.size());
-  if (nodes.empty())
+  if (nodes.empty()) {
     return nullptr;
+  }
   return nodes[0];
 }
 
@@ -838,12 +849,14 @@
   base::ScopedAllowBlockingForTesting allow_blocking;
   const char* kPNGExtension = ".png";
   if (!base::EndsWith(path, kPNGExtension,
-                      base::CompareCase::INSENSITIVE_ASCII))
+                      base::CompareCase::INSENSITIVE_ASCII)) {
     return gfx::Image();
+  }
 
   base::FilePath full_path;
-  if (!base::PathService::Get(chrome::DIR_TEST_DATA, &full_path))
+  if (!base::PathService::Get(chrome::DIR_TEST_DATA, &full_path)) {
     return gfx::Image();
+  }
 
   full_path = full_path.AppendASCII("sync").AppendASCII(path);
   std::string contents;
diff --git a/chrome/browser/sync/test/integration/dictionary_helper.cc b/chrome/browser/sync/test/integration/dictionary_helper.cc
index 8183d0d..84bebfa7a 100644
--- a/chrome/browser/sync/test/integration/dictionary_helper.cc
+++ b/chrome/browser/sync/test/integration/dictionary_helper.cc
@@ -47,8 +47,9 @@
 }
 
 void LoadDictionary(SpellcheckCustomDictionary* dictionary) {
-  if (dictionary->IsLoaded())
+  if (dictionary->IsLoaded()) {
     return;
+  }
   base::RunLoop run_loop;
   DictionaryLoadObserver observer(
       content::GetDeferredQuitTaskForRunLoop(&run_loop));
diff --git a/chrome/browser/sync/test/integration/extension_settings_helper.cc b/chrome/browser/sync/test/integration/extension_settings_helper.cc
index d54b8638..683a792 100644
--- a/chrome/browser/sync/test/integration/extension_settings_helper.cc
+++ b/chrome/browser/sync/test/integration/extension_settings_helper.cc
@@ -107,8 +107,9 @@
 
 void SetExtensionSettingsForAllProfiles(const std::string& id,
                                         const base::DictionaryValue& settings) {
-  for (int i = 0; i < test()->num_clients(); ++i)
+  for (int i = 0; i < test()->num_clients(); ++i) {
     SetExtensionSettings(test()->GetProfile(i), id, settings);
+  }
   SetExtensionSettings(test()->verifier(), id, settings);
 }
 
diff --git a/chrome/browser/sync/test/integration/migration_test.cc b/chrome/browser/sync/test/integration/migration_test.cc
index ac8cba5..db2a4cc 100644
--- a/chrome/browser/sync/test/integration/migration_test.cc
+++ b/chrome/browser/sync/test/integration/migration_test.cc
@@ -81,8 +81,9 @@
   // helps ensure that all migration events are captured, even if they were to
   // occur before a test calls AwaitMigration for a specific profile.
   bool SetupSync() override {
-    if (!SyncTest::SetupSync())
+    if (!SyncTest::SetupSync()) {
       return false;
+    }
 
     for (int i = 0; i < num_clients(); ++i) {
       migration_watchers_.push_back(
diff --git a/chrome/browser/sync/test/integration/migration_watcher.cc b/chrome/browser/sync/test/integration/migration_watcher.cc
index a1af0c5b..4258873 100644
--- a/chrome/browser/sync/test/integration/migration_watcher.cc
+++ b/chrome/browser/sync/test/integration/migration_watcher.cc
@@ -51,8 +51,9 @@
   }
 
   // Manually trigger a check of the exit condition.
-  if (migration_waiter_)
+  if (migration_waiter_) {
     migration_waiter_->OnMigrationStateChange();
+  }
 }
 
 void MigrationWatcher::set_migration_waiter(MigrationWaiter* waiter) {
diff --git a/chrome/browser/sync/test/integration/multi_client_status_change_checker.cc b/chrome/browser/sync/test/integration/multi_client_status_change_checker.cc
index 1e1849072..e25f058 100644
--- a/chrome/browser/sync/test/integration/multi_client_status_change_checker.cc
+++ b/chrome/browser/sync/test/integration/multi_client_status_change_checker.cc
@@ -7,8 +7,9 @@
 MultiClientStatusChangeChecker::MultiClientStatusChangeChecker(
     std::vector<syncer::SyncServiceImpl*> services)
     : services_(services) {
-  for (syncer::SyncServiceImpl* service : services)
+  for (syncer::SyncServiceImpl* service : services) {
     scoped_observations_.AddObservation(service);
+  }
 }
 
 MultiClientStatusChangeChecker::~MultiClientStatusChangeChecker() = default;
diff --git a/chrome/browser/sync/test/integration/performance/bookmarks_sync_perf_test.cc b/chrome/browser/sync/test/integration/performance/bookmarks_sync_perf_test.cc
index b514294..5993d910 100644
--- a/chrome/browser/sync/test/integration/performance/bookmarks_sync_perf_test.cc
+++ b/chrome/browser/sync/test/integration/performance/bookmarks_sync_perf_test.cc
@@ -77,8 +77,9 @@
 
 void BookmarksSyncPerfTest::UpdateURLs(int profile) {
   for (const std::unique_ptr<bookmarks::BookmarkNode>& child :
-       GetBookmarkBarNode(profile)->children())
+       GetBookmarkBarNode(profile)->children()) {
     ASSERT_TRUE(SetURL(profile, child.get(), GURL(NextIndexedURL())));
+  }
 }
 
 void BookmarksSyncPerfTest::RemoveURLs(int profile) {
diff --git a/chrome/browser/sync/test/integration/performance/extensions_sync_perf_test.cc b/chrome/browser/sync/test/integration/performance/extensions_sync_perf_test.cc
index 9b5ae0a..1eb4ce45 100644
--- a/chrome/browser/sync/test/integration/performance/extensions_sync_perf_test.cc
+++ b/chrome/browser/sync/test/integration/performance/extensions_sync_perf_test.cc
@@ -75,10 +75,11 @@
 void ExtensionsSyncPerfTest::UpdateExtensions(int profile) {
   std::vector<int> extensions = GetInstalledExtensions(GetProfile(profile));
   for (int extension : extensions) {
-    if (IsExtensionEnabled(GetProfile(profile), extension))
+    if (IsExtensionEnabled(GetProfile(profile), extension)) {
       DisableExtension(GetProfile(profile), extension);
-    else
+    } else {
       EnableExtension(GetProfile(profile), extension);
+    }
   }
 }
 
@@ -88,8 +89,9 @@
 
 void ExtensionsSyncPerfTest::RemoveExtensions(int profile) {
   std::vector<int> extensions = GetInstalledExtensions(GetProfile(profile));
-  for (int extension : extensions)
+  for (int extension : extensions) {
     UninstallExtension(GetProfile(profile), extension);
+  }
 }
 
 IN_PROC_BROWSER_TEST_F(ExtensionsSyncPerfTest, P0) {
diff --git a/chrome/browser/sync/test/integration/performance/sessions_sync_perf_test.cc b/chrome/browser/sync/test/integration/performance/sessions_sync_perf_test.cc
index 1676563..c321fe2 100644
--- a/chrome/browser/sync/test/integration/performance/sessions_sync_perf_test.cc
+++ b/chrome/browser/sync/test/integration/performance/sessions_sync_perf_test.cc
@@ -116,9 +116,11 @@
 
   int tab_count = 0;
   sessions.push_back(local_session);
-  for (const sync_sessions::SyncedSession* session : sessions)
-    for (const auto& [window_id, window] : session->windows)
+  for (const sync_sessions::SyncedSession* session : sessions) {
+    for (const auto& [window_id, window] : session->windows) {
       tab_count += window->wrapped_window.tabs.size();
+    }
+  }
 
   return tab_count;
 }
diff --git a/chrome/browser/sync/test/integration/printers_helper.cc b/chrome/browser/sync/test/integration/printers_helper.cc
index 012648e..3f147b47 100644
--- a/chrome/browser/sync/test/integration/printers_helper.cc
+++ b/chrome/browser/sync/test/integration/printers_helper.cc
@@ -91,8 +91,9 @@
       printers, printer_id,
       [](const chromeos::Printer& printer) { return printer.id(); });
 
-  if (found == printers.end())
+  if (found == printers.end()) {
     return false;
+  }
 
   found->set_description(description);
   manager->UpdateSavedPrinter(*found);
diff --git a/chrome/browser/sync/test/integration/search_engines_helper.cc b/chrome/browser/sync/test/integration/search_engines_helper.cc
index 86b3a1f5..a414c62 100644
--- a/chrome/browser/sync/test/integration/search_engines_helper.cc
+++ b/chrome/browser/sync/test/integration/search_engines_helper.cc
@@ -83,8 +83,9 @@
       *os << "TURL GUID from a not found in b's TURLs: " << guid;
       return false;
     }
-    if (!TURLsMatch(*b_turls[guid], *a_turl))
+    if (!TURLsMatch(*b_turls[guid], *a_turl)) {
       return false;
+    }
   }
 
   const TemplateURL* default_a = service_a->GetDefaultSearchProvider();
@@ -136,8 +137,9 @@
                << verifier_turl->keyword();
       return false;
     }
-    if (!TURLsMatch(*verifier_turl, *other_turl))
+    if (!TURLsMatch(*verifier_turl, *other_turl)) {
       return false;
+    }
   }
 
   return true;
@@ -193,8 +195,9 @@
   Profile* profile = test()->GetProfile(profile_index);
   TemplateURLBuilder builder(keyword);
   TemplateURLServiceFactory::GetForProfile(profile)->Add(builder.Build());
-  if (test()->UseVerifier())
+  if (test()->UseVerifier()) {
     GetVerifierService()->Add(builder.Build());
+  }
 }
 
 void EditSearchEngine(int profile_index,
diff --git a/chrome/browser/sync/test/integration/send_tab_to_self_helper.cc b/chrome/browser/sync/test/integration/send_tab_to_self_helper.cc
index 5a0c708..38326be 100644
--- a/chrome/browser/sync/test/integration/send_tab_to_self_helper.cc
+++ b/chrome/browser/sync/test/integration/send_tab_to_self_helper.cc
@@ -216,8 +216,9 @@
   const std::map<sync_pb::SyncEnums_DeviceType, int> device_count_by_type =
       tracker_->CountActiveDevicesByType();
   int total = 0;
-  for (const auto& [type, count] : device_count_by_type)
+  for (const auto& [type, count] : device_count_by_type) {
     total += count;
+  }
   return total > 1;
 }
 
diff --git a/chrome/browser/sync/test/integration/sessions_helper.cc b/chrome/browser/sync/test/integration/sessions_helper.cc
index 6d72b47..683ff55 100644
--- a/chrome/browser/sync/test/integration/sessions_helper.cc
+++ b/chrome/browser/sync/test/integration/sessions_helper.cc
@@ -274,10 +274,12 @@
 }
 
 bool CheckInitialState(int browser_index) {
-  if (0 != GetNumWindows(browser_index))
+  if (0 != GetNumWindows(browser_index)) {
     return false;
-  if (0 != GetNumForeignSessions(browser_index))
+  }
+  if (0 != GetNumForeignSessions(browser_index)) {
     return false;
+  }
   return true;
 }
 
diff --git a/chrome/browser/sync/test/integration/single_client_app_list_sync_test.cc b/chrome/browser/sync/test/integration/single_client_app_list_sync_test.cc
index 97e5998..5bed3cf 100644
--- a/chrome/browser/sync/test/integration/single_client_app_list_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_app_list_sync_test.cc
@@ -48,14 +48,16 @@
 // Returns true if sync items from |service1| match to sync items in |service2|.
 bool SyncItemsMatch(const app_list::AppListSyncableService* service1,
                     const app_list::AppListSyncableService* service2) {
-  if (service1->sync_items().size() != service2->sync_items().size())
+  if (service1->sync_items().size() != service2->sync_items().size()) {
     return false;
+  }
 
   for (const auto& [item_id, item1] : service1->sync_items()) {
     const app_list::AppListSyncableService::SyncItem* item2 =
         service2->GetSyncItem(item_id);
-    if (!item2)
+    if (!item2) {
       return false;
+    }
     if (item1->item_id != item2->item_id ||
         item1->item_type != item2->item_type ||
         item1->item_name != item2->item_name ||
@@ -108,8 +110,9 @@
 
   // SyncTest
   bool SetupClients() override {
-    if (!SyncTest::SetupClients())
+    if (!SyncTest::SetupClients()) {
       return false;
+    }
 
     // Init SyncAppListHelper to ensure that the extension system is initialized
     // for each Profile.
diff --git a/chrome/browser/sync/test/integration/sync_app_helper.cc b/chrome/browser/sync/test/integration/sync_app_helper.cc
index 5ef2725..b493f39ce 100644
--- a/chrome/browser/sync/test/integration/sync_app_helper.cc
+++ b/chrome/browser/sync/test/integration/sync_app_helper.cc
@@ -125,8 +125,9 @@
 }
 
 void SyncAppHelper::SetupIfNecessary(SyncTest* test) {
-  if (setup_completed_)
+  if (setup_completed_) {
     return;
+  }
 
   for (int i = 0; i < test->num_clients(); ++i) {
     extensions::ExtensionSystem::Get(test->GetProfile(i))
@@ -142,8 +143,9 @@
 
 bool SyncAppHelper::AppStatesMatch(Profile* profile1, Profile* profile2) {
   if (!SyncExtensionHelper::GetInstance()->ExtensionStatesMatch(profile1,
-                                                                profile2))
+                                                                profile2)) {
     return false;
+  }
 
   const AppStateMap& state_map1 = GetAppStates(profile1);
   const AppStateMap& state_map2 = GetAppStates(profile2);
diff --git a/chrome/browser/sync/test/integration/sync_app_list_helper.cc b/chrome/browser/sync/test/integration/sync_app_list_helper.cc
index 068bbcf..e27dbf6 100644
--- a/chrome/browser/sync/test/integration/sync_app_list_helper.cc
+++ b/chrome/browser/sync/test/integration/sync_app_list_helper.cc
@@ -83,8 +83,9 @@
 
     ChromeAppListItem* item2 =
         service2->GetModelUpdater()->ItemAtForTest(index2);
-    if (item1->CompareForTest(item2))
+    if (item1->CompareForTest(item2)) {
       continue;
+    }
 
     LOG(ERROR) << "Item(" << i << ") in profile1: " << item1->ToDebugString()
                << " != "
@@ -146,14 +147,16 @@
   std::map<const std::string, std::vector<ChromeAppListItem*>> children;
   for (size_t i = 0; i < service->GetModelUpdater()->ItemCount(); ++i) {
     ChromeAppListItem* item = service->GetModelUpdater()->ItemAtForTest(i);
-    if (!item->folder_id().empty())
+    if (!item->folder_id().empty()) {
       children[item->folder_id()].push_back(item);
+    }
   }
   for (size_t i = 0; i < service->GetModelUpdater()->ItemCount(); ++i) {
     ChromeAppListItem* item = service->GetModelUpdater()->ItemAtForTest(i);
     // Skip if it's not a top level item.
-    if (!item->folder_id().empty())
+    if (!item->folder_id().empty()) {
       continue;
+    }
     std::string label = base::StringPrintf("Item(%d): ", static_cast<int>(i));
     PrintItem(profile, item, label);
     // Print children if it has any.
diff --git a/chrome/browser/sync/test/integration/sync_arc_package_helper.cc b/chrome/browser/sync/test/integration/sync_arc_package_helper.cc
index e9ea2d2a..de65c76 100644
--- a/chrome/browser/sync/test/integration/sync_arc_package_helper.cc
+++ b/chrome/browser/sync/test/integration/sync_arc_package_helper.cc
@@ -219,13 +219,15 @@
       prefs1->GetPackagesFromPrefs();
   const std::vector<std::string> pref2_packages =
       prefs2->GetPackagesFromPrefs();
-  if (pref1_packages.size() != pref2_packages.size())
+  if (pref1_packages.size() != pref2_packages.size()) {
     return false;
+  }
   for (const std::string& package : pref1_packages) {
     std::unique_ptr<ArcAppListPrefs::PackageInfo> package_info =
         prefs2->GetPackage(package);
-    if (!package_info.get())
+    if (!package_info.get()) {
       return false;
+    }
   }
   return true;
 }
@@ -243,15 +245,19 @@
         prefs1->GetPackage(package);
     std::unique_ptr<ArcAppListPrefs::PackageInfo> package2_info =
         prefs2->GetPackage(package);
-    if (!package2_info.get())
+    if (!package2_info.get()) {
       return false;
-    if (package1_info->package_version != package2_info->package_version)
+    }
+    if (package1_info->package_version != package2_info->package_version) {
       return false;
+    }
     if (package1_info->last_backup_android_id !=
-        package2_info->last_backup_android_id)
+        package2_info->last_backup_android_id) {
       return false;
-    if (package1_info->last_backup_time != package2_info->last_backup_time)
+    }
+    if (package1_info->last_backup_time != package2_info->last_backup_time) {
       return false;
+    }
   }
   return true;
 }
diff --git a/chrome/browser/sync/test/integration/sync_extension_helper.cc b/chrome/browser/sync/test/integration/sync_extension_helper.cc
index 371b298..3585844 100644
--- a/chrome/browser/sync/test/integration/sync_extension_helper.cc
+++ b/chrome/browser/sync/test/integration/sync_extension_helper.cc
@@ -67,8 +67,9 @@
 SyncExtensionHelper::~SyncExtensionHelper() = default;
 
 void SyncExtensionHelper::SetupIfNecessary(SyncTest* test) {
-  if (setup_completed_)
+  if (setup_completed_) {
     return;
+  }
 
   extension_name_prefix_ = kFakeExtensionPrefix + base::GenerateGUID();
   for (int i = 0; i < test->num_clients(); ++i) {
@@ -170,8 +171,9 @@
           ->pending_extension_manager();
   const extensions::PendingExtensionInfo* info =
       pending_extension_manager->GetById(id);
-  if (!info)
+  if (!info) {
     return false;
+  }
   return info->is_from_sync();
 }
 
@@ -194,8 +196,9 @@
   const extensions::PendingExtensionInfo* info = nullptr;
   for (const std::string& pending_crx_id : pending_crx_ids) {
     ASSERT_TRUE(info = pending_extension_manager->GetById(pending_crx_id));
-    if (!info->is_from_sync())
+    if (!info->is_from_sync()) {
       continue;
+    }
 
     StringMap::const_iterator iter = id_to_name_.find(pending_crx_id);
     if (iter == id_to_name_.end()) {
diff --git a/chrome/browser/sync/test/integration/sync_service_impl_harness.cc b/chrome/browser/sync/test/integration/sync_service_impl_harness.cc
index fbcae5d..bf702646 100644
--- a/chrome/browser/sync/test/integration/sync_service_impl_harness.cc
+++ b/chrome/browser/sync/test/integration/sync_service_impl_harness.cc
@@ -65,8 +65,9 @@
 
   bool IsExitConditionSatisfied(std::ostream* os) override {
     *os << "Waiting for sync engine initialization to complete";
-    if (service()->IsEngineInitialized())
+    if (service()->IsEngineInitialized()) {
       return true;
+    }
     // Engine initialization is blocked by an auth error.
     if (HasAuthError(service())) {
       LOG(WARNING) << "Sync engine initialization blocked by auth error";
@@ -339,8 +340,9 @@
   // Notify SyncServiceImpl that we are done with configuration.
   FinishSyncSetup();
 
-  if (signin_type_ == SigninType::UI_SIGNIN)
+  if (signin_type_ == SigninType::UI_SIGNIN) {
     return signin_delegate_->ConfirmSigninUI(profile_);
+  }
   return true;
 }
 
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc
index 7a26e0e..f2d607c6 100644
--- a/chrome/browser/sync/test/integration/sync_test.cc
+++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -192,8 +192,9 @@
   signin::IdentityManager* identity_manager =
       IdentityManagerFactory::GetForProfile(profile);
   if (!identity_manager ||
-      !identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin))
+      !identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin)) {
     return nullptr;
+  }
 
   auto it = profile_to_fcm_network_handler_map->find(profile);
   return it != profile_to_fcm_network_handler_map->end() ? it->second : nullptr;
@@ -329,8 +330,9 @@
                     : "password";
   }
 
-  if (username_.empty() || password_.empty())
+  if (username_.empty() || password_.empty()) {
     LOG(FATAL) << "Cannot run sync tests without GAIA credentials.";
+  }
 
   // Mock the Mac Keychain service.  The real Keychain can block on user input.
   OSCryptMocker::SetUp();
@@ -374,20 +376,24 @@
 
 void SyncTest::AddTestSwitches(base::CommandLine* cl) {
   // Disable non-essential access of external network resources.
-  if (!cl->HasSwitch(switches::kDisableBackgroundNetworking))
+  if (!cl->HasSwitch(switches::kDisableBackgroundNetworking)) {
     cl->AppendSwitch(switches::kDisableBackgroundNetworking);
+  }
 
-  if (!cl->HasSwitch(syncer::kSyncShortInitialRetryOverride))
+  if (!cl->HasSwitch(syncer::kSyncShortInitialRetryOverride)) {
     cl->AppendSwitch(syncer::kSyncShortInitialRetryOverride);
+  }
 
-  if (!cl->HasSwitch(syncer::kSyncShortNudgeDelayForTest))
+  if (!cl->HasSwitch(syncer::kSyncShortNudgeDelayForTest)) {
     cl->AppendSwitch(syncer::kSyncShortNudgeDelayForTest);
+  }
 
   // TODO(crbug.com/1060366): This is a temporary switch to allow having two
   // profiles syncing the same account. Having a profile outside of the user
   // directory isn't supported in Chrome.
-  if (!cl->HasSwitch(switches::kAllowProfilesOutsideUserDir))
+  if (!cl->HasSwitch(switches::kAllowProfilesOutsideUserDir)) {
     cl->AppendSwitch(switches::kAllowProfilesOutsideUserDir);
+  }
 
   if (cl->HasSwitch(syncer::kSyncServiceURL)) {
     // TODO(crbug.com/1243653): setup real SecurityDomainService if
@@ -476,8 +482,9 @@
   EXPECT_NE(Profile::CREATE_STATUS_LOCAL_FAIL, status);
   // This will be called multiple times. Wait until the profile is initialized
   // fully to quit the loop.
-  if (status == Profile::CREATE_STATUS_INITIALIZED)
+  if (status == Profile::CREATE_STATUS_INITIALIZED) {
     quit_closure.Run();
+  }
 }
 
 // TODO(shadi): Ideally creating a new profile should not depend on signin
@@ -549,17 +556,20 @@
 #endif
 
 SyncServiceImplHarness* SyncTest::GetClient(int index) {
-  if (clients_.empty())
+  if (clients_.empty()) {
     LOG(FATAL) << "SetupClients() has not yet been called.";
-  if (index < 0 || index >= static_cast<int>(clients_.size()))
+  }
+  if (index < 0 || index >= static_cast<int>(clients_.size())) {
     LOG(FATAL) << "GetClient(): Index is out of bounds.";
+  }
   return clients_[index].get();
 }
 
 std::vector<SyncServiceImplHarness*> SyncTest::GetSyncClients() {
   std::vector<SyncServiceImplHarness*> clients(clients_.size());
-  for (size_t i = 0; i < clients_.size(); ++i)
+  for (size_t i = 0; i < clients_.size(); ++i) {
     clients[i] = clients_[i].get();
+  }
   return clients;
 }
 
@@ -583,10 +593,12 @@
 }
 
 Profile* SyncTest::verifier() {
-  if (!UseVerifier())
+  if (!UseVerifier()) {
     LOG(FATAL) << "Verifier account is disabled.";
-  if (verifier_ == nullptr)
+  }
+  if (verifier_ == nullptr) {
     LOG(FATAL) << "SetupClients() has not yet been called.";
+  }
   return verifier_;
 }
 
@@ -599,14 +611,16 @@
       g_browser_process->profile_manager()->GetLastUsedProfile();
 
   base::ScopedAllowBlockingForTesting allow_blocking;
-  if (num_clients_ <= 0)
+  if (num_clients_ <= 0) {
     LOG(FATAL) << "num_clients_ incorrectly initialized.";
+  }
   bool has_any_browser = false;
 #if !BUILDFLAG(IS_ANDROID)
   has_any_browser = !browsers_.empty();
 #endif
-  if (!profiles_.empty() || has_any_browser || !clients_.empty())
+  if (!profiles_.empty() || has_any_browser || !clients_.empty()) {
     LOG(FATAL) << "SetupClients() has already been called.";
+  }
 
   // Create the required number of sync profiles, browsers and clients.
   profiles_.resize(num_clients_);
@@ -669,8 +683,9 @@
   if (ArcAppListPrefsFactory::IsFactorySetForSyncTest()) {
     // Init SyncArcPackageHelper to ensure that the arc services are initialized
     // for each Profile, only can be called after test profiles are created.
-    if (!sync_arc_helper())
+    if (!sync_arc_helper()) {
       return false;
+    }
   }
 #endif
 
@@ -1174,9 +1189,10 @@
 void SyncTest::ReadPasswordFile() {
   base::CommandLine* cl = base::CommandLine::ForCurrentProcess();
   password_file_ = cl->GetSwitchValuePath(switches::kPasswordFileForTest);
-  if (password_file_.empty())
+  if (password_file_.empty()) {
     LOG(FATAL) << "Can't run live server test without specifying --"
                << switches::kPasswordFileForTest << "=<filename>";
+  }
   std::string file_contents;
   base::ReadFileToString(password_file_, &file_contents);
   ASSERT_NE(file_contents, "")
diff --git a/chrome/browser/sync/test/integration/two_client_app_list_sync_test.cc b/chrome/browser/sync/test/integration/two_client_app_list_sync_test.cc
index 8dc6c15..8cb08cf 100644
--- a/chrome/browser/sync/test/integration/two_client_app_list_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_app_list_sync_test.cc
@@ -68,8 +68,9 @@
 
   // SyncTest
   bool SetupClients() override {
-    if (!SyncTest::SetupClients())
+    if (!SyncTest::SetupClients()) {
       return false;
+    }
 
     // Init SyncAppListHelper to ensure that the extension system is initialized
     // for each Profile.
@@ -78,8 +79,9 @@
   }
 
   bool SetupSync() override {
-    if (!SyncTest::SetupSync())
+    if (!SyncTest::SetupSync()) {
       return false;
+    }
     WaitForExtensionServicesToLoad();
     return true;
   }
@@ -92,8 +94,9 @@
 
  private:
   void WaitForExtensionServicesToLoad() {
-    for (int i = 0; i < num_clients(); ++i)
+    for (int i = 0; i < num_clients(); ++i) {
       WaitForExtensionsServiceToLoadForProfile(GetProfile(i));
+    }
   }
 
   void WaitForExtensionsServiceToLoadForProfile(Profile* profile) {
@@ -386,8 +389,9 @@
   ASSERT_TRUE(AllProfilesHaveSameAppList());
 
   const int kNumApps = 5;
-  for (int i = 0; i < kNumApps; ++i)
+  for (int i = 0; i < kNumApps; ++i) {
     InstallHostedApp(GetProfile(1), i);
+  }
 
   AwaitQuiescenceAndInstallAppsPendingForSync();
 
diff --git a/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc b/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc
index 3ddb2ba..b90dd6ed 100644
--- a/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc
@@ -1366,10 +1366,12 @@
     const std::string title = IndexedFolderName(level);
     folder = AddFolder(0, folder, folder->children().size(), title);
     ASSERT_NE(nullptr, folder);
-    if (level == 0)
+    if (level == 0) {
       folder_L0 = folder;
-    if (level == 10)
+    }
+    if (level == 10) {
       folder_L10 = folder;
+    }
   }
 
   std::vector<BookmarkNodeMatcher>& matchers_L11 = matchers_by_level[11];
@@ -1460,10 +1462,12 @@
     const std::string title = IndexedFolderName(level);
     folder = AddFolder(0, folder, folder->children().size(), title);
     ASSERT_NE(nullptr, folder);
-    if (level == 0)
+    if (level == 0) {
       folder_L0 = folder;
-    if (level == 10)
+    }
+    if (level == 10) {
       folder_L10 = folder;
+    }
   }
 
   std::vector<BookmarkNodeMatcher>& matchers_L01 = matchers_by_level[1];
@@ -1554,8 +1558,9 @@
     const std::string title = IndexedFolderName(level);
     folder = AddFolder(0, folder, folder->children().size(), title);
     ASSERT_NE(nullptr, folder);
-    if (level == 5)
+    if (level == 5) {
       folder_L5 = folder;
+    }
   }
 
   // Add all folders to matchers from all levels.
@@ -1626,8 +1631,9 @@
     const std::string title = IndexedFolderName(level);
     folder = AddFolder(0, folder, folder->children().size(), title);
     ASSERT_NE(nullptr, folder);
-    if (level == 5)
+    if (level == 5) {
       folder_L5 = folder;
+    }
   }
 
   // Add all folders to matchers from all levels.
@@ -1704,8 +1710,9 @@
     const std::string title = IndexedFolderName(level);
     folder = AddFolder(0, folder, folder->children().size(), title);
     ASSERT_NE(nullptr, folder);
-    if (level == 5)
+    if (level == 5) {
       folder_L5 = folder;
+    }
   }
 
   folder =
diff --git a/chrome/browser/sync/test/integration/two_client_extension_settings_and_app_settings_sync_test.cc b/chrome/browser/sync/test/integration/two_client_extension_settings_and_app_settings_sync_test.cc
index f929d13..abd716e8 100644
--- a/chrome/browser/sync/test/integration/two_client_extension_settings_and_app_settings_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_extension_settings_and_app_settings_sync_test.cc
@@ -100,24 +100,31 @@
     SetExtensionSettingsForAllProfiles(extension2, settings);
   }
 
-  if (!test()->SetupSync())
+  if (!test()->SetupSync()) {
     return testing::AssertionFailure();
-  if (!test()->AwaitQuiescence())
+  }
+  if (!test()->AwaitQuiescence()) {
     return testing::AssertionFailure();
-  if (!AllExtensionSettingsSameAsVerifier())
+  }
+  if (!AllExtensionSettingsSameAsVerifier()) {
     return testing::AssertionFailure();
+  }
 
   MutateSomeSettings(0, extension0, extension1, extension2);
-  if (!test()->AwaitQuiescence())
+  if (!test()->AwaitQuiescence()) {
     return testing::AssertionFailure();
-  if (!AllExtensionSettingsSameAsVerifier())
+  }
+  if (!AllExtensionSettingsSameAsVerifier()) {
     return testing::AssertionFailure();
+  }
 
   MutateSomeSettings(1, extension0, extension1, extension2);
-  if (!test()->AwaitQuiescence())
+  if (!test()->AwaitQuiescence()) {
     return testing::AssertionFailure();
-  if (!AllExtensionSettingsSameAsVerifier())
+  }
+  if (!AllExtensionSettingsSameAsVerifier()) {
     return testing::AssertionFailure();
+  }
 
   return testing::AssertionSuccess();
 }
@@ -151,38 +158,49 @@
     SetExtensionSettings(test()->GetProfile(1), extension2, settings);
   }
 
-  if (!test()->SetupSync())
+  if (!test()->SetupSync()) {
     return testing::AssertionFailure();
-  if (!test()->AwaitQuiescence())
+  }
+  if (!test()->AwaitQuiescence()) {
     return testing::AssertionFailure();
-  if (!AllExtensionSettingsSameAsVerifier())
+  }
+  if (!AllExtensionSettingsSameAsVerifier()) {
     return testing::AssertionFailure();
+  }
 
   MutateSomeSettings(2, extension0, extension1, extension2);
-  if (!test()->AwaitQuiescence())
+  if (!test()->AwaitQuiescence()) {
     return testing::AssertionFailure();
-  if (!AllExtensionSettingsSameAsVerifier())
+  }
+  if (!AllExtensionSettingsSameAsVerifier()) {
     return testing::AssertionFailure();
+  }
 
   MutateSomeSettings(3, extension0, extension1, extension2);
-  if (!test()->AwaitQuiescence())
+  if (!test()->AwaitQuiescence()) {
     return testing::AssertionFailure();
-  if (!AllExtensionSettingsSameAsVerifier())
+  }
+  if (!AllExtensionSettingsSameAsVerifier()) {
     return testing::AssertionFailure();
+  }
 
   // Test a round of no-ops once, for sanity. Ideally we'd want to assert that
   // this causes no sync activity, but that sounds tricky.
   MutateSomeSettings(3, extension0, extension1, extension2);
-  if (!test()->AwaitQuiescence())
+  if (!test()->AwaitQuiescence()) {
     return testing::AssertionFailure();
-  if (!AllExtensionSettingsSameAsVerifier())
+  }
+  if (!AllExtensionSettingsSameAsVerifier()) {
     return testing::AssertionFailure();
+  }
 
   MutateSomeSettings(4, extension0, extension1, extension2);
-  if (!test()->AwaitQuiescence())
+  if (!test()->AwaitQuiescence()) {
     return testing::AssertionFailure();
-  if (!AllExtensionSettingsSameAsVerifier())
+  }
+  if (!AllExtensionSettingsSameAsVerifier()) {
     return testing::AssertionFailure();
+  }
 
   return testing::AssertionSuccess();
 }
diff --git a/chrome/browser/sync/test/integration/two_client_typed_urls_sync_test.cc b/chrome/browser/sync/test/integration/two_client_typed_urls_sync_test.cc
index 302759e..b6bc892 100644
--- a/chrome/browser/sync/test/integration/two_client_typed_urls_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_typed_urls_sync_test.cc
@@ -66,14 +66,16 @@
   ::testing::AssertionResult CheckClientsEqual() {
     history::URLRows urls = GetTypedUrlsFromClient(0);
     history::URLRows urls2 = GetTypedUrlsFromClient(1);
-    if (!CheckURLRowVectorsAreEqualForTypedURLs(urls, urls2))
+    if (!CheckURLRowVectorsAreEqualForTypedURLs(urls, urls2)) {
       return ::testing::AssertionFailure() << "URLVectors are not equal";
+    }
     // Now check the visits.
     for (size_t i = 0; i < urls.size() && i < urls2.size(); i++) {
       history::VisitVector visit1 = GetVisitsFromClient(0, urls[i].id());
       history::VisitVector visit2 = GetVisitsFromClient(1, urls2[i].id());
-      if (!AreVisitsEqual(visit1, visit2))
+      if (!AreVisitsEqual(visit1, visit2)) {
         return ::testing::AssertionFailure() << "Visits are not equal";
+      }
     }
     return ::testing::AssertionSuccess();
   }
@@ -83,8 +85,9 @@
       history::URLRows urls = GetTypedUrlsFromClient(i);
       for (const history::URLRow& url : urls) {
         history::VisitVector visits = GetVisitsFromClient(i, url.id());
-        if (!AreVisitsUnique(visits))
+        if (!AreVisitsUnique(visits)) {
           return false;
+        }
       }
     }
     return true;
@@ -92,10 +95,11 @@
 
   int GetVisitCountForFirstURL(int index) {
     history::URLRows urls = GetTypedUrlsFromClient(index);
-    if (urls.empty())
+    if (urls.empty()) {
       return 0;
-    else
+    } else {
       return urls[0].visit_count();
+    }
   }
 };
 
diff --git a/chrome/browser/sync/test/integration/two_client_web_apps_bmo_sync_test.cc b/chrome/browser/sync/test/integration/two_client_web_apps_bmo_sync_test.cc
index 6d0547f..18064a2 100644
--- a/chrome/browser/sync/test/integration/two_client_web_apps_bmo_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_web_apps_bmo_sync_test.cc
@@ -66,8 +66,9 @@
 
   bool SetupClients() override {
     bool result = SyncTest::SetupClients();
-    if (!result)
+    if (!result) {
       return result;
+    }
     for (Profile* profile : GetAllProfiles()) {
       auto* web_app_provider = WebAppProvider::GetForTest(profile);
       base::RunLoop loop;
@@ -107,8 +108,9 @@
           webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON,
       GURL start_url = GURL()) {
     Browser* browser = CreateBrowser(profile);
-    if (!start_url.is_valid())
+    if (!start_url.is_valid()) {
       start_url = GetUserInitiatedAppURL();
+    }
     EXPECT_TRUE(ui_test_utils::NavigateToURL(browser, start_url));
 
     AppId app_id;
@@ -186,8 +188,9 @@
       if (!app_ids) {
         app_ids = profile_app_ids;
       } else {
-        if (app_ids != profile_app_ids)
+        if (app_ids != profile_app_ids) {
           return false;
+        }
       }
     }
     return true;
diff --git a/chrome/browser/sync/test/integration/two_client_web_apps_integration_test_base.cc b/chrome/browser/sync/test/integration/two_client_web_apps_integration_test_base.cc
index 2228ddc..5350ee64 100644
--- a/chrome/browser/sync/test/integration/two_client_web_apps_integration_test_base.cc
+++ b/chrome/browser/sync/test/integration/two_client_web_apps_integration_test_base.cc
@@ -56,8 +56,9 @@
     is_sync_on = is_sync_on && client->service()->IsSyncFeatureActive();
   }
   // If sync is off, then `AwaitQuiescence()` will crash.
-  if (is_sync_on)
+  if (is_sync_on) {
     ASSERT_TRUE(AwaitQuiescence());
+  }
   apps_helper::AwaitWebAppQuiescence(GetAllProfiles());
 }
 
@@ -73,8 +74,9 @@
 }
 
 bool TwoClientWebAppsIntegrationTestBase::SetupClients() {
-  if (!SyncTest::SetupClients())
+  if (!SyncTest::SetupClients()) {
     return false;
+  }
 
   for (Profile* profile : GetAllProfiles()) {
     auto* web_app_provider = WebAppProvider::GetForTest(profile);
diff --git a/chrome/browser/sync/test/integration/two_client_web_apps_sync_test.cc b/chrome/browser/sync/test/integration/two_client_web_apps_sync_test.cc
index 3f69387f..be894df 100644
--- a/chrome/browser/sync/test/integration/two_client_web_apps_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_web_apps_sync_test.cc
@@ -84,8 +84,9 @@
       if (!app_ids) {
         app_ids = profile_app_ids;
       } else {
-        if (app_ids != profile_app_ids)
+        if (app_ids != profile_app_ids) {
           return false;
+        }
       }
     }
     return true;
diff --git a/chrome/browser/sync/test/integration/typed_urls_helper.cc b/chrome/browser/sync/test/integration/typed_urls_helper.cc
index 2fb1ac4..0f0555d8 100644
--- a/chrome/browser/sync/test/integration/typed_urls_helper.cc
+++ b/chrome/browser/sync/test/integration/typed_urls_helper.cc
@@ -344,8 +344,9 @@
 history::VisitVector GetVisitsForURLFromClient(int index, const GURL& url) {
   history::HistoryService* service = GetHistoryServiceFromClient(index);
   history::URLRow url_row;
-  if (!GetUrlFromHistoryService(service, url, &url_row))
+  if (!GetUrlFromHistoryService(service, url, &url_row)) {
     return history::VisitVector();
+  }
   return GetVisitsFromHistoryService(service, url_row.id());
 }
 
@@ -366,8 +367,9 @@
   // and it will massage the visit timestamps if we try to use identical
   // values, which can lead to spurious errors. So make sure all timestamps
   // are unique.
-  if (!::timestamp)
+  if (!::timestamp) {
     ::timestamp = new base::Time(base::Time::Now());
+  }
   base::Time original = *::timestamp;
   *::timestamp += base::Milliseconds(1);
   return original;
@@ -391,10 +393,11 @@
                                   const base::Time& timestamp) {
   AddToHistory(GetHistoryServiceFromClient(index), url, transition, source,
                timestamp);
-  if (test()->UseVerifier())
+  if (test()->UseVerifier()) {
     AddToHistory(HistoryServiceFactory::GetForProfile(
                      test()->verifier(), ServiceAccessType::IMPLICIT_ACCESS),
                  url, transition, source, timestamp);
+  }
 
   // Wait until the AddPage() request has completed so we know the change has
   // filtered down to the sync observers (don't need to wait for the
@@ -435,30 +438,33 @@
 void DeleteUrlFromHistory(int index, const GURL& url) {
   GetHistoryServiceFromClient(index)->DeleteURLs({url});
 
-  if (test()->UseVerifier())
+  if (test()->UseVerifier()) {
     HistoryServiceFactory::GetForProfile(test()->verifier(),
                                          ServiceAccessType::IMPLICIT_ACCESS)
         ->DeleteURLs({url});
+  }
 
   WaitForHistoryDBThread(index);
 }
 
 void DeleteUrlsFromHistory(int index, const std::vector<GURL>& urls) {
   GetHistoryServiceFromClient(index)->DeleteURLs(urls);
-  if (test()->UseVerifier())
+  if (test()->UseVerifier()) {
     HistoryServiceFactory::GetForProfile(test()->verifier(),
                                          ServiceAccessType::IMPLICIT_ACCESS)
         ->DeleteURLs(urls);
+  }
   WaitForHistoryDBThread(index);
 }
 
 void SetPageTitle(int index, const GURL& url, const std::string& title) {
   HistoryServiceFactory::GetForProfileWithoutCreating(test()->GetProfile(index))
       ->SetPageTitle(url, base::UTF8ToUTF16(title));
-  if (test()->UseVerifier())
+  if (test()->UseVerifier()) {
     HistoryServiceFactory::GetForProfile(test()->verifier(),
                                          ServiceAccessType::IMPLICIT_ACCESS)
         ->SetPageTitle(url, base::UTF8ToUTF16(title));
+  }
   WaitForHistoryDBThread(index);
 }
 
@@ -476,8 +482,9 @@
 
 bool CheckURLRowVectorsAreEqualForTypedURLs(const history::URLRows& left,
                                             const history::URLRows& right) {
-  if (left.size() != right.size())
+  if (left.size() != right.size()) {
     return false;
+  }
   for (const history::URLRow& left_url_row : left) {
     // URLs could be out-of-order, so look for a matching URL in the second
     // array.
@@ -490,22 +497,26 @@
         }
       }
     }
-    if (!found)
+    if (!found) {
       return false;
+    }
   }
   return true;
 }
 
 bool AreVisitsEqual(const history::VisitVector& visit1,
                     const history::VisitVector& visit2) {
-  if (visit1.size() != visit2.size())
+  if (visit1.size() != visit2.size()) {
     return false;
+  }
   for (size_t i = 0; i < visit1.size(); ++i) {
     if (!ui::PageTransitionTypeIncludingQualifiersIs(visit1[i].transition,
-                                                     visit2[i].transition))
+                                                     visit2[i].transition)) {
       return false;
-    if (visit1[i].visit_time != visit2[i].visit_time)
+    }
+    if (visit1[i].visit_time != visit2[i].visit_time) {
       return false;
+    }
   }
   return true;
 }
@@ -513,8 +524,9 @@
 bool AreVisitsUnique(const history::VisitVector& visits) {
   base::Time t = base::Time::FromInternalValue(0);
   for (const history::VisitRow& visit : visits) {
-    if (t == visit.visit_time)
+    if (t == visit.visit_time) {
       return false;
+    }
     t = visit.visit_time;
   }
   return true;
@@ -564,8 +576,9 @@
 bool CheckSyncHasURLMetadata(int index, const GURL& url) {
   history::URLRow row;
   history::HistoryService* service = GetHistoryServiceFromClient(index);
-  if (!GetUrlFromHistoryService(service, url, &row))
+  if (!GetUrlFromHistoryService(service, url, &row)) {
     return false;
+  }
 
   syncer::MetadataBatch batch;
   GetMetadataBatchFromHistoryService(service, &batch);
@@ -575,8 +588,9 @@
 
   syncer::EntityMetadataMap metadata_map(batch.TakeAllMetadata());
   for (const auto& [storage_key, metadata] : metadata_map) {
-    if (storage_key == expected_storage_key)
+    if (storage_key == expected_storage_key) {
       return true;
+    }
   }
   return false;
 }
@@ -593,8 +607,9 @@
 
   syncer::EntityMetadataMap metadata_map(batch.TakeAllMetadata());
   for (const auto& [storage_key, metadata] : metadata_map) {
-    if (storage_key == expected_storage_key)
+    if (storage_key == expected_storage_key) {
       return true;
+    }
   }
   return false;
 }
@@ -634,8 +649,9 @@
   history::URLRows rows = typed_urls_helper::GetTypedUrlsFromClient(index_);
 
   for (const history::URLRow& row : rows) {
-    if (row.url().spec() == url_)
+    if (row.url().spec() == url_) {
       return true;
+    }
   }
   return false;
 }
diff --git a/chrome/browser/translate/chrome_translate_client.cc b/chrome/browser/translate/chrome_translate_client.cc
index b89d8b94..39ac5a2 100644
--- a/chrome/browser/translate/chrome_translate_client.cc
+++ b/chrome/browser/translate/chrome_translate_client.cc
@@ -30,12 +30,12 @@
 #include "chrome/grit/theme_resources.h"
 #include "components/autofill_assistant/browser/public/runtime_manager.h"
 #include "components/infobars/content/content_infobar_manager.h"
+#include "components/language/core/browser/accept_languages_service.h"
 #include "components/language/core/browser/language_model_manager.h"
 #include "components/language/core/browser/pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "components/translate/core/browser/language_state.h"
 #include "components/translate/core/browser/page_translated_details.h"
-#include "components/translate/core/browser/translate_accept_languages.h"
 #include "components/translate/core/browser/translate_browser_metrics.h"
 #include "components/translate/core/browser/translate_download_manager.h"
 #include "components/translate/core/browser/translate_infobar_delegate.h"
@@ -180,7 +180,7 @@
 }
 
 // static
-translate::TranslateAcceptLanguages*
+language::AcceptLanguagesService*
 ChromeTranslateClient::GetTranslateAcceptLanguages(
     content::BrowserContext* browser_context) {
   return TranslateAcceptLanguagesFactory::GetForBrowserContext(browser_context);
@@ -312,7 +312,7 @@
   return CreateTranslatePrefs(GetPrefs());
 }
 
-translate::TranslateAcceptLanguages*
+language::AcceptLanguagesService*
 ChromeTranslateClient::GetTranslateAcceptLanguages() {
   DCHECK(web_contents());
   return GetTranslateAcceptLanguages(web_contents()->GetBrowserContext());
diff --git a/chrome/browser/translate/chrome_translate_client.h b/chrome/browser/translate/chrome_translate_client.h
index 538a37e..f78be10 100644
--- a/chrome/browser/translate/chrome_translate_client.h
+++ b/chrome/browser/translate/chrome_translate_client.h
@@ -12,6 +12,7 @@
 #include "base/gtest_prod_util.h"
 #include "build/build_config.h"
 #include "components/autofill_assistant/browser/public/runtime_observer.h"
+#include "components/language/core/browser/accept_languages_service.h"
 #include "components/language/core/browser/url_language_histogram.h"
 #include "components/translate/content/browser/content_translate_driver.h"
 #include "components/translate/content/browser/per_frame_content_translate_driver.h"
@@ -28,9 +29,12 @@
 
 class PrefService;
 
+namespace language {
+class AcceptLanguagesService;
+}
+
 namespace translate {
 class LanguageState;
-class TranslateAcceptLanguages;
 class TranslatePrefs;
 class TranslateManager;
 class TranslateMessage;
@@ -67,9 +71,10 @@
   static std::unique_ptr<translate::TranslatePrefs> CreateTranslatePrefs(
       PrefService* prefs);
 
-  // Helper method to return the TranslateAcceptLanguages instance associated
+  // Helper method to return the AcceptLanguagesService instance associated
   // with |browser_context|.
-  static translate::TranslateAcceptLanguages* GetTranslateAcceptLanguages(
+  // TODO(crbug.com/949253): Rename this to GetAcceptLanguageService.
+  static language::AcceptLanguagesService* GetTranslateAcceptLanguages(
       content::BrowserContext* browser_context);
 
   // Helper method to return the TranslateManager instance associated with
@@ -89,7 +94,7 @@
   translate::TranslateDriver* GetTranslateDriver() override;
   PrefService* GetPrefs() override;
   std::unique_ptr<translate::TranslatePrefs> GetTranslatePrefs() override;
-  translate::TranslateAcceptLanguages* GetTranslateAcceptLanguages() override;
+  language::AcceptLanguagesService* GetTranslateAcceptLanguages() override;
 #if BUILDFLAG(IS_ANDROID)
   std::unique_ptr<infobars::InfoBar> CreateInfoBar(
       std::unique_ptr<translate::TranslateInfoBarDelegate> delegate)
diff --git a/chrome/browser/translate/translate_accept_languages_factory.cc b/chrome/browser/translate/translate_accept_languages_factory.cc
index ba7e3e8..19723b1 100644
--- a/chrome/browser/translate/translate_accept_languages_factory.cc
+++ b/chrome/browser/translate/translate_accept_languages_factory.cc
@@ -7,9 +7,9 @@
 #include "chrome/browser/profiles/incognito_helpers.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/language/core/browser/accept_languages_service.h"
 #include "components/language/core/browser/pref_names.h"
 #include "components/prefs/pref_service.h"
-#include "components/translate/core/browser/translate_accept_languages.h"
 
 // static
 TranslateAcceptLanguagesFactory*
@@ -18,16 +18,16 @@
 }
 
 // static
-translate::TranslateAcceptLanguages*
+language::AcceptLanguagesService*
 TranslateAcceptLanguagesFactory::GetForBrowserContext(
     content::BrowserContext* context) {
-  return static_cast<translate::TranslateAcceptLanguages*>(
+  return static_cast<language::AcceptLanguagesService*>(
       GetInstance()->GetServiceForBrowserContext(context, true));
 }
 
 TranslateAcceptLanguagesFactory::TranslateAcceptLanguagesFactory()
     : BrowserContextKeyedServiceFactory(
-          "TranslateAcceptLanguages",
+          "AcceptLanguagesService",
           BrowserContextDependencyManager::GetInstance()) {}
 
 TranslateAcceptLanguagesFactory::~TranslateAcceptLanguagesFactory() {}
@@ -35,7 +35,7 @@
 KeyedService* TranslateAcceptLanguagesFactory::BuildServiceInstanceFor(
     content::BrowserContext* browser_context) const {
   Profile* profile = Profile::FromBrowserContext(browser_context);
-  return new translate::TranslateAcceptLanguages(
+  return new language::AcceptLanguagesService(
       profile->GetPrefs(), language::prefs::kAcceptLanguages);
 }
 
diff --git a/chrome/browser/translate/translate_accept_languages_factory.h b/chrome/browser/translate/translate_accept_languages_factory.h
index aedb527..4aa0d0fd 100644
--- a/chrome/browser/translate/translate_accept_languages_factory.h
+++ b/chrome/browser/translate/translate_accept_languages_factory.h
@@ -8,16 +8,16 @@
 #include "base/memory/singleton.h"
 #include "components/keyed_service/content/browser_context_keyed_service_factory.h"
 
-namespace translate {
-class TranslateAcceptLanguages;
+namespace language {
+class AcceptLanguagesService;
 }
 
-// TranslateAcceptLanguagesFactory is a way to associate a
-// TranslateAcceptLanguages instance to a BrowserContext.
+// TranslateAcceptLanguagesFactory is a way to associate an
+// AcceptLanguagesService instance to a BrowserContext.
 class TranslateAcceptLanguagesFactory
     : public BrowserContextKeyedServiceFactory {
  public:
-  static translate::TranslateAcceptLanguages* GetForBrowserContext(
+  static language::AcceptLanguagesService* GetForBrowserContext(
       content::BrowserContext* browser_context);
   static TranslateAcceptLanguagesFactory* GetInstance();
 
diff --git a/chrome/browser/translate/translate_manager_browsertest.cc b/chrome/browser/translate/translate_manager_browsertest.cc
index a30b962..52fca4f9 100644
--- a/chrome/browser/translate/translate_manager_browsertest.cc
+++ b/chrome/browser/translate/translate_manager_browsertest.cc
@@ -21,7 +21,6 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/search_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "components/translate/core/browser/translate_accept_languages.h"
 #include "components/translate/core/browser/translate_browser_metrics.h"
 #include "components/translate/core/browser/translate_error_details.h"
 #include "components/translate/core/browser/translate_manager.h"
diff --git a/chrome/browser/translate/translate_manager_render_view_host_unittest.cc b/chrome/browser/translate/translate_manager_render_view_host_unittest.cc
index 260beb7..14da878 100644
--- a/chrome/browser/translate/translate_manager_render_view_host_unittest.cc
+++ b/chrome/browser/translate/translate_manager_render_view_host_unittest.cc
@@ -36,11 +36,11 @@
 #include "components/infobars/content/content_infobar_manager.h"
 #include "components/infobars/core/infobar.h"
 #include "components/infobars/core/infobar_manager.h"
+#include "components/language/core/browser/accept_languages_service.h"
 #include "components/prefs/pref_change_registrar.h"
 #include "components/prefs/pref_service.h"
 #include "components/translate/content/browser/content_translate_driver.h"
 #include "components/translate/content/common/translate.mojom.h"
-#include "components/translate/core/browser/translate_accept_languages.h"
 #include "components/translate/core/browser/translate_download_manager.h"
 #include "components/translate/core/browser/translate_infobar_delegate.h"
 #include "components/translate/core/browser/translate_language_list.h"
@@ -1193,7 +1193,7 @@
   std::unique_ptr<translate::TranslatePrefs> translate_prefs(
       ChromeTranslateClient::CreateTranslatePrefs(prefs));
   EXPECT_FALSE(translate_prefs->IsBlockedLanguage("fr"));
-  translate::TranslateAcceptLanguages* accept_languages =
+  language::AcceptLanguagesService* accept_languages =
       ChromeTranslateClient::GetTranslateAcceptLanguages(profile);
   EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
   SetPrefObserverExpectation(
@@ -1250,7 +1250,7 @@
   std::unique_ptr<translate::TranslatePrefs> translate_prefs(
       ChromeTranslateClient::CreateTranslatePrefs(prefs));
   EXPECT_FALSE(translate_prefs->IsSiteOnNeverPromptList(host));
-  translate::TranslateAcceptLanguages* accept_languages =
+  language::AcceptLanguagesService* accept_languages =
       ChromeTranslateClient::GetTranslateAcceptLanguages(profile);
   EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
   SetPrefObserverExpectation(
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 339ab078..997863d 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -4961,12 +4961,8 @@
       "views/webauthn/ring_progress_bar.h",
       "views/webauthn/sheet_view_factory.cc",
       "views/webauthn/sheet_view_factory.h",
-      "views/webauthn/webauthn_bubble_view.cc",
-      "views/webauthn/webauthn_bubble_view.h",
       "views/webauthn/webauthn_hover_button.cc",
       "views/webauthn/webauthn_hover_button.h",
-      "views/webauthn/webauthn_icon_view.cc",
-      "views/webauthn/webauthn_icon_view.h",
       "views/webid/account_selection_bubble_view.cc",
       "views/webid/account_selection_bubble_view.h",
       "views/webid/fedcm_account_selection_view_desktop.cc",
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncConsentFragmentBase.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncConsentFragmentBase.java
index 476ef0b78..f162506 100644
--- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncConsentFragmentBase.java
+++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncConsentFragmentBase.java
@@ -104,7 +104,6 @@
     private final ProfileDataCache.Observer mProfileDataCacheObserver;
     protected @Nullable String mSelectedAccountName;
     private ProfileDataCache mProfileDataCache;
-    private boolean mDestroyed;
     // Set to true when the user clicks "Yes, I'm in" or "settings" and the class consequently
     // triggers sign-in (asynchronous). The buttons are not clickable in this state, see
     // areControlsEnabled().
@@ -306,7 +305,6 @@
         }
         mModalDialogManager.destroy();
         if (mRecordUndoSignin) RecordUserAction.record("Signin_Undo_Signin");
-        mDestroyed = true;
     }
 
     @Override
@@ -536,7 +534,7 @@
                         mConfirmSyncDataStateMachine = null;
 
                         // Don't start sign-in if this fragment has been destroyed.
-                        if (mDestroyed) return;
+                        if (getActivity().isDestroyed()) return;
 
                         SigninManager signinManager =
                                 IdentityServicesProvider.get().getSigninManager(
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
index 6cdf051b..3442267 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -83,6 +83,7 @@
 <translation id="1383876407941801731">Axtar</translation>
 <translation id="1384704387250346179">Google Linza ilə şəkli tərcümə edin <ph name="BEGIN_NEW" />Yeni<ph name="END_NEW" /></translation>
 <translation id="1386674309198842382"><ph name="LAST_UPDATED" /> gün əvvəl aktiv olub</translation>
+<translation id="13931502444227376">Davam etmək üçün <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ad, e-poçt ünvanı və profil şəklinizi bu sayt ilə paylaşacaq. Bu saytın <ph name="BEGIN_LINK1" />xidmət şərtlərinə<ph name="END_LINK1" /> baxın.</translation>
 <translation id="1397811292916898096"><ph name="PRODUCT_NAME" /> ilə axtarın</translation>
 <translation id="139993653570221430">İstənilən vaxt Chrome ayarlarında fikrinizi dəyişə bilərsiniz. Sınaqlar reklamların cari təqdim olunma üsulu ilə yanaşı işləyir, beləliklə, dəyişiklikləri dərhal görməyəcəksiniz.</translation>
 <translation id="1406000523432664303">İzləməyin</translation>
@@ -145,6 +146,7 @@
 <translation id="173522743738009831">Təhlükəsiz Sandbox haqqında</translation>
 <translation id="1736419249208073774">Araşdırın</translation>
 <translation id="1749561566933687563">Əlfəcinlərinizi sinxronizasiya edin</translation>
+<translation id="1750259112639922169">Tab qrupu - <ph name="TAB_COUNT" /> tab</translation>
 <translation id="17513872634828108">Panelləri açın</translation>
 <translation id="1754404134430936718">Mətn kopyalandı</translation>
 <translation id="1779766957982586368">Pəncərəni qapadın</translation>
@@ -789,6 +791,7 @@
 <translation id="5368227114232678694">Bu cihazda məxfi şəkildə axtarış etmək üçün Anonim rejimi sınayın</translation>
 <translation id="5375577065097716013">Google Linza ilə şəkil axtarın <ph name="BEGIN_NEW" />Yeni<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">Reaksiya dəyişdirilib</translation>
+<translation id="5401851137404501592">Davam etmək üçün <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ad, e-poçt ünvanı və profil şəklinizi bu sayt ilə paylaşacaq.</translation>
 <translation id="5403644198645076998">Yalnız müəyyən saytlara icazə verin</translation>
 <translation id="5409881200985013443"><ph name="CLIENT_NAME" /> tətbiqində <ph name="ONE_TIME_CODE" /> təqdim edilsin?</translation>
 <translation id="5414836363063783498">Doğrulanır...</translation>
@@ -1127,6 +1130,7 @@
 <translation id="7177873915659574692">QR kod yaratmaq olmur. URL'də <ph name="CHARACTER_LIMIT" /> ədəddən çox simvol var.</translation>
 <translation id="7177959540995930968">Chrome ayarlarında bu funksiyalar haqqında ətraflı öyrənə bilərsiniz.</translation>
 <translation id="718226107353899806">Maksimum <ph name="MAX_NUM_REACTIONS" /> reaksiya əlavə edə bilərsiniz</translation>
+<translation id="7183693674623539380">Tab qrupu - <ph name="TITLE_OF_GROUP" /></translation>
 <translation id="7187993566681480880">Daxil olduğunuzda Chrome'da sizi qoruyur və digər Google tətbiqlərində təhlükəsizliyinizi artırmaq üçün istifadə edilə bilər.</translation>
 <translation id="7191430249889272776">Panel arxa fonda açıldı.</translation>
 <translation id="7196215469483532480">Məxfilik bələdçisi izahı tam hündürlükdə açılıb</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
index bbbf67b4..884943b 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
@@ -171,6 +171,7 @@
 <translation id="1928696683969751773">Ažuriranja</translation>
 <translation id="19288952978244135">Ponovo otvori Chrome.</translation>
 <translation id="1933845786846280168">Odabrana kartica</translation>
+<translation id="193571872656840963">Zahvalite autoru</translation>
 <translation id="1943432128510653496">Spremanje zaporki</translation>
 <translation id="1952172573699511566">Web lokacije će prikazati text na željenom jeziku kada to bude moguće.</translation>
 <translation id="1959679933317802873">Čeka se sadržaj</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
index e9d0ba83..5896df7 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
@@ -171,6 +171,7 @@
 <translation id="1928696683969751773">Värskendused</translation>
 <translation id="19288952978244135">Avage Chrome uuesti.</translation>
 <translation id="1933845786846280168">Valitud vaheleht</translation>
+<translation id="193571872656840963">Autori tänamine</translation>
 <translation id="1943432128510653496">Paroolide salvestamine</translation>
 <translation id="1952172573699511566">Veebisaidid kuvavad teksti võimaluse korral teie eelistatud keeles.</translation>
 <translation id="1959679933317802873">Sisu ootel</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
index f5f9dd3..bd69359 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
@@ -83,6 +83,7 @@
 <translation id="1383876407941801731">Hanapin</translation>
 <translation id="1384704387250346179">Isalin sa Google Lens <ph name="BEGIN_NEW" />Bago<ph name="END_NEW" /></translation>
 <translation id="1386674309198842382">Aktibo <ph name="LAST_UPDATED" /> (na) araw ang nakalipas</translation>
+<translation id="13931502444227376">Para magpatuloy, ibabahagi ng <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ang iyong pangalan, email address, at larawan sa profile sa site na ito. Tingnan ang <ph name="BEGIN_LINK1" />mga tuntunin ng serbisyo<ph name="END_LINK1" /> ng site na ito.</translation>
 <translation id="1397811292916898096">Maghanap gamit ang <ph name="PRODUCT_NAME" /></translation>
 <translation id="139993653570221430">Puwede kang magbago ng isip anumang oras sa mga setting ng Chrome. Tumatakbo ang mga trial kasabay ng kasalukuyang paraan kung paano inihahatid ang mga ad, kaya hindi ka kaagad makakakita ng mga pagbabago.</translation>
 <translation id="1406000523432664303">“Huwag Subaybayan”</translation>
@@ -145,6 +146,7 @@
 <translation id="173522743738009831">Tungkol sa Privacy Sandbox</translation>
 <translation id="1736419249208073774">I-explore</translation>
 <translation id="1749561566933687563">I-sync ang iyong mga bookmark</translation>
+<translation id="1750259112639922169">Grupo ng tab - <ph name="TAB_COUNT" /> (na) tab</translation>
 <translation id="17513872634828108">Mga bukas na tab</translation>
 <translation id="1754404134430936718">Kinopya ang Text</translation>
 <translation id="1779766957982586368">Isara ang window</translation>
@@ -789,6 +791,7 @@
 <translation id="5368227114232678694">Para mag-browse nang pribado sa device na ito, subukan ang Incognito</translation>
 <translation id="5375577065097716013">Hanapin sa Google Lens <ph name="BEGIN_NEW" />Bago<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">Binago ang reaksyon</translation>
+<translation id="5401851137404501592">Para magpatuloy, ibabahagi ng <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ang iyong pangalan, email address, at larawan sa profile sa site na ito.</translation>
 <translation id="5403644198645076998">Ilang partikular na site lang ang payagan</translation>
 <translation id="5409881200985013443">Isumite ang <ph name="ONE_TIME_CODE" /> sa <ph name="CLIENT_NAME" />?</translation>
 <translation id="5414836363063783498">Vine-verify…</translation>
@@ -1129,6 +1132,7 @@
 <translation id="7177873915659574692">Hindi makagawa ng QR Code. Mahigit sa <ph name="CHARACTER_LIMIT" /> (na) character ang URL.</translation>
 <translation id="7177959540995930968">Puwede kang matuto pa tungkol sa mga feature na ito sa mga setting ng Chrome.</translation>
 <translation id="718226107353899806">Puwede kang magdagdag ng hanggang <ph name="MAX_NUM_REACTIONS" /> (na) reaksyon</translation>
+<translation id="7183693674623539380">Grupo ng tab - <ph name="TITLE_OF_GROUP" /></translation>
 <translation id="7187993566681480880">Pinapanatili kang ligtas sa Chrome at puwedeng gamitin para paigtingin ang iyong seguridad sa iba pang Google app kapag naka-sign in ka.</translation>
 <translation id="7191430249889272776">Binuksan ang tab sa background.</translation>
 <translation id="7196215469483532480">Nakabukas nang buo ang paliwanag sa gabay sa privacy</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
index 1386d332..2066220 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
@@ -171,6 +171,7 @@
 <translation id="1928696683969751773">Ažuriranja</translation>
 <translation id="19288952978244135">Ponovo otvorite Chrome.</translation>
 <translation id="1933845786846280168">Odabrana kartica</translation>
+<translation id="193571872656840963">Zahvalite autoru</translation>
 <translation id="1943432128510653496">Spremanje zaporki</translation>
 <translation id="1952172573699511566">Web-lokacije prikazivat će tekst na željenom jeziku kad god je to moguće.</translation>
 <translation id="1959679933317802873">Čekanje sadržaja</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
index 04f1399f..a9a9ce5 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -171,6 +171,7 @@
 <translation id="1928696683969751773">更新</translation>
 <translation id="19288952978244135">Chrome を再度開きます。</translation>
 <translation id="1933845786846280168">選択したタブ</translation>
+<translation id="193571872656840963">作成者への謝意を示します</translation>
 <translation id="1943432128510653496">パスワードの保存</translation>
 <translation id="1952172573699511566">可能な場合、設定した言語でウェブサイトのテキストを表示します。</translation>
 <translation id="1959679933317802873">コンテンツの待機中</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
index cfba611..b0c9df8 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
@@ -83,6 +83,7 @@
 <translation id="1383876407941801731">ძიება</translation>
 <translation id="1384704387250346179">თარგმნეთ სურათი Google Lens-ით <ph name="BEGIN_NEW" />სიახლე<ph name="END_NEW" /></translation>
 <translation id="1386674309198842382">აქტიური იყო <ph name="LAST_UPDATED" /> დღის წინ</translation>
+<translation id="13931502444227376">გასაგრძელებლად <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ამ საიტს გაუზიარებს თქვენს სახელს, ელფოსტის მისამართსა და პროფილის სურათს. გაეცანით ამ საიტის <ph name="BEGIN_LINK1" />მომსახურების პირობებს<ph name="END_LINK1" />.</translation>
 <translation id="1397811292916898096"><ph name="PRODUCT_NAME" />-ით ძიება</translation>
 <translation id="139993653570221430">აზრის შეცვლას ნებისმიერ დროს შეძლებთ Chrome-ის პარამეტრებიდან. ცდები განხორციელდება რეკლამის ჩვენების ამჟამინდელი მექანიზმების მოქმედების პარალელურად, ამიტომ ცვლილებებს მომენტალურად არ შეამჩნევთ.</translation>
 <translation id="1406000523432664303">„არ ადევნო თვალი“</translation>
@@ -145,6 +146,7 @@
 <translation id="173522743738009831">Privacy Sandbox-ის შესახებ</translation>
 <translation id="1736419249208073774">მიმოხილვა</translation>
 <translation id="1749561566933687563">განახორციელეთ თქვენი სანიშნეების სინქრონიზაცია</translation>
+<translation id="1750259112639922169">ჩანართების ჯგუფი — <ph name="TAB_COUNT" /> ჩანართი</translation>
 <translation id="17513872634828108">გახსნილი ჩანართები</translation>
 <translation id="1754404134430936718">ტექსტი დაკოპირდა</translation>
 <translation id="1779766957982586368">ფანჯრის დახურვა</translation>
@@ -171,6 +173,7 @@
 <translation id="1928696683969751773">განახლება</translation>
 <translation id="19288952978244135">Chrome-ის ხელახლა გახსნა.</translation>
 <translation id="1933845786846280168">არჩეული ჩანართი</translation>
+<translation id="193571872656840963">გამოხატეთ მადლიერება ამ შემქმნელის მიმართ</translation>
 <translation id="1943432128510653496">პაროლების შენახვა</translation>
 <translation id="1952172573699511566">შესაძლებლობის მიხედვით, ვებსაიტებზე ტექსტი ნაჩვენები იქნება თქვენს სასურველ ენაზე.</translation>
 <translation id="1959679933317802873">კონტენტის მოლოდინში</translation>
@@ -788,6 +791,7 @@
 <translation id="5368227114232678694">ამ მოწყობილობაზე ვების კონფიდენციალურად დასათვალიერებლად ცადეთ ინკოგნიტო რეჟიმი</translation>
 <translation id="5375577065097716013">მოიძიეთ სურათი Google Lens-ით <ph name="BEGIN_NEW" />სიახლე<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">რეაქცია შეიცვალა</translation>
+<translation id="5401851137404501592">გასაგრძელებლად <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ამ საიტს გაუზიარებს თქვენს სახელს, ელფოსტის მისამართსა და პროფილის სურათს.</translation>
 <translation id="5403644198645076998">მხოლოდ კონკრეტული საიტების დაშვება</translation>
 <translation id="5409881200985013443">გსურთ, გადაუგზავნოთ <ph name="ONE_TIME_CODE" /> <ph name="CLIENT_NAME" />-ს?</translation>
 <translation id="5414836363063783498">დადასტურება…</translation>
@@ -1128,6 +1132,7 @@
 <translation id="7177873915659574692">QR კოდის შექმნა ვერ მოხერხდა. URL შედგება <ph name="CHARACTER_LIMIT" />-ზე მეტი სიმბოლოსგან.</translation>
 <translation id="7177959540995930968">ამ ფუნქციების შესახებ დამატებითი ინფორმაციის მიღება შეგიძლიათ Chrome-ის პარამეტრებიდან.</translation>
 <translation id="718226107353899806">შეგიძლიათ <ph name="MAX_NUM_REACTIONS" />-მდე რეაქციის დამატება</translation>
+<translation id="7183693674623539380">ჩანართების ჯგუფი — <ph name="TITLE_OF_GROUP" /></translation>
 <translation id="7187993566681480880">უზრუნველყოფს თქვენს უსაფრთხოებას Chrome-ში და Google-ის სხვა აპებში, როცა სისტემაში შესული ხართ.</translation>
 <translation id="7191430249889272776">ჩანართი გაიხსნა ფონურ რეჟიმში.</translation>
 <translation id="7196215469483532480">კონფიდენციალურობის სახელმძღვანელოს განმარტება გახსნილია სრულ სიმაღლეზე</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
index 9c5efc9..ab16f4a 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -83,6 +83,7 @@
 <translation id="1383876407941801731">Издөө</translation>
 <translation id="1384704387250346179">Google Lens аркылуу которуу <ph name="BEGIN_NEW" />Жаңы<ph name="END_NEW" /></translation>
 <translation id="1386674309198842382"><ph name="LAST_UPDATED" /> күн мурун жигердүү болгон</translation>
+<translation id="13931502444227376">Улантуу үчүн <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> аты-жөнүңүздү, электрондук почтаңыздын дарегин жана профилиңиздин сүрөтүн ушул сайт менен бөлүшөт. Бул сайттын <ph name="BEGIN_LINK1" />тейлөө шарттарын<ph name="END_LINK1" /> карап көрүңүз.</translation>
 <translation id="1397811292916898096"><ph name="PRODUCT_NAME" /> аркылуу издөө</translation>
 <translation id="139993653570221430">Каалаган убакта Chrome жөндөөлөрүнө өтүп, баш тартсаңыз болот. Сынамык версиялар жарнамалардын учурдагы көрсөтүлүшү менен чогуу колдонулат, андыктан өзгөрүүлөр дароо көрүнбөйт.</translation>
 <translation id="1406000523432664303">Байкоо салынбасын</translation>
@@ -145,6 +146,7 @@
 <translation id="173522743738009831">Privacy Sandbox жөнүндө маалымат</translation>
 <translation id="1736419249208073774">Изилдөө</translation>
 <translation id="1749561566933687563">Кыстармаларыңызды шайкештириңиз</translation>
+<translation id="1750259112639922169">Өтмөктөр тобу – <ph name="TAB_COUNT" /> өтмөк</translation>
 <translation id="17513872634828108">Ачык өтмөктөр</translation>
 <translation id="1754404134430936718">Текст көчүрүлдү</translation>
 <translation id="1779766957982586368">Терезени жабуу</translation>
@@ -789,6 +791,7 @@
 <translation id="5368227114232678694">Бул түзмөктө купуя карап чыгуу үчүн Жашыруун режимди колдонуңуз</translation>
 <translation id="5375577065097716013">Google Lens аркылуу издөө <ph name="BEGIN_NEW" />Жаңы<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">Реакция өзгөртүлдү</translation>
+<translation id="5401851137404501592">Улантуу үчүн <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> аты-жөнүңүздү, электрондук почтаңыздын дарегин жана профилиңиздин сүрөтүн ушул сайт менен бөлүшөт.</translation>
 <translation id="5403644198645076998">Белгилүү сайттарга гана кирүүгө уруксат</translation>
 <translation id="5409881200985013443"><ph name="CLIENT_NAME" /> түзмөгүнө <ph name="ONE_TIME_CODE" /> тапшырылсынбы?</translation>
 <translation id="5414836363063783498">Текшерилүүдө…</translation>
@@ -799,7 +802,7 @@
 <translation id="5438292632479953702">Кайра жүктөп алуу</translation>
 <translation id="5441466871879044658">Төмөнкү тилге которуу</translation>
 <translation id="5441522332038954058">Дарек тилкесине секирүү</translation>
-<translation id="544776284582297024">Бир учурда бир нече өтмөктү ачып, бир нече баракка өтүү үчүн, өтмөктөрдү ачуу баскычын басыңыз</translation>
+<translation id="544776284582297024">Бир учурда бир нече өтмөктү ачып, бир нече баракка өтүү үчүн өтмөктөрдү ачуу баскычын басыңыз</translation>
 <translation id="5454166040603940656"><ph name="PROVIDER" /> менен</translation>
 <translation id="5456381639095306749">Баракты жүктөп алуу</translation>
 <translation id="5458366071038729214">Жазылган сайттарды ушул жерден табасыз</translation>
@@ -1129,6 +1132,7 @@
 <translation id="7177873915659574692">QR коду түзүлгөн жок. URL дареги <ph name="CHARACTER_LIMIT" /> символдон ашып кетти.</translation>
 <translation id="7177959540995930968">Бул функциялар тууралуу кеңири маалымат алуу үчүн Chrome жөндөөлөрүнө өтүңүз.</translation>
 <translation id="718226107353899806"><ph name="MAX_NUM_REACTIONS" /> реакцияга чейин кошо аласыз</translation>
+<translation id="7183693674623539380">Өтмөктөр тобу – <ph name="TITLE_OF_GROUP" /></translation>
 <translation id="7187993566681480880">Аккаунтуңузга киргенде Chrome'до жана башка Google колдонмолорунда коопсуздугуңузду коргоп турат.</translation>
 <translation id="7191430249889272776">Өтмөк фондо ачылды.</translation>
 <translation id="7196215469483532480">Купуялык жетектемесинин түшүндүрмөсү толугу менен ачылды</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
index 373d7b32..dc2f1fbd 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
@@ -171,6 +171,7 @@
 <translation id="1928696683969751773">Updates</translation>
 <translation id="19288952978244135">Open Chrome opnieuw.</translation>
 <translation id="1933845786846280168">Geselecteerd tabblad</translation>
+<translation id="193571872656840963">Deze maker bedanken</translation>
 <translation id="1943432128510653496">Wachtwoorden opslaan</translation>
 <translation id="1952172573699511566">Websites worden indien mogelijk getoond in je voorkeurstaal.</translation>
 <translation id="1959679933317802873">Wachten op content</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
index a670a5e..105f1bf 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
@@ -171,6 +171,7 @@
 <translation id="1928696683969751773">Aktualizacje</translation>
 <translation id="19288952978244135">Uruchom ponownie Chrome.</translation>
 <translation id="1933845786846280168">Wybrana karta</translation>
+<translation id="193571872656840963">Wyświetl podziękowanie dla tego twórcy</translation>
 <translation id="1943432128510653496">Zapisuj hasła</translation>
 <translation id="1952172573699511566">Gdy będzie to możliwe, tekst na stronach internetowych będzie się wyświetlać w Twoim preferowanym języku.</translation>
 <translation id="1959679933317802873">Czekam na treść</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
index d44180c..78f5e9f 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -83,6 +83,7 @@
 <translation id="1383876407941801731">Caută</translation>
 <translation id="1384704387250346179">Tradu imaginea cu Google Lens <ph name="BEGIN_NEW" />Nou<ph name="END_NEW" /></translation>
 <translation id="1386674309198842382">Activ acum <ph name="LAST_UPDATED" /> zile</translation>
+<translation id="13931502444227376">Pentru a continua, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> va permite accesul site-ului la numele, adresa de e-mail și fotografia ta de profil. Vezi <ph name="BEGIN_LINK1" />termenii și condițiile<ph name="END_LINK1" /> acestui site.</translation>
 <translation id="1397811292916898096">Caută folosind <ph name="PRODUCT_NAME" /></translation>
 <translation id="139993653570221430">Poți să te răzgândești oricând în setările Chrome. Versiunile de încercare respectă modul actual de difuzare a anunțurilor, prin urmare nu vei vedea modificările imediat.</translation>
 <translation id="1406000523432664303">„Nu urmări”</translation>
@@ -145,6 +146,7 @@
 <translation id="173522743738009831">Despre Privacy Sandbox</translation>
 <translation id="1736419249208073774">Explorează</translation>
 <translation id="1749561566933687563">Sincronizează marcajele</translation>
+<translation id="1750259112639922169">Grup de file – <ph name="TAB_COUNT" /> file</translation>
 <translation id="17513872634828108">File deschise</translation>
 <translation id="1754404134430936718">Textul a fost copiat</translation>
 <translation id="1779766957982586368">Închide fereastra</translation>
@@ -171,6 +173,7 @@
 <translation id="1928696683969751773">Actualizări</translation>
 <translation id="19288952978244135">Redeschide Chrome.</translation>
 <translation id="1933845786846280168">Fila selectată</translation>
+<translation id="193571872656840963">Mulțumește-i creatorului</translation>
 <translation id="1943432128510653496">Parole salvate</translation>
 <translation id="1952172573699511566">Site-urile vor afișa textul în limba ta preferată, dacă este posibil.</translation>
 <translation id="1959679933317802873">Se așteaptă conținutul</translation>
@@ -788,6 +791,7 @@
 <translation id="5368227114232678694">Ca să navighezi în privat pe acest dispozitiv, încearcă Incognito</translation>
 <translation id="5375577065097716013">Caută imaginea cu Google Lens <ph name="BEGIN_NEW" />Nou<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">Reacția a fost modificată</translation>
+<translation id="5401851137404501592">Pentru a continua, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> va permite accesul site-ului la numele, adresa de e-mail și fotografia ta de profil.</translation>
 <translation id="5403644198645076998">Permite numai anumite site-uri</translation>
 <translation id="5409881200985013443">Trimiți <ph name="ONE_TIME_CODE" /> la <ph name="CLIENT_NAME" />?</translation>
 <translation id="5414836363063783498">Se verifică...</translation>
@@ -1128,6 +1132,7 @@
 <translation id="7177873915659574692">Nu s-a putut crea codul QR. Adresa URL are peste <ph name="CHARACTER_LIMIT" /> caractere.</translation>
 <translation id="7177959540995930968">Poți afla mai multe despre aceste funcții în setările Chrome.</translation>
 <translation id="718226107353899806">Poți adăuga până la <ph name="MAX_NUM_REACTIONS" /> reacții</translation>
+<translation id="7183693674623539380">Grup de file – <ph name="TITLE_OF_GROUP" /></translation>
 <translation id="7187993566681480880">Te protejează în Chrome și poate fi folosită pentru a spori securitatea în alte aplicații Google dacă te-ai conectat.</translation>
 <translation id="7191430249889272776">A fost deschisă o filă în fundal.</translation>
 <translation id="7196215469483532480">Prezentare a Ghidului privind confidențialitatea, deschisă la înălțimea completă</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
index 1bfc360..6155ceaa 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
@@ -171,6 +171,7 @@
 <translation id="1928696683969751773">Обновления</translation>
 <translation id="19288952978244135">Снова запустите браузер Chrome.</translation>
 <translation id="1933845786846280168">Выбранная вкладка</translation>
+<translation id="193571872656840963">Поблагодарить автора</translation>
 <translation id="1943432128510653496">Сохранение паролей</translation>
 <translation id="1952172573699511566">Когда это возможно, текст на сайтах будет отображаться на выбранном вами языке.</translation>
 <translation id="1959679933317802873">Ожидается контент</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
index 199abae..c6b1932 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
@@ -171,6 +171,7 @@
 <translation id="1928696683969751773">Ažuriranja</translation>
 <translation id="19288952978244135">Ponovo otvorite Chrome.</translation>
 <translation id="1933845786846280168">Izabrane kartice</translation>
+<translation id="193571872656840963">Iskažite zahvalnost ovom autoru</translation>
 <translation id="1943432128510653496">Sačuvaj lozinke</translation>
 <translation id="1952172573699511566">Veb-sajtovi će prikazivati tekst na željenom jeziku kada je to moguće.</translation>
 <translation id="1959679933317802873">Čeka se sadržaj</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
index 7aa9e9f..0d3e9286 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
@@ -171,6 +171,7 @@
 <translation id="1928696683969751773">Ажурирања</translation>
 <translation id="19288952978244135">Поново отворите Chrome.</translation>
 <translation id="1933845786846280168">Изабране картице</translation>
+<translation id="193571872656840963">Искажите захвалност овом аутору</translation>
 <translation id="1943432128510653496">Сачувај лозинке</translation>
 <translation id="1952172573699511566">Веб-сајтови ће приказивати текст на жељеном језику када је то могуће.</translation>
 <translation id="1959679933317802873">Чека се садржај</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
index e8d1aa42..661c5b1 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
@@ -171,6 +171,7 @@
 <translation id="1928696683969751773">Usasishaji</translation>
 <translation id="19288952978244135">Fungua Chrome Upya.</translation>
 <translation id="1933845786846280168">Kichupo Kilichochaguliwa</translation>
+<translation id="193571872656840963">Mshukuru mtayarishi huyu</translation>
 <translation id="1943432128510653496">Hifadhi manenosiri</translation>
 <translation id="1952172573699511566">Tovuti zitaonyesha maandishi katika lugha unayopendelea, panapowezekana.</translation>
 <translation id="1959679933317802873">Inasubiri maudhui</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
index 7db78ac..3402846 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
@@ -83,6 +83,7 @@
 <translation id="1383876407941801731">Qidiruv</translation>
 <translation id="1384704387250346179">Google Lens yordamida tarjima <ph name="BEGIN_NEW" />Yangi<ph name="END_NEW" /></translation>
 <translation id="1386674309198842382"><ph name="LAST_UPDATED" /> kun oldin onlayn edi</translation>
+<translation id="13931502444227376">Davom etish uchun <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ism, email manzil va profil rasmingizni bu sayt bilan ulashadi. Bu saytning <ph name="BEGIN_LINK1" />xizmat shartlari<ph name="END_LINK1" />.</translation>
 <translation id="1397811292916898096"><ph name="PRODUCT_NAME" /> orqali qidirish</translation>
 <translation id="139993653570221430">Fikringiz oʻzgarsa, buni istalgan vaqt Chrome sozlamalari orqali oʻzgartirish mumkin. Sinovlar rejadagi reklama bilan bir vaqtda chiqadi, shu sababli oʻzgarishlar darhol koʻrinmaydi.</translation>
 <translation id="1406000523432664303">“Kuzatilmasin”</translation>
@@ -145,6 +146,7 @@
 <translation id="173522743738009831">Privacy Sandbox haqida</translation>
 <translation id="1736419249208073774">Tanishuv</translation>
 <translation id="1749561566933687563">Xatcho‘plarni sinxronlang</translation>
+<translation id="1750259112639922169">Varaqlar guruhi - <ph name="TAB_COUNT" /> ta varaq</translation>
 <translation id="17513872634828108">Ichki oynalarni ochish</translation>
 <translation id="1754404134430936718">Matn nusxalandi</translation>
 <translation id="1779766957982586368">Oynani yopish</translation>
@@ -171,6 +173,7 @@
 <translation id="1928696683969751773">Yangilanishlar</translation>
 <translation id="19288952978244135">Chromeni qaytadan oching.</translation>
 <translation id="1933845786846280168">Tanlangan sahifa</translation>
+<translation id="193571872656840963">Bu ijodkorga tashakkur bildiring</translation>
 <translation id="1943432128510653496">Parollarni saqlash</translation>
 <translation id="1952172573699511566">Imkoni bo‘lishi bilan sayt matni siz tanlagan tilda ko‘rinadi.</translation>
 <translation id="1959679933317802873">Kontent kutilmoqda</translation>
@@ -788,6 +791,7 @@
 <translation id="5368227114232678694">Bu qurilmada maxfiy kezish uchun Inkognito rejimidan foydalaning</translation>
 <translation id="5375577065097716013">Google Lens orqali rasm qidiring <ph name="BEGIN_NEW" />Yangi<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">Munosabat oʻzgardi</translation>
+<translation id="5401851137404501592">Davom etish uchun <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ism, email manzil va profil rasmingizni bu sayt bilan ulashadi.</translation>
 <translation id="5403644198645076998">Faqat ayrim saytlarni ochishga ruxsat berish</translation>
 <translation id="5409881200985013443"><ph name="ONE_TIME_CODE" /> <ph name="CLIENT_NAME" /> qurilmasiga yuborilsinmi?</translation>
 <translation id="5414836363063783498">Tekshirilmoqda...</translation>
@@ -1128,6 +1132,7 @@
 <translation id="7177873915659574692">QR kod yaratilmadi. URL manzilda <ph name="CHARACTER_LIMIT" /> tadan ortiq belgi kiritildi.</translation>
 <translation id="7177959540995930968">Bu funksiyalar haqida batafsil axborotni Chrome sozlamalari orqali olish mumkin.</translation>
 <translation id="718226107353899806">Maksimum <ph name="MAX_NUM_REACTIONS" /> ta munosabat qoʻshishingiz mumkin.</translation>
+<translation id="7183693674623539380">Varaqlar guruhi - <ph name="TITLE_OF_GROUP" /></translation>
 <translation id="7187993566681480880">Hisobingizga kirganingizda Chrome va boshqa Google ilovalaridan xavfsiz foydalanishingizni taʼminlaydi.</translation>
 <translation id="7191430249889272776">Ichki oyna orqa fonda ochildi.</translation>
 <translation id="7196215469483532480">Maxfiylik qoʻllanmasi bildirgisi toʻliq hajmda ochildi</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
index a5957a1a..6694b63 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -171,6 +171,7 @@
 <translation id="1928696683969751773">更新</translation>
 <translation id="19288952978244135">重新開啟 Chrome。</translation>
 <translation id="1933845786846280168">已選取的分頁</translation>
+<translation id="193571872656840963">向此創作者表達感謝</translation>
 <translation id="1943432128510653496">儲存密碼</translation>
 <translation id="1952172573699511566">網站將盡可能以您偏好的語言顯示文字。</translation>
 <translation id="1959679933317802873">正在等待內容</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
index 8069fd1..0549f96d 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -170,6 +170,7 @@
 <translation id="1928696683969751773">更新</translation>
 <translation id="19288952978244135">重新開啟 Chrome。</translation>
 <translation id="1933845786846280168">選取的分頁</translation>
+<translation id="193571872656840963">向這位創作者表示感謝</translation>
 <translation id="1943432128510653496">儲存密碼</translation>
 <translation id="1952172573699511566">Chrome 會儘可能以你慣用的語言顯示網站文字。</translation>
 <translation id="1959679933317802873">正在等候內容</translation>
diff --git a/chrome/browser/ui/android/toolbar/BUILD.gn b/chrome/browser/ui/android/toolbar/BUILD.gn
index 2c3ce5f..36b0561 100644
--- a/chrome/browser/ui/android/toolbar/BUILD.gn
+++ b/chrome/browser/ui/android/toolbar/BUILD.gn
@@ -27,6 +27,7 @@
     "java/src/org/chromium/chrome/browser/toolbar/TabSwitcherButtonView.java",
     "java/src/org/chromium/chrome/browser/toolbar/TabSwitcherButtonViewBinder.java",
     "java/src/org/chromium/chrome/browser/toolbar/TabSwitcherDrawable.java",
+    "java/src/org/chromium/chrome/browser/toolbar/ToolbarCaptureType.java",
     "java/src/org/chromium/chrome/browser/toolbar/ToolbarDataProvider.java",
     "java/src/org/chromium/chrome/browser/toolbar/ToolbarIntentMetadata.java",
     "java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java",
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarCaptureType.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarCaptureType.java
new file mode 100644
index 0000000..cb154738
--- /dev/null
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarCaptureType.java
@@ -0,0 +1,24 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.toolbar;
+
+import androidx.annotation.IntDef;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Simple enum for the types of toolbar bitmap captures. Treat this list as append only and keep it
+ * in sync with ToolbarCaptureType in enums.xml.
+ **/
+@IntDef({ToolbarCaptureType.UNKNOWN, ToolbarCaptureType.TOP, ToolbarCaptureType.BOTTOM,
+        ToolbarCaptureType.NUM_ENTRIES})
+@Retention(RetentionPolicy.SOURCE)
+public @interface ToolbarCaptureType {
+    int UNKNOWN = 0;
+    int TOP = 1;
+    int BOTTOM = 2;
+    int NUM_ENTRIES = 3;
+}
\ No newline at end of file
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java
index ec252df..ec0c211 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java
@@ -454,7 +454,7 @@
         // The default toolbar has specific colors to use.
         if ((isDefaultTheme || ColorUtils.isThemeColorTooBright(color)) && !isIncognito) {
             setForegroundColor(SemanticColorUtils.getProgressBarForeground(getContext()));
-            setBackgroundColor(getContext().getColor(R.color.progress_bar_bg_color));
+            setBackgroundColor(getContext().getColor(R.color.progress_bar_bg_color_list));
             return;
         }
 
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewResourceFrameLayout.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewResourceFrameLayout.java
index 913ddf3..363c7a7 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewResourceFrameLayout.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewResourceFrameLayout.java
@@ -10,7 +10,9 @@
 import android.graphics.Rect;
 import android.util.AttributeSet;
 
+import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.browser.toolbar.R;
+import org.chromium.chrome.browser.toolbar.ToolbarCaptureType;
 import org.chromium.components.browser_ui.widget.ViewResourceFrameLayout;
 import org.chromium.ui.resources.dynamics.ViewResourceAdapter;
 
@@ -35,6 +37,9 @@
         return new ViewResourceAdapter(this) {
             @Override
             public void onCaptureStart(Canvas canvas, Rect dirtyRect) {
+                RecordHistogram.recordEnumeratedHistogram("Android.Toolbar.BitmapCapture",
+                        ToolbarCaptureType.BOTTOM, ToolbarCaptureType.NUM_ENTRIES);
+
                 mCachedRect.set(dirtyRect);
                 if (mCachedRect.intersect(0, 0, getWidth(), mTopShadowHeightPx)) {
                     canvas.save();
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java
index 5a18c03a8..1b780ab 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java
@@ -19,10 +19,12 @@
 import androidx.appcompat.content.res.AppCompatResources;
 
 import org.chromium.base.TraceEvent;
+import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.toolbar.ControlContainer;
 import org.chromium.chrome.browser.toolbar.R;
+import org.chromium.chrome.browser.toolbar.ToolbarCaptureType;
 import org.chromium.chrome.browser.toolbar.ToolbarProgressBar;
 import org.chromium.components.browser_ui.styles.ChromeColors;
 import org.chromium.components.browser_ui.widget.ClipDrawableProgressBar.DrawingInfo;
@@ -225,6 +227,9 @@
 
         @Override
         protected void onCaptureStart(Canvas canvas, Rect dirtyRect) {
+            RecordHistogram.recordEnumeratedHistogram("Android.Toolbar.BitmapCapture",
+                    ToolbarCaptureType.TOP, ToolbarCaptureType.NUM_ENTRIES);
+
             // Erase the canvas because assets drawn are not fully opaque and therefore painting
             // twice would be bad.
             canvas.save();
diff --git a/chrome/browser/ui/app_list/app_list_sort_browsertest.cc b/chrome/browser/ui/app_list/app_list_sort_browsertest.cc
index 6abba0b..a6ce843 100644
--- a/chrome/browser/ui/app_list/app_list_sort_browsertest.cc
+++ b/chrome/browser/ui/app_list/app_list_sort_browsertest.cc
@@ -1438,6 +1438,38 @@
                               2);
 }
 
+// Verifies that the app list sort discovery duration after the education nudge
+// shows is recorded as expected.
+IN_PROC_BROWSER_TEST_P(AppListSortLoginTest, VerifySortAfterNudgeShowMetric) {
+  LoginUser(account_id1_);
+
+  ash::AcceleratorController::Get()->PerformActionIfEnabled(
+      ash::TOGGLE_APP_LIST_FULLSCREEN, {});
+  const bool is_in_tablet = GetParam();
+  ash::AppListTestApi app_list_test_api;
+  if (is_in_tablet)
+    app_list_test_api.WaitForAppListShowAnimation(/*is_bubble_window=*/false);
+  else
+    app_list_test_api.WaitForBubbleWindow(/*wait_for_opening_animation=*/true);
+
+  // Reorder the app list.
+  ReorderAnimationEndState actual_state;
+  base::HistogramTester histogram;
+  auto event_generator = std::make_unique<ui::test::EventGenerator>(
+      ash::Shell::GetPrimaryRootWindow());
+  app_list_test_api.ReorderByMouseClickAtToplevelAppsGridMenu(
+      ash::AppListSortOrder::kColor, MenuType::kAppListNonFolderItemMenu,
+      event_generator.get(),
+      /*target_state=*/ReorderAnimationEndState::kCompleted, &actual_state);
+  EXPECT_EQ(ReorderAnimationEndState::kCompleted, actual_state);
+
+  // Verify that the data is reported with the correct histogram.
+  histogram.ExpectTotalCount(
+      ash::kAppListSortDiscoveryDurationAfterNudgeClamshell, !is_in_tablet);
+  histogram.ExpectTotalCount(ash::kAppListSortDiscoveryDurationAfterNudgeTablet,
+                             is_in_tablet);
+}
+
 class AppListSortLoginTalbetTest : public ash::LoginManagerTest {
  public:
   AppListSortLoginTalbetTest() : LoginManagerTest() {
diff --git a/chrome/browser/ui/autofill_assistant/password_change/OWNERS b/chrome/browser/ui/autofill_assistant/password_change/OWNERS
new file mode 100644
index 0000000..6ee5c91
--- /dev/null
+++ b/chrome/browser/ui/autofill_assistant/password_change/OWNERS
@@ -0,0 +1 @@
+file://chrome/browser/autofill_assistant/password_change/OWNERS
diff --git a/chrome/browser/ui/color/chrome_color_id.h b/chrome/browser/ui/color/chrome_color_id.h
index 12c3250a..6acc33a 100644
--- a/chrome/browser/ui/color/chrome_color_id.h
+++ b/chrome/browser/ui/color/chrome_color_id.h
@@ -67,7 +67,6 @@
   /* Extension colors. */ \
   E_CPONLY(kColorExtensionDialogBackground) \
   E_CPONLY(kColorExtensionIconBadgeBackgroundDefault) \
-  E_CPONLY(kColorExtensionIconBadgeForegroundDefault) \
   E_CPONLY(kColorExtensionIconDecorationAmbientShadow) \
   E_CPONLY(kColorExtensionIconDecorationBackground) \
   E_CPONLY(kColorExtensionIconDecorationKeyShadow) \
diff --git a/chrome/browser/ui/color/chrome_color_mixer.cc b/chrome/browser/ui/color/chrome_color_mixer.cc
index 5c43e918..af394dc 100644
--- a/chrome/browser/ui/color/chrome_color_mixer.cc
+++ b/chrome/browser/ui/color/chrome_color_mixer.cc
@@ -244,8 +244,6 @@
       SkColorSetA(kColorDownloadToolbarButtonInactive, 0x33)};
   mixer[kColorExtensionDialogBackground] = {SK_ColorWHITE};
   mixer[kColorExtensionIconBadgeBackgroundDefault] = {ui::kColorAccent};
-  mixer[kColorExtensionIconBadgeForegroundDefault] =
-      ui::GetColorWithMaxContrast(kColorExtensionIconBadgeBackgroundDefault);
   mixer[kColorExtensionIconDecorationAmbientShadow] =
       ui::SetAlpha(ui::kColorShadowBase, 0x26);
   mixer[kColorExtensionIconDecorationBackground] = {SK_ColorWHITE};
diff --git a/chrome/browser/ui/extensions/icon_with_badge_image_source.cc b/chrome/browser/ui/extensions/icon_with_badge_image_source.cc
index 95ed0fa..9eebe72a 100644
--- a/chrome/browser/ui/extensions/icon_with_badge_image_source.cc
+++ b/chrome/browser/ui/extensions/icon_with_badge_image_source.cc
@@ -20,6 +20,7 @@
 #include "ui/color/color_provider.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/color_palette.h"
+#include "ui/gfx/color_utils.h"
 #include "ui/gfx/font.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
@@ -44,6 +45,15 @@
       target_scale);
 }
 
+// Make sure the background color is opaque. See http://crbug.com/619499
+SkColor GetBadgeBackgroundColor(IconWithBadgeImageSource::Badge* badge,
+                                const ui::ColorProvider* color_provider) {
+  return SkColorGetA(badge->background_color) == SK_AlphaTRANSPARENT
+             ? color_provider->GetColor(
+                   kColorExtensionIconBadgeBackgroundDefault)
+             : SkColorSetA(badge->background_color, SK_AlphaOPAQUE);
+}
+
 float GetBlockedActionBadgeRadius() {
   return 12.0f;
 }
@@ -77,12 +87,12 @@
   if (!badge_ || badge_->text.empty())
     return;
 
-  const ui::ColorProvider* color_provider = get_color_provider_callback_.Run();
-
-  // Generate the badge's render text.
+  // Generate the badge's render text. Make sure it contrasts with the badge
+  // background.
   SkColor text_color =
       SkColorGetA(badge_->text_color) == SK_AlphaTRANSPARENT
-          ? color_provider->GetColor(kColorExtensionIconBadgeForegroundDefault)
+          ? color_utils::GetColorWithMaxContrast(GetBadgeBackgroundColor(
+                badge_.get(), get_color_provider_callback_.Run()))
           : badge_->text_color;
 
   constexpr int kBadgeHeight = 12;
@@ -180,13 +190,8 @@
   if (!badge_text_)
     return;
 
-  const ui::ColorProvider* color_provider = get_color_provider_callback_.Run();
-
-  // Make sure the background color is opaque. See http://crbug.com/619499
   SkColor background_color =
-      SkColorGetA(badge_->background_color) == SK_AlphaTRANSPARENT
-          ? color_provider->GetColor(kColorExtensionIconBadgeBackgroundDefault)
-          : SkColorSetA(badge_->background_color, SK_AlphaOPAQUE);
+      GetBadgeBackgroundColor(badge_.get(), get_color_provider_callback_.Run());
   cc::PaintFlags rect_flags;
   rect_flags.setStyle(cc::PaintFlags::kFill_Style);
   rect_flags.setAntiAlias(true);
diff --git a/chrome/browser/ui/page_action/page_action_icon_type.h b/chrome/browser/ui/page_action/page_action_icon_type.h
index 46741256..9cf8822e 100644
--- a/chrome/browser/ui/page_action/page_action_icon_type.h
+++ b/chrome/browser/ui/page_action/page_action_icon_type.h
@@ -28,7 +28,6 @@
   kTranslate,
   kVirtualCardManualFallback,
   kVirtualCardEnroll,
-  kWebAuthn,
   kZoom,
 };
 
diff --git a/chrome/browser/ui/passwords/password_manager_navigation_throttle.cc b/chrome/browser/ui/passwords/password_manager_navigation_throttle.cc
index 622ef08..87b6a0d9 100644
--- a/chrome/browser/ui/passwords/password_manager_navigation_throttle.cc
+++ b/chrome/browser/ui/passwords/password_manager_navigation_throttle.cc
@@ -4,11 +4,8 @@
 
 #include "chrome/browser/ui/passwords/password_manager_navigation_throttle.h"
 
-#include "base/logging.h"
-#include "chrome/browser/password_manager/affiliation_service_factory.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/common/url_constants.h"
-#include "chrome/common/webui_url_constants.h"
+#include "base/metrics/histogram_macros.h"
+#include "components/password_manager/core/browser/manage_passwords_referrer.h"
 #include "components/password_manager/core/browser/password_manager_constants.h"
 #include "components/password_manager/core/common/password_manager_features.h"
 #include "content/public/browser/browser_context.h"
@@ -17,7 +14,6 @@
 #include "content/public/browser/storage_partition.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_contents_user_data.h"
-#include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "ui/base/page_transition_types.h"
 #include "url/gurl.h"
 #include "url/origin.h"
@@ -87,7 +83,8 @@
 
 #if BUILDFLAG(IS_ANDROID)
   password_manager_launcher::ShowPasswordSettings(
-      web_contents, password_manager::ManagePasswordsReferrer::kChromeSettings);
+      web_contents,
+      password_manager::ManagePasswordsReferrer::kPasswordsGoogleWebsite);
 #else
   content::OpenURLParams params =
       content::OpenURLParams::FromNavigationHandle(navigation_handle());
@@ -103,6 +100,9 @@
                        web_contents->OpenURL(params);
                      },
                      web_contents->GetWeakPtr(), std::move(params)));
+  UMA_HISTOGRAM_ENUMERATION(
+      "PasswordManager.ManagePasswordsReferrer",
+      password_manager::ManagePasswordsReferrer::kPasswordsGoogleWebsite);
 #endif
   return NavigationThrottle::CANCEL_AND_IGNORE;
 }
diff --git a/chrome/browser/ui/passwords/ui_utils.cc b/chrome/browser/ui/passwords/ui_utils.cc
index 4f7c9b3..93726505 100644
--- a/chrome/browser/ui/passwords/ui_utils.cc
+++ b/chrome/browser/ui/passwords/ui_utils.cc
@@ -207,6 +207,8 @@
         return "save_update_password_bubble";
       case ManagePasswordsReferrer::kPasswordGenerationPrompt:
         return "password_generation_prompt_in_autofill_dropdown";
+      case ManagePasswordsReferrer::kPasswordsGoogleWebsite:
+        return "passwords_google";
       case ManagePasswordsReferrer::kPasswordsAccessorySheet:
       case ManagePasswordsReferrer::kTouchToFill:
       case ManagePasswordsReferrer::kPasswordBreachDialog:
diff --git a/chrome/browser/ui/startup/lacros_first_run_service.cc b/chrome/browser/ui/startup/lacros_first_run_service.cc
index 616ad085..ac95069 100644
--- a/chrome/browser/ui/startup/lacros_first_run_service.cc
+++ b/chrome/browser/ui/startup/lacros_first_run_service.cc
@@ -4,13 +4,19 @@
 
 #include "chrome/browser/ui/startup/lacros_first_run_service.h"
 
+#include <memory>
+#include <utility>
+
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/callback_forward.h"
+#include "base/callback_helpers.h"
 #include "base/command_line.h"
 #include "base/feature_list.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
+#include "base/notreached.h"
+#include "base/scoped_observation.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/lacros/lacros_prefs.h"
 #include "chrome/browser/profiles/profile.h"
@@ -18,17 +24,100 @@
 #include "chrome/browser/profiles/profile_window.h"
 #include "chrome/browser/profiles/profiles_state.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
+#include "chrome/browser/sync/sync_service_factory.h"
+#include "chrome/browser/sync/sync_startup_tracker.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/profile_picker.h"
+#include "chrome/browser/ui/webui/signin/turn_sync_on_helper.h"
 #include "chrome/common/chrome_switches.h"
+#include "chrome/common/pref_names.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/prefs/pref_service.h"
 #include "components/signin/public/base/consent_level.h"
 #include "components/signin/public/base/signin_switches.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
+#include "google_apis/gaia/core_account_id.h"
 
 namespace {
 
+// Overrides signals indicating that Sync is required, for testing purposes.
+absl::optional<bool> g_sync_required_for_testing;
+
+// Helper to run `callback` once refresh tokens from the
+// `signin::IdentityManager` are loaded.
+class RefreshTokensLoadObserver : public signin::IdentityManager::Observer {
+ public:
+  RefreshTokensLoadObserver(signin::IdentityManager* identity_manager,
+                            base::OnceClosure callback)
+      : callback_(std::move(callback)) {
+    DCHECK(callback_);
+    DCHECK(!identity_manager->AreRefreshTokensLoaded());
+    scoped_observation_.Observe(identity_manager);
+  }
+
+  void OnRefreshTokensLoaded() override {
+    if (callback_)
+      std::move(callback_).Run();
+    scoped_observation_.Reset();
+  }
+
+ private:
+  base::OnceClosure callback_;
+
+  base::ScopedObservation<signin::IdentityManager,
+                          signin::IdentityManager::Observer>
+      scoped_observation_{this};
+};
+
+// Silently goes through the `TurnSyncOnHelper` flow, enabling Sync when given
+// the opportunity.
+class SilentSyncEnablerDelegate : public TurnSyncOnHelper::Delegate {
+ public:
+  ~SilentSyncEnablerDelegate() override = default;
+
+  // TurnSyncOnHelper::Delegate:
+  void ShowEnterpriseAccountConfirmation(
+      const AccountInfo& account_info,
+      signin::SigninChoiceCallback callback) override {
+    // We proceed here, and we are waiting until `ShowSyncConfirmation()` for
+    // the Sync engine to be started to know if we can proceed or not.
+    // TODO(https://crbug.com/1324569): Introduce a `DEFER` status or a new
+    // `ShouldShowEnterpriseAccountConfirmation()` delegate method to handle
+    // management consent not being handled at this step.
+    std::move(callback).Run(signin::SIGNIN_CHOICE_CONTINUE);
+  }
+
+  void ShowSyncConfirmation(
+      base::OnceCallback<void(LoginUIService::SyncConfirmationUIClosedResult)>
+          callback) override {
+    // The purpose of this delegate is specifically to enable Sync silently. If
+    // we get all the way here, we assume that we can proceed with it.
+    std::move(callback).Run(LoginUIService::SyncConfirmationUIClosedResult::
+                                SYNC_WITH_DEFAULT_SETTINGS);
+  }
+
+  void ShowSyncDisabledConfirmation(
+      bool is_managed_account,
+      base::OnceCallback<void(LoginUIService::SyncConfirmationUIClosedResult)>
+          callback) override {
+    // `SYNC_WITH_DEFAULT_SETTINGS` for the sync disable confirmation means
+    // "stay signed in". See https://crbug.com/1141341.
+    std::move(callback).Run(LoginUIService::SYNC_WITH_DEFAULT_SETTINGS);
+  }
+
+  void ShowLoginError(const SigninUIError& error) override { NOTREACHED(); }
+
+  void ShowMergeSyncDataConfirmation(const std::string&,
+                                     const std::string&,
+                                     signin::SigninChoiceCallback) override {
+    NOTREACHED();
+  }
+
+  void ShowSyncSettings() override { NOTREACHED(); }
+
+  void SwitchToProfile(Profile*) override { NOTREACHED(); }
+};
+
 bool IsFirstRunEligibleProfile(Profile* profile) {
   // Having secondary profiles implies that the user already used Chrome and so
   // should not have to see the FRE. So we never want to run it for these.
@@ -45,6 +134,19 @@
   return true;
 }
 
+// Whether policies and device settings require Sync to be always enabled.
+bool IsSyncRequired(Profile* profile) {
+  if (g_sync_required_for_testing.has_value())
+    return g_sync_required_for_testing.value();
+
+  if (!profile->GetPrefs()->GetBoolean(prefs::kEnableSyncConsent))
+    return true;
+
+  // TODO(crbug.com/1324569): Also support ephemeral users.
+
+  return false;
+}
+
 void SetFirstRunFinished() {
   PrefService* local_state = g_browser_process->local_state();
   local_state->SetBoolean(lacros_prefs::kPrimaryProfileFirstRunFinished, true);
@@ -105,34 +207,94 @@
       lacros_prefs::kPrimaryProfileFirstRunFinished);
 }
 
-bool LacrosFirstRunService::TryMarkFirstRunAlreadyFinished() {
+void LacrosFirstRunService::TryMarkFirstRunAlreadyFinished(
+    base::OnceClosure callback) {
   DCHECK(ShouldOpenFirstRun());  // Caller should check.
 
-  signin::IdentityManager* identity_manager =
-      IdentityManagerFactory::GetForProfile(profile_);
+  // The method has multiple exit points, this ensures `callback` gets called.
+  base::ScopedClosureRunner scoped_closure_runner(std::move(callback));
 
-  // Handle sessions migrated from Ash or from Lacros without the feature. These
-  // always had Sync on and don't need the FRE.
+  // If the FRE is already open, no need to do any of the below. We need to
+  // check this to avoid conflicts, but also because the FRE being open can make
+  // some checks below inaccurate. For example, it turns Sync on while
+  // configuring it, but might end up turning it off at the end of the flow.
+  if (ProfilePicker::IsLacrosFirstRunOpen())
+    return;
+
+  auto* identity_manager = IdentityManagerFactory::GetForProfile(profile_);
   if (identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSync)) {
-    // The FRE artificially marks Sync as being consented while it's open, as
-    // it needs to check the sync server for policies. We need to check if
-    // that's the case, and let the active FRE take care of marking its state
-    // finished.
-    if (ProfilePicker::IsLacrosFirstRunOpen()) {
-      return false;
-    }
-
     SetFirstRunFinished();
-    return true;
+    return;
   }
 
-  // TODO(crbug.com/1300109): Also update Sync and FRE state based on policies.
+  if (!IsSyncRequired(profile_)) {
+    // Let the FRE be shown when the user opens a browser UI for the first time.
+    return;
+  }
 
-  return false;
+  CoreAccountId account_id =
+      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
+  if (identity_manager->HasAccountWithRefreshToken(account_id)) {
+    TryEnableSyncSilentlyWithToken(account_id, scoped_closure_runner.Release());
+  } else {
+    if (token_load_observer_) {
+      // An attempt to mark the FRE finish is already ongoing. We choose to
+      // abort the current one and let the previous one continue.
+      LOG(WARNING)
+          << "Aborting slient sync opt-in attempt, another one is ongoing.";
+      return;
+    }
+
+    // The observer will get cleared by `TryEnableSyncSilentlyWithToken()`.
+    token_load_observer_ = std::make_unique<RefreshTokensLoadObserver>(
+        identity_manager,
+        base::BindOnce(
+            &LacrosFirstRunService::TryEnableSyncSilentlyWithToken,
+            // Unretained is safe because the observer will get destroyed before
+            // this object and won't be able to trigger the callback.
+            base::Unretained(this), account_id,
+            scoped_closure_runner.Release()));
+  }
+
+  // At this point, Sync is either enabled, or can't be enabled at all for some
+  // reason, so we should not reopen the FRE.
+  SetFirstRunFinished();
+}
+
+void LacrosFirstRunService::TryEnableSyncSilentlyWithToken(
+    const CoreAccountId& account_id,
+    base::OnceClosure callback) {
+  token_load_observer_.reset();
+
+  const signin::IdentityManager* identity_manager =
+      IdentityManagerFactory::GetForProfile(profile_);
+  if (identity_manager &&
+      !identity_manager->HasAccountWithRefreshToken(account_id)) {
+    // Still no token, just give up.
+    if (callback)
+      std::move(callback).Run();
+    return;
+  }
+
+  // TurnSyncOnHelper deletes itself once done.
+  new TurnSyncOnHelper(
+      profile_, signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN,
+      signin_metrics::PromoAction::PROMO_ACTION_NO_SIGNIN_PROMO,
+      signin_metrics::Reason::kForcedSigninPrimaryAccount, account_id,
+      TurnSyncOnHelper::SigninAbortedMode::KEEP_ACCOUNT,
+      std::make_unique<SilentSyncEnablerDelegate>(), std::move(callback));
 }
 
 void LacrosFirstRunService::OpenFirstRunIfNeeded(ResumeTaskCallback callback) {
-  if (TryMarkFirstRunAlreadyFinished()) {
+  TryMarkFirstRunAlreadyFinished(
+      base::BindOnce(&LacrosFirstRunService::OpenFirstRunInternal,
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+}
+
+void LacrosFirstRunService::OpenFirstRunInternal(ResumeTaskCallback callback) {
+  if (!ShouldOpenFirstRun()) {
+    // Opening the First Run is not needed, it might have been marked finished
+    // silently for example.
     std::move(callback).Run(/*proceed=*/true);
     return;
   }
@@ -179,8 +341,9 @@
   // //chrome/browser/permissions/permission_auditing_service_factory.cc
   if (instance->ShouldOpenFirstRun()) {
     // If we don't manage to set it, we will just have to defer silent or visual
-    // handling of the FRE to when the user attempts to open a browser UI.
-    instance->TryMarkFirstRunAlreadyFinished();
+    // handling of the FRE to when the user attempts to open a browser UI. So
+    // we don't need to do anything when the attempt finishes.
+    instance->TryMarkFirstRunAlreadyFinished(base::OnceClosure());
   }
 
   return instance;
@@ -196,3 +359,22 @@
   auto* instance = LacrosFirstRunServiceFactory::GetForBrowserContext(profile);
   return instance && instance->ShouldOpenFirstRun();
 }
+
+namespace testing {
+
+ScopedSyncRequiredInFirstRun::ScopedSyncRequiredInFirstRun(bool required) {
+  if (g_sync_required_for_testing.has_value()) {
+    overriden_value_ = g_sync_required_for_testing.value();
+  }
+  g_sync_required_for_testing = required;
+}
+
+ScopedSyncRequiredInFirstRun::~ScopedSyncRequiredInFirstRun() {
+  if (overriden_value_.has_value()) {
+    g_sync_required_for_testing = overriden_value_.value();
+  } else {
+    g_sync_required_for_testing.reset();
+  }
+}
+
+}  // namespace testing
diff --git a/chrome/browser/ui/startup/lacros_first_run_service.h b/chrome/browser/ui/startup/lacros_first_run_service.h
index 1d75061..25076806 100644
--- a/chrome/browser/ui/startup/lacros_first_run_service.h
+++ b/chrome/browser/ui/startup/lacros_first_run_service.h
@@ -5,12 +5,16 @@
 #ifndef CHROME_BROWSER_UI_STARTUP_LACROS_FIRST_RUN_SERVICE_H_
 #define CHROME_BROWSER_UI_STARTUP_LACROS_FIRST_RUN_SERVICE_H_
 
+#include <memory>
+
 #include "base/callback_forward.h"
 #include "base/no_destructor.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "components/keyed_service/content/browser_context_keyed_service_factory.h"
 #include "components/keyed_service/core/keyed_service.h"
+#include "components/signin/public/identity_manager/identity_manager.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 #if !BUILDFLAG(IS_CHROMEOS_LACROS)
 #error This file should only be included on lacros.
@@ -34,11 +38,10 @@
   bool ShouldOpenFirstRun() const;
 
   // Assuming that the first run experience needs to be opened on startup,
-  // attempts to complete it silently, in case collecting consent is not needed.
-  // Returns `true` if the FRE was marked finished. If not, `false` will be
-  // returned and `OpenFirstRunIfNeeded()` will need to be eventually called to
-  // show the visual FRE.
-  bool TryMarkFirstRunAlreadyFinished();
+  // asynchronously attempts to complete it silently, in case collecting consent
+  // is not needed. If `callback` is provided, it will run once the attempt is
+  // completed. To see if it the attempt worked, call `ShouldOpenFirstRun()`.
+  void TryMarkFirstRunAlreadyFinished(base::OnceClosure callback);
 
   // This function takes the user through the browser FRE.
   // 1) First, it checks whether the FRE flow can be skipped in the first place.
@@ -60,8 +63,16 @@
   void OpenFirstRunIfNeeded(ResumeTaskCallback callback);
 
  private:
+  void OpenFirstRunInternal(ResumeTaskCallback callback);
+  void TryEnableSyncSilentlyWithToken(const CoreAccountId& account_id,
+                                      base::OnceClosure callback);
+
   // Owns of this instance via the KeyedService mechanism.
   const raw_ptr<Profile> profile_;
+
+  std::unique_ptr<signin::IdentityManager::Observer> token_load_observer_;
+
+  base::WeakPtrFactory<LacrosFirstRunService> weak_ptr_factory_{this};
 };
 
 class LacrosFirstRunServiceFactory : public BrowserContextKeyedServiceFactory {
@@ -86,6 +97,23 @@
   bool ServiceIsCreatedWithBrowserContext() const override;
 };
 
+namespace testing {
+
+// Overrides the outcome of a check made during
+// `LacrosFirstRunService::TryEnableSyncSilentlyWithToken()` to indicate that
+// Sync is required for the primary profile, without having to mock policies or
+// device settings.
+class ScopedSyncRequiredInFirstRun {
+ public:
+  explicit ScopedSyncRequiredInFirstRun(bool required);
+  ~ScopedSyncRequiredInFirstRun();
+
+ private:
+  absl::optional<bool> overriden_value_;
+};
+
+}  // namespace testing
+
 // Helper to call `LacrosFirstRunService::ShouldOpenFirstRun()` without having
 // to first obtain the service instance.
 bool ShouldOpenPrimaryProfileFirstRun(Profile* profile);
diff --git a/chrome/browser/ui/startup/lacros_first_run_service_browsertest.cc b/chrome/browser/ui/startup/lacros_first_run_service_browsertest.cc
new file mode 100644
index 0000000..159e852
--- /dev/null
+++ b/chrome/browser/ui/startup/lacros_first_run_service_browsertest.cc
@@ -0,0 +1,159 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/startup/lacros_first_run_service.h"
+
+#include "base/callback_forward.h"
+#include "base/command_line.h"
+#include "base/feature_list.h"
+#include "base/run_loop.h"
+#include "base/test/bind.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/lacros/lacros_prefs.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_test_util.h"
+#include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/common/chrome_switches.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "components/account_manager_core/chromeos/account_manager.h"
+#include "components/account_manager_core/chromeos/account_manager_facade_factory.h"
+#include "components/prefs/pref_service.h"
+#include "components/signin/public/base/signin_switches.h"
+#include "components/signin/public/identity_manager/account_info.h"
+#include "components/signin/public/identity_manager/identity_manager.h"
+#include "components/signin/public/identity_manager/identity_test_environment.h"
+#include "components/signin/public/identity_manager/primary_account_mutator.h"
+#include "content/public/test/browser_test.h"
+#include "google_apis/gaia/core_account_id.h"
+
+class LacrosFirstRunServiceBrowserTest : public InProcessBrowserTest {
+ public:
+  void SetUpOnMainThread() override {
+    identity_test_env_adaptor_ =
+        std::make_unique<IdentityTestEnvironmentProfileAdaptor>(
+            browser()->profile());
+
+    identity_test_env()->SetRefreshTokenForPrimaryAccount();
+  }
+
+  void TearDownOnMainThread() override { identity_test_env_adaptor_.reset(); }
+
+  void SetUpInProcessBrowserTestFixture() override {
+    create_services_subscription_ =
+        BrowserContextDependencyManager::GetInstance()
+            ->RegisterCreateServicesCallbackForTesting(
+                base::BindRepeating(&LacrosFirstRunServiceBrowserTest::
+                                        OnWillCreateBrowserContextServices,
+                                    base::Unretained(this)));
+  }
+
+  signin::IdentityTestEnvironment* identity_test_env() {
+    return identity_test_env_adaptor_->identity_test_env();
+  }
+
+  LacrosFirstRunService* fre_service() {
+    Profile* profile = browser()->profile();
+    return LacrosFirstRunServiceFactory::GetForBrowserContext(profile);
+  }
+
+ protected:
+  void OnWillCreateBrowserContextServices(content::BrowserContext* context) {
+    IdentityTestEnvironmentProfileAdaptor::
+        SetIdentityTestEnvironmentFactoriesOnBrowserContext(context);
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_{
+      switches::kLacrosNonSyncingProfiles};
+
+  std::unique_ptr<IdentityTestEnvironmentProfileAdaptor>
+      identity_test_env_adaptor_;
+  base::CallbackListSubscription create_services_subscription_;
+
+  // TODO(https://crbug.com/1324886): Needed because SyncService startup hangs
+  // otherwise. Find a way to get it not to hang instead?
+  profiles::testing::ScopedNonEnterpriseDomainSetterForTesting
+      non_enterprise_domain_setter_;
+};
+
+IN_PROC_BROWSER_TEST_F(LacrosFirstRunServiceBrowserTest,
+                       TryMarkFirstRunAlreadyFinished_DoesNothing) {
+  // Setup note: We are removing `switches::kNoFirstRun` only after the browser
+  // is opened to simplify the setup. This allows us to call FRE-related methods
+  // without having to do more elaborate things to avoid it triggering before
+  // the test starts.
+
+  EXPECT_FALSE(fre_service()->ShouldOpenFirstRun());
+  base::CommandLine::ForCurrentProcess()->RemoveSwitch(switches::kNoFirstRun);
+  EXPECT_TRUE(fre_service()->ShouldOpenFirstRun());
+
+  base::RunLoop run_loop;
+  fre_service()->TryMarkFirstRunAlreadyFinished(run_loop.QuitClosure());
+  run_loop.Run();
+
+  EXPECT_FALSE(g_browser_process->local_state()->GetBoolean(
+      lacros_prefs::kPrimaryProfileFirstRunFinished));
+  EXPECT_TRUE(fre_service()->ShouldOpenFirstRun());
+}
+
+IN_PROC_BROWSER_TEST_F(LacrosFirstRunServiceBrowserTest,
+                       TryMarkFirstRunAlreadyFinished_SucceedsAlreadySignedIn) {
+  base::CommandLine::ForCurrentProcess()->RemoveSwitch(switches::kNoFirstRun);
+
+  signin::IdentityManager* identity_manager =
+      identity_test_env()->identity_manager();
+  CoreAccountId account_id =
+      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
+  ASSERT_FALSE(account_id.empty());
+  identity_manager->GetPrimaryAccountMutator()->SetPrimaryAccount(
+      account_id, signin::ConsentLevel::kSync);
+
+  base::RunLoop run_loop;
+  fre_service()->TryMarkFirstRunAlreadyFinished(run_loop.QuitClosure());
+  run_loop.Run();
+
+  EXPECT_TRUE(g_browser_process->local_state()->GetBoolean(
+      lacros_prefs::kPrimaryProfileFirstRunFinished));
+  EXPECT_FALSE(fre_service()->ShouldOpenFirstRun());
+}
+
+IN_PROC_BROWSER_TEST_F(LacrosFirstRunServiceBrowserTest,
+                       TryMarkFirstRunAlreadyFinished_SucceedsSyncRequired) {
+  base::CommandLine::ForCurrentProcess()->RemoveSwitch(switches::kNoFirstRun);
+  signin::IdentityManager* identity_manager =
+      identity_test_env()->identity_manager();
+
+  testing::ScopedSyncRequiredInFirstRun sync_required_override{true};
+
+  base::RunLoop run_loop;
+  fre_service()->TryMarkFirstRunAlreadyFinished(run_loop.QuitClosure());
+  run_loop.Run();
+
+  EXPECT_TRUE(g_browser_process->local_state()->GetBoolean(
+      lacros_prefs::kPrimaryProfileFirstRunFinished));
+  EXPECT_FALSE(fre_service()->ShouldOpenFirstRun());
+  EXPECT_TRUE(identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSync));
+}
+
+IN_PROC_BROWSER_TEST_F(LacrosFirstRunServiceBrowserTest,
+                       TryMarkFirstRunAlreadyFinished_SyncConsentDisabled) {
+  base::CommandLine::ForCurrentProcess()->RemoveSwitch(switches::kNoFirstRun);
+  Profile* profile = browser()->profile();
+  signin::IdentityManager* identity_manager =
+      identity_test_env()->identity_manager();
+
+  profile->GetPrefs()->SetBoolean(prefs::kEnableSyncConsent, false);
+
+  base::RunLoop run_loop;
+  fre_service()->TryMarkFirstRunAlreadyFinished(run_loop.QuitClosure());
+  run_loop.Run();
+
+  EXPECT_TRUE(g_browser_process->local_state()->GetBoolean(
+      lacros_prefs::kPrimaryProfileFirstRunFinished));
+  EXPECT_FALSE(ShouldOpenPrimaryProfileFirstRun(profile));
+  EXPECT_TRUE(identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSync));
+}
diff --git a/chrome/browser/ui/sync/browser_synced_window_delegate.cc b/chrome/browser/ui/sync/browser_synced_window_delegate.cc
index 07800b3..90087ea4 100644
--- a/chrome/browser/ui/sync/browser_synced_window_delegate.cc
+++ b/chrome/browser/ui/sync/browser_synced_window_delegate.cc
@@ -20,8 +20,9 @@
     const sync_sessions::SyncedTabDelegate* tab) const {
   for (int i = 0; i < browser_->tab_strip_model()->count(); i++) {
     sync_sessions::SyncedTabDelegate* current = GetTabAt(i);
-    if (tab == current)
+    if (tab == current) {
       return browser_->tab_strip_model()->IsTabPinned(i);
+    }
   }
   // The window and tab are not always updated atomically, so it's possible
   // one of the values was stale. We'll retry later, just ignore for now.
diff --git a/chrome/browser/ui/sync/browser_synced_window_delegates_getter.cc b/chrome/browser/ui/sync/browser_synced_window_delegates_getter.cc
index 3a36043..dad14b2 100644
--- a/chrome/browser/ui/sync/browser_synced_window_delegates_getter.cc
+++ b/chrome/browser/ui/sync/browser_synced_window_delegates_getter.cc
@@ -23,8 +23,9 @@
   SyncedWindowDelegateMap synced_window_delegates;
   // Add all the browser windows.
   for (auto* browser : *BrowserList::GetInstance()) {
-    if (browser->profile() != profile_)
+    if (browser->profile() != profile_) {
       continue;
+    }
     synced_window_delegates[browser->synced_window_delegate()->GetSessionId()] =
         browser->synced_window_delegate();
   }
diff --git a/chrome/browser/ui/sync/profile_signin_confirmation_helper.cc b/chrome/browser/ui/sync/profile_signin_confirmation_helper.cc
index 5b9ef6f..204868b 100644
--- a/chrome/browser/ui/sync/profile_signin_confirmation_helper.cc
+++ b/chrome/browser/ui/sync/profile_signin_confirmation_helper.cc
@@ -36,8 +36,9 @@
   BookmarkModel* bookmarks =
       BookmarkModelFactory::GetForBrowserContext(profile);
   bool has_bookmarks = bookmarks && bookmarks->HasBookmarks();
-  if (has_bookmarks)
+  if (has_bookmarks) {
     VLOG(1) << "SigninConfirmationHelper: profile contains bookmarks";
+  }
   return has_bookmarks;
 }
 
@@ -47,8 +48,9 @@
 
 bool HasBeenShutdown(Profile* profile) {
   bool has_been_shutdown = !profile->IsNewProfile();
-  if (has_been_shutdown)
+  if (has_been_shutdown) {
     VLOG(1) << "ProfileSigninConfirmationHelper: profile is not new";
+  }
   return has_been_shutdown;
 }
 
diff --git a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc
index f1e0ce7..dc5255b4 100644
--- a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc
+++ b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc
@@ -36,15 +36,17 @@
     content::WebContents* web_contents,
     int i) {
   int pending_index = web_contents->GetController().GetPendingEntryIndex();
-  if (pending_index == i)
+  if (pending_index == i) {
     return web_contents->GetController().GetPendingEntry();
+  }
   NavigationEntry* entry = web_contents->GetController().GetEntryAtIndex(i);
   // Don't use the entry for sync if it doesn't exist or is the initial
   // NavigationEntry.
   // TODO(https://crbug.com/1240138): Guarantee this won't be called when on the
   // initial NavigationEntry instead of bailing out here.
-  if (!entry || entry->IsInitialEntry())
+  if (!entry || entry->IsInitialEntry()) {
     return nullptr;
+  }
   return entry;
 }
 
@@ -131,30 +133,36 @@
 bool TabContentsSyncedTabDelegate::ShouldSync(
     sync_sessions::SyncSessionsClient* sessions_client) {
   if (sessions_client->GetSyncedWindowDelegatesGetter()->FindById(
-          GetWindowId()) == nullptr)
+          GetWindowId()) == nullptr) {
     return false;
+  }
 
-  if (ProfileHasChildAccount() && !GetBlockedNavigations()->empty())
+  if (ProfileHasChildAccount() && !GetBlockedNavigations()->empty()) {
     return true;
+  }
 
-  if (IsInitialBlankNavigation())
+  if (IsInitialBlankNavigation()) {
     return false;  // This deliberately ignores a new pending entry.
+  }
 
   // Don't try to sync the initial NavigationEntry, as it is not actually
   // associated with any navigation.
   content::NavigationEntry* last_committed_entry =
       web_contents_->GetController().GetLastCommittedEntry();
-  if (last_committed_entry && last_committed_entry->IsInitialEntry())
+  if (last_committed_entry && last_committed_entry->IsInitialEntry()) {
     return false;
+  }
 
   int entry_count = GetEntryCount();
   for (int i = 0; i < entry_count; ++i) {
     const GURL& virtual_url = GetVirtualURLAtIndex(i);
-    if (!virtual_url.is_valid())
+    if (!virtual_url.is_valid()) {
       continue;
+    }
 
-    if (sessions_client->ShouldSyncURL(virtual_url))
+    if (sessions_client->ShouldSyncURL(virtual_url)) {
       return true;
+    }
   }
   return false;
 }
@@ -204,7 +212,8 @@
 
 const tasks::TaskTabHelper* TabContentsSyncedTabDelegate::task_tab_helper()
     const {
-  if (web_contents_ == nullptr)
+  if (web_contents_ == nullptr) {
     return nullptr;
+  }
   return tasks::TaskTabHelper::FromWebContents(web_contents_);
 }
diff --git a/chrome/browser/ui/views/autofill_assistant/password_change/OWNERS b/chrome/browser/ui/views/autofill_assistant/password_change/OWNERS
new file mode 100644
index 0000000..6ee5c91
--- /dev/null
+++ b/chrome/browser/ui/views/autofill_assistant/password_change/OWNERS
@@ -0,0 +1 @@
+file://chrome/browser/autofill_assistant/password_change/OWNERS
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc
index 8928c56..fbd35fd 100644
--- a/chrome/browser/ui/views/location_bar/location_bar_view.cc
+++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -322,9 +322,6 @@
     params.types_enabled.push_back(PageActionIconType::kTranslate);
     params.types_enabled.push_back(PageActionIconType::kZoom);
     params.types_enabled.push_back(PageActionIconType::kFileSystemAccess);
-    if (base::FeatureList::IsEnabled(features::kWebAuthConditionalUI)) {
-      params.types_enabled.push_back(PageActionIconType::kWebAuthn);
-    }
 
     if (dom_distiller::IsDomDistillerEnabled() && browser_->is_type_normal()) {
       params.types_enabled.push_back(PageActionIconType::kReaderMode);
diff --git a/chrome/browser/ui/views/page_action/page_action_icon_controller.cc b/chrome/browser/ui/views/page_action/page_action_icon_controller.cc
index 69160a7..23c226e 100644
--- a/chrome/browser/ui/views/page_action/page_action_icon_controller.cc
+++ b/chrome/browser/ui/views/page_action/page_action_icon_controller.cc
@@ -39,7 +39,6 @@
 #include "chrome/browser/ui/views/side_search/side_search_icon_view.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_icon_container_view.h"
 #include "chrome/browser/ui/views/translate/translate_icon_view.h"
-#include "chrome/browser/ui/views/webauthn/webauthn_icon_view.h"
 #include "chrome/common/chrome_features.h"
 #include "content/public/common/content_features.h"
 #include "ui/views/animation/ink_drop.h"
@@ -222,13 +221,6 @@
                       params.command_updater, params.icon_label_bubble_delegate,
                       params.page_action_icon_delegate));
         break;
-      case PageActionIconType::kWebAuthn:
-        DCHECK(base::FeatureList::IsEnabled(features::kWebAuthConditionalUI));
-        add_page_action_icon(
-            type, std::make_unique<WebAuthnIconView>(
-                      params.command_updater, params.icon_label_bubble_delegate,
-                      params.page_action_icon_delegate));
-        break;
       case PageActionIconType::kVirtualCardEnroll:
         add_page_action_icon(
             type, std::make_unique<autofill::VirtualCardEnrollIconView>(
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
index 8ffdb78..08e46eb 100644
--- a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
+++ b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
@@ -225,11 +225,8 @@
                                       public extensions::ExtensionBrowserTest {
  public:
   ProfileMenuViewExtensionsTest() {
-#if !BUILDFLAG(IS_CHROMEOS_LACROS)
-    // The IPH is not implemented on Lacros.
     scoped_feature_list_.InitAndEnableFeature(
         feature_engagement::kIPHProfileSwitchFeature);
-#endif
     subscription_ =
         BrowserContextDependencyManager::GetInstance()
             ->RegisterCreateServicesCallbackForTesting(base::BindRepeating(
@@ -342,16 +339,10 @@
       }));
   loop.Run();
   ASSERT_TRUE(tracker->IsInitialized());
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // The IPH is not implemented on Lacros.
-  bool should_show = false;
-#else
-  bool should_show = true;
-#endif
-  EXPECT_EQ(should_show, promo_controller->MaybeShowPromo(
-                             feature_engagement::kIPHProfileSwitchFeature));
-  EXPECT_EQ(should_show, promo_controller->IsPromoActive(
-                             feature_engagement::kIPHProfileSwitchFeature));
+  EXPECT_TRUE(promo_controller->MaybeShowPromo(
+      feature_engagement::kIPHProfileSwitchFeature));
+  EXPECT_TRUE(promo_controller->IsPromoActive(
+      feature_engagement::kIPHProfileSwitchFeature));
 
   // Open the menu.
   ASSERT_NO_FATAL_FAILURE(OpenProfileMenu(browser()));
diff --git a/chrome/browser/ui/views/sad_tab_view.cc b/chrome/browser/ui/views/sad_tab_view.cc
index 47c861d..a0489b05 100644
--- a/chrome/browser/ui/views/sad_tab_view.cc
+++ b/chrome/browser/ui/views/sad_tab_view.cc
@@ -11,6 +11,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
 #include "chrome/app/vector_icons/vector_icons.h"
+#include "chrome/browser/profiles/profiles_state.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/views/bulleted_label_list_view.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
@@ -548,13 +549,17 @@
   auto* actions_container =
       container->AddChildView(std::make_unique<views::FlexLayoutView>());
   actions_container->SetCrossAxisAlignment(views::LayoutAlignment::kCenter);
-  auto* help_link =
-      actions_container->AddChildView(std::make_unique<views::Link>(
-          l10n_util::GetStringUTF16(GetHelpLinkTitle())));
-  help_link->SetCallback(base::BindRepeating(
-      &SadTab::PerformAction, base::Unretained(this), Action::HELP_LINK));
-  help_link->SetProperty(views::kTableVertAlignKey,
-                         views::LayoutAlignment::kCenter);
+  // Do not show the help link in the kiosk session to prevent escape from a
+  // kiosk app.
+  if (!profiles::IsKioskSession()) {
+    auto* help_link =
+        actions_container->AddChildView(std::make_unique<views::Link>(
+            l10n_util::GetStringUTF16(GetHelpLinkTitle())));
+    help_link->SetCallback(base::BindRepeating(
+        &SadTab::PerformAction, base::Unretained(this), Action::HELP_LINK));
+    help_link->SetProperty(views::kTableVertAlignKey,
+                           views::LayoutAlignment::kCenter);
+  }
   action_button_ =
       actions_container->AddChildView(std::make_unique<views::MdTextButton>(
           base::BindRepeating(&SadTabView::PerformAction,
@@ -640,8 +645,7 @@
   title_->SizeToFit(max_width);
 }
 
-SadTab* SadTab::Create(content::WebContents* web_contents,
-                       SadTabKind kind) {
+SadTab* SadTab::Create(content::WebContents* web_contents, SadTabKind kind) {
   return new SadTabView(web_contents, kind);
 }
 
diff --git a/chrome/browser/ui/views/tab_sharing/tab_capture_contents_border_helper.cc b/chrome/browser/ui/views/tab_sharing/tab_capture_contents_border_helper.cc
index 793de00..322cc52 100644
--- a/chrome/browser/ui/views/tab_sharing/tab_capture_contents_border_helper.cc
+++ b/chrome/browser/ui/views/tab_sharing/tab_capture_contents_border_helper.cc
@@ -23,7 +23,7 @@
 constexpr int kMinContentsBorderHeight = 20;
 
 // TODO(https://crbug.com/1030925): Fix contents border on ChromeOS.
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 class BorderView : public views::View {
  public:
   BorderView() = default;
@@ -84,7 +84,7 @@
   // After this fix, capturing a given tab X twice will still yield one widget.
   browser_view->set_contents_border_widget(widget);
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace
 
@@ -142,7 +142,7 @@
 
 void TabCaptureContentsBorderHelper::Update() {
 // TODO(https://crbug.com/1030925): Fix contents border on ChromeOS.
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   content::WebContents* const web_contents = &GetWebContents();
@@ -179,7 +179,7 @@
   } else {
     contents_border_widget->Hide();
   }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 }
 
 void TabCaptureContentsBorderHelper::UpdateBlueBorderLocation() {
diff --git a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views_browsertest.cc b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views_browsertest.cc
index d1a8f092..531dda2 100644
--- a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views_browsertest.cc
+++ b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views_browsertest.cc
@@ -193,7 +193,7 @@
     DCHECK((capturing_tab != kNullTabIndex && captured_tab != kNullTabIndex) ||
            (capturing_tab == kNullTabIndex && captured_tab == kNullTabIndex));
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
     // TODO(https://crbug.com/1030925) fix contents border on ChromeOS.
     has_border = false;
 #endif
@@ -669,7 +669,7 @@
         capture_indicator->IsBeingMirrored(GetWebContents(browser(), i)));
 
   views::Widget* contents_border = GetContentsBorder(browser());
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // TODO(https://crbug.com/1030925) fix contents border on ChromeOS.
   EXPECT_EQ(nullptr, contents_border);
 #else
diff --git a/chrome/browser/ui/views/try_chrome_dialog_win/try_chrome_dialog.cc b/chrome/browser/ui/views/try_chrome_dialog_win/try_chrome_dialog.cc
index 069e9d4..83337e0 100644
--- a/chrome/browser/ui/views/try_chrome_dialog_win/try_chrome_dialog.cc
+++ b/chrome/browser/ui/views/try_chrome_dialog_win/try_chrome_dialog.cc
@@ -295,6 +295,10 @@
   Context(const Context&) = delete;
   Context& operator=(const Context&) = delete;
 
+  // Suppresses use of the TaskbarIconFinder for the sake of tests. This omits
+  // costly work that leads to flaky test failures.
+  void BypassTaskbarIconSearch();
+
   // Begins asynchronous initialization of the context (i.e., runs a search for
   // the taskbar icon), running |closure| when done.
   void Initialize(base::OnceClosure closure);
@@ -535,6 +539,8 @@
   // The location of the taskbar on the primary display, or kUnknown.
   const TaskbarLocation taskbar_location_;
 
+  bool bypass_taskbar_icon_search_ = false;
+
   // The bounding rectangle of Chrome's icon in the primary taskbar.
   gfx::Rect taskbar_icon_rect_;
 
@@ -551,10 +557,25 @@
       taskbar_rect_(GetTaskbarRect(taskbar_window_)),
       taskbar_location_(FindTaskbarLocation(primary_display_, taskbar_rect_)) {}
 
+void TryChromeDialog::Context::BypassTaskbarIconSearch() {
+  bypass_taskbar_icon_search_ = true;
+}
+
 void TryChromeDialog::Context::Initialize(base::OnceClosure closure) {
+  auto result_callback =
+      base::BindOnce(&TryChromeDialog::Context::OnTaskbarIconRect,
+                     base::Unretained(this), std::move(closure));
+
+  if (bypass_taskbar_icon_search_) {
+    // When testing, skip the search for the taskbar icon and simply proceed
+    // with an empty rect indicating that no taskbar icon was found.
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(result_callback), gfx::Rect()));
+    return;
+  }
+
   // Get the bounding rectangle of Chrome's taskbar icon on the primary monitor.
-  FindTaskbarIcon(base::BindOnce(&TryChromeDialog::Context::OnTaskbarIconRect,
-                                 base::Unretained(this), std::move(closure)));
+  FindTaskbarIcon(std::move(result_callback));
 }
 
 void TryChromeDialog::Context::AddBorderToContents(views::Widget* popup,
@@ -1088,6 +1109,11 @@
   CHECK(!IsInObserverList());
 }
 
+void TryChromeDialog::BypassTaskbarIconSearchForTesting() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker_);
+  context_->BypassTaskbarIconSearch();
+}
+
 void TryChromeDialog::ShowDialogAsync() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker_);
 
diff --git a/chrome/browser/ui/views/try_chrome_dialog_win/try_chrome_dialog.h b/chrome/browser/ui/views/try_chrome_dialog_win/try_chrome_dialog.h
index e7957c4..d8a3c2f7 100644
--- a/chrome/browser/ui/views/try_chrome_dialog_win/try_chrome_dialog.h
+++ b/chrome/browser/ui/views/try_chrome_dialog_win/try_chrome_dialog.h
@@ -101,7 +101,11 @@
   // the interaction.
   TryChromeDialog(size_t group, Delegate* delegate);
 
-  // Starts the process of presenting the dialog by initiating an asychronous
+  // Suppresses use of the TaskbarIconFinder for the sake of tests. This omits
+  // costly work that leads to flaky test failures.
+  void BypassTaskbarIconSearchForTesting();
+
+  // Starts the process of presenting the dialog by initiating an asynchronous
   // search for Chrome's taskbar icon via the encapsulated context object.
   void ShowDialogAsync();
 
diff --git a/chrome/browser/ui/views/try_chrome_dialog_win/try_chrome_dialog_browsertest.cc b/chrome/browser/ui/views/try_chrome_dialog_win/try_chrome_dialog_browsertest.cc
index 3faed89..d49d7c9 100644
--- a/chrome/browser/ui/views/try_chrome_dialog_win/try_chrome_dialog_browsertest.cc
+++ b/chrome/browser/ui/views/try_chrome_dialog_win/try_chrome_dialog_browsertest.cc
@@ -114,6 +114,7 @@
   // content:BrowserTestBase:
   void SetUpOnMainThread() override {
     dialog_ = base::WrapUnique(new TryChromeDialog(group_, &delegate_));
+    dialog_->BypassTaskbarIconSearchForTesting();
   }
   void TearDownInProcessBrowserTestFixture() override { dialog_.reset(); }
 
diff --git a/chrome/browser/ui/views/user_education/feature_promo_dialog_interactive_uitest.cc b/chrome/browser/ui/views/user_education/feature_promo_dialog_interactive_uitest.cc
index 4cc46b92..6653ffd8 100644
--- a/chrome/browser/ui/views/user_education/feature_promo_dialog_interactive_uitest.cc
+++ b/chrome/browser/ui/views/user_education/feature_promo_dialog_interactive_uitest.cc
@@ -219,7 +219,10 @@
 class FeaturePromoDialogSideSearchTest : public FeaturePromoDialogTest {
  public:
   FeaturePromoDialogSideSearchTest() {
-    feature_list_.InitAndEnableFeature(features::kSideSearch);
+    // Currently the IPH is only supported for the Google ChromeOS
+    // configuration.
+    feature_list_.InitWithFeatures({features::kSideSearch},
+                                   {features::kSideSearchDSESupport});
   }
 
   void SetUpOnMainThread() override {
diff --git a/chrome/browser/ui/views/webauthn/webauthn_bubble_view.cc b/chrome/browser/ui/views/webauthn/webauthn_bubble_view.cc
deleted file mode 100644
index e3a6a0a8..0000000
--- a/chrome/browser/ui/views/webauthn/webauthn_bubble_view.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/views/webauthn/webauthn_bubble_view.h"
-
-#include <memory>
-
-#include "chrome/browser/ui/browser_finder.h"
-#include "chrome/browser/ui/views/chrome_layout_provider.h"
-#include "chrome/browser/ui/views/frame/browser_view.h"
-#include "chrome/browser/ui/views/frame/toolbar_button_provider.h"
-#include "chrome/browser/ui/webauthn/webauthn_ui_helpers.h"
-#include "chrome/grit/generated_resources.h"
-#include "components/strings/grit/components_strings.h"
-#include "content/public/browser/web_contents.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/ui_base_types.h"
-#include "ui/views/controls/label.h"
-#include "ui/views/layout/fill_layout.h"
-#include "ui/views/layout/layout_provider.h"
-
-// static
-WebAuthnBubbleView* WebAuthnBubbleView::Create(
-    const std::string& relying_party_id,
-    content::WebContents* web_contents) {
-  Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
-  ToolbarButtonProvider* button_provider =
-      BrowserView::GetBrowserViewForBrowser(browser)->toolbar_button_provider();
-  auto bubble_view = std::make_unique<WebAuthnBubbleView>(
-      relying_party_id,
-      button_provider->GetAnchorView(PageActionIconType::kWebAuthn),
-      web_contents);
-  WebAuthnBubbleView* weak_bubble_view = bubble_view.get();
-  views::Widget* bubble_widget =
-      views::BubbleDialogDelegateView::CreateBubble(std::move(bubble_view));
-  bubble_widget->Show();
-  return weak_bubble_view;
-}
-
-WebAuthnBubbleView::WebAuthnBubbleView(const std::string& relying_party_id,
-                                       views::View* anchor_view,
-                                       content::WebContents* web_contents)
-    : LocationBarBubbleDelegateView(anchor_view, web_contents),
-      relying_party_id_(relying_party_id) {
-  SetShowCloseButton(true);
-  SetButtons(ui::DIALOG_BUTTON_CANCEL);
-  SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
-                 l10n_util::GetStringUTF16(IDS_CLOSE));
-  set_fixed_width(views::LayoutProvider::Get()->GetDistanceMetric(
-      views::DISTANCE_BUBBLE_PREFERRED_WIDTH));
-}
-
-WebAuthnBubbleView::~WebAuthnBubbleView() = default;
-
-std::u16string WebAuthnBubbleView::GetWindowTitle() const {
-  // TODO(crbug.com/1179014): go through ux review and i18n this string.
-  return u"Sign in with your security key";
-}
-
-void WebAuthnBubbleView::Init() {
-  SetLayoutManager(std::make_unique<views::FillLayout>());
-
-  // TODO(crbug.com/1179014): go through ux review and i18n this string.
-  std::u16string label_text = base::ReplaceStringPlaceholders(
-      u"To sign in to $1 with your security key, insert it and tap it",
-      webauthn_ui_helpers::RpIdToElidedHost(relying_party_id_, fixed_width()),
-      /*offset=*/nullptr);
-  auto label = std::make_unique<views::Label>(
-      label_text, views::style::CONTEXT_DIALOG_BODY_TEXT,
-      views::style::STYLE_SECONDARY);
-  label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
-  label->SetMultiLine(true);
-  AddChildView(std::move(label));
-}
diff --git a/chrome/browser/ui/views/webauthn/webauthn_bubble_view.h b/chrome/browser/ui/views/webauthn/webauthn_bubble_view.h
deleted file mode 100644
index e683b48..0000000
--- a/chrome/browser/ui/views/webauthn/webauthn_bubble_view.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_VIEWS_WEBAUTHN_WEBAUTHN_BUBBLE_VIEW_H_
-#define CHROME_BROWSER_UI_VIEWS_WEBAUTHN_WEBAUTHN_BUBBLE_VIEW_H_
-
-#include "chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.h"
-
-namespace content {
-class WebContents;
-}  // namespace content
-
-// A bubble that appears near the omnibar when the user clicks a
-// |WebAuthnIconView|, instructing the user that they can insert and tap their
-// security key to log-in to the website.
-class WebAuthnBubbleView : public LocationBarBubbleDelegateView {
- public:
-  // Creates a WebAuthnBubbleView owned by its widget.
-  static WebAuthnBubbleView* Create(
-      const std::string& relying_party_id,
-      content::WebContents* web_contents);
-
-  WebAuthnBubbleView(const std::string& relying_party_id,
-                     views::View* anchor_view,
-                     content::WebContents* web_contents);
-  ~WebAuthnBubbleView() override;
-  WebAuthnBubbleView(const WebAuthnBubbleView& other) = delete;
-  WebAuthnBubbleView& operator=(const WebAuthnBubbleView& other) = delete;
-
-  // LocationBarBubbleDelegateView:
-  std::u16string GetWindowTitle() const override;
-  void Init() override;
-
- private:
-  std::string relying_party_id_;
-};
-
-#endif  // CHROME_BROWSER_UI_VIEWS_WEBAUTHN_WEBAUTHN_BUBBLE_VIEW_H_
diff --git a/chrome/browser/ui/views/webauthn/webauthn_icon_interactive_uitest.cc b/chrome/browser/ui/views/webauthn/webauthn_icon_interactive_uitest.cc
deleted file mode 100644
index 937464b..0000000
--- a/chrome/browser/ui/views/webauthn/webauthn_icon_interactive_uitest.cc
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/bind.h"
-#include "base/memory/raw_ptr.h"
-#include "base/test/bind.h"
-#include "base/test/scoped_feature_list.h"
-#include "build/build_config.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_commands.h"
-#include "chrome/browser/ui/browser_list.h"
-#include "chrome/browser/ui/views/frame/browser_view.h"
-#include "chrome/browser/ui/views/frame/toolbar_button_provider.h"
-#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
-#include "chrome/browser/ui/views/webauthn/webauthn_icon_view.h"
-#include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/base/ui_test_utils.h"
-#include "components/network_session_configurator/common/network_switches.h"
-#include "content/public/browser/authenticator_environment.h"
-#include "content/public/common/content_features.h"
-#include "content/public/common/content_switches.h"
-#include "content/public/test/browser_test.h"
-#include "content/public/test/browser_test_utils.h"
-#include "device/fido/virtual_ctap2_device.h"
-#include "device/fido/virtual_fido_device_factory.h"
-#include "net/dns/mock_host_resolver.h"
-#include "net/test/embedded_test_server/embedded_test_server.h"
-#include "testing/gmock/include/gmock/gmock.h"
-
-namespace {
-
-class WebAuthUITest : public InProcessBrowserTest {
- public:
-  WebAuthUITest(const WebAuthUITest&) = delete;
-  WebAuthUITest& operator=(const WebAuthUITest&) = delete;
-
- protected:
-  WebAuthUITest() {
-    scoped_feature_list_.InitAndEnableFeature(features::kWebAuthConditionalUI);
-  }
-
-  void SetUpOnMainThread() override {
-    host_resolver()->AddRule("*", "127.0.0.1");
-    https_server_.ServeFilesFromSourceDirectory("content/test/data");
-    ASSERT_TRUE(https_server_.Start());
-  }
-
-  GURL GetHttpsURL(const std::string& hostname,
-                   const std::string& relative_url) {
-    return https_server_.GetURL(hostname, relative_url);
-  }
-
-  raw_ptr<AuthenticatorRequestDialogModel> dialog_model_;
-
- private:
-  void SetUpCommandLine(base::CommandLine* command_line) override {
-    command_line->AppendSwitch(switches::kIgnoreCertificateErrors);
-    command_line->AppendSwitch(
-        switches::kEnableExperimentalWebPlatformFeatures);
-  }
-
-  net::EmbeddedTestServer https_server_{net::EmbeddedTestServer::TYPE_HTTPS};
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-// When a conditional UI WebAuthn request is made, the browser should show an
-// icon on the omnibar if the tab executing the request is focused.
-IN_PROC_BROWSER_TEST_F(WebAuthUITest, ConditionalUI) {
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(
-      browser(), GetHttpsURL("www.example.com", "/title1.html")));
-  auto owned_virtual_device_factory =
-      std::make_unique<device::test::VirtualFidoDeviceFactory>();
-  auto* virtual_device_factory = owned_virtual_device_factory.get();
-  content::AuthenticatorEnvironment::GetInstance()
-      ->ReplaceDefaultDiscoveryFactoryForTesting(
-          std::move(owned_virtual_device_factory));
-  device::VirtualCtap2Device::Config config;
-  config.internal_uv_support = true;
-  config.resident_key_support = true;
-  virtual_device_factory->SetCtap2Config(std::move(config));
-  virtual_device_factory->mutable_state()->InjectResidentKey(
-      std::vector<uint8_t>{1, 2, 3, 4}, "www.example.com",
-      std::vector<uint8_t>{6, 7, 8, 9}, /*user_name=*/absl::nullopt,
-      /*user_display_name=*/absl::nullopt);
-  virtual_device_factory->mutable_state()->fingerprints_enrolled = true;
-  PageActionIconView* webauthn_icon =
-      BrowserView::GetBrowserViewForBrowser(browser())
-          ->toolbar_button_provider()
-          ->GetPageActionIconView(PageActionIconType::kWebAuthn);
-
-  // The icon should not be visible if there is no ongoing conditional UI
-  // request.
-  EXPECT_FALSE(webauthn_icon->GetActive());
-  EXPECT_FALSE(webauthn_icon->GetVisible());
-  virtual_device_factory->mutable_state()->simulate_press_callback =
-      base::BindLambdaForTesting([webauthn_icon, browser = browser()](
-                                     device::VirtualFidoDevice* device) {
-        // The icon should only appear during a conditional UI request for
-        // the correct tab.
-        EXPECT_TRUE(webauthn_icon->GetVisible());
-
-        chrome::NewTab(browser);
-        EXPECT_FALSE(webauthn_icon->GetVisible());
-
-        chrome::CloseTab(browser);
-        EXPECT_TRUE(webauthn_icon->GetVisible());
-        return true;
-      });
-
-  constexpr char kGetAssertion[] =
-      "navigator.credentials.get({"
-      "  publicKey: {"
-      "    challenge: new Uint8Array([1,2,3,4]),"
-      "    timeout: 1000,"
-      "  },"
-      "  mediation: 'conditional'"
-      "}).then(c => window.domAutomationController.send(c ? 'OK' : 'c null'),"
-      "         e => window.domAutomationController.send(e.toString()));";
-  content::WebContents* const web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  std::string result;
-  ASSERT_TRUE(content::ExecuteScriptAndExtractString(web_contents,
-                                                     kGetAssertion, &result));
-  EXPECT_EQ(result, "OK");
-  EXPECT_FALSE(webauthn_icon->GetActive());
-  EXPECT_FALSE(webauthn_icon->GetVisible());
-}
-
-}  // anonymous namespace
diff --git a/chrome/browser/ui/views/webauthn/webauthn_icon_view.cc b/chrome/browser/ui/views/webauthn/webauthn_icon_view.cc
deleted file mode 100644
index 5f618bd..0000000
--- a/chrome/browser/ui/views/webauthn/webauthn_icon_view.cc
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/views/webauthn/webauthn_icon_view.h"
-
-#include <utility>
-
-#include "base/strings/utf_string_conversions.h"
-#include "chrome/app/chrome_command_ids.h"
-#include "chrome/app/vector_icons/vector_icons.h"
-#include "chrome/browser/ui/view_ids.h"
-#include "chrome/browser/ui/views/webauthn/webauthn_bubble_view.h"
-#include "chrome/browser/webauthn/authenticator_request_scheduler.h"
-#include "chrome/browser/webauthn/chrome_authenticator_request_delegate.h"
-#include "chrome/grit/generated_resources.h"
-#include "components/vector_icons/vector_icons.h"
-#include "content/public/browser/web_contents.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/metadata/metadata_impl_macros.h"
-#include "ui/base/resource/resource_bundle.h"
-
-WebAuthnIconView::WebAuthnIconView(
-    CommandUpdater* command_updater,
-    IconLabelBubbleView::Delegate* icon_label_bubble_delegate,
-    PageActionIconView::Delegate* page_action_icon_delegate)
-    : PageActionIconView(command_updater,
-                         IDC_WEBAUTHN,
-                         icon_label_bubble_delegate,
-                         page_action_icon_delegate) {
-  SetID(VIEW_ID_WEBAUTHN_BUTTON);
-}
-
-WebAuthnIconView::~WebAuthnIconView() {
-  if (webauthn_bubble_) {
-    webauthn_bubble_->GetWidget()->RemoveObserver(this);
-  }
-}
-
-views::BubbleDialogDelegate* WebAuthnIconView::GetBubble() const {
-  return webauthn_bubble_;
-}
-
-void WebAuthnIconView::UpdateImpl() {
-  content::WebContents* web_contents = GetWebContents();
-  if (!web_contents) {
-    return;
-  }
-
-  ChromeAuthenticatorRequestDelegate* request_delegate =
-      AuthenticatorRequestScheduler::GetRequestDelegate(GetWebContents());
-  if (!request_delegate) {
-    // No active WebAuthn request on the current page.
-    SetVisible(false);
-    return;
-  }
-
-  AuthenticatorRequestDialogModel* dialog_model =
-      request_delegate->dialog_model();
-  if (!dialog_model) {
-    // This can happen if the dialog went away but the request has not resolved
-    // yet.
-    SetVisible(false);
-    return;
-  }
-
-  SetVisible(dialog_model->current_step() ==
-             AuthenticatorRequestDialogModel::Step::kLocationBarBubble);
-  if (dialog_models_.find(web_contents) == dialog_models_.end()) {
-    dialog_model->AddObserver(this);
-    dialog_models_.insert({web_contents, dialog_model});
-  }
-}
-
-void WebAuthnIconView::OnExecuting(
-    PageActionIconView::ExecuteSource execute_source) {
-  if (webauthn_bubble_) {
-    return;
-  }
-  content::WebContents* web_contents = GetWebContents();
-  AuthenticatorRequestDialogModel* model = dialog_models_.at(web_contents);
-  webauthn_bubble_ =
-      WebAuthnBubbleView::Create(model->relying_party_id(), web_contents);
-  webauthn_bubble_->GetWidget()->AddObserver(this);
-}
-
-const gfx::VectorIcon& WebAuthnIconView::GetVectorIcon() const {
-  return kFingerprintIcon;
-}
-
-std::u16string WebAuthnIconView::GetTextForTooltipAndAccessibleName() const {
-  // TODO(crbug.com/1179014): go through ux review and i18n this string.
-  return u"Sign in with your security key";
-}
-
-void WebAuthnIconView::OnWidgetDestroying(views::Widget* widget) {
-  DCHECK_EQ(widget, GetBubble()->GetWidget());
-  SetHighlighted(false);
-  webauthn_bubble_ = nullptr;
-}
-
-void WebAuthnIconView::OnModelDestroyed(
-    AuthenticatorRequestDialogModel* model) {
-  auto pair = base::ranges::find_if(dialog_models_, [model](const auto& pair) {
-    return pair.second == model;
-  });
-  DCHECK(pair != dialog_models_.end());
-  if (pair->first == GetWebContents()) {
-    SetVisible(false);
-  }
-  dialog_models_.erase(pair);
-}
-
-void WebAuthnIconView::OnStepTransition() {
-  UpdateImpl();
-}
-
-BEGIN_METADATA(WebAuthnIconView, PageActionIconView)
-END_METADATA
diff --git a/chrome/browser/ui/views/webauthn/webauthn_icon_view.h b/chrome/browser/ui/views/webauthn/webauthn_icon_view.h
deleted file mode 100644
index 1be67ae2..0000000
--- a/chrome/browser/ui/views/webauthn/webauthn_icon_view.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_VIEWS_WEBAUTHN_WEBAUTHN_ICON_VIEW_H_
-#define CHROME_BROWSER_UI_VIEWS_WEBAUTHN_WEBAUTHN_ICON_VIEW_H_
-
-#include "base/containers/flat_map.h"
-#include "base/memory/raw_ptr.h"
-#include "chrome/browser/ui/views/page_action/page_action_icon_view.h"
-#include "chrome/browser/webauthn/authenticator_request_dialog_model.h"
-#include "ui/base/metadata/metadata_header_macros.h"
-#include "ui/views/widget/widget_observer.h"
-
-class WebAuthnBubbleView;
-
-// Location bar icon shown when the WebAuthn Conditional UI is invoked. Clicking
-// it displays a |WebAuthnBubbleView|.
-class WebAuthnIconView : public PageActionIconView,
-                         public views::WidgetObserver,
-                         public AuthenticatorRequestDialogModel::Observer {
- public:
-  METADATA_HEADER(WebAuthnIconView);
-  WebAuthnIconView(CommandUpdater* command_updater,
-                   IconLabelBubbleView::Delegate* icon_label_bubble_delegate,
-                   PageActionIconView::Delegate* page_action_icon_delegate);
-  WebAuthnIconView(const WebAuthnIconView&) = delete;
-  WebAuthnIconView& operator=(const WebAuthnIconView&) = delete;
-  ~WebAuthnIconView() override;
-
-  // PageActionIconView:
-  views::BubbleDialogDelegate* GetBubble() const override;
-  void UpdateImpl() override;
-
- protected:
-  // PageActionIconView:
-  void OnExecuting(PageActionIconView::ExecuteSource execute_source) override;
-  const gfx::VectorIcon& GetVectorIcon() const override;
-  std::u16string GetTextForTooltipAndAccessibleName() const override;
-
-  // views::WidgetObserver:
-  void OnWidgetDestroying(views::Widget* widget) override;
-
-  // AuthenticatorRequestDialogModel::Observer:
-  void OnModelDestroyed(AuthenticatorRequestDialogModel* model) override;
-  void OnStepTransition() override;
-
- private:
-  base::flat_map<content::WebContents*, AuthenticatorRequestDialogModel*>
-      dialog_models_;
-
-  // The bubble is owned by its widget.
-  raw_ptr<WebAuthnBubbleView> webauthn_bubble_ = nullptr;
-};
-
-#endif  // CHROME_BROWSER_UI_VIEWS_WEBAUTHN_WEBAUTHN_ICON_VIEW_H_
diff --git a/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.cc b/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.cc
index 3c33023..a42b1ff 100644
--- a/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.cc
+++ b/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.cc
@@ -52,22 +52,22 @@
 void AddSectionEntry(base::ListValue* section_list,
                      const std::string& name,
                      bool value) {
-  std::unique_ptr<base::DictionaryValue> entry(new base::DictionaryValue);
-  entry->SetStringKey("stat_name", name);
-  entry->SetBoolKey("stat_value", value);
-  entry->SetBoolKey("is_valid", true);
-  section_list->Append(std::move(entry));
+  base::Value::Dict entry;
+  entry.Set("stat_name", name);
+  entry.Set("stat_value", value);
+  entry.Set("is_valid", true);
+  section_list->GetList().Append(std::move(entry));
 }
 
 // Adds a string entry to a section (created with |AddSection| above).
 void AddSectionEntry(base::ListValue* section_list,
                      const std::string& name,
                      const std::string& value) {
-  std::unique_ptr<base::DictionaryValue> entry(new base::DictionaryValue);
-  entry->SetStringKey("stat_name", name);
-  entry->SetStringKey("stat_value", value);
-  entry->SetBoolKey("is_valid", true);
-  section_list->Append(std::move(entry));
+  base::Value::Dict entry;
+  entry.Set("stat_name", name);
+  entry.Set("stat_value", value);
+  entry.Set("is_valid", true);
+  section_list->GetList().Append(std::move(entry));
 }
 
 std::string FilteringBehaviorToString(
diff --git a/chrome/browser/ui/webui/profile_internals/profile_internals_handler.cc b/chrome/browser/ui/webui/profile_internals/profile_internals_handler.cc
index 41bb697..fd3915a 100644
--- a/chrome/browser/ui/webui/profile_internals/profile_internals_handler.cc
+++ b/chrome/browser/ui/webui/profile_internals/profile_internals_handler.cc
@@ -22,7 +22,8 @@
 
 base::Value CreateProfileEntry(
     const ProfileAttributesEntry* entry,
-    const base::flat_set<base::FilePath>& loaded_profile_paths) {
+    const base::flat_set<base::FilePath>& loaded_profile_paths,
+    const base::flat_set<base::FilePath>& has_off_the_record_profile) {
   base::Value profile_entry(base::Value::Type::DICTIONARY);
   profile_entry.SetKey("profilePath", base::FilePathToValue(entry->GetPath()));
   profile_entry.SetStringKey("localProfileName", entry->GetLocalProfileName());
@@ -75,6 +76,8 @@
   profile_entry.SetKey("signedAccounts", std::move(signedAccounts));
   profile_entry.SetBoolKey("isLoaded",
                            loaded_profile_paths.contains(entry->GetPath()));
+  profile_entry.SetBoolKey(
+      "hasOffTheRecord", has_off_the_record_profile.contains(entry->GetPath()));
   return profile_entry;
 }
 
@@ -114,8 +117,15 @@
   base::flat_set<base::FilePath> loaded_profile_paths =
       base::MakeFlatSet<base::FilePath>(
           loaded_profiles, {}, [](const auto& it) { return it->GetPath(); });
+  base::flat_set<base::FilePath> has_off_the_record_profile;
+  for (Profile* profile : loaded_profiles) {
+    if (profile->GetAllOffTheRecordProfiles().size() > 0) {
+      has_off_the_record_profile.insert(profile->GetPath());
+    }
+  }
   for (const ProfileAttributesEntry* entry : entries) {
-    profiles_list.Append(CreateProfileEntry(entry, loaded_profile_paths));
+    profiles_list.Append(CreateProfileEntry(entry, loaded_profile_paths,
+                                            has_off_the_record_profile));
   }
   return profiles_list;
 }
diff --git a/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc b/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc
index a6abff5..3581c03 100644
--- a/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc
+++ b/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc
@@ -37,26 +37,26 @@
 
 namespace {
 
-// Returns a ListValue containing a copy of the file paths stored in |files|.
-std::unique_ptr<base::ListValue> GetFilesAsListStorage(
-    const std::set<base::FilePath>& files) {
-  auto value = std::make_unique<base::ListValue>();
+// Returns a base::Value::List containing a copy of the file paths stored in
+// |files|.
+base::Value::List GetFilesAsListStorage(const std::set<base::FilePath>& files) {
+  base::Value::List value;
   for (const base::FilePath& path : files) {
-    auto item = std::make_unique<base::DictionaryValue>();
-    item->SetStringKey("dirname",
-                       path.DirName().AsEndingWithSeparator().AsUTF8Unsafe());
-    item->SetStringKey("basename", path.BaseName().AsUTF8Unsafe());
-    value->Append(std::move(item));
+    base::Value::Dict item;
+    item.Set("dirname", path.DirName().AsEndingWithSeparator().AsUTF8Unsafe());
+    item.Set("basename", path.BaseName().AsUTF8Unsafe());
+    value.Append(std::move(item));
   }
   return value;
 }
 
-// Returns a ListValue containing a copy of the strings stored in |string_set|.
-std::unique_ptr<base::ListValue> GetStringSetAsListStorage(
+// Returns a base::Value::List containing a copy of the strings stored in
+// |string_set|.
+base::Value::List GetStringSetAsListStorage(
     const std::set<std::wstring>& string_set) {
-  auto value = std::make_unique<base::ListValue>();
+  base::Value::List value;
   for (const std::wstring& string : string_set)
-    value->Append(base::AsString16(string));
+    value.Append(base::AsString16(string));
 
   return value;
 }
@@ -65,10 +65,10 @@
     const safe_browsing::ChromeCleanerScannerResults& scanner_results,
     Profile* profile) {
   base::DictionaryValue value;
-  value.SetList("files",
-                GetFilesAsListStorage(scanner_results.files_to_delete()));
-  value.SetList("registryKeys",
-                GetStringSetAsListStorage(scanner_results.registry_keys()));
+  value.GetDict().Set("files",
+                      GetFilesAsListStorage(scanner_results.files_to_delete()));
+  value.GetDict().Set("registryKeys", GetStringSetAsListStorage(
+                                          scanner_results.registry_keys()));
   return value;
 }
 
diff --git a/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc b/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc
index 1c7ab8d..9a3d27a 100644
--- a/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc
+++ b/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc
@@ -40,8 +40,9 @@
 int64_t StringAtIndexToInt64(const base::Value::List& list, size_t index) {
   if (list.size() > index && list[index].is_string()) {
     int64_t integer = 0;
-    if (base::StringToInt64(list[index].GetString(), &integer))
+    if (base::StringToInt64(list[index].GetString(), &integer)) {
       return integer;
+    }
   }
   return 0;
 }
@@ -259,8 +260,9 @@
   DCHECK_EQ(0U, args.size());
 
   SyncService* service = GetSyncService();
-  if (!service)
+  if (!service) {
     return;
+  }
 
   service->GetUserSettings()->SetSyncRequested(true);
   // If the service was previously stopped via StopAndClear(), then the
@@ -275,8 +277,9 @@
   DCHECK_EQ(0U, args.size());
 
   SyncService* service = GetSyncService();
-  if (!service)
+  if (!service) {
     return;
+  }
 
   service->GetUserSettings()->SetSyncRequested(false);
 }
@@ -286,8 +289,9 @@
   DCHECK_EQ(0U, args.size());
 
   SyncService* service = GetSyncService();
-  if (!service)
+  if (!service) {
     return;
+  }
 
   service->StopAndClear();
 }
@@ -295,8 +299,9 @@
 void SyncInternalsMessageHandler::HandleTriggerRefresh(
     const base::Value::List& args) {
   SyncService* service = GetSyncService();
-  if (!service)
+  if (!service) {
     return;
+  }
 
   service->TriggerRefresh(syncer::ModelTypeSet::All());
 }
@@ -388,8 +393,9 @@
 
 void SyncInternalsMessageHandler::UnregisterModelNotifications() {
   SyncService* service = GetSyncService();
-  if (!service)
+  if (!service) {
     return;
+  }
 
   // Cannot use ScopedObserver to do all the tracking because most don't follow
   // AddObserver/RemoveObserver method naming style.
diff --git a/chrome/browser/webauthn/DEPS b/chrome/browser/webauthn/DEPS
new file mode 100644
index 0000000..3723e70
--- /dev/null
+++ b/chrome/browser/webauthn/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+components/webauthn/android",
+]
diff --git a/chrome/browser/webauthn/android/chrome_webauthn_client_android.cc b/chrome/browser/webauthn/android/chrome_webauthn_client_android.cc
new file mode 100644
index 0000000..4cc9ff9
--- /dev/null
+++ b/chrome/browser/webauthn/android/chrome_webauthn_client_android.cc
@@ -0,0 +1,23 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/webauthn/android/chrome_webauthn_client_android.h"
+
+#include "chrome/browser/webauthn/android/conditional_ui_delegate_android.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/web_contents.h"
+
+ChromeWebAuthnClientAndroid::ChromeWebAuthnClientAndroid() = default;
+
+ChromeWebAuthnClientAndroid::~ChromeWebAuthnClientAndroid() = default;
+
+void ChromeWebAuthnClientAndroid::OnWebAuthnRequestPending(
+    content::RenderFrameHost* frame_host,
+    const std::vector<device::DiscoverableCredentialMetadata>& credentials,
+    base::OnceCallback<void(const std::vector<uint8_t>& id)> callback) {
+  auto* delegate = ConditionalUiDelegateAndroid::GetConditionalUiDelegate(
+      content::WebContents::FromRenderFrameHost(frame_host));
+
+  delegate->OnWebAuthnRequestPending(credentials, std::move(callback));
+}
diff --git a/chrome/browser/webauthn/android/chrome_webauthn_client_android.h b/chrome/browser/webauthn/android/chrome_webauthn_client_android.h
new file mode 100644
index 0000000..3b038c0
--- /dev/null
+++ b/chrome/browser/webauthn/android/chrome_webauthn_client_android.h
@@ -0,0 +1,29 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_WEBAUTHN_ANDROID_CHROME_WEBAUTHN_CLIENT_ANDROID_H_
+#define CHROME_BROWSER_WEBAUTHN_ANDROID_CHROME_WEBAUTHN_CLIENT_ANDROID_H_
+
+#include "base/callback_forward.h"
+#include "components/webauthn/android/webauthn_client_android.h"
+
+// Chrome implementation of WebAuthnClientAndroid.
+class ChromeWebAuthnClientAndroid : public components::WebAuthnClientAndroid {
+ public:
+  ChromeWebAuthnClientAndroid();
+  ~ChromeWebAuthnClientAndroid() override;
+
+  ChromeWebAuthnClientAndroid(const ChromeWebAuthnClientAndroid&) = delete;
+  ChromeWebAuthnClientAndroid& operator=(const ChromeWebAuthnClientAndroid&) =
+      delete;
+
+  // components::WebAuthnClientAndroid:
+  void OnWebAuthnRequestPending(
+      content::RenderFrameHost* frame_host,
+      const std::vector<device::DiscoverableCredentialMetadata>& credentials,
+      base::OnceCallback<void(const std::vector<uint8_t>& id)> callback)
+      override;
+};
+
+#endif  // CHROME_BROWSER_WEBAUTHN_ANDROID_CHROME_WEBAUTHN_CLIENT_ANDROID_H_
diff --git a/chrome/browser/webauthn/chrome_conditional_ui_delegate_android.cc b/chrome/browser/webauthn/android/conditional_ui_delegate_android.cc
similarity index 70%
rename from chrome/browser/webauthn/chrome_conditional_ui_delegate_android.cc
rename to chrome/browser/webauthn/android/conditional_ui_delegate_android.cc
index eda9251..a2e2730 100644
--- a/chrome/browser/webauthn/chrome_conditional_ui_delegate_android.cc
+++ b/chrome/browser/webauthn/android/conditional_ui_delegate_android.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/webauthn/chrome_conditional_ui_delegate_android.h"
+#include "chrome/browser/webauthn/android/conditional_ui_delegate_android.h"
 
 #include <memory>
 
@@ -11,15 +11,15 @@
 #include "device/fido/discoverable_credential_metadata.h"
 
 // static
-ChromeConditionalUiDelegateAndroid*
-ChromeConditionalUiDelegateAndroid::GetConditionalUiDelegate(
+ConditionalUiDelegateAndroid*
+ConditionalUiDelegateAndroid::GetConditionalUiDelegate(
     content::WebContents* web_contents) {
   static constexpr char kConditionalUiDelegateKey[] =
       "ConditionalUiDelegateKey";
-  auto* delegate = static_cast<ChromeConditionalUiDelegateAndroid*>(
+  auto* delegate = static_cast<ConditionalUiDelegateAndroid*>(
       web_contents->GetUserData(kConditionalUiDelegateKey));
   if (!delegate) {
-    auto new_user_data = std::make_unique<ChromeConditionalUiDelegateAndroid>();
+    auto new_user_data = std::make_unique<ConditionalUiDelegateAndroid>();
     delegate = new_user_data.get();
     web_contents->SetUserData(kConditionalUiDelegateKey,
                               std::move(new_user_data));
@@ -28,11 +28,11 @@
   return delegate;
 }
 
-ChromeConditionalUiDelegateAndroid::ChromeConditionalUiDelegateAndroid() {}
+ConditionalUiDelegateAndroid::ConditionalUiDelegateAndroid() {}
 
-ChromeConditionalUiDelegateAndroid::~ChromeConditionalUiDelegateAndroid() {}
+ConditionalUiDelegateAndroid::~ConditionalUiDelegateAndroid() {}
 
-void ChromeConditionalUiDelegateAndroid::OnWebAuthnRequestPending(
+void ConditionalUiDelegateAndroid::OnWebAuthnRequestPending(
     const std::vector<device::DiscoverableCredentialMetadata>& credentials,
     base::OnceCallback<void(const std::vector<uint8_t>& id)> callback) {
   webauthn_account_selection_callback_ = std::move(callback);
@@ -44,12 +44,12 @@
   }
 }
 
-void ChromeConditionalUiDelegateAndroid::OnWebAuthnAccountSelected(
+void ConditionalUiDelegateAndroid::OnWebAuthnAccountSelected(
     const std::vector<uint8_t>& user_id) {
   std::move(webauthn_account_selection_callback_).Run(user_id);
 }
 
-void ChromeConditionalUiDelegateAndroid::RetrieveWebAuthnCredentials(
+void ConditionalUiDelegateAndroid::RetrieveWebAuthnCredentials(
     base::OnceCallback<void(
         const std::vector<device::DiscoverableCredentialMetadata>&)> callback) {
   // Complete immediately if there is an outstanding WebAuthn get request.
diff --git a/chrome/browser/webauthn/android/conditional_ui_delegate_android.h b/chrome/browser/webauthn/android/conditional_ui_delegate_android.h
new file mode 100644
index 0000000..f22998c7
--- /dev/null
+++ b/chrome/browser/webauthn/android/conditional_ui_delegate_android.h
@@ -0,0 +1,72 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_WEBAUTHN_ANDROID_CONDITIONAL_UI_DELEGATE_ANDROID_H_
+#define CHROME_BROWSER_WEBAUTHN_ANDROID_CONDITIONAL_UI_DELEGATE_ANDROID_H_
+
+#include <vector>
+
+#include "base/callback.h"
+#include "base/supports_user_data.h"
+
+namespace content {
+class WebContents;
+}
+
+namespace device {
+class DiscoverableCredentialMetadata;
+}
+
+// Helper class for connecting the autofill implementation to the WebAuthn
+// request handling for Conditional UI on Android. This is attached to a
+// WebContents via SetUserData. It caches callbacks in both directions to
+// eliminate races between the WebAuthn 'get' request and the autofill request
+// for form suggestions.
+class ConditionalUiDelegateAndroid : public base::SupportsUserData::Data {
+ public:
+  ConditionalUiDelegateAndroid();
+
+  ConditionalUiDelegateAndroid(const ConditionalUiDelegateAndroid&) = delete;
+  ConditionalUiDelegateAndroid& operator=(const ConditionalUiDelegateAndroid&) =
+      delete;
+
+  ~ConditionalUiDelegateAndroid() override;
+
+  // Called when a Web Authentication Conditional UI request is received. This
+  // provides the callback that will complete the request if and when a user
+  // selects a credential from a form autofill dialog.
+  void OnWebAuthnRequestPending(
+      const std::vector<device::DiscoverableCredentialMetadata>& credentials,
+      base::OnceCallback<void(const std::vector<uint8_t>& id)> callback);
+
+  // Tells the driver that the user has selected a Web Authentication
+  // credential from a dialog, and provides the credential ID for the selected
+  // credential.
+  void OnWebAuthnAccountSelected(const std::vector<uint8_t>& id);
+
+  // Retrieves a list of Web Authentication credentials that can be displayed
+  // as suggestions in an autofill dialog.
+  void RetrieveWebAuthnCredentials(
+      base::OnceCallback<
+          void(const std::vector<device::DiscoverableCredentialMetadata>&)>);
+
+  // Returns a delegate associated with the |web_contents|. It creates one if
+  // one does not already exist.
+  // The delegate is destroyed along with the WebContents and so should not be
+  // cached.
+  static ConditionalUiDelegateAndroid* GetConditionalUiDelegate(
+      content::WebContents* web_contents);
+
+ private:
+  std::vector<device::DiscoverableCredentialMetadata>
+      webauthn_account_suggestions_;
+
+  base::OnceCallback<void(const std::vector<uint8_t>& user_id)>
+      webauthn_account_selection_callback_;
+  base::OnceCallback<void(
+      const std::vector<device::DiscoverableCredentialMetadata>&)>
+      retrieve_credentials_callback_;
+};
+
+#endif  // CHROME_BROWSER_WEBAUTHN_ANDROID_CONDITIONAL_UI_DELEGATE_ANDROID_H_
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.h b/chrome/browser/webauthn/authenticator_request_dialog_model.h
index 85ca5196..75d05fb 100644
--- a/chrome/browser/webauthn/authenticator_request_dialog_model.h
+++ b/chrome/browser/webauthn/authenticator_request_dialog_model.h
@@ -14,6 +14,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
+#include "base/observer_list_types.h"
 #include "base/strings/string_piece.h"
 #include "base/types/strong_alias.h"
 #include "build/build_config.h"
@@ -124,7 +125,7 @@
 
   // Implemented by the dialog to observe this model and show the UI panels
   // appropriate for the current step.
-  class Observer {
+  class Observer : public base::CheckedObserver {
    public:
     // Called when the user clicks "Try Again" to restart the user flow.
     virtual void OnStartOver() {}
@@ -679,7 +680,7 @@
   // accepts the interstitial that requests to turn on the BLE adapter.
   base::OnceClosure after_ble_adapter_powered_;
 
-  base::ObserverList<Observer>::Unchecked observers_;
+  base::ObserverList<Observer> observers_;
 
   // This field is only filled out once the UX flow is started.
   TransportAvailabilityInfo transport_availability_;
diff --git a/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc b/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
index ef805112..dfabe28 100644
--- a/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
+++ b/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
@@ -854,11 +854,6 @@
   weak_dialog_model_->StartFlow(std::move(data), is_conditional_,
                                 last_used_native_api);
 
-  Browser* const browser = chrome::FindBrowserWithWebContents(web_contents);
-  if (browser) {
-    browser->window()->UpdatePageActionIcon(PageActionIconType::kWebAuthn);
-  }
-
   ShowAuthenticatorRequestDialog(web_contents,
                                  std::move(transient_dialog_model_holder_));
 
diff --git a/chrome/browser/webauthn/chrome_conditional_ui_delegate_android.h b/chrome/browser/webauthn/chrome_conditional_ui_delegate_android.h
deleted file mode 100644
index 4bb085c0..0000000
--- a/chrome/browser/webauthn/chrome_conditional_ui_delegate_android.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2022 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_WEBAUTHN_CHROME_CONDITIONAL_UI_DELEGATE_ANDROID_H_
-#define CHROME_BROWSER_WEBAUTHN_CHROME_CONDITIONAL_UI_DELEGATE_ANDROID_H_
-
-#include <vector>
-
-#include "base/callback.h"
-#include "base/supports_user_data.h"
-#include "content/public/browser/conditional_ui_delegate_android.h"
-
-namespace content {
-class WebContents;
-}
-
-namespace device {
-class DiscoverableCredentialMetadata;
-}
-
-// Chrome implementation of ConditionalUiDelegateAndroid.
-class ChromeConditionalUiDelegateAndroid
-    : public base::SupportsUserData::Data,
-      public content::ConditionalUiDelegateAndroid {
- public:
-  ChromeConditionalUiDelegateAndroid();
-
-  ChromeConditionalUiDelegateAndroid(
-      const ChromeConditionalUiDelegateAndroid&) = delete;
-  ChromeConditionalUiDelegateAndroid& operator=(
-      const ChromeConditionalUiDelegateAndroid&) = delete;
-
-  ~ChromeConditionalUiDelegateAndroid() override;
-
-  // content::ConditionalUiDelegateAndroid:
-  void OnWebAuthnRequestPending(
-      const std::vector<device::DiscoverableCredentialMetadata>& credentials,
-      base::OnceCallback<void(const std::vector<uint8_t>& id)> callback)
-      override;
-
-  // Tells the driver that the user has selected a Web Authentication
-  // credential from a dialog, and provides the credential ID for the selected
-  // credential.
-  void OnWebAuthnAccountSelected(const std::vector<uint8_t>& id);
-
-  // Retrieves a list of Web Authentication credentials that can be displayed
-  // as suggestions in an autofill dialog.
-  void RetrieveWebAuthnCredentials(
-      base::OnceCallback<
-          void(const std::vector<device::DiscoverableCredentialMetadata>&)>);
-
-  // Returns a delegate associated with the |web_contents|. It creates one if
-  // one does not already exist.
-  // The delegate is destroyed along with the WebContents and so should not be
-  // cached.
-  static ChromeConditionalUiDelegateAndroid* GetConditionalUiDelegate(
-      content::WebContents* web_contents);
-
- private:
-  std::vector<device::DiscoverableCredentialMetadata>
-      webauthn_account_suggestions_;
-
-  base::OnceCallback<void(const std::vector<uint8_t>& user_id)>
-      webauthn_account_selection_callback_;
-  base::OnceCallback<void(
-      const std::vector<device::DiscoverableCredentialMetadata>&)>
-      retrieve_credentials_callback_;
-};
-
-#endif  // CHROME_BROWSER_WEBAUTHN_CHROME_CONDITIONAL_UI_DELEGATE_ANDROID_H_
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 391cf8f..318ccbc 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1652680457-b0ca8e5380c1380d221a4dac9056209f2d49e67b.profdata
+chrome-linux-main-1652702167-677d8b203d11fff686ec5ea8279cf3379ca2f57c.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index da23d5b3..94007f10 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1652680457-69cdc3dded96405b89a19a99a53002844942255d.profdata
+chrome-mac-arm-main-1652702167-4e397215f4928d93b86e427406ec732020da17fc.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 4f1a4de..ca6540cf 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1652680457-bee6eda9ab1111e76f5b3530d7feed46e21d9b09.profdata
+chrome-mac-main-1652702167-da7b3405780a4163850db120f1163b85215abc4a.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 04dbb51..eb1d20aa 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1652691487-cbe161054c850bd0ce357d4bcd17c5e8ebf83ccf.profdata
+chrome-win32-main-1652713201-3e9d4c59eafa1943cf45a978d3a88e18d0823c88.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 6250b16..5119918 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1652691487-95b7c3bd84f1735a4c5b19b16d4883af78508977.profdata
+chrome-win64-main-1652713201-a9b32789759783f34d775be3b6af4d38a03bf3ff.profdata
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 83247d5..2d87624e 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -488,6 +488,10 @@
 // A boolean specifying whether the insights extension is enabled. If set to
 // true, the CCaaS Chrome component extension will be installed.
 const char kInsightsExtensionEnabled[] = "insights_extension_enabled";
+
+// Boolean controlling whether showing Sync Consent during sign-in is enabled.
+// Controlled by policy.
+const char kEnableSyncConsent[] = "sync_consent.enabled";
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -952,10 +956,6 @@
 // Last state of the screen time limit.
 const char kScreenTimeLastState[] = "screen_time.last_state";
 
-// Boolean controlling whether showing Sync Consent during sign-in is enabled.
-// Controlled by policy.
-const char kEnableSyncConsent[] = "sync_consent.enabled";
-
 // Boolean pref indicating whether a user is allowed to use the Network File
 // Shares for Chrome OS feature.
 const char kNetworkFileSharesAllowed[] = "network_file_shares.allowed";
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 48cce58..25c5036 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -210,6 +210,7 @@
 #if BUILDFLAG(IS_CHROMEOS)
 extern const char kAttestationExtensionAllowlist[];
 extern const char kPrintingAPIExtensionsAllowlist[];
+extern const char kEnableSyncConsent[];
 #endif
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 extern const char kTapToClickEnabled[];
@@ -319,7 +320,6 @@
 extern const char kTimeLimitLocalOverride[];
 extern const char kUsageTimeLimit[];
 extern const char kScreenTimeLastState[];
-extern const char kEnableSyncConsent[];
 extern const char kNetworkFileSharesAllowed[];
 extern const char kManagedSessionEnabled[];
 extern const char kManagedSessionUseFullLoginWarning[];
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index f4e9b8d..f2be509 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -2166,7 +2166,6 @@
       "../browser/ui/views/web_apps/protocol_handler_launch_dialog_browsertest.cc",
       "../browser/ui/views/web_apps/web_app_tab_strip_browsertest.cc",
       "../browser/ui/views/webauthn/authenticator_dialog_view_browsertest.cc",
-      "../browser/ui/views/webauthn/webauthn_icon_interactive_uitest.cc",
       "../browser/ui/views/webid/fake_delegate.cc",
       "../browser/ui/views/webid/fake_delegate.h",
       "../browser/ui/views/webid/fedcm_account_selection_view_desktop_browsertest.cc",
@@ -3299,6 +3298,8 @@
           "../browser/ui/views/select_file_dialog_extension_browsertest.cc",
         ]
         deps += [ "//ash/services/multidevice_setup/public/cpp:prefs" ]
+      } else {
+        sources += [ "../browser/ui/views/profiles/profile_customization_bubble_view_browsertest.cc" ]
       }
       if (!is_chromeos) {
         sources += [
@@ -3306,7 +3307,6 @@
           "../browser/ui/views/frame/opaque_browser_frame_view_browsertest.cc",
           "../browser/ui/views/policy/enterprise_startup_dialog_view_browsertest.cc",
           "../browser/ui/views/profiles/dice_web_signin_interception_bubble_view_browsertest.cc",
-          "../browser/ui/views/profiles/profile_customization_bubble_view_browsertest.cc",
           "../browser/ui/views/relaunch_notification/relaunch_recommended_bubble_view_browsertest.cc",
           "../browser/ui/views/relaunch_notification/relaunch_required_dialog_view_browsertest.cc",
           "../browser/ui/views/toolbar/outdated_upgrade_bubble_browsertest.cc",
@@ -4591,6 +4591,7 @@
       "../browser/ui/browser_navigator_browsertest.cc",
       "../browser/ui/browser_navigator_browsertest.h",
       "../browser/ui/browser_navigator_browsertest_chromeos.cc",
+      "../browser/ui/startup/lacros_first_run_service_browsertest.cc",
       "../browser/ui/views/location_bar/intent_chip_button_browsertest.cc",
       "../browser/ui/views/profiles/profile_picker_view_browsertest.cc",
       "../browser/ui/web_applications/share_to_target_browsertest.cc",
@@ -6043,7 +6044,6 @@
       "../browser/ui/passwords/account_storage_auth_helper_unittest.cc",
       "../browser/ui/startup/startup_browser_policy_unittest.cc",
       "../browser/ui/views/profiles/dice_web_signin_interception_bubble_view_unittest.cc",
-      "../browser/ui/views/profiles/profile_customization_bubble_sync_controller_unittest.cc",
       "../browser/ui/webui/signin/dice_web_signin_intercept_handler_unittest.cc",
     ]
   }
@@ -8398,6 +8398,7 @@
     }
     if (!is_chromeos_ash) {
       sources += [
+        "../browser/ui/views/profiles/profile_customization_bubble_sync_controller_unittest.cc",
         "../browser/ui/views/sync/one_click_signin_dialog_view_unittest.cc",
       ]
     }
diff --git a/chrome/test/base/OWNERS b/chrome/test/base/OWNERS
index 1b33b4f..e339a22 100644
--- a/chrome/test/base/OWNERS
+++ b/chrome/test/base/OWNERS
@@ -18,3 +18,5 @@
 per-file *tracing*=file://base/trace_event/OWNERS
 
 per-file interactive_test_utils_mac.mm=tapted@chromium.org
+
+per-file v8sh.py=file:v8/v8:main:/INFRA_OWNERS
diff --git a/chrome/test/base/js2gtest.gni b/chrome/test/base/js2gtest.gni
index b1d0863..2c5b7653 100644
--- a/chrome/test/base/js2gtest.gni
+++ b/chrome/test/base/js2gtest.gni
@@ -7,7 +7,7 @@
 
 # Libraries required to generate the custom test library built with js2gtest.
 # Changing the size or the order of files in this array also requires changing
-# src/tools/gypv8sh.py.
+# src/chrome/test/base/v8sh.py.
 js2gtest_js_input_libraries = [
   "//chrome/test/data/webui/test_api.js",
   "//chrome/test/base/js2gtest.js",
@@ -55,7 +55,7 @@
   action_foreach(action_name) {
     testonly = true
     visibility = [ ":$source_set_name" ]
-    script = "//tools/gypv8sh.py"
+    script = "//chrome/test/base/v8sh.py"
 
     sources = invoker.sources
 
diff --git a/chrome/test/base/js2gtest.js b/chrome/test/base/js2gtest.js
index 67aeb4d5..969fdad 100644
--- a/chrome/test/base/js2gtest.js
+++ b/chrome/test/base/js2gtest.js
@@ -9,13 +9,13 @@
  * @author scr@chromium.org (Sheridan Rawlins)
  * @see WebUI testing: http://goo.gl/ZWFXF
  * @see gtest documentation: http://goo.gl/Ujj3H
- * @see chrome/chrome_tests.gypi
+ * @see chrome/test/base/js2gtest.gni
  * @see chrome/test/base/js2gtest.js
- * @see tools/gypv8sh.py
+ * @see chrome/test/base/v8sh.py
  */
 
-// Arguments from rules in chrome_tests.gypi are passed in through
-// python script gypv8sh.py.
+// Arguments from the js2gtest template in chrome/test/base/js2gtest.gni
+// are passed in through python script v8sh.py.
 if (arguments.length != 6) {
   print(
       'usage: ' + arguments[0] +
diff --git a/tools/gypv8sh.py b/chrome/test/base/v8sh.py
similarity index 94%
rename from tools/gypv8sh.py
rename to chrome/test/base/v8sh.py
index 7658c64..7f46750 100755
--- a/tools/gypv8sh.py
+++ b/chrome/test/base/v8sh.py
@@ -3,8 +3,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-"""This script is used by chrome_tests.gypi's js2webui action to maintain the
-argument lists and to generate inlinable tests.
+"""Wrapper for using the V8 shell in js2gtest.gni's js2gtest template
+to maintain the argument lists and to generate inlinable tests.
 """
 
 from __future__ import print_function
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index af03716..22e9a3e 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -13377,7 +13377,8 @@
   },
   "EnableSyncConsent": {
     "os": [
-      "chromeos_ash"
+      "chromeos_ash",
+      "chromeos_lacros"
     ],
     "policy_pref_mapping_tests": [
       {
diff --git a/chrome/test/nacl/nacl_browsertest.cc b/chrome/test/nacl/nacl_browsertest.cc
index 123f082..6d4fb8f 100644
--- a/chrome/test/nacl/nacl_browsertest.cc
+++ b/chrome/test/nacl/nacl_browsertest.cc
@@ -43,7 +43,13 @@
 #  define MAYBE_SysconfNprocessorsOnln SysconfNprocessorsOnln
 #endif
 
-NACL_BROWSER_TEST_F(NaClBrowserTest, SimpleLoad, {
+// TODO(https://crbug.com/1059468): Flaky on Win7 (32).
+#if BUILDFLAG(IS_WIN) && defined(ARCH_CPU_32_BITS)
+#define MAYBE_SimpleLoad DISABLED_SimpleLoad
+#else
+#define MAYBE_SimpleLoad SimpleLoad
+#endif
+NACL_BROWSER_TEST_F(NaClBrowserTest, MAYBE_SimpleLoad, {
   RunLoadTest(FILE_PATH_LITERAL("nacl_load_test.html"));
 })
 
@@ -52,7 +58,7 @@
       "pm_exit_status_test.html?trigger=exit0&expected_exit=0"));
 })
 
-// TODO(1059468): Flaky on Win7 (32).
+// TODO(https://crbug.com/1059468): Flaky on Win7 (32).
 #if BUILDFLAG(IS_WIN) && defined(ARCH_CPU_32_BITS)
 #define MAYBE_ExitStatus254 DISABLED_ExitStatus254
 #else
@@ -68,7 +74,7 @@
       "pm_exit_status_test.html?trigger=exitneg2&expected_exit=254"));
 })
 
-// TODO(1059468): Flaky on Win7 (32).
+// TODO(https://crbug.com/1059468): Flaky on Win7 (32).
 #if defined(ADDRESS_SANITIZER) || \
     (BUILDFLAG(IS_WIN) && defined(ARCH_CPU_32_BITS))
 #define MAYBE_PPAPICore DISABLED_PPAPICore
@@ -79,7 +85,7 @@
   RunNaClIntegrationTest(FILE_PATH_LITERAL("ppapi_ppb_core.html"));
 })
 
-// TODO(1059468): Flaky on Win7 (32).
+// TODO(https://crbug.com/1059468): Flaky on Win7 (32).
 #if BUILDFLAG(IS_WIN) && defined(ARCH_CPU_32_BITS)
 #define MAYBE_PPAPIPPBInstance DISABLED_PPAPIPPBInstance
 #else
@@ -89,7 +95,7 @@
   RunNaClIntegrationTest(FILE_PATH_LITERAL("ppapi_ppb_instance.html"));
 })
 
-// TODO(1059468): Flaky on Win7 (32).
+// TODO(https://crbug.com/1059468): Flaky on Win7 (32).
 #if BUILDFLAG(IS_WIN) && defined(ARCH_CPU_32_BITS)
 #define MAYBE_PPAPIPPPInstance DISABLED_PPAPIPPPInstance
 #else
@@ -99,7 +105,7 @@
   RunNaClIntegrationTest(FILE_PATH_LITERAL("ppapi_ppp_instance.html"));
 })
 
-// TODO(1059468): Flaky on Win7 (32).
+// TODO(https://crbug.com/1059468): Flaky on Win7 (32).
 #if BUILDFLAG(IS_WIN) && defined(ARCH_CPU_32_BITS)
 #define MAYBE_ProgressEvents DISABLED_ProgressEvents
 #else
@@ -362,7 +368,7 @@
       "pnacl_debug_url.html?nmf_file=pnacl_no_debug.nmf"));
 }
 
-// TODO(1059468): Flaky on Win7 (32).
+// TODO(https://crbug.com/1059468): Flaky on Win7 (32).
 #if BUILDFLAG(IS_WIN) && defined(ARCH_CPU_32_BITS)
 #define MAYBE_PnaclDebugURLFlagOff DISABLED_PnaclDebugURLFlagOff
 #else
@@ -443,7 +449,7 @@
   RunLoadTest(FILE_PATH_LITERAL("pnacl_options.html?use_nmf=o_large"));
 }
 
-// TODO(1059468): Flaky on Win7 (32).
+// TODO(https://crbug.com/1059468): Flaky on Win7 (32).
 #if BUILDFLAG(IS_WIN) && defined(ARCH_CPU_32_BITS)
 #define MAYBE_PnaclDyncodeSyscallDisabled DISABLED_PnaclDyncodeSyscallDisabled
 #else
@@ -456,7 +462,7 @@
       "pnacl_dyncode_syscall_disabled.html"));
 }
 
-// TODO(1059468): Flaky on Win7 (32).
+// TODO(https://crbug.com/1059468): Flaky on Win7 (32).
 #if !BUILDFLAG(IS_WIN) || !defined(ARCH_CPU_32_BITS)
 IN_PROC_BROWSER_TEST_F(NaClBrowserTestPnacl,
                        MAYBE_PNACL(PnaclExceptionHandlingDisabled)) {
diff --git a/chromecast/browser/cast_extension_url_loader_factory.cc b/chromecast/browser/cast_extension_url_loader_factory.cc
index ce359a7..28fc068 100644
--- a/chromecast/browser/cast_extension_url_loader_factory.cc
+++ b/chromecast/browser/cast_extension_url_loader_factory.cc
@@ -150,11 +150,6 @@
     original_client_->OnTransferSizeUpdated(transfer_size_diff);
   }
 
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override {
-    original_client_->OnStartLoadingResponseBody(std::move(body));
-  }
-
   void OnComplete(const network::URLLoaderCompletionStatus& status) override {
     original_client_->OnComplete(status);
     delete this;
diff --git a/chromeos/assistant/.gitignore b/chromeos/assistant/.gitignore
new file mode 100644
index 0000000..eda5be6
--- /dev/null
+++ b/chromeos/assistant/.gitignore
@@ -0,0 +1 @@
+libassistant
diff --git a/chromeos/strings/chromeos_strings_az.xtb b/chromeos/strings/chromeos_strings_az.xtb
index 8de7c4b..e57aaa1 100644
--- a/chromeos/strings/chromeos_strings_az.xtb
+++ b/chromeos/strings/chromeos_strings_az.xtb
@@ -37,6 +37,7 @@
 <translation id="131421566576084655">Sonuncu data sıfırlama tarixi əlçatan deyil</translation>
 <translation id="1314565355471455267">Android VPN</translation>
 <translation id="131461803491198646">Ev şəbəkəsidir, rominq deyil</translation>
+<translation id="132712914231403017">Mikroproqram şəklini quraşdırın</translation>
 <translation id="1327977588028644528">Keçid</translation>
 <translation id="1328223165223065150">Divar kağızı rəngi</translation>
 <translation id="1330426557709298164">JPG</translation>
@@ -80,6 +81,7 @@
 <translation id="1641857168437328880">Sənəd Bəsləyici (Bir tərəfli)</translation>
 <translation id="1643449475550628585">Hər gün divar kağızı şəklini dəyişdirin</translation>
 <translation id="1644574205037202324">Tarixçə</translation>
+<translation id="1645954272419197032">Cihaz məlumatını təsdiqləyin</translation>
 <translation id="1662989795263954667">Dayanıb - Mürəkkəb yoxdur</translation>
 <translation id="1668469839109562275">Daxili VPN</translation>
 <translation id="1703835215927279855">Letter</translation>
@@ -118,6 +120,7 @@
 <translation id="2006864819935886708">Bağlantı</translation>
 <translation id="2008685064673031089">Əsas axtarış</translation>
 <translation id="2016697457005847575">Nasazlıqların aradan qaldırılması addımlarını sınayın</translation>
+<translation id="2016848882344942759">--ağ etiketsiz--</translation>
 <translation id="202500043506723828">EID</translation>
 <translation id="2080070583977670716">Digər ayarlar</translation>
 <translation id="2085089206770112532">Displey parlaqlığını azaldın</translation>
@@ -148,6 +151,7 @@
 <translation id="2271469253353559191">Qaranlıq rejim cədvəli</translation>
 <translation id="2275586345903859204">Təmir tamamlandı</translation>
 <translation id="2287186687001756809">Əlçatan şəkil yoxdur. Foto əlavə etmək üçün <ph name="LINK" /> ünvanına keçin</translation>
+<translation id="2294753434210277304">Endirilmiş Chromebook Bərpa Utilit şəkli ilə USB disk və ya SD kart kimi xarici yaddaşı daxil edin</translation>
 <translation id="2307344026739914387">Cari açar cütündən istifadə edin</translation>
 <translation id="2320295602967756579">İşıqlı temanı aktiv edin</translation>
 <translation id="2323506179655536734">ÖTÜRÜLÜB</translation>
@@ -188,6 +192,7 @@
 <translation id="2712812801627182647">TLS doğrulama açarı</translation>
 <translation id="2713444072780614174">Ağ</translation>
 <translation id="2717139507051041123">Tünd rəng rejimini aktiv edin</translation>
+<translation id="2727250716596204208">Mikroproqram şəklini tapmaq mümkün olmadı. Endirilmiş Chromebook Bərpa Utilit şəkli ilə USB disk və ya SD kart kimi xarici yaddaşı daxil edin.</translation>
 <translation id="2740531572673183784">Ok</translation>
 <translation id="2751739896257479635">EAP Faza 2 doğrulaması</translation>
 <translation id="2756652381241102009">Diaqnostikanı işə salın</translation>
@@ -219,6 +224,7 @@
 <translation id="3122464029669770682">CPU</translation>
 <translation id="3124039320086536031">Cihaz qoşulub.</translation>
 <translation id="3127341325625468058">{PAGE_NUMBER,plural, =0{Səhifə silinsin?}=1{{PAGE_NUMBER} saylı səhifə silinsin?}other{{PAGE_NUMBER} saylı səhifə silinsin?}}</translation>
+<translation id="3137983112374760826">Cihaz təmin edilir...</translation>
 <translation id="315116470104423982">Mobil data</translation>
 <translation id="3156846309055100599"><ph name="PAGE_NUMBER" /> saylı səhifə skanlanır...</translation>
 <translation id="315738237743207937">Avtorizasiya portalı aşkarlanıb</translation>
@@ -240,6 +246,7 @@
 <translation id="3340011300870565703">Sağ qulaqlığın batareya səviyyəsi: <ph name="BATTERY_PERCENTAGE" />%.</translation>
 <translation id="3368922792935385530">Qoşuludur</translation>
 <translation id="3369013195428705271">Bütün çap tarixçəsini silmək istədiyinizə əminsiniz? Davam edən çap işləriniz silinməyəcək.</translation>
+<translation id="3383751554789092165">Lazım olduqda cihaz məlumatlarını dəyişdirin.</translation>
 <translation id="3404249063913988450">Ekran qoruyucusunu aktiv edin</translation>
 <translation id="3404770484521709967">Komponentlər düzgün quraşdırılıb.</translation>
 <translation id="3413935475507503304">Güncəlləməyə keçmək üçün "Növbəti" seçiminə toxunun.</translation>
@@ -278,6 +285,7 @@
 <translation id="3748026146096797577">Qoşulmayıb</translation>
 <translation id="3749289110408117711">Fayl adı</translation>
 <translation id="3771294271822695279">Video Fayllar</translation>
+<translation id="3774059845329307709">Seriya nömrəsi</translation>
 <translation id="3784455785234192852">Kilidləyin</translation>
 <translation id="38114475217616659">Bütün tarixçəni silin</translation>
 <translation id="3820172043799983114">Yanlış PIN.</translation>
@@ -361,6 +369,7 @@
 <translation id="455835558791489930"><ph name="CHARGE_VALUE" />mAh Batareya</translation>
 <translation id="4561801978359312462">SIM Kilidi Açılıb</translation>
 <translation id="4562494484721939086">Xidmət yoxdur</translation>
+<translation id="4568938274596692027">Quraşdırma tamamlandı. Yenidən başladılmağa hazırlanır...</translation>
 <translation id="458794348635939462">Bütün hostları həll etmək alınmadı</translation>
 <translation id="4593212453765072419">Proksi doğrulama tələb olunur</translation>
 <translation id="4609350030397390689">Klaviatura parlaqlığını azaldın</translation>
@@ -403,6 +412,7 @@
 <translation id="4890353053343094602">Dərhal yenisini seçin</translation>
 <translation id="4891842000192098784">Gərginlik</translation>
 <translation id="4897058166682006107">Sol qulaqlığın batareya səviyyəsi: <ph name="BATTERY_PERCENTAGE" />%.</translation>
+<translation id="4908030561598728899">Mikroproqram quraşdırılır...</translation>
 <translation id="4915052247106771211">Cihazı zavod ayarlarına sıfırlanacaq (Powerwash).</translation>
 <translation id="4917385247580444890">Güclü</translation>
 <translation id="4917889632206600977">Dayanıb - Kağız yoxdur</translation>
@@ -614,8 +624,10 @@
 <translation id="6768237774506518020">DNS həllinin alınmama faizi yüksəkdir</translation>
 <translation id="680983167891198932">Açar</translation>
 <translation id="6816797338148849397">Seçiminizlə əlaqəli məlumat əlçatandır. Giriş üçün Yuxarı ox düyməsini istifadə edin.</translation>
+<translation id="6822504384524564824">SKU yalnız yeni komponent(lər) onların əvəz etdikləri komponentlərdən fərqli olduqda dəyişdirilməlidir. Məsələn, sensor olmayan ekranı əvəz edən sensor ekran və ya 8 GB-dan 16 GB-a yüksəldilən yaddaş.</translation>
 <translation id="6840315122969944400"><ph name="DEVICE_TYPE" /> təmiri</translation>
 <translation id="6853312040151791195">Deşarj faizi</translation>
+<translation id="6876833053687020046">DRAM hissə nömrəsi</translation>
 <translation id="6889786074662672253">Yenidən başlatma zamanı bu xarici cihazı ayırmayın və ya kompüterinizi söndürməyin. Bu pəncərəni kiçildə bilərsiniz. Bu, bir neçə dəqiqə çəkə bilər və xarici cihazınız bu müddət ərzində işləməyə bilər.</translation>
 <translation id="6905724422583748843"><ph name="PAGE_NAME" /> səhifəsinə qayıdın</translation>
 <translation id="6910312834584889076">Skanerin qapağı açıqdır. Qapağı bağlayıb yenidən sınayın.</translation>
@@ -663,6 +675,7 @@
 <translation id="7343649194310845056">Şəbəkə Cihazları</translation>
 <translation id="7359657277149375382">Fayl növü</translation>
 <translation id="7375053625150546623">EAP</translation>
+<translation id="7378553660733179982">SKU</translation>
 <translation id="7378886533986123738">Ekran qoruyucunu dəyişdirin</translation>
 <translation id="7397270852490618635">İşıqlı temanı deaktiv edin</translation>
 <translation id="741244894080940828">çevirmə</translation>
@@ -762,6 +775,7 @@
 <translation id="8364946094152050673">Boş ad serverləri</translation>
 <translation id="8372477600026034341">Əlavə hostlar</translation>
 <translation id="8378855320830505539">Region</translation>
+<translation id="8382302752385457774">Ağ etiket</translation>
 <translation id="8395584934117017006">Bu <ph name="DEVICE_TYPE" /> müəssisə tərəfindən idarə edilir</translation>
 <translation id="8398927464629426868">Cihazın hazırda şarj və ya deşarj olma sürəti</translation>
 <translation id="8422748173858722634">IMEI</translation>
diff --git a/chromeos/strings/chromeos_strings_fil.xtb b/chromeos/strings/chromeos_strings_fil.xtb
index 5a3192e..640a86f 100644
--- a/chromeos/strings/chromeos_strings_fil.xtb
+++ b/chromeos/strings/chromeos_strings_fil.xtb
@@ -37,6 +37,7 @@
 <translation id="131421566576084655">Hindi available ang petsa ng huling pag-reset ng data</translation>
 <translation id="1314565355471455267">Android VPN</translation>
 <translation id="131461803491198646">Home network, hindi roaming</translation>
+<translation id="132712914231403017">I-install ang larawan ng firmware</translation>
 <translation id="1327977588028644528">Gateway</translation>
 <translation id="1328223165223065150">Kulay ng wallpaper</translation>
 <translation id="1330426557709298164">JPG</translation>
@@ -80,6 +81,7 @@
 <translation id="1641857168437328880">Document Feeder (Isang bahagi)</translation>
 <translation id="1643449475550628585">Araw-araw na palitan ang larawan sa wallpaper</translation>
 <translation id="1644574205037202324">History</translation>
+<translation id="1645954272419197032">Pakikumpirma ang impormasyon ng device</translation>
 <translation id="1662989795263954667">Huminto - Wala nang ink</translation>
 <translation id="1668469839109562275">Built-in na VPN</translation>
 <translation id="1703835215927279855">Letter</translation>
@@ -118,6 +120,7 @@
 <translation id="2006864819935886708">Pagkakakonekta</translation>
 <translation id="2008685064673031089">Prime na paghahanap</translation>
 <translation id="2016697457005847575">Subukan ang mga hakbang sa pag-troubleshoot</translation>
+<translation id="2016848882344942759">--walang white-label--</translation>
 <translation id="202500043506723828">EID</translation>
 <translation id="2080070583977670716">Higit pang mga setting</translation>
 <translation id="2085089206770112532">Babaan ang liwanag ng display</translation>
@@ -148,6 +151,7 @@
 <translation id="2271469253353559191">Iskedyul ng dark mode</translation>
 <translation id="2275586345903859204">Kumpleto na ang pag-aayos</translation>
 <translation id="2287186687001756809">Walang available na larawan. Para magdagdag ng mga larawan, pumunta sa <ph name="LINK" /></translation>
+<translation id="2294753434210277304">Maglagay ng external storage, tulad ng USB drive o SD card, kasama ng na-download na larawan ng Chromebook Recovery Utility</translation>
 <translation id="2307344026739914387">Gamitin ang kasalukuyang keypair</translation>
 <translation id="2320295602967756579">I-enable ang maliwanag na tema</translation>
 <translation id="2323506179655536734">NILAKTAWAN</translation>
@@ -188,6 +192,7 @@
 <translation id="2712812801627182647">TLS authentication key</translation>
 <translation id="2713444072780614174">Puti</translation>
 <translation id="2717139507051041123">I-enable ang dark color mode</translation>
+<translation id="2727250716596204208">Hindi mahanap ang larawan ng firmware. Maglagay ng external storage, tulad ng USB drive o SD card, kasama ng na-download na larawan ng Chromebook Recovery Utility.</translation>
 <translation id="2740531572673183784">Ok</translation>
 <translation id="2751739896257479635">EAP Phase 2 na pag-authenticate</translation>
 <translation id="2756652381241102009">Patakbuhin ang Diagnostics</translation>
@@ -219,6 +224,7 @@
 <translation id="3122464029669770682">CPU</translation>
 <translation id="3124039320086536031">Nakakonekta ang device.</translation>
 <translation id="3127341325625468058">{PAGE_NUMBER,plural, =0{Alisin ang page?}=1{Alisin ang page {PAGE_NUMBER}?}one{Alisin ang page {PAGE_NUMBER}?}other{Alisin ang page {PAGE_NUMBER}?}}</translation>
+<translation id="3137983112374760826">Pino-provision ang device...</translation>
 <translation id="315116470104423982">Data sa mobile</translation>
 <translation id="3156846309055100599">Sina-scan ang page <ph name="PAGE_NUMBER" />...</translation>
 <translation id="315738237743207937">May na-detect na captive portal</translation>
@@ -240,6 +246,7 @@
 <translation id="3340011300870565703">May <ph name="BATTERY_PERCENTAGE" />% baterya ang kanang bud ng device.</translation>
 <translation id="3368922792935385530">Nakakonekta</translation>
 <translation id="3369013195428705271">Sigurado ka bang gusto mong i-clear ang lahat ng history ng pag-print? Hindi maki-clear ang iyong mga kasalukuyang pag-print.</translation>
+<translation id="3383751554789092165">Baguhin ang impormasyon ng device kung kinakailangan.</translation>
 <translation id="3404249063913988450">I-enable ang screen saver</translation>
 <translation id="3404770484521709967">Na-install nang tama ang mga bahagi.</translation>
 <translation id="3413935475507503304">Para magpatuloy sa update, i-click ang Susunod.</translation>
@@ -278,6 +285,7 @@
 <translation id="3748026146096797577">Hindi Nakakonekta</translation>
 <translation id="3749289110408117711">File name</translation>
 <translation id="3771294271822695279">Mga Video File</translation>
+<translation id="3774059845329307709">Serial number</translation>
 <translation id="3784455785234192852">I-lock</translation>
 <translation id="38114475217616659">I-clear ang lahat ng history</translation>
 <translation id="3820172043799983114">Di-wasto ang PIN.</translation>
@@ -361,6 +369,7 @@
 <translation id="455835558791489930"><ph name="CHARGE_VALUE" />mAh ba Baterya</translation>
 <translation id="4561801978359312462">Na-unlock ang SIM</translation>
 <translation id="4562494484721939086">Walang serbisyo</translation>
+<translation id="4568938274596692027">Tapos na ang pag-install. Naghahandang mag-restart...</translation>
 <translation id="458794348635939462">Hindi nalutas ang lahat ng host</translation>
 <translation id="4593212453765072419">Kinakailangan ang pagpapatunay ng proxy</translation>
 <translation id="4609350030397390689">Babaan ang liwanag ng keyboard</translation>
@@ -403,6 +412,7 @@
 <translation id="4890353053343094602">Pumili agad ng bago</translation>
 <translation id="4891842000192098784">Stress</translation>
 <translation id="4897058166682006107">May <ph name="BATTERY_PERCENTAGE" />% baterya ang kaliwang bud ng device.</translation>
+<translation id="4908030561598728899">Ini-install ang firmware...</translation>
 <translation id="4915052247106771211">Ire-reset nito ang device sa mga factory setting</translation>
 <translation id="4917385247580444890">Malakas</translation>
 <translation id="4917889632206600977">Huminto - Wala nang papel</translation>
@@ -615,8 +625,10 @@
 <translation id="6768237774506518020">Mataas na rate ng hindi naisagawang pagresolba sa DNS</translation>
 <translation id="680983167891198932">Key</translation>
 <translation id="6816797338148849397">Available ang impormasyong nauugnay sa iyong pinili. Gamitin ang Pataas na arrow key para ma-access.</translation>
+<translation id="6822504384524564824">Dapat lang baguhin ang SKU kung naiib ang (mga) bagong bahagi sa mga bahaging papalitan ng mga ito. Halimbawa, isang touchscreen na papalitan ang hindi touchscreen, o memory na ia-upgrade sa 16GB mula 8GB.</translation>
 <translation id="6840315122969944400">Pag-aayos ng <ph name="DEVICE_TYPE" /></translation>
 <translation id="6853312040151791195">Rate ng Pag-discharge</translation>
+<translation id="6876833053687020046">Numero ng bahagi ng DRAM</translation>
 <translation id="6889786074662672253">Habang nagre-restart, huwag alisin sa pagkakasaksak ang external device na ito o i-shut down ang iyong computer. Puwede mong i-minimize ang window na ito. Posible itong abutin nang ilang minuto at posibleng hindi gumana ang iyong external device sa panahong ito.</translation>
 <translation id="6905724422583748843">Bumalik sa <ph name="PAGE_NAME" /></translation>
 <translation id="6910312834584889076">Nakabukas ang takip ng scanner. Isara ang takip at subukan ulit.</translation>
@@ -664,6 +676,7 @@
 <translation id="7343649194310845056">Mga Device sa Network</translation>
 <translation id="7359657277149375382">Uri ng file</translation>
 <translation id="7375053625150546623">EAP</translation>
+<translation id="7378553660733179982">SKU</translation>
 <translation id="7378886533986123738">Palitan ang screensaver</translation>
 <translation id="7397270852490618635">I-off ang maliwanag na tema</translation>
 <translation id="741244894080940828">conversion</translation>
@@ -763,6 +776,7 @@
 <translation id="8364946094152050673">Mga walang lamang name server</translation>
 <translation id="8372477600026034341">Mga karagdagang host</translation>
 <translation id="8378855320830505539">Rehiyon</translation>
+<translation id="8382302752385457774">White-label</translation>
 <translation id="8395584934117017006">Pinapamahalaan ng enterprise ang <ph name="DEVICE_TYPE" /> na ito</translation>
 <translation id="8398927464629426868">Ang rate ng kasalukuyang pag-charge o pag-discharge ng device</translation>
 <translation id="8422748173858722634">IMEI</translation>
diff --git a/chromeos/strings/chromeos_strings_ka.xtb b/chromeos/strings/chromeos_strings_ka.xtb
index f9ed0b0..47de797 100644
--- a/chromeos/strings/chromeos_strings_ka.xtb
+++ b/chromeos/strings/chromeos_strings_ka.xtb
@@ -37,6 +37,7 @@
 <translation id="131421566576084655">მონაცემთა ბოლო გადაყენების თარიღი მიუწვდომელია</translation>
 <translation id="1314565355471455267">Android VPN</translation>
 <translation id="131461803491198646">სახლის ქსელი, როუმინგის გარეშე</translation>
+<translation id="132712914231403017">დააინსტალირეთ ჩაშენებული პროგრამული უზრუნველყოფის იმიჯი</translation>
 <translation id="1327977588028644528">შლიუზი</translation>
 <translation id="1328223165223065150">ფონის ფერი</translation>
 <translation id="1330426557709298164">JPG</translation>
@@ -80,6 +81,7 @@
 <translation id="1641857168437328880">დოკუმენტების მიმწოდი (ცალმხრივი)</translation>
 <translation id="1643449475550628585">ფონის სურათის ყოველდღიურად შეცვლა</translation>
 <translation id="1644574205037202324">ისტორია</translation>
+<translation id="1645954272419197032">დაადასტურეთ მოწყობილობის ინფორმაცია</translation>
 <translation id="1662989795263954667">გაჩერდა — მელანი გათავდა</translation>
 <translation id="1668469839109562275">ჩაშენებული VPN</translation>
 <translation id="1703835215927279855">Letter</translation>
@@ -118,6 +120,7 @@
 <translation id="2006864819935886708">კავშირი</translation>
 <translation id="2008685064673031089">Prime Search</translation>
 <translation id="2016697457005847575">გამოცადეთ დეფექტების აღმოფხვრის საფეხურები</translation>
+<translation id="2016848882344942759">--თეთრი ეტიკეტის გარეშე--</translation>
 <translation id="202500043506723828">EID</translation>
 <translation id="2080070583977670716">დამატებითი პარამეტრები</translation>
 <translation id="2085089206770112532">ეკრანის სიკაშკაშის დაკლება</translation>
@@ -148,6 +151,7 @@
 <translation id="2271469253353559191">მუქი რეჟიმის განრიგი</translation>
 <translation id="2275586345903859204">შეკეთება დასრულდა</translation>
 <translation id="2287186687001756809">სურათი მიუწვდომელია. ფოტოების დასამატებლად გადადით აქ: <ph name="LINK" /></translation>
+<translation id="2294753434210277304">მიაერთეთ გარე მეხსიერება (მაგ., USB დისკი ან SD ბარათი), რომელზეც ჩამოტვირთულია Chromebook-ის აღდგენის ხელსაწყოს იმიჯი</translation>
 <translation id="2307344026739914387">ამჟამინდელი წყვილის გამოყენება</translation>
 <translation id="2320295602967756579">ღია თემის ჩართვა</translation>
 <translation id="2323506179655536734">გამოტოვებულია</translation>
@@ -188,6 +192,7 @@
 <translation id="2712812801627182647">TLS ავტორიზაციის გასაღები</translation>
 <translation id="2713444072780614174">თეთრი</translation>
 <translation id="2717139507051041123">მუქი ფერის რეჟიმის ჩართვა</translation>
+<translation id="2727250716596204208">ჩაშენებული პროგრამული უზრუნველყოფის იმიჯი ვერ მოიძებნა. მიაერთეთ გარე მეხსიერება (მაგ., USB დისკი ან SD ბარათი), რომელზეც ჩამოტვირთულია Chromebook-ის აღდგენის ხელსაწყოს იმიჯი.</translation>
 <translation id="2740531572673183784">კარგი</translation>
 <translation id="2751739896257479635">EAP ავტორიზაციის მე-2 ფაზა</translation>
 <translation id="2756652381241102009">დიაგნოსტიკის გაშვება</translation>
@@ -219,6 +224,7 @@
 <translation id="3122464029669770682">CPU</translation>
 <translation id="3124039320086536031">მოწყობილობა დაკავშირებულია.</translation>
 <translation id="3127341325625468058">{PAGE_NUMBER,plural, =0{გსურთ გვერდის ამოშლა?}=1{გსურთ გვერდი {PAGE_NUMBER}-ის ამოშლა?}other{გსურთ გვერდი {PAGE_NUMBER}-ის ამოშლა?}}</translation>
+<translation id="3137983112374760826">მიმდინარეობს მოწყობილობის უზრუნველყოფა...</translation>
 <translation id="315116470104423982">მობილური მონაცემები</translation>
 <translation id="3156846309055100599">სკანირდება გვერდი <ph name="PAGE_NUMBER" />...</translation>
 <translation id="315738237743207937">აღმოჩენილია ავტორიზაციის პორტალი</translation>
@@ -240,6 +246,7 @@
 <translation id="3340011300870565703">მოწყობილობის მარჯვენა ყურსაცვამის ბატარეის დონეა <ph name="BATTERY_PERCENTAGE" />%.</translation>
 <translation id="3368922792935385530">დაკავშირებული</translation>
 <translation id="3369013195428705271">ნამდვილად გსურთ ბეჭდვის ისტორიის მთლიანად გასუფთავება? ბეჭდვის მიმდინარე დავალებები არ წაიშლება.</translation>
+<translation id="3383751554789092165">საჭიროებისამებრ შეცვალეთ მოწყობილობის ინფორმაცია.</translation>
 <translation id="3404249063913988450">ეკრანმზოგის ჩართვა</translation>
 <translation id="3404770484521709967">კომპონენტები სწორად დაინსტალირდა.</translation>
 <translation id="3413935475507503304">განახლების გასაგრძელებლად დაწკაპუნებით აირჩიეთ „შემდეგი“.</translation>
@@ -278,6 +285,7 @@
 <translation id="3748026146096797577">არ არის დაკავშირებული</translation>
 <translation id="3749289110408117711">ფაილის სახელი</translation>
 <translation id="3771294271822695279">ვიდეო ფაილები</translation>
+<translation id="3774059845329307709">სერიული ნომერი</translation>
 <translation id="3784455785234192852">დაბლოკვა</translation>
 <translation id="38114475217616659">მთელი ისტორიის გასუფთავება</translation>
 <translation id="3820172043799983114">PIN-კოდი არასწორია.</translation>
@@ -361,6 +369,7 @@
 <translation id="455835558791489930"><ph name="CHARGE_VALUE" /> მა·სთ-იანი ბატარეა</translation>
 <translation id="4561801978359312462">SIM-ბარათი განბლოკილია</translation>
 <translation id="4562494484721939086">მომსახურება არ არის</translation>
+<translation id="4568938274596692027">ინსტალაცია დასრულდა. მიმდინარეობს გადატვირთვისთვის მომზადება...</translation>
 <translation id="458794348635939462">ჰოსტების გარდაქმნა ვერ მოხერხდა</translation>
 <translation id="4593212453765072419">საჭიროა პროქსი-სერვერის ავტორიზაცია</translation>
 <translation id="4609350030397390689">კლავიატურის სიკაშკაშის დაკლება</translation>
@@ -403,6 +412,7 @@
 <translation id="4890353053343094602">დაუყოვნებლივ აირჩიეთ ახალი</translation>
 <translation id="4891842000192098784">სტრესი</translation>
 <translation id="4897058166682006107">მოწყობილობის მარცხენა ყურსაცვამის ბატარეის დონეა <ph name="BATTERY_PERCENTAGE" />%.</translation>
+<translation id="4908030561598728899">მიმდინარეობს ჩაშენებული პროგრამული უზრუნველყოფის ინსტალაცია...</translation>
 <translation id="4915052247106771211">ეს მოქმედება დააბრუნებს მოწყობილობას ქარხნული პარამეტრებზე (შესრულდება Powerwash).</translation>
 <translation id="4917385247580444890">ძლიერი</translation>
 <translation id="4917889632206600977">გაჩერდა — ქაღალდი გათავდა</translation>
@@ -615,8 +625,10 @@
 <translation id="6768237774506518020">DNS-ის წარუმატებელი დარეგულირებების მაჩვენებელი მაღალია</translation>
 <translation id="680983167891198932">გასაღები</translation>
 <translation id="6816797338148849397">ხელმისაწვდომია თქვენს არჩევანთან დაკავშირებული ინფორმაცია. წვდომისთვის გამოიყენეთ კლავიში ზემოთ მიმართული ისრით.</translation>
+<translation id="6822504384524564824">SKU უნდა შეიცვალოს მხოლოდ იმ შემთხვევაში, თუ ახალი კომპონენტ(ებ)ი განსხვავდება ჩანაცვლებულებისგან. მაგალითად, თუ არასენსორული ეკრანი ჩანაცვლდა სენსორული ეკრანით, ან მეხსიერება გაუმჯობესდა 8 გბატიდან 16 გბაიტამდე.</translation>
 <translation id="6840315122969944400"><ph name="DEVICE_TYPE" />-ის აღდგენა</translation>
 <translation id="6853312040151791195">განმუხტვის სიჩქარე</translation>
+<translation id="6876833053687020046">DRAM ნაწილის ნომერი</translation>
 <translation id="6889786074662672253">გადატვირთვის პროცესში არ გამოაერთოთ ეს გარე მოწყობილობა და არც კომპიუტერი გამორთოთ. შეგიძლიათ ამ ფანჯრის ჩაკეცვა. პროცესის დასრულებას შეიძლება რამდენიმე წუთი დასჭირდეს, რა დროსაც გარე მოწყობილობამ შეიძლება არ იმუშაოს.</translation>
 <translation id="6905724422583748843"><ph name="PAGE_NAME" />-ზე დაბრუნება</translation>
 <translation id="6910312834584889076">სკანერის თავსახური გახსნილია. დააფარეთ თავსახური და ცადეთ ხელახლა.</translation>
@@ -664,6 +676,7 @@
 <translation id="7343649194310845056">ქსელური მოწყობილობები</translation>
 <translation id="7359657277149375382">ფაილის ტიპი</translation>
 <translation id="7375053625150546623">EAP</translation>
+<translation id="7378553660733179982">SKU</translation>
 <translation id="7378886533986123738">ეკრანმზოგის შეცვლა</translation>
 <translation id="7397270852490618635">ღია თემის გამორთვა</translation>
 <translation id="741244894080940828">გარდაქმნა</translation>
@@ -763,6 +776,7 @@
 <translation id="8364946094152050673">სახელის ცარიელი სერვერები</translation>
 <translation id="8372477600026034341">დამატებითი ჰოსტები</translation>
 <translation id="8378855320830505539">რეგიონი</translation>
+<translation id="8382302752385457774">თეთრი ეტიკეტი</translation>
 <translation id="8395584934117017006">ეს <ph name="DEVICE_TYPE" /> მართულია ორგანიზაციის მიერ</translation>
 <translation id="8398927464629426868">სიხშირე, რომლითაც მოწყობილობა ამჟამად იტენება ან იცლება</translation>
 <translation id="8422748173858722634">IMEI</translation>
diff --git a/chromeos/strings/chromeos_strings_ky.xtb b/chromeos/strings/chromeos_strings_ky.xtb
index 15b4e24..27d95509 100644
--- a/chromeos/strings/chromeos_strings_ky.xtb
+++ b/chromeos/strings/chromeos_strings_ky.xtb
@@ -37,6 +37,7 @@
 <translation id="131421566576084655">Трафиктин колдонулушу жөнүндө маалымат акыркы жолу качан баштапкы абалга келтирилгени белгисиз</translation>
 <translation id="1314565355471455267">Android VPN</translation>
 <translation id="131461803491198646">Үй тармагы, роуминг жок</translation>
+<translation id="132712914231403017">Орнотулган программанын сүрөтүн орнотуу</translation>
 <translation id="1327977588028644528">Шлюз</translation>
 <translation id="1328223165223065150">Тушкагаздын түсү</translation>
 <translation id="1330426557709298164">JPG</translation>
@@ -80,6 +81,7 @@
 <translation id="1641857168437328880">Документтерди берүүчү түзмөк (бир тараптуу)</translation>
 <translation id="1643449475550628585">Тушкагаздын сүрөтүн күн сайын өзгөртүү</translation>
 <translation id="1644574205037202324">Таржымал</translation>
+<translation id="1645954272419197032">Түзмөк тууралуу маалыматты ырастаңыз</translation>
 <translation id="1662989795263954667">Токтоду – Сыя түгөнүп калды</translation>
 <translation id="1668469839109562275">Камтылган VPN</translation>
 <translation id="1703835215927279855">Letter</translation>
@@ -118,6 +120,7 @@
 <translation id="2006864819935886708">Байланыш</translation>
 <translation id="2008685064673031089">Баштапкы издөө</translation>
 <translation id="2016697457005847575">Бузулууларды аныктап оңдоо кадамдарын аткарып көрүңүз</translation>
+<translation id="2016848882344942759">--ак энбелги жок--</translation>
 <translation id="202500043506723828">EID</translation>
 <translation id="2080070583977670716">Дагы параметрлер</translation>
 <translation id="2085089206770112532">Дисплейдин жарыктыгын азайтуу</translation>
@@ -148,6 +151,7 @@
 <translation id="2271469253353559191">Караңгы теманын графиги</translation>
 <translation id="2275586345903859204">Оңдолду</translation>
 <translation id="2287186687001756809">Сүрөт жок. Сүрөттөрдү кошуу үчүн төмөнкү жерге өтүңүз: <ph name="LINK" /></translation>
+<translation id="2294753434210277304">Chromebook калыбына келтирүү каражатынын сүрөтү жүктөлүп алынган USB диск же SD карта сыяктуу тышкы сактагычты киргизиңиз</translation>
 <translation id="2307344026739914387">Учурдагы жуп ачкычты колдонуу</translation>
 <translation id="2320295602967756579">Жарык теманы иштетүү</translation>
 <translation id="2323506179655536734">ӨТКӨРҮЛҮП ЖИБЕРИЛДИ</translation>
@@ -188,6 +192,7 @@
 <translation id="2712812801627182647">TLS аутентификация ачкычы</translation>
 <translation id="2713444072780614174">Ак</translation>
 <translation id="2717139507051041123">Караңгы түс режимин иштетүү</translation>
+<translation id="2727250716596204208">Орнотулган программанын сүрөтү табылган жок. Chromebook калыбына келтирүү каражатынын сүрөтү жүктөлүп алынган USB диск же SD карта сыяктуу тышкы сактагычты киргизиңиз.</translation>
 <translation id="2740531572673183784">Ok</translation>
 <translation id="2751739896257479635">EAP 2-фазадагы аныктыгын текшерүү</translation>
 <translation id="2756652381241102009">Мүчүлүштүктөрдү аныктоо</translation>
@@ -219,6 +224,7 @@
 <translation id="3122464029669770682">CPU</translation>
 <translation id="3124039320086536031">Түзмөк туташты.</translation>
 <translation id="3127341325625468058">{PAGE_NUMBER,plural, =0{Барак өчүрүлсүнбү?}=1{{PAGE_NUMBER} барак өчүрүлсүнбү?}other{{PAGE_NUMBER} барак өчүрүлсүнбү?}}</translation>
+<translation id="3137983112374760826">Түзмөк даярдалууда…</translation>
 <translation id="315116470104423982">Мобилдик Интернет</translation>
 <translation id="3156846309055100599"><ph name="PAGE_NUMBER" />-бет скандалууда...</translation>
 <translation id="315738237743207937">Кирүү бети аныкталды</translation>
@@ -240,6 +246,7 @@
 <translation id="3340011300870565703">Түзмөктүн оң кулакчынынын батареясынын деңгээли: <ph name="BATTERY_PERCENTAGE" />%.</translation>
 <translation id="3368922792935385530">Туташты</translation>
 <translation id="3369013195428705271">Басып чыгаруу тарыхын өчүрөсүзбү? Учурда басылып жаткан документтериңиз өчүрүлбөйт.</translation>
+<translation id="3383751554789092165">Зарыл болгондо түзмөк тууралуу маалыматты өзгөртүңүз.</translation>
 <translation id="3404249063913988450">Көшөгөнү иштетүү</translation>
 <translation id="3404770484521709967">Курамдык бөлүктөр туура орнотулду.</translation>
 <translation id="3413935475507503304">Жаңыртуу үчүн "Кийинки" баскычын басыңыз.</translation>
@@ -278,6 +285,7 @@
 <translation id="3748026146096797577">Интернет жок</translation>
 <translation id="3749289110408117711">Файлдын аталышы</translation>
 <translation id="3771294271822695279">Видео файлдар</translation>
+<translation id="3774059845329307709">Сериялык номер</translation>
 <translation id="3784455785234192852">Кулпулоо</translation>
 <translation id="38114475217616659">Таржымалды толук тазалоо</translation>
 <translation id="3820172043799983114">PIN код жараксыз.</translation>
@@ -361,6 +369,7 @@
 <translation id="455835558791489930">Батареянын кубатынын көлөмү – <ph name="CHARGE_VALUE" />мА/с.</translation>
 <translation id="4561801978359312462">SIM картанын кулпусу ачылды</translation>
 <translation id="4562494484721939086">Тейленбейт</translation>
+<translation id="4568938274596692027">Орнотулуп бүттү. Өчүрүп-күйгүзүүгө даярдалууда…</translation>
 <translation id="458794348635939462">Бардык башкы түйүндөр чечилген жок</translation>
 <translation id="4593212453765072419">Проксиде аныктыгын текшерүү талап кылынат</translation>
 <translation id="4609350030397390689">Баскычтоптун жарыктыгын азайтуу</translation>
@@ -403,6 +412,7 @@
 <translation id="4890353053343094602">Дароо жаңы сырсөз тандаңыз</translation>
 <translation id="4891842000192098784">Стресс</translation>
 <translation id="4897058166682006107">Түзмөктүн сол кулакчынынын батареясынын деңгээли: <ph name="BATTERY_PERCENTAGE" />%.</translation>
+<translation id="4908030561598728899">Программа орнотулууда…</translation>
 <translation id="4915052247106771211">Ушуну менен түзмөк демейки жөндөөлөргө кайтарылат (Жууп салуу).</translation>
 <translation id="4917385247580444890">Күчтүү</translation>
 <translation id="4917889632206600977">Токтоду – Кагаз түгөнүп калды</translation>
@@ -615,8 +625,10 @@
 <translation id="6768237774506518020">DNS резолюциясынын бузулуу деңгээли жогору</translation>
 <translation id="680983167891198932">Ачкыч</translation>
 <translation id="6816797338148849397">Сиз тандаган нерсеге тиешелүү маалымат бар. Көрүү үчүн Өйдө жебе баскычын басыңыз.</translation>
+<translation id="6822504384524564824">SKU'ну жаңы компонент(тер) алмаштырылгандардан айырмаланса гана өзгөртүүгө болот. Мисалы, сенсордук экранды башкача экрандын ордуна колдонуу же эстутумду 8 Гбтан 16 Гбка жаңыртуу.</translation>
 <translation id="6840315122969944400"><ph name="DEVICE_TYPE" /> түзмөгүн оңдоо</translation>
 <translation id="6853312040151791195">Батареянын кубатынын түгөнүү көрсөткүчү</translation>
+<translation id="6876833053687020046">DRAM бөлүгүнүн номери</translation>
 <translation id="6889786074662672253">Өчүрүп күйгүзүп жатканда тышкы түзмөктү ажыратпаңыз же компьютерди өчүрбөңүз. Бул терезени кичирейтип койсоңуз болот. Бул бир нече мүнөткө созулуп, ал эми тышкы түзмөгүңүз бул убакытта иштебеши мүмкүн.</translation>
 <translation id="6905724422583748843">Төмөнкүгө кайтуу: <ph name="PAGE_NAME" /></translation>
 <translation id="6910312834584889076">Сканердин капкагы ачык. Капкагын жаап, кайра аракет кылыңыз.</translation>
@@ -664,6 +676,7 @@
 <translation id="7343649194310845056">Тармак түзмөктөрү</translation>
 <translation id="7359657277149375382">Файлдын түрү</translation>
 <translation id="7375053625150546623">EAP</translation>
+<translation id="7378553660733179982">SKU</translation>
 <translation id="7378886533986123738">Көшөгөнү өзгөртүү</translation>
 <translation id="7397270852490618635">Жарык теманы өчүрүү</translation>
 <translation id="741244894080940828">которуу</translation>
@@ -763,6 +776,7 @@
 <translation id="8364946094152050673">Ысым серверлери бош</translation>
 <translation id="8372477600026034341">Кошумча башкы түйүндөр</translation>
 <translation id="8378855320830505539">Аймак</translation>
+<translation id="8382302752385457774">Ак энбелги</translation>
 <translation id="8395584934117017006">Бул <ph name="DEVICE_TYPE" /> түзмөгүн ишкана башкарат</translation>
 <translation id="8398927464629426868">Түзмөк кубатталган же кубатталышы токтотулган деңгээл</translation>
 <translation id="8422748173858722634">IMEI</translation>
diff --git a/chromeos/strings/chromeos_strings_mn.xtb b/chromeos/strings/chromeos_strings_mn.xtb
index fdd9221..5f8610c7 100644
--- a/chromeos/strings/chromeos_strings_mn.xtb
+++ b/chromeos/strings/chromeos_strings_mn.xtb
@@ -32,6 +32,7 @@
 <translation id="1270369111467284986">Дамжих портал гэж таамагласан</translation>
 <translation id="1290331692326790741">Муу дохио</translation>
 <translation id="1301069673413256657">GSM</translation>
+<translation id="1308067967278144752">Бичихээс хамгаалахыг асаах</translation>
 <translation id="1308754910631152188">Шинэчилж байна (<ph name="PERCENTAGE_VALUE" />% дууссан)</translation>
 <translation id="1310380015393971138">Боломжтой <ph name="NETWORK_NAME" /> сүлжээ байхгүй байна</translation>
 <translation id="131421566576084655">Сүүлийн дата шинэчлэлтийн огноо боломжгүй байна</translation>
@@ -442,6 +443,7 @@
 <translation id="5166918508782100047">Шуурхай хариултын тохиргоо</translation>
 <translation id="5168185087976003268">Батарей барилт</translation>
 <translation id="5170568018924773124">Хавтсанд харуул</translation>
+<translation id="5179530508336824319">Дараагийн дэлгэц рүү үргэлжлүүлэхийн тулд бичихээс хамгаалахыг идэвхжүүлнэ үү. Төхөөрөмжийн үйлдвэрлэгчийн тусламжийн хуудас руу очиж, зааварчилгааг авна уу.</translation>
 <translation id="5190187232518914472">Дуртай дурсамжуудаа сэргээгээрэй. Цомог нэмэх эсвэл засахын тулд <ph name="LINK_BEGIN" />Google Зураг<ph name="LINK_END" /> руу очно уу.</translation>
 <translation id="5212543919916444558">Би таны дэлгэцээс туслах боломжтой зүйл олсонгүй.
 Асуух зүйл байвал микрофоныг товшиж үзнэ үү.</translation>
diff --git a/chromeos/strings/chromeos_strings_ro.xtb b/chromeos/strings/chromeos_strings_ro.xtb
index 96cab94..ad07744e 100644
--- a/chromeos/strings/chromeos_strings_ro.xtb
+++ b/chromeos/strings/chromeos_strings_ro.xtb
@@ -37,6 +37,7 @@
 <translation id="131421566576084655">Data ultimei resetări a datelor nu este disponibilă</translation>
 <translation id="1314565355471455267">VPN Android</translation>
 <translation id="131461803491198646">Rețeaua de domiciliu, nu de roaming</translation>
+<translation id="132712914231403017">Instalează imaginea de firmware</translation>
 <translation id="1327977588028644528">Gateway</translation>
 <translation id="1328223165223065150">Culoarea imaginii de fundal</translation>
 <translation id="1330426557709298164">JPG</translation>
@@ -80,6 +81,7 @@
 <translation id="1641857168437328880">Alimentator de documente (o singură față)</translation>
 <translation id="1643449475550628585">Schimbă zilnic imaginea de fundal</translation>
 <translation id="1644574205037202324">Istoric</translation>
+<translation id="1645954272419197032">Confirmă informațiile dispozitivului</translation>
 <translation id="1662989795263954667">Oprită – Cerneală epuizată</translation>
 <translation id="1668469839109562275">Rețea VPN încorporată</translation>
 <translation id="1703835215927279855">Letter</translation>
@@ -118,6 +120,7 @@
 <translation id="2006864819935886708">Conectivitate</translation>
 <translation id="2008685064673031089">Căutare de numere prime</translation>
 <translation id="2016697457005847575">Încearcă pașii pentru remedierea erorilor</translation>
+<translation id="2016848882344942759">--fără etichetă albă--</translation>
 <translation id="202500043506723828">EID</translation>
 <translation id="2080070583977670716">Mai multe setări</translation>
 <translation id="2085089206770112532">Reducerea luminozității ecranului</translation>
@@ -148,6 +151,7 @@
 <translation id="2271469253353559191">Programul modului întunecat</translation>
 <translation id="2275586345903859204">Reparația s-a finalizat</translation>
 <translation id="2287186687001756809">Nicio imagine disponibilă. Pentru a adăuga fotografii, accesează <ph name="LINK" /></translation>
+<translation id="2294753434210277304">Introdu un dispozitiv de stocare externă, cum ar fi o unitate USB sau un card SD, cu imaginea Utilitar de recuperare Chromebook descărcată</translation>
 <translation id="2307344026739914387">Folosește perechea de chei actuală</translation>
 <translation id="2320295602967756579">Activează tema luminoasă</translation>
 <translation id="2323506179655536734">OMIS</translation>
@@ -188,6 +192,7 @@
 <translation id="2712812801627182647">Cheia de autentificare TLS</translation>
 <translation id="2713444072780614174">Alb</translation>
 <translation id="2717139507051041123">Activează modul de culoare închisă</translation>
+<translation id="2727250716596204208">Nu s-a găsit imaginea de firmware. Introdu un dispozitiv de stocare externă, cum ar fi o unitate USB sau un card SD, cu imaginea Utilitar de recuperare Chromebook descărcată.</translation>
 <translation id="2740531572673183784">OK</translation>
 <translation id="2751739896257479635">Autentificare EAP din a doua fază</translation>
 <translation id="2756652381241102009">Rulează diagnosticarea</translation>
@@ -219,6 +224,7 @@
 <translation id="3122464029669770682">CPU</translation>
 <translation id="3124039320086536031">Dispozitivul este conectat.</translation>
 <translation id="3127341325625468058">{PAGE_NUMBER,plural, =0{Elimini pagina?}=1{Elimini pagina {PAGE_NUMBER}?}few{Elimini pagina {PAGE_NUMBER}?}other{Elimini pagina {PAGE_NUMBER}?}}</translation>
+<translation id="3137983112374760826">Se configurează accesul utilizatorilor la dispozitiv…</translation>
 <translation id="315116470104423982">Date mobile</translation>
 <translation id="3156846309055100599">Se scanează pagina <ph name="PAGE_NUMBER" />...</translation>
 <translation id="315738237743207937">S-a detectat un portal captiv</translation>
@@ -240,6 +246,7 @@
 <translation id="3340011300870565703">Nivelul bateriei căștii drepte a dispozitivului este de <ph name="BATTERY_PERCENTAGE" /> %.</translation>
 <translation id="3368922792935385530">Conectat</translation>
 <translation id="3369013195428705271">Sigur vrei să ștergi tot istoricul printărilor? Sarcinile de printare în curs nu vor fi șterse.</translation>
+<translation id="3383751554789092165">Schimbă informațiile dispozitivului după caz.</translation>
 <translation id="3404249063913988450">Activează screensaverul</translation>
 <translation id="3404770484521709967">Componentele sunt instalate corect.</translation>
 <translation id="3413935475507503304">Ca să continui cu actualizarea, dă clic pe Înainte.</translation>
@@ -278,6 +285,7 @@
 <translation id="3748026146096797577">Neconectat</translation>
 <translation id="3749289110408117711">Nume de fișier</translation>
 <translation id="3771294271822695279">Fișiere video</translation>
+<translation id="3774059845329307709">Număr de serie</translation>
 <translation id="3784455785234192852">Blochează</translation>
 <translation id="38114475217616659">Șterge tot istoricul</translation>
 <translation id="3820172043799983114">PIN nevalid.</translation>
@@ -361,6 +369,7 @@
 <translation id="455835558791489930">Baterie de <ph name="CHARGE_VALUE" /> mAh</translation>
 <translation id="4561801978359312462">Card SIM deblocat</translation>
 <translation id="4562494484721939086">Fără semnal</translation>
+<translation id="4568938274596692027">Instalarea s-a finalizat. Se pregătește repornirea…</translation>
 <translation id="458794348635939462">Nu s-au putut rezolva toate gazdele</translation>
 <translation id="4593212453765072419">Este necesară autentificarea la serverul proxy</translation>
 <translation id="4609350030397390689">Reducerea luminozității tastaturii</translation>
@@ -403,6 +412,7 @@
 <translation id="4890353053343094602">Alege imediat una nouă</translation>
 <translation id="4891842000192098784">Stres</translation>
 <translation id="4897058166682006107">Nivelul bateriei căștii stângi a dispozitivului este de <ph name="BATTERY_PERCENTAGE" /> %.</translation>
+<translation id="4908030561598728899">Se instalează firmware-ul…</translation>
 <translation id="4915052247106771211">Astfel, dispozitivul va reveni la setările din fabrică (Powerwash).</translation>
 <translation id="4917385247580444890">Puternic</translation>
 <translation id="4917889632206600977">Oprită – Hârtie epuizată</translation>
@@ -615,8 +625,10 @@
 <translation id="6768237774506518020">Rată de eroare ridicată a rezolvărilor DNS</translation>
 <translation id="680983167891198932">Cheie</translation>
 <translation id="6816797338148849397">Sunt disponibile informații despre selecția ta. Folosește tasta săgeată în sus pentru a le accesa.</translation>
+<translation id="6822504384524564824">SKU trebuie schimbat numai dacă noile componente sunt diferite de cele înlocuite. De exemplu, un ecran tactil care înlocuiește un ecran netactil sau o memorie care face upgrade de la 8 GB la 16 GB.</translation>
 <translation id="6840315122969944400">Reparație <ph name="DEVICE_TYPE" /></translation>
 <translation id="6853312040151791195">Rata de descărcare</translation>
+<translation id="6876833053687020046">Numărul DRAM al piesei</translation>
 <translation id="6889786074662672253">Nu deconecta dispozitivul extern și nu închide computerul în timpul repornirii. Poți să minimizezi fereastra. Actualizarea poate să dureze câteva minute și este posibil ca dispozitivul extern să nu funcționeze în această perioadă.</translation>
 <translation id="6905724422583748843">Înapoi la <ph name="PAGE_NAME" /></translation>
 <translation id="6910312834584889076">Capacul scanerului este deschis. Închide capacul și încearcă din nou.</translation>
@@ -664,6 +676,7 @@
 <translation id="7343649194310845056">Dispozitive de rețea</translation>
 <translation id="7359657277149375382">Tip de fișier</translation>
 <translation id="7375053625150546623">EAP</translation>
+<translation id="7378553660733179982">SKU</translation>
 <translation id="7378886533986123738">Schimbă screensaverul</translation>
 <translation id="7397270852490618635">Dezactivează tema luminoasă</translation>
 <translation id="741244894080940828">conversie</translation>
@@ -763,6 +776,7 @@
 <translation id="8364946094152050673">Serverele de nume sunt goale</translation>
 <translation id="8372477600026034341">Gazde suplimentare</translation>
 <translation id="8378855320830505539">Regiune</translation>
+<translation id="8382302752385457774">Etichetă albă</translation>
 <translation id="8395584934117017006">Acest <ph name="DEVICE_TYPE" /> este gestionat de companie</translation>
 <translation id="8398927464629426868">Rata de încărcare sau de descărcare a dispozitivului</translation>
 <translation id="8422748173858722634">IMEI</translation>
diff --git a/chromeos/strings/chromeos_strings_uz.xtb b/chromeos/strings/chromeos_strings_uz.xtb
index e7218e3..00a7f85 100644
--- a/chromeos/strings/chromeos_strings_uz.xtb
+++ b/chromeos/strings/chromeos_strings_uz.xtb
@@ -32,11 +32,13 @@
 <translation id="1270369111467284986">Kirish portali muzlatildi</translation>
 <translation id="1290331692326790741">Signal kuchsiz</translation>
 <translation id="1301069673413256657">GSM</translation>
+<translation id="1308067967278144752">Yozishdan himoyani yoqish</translation>
 <translation id="1308754910631152188">Yangilanmoqda (<ph name="PERCENTAGE_VALUE" />% yakunlandi)</translation>
 <translation id="1310380015393971138"><ph name="NETWORK_NAME" /> nomli tarmoq topilmadi</translation>
 <translation id="131421566576084655">Oxirgi asliga qaytarish kuni noaniq</translation>
 <translation id="1314565355471455267">Android VPN</translation>
 <translation id="131461803491198646">Roumingsiz uy tarmog‘i</translation>
+<translation id="132712914231403017">Mikrodastur tasvirini oʻrnatish</translation>
 <translation id="1327977588028644528">Shlyuz</translation>
 <translation id="1328223165223065150">Fon rasmi rangi</translation>
 <translation id="1330426557709298164">JPG</translation>
@@ -80,6 +82,7 @@
 <translation id="1641857168437328880">Hujjat tasmasi (bir tomonlama)</translation>
 <translation id="1643449475550628585">Fon rasmi har kuni almashtirilsin</translation>
 <translation id="1644574205037202324">Tarix</translation>
+<translation id="1645954272419197032">Qurilma axborotini tasdiqlang</translation>
 <translation id="1662989795263954667">Toʻxtatildi – Siyoh tugadi</translation>
 <translation id="1668469839109562275">Ichki oʻrnatilgan VPN</translation>
 <translation id="1703835215927279855">Letter</translation>
@@ -118,6 +121,7 @@
 <translation id="2006864819935886708">Ulanish</translation>
 <translation id="2008685064673031089">Oddiy sonlarni qidirish</translation>
 <translation id="2016697457005847575">Muammoni hal qilishga urining</translation>
+<translation id="2016848882344942759">--oq yorliqsiz--</translation>
 <translation id="202500043506723828">EID</translation>
 <translation id="2080070583977670716">Kengaytirilgan sozlamalar</translation>
 <translation id="2085089206770112532">Displey yorlinligini pasaytirish</translation>
@@ -148,6 +152,7 @@
 <translation id="2271469253353559191">Tungi rejim rejasi</translation>
 <translation id="2275586345903859204">Tuzatildi</translation>
 <translation id="2287186687001756809">Hech qanday rasm topilmadi. Suratlar kiritish uchun <ph name="LINK" /> sahifasini oching.</translation>
+<translation id="2294753434210277304">Chromebook tiklash vositasi tasviri yuklab olingan USB disk yoki SD karta kabi tashqi xotira qurilmasini joylang</translation>
 <translation id="2307344026739914387">Joriy kalitlar juftligidan foydalanish</translation>
 <translation id="2320295602967756579">Kunduzgi mavzuni yoqish</translation>
 <translation id="2323506179655536734">TASHLAB KETILDI</translation>
@@ -188,6 +193,7 @@
 <translation id="2712812801627182647">TLS autentifikatsiya kaliti</translation>
 <translation id="2713444072780614174">Oq</translation>
 <translation id="2717139507051041123">Toʻq rangli rejimni yoqish</translation>
+<translation id="2727250716596204208">Mikrodastur tasviri topilmadi. Chromebook tiklash vositasi tasviri yuklab olingan USB disk yoki SD karta kabi tashqi xotira qurilmasini joylang.</translation>
 <translation id="2740531572673183784">Ok</translation>
 <translation id="2751739896257479635">EAP autentifikatsiya 2-bosqichi</translation>
 <translation id="2756652381241102009">Diagnostikani ishga tushirish</translation>
@@ -219,6 +225,7 @@
 <translation id="3122464029669770682">CPU</translation>
 <translation id="3124039320086536031">Qurilma ulandi.</translation>
 <translation id="3127341325625468058">{PAGE_NUMBER,plural, =0{Sahifa olib tashlansinmi?}=1{{PAGE_NUMBER} ta sahifa olib tashlansinmi?}other{{PAGE_NUMBER} ta sahifa olib tashlansinmi?}}</translation>
+<translation id="3137983112374760826">Qurilma tayyorlanmoqda...</translation>
 <translation id="315116470104423982">Mobil internet</translation>
 <translation id="3156846309055100599"><ph name="PAGE_NUMBER" /> ta sahifa skanerlandi...</translation>
 <translation id="315738237743207937">Kirish portali aniqlandi</translation>
@@ -240,6 +247,7 @@
 <translation id="3340011300870565703">Qurilmaning oʻng quloqlik batareyasi quvvati: <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="3368922792935385530">Ulangan</translation>
 <translation id="3369013195428705271">Chop etish tarixi tozalansinmi? Joriy chop etish vazifalari oʻchirib tashlanmaydi.</translation>
+<translation id="3383751554789092165">Talab etilgan qurilma axborotini oʻzgartiring</translation>
 <translation id="3404249063913988450">Ekran lavhasini faollashtirish</translation>
 <translation id="3404770484521709967">Komponentlar toʻgʻri oʻrnatilgan.</translation>
 <translation id="3413935475507503304">Yangilashda davom etish uchun Keyingisi tugmasini bosing</translation>
@@ -278,6 +286,7 @@
 <translation id="3748026146096797577">Ulanilmagan</translation>
 <translation id="3749289110408117711">Fayl nomi</translation>
 <translation id="3771294271822695279">Video fayllar</translation>
+<translation id="3774059845329307709">Seriya raqami</translation>
 <translation id="3784455785234192852">Qulflash</translation>
 <translation id="38114475217616659">Tarixni tozalash</translation>
 <translation id="3820172043799983114">PIN kod xato.</translation>
@@ -361,6 +370,7 @@
 <translation id="455835558791489930"><ph name="CHARGE_VALUE" />mAh Batareya</translation>
 <translation id="4561801978359312462">Qulflanmagan SIM</translation>
 <translation id="4562494484721939086">Tarmoq topilmadi</translation>
+<translation id="4568938274596692027">Mikrodastur oʻrnatildi. Qayta ishga tushirilish arafasida...</translation>
 <translation id="458794348635939462">Hech qaysi host aniqlanmadi</translation>
 <translation id="4593212453765072419">Proksi hisob tekshiruvini talab qiladi</translation>
 <translation id="4609350030397390689">Klaviatura yorqinligi pasaytirish</translation>
@@ -403,6 +413,7 @@
 <translation id="4890353053343094602">Tezda yangi parol tanlang</translation>
 <translation id="4891842000192098784">Stress</translation>
 <translation id="4897058166682006107">Qurilmaning chap quloqlik batareyasi quvvati: <ph name="BATTERY_PERCENTAGE" />%</translation>
+<translation id="4908030561598728899">Mikrodastur oʻrnatilmoqda...</translation>
 <translation id="4915052247106771211">Qurilma asl sozlamalariga qaytariladi (Powerwash).</translation>
 <translation id="4917385247580444890">Kuchli</translation>
 <translation id="4917889632206600977">Toʻxtatildi – Qogʻoz tugadi</translation>
@@ -432,6 +443,7 @@
 <translation id="5166918508782100047">Tezkor javoblar sozlamalari</translation>
 <translation id="5168185087976003268">Quvvat darajasi</translation>
 <translation id="5170568018924773124">&amp;Jildda ko‘rsatish</translation>
+<translation id="5179530508336824319">Keyingi ekranga oʻtish uchun yozishdan himoyani yoqing. Koʻrsatmalar uchun qurilma ishlab chiqaruvchisining yordam sahifasini oching.</translation>
 <translation id="5190187232518914472">Sevimli xotiralaringizga qayting. Albom kiritish yoki tahrirlash uchun <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" /> xizmatini oching.</translation>
 <translation id="5212543919916444558">Ekranda men yordam bera oladigan hech narsa topilmadi.
 Mikrofon ustiga bosing va savolni ayting.</translation>
@@ -615,8 +627,10 @@
 <translation id="6768237774506518020">DNS manzil ajratilmasligi juda yuqori</translation>
 <translation id="680983167891198932">Kalit</translation>
 <translation id="6816797338148849397">Tanlovga aloqador axborot mavjud. Uni ochish uchun tepaga strelkani bosing.</translation>
+<translation id="6822504384524564824">Agar yangi komponentlar almashtirilganidan farqli boʻlsa, faqat materialning ombordagi hisobini (SKU) oʻzgartirish zarur. Masalan, sensorli ekran sensorsiz ekranga almashtilganda yoki 8GB xotira 16GB ga almashtirilganda.</translation>
 <translation id="6840315122969944400"><ph name="DEVICE_TYPE" /> qurilmasini tuzatish</translation>
 <translation id="6853312040151791195">Quvvat sarflanishi tezligi</translation>
+<translation id="6876833053687020046">DRAM artikuli</translation>
 <translation id="6889786074662672253">Oʻchib yonayotganda tashqi qurilmani uzmay va kompyuterni oʻchirmay turing. Bu oynani yigʻish mumkin. Bu bir necha daqiqa vaqt oladi va bu vaqtda tashqi qurilma ishlamay turishi mumkin.</translation>
 <translation id="6905724422583748843"><ph name="PAGE_NAME" /> sahifasiga qaytish</translation>
 <translation id="6910312834584889076">Skaner qopqogʻi yopilmagan. Qopqogʻini toping va qaytadan urining.</translation>
@@ -664,6 +678,7 @@
 <translation id="7343649194310845056">Tarmoq qurilmalari</translation>
 <translation id="7359657277149375382">Fayl turi</translation>
 <translation id="7375053625150546623">EAP</translation>
+<translation id="7378553660733179982">Materialning ombordagi hisobi (SKU)</translation>
 <translation id="7378886533986123738">Ekran lavhasini oʻzgartirish</translation>
 <translation id="7397270852490618635">Kunduzgi mavzuni faolsizlantirish</translation>
 <translation id="741244894080940828">konversiya</translation>
@@ -763,6 +778,7 @@
 <translation id="8364946094152050673">Nom serverlari kiritilmagan</translation>
 <translation id="8372477600026034341">Qoʻshimcha hostlar</translation>
 <translation id="8378855320830505539">Hudud</translation>
+<translation id="8382302752385457774">Oq yorliq</translation>
 <translation id="8395584934117017006">Bu <ph name="DEVICE_TYPE" /> korporativ domen boshqaruvida</translation>
 <translation id="8398927464629426868">Qurilmaning quvvat olish yoki sarflash darajasi</translation>
 <translation id="8422748173858722634">IMEI</translation>
diff --git a/components/autofill/content/renderer/form_autofill_util.cc b/components/autofill/content/renderer/form_autofill_util.cc
index 58dbf44..658e2ba 100644
--- a/components/autofill/content/renderer/form_autofill_util.cc
+++ b/components/autofill/content/renderer/form_autofill_util.cc
@@ -519,62 +519,20 @@
   return std::u16string();
 }
 
-// Helper for |InferLabelForElement()| that infers a label, if possible, from
-// enclosing list item,
-// e.g. <li>Some Text<input ...><input ...><input ...></li>
-std::u16string InferLabelFromListItem(const WebFormControlElement& element) {
-  WebNode parent = element.ParentNode();
-  static base::NoDestructor<WebString> kListItem("li");
-  while (!parent.IsNull() && parent.IsElementNode() &&
-         !parent.To<WebElement>().HasHTMLTagName(*kListItem)) {
-    parent = parent.ParentNode();
-  }
-
-  if (!parent.IsNull() && HasTagName(parent, *kListItem))
-    return FindChildText(parent);
-
-  return std::u16string();
-}
-
-// Helper for |InferLabelForElement()| that infers a label, if possible, from
-// enclosing label,
-// e.g. <label>Some Text<input ...><input ...><input ...></label>
-std::u16string InferLabelFromEnclosingLabel(
-    const WebFormControlElement& element) {
-  WebNode parent = element.ParentNode();
-  static base::NoDestructor<WebString> kLabel("label");
-  while (!parent.IsNull() && parent.IsElementNode() &&
-         !parent.To<WebElement>().HasHTMLTagName(*kLabel)) {
-    parent = parent.ParentNode();
-  }
-
-  if (!parent.IsNull() && HasTagName(parent, *kLabel))
-    return FindChildText(parent);
-
-  return std::u16string();
-}
-
-// Helper for |InferLabelForElement()| that infers a label, if possible, from
+// Helper for `InferLabelForElement()` that infers a label, if possible, from
 // surrounding table structure,
 // e.g. <tr><td>Some Text</td><td><input ...></td></tr>
 // or   <tr><th>Some Text</th><td><input ...></td></tr>
 // or   <tr><td><b>Some Text</b></td><td><b><input ...></b></td></tr>
 // or   <tr><th><b>Some Text</b></th><td><b><input ...></b></td></tr>
-std::u16string InferLabelFromTableColumn(const WebFormControlElement& element) {
+// `cell` represents the <td> tag containing the input element.
+std::u16string InferLabelFromTableColumn(const WebNode& cell) {
   static base::NoDestructor<WebString> kTableCell("td");
-  WebNode parent = element.ParentNode();
-  while (!parent.IsNull() && parent.IsElementNode() &&
-         !parent.To<WebElement>().HasHTMLTagName(*kTableCell)) {
-    parent = parent.ParentNode();
-  }
-
-  if (parent.IsNull())
-    return std::u16string();
-
+  DCHECK(HasTagName(cell, *kTableCell));
   // Check all previous siblings, skipping non-element nodes, until we find a
   // non-empty text block.
   std::u16string inferred_label;
-  WebNode previous = parent.PreviousSibling();
+  WebNode previous = cell.PreviousSibling();
   static base::NoDestructor<WebString> kTableHeader("th");
   while (inferred_label.empty() && !previous.IsNull()) {
     if (HasTagName(previous, *kTableCell) ||
@@ -587,8 +545,8 @@
   return inferred_label;
 }
 
-// Helper for |InferLabelForElement()| that infers a label, if possible, from
-// surrounding table structure,
+// Helper for `InferLabelForElement()` that infers a label, if possible, from
+// surrounding table structure.
 //
 // If there are multiple cells and the row with the input matches up with the
 // previous row, then look for a specific cell within the previous row.
@@ -597,25 +555,13 @@
 //
 // Otherwise, just look in the entire previous row.
 // e.g. <tr><td>Some Text</td></tr><tr><td><input ...></td></tr>
-std::u16string InferLabelFromTableRow(const WebFormControlElement& element) {
+// `cell` represents the <td> tag containing the input element.
+std::u16string InferLabelFromTableRow(const WebNode& cell) {
   static base::NoDestructor<WebString> kTableCell("td");
+  DCHECK(HasTagName(cell, *kTableCell));
   std::u16string inferred_label;
 
-  // First find the <td> that contains |element|.
-  WebNode cell = element.ParentNode();
-  while (!cell.IsNull()) {
-    if (cell.IsElementNode() &&
-        cell.To<WebElement>().HasHTMLTagName(*kTableCell)) {
-      break;
-    }
-    cell = cell.ParentNode();
-  }
-
-  // Not in a cell - bail out.
-  if (cell.IsNull())
-    return inferred_label;
-
-  // Count the cell holding |element|.
+  // Count the cell holding the input element.
   size_t cell_count = CalculateTableCellColumnSpan(cell.To<WebElement>());
   size_t cell_position = 0;
   size_t cell_position_end = cell_count - 1;
@@ -623,8 +569,7 @@
   // Count cells to the left to figure out |element|'s cell's position.
   for (WebNode cell_it = cell.PreviousSibling(); !cell_it.IsNull();
        cell_it = cell_it.PreviousSibling()) {
-    if (cell_it.IsElementNode() &&
-        cell_it.To<WebElement>().HasHTMLTagName(*kTableCell)) {
+    if (HasTagName(cell_it, *kTableCell)) {
       cell_position += CalculateTableCellColumnSpan(cell_it.To<WebElement>());
     }
   }
@@ -632,8 +577,7 @@
   // Count cells to the right.
   for (WebNode cell_it = cell.NextSibling(); !cell_it.IsNull();
        cell_it = cell_it.NextSibling()) {
-    if (cell_it.IsElementNode() &&
-        cell_it.To<WebElement>().HasHTMLTagName(*kTableCell)) {
+    if (HasTagName(cell_it, *kTableCell)) {
       cell_count += CalculateTableCellColumnSpan(cell_it.To<WebElement>());
     }
   }
@@ -644,22 +588,16 @@
 
   // Find the current row.
   static base::NoDestructor<WebString> kTableRow("tr");
-  WebNode parent = element.ParentNode();
-  while (!parent.IsNull() && parent.IsElementNode() &&
-         !parent.To<WebElement>().HasHTMLTagName(*kTableRow)) {
+  WebNode parent = cell.ParentNode();
+  while (!parent.IsNull() && !HasTagName(parent, *kTableRow)) {
     parent = parent.ParentNode();
   }
-
   if (parent.IsNull())
     return inferred_label;
 
   // Now find the previous row.
   WebNode row_it = parent.PreviousSibling();
-  while (!row_it.IsNull()) {
-    if (row_it.IsElementNode() &&
-        row_it.To<WebElement>().HasHTMLTagName(*kTableRow)) {
-      break;
-    }
+  while (!row_it.IsNull() && !HasTagName(row_it, *kTableRow)) {
     row_it = row_it.PreviousSibling();
   }
 
@@ -700,14 +638,13 @@
   while (inferred_label.empty() && !previous.IsNull()) {
     if (HasTagName(previous, *kTableRow))
       inferred_label = FindChildText(previous);
-
     previous = previous.PreviousSibling();
   }
 
   return inferred_label;
 }
 
-// Helper for |InferLabelForElement()| that infers a label, if possible, from
+// Helper for `InferLabelForElement()` that infers a label, if possible, from
 // a surrounding div table,
 // e.g. <div>Some Text<span><input ...></span></div>
 // e.g. <div>Some Text</div><div><input ...></div>
@@ -762,84 +699,64 @@
   return inferred_label;
 }
 
-// Helper for |InferLabelForElement()| that infers a label, if possible, from
+// Helper for `InferLabelForElement()` that infers a label, if possible, from
 // a surrounding definition list,
 // e.g. <dl><dt>Some Text</dt><dd><input ...></dd></dl>
 // e.g. <dl><dt><b>Some Text</b></dt><dd><b><input ...></b></dd></dl>
-std::u16string InferLabelFromDefinitionList(
-    const WebFormControlElement& element) {
-  static base::NoDestructor<WebString> kDefinitionData("dd");
-  WebNode parent = element.ParentNode();
-  while (!parent.IsNull() && parent.IsElementNode() &&
-         !parent.To<WebElement>().HasHTMLTagName(*kDefinitionData))
-    parent = parent.ParentNode();
-
-  if (parent.IsNull() || !HasTagName(parent, *kDefinitionData))
-    return std::u16string();
+std::u16string InferLabelFromDefinitionList(const WebNode& dd) {
+  static base::NoDestructor<WebString> kDefinitionDescriptionTag("dd");
+  static base::NoDestructor<WebString> kDefinitionTermTag("dt");
+  DCHECK(HasTagName(dd, *kDefinitionDescriptionTag));
 
   // Skip by any intervening text nodes.
-  WebNode previous = parent.PreviousSibling();
+  WebNode previous = dd.PreviousSibling();
   while (!previous.IsNull() && previous.IsTextNode())
     previous = previous.PreviousSibling();
 
-  static base::NoDestructor<WebString> kDefinitionTag("dt");
-  if (previous.IsNull() || !HasTagName(previous, *kDefinitionTag))
+  if (previous.IsNull() || !HasTagName(previous, *kDefinitionTermTag))
     return std::u16string();
-
   return FindChildText(previous);
 }
 
-// Returns the element type for all ancestor nodes in CAPS, starting with the
-// parent node.
-std::vector<std::string> AncestorTagNames(
-    const WebFormControlElement& element) {
-  std::vector<std::string> tag_names;
-  for (WebNode parent_node = element.ParentNode(); !parent_node.IsNull();
-       parent_node = parent_node.ParentNode()) {
-    if (!parent_node.IsElementNode())
-      continue;
-
-    tag_names.push_back(parent_node.To<WebElement>().TagName().Utf8());
-  }
-  return tag_names;
-}
-
 // Helper for `InferLabelForElement()` that infers a label, if possible, from
 // the first surrounding <label>, <div>, <td>, <dd> or <li> tag (if any).
-// See `InferLabelFromEnclosingLabel()`, `InferLabelFromDivTable()`,
-// `InferLabelFromTableColumn()`, `InferLabelFromTableRow()`,
-// `InferLabelFromDefinitionList()` and `InferLabelFromListItem()` for examples
-// how a label is extracted from the different tags.
+// See `FindChildText()`, `InferLabelFromDivTable()`,
+// `InferLabelFromTableColumn()`, `InferLabelFromTableRow()` and
+// `InferLabelFromDefinitionList()` for examples how a label is extracted from
+// the different tags.
 bool InferLabelFromAncestors(const WebFormControlElement& element,
                              std::u16string& label,
                              FormFieldData::LabelSource& label_source) {
-  std::vector<std::string> tag_names = AncestorTagNames(element);
   std::set<std::string> seen_tag_names;
-  FormFieldData::LabelSource ancestor_label_source =
-      FormFieldData::LabelSource::kUnknown;
-  for (const std::string& tag_name : tag_names) {
+  for (WebNode parent = element.ParentNode(); !parent.IsNull();
+       parent = parent.ParentNode()) {
+    if (!parent.IsElementNode())
+      continue;
+
+    std::string tag_name = parent.To<WebElement>().TagName().Utf8();
     if (base::Contains(seen_tag_names, tag_name))
       continue;
     seen_tag_names.insert(tag_name);
 
+    FormFieldData::LabelSource ancestor_label_source;
     std::u16string inferred_label;
     if (tag_name == "LABEL") {
       ancestor_label_source = FormFieldData::LabelSource::kLabelTag;
-      inferred_label = InferLabelFromEnclosingLabel(element);
+      inferred_label = FindChildText(parent);
     } else if (tag_name == "DIV") {
       ancestor_label_source = FormFieldData::LabelSource::kDivTable;
       inferred_label = InferLabelFromDivTable(element);
     } else if (tag_name == "TD") {
       ancestor_label_source = FormFieldData::LabelSource::kTdTag;
-      inferred_label = InferLabelFromTableColumn(element);
+      inferred_label = InferLabelFromTableColumn(parent);
       if (!IsLabelValid(inferred_label))
-        inferred_label = InferLabelFromTableRow(element);
+        inferred_label = InferLabelFromTableRow(parent);
     } else if (tag_name == "DD") {
       ancestor_label_source = FormFieldData::LabelSource::kDdTag;
-      inferred_label = InferLabelFromDefinitionList(element);
+      inferred_label = InferLabelFromDefinitionList(parent);
     } else if (tag_name == "LI") {
       ancestor_label_source = FormFieldData::LabelSource::kLiTag;
-      inferred_label = InferLabelFromListItem(element);
+      inferred_label = FindChildText(parent);
     } else if (tag_name == "FIELDSET") {
       break;
     }
diff --git a/components/autofill/core/browser/form_parsing/form_field.cc b/components/autofill/core/browser/form_parsing/form_field.cc
index 63409bf..7d9e101 100644
--- a/components/autofill/core/browser/form_parsing/form_field.cc
+++ b/components/autofill/core/browser/form_parsing/form_field.cc
@@ -337,8 +337,9 @@
 
   const std::u16string& name = field->parseable_name();
 
-  if (match_type.attributes.contains(MatchAttribute::kLabel) &&
-      MatchesPattern(label, pattern, &match)) {
+  const bool match_label =
+      match_type.attributes.contains(MatchAttribute::kLabel);
+  if (match_label && MatchesPattern(label, pattern, &match)) {
     found_match = true;
     match_type_string = "Match in label";
     value = label;
@@ -347,6 +348,17 @@
     found_match = true;
     match_type_string = "Match in name";
     value = name;
+  } else if (match_label &&
+             base::FeatureList::IsEnabled(
+                 features::kAutofillConsiderPlaceholderForParsing) &&
+             MatchesPattern(field->placeholder, pattern, &match)) {
+    // TODO(crbug.com/1317961): The label and placeholder cases should logically
+    // be grouped together. Placeholder is currently last, because for the finch
+    // study we want the group assignment to happen as late as possible.
+    // Reorder once the change is rolled out.
+    found_match = true;
+    match_type_string = "Match in placeholder";
+    value = field->placeholder;
   }
 
   if (found_match && logging.log_manager) {
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc
index 3e2a8fea..9ce12475 100644
--- a/components/autofill/core/browser/form_structure.cc
+++ b/components/autofill/core/browser/form_structure.cc
@@ -2858,6 +2858,7 @@
                    base::NumberToString(
                        HashFormSignature(field->host_form_signature))});
     buffer << Tr{} << "Name:" << field->parseable_name();
+    buffer << Tr{} << "Placeholder:" << field->placeholder;
 
     auto type = field->Type().ToString();
     auto heuristic_type = AutofillType(field->heuristic_type()).ToString();
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc
index cb8d176b..4dc4c90 100644
--- a/components/autofill/core/common/autofill_features.cc
+++ b/components/autofill/core/common/autofill_features.cc
@@ -91,6 +91,10 @@
 const base::Feature kAutofillComplementCountryCodeOnImport{
     "AutofillComplementCountryCodeOnImport", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// If enabled, local heuristics fall back to the fields placeholder attribute.
+const base::Feature kAutofillConsiderPlaceholderForParsing{
+    "AutofillConsiderPlaceholderForParsing", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // If enabled, the variation country code is used as the phone number's region,
 // instead of defaulting to app locale.
 // TODO(crbug.com/1295721): Cleanup when launched.
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h
index 53a30ee..3ef45257b 100644
--- a/components/autofill/core/common/autofill_features.h
+++ b/components/autofill/core/common/autofill_features.h
@@ -47,6 +47,8 @@
 COMPONENT_EXPORT(AUTOFILL)
 extern const base::Feature kAutofillComplementCountryCodeOnImport;
 COMPONENT_EXPORT(AUTOFILL)
+extern const base::Feature kAutofillConsiderPlaceholderForParsing;
+COMPONENT_EXPORT(AUTOFILL)
 extern const base::Feature kAutofillConsiderVariationCountryCodeForPhoneNumbers;
 COMPONENT_EXPORT(AUTOFILL)
 extern const base::Feature kAutofillEnableWithinFencedFrame;
diff --git a/components/autofill_assistant/browser/BUILD.gn b/components/autofill_assistant/browser/BUILD.gn
index c833fb4..fc14474c 100644
--- a/components/autofill_assistant/browser/BUILD.gn
+++ b/components/autofill_assistant/browser/BUILD.gn
@@ -464,6 +464,7 @@
     "actions/edit_password_action_unittest.cc",
     "actions/execute_js_action_unittest.cc",
     "actions/expect_navigation_action_unittest.cc",
+    "actions/external_action_unittest.cc",
     "actions/fallback_handler/required_field_unittest.cc",
     "actions/fallback_handler/required_fields_fallback_handler_unittest.cc",
     "actions/generate_password_for_form_field_action_unittest.cc",
diff --git a/components/autofill_assistant/browser/actions/action_delegate.h b/components/autofill_assistant/browser/actions/action_delegate.h
index abe20c9..93241269 100644
--- a/components/autofill_assistant/browser/actions/action_delegate.h
+++ b/components/autofill_assistant/browser/actions/action_delegate.h
@@ -476,8 +476,9 @@
   // Executes the |external_action|.
   virtual void RequestExternalAction(
       const ExternalActionProto& external_action,
+      base::OnceCallback<void()> start_dom_checks_callback,
       base::OnceCallback<void(ExternalActionDelegate::ActionResult result)>
-          callback) = 0;
+          end_action_callback) = 0;
 
   // Returns whether or not this instance of Autofill Assistant must use a
   // backend endpoint to query data.
diff --git a/components/autofill_assistant/browser/actions/external_action.cc b/components/autofill_assistant/browser/actions/external_action.cc
index 40e6d82ad..bb733ab9 100644
--- a/components/autofill_assistant/browser/actions/external_action.cc
+++ b/components/autofill_assistant/browser/actions/external_action.cc
@@ -19,12 +19,30 @@
 void ExternalAction::InternalProcessAction(ProcessActionCallback callback) {
   callback_ = std::move(callback);
   if (!delegate_->SupportsExternalActions()) {
+    VLOG(1) << "External action are not supported for this run.";
     EndAction(ClientStatus(INVALID_ACTION));
+    return;
+  }
+  if (!proto_.external_action().has_info()) {
+    VLOG(1) << "The ExternalAction's |info| is missing.";
+    EndAction(ClientStatus(INVALID_ACTION));
+    return;
   }
 
-  auto external_action = proto_.external_action();
+  delegate_->RequestExternalAction(
+      proto_.external_action(),
+      base::BindOnce(&ExternalAction::StartDomChecks,
+                     weak_ptr_factory_.GetWeakPtr()),
+      base::BindOnce(&ExternalAction::OnExternalActionFinished,
+                     weak_ptr_factory_.GetWeakPtr()));
 
-  SendActionInfo();
+  // Do not add any code here. External delegates may choose to end the action
+  // immediately, which could result in *this being deleted and UaF errors for
+  // code after the above call.
+}
+
+void ExternalAction::StartDomChecks() {
+  const auto& external_action = proto_.external_action();
   if (external_action.allow_interrupt()) {
     delegate_->WaitForDom(
         /* max_wait_time= */ base::TimeDelta::Max(),
@@ -34,13 +52,6 @@
   }
 }
 
-void ExternalAction::SendActionInfo() {
-  delegate_->RequestExternalAction(
-      proto_.external_action(),
-      base::BindOnce(&ExternalAction::OnExternalActionFinished,
-                     weak_ptr_factory_.GetWeakPtr()));
-}
-
 void ExternalAction::OnExternalActionFinished(
     ExternalActionDelegate::ActionResult result) {
   if (!callback_) {
diff --git a/components/autofill_assistant/browser/actions/external_action.h b/components/autofill_assistant/browser/actions/external_action.h
index b2b7d07..e4db17b 100644
--- a/components/autofill_assistant/browser/actions/external_action.h
+++ b/components/autofill_assistant/browser/actions/external_action.h
@@ -24,8 +24,9 @@
  private:
   // Overrides Action:
   void InternalProcessAction(ProcessActionCallback callback) override;
+
+  void StartDomChecks();
   void OnExternalActionFinished(ExternalActionDelegate::ActionResult success);
-  void SendActionInfo();
   void EndAction(const ClientStatus& status);
 
   ProcessActionCallback callback_;
diff --git a/components/autofill_assistant/browser/actions/external_action_unittest.cc b/components/autofill_assistant/browser/actions/external_action_unittest.cc
new file mode 100644
index 0000000..0815397
--- /dev/null
+++ b/components/autofill_assistant/browser/actions/external_action_unittest.cc
@@ -0,0 +1,138 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/autofill_assistant/browser/actions/external_action.h"
+
+#include "base/test/gmock_callback_support.h"
+#include "base/test/mock_callback.h"
+#include "components/autofill_assistant/browser/actions/mock_action_delegate.h"
+#include "components/autofill_assistant/browser/service.pb.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace autofill_assistant {
+namespace {
+
+using ::base::test::RunOnceCallback;
+using ::testing::_;
+using ::testing::Property;
+using ::testing::Return;
+
+class ExternalActionTest : public testing::Test {
+ protected:
+  void Run() {
+    ON_CALL(mock_action_delegate_, SupportsExternalActions)
+        .WillByDefault(Return(true));
+
+    ActionProto action_proto;
+    *action_proto.mutable_external_action() = proto_;
+    ExternalAction action(&mock_action_delegate_, action_proto);
+    action.ProcessAction(callback_.Get());
+  }
+
+  MockActionDelegate mock_action_delegate_;
+  base::MockCallback<Action::ProcessActionCallback> callback_;
+  ExternalActionProto proto_;
+};
+
+TEST_F(ExternalActionTest, Success) {
+  proto_.mutable_info();
+  EXPECT_CALL(mock_action_delegate_, RequestExternalAction)
+      .WillOnce(RunOnceCallback<2>(
+          ExternalActionDelegate::ActionResult{.success = true}));
+
+  EXPECT_CALL(
+      callback_,
+      Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED))));
+  Run();
+}
+
+TEST_F(ExternalActionTest, ExternalFailure) {
+  proto_.mutable_info();
+  EXPECT_CALL(mock_action_delegate_, RequestExternalAction)
+      .WillOnce(RunOnceCallback<2>(
+          ExternalActionDelegate::ActionResult{.success = false}));
+  EXPECT_CALL(callback_, Run(Pointee(Property(&ProcessedActionProto::status,
+                                              UNKNOWN_ACTION_STATUS))));
+  Run();
+}
+
+TEST_F(ExternalActionTest, FailsIfProtoExtensionInfoNotSet) {
+  EXPECT_CALL(mock_action_delegate_, RequestExternalAction).Times(0);
+  EXPECT_CALL(
+      callback_,
+      Run(Pointee(Property(&ProcessedActionProto::status, INVALID_ACTION))));
+  Run();
+}
+
+TEST_F(ExternalActionTest, FailsIfDelegateDoesNotSupportExternalActions) {
+  proto_.mutable_info();
+  EXPECT_CALL(mock_action_delegate_, SupportsExternalActions())
+      .WillOnce(Return(false));
+  EXPECT_CALL(mock_action_delegate_, RequestExternalAction).Times(0);
+  EXPECT_CALL(
+      callback_,
+      Run(Pointee(Property(&ProcessedActionProto::status, INVALID_ACTION))));
+  Run();
+}
+
+TEST_F(ExternalActionTest, ExternalActionWithInterrupts) {
+  proto_.mutable_info();
+  proto_.set_allow_interrupt(true);
+
+  EXPECT_CALL(mock_action_delegate_, RequestExternalAction)
+      .WillOnce([](const ExternalActionProto& external_action,
+                   base::OnceCallback<void()> start_dom_checks_callback,
+                   base::OnceCallback<void(ExternalActionDelegate::ActionResult
+                                               result)> end_action_callback) {
+        std::move(start_dom_checks_callback).Run();
+        std::move(end_action_callback).Run({.success = true});
+      });
+  EXPECT_CALL(mock_action_delegate_, WaitForDom);
+  EXPECT_CALL(
+      callback_,
+      Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED))));
+  Run();
+}
+
+TEST_F(ExternalActionTest, ExternalActionWithoutInterrupts) {
+  proto_.mutable_info();
+  proto_.set_allow_interrupt(false);
+
+  EXPECT_CALL(mock_action_delegate_, RequestExternalAction)
+      .WillOnce([](const ExternalActionProto& external_action,
+                   base::OnceCallback<void()> start_dom_checks_callback,
+                   base::OnceCallback<void(ExternalActionDelegate::ActionResult
+                                               result)> end_action_callback) {
+        std::move(start_dom_checks_callback).Run();
+        std::move(end_action_callback).Run({.success = true});
+      });
+  EXPECT_CALL(mock_action_delegate_, WaitForDom).Times(0);
+  EXPECT_CALL(
+      callback_,
+      Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED))));
+  Run();
+}
+
+TEST_F(ExternalActionTest, DoesNotStartWaitForDomIfDomChecksAreNotRequested) {
+  proto_.mutable_info();
+  proto_.set_allow_interrupt(true);
+
+  EXPECT_CALL(mock_action_delegate_, RequestExternalAction)
+      .WillOnce([](const ExternalActionProto& external_action,
+                   base::OnceCallback<void()> start_dom_checks_callback,
+                   base::OnceCallback<void(ExternalActionDelegate::ActionResult
+                                               result)> end_action_callback) {
+        // We call the |end_action_callback| without calling
+        // |start_dom_checks_callback|.
+        std::move(end_action_callback).Run({.success = true});
+      });
+  EXPECT_CALL(mock_action_delegate_, WaitForDom).Times(0);
+  EXPECT_CALL(
+      callback_,
+      Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED))));
+  Run();
+}
+
+}  // namespace
+}  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/actions/mock_action_delegate.h b/components/autofill_assistant/browser/actions/mock_action_delegate.h
index b95461f..308221fe 100644
--- a/components/autofill_assistant/browser/actions/mock_action_delegate.h
+++ b/components/autofill_assistant/browser/actions/mock_action_delegate.h
@@ -215,11 +215,12 @@
            base::OnceCallback<void(bool, const GetUserDataResponseProto&)>
                callback));
   MOCK_METHOD0(SupportsExternalActions, bool());
-  MOCK_METHOD2(
+  MOCK_METHOD3(
       RequestExternalAction,
       void(const ExternalActionProto& external_action,
+           base::OnceCallback<void()> start_dom_checks_callback,
            base::OnceCallback<void(ExternalActionDelegate::ActionResult result)>
-               callback));
+               end_action_callback));
   MOCK_CONST_METHOD0(MustUseBackendData, bool());
 
   base::WeakPtr<ActionDelegate> GetWeakPtr() const override {
diff --git a/components/autofill_assistant/browser/fake_script_executor_ui_delegate.cc b/components/autofill_assistant/browser/fake_script_executor_ui_delegate.cc
index 0460a5e..57eb6937 100644
--- a/components/autofill_assistant/browser/fake_script_executor_ui_delegate.cc
+++ b/components/autofill_assistant/browser/fake_script_executor_ui_delegate.cc
@@ -170,7 +170,10 @@
 
 void FakeScriptExecutorUiDelegate::ExecuteExternalAction(
     const external::Action& external_action,
+    base::OnceCallback<void()> start_dom_checks_callback,
     base::OnceCallback<void(ExternalActionDelegate::ActionResult result)>
-        callback) {}
+        end_action_callback) {
+  std::move(end_action_callback).Run({true});
+}
 
 }  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/fake_script_executor_ui_delegate.h b/components/autofill_assistant/browser/fake_script_executor_ui_delegate.h
index a5b5fee6..479951cf 100644
--- a/components/autofill_assistant/browser/fake_script_executor_ui_delegate.h
+++ b/components/autofill_assistant/browser/fake_script_executor_ui_delegate.h
@@ -82,8 +82,9 @@
   bool SupportsExternalActions() override;
   void ExecuteExternalAction(
       const external::Action& external_action,
+      base::OnceCallback<void()> start_dom_checks_callback,
       base::OnceCallback<void(ExternalActionDelegate::ActionResult result)>
-          callback) override;
+          end_action_callback) override;
 
   const std::vector<Details>& GetDetails() { return details_; }
 
diff --git a/components/autofill_assistant/browser/headless/headless_ui_controller.cc b/components/autofill_assistant/browser/headless/headless_ui_controller.cc
index cd6196be..e005c79 100644
--- a/components/autofill_assistant/browser/headless/headless_ui_controller.cc
+++ b/components/autofill_assistant/browser/headless/headless_ui_controller.cc
@@ -14,12 +14,15 @@
   return action_extension_delegate_ != nullptr;
 }
 void HeadlessUiController::ExecuteExternalAction(
-    const external::Action& info,
+    const external::Action& external_action,
+    base::OnceCallback<void()> start_dom_checks_callback,
     base::OnceCallback<void(ExternalActionDelegate::ActionResult result)>
-        callback) {
+        end_action_callback) {
   DCHECK(action_extension_delegate_);
 
-  action_extension_delegate_->OnActionRequested(info, std::move(callback));
+  action_extension_delegate_->OnActionRequested(
+      external_action, std::move(start_dom_checks_callback),
+      std::move(end_action_callback));
 }
 
 // TODO(b/201964911): fail execution instead of just logging a warning if a
diff --git a/components/autofill_assistant/browser/headless/headless_ui_controller.h b/components/autofill_assistant/browser/headless/headless_ui_controller.h
index a46a3d3..769548e8 100644
--- a/components/autofill_assistant/browser/headless/headless_ui_controller.h
+++ b/components/autofill_assistant/browser/headless/headless_ui_controller.h
@@ -79,9 +79,10 @@
       const override;
   bool SupportsExternalActions() override;
   void ExecuteExternalAction(
-      const external::Action& info,
+      const external::Action& external_action,
+      base::OnceCallback<void()> start_dom_checks_callback,
       base::OnceCallback<void(ExternalActionDelegate::ActionResult result)>
-          callback) override;
+          end_action_callback) override;
 
  private:
   const raw_ptr<ExternalActionDelegate> action_extension_delegate_;
diff --git a/components/autofill_assistant/browser/public/external_action_delegate.h b/components/autofill_assistant/browser/public/external_action_delegate.h
index 4d5bcb2..c9c4d67 100644
--- a/components/autofill_assistant/browser/public/external_action_delegate.h
+++ b/components/autofill_assistant/browser/public/external_action_delegate.h
@@ -17,9 +17,16 @@
   struct ActionResult {
     bool success = false;
   };
+
+  // Called when the script reaches an external action.
+  // The |start_dom_checks_callback| can optionally be called to start the DOM
+  // checks. This will allow interrupts to trigger (if the action itself allows
+  // them). Calling |end_action_callback| will end the external action and
+  // resume the execution of the rest of the script.
   virtual void OnActionRequested(
       const external::Action& action_info,
-      base::OnceCallback<void(ActionResult result)> callback) = 0;
+      base::OnceCallback<void()> start_dom_checks_callback,
+      base::OnceCallback<void(ActionResult result)> end_action_callback) = 0;
 };
 
 }  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/script_executor.cc b/components/autofill_assistant/browser/script_executor.cc
index 72e09d5..d5a6854 100644
--- a/components/autofill_assistant/browser/script_executor.cc
+++ b/components/autofill_assistant/browser/script_executor.cc
@@ -1115,8 +1115,9 @@
 
 void ScriptExecutor::RequestExternalAction(
     const ExternalActionProto& external_action,
+    base::OnceCallback<void()> start_dom_checks_callback,
     base::OnceCallback<void(ExternalActionDelegate::ActionResult result)>
-        callback) {
+        end_action_callback) {
   bool prompt = external_action.allow_interrupt() ||
                 external_action.show_touchable_area();
   if (prompt && delegate_->EnterState(AutofillAssistantState::PROMPT)) {
@@ -1130,21 +1131,22 @@
   external::Action action;
   *action.mutable_info() = external_action.info();
   ui_delegate_->ExecuteExternalAction(
-      action, base::BindOnce(&ScriptExecutor::OnExternalActionFinished,
-                             weak_ptr_factory_.GetWeakPtr(), external_action,
-                             prompt, std::move(callback)));
+      action, std::move(start_dom_checks_callback),
+      base::BindOnce(&ScriptExecutor::OnExternalActionFinished,
+                     weak_ptr_factory_.GetWeakPtr(), external_action, prompt,
+                     std::move(end_action_callback)));
 }
 
 void ScriptExecutor::OnExternalActionFinished(
     const ExternalActionProto& external_action,
     const bool prompt,
     base::OnceCallback<void(ExternalActionDelegate::ActionResult result)>
-        callback,
+        end_action_callback,
     ExternalActionDelegate::ActionResult result) {
   if (prompt) {
     CleanUpAfterPrompt(external_action.show_touchable_area());
   }
-  std::move(callback).Run(result);
+  std::move(end_action_callback).Run(result);
 }
 
 bool ScriptExecutor::MustUseBackendData() const {
diff --git a/components/autofill_assistant/browser/script_executor.h b/components/autofill_assistant/browser/script_executor.h
index 07c452a..f9c32d4d 100644
--- a/components/autofill_assistant/browser/script_executor.h
+++ b/components/autofill_assistant/browser/script_executor.h
@@ -269,8 +269,9 @@
   bool SupportsExternalActions() override;
   void RequestExternalAction(
       const ExternalActionProto& external_action,
+      base::OnceCallback<void()> start_dom_checks_callback,
       base::OnceCallback<void(ExternalActionDelegate::ActionResult result)>
-          callback) override;
+          end_action_callback) override;
   bool MustUseBackendData() const override;
 
  private:
diff --git a/components/autofill_assistant/browser/script_executor_ui_delegate.h b/components/autofill_assistant/browser/script_executor_ui_delegate.h
index 538c8914..cf9764e8 100644
--- a/components/autofill_assistant/browser/script_executor_ui_delegate.h
+++ b/components/autofill_assistant/browser/script_executor_ui_delegate.h
@@ -97,8 +97,9 @@
   // Executes the external action.
   virtual void ExecuteExternalAction(
       const external::Action& external_action,
+      base::OnceCallback<void()> start_dom_checks_callback,
       base::OnceCallback<void(ExternalActionDelegate::ActionResult result)>
-          callback) = 0;
+          end_action_callback) = 0;
 
  protected:
   virtual ~ScriptExecutorUiDelegate() {}
diff --git a/components/autofill_assistant/browser/ui_controller.cc b/components/autofill_assistant/browser/ui_controller.cc
index 0f5ee647..a17ac48 100644
--- a/components/autofill_assistant/browser/ui_controller.cc
+++ b/components/autofill_assistant/browser/ui_controller.cc
@@ -1161,9 +1161,10 @@
 }
 
 void UiController::ExecuteExternalAction(
-    const external::Action& info,
+    const external::Action& external_action,
+    base::OnceCallback<void()> start_dom_checks_callback,
     base::OnceCallback<void(ExternalActionDelegate::ActionResult result)>
-        callback) {
+        end_action_callback) {
   NOTREACHED() << "Flows using default UI don't support external actions.";
 }
 
diff --git a/components/autofill_assistant/browser/ui_controller.h b/components/autofill_assistant/browser/ui_controller.h
index 02cd0286..9aadb62 100644
--- a/components/autofill_assistant/browser/ui_controller.h
+++ b/components/autofill_assistant/browser/ui_controller.h
@@ -194,9 +194,10 @@
   void OnShutdown(Metrics::DropOutReason reason) override;
   bool SupportsExternalActions() override;
   void ExecuteExternalAction(
-      const external::Action& info,
+      const external::Action& external_action,
+      base::OnceCallback<void()> start_dom_checks_callback,
       base::OnceCallback<void(ExternalActionDelegate::ActionResult result)>
-          callback) override;
+          end_action_callback) override;
 
   // Overrides AutofillAssistantTtsController::TtsEventDelegate
   void OnTtsEvent(AutofillAssistantTtsController::TtsEventType event) override;
diff --git a/components/browser_ui/styles/android/BUILD.gn b/components/browser_ui/styles/android/BUILD.gn
index 00e1552..ba3c5bab 100644
--- a/components/browser_ui/styles/android/BUILD.gn
+++ b/components/browser_ui/styles/android/BUILD.gn
@@ -46,7 +46,7 @@
     "java/res/color/icon_animated_faded_color_list.xml",
     "java/res/color/new_tab_button_pressed_tint.xml",
     "java/res/color/new_tab_button_tint.xml",
-    "java/res/color/progress_bar_bg_color.xml",
+    "java/res/color/progress_bar_bg_color_list.xml",
     "java/res/color/selection_control_button_tint.xml",
     "java/res/color/switch_thumb_tint.xml",
     "java/res/color/switch_thumb_tint_incognito.xml",
diff --git a/components/browser_ui/styles/android/java/res/color/progress_bar_bg_color.xml b/components/browser_ui/styles/android/java/res/color/progress_bar_bg_color_list.xml
similarity index 100%
rename from components/browser_ui/styles/android/java/res/color/progress_bar_bg_color.xml
rename to components/browser_ui/styles/android/java/res/color/progress_bar_bg_color_list.xml
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ClipDrawableProgressBar.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ClipDrawableProgressBar.java
index 38dbc9b8..f4f79b91c 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ClipDrawableProgressBar.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ClipDrawableProgressBar.java
@@ -73,7 +73,7 @@
         mDesiredVisibility = getVisibility();
 
         int foregroundColor = SemanticColorUtils.getProgressBarForeground(getContext());
-        mBackgroundColor = getContext().getColor(R.color.progress_bar_bg_color);
+        mBackgroundColor = getContext().getColor(R.color.progress_bar_bg_color_list);
 
         mForegroundDrawable = new ColorDrawable(foregroundColor);
         setImageDrawable(
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/MaterialProgressBar.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/MaterialProgressBar.java
index a6179c8..a4fa35b 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/MaterialProgressBar.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/MaterialProgressBar.java
@@ -156,7 +156,7 @@
 
     private void initialize(Context context, AttributeSet attrs, int defStyle) {
         Resources resources = context.getResources();
-        int backgroundColor = context.getColor(R.color.progress_bar_bg_color);
+        int backgroundColor = context.getColor(R.color.progress_bar_bg_color_list);
         int progressColor = SemanticColorUtils.getProgressBarForeground(context);
         int secondaryProgressColor = context.getColor(R.color.progress_bar_secondary);
 
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json
index b141f34..1ef8557 100644
--- a/components/certificate_transparency/data/log_list.json
+++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@
 {
-  "version": "9.13",
-  "log_list_timestamp": "2022-05-15T12:54:42Z",
+  "version": "9.14",
+  "log_list_timestamp": "2022-05-16T12:55:42Z",
   "operators": [
     {
       "name": "Google",
diff --git a/components/download/internal/common/download_response_handler.cc b/components/download/internal/common/download_response_handler.cc
index ed1e7f0..ee44dabe 100644
--- a/components/download/internal/common/download_response_handler.cc
+++ b/components/download/internal/common/download_response_handler.cc
@@ -128,8 +128,14 @@
   if (create_info_->result != DOWNLOAD_INTERRUPT_REASON_NONE)
     OnResponseStarted(mojom::DownloadStreamHandlePtr());
 
-  if (body)
-    OnStartLoadingResponseBody(std::move(body));
+  if (started_)
+    return;
+
+  mojom::DownloadStreamHandlePtr stream_handle =
+      mojom::DownloadStreamHandle::New();
+  stream_handle->stream = std::move(body);
+  stream_handle->client_receiver = client_remote_.BindNewPipeAndPassReceiver();
+  OnResponseStarted(std::move(stream_handle));
 }
 
 std::unique_ptr<DownloadCreateInfo>
@@ -231,18 +237,6 @@
 void DownloadResponseHandler::OnTransferSizeUpdated(
     int32_t transfer_size_diff) {}
 
-void DownloadResponseHandler::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle body) {
-  if (started_)
-    return;
-
-  mojom::DownloadStreamHandlePtr stream_handle =
-      mojom::DownloadStreamHandle::New();
-  stream_handle->stream = std::move(body);
-  stream_handle->client_receiver = client_remote_.BindNewPipeAndPassReceiver();
-  OnResponseStarted(std::move(stream_handle));
-}
-
 void DownloadResponseHandler::OnComplete(
     const network::URLLoaderCompletionStatus& status) {
   if (completed_)
diff --git a/components/download/internal/common/resource_downloader.cc b/components/download/internal/common/resource_downloader.cc
index 2934f2ba..565ea4e5 100644
--- a/components/download/internal/common/resource_downloader.cc
+++ b/components/download/internal/common/resource_downloader.cc
@@ -40,8 +40,6 @@
                         OnUploadProgressCallback callback) override {}
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override {}
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override {}
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override {}
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
  private:
@@ -219,8 +217,7 @@
   // Simulate on the new URLLoaderClient calls that happened on the old client.
   response_head->cert_status = cert_status;
   url_loader_client_->OnReceiveResponse(std::move(response_head),
-                                        mojo::ScopedDataPipeConsumerHandle());
-  url_loader_client_->OnStartLoadingResponseBody(std::move(response_body));
+                                        std::move(response_body));
 
   // Bind the new client.
   url_loader_client_receiver_ =
diff --git a/components/download/public/common/download_response_handler.h b/components/download/public/common/download_response_handler.h
index d56dad69..47e816d 100644
--- a/components/download/public/common/download_response_handler.h
+++ b/components/download/public/common/download_response_handler.h
@@ -75,8 +75,6 @@
                         OnUploadProgressCallback callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
  private:
diff --git a/components/embedder_support/android/util/android_stream_reader_url_loader.cc b/components/embedder_support/android/util/android_stream_reader_url_loader.cc
index 0ed93d6..2656856e 100644
--- a/components/embedder_support/android/util/android_stream_reader_url_loader.cc
+++ b/components/embedder_support/android/util/android_stream_reader_url_loader.cc
@@ -330,8 +330,7 @@
   cache_response_ =
       response_delegate_->ShouldCacheResponse(response_head_.get());
   client_->OnReceiveResponse(std::move(response_head_),
-                             mojo::ScopedDataPipeConsumerHandle());
-  client_->OnStartLoadingResponseBody(std::move(consumer_handle_));
+                             std::move(consumer_handle_));
 }
 
 void AndroidStreamReaderURLLoader::ReadMore() {
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc
index a59ffcfa..5c4afc77 100644
--- a/components/history/core/browser/history_backend.cc
+++ b/components/history/core/browser/history_backend.cc
@@ -242,19 +242,6 @@
                      is_canceled_));
 }
 
-// HistoryBackendHelper --------------------------------------------------------
-
-// Wrapper around base::SupportsUserData with a public destructor.
-class HistoryBackendHelper : public base::SupportsUserData {
- public:
-  HistoryBackendHelper();
-  ~HistoryBackendHelper() override;
-};
-
-HistoryBackendHelper::HistoryBackendHelper() = default;
-
-HistoryBackendHelper::~HistoryBackendHelper() = default;
-
 // HistoryBackend --------------------------------------------------------------
 
 // static
@@ -286,9 +273,6 @@
   DCHECK(scheduled_commit_.IsCancelled()) << "Deleting without cleanup";
   queued_history_db_tasks_.clear();
 
-  // Release stashed embedder object before cleaning up the databases.
-  supports_user_data_helper_.reset();
-
   // Clear the error callback. The error callback that is installed does not
   // process an error immediately, rather it uses a PostTask() with `this`. As
   // `this` is being deleted, scheduling a PostTask() with `this` would be
@@ -323,11 +307,6 @@
          "that ~TestingProfile() has not been called or that the "
          "ScopedTempDirectory used outlives this task.";
 
-  // HistoryBackend is created on the UI thread by HistoryService, then the
-  // HistoryBackend::Init() method is called on the DB thread. Create the
-  // base::SupportsUserData on the DB thread since it is not thread-safe.
-  supports_user_data_helper_ = std::make_unique<HistoryBackendHelper>();
-
   if (!force_fail)
     InitImpl(history_database_params);
   delegate_->DBLoaded();
@@ -1164,7 +1143,7 @@
   typed_url_sync_bridge_ = std::move(bridge);
 }
 
-bool HistoryBackend::IsExpiredVisitTime(const base::Time& time) {
+bool HistoryBackend::IsExpiredVisitTime(const base::Time& time) const {
   return time < expirer_.GetCurrentExpirationTime();
 }
 
@@ -2542,9 +2521,6 @@
   bool success = db_->Raze();
   UMA_HISTOGRAM_BOOLEAN("History.KillHistoryDatabaseResult", success);
 
-  // Release stashed embedder object before cleaning up the databases.
-  supports_user_data_helper_.reset();
-
   // The expirer keeps tabs on the active databases. Tell it about the
   // databases which will be closed.
   expirer_.SetDatabases(nullptr, nullptr);
@@ -2554,19 +2530,6 @@
   CloseAllDatabases();
 }
 
-base::SupportsUserData::Data* HistoryBackend::GetUserData(
-    const void* key) const {
-  DCHECK(supports_user_data_helper_);
-  return supports_user_data_helper_->GetUserData(key);
-}
-
-void HistoryBackend::SetUserData(
-    const void* key,
-    std::unique_ptr<base::SupportsUserData::Data> data) {
-  DCHECK(supports_user_data_helper_);
-  supports_user_data_helper_->SetUserData(key, std::move(data));
-}
-
 void HistoryBackend::ProcessDBTask(
     std::unique_ptr<HistoryDBTask> task,
     scoped_refptr<base::SingleThreadTaskRunner> origin_loop,
diff --git a/components/history/core/browser/history_backend.h b/components/history/core/browser/history_backend.h
index e2558a8..e71c0ab 100644
--- a/components/history/core/browser/history_backend.h
+++ b/components/history/core/browser/history_backend.h
@@ -66,7 +66,6 @@
 struct HistoryDatabaseParams;
 class HistoryDBTask;
 class InMemoryHistoryBackend;
-class HistoryBackendHelper;
 class TypedURLSyncBridge;
 class URLDatabase;
 
@@ -247,7 +246,7 @@
 
   // `request.time` must be unique with high probability.
   void AddPage(const HistoryAddPageArgs& request);
-  virtual void SetPageTitle(const GURL& url, const std::u16string& title);
+  void SetPageTitle(const GURL& url, const std::u16string& title);
   void AddPageNoVisitForBookmark(const GURL& url, const std::u16string& title);
   void UpdateWithPageEndTime(ContextID context_id,
                              int nav_entry_id,
@@ -499,26 +498,24 @@
       scoped_refptr<base::SingleThreadTaskRunner> origin_loop,
       const base::CancelableTaskTracker::IsCanceledCallback& is_canceled);
 
-  virtual bool GetAllTypedURLs(URLRows* urls);
+  bool GetAllTypedURLs(URLRows* urls);
 
-  virtual bool GetVisitsForURL(URLID id, VisitVector* visits);
+  bool GetVisitsForURL(URLID id, VisitVector* visits);
 
   // Fetches up to `max_visits` most recent visits for the passed URL.
-  virtual bool GetMostRecentVisitsForURL(URLID id,
-                                         int max_visits,
-                                         VisitVector* visits);
+  bool GetMostRecentVisitsForURL(URLID id, int max_visits, VisitVector* visits);
 
   // For each element in `urls`, updates the pre-existing URLRow in the database
   // with the same ID; or ignores the element if no such row exists. Returns the
   // number of records successfully updated.
-  virtual size_t UpdateURLs(const URLRows& urls);
+  size_t UpdateURLs(const URLRows& urls);
 
   // While adding visits in batch, the source needs to be provided.
-  virtual bool AddVisits(const GURL& url,
-                         const std::vector<VisitInfo>& visits,
-                         VisitSource visit_source);
+  bool AddVisits(const GURL& url,
+                 const std::vector<VisitInfo>& visits,
+                 VisitSource visit_source);
 
-  virtual bool RemoveVisits(const VisitVector& visits);
+  bool RemoveVisits(const VisitVector& visits);
 
   // Returns the `VisitSource` associated with each one of the passed visits.
   // If there is no entry in the map for a given visit, that means the visit
@@ -528,7 +525,7 @@
   // Like `GetVisitsSource`, but for a single visit.
   bool GetVisitSource(const VisitID visit_id, VisitSource* source);
 
-  virtual bool GetURL(const GURL& url, URLRow* url_row);
+  bool GetURL(const GURL& url, URLRow* url_row);
 
   bool GetURLByID(URLID url_id, URLRow* url_row);
 
@@ -590,14 +587,6 @@
   // managed by HistoryBackend when the history database cannot be accessed.
   void KillHistoryDatabase();
 
-  // SupportsUserData ----------------------------------------------------------
-
-  // The user data allows the clients to associate data with this object.
-  // Multiple user data values can be stored under different keys.
-  base::SupportsUserData::Data* GetUserData(const void* key) const;
-  void SetUserData(const void* key,
-                   std::unique_ptr<base::SupportsUserData::Data> data);
-
   // Testing -------------------------------------------------------------------
 
   // Sets the task to run and the message loop to run it on when this object
@@ -623,7 +612,7 @@
 
   // Returns true if the passed visit time is already expired (used by the sync
   // code to avoid syncing visits that would immediately be expired).
-  virtual bool IsExpiredVisitTime(const base::Time& time);
+  virtual bool IsExpiredVisitTime(const base::Time& time) const;
 
   base::Time GetFirstRecordedTimeForTest() { return first_recorded_time_; }
 
@@ -862,11 +851,6 @@
 
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
 
-  // Used to allow embedder code to stash random data by key. Those object will
-  // be deleted before closing the databases (hence the member variable instead
-  // of inheritance from base::SupportsUserData).
-  std::unique_ptr<HistoryBackendHelper> supports_user_data_helper_;
-
   // Listens for the system being under memory pressure.
   std::unique_ptr<base::MemoryPressureListener> memory_pressure_listener_;
 
diff --git a/components/history/core/browser/sync/delete_directive_handler.cc b/components/history/core/browser/sync/delete_directive_handler.cc
index a1a920a3..c038b64 100644
--- a/components/history/core/browser/sync/delete_directive_handler.cc
+++ b/components/history/core/browser/sync/delete_directive_handler.cc
@@ -31,8 +31,9 @@
   std::string result;
   const int kMin = static_cast<int>(' ');
   const int kMax = static_cast<int>('~');
-  for (size_t i = 0; i < length; ++i)
+  for (size_t i = 0; i < length; ++i) {
     result.push_back(static_cast<char>(base::RandInt(kMin, kMax)));
+  }
   return result;
 }
 
@@ -52,10 +53,12 @@
       data1.GetSpecifics().history_delete_directive().time_range_directive();
   const sync_pb::TimeRangeDirective& range2 =
       data2.GetSpecifics().history_delete_directive().time_range_directive();
-  if (range1.start_time_usec() < range2.start_time_usec())
+  if (range1.start_time_usec() < range2.start_time_usec()) {
     return true;
-  if (range1.start_time_usec() > range2.start_time_usec())
+  }
+  if (range1.start_time_usec() > range2.start_time_usec()) {
     return false;
+  }
   return range1.end_time_usec() < range2.end_time_usec();
 }
 
@@ -91,8 +94,9 @@
     DCHECK(!delete_directive.has_time_range_directive());
     DCHECK(!delete_directive.has_url_directive());
     DCHECK_NE(global_id_directive.global_id_size(), 0);
-    if (global_id_directive.has_start_time_usec())
+    if (global_id_directive.has_start_time_usec()) {
       DCHECK_GE(global_id_directive.start_time_usec(), 0);
+    }
     if (global_id_directive.has_end_time_usec()) {
       DCHECK_GT(global_id_directive.end_time_usec(), 0);
 
@@ -211,8 +215,9 @@
     ProcessGlobalIdDeleteDirectives(
         HistoryBackend* history_backend,
         const syncer::SyncDataList& global_id_directives) {
-  if (global_id_directives.empty())
+  if (global_id_directives.empty()) {
     return;
+  }
 
   // Group times represented by global IDs by time ranges of delete directives.
   // It's more efficient for backend to process all directives with same time
@@ -241,8 +246,9 @@
                               UnixUsecToTime(id_directive.end_time_usec()))]);
   }
 
-  if (id_times_group.empty())
+  if (id_times_group.empty()) {
     return;
+  }
 
   // Call backend to expire history of directives in each group.
   for (const auto& [begin_and_end_times, times] : id_times_group) {
@@ -258,8 +264,9 @@
     ProcessTimeRangeDeleteDirectives(
         HistoryBackend* history_backend,
         const syncer::SyncDataList& time_range_directives) {
-  if (time_range_directives.empty())
+  if (time_range_directives.empty()) {
     return;
+  }
 
   // Iterate through time range directives. Expire history in combined
   // time range for multiple directives whose time ranges overlap.
@@ -296,8 +303,9 @@
       }
       current_start_time = directive_start_time;
     }
-    if (directive_end_time > current_end_time)
+    if (directive_end_time > current_end_time) {
       current_end_time = directive_end_time;
+    }
   }
 
   if (!current_start_time.is_null()) {
@@ -320,16 +328,19 @@
     const sync_pb::UrlDirective& url_directive =
         delete_directive.url_directive();
 
-    if (!url_directive.has_url() || !url_directive.has_end_time_usec())
+    if (!url_directive.has_url() || !url_directive.has_end_time_usec()) {
       continue;
+    }
 
     GURL url(url_directive.url());
     base::Time end_time = UnixUsecToTime(url_directive.end_time_usec());
-    if (url.is_valid())
+    if (url.is_valid()) {
       deletions.emplace_back(url, end_time);
+    }
   }
-  if (!deletions.empty())
+  if (!deletions.empty()) {
     history_backend->DeleteURLsUntil(deletions);
+  }
 }
 
 DeleteDirectiveHandler::DeleteDirectiveHandler(
@@ -340,8 +351,9 @@
 
 void DeleteDirectiveHandler::OnBackendLoaded() {
   backend_loaded_ = true;
-  if (wait_until_ready_to_sync_cb_)
+  if (wait_until_ready_to_sync_cb_) {
     std::move(wait_until_ready_to_sync_cb_).Run();
+  }
 }
 
 bool DeleteDirectiveHandler::CreateTimeRangeDeleteDirective(
diff --git a/components/history/core/browser/sync/typed_url_sync_bridge.cc b/components/history/core/browser/sync/typed_url_sync_bridge.cc
index fc27482..68187d2 100644
--- a/components/history/core/browser/sync/typed_url_sync_bridge.cc
+++ b/components/history/core/browser/sync/typed_url_sync_bridge.cc
@@ -141,8 +141,9 @@
     DCHECK(entity_change->data().specifics.has_typed_url());
     const sync_pb::TypedUrlSpecifics& specifics =
         entity_change->data().specifics.typed_url();
-    if (ShouldIgnoreUrl(GURL(specifics.url())))
+    if (ShouldIgnoreUrl(GURL(specifics.url()))) {
       continue;
+    }
 
     // Ignore old sync urls that don't have any transition data stored with
     // them, or transition data that does not match the visit data (will be
@@ -234,13 +235,15 @@
 
     GURL url(specifics.url());
 
-    if (ShouldIgnoreUrl(url))
+    if (ShouldIgnoreUrl(url)) {
       continue;
+    }
 
     DCHECK(specifics.visits_size());
     sync_pb::TypedUrlSpecifics filtered_url = FilterExpiredVisits(specifics);
-    if (filtered_url.visits_size() == 0)
+    if (filtered_url.visits_size() == 0) {
       continue;
+    }
 
     UpdateFromSync(filtered_url, &new_synced_visits, &deleted_visits,
                    &updated_synced_urls, &new_synced_urls);
@@ -379,13 +382,16 @@
   DCHECK(sync_metadata_database_);
   DCHECK_GE(row.typed_count(), 0);
 
-  if (processing_syncer_changes_)
+  if (processing_syncer_changes_) {
     return;  // These are changes originating from us, ignore.
+  }
 
-  if (!change_processor()->IsTrackingMetadata())
+  if (!change_processor()->IsTrackingMetadata()) {
     return;  // Sync processor not yet ready, don't sync.
-  if (!ShouldSyncVisit(row.typed_count(), transition))
+  }
+  if (!ShouldSyncVisit(row.typed_count(), transition)) {
     return;
+  }
 
   std::unique_ptr<syncer::MetadataChangeList> metadata_change_list =
       CreateMetadataChangeList();
@@ -400,11 +406,13 @@
   DCHECK(sequence_checker_.CalledOnValidSequence());
   DCHECK(sync_metadata_database_);
 
-  if (processing_syncer_changes_)
+  if (processing_syncer_changes_) {
     return;  // These are changes originating from us, ignore.
+  }
 
-  if (!change_processor()->IsTrackingMetadata())
+  if (!change_processor()->IsTrackingMetadata()) {
     return;  // Sync processor not yet ready, don't sync.
+  }
 
   std::unique_ptr<syncer::MetadataChangeList> metadata_change_list =
       CreateMetadataChangeList();
@@ -425,11 +433,13 @@
   DCHECK(sequence_checker_.CalledOnValidSequence());
   DCHECK(sync_metadata_database_);
 
-  if (processing_syncer_changes_)
+  if (processing_syncer_changes_) {
     return;  // These are changes originating from us, ignore.
+  }
 
-  if (!change_processor()->IsTrackingMetadata())
+  if (!change_processor()->IsTrackingMetadata()) {
     return;  // Sync processor not yet ready, don't sync.
+  }
 
   // Ignore URLs expired due to old age (we don't want to sync them as deletions
   // to avoid extra traffic up to the server, and also to make sure that a
@@ -542,8 +552,10 @@
 
   for (const VisitRow& visit : visits) {
     // Skip reload visits.
-    if (PageTransitionCoreTypeIs(visit.transition, ui::PAGE_TRANSITION_RELOAD))
+    if (PageTransitionCoreTypeIs(visit.transition,
+                                 ui::PAGE_TRANSITION_RELOAD)) {
       continue;
+    }
 
     // If we only have room for typed visits, then only add typed visits.
     if (only_typed && !PageTransitionCoreTypeIs(visit.transition,
@@ -624,11 +636,13 @@
          history_visit_index < history_num_visits) {
     // Time objects are initialized to "earliest possible time".
     base::Time sync_url_time, history_time;
-    if (sync_url_visit_index < sync_url_num_visits)
+    if (sync_url_visit_index < sync_url_num_visits) {
       sync_url_time =
           base::Time::FromInternalValue(sync_url.visits(sync_url_visit_index));
-    if (history_visit_index < history_num_visits)
+    }
+    if (history_visit_index < history_num_visits) {
       history_time = (*visits)[history_visit_index].visit_time;
+    }
     if (sync_url_visit_index >= sync_url_num_visits ||
         (history_visit_index < history_num_visits &&
          sync_url_time > history_time)) {
@@ -955,8 +969,9 @@
     URLRow row,
     bool is_from_expiration,
     syncer::MetadataChangeList* metadata_change_list) {
-  if (ShouldIgnoreUrl(row.url()))
+  if (ShouldIgnoreUrl(row.url())) {
     return;
+  }
 
   // Get the visits for this node.
   std::vector<VisitRow> visit_vector;
@@ -1028,8 +1043,9 @@
   if (new_visits) {
     for (const auto& [url, visit_infos] : *new_visits) {
       // If there are no visits to add, just skip this.
-      if (visit_infos.empty())
+      if (visit_infos.empty()) {
         continue;
+      }
       if (!history_backend_->AddVisits(url, visit_infos, SOURCE_SYNCED)) {
         return syncer::ModelError(FROM_HERE,
                                   "Could not add visits to HistoryBackend.");
@@ -1071,22 +1087,26 @@
   // Ignore empty URLs. Not sure how this can happen (maybe import from other
   // busted browsers, or misuse of the history API, or just plain bugs) but we
   // can't deal with them.
-  if (url.spec().empty())
+  if (url.spec().empty()) {
     return true;
+  }
 
   // Ignore local file URLs.
-  if (url.SchemeIsFile())
+  if (url.SchemeIsFile()) {
     return true;
+  }
 
   // Ignore localhost URLs.
-  if (net::IsLocalhost(url))
+  if (net::IsLocalhost(url)) {
     return true;
+  }
 
   // Ignore username and password, since history backend will remove user name
   // and password in database_utils::GurlToDatabaseUrl and send
   // username/password removed url to sync later.
-  if (url.has_username() || url.has_password())
+  if (url.has_username() || url.has_password()) {
     return true;
+  }
 
   return false;
 }
@@ -1097,8 +1117,9 @@
   // chromium.
   static const int kFirstImportedSource = SOURCE_FIREFOX_IMPORTED;
   VisitSourceMap map;
-  if (!history_backend_->GetVisitsSource(visits, &map))
+  if (!history_backend_->GetVisitsSource(visits, &map)) {
     return false;  // If we can't read the visit, assume it's not imported.
+  }
 
   // Walk the list of visits and look for a non-imported item.
   for (const VisitRow& visit : visits) {
diff --git a/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc b/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc
index ff72455c..c84aeaf1 100644
--- a/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc
+++ b/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc
@@ -291,7 +291,7 @@
                        std::move(backend_client),
                        base::ThreadTaskRunnerHandle::Get()) {}
 
-  bool IsExpiredVisitTime(const Time& time) override {
+  bool IsExpiredVisitTime(const Time& time) const override {
     return time.ToDeltaSinceWindowsEpoch().InMicroseconds() == kExpiredVisit;
   }
 
@@ -1281,12 +1281,15 @@
   // Add `kMaxTypedUrlVisits` + 10 visits to the url. The 10 oldest
   // non-typed visits are expected to be skipped.
   int i = 1;
-  for (; i <= kMaxTypedUrlVisits - 20; ++i)
+  for (; i <= kMaxTypedUrlVisits - 20; ++i) {
     AddNewestVisit(ui::PAGE_TRANSITION_TYPED, i, &url_row, &visits);
-  for (; i <= kMaxTypedUrlVisits; ++i)
+  }
+  for (; i <= kMaxTypedUrlVisits; ++i) {
     AddNewestVisit(ui::PAGE_TRANSITION_LINK, i, &url_row, &visits);
-  for (; i <= kMaxTypedUrlVisits + 10; ++i)
+  }
+  for (; i <= kMaxTypedUrlVisits + 10; ++i) {
     AddNewestVisit(ui::PAGE_TRANSITION_TYPED, i, &url_row, &visits);
+  }
 
   fake_history_backend_->SetVisitsForUrl(&url_row, visits);
 
@@ -1339,8 +1342,9 @@
   // Add enough visits to the url so that typed count is above the throttle
   // limit, and not right on the interval that gets synced.
   int i = 1;
-  for (; i < kVisitThrottleThreshold + kVisitThrottleMultiple / 2; ++i)
+  for (; i < kVisitThrottleThreshold + kVisitThrottleMultiple / 2; ++i) {
     AddNewestVisit(ui::PAGE_TRANSITION_TYPED, i, &url_row, &visits);
+  }
   fake_history_backend_->SetVisitsForUrl(&url_row, visits);
 
   // Notify typed url sync service of typed visit.
@@ -1349,8 +1353,9 @@
                          RedirectList(), Time());
 
   visits.clear();
-  for (; i % kVisitThrottleMultiple != 1; ++i)
+  for (; i % kVisitThrottleMultiple != 1; ++i) {
     AddNewestVisit(ui::PAGE_TRANSITION_TYPED, i, &url_row, &visits);
+  }
   --i;  // Account for the increment before the condition ends.
   fake_history_backend_->SetVisitsForUrl(&url_row, visits);
 
diff --git a/components/history/core/browser/sync/typed_url_sync_metadata_database.cc b/components/history/core/browser/sync/typed_url_sync_metadata_database.cc
index faf273e3..2ef860a 100644
--- a/components/history/core/browser/sync/typed_url_sync_metadata_database.cc
+++ b/components/history/core/browser/sync/typed_url_sync_metadata_database.cc
@@ -44,8 +44,9 @@
   }
 
   sync_pb::ModelTypeState model_type_state;
-  if (!GetModelTypeState(&model_type_state))
+  if (!GetModelTypeState(&model_type_state)) {
     return false;
+  }
 
   metadata_batch->SetModelTypeState(model_type_state);
   return true;
@@ -158,8 +159,9 @@
         SQL_FROM_HERE,
         "DELETE FROM typed_url_sync_metadata WHERE storage_key=?"));
     del.BindInt64(0, rowid);
-    if (!del.Run())
+    if (!del.Run()) {
       return false;
+    }
   }
 
   return true;
diff --git a/components/language/core/browser/BUILD.gn b/components/language/core/browser/BUILD.gn
index fdba4ca..96635294 100644
--- a/components/language/core/browser/BUILD.gn
+++ b/components/language/core/browser/BUILD.gn
@@ -4,6 +4,8 @@
 
 static_library("browser") {
   sources = [
+    "accept_languages_service.cc",
+    "accept_languages_service.h",
     "language_model.cc",
     "language_model.h",
     "language_model_manager.cc",
@@ -24,6 +26,7 @@
 
   deps = [
     "//base",
+    "//base:i18n",
     "//build:chromeos_buildflags",
     "//components/keyed_service/core",
     "//components/language/core/common",
@@ -37,6 +40,7 @@
 source_set("unit_tests") {
   testonly = true
   sources = [
+    "accept_languages_service_unittest.cc",
     "language_model_manager_unittest.cc",
     "language_prefs_unittest.cc",
     "language_usage_metrics_unittest.cc",
diff --git a/components/translate/core/browser/translate_accept_languages.cc b/components/language/core/browser/accept_languages_service.cc
similarity index 72%
rename from components/translate/core/browser/translate_accept_languages.cc
rename to components/language/core/browser/accept_languages_service.cc
index c89339c6..048edd4 100644
--- a/components/translate/core/browser/translate_accept_languages.cc
+++ b/components/language/core/browser/accept_languages_service.cc
@@ -2,23 +2,23 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/translate/core/browser/translate_accept_languages.h"
+#include "components/language/core/browser/accept_languages_service.h"
 
 #include <stddef.h>
 
 #include "base/bind.h"
+#include "base/i18n/rtl.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "components/language/core/common/language_util.h"
 #include "components/prefs/pref_service.h"
-#include "components/translate/core/browser/translate_download_manager.h"
 #include "ui/base/l10n/l10n_util.h"
 
-namespace translate {
+namespace language {
 
-TranslateAcceptLanguages::TranslateAcceptLanguages(
+AcceptLanguagesService::AcceptLanguagesService(
     PrefService* prefs,
     const char* accept_languages_pref)
     : accept_languages_pref_(accept_languages_pref) {
@@ -28,33 +28,32 @@
   pref_change_registrar_.Init(prefs);
   pref_change_registrar_.Add(
       accept_languages_pref,
-      base::BindRepeating(&TranslateAcceptLanguages::InitAcceptLanguages,
+      base::BindRepeating(&AcceptLanguagesService::InitAcceptLanguages,
                           base::Unretained(this), prefs));
 }
 
-TranslateAcceptLanguages::~TranslateAcceptLanguages() {}
+AcceptLanguagesService::~AcceptLanguagesService() = default;
 
 // static
-bool TranslateAcceptLanguages::CanBeAcceptLanguage(base::StringPiece language) {
+bool AcceptLanguagesService::CanBeAcceptLanguage(base::StringPiece language) {
   SCOPED_UMA_HISTOGRAM_TIMER("Translate.AcceptLanguages.CanBeAcceptDuration");
 
   std::string accept_language(language);
   language::ToChromeLanguageSynonym(&accept_language);
 
-  const std::string locale =
-      TranslateDownloadManager::GetInstance()->application_locale();
+  const std::string ui_locale = base::i18n::GetConfiguredLocale();
 
-  return l10n_util::IsLanguageAccepted(locale, accept_language);
+  return l10n_util::IsLanguageAccepted(ui_locale, accept_language);
 }
 
-bool TranslateAcceptLanguages::IsAcceptLanguage(
+bool AcceptLanguagesService::IsAcceptLanguage(
     base::StringPiece language) const {
   std::string accept_language(language);
   language::ToChromeLanguageSynonym(&accept_language);
   return accept_languages_.find(accept_language) != accept_languages_.end();
 }
 
-void TranslateAcceptLanguages::InitAcceptLanguages(PrefService* prefs) {
+void AcceptLanguagesService::InitAcceptLanguages(PrefService* prefs) {
   DCHECK(prefs);
   // Build the languages.
   accept_languages_.clear();
@@ -71,4 +70,4 @@
   }
 }
 
-}  // namespace translate
+}  // namespace language
diff --git a/components/translate/core/browser/translate_accept_languages.h b/components/language/core/browser/accept_languages_service.h
similarity index 61%
rename from components/translate/core/browser/translate_accept_languages.h
rename to components/language/core/browser/accept_languages_service.h
index 8fe56f36..4b971126 100644
--- a/components/translate/core/browser/translate_accept_languages.h
+++ b/components/language/core/browser/accept_languages_service.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_ACCEPT_LANGUAGES_H_
-#define COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_ACCEPT_LANGUAGES_H_
+#ifndef COMPONENTS_LANGUAGE_CORE_BROWSER_ACCEPT_LANGUAGES_SERVICE_H_
+#define COMPONENTS_LANGUAGE_CORE_BROWSER_ACCEPT_LANGUAGES_SERVICE_H_
 
 #include <set>
 #include <string>
@@ -14,24 +14,24 @@
 
 class PrefService;
 
-namespace translate {
+namespace language {
 
-// TranslateAcceptLanguages tracks the value of the "Accept-Language" HTTP
+// AcceptLanguagesService tracks the value of the "Accept-Language" HTTP
 // header.
-class TranslateAcceptLanguages : public KeyedService {
+class AcceptLanguagesService : public KeyedService {
  public:
   // |accept_languages_pref| is the path to the preference storing the accept
   // languages.
-  TranslateAcceptLanguages(PrefService* prefs,
-                           const char* accept_languages_pref);
+  AcceptLanguagesService(PrefService* prefs, const char* accept_languages_pref);
 
-  TranslateAcceptLanguages(const TranslateAcceptLanguages&) = delete;
-  TranslateAcceptLanguages& operator=(const TranslateAcceptLanguages&) = delete;
+  AcceptLanguagesService(const AcceptLanguagesService&) = delete;
+  AcceptLanguagesService& operator=(const AcceptLanguagesService&) = delete;
 
-  ~TranslateAcceptLanguages() override;
+  ~AcceptLanguagesService() override;
 
-  // Returns true if |language| is available as Accept-Languages. |language|
-  // will be converted if it has the synonym of accept language.
+  // Returns true if |language| is available as Accept-Languages for the given
+  // |display_locale|. |language| will be converted if it has the synonym of
+  // accept language.
   static bool CanBeAcceptLanguage(base::StringPiece language);
 
   // Returns true if the passed language has been configured by the user as an
@@ -54,6 +54,6 @@
   const std::string accept_languages_pref_;
 };
 
-}  // namespace translate
+}  // namespace language
 
-#endif  // COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_ACCEPT_LANGUAGES_H_
+#endif  // COMPONENTS_LANGUAGE_CORE_BROWSER_ACCEPT_LANGUAGES_SERVICE_H_
diff --git a/components/translate/core/browser/translate_accept_languages_unittest.cc b/components/language/core/browser/accept_languages_service_unittest.cc
similarity index 66%
rename from components/translate/core/browser/translate_accept_languages_unittest.cc
rename to components/language/core/browser/accept_languages_service_unittest.cc
index a97a77b..f48988c 100644
--- a/components/translate/core/browser/translate_accept_languages_unittest.cc
+++ b/components/language/core/browser/accept_languages_service_unittest.cc
@@ -2,14 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/translate/core/browser/translate_accept_languages.h"
+#include "components/language/core/browser/accept_languages_service.h"
 
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/testing_pref_service.h"
 #include "components/translate/core/browser/translate_download_manager.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace translate {
+using translate::TranslateDownloadManager;
+
+namespace language {
 namespace {
 
 // RAII class to set the TranslateDownloadManager application locale, and then
@@ -30,11 +32,11 @@
   const std::string existing_locale_;
 };
 
-TEST(TranslateAcceptLanguagesTest, TestIsAcceptLanguage) {
+TEST(AcceptLanguagesServiceTest, TestIsAcceptLanguage) {
   const char* const pref_setting = "translate-accept-languages";
   TestingPrefServiceSimple prefs;
   prefs.registry()->RegisterStringPref(pref_setting, "en-US,es,zh-CN");
-  TranslateAcceptLanguages accept_languages(&prefs, pref_setting);
+  AcceptLanguagesService accept_languages(&prefs, pref_setting);
 
   // All valid.
   EXPECT_TRUE(accept_languages.IsAcceptLanguage("en"));
@@ -49,23 +51,23 @@
   EXPECT_FALSE(accept_languages.IsAcceptLanguage("zh"));
 }
 
-TEST(TranslateAcceptLanguagesTest, TestCanBeAcceptLanguage) {
+TEST(AcceptLanguagesServiceTest, TestCanBeAcceptLanguage) {
   TranslateLocaleRestorer locale_restorer("es");
 
   // Valid accept languages.
-  EXPECT_TRUE(TranslateAcceptLanguages::CanBeAcceptLanguage("en"));
-  EXPECT_TRUE(TranslateAcceptLanguages::CanBeAcceptLanguage("en-US"));
-  EXPECT_TRUE(TranslateAcceptLanguages::CanBeAcceptLanguage("es"));
-  EXPECT_TRUE(TranslateAcceptLanguages::CanBeAcceptLanguage("es-419"));
-  EXPECT_TRUE(TranslateAcceptLanguages::CanBeAcceptLanguage("zh-CN"));
+  EXPECT_TRUE(AcceptLanguagesService::CanBeAcceptLanguage("en"));
+  EXPECT_TRUE(AcceptLanguagesService::CanBeAcceptLanguage("en-US"));
+  EXPECT_TRUE(AcceptLanguagesService::CanBeAcceptLanguage("es"));
+  EXPECT_TRUE(AcceptLanguagesService::CanBeAcceptLanguage("es-419"));
+  EXPECT_TRUE(AcceptLanguagesService::CanBeAcceptLanguage("zh-CN"));
 
   // Not valid format.
-  EXPECT_FALSE(TranslateAcceptLanguages::CanBeAcceptLanguage("en-us"));
-  EXPECT_FALSE(TranslateAcceptLanguages::CanBeAcceptLanguage("zh-Hant"));
+  EXPECT_FALSE(AcceptLanguagesService::CanBeAcceptLanguage("en-us"));
+  EXPECT_FALSE(AcceptLanguagesService::CanBeAcceptLanguage("zh-Hant"));
 
   // Not valid language.
-  EXPECT_FALSE(TranslateAcceptLanguages::CanBeAcceptLanguage("xx"));
+  EXPECT_FALSE(AcceptLanguagesService::CanBeAcceptLanguage("xx"));
 }
 
 }  // namespace
-}  // namespace translate
+}  // namespace language
diff --git a/components/page_load_metrics/OWNERS b/components/page_load_metrics/OWNERS
index ac1e8d0..6b50b55 100644
--- a/components/page_load_metrics/OWNERS
+++ b/components/page_load_metrics/OWNERS
@@ -5,3 +5,5 @@
 jkarlin@chromium.org
 ryansturm@chromium.org
 johnidel@chromium.org
+toyoshim@chromium.org
+
diff --git a/components/password_manager/core/browser/manage_passwords_referrer.h b/components/password_manager/core/browser/manage_passwords_referrer.h
index 59e96302..cef995aa 100644
--- a/components/password_manager/core/browser/manage_passwords_referrer.h
+++ b/components/password_manager/core/browser/manage_passwords_referrer.h
@@ -55,7 +55,10 @@
   // On Desktop, the Google Password Manager link was clicked in the password
   // generation prompt in the Autofill dropdown.
   kPasswordGenerationPrompt = 12,
-  kMaxValue = kPasswordGenerationPrompt,
+  // Corresponds to the situation when Chrome opens native Password Manager UI
+  // when navigating to specified website.
+  kPasswordsGoogleWebsite = 13,
+  kMaxValue = kPasswordsGoogleWebsite,
 };
 
 }  // namespace password_manager
diff --git a/components/password_manager/core/browser/sync/password_proto_utils.cc b/components/password_manager/core/browser/sync/password_proto_utils.cc
index b180cd6..da2eeae 100644
--- a/components/password_manager/core/browser/sync/password_proto_utils.cc
+++ b/components/password_manager/core/browser/sync/password_proto_utils.cc
@@ -283,8 +283,9 @@
   std::string* form_url = serialized_data.FindString(kUrlKey);
   std::string* form_action = serialized_data.FindString(kActionKey);
   base::Value::List* fields = serialized_data.FindList(kFieldsKey);
-  if (!form_name || !form_url || !form_action || !fields)
+  if (!form_name || !form_url || !form_action || !fields) {
     return false;
+  }
   form_data.name = base::UTF8ToUTF16(*form_name);
   form_data.url = GURL(*form_url);
   form_data.action = GURL(*form_action);
@@ -292,14 +293,16 @@
   for (auto& serialized_field : *fields) {
     base::Value::Dict* serialized_field_dictionary =
         serialized_field.GetIfDict();
-    if (!serialized_field_dictionary)
+    if (!serialized_field_dictionary) {
       return false;
+    }
     FormFieldData field;
     std::string* field_name = serialized_field_dictionary->FindString(kNameKey);
     std::string* field_type =
         serialized_field_dictionary->FindString(kFormControlTypeKey);
-    if (!field_name || !field_type)
+    if (!field_name || !field_type) {
       return false;
+    }
     field.name = base::UTF8ToUTF16(*field_name);
     field.form_control_type = *field_type;
     form_data.fields.push_back(field);
@@ -312,17 +315,20 @@
   JSONStringValueDeserializer json_deserializer(opaque_metadata);
   std::unique_ptr<base::Value> root(
       json_deserializer.Deserialize(nullptr, nullptr));
-  if (!root.get() || !root->is_dict())
+  if (!root.get() || !root->is_dict()) {
     return;
+  }
 
   base::Value::Dict serialized_data(std::move(root->GetDict()));
   auto skip_zero_click = serialized_data.FindBool(kSkipZeroClickKey);
   auto* serialized_form_data = serialized_data.FindDict(kFormDataKey);
-  if (!skip_zero_click.has_value() || !serialized_form_data)
+  if (!skip_zero_click.has_value() || !serialized_form_data) {
     return;
+  }
   FormData form_data;
-  if (!DeserializeFormData(*serialized_form_data, form_data))
+  if (!DeserializeFormData(*serialized_form_data, form_data)) {
     return;
+  }
   password_form.skip_zero_click = *skip_zero_click;
   password_form.form_data = std::move(form_data);
 }
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc
index 60292f9..16083d1 100644
--- a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc
+++ b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc
@@ -151,9 +151,10 @@
   password_data->set_username_value(username_value);
   password_data->set_password_element(password_element);
   password_data->set_signon_realm(signon_realm);
-  if (!issue_types.empty())
+  if (!issue_types.empty()) {
     *password_data->mutable_password_issues() =
         CreateSpecificsIssues(issue_types);
+  }
   return password_specifics.password();
 }
 
diff --git a/components/password_manager/core/common/password_manager_features.cc b/components/password_manager/core/common/password_manager_features.cc
index 51501ad8..b08d068 100644
--- a/components/password_manager/core/common/password_manager_features.cc
+++ b/components/password_manager/core/common/password_manager_features.cc
@@ -90,8 +90,14 @@
     base::FEATURE_DISABLED_BY_DEFAULT};
 
 // Enables (un)muting compromised passwords from bulk leak check in settings.
-const base::Feature kMuteCompromisedPasswords{
-    "MuteCompromisedPasswords", base::FEATURE_DISABLED_BY_DEFAULT};
+const base::Feature kMuteCompromisedPasswords {
+  "MuteCompromisedPasswords",
+#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
+      base::FEATURE_DISABLED_BY_DEFAULT
+#else
+      base::FEATURE_ENABLED_BY_DEFAULT
+#endif
+};
 
 // Enables adding, displaying and modifying extra notes to stored credentials.
 const base::Feature kPasswordNotes{"PasswordNotes",
diff --git a/components/pdf/browser/mock_url_loader_client.h b/components/pdf/browser/mock_url_loader_client.h
index 6d2f8ad..c379953 100644
--- a/components/pdf/browser/mock_url_loader_client.h
+++ b/components/pdf/browser/mock_url_loader_client.h
@@ -48,10 +48,6 @@
               (int32_t transfer_size_diff),
               (override));
   MOCK_METHOD(void,
-              OnStartLoadingResponseBody,
-              (mojo::ScopedDataPipeConsumerHandle body),
-              (override));
-  MOCK_METHOD(void,
               OnComplete,
               (const network::URLLoaderCompletionStatus& status),
               (override));
diff --git a/components/pdf/browser/plugin_response_writer.cc b/components/pdf/browser/plugin_response_writer.cc
index 44ea938a..8c4af89 100644
--- a/components/pdf/browser/plugin_response_writer.cc
+++ b/components/pdf/browser/plugin_response_writer.cc
@@ -100,8 +100,6 @@
   response->headers =
       base::MakeRefCounted<net::HttpResponseHeaders>("HTTP/1.1 200 OK");
   response->mime_type = "text/html";
-  client_->OnReceiveResponse(std::move(response),
-                             mojo::ScopedDataPipeConsumerHandle());
 
   mojo::ScopedDataPipeProducerHandle producer;
   mojo::ScopedDataPipeConsumerHandle consumer;
@@ -112,7 +110,7 @@
     return;
   }
 
-  client_->OnStartLoadingResponseBody(std::move(consumer));
+  client_->OnReceiveResponse(std::move(response), std::move(consumer));
 
   producer_ = std::make_unique<mojo::DataPipeProducer>(std::move(producer));
 
diff --git a/components/pdf/browser/plugin_response_writer_unittest.cc b/components/pdf/browser/plugin_response_writer_unittest.cc
index 19f59446..6cc52a9 100644
--- a/components/pdf/browser/plugin_response_writer_unittest.cc
+++ b/components/pdf/browser/plugin_response_writer_unittest.cc
@@ -79,8 +79,9 @@
 class PluginResponseWriterTest : public testing::Test {
  protected:
   PluginResponseWriterTest() {
-    ON_CALL(mock_client_, OnStartLoadingResponseBody)
-        .WillByDefault([this](mojo::ScopedDataPipeConsumerHandle body) {
+    ON_CALL(mock_client_, OnReceiveResponse)
+        .WillByDefault([this](network::mojom::URLResponseHeadPtr head,
+                              mojo::ScopedDataPipeConsumerHandle body) {
           body_drainer_ = std::make_unique<BodyDrainer>(std::move(body));
         });
   }
@@ -139,14 +140,13 @@
     testing::InSequence in_sequence;
 
     EXPECT_CALL(mock_client_, OnReceiveResponse)
-        .WillOnce([](network::mojom::URLResponseHeadPtr head,
-                     mojo::ScopedDataPipeConsumerHandle body) {
+        .WillOnce([this](network::mojom::URLResponseHeadPtr head,
+                         mojo::ScopedDataPipeConsumerHandle body) {
           EXPECT_EQ(200, head->headers->response_code());
           EXPECT_EQ("text/html", head->mime_type);
+          body_drainer_ = std::make_unique<BodyDrainer>(std::move(body));
         });
 
-    EXPECT_CALL(mock_client_, OnStartLoadingResponseBody);
-
     EXPECT_CALL(mock_client_, OnComplete)
         .WillOnce(
             [&run_loop](const network::URLLoaderCompletionStatus& status) {
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index c7c4894..88e41d8 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -1257,6 +1257,11 @@
 
       Ist sie auf "False" gesetzt oder nicht konfiguriert, wird keine Schaltfläche angezeigt.</translation>
 <translation id="2294382669900758280">Das Abspielen von Videos in Android-Apps wird nicht berücksichtigt, auch wenn diese Richtlinie auf <ph name="TRUE" /> gesetzt ist.</translation>
+<translation id="2297792368307475351">Wenn diese Richtlinie konfiguriert ist, kannst du eine Liste mit URL-Mustern erstellen, in der Websites angegeben werden, denen die Berechtigung zur Verwendung der Zwischenablage nicht gewährt wird. Das umfasst nicht alle Aktionen in der Zwischenablage, die auf Websites erfolgen, deren URL-Muster mit den angegebenen übereinstimmen. Nutzer können z. B. dennoch Inhalte über Tastenkombinationen kopieren, weil sich die Berechtigung zur Verwendung der Zwischenablage nicht auf diesen Vorgang bezieht.
+
+      Wenn die Richtlinie nicht konfiguriert ist, gilt „<ph name="DEFAULT_CLIPBOARD_SETTING" />“ für alle Websites, sofern konfiguriert. Falls nicht, wird die persönliche Einstellung des Nutzers verwendet.
+
+      Genaue Informationen zu gültigen <ph name="URL_LABEL" />-Mustern finden Sie unter https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. „<ph name="WILDCARD_VALUE" />“ ist kein akzeptierter Wert für diese Richtlinie.</translation>
 <translation id="2299220924812062390">Liste der aktivierten Plug-ins angeben</translation>
 <translation id="2301048990069984110">Unterstützung für Chrome-Apps unter Windows, Mac und Linux verlängern.</translation>
 <translation id="2303795211377219696">„Automatisches Ausfüllen“ für Kreditkarten aktivieren</translation>
@@ -1560,6 +1565,7 @@
 <translation id="2604182581880595781">Richtlinien für Netzwerkfreigaben konfigurieren.</translation>
 <translation id="2608535066974278204">Zeitraum (in Minuten), der die Dauer des Zeitfensters für den Neustart angibt.</translation>
 <translation id="2608887839902987727">Verhindern, dass die Captive-Portal-Authentifizierung Proxy-Einstellungen ignoriert</translation>
+<translation id="2608985885792348429">Standardmäßige Einstellung für die Zwischenablage</translation>
 <translation id="2615240493030733717">Informationen zur Zeitzone ausgeben</translation>
 <translation id="2619966380594000538">Wenn die Richtlinie aktiviert oder nicht konfiguriert ist, werden Sicherheitswarnungen angezeigt, wenn Chrome mit potenziell schädlichen Befehlszeilen-Flags gestartet wird.
 
@@ -1579,6 +1585,7 @@
 <translation id="264093234299818170">Alle Drucker außer den in der Sperrliste aufgeführten werden angezeigt.</translation>
 <translation id="264252574246191885">Nicht gelistet</translation>
 <translation id="2647069081229792812">Bearbeitung von Lesezeichen aktivieren oder deaktivieren</translation>
+<translation id="264771271300359481">Keiner Website erlauben, die Zwischenablage zu verwenden</translation>
 <translation id="2649896281375932517">Nutzer entscheiden lassen</translation>
 <translation id="2650049181907741121">Auszuführende Aktion beim Zuklappen des Geräts</translation>
 <translation id="2658653824183107970">Alte <ph name="CORS" />-Implementierung statt des neuen <ph name="CORS" /> verwenden</translation>
@@ -4039,6 +4046,7 @@
 <translation id="5470500958458209831">URL, über die das Ansible-Playbook heruntergeladen werden kann.</translation>
 <translation id="5475361623548884387">Drucken aktivieren</translation>
 <translation id="547601067149622666">Werbung auf Websites mit aufdringlichen Werbeanzeigen nicht zulassen</translation>
+<translation id="5476152378885134514">Zwischenablage für diese Websites blockieren</translation>
 <translation id="5478734531226638813">Durch die Aktivierung der Richtlinie wird die Aktualisierung von Kiosk-Chrome-Apps innerhalb der Sitzung deaktiviert (wofür die Update-URL aus dem Erweiterungsmanifest zum Einsatz kommt), wodurch nur noch der CRX-Vorabruf als Aktualisierungsmechanismus übrig bleibt.</translation>
 <translation id="5480380613778757009">Wenn diese Richtlinie deaktiviert oder nicht eingerichtet ist, werden alle in der verwalteten Gastsitzung festgelegten Anzeigeeinstellungen zurückgesetzt, sobald die Sitzung beendet ist. Ist diese Richtlinie auf „True“ gesetzt, bleiben Anzeigeeigenschaften nach dem Beenden der verwalteten Gastsitzung bestehen.</translation>
 <translation id="5483065054530244863">SHA-1-signierte Zertifikate zulassen, die von lokalen Vertrauensankern ausgestellt werden</translation>
@@ -4170,6 +4178,11 @@
 <translation id="5649046890958064703">Wenn <ph name="PRINTERS_BLACKLIST" /> für <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> ausgewählt ist, wird durch Festlegen von <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_POLICY_NAME" /> angegeben, welche Drucker die Nutzer nicht verwenden können. Mit Ausnahme der in dieser Richtlinie aufgeführten IDs können die Nutzer auf alle Drucker zugreifen. Die IDs müssen dem Feld <ph name="ID_FIELD" /> oder dem Feld <ph name="GUID_FIELD" /> in der Datei entsprechen, die in <ph name="DEVICE_PRINTERS_POLICY_NAME" /> angegeben ist.
 
       Diese Richtlinie wurde eingestellt. Bitte verwende stattdessen die Richtlinie <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.</translation>
+<translation id="5649773663020498924">Wenn die Richtlinie auf „2“ gesetzt ist, sind die Websites nicht dazu berechtigt, die Zwischenablage zu nutzen. Wenn die Richtlinie auf „3“ gesetzt oder nicht konfiguriert ist, kann der Nutzer die Einstellung ändern und entscheiden, ob die Clipboard APIs verfügbar sein sollen, wenn eine Website versucht, darauf zuzugreifen.
+
+      Die Richtlinie kann für bestimmte URL-Muster überschrieben werden. Hierfür stehen die Richtlinien „<ph name="CLIPBOARD_ALLOWED_FOR_URLS_POLICY_NAME" />“ und „<ph name="CLIPBOARD_BLOCKED_FOR_URLS_POLICY_NAME" />“ zur Verfügung.
+
+      Diese Richtlinie bezieht sich nur auf Aktionen in der Zwischenablage, die in der entsprechenden Websiteberechtigung konfiguriert werden. Sie hat keinerlei Auswirkung auf unformatierte Inhalte in der Zwischenablage oder vertrauenswürdige Kopieren/Einfügen-Vorgänge.</translation>
 <translation id="5652250453612826983">Legt die Richtlinien für die Elternaufsicht fest. Diese werden nur auf Kinderkonten angewendet.
       Diese Richtlinien werden nicht in der Admin-Konsole, sondern direkt von Kids API Server konfiguriert.</translation>
 <translation id="5654682237531873653">Wenn die Richtlinie aktiviert ist, ist die Rechtschreibprüfung an und Nutzer können sie nicht deaktivieren. Unter <ph name="MS_WIN_NAME" />, <ph name="PRODUCT_OS_NAME" /> und <ph name="LINUX_OS_NAME" /> können die Sprachen für die Rechtschreibprüfung einzeln aktiviert und deaktiviert werden. Dadurch haben Nutzer die Möglichkeit, die Rechtschreibprüfung durch Deaktivieren aller Sprachen auszuschalten. Soll diese Möglichkeit nicht zur Verfügung stehen, kann die Richtlinie <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> verwendet dazu werden, die Aktivierung bestimmter Sprachen für die Rechtschreibprüfung zu erzwingen.
@@ -4907,6 +4920,7 @@
 1) Der vom Nutzer angegebenen Sprache (falls konfiguriert).
       2) Der Systemsprache.
       3) Der Ersatzsprache (en-US).</translation>
+<translation id="6493089139124468815">Websites erlauben, den Nutzer zu bitten, die Zwischenablage verwenden zu dürfen</translation>
 <translation id="6493918190032622602">Mindestversion von <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="6495337487202227251">Diese Richtlinie ist veraltet und wird in Version 85 von <ph name="PRODUCT_OS_NAME" /> entfernt. Bitte verwende stattdessen die Richtlinie "<ph name="SCREEN_LOCK_DELAYS_POLICY_NAME" />".
 
@@ -6145,6 +6159,12 @@
       Wenn die Richtlinie nicht konfiguriert ist, kann der Nutzer festlegen, ob er nach einem Passwort zum Entsperren des Geräts bei Inaktivität gefragt werden möchte.</translation>
 <translation id="7784062550705119230">Wenn <ph name="PRINTERS_ALLOWLIST" /> für <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> ausgewählt ist, wird durch Festlegen von <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> angegeben, welche Drucker die Nutzer verwenden können. Den Nutzern stehen nur die Drucker zur Verfügung, deren IDs mit den Werten in dieser Richtlinie übereinstimmen. Die IDs müssen dem Feld <ph name="ID_FIELD" /> oder dem Feld <ph name="GUID_FIELD" /> in der Datei entsprechen, die in <ph name="DEVICE_PRINTERS_POLICY_NAME" /> angegeben ist.</translation>
 <translation id="7788511847830146438">Nach Profil</translation>
+<translation id="7788632499792081231">Wenn diese Richtlinie konfiguriert ist, kannst du eine Liste mit URL-Mustern erstellen, in der Websites angegeben werden, denen die Berechtigung zur Verwendung der Zwischenablage gewährt wird. Das umfasst nicht alle Aktionen in der Zwischenablage, die auf Websites erfolgen, deren URL-Muster mit den angegebenen übereinstimmen. Nutzer können z. B. dennoch Inhalte über Tastenkombinationen kopieren, weil sich die Berechtigung zur Verwendung der Zwischenablage nicht auf diesen Vorgang bezieht.
+
+
+      Wenn die Richtlinie nicht konfiguriert ist, gilt „<ph name="DEFAULT_CLIPBOARD_SETTING" />“ für alle Websites, sofern konfiguriert. Falls nicht, wird die persönliche Einstellung des Nutzers verwendet.
+
+      Genaue Informationen zu gültigen <ph name="URL_LABEL" />-Mustern finden Sie unter https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. „<ph name="WILDCARD_VALUE" />“ ist kein akzeptierter Wert für diese Richtlinie.</translation>
 <translation id="7792796937016596423">Der Nutzer ist nicht zu Netzwerkpaketaufnahmen berechtigt</translation>
 <translation id="7798441698807517880">Diese Richtlinie ist seit Version 89 von <ph name="PRODUCT_NAME" /> nicht mehr enthalten, da <ph name="FLASH_PLUGIN_NAME" /> eingestellt wurde.
 
@@ -6933,6 +6953,7 @@
 
        Wenn du diese Richtlinie konfigurierst, kann sie von Nutzern nicht geändert werden. Wird sie nicht konfiguriert, ist gesprochenes Feedback erst einmal deaktiviert, kann aber jederzeit von Nutzern aktiviert werden.</translation>
 <translation id="8656110680728938054">"Vorlesen" aktivieren</translation>
+<translation id="8659843732895043951">Zwischenablage für diese Websites zulassen</translation>
 <translation id="8661297125441579970">Datenmigration und ARC nicht zulassen.</translation>
 <translation id="8665314828727504286">Schutzniveau für Safe Browsing</translation>
 <translation id="8666123502812856425">Wenn diese Richtlinie konfiguriert ist, kannst du eine Liste mit den URLs der Websites erstellen, denen automatisch die Zugriffsberechtigung auf ein HID mit einer Sammlung auf oberster Ebene mit der angegebenen HID-Nutzung gewährt wird. Damit die Richtlinie gültig ist, sind für jeden Eintrag in der Liste die Felder „<ph name="USAGES_FIELD_NAME" />“ und „<ph name="URLS_FIELD_NAME" />“ erforderlich. Für jeden Eintrag im Feld „<ph name="USAGES_FIELD_NAME" />“ ist das Feld „<ph name="USAGE_PAGE_FIELD_NAME" />“ erforderlich. „<ph name="USAGE_FIELD_NAME" />“ ist optional. Wird das Feld „<ph name="USAGE_FIELD_NAME" />“ weggelassen, wird eine Richtlinie erstellt, die für jedes Gerät mit einer Sammlung auf oberster Ebene mit einer Nutzung von der angegebenen Nutzungsseite gilt. Einträge, für die das Feld „<ph name="USAGE_FIELD_NAME" />“ angegeben ist, „<ph name="USAGE_PAGE_FIELD_NAME" />“ aber fehlt, sind ungültig und werden ignoriert.
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index b01d7b8..9a80b796 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -1278,6 +1278,11 @@
 
       Se il criterio è impostato su False o se non viene configurato, non viene visualizzato alcun pulsante.</translation>
 <translation id="2294382669900758280">Il video riprodotto nelle app Android non viene considerato, anche se la norma viene impostata su <ph name="TRUE" />.</translation>
+<translation id="2297792368307475351">La configurazione del criterio consente di impostare un elenco di pattern URL che specificano i siti che non possono usare l'autorizzazione di accesso dei siti agli appunti. Tutte le operazioni relative agli appunti nelle origini corrispondenti ai pattern non sono incluse. Ad esempio, gli utenti potranno ancora incollare usando scorciatoie da tastiera perché questa operazione non è controllata dall'autorizzazione di accesso dei siti agli appunti.
+
+      Se il criterio non viene configurato, <ph name="DEFAULT_CLIPBOARD_SETTING" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
 <translation id="2299220924812062390">Consente di specificare un elenco dei plug-in attivati</translation>
 <translation id="2301048990069984110">Estendi il supporto delle app di Chrome su Windows, Mac e Linux</translation>
 <translation id="2303795211377219696">Attiva la Compilazione automatica per le carte di credito</translation>
@@ -1581,6 +1586,7 @@
 <translation id="2604182581880595781">Configura le norme relative alla funzione Condivisioni file di rete</translation>
 <translation id="2608535066974278204">Il periodo di tempo (in minuti) che specifica la durata dell'intervallo di tempo per il riavvio.</translation>
 <translation id="2608887839902987727">Impedisci all'autenticazione captive portal di ignorare le impostazioni del proxy</translation>
+<translation id="2608985885792348429">Impostazione relativa agli appunti predefinita</translation>
 <translation id="2615240493030733717">Segnala informazioni sul fuso orario</translation>
 <translation id="2619966380594000538">Se il criterio viene impostato su Attivato o se non viene configurato, vengono mostrati avvisi di sicurezza quando flag della riga di comando potenzialmente pericolosi vengono utilizzati per avviare Chrome.
 
@@ -1600,6 +1606,7 @@
 <translation id="264093234299818170">Vengono mostrate tutte le stampanti, tranne quelle indicate nella lista bloccata.</translation>
 <translation id="264252574246191885">Non in elenco</translation>
 <translation id="2647069081229792812">Attiva o disattiva la funzione di modifica dei preferiti</translation>
+<translation id="264771271300359481">Non consentire ai siti di usare l'autorizzazione di accesso dei siti agli appunti</translation>
 <translation id="2649896281375932517">Consenti agli utenti di decidere</translation>
 <translation id="2650049181907741121">Azione da compiere quando l'utente chiude lo schermo</translation>
 <translation id="2658653824183107970">Usa l'implementazione <ph name="CORS" /> legacy anziché la nuova implementazione <ph name="CORS" /></translation>
@@ -4065,6 +4072,7 @@
 <translation id="5470500958458209831">L'URL da cui è possibile scaricare il playbook Ansible.</translation>
 <translation id="5475361623548884387">Attiva la stampa</translation>
 <translation id="547601067149622666">Non consentire gli annunci su siti con annunci invasivi</translation>
+<translation id="5476152378885134514">Blocca gli appunti su questi siti</translation>
 <translation id="5478734531226638813">L'impostazione del criterio disattiverà l'aggiornamento delle app di Chrome Kiosk all'interno della sessione (che utilizza l'URL di aggiornamento dal manifest dell'estensione) e lascerà solo il precaricamento CRX come meccanismo di aggiornamento.</translation>
 <translation id="5480380613778757009">Se questo criterio viene disattivato o se non viene configurato, tutte le impostazioni di visualizzazione configurate nella sessione Ospite gestita verranno reimpostate al termine della sessione. Se questo criterio viene impostato su Vero, le proprietà di visualizzazione verranno memorizzate dopo la chiusura della sessione Ospite gestita.</translation>
 <translation id="5483065054530244863">Consenti i certificati SHA-1 firmati emessi dai trust anchor locali</translation>
@@ -4196,6 +4204,11 @@
 <translation id="5649046890958064703">Se per il criterio <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> viene scelta l'opzione <ph name="PRINTERS_BLACKLIST" />, la configurazione del criterio <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_POLICY_NAME" /> consente di specificare le stampanti che gli utenti non possono usare. Gli utenti avranno a disposizione tutte le stampanti, tranne quelle i cui ID sono elencati in questo criterio. Gli ID devono corrispondere ai campi <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del file specificato nel criterio <ph name="DEVICE_PRINTERS_POLICY_NAME" />.
 
       Questo criterio è deprecato. Usa il criterio <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.</translation>
+<translation id="5649773663020498924">Se questo criterio viene impostato su 2, i siti non possono usare l'autorizzazione di accesso dei siti agli appunti. Se il criterio viene impostato su 3 o se non viene configurato, l'utente può cambiare l'impostazione e stabilire se le API Clipboard sono disponibili quando un sito vuole usarne una.
+
+      È possibile eseguire l'override del criterio per pattern URL specifici utilizzando i criteri <ph name="CLIPBOARD_ALLOWED_FOR_URLS_POLICY_NAME" /> e <ph name="CLIPBOARD_BLOCKED_FOR_URLS_POLICY_NAME" />.
+
+      Questo criterio incide soltanto sulle operazioni relative agli appunti controllate dall'autorizzazione di accesso dei siti agli appunti e non sulle scritture di appunti purificate o sulle operazioni di copia e incolla affidabili.</translation>
 <translation id="5652250453612826983">Consente di controllare i criteri relativi alla supervisione dei genitori. Questi criteri vengono applicati soltanto agli account di minori
       e non sono configurati nella Console di amministrazione, ma direttamente dal server API Kids.</translation>
 <translation id="5654682237531873653">Se il criterio viene impostato su Attivato, viene attivata la funzionalità di controllo ortografico e gli utenti non potranno disattivarla. Su <ph name="MS_WIN_NAME" />, <ph name="PRODUCT_OS_NAME" /> e <ph name="LINUX_OS_NAME" />, le lingue per il controllo ortografico possono essere attivate o disattivate singolarmente, pertanto gli utenti possono disattivare la funzionalità di controllo ortografico disattivando ognuna di queste lingue. Per evitare questo, usa il criterio <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> per forzare l'attivazione di specifiche lingue per il controllo ortografico.
@@ -4939,6 +4952,7 @@
       1) Le impostazioni internazionali specificate dall'utente (se configurate).
       2) Le impostazioni internazionali di sistema.
       3) Le impostazioni internazionali di riserva (en-US).</translation>
+<translation id="6493089139124468815">Consenti ai siti di chiedere all'utente di concedere l'autorizzazione di accesso dei siti agli appunti</translation>
 <translation id="6493918190032622602">Versione minima consentita di <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="6495337487202227251">Tieni presente che questo criterio è obsoleto e verrà rimosso nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa il criterio <ph name="SCREEN_LOCK_DELAYS_POLICY_NAME" />.
 
@@ -6183,6 +6197,12 @@
       Se non viene configurato, gli utenti possono scegliere se devono inserire una password o meno per sbloccare il dispositivo quando è in modalità di sospensione.</translation>
 <translation id="7784062550705119230">Se per il criterio <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> viene selezionata l'opzione <ph name="PRINTERS_ALLOWLIST" />, la configurazione del criterio <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> consente di specificare le stampanti che possono essere utilizzate dagli utenti. Soltanto le stampanti con ID corrispondenti ai valori specificati in questo criterio saranno a disposizione degli utenti. Gli ID devono corrispondere ai campi <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del file specificato nel criterio <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation>
 <translation id="7788511847830146438">Per profilo</translation>
+<translation id="7788632499792081231">La configurazione del criterio consente di impostare un elenco di pattern URL che specificano i siti che possono usare l'autorizzazione di accesso dei siti agli appunti. Tutte le operazioni relative agli appunti nelle origini corrispondenti ai pattern non sono incluse. Ad esempio, gli utenti potranno ancora incollare usando scorciatoie da tastiera perché questa operazione non è controllata dall'autorizzazione di accesso dei siti agli appunti.
+
+
+      Se il criterio non viene configurato, <ph name="DEFAULT_CLIPBOARD_SETTING" /> si applica per tutti i siti, se impostato. In caso contrario, viene applicata l'impostazione personale dell'utente.
+
+      Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation>
 <translation id="7792796937016596423">L'utente non potrà eseguire acquisizioni di pacchetti di rete</translation>
 <translation id="7798441698807517880">Questo criterio è stato rimosso dalla versione 89 di <ph name="PRODUCT_NAME" /> perché<ph name="FLASH_PLUGIN_NAME" /> è stato ritirato.
 
@@ -6951,6 +6971,7 @@
 
        Se imposti il criterio, gli utenti non possono modificarlo. Se il criterio non è impostato, la funzione di lettura vocale è disattivata all'inizio, ma gli utenti possono attivarla in qualsiasi momento.</translation>
 <translation id="8656110680728938054">Attiva Seleziona per ascoltare</translation>
+<translation id="8659843732895043951">Consenti gli appunti su questi siti</translation>
 <translation id="8661297125441579970">Non consentire migrazione dei dati e ARC.</translation>
 <translation id="8665314828727504286">Livello di protezione Navigazione sicura</translation>
 <translation id="8666123502812856425">La configurazione del criterio consente di elencare gli URL che specificano i siti a cui viene automaticamente concessa l'autorizzazione di accesso a un dispositivo HID che contiene una raccolta di livello superiore con l'utilizzo dell'HID specificato. Perché il criterio sia valido, ogni elemento nell'elenco richiede entrambi i campi <ph name="USAGES_FIELD_NAME" /> e <ph name="URLS_FIELD_NAME" />. Ogni elemento nel campo <ph name="USAGES_FIELD_NAME" /> deve avere un campo <ph name="USAGE_PAGE_FIELD_NAME" /> e potrebbe avere un campo <ph name="USAGE_FIELD_NAME" />. Se il campo <ph name="USAGE_FIELD_NAME" /> viene omesso, il criterio può corrispondere a qualsiasi dispositivo che contiene una raccolta di livello superiore con un utilizzo dalla relativa pagina specificata. Un elemento con un campo <ph name="USAGE_FIELD_NAME" /> senza un campo <ph name="USAGE_PAGE_FIELD_NAME" /> non è valido e viene ignorato.
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index cdb6d648..be09458 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -1197,6 +1197,11 @@
 <translation id="229322770310505679">ポリシーの最小単位グループの概念を有効にする</translation>
 <translation id="22941467117331786">このポリシーを True に設定した場合、アクティブなセッション中に画面がロックされていなければ、システムトレイに赤い大きなログアウト ボタンが表示されます。このポリシーを False に設定するか未設定のままにした場合、ボタンは表示されません。</translation>
 <translation id="2294382669900758280">Android アプリで再生中の動画は、このポリシーを <ph name="TRUE" /> に設定した場合でも考慮されません。</translation>
+<translation id="2297792368307475351">このポリシーでは、クリップボードのサイト権限の使用をブロックするサイトの URL パターンリストを指定できます。このポリシーは、指定したパターンと一致するオリジンのすべてのクリップボード操作に適用されるわけではありません。たとえば、キーボード ショートカットはクリップボードのサイト権限で管理されないため、キーボード ショートカットを使った貼り付けはこのポリシーに関係なく可能です。
+
+      このポリシーを未設定のままにした場合、<ph name="DEFAULT_CLIPBOARD_SETTING" /> が設定されていればその設定がすべてのサイトで使用され、設定されていなければユーザーの個人設定が適用されます。
+
+      有効な <ph name="URL_LABEL" /> パターンについて詳しくは、https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns をご覧ください。このポリシーの値に「<ph name="WILDCARD_VALUE" />」は使用できません。</translation>
 <translation id="2299220924812062390">有効なプラグインのリストを指定する</translation>
 <translation id="2301048990069984110">Windows、Mac、Linux で Chrome アプリを使用できるようサポートを拡張する。</translation>
 <translation id="2303795211377219696">クレジット カードの自動入力を有効にする</translation>
@@ -1470,6 +1475,7 @@
 <translation id="2604182581880595781">ネットワーク ファイル共有に関連するポリシーを設定します。</translation>
 <translation id="2608535066974278204">再起動の時間枠の長さを示す分単位の期間です。</translation>
 <translation id="2608887839902987727">キャプティブ ポータル認証でプロキシ設定を無視できないようにする</translation>
+<translation id="2608985885792348429">デフォルトのクリップボード設定</translation>
 <translation id="2615240493030733717">タイムゾーン情報を報告する</translation>
 <translation id="2619966380594000538">このポリシーを有効に設定するか未設定のままにした場合、危険性のあるコマンドライン フラグを使用して Chrome を起動したときにセキュリティ警告が表示されます。
 
@@ -1489,6 +1495,7 @@
 <translation id="264093234299818170">拒否リストに登録されている以外のすべてのプリンタを表示する。</translation>
 <translation id="264252574246191885">非推奨</translation>
 <translation id="2647069081229792812">ブックマークの編集を有効または無効にする</translation>
+<translation id="264771271300359481">クリップボードのサイト権限の使用をどのサイトにも許可しない</translation>
 <translation id="2649896281375932517">ユーザーの指定による</translation>
 <translation id="2650049181907741121">ユーザーがデバイスの蓋を閉じた際に行われる操作</translation>
 <translation id="2658653824183107970">新しい <ph name="CORS" /> の実装ではなく以前の <ph name="CORS" /> の実装を使用する</translation>
@@ -3844,6 +3851,7 @@
 <translation id="5470500958458209831">Ansible playbook をダウンロードすることのできる URL です。</translation>
 <translation id="5475361623548884387">印刷を有効にする</translation>
 <translation id="547601067149622666">煩わしい広告を含むサイトで広告の表示を許可しない</translation>
+<translation id="5476152378885134514">クリップボードの使用をブロックするサイトを指定する</translation>
 <translation id="5478734531226638813">このポリシーを設定すると、セッション中のキオスク Chrome アプリの更新(拡張機能マニフェストの更新 URL を使用)が無効になり、有効な更新メカニズムは CRX プリフェッチのみとなります。</translation>
 <translation id="5480380613778757009">このポリシーを無効にするか未設定のままにした場合、管理対象のゲスト セッションで設定されたディスプレイ設定はすべてセッションの終了時にリセットされます。このポリシーを True に設定した場合、管理対象のゲスト セッションが終了した後もディスプレイ プロパティが保持されます。</translation>
 <translation id="5483065054530244863">ローカルの信頼済みアンカーが発行した SHA-1 署名証明書を許可する</translation>
@@ -3962,6 +3970,11 @@
 <translation id="5649046890958064703"><ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> の値に <ph name="PRINTERS_BLACKLIST" /> が選択されている場合、<ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_POLICY_NAME" /> でユーザーが使用できないプリンタを指定できます。ユーザーは、このポリシーで指定されている ID 以外のすべてのプリンタを使用できます。この ID は、<ph name="DEVICE_PRINTERS_POLICY_NAME" /> で指定されたファイル内の「<ph name="ID_FIELD" />」または「<ph name="GUID_FIELD" />」フィールドに対応している必要があります。
 
       このポリシーはサポートが終了しています。代わりに <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> を使用してください。</translation>
+<translation id="5649773663020498924">このポリシーを 2 に設定した場合、サイトに対してクリップボードのサイト権限の使用をブロックします。このポリシーを 3 に設定するか未設定のままにした場合、ユーザーはこの設定を変更して、サイトがクリップボード API の使用をリクエストしたときに許可するかどうかをできます。
+
+      <ph name="CLIPBOARD_ALLOWED_FOR_URLS_POLICY_NAME" /> ポリシーと <ph name="CLIPBOARD_BLOCKED_FOR_URLS_POLICY_NAME" /> ポリシーを使用して、特定の URL パターンについて、このポリシーをオーバーライドできます。
+
+      このポリシーは、クリップボードのサイト権限で制御されるクリップボード操作にのみ影響し、サニタイズされたクリップボードの書き込みと、信頼できるコピーと貼り付けの操作には影響しません。</translation>
 <translation id="5652250453612826983">子どものアカウントのみに適用される、保護者向け管理ツールのポリシーを制御します。
       これらのポリシーは管理コンソールではなく、Kids API サーバーで直接設定します。</translation>
 <translation id="5654682237531873653">このポリシーを有効に設定した場合、スペルチェックがオンになり、ユーザーがオフにすることはできません。<ph name="MS_WIN_NAME" />、<ph name="PRODUCT_OS_NAME" />、<ph name="LINUX_OS_NAME" /> ではスペルチェック言語のオンとオフを個別に切り替えられるので、ユーザーがすべてのスペルチェック言語をオフにすれば、スペルチェックは実質的にオフになります。この状況を回避するには、<ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> を使って特定のスペルチェック言語を強制的に有効にします。
@@ -4685,6 +4698,7 @@
       1)ユーザー指定の言語 / 地域(設定されている場合)
       2)システムの言語 / 地域
       3)代替の言語 / 地域(en-US)</translation>
+<translation id="6493089139124468815">ユーザーに対するクリップボードのサイト権限のリクエストをサイトに許可する</translation>
 <translation id="6493918190032622602">許可される <ph name="PRODUCT_OS_NAME" /> の最小バージョン</translation>
 <translation id="6495337487202227251">このポリシーはサポートが終了しており、<ph name="PRODUCT_OS_NAME" /> バージョン 85 で削除されます。代わりに <ph name="SCREEN_LOCK_DELAYS_POLICY_NAME" /> を使用してください。
 
@@ -5853,6 +5867,12 @@
       このポリシーを未設定のままにした場合、ユーザーはスリープ状態からデバイスのロックを解除する際にパスワードの入力を求めるかどうかを選択できます。</translation>
 <translation id="7784062550705119230"><ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> の値に <ph name="PRINTERS_ALLOWLIST" /> が選択されている場合、<ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> でユーザーが使用できるプリンタを指定できます。ユーザーは、このポリシーで指定されている値に ID が一致するプリンタのみを使用できます。この ID は、<ph name="DEVICE_PRINTERS_POLICY_NAME" /> で指定されたファイル内の「<ph name="ID_FIELD" />」または「<ph name="GUID_FIELD" />」フィールドに対応している必要があります。</translation>
 <translation id="7788511847830146438">プロフィール単位</translation>
+<translation id="7788632499792081231">このポリシーでは、クリップボードのサイト権限の使用を許可するサイトの URL パターンリストを指定できます。このポリシーは、指定したパターンと一致するオリジンのすべてのクリップボード操作に適用されるわけではありません。たとえば、キーボード ショートカットはクリップボードのサイト権限で管理されないため、キーボード ショートカットを使った貼り付けはこのポリシーに関係なく可能です。
+
+
+      このポリシーを未設定のままにした場合、<ph name="DEFAULT_CLIPBOARD_SETTING" /> が設定されていればその設定がすべてのサイトで使用され、設定されていなければユーザーの個人設定が適用されます。
+
+      有効な <ph name="URL_LABEL" /> パターンについて詳しくは、https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns をご覧ください。このポリシーの値に「<ph name="WILDCARD_VALUE" />」は使用できません。</translation>
 <translation id="7792796937016596423">ネットワーク パケット キャプチャの実行をユーザーに許可しない</translation>
 <translation id="7798441698807517880"><ph name="FLASH_PLUGIN_NAME" /> のサポートが終了したため、このポリシーは <ph name="PRODUCT_NAME" /> バージョン 89 以降で削除されています。
 
@@ -6591,6 +6611,7 @@
 
        このポリシーを設定した場合、ユーザーは設定を変更できません。設定しない場合、音声フィードバックは最初は無効ですが、ユーザーはいつでも有効にできます。</translation>
 <translation id="8656110680728938054">「選択して読み上げ」を有効にする</translation>
+<translation id="8659843732895043951">クリップボードの使用を許可するサイトを指定する</translation>
 <translation id="8661297125441579970">データ移行と ARC を許可しない。</translation>
 <translation id="8665314828727504286">セーフ ブラウジングの保護レベル</translation>
 <translation id="8666123502812856425">このポリシーでは、特定の HID 使用状況があるトップレベルのコレクションを含む HID デバイスへのアクセスを自動的に許可するサイトの URL リストを指定できます。リストの各項目では、「<ph name="USAGES_FIELD_NAME" />」と「<ph name="URLS_FIELD_NAME" />」フィールドの両方を指定する必要があります。「<ph name="USAGES_FIELD_NAME" />」フィールドの各項目において、「<ph name="USAGE_PAGE_FIELD_NAME" />」は必須ですが、「<ph name="USAGE_FIELD_NAME" />」フィールドは必須ではありません。「<ph name="USAGE_FIELD_NAME" />」フィールドを省略した場合、指定した使用状況ページの使用状況があるトップレベルのコレクションを含むあらゆるデバイスに一致するポリシーが作成されます。「<ph name="USAGE_FIELD_NAME" />」フィールドを指定して「<ph name="USAGE_PAGE_FIELD_NAME" />」フィールドは指定しなかった場合、項目は無効になり無視されます。
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index d95c91be..0d04255 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -1281,6 +1281,11 @@
 
       정책을 False로 설정하거나 설정하지 않으면 어떤 버튼도 표시되지 않습니다.</translation>
 <translation id="2294382669900758280">이 정책이 <ph name="TRUE" />로 설정되더라도 Android 앱에서 재생되는 동영상은 고려 대상에 포함되지 않습니다.</translation>
+<translation id="2297792368307475351">정책을 설정하면 클립보드 사이트 권한을 사용할 수 없는 사이트를 명시하는 URL 패턴 목록을 설정할 수 있습니다. 여기에 패턴과 일치하는 출처에서 이루어진 모든 클립보드 작업이 포함되는 것은 아닙니다. 예를 들어 단축키를 사용하여 붙여넣는 작업은 클립보드 사이트 권한이 필요하지 않기 때문에 여전히 가능합니다.
+
+      정책을 설정하지 않는 경우 <ph name="DEFAULT_CLIPBOARD_SETTING" />이 설정되어 있으면 DefaultClipboardSetting이 모든 사이트에 적용되며 설정되어 있지 않으면 사용자의 개인 설정이 적용됩니다.
+
+      유효한 <ph name="URL_LABEL" /> 패턴에 관해 자세히 알아보려면 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns를 참고하세요. <ph name="WILDCARD_VALUE" />는 이 정책에 허용되는 값이 아닙니다.</translation>
 <translation id="2299220924812062390">사용 설정한 플러그인 목록 지정</translation>
 <translation id="2301048990069984110">Windows, Mac, Linux에서 Chrome 앱 지원을 확장합니다.</translation>
 <translation id="2303795211377219696">신용카드 정보 자동 완성 사용</translation>
@@ -1584,6 +1589,7 @@
 <translation id="2604182581880595781">네트워크 파일 공유 관련 정책을 구성합니다.</translation>
 <translation id="2608535066974278204">다시 실행 창의 길이를 지정하는 기간(분)입니다.</translation>
 <translation id="2608887839902987727">종속 포털 인증에서 프록시 설정을 무시하지 못하도록 차단</translation>
+<translation id="2608985885792348429">기본 클립보드 설정</translation>
 <translation id="2615240493030733717">시간대 정보 보고</translation>
 <translation id="2619966380594000538">이 정책을 사용으로 설정하거나 설정하지 않으면 잠재적으로 위험한 명령줄 플래그와 함께 Chrome이 실행되었을 때 보안 경고가 표시됩니다.
 
@@ -1603,6 +1609,7 @@
 <translation id="264093234299818170">차단 목록에 있는 프린터를 제외한 모든 프린터가 표시됩니다.</translation>
 <translation id="264252574246191885">비공개</translation>
 <translation id="2647069081229792812">북마크 수정 사용 또는 사용 중지</translation>
+<translation id="264771271300359481">모든 사이트에서 클립보드 사이트 권한 사용 허용 안함</translation>
 <translation id="2649896281375932517">사용자가 결정합니다.</translation>
 <translation id="2650049181907741121">사용자가 덮개를 덮으면 수행할 작업</translation>
 <translation id="2658653824183107970">새 <ph name="CORS" /> 대신 기존 <ph name="CORS" /> 구현 사용</translation>
@@ -4080,6 +4087,7 @@
 <translation id="5470500958458209831">Ansible 플레이북을 다운로드할 수 있는 URL입니다.</translation>
 <translation id="5475361623548884387">인쇄 사용</translation>
 <translation id="547601067149622666">방해가 되는 광고가 포함된 사이트에서 광고 허용 안 함</translation>
+<translation id="5476152378885134514">사이트에서 클립보드 차단</translation>
 <translation id="5478734531226638813">정책을 설정하면 세션 중에 키오스크 Chrome 앱 업데이트(확장 프로그램 매니페스트의 업데이트 URL 사용)가 사용 중지되며 업데이트 메커니즘으로 CRX 프리패치만 사용됩니다.</translation>
 <translation id="5480380613778757009">정책을 사용 안함으로 설정하거나 설정하지 않으면 관리 게스트 세션에서 설정된 모든 화면 설정이 세션이 끝나는 즉시 재설정됩니다. 정책을 True로 설정하면 관리 게스트 세션을 종료한 후에도 화면 속성이 유지됩니다.</translation>
 <translation id="5483065054530244863">로컬 트러스트 앵커에서 발행된 SHA-1 서명 인증서를 허용합니다.</translation>
@@ -4212,6 +4220,11 @@
 <translation id="5649046890958064703"><ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />에 <ph name="PRINTERS_BLACKLIST" />을 선택할 경우 <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_POLICY_NAME" />를 설정하면 사용자가 사용할 수 없는 프린터가 지정됩니다. ID가 이 정책에 명시된 프린터를 제외한 모든 프린터가 사용자에게 제공됩니다. ID는 <ph name="DEVICE_PRINTERS_POLICY_NAME" />에 지정된 파일의 <ph name="ID_FIELD" /> 또는 <ph name="GUID_FIELD" /> 필드와 일치해야 합니다.
 
       이 정책은 지원 중단되었으므로 <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> 정책을 대신 사용하세요.</translation>
+<translation id="5649773663020498924">정책을 2로 설정하면 사이트에서 클립보드 사이트 권한을 사용할 수 없습니다. 정책을 3으로 설정하거나 설정하지 않으면 사용자가 설정을 변경할 수 있고, 사이트에서 클립보드 API 사용을 요청할 때 사용 가능 여부를 결정할 수 있습니다.
+
+      <ph name="CLIPBOARD_ALLOWED_FOR_URLS_POLICY_NAME" /> 및 <ph name="CLIPBOARD_BLOCKED_FOR_URLS_POLICY_NAME" /> 정책을 사용하는 특정 URL 패턴의 경우 이 정책보다 우선 적용될 수 있습니다.
+
+      이 정책은 클립보드 사이트 권한으로 제어되는 클립보드 작업에만 영향을 미치며, 검사된 클립보드 쓰기 또는 신뢰할 수 있는 복사하여 붙여넣기 작업에는 영향을 미치지 않습니다.</translation>
 <translation id="5652250453612826983">자녀 계정에만 적용되는 부모 감독 기능 정책을 제어합니다.
       이러한 정책은 관리 콘솔에서 설정되지 않고 Kids API 서버에서 바로 구성됩니다.</translation>
 <translation id="5654682237531873653">정책을 사용 설정하면 맞춤법 검사가 켜지며 사용자가 끌 수 없습니다. 그러나 <ph name="MS_WIN_NAME" />, <ph name="PRODUCT_OS_NAME" />, <ph name="LINUX_OS_NAME" />에서는 맞춤법 검사 언어를 개별적으로 켜거나 끌 수 있기 때문에 사용자가 모든 맞춤법 검사 언어를 끄면 맞춤법 검사도 꺼집니다. 이러한 상황을 방지하려면 <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> 정책을 사용해 특정 맞춤법 검사 언어가 강제로 사용되도록 설정하세요.
@@ -4962,6 +4975,7 @@
       1) 사용자가 지정한 언어(설정한 경우)
       2) 시스템 언어
       3) 대체 언어(en-US)</translation>
+<translation id="6493089139124468815">사이트에서 사용자에게 클립보드 사이트 권한 부여를 요청하도록 허용</translation>
 <translation id="6493918190032622602">허용된 최소 <ph name="PRODUCT_OS_NAME" /> 버전입니다.</translation>
 <translation id="6495337487202227251">이 정책은 지원이 중단되었으며 <ph name="PRODUCT_OS_NAME" /> 버전 85에서 삭제될 예정입니다. 대신 <ph name="SCREEN_LOCK_DELAYS_POLICY_NAME" /> 정책을 사용하세요.
 
@@ -6207,6 +6221,12 @@
       정책을 설정하지 않으면 사용자가 절전 모드인 기기를 잠금 해제할 때 비밀번호를 사용할지 여부를 선택할 수 있습니다.</translation>
 <translation id="7784062550705119230"><ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />에 <ph name="PRINTERS_ALLOWLIST" />를 선택할 경우 <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" />를 설정하면 사용자가 사용할 수 있는 프린터가 지정됩니다. ID가 이 정책의 값과 일치하는 프린터만 사용자에게 제공됩니다. ID는 <ph name="DEVICE_PRINTERS_POLICY_NAME" />에 지정된 파일의 <ph name="ID_FIELD" /> 또는 <ph name="GUID_FIELD" /> 필드와 일치해야 합니다.</translation>
 <translation id="7788511847830146438">프로필당</translation>
+<translation id="7788632499792081231">정책을 설정하면 클립보드 사이트 권한을 사용할 수 있는 사이트를 명시하는 URL 패턴 목록을 설정할 수 있습니다. 여기에 패턴과 일치하는 출처에서 이루어진 모든 클립보드 작업이 포함되는 것은 아닙니다. 예를 들어 단축키를 사용하여 붙여넣는 작업은 클립보드 사이트 권한이 필요하지 않기 때문에 여전히 가능합니다.
+
+
+      정책을 설정하지 않는 경우 <ph name="DEFAULT_CLIPBOARD_SETTING" />이 설정되어 있으면 DefaultClipboardSetting이 모든 사이트에 적용되며 설정되어 있지 않으면 사용자의 개인 설정이 적용됩니다.
+
+      유효한 <ph name="URL_LABEL" /> 패턴에 관해 자세히 알아보려면 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns를 참고하세요. <ph name="WILDCARD_VALUE" />는 이 정책에 허용되는 값이 아닙니다.</translation>
 <translation id="7792796937016596423">사용자가 네트워크 패킷 캡처를 실행할 수 없음</translation>
 <translation id="7798441698807517880">이 정책은 <ph name="FLASH_PLUGIN_NAME" />이(가) 지원 중단되어 <ph name="PRODUCT_NAME" /> 버전 89부터 삭제되었습니다.
 
@@ -6989,6 +7009,7 @@
 
        정책을 설정하면 사용자가 변경할 수 없습니다. 설정하지 않으면 처음에는 음성 피드백이 사용 중지되지만 사용자가 언제든지 사용 설정할 수 있습니다.</translation>
 <translation id="8656110680728938054">텍스트 읽어주기 사용</translation>
+<translation id="8659843732895043951">사이트에서 클립보드 허용</translation>
 <translation id="8661297125441579970">데이터 이전 및 ARC를 허용하지 않습니다.</translation>
 <translation id="8665314828727504286">세이프 브라우징 보호 수준</translation>
 <translation id="8666123502812856425">정책을 설정하면 주어진 HID 사용의 최상위 컬렉션을 포함한 HID 기기 액세스 권한을 자동으로 부여받는 사이트를 지정하는 URL 목록을 작성할 수 있습니다. 정책이 유효하려면 목록의 각 항목에 <ph name="USAGES_FIELD_NAME" /> 및 <ph name="URLS_FIELD_NAME" /> 필드가 있어야 합니다. <ph name="USAGES_FIELD_NAME" /> 필드에 포함된 각 항목은 <ph name="USAGE_PAGE_FIELD_NAME" /> 필드를 가져야 하며 <ph name="USAGE_FIELD_NAME" /> 필드를 가질 수 있습니다. <ph name="USAGE_FIELD_NAME" /> 필드를 생략하면 지정된 사용 페이지에 있는 사용과 함께 최상위 컬렉션을 포함하는 모든 기기와 일치하는 정책이 생성됩니다. <ph name="USAGE_FIELD_NAME" /> 필드는 있지만 <ph name="USAGE_PAGE_FIELD_NAME" /> 필드가 없는 항목은 유효하지 않으며 무시됩니다.
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index e181a69..6570529 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -1242,6 +1242,11 @@
 
       Als je het beleid instelt op 'False' of niet instelt, wordt er geen knop weergegeven.</translation>
 <translation id="2294382669900758280">Er wordt geen rekening gehouden met het afspelen van video in Android-apps, zelfs niet wanneer dit beleid is ingesteld op <ph name="TRUE" /> (Waar).</translation>
+<translation id="2297792368307475351">Als je het beleid instelt, kun je een lijst met URL-patronen instellen voor sites die het klembord niet kunnen gebruiken. Dit omvat niet alle klembordbewerkingen op oorsprongen die overeenkomen met de patronen. Gebruikers kunnen bijvoorbeeld nog steeds plakken met sneltoetsen, aangezien dit niet wordt beperkt door de klembordrechten voor sites.
+
+      Als je het beleid niet instelt, is <ph name="DEFAULT_CLIPBOARD_SETTING" /> (indien ingesteld) van toepassing op alle sites. Zo niet, dan gelden de persoonlijke instellingen van de gebruiker.
+
+      Ga naar https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns voor gedetailleerde informatie over geldige <ph name="URL_LABEL" />-patronen. <ph name="WILDCARD_VALUE" /> is geen geaccepteerde waarde voor dit beleid.</translation>
 <translation id="2299220924812062390">Lijst met aangezette plug-ins specificeren</translation>
 <translation id="2301048990069984110">Breid de ondersteuning uit voor Chrome-apps op Windows, Mac en Linux.</translation>
 <translation id="2303795211377219696">Automatisch invullen aanzetten voor creditcards</translation>
@@ -1544,6 +1549,7 @@
 <translation id="2604182581880595781">Beleid met betrekking tot Network File Shares configureren.</translation>
 <translation id="2608535066974278204">Periode (minuten) die de duur van het tijdvenster voor herstarten aangeeft.</translation>
 <translation id="2608887839902987727">Voorkomen dat captive portal-verificatie proxyinstellingen negeert</translation>
+<translation id="2608985885792348429">Standaard klembordinstelling</translation>
 <translation id="2615240493030733717">Informatie over tijdzone rapporteren</translation>
 <translation id="2619966380594000538">Als je dit beleid toepast of niet instelt, worden beveiligingswaarschuwingen getoond als Chrome wordt gestart met bepaalde mogelijk schadelijke opdrachtregelmarkeringen.
 
@@ -1563,6 +1569,7 @@
 <translation id="264093234299818170">Alle printers worden getoond, behalve printers op de blokkeringslijst.</translation>
 <translation id="264252574246191885">Verborgen</translation>
 <translation id="2647069081229792812">Bewerking van bookmarks aan- of uitzetten</translation>
+<translation id="264771271300359481">Geen enkele site toestaan het klembordrecht voor sites te gebruiken</translation>
 <translation id="2649896281375932517">Gebruikers laten bepalen</translation>
 <translation id="2650049181907741121">Actie die wordt ondernomen wanneer de gebruiker de klep sluit</translation>
 <translation id="2658653824183107970">De verouderde <ph name="CORS" />-implementatie in plaats van de nieuwe <ph name="CORS" /> gebruiken</translation>
@@ -4017,6 +4024,7 @@
 <translation id="5470500958458209831">De URL waar het Ansible-playbook kan worden gedownload.</translation>
 <translation id="5475361623548884387">Afdrukken aanzetten</translation>
 <translation id="547601067149622666">Geen advertenties toestaan op sites met opdringerige advertenties</translation>
+<translation id="5476152378885134514">Het klembord blokkeren op deze sites</translation>
 <translation id="5478734531226638813">Als je het beleid instelt, wordt het updaten van Chrome-kiosk-apps in de sessie uitgezet (waarvoor de update-URL uit het extensiemanifest wordt gebruikt) en blijft alleen CRX-prefetching over als updatemechanisme.</translation>
 <translation id="5480380613778757009">Als je dit beleid uitzet of niet instelt, worden alle weergave-instellingen die zijn ingesteld in de beheerde gastsessie, gereset zodra de sessie wordt beëindigd. Als je dit beleid instelt op True, worden de weergave-eigenschappen bewaard nadat de beheerde gastsessie is beëindigd.</translation>
 <translation id="5483065054530244863">Door lokale vertrouwensinstanties verstrekte, met SHA-1 ondertekende certificaten toestaan</translation>
@@ -4148,6 +4156,11 @@
 <translation id="5649046890958064703">Als <ph name="PRINTERS_BLACKLIST" /> wordt gekozen voor <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, kun je door <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_POLICY_NAME" /> in te stellen aangeven welke printers gebruikers niet kunnen gebruiken. Alle printers zijn beschikbaar voor gebruikers, behalve de ID's in dit beleid. De ID's moeten overeenkomen met het veld <ph name="ID_FIELD" /> of <ph name="GUID_FIELD" /> in het bestand dat is opgegeven in <ph name="DEVICE_PRINTERS_POLICY_NAME" />.
 
       Dit beleid is verouderd. Gebruik in plaats daarvan <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.</translation>
+<translation id="5649773663020498924">Als je het beleid instelt op 2, kunnen sites het klembord niet gebruiken. Als je het beleid instelt op 3 of niet instelt, kan de gebruiker de instelling wijzigen en bepalen of de klembord-API's beschikbaar zijn als een site er een wil gebruiken.
+
+      Dit beleid kan met de beleidsregels <ph name="CLIPBOARD_ALLOWED_FOR_URLS_POLICY_NAME" /> en <ph name="CLIPBOARD_BLOCKED_FOR_URLS_POLICY_NAME" /> worden overschreven voor specifieke URL-patronen.
+
+      Dit beleid is alleen van toepassing op klembordbewerkingen die worden beheerd door het klembordrecht voor sites, niet op opgeschoonde klembordschrijfbewerkingen of vertrouwde kopieer-en-plakbewerkingen.</translation>
 <translation id="5652250453612826983">Hiermee bepaal je de beleidsregels voor ouderlijk toezicht, die alleen op kinderaccounts worden toegepast.
       Deze beleidsregels worden niet ingesteld in de beheerdersconsole, maar worden rechtstreeks geconfigureerd via Kids API Server.</translation>
 <translation id="5654682237531873653">Als je het beleid toepast, wordt de spellingcontrole aangezet en kunnen gebruikers deze niet uitzetten. In <ph name="MS_WIN_NAME" />, <ph name="PRODUCT_OS_NAME" /> en <ph name="LINUX_OS_NAME" /> kunnen talen voor spellingcontrole afzonderlijk worden aan- of uitgezet, zodat gebruikers de spellingcontrole nog steeds kunnen uitzetten door alle talen voor spellingcontrole uit te zetten. Als je dat wilt voorkomen, gebruik je het beleid <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> om af te dwingen dat specifieke talen voor spellingcontrole worden aangezet.
@@ -4881,6 +4894,7 @@
       1) De landinstelling van de gebruiker (indien geconfigureerd).
       2) De landinstelling van het systeem.
       3) De reservelandinstelling (en-US).</translation>
+<translation id="6493089139124468815">Sites toestaan de gebruiker te vragen om toegang tot het klembord te geven</translation>
 <translation id="6493918190032622602">Minimum toegestane <ph name="PRODUCT_OS_NAME" />-versie</translation>
 <translation id="6495337487202227251">Dit beleid is beëindigd en wordt verwijderd in <ph name="PRODUCT_OS_NAME" />-versie 85. Gebruik in plaats daarvan <ph name="SCREEN_LOCK_DELAYS_POLICY_NAME" />.
 
@@ -6120,6 +6134,12 @@
       Als je het beleid niet instelt, kunnen gebruikers kiezen of zij een wachtwoord moeten opgeven om het apparaat uit de slaapstand te halen en te ontgrendelen.</translation>
 <translation id="7784062550705119230">Als <ph name="PRINTERS_ALLOWLIST" /> wordt gekozen voor <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, kun je door <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> in te stellen aangeven welke printers gebruikers kunnen gebruiken. Alleen printers waarvan de ID overeenkomt met de waarden in dit beleid, zijn beschikbaar voor gebruikers. De ID's moeten overeenkomen met het veld <ph name="ID_FIELD" /> of <ph name="GUID_FIELD" /> in het bestand dat is opgegeven in <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation>
 <translation id="7788511847830146438">Per profiel</translation>
+<translation id="7788632499792081231">Als je het beleid instelt, kun je een lijst met URL-patronen instellen voor sites die het klembord kunnen gebruiken. Dit omvat niet alle klembordbewerkingen op oorsprongen die overeenkomen met de patronen. Gebruikers kunnen bijvoorbeeld nog steeds plakken met sneltoetsen, aangezien dit niet wordt beperkt door de klembordrechten voor sites.
+
+
+      Als je het beleid niet instelt, is <ph name="DEFAULT_CLIPBOARD_SETTING" /> (indien ingesteld) van toepassing op alle sites. Zo niet, dan gelden de persoonlijke instellingen van de gebruiker.
+
+      Ga naar https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns voor gedetailleerde informatie over geldige <ph name="URL_LABEL" />-patronen. <ph name="WILDCARD_VALUE" /> is geen geaccepteerde waarde voor dit beleid.</translation>
 <translation id="7792796937016596423">De gebruiker kan geen opnamen van netwerkpakketten uitvoeren</translation>
 <translation id="7798441698807517880">Dit beleid is verwijderd vanaf <ph name="PRODUCT_NAME" /> versie 89 omdat <ph name="FLASH_PLUGIN_NAME" /> is beëindigd.
 
@@ -6893,6 +6913,7 @@
 
        Als je dit beleid instelt, kunnen gebruikers het niet wijzigen. Als je dit beleid niet instelt, staat gesproken feedback in eerste instantie uit, maar kunnen gebruikers deze functie op elk moment aanzetten.</translation>
 <translation id="8656110680728938054">'Selecteer om uitgesproken te worden' aanzetten</translation>
+<translation id="8659843732895043951">Klembord toestaan op deze sites</translation>
 <translation id="8661297125441579970">Gegevensmigratie en ARC niet toestaan.</translation>
 <translation id="8665314828727504286">Safe Browsing-beveiligingsniveau</translation>
 <translation id="8666123502812856425">Als je het beleid instelt, kun je een lijst met URL's maken die aangeven welke sites automatisch toegangsrechten krijgen voor een HID-apparaat dat een toplevelcollectie bevat met het opgegeven HID-gebruik. Het beleid is alleen geldig als elk item in de lijst de velden <ph name="USAGES_FIELD_NAME" /> en <ph name="URLS_FIELD_NAME" /> bevat. Elk item in het veld <ph name="USAGES_FIELD_NAME" /> moet een veld <ph name="USAGE_PAGE_FIELD_NAME" /> hebben en kan het een veld <ph name="USAGE_FIELD_NAME" /> hebben. Als je het veld <ph name="USAGE_FIELD_NAME" /> weglaat, wordt een beleid gemaakt dat geschikt is voor elk apparaat dat een toplevelcollectie bevat met een gebruik van de opgegeven gebruikspagina. Een item dat het veld <ph name="USAGE_FIELD_NAME" /> heeft zonder het veld <ph name="USAGE_PAGE_FIELD_NAME" /> is ongeldig en wordt genegeerd.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index 9034efcd..c29a184 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -1270,6 +1270,11 @@
 
       Если правило не настроено или задано значение False, кнопка показываться не будет.</translation>
 <translation id="2294382669900758280">Видео, которое воспроизводится в приложениях Android, не учитывается, даже если для правила задано значение <ph name="TRUE" />.</translation>
+<translation id="2297792368307475351">Позволяет задать список шаблонов URL для указания сайтов, которым запрещено использовать буфер обмена. Это правило не распространяется на действия с буфером обмена для источников, совпадающих с шаблонами. Например, пользователи по-прежнему смогут вставлять текст сочетанием клавиш, поскольку эта функция не ограничивается параметром доступа сайтов к буферу обмена.
+
+      Если это правило не настроено, то действует правило <ph name="DEFAULT_CLIPBOARD_SETTING" /> при условии, что оно задано. В противном случае действуют персональные настройки пользователя.
+
+      Подробнее о допустимых шаблонах <ph name="URL_LABEL" />: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Значение <ph name="WILDCARD_VALUE" /> не поддерживается для этого правила.</translation>
 <translation id="2299220924812062390">Определить список включенных плагинов</translation>
 <translation id="2301048990069984110">Включить поддержку для приложений Chrome в Windows, macOS и Linux</translation>
 <translation id="2303795211377219696">Включить автозаполнение данных кредитных карт</translation>
@@ -1573,6 +1578,7 @@
 <translation id="2604182581880595781">Настраивает правила, связанные с функцией совместного доступа к файлам в сети.</translation>
 <translation id="2608535066974278204">Установленный временной интервал (в минутах) для перезапуска.</translation>
 <translation id="2608887839902987727">Запретить игнорирование настроек прокси-сервера при аутентификации через страницы входа</translation>
+<translation id="2608985885792348429">Параметры буфера обмена по умолчанию</translation>
 <translation id="2615240493030733717">Передача информации о часовом поясе</translation>
 <translation id="2619966380594000538">Если правило включено или не настроено, то при запуске Chrome с использованием потенциально опасных параметров командной строки будут появляться предупреждения системы безопасности.
 
@@ -1592,6 +1598,7 @@
 <translation id="264093234299818170">Пользователи видят все принтеры, кроме тех, которые находятся в списке блокировки.</translation>
 <translation id="264252574246191885">Ограниченный доступ</translation>
 <translation id="2647069081229792812">Включить или отключить возможность изменения закладок</translation>
+<translation id="264771271300359481">Запретить сайтам использовать буфер обмена</translation>
 <translation id="2649896281375932517">Оставить на усмотрение пользователей</translation>
 <translation id="2650049181907741121">Действие после закрытия крышки</translation>
 <translation id="2658653824183107970">Приоритет устаревшей версии <ph name="CORS" /> перед новой реализацией <ph name="CORS" /></translation>
@@ -4060,6 +4067,7 @@
 <translation id="5470500958458209831">URL для скачивания сценария Ansible.</translation>
 <translation id="5475361623548884387">Включить печать</translation>
 <translation id="547601067149622666">Заблокировать навязчивую рекламу на сайтах</translation>
+<translation id="5476152378885134514">Блокировать буфер обмена на этих сайтах</translation>
 <translation id="5478734531226638813">Если это правило настроено, обновление киоск-приложений Chrome во время сеанса (с использованием URL обновления из манифеста расширения) будет отключено и обновление будет выполняться только путем упреждающего чтения CRX-файлов.</translation>
 <translation id="5480380613778757009">Если правило отключено или не настроено, все параметры экрана, заданные в управляемом гостевом сеансе, будут сброшены после его завершения. Если задано значение True, после завершения управляемого гостевого сеанса параметры экрана будут сохранены.</translation>
 <translation id="5483065054530244863">Разрешить сертификаты с подписью SHA-1, выпущенные локальными якорями доверия</translation>
@@ -4192,6 +4200,11 @@
 <translation id="5649046890958064703">Если в правиле <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> задан параметр <ph name="PRINTERS_BLACKLIST" />, правило <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_POLICY_NAME" /> определяет принтеры, с которыми не может работать пользователь. Пользователям запрещено работать только с теми принтерами, идентификаторы которых указаны в правиле. Эти идентификаторы должны соответствовать значениям полей <ph name="ID_FIELD" /> и <ph name="GUID_FIELD" /> в файле, указанном в правиле <ph name="DEVICE_PRINTERS_POLICY_NAME" />.
 
       Это правило больше не поддерживается. Используйте вместо него правило <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.</translation>
+<translation id="5649773663020498924">Если для правила установлено значение 2, то сайтам запрещено использовать буфер обмена. Если установлено значение 3 или правило не настроено, то пользователь сможет изменять этот параметр, а также разрешать или запрещать сайтам использовать API буфера обмена, когда они запрашивают доступ.
+
+      Это правило можно переопределить для отдельных шаблонов URL с помощью правил <ph name="CLIPBOARD_ALLOWED_FOR_URLS_POLICY_NAME" /> и <ph name="CLIPBOARD_BLOCKED_FOR_URLS_POLICY_NAME" />.
+
+      Оно распространяется только на действия, управляемые параметром доступа сайтов к буферу обмена. Правило не влияет на очищенные данные в буфере обмена и доверенные операции копирования и вставки.</translation>
 <translation id="5652250453612826983">Позволяет задать правила родительского контроля, применяемые для детских аккаунтов.
       Эти правила настраиваются не в консоли администратора, а напрямую через Kids API Server.</translation>
 <translation id="5654682237531873653">Если правило включено, то проверка правописания разрешена и пользователь не может ее отключить. На устройствах с <ph name="MS_WIN_NAME" />, <ph name="PRODUCT_OS_NAME" /> и <ph name="LINUX_OS_NAME" /> пользователи могут включить или отключить проверку правописания для отдельных языков. Таким образом, выключив проверку для всех языков, пользователи могут полностью отключить проверку правописания. Чтобы не допустить полного отключения этой функции, используйте правило "<ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" />". С его помощью можно установить языки, для которых проверка правописания будет всегда включена.
@@ -4954,6 +4967,7 @@
       1) Региональные настройки, заданные пользователем (если применимо).
       2) Региональные настройки на уровне системы.
       3) Резервный вариант региональных настроек (en-US).</translation>
+<translation id="6493089139124468815">Разрешить сайтам запрашивать у пользователей доступ к буферу обмена</translation>
 <translation id="6493918190032622602">Минимальная поддерживаемая версия <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="6495337487202227251">Правило больше не поддерживается и будет удалено из <ph name="PRODUCT_OS_NAME" /> 85. Вместо него используйте следующее: <ph name="SCREEN_LOCK_DELAYS_POLICY_NAME" />.
 
@@ -6195,6 +6209,12 @@
       Если правило не настроено, пользователи сами смогут выбрать, вводить пароль для выхода из режима сна или нет.</translation>
 <translation id="7784062550705119230">Если в правиле <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> задан параметр <ph name="PRINTERS_ALLOWLIST" />, правило <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> определяет принтеры, с которыми может работать пользователь. Пользователь может работать только с теми принтерами, идентификаторы которых указаны в правиле. Эти идентификаторы должны соответствовать значениям полей <ph name="ID_FIELD" /> и <ph name="GUID_FIELD" /> в файле, указанном в правиле <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation>
 <translation id="7788511847830146438">Для каждого профиля</translation>
+<translation id="7788632499792081231">Позволяет задать список шаблонов URL для указания сайтов, которым разрешено использовать буфер обмена. Это правило не распространяется на действия с буфером обмена для источников, совпадающих с шаблонами. Например, пользователи по-прежнему смогут вставлять текст сочетанием клавиш, поскольку эта функция не ограничивается параметром доступа сайтов к буферу обмена.
+
+
+      Если это правило не настроено, то действует правило <ph name="DEFAULT_CLIPBOARD_SETTING" /> при условии, что оно задано. В противном случае действуют персональные настройки пользователя.
+
+      Подробнее о допустимых шаблонах <ph name="URL_LABEL" />: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Значение <ph name="WILDCARD_VALUE" /> не поддерживается для этого правила.</translation>
 <translation id="7792796937016596423">Пользователь не может выполнять захват сетевых пакетов</translation>
 <translation id="7798441698807517880">Правило исключено из <ph name="PRODUCT_NAME" /> 89 и более поздних версий, так как плагин <ph name="FLASH_PLUGIN_NAME" /> больше не поддерживается.
 
@@ -6975,6 +6995,7 @@
 
        Если вы настроите правило, пользователи не смогут изменить этот параметр. Если значение не задано, озвучивание текста на экране будет выключено по умолчанию, но пользователи смогут включить его в любое время.</translation>
 <translation id="8656110680728938054">Включить озвучивание при нажатии</translation>
+<translation id="8659843732895043951">Разрешить буфер обмена на этих сайтах</translation>
 <translation id="8661297125441579970">Запретить перенос данных и ARC</translation>
 <translation id="8665314828727504286">Уровень защиты Безопасного просмотра</translation>
 <translation id="8666123502812856425">Вы можете задать список URL для указания сайтов, которым будет автоматически предоставляться доступ к HID-устройствам с данными верхнего уровня об использовании HID. Чтобы правило работало, каждый пункт списка должен включать поля <ph name="USAGES_FIELD_NAME" /> и <ph name="URLS_FIELD_NAME" />. Для каждого пункта в поле <ph name="USAGES_FIELD_NAME" /> нужно задать идентификаторы <ph name="USAGE_PAGE_FIELD_NAME" /> и <ph name="USAGE_FIELD_NAME" />. Правило с незаполненным полем <ph name="USAGE_FIELD_NAME" /> действует для всех устройств, которые содержат данные верхнего уровня об использовании указанной страницы. Пункт считается неверным и игнорируется, если заполнить только поле <ph name="USAGE_FIELD_NAME" />, а поле <ph name="USAGE_PAGE_FIELD_NAME" /> оставить пустым.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index f92a6225..39cf872e 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -1255,6 +1255,11 @@
 
       การตั้งค่านโยบายเป็น "เท็จ" หรือไม่ได้ตั้งค่าหมายความว่าจะไม่มีปุ่มใดแสดง</translation>
 <translation id="2294382669900758280">ไม่มีการพิจารณาการเล่นวิดีโอในแอป Android แม้ว่าจะตั้งค่านโยบายนี้เป็น <ph name="TRUE" /> ก็ตาม</translation>
+<translation id="2297792368307475351">การตั้งค่านโยบายช่วยให้คุณสร้างรายการรูปแบบ URL ซึ่งระบุเว็บไซต์ที่ไม่สามารถใช้สิทธิ์เข้าถึงคลิปบอร์ดได้ ทั้งนี้ไม่รวมการดำเนินการเกี่ยวกับคลิปบอร์ดทั้งหมดในต้นทางที่ตรงกับรูปแบบในรายการ ตัวอย่างเช่น ผู้ใช้จะยังวางโดยใช้แป้นพิมพ์ลัดได้อยู่เนื่องจากไม่ถูกกั้นโดยสิทธิ์เข้าถึงคลิปบอร์ดสำหรับเว็บไซต์
+
+      การไม่ตั้งค่านโยบายหมายความว่า <ph name="DEFAULT_CLIPBOARD_SETTING" /> จะมีผลกับทุกเว็บไซต์ (หากตั้งค่าไว้) แต่หากไม่ได้ตั้งค่าไว้ การตั้งค่าส่วนตัวของผู้ใช้จะมีผล
+
+      ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ <ph name="URL_LABEL" /> ที่ถูกต้องได้ที่ https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns <ph name="WILDCARD_VALUE" /> ไม่ใช่ค่าที่ยอมรับสำหรับนโยบายนี้</translation>
 <translation id="2299220924812062390">ระบุรายการปลั๊กอินที่เปิดใช้งาน</translation>
 <translation id="2301048990069984110">ขยายการรองรับแอป Chrome ใน Windows, Mac และ Linux</translation>
 <translation id="2303795211377219696">เปิดใช้ "ป้อนข้อความอัตโนมัติ" สำหรับบัตรเครดิต</translation>
@@ -1558,6 +1563,7 @@
 <translation id="2604182581880595781">กำหนดค่านโยบายที่เกี่ยวข้องกับพื้นที่แชร์ไฟล์ของเครือข่าย</translation>
 <translation id="2608535066974278204">ระยะเวลา (นาที) ของกรอบเวลาการเปิดอีกครั้ง</translation>
 <translation id="2608887839902987727">ป้องกันไม่ให้การตรวจสอบสิทธิ์แคพทีฟพอร์ทัลละเว้นการตั้งค่าพร็อกซี</translation>
+<translation id="2608985885792348429">การตั้งค่าคลิปบอร์ดเริ่มต้น</translation>
 <translation id="2615240493030733717">รายงานข้อมูลเขตเวลา</translation>
 <translation id="2619966380594000538">การตั้งค่านโยบายเป็น "เปิดใช้" หรือไม่ได้ตั้งค่าหมายความว่าคำเตือนด้านความปลอดภัยจะแสดงเมื่อมีการใช้การติดธงบรรทัดคำสั่งที่อาจเป็นอันตรายเพื่อเปิด Chrome
 
@@ -1577,6 +1583,7 @@
 <translation id="264093234299818170">ระบบจะแสดงเครื่องพิมพ์ทั้งหมดยกเว้นที่อยู่ในรายการที่บล็อก</translation>
 <translation id="264252574246191885">ไม่แสดง</translation>
 <translation id="2647069081229792812">เปิดหรือปิดใช้การแก้ไขบุ๊กมาร์ก</translation>
+<translation id="264771271300359481">ไม่อนุญาตให้เว็บไซต์ใช้สิทธิ์เข้าถึงคลิปบอร์ด</translation>
 <translation id="2649896281375932517">ให้ผู้ใช้เลือก</translation>
 <translation id="2650049181907741121">การทำงานของอุปกรณ์เมื่อผู้ใช้ปิดฝา</translation>
 <translation id="2658653824183107970">ควรใช้การใช้งาน <ph name="CORS" /> เดิมมากกว่า <ph name="CORS" /> ใหม่</translation>
@@ -4026,6 +4033,7 @@
 <translation id="5470500958458209831">URL ที่ระบบไปดาวน์โหลด Ansible Playbook ได้</translation>
 <translation id="5475361623548884387">เปิดใช้งานการพิมพ์</translation>
 <translation id="547601067149622666">ไม่อนุญาตโฆษณาในเว็บไซต์ที่มีโฆษณาที่แทรก</translation>
+<translation id="5476152378885134514">บล็อกคลิปบอร์ดในเว็บไซต์เหล่านี้</translation>
 <translation id="5478734531226638813">การตั้งค่านโยบายจะปิดใช้การอัปเดตแอป Chrome Kiosk ในเซสชัน (ซึ่งใช้ URL อัปเดตจากไฟล์ Manifest ของส่วนขยาย) และให้เพียงแค่ CRX ดึงข้อมูลล่วงหน้าได้ตามกลไกการอัปเดต</translation>
 <translation id="5480380613778757009">หากปิดใช้นโยบายนี้หรือไม่ได้ตั้งค่า การตั้งค่าการแสดงผลทั้งหมดที่ตั้งค่าไว้ในเซสชันผู้เยี่ยมชมที่มีการจัดการจะรีเซ็ตทันทีเมื่อจบเซสชัน หากตั้งค่านโยบายนี้เป็น "จริง" พร็อพเพอร์ตี้การแสดงผลจะคงอยู่หลังออกจากเซสชันผู้เยี่ยมชมที่มีการจัดการ</translation>
 <translation id="5483065054530244863">อนุญาตใบรับรองที่มีการรับรองของ SHA-1 ที่ออกโดย Trust Anchor ในพื้นที่</translation>
@@ -4156,6 +4164,11 @@
 <translation id="5649046890958064703">หากมีการเลือก <ph name="PRINTERS_BLACKLIST" /> ไว้สำหรับ <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> การตั้งค่า <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_POLICY_NAME" /> จะระบุเครื่องพิมพ์ที่ผู้ใช้จะใช้ไม่ได้ เครื่องพิมพ์ทั้งหมดจะพร้อมให้ผู้ใช้นำมาใช้งาน ยกเว้นเครื่องที่มีรหัสตามที่ระบุไว้ในนโยบายนี้ รหัสดังกล่าวต้องตรงกับช่อง <ph name="ID_FIELD" /> หรือ <ph name="GUID_FIELD" /> ในไฟล์ที่ระบุไว้ใน <ph name="DEVICE_PRINTERS_POLICY_NAME" />
 
       นโยบายนี้เลิกใช้งานไปแล้ว โปรดใช้ <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> แทน</translation>
+<translation id="5649773663020498924">การตั้งค่านโยบายเป็น 2 จะบล็อกเว็บไซต์ไม่ให้ใช้สิทธิ์เข้าถึงคลิปบอร์ด การตั้งค่านโยบายเป็น 3 หรือไม่ตั้งค่าจะทำให้ผู้ใช้สามารถเปลี่ยนการตั้งค่าและเลือกว่า API ของคลิปบอร์ดจะพร้อมให้เว็บไซต์ใช้งานเมื่อต้องการหรือไม่
+
+      นโยบายนี้ถูกลบล้างสำหรับ URL บางรูปแบบได้โดยใช้นโยบาย <ph name="CLIPBOARD_ALLOWED_FOR_URLS_POLICY_NAME" /> และ <ph name="CLIPBOARD_BLOCKED_FOR_URLS_POLICY_NAME" />
+
+      นโยบายนี้มีผลเฉพาะกับการดำเนินการเกี่ยวกับคลิปบอร์ดซึ่งควบคุมโดยสิทธิ์เข้าถึงคลิปบอร์ดสำหรับเว็บไซต์ และไม่มีผลกับการเขียนคลิปบอร์ดที่มีการปรับแต่งหรือการคัดลอกและวางที่เชื่อถือได้</translation>
 <translation id="5652250453612826983">ควบคุมนโยบายการควบคุมดูแลโดยผู้ปกครองซึ่งใช้กับบัญชีของเด็กเท่านั้น
       นโยบายเหล่านี้ไม่ได้ตั้งค่าในคอนโซลผู้ดูแลระบบ แต่เซิร์ฟเวอร์ Kids API เป็นผู้กำหนดค่าโดยตรง</translation>
 <translation id="5654682237531873653">การตั้งค่านโยบายเป็น "เปิดใช้" จะเปิดการตรวจตัวสะกด และผู้ใช้จะปิดไม่ได้ ใน <ph name="MS_WIN_NAME" />, <ph name="PRODUCT_OS_NAME" /> และ <ph name="LINUX_OS_NAME" /> ผู้ใช้จะเปิดหรือปิดการตรวจตัวสะกดของแต่ละภาษาแยกกันได้ ดังนั้นจึงยังปิดการตรวจตัวสะกดโดยการปิดการตรวจตัวสะกดของทุกภาษาได้อยู่ คุณอาจหลีกเลี่ยงปัญหานี้โดยใช้ <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> เพื่อบังคับให้เปิดใช้การตรวจตัวสะกดของบางภาษา
@@ -4892,6 +4905,7 @@
       1) ภาษาที่ผู้ใช้ระบุ (หากกำหนดค่าไว้)
       2) ภาษาของระบบ
       3) ภาษาสำรอง (en-US)</translation>
+<translation id="6493089139124468815">อนุญาตให้เว็บไซต์ขอให้ผู้ใช้ให้สิทธิ์เข้าถึงคลิปบอร์ด</translation>
 <translation id="6493918190032622602">เวอร์ชัน <ph name="PRODUCT_OS_NAME" /> ขั้นต่ำที่อนุญาต</translation>
 <translation id="6495337487202227251">โปรดทราบว่าจะมีการเลิกใช้งานและนำนโยบายนี้ออกใน <ph name="PRODUCT_OS_NAME" /> เวอร์ชัน 85 โปรดใช้ <ph name="SCREEN_LOCK_DELAYS_POLICY_NAME" /> แทน
 
@@ -6133,6 +6147,12 @@
       การไม่ตั้งค่านโยบายจะอนุญาตให้ผู้ใช้เลือกได้ว่าจะให้มีการถามรหัสผ่านเพื่อปลดล็อกอุปกรณ์จากโหมดสลีปหรือไม่</translation>
 <translation id="7784062550705119230">หากมีการเลือก <ph name="PRINTERS_ALLOWLIST" /> ไว้สำหรับ <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> การตั้งค่า <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> จะระบุเครื่องพิมพ์ที่ผู้ใช้จะใช้ได้ จะมีเฉพาะเครื่องพิมพ์ที่มีรหัสตรงกับค่าในนโยบายนี้เท่านั้นที่พร้อมใช้งานสำหรับผู้ใช้ รหัสดังกล่าวต้องตรงกับช่อง <ph name="ID_FIELD" /> หรือ <ph name="GUID_FIELD" /> ในไฟล์ที่ระบุไว้ใน <ph name="DEVICE_PRINTERS_POLICY_NAME" /></translation>
 <translation id="7788511847830146438">ต่อโปรไฟล์</translation>
+<translation id="7788632499792081231">การตั้งค่านโยบายช่วยให้คุณสร้างรายการรูปแบบ URL ซึ่งระบุเว็บไซต์ที่สามารถใช้สิทธิ์เข้าถึงคลิปบอร์ดได้ ทั้งนี้ไม่รวมการดำเนินการเกี่ยวกับคลิปบอร์ดทั้งหมดในต้นทางที่ตรงกับรูปแบบในรายการ ตัวอย่างเช่น ผู้ใช้จะยังวางโดยใช้แป้นพิมพ์ลัดได้อยู่เนื่องจากไม่ถูกกั้นโดยสิทธิ์เข้าถึงคลิปบอร์ดสำหรับเว็บไซต์
+
+
+      การไม่ตั้งค่านโยบายหมายความว่า <ph name="DEFAULT_CLIPBOARD_SETTING" /> จะมีผลกับทุกเว็บไซต์ (หากตั้งค่าไว้) แต่หากไม่ได้ตั้งค่าไว้ การตั้งค่าส่วนตัวของผู้ใช้จะมีผล
+
+      ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ <ph name="URL_LABEL" /> ที่ถูกต้องได้ที่ https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns <ph name="WILDCARD_VALUE" /> ไม่ใช่ค่าที่ยอมรับสำหรับนโยบายนี้</translation>
 <translation id="7792796937016596423">ผู้ใช้จะทำการบันทึกแพ็กเก็ตเครือข่ายไม่ได้</translation>
 <translation id="7798441698807517880">นโยบายนี้ถูกนำออกตั้งแต่ <ph name="PRODUCT_NAME" /> เวอร์ชัน 89 เนื่องจากเลิกใช้งาน <ph name="FLASH_PLUGIN_NAME" /> แล้ว
 
@@ -6905,6 +6925,7 @@
 
        หากคุณตั้งค่านโยบายไว้ ผู้ใช้จะเปลี่ยนไม่ได้ หากไม่ได้ตั้งค่าไว้ การอธิบายและอ่านออกเสียงจะปิดอยู่ในตอนแรก แต่ผู้ใช้จะเปิดได้ทุกเมื่อ</translation>
 <translation id="8656110680728938054">เปิดใช้การเลือกเพื่อให้อ่าน</translation>
+<translation id="8659843732895043951">อนุญาตคลิปบอร์ดในเว็บไซต์เหล่านี้</translation>
 <translation id="8661297125441579970">ไม่อนุญาตให้ย้ายข้อมูลและใช้ ARC</translation>
 <translation id="8665314828727504286">ระดับการปกป้องของ Google Safe Browsing</translation>
 <translation id="8666123502812856425">การตั้งค่านโยบายนี้ให้คุณระบุ URL ซึ่งเจาะจงเว็บไซต์ที่ได้รับสิทธิ์โดยอัตโนมัติในการเข้าถึงอุปกรณ์ HID ที่มีการรวบรวมระดับบนสุดเกี่ยวกับการใช้งาน HID ที่กำหนด แต่ละรายการในลิสต์ต้องระบุทั้งช่อง <ph name="USAGES_FIELD_NAME" /> และ <ph name="URLS_FIELD_NAME" /> นโยบายจึงจะมีผล แต่ละรายการในช่อง <ph name="USAGES_FIELD_NAME" /> ต้องมี <ph name="USAGE_PAGE_FIELD_NAME" /> และอาจมีช่อง <ph name="USAGE_FIELD_NAME" /> การไม่ระบุช่อง <ph name="USAGE_FIELD_NAME" /> จะสร้างนโยบายที่ตรงกับอุปกรณ์ทุกเครื่องที่มีการรวบรวมระดับบนสุดเกี่ยวกับการใช้งานจากหน้าการใช้งานที่ระบุ รายการที่ระบุช่อง <ph name="USAGE_FIELD_NAME" /> แต่ไม่ระบุช่อง <ph name="USAGE_PAGE_FIELD_NAME" /> จะไม่มีผล
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index e218449..03759f22 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -1239,6 +1239,11 @@
 
       如果此政策设为 False 或未设置,系统任务栏中不会显示任何按钮。</translation>
 <translation id="2294382669900758280">即使此政策设为 <ph name="TRUE" />,系统也不会考虑在 Android 应用中播放视频。</translation>
+<translation id="2297792368307475351">通过设置此政策,您可以创建一个网址格式列表,从而指定哪些网站无法使用剪贴板网站权限。这并不涵盖与相应格式匹配的源上的所有剪贴板操作。例如,用户仍能使用键盘快捷键进行粘贴,因为此操作不受剪贴板网站权限的限制。
+
+      如果您未设置此政策,那么,倘若 <ph name="DEFAULT_CLIPBOARD_SETTING" /> 已设置,系统便会将它应用于所有网站,否则就会应用用户的个人设置。
+
+      如需详细了解有效的<ph name="URL_LABEL" />格式,请访问 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。<ph name="WILDCARD_VALUE" /> 不是此政策可接受的值。</translation>
 <translation id="2299220924812062390">指定已启用插件的列表</translation>
 <translation id="2301048990069984110">扩展对 Chrome 应用的支持以涵盖 Windows、Mac 和 Linux。</translation>
 <translation id="2303795211377219696">允许使用“自动填充”功能填写信用卡信息</translation>
@@ -1542,6 +1547,7 @@
 <translation id="2604182581880595781">配置网络文件共享功能相关政策。</translation>
 <translation id="2608535066974278204">用于指定重新启动时间范围长度的时间段(以分钟为单位)。</translation>
 <translation id="2608887839902987727">禁止强制门户身份验证忽略代理设置</translation>
+<translation id="2608985885792348429">默认剪贴板设置</translation>
 <translation id="2615240493030733717">报告时区信息</translation>
 <translation id="2619966380594000538">如果此政策已启用或未设置,当您使用可能不安全的命令行标记启动 Chrome 时,系统会显示安全警告。
 
@@ -1561,6 +1567,7 @@
 <translation id="264093234299818170">显示除屏蔽名单所含打印机之外的所有打印机。</translation>
 <translation id="264252574246191885">不公开</translation>
 <translation id="2647069081229792812">启用或停用书签修改功能</translation>
+<translation id="264771271300359481">不允许任何网站使用剪贴板网站权限</translation>
 <translation id="2649896281375932517">由用户决定</translation>
 <translation id="2650049181907741121">当用户合上屏幕时执行的操作</translation>
 <translation id="2658653824183107970">使用旧版 <ph name="CORS" /> 实现方案(而非新版 <ph name="CORS" />)</translation>
@@ -4011,6 +4018,7 @@
 <translation id="5470500958458209831">可供下载 Ansible Playbook 的网址。</translation>
 <translation id="5475361623548884387">启用打印功能</translation>
 <translation id="547601067149622666">不允许含侵扰性广告的网站展示广告</translation>
+<translation id="5476152378885134514">禁止这些网站使用剪贴板</translation>
 <translation id="5478734531226638813">如果设置此政策,系统将禁止在会话期间更新自助服务终端 Chrome 应用(此类更新使用扩展程序清单中的更新网址),仅保留 CRX 预提取作为更新机制。</translation>
 <translation id="5480380613778757009">如果此政策已停用或未设置,系统将会在受管理访客会话完成后立即重置该会话中已设置的所有显示设置。如果此政策设为 True,系统将会在退出受管理访客会话后保留该会话的显示属性。</translation>
 <translation id="5483065054530244863">允许使用由本地信任锚颁发的 SHA-1 签名证书</translation>
@@ -4142,6 +4150,11 @@
 <translation id="5649046890958064703">如果为 <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> 选择了 <ph name="PRINTERS_BLACKLIST" />,您便可通过设置 <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_POLICY_NAME" /> 来指定用户不能使用哪些打印机。除了与此政策中所列 ID 对应的打印机之外,其他所有打印机都可供用户使用。ID 必须与 <ph name="DEVICE_PRINTERS_POLICY_NAME" /> 所指定文件内的<ph name="ID_FIELD" />或<ph name="GUID_FIELD" />字段相符。
 
       此政策已被弃用,请改用 <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />。</translation>
+<translation id="5649773663020498924">如果此政策设为 2,网站将无法使用剪贴板网站权限。如果此政策设为 3 或未设置,用户将能更改相关设置,并能在网站想使用剪贴板 API 时决定是否允许使用剪贴板 API。
+
+      您可通过在 <ph name="CLIPBOARD_ALLOWED_FOR_URLS_POLICY_NAME" /> 和 <ph name="CLIPBOARD_BLOCKED_FOR_URLS_POLICY_NAME" /> 政策中设置特定网址格式来覆盖此政策。
+
+      此政策仅影响由剪贴板网站权限控制的剪贴板操作,不影响已清理的剪贴板写入操作或受信任的复制和粘贴操作。</translation>
 <translation id="5652250453612826983">控制仅应用于未成年人帐号的家长监管政策。
       这些政策不是在管理控制台中设置的,而是通过 Kids API 服务器直接配置的。</translation>
 <translation id="5654682237531873653">如果此政策已启用,系统会开启拼写检查,但用户无法关闭该功能。由于在 <ph name="MS_WIN_NAME" />、<ph name="PRODUCT_OS_NAME" />和 <ph name="LINUX_OS_NAME" /> 中,拼写检查功能的状态(开启/关闭)可因具体语言而异,因此若有语言开启了该功能,用户仍能通过关闭针对每种所涉语言的拼写检查来停用该功能。为避免这种情况,请使用 <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> 为特定语言强制启用拼写检查。
@@ -4877,6 +4890,7 @@
       1) 用户指定的语言区域(若已配置)。
       2) 系统语言区域。
       3) 备用语言区域 (en-US)。</translation>
+<translation id="6493089139124468815">允许网站请求用户授予剪贴板网站权限</translation>
 <translation id="6493918190032622602">所允许的最低 <ph name="PRODUCT_OS_NAME" />版本</translation>
 <translation id="6495337487202227251">请注意,此政策已被弃用,并将在 <ph name="PRODUCT_OS_NAME" />版本 85 中移除。请改用 <ph name="SCREEN_LOCK_DELAYS_POLICY_NAME" />。
 
@@ -6119,6 +6133,12 @@
       如果您未设置此政策,用户可以选择是否让系统提示输入密码以将处于睡眠状态的设备解锁。</translation>
 <translation id="7784062550705119230">如果为 <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> 选择了 <ph name="PRINTERS_ALLOWLIST" />,您便可通过设置 <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> 来指定用户可以使用哪些打印机。用户将只能使用那些符合条件(ID 与此政策中所列的值匹配)的打印机。ID 必须与 <ph name="DEVICE_PRINTERS_POLICY_NAME" /> 所指定文件内的<ph name="ID_FIELD" />或<ph name="GUID_FIELD" />字段相符。</translation>
 <translation id="7788511847830146438">根据个人资料</translation>
+<translation id="7788632499792081231">通过设置此政策,您可以创建一个网址格式列表,从而指定哪些网站可以使用剪贴板网站权限。这并不涵盖与相应格式匹配的源上的所有剪贴板操作。例如,用户仍能使用键盘快捷键进行粘贴,因为此操作不受剪贴板网站权限的限制。
+
+
+      如果您未设置此政策,那么,倘若 <ph name="DEFAULT_CLIPBOARD_SETTING" /> 已设置,系统便会将它应用于所有网站,否则就会应用用户的个人设置。
+
+      如需详细了解有效的<ph name="URL_LABEL" />格式,请访问 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。<ph name="WILDCARD_VALUE" /> 不是此政策可接受的值。</translation>
 <translation id="7792796937016596423">用户将无法执行网络数据包捕获流程</translation>
 <translation id="7798441698807517880">自 <ph name="PRODUCT_NAME" /> 89 版起,此政策已被移除,因为 <ph name="FLASH_PLUGIN_NAME" /> 已被弃用。
 
@@ -6883,6 +6903,7 @@
 
        如果您设置了此政策,用户便无法更改它。如果您未设置此政策,语音反馈最初会处于关闭状态,但用户可随时开启它。</translation>
 <translation id="8656110680728938054">启用“随选朗读”</translation>
+<translation id="8659843732895043951">允许这些网站使用剪贴板</translation>
 <translation id="8661297125441579970">禁止数据迁移和 ARC。</translation>
 <translation id="8665314828727504286">“安全浏览”功能的保护级别</translation>
 <translation id="8666123502812856425">通过设置此政策,您可以罗列一些网址,从而指定自动授权哪些网站访问提供了包含给定 HID 用法的顶层集合的 HID 设备。列表中的每个项都必须同时包含“<ph name="USAGES_FIELD_NAME" />”和“<ph name="URLS_FIELD_NAME" />”字段,此政策才有效。“<ph name="USAGES_FIELD_NAME" />”字段中的每个项都必须包含“<ph name="USAGE_PAGE_FIELD_NAME" />”字段且可以包含“<ph name="USAGE_FIELD_NAME" />”字段。如果您省略“<ph name="USAGE_FIELD_NAME" />”字段,系统将会创建一项与所有提供了给定用法页面所含用法的顶层集合的设备都匹配的政策。包含“<ph name="USAGE_FIELD_NAME" />”字段但不含“<ph name="USAGE_PAGE_FIELD_NAME" />”字段的项无效,会被忽视。
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index c4edb35..11d06093 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -1245,6 +1245,11 @@
 
       如果將這項政策設為 False 或不設定,系統匣中不會顯示任何按鈕。</translation>
 <translation id="2294382669900758280">即使將這項政策設為 <ph name="TRUE" />,在 Android 應用程式中播放的影片仍不會受到影響。</translation>
+<translation id="2297792368307475351">你可以透過這項政策設定網址模式清單,指定哪些網站無法使用剪貼簿網站權限。這不包含在符合網址模式的來源網站上執行的所有剪貼簿作業。比方說,使用者仍可使用鍵盤快速鍵貼上內容,因為這項操作並未受到剪貼簿網站權限管制。
+
+      如果未設定這項政策,系統會針對所有網站套用 <ph name="DEFAULT_CLIPBOARD_SETTING" /> 政策 (如果已設定)。否則系統會套用使用者的個人設定。
+
+      想進一步瞭解有效的<ph name="URL_LABEL" />模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。<ph name="WILDCARD_VALUE" /> 不是這項政策許可的值。</translation>
 <translation id="2299220924812062390">指定停用的外掛程式清單</translation>
 <translation id="2301048990069984110">延長在 Windows、Mac 和 Linux 上支援 Chrome 應用程式的時間。</translation>
 <translation id="2303795211377219696">啟用信用卡的自動填入功能</translation>
@@ -1549,6 +1554,7 @@
 <translation id="2604182581880595781">設定網路檔案共用功能相關政策。</translation>
 <translation id="2608535066974278204">用於指定重新啟動時間範圍長度的時間段 (分鐘)。</translation>
 <translation id="2608887839902987727">禁止網頁認證入口驗證機制忽略 Proxy 設定</translation>
+<translation id="2608985885792348429">預設剪貼簿設定</translation>
 <translation id="2615240493030733717">回報時區資訊</translation>
 <translation id="2619966380594000538">如果將這項政策設為啟用或不設定,當你使用具潛在危險的指令列旗標啟動 Chrome 時,系統會顯示安全性警告。
 
@@ -1568,6 +1574,7 @@
 <translation id="264093234299818170">系統會顯示所有印表機 (封鎖清單中的印表機除外)。</translation>
 <translation id="264252574246191885">不公開</translation>
 <translation id="2647069081229792812">允許或禁止編輯書籤</translation>
+<translation id="264771271300359481">不允許任何網站使用剪貼簿網站權限</translation>
 <translation id="2649896281375932517">讓使用者決定</translation>
 <translation id="2650049181907741121">使用者蓋上螢幕時所採取的動作</translation>
 <translation id="2658653824183107970">使用舊版 <ph name="CORS" /> 模式,而不使用新版 <ph name="CORS" /></translation>
@@ -4013,6 +4020,7 @@
 <translation id="5470500958458209831">可下載 Ansible Playbook 的網址。</translation>
 <translation id="5475361623548884387">啟用列印功能</translation>
 <translation id="547601067149622666">禁止含侵入式廣告的網站顯示廣告</translation>
+<translation id="5476152378885134514">禁止這些網站使用剪貼簿</translation>
 <translation id="5478734531226638813">如果設定這項政策,系統會停用工作階段中的 Kiosk Chrome 應用程式更新作業 (該作業會使用擴充功能資訊清單中的更新網址),且只會保留 CRX 預先擷取做為更新機制。</translation>
 <translation id="5480380613778757009">如果停用或不設定這項政策,當受管理訪客工作階段結束後,系統就會立即重設在此期間配置的所有顯示設定。如果將這項政策設為 True,系統就會在受管理的訪客工作階段結束後保留顯示屬性。</translation>
 <translation id="5483065054530244863">允許本機信任錨點核發的 SHA-1 簽署憑證</translation>
@@ -4144,6 +4152,11 @@
 <translation id="5649046890958064703">如果在 <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> 中選擇了 <ph name="PRINTERS_BLACKLIST" />,系統會根據 <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_POLICY_NAME" /> 的設定指定使用者不能操作的印表機。除了這項政策所列 ID 的印表機外,其他印表機皆可供使用。印表機 ID 必須與 <ph name="DEVICE_PRINTERS_POLICY_NAME" /> 政策指定檔案的 <ph name="ID_FIELD" /> 或 <ph name="GUID_FIELD" /> 欄位值相符。
 
       這項政策已遭淘汰,請改用 <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />。</translation>
+<translation id="5649773663020498924">如果將這項政策設為 2,系統會禁止網站使用剪貼簿網站權限。如果將這項政策設為 3 或不設定,使用者可變更設定,並在網站要求使用剪貼簿 API 時決定是否要授予權限。
+
+      你可以將特定網址模式列於 <ph name="CLIPBOARD_ALLOWED_FOR_URLS_POLICY_NAME" /> 和 <ph name="CLIPBOARD_BLOCKED_FOR_URLS_POLICY_NAME" /> 政策中,藉此覆寫這項政策。
+
+      這項政策只會影響由剪貼簿網站權限控管的剪貼簿作業,不會對經過處理的剪貼簿寫入作業或信任的複製及貼上作業造成影響。</translation>
 <translation id="5652250453612826983">控管家長監督政策,這些政策只適用於兒童帳戶。
       這些政策並非是透過管理控制台設定,而是直接由 Kids API Server 設定。</translation>
 <translation id="5654682237531873653">如果將這項政策設為啟用,系統就會開啟拼字檢查功能,而且使用者無法停用。但是在 <ph name="MS_WIN_NAME" />、<ph name="PRODUCT_OS_NAME" /> 和 <ph name="LINUX_OS_NAME" /> 中,由於使用者可以分別開啟/關閉不同語言的拼字檢查功能,因此他們只要關閉所有語言的拼字檢查功能,就能達到與停用功能相同的效果。如要避免這種情況,請使用 <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> 政策強制啟用特定語言的拼字檢查功能。
@@ -4864,6 +4877,7 @@
       1) 使用者指定的語言代碼 (如已設定)。
       2) 系統語言代碼。
       3) 備用語言代碼 (en-US)。</translation>
+<translation id="6493089139124468815">允許網站要求使用者授予剪貼簿網站權限</translation>
 <translation id="6493918190032622602"><ph name="PRODUCT_OS_NAME" />的最低版本限制</translation>
 <translation id="6495337487202227251">請注意,這項政策已遭淘汰,並將在 <ph name="PRODUCT_OS_NAME" />第 85 版中移除。請改用 <ph name="SCREEN_LOCK_DELAYS_POLICY_NAME" />。
 
@@ -6097,6 +6111,12 @@
       如果不設定這項政策,使用者可選擇在解鎖休眠的裝置時,是否要收到輸入密碼的提示。</translation>
 <translation id="7784062550705119230">如果在 <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> 中選擇了 <ph name="PRINTERS_ALLOWLIST" />,系統會根據 <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> 的設定指定使用者可操作的印表機。只有 ID 與這項政策值相符的印表機,才會提供給使用者。印表機 ID 必須與 <ph name="DEVICE_PRINTERS_POLICY_NAME" /> 政策指定檔案的 <ph name="ID_FIELD" /> 或 <ph name="GUID_FIELD" /> 欄位值相符。</translation>
 <translation id="7788511847830146438">根據設定檔</translation>
+<translation id="7788632499792081231">你可以透過這項政策設定網址模式清單,指定哪些網站可以使用剪貼簿網站權限。這不包含在符合網址模式的來源網站上執行的所有剪貼簿作業。比方說,使用者仍可使用鍵盤快速鍵貼上內容,因為這項操作並未受到剪貼簿網站權限管制。
+
+
+      如果未設定這項政策,系統會針對所有網站套用 <ph name="DEFAULT_CLIPBOARD_SETTING" /> 政策 (如果已設定)。否則系統會套用使用者的個人設定。
+
+      想進一步瞭解有效的<ph name="URL_LABEL" />模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。<ph name="WILDCARD_VALUE" /> 不是這項政策許可的值。</translation>
 <translation id="7792796937016596423">使用者將無法執行網路封包擷取作業</translation>
 <translation id="7798441698807517880">由於 <ph name="FLASH_PLUGIN_NAME" /> 已淘汰,因此這項政策自 <ph name="PRODUCT_NAME" /> 89 版起已移除。
 
@@ -6857,6 +6877,7 @@
 
       如果設定這項政策,使用者將無法變更。如果未設定,系統會先停用互動朗讀功能,但使用者隨時可以啟用。</translation>
 <translation id="8656110680728938054">啟用隨選朗讀功能</translation>
+<translation id="8659843732895043951">允許這些網站使用剪貼簿</translation>
 <translation id="8661297125441579970">不允許資料遷移功能和 ARC。</translation>
 <translation id="8665314828727504286">安全瀏覽功能防護等級</translation>
 <translation id="8666123502812856425">你可以透過這項政策設定網址清單,指定哪些網站會自動取得權限,能夠存取包含具備指定 HID 使用權頂層集合的 HID 裝置。清單中的每個項目都必須包含 <ph name="USAGES_FIELD_NAME" /> 和 <ph name="URLS_FIELD_NAME" /> 欄位,這項政策才會生效。<ph name="USAGES_FIELD_NAME" /> 欄位中的每個項目必須包含 <ph name="USAGE_PAGE_FIELD_NAME" /> 且可能包含 <ph name="USAGE_FIELD_NAME" /> 欄位。如果省略 <ph name="USAGE_FIELD_NAME" /> 欄位,建立的政策將適用於所有包含使用來自指定使用頁面的頂層集合裝置。要是政策包含 <ph name="USAGE_FIELD_NAME" /> 欄位,但缺少 <ph name="USAGE_PAGE_FIELD_NAME" /> 欄位,該項目將為無效且遭到忽略。
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb
index bbc073a..d33afca 100644
--- a/components/strings/components_strings_ky.xtb
+++ b/components/strings/components_strings_ky.xtb
@@ -928,7 +928,7 @@
 <translation id="3462200631372590220">Өркүндөтүлгөндөрдү жашыруу</translation>
 <translation id="346601286295919445">Химия</translation>
 <translation id="3467763166455606212">Карта ээсинин аты-жөнүн киргизиңиз</translation>
-<translation id="3468054117417088249"><ph name="TAB_SWITCH_SUFFIX" />, учурда ачылып турат. Ачык өтмөккө өтүү үчүн, өтмөктү, андан соң "Enter" баскычын басыңыз</translation>
+<translation id="3468054117417088249"><ph name="TAB_SWITCH_SUFFIX" />, учурда ачылып турат. Ачык өтмөккө өтүү үчүн өтмөктү, андан соң "Enter" баскычын басыңыз</translation>
 <translation id="3470563864795286535"><ph name="CLOSE_INCOGNITO_WINDOWS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Учурда ачылып турган бардык Жашыруун терезелерди жабуу үчүн Tab, андан кийин Enter баскычын басыңыз</translation>
 <translation id="3477679029130949506">Кинолордун тизмеси жана театрдын көрсөтүү убактысы</translation>
 <translation id="3479552764303398839">Азыр эмес</translation>
@@ -1459,7 +1459,7 @@
 <translation id="4940163644868678279">Chrome'догу жашыруун өтмөк</translation>
 <translation id="4943872375798546930">Натыйжалар жок</translation>
 <translation id="4943933359574417591">SMS жана заматта кабарлашуу</translation>
-<translation id="4950898438188848926">Өтмөктү которуштуруу баскычы. Ачык өтмөккө өтүү үчүн, "Enter" баскычын басыңыз, <ph name="TAB_SWITCH_FOCUSED_FRIENDLY_MATCH_TEXT" /></translation>
+<translation id="4950898438188848926">Өтмөктү которуштуруу баскычы. Ачык өтмөккө өтүү үчүн "Enter" баскычын басыңыз, <ph name="TAB_SWITCH_FOCUSED_FRIENDLY_MATCH_TEXT" /></translation>
 <translation id="495170559598752135">Аракеттер</translation>
 <translation id="4953689047182316270">Атайын мүмкүнчүлүктөрдү иштетүү</translation>
 <translation id="4955242332710481440">A5-Extra</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb
index 64efd891..a43768da 100644
--- a/components/strings/components_strings_mn.xtb
+++ b/components/strings/components_strings_mn.xtb
@@ -653,6 +653,7 @@
 <translation id="2676271551327853224">Roc-8K</translation>
 <translation id="2677696497921480781">Төрсөн өдөр, нэрийн өдөр</translation>
 <translation id="2677748264148917807">Үлдээх</translation>
+<translation id="2679714844901977852">Аюулгүй бөгөөд илүү хурдан тооцоо хийх бол карт болон төлбөр тооцооны мэдээллээ <ph name="USER_EMAIL" /> Google Бүртгэлдээ хадгална уу</translation>
 <translation id="2684561033061424857">11x12</translation>
 <translation id="2687555958734450033">Хамгийн оновтой тохирол</translation>
 <translation id="2688969097326701645">Тийм, үргэлжлүүлье</translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb
index 788ea4f..fc211abf 100644
--- a/components/strings/components_strings_uz.xtb
+++ b/components/strings/components_strings_uz.xtb
@@ -652,6 +652,7 @@
 <translation id="2676271551327853224">Roc-8K</translation>
 <translation id="2677696497921480781">Tavallud va ism berish kunlari</translation>
 <translation id="2677748264148917807">Tark etish</translation>
+<translation id="2679714844901977852">Xavfsiz va tez hisob-kitob qilish uchun Google hisobingizga (<ph name="USER_EMAIL" />) karta va hisob-kitob maʼlumotlarini saqlang</translation>
 <translation id="2684561033061424857">11x12</translation>
 <translation id="2687555958734450033">Eng mos</translation>
 <translation id="2688969097326701645">Ha, davom etilsin</translation>
diff --git a/components/sync_bookmarks/bookmark_model_observer_impl.cc b/components/sync_bookmarks/bookmark_model_observer_impl.cc
index 9085aeb2..ccd1f05 100644
--- a/components/sync_bookmarks/bookmark_model_observer_impl.cc
+++ b/components/sync_bookmarks/bookmark_model_observer_impl.cc
@@ -156,8 +156,9 @@
   const bookmarks::BookmarkNode* root_node = model->root_node();
   for (const auto& permanent_node : root_node->children()) {
     for (const auto& child : permanent_node->children()) {
-      if (model->client()->CanSyncNode(child.get()))
+      if (model->client()->CanSyncNode(child.get())) {
         ProcessDelete(permanent_node.get(), child.get());
+      }
     }
   }
   nudge_for_commit_closure_.Run();
@@ -395,8 +396,9 @@
     const bookmarks::BookmarkNode* parent,
     const bookmarks::BookmarkNode* node) {
   // If not a leaf node, process all children first.
-  for (const auto& child : node->children())
+  for (const auto& child : node->children()) {
     ProcessDelete(node, child.get());
+  }
   // Process the current node.
   const SyncedBookmarkTrackerEntity* entity =
       bookmark_tracker_->GetEntityForBookmarkNode(node);
diff --git a/components/sync_bookmarks/bookmark_model_type_processor.cc b/components/sync_bookmarks/bookmark_model_type_processor.cc
index ba2fb55..a24dfd2 100644
--- a/components/sync_bookmarks/bookmark_model_type_processor.cc
+++ b/components/sync_bookmarks/bookmark_model_type_processor.cc
@@ -490,8 +490,9 @@
 
   const bookmarks::BookmarkNode* model_root_node = bookmark_model_->root_node();
   int i = 0;
-  for (const auto& child : model_root_node->children())
+  for (const auto& child : model_root_node->children()) {
     AppendNodeAndChildrenForDebugging(child.get(), i++, all_nodes.get());
+  }
 
   std::move(callback).Run(syncer::BOOKMARKS, std::move(all_nodes));
 }
@@ -559,8 +560,9 @@
       base::Value::FromUniquePtrValue(std::move(data_dictionary)));
 
   int i = 0;
-  for (const auto& child : node->children())
+  for (const auto& child : node->children()) {
     AppendNodeAndChildrenForDebugging(child.get(), i++, all_nodes);
+  }
 }
 
 void BookmarkModelTypeProcessor::GetTypeEntitiesCountForDebugging(
diff --git a/components/sync_bookmarks/bookmark_remote_updates_handler.cc b/components/sync_bookmarks/bookmark_remote_updates_handler.cc
index bad93b7..ab13ec97 100644
--- a/components/sync_bookmarks/bookmark_remote_updates_handler.cc
+++ b/components/sync_bookmarks/bookmark_remote_updates_handler.cc
@@ -782,8 +782,9 @@
   DCHECK(entity);
   bookmark_tracker_->Remove(entity);
 
-  for (const auto& child : node->children())
+  for (const auto& child : node->children()) {
     RemoveEntityAndChildrenFromTracker(child.get());
+  }
 }
 
 const bookmarks::BookmarkNode* BookmarkRemoteUpdatesHandler::GetParentNode(
diff --git a/components/sync_bookmarks/synced_bookmark_tracker.cc b/components/sync_bookmarks/synced_bookmark_tracker.cc
index f358370..a129b079 100644
--- a/components/sync_bookmarks/synced_bookmark_tracker.cc
+++ b/components/sync_bookmarks/synced_bookmark_tracker.cc
@@ -583,8 +583,9 @@
   // Remove those who are direct children of another node.
   for (const SyncedBookmarkTrackerEntity* entity : entities) {
     const bookmarks::BookmarkNode* node = entity->bookmark_node();
-    for (const auto& child : node->children())
+    for (const auto& child : node->children()) {
       nodes.erase(child.get());
+    }
   }
   // |nodes| contains only roots of all trees in the forest all of which are
   // ready to be processed because their parents have no pending updates.
diff --git a/components/sync_device_info/device_info_sync_bridge.cc b/components/sync_device_info/device_info_sync_bridge.cc
index 709b63f9..8a4118c 100644
--- a/components/sync_device_info/device_info_sync_bridge.cc
+++ b/components/sync_device_info/device_info_sync_bridge.cc
@@ -595,8 +595,9 @@
 }
 
 void DeviceInfoSyncBridge::NotifyObservers() {
-  for (auto& observer : observers_)
+  for (auto& observer : observers_) {
     observer.OnDeviceInfoChange();
+  }
 }
 
 void DeviceInfoSyncBridge::StoreSpecifics(
@@ -623,8 +624,9 @@
   // |sync_mode_| may not be ready when this function is called.
   if (!sync_mode_) {
     auto device_it = all_data_.find(local_cache_guid_);
-    if (device_it != all_data_.end())
+    if (device_it != all_data_.end()) {
       return device_it->second->client_name();
+    }
   }
 
   return sync_mode_ == SyncMode::kFull
diff --git a/components/sync_device_info/device_info_sync_bridge_unittest.cc b/components/sync_device_info/device_info_sync_bridge_unittest.cc
index 2d36de4..da8a52b5 100644
--- a/components/sync_device_info/device_info_sync_bridge_unittest.cc
+++ b/components/sync_device_info/device_info_sync_bridge_unittest.cc
@@ -87,8 +87,10 @@
 }
 
 MATCHER_P(ModelEqualsSpecifics, expected_specifics, "") {
-  if (expected_specifics.has_sharing_fields() != arg.sharing_info().has_value())
+  if (expected_specifics.has_sharing_fields() !=
+      arg.sharing_info().has_value()) {
     return false;
+  }
 
   if (expected_specifics.has_sharing_fields()) {
     auto& expected_fields = expected_specifics.sharing_fields();
@@ -110,8 +112,10 @@
     }
 
     for (int i = 0; i < expected_fields.enabled_features_size(); ++i) {
-      if (!arg_info.enabled_features.count(expected_fields.enabled_features(i)))
+      if (!arg_info.enabled_features.count(
+              expected_fields.enabled_features(i))) {
         return false;
+      }
     }
   }
 
@@ -478,8 +482,9 @@
 
   ~DeviceInfoSyncBridgeTest() override {
     // Some tests may never initialize the bridge.
-    if (bridge_)
+    if (bridge_) {
       bridge_->RemoveObserver(this);
+    }
 
     // Force all remaining (store) tasks to execute so we don't leak memory.
     base::RunLoop().RunUntilIdle();
diff --git a/components/sync_device_info/fake_device_info_tracker.cc b/components/sync_device_info/fake_device_info_tracker.cc
index 2ac8334..8818ce9 100644
--- a/components/sync_device_info/fake_device_info_tracker.cc
+++ b/components/sync_device_info/fake_device_info_tracker.cc
@@ -56,8 +56,9 @@
 FakeDeviceInfoTracker::GetAllDeviceInfo() const {
   std::vector<std::unique_ptr<DeviceInfo>> list;
 
-  for (const DeviceInfo* device : devices_)
+  for (const DeviceInfo* device : devices_) {
     list.push_back(CloneDeviceInfo(*device));
+  }
 
   return list;
 }
@@ -72,12 +73,14 @@
 
 std::map<sync_pb::SyncEnums_DeviceType, int>
 FakeDeviceInfoTracker::CountActiveDevicesByType() const {
-  if (device_count_per_type_override_)
+  if (device_count_per_type_override_) {
     return *device_count_per_type_override_;
+  }
 
   std::map<sync_pb::SyncEnums_DeviceType, int> count_by_type;
-  for (const auto* device : devices_)
+  for (const auto* device : devices_) {
     count_by_type[device->device_type()]++;
+  }
   return count_by_type;
 }
 
@@ -92,8 +95,9 @@
 
 void FakeDeviceInfoTracker::Add(const DeviceInfo* device) {
   devices_.push_back(device);
-  for (auto& observer : observers_)
+  for (auto& observer : observers_) {
     observer.OnDeviceInfoChange();
+  }
 }
 
 void FakeDeviceInfoTracker::Replace(const DeviceInfo* old_device,
@@ -102,15 +106,17 @@
       base::ranges::find(devices_, old_device);
   DCHECK(devices_.end() != it) << "Tracker doesn't contain device";
   *it = new_device;
-  for (auto& observer : observers_)
+  for (auto& observer : observers_) {
     observer.OnDeviceInfoChange();
+  }
 }
 
 void FakeDeviceInfoTracker::OverrideActiveDeviceCount(
     const std::map<sync_pb::SyncEnums_DeviceType, int>& counts) {
   device_count_per_type_override_ = counts;
-  for (auto& observer : observers_)
+  for (auto& observer : observers_) {
     observer.OnDeviceInfoChange();
+  }
 }
 
 void FakeDeviceInfoTracker::SetLocalCacheGuid(const std::string& cache_guid) {
diff --git a/components/sync_device_info/fake_local_device_info_provider.cc b/components/sync_device_info/fake_local_device_info_provider.cc
index a017140a..d35efe69 100644
--- a/components/sync_device_info/fake_local_device_info_provider.cc
+++ b/components/sync_device_info/fake_local_device_info_provider.cc
@@ -49,8 +49,9 @@
 void FakeLocalDeviceInfoProvider::SetReady(bool ready) {
   bool got_ready = !ready_ && ready;
   ready_ = ready;
-  if (got_ready)
+  if (got_ready) {
     closure_list_.Notify();
+  }
 }
 
 DeviceInfo* FakeLocalDeviceInfoProvider::GetMutableDeviceInfo() {
diff --git a/components/sync_device_info/local_device_info_util_linux.cc b/components/sync_device_info/local_device_info_util_linux.cc
index 8e0b28b9..30f8bfb 100644
--- a/components/sync_device_info/local_device_info_util_linux.cc
+++ b/components/sync_device_info/local_device_info_util_linux.cc
@@ -39,8 +39,9 @@
   return GetChromeOSDeviceNameFromType();
 #else
   char hostname[HOST_NAME_MAX];
-  if (gethostname(hostname, HOST_NAME_MAX) == 0)  // Success.
+  if (gethostname(hostname, HOST_NAME_MAX) == 0) {  // Success.
     return hostname;
+  }
   return base::GetLinuxDistro();
 #endif
 }
diff --git a/components/sync_preferences/pref_model_associator.cc b/components/sync_preferences/pref_model_associator.cc
index 578e2b7..726671a 100644
--- a/components/sync_preferences/pref_model_associator.cc
+++ b/components/sync_preferences/pref_model_associator.cc
@@ -239,8 +239,9 @@
     // We don't call InitPrefAndAssociate because we don't want the initial sync
     // to trigger outgoing changes -- these prefs are only tracked to send
     // updates back to older clients.
-    if (pref_service_->GetUserPrefValue(legacy_pref_name))
+    if (pref_service_->GetUserPrefValue(legacy_pref_name)) {
       synced_preferences_.insert(legacy_pref_name);
+    }
   }
 
   // Push updates to sync.
@@ -269,14 +270,17 @@
   // to merge for all migrated values.
   if (client_) {
     std::string new_pref_name;
-    if (client_->IsMergeableListPreference(name))
+    if (client_->IsMergeableListPreference(name)) {
       return std::move(*MergeListValues(local_value, server_value));
-    if (client_->IsMergeableDictionaryPreference(name))
+    }
+    if (client_->IsMergeableDictionaryPreference(name)) {
       return MergeDictionaryValues(local_value, server_value);
+    }
     base::Value merged_value =
         client_->MaybeMergePreferenceValues(name, local_value, server_value);
-    if (!merged_value.is_none())
+    if (!merged_value.is_none()) {
       return merged_value;
+    }
   }
 
   // If this is not a specially handled preference, server wins.
@@ -314,18 +318,21 @@
 std::unique_ptr<base::Value> PrefModelAssociator::MergeListValues(
     const base::Value& from_value,
     const base::Value& to_value) {
-  if (from_value.is_none())
+  if (from_value.is_none()) {
     return base::Value::ToUniquePtrValue(to_value.Clone());
-  if (to_value.is_none())
+  }
+  if (to_value.is_none()) {
     return base::Value::ToUniquePtrValue(from_value.Clone());
+  }
 
   DCHECK(from_value.type() == base::Value::Type::LIST);
   DCHECK(to_value.type() == base::Value::Type::LIST);
 
   base::Value result = to_value.Clone();
   for (const auto& value : from_value.GetListDeprecated()) {
-    if (!base::Contains(result.GetListDeprecated(), value))
+    if (!base::Contains(result.GetListDeprecated(), value)) {
       result.Append(value.Clone());
+    }
   }
 
   return base::Value::ToUniquePtrValue(std::move(result));
@@ -334,10 +341,12 @@
 base::Value PrefModelAssociator::MergeDictionaryValues(
     const base::Value& from_value,
     const base::Value& to_value) {
-  if (from_value.is_none())
+  if (from_value.is_none()) {
     return to_value.Clone();
-  if (to_value.is_none())
+  }
+  if (to_value.is_none()) {
     return from_value.Clone();
+  }
 
   DCHECK(from_value.is_dict());
   DCHECK(to_value.is_dict());
@@ -372,12 +381,14 @@
   for (const std::string& name : synced_preferences_) {
     const PrefService::Preference* pref = pref_service_->FindPreference(name);
     DCHECK(pref);
-    if (!pref->IsUserControlled() || pref->IsDefaultValue())
+    if (!pref->IsUserControlled() || pref->IsDefaultValue()) {
       continue;  // This is not data we care about.
+    }
     // TODO(zea): plumb a way to read the user controlled value.
     syncer::SyncData sync_data;
-    if (!CreatePrefSyncData(name, *pref->GetValue(), &sync_data))
+    if (!CreatePrefSyncData(name, *pref->GetValue(), &sync_data)) {
       continue;
+    }
     current_data.push_back(sync_data);
   }
   return current_data;
@@ -402,8 +413,9 @@
     // Windows client, the Windows client does not support
     // kConfirmToQuitEnabled. Ignore updates from these preferences.
     std::string pref_name = pref_specifics.name();
-    if (!IsPrefRegistered(pref_name))
+    if (!IsPrefRegistered(pref_name)) {
       continue;
+    }
 
     if (iter->change_type() == syncer::SyncChange::ACTION_DELETE) {
       pref_service_->ClearPref(pref_name);
@@ -458,8 +470,9 @@
 void PrefModelAssociator::AddSyncedPrefObserver(const std::string& name,
                                                 SyncedPrefObserver* observer) {
   auto& observers = synced_pref_observers_[name];
-  if (!observers)
+  if (!observers) {
     observers = std::make_unique<SyncedPrefObserverList>();
+  }
 
   observers->AddObserver(observer);
 }
@@ -468,8 +481,9 @@
     const std::string& name,
     SyncedPrefObserver* observer) {
   auto observer_iter = synced_pref_observers_.find(name);
-  if (observer_iter == synced_pref_observers_.end())
+  if (observer_iter == synced_pref_observers_.end()) {
     return;
+  }
   observer_iter->second->RemoveObserver(observer);
 }
 
@@ -506,19 +520,22 @@
 }
 
 void PrefModelAssociator::ProcessPrefChange(const std::string& name) {
-  if (processing_syncer_changes_)
+  if (processing_syncer_changes_) {
     return;  // These are changes originating from us, ignore.
+  }
 
   // We only process changes if we've already associated models.
   // This also filters out local changes during the initial merge.
-  if (!models_associated_)
+  if (!models_associated_) {
     return;
+  }
 
   const PrefService::Preference* preference =
       pref_service_->FindPreference(name);
   // TODO(tschumann): When can this ever happen? Should this be a DCHECK?
-  if (!preference)
+  if (!preference) {
     return;
+  }
 
   if (!IsPrefRegistered(name) && !IsLegacyModelTypePref(name)) {
     // We are not syncing this preference -- this also filters out synced
@@ -578,22 +595,25 @@
 void PrefModelAssociator::NotifySyncedPrefObservers(const std::string& path,
                                                     bool from_sync) const {
   auto observer_iter = synced_pref_observers_.find(path);
-  if (observer_iter == synced_pref_observers_.end())
+  if (observer_iter == synced_pref_observers_.end()) {
     return;
+  }
   // Don't notify for prefs we are only observing to support old clients.
   // The PrefModelAssociator for the new ModelType will notify.
   if (IsLegacyModelTypePref(path)) {
     DCHECK(!from_sync);
     return;
   }
-  for (auto& observer : *observer_iter->second)
+  for (auto& observer : *observer_iter->second) {
     observer.OnSyncedPrefChanged(path, from_sync);
+  }
 }
 
 void PrefModelAssociator::SetPrefWithTypeCheck(const std::string& pref_name,
                                                const base::Value& new_value) {
-  if (TypeMatchesUserPrefStore(pref_name, new_value))
+  if (TypeMatchesUserPrefStore(pref_name, new_value)) {
     pref_service_->Set(pref_name, new_value);
+  }
 }
 
 bool PrefModelAssociator::TypeMatchesUserPrefStore(
@@ -601,8 +621,9 @@
     const base::Value& new_value) const {
   const base::Value* local_value = nullptr;
   user_pref_store_->GetValue(pref_name, &local_value);
-  if (!local_value || local_value->type() == new_value.type())
+  if (!local_value || local_value->type() == new_value.type()) {
     return true;
+  }
 
   DLOG(WARNING) << "Unexpected type mis-match for pref. "
                 << "Synced value for " << pref_name << " is of type "
@@ -634,11 +655,13 @@
 
 void PrefModelAssociator::NotifyStartedSyncing(const std::string& path) const {
   auto observer_iter = synced_pref_observers_.find(path);
-  if (observer_iter == synced_pref_observers_.end())
+  if (observer_iter == synced_pref_observers_.end()) {
     return;
+  }
 
-  for (auto& observer : *observer_iter->second)
+  for (auto& observer : *observer_iter->second) {
     observer.OnStartedSyncing(path);
+  }
 }
 
 }  // namespace sync_preferences
diff --git a/components/sync_preferences/pref_model_associator_unittest.cc b/components/sync_preferences/pref_model_associator_unittest.cc
index f66146d..1117b07 100644
--- a/components/sync_preferences/pref_model_associator_unittest.cc
+++ b/components/sync_preferences/pref_model_associator_unittest.cc
@@ -50,8 +50,9 @@
       const std::string& pref_name,
       const base::Value& local_value,
       const base::Value& server_value) const override {
-    if (pref_name == kCustomMergePrefName)
+    if (pref_name == kCustomMergePrefName) {
       return local_value.Clone();
+    }
     return base::Value();
   }
 };
@@ -98,12 +99,13 @@
         pref_service_->FindPreference(pref_name.c_str());
     ASSERT_TRUE(pref);
     base::Value::Type type = pref->GetType();
-    if (type == base::Value::Type::DICTIONARY)
+    if (type == base::Value::Type::DICTIONARY) {
       empty_value = std::make_unique<base::DictionaryValue>();
-    else if (type == base::Value::Type::LIST)
+    } else if (type == base::Value::Type::LIST) {
       empty_value = std::make_unique<base::ListValue>();
-    else
+    } else {
       FAIL();
+    }
     pref_service_->Set(pref_name.c_str(), *empty_value);
   }
 
diff --git a/components/sync_preferences/pref_service_syncable.cc b/components/sync_preferences/pref_service_syncable.cc
index c31691f..78387c8 100644
--- a/components/sync_preferences/pref_service_syncable.cc
+++ b/components/sync_preferences/pref_service_syncable.cc
@@ -109,8 +109,9 @@
   auto incognito_pref_store = base::MakeRefCounted<OverlayUserPrefStore>(
       overlay.get(), user_pref_store_.get());
 
-  for (const char* persistent_pref_name : persistent_pref_names)
+  for (const char* persistent_pref_name : persistent_pref_names) {
     incognito_pref_store->RegisterPersistentPref(persistent_pref_name);
+  }
 
   auto pref_value_store = pref_value_store_->CloneAndSpecialize(
       nullptr,  // managed
@@ -247,8 +248,9 @@
 }
 
 void PrefServiceSyncable::OnIsSyncingChanged() {
-  for (auto& observer : observer_list_)
+  for (auto& observer : observer_list_) {
     observer.OnIsSyncingChanged();
+  }
 }
 
 void PrefServiceSyncable::ProcessPrefChange(const std::string& name) {
diff --git a/components/sync_preferences/pref_service_syncable_unittest.cc b/components/sync_preferences/pref_service_syncable_unittest.cc
index 7610404..a8bafbd2 100644
--- a/components/sync_preferences/pref_service_syncable_unittest.cc
+++ b/components/sync_preferences/pref_service_syncable_unittest.cc
@@ -93,8 +93,9 @@
   absl::optional<syncer::ModelError> ProcessSyncChanges(
       const base::Location& from_here,
       const syncer::SyncChangeList& change_list) override {
-    if (output_)
+    if (output_) {
       output_->insert(output_->end(), change_list.begin(), change_list.end());
+    }
     if (fail_next_) {
       fail_next_ = false;
       return syncer::ModelError(FROM_HERE, "Error");
@@ -137,8 +138,9 @@
   ~TestPrefServiceSyncableObserver() override = default;
 
   void OnIsSyncingChanged() override {
-    if (sync_pref_observer_ && sync_pref_observer_->sync_started_count_ > 0)
+    if (sync_pref_observer_ && sync_pref_observer_->sync_started_count_ > 0) {
       is_syncing_changed_ = true;
+    }
   }
 
   void SetSyncedPrefObserver(const TestSyncedPrefObserver* sync_pref_observer) {
diff --git a/components/sync_sessions/local_session_event_handler_impl.cc b/components/sync_sessions/local_session_event_handler_impl.cc
index 329ec8a6..580809d 100644
--- a/components/sync_sessions/local_session_event_handler_impl.cc
+++ b/components/sync_sessions/local_session_event_handler_impl.cc
@@ -278,8 +278,9 @@
       session_tracker_->GetTab(current_session_tag_, tab_id);
   int old_index = session_tab->normalized_navigation_index();
   GURL old_url;
-  if (session_tab->navigations.size() > static_cast<size_t>(old_index))
+  if (session_tab->navigations.size() > static_cast<size_t>(old_index)) {
     old_url = session_tab->navigations[old_index].virtual_url();
+  }
 
   // Produce the specifics.
   auto specifics = std::make_unique<sync_pb::SessionSpecifics>();
@@ -376,15 +377,17 @@
     tab_delegate.GetSerializedNavigationAtIndex(i, &serialized_entry);
 
     // Set current_navigation_index to the index in navigations.
-    if (i == current_index)
+    if (i == current_index) {
       specifics.set_current_navigation_index(specifics.navigation_size());
+    }
 
     sync_pb::TabNavigation* navigation = specifics.add_navigation();
     SessionNavigationToSyncData(serialized_entry).Swap(navigation);
 
     const std::string page_language = tab_delegate.GetPageLanguageAtIndex(i);
-    if (!page_language.empty())
+    if (!page_language.empty()) {
       navigation->set_page_language(page_language);
+    }
 
     if (has_child_account) {
       navigation->set_blocked_state(
diff --git a/components/sync_sessions/open_tabs_ui_delegate_impl.cc b/components/sync_sessions/open_tabs_ui_delegate_impl.cc
index 415b2f8f..3cfb7d17 100644
--- a/components/sync_sessions/open_tabs_ui_delegate_impl.cc
+++ b/components/sync_sessions/open_tabs_ui_delegate_impl.cc
@@ -49,20 +49,23 @@
     const std::string& tag,
     std::vector<const sessions::SessionTab*>* tabs) {
   std::vector<const sessions::SessionWindow*> windows;
-  if (!session_tracker_->LookupSessionWindows(tag, &windows))
+  if (!session_tracker_->LookupSessionWindows(tag, &windows)) {
     return false;
+  }
 
   // Prune those tabs that are not syncable or are NewTabPage, then sort them
   // from most recent to least recent, independent of which window the tabs were
   // from.
   for (const sessions::SessionWindow* window : windows) {
     for (const std::unique_ptr<sessions::SessionTab>& tab : window->tabs) {
-      if (tab->navigations.empty())
+      if (tab->navigations.empty()) {
         continue;
+      }
       const sessions::SerializedNavigationEntry& current_navigation =
           tab->navigations.at(tab->normalized_navigation_index());
-      if (!sessions_client_->ShouldSyncURL(current_navigation.virtual_url()))
+      if (!sessions_client_->ShouldSyncURL(current_navigation.virtual_url())) {
         continue;
+      }
       tabs->push_back(tab.get());
     }
   }
diff --git a/components/sync_sessions/session_sync_test_helper.cc b/components/sync_sessions/session_sync_test_helper.cc
index 59868e6..df99fb30 100644
--- a/components/sync_sessions/session_sync_test_helper.cc
+++ b/components/sync_sessions/session_sync_test_helper.cc
@@ -60,10 +60,11 @@
   for (const std::vector<SessionID>& window : windows) {
     sessions::SessionWindow* win_ptr;
     auto map_iter = session.windows.find(SessionID::FromSerializedValue(i));
-    if (map_iter != session.windows.end())
+    if (map_iter != session.windows.end()) {
       win_ptr = &map_iter->second->wrapped_window;
-    else
+    } else {
       FAIL();
+    }
     ASSERT_EQ(window.size(), win_ptr->tabs.size());
     ASSERT_EQ(0, win_ptr->selected_tab_index);
     ASSERT_EQ(sessions::SessionWindow::TYPE_NORMAL, win_ptr->type);
diff --git a/components/sync_sessions/synced_session.cc b/components/sync_sessions/synced_session.cc
index d413ae1..303e5e8 100644
--- a/components/sync_sessions/synced_session.cc
+++ b/components/sync_sessions/synced_session.cc
@@ -152,22 +152,28 @@
         break;
     }
   }
-  if (sync_data.navigation_forward_back())
+  if (sync_data.navigation_forward_back()) {
     transition |= ui::PAGE_TRANSITION_FORWARD_BACK;
-  if (sync_data.navigation_from_address_bar())
+  }
+  if (sync_data.navigation_from_address_bar()) {
     transition |= ui::PAGE_TRANSITION_FROM_ADDRESS_BAR;
-  if (sync_data.navigation_home_page())
+  }
+  if (sync_data.navigation_home_page()) {
     transition |= ui::PAGE_TRANSITION_HOME_PAGE;
-  if (sync_data.navigation_chain_start())
+  }
+  if (sync_data.navigation_chain_start()) {
     transition |= ui::PAGE_TRANSITION_CHAIN_START;
-  if (sync_data.navigation_chain_end())
+  }
+  if (sync_data.navigation_chain_end()) {
     transition |= ui::PAGE_TRANSITION_CHAIN_END;
+  }
 
   navigation.set_transition_type(static_cast<ui::PageTransition>(transition));
 
   navigation.set_timestamp(syncer::ProtoTimeToTime(sync_data.timestamp_msec()));
-  if (sync_data.has_favicon_url())
+  if (sync_data.has_favicon_url()) {
     navigation.set_favicon_url(GURL(sync_data.favicon_url()));
+  }
 
   if (sync_data.has_password_state()) {
     navigation.set_password_state(
@@ -341,8 +347,9 @@
   sync_data.set_window_id(wrapped_window.window_id.id());
   sync_data.set_selected_tab_index(wrapped_window.selected_tab_index);
 
-  for (const auto& tab : wrapped_window.tabs)
+  for (const auto& tab : wrapped_window.tabs) {
     sync_data.add_tab(tab->tab_id.id());
+  }
 
   return sync_data;
 }
diff --git a/components/sync_sessions/synced_session_tracker.cc b/components/sync_sessions/synced_session_tracker.cc
index ea069d0..490a1109 100644
--- a/components/sync_sessions/synced_session_tracker.cc
+++ b/components/sync_sessions/synced_session_tracker.cc
@@ -61,12 +61,14 @@
   std::set<int> session_window_ids;
   std::set<int> session_tab_ids;
   for (const sync_pb::SessionWindow& window : header.window()) {
-    if (!session_window_ids.insert(window.window_id()).second)
+    if (!session_window_ids.insert(window.window_id()).second) {
       return false;
+    }
 
     for (int tab_id : window.tab()) {
-      if (!session_tab_ids.insert(tab_id).second)
+      if (!session_tab_ids.insert(tab_id).second) {
         return false;
+      }
     }
   }
 
@@ -93,8 +95,9 @@
     session_window->window_id =
         SessionID::FromSerializedValue(specifics.window_id());
   }
-  if (specifics.has_selected_tab_index())
+  if (specifics.has_selected_tab_index()) {
     session_window->selected_tab_index = specifics.selected_tab_index();
+  }
   synced_session_window->window_type = specifics.browser_type();
   if (specifics.has_browser_type()) {
     if (specifics.browser_type() ==
@@ -121,8 +124,9 @@
     base::Time mtime,
     SyncedSession* synced_session,
     SyncedSessionTracker* tracker) {
-  if (header_specifics.has_client_name())
+  if (header_specifics.has_client_name()) {
     synced_session->session_name = header_specifics.client_name();
+  }
   if (header_specifics.has_device_type()) {
     synced_session->device_type = header_specifics.device_type();
   }
@@ -192,8 +196,9 @@
   windows->clear();
 
   const TrackedSession* session = LookupTrackedSession(session_tag);
-  if (!session)
+  if (!session) {
     return false;  // We have no record of this session.
+  }
 
   for (const auto& [window_id, window] : session->synced_session.windows) {
     windows->push_back(&window->wrapped_window);
@@ -205,16 +210,19 @@
 const sessions::SessionTab* SyncedSessionTracker::LookupSessionTab(
     const std::string& tag,
     SessionID tab_id) const {
-  if (!tab_id.is_valid())
+  if (!tab_id.is_valid()) {
     return nullptr;
+  }
 
   const TrackedSession* session = LookupTrackedSession(tag);
-  if (!session)
+  if (!session) {
     return nullptr;  // We have no record of this session.
+  }
 
   auto tab_iter = session->synced_tab_map.find(tab_id);
-  if (tab_iter == session->synced_tab_map.end())
+  if (tab_iter == session->synced_tab_map.end()) {
     return nullptr;  // We have no record of this tab.
+  }
 
   return tab_iter->second;
 }
@@ -223,12 +231,14 @@
 SyncedSessionTracker::LookupWindowType(const std::string& session_tag,
                                        SessionID window_id) const {
   const TrackedSession* session = LookupTrackedSession(session_tag);
-  if (!session)
+  if (!session) {
     return absl::nullopt;
+  }
 
   auto window_iter = session->synced_window_map.find(window_id);
-  if (window_iter == session->synced_window_map.end())
+  if (window_iter == session->synced_window_map.end()) {
     return absl::nullopt;  // We have no record of this window.
+  }
 
   return window_iter->second->window_type;
 }
@@ -259,8 +269,9 @@
   DCHECK_NE(local_session_tag_, session_tag);
 
   auto iter = session_map_.find(session_tag);
-  if (iter == session_map_.end())
+  if (iter == session_map_.end()) {
     return false;
+  }
 
   // An implicitly created session that has children tabs but no header node
   // will have never had the device_type changed from unset.
@@ -296,8 +307,9 @@
                                             int tab_node_id) {
   DCHECK_NE(local_session_tag_, session_tag);
   TrackedSession* session = LookupTrackedSession(session_tag);
-  if (session)
+  if (session) {
     session->tab_node_pool.DeleteTabNode(tab_node_id);
+  }
 }
 
 const SyncedSessionTracker::TrackedSession*
@@ -316,8 +328,9 @@
 SyncedSessionTracker::TrackedSession* SyncedSessionTracker::GetTrackedSession(
     const std::string& session_tag) {
   TrackedSession* session = LookupTrackedSession(session_tag);
-  if (session)
+  if (session) {
     return session;
+  }
 
   session = &session_map_[session_tag];
   DVLOG(1) << "Creating new session with tag " << session_tag << " at "
@@ -354,8 +367,9 @@
     const base::RepeatingCallback<bool(int /*tab_node_id*/)>&
         is_tab_node_unsynced_cb) {
   TrackedSession* session = LookupTrackedSession(session_tag);
-  if (!session)
+  if (!session) {
     return;
+  }
 
   for (const auto& [window_id, window] : session->unmapped_windows) {
     session->synced_window_map.erase(window_id);
@@ -394,8 +408,9 @@
 
 bool SyncedSessionTracker::IsTabUnmappedForTesting(SessionID tab_id) {
   const TrackedSession* session = LookupTrackedSession(local_session_tag_);
-  if (!session)
+  if (!session) {
     return false;
+  }
 
   return session->unmapped_tabs.count(tab_id) != 0;
 }
@@ -719,8 +734,9 @@
     // Delete any closed windows and unused tabs as necessary. We exclude the
     // local session here because it should be cleaned up explicitly with
     // CleanupLocalTabs().
-    if (session_tag != tracker->GetLocalSessionTag())
+    if (session_tag != tracker->GetLocalSessionTag()) {
       tracker->CleanupSession(session_tag);
+    }
   } else if (specifics.has_tab()) {
     const sync_pb::SessionTab& tab_s = specifics.tab();
     SessionID tab_id = SessionID::FromSerializedValue(tab_s.tab_id());
@@ -771,8 +787,9 @@
     SetSessionTabFromSyncData(tab_s, modification_time, tab);
 
     // Update the last modified time.
-    if (session->modified_time < modification_time)
+    if (session->modified_time < modification_time) {
       session->modified_time = modification_time;
+    }
   } else {
     LOG(WARNING) << "Ignoring session node with missing header/tab "
                  << "fields and tag " << session_tag << ".";
diff --git a/components/sync_sessions/synced_session_unittest.cc b/components/sync_sessions/synced_session_unittest.cc
index db59256..6e393689 100644
--- a/components/sync_sessions/synced_session_unittest.cc
+++ b/components/sync_sessions/synced_session_unittest.cc
@@ -172,8 +172,9 @@
     // breaking.
     for (uint32_t qualifier = ui::PAGE_TRANSITION_FORWARD_BACK; qualifier != 0;
          qualifier <<= 1) {
-      if (qualifier == static_cast<uint32_t>(ui::PAGE_TRANSITION_FROM_API))
+      if (qualifier == static_cast<uint32_t>(ui::PAGE_TRANSITION_FROM_API)) {
         continue;  // We don't sync PAGE_TRANSITION_FROM_API.
+      }
       ui::PageTransition transition =
           ui::PageTransitionFromInt(core_type | qualifier);
       SerializedNavigationEntryTestHelper::SetTransitionType(transition,
diff --git a/components/sync_sessions/test_synced_window_delegates_getter.cc b/components/sync_sessions/test_synced_window_delegates_getter.cc
index d7f06bd..cba0213b 100644
--- a/components/sync_sessions/test_synced_window_delegates_getter.cc
+++ b/components/sync_sessions/test_synced_window_delegates_getter.cc
@@ -80,8 +80,9 @@
 }
 
 GURL TestSyncedTabDelegate::GetVirtualURLAtIndex(int i) const {
-  if (static_cast<size_t>(i) >= entries_.size())
+  if (static_cast<size_t>(i) >= entries_.size()) {
     return GURL();
+  }
   return entries_[i]->virtual_url();
 }
 
@@ -93,8 +94,9 @@
 void TestSyncedTabDelegate::GetSerializedNavigationAtIndex(
     int i,
     sessions::SerializedNavigationEntry* serialized_entry) const {
-  if (static_cast<size_t>(i) >= entries_.size())
+  if (static_cast<size_t>(i) >= entries_.size()) {
     return;
+  }
   *serialized_entry = *entries_[i];
 }
 
@@ -142,10 +144,12 @@
   // that there is at least one http:// url.
   int http_count = 0;
   for (auto& entry : entries_) {
-    if (!entry->virtual_url().is_valid())
+    if (!entry->virtual_url().is_valid()) {
       return false;
-    if (entry->virtual_url().SchemeIsHTTPOrHTTPS())
+    }
+    if (entry->virtual_url().SchemeIsHTTPOrHTTPS()) {
       http_count++;
+    }
   }
   return http_count > 0;
 }
@@ -277,8 +281,9 @@
 
 void TestSyncedWindowDelegate::OverrideTabAt(int index,
                                              SyncedTabDelegate* delegate) {
-  if (index >= static_cast<int>(tab_delegates_.size()))
+  if (index >= static_cast<int>(tab_delegates_.size())) {
     tab_delegates_.resize(index + 1, nullptr);
+  }
 
   tab_delegates_[index] = delegate;
 }
@@ -322,16 +327,18 @@
 }
 
 SyncedTabDelegate* TestSyncedWindowDelegate::GetTabAt(int index) const {
-  if (index >= static_cast<int>(tab_delegates_.size()))
+  if (index >= static_cast<int>(tab_delegates_.size())) {
     return nullptr;
+  }
 
   return tab_delegates_[index];
 }
 
 SessionID TestSyncedWindowDelegate::GetTabIdAt(int index) const {
   SyncedTabDelegate* delegate = GetTabAt(index);
-  if (!delegate)
+  if (!delegate) {
     return SessionID::InvalidValue();
+  }
   return delegate->GetSessionId();
 }
 
@@ -391,8 +398,9 @@
 }
 
 void TestSyncedWindowDelegatesGetter::SessionRestoreComplete() {
-  for (auto& window : windows_)
+  for (auto& window : windows_) {
     window->SetIsSessionRestoreInProgress(false);
+  }
 
   router_.NotifySessionRestoreComplete();
 }
@@ -409,8 +417,9 @@
 const SyncedWindowDelegate* TestSyncedWindowDelegatesGetter::FindById(
     SessionID session_id) {
   for (const auto& [window_id, delegate] : delegates_) {
-    if (delegate->GetSessionId() == session_id)
+    if (delegate->GetSessionId() == session_id) {
       return delegate;
+    }
   }
   return nullptr;
 }
@@ -430,14 +439,16 @@
 
 void TestSyncedWindowDelegatesGetter::DummyRouter::NotifyNav(
     SyncedTabDelegate* tab) {
-  if (handler_)
+  if (handler_) {
     handler_->OnLocalTabModified(tab);
+  }
 }
 
 void TestSyncedWindowDelegatesGetter::DummyRouter::
     NotifySessionRestoreComplete() {
-  if (handler_)
+  if (handler_) {
     handler_->OnSessionRestoreComplete();
+  }
 }
 
 }  // namespace sync_sessions
diff --git a/components/translate/core/browser/BUILD.gn b/components/translate/core/browser/BUILD.gn
index f57e625..b6a72be 100644
--- a/components/translate/core/browser/BUILD.gn
+++ b/components/translate/core/browser/BUILD.gn
@@ -9,8 +9,6 @@
     "language_state.cc",
     "language_state.h",
     "page_translated_details.h",
-    "translate_accept_languages.cc",
-    "translate_accept_languages.h",
     "translate_browser_metrics.cc",
     "translate_browser_metrics.h",
     "translate_client.h",
@@ -113,7 +111,6 @@
   testonly = true
   sources = [
     "language_state_unittest.cc",
-    "translate_accept_languages_unittest.cc",
     "translate_browser_metrics_unittest.cc",
     "translate_language_list_unittest.cc",
     "translate_manager_unittest.cc",
diff --git a/components/translate/core/browser/mock_translate_client.h b/components/translate/core/browser/mock_translate_client.h
index b85f96a..2fbd58e 100644
--- a/components/translate/core/browser/mock_translate_client.h
+++ b/components/translate/core/browser/mock_translate_client.h
@@ -38,7 +38,8 @@
 
   std::unique_ptr<TranslatePrefs> GetTranslatePrefs() override;
 
-  MOCK_METHOD0(GetTranslateAcceptLanguages, TranslateAcceptLanguages*());
+  MOCK_METHOD0(GetTranslateAcceptLanguages,
+               language::AcceptLanguagesService*());
   MOCK_CONST_METHOD0(GetInfobarIconID, int());
 
 #if !defined(USE_AURA)
diff --git a/components/translate/core/browser/translate_client.h b/components/translate/core/browser/translate_client.h
index fbb97e8..2450994 100644
--- a/components/translate/core/browser/translate_client.h
+++ b/components/translate/core/browser/translate_client.h
@@ -10,6 +10,7 @@
 
 #include "base/memory/ref_counted.h"
 #include "build/build_config.h"
+#include "components/language/core/browser/accept_languages_service.h"
 #include "components/translate/core/browser/translate_prefs.h"
 #include "components/translate/core/browser/translate_step.h"
 #include "components/translate/core/common/translate_errors.h"
@@ -21,9 +22,12 @@
 class InfoBar;
 }  // namespace infobars
 
+namespace language {
+class AcceptLanguagesService;
+}
+
 namespace translate {
 
-class TranslateAcceptLanguages;
 class TranslateDriver;
 class TranslateInfoBarDelegate;
 
@@ -45,8 +49,9 @@
   // Returns the associated TranslatePrefs.
   virtual std::unique_ptr<TranslatePrefs> GetTranslatePrefs() = 0;
 
-  // Returns the associated TranslateAcceptLanguages.
-  virtual TranslateAcceptLanguages* GetTranslateAcceptLanguages() = 0;
+  // Returns the associated AcceptLanguagesService.
+  // TODO(crbug.com/949253): Rename this to GetAcceptLanguageService.
+  virtual language::AcceptLanguagesService* GetTranslateAcceptLanguages() = 0;
 
 #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
   // Returns a translate infobar that owns |delegate|.
diff --git a/components/translate/core/browser/translate_infobar_delegate.cc b/components/translate/core/browser/translate_infobar_delegate.cc
index 515c65f..3106421 100644
--- a/components/translate/core/browser/translate_infobar_delegate.cc
+++ b/components/translate/core/browser/translate_infobar_delegate.cc
@@ -15,10 +15,10 @@
 #include "build/build_config.h"
 #include "components/infobars/core/infobar.h"
 #include "components/infobars/core/infobar_manager.h"
+#include "components/language/core/browser/accept_languages_service.h"
 #include "components/language/core/common/language_experiments.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/translate/core/browser/language_state.h"
-#include "components/translate/core/browser/translate_accept_languages.h"
 #include "components/translate/core/browser/translate_client.h"
 #include "components/translate/core/browser/translate_download_manager.h"
 #include "components/translate/core/browser/translate_driver.h"
@@ -199,7 +199,7 @@
 bool TranslateInfoBarDelegate::IsTranslatableLanguageByPrefs() const {
   TranslateClient* client = translate_manager_->translate_client();
   std::unique_ptr<TranslatePrefs> translate_prefs(client->GetTranslatePrefs());
-  TranslateAcceptLanguages* accept_languages =
+  language::AcceptLanguagesService* accept_languages =
       client->GetTranslateAcceptLanguages();
   return translate_prefs->CanTranslateLanguage(accept_languages,
                                                source_language_code());
diff --git a/components/translate/core/browser/translate_infobar_delegate_unittest.cc b/components/translate/core/browser/translate_infobar_delegate_unittest.cc
index f22347c..e4186e3c 100644
--- a/components/translate/core/browser/translate_infobar_delegate_unittest.cc
+++ b/components/translate/core/browser/translate_infobar_delegate_unittest.cc
@@ -11,6 +11,7 @@
 #include "build/chromeos_buildflags.h"
 #include "components/infobars/core/infobar.h"
 #include "components/infobars/core/infobar_manager.h"
+#include "components/language/core/browser/accept_languages_service.h"
 #include "components/language/core/browser/language_model.h"
 #include "components/language/core/browser/language_prefs.h"
 #include "components/language/core/browser/pref_names.h"
@@ -19,7 +20,6 @@
 #include "components/translate/core/browser/mock_translate_client.h"
 #include "components/translate/core/browser/mock_translate_driver.h"
 #include "components/translate/core/browser/mock_translate_ranker.h"
-#include "components/translate/core/browser/translate_accept_languages.h"
 #include "components/translate/core/browser/translate_client.h"
 #include "components/translate/core/browser/translate_infobar_delegate.h"
 #include "components/translate/core/browser/translate_manager.h"
@@ -199,8 +199,8 @@
   // language.
   std::unique_ptr<TranslateInfoBarDelegate> delegate =
       ConstructInfoBarDelegate();
-  TranslateAcceptLanguages accept_languages(pref_service_.get(),
-                                            testing::accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(
+      pref_service_.get(), testing::accept_languages_prefs);
   ON_CALL(*(client_.get()), GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
   ListPrefUpdate update(pref_service_.get(),
@@ -305,8 +305,8 @@
 }
 
 TEST_F(TranslateInfoBarDelegateTest, ShouldAutoNeverTranslate) {
-  TranslateAcceptLanguages accept_languages(pref_service_.get(),
-                                            testing::accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(
+      pref_service_.get(), testing::accept_languages_prefs);
   ON_CALL(*(client_.get()), GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
 
diff --git a/components/translate/core/browser/translate_manager.cc b/components/translate/core/browser/translate_manager.cc
index c403e9c..91da156 100644
--- a/components/translate/core/browser/translate_manager.cc
+++ b/components/translate/core/browser/translate_manager.cc
@@ -20,6 +20,7 @@
 #include "base/strings/string_split.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
+#include "components/language/core/browser/accept_languages_service.h"
 #include "components/language/core/browser/language_model.h"
 #include "components/language/core/common/language_experiments.h"
 #include "components/language/core/common/language_util.h"
@@ -27,7 +28,6 @@
 #include "components/prefs/pref_service.h"
 #include "components/translate/core/browser/language_state.h"
 #include "components/translate/core/browser/page_translated_details.h"
-#include "components/translate/core/browser/translate_accept_languages.h"
 #include "components/translate/core/browser/translate_browser_metrics.h"
 #include "components/translate/core/browser/translate_client.h"
 #include "components/translate/core/browser/translate_download_manager.h"
@@ -995,7 +995,7 @@
     TranslateTriggerDecision* decision,
     TranslatePrefs* translate_prefs,
     const std::string& page_language_code) {
-  TranslateAcceptLanguages* accept_languages =
+  language::AcceptLanguagesService* accept_languages =
       translate_client_->GetTranslateAcceptLanguages();
   // Don't translate any user blocklisted languages.
   if (!translate_prefs->CanTranslateLanguage(accept_languages,
diff --git a/components/translate/core/browser/translate_manager_unittest.cc b/components/translate/core/browser/translate_manager_unittest.cc
index b7d0c28..c92fa46 100644
--- a/components/translate/core/browser/translate_manager_unittest.cc
+++ b/components/translate/core/browser/translate_manager_unittest.cc
@@ -16,6 +16,7 @@
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "components/infobars/core/infobar.h"
+#include "components/language/core/browser/accept_languages_service.h"
 #include "components/language/core/browser/language_model.h"
 #include "components/language/core/browser/language_prefs.h"
 #include "components/language/core/common/language_experiments.h"
@@ -25,7 +26,6 @@
 #include "components/translate/core/browser/mock_translate_driver.h"
 #include "components/translate/core/browser/mock_translate_metrics_logger.h"
 #include "components/translate/core/browser/mock_translate_ranker.h"
-#include "components/translate/core/browser/translate_accept_languages.h"
 #include "components/translate/core/browser/translate_browser_metrics.h"
 #include "components/translate/core/browser/translate_client.h"
 #include "components/translate/core/browser/translate_download_manager.h"
@@ -406,7 +406,8 @@
   };
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
   ON_CALL(mock_translate_client_,
@@ -450,7 +451,8 @@
   };
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
   ON_CALL(mock_translate_client_,
@@ -488,7 +490,8 @@
   };
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
   ON_CALL(mock_translate_client_, ShowTranslateUI(_, _, _, _, _))
@@ -534,7 +537,8 @@
   };
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
   ON_CALL(mock_translate_client_, ShowTranslateUI(_, _, _, _, _))
@@ -583,7 +587,8 @@
   };
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
   ON_CALL(mock_translate_client_, ShowTranslateUI(_, _, _, _, _))
@@ -627,7 +632,8 @@
   };
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
   ON_CALL(mock_translate_client_, ShowTranslateUI(_, _, _, _, _))
@@ -666,7 +672,8 @@
   };
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
   ON_CALL(mock_translate_client_, ShowTranslateUI(_, _, _, _, _))
@@ -709,7 +716,8 @@
   };
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
   ON_CALL(mock_translate_client_, ShowTranslateUI(_, _, _, _, _))
@@ -751,7 +759,8 @@
 TEST_F(TranslateManagerTest, DontTranslateOffline) {
   TranslateManager::SetIgnoreMissingKeyForTesting(true);
 
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
@@ -791,7 +800,8 @@
 TEST_F(TranslateManagerTest, DontTranslateAutofillAssistantRunning) {
   TranslateManager::SetIgnoreMissingKeyForTesting(true);
 
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
   ON_CALL(mock_translate_client_, IsAutofillAssistantRunning())
@@ -1138,7 +1148,8 @@
 
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
 
@@ -1189,7 +1200,8 @@
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
 
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
 
@@ -1226,7 +1238,8 @@
   // If a lang is not in the list than CanTranslateLanguage(|lang|) returns true
   // even if a language is blocked.
   prefs_.registry()->RegisterStringPref("accept_languages.test", "de");
-  TranslateAcceptLanguages accept_languages(&prefs_, "accept_languages.test");
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    "accept_languages.test");
 
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
@@ -1265,7 +1278,8 @@
   // If a lang is not in the list than CanTranslateLanguage(|lang|) returns true
   // even if a language is blocked.
   prefs_.registry()->RegisterStringPref("accept_languages.test", "de");
-  TranslateAcceptLanguages accept_languages(&prefs_, "accept_languages.test");
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    "accept_languages.test");
 
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
@@ -1306,7 +1320,8 @@
   PrepareTranslateManager();
   manager_->set_application_locale("en");
 
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
 
@@ -1339,7 +1354,8 @@
   PrepareTranslateManager();
   manager_->set_application_locale("en");
 
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
 
@@ -1383,7 +1399,8 @@
 
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
   network_notifier_.SimulateOnline();
@@ -1435,7 +1452,8 @@
   };
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
   EXPECT_CALL(mock_translate_client_,
@@ -1507,7 +1525,8 @@
 
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
   EXPECT_CALL(mock_translate_client_,
@@ -1553,7 +1572,8 @@
 
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
   EXPECT_CALL(mock_translate_client_,
@@ -1599,7 +1619,8 @@
 
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
   EXPECT_CALL(mock_translate_client_,
@@ -1644,7 +1665,8 @@
 
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
   EXPECT_CALL(mock_translate_client_, ShowTranslateUI(_, _, _, _, _)).Times(0);
@@ -1687,7 +1709,8 @@
 
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
   EXPECT_CALL(mock_translate_client_,
@@ -1733,7 +1756,8 @@
 
   ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
       .WillByDefault(Return(true));
-  TranslateAcceptLanguages accept_languages(&prefs_, accept_languages_prefs);
+  language::AcceptLanguagesService accept_languages(&prefs_,
+                                                    accept_languages_prefs);
   ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
       .WillByDefault(Return(&accept_languages));
   EXPECT_CALL(mock_translate_client_,
diff --git a/components/translate/core/browser/translate_prefs.cc b/components/translate/core/browser/translate_prefs.cc
index 372ef9b6..8fc46f9 100644
--- a/components/translate/core/browser/translate_prefs.cc
+++ b/components/translate/core/browser/translate_prefs.cc
@@ -23,6 +23,7 @@
 #include "base/values.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
+#include "components/language/core/browser/accept_languages_service.h"
 #include "components/language/core/browser/language_prefs.h"
 #include "components/language/core/browser/pref_names.h"
 #include "components/language/core/common/language_experiments.h"
@@ -32,7 +33,6 @@
 #include "components/prefs/pref_service.h"
 #include "components/prefs/scoped_user_pref_update.h"
 #include "components/strings/grit/components_locale_settings.h"
-#include "components/translate/core/browser/translate_accept_languages.h"
 #include "components/translate/core/browser/translate_download_manager.h"
 #include "components/translate/core/browser/translate_pref_names.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -70,7 +70,7 @@
     // If at least one of these same-family languages in |list| is supported by
     // Accept-Languages, then that means that none of the languages in this
     // family should be purged.
-    if (TranslateAcceptLanguages::CanBeAcceptLanguage(lang))
+    if (language::AcceptLanguagesService::CanBeAcceptLanguage(lang))
       return;
   }
 
@@ -876,7 +876,7 @@
 }
 
 bool TranslatePrefs::CanTranslateLanguage(
-    TranslateAcceptLanguages* accept_languages,
+    language::AcceptLanguagesService* accept_languages,
     base::StringPiece language) {
   // Languages not on the blocklist can always be translated.
   if (!IsBlockedLanguage(language))
@@ -887,7 +887,7 @@
   // Accept-Language list (this is true for languages that do not have a ICU
   // localization for the current UI locale.
   bool can_be_accept_language =
-      TranslateAcceptLanguages::CanBeAcceptLanguage(language);
+      language::AcceptLanguagesService::CanBeAcceptLanguage(language);
   bool is_accept_language = accept_languages->IsAcceptLanguage(language);
   if (!is_accept_language && can_be_accept_language &&
       !IsDetailedLanguageSettingsEnabled())
diff --git a/components/translate/core/browser/translate_prefs.h b/components/translate/core/browser/translate_prefs.h
index d8fce93..9a40a4a 100644
--- a/components/translate/core/browser/translate_prefs.h
+++ b/components/translate/core/browser/translate_prefs.h
@@ -33,6 +33,7 @@
 
 namespace language {
 class LanguagePrefs;
+class AcceptLanguagesService;
 }
 
 namespace translate {
@@ -81,8 +82,6 @@
 constexpr int kNeverTranslateShortcutMinimumDenials = 3;
 #endif
 
-class TranslateAcceptLanguages;
-
 // This class holds various info about a language, that are related to Translate
 // Preferences and Language Settings.
 struct TranslateLanguageInfo {
@@ -322,7 +321,7 @@
   // Gets the user selected language list from language settings.
   void GetUserSelectedLanguageList(std::vector<std::string>* languages) const;
 
-  bool CanTranslateLanguage(TranslateAcceptLanguages* accept_languages,
+  bool CanTranslateLanguage(language::AcceptLanguagesService* accept_languages,
                             base::StringPiece language);
   bool ShouldAutoTranslate(base::StringPiece source_language,
                            std::string* target_language);
diff --git a/components/translate/core/browser/translate_prefs_unittest.cc b/components/translate/core/browser/translate_prefs_unittest.cc
index b3386204..53c41320 100644
--- a/components/translate/core/browser/translate_prefs_unittest.cc
+++ b/components/translate/core/browser/translate_prefs_unittest.cc
@@ -19,13 +19,13 @@
 #include "base/values.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
+#include "components/language/core/browser/accept_languages_service.h"
 #include "components/language/core/browser/language_prefs.h"
 #include "components/language/core/browser/language_prefs_test_util.h"
 #include "components/language/core/browser/pref_names.h"
 #include "components/language/core/common/language_experiments.h"
 #include "components/prefs/scoped_user_pref_update.h"
 #include "components/sync_preferences/testing_pref_service_syncable.h"
-#include "components/translate/core/browser/translate_accept_languages.h"
 #include "components/translate/core/browser/translate_download_manager.h"
 #include "components/translate/core/browser/translate_pref_names.h"
 #include "components/translate/core/common/translate_util.h"
@@ -1140,17 +1140,17 @@
 
   translate_prefs_->ResetToDefaults();
 
-  TranslateAcceptLanguages translate_accept_languages(
+  language::AcceptLanguagesService accept_languages_service(
       &prefs_, language::prefs::kAcceptLanguages);
 
   // Unblocked language.
-  EXPECT_TRUE(translate_prefs_->CanTranslateLanguage(
-      &translate_accept_languages, "fr"));
+  EXPECT_TRUE(
+      translate_prefs_->CanTranslateLanguage(&accept_languages_service, "fr"));
 
   // Blocked language.
   translate_prefs_->BlockLanguage("en");
-  EXPECT_FALSE(translate_prefs_->CanTranslateLanguage(
-      &translate_accept_languages, "en"));
+  EXPECT_FALSE(
+      translate_prefs_->CanTranslateLanguage(&accept_languages_service, "en"));
 
   // When the detailed language settings are enabled blocked languages not in
   // the accept languages list are blocked. When the detailed language settings
@@ -1158,10 +1158,10 @@
   translate_prefs_->BlockLanguage("de");
   if (TranslatePrefs::IsDetailedLanguageSettingsEnabled()) {
     EXPECT_FALSE(translate_prefs_->CanTranslateLanguage(
-        &translate_accept_languages, "de"));
+        &accept_languages_service, "de"));
   } else {
     EXPECT_TRUE(translate_prefs_->CanTranslateLanguage(
-        &translate_accept_languages, "de"));
+        &accept_languages_service, "de"));
   }
 
 // When the detailed language settings are enabled blocked languages not in
@@ -1171,14 +1171,14 @@
     base::test::ScopedFeatureList scoped_feature_list(
         language::kDetailedLanguageSettings);
     EXPECT_FALSE(translate_prefs_->CanTranslateLanguage(
-        &translate_accept_languages, "de"));
+        &accept_languages_service, "de"));
   }
 #elif BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
   {  // Desktop scoped feature.
     base::test::ScopedFeatureList scoped_feature_list(
         language::kDesktopDetailedLanguageSettings);
     EXPECT_FALSE(translate_prefs_->CanTranslateLanguage(
-        &translate_accept_languages, "de"));
+        &accept_languages_service, "de"));
   }
 #endif
 
@@ -1190,7 +1190,7 @@
          {"enforce_ranker", "false"},
          {"backoff_threshold", "1"}});
     EXPECT_TRUE(translate_prefs_->CanTranslateLanguage(
-        &translate_accept_languages, "en"));
+        &accept_languages_service, "en"));
   }
 }
 
diff --git a/components/variations/variations_associated_data.cc b/components/variations/variations_associated_data.cc
index 25100ac..bb9566a 100644
--- a/components/variations/variations_associated_data.cc
+++ b/components/variations/variations_associated_data.cc
@@ -12,7 +12,6 @@
 #include "base/metrics/field_trial_param_associator.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/strings/string_split.h"
-#include "components/variations/variations_ids_provider.h"
 
 namespace variations {
 
diff --git a/components/webauthn/android/BUILD.gn b/components/webauthn/android/BUILD.gn
index 2625bce..0f9676b 100644
--- a/components/webauthn/android/BUILD.gn
+++ b/components/webauthn/android/BUILD.gn
@@ -8,6 +8,7 @@
   sources = [
     "java/src/org/chromium/components/webauthn/Fido2Api.java",
     "java/src/org/chromium/components/webauthn/InternalAuthenticator.java",
+    "java/src/org/chromium/components/webauthn/WebAuthnBrowserBridge.java",
   ]
 }
 
@@ -26,6 +27,8 @@
     "java/src/org/chromium/components/webauthn/IsUvpaaResponseCallback.java",
     "java/src/org/chromium/components/webauthn/ListCredentials.java",
     "java/src/org/chromium/components/webauthn/MakeCredentialResponseCallback.java",
+    "java/src/org/chromium/components/webauthn/WebAuthnBrowserBridge.java",
+    "java/src/org/chromium/components/webauthn/WebAuthnCredentialDetails.java",
   ]
   annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   deps = [
@@ -69,6 +72,10 @@
     "fido2api_native_android.cc",
     "internal_authenticator_android.cc",
     "internal_authenticator_android.h",
+    "webauthn_browser_bridge.cc",
+    "webauthn_browser_bridge.h",
+    "webauthn_client_android.cc",
+    "webauthn_client_android.h",
   ]
   deps = [
     ":jni_headers",
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2Api.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2Api.java
index 36cc75e0..772d4d2 100644
--- a/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2Api.java
+++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2Api.java
@@ -31,7 +31,6 @@
 import org.chromium.blink.mojom.ResidentKeyRequirement;
 import org.chromium.blink.mojom.UserVerificationRequirement;
 import org.chromium.blink.mojom.UvmEntry;
-import org.chromium.content_public.browser.WebAuthnCredentialDetails;
 import org.chromium.mojo_base.mojom.TimeDelta;
 
 import java.security.NoSuchAlgorithmException;
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2ApiCall.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2ApiCall.java
index 9390222..686412e 100644
--- a/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2ApiCall.java
+++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2ApiCall.java
@@ -28,7 +28,6 @@
 import com.google.android.gms.tasks.TaskCompletionSource;
 
 import org.chromium.content_public.browser.WebAuthenticationDelegate;
-import org.chromium.content_public.browser.WebAuthnCredentialDetails;
 
 import java.util.List;
 
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2ApiCallHelper.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2ApiCallHelper.java
index 2a3a74f6..4b883381 100644
--- a/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2ApiCallHelper.java
+++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2ApiCallHelper.java
@@ -13,7 +13,6 @@
 import com.google.android.gms.tasks.Task;
 
 import org.chromium.base.ContextUtils;
-import org.chromium.content_public.browser.WebAuthnCredentialDetails;
 
 import java.util.List;
 
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2CredentialRequest.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2CredentialRequest.java
index e6adc7d..ced62316 100644
--- a/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2CredentialRequest.java
+++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2CredentialRequest.java
@@ -34,7 +34,6 @@
 import org.chromium.content_public.browser.RenderFrameHost;
 import org.chromium.content_public.browser.RenderFrameHost.WebAuthSecurityChecksResults;
 import org.chromium.content_public.browser.WebAuthenticationDelegate;
-import org.chromium.content_public.browser.WebAuthnCredentialDetails;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.WebContentsStatics;
 import org.chromium.net.GURLUtils;
@@ -67,6 +66,7 @@
     private WebContents mWebContents;
     private boolean mAppIdExtensionUsed;
     private long mStartTimeMs;
+    private WebAuthnBrowserBridge mBrowserBridge;
 
     // Not null when the GMSCore-created ClientDataJson needs to be overridden.
     @Nullable
@@ -253,6 +253,11 @@
         task.addOnFailureListener((e) -> { Log.e(TAG, "FIDO2 API call failed", e); });
     }
 
+    @VisibleForTesting
+    public void overrideBrowserBridgeForTesting(WebAuthnBrowserBridge bridge) {
+        mBrowserBridge = bridge;
+    }
+
     private boolean apiAvailable() {
         return ExternalAuthUtils.getInstance().canUseGooglePlayServices(
                 new UserRecoverableErrorHandler.Silent());
@@ -261,7 +266,10 @@
     private void onWebAuthnCredentialDetailsListReceived(RenderFrameHost frameHost,
             PublicKeyCredentialRequestOptions options, String callerOriginString,
             byte[] clientDataHash, List<WebAuthnCredentialDetails> credentials) {
-        frameHost.onCredentialsDetailsListReceived(credentials,
+        if (mBrowserBridge == null) {
+            mBrowserBridge = new WebAuthnBrowserBridge();
+        }
+        mBrowserBridge.onCredentialsDetailsListReceived(frameHost, credentials,
                 (selectedCredentialId)
                         -> dispatchGetAssertionRequest(
                                 options, callerOriginString, clientDataHash, selectedCredentialId));
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/WebAuthnBrowserBridge.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/WebAuthnBrowserBridge.java
new file mode 100644
index 0000000..bee9457
--- /dev/null
+++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/WebAuthnBrowserBridge.java
@@ -0,0 +1,76 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.components.webauthn;
+
+import org.chromium.base.Callback;
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
+import org.chromium.content_public.browser.RenderFrameHost;
+
+import java.util.List;
+
+/**
+ * Provides a bridge from the the Android Web Authentication request handlers
+ * to the embedding browser.
+ */
+public class WebAuthnBrowserBridge {
+    private long mNativeWebAuthnBrowserBridge;
+
+    /**
+     * Provides a list of credentials for WebAuthn Conditional UI. These credentials become
+     * available as options for autofill UI on sign-in input fields. The callback is invoked when
+     * a user selects one of the credentials from the list.
+     *
+     * @param credentialList The list of credentials that can be used as autofill suggestions.
+     * @param callback The callback to be invoked with the credential ID of a selected credential.
+     */
+    public void onCredentialsDetailsListReceived(RenderFrameHost frameHost,
+            List<WebAuthnCredentialDetails> credentialList, Callback<byte[]> callback) {
+        assert credentialList != null;
+        assert callback != null;
+
+        if (mNativeWebAuthnBrowserBridge == 0) {
+            mNativeWebAuthnBrowserBridge =
+                    WebAuthnBrowserBridgeJni.get().createNativeWebAuthnBrowserBridge(
+                            WebAuthnBrowserBridge.this);
+        }
+
+        WebAuthnCredentialDetails[] credentialArray =
+                credentialList.toArray(new WebAuthnCredentialDetails[credentialList.size()]);
+        WebAuthnBrowserBridgeJni.get().onCredentialsDetailsListReceived(
+                mNativeWebAuthnBrowserBridge, WebAuthnBrowserBridge.this, credentialArray,
+                frameHost, callback);
+    }
+
+    @CalledByNative
+    private static String getWebAuthnCredentialDetailsUserName(WebAuthnCredentialDetails cred) {
+        return cred.mUserName;
+    }
+
+    @CalledByNative
+    private static String getWebAuthnCredentialDetailsUserDisplayName(
+            WebAuthnCredentialDetails cred) {
+        return cred.mUserDisplayName;
+    }
+
+    @CalledByNative
+    private static byte[] getWebAuthnCredentialDetailsUserId(WebAuthnCredentialDetails cred) {
+        return cred.mUserId;
+    }
+
+    @CalledByNative
+    private static byte[] getWebAuthnCredentialDetailsCredentialId(WebAuthnCredentialDetails cred) {
+        return cred.mCredentialId;
+    }
+
+    @NativeMethods
+    interface Natives {
+        // Native methods are implemented in webauthn_browser_bridge.cc.
+        long createNativeWebAuthnBrowserBridge(WebAuthnBrowserBridge caller);
+        void onCredentialsDetailsListReceived(long nativeWebAuthnBrowserBridge,
+                WebAuthnBrowserBridge caller, WebAuthnCredentialDetails[] credentialList,
+                RenderFrameHost frameHost, Callback<byte[]> callback);
+    }
+}
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/WebAuthnCredentialDetails.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/WebAuthnCredentialDetails.java
similarity index 94%
rename from content/public/android/java/src/org/chromium/content_public/browser/WebAuthnCredentialDetails.java
rename to components/webauthn/android/java/src/org/chromium/components/webauthn/WebAuthnCredentialDetails.java
index 1e212a3..4850aa7 100644
--- a/content/public/android/java/src/org/chromium/content_public/browser/WebAuthnCredentialDetails.java
+++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/WebAuthnCredentialDetails.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.content_public.browser;
+package org.chromium.components.webauthn;
 
 /**
  * Describes a WebAuthn credential available on the authenticator.
diff --git a/components/webauthn/android/webauthn_browser_bridge.cc b/components/webauthn/android/webauthn_browser_bridge.cc
new file mode 100644
index 0000000..1963c924
--- /dev/null
+++ b/components/webauthn/android/webauthn_browser_bridge.cc
@@ -0,0 +1,110 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/webauthn/android/webauthn_browser_bridge.h"
+
+#include <jni.h>
+
+#include "base/android/callback_android.h"
+#include "base/android/jni_array.h"
+#include "base/android/jni_string.h"
+#include "base/android/scoped_java_ref.h"
+#include "components/webauthn/android/jni_headers/WebAuthnBrowserBridge_jni.h"
+#include "components/webauthn/android/webauthn_client_android.h"
+#include "content/public/browser/render_frame_host.h"
+#include "device/fido/discoverable_credential_metadata.h"
+#include "device/fido/public_key_credential_user_entity.h"
+
+using base::android::ScopedJavaLocalRef;
+
+device::DiscoverableCredentialMetadata ConvertJavaCredentialDetailsToMetadata(
+    JNIEnv* env,
+    ScopedJavaLocalRef<jobject> j_credential) {
+  device::DiscoverableCredentialMetadata credential;
+  base::android::JavaByteArrayToByteVector(
+      env,
+      Java_WebAuthnBrowserBridge_getWebAuthnCredentialDetailsCredentialId(
+          env, j_credential),
+      &credential.cred_id);
+  base::android::JavaByteArrayToByteVector(
+      env,
+      Java_WebAuthnBrowserBridge_getWebAuthnCredentialDetailsUserId(
+          env, j_credential),
+      &credential.user.id);
+  credential.user.name = ConvertJavaStringToUTF8(
+      env, Java_WebAuthnBrowserBridge_getWebAuthnCredentialDetailsUserName(
+               env, j_credential));
+  credential.user.display_name = ConvertJavaStringToUTF8(
+      env,
+      Java_WebAuthnBrowserBridge_getWebAuthnCredentialDetailsUserDisplayName(
+          env, j_credential));
+  return credential;
+}
+
+void ConvertJavaCredentialArrayToMetadataVector(
+    JNIEnv* env,
+    const base::android::JavaRef<jobjectArray>& array,
+    std::vector<device::DiscoverableCredentialMetadata>* out) {
+  jsize jlength = env->GetArrayLength(array.obj());
+  // GetArrayLength() returns -1 if |array| is not a valid Java array.
+  DCHECK_GE(jlength, 0) << "Invalid array length: " << jlength;
+  size_t length = static_cast<size_t>(std::max(0, jlength));
+  for (size_t i = 0; i < length; ++i) {
+    ScopedJavaLocalRef<jobject> j_credential(
+        env, static_cast<jobject>(env->GetObjectArrayElement(array.obj(), i)));
+    out->emplace_back(
+        ConvertJavaCredentialDetailsToMetadata(env, j_credential));
+  }
+}
+
+void OnWebAuthnCredentialSelected(
+    const base::android::JavaRef<jobject>& jcallback,
+    const std::vector<uint8_t>& credential_id) {
+  base::android::RunObjectCallbackAndroid(
+      jcallback, base::android::ToJavaByteArray(
+                     base::android::AttachCurrentThread(), credential_id.data(),
+                     credential_id.size()));
+}
+
+static jlong JNI_WebAuthnBrowserBridge_CreateNativeWebAuthnBrowserBridge(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& jbridge) {
+  return reinterpret_cast<jlong>(new WebAuthnBrowserBridge(env, jbridge));
+}
+
+WebAuthnBrowserBridge::WebAuthnBrowserBridge(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& jbridge)
+    : owner_(env, jbridge) {}
+
+WebAuthnBrowserBridge::~WebAuthnBrowserBridge() = default;
+
+void WebAuthnBrowserBridge::OnCredentialsDetailsListReceived(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>&,
+    const base::android::JavaParamRef<jobjectArray>& credentials,
+    const base::android::JavaParamRef<jobject>& jframe_host,
+    const base::android::JavaParamRef<jobject>& jcallback) const {
+  auto* client = components::WebAuthnClientAndroid::GetClient();
+  auto* render_frame_host =
+      content::RenderFrameHost::FromJavaRenderFrameHost(jframe_host);
+  // A null client indicates the embedder does not support Conditional UI.
+  if (!client) {
+    std::vector<uint8_t> credential_id = {};
+    base::android::RunObjectCallbackAndroid(
+        jcallback, base::android::ToJavaByteArray(
+                       base::android::AttachCurrentThread(),
+                       credential_id.data(), credential_id.size()));
+    return;
+  }
+  DCHECK(render_frame_host);
+  std::vector<device::DiscoverableCredentialMetadata> credentials_metadata;
+  ConvertJavaCredentialArrayToMetadataVector(env, credentials,
+                                             &credentials_metadata);
+  client->OnWebAuthnRequestPending(
+      render_frame_host, credentials_metadata,
+      base::BindOnce(
+          &OnWebAuthnCredentialSelected,
+          base::android::ScopedJavaGlobalRef<jobject>(env, jcallback)));
+}
diff --git a/components/webauthn/android/webauthn_browser_bridge.h b/components/webauthn/android/webauthn_browser_bridge.h
new file mode 100644
index 0000000..c284f92
--- /dev/null
+++ b/components/webauthn/android/webauthn_browser_bridge.h
@@ -0,0 +1,32 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_WEBAUTHN_ANDROID_WEBAUTHN_BROWSER_BRIDGE_H_
+#define COMPONENTS_WEBAUTHN_ANDROID_WEBAUTHN_BROWSER_BRIDGE_H_
+
+#include "base/android/scoped_java_ref.h"
+
+class WebAuthnBrowserBridge {
+ public:
+  WebAuthnBrowserBridge(JNIEnv* env,
+                        const base::android::JavaParamRef<jobject>& jbridge);
+
+  WebAuthnBrowserBridge(const WebAuthnBrowserBridge&) = delete;
+  WebAuthnBrowserBridge& operator=(const WebAuthnBrowserBridge&) = delete;
+
+  ~WebAuthnBrowserBridge();
+
+  void OnCredentialsDetailsListReceived(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>&,
+      const base::android::JavaParamRef<jobjectArray>& credentials,
+      const base::android::JavaParamRef<jobject>& jframe_host,
+      const base::android::JavaParamRef<jobject>& jcallback) const;
+
+ private:
+  // Java object that owns this WebAuthnBrowserBridge.
+  base::android::ScopedJavaGlobalRef<jobject> owner_;
+};
+
+#endif  // COMPONENTS_WEBAUTHN_ANDROID_WEBAUTHN_BROWSER_BRIDGE_H_
diff --git a/components/webauthn/android/webauthn_client_android.cc b/components/webauthn/android/webauthn_client_android.cc
new file mode 100644
index 0000000..13b3ff8
--- /dev/null
+++ b/components/webauthn/android/webauthn_client_android.cc
@@ -0,0 +1,32 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/webauthn/android/webauthn_client_android.h"
+
+#include <memory>
+
+#include "base/check.h"
+
+namespace components {
+
+// The WebAuthnClientAndroid instance, which is set by the embedder.
+WebAuthnClientAndroid* g_webauthn_client = nullptr;
+
+WebAuthnClientAndroid::~WebAuthnClientAndroid() = default;
+
+// static
+void WebAuthnClientAndroid::SetClient(
+    std::unique_ptr<WebAuthnClientAndroid> client) {
+  DCHECK(client);
+  DCHECK(!g_webauthn_client);
+  g_webauthn_client = client.release();
+}
+
+// static
+WebAuthnClientAndroid* WebAuthnClientAndroid::GetClient() {
+  DCHECK(g_webauthn_client);
+  return g_webauthn_client;
+}
+
+}  // namespace components
diff --git a/components/webauthn/android/webauthn_client_android.h b/components/webauthn/android/webauthn_client_android.h
new file mode 100644
index 0000000..a16420cf
--- /dev/null
+++ b/components/webauthn/android/webauthn_client_android.h
@@ -0,0 +1,43 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_WEBAUTHN_ANDROID_WEBAUTHN_CLIENT_ANDROID_H_
+#define COMPONENTS_WEBAUTHN_ANDROID_WEBAUTHN_CLIENT_ANDROID_H_
+
+#include <memory>
+
+#include "base/callback_forward.h"
+
+namespace content {
+class RenderFrameHost;
+}
+
+namespace device {
+class DiscoverableCredentialMetadata;
+}
+
+namespace components {
+
+class WebAuthnClientAndroid {
+ public:
+  virtual ~WebAuthnClientAndroid();
+
+  // Called by the embedder to set the static instance of this client.
+  static void SetClient(std::unique_ptr<WebAuthnClientAndroid> client);
+
+  // Accessor for the client that has been set by the embedder.
+  static WebAuthnClientAndroid* GetClient();
+
+  // Called when a Web Authentication Conditional UI request is received. This
+  // provides the callback that will complete the request if and when a user
+  // selects a credential from a form autofill dialog.
+  virtual void OnWebAuthnRequestPending(
+      content::RenderFrameHost* frame_host,
+      const std::vector<device::DiscoverableCredentialMetadata>& credentials,
+      base::OnceCallback<void(const std::vector<uint8_t>& id)> callback) = 0;
+};
+
+}  // namespace components
+
+#endif  // COMPONENTS_WEBAUTHN_ANDROID_WEBAUTHN_CLIENT_ANDROID_H_
diff --git a/content/app_shim_remote_cocoa/render_widget_host_view_cocoa.mm b/content/app_shim_remote_cocoa/render_widget_host_view_cocoa.mm
index e9a7ffa..f0f1e15 100644
--- a/content/app_shim_remote_cocoa/render_widget_host_view_cocoa.mm
+++ b/content/app_shim_remote_cocoa/render_widget_host_view_cocoa.mm
@@ -220,7 +220,7 @@
               withHostHelper:(RenderWidgetHostNSViewHostHelper*)hostHelper {
   self = [super initWithFrame:NSZeroRect];
   if (self) {
-    self.acceptsTouchEvents = YES;
+    self.allowedTouchTypes |= NSTouchTypeMaskDirect;
     _editCommandHelper =
         std::make_unique<RenderWidgetHostViewMacEditCommandHelper>();
 
@@ -558,10 +558,8 @@
 }
 
 - (void)resetCursorRects {
-  if (_currentCursor) {
+  if (_currentCursor)
     [self addCursorRect:[self visibleRect] cursor:_currentCursor];
-    [_currentCursor setOnMouseEntered:YES];
-  }
 }
 
 - (void)processedWheelEvent:(const blink::WebMouseWheelEvent&)event
diff --git a/content/app_shim_remote_cocoa/web_contents_view_cocoa.mm b/content/app_shim_remote_cocoa/web_contents_view_cocoa.mm
index 96f1b07..dc2ef3d 100644
--- a/content/app_shim_remote_cocoa/web_contents_view_cocoa.mm
+++ b/content/app_shim_remote_cocoa/web_contents_view_cocoa.mm
@@ -220,7 +220,8 @@
   if (!_host)
     return;
 
-  NSPasteboard* pasteboard = [NSPasteboard pasteboardWithName:NSDragPboard];
+  NSPasteboard* pasteboard =
+      [NSPasteboard pasteboardWithName:NSPasteboardNameDrag];
   [pasteboard clearContents];
 
   _dragSource.reset([[WebDragSource alloc] initWithHost:_host
diff --git a/content/browser/about_url_loader_factory.cc b/content/browser/about_url_loader_factory.cc
index 89bc04b..27dd584 100644
--- a/content/browser/about_url_loader_factory.cc
+++ b/content/browser/about_url_loader_factory.cc
@@ -27,8 +27,6 @@
   response_head->mime_type = "text/html";
   mojo::Remote<network::mojom::URLLoaderClient> client_remote(
       std::move(client));
-  client_remote->OnReceiveResponse(std::move(response_head),
-                                   mojo::ScopedDataPipeConsumerHandle());
 
   // Create a data pipe for transmitting the empty response. The |producer|
   // doesn't add any data.
@@ -40,7 +38,8 @@
     return;
   }
 
-  client_remote->OnStartLoadingResponseBody(std::move(consumer));
+  client_remote->OnReceiveResponse(std::move(response_head),
+                                   std::move(consumer));
   client_remote->OnComplete(network::URLLoaderCompletionStatus(net::OK));
 }
 
diff --git a/content/browser/android/content_url_loader_factory.cc b/content/browser/android/content_url_loader_factory.cc
index 6cf7913..140cc18 100644
--- a/content/browser/android/content_url_loader_factory.cc
+++ b/content/browser/android/content_url_loader_factory.cc
@@ -229,9 +229,7 @@
                                head->mime_type);
     }
 
-    client->OnReceiveResponse(std::move(head),
-                              mojo::ScopedDataPipeConsumerHandle());
-    client->OnStartLoadingResponseBody(std::move(consumer_handle));
+    client->OnReceiveResponse(std::move(head), std::move(consumer_handle));
     client_ = std::move(client);
 
     if (total_bytes_to_send == 0) {
diff --git a/content/browser/blob_storage/blob_internals_url_loader.cc b/content/browser/blob_storage/blob_internals_url_loader.cc
index 206d4ee..16ece0c 100644
--- a/content/browser/blob_storage/blob_internals_url_loader.cc
+++ b/content/browser/blob_storage/blob_internals_url_loader.cc
@@ -24,8 +24,6 @@
 
   mojo::Remote<network::mojom::URLLoaderClient> client(
       std::move(client_remote));
-  client->OnReceiveResponse(std::move(resource_response),
-                            mojo::ScopedDataPipeConsumerHandle());
 
   std::string output = storage::ViewBlobInternalsJob::GenerateHTML(
       blob_storage_context->context());
@@ -46,7 +44,8 @@
   result = producer_handle->EndWriteData(num_bytes);
   CHECK_EQ(result, MOJO_RESULT_OK);
 
-  client->OnStartLoadingResponseBody(std::move(consumer_handle));
+  client->OnReceiveResponse(std::move(resource_response),
+                            std::move(consumer_handle));
   network::URLLoaderCompletionStatus status(net::OK);
   status.encoded_data_length = output.size();
   status.encoded_body_length = output.size();
diff --git a/content/browser/data_url_loader_factory.cc b/content/browser/data_url_loader_factory.cc
index 48759db..708f4e3 100644
--- a/content/browser/data_url_loader_factory.cc
+++ b/content/browser/data_url_loader_factory.cc
@@ -80,9 +80,6 @@
     return;
   }
 
-  client_remote->OnReceiveResponse(std::move(response),
-                                   mojo::ScopedDataPipeConsumerHandle());
-
   mojo::ScopedDataPipeProducerHandle producer;
   mojo::ScopedDataPipeConsumerHandle consumer;
   if (CreateDataPipe(nullptr, producer, consumer) != MOJO_RESULT_OK) {
@@ -91,7 +88,7 @@
     return;
   }
 
-  client_remote->OnStartLoadingResponseBody(std::move(consumer));
+  client_remote->OnReceiveResponse(std::move(response), std::move(consumer));
 
   auto write_data = std::make_unique<WriteData>();
   write_data->client = std::move(client_remote);
diff --git a/content/browser/devtools/devtools_url_loader_interceptor.cc b/content/browser/devtools/devtools_url_loader_interceptor.cc
index bde6652..cd09ef2 100644
--- a/content/browser/devtools/devtools_url_loader_interceptor.cc
+++ b/content/browser/devtools/devtools_url_loader_interceptor.cc
@@ -372,8 +372,6 @@
                         OnUploadProgressCallback callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   void StartLoadingResponseBody(mojo::ScopedDataPipeConsumerHandle body);
@@ -1548,11 +1546,6 @@
     response_metadata_->transfer_size += transfer_size_diff;
 }
 
-void InterceptionJob::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle body) {
-  NOTREACHED();
-}
-
 void InterceptionJob::StartLoadingResponseBody(
     mojo::ScopedDataPipeConsumerHandle body) {
   if (pending_response_body_pipe_callback_) {
diff --git a/content/browser/download/mhtml_generation_manager.cc b/content/browser/download/mhtml_generation_manager.cc
index 608c936..32167b7 100644
--- a/content/browser/download/mhtml_generation_manager.cc
+++ b/content/browser/download/mhtml_generation_manager.cc
@@ -23,6 +23,7 @@
 #include "content/browser/download/mhtml_extra_parts_impl.h"
 #include "content/browser/renderer_host/frame_tree_node.h"
 #include "content/browser/renderer_host/render_frame_host_impl.h"
+#include "content/browser/web_contents/web_contents_impl.h"
 #include "content/common/download/mhtml_file_writer.mojom.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/mhtml_extra_parts.h"
@@ -148,8 +149,6 @@
       std::unique_ptr<mojo::SimpleWatcher> watcher,
       std::unique_ptr<crypto::SecureHash> secure_hash);
 
-  void AddFrame(RenderFrameHost* render_frame_host);
-
   // Creates a string that encompasses any remaining extra data parts to write
   // to the file.
   static std::string CreateExtraDataParts(
@@ -331,9 +330,18 @@
       web_contents->GetLastCommittedURL().possibly_invalid_spec(), "file",
       params_.file_path.AsUTF8Unsafe());
 
-  web_contents->ForEachFrame(base::BindRepeating(
-      &MHTMLGenerationManager::Job::AddFrame,
-      base::Unretained(this)));  // Safe because ForEachFrame() is synchronous.
+  // Only include nodes from the primary frame tree, since an MHTML document
+  // would not be able to load inner frame trees (e.g. fenced frames).
+  for (FrameTreeNode* node : static_cast<WebContentsImpl*>(web_contents)
+                                 ->GetPrimaryFrameTree()
+                                 .Nodes()) {
+    if (node->current_frame_host()->inner_tree_main_frame_tree_node_id() !=
+        FrameTreeNode::kFrameTreeNodeInvalidId) {
+      // Skip inner tree placeholder nodes.
+      continue;
+    }
+    pending_frame_tree_node_ids_.push(node->frame_tree_node_id());
+  }
 
   // Main frame needs to be processed first.
   DCHECK(!pending_frame_tree_node_ids_.empty());
@@ -601,12 +609,6 @@
     longest_renderer_main_thread_time_ = renderer_main_thread_time;
 }
 
-void MHTMLGenerationManager::Job::AddFrame(RenderFrameHost* render_frame_host) {
-  auto* rfhi = static_cast<RenderFrameHostImpl*>(render_frame_host);
-  int frame_tree_node_id = rfhi->frame_tree_node()->frame_tree_node_id();
-  pending_frame_tree_node_ids_.push(frame_tree_node_id);
-}
-
 void MHTMLGenerationManager::Job::CloseFile(
     mojom::MhtmlSaveStatus save_status) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
diff --git a/content/browser/download/save_package_browsertest.cc b/content/browser/download/save_package_browsertest.cc
index c2ca2a2..9682366 100644
--- a/content/browser/download/save_package_browsertest.cc
+++ b/content/browser/download/save_package_browsertest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/bind.h"
+#include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/memory/raw_ptr.h"
 #include "base/run_loop.h"
@@ -20,10 +21,12 @@
 #include "content/public/test/content_browser_test.h"
 #include "content/public/test/content_browser_test_utils.h"
 #include "content/public/test/download_test_observer.h"
+#include "content/public/test/fenced_frame_test_util.h"
 #include "content/shell/browser/shell.h"
 #include "content/shell/browser/shell_download_manager_delegate.h"
 #include "net/base/filename_util.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
+#include "testing/gmock/include/gmock/gmock.h"
 
 namespace content {
 
@@ -329,4 +332,84 @@
   EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
 }
 
+class SavePackageFencedFrameBrowserTest : public SavePackageBrowserTest {
+ public:
+  test::FencedFrameTestHelper& fenced_frame_test_helper() {
+    return fenced_frame_helper_;
+  }
+
+ protected:
+  test::FencedFrameTestHelper fenced_frame_helper_;
+};
+
+// If fenced frames become savable, this test will need to be updated.
+// See https://crbug.com/1321102
+IN_PROC_BROWSER_TEST_F(SavePackageFencedFrameBrowserTest,
+                       IgnoreFencedFrameInMHTML) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  GURL main_url = embedded_test_server()->GetURL(kTestFile);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  RenderFrameHost* main_frame = shell()->web_contents()->GetMainFrame();
+
+  // Create an iframe.
+  GURL iframe_url = embedded_test_server()->GetURL("/title2.html");
+  constexpr char kAddIframeScript[] = R"({
+      (()=>{
+          return new Promise((resolve) => {
+            const frame = document.createElement('iframe');
+            frame.addEventListener('load', () => {resolve();});
+            frame.src = $1;
+            document.body.appendChild(frame);
+          });
+      })();
+    })";
+  EXPECT_TRUE(ExecJs(main_frame, JsReplace(kAddIframeScript, iframe_url)));
+
+  // Create a fenced frame.
+  GURL fenced_frame_url =
+      embedded_test_server()->GetURL("/fenced_frames/title1.html");
+  fenced_frame_test_helper().CreateFencedFrame(
+      shell()->web_contents()->GetMainFrame(), fenced_frame_url);
+
+  auto* download_manager = static_cast<DownloadManagerImpl*>(
+      shell()->web_contents()->GetBrowserContext()->GetDownloadManager());
+  auto delegate = std::make_unique<TestShellDownloadManagerDelegate>(
+      SAVE_PAGE_TYPE_AS_MHTML);
+  delegate->download_dir_ = save_dir_.GetPath();
+  auto* old_delegate = download_manager->GetDelegate();
+  download_manager->SetDelegate(delegate.get());
+
+  // Save a page as the MHTML.
+  base::FilePath file_path;
+  {
+    base::RunLoop run_loop;
+    DownloadCompleteObserver observer(run_loop.QuitClosure());
+    download_manager->AddObserver(&observer);
+    scoped_refptr<SavePackage> save_package(
+        new SavePackage(shell()->web_contents()->GetPrimaryPage()));
+    save_package->GetSaveInfo();
+    run_loop.Run();
+    download_manager->RemoveObserver(&observer);
+    EXPECT_TRUE(save_package->finished());
+    file_path = observer.target_file_path();
+  }
+
+  download_manager->SetDelegate(old_delegate);
+
+  // Read the saved MHTML.
+  std::string mhtml;
+  {
+    base::ScopedAllowBlockingForTesting allow_blocking;
+    ASSERT_TRUE(base::ReadFileToString(file_path, &mhtml));
+  }
+
+  // Verify a title in the iframe's document.
+  EXPECT_THAT(mhtml, testing::HasSubstr("Title Of Awesomeness"));
+
+  // Verify the absence of the fenced frame's document.
+  EXPECT_THAT(mhtml,
+              ::testing::Not(testing::HasSubstr("This page has no title")));
+}
+
 }  // namespace content
diff --git a/content/browser/file_system/file_system_url_loader_factory.cc b/content/browser/file_system/file_system_url_loader_factory.cc
index 9c00edb..d48bd6a 100644
--- a/content/browser/file_system/file_system_url_loader_factory.cc
+++ b/content/browser/file_system/file_system_url_loader_factory.cc
@@ -376,9 +376,7 @@
     head->content_length = data_.size();
     head->headers = CreateHttpResponseHeaders(200);
 
-    client_->OnReceiveResponse(std::move(head),
-                               mojo::ScopedDataPipeConsumerHandle());
-    client_->OnStartLoadingResponseBody(std::move(consumer_handle));
+    client_->OnReceiveResponse(std::move(head), std::move(consumer_handle));
 
     data_producer_ =
         std::make_unique<mojo::DataPipeProducer>(std::move(producer_handle));
@@ -526,11 +524,10 @@
   void ReadMoreFileData() {
     if (remaining_bytes_ == 0) {
       if (consumer_handle_.is_valid()) {
-        // This was an empty file; make sure to call OnReceiveResponse and
-        // OnStartLoadingResponseBody regardless.
+        // This was an empty file; make sure to call OnReceiveResponse
+        // regardless.
         client_->OnReceiveResponse(std::move(head_),
-                                   mojo::ScopedDataPipeConsumerHandle());
-        client_->OnStartLoadingResponseBody(std::move(consumer_handle_));
+                                   std::move(consumer_handle_));
       }
       OnFileWritten(net::OK);
       return;
@@ -573,9 +570,7 @@
         head_->did_mime_sniff = true;
       }
 
-      client_->OnReceiveResponse(std::move(head_),
-                                 mojo::ScopedDataPipeConsumerHandle());
-      client_->OnStartLoadingResponseBody(std::move(consumer_handle_));
+      client_->OnReceiveResponse(std::move(head_), std::move(consumer_handle_));
     }
     remaining_bytes_ -= result;
     DCHECK_GE(remaining_bytes_, 0);
diff --git a/content/browser/loader/cross_site_document_blocking_browsertest.cc b/content/browser/loader/cross_site_document_blocking_browsertest.cc
index 61a79a9..0318ffe 100644
--- a/content/browser/loader/cross_site_document_blocking_browsertest.cc
+++ b/content/browser/loader/cross_site_document_blocking_browsertest.cc
@@ -385,15 +385,13 @@
     // Tell the |original_client_| that the request has completed (and that it
     // can release its URLLoaderClient.
     if (status.error_code == net::OK) {
-      original_client_->OnReceiveResponse(std::move(response_head),
-                                          mojo::ScopedDataPipeConsumerHandle());
-
       mojo::ScopedDataPipeProducerHandle producer_handle;
       mojo::ScopedDataPipeConsumerHandle consumer_handle;
       ASSERT_EQ(mojo::CreateDataPipe(response_body.size() + 1, producer_handle,
                                      consumer_handle),
                 MOJO_RESULT_OK);
-      original_client_->OnStartLoadingResponseBody(std::move(consumer_handle));
+      original_client_->OnReceiveResponse(std::move(response_head),
+                                          std::move(consumer_handle));
 
       uint32_t num_bytes = response_body.size();
       EXPECT_EQ(MOJO_RESULT_OK,
diff --git a/content/browser/loader/navigation_early_hints_manager.cc b/content/browser/loader/navigation_early_hints_manager.cc
index 598798b..a0a8d41 100644
--- a/content/browser/loader/navigation_early_hints_manager.cc
+++ b/content/browser/loader/navigation_early_hints_manager.cc
@@ -341,8 +341,15 @@
       return;
     }
 
-    if (body)
-      OnStartLoadingResponseBody(std::move(body));
+    if (!body)
+      return;
+
+    if (response_body_drainer_) {
+      mojo::ReportBadMessage("NEHM_BAD_RESPONSE_BODY");
+      return;
+    }
+    response_body_drainer_ =
+        std::make_unique<mojo::DataPipeDrainer>(this, std::move(body));
   }
   void OnReceiveRedirect(const net::RedirectInfo& redirect_info,
                          network::mojom::URLResponseHeadPtr head) override {}
@@ -353,15 +360,6 @@
   }
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override {}
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override {}
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override {
-    if (response_body_drainer_) {
-      mojo::ReportBadMessage("NEHM_BAD_RESPONSE_BODY");
-      return;
-    }
-    response_body_drainer_ =
-        std::make_unique<mojo::DataPipeDrainer>(this, std::move(body));
-  }
   void OnComplete(const network::URLLoaderCompletionStatus& status) override {
     if (result_.was_canceled || result_.error_code.has_value()) {
       mojo::ReportBadMessage("NEHM_BAD_COMPLETE");
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc
index a1da50db..65135f0 100644
--- a/content/browser/loader/navigation_url_loader_impl.cc
+++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -790,14 +790,9 @@
   if (head_->mime_type == "application/pdf" || head_->mime_type == "text/pdf")
     early_hints_manager_.reset();
 
-  if (response_body)
-    OnStartLoadingResponseBody(std::move(response_body));
-}
+  if (!response_body)
+    return;
 
-void NavigationURLLoaderImpl::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle response_body) {
-  LogQueueTimeHistogram("Navigation.QueueTime.OnStartLoadingResponseBody",
-                        resource_request_->is_outermost_main_frame);
   response_body_ = std::move(response_body);
   received_response_ = true;
 
diff --git a/content/browser/loader/navigation_url_loader_impl.h b/content/browser/loader/navigation_url_loader_impl.h
index bc1e84e..c98acc8 100644
--- a/content/browser/loader/navigation_url_loader_impl.h
+++ b/content/browser/loader/navigation_url_loader_impl.h
@@ -189,8 +189,6 @@
   void OnReceiveResponse(
       network::mojom::URLResponseHeadPtr head,
       mojo::ScopedDataPipeConsumerHandle response_body) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle response_body) override;
   void OnReceiveRedirect(const net::RedirectInfo& redirect_info,
                          network::mojom::URLResponseHeadPtr head) override;
   void OnUploadProgress(int64_t current_position,
@@ -270,7 +268,7 @@
   mojo::PendingRemote<network::mojom::URLLoader> response_url_loader_;
 
   // Set to true if we receive a valid response from a URLLoader, i.e.
-  // URLLoaderClient::OnStartLoadingResponseBody() is called.
+  // URLLoaderClient::OnReceiveResponse() is called.
   bool received_response_ = false;
 
   bool started_ = false;
diff --git a/content/browser/loader/object_navigation_fallback_body_loader.cc b/content/browser/loader/object_navigation_fallback_body_loader.cc
index 84bcfc60..7b3d535 100644
--- a/content/browser/loader/object_navigation_fallback_body_loader.cc
+++ b/content/browser/loader/object_navigation_fallback_body_loader.cc
@@ -324,12 +324,6 @@
   // Not needed so implementation omitted.
 }
 
-void ObjectNavigationFallbackBodyLoader::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle body) {
-  // Should have already happened.
-  NOTREACHED();
-}
-
 void ObjectNavigationFallbackBodyLoader::OnComplete(
     const network::URLLoaderCompletionStatus& status) {
   status_ = status;
diff --git a/content/browser/loader/object_navigation_fallback_body_loader.h b/content/browser/loader/object_navigation_fallback_body_loader.h
index 93e8350..14f6680 100644
--- a/content/browser/loader/object_navigation_fallback_body_loader.h
+++ b/content/browser/loader/object_navigation_fallback_body_loader.h
@@ -109,8 +109,6 @@
                         OnUploadProgressCallback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   // DataPipeDrainer::Client overrides:
diff --git a/content/browser/loader/prefetch_url_loader.cc b/content/browser/loader/prefetch_url_loader.cc
index 5ca680b..74b1931 100644
--- a/content/browser/loader/prefetch_url_loader.cc
+++ b/content/browser/loader/prefetch_url_loader.cc
@@ -218,11 +218,6 @@
   forwarding_client_->OnReceiveRedirect(redirect_info, std::move(head));
 }
 
-void PrefetchURLLoader::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle body) {
-  NOTREACHED();
-}
-
 void PrefetchURLLoader::OnUploadProgress(int64_t current_position,
                                          int64_t total_size,
                                          base::OnceCallback<void()> callback) {
diff --git a/content/browser/loader/prefetch_url_loader.h b/content/browser/loader/prefetch_url_loader.h
index f9b1b2b..8e0fe1de 100644
--- a/content/browser/loader/prefetch_url_loader.h
+++ b/content/browser/loader/prefetch_url_loader.h
@@ -112,8 +112,6 @@
                         base::OnceCallback<void()> callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   // mojo::DataPipeDrainer::Client overrides:
diff --git a/content/browser/renderer_host/DEPS b/content/browser/renderer_host/DEPS
index 34644bc3f..3219bc4 100644
--- a/content/browser/renderer_host/DEPS
+++ b/content/browser/renderer_host/DEPS
@@ -2,7 +2,6 @@
   "+cc/switches.h", # For cc command line switches.
   "+components/viz/common",
   "+components/viz/host",
-  "+device/fido",
   "+jni",
   "+net/dns/public",
   "+third_party/blink/public/platform/web_gesture_curve.h",
diff --git a/content/browser/renderer_host/render_frame_host_android.cc b/content/browser/renderer_host/render_frame_host_android.cc
index f0edf0b..10869f2 100644
--- a/content/browser/renderer_host/render_frame_host_android.cc
+++ b/content/browser/renderer_host/render_frame_host_android.cc
@@ -21,8 +21,6 @@
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/site_instance.h"
-#include "device/fido/discoverable_credential_metadata.h"
-#include "device/fido/public_key_credential_user_entity.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/blink/public/mojom/frame/user_activation_notification_type.mojom.h"
 #include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-shared.h"
@@ -53,54 +51,6 @@
       jcallback, url::GURLAndroid::FromNativeGURL(env, url.value()));
 }
 
-device::DiscoverableCredentialMetadata ConvertJavaCredentialDetailsToMetadata(
-    JNIEnv* env,
-    ScopedJavaLocalRef<jobject> j_credential) {
-  device::DiscoverableCredentialMetadata credential;
-  base::android::JavaByteArrayToByteVector(
-      env,
-      Java_RenderFrameHostImpl_getWebAuthnCredentialDetailsCredentialId(
-          env, j_credential),
-      &credential.cred_id);
-  base::android::JavaByteArrayToByteVector(
-      env,
-      Java_RenderFrameHostImpl_getWebAuthnCredentialDetailsUserId(env,
-                                                                  j_credential),
-      &credential.user.id);
-  credential.user.name = ConvertJavaStringToUTF8(
-      env, Java_RenderFrameHostImpl_getWebAuthnCredentialDetailsUserName(
-               env, j_credential));
-  credential.user.display_name = ConvertJavaStringToUTF8(
-      env, Java_RenderFrameHostImpl_getWebAuthnCredentialDetailsUserDisplayName(
-               env, j_credential));
-  return credential;
-}
-
-void ConvertJavaCredentialArrayToMetadataVector(
-    JNIEnv* env,
-    const base::android::JavaRef<jobjectArray>& array,
-    std::vector<device::DiscoverableCredentialMetadata>* out) {
-  jsize jlength = env->GetArrayLength(array.obj());
-  // GetArrayLength() returns -1 if |array| is not a valid Java array.
-  DCHECK_GE(jlength, 0) << "Invalid array length: " << jlength;
-  size_t length = static_cast<size_t>(std::max(0, jlength));
-  for (size_t i = 0; i < length; ++i) {
-    ScopedJavaLocalRef<jobject> j_credential(
-        env, static_cast<jobject>(env->GetObjectArrayElement(array.obj(), i)));
-    out->emplace_back(
-        ConvertJavaCredentialDetailsToMetadata(env, j_credential));
-  }
-}
-
-void OnWebAuthnCredentialSelected(
-    const base::android::JavaRef<jobject>& jcallback,
-    const std::vector<uint8_t>& credential_id) {
-  base::android::RunObjectCallbackAndroid(
-      jcallback, base::android::ToJavaByteArray(
-                     base::android::AttachCurrentThread(), credential_id.data(),
-                     credential_id.size()));
-}
-
 }  // namespace
 
 // static
@@ -287,21 +237,6 @@
           is_payment_credential_creation, nullptr));
 }
 
-void RenderFrameHostAndroid::OnCredentialsDetailsListReceived(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>&,
-    const base::android::JavaParamRef<jobjectArray>& credentials,
-    const base::android::JavaParamRef<jobject>& jcallback) const {
-  std::vector<device::DiscoverableCredentialMetadata> credentials_metadata;
-  ConvertJavaCredentialArrayToMetadataVector(env, credentials,
-                                             &credentials_metadata);
-  render_frame_host_->WebAuthnConditionalUiRequestPending(
-      credentials_metadata,
-      base::BindOnce(
-          &OnWebAuthnCredentialSelected,
-          base::android::ScopedJavaGlobalRef<jobject>(env, jcallback)));
-}
-
 jint RenderFrameHostAndroid::GetLifecycleState(
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>&) const {
diff --git a/content/browser/renderer_host/render_frame_host_android.h b/content/browser/renderer_host/render_frame_host_android.h
index 809f00c..55412020 100644
--- a/content/browser/renderer_host/render_frame_host_android.h
+++ b/content/browser/renderer_host/render_frame_host_android.h
@@ -98,12 +98,6 @@
       const base::android::JavaParamRef<jobject>&,
       jboolean is_payment_credential_creation) const;
 
-  void OnCredentialsDetailsListReceived(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>&,
-      const base::android::JavaParamRef<jobjectArray>& credentials,
-      const base::android::JavaParamRef<jobject>& jcallback) const;
-
   jint GetLifecycleState(JNIEnv* env,
                          const base::android::JavaParamRef<jobject>&) const;
 
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index fea70d1a..de20b280 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -261,7 +261,6 @@
 #include "content/browser/android/java_interfaces_impl.h"
 #include "content/browser/renderer_host/render_frame_host_android.h"
 #include "content/public/browser/android/java_interfaces.h"
-#include "device/fido/discoverable_credential_metadata.h"
 #else
 #include "content/browser/hid/hid_service.h"
 #include "content/browser/host_zoom_map_impl.h"
@@ -13031,18 +13030,6 @@
 
   return blink::mojom::AuthenticatorStatus::SUCCESS;
 }
-
-void RenderFrameHostImpl::WebAuthnConditionalUiRequestPending(
-    const std::vector<device::DiscoverableCredentialMetadata>& credentials,
-    base::OnceCallback<void(const std::vector<uint8_t>& id)> callback) {
-  auto* delegate =
-      GetContentClient()->browser()->GetConditionalUiDelegate(this);
-  if (!delegate) {
-    std::move(callback).Run(std::vector<uint8_t>());
-    return;
-  }
-  delegate->OnWebAuthnRequestPending(credentials, std::move(callback));
-}
 #endif
 
 void RenderFrameHostImpl::IsClipboardPasteContentAllowed(
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h
index 94f9913..f72450e 100644
--- a/content/browser/renderer_host/render_frame_host_impl.h
+++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -172,10 +172,6 @@
 }  // namespace mojom
 }  // namespace blink
 
-namespace device {
-class DiscoverableCredentialMetadata;
-}
-
 namespace gfx {
 class Range;
 }
@@ -2469,15 +2465,6 @@
       bool is_payment_credential_creation,
       const blink::mojom::RemoteDesktopClientOverridePtr&
           remote_desktop_client_override);
-
-  // Provide a list of Web Authentication credentials that can be used to
-  // fulfill a WebAuthn sign-in request. These can be passed to the embedder to
-  // be displayed to the user, and the user's selection is returned through the
-  // callback. This is Android only because on desktop platforms the embedder
-  // interacts directly with the device layer.
-  void WebAuthnConditionalUiRequestPending(
-      const std::vector<device::DiscoverableCredentialMetadata>& credentials,
-      base::OnceCallback<void(const std::vector<uint8_t>& id)> callback);
 #endif
 
   enum class FencedFrameStatus {
diff --git a/content/browser/renderer_host/scroll_into_view_browsertest.cc b/content/browser/renderer_host/scroll_into_view_browsertest.cc
index 910486f..7fc8504c 100644
--- a/content/browser/renderer_host/scroll_into_view_browsertest.cc
+++ b/content/browser/renderer_host/scroll_into_view_browsertest.cc
@@ -840,8 +840,9 @@
   RunTest();
 }
 
+// TODO(https://crbug.com/1325556): Re-enable when flakiness is fixed.
 IN_PROC_BROWSER_TEST_P(ScrollIntoViewFencedFrameBrowserTest,
-                       RemoteFrameInFencedFrame) {
+                       DISABLED_RemoteFrameInFencedFrame) {
   ASSERT_TRUE(SetupTest("siteA{FencedFrame}(siteB(siteC))"));
   RunTest();
 }
diff --git a/content/browser/service_worker/embedded_worker_instance.cc b/content/browser/service_worker/embedded_worker_instance.cc
index c831e3ce..025bef9 100644
--- a/content/browser/service_worker/embedded_worker_instance.cc
+++ b/content/browser/service_worker/embedded_worker_instance.cc
@@ -704,6 +704,10 @@
 
 void EmbeddedWorkerInstance::UpdateForegroundPriority() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  if (status() == EmbeddedWorkerStatus::STOPPING) {
+    return;
+  }
+
   if (process_handle_ &&
       owner_version_->ShouldRequireForegroundPriority(process_id())) {
     NotifyForegroundServiceWorkerAdded();
@@ -918,6 +922,8 @@
   starting_phase_ = NOT_STARTING;
   thread_id_ = ServiceWorkerConsts::kInvalidEmbeddedWorkerThreadId;
   token_ = absl::nullopt;
+
+  DCHECK(!foreground_notified_);
 }
 
 void EmbeddedWorkerInstance::OnSetupFailed(
diff --git a/content/browser/service_worker/fake_embedded_worker_instance_client.cc b/content/browser/service_worker/fake_embedded_worker_instance_client.cc
index 4c976a0..1b71131 100644
--- a/content/browser/service_worker/fake_embedded_worker_instance_client.cc
+++ b/content/browser/service_worker/fake_embedded_worker_instance_client.cc
@@ -72,8 +72,6 @@
   void OnUploadProgress(int64_t current_position,
                         int64_t total_size,
                         OnUploadProgressCallback ack_callback) override {}
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override {}
   void OnComplete(const network::URLLoaderCompletionStatus& status) override {
     auto callback = std::move(callback_);
     std::move(callback).Run();
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
index d1c89b5..01d41cc0 100644
--- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc
+++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
@@ -178,10 +178,6 @@
     // will clean up the preload request when OnReceiveRedirect() is called.
     client_->OnReceiveRedirect(redirect_info, std::move(head));
   }
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override {
-    client_->OnStartLoadingResponseBody(std::move(body));
-  }
   void OnComplete(const network::URLLoaderCompletionStatus& status) override {
     if (completed_)
       return;
diff --git a/content/browser/service_worker/service_worker_installed_script_loader.cc b/content/browser/service_worker/service_worker_installed_script_loader.cc
index bdee751a..3f8d6443 100644
--- a/content/browser/service_worker/service_worker_installed_script_loader.cc
+++ b/content/browser/service_worker/service_worker_installed_script_loader.cc
@@ -12,7 +12,6 @@
 #include "content/browser/service_worker/service_worker_version.h"
 #include "net/base/ip_endpoint.h"
 #include "net/cert/cert_status_flags.h"
-#include "services/network/public/cpp/features.h"
 #include "services/network/public/mojom/url_response_head.mojom.h"
 #include "third_party/blink/public/common/mime_util/mime_util.h"
 
@@ -59,7 +58,6 @@
   DCHECK(response_head->headers);
   DCHECK(encoding_.empty());
   response_head->headers->GetCharset(&encoding_);
-  body_handle_ = std::move(body_handle);
   body_size_ = response_head->content_length;
 
   // Just drain the metadata (V8 code cache): this entire class is just to
@@ -74,17 +72,10 @@
             *response_head));
   }
 
-  client_->OnReceiveResponse(
-      std::move(response_head),
-      base::FeatureList::IsEnabled(network::features::kCombineResponseBody)
-          ? std::move(body_handle_)
-          : mojo::ScopedDataPipeConsumerHandle());
+  client_->OnReceiveResponse(std::move(response_head), std::move(body_handle));
   if (metadata) {
     client_->OnReceiveCachedMetadata(std::move(*metadata));
   }
-
-  if (!base::FeatureList::IsEnabled(network::features::kCombineResponseBody))
-    client_->OnStartLoadingResponseBody(std::move(body_handle_));
   // We continue in OnFinished().
 }
 
diff --git a/content/browser/service_worker/service_worker_installed_script_loader.h b/content/browser/service_worker/service_worker_installed_script_loader.h
index 4093329..cd919b2 100644
--- a/content/browser/service_worker/service_worker_installed_script_loader.h
+++ b/content/browser/service_worker/service_worker_installed_script_loader.h
@@ -78,7 +78,6 @@
   std::unique_ptr<ServiceWorkerInstalledScriptReader> reader_;
 
   std::string encoding_;
-  mojo::ScopedDataPipeConsumerHandle body_handle_;
   uint64_t body_size_ = 0;
   std::unique_ptr<mojo::DataPipeDrainer> metadata_drainer_;
 };
diff --git a/content/browser/service_worker/service_worker_job_unittest.cc b/content/browser/service_worker/service_worker_job_unittest.cc
index f5ecf2a3..0f58562 100644
--- a/content/browser/service_worker/service_worker_job_unittest.cc
+++ b/content/browser/service_worker/service_worker_job_unittest.cc
@@ -637,10 +637,10 @@
 
   blink::mojom::ServiceWorkerRegistrationOptions options;
   options.scope = GURL("https://www.example.com/");
-  scoped_refptr<ServiceWorkerRegistration> registration = RunRegisterJob(
-      GURL("https://www.example.com/service_worker.js"),
-      blink::StorageKey(url::Origin::Create(options.scope)), options,
-      blink::ServiceWorkerStatusCode::kErrorStartWorkerFailed);
+  scoped_refptr<ServiceWorkerRegistration> registration =
+      RunRegisterJob(GURL("https://www.example.com/service_worker.js"),
+                     blink::StorageKey(url::Origin::Create(options.scope)),
+                     options, blink::ServiceWorkerStatusCode::kErrorNetwork);
 
   ASSERT_EQ(scoped_refptr<ServiceWorkerRegistration>(nullptr), registration);
 }
diff --git a/content/browser/service_worker/service_worker_main_resource_loader.cc b/content/browser/service_worker/service_worker_main_resource_loader.cc
index a37e18c..6d3d96c 100644
--- a/content/browser/service_worker/service_worker_main_resource_loader.cc
+++ b/content/browser/service_worker/service_worker_main_resource_loader.cc
@@ -194,22 +194,13 @@
       "response_code", response_head_->headers->response_code(), "status_text",
       response_head_->headers->GetStatusText());
   TransitionToStatus(Status::kSentHeader);
-  if (base::FeatureList::IsEnabled(network::features::kCombineResponseBody))
-    return;  // Will be sent in CommitResponseBody.
-
-  url_loader_client_->OnReceiveResponse(response_head_.Clone(),
-                                        mojo::ScopedDataPipeConsumerHandle());
 }
 
 void ServiceWorkerMainResourceLoader::CommitResponseBody(
     mojo::ScopedDataPipeConsumerHandle response_body) {
   TransitionToStatus(Status::kSentBody);
-  if (base::FeatureList::IsEnabled(network::features::kCombineResponseBody)) {
-    url_loader_client_->OnReceiveResponse(response_head_.Clone(),
-                                          std::move(response_body));
-  } else {
-    url_loader_client_->OnStartLoadingResponseBody(std::move(response_body));
-  }
+  url_loader_client_->OnReceiveResponse(response_head_.Clone(),
+                                        std::move(response_body));
 }
 
 void ServiceWorkerMainResourceLoader::CommitEmptyResponseAndComplete() {
diff --git a/content/browser/service_worker/service_worker_main_resource_loader.h b/content/browser/service_worker/service_worker_main_resource_loader.h
index 8d63fbca..2232cde 100644
--- a/content/browser/service_worker/service_worker_main_resource_loader.h
+++ b/content/browser/service_worker/service_worker_main_resource_loader.h
@@ -127,7 +127,7 @@
   // Calls url_loader_client_->OnReceiveResponse() with |response_head_|.
   void CommitResponseHeaders();
 
-  // Calls url_loader_client_->OnStartLoadingResponseBody() with
+  // Calls url_loader_client_->OnReceiveResponse() with
   // |response_body|.
   void CommitResponseBody(mojo::ScopedDataPipeConsumerHandle response_body);
 
diff --git a/content/browser/service_worker/service_worker_new_script_fetcher.cc b/content/browser/service_worker/service_worker_new_script_fetcher.cc
index 15a3d07..6a7ab4b 100644
--- a/content/browser/service_worker/service_worker_new_script_fetcher.cc
+++ b/content/browser/service_worker/service_worker_new_script_fetcher.cc
@@ -127,19 +127,13 @@
 void ServiceWorkerNewScriptFetcher::OnReceiveResponse(
     network::mojom::URLResponseHeadPtr response_head,
     mojo::ScopedDataPipeConsumerHandle response_body) {
-  response_head_ = std::move(response_head);
-  if (response_body)
-    OnStartLoadingResponseBody(std::move(response_body));
-}
-
-void ServiceWorkerNewScriptFetcher::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle response_body) {
-  DCHECK(response_head_);
+  if (!response_body)
+    return;
 
   blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params =
       blink::mojom::WorkerMainScriptLoadParams::New();
   main_script_load_params->request_id = request_id_;
-  main_script_load_params->response_head = std::move(response_head_);
+  main_script_load_params->response_head = std::move(response_head);
   main_script_load_params->response_body = std::move(response_body);
   main_script_load_params->url_loader_client_endpoints =
       network::mojom::URLLoaderClientEndpoints::New(
diff --git a/content/browser/service_worker/service_worker_new_script_fetcher.h b/content/browser/service_worker/service_worker_new_script_fetcher.h
index 38af4dd..17265a6 100644
--- a/content/browser/service_worker/service_worker_new_script_fetcher.h
+++ b/content/browser/service_worker/service_worker_new_script_fetcher.h
@@ -69,8 +69,6 @@
                         OnUploadProgressCallback callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle response_body) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   ServiceWorkerContextCore& context_;
@@ -80,9 +78,6 @@
   // Request ID for a browser-initiated request.
   const int request_id_;
 
-  // Stores the response header until the data pipe for the body is received.
-  network::mojom::URLResponseHeadPtr response_head_;
-
   // Called when the header and the data pipe for the body are ready.
   StartCallback callback_;
 
diff --git a/content/browser/service_worker/service_worker_new_script_loader.cc b/content/browser/service_worker/service_worker_new_script_loader.cc
index 4cbaa67..14e318ef 100644
--- a/content/browser/service_worker/service_worker_new_script_loader.cc
+++ b/content/browser/service_worker/service_worker_new_script_loader.cc
@@ -25,7 +25,6 @@
 #include "net/base/net_errors.h"
 #include "net/cert/cert_status_flags.h"
 #include "net/http/http_response_info.h"
-#include "services/network/public/cpp/features.h"
 #include "services/network/public/mojom/early_hints.mojom.h"
 #include "services/network/public/mojom/url_response_head.mojom.h"
 #include "third_party/blink/public/common/loader/throttling_url_loader.h"
@@ -263,8 +262,6 @@
             *response_head));
   }
 
-  network_loader_state_ = LoaderState::kWaitingForBody;
-
   WriteHeaders(response_head.Clone());
 
   // Don't pass SSLInfo to the client when the original request doesn't ask
@@ -275,14 +272,28 @@
     response_head->ssl_info.reset();
   }
 
-  if (base::FeatureList::IsEnabled(network::features::kCombineResponseBody) &&
-      body) {
-    OnStartLoadingResponseBodyInternal(std::move(response_head),
-                                       std::move(body));
-  } else {
+  if (!body) {
     client_->OnReceiveResponse(std::move(response_head),
                                mojo::ScopedDataPipeConsumerHandle());
+    return;
   }
+
+  // Create a pair of the consumer and producer for responding to the client.
+  mojo::ScopedDataPipeConsumerHandle client_consumer;
+  if (mojo::CreateDataPipe(nullptr, client_producer_, client_consumer) !=
+      MOJO_RESULT_OK) {
+    CommitCompleted(network::URLLoaderCompletionStatus(net::ERR_FAILED),
+                    ServiceWorkerConsts::kServiceWorkerFetchScriptError);
+    return;
+  }
+
+  // Pass the consumer handle for responding with the response to the client.
+  client_->OnReceiveResponse(std::move(response_head),
+                             std::move(client_consumer));
+
+  network_consumer_ = std::move(body);
+  network_loader_state_ = LoaderState::kLoadingBody;
+  MaybeStartNetworkConsumerHandleWatcher();
 }
 
 void ServiceWorkerNewScriptLoader::OnReceiveRedirect(
@@ -316,39 +327,6 @@
   client_->OnTransferSizeUpdated(transfer_size_diff);
 }
 
-void ServiceWorkerNewScriptLoader::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle consumer) {
-  OnStartLoadingResponseBodyInternal(network::mojom::URLResponseHeadPtr(),
-                                     std::move(consumer));
-}
-
-void ServiceWorkerNewScriptLoader::OnStartLoadingResponseBodyInternal(
-    network::mojom::URLResponseHeadPtr response_head,
-    mojo::ScopedDataPipeConsumerHandle consumer) {
-  DCHECK_EQ(LoaderState::kWaitingForBody, network_loader_state_);
-  // Create a pair of the consumer and producer for responding to the client.
-  mojo::ScopedDataPipeConsumerHandle client_consumer;
-  if (mojo::CreateDataPipe(nullptr, client_producer_, client_consumer) !=
-      MOJO_RESULT_OK) {
-    CommitCompleted(network::URLLoaderCompletionStatus(net::ERR_FAILED),
-                    ServiceWorkerConsts::kServiceWorkerFetchScriptError);
-    return;
-  }
-
-  // Pass the consumer handle for responding with the response to the client.
-  if (base::FeatureList::IsEnabled(network::features::kCombineResponseBody) &&
-      response_head) {
-    client_->OnReceiveResponse(std::move(response_head),
-                               std::move(client_consumer));
-  } else {
-    client_->OnStartLoadingResponseBody(std::move(client_consumer));
-  }
-
-  network_consumer_ = std::move(consumer);
-  network_loader_state_ = LoaderState::kLoadingBody;
-  MaybeStartNetworkConsumerHandleWatcher();
-}
-
 void ServiceWorkerNewScriptLoader::OnComplete(
     const network::URLLoaderCompletionStatus& status) {
   LoaderState previous_state = network_loader_state_;
@@ -427,10 +405,11 @@
 }
 
 void ServiceWorkerNewScriptLoader::MaybeStartNetworkConsumerHandleWatcher() {
-  if (network_loader_state_ == LoaderState::kWaitingForBody) {
-    // OnStartLoadingResponseBody() or OnComplete() will continue the sequence.
+  if (network_loader_state_ == LoaderState::kLoadingHeader) {
+    // OnReceiveResponse() or OnComplete() will continue the sequence.
     return;
   }
+
   if (header_writer_state_ != WriterState::kCompleted) {
     DCHECK_EQ(WriterState::kWriting, header_writer_state_);
     // OnWriteHeadersComplete() will continue the sequence.
diff --git a/content/browser/service_worker/service_worker_new_script_loader.h b/content/browser/service_worker/service_worker_new_script_loader.h
index 6b1e6d8..f1fa38f 100644
--- a/content/browser/service_worker/service_worker_new_script_loader.h
+++ b/content/browser/service_worker/service_worker_new_script_loader.h
@@ -38,11 +38,10 @@
 //   1. Makes a network request.
 //   2. OnReceiveResponse() is called, writes the response headers to the
 //      service worker script storage and responds with them to the |client|
-//      (which is the service worker in the renderer).
-//   3. OnStartLoadingResponseBody() is called, reads the network response from
-//      the data pipe. While reading the response, writes it to the service
-//      worker script storage and responds with it to the |client|.
-//   4. OnComplete() for the network load and OnWriteDataComplete() are called,
+//      (which is the service worker in the renderer). Reads the network
+//      response from the data pipe. While reading the response, writes it to
+//      the service worker script storage and responds with it to the |client|.
+//   3. OnComplete() for the network load and OnWriteDataComplete() are called,
 //      calls CommitCompleted() and closes the connections with the network
 //      service and the renderer process.
 //
@@ -126,8 +125,6 @@
                         OnUploadProgressCallback ack_callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   // Buffer size for reading script data from network.
@@ -184,11 +181,6 @@
   // If not all data are received, it continues to download from network.
   void OnCacheWriterResumed(net::Error error);
 
-  // 'response_head' is only valid when kCombineResponseBody is enabled.
-  void OnStartLoadingResponseBodyInternal(
-      network::mojom::URLResponseHeadPtr response_head,
-      mojo::ScopedDataPipeConsumerHandle consumer);
-
   const GURL request_url_;
 
   const bool is_main_script_;
@@ -221,8 +213,7 @@
   //
   // When response body exists:
   // CreateLoaderAndStart(): kNotStarted -> kLoadingHeader
-  // OnReceiveResponse(): kLoadingHeader -> kWaitingForBody
-  // OnStartLoadingResponseBody(): kWaitingForBody -> kLoadingBody
+  // OnReceiveResponse(): kLoadingHeader -> kLoadingBody
   // OnComplete(): kLoadingBody -> kCompleted
   //
   // When response body is empty:
@@ -243,7 +234,7 @@
   // Set to kWriting when |this| starts watching |network_consumer_|, and set to
   // kCompleted when all data has been written to |cache_writer_|.
   //
-  // OnStartLoadingResponseBody() && OnWriteHeadersComplete():
+  // OnWriteHeadersComplete():
   //     kNotStarted -> kWriting
   // OnNetworkDataAvailable() && MOJO_RESULT_FAILED_PRECONDITION:
   //     kWriting -> kCompleted
diff --git a/content/browser/service_worker/service_worker_new_script_loader_unittest.cc b/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
index 4558eb5..fbcd62b 100644
--- a/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
+++ b/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
@@ -113,8 +113,6 @@
       client->OnReceiveRedirect(net::RedirectInfo(), std::move(response_head));
       return true;
     }
-    client->OnReceiveResponse(std::move(response_head),
-                              mojo::ScopedDataPipeConsumerHandle());
 
     uint32_t bytes_written = response.body.size();
     mojo::ScopedDataPipeConsumerHandle consumer;
@@ -123,7 +121,7 @@
     MojoResult result = producer->WriteData(
         response.body.data(), &bytes_written, MOJO_WRITE_DATA_FLAG_ALL_OR_NONE);
     CHECK_EQ(MOJO_RESULT_OK, result);
-    client->OnStartLoadingResponseBody(std::move(consumer));
+    client->OnReceiveResponse(std::move(response_head), std::move(consumer));
 
     network::URLLoaderCompletionStatus status;
     status.error_code = net::OK;
diff --git a/content/browser/service_worker/service_worker_single_script_update_checker.cc b/content/browser/service_worker/service_worker_single_script_update_checker.cc
index 94a72a6..bc1c0d5 100644
--- a/content/browser/service_worker/service_worker_single_script_update_checker.cc
+++ b/content/browser/service_worker/service_worker_single_script_update_checker.cc
@@ -241,14 +241,17 @@
             : network::CrossOriginEmbedderPolicy();
   }
 
-  network_loader_state_ =
-      ServiceWorkerUpdatedScriptLoader::LoaderState::kWaitingForBody;
   network_accessed_ = response_head->network_accessed;
 
   WriteHeaders(std::move(response_head));
 
-  if (consumer)
-    OnStartLoadingResponseBody(std::move(consumer));
+  if (!consumer)
+    return;
+
+  network_consumer_ = std::move(consumer);
+  network_loader_state_ =
+      ServiceWorkerUpdatedScriptLoader::LoaderState::kLoadingBody;
+  MaybeStartNetworkConsumerHandleWatcher();
 }
 
 void ServiceWorkerSingleScriptUpdateChecker::OnReceiveRedirect(
@@ -284,22 +287,6 @@
 void ServiceWorkerSingleScriptUpdateChecker::OnTransferSizeUpdated(
     int32_t transfer_size_diff) {}
 
-void ServiceWorkerSingleScriptUpdateChecker::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle consumer) {
-  TRACE_EVENT_WITH_FLOW0(
-      "ServiceWorker",
-      "ServiceWorkerSingleScriptUpdateChecker::OnStartLoadingResponseBody",
-      this, TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
-
-  DCHECK_EQ(network_loader_state_,
-            ServiceWorkerUpdatedScriptLoader::LoaderState::kWaitingForBody);
-
-  network_consumer_ = std::move(consumer);
-  network_loader_state_ =
-      ServiceWorkerUpdatedScriptLoader::LoaderState::kLoadingBody;
-  MaybeStartNetworkConsumerHandleWatcher();
-}
-
 void ServiceWorkerSingleScriptUpdateChecker::OnComplete(
     const network::URLLoaderCompletionStatus& status) {
   TRACE_EVENT_WITH_FLOW1(
@@ -318,13 +305,13 @@
   }
 
   DCHECK(previous_loader_state ==
-             ServiceWorkerUpdatedScriptLoader::LoaderState::kWaitingForBody ||
+             ServiceWorkerUpdatedScriptLoader::LoaderState::kLoadingHeader ||
          previous_loader_state ==
              ServiceWorkerUpdatedScriptLoader::LoaderState::kLoadingBody);
 
   // Response body is empty.
   if (previous_loader_state ==
-      ServiceWorkerUpdatedScriptLoader::LoaderState::kWaitingForBody) {
+      ServiceWorkerUpdatedScriptLoader::LoaderState::kLoadingHeader) {
     DCHECK_EQ(body_writer_state_,
               ServiceWorkerUpdatedScriptLoader::WriterState::kNotStarted);
     body_writer_state_ =
@@ -443,7 +430,7 @@
 void ServiceWorkerSingleScriptUpdateChecker::
     MaybeStartNetworkConsumerHandleWatcher() {
   if (network_loader_state_ ==
-      ServiceWorkerUpdatedScriptLoader::LoaderState::kWaitingForBody) {
+      ServiceWorkerUpdatedScriptLoader::LoaderState::kLoadingHeader) {
     TRACE_EVENT_WITH_FLOW1("ServiceWorker",
                            "ServiceWorkerSingleScriptUpdateChecker::"
                            "MaybeStartNetworkConsumerHandleWatcher",
@@ -451,7 +438,7 @@
                            TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
                            "state", "wait for the body");
 
-    // OnStartLoadingResponseBody() or OnComplete() will continue the sequence.
+    // OnReceiveResponse() or OnComplete() will continue the sequence.
     return;
   }
   if (header_writer_state_ !=
diff --git a/content/browser/service_worker/service_worker_single_script_update_checker.h b/content/browser/service_worker/service_worker_single_script_update_checker.h
index 6252b54..67f382fe 100644
--- a/content/browser/service_worker/service_worker_single_script_update_checker.h
+++ b/content/browser/service_worker/service_worker_single_script_update_checker.h
@@ -160,8 +160,6 @@
                         OnUploadProgressCallback ack_callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle consumer) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   bool network_accessed() const { return network_accessed_; }
@@ -225,16 +223,9 @@
   // Represents the state of |network_loader_|.
   // Corresponds to the steps described in the class comments.
   //
-  // When response body exists:
   // CreateLoaderAndStart(): kNotStarted -> kLoadingHeader
-  // OnReceiveResponse(): kLoadingHeader -> kWaitingForBody
-  // OnStartLoadingResponseBody(): kWaitingForBody -> kLoadingBody
+  // OnReceiveResponse(): kLoadingHeader -> kLoadingBody
   // OnComplete(): kLoadingBody -> kCompleted
-  //
-  // When response body is empty:
-  // CreateLoaderAndStart(): kNotStarted -> kLoadingHeader
-  // OnReceiveResponse(): kLoadingHeader -> kWaitingForBody
-  // OnComplete(): kWaitingForBody -> kCompleted
   ServiceWorkerUpdatedScriptLoader::LoaderState network_loader_state_ =
       ServiceWorkerUpdatedScriptLoader::LoaderState::kNotStarted;
 
@@ -254,7 +245,7 @@
   // difference.
   //
   // When response body exists:
-  // OnStartLoadingResponseBody() && OnWriteHeadersComplete():
+  // OnReceiveResponsey() && OnWriteHeadersComplete():
   //     kNotStarted -> kWriting
   // OnNetworkDataAvailable() && MOJO_RESULT_FAILED_PRECONDITION:
   //     kWriting -> kCompleted
diff --git a/content/browser/service_worker/service_worker_single_script_update_checker_unittest.cc b/content/browser/service_worker/service_worker_single_script_update_checker_unittest.cc
index 5b0979a..3c4a3a3 100644
--- a/content/browser/service_worker/service_worker_single_script_update_checker_unittest.cc
+++ b/content/browser/service_worker/service_worker_single_script_update_checker_unittest.cc
@@ -477,8 +477,6 @@
   head->headers = base::MakeRefCounted<net::HttpResponseHeaders>(
       net::HttpUtil::AssembleRawHeaders(kSuccessHeader));
   head->headers->GetMimeType(&head->mime_type);
-  client->OnReceiveResponse(std::move(head),
-                            mojo::ScopedDataPipeConsumerHandle());
 
   // Simulate sending the response body. The buffer size for the data pipe
   // should be larger than the body to send the whole body in one chunk.
@@ -491,7 +489,7 @@
   mojo::ScopedDataPipeProducerHandle body_producer;
   ASSERT_EQ(MOJO_RESULT_OK,
             mojo::CreateDataPipe(&options, body_producer, body_consumer));
-  client->OnStartLoadingResponseBody(std::move(body_consumer));
+  client->OnReceiveResponse(std::move(head), std::move(body_consumer));
   mojo::BlockingCopyFromString(body_from_net, body_producer);
   body_producer.reset();
 
@@ -778,8 +776,6 @@
     head->headers = base::MakeRefCounted<net::HttpResponseHeaders>(
         net::HttpUtil::AssembleRawHeaders(kSuccessHeader));
     head->headers->GetMimeType(&head->mime_type);
-    request->client->OnReceiveResponse(std::move(head),
-                                       mojo::ScopedDataPipeConsumerHandle());
 
     MojoCreateDataPipeOptions options;
     options.struct_size = sizeof(MojoCreateDataPipeOptions);
@@ -794,7 +790,7 @@
     EXPECT_EQ(MOJO_RESULT_OK,
               producer->WriteData(body_from_net.data(), &bytes_written,
                                   MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
-    request->client->OnStartLoadingResponseBody(std::move(consumer));
+    request->client->OnReceiveResponse(std::move(head), std::move(consumer));
   }
 
   // Blocked on reading the header from the storage due to the asynchronous
diff --git a/content/browser/service_worker/service_worker_updated_script_loader.cc b/content/browser/service_worker/service_worker_updated_script_loader.cc
index f855629..f135418 100644
--- a/content/browser/service_worker/service_worker_updated_script_loader.cc
+++ b/content/browser/service_worker/service_worker_updated_script_loader.cc
@@ -23,7 +23,6 @@
 #include "net/base/load_flags.h"
 #include "net/base/net_errors.h"
 #include "net/cert/cert_status_flags.h"
-#include "services/network/public/cpp/features.h"
 #include "services/network/public/mojom/early_hints.mojom.h"
 #include "services/network/public/mojom/url_response_head.mojom.h"
 #include "third_party/blink/public/common/loader/throttling_url_loader.h"
@@ -191,11 +190,6 @@
   client_->OnTransferSizeUpdated(transfer_size_diff);
 }
 
-void ServiceWorkerUpdatedScriptLoader::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle consumer) {
-  NOTREACHED();
-}
-
 void ServiceWorkerUpdatedScriptLoader::OnComplete(
     const network::URLLoaderCompletionStatus& status) {
   LoaderState previous_state = network_loader_state_;
@@ -253,14 +247,8 @@
   }
 
   // Pass the consumer handle to the client.
-  if (base::FeatureList::IsEnabled(network::features::kCombineResponseBody)) {
-    client_->OnReceiveResponse(std::move(client_response),
-                               std::move(client_consumer));
-  } else {
-    client_->OnReceiveResponse(std::move(client_response),
-                               mojo::ScopedDataPipeConsumerHandle());
-    client_->OnStartLoadingResponseBody(std::move(client_consumer));
-  }
+  client_->OnReceiveResponse(std::move(client_response),
+                             std::move(client_consumer));
 
   client_producer_watcher_.Watch(
       client_producer_.get(), MOJO_HANDLE_SIGNAL_WRITABLE,
diff --git a/content/browser/service_worker/service_worker_updated_script_loader.h b/content/browser/service_worker/service_worker_updated_script_loader.h
index 804bd00..1bce300 100644
--- a/content/browser/service_worker/service_worker_updated_script_loader.h
+++ b/content/browser/service_worker/service_worker_updated_script_loader.h
@@ -64,7 +64,6 @@
   enum class LoaderState {
     kNotStarted,
     kLoadingHeader,
-    kWaitingForBody,
     kLoadingBody,
     kCompleted,
   };
@@ -109,8 +108,6 @@
                         OnUploadProgressCallback ack_callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   // Implements ServiceWorkerCacheWriter::WriteObserver.
@@ -194,8 +191,7 @@
   // Corresponds to the steps of calls as a URLLoaderClient.
   //
   // CreateLoaderAndStart(): kNotStarted -> kLoadingHeader
-  // OnReceiveResponse(): kLoadingHeader -> kWaitingForBody
-  // OnStartLoadingResponseBody(): kWaitingForBody -> kLoadingBody
+  // OnReceiveResponse(): kLoadingHeader -> kLoadingBody
   // OnComplete(): kLoadingBody -> kCompleted
   //
   // When this loader is created, the state should be kLoadingBody or kCompleted
diff --git a/content/browser/speech/speech_recognition_engine_unittest.cc b/content/browser/speech/speech_recognition_engine_unittest.cc
index 249fae7..9d84d1e2 100644
--- a/content/browser/speech/speech_recognition_engine_unittest.cc
+++ b/content/browser/speech/speech_recognition_engine_unittest.cc
@@ -565,16 +565,14 @@
   std::string headers("HTTP/1.1 200 OK\n\n");
   head->headers = base::MakeRefCounted<net::HttpResponseHeaders>(
       net::HttpUtil::AssembleRawHeaders(headers));
-  downstream_request->client->OnReceiveResponse(
-      std::move(head), mojo::ScopedDataPipeConsumerHandle());
 
   mojo::ScopedDataPipeProducerHandle producer_handle;
   mojo::ScopedDataPipeConsumerHandle consumer_handle;
   ASSERT_EQ(mojo::CreateDataPipe(nullptr, producer_handle, consumer_handle),
             MOJO_RESULT_OK);
 
-  downstream_request->client->OnStartLoadingResponseBody(
-      std::move(consumer_handle));
+  downstream_request->client->OnReceiveResponse(std::move(head),
+                                                std::move(consumer_handle));
   downstream_data_pipe_ = std::move(producer_handle);
 }
 
diff --git a/content/browser/web_package/prefetched_signed_exchange_cache.cc b/content/browser/web_package/prefetched_signed_exchange_cache.cc
index e33e6103..4ecaf23a 100644
--- a/content/browser/web_package/prefetched_signed_exchange_cache.cc
+++ b/content/browser/web_package/prefetched_signed_exchange_cache.cc
@@ -215,8 +215,6 @@
     UpdateRequestResponseStartTime(response_.get());
     response_->encoded_data_length = 0;
     if (is_navigation_request) {
-      client_->OnReceiveResponse(std::move(response_),
-                                 mojo::ScopedDataPipeConsumerHandle());
       SendResponseBody();
       return;
     }
@@ -265,8 +263,6 @@
       CrossOriginReadBlockingChecker::Result result) {
     switch (result) {
       case CrossOriginReadBlockingChecker::Result::kAllowed:
-        client_->OnReceiveResponse(std::move(response_),
-                                   mojo::ScopedDataPipeConsumerHandle());
         SendResponseBody();
         return;
       case CrossOriginReadBlockingChecker::Result::kNetError:
@@ -281,8 +277,6 @@
 
     // Send sanitized response.
     network::corb::SanitizeBlockedResponseHeaders(*response_);
-    client_->OnReceiveResponse(std::move(response_),
-                               mojo::ScopedDataPipeConsumerHandle());
 
     // Send an empty response's body.
     mojo::ScopedDataPipeProducerHandle pipe_producer_handle;
@@ -294,7 +288,8 @@
           network::URLLoaderCompletionStatus(net::ERR_INSUFFICIENT_RESOURCES));
       return;
     }
-    client_->OnStartLoadingResponseBody(std::move(pipe_consumer_handle));
+    client_->OnReceiveResponse(std::move(response_),
+                               std::move(pipe_consumer_handle));
 
     // Send a dummy OnComplete message.
     network::URLLoaderCompletionStatus status =
@@ -350,7 +345,8 @@
             weak_factory_.GetWeakPtr(), std::move(pipe_producer_handle),
             std::make_unique<storage::BlobDataHandle>(*blob_data_handle_)));
 
-    client_->OnStartLoadingResponseBody(std::move(pipe_consumer_handle));
+    client_->OnReceiveResponse(std::move(response_),
+                               std::move(pipe_consumer_handle));
   }
 
   void BlobReaderComplete(net::Error result) {
diff --git a/content/browser/web_package/save_as_web_bundle_job.cc b/content/browser/web_package/save_as_web_bundle_job.cc
index 932721ed..63d59dd 100644
--- a/content/browser/web_package/save_as_web_bundle_job.cc
+++ b/content/browser/web_package/save_as_web_bundle_job.cc
@@ -8,8 +8,8 @@
 #include "base/files/file_path.h"
 #include "components/download/public/common/download_task_runner.h"
 #include "content/browser/renderer_host/render_frame_host_impl.h"
+#include "content/browser/web_contents/web_contents_impl.h"
 #include "content/public/browser/render_frame_host.h"
-#include "content/public/browser/web_contents.h"
 #include "services/data_decoder/public/cpp/data_decoder.h"
 #include "third_party/blink/public/mojom/frame/frame.mojom.h"
 
@@ -17,26 +17,30 @@
 
 // static
 void SaveAsWebBundleJob::Start(
-    WebContents* web_contents,
+    WebContentsImpl* web_contents,
     const base::FilePath& file_path,
     base::OnceCallback<void(uint64_t /* file_size */,
                             data_decoder::mojom::WebBundlerError)> callback) {
   std::vector<
       mojo::PendingRemote<data_decoder::mojom::ResourceSnapshotForWebBundle>>
       snapshots;
-  web_contents->GetMainFrame()->ForEachRenderFrameHost(base::BindRepeating(
-      [](std::vector<mojo::PendingRemote<
-             data_decoder::mojom::ResourceSnapshotForWebBundle>>* snapshots,
-         RenderFrameHost* render_frame_host) {
-        mojo::Remote<data_decoder::mojom::ResourceSnapshotForWebBundle>
-            snapshot;
-        static_cast<RenderFrameHostImpl*>(render_frame_host)
-            ->GetAssociatedLocalFrame()
-            ->GetResourceSnapshotForWebBundle(
-                snapshot.BindNewPipeAndPassReceiver());
-        snapshots->push_back(snapshot.Unbind());
-      },
-      base::Unretained(&snapshots)));
+  // Only include nodes from the primary frame tree, since a Web Bundle
+  // would not be able to load inner frame trees (e.g. fenced frames).
+  // TODO(1321102): Consider supporting inner frame trees.
+  for (FrameTreeNode* node : web_contents->GetPrimaryFrameTree().Nodes()) {
+    if (node->current_frame_host()->inner_tree_main_frame_tree_node_id() !=
+        FrameTreeNode::kFrameTreeNodeInvalidId) {
+      // Skip inner tree placeholder nodes.
+      continue;
+    }
+    mojo::Remote<data_decoder::mojom::ResourceSnapshotForWebBundle> snapshot;
+    node->current_frame_host()
+        ->GetAssociatedLocalFrame()
+        ->GetResourceSnapshotForWebBundle(
+            snapshot.BindNewPipeAndPassReceiver());
+    snapshots.push_back(snapshot.Unbind());
+  }
+
   new SaveAsWebBundleJob(file_path, std::move(snapshots), std::move(callback));
 }
 
diff --git a/content/browser/web_package/save_as_web_bundle_job.h b/content/browser/web_package/save_as_web_bundle_job.h
index e78fe49..7e9d2cd 100644
--- a/content/browser/web_package/save_as_web_bundle_job.h
+++ b/content/browser/web_package/save_as_web_bundle_job.h
@@ -25,7 +25,7 @@
 
 namespace content {
 
-class WebContents;
+class WebContentsImpl;
 
 // This class is used by WebContents::GenerateWebBundle() method to generate
 // a Web Bundle file. The instances are created by Start() static method. Every
@@ -34,7 +34,7 @@
 class SaveAsWebBundleJob {
  public:
   static void Start(
-      WebContents* web_contents,
+      WebContentsImpl* web_contents,
       const base::FilePath& file_path,
       base::OnceCallback<void(uint64_t /* file_size */,
                               data_decoder::mojom::WebBundlerError)> callback);
diff --git a/content/browser/web_package/save_page_as_web_bundle_browsertest.cc b/content/browser/web_package/save_page_as_web_bundle_browsertest.cc
index 1817ece..1f33d5f9 100644
--- a/content/browser/web_package/save_page_as_web_bundle_browsertest.cc
+++ b/content/browser/web_package/save_page_as_web_bundle_browsertest.cc
@@ -17,6 +17,7 @@
 #include "content/public/test/browser_test.h"
 #include "content/public/test/content_browser_test.h"
 #include "content/public/test/content_browser_test_utils.h"
+#include "content/public/test/fenced_frame_test_util.h"
 #include "content/shell/browser/shell.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h"
@@ -103,6 +104,8 @@
 
   void ResetReceiver() { receiver_.reset(); }
 
+  size_t GetSnapshotSize() { return snapshots_.size(); }
+
  private:
   // mojom::WebBundleParserFactory implementation.
   void Generate(
@@ -326,4 +329,79 @@
             result_error);
 }
 
+class SavePageAsWebBundleFencedFrameBrowserTest
+    : public SavePageAsWebBundleBrowserTest {
+ public:
+  test::FencedFrameTestHelper& fenced_frame_test_helper() {
+    return fenced_frame_helper_;
+  }
+
+ protected:
+  test::FencedFrameTestHelper fenced_frame_helper_;
+};
+
+// If fenced frames become savable, this test will need to be updated.
+// See https://crbug.com/1321102
+IN_PROC_BROWSER_TEST_F(SavePageAsWebBundleFencedFrameBrowserTest,
+                       SnapshotOnePageWithFencedFrame) {
+  const auto page_url = embedded_test_server()->GetURL(kOnePageSimplePath);
+  NavigateToURLBlockUntilNavigationsComplete(shell(), page_url, 1);
+
+  // Create a fenced frame.
+  GURL fenced_frame_url =
+      embedded_test_server()->GetURL("/fenced_frames/title1.html");
+  fenced_frame_test_helper().CreateFencedFrame(
+      shell()->web_contents()->GetMainFrame(), fenced_frame_url);
+
+  mojo::Remote<data_decoder::mojom::ResourceSnapshotForWebBundle> snapshot;
+  static_cast<RenderFrameHostImpl*>(shell()->web_contents()->GetMainFrame())
+      ->GetAssociatedLocalFrame()
+      ->GetResourceSnapshotForWebBundle(snapshot.BindNewPipeAndPassReceiver());
+
+  ASSERT_EQ(1u, GetResourceCount(snapshot));
+
+  auto data = GetResourceBody(snapshot, 0);
+  ASSERT_TRUE(data);
+
+  EXPECT_EQ(
+      "<html>"
+      "<head>"
+      "<meta http-equiv=\"Content-Type\" content=\"text/html; "
+      "charset=UTF-8\">\n"
+      "<title>Hello</title>\n"
+      "</head>"
+      "<body><h1>hello world</h1>\n"
+      "<fencedframe></fencedframe></body></html>",
+      std::string(reinterpret_cast<const char*>(data->data()), data->size()));
+}
+
+// If fenced frames become savable, this test will need to be updated.
+// See https://crbug.com/1321102
+IN_PROC_BROWSER_TEST_F(SavePageAsWebBundleFencedFrameBrowserTest,
+                       IgnoreSnapshotFencedFrameInWebBundle) {
+  data_decoder::test::InProcessDataDecoder in_process_data_decoder;
+  MockWebBundler mock_web_bundler;
+  in_process_data_decoder.service().SetWebBundlerBinderForTesting(
+      base::BindRepeating(&MockWebBundler::Bind,
+                          base::Unretained(&mock_web_bundler)));
+
+  const auto page_url = embedded_test_server()->GetURL(kOnePageSimplePath);
+  NavigateToURLBlockUntilNavigationsComplete(shell(), page_url, 1);
+
+  // Create a fenced frame.
+  GURL fenced_frame_url =
+      embedded_test_server()->GetURL("/fenced_frames/title1.html");
+  fenced_frame_test_helper().CreateFencedFrame(
+      shell()->web_contents()->GetMainFrame(), fenced_frame_url);
+
+  ASSERT_TRUE(CreateSaveDir());
+  const auto file_path =
+      save_dir_.GetPath().Append(FILE_PATH_LITERAL("test.wbn"));
+  shell()->web_contents()->GenerateWebBundle(file_path, base::DoNothing());
+  mock_web_bundler.WaitUntilGenerateCalled();
+
+  // Verify the absence of the fenced frame's document.
+  EXPECT_EQ(1lu, mock_web_bundler.GetSnapshotSize());
+}
+
 }  // namespace content
diff --git a/content/browser/web_package/signed_exchange_cert_fetcher.cc b/content/browser/web_package/signed_exchange_cert_fetcher.cc
index 975cfaf..3b466553 100644
--- a/content/browser/web_package/signed_exchange_cert_fetcher.cc
+++ b/content/browser/web_package/signed_exchange_cert_fetcher.cc
@@ -286,8 +286,18 @@
 
   UMA_HISTOGRAM_BOOLEAN("SignedExchange.CertificateFetch.CacheHit",
                         head->was_fetched_via_cache);
-  if (body)
-    OnStartLoadingResponseBody(std::move(body));
+
+  if (!body)
+    return;
+
+  body_ = std::move(body);
+  handle_watcher_ = std::make_unique<mojo::SimpleWatcher>(
+      FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::AUTOMATIC,
+      base::SequencedTaskRunnerHandle::Get());
+  handle_watcher_->Watch(
+      body_.get(), MOJO_HANDLE_SIGNAL_READABLE,
+      base::BindRepeating(&SignedExchangeCertFetcher::OnHandleReady,
+                          base::Unretained(this)));
 }
 
 void SignedExchangeCertFetcher::OnReceiveRedirect(
@@ -318,20 +328,6 @@
   // Do nothing.
 }
 
-void SignedExchangeCertFetcher::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle body) {
-  TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("loading"),
-               "SignedExchangeCertFetcher::OnStartLoadingResponseBody");
-  body_ = std::move(body);
-  handle_watcher_ = std::make_unique<mojo::SimpleWatcher>(
-      FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::AUTOMATIC,
-      base::SequencedTaskRunnerHandle::Get());
-  handle_watcher_->Watch(
-      body_.get(), MOJO_HANDLE_SIGNAL_READABLE,
-      base::BindRepeating(&SignedExchangeCertFetcher::OnHandleReady,
-                          base::Unretained(this)));
-}
-
 void SignedExchangeCertFetcher::OnComplete(
     const network::URLLoaderCompletionStatus& status) {
   TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("loading"),
diff --git a/content/browser/web_package/signed_exchange_cert_fetcher.h b/content/browser/web_package/signed_exchange_cert_fetcher.h
index e59defe..33d33fd 100644
--- a/content/browser/web_package/signed_exchange_cert_fetcher.h
+++ b/content/browser/web_package/signed_exchange_cert_fetcher.h
@@ -111,8 +111,6 @@
                         OnUploadProgressCallback callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   void OnDataURLRequest(const network::ResourceRequest& resource_request,
diff --git a/content/browser/web_package/signed_exchange_cert_fetcher_unittest.cc b/content/browser/web_package/signed_exchange_cert_fetcher_unittest.cc
index c3e9f28b..84f1930 100644
--- a/content/browser/web_package/signed_exchange_cert_fetcher_unittest.cc
+++ b/content/browser/web_package/signed_exchange_cert_fetcher_unittest.cc
@@ -248,7 +248,8 @@
         net::IsolationInfo());
   }
 
-  void CallOnReceiveResponse() {
+  void CallOnReceiveResponse(
+      mojo::ScopedDataPipeConsumerHandle consumer_handle) {
     auto response_head = network::mojom::URLResponseHead::New();
     response_head->headers =
         base::MakeRefCounted<net::HttpResponseHeaders>("HTTP/1.1 200 OK");
@@ -256,7 +257,7 @@
                                       "application/cert-chain+cbor");
     response_head->mime_type = "application/cert-chain+cbor";
     mock_loader_factory_.client_remote()->OnReceiveResponse(
-        std::move(response_head), mojo::ScopedDataPipeConsumerHandle());
+        std::move(response_head), std::move(consumer_handle));
   }
 
   DeferringURLLoaderThrottle* InitializeDeferringURLLoaderThrottle() {
@@ -298,9 +299,7 @@
       mock_loader_factory_.url_request()->headers.GetHeader("Accept", &accept));
   EXPECT_EQ("application/cert-chain+cbor", accept);
 
-  CallOnReceiveResponse();
-  mock_loader_factory_.client_remote()->OnStartLoadingResponseBody(
-      CreateTestDataFilledDataPipe());
+  CallOnReceiveResponse(CreateTestDataFilledDataPipe());
   mock_loader_factory_.client_remote()->OnComplete(
       network::URLLoaderCompletionStatus(net::OK));
   RunUntilIdle();
@@ -314,7 +313,6 @@
 TEST_F(SignedExchangeCertFetcherTest, MultipleChunked) {
   std::unique_ptr<SignedExchangeCertFetcher> fetcher =
       CreateFetcherAndStart(url_, false /* force_fetch */);
-  CallOnReceiveResponse();
   scoped_refptr<net::X509Certificate> certificate = ImportTestCert();
   const std::string message =
       CreateCertMessage(CreateCertMessageFromCert(*certificate));
@@ -325,8 +323,7 @@
             MOJO_RESULT_OK);
   ASSERT_TRUE(mojo::BlockingCopyFromString(
       message.substr(0, message.size() / 2), producer_handle));
-  mock_loader_factory_.client_remote()->OnStartLoadingResponseBody(
-      std::move(consumer_handle));
+  CallOnReceiveResponse(std::move(consumer_handle));
   RunUntilIdle();
   ASSERT_TRUE(mojo::BlockingCopyFromString(message.substr(message.size() / 2),
                                            producer_handle));
@@ -345,8 +342,6 @@
 TEST_F(SignedExchangeCertFetcherTest, ForceFetchAndFail) {
   std::unique_ptr<SignedExchangeCertFetcher> fetcher =
       CreateFetcherAndStart(url_, true /* force_fetch */);
-  CallOnReceiveResponse();
-
   ASSERT_TRUE(mock_loader_factory_.url_request());
   EXPECT_EQ(url_, mock_loader_factory_.url_request()->url);
   EXPECT_EQ(network::mojom::RequestDestination::kEmpty,
@@ -374,7 +369,6 @@
 
   std::unique_ptr<SignedExchangeCertFetcher> fetcher =
       CreateFetcherAndStart(url_, false /* force_fetch */);
-  CallOnReceiveResponse();
   mojo::ScopedDataPipeProducerHandle producer_handle;
   mojo::ScopedDataPipeConsumerHandle consumer_handle;
   ASSERT_EQ(
@@ -382,8 +376,7 @@
       MOJO_RESULT_OK);
   CHECK(mojo::BlockingCopyFromString(message, producer_handle));
   producer_handle.reset();
-  mock_loader_factory_.client_remote()->OnStartLoadingResponseBody(
-      std::move(consumer_handle));
+  CallOnReceiveResponse(std::move(consumer_handle));
   mock_loader_factory_.client_remote()->OnComplete(
       network::URLLoaderCompletionStatus(net::OK));
   RunUntilIdle();
@@ -402,7 +395,6 @@
 
   std::unique_ptr<SignedExchangeCertFetcher> fetcher =
       CreateFetcherAndStart(url_, false /* force_fetch */);
-  CallOnReceiveResponse();
   mojo::ScopedDataPipeProducerHandle producer_handle;
   mojo::ScopedDataPipeConsumerHandle consumer_handle;
   ASSERT_EQ(
@@ -410,8 +402,7 @@
       MOJO_RESULT_OK);
   CHECK(mojo::BlockingCopyFromString(message, producer_handle));
   producer_handle.reset();
-  mock_loader_factory_.client_remote()->OnStartLoadingResponseBody(
-      std::move(consumer_handle));
+  CallOnReceiveResponse(std::move(consumer_handle));
   mock_loader_factory_.client_remote()->OnComplete(
       network::URLLoaderCompletionStatus(net::OK));
   RunUntilIdle();
@@ -430,7 +421,6 @@
 
   std::unique_ptr<SignedExchangeCertFetcher> fetcher =
       CreateFetcherAndStart(url_, false /* force_fetch */);
-  CallOnReceiveResponse();
   mojo::ScopedDataPipeProducerHandle producer_handle;
   mojo::ScopedDataPipeConsumerHandle consumer_handle;
   ASSERT_EQ(mojo::CreateDataPipe(message.size() / 2 + 1, producer_handle,
@@ -438,8 +428,7 @@
             MOJO_RESULT_OK);
   ASSERT_TRUE(mojo::BlockingCopyFromString(
       message.substr(0, message.size() / 2), producer_handle));
-  mock_loader_factory_.client_remote()->OnStartLoadingResponseBody(
-      std::move(consumer_handle));
+  CallOnReceiveResponse(std::move(consumer_handle));
   RunUntilIdle();
   ASSERT_TRUE(mojo::BlockingCopyFromString(message.substr(message.size() / 2),
                                            producer_handle));
@@ -466,8 +455,6 @@
   response_head->headers =
       base::MakeRefCounted<net::HttpResponseHeaders>("HTTP/1.1 200 OK");
   response_head->content_length = message.size();
-  mock_loader_factory_.client_remote()->OnReceiveResponse(
-      std::move(response_head), mojo::ScopedDataPipeConsumerHandle());
   mojo::ScopedDataPipeProducerHandle producer_handle;
   mojo::ScopedDataPipeConsumerHandle consumer_handle;
   ASSERT_EQ(
@@ -475,8 +462,8 @@
       MOJO_RESULT_OK);
   CHECK(mojo::BlockingCopyFromString(message, producer_handle));
   producer_handle.reset();
-  mock_loader_factory_.client_remote()->OnStartLoadingResponseBody(
-      std::move(consumer_handle));
+  mock_loader_factory_.client_remote()->OnReceiveResponse(
+      std::move(response_head), std::move(consumer_handle));
   mock_loader_factory_.client_remote()->OnComplete(
       network::URLLoaderCompletionStatus(net::OK));
   RunUntilIdle();
@@ -534,7 +521,6 @@
 TEST_F(SignedExchangeCertFetcherTest, Invalid_CertData) {
   std::unique_ptr<SignedExchangeCertFetcher> fetcher =
       CreateFetcherAndStart(url_, false /* force_fetch */);
-  CallOnReceiveResponse();
   const std::string message = CreateCertMessage("Invalid Cert Data");
   mojo::ScopedDataPipeProducerHandle producer_handle;
   mojo::ScopedDataPipeConsumerHandle consumer_handle;
@@ -543,8 +529,7 @@
       MOJO_RESULT_OK);
   CHECK(mojo::BlockingCopyFromString(message, producer_handle));
   producer_handle.reset();
-  mock_loader_factory_.client_remote()->OnStartLoadingResponseBody(
-      std::move(consumer_handle));
+  CallOnReceiveResponse(std::move(consumer_handle));
   mock_loader_factory_.client_remote()->OnComplete(
       network::URLLoaderCompletionStatus(net::OK));
   RunUntilIdle();
@@ -557,8 +542,6 @@
 TEST_F(SignedExchangeCertFetcherTest, Invalid_CertMessage) {
   std::unique_ptr<SignedExchangeCertFetcher> fetcher =
       CreateFetcherAndStart(url_, false /* force_fetch */);
-  CallOnReceiveResponse();
-
   const std::string message = "Invalid cert message";
 
   mojo::ScopedDataPipeProducerHandle producer_handle;
@@ -568,8 +551,7 @@
       MOJO_RESULT_OK);
   CHECK(mojo::BlockingCopyFromString(message, producer_handle));
   producer_handle.reset();
-  mock_loader_factory_.client_remote()->OnStartLoadingResponseBody(
-      std::move(consumer_handle));
+  CallOnReceiveResponse(std::move(consumer_handle));
 
   mock_loader_factory_.client_remote()->OnComplete(
       network::URLLoaderCompletionStatus(net::OK));
@@ -594,13 +576,11 @@
 
   RunUntilIdle();
 
-  CallOnReceiveResponse();
+  CallOnReceiveResponse(CreateTestDataFilledDataPipe());
 
   RunUntilIdle();
 
   EXPECT_TRUE(throttle->will_process_response_called());
-  mock_loader_factory_.client_remote()->OnStartLoadingResponseBody(
-      CreateTestDataFilledDataPipe());
 
   mock_loader_factory_.client_remote()->OnComplete(
       network::URLLoaderCompletionStatus(net::OK));
@@ -669,15 +649,12 @@
 
   RunUntilIdle();
 
-  CallOnReceiveResponse();
+  CallOnReceiveResponse(CreateTestDataFilledDataPipe());
 
   RunUntilIdle();
 
   EXPECT_TRUE(throttle->will_process_response_called());
 
-  mock_loader_factory_.client_remote()->OnStartLoadingResponseBody(
-      CreateTestDataFilledDataPipe());
-
   mock_loader_factory_.client_remote()->OnComplete(
       network::URLLoaderCompletionStatus(net::OK));
   RunUntilIdle();
@@ -706,8 +683,6 @@
 TEST_F(SignedExchangeCertFetcherTest, DeleteFetcher_BeforeResponseBody) {
   std::unique_ptr<SignedExchangeCertFetcher> fetcher =
       CreateFetcherAndStart(url_, false /* force_fetch */);
-  CallOnReceiveResponse();
-  RunUntilIdle();
   fetcher.reset();
   RunUntilIdle();
 
@@ -718,7 +693,6 @@
 TEST_F(SignedExchangeCertFetcherTest, DeleteFetcher_WhileReceivingBody) {
   std::unique_ptr<SignedExchangeCertFetcher> fetcher =
       CreateFetcherAndStart(url_, false /* force_fetch */);
-  CallOnReceiveResponse();
   scoped_refptr<net::X509Certificate> certificate = ImportTestCert();
   const std::string message =
       CreateCertMessage(CreateCertMessageFromCert(*certificate));
@@ -729,8 +703,7 @@
             MOJO_RESULT_OK);
   ASSERT_TRUE(mojo::BlockingCopyFromString(
       message.substr(0, message.size() / 2), producer_handle));
-  mock_loader_factory_.client_remote()->OnStartLoadingResponseBody(
-      std::move(consumer_handle));
+  CallOnReceiveResponse(std::move(consumer_handle));
   RunUntilIdle();
   fetcher.reset();
   RunUntilIdle();
@@ -745,7 +718,6 @@
 TEST_F(SignedExchangeCertFetcherTest, DeleteFetcher_AfterReceivingBody) {
   std::unique_ptr<SignedExchangeCertFetcher> fetcher =
       CreateFetcherAndStart(url_, false /* force_fetch */);
-  CallOnReceiveResponse();
   scoped_refptr<net::X509Certificate> certificate = ImportTestCert();
   const std::string message =
       CreateCertMessage(CreateCertMessageFromCert(*certificate));
@@ -755,8 +727,7 @@
       mojo::CreateDataPipe(message.size(), producer_handle, consumer_handle),
       MOJO_RESULT_OK);
   CHECK(mojo::BlockingCopyFromString(message, producer_handle));
-  mock_loader_factory_.client_remote()->OnStartLoadingResponseBody(
-      std::move(consumer_handle));
+  CallOnReceiveResponse(std::move(consumer_handle));
   RunUntilIdle();
   CloseClientPipe();
   RunUntilIdle();
@@ -783,8 +754,6 @@
 TEST_F(SignedExchangeCertFetcherTest, CloseClientPipe_BeforeResponseBody) {
   std::unique_ptr<SignedExchangeCertFetcher> fetcher =
       CreateFetcherAndStart(url_, false /* force_fetch */);
-  CallOnReceiveResponse();
-  RunUntilIdle();
   CloseClientPipe();
   RunUntilIdle();
 
@@ -796,7 +765,6 @@
 TEST_F(SignedExchangeCertFetcherTest, CloseClientPipe_WhileReceivingBody) {
   std::unique_ptr<SignedExchangeCertFetcher> fetcher =
       CreateFetcherAndStart(url_, false /* force_fetch */);
-  CallOnReceiveResponse();
   scoped_refptr<net::X509Certificate> certificate = ImportTestCert();
   const std::string message =
       CreateCertMessage(CreateCertMessageFromCert(*certificate));
@@ -807,8 +775,7 @@
             MOJO_RESULT_OK);
   ASSERT_TRUE(mojo::BlockingCopyFromString(
       message.substr(0, message.size() / 2), producer_handle));
-  mock_loader_factory_.client_remote()->OnStartLoadingResponseBody(
-      std::move(consumer_handle));
+  CallOnReceiveResponse(std::move(consumer_handle));
   RunUntilIdle();
   CloseClientPipe();
   RunUntilIdle();
@@ -823,7 +790,6 @@
 TEST_F(SignedExchangeCertFetcherTest, CloseClientPipe_AfterReceivingBody) {
   std::unique_ptr<SignedExchangeCertFetcher> fetcher =
       CreateFetcherAndStart(url_, false /* force_fetch */);
-  CallOnReceiveResponse();
   scoped_refptr<net::X509Certificate> certificate = ImportTestCert();
   const std::string message =
       CreateCertMessage(CreateCertMessageFromCert(*certificate));
@@ -833,8 +799,7 @@
       mojo::CreateDataPipe(message.size(), producer_handle, consumer_handle),
       MOJO_RESULT_OK);
   CHECK(mojo::BlockingCopyFromString(message, producer_handle));
-  mock_loader_factory_.client_remote()->OnStartLoadingResponseBody(
-      std::move(consumer_handle));
+  CallOnReceiveResponse(std::move(consumer_handle));
   RunUntilIdle();
   CloseClientPipe();
   RunUntilIdle();
diff --git a/content/browser/web_package/signed_exchange_loader.h b/content/browser/web_package/signed_exchange_loader.h
index 40865d05..9c7c64c 100644
--- a/content/browser/web_package/signed_exchange_loader.h
+++ b/content/browser/web_package/signed_exchange_loader.h
@@ -87,9 +87,8 @@
 
   ~SignedExchangeLoader() override;
 
-
   // network::mojom::URLLoaderClient implementation
-  // Only OnStartLoadingResponseBody() and OnComplete() are called.
+  // Only OnComplete() is called.
   void OnReceiveEarlyHints(network::mojom::EarlyHintsPtr early_hints) override;
   void OnReceiveResponse(network::mojom::URLResponseHeadPtr response_head,
                          mojo::ScopedDataPipeConsumerHandle body) override;
@@ -101,8 +100,6 @@
                         OnUploadProgressCallback ack_callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   // network::mojom::URLLoader implementation
@@ -116,6 +113,8 @@
   void PauseReadingBodyFromNet() override;
   void ResumeReadingBodyFromNet() override;
 
+  void OnStartLoadingResponseBody(mojo::ScopedDataPipeConsumerHandle body);
+
   void ConnectToClient(
       mojo::PendingRemote<network::mojom::URLLoaderClient> client);
 
diff --git a/content/browser/web_package/signed_exchange_loader_unittest.cc b/content/browser/web_package/signed_exchange_loader_unittest.cc
index 689e8cd..7473f34 100644
--- a/content/browser/web_package/signed_exchange_loader_unittest.cc
+++ b/content/browser/web_package/signed_exchange_loader_unittest.cc
@@ -80,8 +80,6 @@
                  void(int64_t, int64_t, base::OnceCallback<void()> callback));
     MOCK_METHOD1(OnReceiveCachedMetadata, void(mojo_base::BigBuffer));
     MOCK_METHOD1(OnTransferSizeUpdated, void(int32_t));
-    MOCK_METHOD1(OnStartLoadingResponseBody,
-                 void(mojo::ScopedDataPipeConsumerHandle));
     MOCK_METHOD1(OnComplete, void(const network::URLLoaderCompletionStatus&));
 
    private:
diff --git a/content/browser/web_package/signed_exchange_prefetch_handler.cc b/content/browser/web_package/signed_exchange_prefetch_handler.cc
index 9423e69..57adc82 100644
--- a/content/browser/web_package/signed_exchange_prefetch_handler.cc
+++ b/content/browser/web_package/signed_exchange_prefetch_handler.cc
@@ -114,11 +114,6 @@
   NOTREACHED();
 }
 
-void SignedExchangePrefetchHandler::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle body) {
-  NOTREACHED();
-}
-
 void SignedExchangePrefetchHandler::OnComplete(
     const network::URLLoaderCompletionStatus& status) {
   // We only reach here on error, since successful completion of the
diff --git a/content/browser/web_package/signed_exchange_prefetch_handler.h b/content/browser/web_package/signed_exchange_prefetch_handler.h
index 371de4a..2eca3f82 100644
--- a/content/browser/web_package/signed_exchange_prefetch_handler.h
+++ b/content/browser/web_package/signed_exchange_prefetch_handler.h
@@ -91,8 +91,6 @@
                         base::OnceCallback<void()> callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   mojo::Receiver<network::mojom::URLLoaderClient> loader_client_receiver_{this};
diff --git a/content/browser/web_package/signed_exchange_validity_pinger.cc b/content/browser/web_package/signed_exchange_validity_pinger.cc
index f096c60..a09aa5f 100644
--- a/content/browser/web_package/signed_exchange_validity_pinger.cc
+++ b/content/browser/web_package/signed_exchange_validity_pinger.cc
@@ -117,8 +117,12 @@
 void SignedExchangeValidityPinger::OnReceiveResponse(
     network::mojom::URLResponseHeadPtr head,
     mojo::ScopedDataPipeConsumerHandle body) {
-  if (body)
-    OnStartLoadingResponseBody(std::move(body));
+  if (!body)
+    return;
+
+  DCHECK(!pipe_drainer_);
+  pipe_drainer_ =
+      std::make_unique<mojo::DataPipeDrainer>(this, std::move(body));
 }
 
 void SignedExchangeValidityPinger::OnReceiveRedirect(
@@ -150,13 +154,6 @@
   NOTREACHED();
 }
 
-void SignedExchangeValidityPinger::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle body) {
-  DCHECK(!pipe_drainer_);
-  pipe_drainer_ =
-      std::make_unique<mojo::DataPipeDrainer>(this, std::move(body));
-}
-
 void SignedExchangeValidityPinger::OnComplete(
     const network::URLLoaderCompletionStatus& status) {
   DCHECK(callback_);
diff --git a/content/browser/web_package/signed_exchange_validity_pinger.h b/content/browser/web_package/signed_exchange_validity_pinger.h
index 0074fcd..aebaea4 100644
--- a/content/browser/web_package/signed_exchange_validity_pinger.h
+++ b/content/browser/web_package/signed_exchange_validity_pinger.h
@@ -63,8 +63,6 @@
                         OnUploadProgressCallback callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   // mojo::DataPipeDrainer::Client overrides:
diff --git a/content/browser/web_package/web_bundle_url_loader_factory.cc b/content/browser/web_package/web_bundle_url_loader_factory.cc
index d9e71a0..2540d8f 100644
--- a/content/browser/web_package/web_bundle_url_loader_factory.cc
+++ b/content/browser/web_package/web_bundle_url_loader_factory.cc
@@ -117,8 +117,6 @@
         return;
       }
     }
-    loader_client_->OnReceiveResponse(std::move(response_head),
-                                      mojo::ScopedDataPipeConsumerHandle());
 
     mojo::ScopedDataPipeProducerHandle producer_handle;
     mojo::ScopedDataPipeConsumerHandle consumer_handle;
@@ -133,7 +131,8 @@
 
     auto result =
         mojo::CreateDataPipe(&options, producer_handle, consumer_handle);
-    loader_client_->OnStartLoadingResponseBody(std::move(consumer_handle));
+    loader_client_->OnReceiveResponse(std::move(response_head),
+                                      std::move(consumer_handle));
     if (result != MOJO_RESULT_OK) {
       loader_client_->OnComplete(
           network::URLLoaderCompletionStatus(net::ERR_INSUFFICIENT_RESOURCES));
diff --git a/content/browser/webkit_browsertest.cc b/content/browser/webkit_browsertest.cc
index ee5d5bfc..5270982 100644
--- a/content/browser/webkit_browsertest.cc
+++ b/content/browser/webkit_browsertest.cc
@@ -34,8 +34,6 @@
   auto response = network::mojom::URLResponseHead::New();
   response->headers = info.headers;
   response->headers->GetMimeType(&response->mime_type);
-  params->client->OnReceiveResponse(std::move(response),
-                                    mojo::ScopedDataPipeConsumerHandle());
 
   std::string body = "some data\r\n";
   uint32_t bytes_written = body.size();
@@ -46,7 +44,8 @@
   CHECK_EQ(MOJO_RESULT_OK,
            producer_handle->WriteData(body.data(), &bytes_written,
                                       MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
-  params->client->OnStartLoadingResponseBody(std::move(consumer_handle));
+  params->client->OnReceiveResponse(std::move(response),
+                                    std::move(consumer_handle));
 
   params->client->OnComplete(
       network::URLLoaderCompletionStatus(net::ERR_CONNECTION_ABORTED));
diff --git a/content/browser/webui/web_ui_url_loader_factory.cc b/content/browser/webui/web_ui_url_loader_factory.cc
index 26ea08b..ffe13064 100644
--- a/content/browser/webui/web_ui_url_loader_factory.cc
+++ b/content/browser/webui/web_ui_url_loader_factory.cc
@@ -37,7 +37,6 @@
 #include "mojo/public/cpp/bindings/remote.h"
 #include "net/http/http_byte_range.h"
 #include "net/http/http_util.h"
-#include "services/network/public/cpp/features.h"
 #include "services/network/public/cpp/parsed_headers.h"
 #include "services/network/public/cpp/self_deleting_url_loader_factory.h"
 #include "services/network/public/mojom/network_service.mojom.h"
@@ -146,14 +145,8 @@
   mojo::Remote<network::mojom::URLLoaderClient> client(
       std::move(client_remote));
 
-  if (base::FeatureList::IsEnabled(network::features::kCombineResponseBody)) {
-    client->OnReceiveResponse(std::move(headers),
-                              std::move(pipe_consumer_handle));
-  } else {
-    client->OnReceiveResponse(std::move(headers),
-                              mojo::ScopedDataPipeConsumerHandle());
-    client->OnStartLoadingResponseBody(std::move(pipe_consumer_handle));
-  }
+  client->OnReceiveResponse(std::move(headers),
+                            std::move(pipe_consumer_handle));
 
   network::URLLoaderCompletionStatus status(net::OK);
   status.encoded_data_length = output_size;
diff --git a/content/browser/worker_host/worker_script_fetcher.cc b/content/browser/worker_host/worker_script_fetcher.cc
index b8d95c4..8c7743d 100644
--- a/content/browser/worker_host/worker_script_fetcher.cc
+++ b/content/browser/worker_host/worker_script_fetcher.cc
@@ -629,13 +629,8 @@
     mojo::ScopedDataPipeConsumerHandle body) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   response_head_ = std::move(response_head);
-  if (body)
-    OnStartLoadingResponseBody(std::move(body));
-}
-
-void WorkerScriptFetcher::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle response_body) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  if (!body)
+    return;
 
   base::WeakPtr<WorkerScriptLoader> script_loader =
       script_loader_factory_->GetScriptLoader();
@@ -647,7 +642,7 @@
     mojo::PendingReceiver<network::mojom::URLLoaderClient>
         response_client_receiver;
     if (script_loader->MaybeCreateLoaderForResponse(
-            &response_head_, &response_body, &response_url_loader_,
+            &response_head_, &body, &response_url_loader_,
             &response_client_receiver, url_loader_.get())) {
       DCHECK(response_url_loader_);
       response_url_loader_receiver_.Bind(std::move(response_client_receiver));
@@ -662,7 +657,7 @@
   main_script_load_params_ = blink::mojom::WorkerMainScriptLoadParams::New();
   main_script_load_params_->request_id = request_id_;
   main_script_load_params_->response_head = std::move(response_head_);
-  main_script_load_params_->response_body = std::move(response_body);
+  main_script_load_params_->response_body = std::move(body);
   if (url_loader_) {
     // The main script was served by a request interceptor or the default
     // network loader.
@@ -733,7 +728,7 @@
   if (status.error_code == net::OK) {
     // It's possible to reach here when the `response_head_` doesn't have a
     // `parsed_headers` and ask NetworkService to parse headers in
-    // OnStartLoadingResponseBody(). DidParseHeaders() will be called eventually
+    // OnReceiveResponse(). DidParseHeaders() will be called eventually
     // and `this` will be deleted in it.
     return;
   }
diff --git a/content/browser/worker_host/worker_script_fetcher.h b/content/browser/worker_host/worker_script_fetcher.h
index 30f73a4..880daa6 100644
--- a/content/browser/worker_host/worker_script_fetcher.h
+++ b/content/browser/worker_host/worker_script_fetcher.h
@@ -52,7 +52,7 @@
 // NetworkService (PlzWorker):
 // This is an implementation of the URLLoaderClient for web worker's main script
 // fetch. The loader and client bounded with this class are to be unbound and
-// forwarded to the renderer process on OnStartLoadingResponseBody, and the
+// forwarded to the renderer process on OnReceiveResponse, and the
 // resource loader in the renderer process will take them over.
 //
 // WorkerScriptFetcher deletes itself when the ownership of the loader and
@@ -215,8 +215,6 @@
                         OnUploadProgressCallback callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   void DidParseHeaders(network::mojom::ParsedHeadersPtr parsed_headers);
diff --git a/content/browser/worker_host/worker_script_loader.cc b/content/browser/worker_host/worker_script_loader.cc
index 5752f7c..c13b75f8 100644
--- a/content/browser/worker_host/worker_script_loader.cc
+++ b/content/browser/worker_host/worker_script_loader.cc
@@ -270,12 +270,6 @@
   client_->OnTransferSizeUpdated(transfer_size_diff);
 }
 
-void WorkerScriptLoader::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle consumer) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  client_->OnStartLoadingResponseBody(std::move(consumer));
-}
-
 void WorkerScriptLoader::OnComplete(
     const network::URLLoaderCompletionStatus& status) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
diff --git a/content/browser/worker_host/worker_script_loader.h b/content/browser/worker_host/worker_script_loader.h
index dbbf3f1f..43c00645 100644
--- a/content/browser/worker_host/worker_script_loader.h
+++ b/content/browser/worker_host/worker_script_loader.h
@@ -107,8 +107,6 @@
                         OnUploadProgressCallback ack_callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   // Returns a URLLoader client endpoint if an interceptor wants to handle the
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn
index c115f460..3573107 100644
--- a/content/public/android/BUILD.gn
+++ b/content/public/android/BUILD.gn
@@ -368,7 +368,6 @@
     "java/src/org/chromium/content_public/browser/SpeechRecognition.java",
     "java/src/org/chromium/content_public/browser/ViewEventSink.java",
     "java/src/org/chromium/content_public/browser/WebAuthenticationDelegate.java",
-    "java/src/org/chromium/content_public/browser/WebAuthnCredentialDetails.java",
     "java/src/org/chromium/content_public/browser/WebContents.java",
     "java/src/org/chromium/content_public/browser/WebContentsAccessibility.java",
     "java/src/org/chromium/content_public/browser/WebContentsInternals.java",
diff --git a/content/public/android/java/src/org/chromium/content/browser/framehost/RenderFrameHostImpl.java b/content/public/android/java/src/org/chromium/content/browser/framehost/RenderFrameHostImpl.java
index e965e2c..869a576 100644
--- a/content/public/android/java/src/org/chromium/content/browser/framehost/RenderFrameHostImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/framehost/RenderFrameHostImpl.java
@@ -16,7 +16,6 @@
 import org.chromium.content_public.browser.LifecycleState;
 import org.chromium.content_public.browser.PermissionsPolicyFeature;
 import org.chromium.content_public.browser.RenderFrameHost;
-import org.chromium.content_public.browser.WebAuthnCredentialDetails;
 import org.chromium.mojo.bindings.Interface;
 import org.chromium.mojo.bindings.InterfaceRequest;
 import org.chromium.mojo.system.Pair;
@@ -217,42 +216,6 @@
     }
 
     @Override
-    public void onCredentialsDetailsListReceived(
-            List<WebAuthnCredentialDetails> credentialList, Callback<byte[]> callback) {
-        assert credentialList != null;
-        assert callback != null;
-        if (mNativeRenderFrameHostAndroid == 0) {
-            callback.onResult(new byte[0]);
-            return;
-        }
-        WebAuthnCredentialDetails[] credentialArray =
-                credentialList.toArray(new WebAuthnCredentialDetails[credentialList.size()]);
-        RenderFrameHostImplJni.get().onCredentialsDetailsListReceived(
-                mNativeRenderFrameHostAndroid, RenderFrameHostImpl.this, credentialArray, callback);
-    }
-
-    @CalledByNative
-    private static String getWebAuthnCredentialDetailsUserName(WebAuthnCredentialDetails cred) {
-        return cred.mUserName;
-    }
-
-    @CalledByNative
-    private static String getWebAuthnCredentialDetailsUserDisplayName(
-            WebAuthnCredentialDetails cred) {
-        return cred.mUserDisplayName;
-    }
-
-    @CalledByNative
-    private static byte[] getWebAuthnCredentialDetailsUserId(WebAuthnCredentialDetails cred) {
-        return cred.mUserId;
-    }
-
-    @CalledByNative
-    private static byte[] getWebAuthnCredentialDetailsCredentialId(WebAuthnCredentialDetails cred) {
-        return cred.mCredentialId;
-    }
-
-    @Override
     public GlobalRenderFrameHostId getGlobalRenderFrameHostId() {
         return mRenderFrameHostId;
     }
@@ -294,9 +257,6 @@
         int performMakeCredentialWebAuthSecurityChecks(long nativeRenderFrameHostAndroid,
                 RenderFrameHostImpl caller, String relyingPartyId, Origin effectiveOrigin,
                 boolean isPaymentCredentialCreation);
-        void onCredentialsDetailsListReceived(long nativeRenderFrameHostAndroid,
-                RenderFrameHostImpl caller, WebAuthnCredentialDetails[] credentialList,
-                Callback<byte[]> callback);
         int getLifecycleState(long nativeRenderFrameHostAndroid, RenderFrameHostImpl caller);
     }
 }
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/RenderFrameHost.java b/content/public/android/java/src/org/chromium/content_public/browser/RenderFrameHost.java
index c3191ce..59c2a1d 100644
--- a/content/public/android/java/src/org/chromium/content_public/browser/RenderFrameHost.java
+++ b/content/public/android/java/src/org/chromium/content_public/browser/RenderFrameHost.java
@@ -4,7 +4,6 @@
 
 package org.chromium.content_public.browser;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
 import org.chromium.base.Callback;
@@ -164,17 +163,6 @@
             String relyingPartyId, Origin effectiveOrigin, boolean isPaymentCredentialCreation);
 
     /**
-     * Provides a list of credentials for WebAuthn Conditional UI. These credentials become
-     * available as options for autofill UI on sign-in input fields. The callback is invoked when
-     * a user selects one of the credentials from the list.
-     *
-     * @param credentialList The list of credentials that can be used as autofill suggestions.
-     * @param callback The callback to be invoked with the credential ID of a selected credential.
-     */
-    void onCredentialsDetailsListReceived(@NonNull List<WebAuthnCredentialDetails> credentialList,
-            @NonNull Callback<byte[]> callback);
-
-    /**
      * @return An identifier for this RenderFrameHost.
      */
     GlobalRenderFrameHostId getGlobalRenderFrameHostId();
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn
index 7ac8f48..c01888b 100644
--- a/content/public/browser/BUILD.gn
+++ b/content/public/browser/BUILD.gn
@@ -547,7 +547,6 @@
       "android/synchronous_compositor.h",
       "android/synchronous_compositor_client.h",
       "ax_inspect_factory_android.cc",
-      "conditional_ui_delegate_android.h",
       "tts_environment_android.h",
     ]
   }
diff --git a/content/public/browser/conditional_ui_delegate_android.h b/content/public/browser/conditional_ui_delegate_android.h
deleted file mode 100644
index 74992bc19..0000000
--- a/content/public/browser/conditional_ui_delegate_android.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2022 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_PUBLIC_BROWSER_CONDITIONAL_UI_DELEGATE_ANDROID_H_
-#define CONTENT_PUBLIC_BROWSER_CONDITIONAL_UI_DELEGATE_ANDROID_H_
-
-#include <vector>
-
-#include "base/callback_forward.h"
-
-namespace device {
-class DiscoverableCredentialMetadata;
-}
-
-namespace content {
-
-// Interface for providing the embedder with a list of Web Authentication
-// credentials for use in Conditional UI.
-class ConditionalUiDelegateAndroid {
- public:
-  virtual ~ConditionalUiDelegateAndroid() = default;
-
-  // Called when a Web Authentication Conditional UI request is received. This
-  // provides the callback that will complete the request if and when a user
-  // selects a credential from a form autofill dialog.
-  virtual void OnWebAuthnRequestPending(
-      const std::vector<device::DiscoverableCredentialMetadata>& credentials,
-      base::OnceCallback<void(const std::vector<uint8_t>& id)> callback) = 0;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_PUBLIC_BROWSER_CONDITIONAL_UI_DELEGATE_ANDROID_H_
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index 7af8cfe6..82d33875 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -75,7 +75,6 @@
 #include "url/origin.h"
 
 #if BUILDFLAG(IS_ANDROID)
-#include "content/public/browser/conditional_ui_delegate_android.h"
 #include "content/public/browser/tts_environment_android.h"
 #endif
 
@@ -1357,11 +1356,4 @@
   return nullptr;
 }
 
-#if BUILDFLAG(IS_ANDROID)
-ConditionalUiDelegateAndroid* ContentBrowserClient::GetConditionalUiDelegate(
-    RenderFrameHost* host) {
-  return nullptr;
-}
-#endif
-
 }  // namespace content
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index d2c0f46..e2c88a7 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -64,10 +64,6 @@
 #include "ui/base/page_transition_types.h"
 #include "ui/base/window_open_disposition.h"
 
-#if BUILDFLAG(IS_ANDROID)
-#include "content/public/browser/conditional_ui_delegate_android.h"
-#endif
-
 #if (BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC)) || BUILDFLAG(IS_FUCHSIA)
 #include "base/posix/global_descriptors.h"
 #endif
@@ -2262,13 +2258,6 @@
   GetAlternativeErrorPageOverrideInfo(const GURL& url,
                                       BrowserContext* browser_context,
                                       int32_t error_code);
-
-#if BUILDFLAG(IS_ANDROID)
-  // Gets the delegate interface that is used to interact with the Web
-  // Authentication Conditional UI implementation in the embedder.
-  virtual ConditionalUiDelegateAndroid* GetConditionalUiDelegate(
-      RenderFrameHost* host);
-#endif  //  BUILDFLAG(IS_ANDROID)
 };
 
 }  // namespace content
diff --git a/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/mock/MockRenderFrameHost.java b/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/mock/MockRenderFrameHost.java
index eb71a6a..1c74295 100644
--- a/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/mock/MockRenderFrameHost.java
+++ b/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/mock/MockRenderFrameHost.java
@@ -10,7 +10,6 @@
 import org.chromium.content_public.browser.LifecycleState;
 import org.chromium.content_public.browser.PermissionsPolicyFeature;
 import org.chromium.content_public.browser.RenderFrameHost;
-import org.chromium.content_public.browser.WebAuthnCredentialDetails;
 import org.chromium.mojo.bindings.Interface;
 import org.chromium.url.GURL;
 import org.chromium.url.Origin;
@@ -91,10 +90,6 @@
     }
 
     @Override
-    public void onCredentialsDetailsListReceived(
-            List<WebAuthnCredentialDetails> credentialList, Callback<byte[]> callback) {}
-
-    @Override
     public GlobalRenderFrameHostId getGlobalRenderFrameHostId() {
         return new GlobalRenderFrameHostId(-1, -1);
     }
diff --git a/content/public/test/url_loader_interceptor.cc b/content/public/test/url_loader_interceptor.cc
index cdd1b42f..5f951b0 100644
--- a/content/public/test/url_loader_interceptor.cc
+++ b/content/public/test/url_loader_interceptor.cc
@@ -208,11 +208,6 @@
     original_client_->OnTransferSizeUpdated(transfer_size_diff);
   }
 
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override {
-    original_client_->OnStartLoadingResponseBody(std::move(body));
-  }
-
   void OnComplete(const network::URLLoaderCompletionStatus& status) override {
     if (!completion_status_callback_.is_null())
       completion_status_callback_.Run(request_url_, status);
@@ -590,10 +585,31 @@
         network::PopulateParsedHeaders(response->headers.get(), *url);
   }
   response->ssl_info = std::move(ssl_info);
-  client->OnReceiveResponse(std::move(response),
-                            mojo::ScopedDataPipeConsumerHandle());
 
-  CHECK_EQ(WriteResponseBody(body, client), MOJO_RESULT_OK);
+  mojo::ScopedDataPipeProducerHandle producer_handle;
+  mojo::ScopedDataPipeConsumerHandle consumer_handle;
+
+  MojoCreateDataPipeOptions options;
+  options.struct_size = sizeof(MojoCreateDataPipeOptions);
+  options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
+  options.element_num_bytes = 1;
+  options.capacity_num_bytes = body.size();
+
+  MojoResult result =
+      CreateDataPipe(&options, producer_handle, consumer_handle);
+  CHECK_EQ(result, MOJO_RESULT_OK);
+
+  uint32_t bytes_written = body.size();
+  result = producer_handle->WriteData(body.data(), &bytes_written,
+                                      MOJO_WRITE_DATA_FLAG_ALL_OR_NONE);
+  CHECK_EQ(result, MOJO_RESULT_OK);
+
+  client->OnReceiveResponse(std::move(response), std::move(consumer_handle));
+
+  network::URLLoaderCompletionStatus status;
+  status.decoded_body_length = body.size();
+  status.error_code = net::OK;
+  client->OnComplete(status);
 }
 
 void URLLoaderInterceptor::WriteResponse(
@@ -630,41 +646,6 @@
                 std::move(url));
 }
 
-MojoResult URLLoaderInterceptor::WriteResponseBody(
-    base::StringPiece body,
-    network::mojom::URLLoaderClient* client) {
-  mojo::ScopedDataPipeProducerHandle producer_handle;
-  mojo::ScopedDataPipeConsumerHandle consumer_handle;
-
-  MojoCreateDataPipeOptions options;
-  options.struct_size = sizeof(MojoCreateDataPipeOptions);
-  options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
-  options.element_num_bytes = 1;
-  options.capacity_num_bytes = body.size();
-
-  MojoResult result =
-      CreateDataPipe(&options, producer_handle, consumer_handle);
-  if (result != MOJO_RESULT_OK) {
-    return result;
-  }
-
-  uint32_t bytes_written = body.size();
-  result = producer_handle->WriteData(body.data(), &bytes_written,
-                                      MOJO_WRITE_DATA_FLAG_ALL_OR_NONE);
-  if (result != MOJO_RESULT_OK) {
-    return result;
-  }
-
-  client->OnStartLoadingResponseBody(std::move(consumer_handle));
-
-  network::URLLoaderCompletionStatus status;
-  status.decoded_body_length = body.size();
-  status.error_code = net::OK;
-  client->OnComplete(status);
-
-  return MOJO_RESULT_OK;
-}
-
 void URLLoaderInterceptor::CreateURLLoaderFactoryForRenderProcessHost(
     mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver,
     int process_id,
diff --git a/content/public/test/url_loader_interceptor.h b/content/public/test/url_loader_interceptor.h
index 98c9457..6f73d6c1 100644
--- a/content/public/test/url_loader_interceptor.h
+++ b/content/public/test/url_loader_interceptor.h
@@ -150,11 +150,6 @@
       absl::optional<net::SSLInfo> ssl_info = absl::nullopt,
       absl::optional<GURL> url = absl::nullopt);
 
-  // Attempts to write |body| to |client| and complete the load with status OK.
-  // client->OnReceiveResponse() must have been called prior to this.
-  static MojoResult WriteResponseBody(base::StringPiece body,
-                                      network::mojom::URLLoaderClient* client);
-
   // Returns an interceptor that (as long as it says alive) will intercept
   // requests to |url| and fail them using the provided |error|.
   // |ready_callback| is optional and avoids the use of RunLoop, see
diff --git a/content/renderer/service_worker/service_worker_subresource_loader.cc b/content/renderer/service_worker/service_worker_subresource_loader.cc
index 559b4d43..c0705edd 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader.cc
+++ b/content/renderer/service_worker/service_worker_subresource_loader.cc
@@ -19,7 +19,6 @@
 #include "net/base/net_errors.h"
 #include "net/url_request/redirect_util.h"
 #include "net/url_request/url_request.h"
-#include "services/network/public/cpp/features.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "services/network/public/mojom/early_hints.mojom.h"
 #include "services/network/public/mojom/url_response_head.mojom.h"
@@ -115,12 +114,6 @@
     url_loader_client_->OnTransferSizeUpdated(transfer_size_diff);
   }
 
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override {
-    DCHECK(url_loader_client_.is_bound());
-    url_loader_client_->OnStartLoadingResponseBody(std::move(body));
-  }
-
   void OnComplete(const network::URLLoaderCompletionStatus& status) override {
     DCHECK(url_loader_client_.is_bound());
     url_loader_client_->OnComplete(status);
@@ -594,23 +587,14 @@
 void ServiceWorkerSubresourceLoader::CommitResponseHeaders() {
   TransitionToStatus(Status::kSentHeader);
   DCHECK(url_loader_client_.is_bound());
-  if (base::FeatureList::IsEnabled(network::features::kCombineResponseBody))
-    return;  // Will be sent in CommitResponseBody.
-
-  // TODO(kinuko): Fill the ssl_info.
-  url_loader_client_->OnReceiveResponse(response_head_.Clone(),
-                                        mojo::ScopedDataPipeConsumerHandle());
 }
 
 void ServiceWorkerSubresourceLoader::CommitResponseBody(
     mojo::ScopedDataPipeConsumerHandle response_body) {
   TransitionToStatus(Status::kSentBody);
-  if (base::FeatureList::IsEnabled(network::features::kCombineResponseBody)) {
-    url_loader_client_->OnReceiveResponse(response_head_.Clone(),
-                                          std::move(response_body));
-  } else {
-    url_loader_client_->OnStartLoadingResponseBody(std::move(response_body));
-  }
+  // TODO(kinuko): Fill the ssl_info.
+  url_loader_client_->OnReceiveResponse(response_head_.Clone(),
+                                        std::move(response_body));
 }
 
 void ServiceWorkerSubresourceLoader::CommitEmptyResponseAndComplete() {
@@ -813,18 +797,12 @@
   DCHECK(!side_data_reading_complete_);
   side_data_reading_complete_ = true;
 
-  if (!base::FeatureList::IsEnabled(network::features::kCombineResponseBody) &&
-      metadata.has_value()) {
-    url_loader_client_->OnReceiveCachedMetadata(std::move(metadata.value()));
-  }
-
   DCHECK(data_pipe.is_valid());
   CommitResponseBody(std::move(data_pipe));
 
   // See https://crbug.com/1294238. The cached meta data needs to be sent after
   // the response head.
-  if (base::FeatureList::IsEnabled(network::features::kCombineResponseBody) &&
-      metadata.has_value()) {
+  if (metadata.has_value()) {
     url_loader_client_->OnReceiveCachedMetadata(std::move(metadata.value()));
   }
 
diff --git a/content/renderer/service_worker/service_worker_subresource_loader.h b/content/renderer/service_worker/service_worker_subresource_loader.h
index 463c7f7..3c854b3 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader.h
+++ b/content/renderer/service_worker/service_worker_subresource_loader.h
@@ -135,10 +135,9 @@
                                  absl::optional<mojo_base::BigBuffer> metadata);
   void OnBodyReadingComplete(int net_error);
 
-  // Calls url_loader_client_->OnReceiveResponse() with |response_head_|.
   void CommitResponseHeaders();
 
-  // Calls url_loader_client_->OnStartLoadingResponseBody() with
+  // Calls url_loader_client_->OnReceiveResponse() with |response_head_| and
   // |response_body|.
   void CommitResponseBody(mojo::ScopedDataPipeConsumerHandle response_body);
 
diff --git a/content/test/fake_network.cc b/content/test/fake_network.cc
index 1cf9669..6e4b769 100644
--- a/content/test/fake_network.cc
+++ b/content/test/fake_network.cc
@@ -104,8 +104,6 @@
   response->parsed_headers =
       network::PopulateParsedHeaders(info.headers.get(), url_request.url);
   mojo::Remote<network::mojom::URLLoaderClient>& client = params->client;
-  client->OnReceiveResponse(std::move(response),
-                            mojo::ScopedDataPipeConsumerHandle());
 
   uint32_t bytes_written = response_info.body.size();
   mojo::ScopedDataPipeProducerHandle producer_handle;
@@ -114,7 +112,7 @@
            mojo::CreateDataPipe(nullptr, producer_handle, consumer_handle));
   producer_handle->WriteData(response_info.body.data(), &bytes_written,
                              MOJO_WRITE_DATA_FLAG_ALL_OR_NONE);
-  client->OnStartLoadingResponseBody(std::move(consumer_handle));
+  client->OnReceiveResponse(std::move(response), std::move(consumer_handle));
 
   network::URLLoaderCompletionStatus status;
   status.error_code = response_info.error_code;
diff --git a/device/bluetooth/bluetooth_adapter_mac.h b/device/bluetooth/bluetooth_adapter_mac.h
index c17fded..73adfe3 100644
--- a/device/bluetooth/bluetooth_adapter_mac.h
+++ b/device/bluetooth/bluetooth_adapter_mac.h
@@ -37,13 +37,6 @@
 
 namespace device {
 
-// The 10.13 SDK deprecates the CBCentralManagerState enum, but marks the
-// replacement enum with limited availability, making it unusable. API methods
-// now return the new enum, so to compare enum values the new enum must be cast.
-// Wrap this in a function to obtain the state via a call to [manager state] to
-// avoid code that would use the replacement enum and trigger warnings.
-CBCentralManagerState GetCBManagerState(CBCentralManager* manager);
-
 class DEVICE_BLUETOOTH_EXPORT BluetoothAdapterMac
     : public BluetoothAdapter,
       public BluetoothDiscoveryManagerMac::Observer,
diff --git a/device/bluetooth/bluetooth_adapter_mac.mm b/device/bluetooth/bluetooth_adapter_mac.mm
index d342eb4..69e60d4 100644
--- a/device/bluetooth/bluetooth_adapter_mac.mm
+++ b/device/bluetooth/bluetooth_adapter_mac.mm
@@ -71,14 +71,6 @@
 
 namespace device {
 
-CBCentralManagerState GetCBManagerState(CBCentralManager* manager) {
-#if defined(MAC_OS_X_VERSION_10_13)
-  return static_cast<CBCentralManagerState>([manager state]);
-#else
-  return [manager state];
-#endif
-}
-
 // static
 scoped_refptr<BluetoothAdapter> BluetoothAdapter::CreateAdapter() {
   return BluetoothAdapterMac::CreateAdapter();
@@ -119,8 +111,7 @@
 }
 
 BluetoothAdapterMac::BluetoothAdapterMac()
-    : BluetoothAdapter(),
-      controller_state_function_(
+    : controller_state_function_(
           base::BindRepeating(&BluetoothAdapterMac::GetHostControllerState,
                               base::Unretained(this))),
       power_state_function_(
@@ -634,8 +625,7 @@
 }
 
 bool BluetoothAdapterMac::IsLowEnergyPowered() const {
-  return GetCBManagerState(low_energy_central_manager_) ==
-         CBCentralManagerStatePoweredOn;
+  return [low_energy_central_manager_ state] == CBManagerStatePoweredOn;
 }
 
 void BluetoothAdapterMac::LowEnergyDeviceUpdated(
@@ -750,19 +740,17 @@
   }
 }
 
-// TODO(crbug.com/511025): Handle state < CBCentralManagerStatePoweredOff.
 void BluetoothAdapterMac::LowEnergyCentralManagerUpdatedState() {
   DVLOG(1) << "Central manager state updated: "
            << [low_energy_central_manager_ state];
 
-  // A state with a value lower than CBCentralManagerStatePoweredOn implies that
+  // A state with a value lower than CBManagerStatePoweredOn implies that
   // scanning has stopped and that any connected peripherals have been
   // disconnected. Call DidDisconnectPeripheral manually to update the devices'
   // states since macOS doesn't call it.
   // See
   // https://developer.apple.com/reference/corebluetooth/cbcentralmanagerdelegate/1518888-centralmanagerdidupdatestate?language=objc
-  if (GetCBManagerState(low_energy_central_manager_) <
-      CBCentralManagerStatePoweredOn) {
+  if ([low_energy_central_manager_ state] < CBManagerStatePoweredOn) {
     DVLOG(1)
         << "Central no longer powered on. Notifying of device disconnection.";
     for (BluetoothDevice* device : GetDevices()) {
diff --git a/device/bluetooth/bluetooth_adapter_mac_unittest.mm b/device/bluetooth/bluetooth_adapter_mac_unittest.mm
index 2b194d2..72f751d 100644
--- a/device/bluetooth/bluetooth_adapter_mac_unittest.mm
+++ b/device/bluetooth/bluetooth_adapter_mac_unittest.mm
@@ -182,7 +182,7 @@
     return (device != NULL);
   }
 
-  bool SetMockCentralManager(CBCentralManagerState desired_state) {
+  bool SetMockCentralManager(CBManagerState desired_state) {
     mock_central_manager_.reset([[MockCentralManager alloc] init]);
     [mock_central_manager_ setState:desired_state];
     CBCentralManager* centralManager =
@@ -268,7 +268,7 @@
 }
 
 TEST_F(BluetoothAdapterMacTest, AddDiscoverySessionWithLowEnergyFilter) {
-  if (!SetMockCentralManager(CBCentralManagerStatePoweredOn))
+  if (!SetMockCentralManager(CBManagerStatePoweredOn))
     return;
   EXPECT_EQ(0, [mock_central_manager_ scanForPeripheralsCallCount]);
   EXPECT_EQ(0, NumDiscoverySessions());
@@ -297,7 +297,7 @@
 // TODO(krstnmnlsn): Test changing the filter when adding the second discovery
 // session (once we have that ability).
 TEST_F(BluetoothAdapterMacTest, AddSecondDiscoverySessionWithLowEnergyFilter) {
-  if (!SetMockCentralManager(CBCentralManagerStatePoweredOn))
+  if (!SetMockCentralManager(CBManagerStatePoweredOn))
     return;
   std::unique_ptr<BluetoothDiscoveryFilter> discovery_filter(
       new BluetoothDiscoveryFilter(BLUETOOTH_TRANSPORT_LE));
@@ -341,7 +341,7 @@
 }
 
 TEST_F(BluetoothAdapterMacTest, RemoveDiscoverySessionWithLowEnergyFilter) {
-  if (!SetMockCentralManager(CBCentralManagerStatePoweredOn))
+  if (!SetMockCentralManager(CBManagerStatePoweredOn))
     return;
   EXPECT_EQ(0, [mock_central_manager_ scanForPeripheralsCallCount]);
 
@@ -376,7 +376,7 @@
 }
 
 TEST_F(BluetoothAdapterMacTest, CheckGetPeripheralHashAddress) {
-  if (!SetMockCentralManager(CBCentralManagerStatePoweredOn))
+  if (!SetMockCentralManager(CBManagerStatePoweredOn))
     return;
   base::scoped_nsobject<CBPeripheral> mock_peripheral(
       CreateMockPeripheral(kTestNSUUID));
@@ -386,7 +386,7 @@
 }
 
 TEST_F(BluetoothAdapterMacTest, LowEnergyDeviceUpdatedNewDevice) {
-  if (!SetMockCentralManager(CBCentralManagerStatePoweredOn))
+  if (!SetMockCentralManager(CBManagerStatePoweredOn))
     return;
   base::scoped_nsobject<CBPeripheral> mock_peripheral(
       CreateMockPeripheral(kTestNSUUID));
@@ -450,7 +450,7 @@
 
   const char kTestAddedDeviceNSUUID[] = "E7F8589A-A7D9-4B94-9A08-D89076A159F4";
 
-  ASSERT_TRUE(SetMockCentralManager(CBCentralManagerStatePoweredOn));
+  ASSERT_TRUE(SetMockCentralManager(CBManagerStatePoweredOn));
 
   base::scoped_nsobject<CBPeripheral> mock_peripheral_one(
       CreateMockPeripheral(kTestNSUUID));
@@ -499,7 +499,7 @@
       "</dict>"
       "</plist>";
 
-  if (!SetMockCentralManager(CBCentralManagerStatePoweredOn))
+  if (!SetMockCentralManager(CBManagerStatePoweredOn))
     return;
 
   base::scoped_nsobject<CBPeripheral> mock_peripheral(
diff --git a/device/bluetooth/bluetooth_low_energy_advertisement_manager_mac.h b/device/bluetooth/bluetooth_low_energy_advertisement_manager_mac.h
index f660ffa..a97a8df 100644
--- a/device/bluetooth/bluetooth_low_energy_advertisement_manager_mac.h
+++ b/device/bluetooth/bluetooth_low_energy_advertisement_manager_mac.h
@@ -50,8 +50,6 @@
  private:
   void StartAdvertising();
 
-  CBPeripheralManagerState GetPeripheralManagerState();
-
   scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
 
   CBPeripheralManager* peripheral_manager_;
diff --git a/device/bluetooth/bluetooth_low_energy_advertisement_manager_mac.mm b/device/bluetooth/bluetooth_low_energy_advertisement_manager_mac.mm
index a594b93..16db0b7 100644
--- a/device/bluetooth/bluetooth_low_energy_advertisement_manager_mac.mm
+++ b/device/bluetooth/bluetooth_low_energy_advertisement_manager_mac.mm
@@ -42,18 +42,18 @@
     return;
   }
 
-  CBPeripheralManagerState adapter_state = GetPeripheralManagerState();
-  if (adapter_state == CBPeripheralManagerStateUnknown) {
+  CBManagerState adapter_state = [peripheral_manager_ state];
+  if (adapter_state == CBManagerStateUnknown) {
     // Wait for the adapter to initialize.
     return;
   }
 
   if (active_advertisement_->is_waiting_for_adapter() &&
-      adapter_state < CBPeripheralManagerStatePoweredOn) {
+      adapter_state < CBManagerStatePoweredOn) {
     DVLOG(1)
         << "Registration failed. Adapter changed to invalid adapter_state.";
     BluetoothAdvertisement::ErrorCode error_code =
-        adapter_state == CBPeripheralManagerStatePoweredOff
+        adapter_state == CBManagerStatePoweredOff
             ? BluetoothAdvertisement::ERROR_ADAPTER_POWERED_OFF
             : BluetoothAdvertisement::ERROR_UNSUPPORTED_PLATFORM;
     active_advertisement_->OnAdvertisementError(ui_task_runner_.get(),
@@ -63,7 +63,7 @@
   }
 
   if (active_advertisement_->is_advertising() &&
-      adapter_state == CBPeripheralManagerStateResetting) {
+      adapter_state == CBManagerStateResetting) {
     DVLOG(1) << "Adapter resetting. Invalidating advertisement.";
     active_advertisement_->OnAdapterReset();
     active_advertisement_ = nullptr;
@@ -71,7 +71,7 @@
   }
 
   if (active_advertisement_->is_advertising() &&
-      adapter_state == CBPeripheralManagerStatePoweredOff) {
+      adapter_state == CBManagerStatePoweredOff) {
     DVLOG(1) << "Adapter powered off. Stopping advertisement.";
     // Note: we purposefully don't unregister the active advertisement for
     // consistency with ChromeOS. The caller must manually unregister
@@ -174,15 +174,4 @@
   active_advertisement_->OnAdvertisementSuccess(ui_task_runner_.get());
 }
 
-CBPeripheralManagerState
-BluetoothLowEnergyAdvertisementManagerMac::GetPeripheralManagerState() {
-#if defined(MAC_OS_X_VERSION_10_13)
-  // The state enum of this API changed in SDK 10.13, so for backwards
-  // compatibility, we need to cast the state to a CBPeripheralManagerState.
-  return static_cast<CBPeripheralManagerState>([peripheral_manager_ state]);
-#else
-  return [peripheral_manager_ state];
-#endif
-}
-
 }  // device
diff --git a/device/bluetooth/bluetooth_low_energy_advertisement_manager_mac_unittest.mm b/device/bluetooth/bluetooth_low_energy_advertisement_manager_mac_unittest.mm
index 72d24d9a..456855dd 100644
--- a/device/bluetooth/bluetooth_low_energy_advertisement_manager_mac_unittest.mm
+++ b/device/bluetooth/bluetooth_low_energy_advertisement_manager_mac_unittest.mm
@@ -26,7 +26,7 @@
  public:
   BluetoothLowEnergyAdvertisementManagerMacTest()
       : ui_task_runner_(new base::TestSimpleTaskRunner()),
-        peripheral_manager_state_(CBPeripheralManagerStatePoweredOn),
+        peripheral_manager_state_(CBManagerStatePoweredOn),
         unregister_success_(false) {}
 
   void SetUp() override {
@@ -104,7 +104,7 @@
   BluetoothLowEnergyAdvertisementManagerMac advertisement_manager_;
   CBPeripheralManager* peripheral_manager_;
   id peripheral_manager_mock_;
-  CBPeripheralManagerState peripheral_manager_state_;
+  CBManagerState peripheral_manager_state_;
 
   scoped_refptr<BluetoothAdvertisement> advertisement_;
   std::unique_ptr<BluetoothAdvertisement::ErrorCode> registration_error_;
@@ -116,7 +116,7 @@
 TEST_F(BluetoothLowEnergyAdvertisementManagerMacTest,
        Register_AdapterPoweredOff) {
   // Simulate adapter being powered off.
-  peripheral_manager_state_ = CBPeripheralManagerStatePoweredOff;
+  peripheral_manager_state_ = CBManagerStatePoweredOff;
 
   RegisterAdvertisement(CreateAdvertisementData());
   ui_task_runner_->RunPendingTasks();
@@ -130,7 +130,7 @@
 TEST_F(BluetoothLowEnergyAdvertisementManagerMacTest,
        Register_AdapterInitializing_ThenUnsupported) {
   // Simulate adapter state being unknown and is initializing.
-  peripheral_manager_state_ = CBPeripheralManagerStateUnknown;
+  peripheral_manager_state_ = CBManagerStateUnknown;
 
   // The advertisement will not start or fail until the adapter state is
   // initialized.
@@ -139,9 +139,9 @@
   EXPECT_FALSE(advertisement_);
   EXPECT_FALSE(registration_error_);
 
-  // Change the adapter state to CBPeripheralManagerStateUnsupported, which
-  // causes the registration to fail.
-  peripheral_manager_state_ = CBPeripheralManagerStateUnsupported;
+  // Change the adapter state to CBManagerStateUnsupported, which causes the
+  // registration to fail.
+  peripheral_manager_state_ = CBManagerStateUnsupported;
   advertisement_manager_.OnPeripheralManagerStateChanged();
   ui_task_runner_->RunPendingTasks();
   EXPECT_FALSE(advertisement_);
@@ -153,7 +153,7 @@
 TEST_F(BluetoothLowEnergyAdvertisementManagerMacTest,
        Register_AdapterInitializing_ThenPoweredOff) {
   // Simulate adapter state being unknown and is initializing.
-  peripheral_manager_state_ = CBPeripheralManagerStateUnknown;
+  peripheral_manager_state_ = CBManagerStateUnknown;
 
   // The advertisement will not start or fail until the adapter state is
   // initialized.
@@ -162,9 +162,9 @@
   EXPECT_FALSE(advertisement_);
   EXPECT_FALSE(registration_error_);
 
-  // Change the adapter state to CBPeripheralManagerStatePoweredOff, which
-  // causes the registration to fail.
-  peripheral_manager_state_ = CBPeripheralManagerStatePoweredOff;
+  // Change the adapter state to CBManagerStatePoweredOff, which causes the
+  // registration to fail.
+  peripheral_manager_state_ = CBManagerStatePoweredOff;
   advertisement_manager_.OnPeripheralManagerStateChanged();
   ui_task_runner_->RunPendingTasks();
   EXPECT_FALSE(advertisement_);
@@ -283,10 +283,10 @@
   EXPECT_TRUE(advertisement_);
 
   // Reset the adapter (i.e. on system crash).
-  peripheral_manager_state_ = CBPeripheralManagerStateResetting;
+  peripheral_manager_state_ = CBManagerStateResetting;
   advertisement_manager_.OnPeripheralManagerStateChanged();
   advertisement_ = nullptr;
-  peripheral_manager_state_ = CBPeripheralManagerStatePoweredOn;
+  peripheral_manager_state_ = CBManagerStatePoweredOn;
 
   // Registering another advertisement should succeed.
   OCMExpect([peripheral_manager_ startAdvertising:[OCMArg any]]);
@@ -307,14 +307,14 @@
 
   // Power off the adapter. Advertisement should be stopped.
   OCMExpect([peripheral_manager_ stopAdvertising]);
-  peripheral_manager_state_ = CBPeripheralManagerStatePoweredOff;
+  peripheral_manager_state_ = CBManagerStatePoweredOff;
   advertisement_manager_.OnPeripheralManagerStateChanged();
   [peripheral_manager_mock_ verifyAtLocation:nil];
 
   // Register a new advertisement after powering back on the adapter.
   // This should fail as the caller needs to manually unregister the
   // advertisement.
-  peripheral_manager_state_ = CBPeripheralManagerStatePoweredOn;
+  peripheral_manager_state_ = CBManagerStatePoweredOn;
   advertisement_ = nullptr;
   RegisterAdvertisement(CreateAdvertisementData());
   ui_task_runner_->RunPendingTasks();
diff --git a/device/bluetooth/bluetooth_low_energy_discovery_manager_mac.mm b/device/bluetooth/bluetooth_low_energy_discovery_manager_mac.mm
index e9ca2815..c4a22d5 100644
--- a/device/bluetooth/bluetooth_low_energy_discovery_manager_mac.mm
+++ b/device/bluetooth/bluetooth_low_energy_discovery_manager_mac.mm
@@ -46,8 +46,8 @@
     return;
   }
 
-  if (GetCBManagerState(central_manager_) != CBCentralManagerStatePoweredOn) {
-    DVLOG(1) << "TryStartDiscovery != CBCentralManagerStatePoweredOn";
+  if ([central_manager_ state] != CBManagerStatePoweredOn) {
+    DVLOG(1) << "TryStartDiscovery != CBManagerStatePoweredOn";
     return;
   }
 
diff --git a/device/bluetooth/test/bluetooth_test_mac.mm b/device/bluetooth/test/bluetooth_test_mac.mm
index 631fc0c..c0b12111 100644
--- a/device/bluetooth/test/bluetooth_test_mac.mm
+++ b/device/bluetooth/test/bluetooth_test_mac.mm
@@ -126,7 +126,7 @@
   mock_central_manager_ = std::make_unique<ScopedMockCentralManager>(
       [[MockCentralManager alloc] init]);
   [mock_central_manager_->get() setBluetoothTestMac:this];
-  [mock_central_manager_->get() setState:CBCentralManagerStateUnsupported];
+  [mock_central_manager_->get() setState:CBManagerStateUnsupported];
   adapter_mac_->SetCentralManagerForTesting((id)mock_central_manager_->get());
 }
 
@@ -140,7 +140,7 @@
   mock_central_manager_ = std::make_unique<ScopedMockCentralManager>(
       [[MockCentralManager alloc] init]);
   mock_central_manager_->get().bluetoothTestMac = this;
-  [mock_central_manager_->get() setState:CBCentralManagerStatePoweredOn];
+  [mock_central_manager_->get() setState:CBManagerStatePoweredOn];
   adapter_mac_->SetCentralManagerForTesting((id)mock_central_manager_->get());
   adapter_mac_->SetPowerStateFunctionForTesting(base::BindRepeating(
       &BluetoothTestMac::SetMockControllerPowerState, base::Unretained(this)));
@@ -153,7 +153,7 @@
 }
 
 void BluetoothTestMac::SimulateAdapterPoweredOff() {
-  [mock_central_manager_->get() setState:CBCentralManagerStatePoweredOff];
+  [mock_central_manager_->get() setState:CBManagerStatePoweredOff];
 
   for (BluetoothDevice* device : adapter_->GetDevices()) {
     MockCBPeripheral* peripheral_mock = GetMockCBPeripheral(device);
@@ -639,9 +639,8 @@
             auto* mock_central_manager =
                 base::mac::ObjCCastStrict<MockCentralManager>(
                     adapter_mac->GetCentralManager());
-            [mock_central_manager
-                setState:powered ? CBCentralManagerStatePoweredOn
-                                 : CBCentralManagerStatePoweredOff];
+            [mock_central_manager setState:powered ? CBManagerStatePoweredOn
+                                                   : CBManagerStatePoweredOff];
             [mock_central_manager.delegate
                 centralManagerDidUpdateState:adapter_mac->GetCentralManager()];
             // On real devices, the Bluetooth classic code will call
diff --git a/device/bluetooth/test/mock_bluetooth_central_manager_mac.h b/device/bluetooth/test/mock_bluetooth_central_manager_mac.h
index 15100f64..7e4746d 100644
--- a/device/bluetooth/test/mock_bluetooth_central_manager_mac.h
+++ b/device/bluetooth/test/mock_bluetooth_central_manager_mac.h
@@ -21,7 +21,7 @@
 @property(nonatomic, assign) NSInteger scanForPeripheralsCallCount;
 @property(nonatomic, assign) NSInteger stopScanCallCount;
 @property(nonatomic, assign) id<CBCentralManagerDelegate> delegate;
-@property(nonatomic, assign) CBCentralManagerState state;
+@property(nonatomic, assign) CBManagerState state;
 @property(nonatomic, assign) device::BluetoothTestMac* bluetoothTestMac;
 @property(nonatomic, readonly) NSArray* retrieveConnectedPeripheralServiceUUIDs;
 
diff --git a/docs/android_isolated_splits.md b/docs/android_isolated_splits.md
index fd9564d1..48cad9e 100644
--- a/docs/android_isolated_splits.md
+++ b/docs/android_isolated_splits.md
@@ -141,6 +141,18 @@
 
 [b/171269960]: https://issuetracker.google.com/171269960
 
+### System.loadLibrary() Broken for Libraries in Splits on System Image
+
+Also tracked by [b/171269960], Android's linker config (`ld.config.txt`) sets
+`permitted_paths="/data:/mnt/expand"`, and then adds the app's `.apk` to an
+allowlist. This allowlist does not contain apk splits, so library loading is
+blocked by `permitted_paths` when the splits live on the `/system` partition.
+
+**Work-around:**
+
+Use compressed system image stubs (`.apk.gz` and `-Stub.apk`) so that Chrome is
+extracted to the `/data` partition upon boot.
+
 ### Too Many Splits Break App Zygote
 
 Starting with Android Q / TriChrome, Chrome uses an [Application Zygote]. As
diff --git a/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc b/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc
index ed7ddcc6..d3b8fc56 100644
--- a/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc
+++ b/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc
@@ -481,19 +481,6 @@
   target_client_->OnTransferSizeUpdated(transfer_size_diff);
 }
 
-void WebRequestProxyingURLLoaderFactory::InProgressRequest::
-    OnStartLoadingResponseBody(mojo::ScopedDataPipeConsumerHandle body) {
-  TRACE_EVENT_WITH_FLOW0(
-      "extensions",
-      "WebRequestProxyingURLLoaderFactory::InProgressRequest::"
-      "OnStartLoadingResponseBody",
-      TRACE_ID_WITH_SCOPE(kWebRequestProxyingURLLoaderFactoryScope,
-                          TRACE_ID_LOCAL(request_id_)),
-      TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
-
-  target_client_->OnStartLoadingResponseBody(std::move(body));
-}
-
 void WebRequestProxyingURLLoaderFactory::InProgressRequest::OnComplete(
     const network::URLLoaderCompletionStatus& status) {
   TRACE_EVENT_WITH_FLOW2(
diff --git a/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.h b/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.h
index 10a7ca6..858b6121 100644
--- a/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.h
+++ b/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.h
@@ -118,8 +118,6 @@
                           OnUploadProgressCallback callback) override;
     void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
     void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-    void OnStartLoadingResponseBody(
-        mojo::ScopedDataPipeConsumerHandle body) override;
     void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
     void HandleAuthRequest(
diff --git a/extensions/browser/extension_protocols.cc b/extensions/browser/extension_protocols.cc
index ab57cb7..0efb441 100644
--- a/extensions/browser/extension_protocols.cc
+++ b/extensions/browser/extension_protocols.cc
@@ -92,7 +92,6 @@
 #include "net/http/http_response_headers.h"
 #include "net/http/http_response_info.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
-#include "services/network/public/cpp/features.h"
 #include "services/network/public/cpp/resource_request.h"
 #include "services/network/public/cpp/self_deleting_url_loader_factory.h"
 #include "services/network/public/cpp/url_loader_completion_status.h"
@@ -160,11 +159,6 @@
     real_client_->OnTransferSizeUpdated(transfer_size_diff);
   }
 
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override {
-    real_client_->OnStartLoadingResponseBody(std::move(body));
-  }
-
   void OnComplete(const network::URLLoaderCompletionStatus& status) override {
     RecordExtensionResourceAccessResult(
         ukm_source_id_, url_,
@@ -727,13 +721,7 @@
       return;
     }
 
-    if (base::FeatureList::IsEnabled(network::features::kCombineResponseBody)) {
-      client_->OnReceiveResponse(std::move(head), std::move(consumer_handle));
-    } else {
-      client_->OnReceiveResponse(std::move(head),
-                                 mojo::ScopedDataPipeConsumerHandle());
-      client_->OnStartLoadingResponseBody(std::move(consumer_handle));
-    }
+    client_->OnReceiveResponse(std::move(head), std::move(consumer_handle));
 
     CompleteRequestAndDeleteThis(net::OK);
   }
diff --git a/extensions/renderer/resources/web_request_event.js b/extensions/renderer/resources/web_request_event.js
index 833b0b63..265c9fa 100644
--- a/extensions/renderer/resources/web_request_event.js
+++ b/extensions/renderer/resources/web_request_event.js
@@ -7,10 +7,24 @@
 var utils = require('utils');
 var webRequestInternal = getInternalApi('webRequestInternal');
 
-function getUniqueSubEventName(eventName) {
+function getGloballyUniqueSubEventName(eventName) {
   return eventName + '/' + idGeneratorNatives.GetNextId();
 }
 
+function getScopedUniqueSubEventName(eventName) {
+  return eventName + '/' + idGeneratorNatives.GetNextScopedId();
+}
+
+// Sub-event names for webviews must use a global ID since there may be
+// multiple webviews in an app, each with its own ScriptContext. See
+// crbug.com/1309302.
+function getUniqueSubEventName(eventName, forWebview) {
+  if (forWebview)
+    return getGloballyUniqueSubEventName(eventName);
+
+  return getScopedUniqueSubEventName(eventName);
+}
+
 // WebRequestEventImpl object. This is used for special webRequest events
 // with extra parameters. Each invocation of addListener creates a new named
 // sub-event. That sub-event is associated with the extra parameters in the
@@ -56,7 +70,8 @@
   // NOTE(benjhayden) New APIs should not use this subEventName trick! It does
   // not play well with event pages. See downloads.onDeterminingFilename and
   // ExtensionDownloadsEventRouter for an alternative approach.
-  var subEventName = getUniqueSubEventName(this.eventName);
+  var subEventName = getUniqueSubEventName(this.eventName,
+                                           this.webViewInstanceId != 0);
   // Note: this could fail to validate, in which case we would not add the
   // subEvent listener.
   bindingUtil.validateCustomSignature(this.eventName,
diff --git a/extensions/test/extension_test_message_listener.cc b/extensions/test/extension_test_message_listener.cc
index c560ab6..7edc71a 100644
--- a/extensions/test/extension_test_message_listener.cc
+++ b/extensions/test/extension_test_message_listener.cc
@@ -12,18 +12,30 @@
 
 ExtensionTestMessageListener::ExtensionTestMessageListener(
     const std::string& expected_message,
-    bool will_reply)
-    : expected_message_(expected_message), will_reply_(will_reply) {
+    ReplyBehavior reply_behavior)
+    : expected_message_(expected_message), reply_behavior_(reply_behavior) {
   test_api_observation_.Observe(
       extensions::TestApiObserverRegistry::GetInstance());
 }
 
-ExtensionTestMessageListener::ExtensionTestMessageListener(bool will_reply)
-    : will_reply_(will_reply) {
+ExtensionTestMessageListener::ExtensionTestMessageListener(
+    ReplyBehavior reply_behavior)
+    : reply_behavior_(reply_behavior) {
   test_api_observation_.Observe(
       extensions::TestApiObserverRegistry::GetInstance());
 }
 
+ExtensionTestMessageListener::ExtensionTestMessageListener(
+    const std::string& expected_message,
+    bool will_reply)
+    : ExtensionTestMessageListener(
+          expected_message,
+          will_reply ? ReplyBehavior::kWillReply : ReplyBehavior::kWontReply) {}
+
+ExtensionTestMessageListener::ExtensionTestMessageListener(bool will_reply)
+    : ExtensionTestMessageListener(will_reply ? ReplyBehavior::kWillReply
+                                              : ReplyBehavior::kWontReply) {}
+
 ExtensionTestMessageListener::~ExtensionTestMessageListener() {
   DCHECK(!function_) << "MessageListener did not reply, but signaled it would.";
 }
@@ -100,7 +112,7 @@
     failed_ = is_failure_message;
     had_user_gesture_ = function->user_gesture();
 
-    if (will_reply_) {
+    if (reply_behavior_ == ReplyBehavior::kWillReply) {
       listener_will_respond = true;
       function_ = function;
     }
diff --git a/extensions/test/extension_test_message_listener.h b/extensions/test/extension_test_message_listener.h
index 2a958c0..629709de 100644
--- a/extensions/test/extension_test_message_listener.h
+++ b/extensions/test/extension_test_message_listener.h
@@ -27,7 +27,7 @@
 // This class helps us wait for incoming messages sent from javascript via
 // chrome.test.sendMessage(). A sample usage would be:
 //
-//   ExtensionTestMessageListener listener("foo", false);  // won't reply
+//   ExtensionTestMessageListener listener("foo");
 //   ... do some work
 //   ASSERT_TRUE(listener.WaitUntilSatisfied());
 //
@@ -35,8 +35,8 @@
 // useful for coordinating multiple pages/processes and having them wait on
 // each other. Example:
 //
-//   ExtensionTestMessageListener listener1("foo1", true);  // will reply
-//   ExtensionTestMessageListener listener2("foo2", true);  // will reply
+//   ExtensionTestMessageListener listener1("foo1", ReplyBehavior::kWillReply);
+//   ExtensionTestMessageListener listener2("foo2", ReplyBehavior::kWillReply);
 //   ASSERT_TRUE(listener1.WaitUntilSatisfied());
 //   ASSERT_TRUE(listener2.WaitUntilSatisfied());
 //   ... do some work
@@ -78,7 +78,7 @@
 // A callback can be set to react to a message from an extension, instead of
 // manually waiting.
 //
-//   ExtensionTestMessageListener listener("do_something", false);
+//   ExtensionTestMessageListener listener("do_something");
 //   listener.SetOnSatisfied(base::BindOnce(&DoSomething));
 //   ... run test
 //   // SetOnRepeatedlySatisfied could be used if the message is expected
@@ -86,7 +86,7 @@
 //
 // Finally, you can reset the listener to reuse it.
 //
-//   ExtensionTestMessageListener listener(true);  // will reply
+//   ExtensionTestMessageListener listener(ReplyBehavior::kWillReply);
 //   ASSERT_TRUE(listener.WaitUntilSatisfied());
 //   while (listener.message() != "end") {
 //     Handle(listener.message());
@@ -100,12 +100,35 @@
 // either make it a local variable inside your test body, or if it's a member
 // variable of a ExtensionBrowserTest subclass, override the
 // BrowserTestBase::TearDownOnMainThread() method and clean it up there.
+
+// The behavior specifying whether the listener will reply to the
+// incoming message. This is defined outside the class simply to save authors
+// from typing out ExtensionTestMessageListener::ReplyBehavior::kWillReply.
+enum class ReplyBehavior {
+  // The listener will reply. The extension API callback will not be
+  // triggered until `ExtensionTestMessageListener::Reply()` is called.
+  kWillReply,
+  // The listener won't reply with a custom message. The extension API
+  // callback is triggered automatically.
+  kWontReply,
+};
+
 class ExtensionTestMessageListener : public extensions::TestApiObserver {
  public:
-  // We immediately start listening for |expected_message|.
+  // Listen for the `expected_message` with the specified `reply_behavior`.
+  explicit ExtensionTestMessageListener(
+      const std::string& expected_message,
+      ReplyBehavior reply_behavior = ReplyBehavior::kWontReply);
+  // Construct a message listener which will listen for any message with
+  // the specified `reply_behavior`.
+  explicit ExtensionTestMessageListener(
+      ReplyBehavior reply_behavior = ReplyBehavior::kWontReply);
+
+  // DEPRECATED.
+  // TODO(https://crbug.com/1324791): Convert all callers to the above
+  // constructors and remove these.
   ExtensionTestMessageListener(const std::string& expected_message,
                                bool will_reply);
-  // Construct a message listener which will listen for any message.
   explicit ExtensionTestMessageListener(bool will_reply);
 
   ~ExtensionTestMessageListener() override;
@@ -185,9 +208,8 @@
   base::OnceCallback<OnSatisfiedSignature> on_satisfied_;
   base::RepeatingCallback<OnSatisfiedSignature> on_repeatedly_satisfied_;
 
-  // If true, we expect the calling code to manually send a reply. Otherwise,
-  // we send an automatic empty reply to the extension.
-  const bool will_reply_;
+  // Whether the listener will send an explicit reply via `Reply()`.
+  const ReplyBehavior reply_behavior_;
 
   // The extension id that we listen for, or empty.
   std::string extension_id_;
diff --git a/fuchsia/engine/browser/content_directory_loader_factory.cc b/fuchsia/engine/browser/content_directory_loader_factory.cc
index 59708722..ac395266 100644
--- a/fuchsia/engine/browser/content_directory_loader_factory.cc
+++ b/fuchsia/engine/browser/content_directory_loader_factory.cc
@@ -230,8 +230,6 @@
     response->mime_type = *mime_type;
     response->headers = CreateHeaders(*mime_type, charset);
     response->content_length = content_length;
-    client_->OnReceiveResponse(std::move(response),
-                               mojo::ScopedDataPipeConsumerHandle());
 
     // Set up the Mojo DataPipe used for streaming the response payload to the
     // client.
@@ -244,7 +242,7 @@
       return;
     }
 
-    client_->OnStartLoadingResponseBody(std::move(consumer_handle));
+    client_->OnReceiveResponse(std::move(response), std::move(consumer_handle));
 
     // Start reading the contents of |mmap_| into the response DataPipe.
     body_writer_ =
diff --git a/google_apis/gaia/gaia_auth_fetcher.cc b/google_apis/gaia/gaia_auth_fetcher.cc
index 5c29db8..11454f05 100644
--- a/google_apis/gaia/gaia_auth_fetcher.cc
+++ b/google_apis/gaia/gaia_auth_fetcher.cc
@@ -298,9 +298,8 @@
   original_url_ = gaia_gurl;
 
   if (credentials_mode != network::mojom::CredentialsMode::kOmit) {
-    DCHECK_EQ(GaiaUrls::GetInstance()->gaia_url(),
-              gaia_gurl.DeprecatedGetOriginAsURL())
-        << gaia_gurl;
+    CHECK(gaia::HasGaiaSchemeHostPort(gaia_gurl)) << gaia_gurl;
+
     url::Origin origin = GaiaUrls::GetInstance()->gaia_origin();
     resource_request->site_for_cookies =
         net::SiteForCookies::FromOrigin(origin);
diff --git a/google_apis/gaia/gaia_auth_util.cc b/google_apis/gaia/gaia_auth_util.cc
index d01a972a..89001f0 100644
--- a/google_apis/gaia/gaia_auth_util.cc
+++ b/google_apis/gaia/gaia_auth_util.cc
@@ -105,11 +105,9 @@
 }
 
 bool HasGaiaSchemeHostPort(const GURL& url) {
-  if (!url.SchemeIsCryptographic())
-    return false;
-
   const url::Origin& gaia_origin = GaiaUrls::GetInstance()->gaia_origin();
   CHECK(!gaia_origin.opaque());
+  CHECK(gaia_origin.GetURL().SchemeIsHTTPOrHTTPS());
 
   const url::SchemeHostPort& gaia_scheme_host_port =
       gaia_origin.GetTupleOrPrecursorTupleIfOpaque();
diff --git a/infra/config/generated/builders/ci/Linux ChromiumOS MSan Builder/properties.json b/infra/config/generated/builders/ci/Linux ChromiumOS MSan Builder/properties.json
index aed0bc6..cbdc076 100644
--- a/infra/config/generated/builders/ci/Linux ChromiumOS MSan Builder/properties.json
+++ b/infra/config/generated/builders/ci/Linux ChromiumOS MSan Builder/properties.json
@@ -1,4 +1,89 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Linux ChromiumOS MSan Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-memory-archive",
+              "builder_group": "chromium.memory",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium_msan",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "chromeos"
+                ],
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Linux ChromiumOS MSan Tests",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-memory-archive",
+              "builder_group": "chromium.memory",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium_msan",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "chromeos"
+                ],
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Linux ChromiumOS MSan Builder",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "Linux ChromiumOS MSan Builder",
+          "project": "chromium"
+        }
+      ],
+      "builder_ids_in_scope_for_testing": [
+        {
+          "bucket": "ci",
+          "builder": "Linux ChromiumOS MSan Tests",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "linux_chromium_chromeos_msan_rel_ng",
+          "group": "tryserver.chromium.linux"
+        }
+      ]
+    }
+  },
   "$build/reclient": {
     "instance": "rbe-chromium-trusted",
     "jobs": 500,
diff --git a/infra/config/generated/builders/ci/Linux ChromiumOS MSan Tests/properties.json b/infra/config/generated/builders/ci/Linux ChromiumOS MSan Tests/properties.json
index fd741b6..433e0461 100644
--- a/infra/config/generated/builders/ci/Linux ChromiumOS MSan Tests/properties.json
+++ b/infra/config/generated/builders/ci/Linux ChromiumOS MSan Tests/properties.json
@@ -1,4 +1,82 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Linux ChromiumOS MSan Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-memory-archive",
+              "builder_group": "chromium.memory",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium_msan",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "chromeos"
+                ],
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Linux ChromiumOS MSan Tests",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-memory-archive",
+              "builder_group": "chromium.memory",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium_msan",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "chromeos"
+                ],
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Linux ChromiumOS MSan Builder",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "Linux ChromiumOS MSan Tests",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "linux_chromium_chromeos_msan_rel_ng",
+          "group": "tryserver.chromium.linux"
+        }
+      ]
+    }
+  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/Network Service Linux/properties.json b/infra/config/generated/builders/ci/Network Service Linux/properties.json
index 8d13aab7..9ad182d7 100644
--- a/infra/config/generated/builders/ci/Network Service Linux/properties.json
+++ b/infra/config/generated/builders/ci/Network Service Linux/properties.json
@@ -1,4 +1,51 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Network Service Linux",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-linux-archive",
+              "builder_group": "chromium.linux",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "enable_reclient"
+                ],
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "Network Service Linux",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "network_service_linux",
+          "group": "tryserver.chromium.linux"
+        }
+      ]
+    }
+  },
   "$build/reclient": {
     "instance": "rbe-chromium-trusted",
     "jobs": 250,
diff --git a/infra/config/generated/builders/ci/WebKit Win10/properties.json b/infra/config/generated/builders/ci/WebKit Win10/properties.json
index ccc0012..c1c172d 100644
--- a/infra/config/generated/builders/ci/WebKit Win10/properties.json
+++ b/infra/config/generated/builders/ci/WebKit Win10/properties.json
@@ -1,4 +1,78 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "WebKit Win10",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win Builder",
+                "project": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "WebKit Win10",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "win_chromium_compile_rel_ng",
+          "group": "tryserver.chromium.win"
+        }
+      ]
+    }
+  },
   "$build/goma": {
     "enable_ats": true,
     "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/ci/Win Builder/properties.json b/infra/config/generated/builders/ci/Win Builder/properties.json
index 6a2b1c4..241677c 100644
--- a/infra/config/generated/builders/ci/Win Builder/properties.json
+++ b/infra/config/generated/builders/ci/Win Builder/properties.json
@@ -1,4 +1,157 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "WebKit Win10",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win Builder",
+                "project": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win7 (32) Tests",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win Builder",
+                "project": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win7 Tests (1)",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win Builder",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "Win Builder",
+          "project": "chromium"
+        }
+      ],
+      "builder_ids_in_scope_for_testing": [
+        {
+          "bucket": "ci",
+          "builder": "WebKit Win10",
+          "project": "chromium"
+        },
+        {
+          "bucket": "ci",
+          "builder": "Win7 (32) Tests",
+          "project": "chromium"
+        },
+        {
+          "bucket": "ci",
+          "builder": "Win7 Tests (1)",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "win7-rel",
+          "group": "tryserver.chromium.win"
+        },
+        {
+          "builder": "win_chromium_compile_rel_ng",
+          "group": "tryserver.chromium.win"
+        }
+      ]
+    }
+  },
   "$build/reclient": {
     "instance": "rbe-chromium-trusted",
     "jobs": 250,
diff --git "a/infra/config/generated/builders/ci/Win7 \05032\051 Tests/properties.json" "b/infra/config/generated/builders/ci/Win7 \05032\051 Tests/properties.json"
index f1afaaa5..c18bd13 100644
--- "a/infra/config/generated/builders/ci/Win7 \05032\051 Tests/properties.json"
+++ "b/infra/config/generated/builders/ci/Win7 \05032\051 Tests/properties.json"
@@ -1,4 +1,78 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win7 (32) Tests",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win Builder",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "Win7 (32) Tests",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "win_chromium_compile_rel_ng",
+          "group": "tryserver.chromium.win"
+        }
+      ]
+    }
+  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git "a/infra/config/generated/builders/ci/Win7 Tests \0501\051/properties.json" "b/infra/config/generated/builders/ci/Win7 Tests \0501\051/properties.json"
index ccc0012..876df5fa 100644
--- "a/infra/config/generated/builders/ci/Win7 Tests \0501\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win7 Tests \0501\051/properties.json"
@@ -1,4 +1,82 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win7 Tests (1)",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win Builder",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "Win7 Tests (1)",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "win7-rel",
+          "group": "tryserver.chromium.win"
+        },
+        {
+          "builder": "win_chromium_compile_rel_ng",
+          "group": "tryserver.chromium.win"
+        }
+      ]
+    }
+  },
   "$build/goma": {
     "enable_ats": true,
     "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/ci/lacros-arm-archive-rel/properties.json b/infra/config/generated/builders/ci/lacros-arm-archive-rel/properties.json
index b757934..d5cde88b 100644
--- a/infra/config/generated/builders/ci/lacros-arm-archive-rel/properties.json
+++ b/infra/config/generated/builders/ci/lacros-arm-archive-rel/properties.json
@@ -53,11 +53,10 @@
       ]
     }
   },
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 500,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/linux-lacros-builder-rel/properties.json b/infra/config/generated/builders/ci/linux-lacros-builder-rel/properties.json
index 20179b4..de57877 100644
--- a/infra/config/generated/builders/ci/linux-lacros-builder-rel/properties.json
+++ b/infra/config/generated/builders/ci/linux-lacros-builder-rel/properties.json
@@ -1,4 +1,96 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "linux-lacros-builder-rel",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-chromiumos-archive",
+              "builder_group": "chromium.chromiumos",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_arch": "intel",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "chromeos"
+                ],
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "linux-lacros-tester-rel",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-chromiumos-archive",
+              "builder_group": "chromium.chromiumos",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_arch": "intel",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage",
+                  "chromeos"
+                ],
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "linux-lacros-builder-rel",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "linux-lacros-builder-rel",
+          "project": "chromium"
+        }
+      ],
+      "builder_ids_in_scope_for_testing": [
+        {
+          "bucket": "ci",
+          "builder": "linux-lacros-tester-rel",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "linux-lacros-rel",
+          "group": "tryserver.chromium.chromiumos"
+        },
+        {
+          "builder": "linux-lacros-rel-code-coverage",
+          "group": "tryserver.chromium.chromiumos"
+        }
+      ]
+    }
+  },
   "$build/reclient": {
     "instance": "rbe-chromium-trusted",
     "jobs": 500,
diff --git a/infra/config/generated/builders/ci/linux-lacros-tester-rel/properties.json b/infra/config/generated/builders/ci/linux-lacros-tester-rel/properties.json
index 3a9ecbc..99ce8ce 100644
--- a/infra/config/generated/builders/ci/linux-lacros-tester-rel/properties.json
+++ b/infra/config/generated/builders/ci/linux-lacros-tester-rel/properties.json
@@ -1,4 +1,89 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "linux-lacros-builder-rel",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-chromiumos-archive",
+              "builder_group": "chromium.chromiumos",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_arch": "intel",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "chromeos"
+                ],
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "linux-lacros-tester-rel",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-chromiumos-archive",
+              "builder_group": "chromium.chromiumos",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_arch": "intel",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage",
+                  "chromeos"
+                ],
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "linux-lacros-builder-rel",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "linux-lacros-tester-rel",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "linux-lacros-rel",
+          "group": "tryserver.chromium.chromiumos"
+        },
+        {
+          "builder": "linux-lacros-rel-code-coverage",
+          "group": "tryserver.chromium.chromiumos"
+        }
+      ]
+    }
+  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/goma/Win Builder Goma RBE ATS Canary/properties.json b/infra/config/generated/builders/goma/Win Builder Goma RBE ATS Canary/properties.json
index c5ee085..98607aa 100644
--- a/infra/config/generated/builders/goma/Win Builder Goma RBE ATS Canary/properties.json
+++ b/infra/config/generated/builders/goma/Win Builder Goma RBE ATS Canary/properties.json
@@ -1,4 +1,45 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "goma",
+              "builder": "Win Builder Goma RBE ATS Canary",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-fyi-archive",
+              "builder_group": "chromium.goma.fyi",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb",
+                  "goma_canary",
+                  "goma_use_local"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "goma",
+          "builder": "Win Builder Goma RBE ATS Canary",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
   "$build/goma": {
     "enable_ats": true,
     "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/goma/Win Builder Goma RBE ATS Latest Client/properties.json b/infra/config/generated/builders/goma/Win Builder Goma RBE ATS Latest Client/properties.json
index c5ee085..c8d2838 100644
--- a/infra/config/generated/builders/goma/Win Builder Goma RBE ATS Latest Client/properties.json
+++ b/infra/config/generated/builders/goma/Win Builder Goma RBE ATS Latest Client/properties.json
@@ -1,4 +1,45 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "goma",
+              "builder": "Win Builder Goma RBE ATS Latest Client",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-fyi-archive",
+              "builder_group": "chromium.goma.fyi",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb",
+                  "goma_latest_client",
+                  "goma_use_local"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "goma",
+          "builder": "Win Builder Goma RBE ATS Latest Client",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
   "$build/goma": {
     "enable_ats": true,
     "rpc_extra_params": "?prod",
diff --git "a/infra/config/generated/builders/goma/Win Builder Goma RBE Canary \050clobber\051/properties.json" "b/infra/config/generated/builders/goma/Win Builder Goma RBE Canary \050clobber\051/properties.json"
index 112c83e..d18b9cf 100644
--- "a/infra/config/generated/builders/goma/Win Builder Goma RBE Canary \050clobber\051/properties.json"
+++ "b/infra/config/generated/builders/goma/Win Builder Goma RBE Canary \050clobber\051/properties.json"
@@ -1,4 +1,46 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "goma",
+              "builder": "Win Builder Goma RBE Canary (clobber)",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-fyi-archive",
+              "builder_group": "chromium.goma.fyi",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb",
+                  "goma_canary",
+                  "goma_use_local",
+                  "clobber"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "goma",
+          "builder": "Win Builder Goma RBE Canary (clobber)",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
   "$build/goma": {
     "enable_ats": false,
     "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/goma/Win Builder Goma RBE Canary/properties.json b/infra/config/generated/builders/goma/Win Builder Goma RBE Canary/properties.json
index 112c83e..3edfa33e 100644
--- a/infra/config/generated/builders/goma/Win Builder Goma RBE Canary/properties.json
+++ b/infra/config/generated/builders/goma/Win Builder Goma RBE Canary/properties.json
@@ -1,4 +1,45 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "goma",
+              "builder": "Win Builder Goma RBE Canary",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-fyi-archive",
+              "builder_group": "chromium.goma.fyi",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb",
+                  "goma_canary",
+                  "goma_use_local"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "goma",
+          "builder": "Win Builder Goma RBE Canary",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
   "$build/goma": {
     "enable_ats": false,
     "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/goma/Win Builder Goma RBE Latest Client/properties.json b/infra/config/generated/builders/goma/Win Builder Goma RBE Latest Client/properties.json
index 112c83e..364a259 100644
--- a/infra/config/generated/builders/goma/Win Builder Goma RBE Latest Client/properties.json
+++ b/infra/config/generated/builders/goma/Win Builder Goma RBE Latest Client/properties.json
@@ -1,4 +1,45 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "goma",
+              "builder": "Win Builder Goma RBE Latest Client",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-fyi-archive",
+              "builder_group": "chromium.goma.fyi",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb",
+                  "goma_latest_client",
+                  "goma_use_local"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "goma",
+          "builder": "Win Builder Goma RBE Latest Client",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
   "$build/goma": {
     "enable_ats": false,
     "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/try/linux-lacros-rel-code-coverage/properties.json b/infra/config/generated/builders/try/linux-lacros-rel-code-coverage/properties.json
index ebe392d..e9b6d825 100644
--- a/infra/config/generated/builders/try/linux-lacros-rel-code-coverage/properties.json
+++ b/infra/config/generated/builders/try/linux-lacros-rel-code-coverage/properties.json
@@ -1,4 +1,86 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "linux-lacros-builder-rel",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-chromiumos-archive",
+              "builder_group": "chromium.chromiumos",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_arch": "intel",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "chromeos"
+                ],
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "linux-lacros-tester-rel",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-chromiumos-archive",
+              "builder_group": "chromium.chromiumos",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_arch": "intel",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage",
+                  "chromeos"
+                ],
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "linux-lacros-builder-rel",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "linux-lacros-builder-rel",
+          "project": "chromium"
+        }
+      ],
+      "builder_ids_in_scope_for_testing": [
+        {
+          "bucket": "ci",
+          "builder": "linux-lacros-tester-rel",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
   "$build/code_coverage": {
     "coverage_test_types": [
       "unit",
diff --git a/infra/config/generated/builders/try/linux-lacros-rel/properties.json b/infra/config/generated/builders/try/linux-lacros-rel/properties.json
index b2fbbafcf..ba0cc7bb 100644
--- a/infra/config/generated/builders/try/linux-lacros-rel/properties.json
+++ b/infra/config/generated/builders/try/linux-lacros-rel/properties.json
@@ -1,4 +1,86 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "linux-lacros-builder-rel",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-chromiumos-archive",
+              "builder_group": "chromium.chromiumos",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_arch": "intel",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "chromeos"
+                ],
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "linux-lacros-tester-rel",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-chromiumos-archive",
+              "builder_group": "chromium.chromiumos",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_arch": "intel",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage",
+                  "chromeos"
+                ],
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "linux-lacros-builder-rel",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "linux-lacros-builder-rel",
+          "project": "chromium"
+        }
+      ],
+      "builder_ids_in_scope_for_testing": [
+        {
+          "bucket": "ci",
+          "builder": "linux-lacros-tester-rel",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
   "$build/goma": {
     "enable_ats": true,
     "jobs": 300,
diff --git a/infra/config/generated/builders/try/linux_chromium_chromeos_msan_rel_ng/properties.json b/infra/config/generated/builders/try/linux_chromium_chromeos_msan_rel_ng/properties.json
index 21fc528..9d61048 100644
--- a/infra/config/generated/builders/try/linux_chromium_chromeos_msan_rel_ng/properties.json
+++ b/infra/config/generated/builders/try/linux_chromium_chromeos_msan_rel_ng/properties.json
@@ -1,4 +1,83 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Linux ChromiumOS MSan Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-memory-archive",
+              "builder_group": "chromium.memory",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium_msan",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "chromeos"
+                ],
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Linux ChromiumOS MSan Tests",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-memory-archive",
+              "builder_group": "chromium.memory",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium_msan",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "chromeos"
+                ],
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Linux ChromiumOS MSan Builder",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "Linux ChromiumOS MSan Builder",
+          "project": "chromium"
+        }
+      ],
+      "builder_ids_in_scope_for_testing": [
+        {
+          "bucket": "ci",
+          "builder": "Linux ChromiumOS MSan Tests",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
   "$build/goma": {
     "enable_ats": true,
     "jobs": 150,
diff --git a/infra/config/generated/builders/try/network_service_linux/properties.json b/infra/config/generated/builders/try/network_service_linux/properties.json
index 19e0479..55c95cb 100644
--- a/infra/config/generated/builders/try/network_service_linux/properties.json
+++ b/infra/config/generated/builders/try/network_service_linux/properties.json
@@ -1,4 +1,45 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Network Service Linux",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-linux-archive",
+              "builder_group": "chromium.linux",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "enable_reclient"
+                ],
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "Network Service Linux",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
   "$build/goma": {
     "enable_ats": true,
     "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/try/win7-rel/properties.json b/infra/config/generated/builders/try/win7-rel/properties.json
index 11e9b93..c355389a 100644
--- a/infra/config/generated/builders/try/win7-rel/properties.json
+++ b/infra/config/generated/builders/try/win7-rel/properties.json
@@ -1,4 +1,79 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win7 Tests (1)",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win Builder",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "Win Builder",
+          "project": "chromium"
+        }
+      ],
+      "builder_ids_in_scope_for_testing": [
+        {
+          "bucket": "ci",
+          "builder": "Win7 Tests (1)",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
   "$build/goma": {
     "enable_ats": false,
     "jobs": 300,
diff --git a/infra/config/generated/builders/try/win_chromium_compile_rel_ng/properties.json b/infra/config/generated/builders/try/win_chromium_compile_rel_ng/properties.json
index d4fde02b..72960fd 100644
--- a/infra/config/generated/builders/try/win_chromium_compile_rel_ng/properties.json
+++ b/infra/config/generated/builders/try/win_chromium_compile_rel_ng/properties.json
@@ -1,4 +1,148 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "WebKit Win10",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win Builder",
+                "project": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win7 (32) Tests",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win Builder",
+                "project": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win7 Tests (1)",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "goma_enable_global_file_stat_cache",
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 32
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win Builder",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "Win Builder",
+          "project": "chromium"
+        }
+      ],
+      "builder_ids_in_scope_for_testing": [
+        {
+          "bucket": "ci",
+          "builder": "WebKit Win10",
+          "project": "chromium"
+        },
+        {
+          "bucket": "ci",
+          "builder": "Win7 (32) Tests",
+          "project": "chromium"
+        },
+        {
+          "bucket": "ci",
+          "builder": "Win7 Tests (1)",
+          "project": "chromium"
+        }
+      ],
+      "is_compile_only": true
+    }
+  },
   "$build/goma": {
     "enable_ats": false,
     "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/luci/cr-buildbucket-dev.cfg b/infra/config/generated/luci/cr-buildbucket-dev.cfg
index 42bb7de..ce6fa08 100644
--- a/infra/config/generated/luci/cr-buildbucket-dev.cfg
+++ b/infra/config/generated/luci/cr-buildbucket-dev.cfg
@@ -244,7 +244,7 @@
       name: "mac-rel-swarming"
       swarming_host: "chromium-swarm-dev.appspot.com"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/main"
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index bf50498..049723c0 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -109,7 +109,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
@@ -8961,7 +8961,7 @@
       dimensions: "builder:Libfuzzer Upload Mac ASan"
       dimensions: "cores:24"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
@@ -12114,7 +12114,7 @@
       dimensions: "builder:Mac ASAN Release"
       dimensions: "cores:4"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -12192,7 +12192,7 @@
       dimensions: "builder:Mac ASAN Release Media"
       dimensions: "cores:4"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -12269,7 +12269,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:Mac ASan 64 Builder"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -12350,7 +12350,7 @@
       dimensions: "builder:Mac ASan 64 Tests (1)"
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -12430,7 +12430,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:Mac Builder"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -12590,7 +12590,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -12668,7 +12668,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -14213,7 +14213,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:Mac deterministic"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
@@ -14282,7 +14282,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:Mac deterministic (dbg)"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
@@ -17275,7 +17275,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       dimensions: "ssd:1"
       exe {
@@ -17356,7 +17356,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       dimensions: "ssd:1"
       exe {
@@ -17437,7 +17437,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       dimensions: "ssd:1"
       exe {
@@ -17518,7 +17518,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       dimensions: "ssd:1"
       exe {
@@ -29508,7 +29508,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-catalyst"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -29593,7 +29593,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-device"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -30003,7 +30003,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -30251,7 +30251,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator-full-configs"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -30417,7 +30417,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator-noncq"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -36011,7 +36011,7 @@
       dimensions: "builder:mac-archive-dbg"
       dimensions: "cores:4"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -36092,7 +36092,7 @@
       dimensions: "builder:mac-archive-rel"
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -36173,7 +36173,7 @@
       dimensions: "builder:mac-arm64-archive-dbg"
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -36254,7 +36254,7 @@
       dimensions: "builder:mac-arm64-archive-rel"
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -36334,7 +36334,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:mac-arm64-on-arm64-rel"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -36492,7 +36492,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:mac-arm64-rel"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -36809,7 +36809,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:mac-fieldtrial-rel"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -36887,7 +36887,7 @@
       dimensions: "builder:mac-hermetic-upgrade-rel"
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -37511,7 +37511,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -42923,7 +42923,7 @@
       dimensions: "builder:Chromium Mac Goma RBE Staging"
       dimensions: "cores:4"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -42972,7 +42972,7 @@
       dimensions: "builder:Chromium Mac Goma RBE Staging (clobber)"
       dimensions: "cores:4"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -43021,7 +43021,7 @@
       dimensions: "builder:Chromium Mac Goma RBE Staging (dbg)"
       dimensions: "cores:4"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -43070,7 +43070,7 @@
       dimensions: "builder:Chromium Mac Goma RBE ToT"
       dimensions: "cores:4"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -43566,7 +43566,7 @@
       dimensions: "builder:Mac Builder (dbg) Goma RBE Canary (clobber)"
       dimensions: "cores:4"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -43615,7 +43615,7 @@
       dimensions: "builder:Mac Builder (dbg) Goma RBE Latest Client (clobber)"
       dimensions: "cores:4"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -44855,7 +44855,7 @@
       dimensions: "builder:mac-archive-rel-goma-rbe-canary"
       dimensions: "cores:4"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -44904,7 +44904,7 @@
       dimensions: "builder:mac-archive-rel-goma-rbe-latest"
       dimensions: "cores:4"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -45650,7 +45650,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
@@ -59963,7 +59963,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-asan"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -60055,7 +60055,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-catalyst"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -60147,7 +60147,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-clang-tidy-rel"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
@@ -60233,7 +60233,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-device"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -60325,7 +60325,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -60417,7 +60417,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-m1-simulator"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -60509,7 +60509,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-m1-simulator-cronet"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -60601,7 +60601,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -60693,7 +60693,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator-cronet"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -60785,7 +60785,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator-full-configs"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -60877,7 +60877,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator-inverse-fieldtrials-fyi"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -60969,7 +60969,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator-multi-window"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -61061,7 +61061,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator-noncq"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -61153,7 +61153,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator-rts"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -61429,7 +61429,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios15-beta-simulator"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -69450,7 +69450,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:mac-arm64-on-arm64-rel"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       dimensions: "ssd:1"
       exe {
@@ -69798,7 +69798,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       dimensions: "ssd:1"
       exe {
@@ -69887,7 +69887,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       dimensions: "ssd:1"
       exe {
@@ -70064,7 +70064,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       dimensions: "ssd:1"
       exe {
@@ -70247,7 +70247,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:mac-rel-compilator"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       dimensions: "ssd:1"
       exe {
@@ -71044,7 +71044,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:mac11-arm64-rel-compilator"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       dimensions: "ssd:1"
       exe {
@@ -72024,7 +72024,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-11|Mac-12"
       dimensions: "pool:luci.chromium.try"
       dimensions: "ssd:1"
       exe {
diff --git a/infra/config/lib/builders.star b/infra/config/lib/builders.star
index a9f90da..a69e59b 100644
--- a/infra/config/lib/builders.star
+++ b/infra/config/lib/builders.star
@@ -73,7 +73,8 @@
     MAC_10_15 = os_enum("Mac-10.15", os_category.MAC),
     MAC_11 = os_enum("Mac-11", os_category.MAC),
     MAC_12 = os_enum("Mac-12", os_category.MAC),
-    MAC_DEFAULT = os_enum("Mac-11", os_category.MAC),
+    # TODO(crbug.com/1323966) Remove Mac11 once builders have been migrated to Mac12
+    MAC_DEFAULT = os_enum("Mac-11|Mac-12", os_category.MAC),
     MAC_ANY = os_enum("Mac", os_category.MAC),
     MAC_BETA = os_enum("Mac-12", os_category.MAC),
     WINDOWS_7 = os_enum("Windows-7", os_category.WINDOWS),
diff --git a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
index d4700a0..abfd127 100644
--- a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
+++ b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
@@ -529,6 +529,24 @@
 
 ci.builder(
     name = "linux-lacros-builder-rel",
+    builder_spec = builder_config.builder_spec(
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+            apply_configs = [
+                "chromeos",
+            ],
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium",
+            apply_configs = [
+                "mb",
+            ],
+            build_config = builder_config.build_config.RELEASE,
+            target_arch = builder_config.target_arch.INTEL,
+            target_bits = 64,
+        ),
+        build_gs_bucket = "chromium-chromiumos-archive",
+    ),
     branch_selector = branches.STANDARD_MILESTONE,
     console_view_entry = consoles.console_view_entry(
         category = "default",
@@ -543,6 +561,26 @@
 
 ci.thin_tester(
     name = "linux-lacros-tester-rel",
+    builder_spec = builder_config.builder_spec(
+        execution_mode = builder_config.execution_mode.TEST,
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+            apply_configs = [
+                "use_clang_coverage",
+                "chromeos",
+            ],
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium",
+            apply_configs = [
+                "mb",
+            ],
+            build_config = builder_config.build_config.RELEASE,
+            target_arch = builder_config.target_arch.INTEL,
+            target_bits = 64,
+        ),
+        build_gs_bucket = "chromium-chromiumos-archive",
+    ),
     branch_selector = branches.STANDARD_MILESTONE,
     console_view_entry = consoles.console_view_entry(
         category = "default",
diff --git a/infra/config/subprojects/chromium/ci/chromium.linux.star b/infra/config/subprojects/chromium/ci/chromium.linux.star
index 364d72b..f2378bf2 100644
--- a/infra/config/subprojects/chromium/ci/chromium.linux.star
+++ b/infra/config/subprojects/chromium/ci/chromium.linux.star
@@ -409,6 +409,23 @@
 
 ci.builder(
     name = "Network Service Linux",
+    builder_spec = builder_config.builder_spec(
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+            apply_configs = [
+                "enable_reclient",
+            ],
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium",
+            apply_configs = [
+                "mb",
+            ],
+            build_config = builder_config.build_config.RELEASE,
+            target_bits = 64,
+        ),
+        build_gs_bucket = "chromium-linux-archive",
+    ),
     console_view_entry = consoles.console_view_entry(
         category = "release",
         short_name = "nsl",
diff --git a/infra/config/subprojects/chromium/ci/chromium.memory.star b/infra/config/subprojects/chromium/ci/chromium.memory.star
index 6056497..d3ff8db5 100644
--- a/infra/config/subprojects/chromium/ci/chromium.memory.star
+++ b/infra/config/subprojects/chromium/ci/chromium.memory.star
@@ -177,6 +177,23 @@
         category = "cros|msan",
         short_name = "bld",
     ),
+    builder_spec = builder_config.builder_spec(
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+            apply_configs = [
+                "chromeos",
+            ],
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium_msan",
+            apply_configs = [
+                "mb",
+            ],
+            build_config = builder_config.build_config.RELEASE,
+            target_bits = 64,
+        ),
+        build_gs_bucket = "chromium-memory-archive",
+    ),
     execution_timeout = 4 * time.hour,
     ssd = True,
     cores = 16,
@@ -188,6 +205,24 @@
         category = "cros|msan",
         short_name = "tst",
     ),
+    builder_spec = builder_config.builder_spec(
+        execution_mode = builder_config.execution_mode.TEST,
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+            apply_configs = [
+                "chromeos",
+            ],
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium_msan",
+            apply_configs = [
+                "mb",
+            ],
+            build_config = builder_config.build_config.RELEASE,
+            target_bits = 64,
+        ),
+        build_gs_bucket = "chromium-memory-archive",
+    ),
     execution_timeout = 4 * time.hour,
     triggered_by = ["Linux ChromiumOS MSan Builder"],
     reclient_instance = None,
diff --git a/infra/config/subprojects/chromium/ci/chromium.star b/infra/config/subprojects/chromium/ci/chromium.star
index 3db0eaa..4cdc58b6 100644
--- a/infra/config/subprojects/chromium/ci/chromium.star
+++ b/infra/config/subprojects/chromium/ci/chromium.star
@@ -251,6 +251,9 @@
     # TODO(crbug.com/1320042): Turn on after it's stable.
     tree_closing = False,
     sheriff_rotations = args.ignore_default(None),
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.win.star b/infra/config/subprojects/chromium/ci/chromium.win.star
index 6aef6c6..8d2027c 100644
--- a/infra/config/subprojects/chromium/ci/chromium.win.star
+++ b/infra/config/subprojects/chromium/ci/chromium.win.star
@@ -39,6 +39,22 @@
 
 ci.builder(
     name = "WebKit Win10",
+    builder_spec = builder_config.builder_spec(
+        execution_mode = builder_config.execution_mode.TEST,
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium",
+            apply_configs = [
+                "goma_enable_global_file_stat_cache",
+                "mb",
+            ],
+            build_config = builder_config.build_config.RELEASE,
+            target_bits = 32,
+        ),
+        build_gs_bucket = "chromium-win-archive",
+    ),
     console_view_entry = consoles.console_view_entry(
         category = "misc",
         short_name = "wbk",
@@ -49,6 +65,21 @@
 ci.builder(
     name = "Win Builder",
     branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE,
+    builder_spec = builder_config.builder_spec(
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium",
+            apply_configs = [
+                "goma_enable_global_file_stat_cache",
+                "mb",
+            ],
+            build_config = builder_config.build_config.RELEASE,
+            target_bits = 32,
+        ),
+        build_gs_bucket = "chromium-win-archive",
+    ),
     console_view_entry = consoles.console_view_entry(
         category = "release|builder",
         short_name = "32",
@@ -117,6 +148,22 @@
 
 ci.thin_tester(
     name = "Win7 (32) Tests",
+    builder_spec = builder_config.builder_spec(
+        execution_mode = builder_config.execution_mode.TEST,
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium",
+            apply_configs = [
+                "goma_enable_global_file_stat_cache",
+                "mb",
+            ],
+            build_config = builder_config.build_config.RELEASE,
+            target_bits = 32,
+        ),
+        build_gs_bucket = "chromium-win-archive",
+    ),
     console_view_entry = consoles.console_view_entry(
         category = "release|tester",
         short_name = "32",
@@ -127,6 +174,22 @@
 ci.builder(
     name = "Win7 Tests (1)",
     branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE,
+    builder_spec = builder_config.builder_spec(
+        execution_mode = builder_config.execution_mode.TEST,
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium",
+            apply_configs = [
+                "goma_enable_global_file_stat_cache",
+                "mb",
+            ],
+            build_config = builder_config.build_config.RELEASE,
+            target_bits = 32,
+        ),
+        build_gs_bucket = "chromium-win-archive",
+    ),
     builderless = True,
     console_view_entry = consoles.console_view_entry(
         category = "release|tester",
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star
index d244f11..5f31b828 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star
@@ -188,6 +188,10 @@
 
 try_.builder(
     name = "linux-lacros-rel",
+    mirrors = [
+        "ci/linux-lacros-builder-rel",
+        "ci/linux-lacros-tester-rel",
+    ],
     branch_selector = branches.STANDARD_MILESTONE,
     builderless = not settings.is_main,
     cores = 16,
@@ -199,6 +203,10 @@
 
 try_.builder(
     name = "linux-lacros-rel-code-coverage",
+    mirrors = [
+        "ci/linux-lacros-builder-rel",
+        "ci/linux-lacros-tester-rel",
+    ],
     cores = 16,
     ssd = True,
     goma_jobs = goma.jobs.J300,
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
index 5b7b5055..6fcd5b4 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
@@ -484,6 +484,10 @@
 
 try_.builder(
     name = "linux_chromium_chromeos_msan_rel_ng",
+    mirrors = [
+        "ci/Linux ChromiumOS MSan Builder",
+        "ci/Linux ChromiumOS MSan Tests",
+    ],
     goma_jobs = goma.jobs.J150,
 )
 
@@ -656,6 +660,9 @@
 
 try_.builder(
     name = "network_service_linux",
+    mirrors = [
+        "ci/Network Service Linux",
+    ],
 )
 
 try_.builder(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.win.star b/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
index 86ed7aac..64a2cf69 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
@@ -96,6 +96,13 @@
 
 try_.builder(
     name = "win_chromium_compile_rel_ng",
+    mirrors = [
+        "ci/Win Builder",
+    ],
+    try_settings = builder_config.try_settings(
+        include_all_triggered_testers = True,
+        is_compile_only = True,
+    ),
 )
 
 try_.builder(
@@ -196,6 +203,10 @@
 try_.builder(
     name = "win7-rel",
     branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE,
+    mirrors = [
+        "ci/Win Builder",
+        "ci/Win7 Tests (1)",
+    ],
     cores = 16,
     execution_timeout = 4 * time.hour + 30 * time.minute,
     goma_jobs = goma.jobs.J300,
diff --git a/infra/config/subprojects/goma/goma.star b/infra/config/subprojects/goma/goma.star
index 62a99d97..f3a2cc0 100644
--- a/infra/config/subprojects/goma/goma.star
+++ b/infra/config/subprojects/goma/goma.star
@@ -245,12 +245,41 @@
 
 fyi_goma_rbe_canary_builder(
     name = "Win Builder Goma RBE Canary",
+    builder_spec = builder_config.copy_from(
+        "ci/Win Builder",
+        lambda spec: structs.evolve(
+            spec,
+            chromium_config = structs.extend(
+                spec.chromium_config,
+                apply_configs = [
+                    "goma_canary",
+                    "goma_use_local",
+                ],
+            ),
+            build_gs_bucket = "chromium-fyi-archive",
+        ),
+    ),
     goma_enable_ats = False,
     os = os.WINDOWS_DEFAULT,
 )
 
 fyi_goma_rbe_canary_builder(
     name = "Win Builder Goma RBE Canary (clobber)",
+    builder_spec = builder_config.copy_from(
+        "ci/Win Builder",
+        lambda spec: structs.evolve(
+            spec,
+            chromium_config = structs.extend(
+                spec.chromium_config,
+                apply_configs = [
+                    "goma_canary",
+                    "goma_use_local",
+                    "clobber",
+                ],
+            ),
+            build_gs_bucket = "chromium-fyi-archive",
+        ),
+    ),
     goma_enable_ats = False,
     os = os.WINDOWS_DEFAULT,
 )
@@ -276,6 +305,20 @@
 
 fyi_goma_rbe_canary_builder(
     name = "Win Builder Goma RBE ATS Canary",
+    builder_spec = builder_config.copy_from(
+        "ci/Win Builder",
+        lambda spec: structs.evolve(
+            spec,
+            chromium_config = structs.extend(
+                spec.chromium_config,
+                apply_configs = [
+                    "goma_canary",
+                    "goma_use_local",
+                ],
+            ),
+            build_gs_bucket = "chromium-fyi-archive",
+        ),
+    ),
     goma_enable_ats = True,
     os = os.WINDOWS_DEFAULT,
 )
@@ -355,6 +398,20 @@
 
 fyi_goma_rbe_latest_client_builder(
     name = "Win Builder Goma RBE Latest Client",
+    builder_spec = builder_config.copy_from(
+        "ci/Win Builder",
+        lambda spec: structs.evolve(
+            spec,
+            chromium_config = structs.extend(
+                spec.chromium_config,
+                apply_configs = [
+                    "goma_latest_client",
+                    "goma_use_local",
+                ],
+            ),
+            build_gs_bucket = "chromium-fyi-archive",
+        ),
+    ),
     goma_enable_ats = False,
     os = os.WINDOWS_DEFAULT,
 )
@@ -380,6 +437,20 @@
 
 fyi_goma_rbe_latest_client_builder(
     name = "Win Builder Goma RBE ATS Latest Client",
+    builder_spec = builder_config.copy_from(
+        "ci/Win Builder",
+        lambda spec: structs.evolve(
+            spec,
+            chromium_config = structs.extend(
+                spec.chromium_config,
+                apply_configs = [
+                    "goma_latest_client",
+                    "goma_use_local",
+                ],
+            ),
+            build_gs_bucket = "chromium-fyi-archive",
+        ),
+    ),
     goma_enable_ats = True,
     os = os.WINDOWS_DEFAULT,
 )
diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
index 986d650..9ef038d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
@@ -581,6 +581,7 @@
 <translation id="6012140227487808125">Šifriranje…</translation>
 <translation id="6021332621416007159">Otvori u aplikaciji...</translation>
 <translation id="6027945736510816438">Jeste li mislili <ph name="WEBSITE" />?</translation>
+<translation id="6036215966221662377">Izbrišite podatke o pregledavanju</translation>
 <translation id="6036514205982097558">Sve kartice u jednom pregledniku</translation>
 <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation>
 <translation id="6040143037577758943">Zatvori</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb
index ffceb391..cc7eaa8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -581,6 +581,7 @@
 <translation id="6012140227487808125">Krüpteerimine …</translation>
 <translation id="6021332621416007159">Ava rakend. ...</translation>
 <translation id="6027945736510816438">Kas mõtlesite saiti <ph name="WEBSITE" />?</translation>
+<translation id="6036215966221662377">Kustuta sirvimisandmed</translation>
 <translation id="6036514205982097558">Kõik teie vahelehed ühes brauseris</translation>
 <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation>
 <translation id="6040143037577758943">Sulge</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
index 5ab4cb2d..21a0867 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -581,6 +581,7 @@
 <translation id="6012140227487808125">Enkripcija…</translation>
 <translation id="6021332621416007159">Otvori u...</translation>
 <translation id="6027945736510816438">Jeste li mislili <ph name="WEBSITE" />?</translation>
+<translation id="6036215966221662377">Izbrišite podatke o pregledavanju</translation>
 <translation id="6036514205982097558">Sve vaše kartice u jednom pregledniku</translation>
 <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation>
 <translation id="6040143037577758943">Zatvori</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
index 2a574a3..fe69b268 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -581,6 +581,7 @@
 <translation id="6012140227487808125">暗号化しています...</translation>
 <translation id="6021332621416007159">次で開く...</translation>
 <translation id="6027945736510816438">もしかして: <ph name="WEBSITE" /></translation>
+<translation id="6036215966221662377">閲覧履歴データの削除</translation>
 <translation id="6036514205982097558">1 つのブラウザですべてのタブを管理</translation>
 <translation id="6039429417015973673"><ph name="TITLE" />、<ph name="PUBLISHER_INFORMATION" />、<ph name="PUBLICATION_DATE" /></translation>
 <translation id="6040143037577758943">閉じる</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
index f221c07..0208143f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -581,6 +581,7 @@
 <translation id="6012140227487808125">მიმდინარეობს დაშიფვრა…</translation>
 <translation id="6021332621416007159">გახსნა…</translation>
 <translation id="6027945736510816438"><ph name="WEBSITE" /> ხომ არ იგულისხმეთ?</translation>
+<translation id="6036215966221662377">დათვალიერების მონაცემების გასუფთავება</translation>
 <translation id="6036514205982097558">თქვენი ყველა ჩანართი ერთ ბრაუზერში</translation>
 <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation>
 <translation id="6040143037577758943">დახურვა</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
index 06215db5..00a2977 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -902,6 +902,7 @@
 <translation id="8592752150819985187">Автоматаар бөглөх нууц үгнүүд</translation>
 <translation id="8605219856220328675">Цонхыг хаах.</translation>
 <translation id="8620640915598389714">Засах</translation>
+<translation id="8620785403235741379">Сонголт хийх</translation>
 <translation id="8626393685701737946">Та сайтын өгөгдмөл харагдах байдлыг Тохиргоо &gt; Контентын тохиргоо хэсэгт дэлгэц болгож өөрчлөх боломжтой</translation>
 <translation id="863090005774946393">Таны хөтчийг танай байгууллага удирддаг. Зарим онцлогийг идэвхгүй болгосон байж болзошгүй.</translation>
 <translation id="8636825310635137004">Бусад төхөөрөмжөөс чихтэй хуудсаа авахын тулд синкийг асаана уу.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
index 0ef6ceb..8962304 100644
--- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -581,6 +581,7 @@
 <translation id="6012140227487808125">Versleutelen…</translation>
 <translation id="6021332621416007159">Openen in...</translation>
 <translation id="6027945736510816438">Bedoelde je <ph name="WEBSITE" />?</translation>
+<translation id="6036215966221662377">Browsegegevens wissen</translation>
 <translation id="6036514205982097558">Al je tabbladen in één browser</translation>
 <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation>
 <translation id="6040143037577758943">Sluiten</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
index f2e6353..73b37d4 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -579,6 +579,7 @@
 <translation id="6012140227487808125">Szyfruję…</translation>
 <translation id="6021332621416007159">Otwórz w...</translation>
 <translation id="6027945736510816438">Czy chodziło Ci o <ph name="WEBSITE" />?</translation>
+<translation id="6036215966221662377">Wyczyść historię przeglądania</translation>
 <translation id="6036514205982097558">Wszystkie Twoje karty w 1 przeglądarce</translation>
 <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation>
 <translation id="6040143037577758943">Zamknij</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
index 97fdafa..0ddd352f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -581,6 +581,7 @@
 <translation id="6012140227487808125">Se criptează…</translation>
 <translation id="6021332621416007159">Deschide în…</translation>
 <translation id="6027945736510816438">Ai vrut să scrii <ph name="WEBSITE" />?</translation>
+<translation id="6036215966221662377">Șterge datele de navigare</translation>
 <translation id="6036514205982097558">Toate filele într-un singur browser</translation>
 <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation>
 <translation id="6040143037577758943">Închide</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
index a0b0ec59..cc8a50a7 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -581,6 +581,7 @@
 <translation id="6012140227487808125">Шифрование…</translation>
 <translation id="6021332621416007159">Открыть в…</translation>
 <translation id="6027945736510816438">Вам нужен домен <ph name="WEBSITE" />?</translation>
+<translation id="6036215966221662377">Удалить данные о работе в браузере</translation>
 <translation id="6036514205982097558">Все вкладки в одном браузере</translation>
 <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation>
 <translation id="6040143037577758943">Закрыть</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
index 6d9b826..828f890 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
@@ -581,6 +581,7 @@
 <translation id="6012140227487808125">Šifruje se…</translation>
 <translation id="6021332621416007159">Otvori u...</translation>
 <translation id="6027945736510816438">Da li ste mislili <ph name="WEBSITE" />?</translation>
+<translation id="6036215966221662377">Obriši podatke pregledanja</translation>
 <translation id="6036514205982097558">Sve kartice u jednom pregledaču</translation>
 <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation>
 <translation id="6040143037577758943">Zatvori</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
index eb8f31fc..63cffff 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -581,6 +581,7 @@
 <translation id="6012140227487808125">Шифрује се…</translation>
 <translation id="6021332621416007159">Отвори у...</translation>
 <translation id="6027945736510816438">Да ли сте мислили <ph name="WEBSITE" />?</translation>
+<translation id="6036215966221662377">Обриши податке прегледања</translation>
 <translation id="6036514205982097558">Све картице у једном прегледачу</translation>
 <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation>
 <translation id="6040143037577758943">Затвори</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
index f6a3ebe..da58653 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -581,6 +581,7 @@
 <translation id="6012140227487808125">Inasimba kwa njia fiche...</translation>
 <translation id="6021332621416007159">Fungulia katika...</translation>
 <translation id="6027945736510816438">Je, ulimaanisha <ph name="WEBSITE" />?</translation>
+<translation id="6036215966221662377">Futa Data ya Kuvinjari</translation>
 <translation id="6036514205982097558">Vichupo Vyako Vyote Katika Kivinjari Kimoja</translation>
 <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation>
 <translation id="6040143037577758943">Funga</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
index f4714e3d..7250671 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -581,6 +581,7 @@
 <translation id="6012140227487808125">Shifrlanmoqda…</translation>
 <translation id="6021332621416007159">Bunda ochish...</translation>
 <translation id="6027945736510816438">Buni nazarda tutdingizmi: <ph name="WEBSITE" />?</translation>
+<translation id="6036215966221662377">Brauzer tarixini tozalash</translation>
 <translation id="6036514205982097558">Barcha varaqlarni bir brauzerda ochish</translation>
 <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation>
 <translation id="6040143037577758943">Yopish</translation>
@@ -902,6 +903,7 @@
 <translation id="8592752150819985187">Parollarni avtomatik kiritish</translation>
 <translation id="8605219856220328675">Sahifani yopish</translation>
 <translation id="8620640915598389714">O‘zgartirish</translation>
+<translation id="8620785403235741379">Birini tanlang</translation>
 <translation id="8626393685701737946">Saytning standart koʻrinishini kompyuter koʻrinishiga Sozlamalar &gt; Kontent sozlamalari orqali oʻzgartirish mumkin</translation>
 <translation id="863090005774946393">Brauzeringiz tashkilotingiz boshqaruvida. Ayrim funksiyalar ishlamasligi mumkin.</translation>
 <translation id="8636825310635137004">Boshqa qurilmalaringizdagi brauzer sahifalarini ko‘rish uchun sinxronizatsiyani yoqing.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
index 13c57ef..5e299491 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -581,6 +581,7 @@
 <translation id="6012140227487808125">正在加密…</translation>
 <translation id="6021332621416007159">在其他應用程式中開啟...</translation>
 <translation id="6027945736510816438">您是不是要輸入 <ph name="WEBSITE" />?</translation>
+<translation id="6036215966221662377">清除瀏覽資料</translation>
 <translation id="6036514205982097558">在同一個瀏覽器集中使用所有分頁</translation>
 <translation id="6039429417015973673"><ph name="TITLE" />,<ph name="PUBLISHER_INFORMATION" />,<ph name="PUBLICATION_DATE" /></translation>
 <translation id="6040143037577758943">關閉</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
index 93f8afd..d301ac6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -581,6 +581,7 @@
 <translation id="6012140227487808125">加密中…</translation>
 <translation id="6021332621416007159">在其他應用程式中開啟...</translation>
 <translation id="6027945736510816438">你是不是要輸入 <ph name="WEBSITE" />?</translation>
+<translation id="6036215966221662377">清除瀏覽資料</translation>
 <translation id="6036514205982097558">在同一個瀏覽器集中使用所有分頁</translation>
 <translation id="6039429417015973673"><ph name="TITLE" />,<ph name="PUBLISHER_INFORMATION" />,<ph name="PUBLICATION_DATE" /></translation>
 <translation id="6040143037577758943">關閉</translation>
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index 38d6c470..b8eb8b8 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -231,6 +231,18 @@
          std::size(kDiscoverFeedSRSPreloadTemplates), nullptr},
 };
 
+const FeatureEntry::FeatureParam kDiscoverFeedTopSyncPromoFullWithTitle[] = {
+    {kDiscoverFeedTopSyncPromoStyleParam,
+     kDiscoverFeedTopSyncPromoStyleFullWithTitle}};
+const FeatureEntry::FeatureParam kDiscoverFeedTopSyncPromoCompact[] = {
+    {kDiscoverFeedTopSyncPromoStyleParam,
+     kDiscoverFeedTopSyncPromoStyleCompact}};
+const FeatureEntry::FeatureVariation kDiscoverFeedTopSyncPromoVariations[] = {
+    {"Full with title", kDiscoverFeedTopSyncPromoFullWithTitle,
+     std::size(kDiscoverFeedTopSyncPromoFullWithTitle), nullptr},
+    {"Compact", kDiscoverFeedTopSyncPromoCompact,
+     std::size(kDiscoverFeedTopSyncPromoCompact), nullptr}};
+
 const FeatureEntry::FeatureParam kiOSOmniboxUpdatedPopupUIVersion1[] = {
     {kIOSOmniboxUpdatedPopupUIVariationName,
      kIOSOmniboxUpdatedPopupUIVariation1}};
@@ -699,6 +711,13 @@
      flag_descriptions::kEnableDiscoverFeedDiscoFeedEndpointDescription,
      flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(kEnableDiscoverFeedDiscoFeedEndpoint)},
+    {"enable-discover-feed-top-sync-promo",
+     flag_descriptions::kEnableDiscoverFeedTopSyncPromoName,
+     flag_descriptions::kEnableDiscoverFeedTopSyncPromoDescription,
+     flags_ui::kOsIos,
+     FEATURE_WITH_PARAMS_VALUE_TYPE(kEnableDiscoverFeedTopSyncPromo,
+                                    kDiscoverFeedTopSyncPromoVariations,
+                                    "EnableDiscoverFeedTopSyncPromo")},
     {"enable-fre-default-browser-screen-testing",
      flag_descriptions::kEnableFREDefaultBrowserScreenTestingName,
      flag_descriptions::kEnableFREDefaultBrowserScreenTestingDescription,
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
index 586d8fd..1cd8462f 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -178,6 +178,12 @@
     "When enabled, replaces articles feed with new content Suggestion Feed in "
     "the NTP.";
 
+const char kEnableDiscoverFeedTopSyncPromoName[] =
+    "Enable the sync promo on top of the feed.";
+const char kEnableDiscoverFeedTopSyncPromoDescription[] =
+    "When enabled, a sync promotion will be presented to eligible users on top "
+    "of the feed cards.";
+
 const char kDisplaySyncErrorsRefactorName[] =
     "Enable Display Sync Errors refactored code";
 const char kDisplaySyncErrorsRefactorDescription[] =
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
index efb6cd0a..d8fc78d 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -155,6 +155,11 @@
 extern const char kDiscoverFeedInNtpName[];
 extern const char kDiscoverFeedInNtpDescription[];
 
+// Title and description for the flag to enable the sync promotion on top of the
+// discover feed.
+extern const char kEnableDiscoverFeedTopSyncPromoName[];
+extern const char kEnableDiscoverFeedTopSyncPromoDescription[];
+
 // Title and description for the flag to enable DisplaySyncErrors refactored
 // code.
 extern const char kDisplaySyncErrorsRefactorName[];
diff --git a/ios/chrome/browser/passwords/password_tab_helper.mm b/ios/chrome/browser/passwords/password_tab_helper.mm
index c46a4e3..ac5d9642 100644
--- a/ios/chrome/browser/passwords/password_tab_helper.mm
+++ b/ios/chrome/browser/passwords/password_tab_helper.mm
@@ -6,6 +6,8 @@
 
 #include "base/check.h"
 #include "base/memory/ptr_util.h"
+#include "base/metrics/histogram_macros.h"
+#include "components/password_manager/core/browser/manage_passwords_referrer.h"
 #include "components/password_manager/core/browser/password_manager_constants.h"
 #include "components/password_manager/core/common/password_manager_features.h"
 #import "ios/chrome/browser/passwords/password_controller.h"
@@ -100,6 +102,9 @@
                                                           showCancelButton:NO];
     std::move(callback).Run(
         web::WebStatePolicyDecider::PolicyDecision::Cancel());
+    UMA_HISTOGRAM_ENUMERATION(
+        "PasswordManager.ManagePasswordsReferrer",
+        password_manager::ManagePasswordsReferrer::kPasswordsGoogleWebsite);
     return;
   }
   std::move(callback).Run(web::WebStatePolicyDecider::PolicyDecision::Allow());
diff --git a/ios/chrome/browser/passwords/password_tab_helper_unittest.mm b/ios/chrome/browser/passwords/password_tab_helper_unittest.mm
index 10ed219..d623237 100644
--- a/ios/chrome/browser/passwords/password_tab_helper_unittest.mm
+++ b/ios/chrome/browser/passwords/password_tab_helper_unittest.mm
@@ -8,8 +8,10 @@
 
 #include "base/strings/sys_string_conversions.h"
 #include "base/test/bind.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "components/autofill/ios/form_util/unique_id_data_tab_helper.h"
+#include "components/password_manager/core/browser/manage_passwords_referrer.h"
 #include "components/password_manager/core/browser/password_manager_constants.h"
 #include "components/password_manager/core/common/password_manager_features.h"
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
@@ -82,6 +84,7 @@
 };
 
 TEST_F(PasswordTabHelperTest, RedirectsToPasswordsAndCancelsRequest) {
+  base::HistogramTester histogram_tester;
   NSURLRequest* request = [NSURLRequest
       requestWithURL:
           [NSURL URLWithString:base::SysUTF8ToNSString(
@@ -107,9 +110,13 @@
   EXPECT_OCMOCK_VERIFY(dispatcher_);
   EXPECT_TRUE(callback_called);
   EXPECT_TRUE(request_policy.ShouldCancelNavigation());
+  histogram_tester.ExpectBucketCount(
+      "PasswordManager.ManagePasswordsReferrer",
+      password_manager::ManagePasswordsReferrer::kPasswordsGoogleWebsite, 1);
 }
 
 TEST_F(PasswordTabHelperTest, NoRedirectWhenWrongLink) {
+  base::HistogramTester histogram_tester;
   NSURLRequest* request =
       [NSURLRequest requestWithURL:[NSURL URLWithString:kWrongURL]];
   const web::WebStatePolicyDecider::RequestInfo request_info(
@@ -130,9 +137,12 @@
   EXPECT_OCMOCK_VERIFY(dispatcher_);
   EXPECT_TRUE(callback_called);
   EXPECT_FALSE(request_policy.ShouldCancelNavigation());
+  histogram_tester.ExpectTotalCount("PasswordManager.ManagePasswordsReferrer",
+                                    0);
 }
 
 TEST_F(PasswordTabHelperTest, NoRedirectWhenWrongTransition) {
+  base::HistogramTester histogram_tester;
   NSURLRequest* request = [NSURLRequest
       requestWithURL:
           [NSURL URLWithString:base::SysUTF8ToNSString(
@@ -155,4 +165,6 @@
   EXPECT_OCMOCK_VERIFY(dispatcher_);
   EXPECT_TRUE(callback_called);
   EXPECT_FALSE(request_policy.ShouldCancelNavigation());
+  histogram_tester.ExpectTotalCount("PasswordManager.ManagePasswordsReferrer",
+                                    0);
 }
diff --git a/ios/chrome/browser/sessions/session_service_ios.mm b/ios/chrome/browser/sessions/session_service_ios.mm
index 5902c8cd..4809e82 100644
--- a/ios/chrome/browser/sessions/session_service_ios.mm
+++ b/ios/chrome/browser/sessions/session_service_ios.mm
@@ -179,12 +179,6 @@
       contentsOfDirectoryAtPath:sessionsDirectory
                           error:nil];
 
-  // If there were no session ids, then scenes are not supported fall back to
-  // the original location.
-  if ([allSessionIDs count] == 0) {
-    allSessionIDs = @[ @"" ];
-  }
-
   [self deleteSessions:allSessionIDs
              directory:directory
             completion:std::move(callback)];
diff --git a/ios/chrome/browser/translate/chrome_ios_translate_client.h b/ios/chrome/browser/translate/chrome_ios_translate_client.h
index 6644f35..6c6c65e 100644
--- a/ios/chrome/browser/translate/chrome_ios_translate_client.h
+++ b/ios/chrome/browser/translate/chrome_ios_translate_client.h
@@ -19,8 +19,11 @@
 
 class PrefService;
 
+namespace language {
+class AcceptLanguagesService;
+}
+
 namespace translate {
-class TranslateAcceptLanguages;
 class TranslatePrefs;
 class TranslateManager;
 }  // namespace translate
@@ -53,7 +56,7 @@
   translate::IOSTranslateDriver* GetTranslateDriver() override;
   PrefService* GetPrefs() override;
   std::unique_ptr<translate::TranslatePrefs> GetTranslatePrefs() override;
-  translate::TranslateAcceptLanguages* GetTranslateAcceptLanguages() override;
+  language::AcceptLanguagesService* GetTranslateAcceptLanguages() override;
   int GetInfobarIconID() const override;
   std::unique_ptr<infobars::InfoBar> CreateInfoBar(
       std::unique_ptr<translate::TranslateInfoBarDelegate> delegate)
diff --git a/ios/chrome/browser/translate/chrome_ios_translate_client.mm b/ios/chrome/browser/translate/chrome_ios_translate_client.mm
index 5dc805f..4825726 100644
--- a/ios/chrome/browser/translate/chrome_ios_translate_client.mm
+++ b/ios/chrome/browser/translate/chrome_ios_translate_client.mm
@@ -12,11 +12,11 @@
 #include "base/memory/ptr_util.h"
 #include "base/notreached.h"
 #include "components/infobars/core/infobar.h"
+#include "components/language/core/browser/accept_languages_service.h"
 #include "components/language/core/browser/language_model_manager.h"
 #include "components/language/core/browser/pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "components/translate/core/browser/page_translated_details.h"
-#include "components/translate/core/browser/translate_accept_languages.h"
 #include "components/translate/core/browser/translate_infobar_delegate.h"
 #include "components/translate/core/browser/translate_manager.h"
 #include "components/translate/core/browser/translate_step.h"
@@ -135,7 +135,7 @@
   return CreateTranslatePrefs(chrome_browser_state->GetPrefs());
 }
 
-translate::TranslateAcceptLanguages*
+language::AcceptLanguagesService*
 ChromeIOSTranslateClient::GetTranslateAcceptLanguages() {
   DCHECK(web_state_);
   return TranslateAcceptLanguagesFactory::GetForBrowserState(
diff --git a/ios/chrome/browser/translate/translate_accept_languages_factory.cc b/ios/chrome/browser/translate/translate_accept_languages_factory.cc
index 0d676b9..fb34d12 100644
--- a/ios/chrome/browser/translate/translate_accept_languages_factory.cc
+++ b/ios/chrome/browser/translate/translate_accept_languages_factory.cc
@@ -7,42 +7,42 @@
 #include "base/no_destructor.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/keyed_service/ios/browser_state_dependency_manager.h"
+#include "components/language/core/browser/accept_languages_service.h"
 #include "components/language/core/browser/pref_names.h"
 #include "components/prefs/pref_service.h"
-#include "components/translate/core/browser/translate_accept_languages.h"
 #include "ios/chrome/browser/browser_state/browser_state_otr_helper.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 
 namespace {
 
-// TranslateAcceptLanguagesService is a thin container for
-// TranslateAcceptLanguages to enable associating it with a BrowserState.
-class TranslateAcceptLanguagesService : public KeyedService {
+// AcceptLanguagesServiceForBrowserState is a thin container for
+// AcceptLanguagesService to enable associating it with a BrowserState.
+class AcceptLanguagesServiceForBrowserState : public KeyedService {
  public:
-  explicit TranslateAcceptLanguagesService(PrefService* prefs);
+  explicit AcceptLanguagesServiceForBrowserState(PrefService* prefs);
 
-  TranslateAcceptLanguagesService(const TranslateAcceptLanguagesService&) =
-      delete;
-  TranslateAcceptLanguagesService& operator=(
-      const TranslateAcceptLanguagesService&) = delete;
+  AcceptLanguagesServiceForBrowserState(
+      const AcceptLanguagesServiceForBrowserState&) = delete;
+  AcceptLanguagesServiceForBrowserState& operator=(
+      const AcceptLanguagesServiceForBrowserState&) = delete;
 
-  ~TranslateAcceptLanguagesService() override;
+  ~AcceptLanguagesServiceForBrowserState() override;
 
-  // Returns the associated TranslateAcceptLanguages.
-  translate::TranslateAcceptLanguages& accept_languages() {
+  // Returns the associated AcceptLanguagesService.
+  language::AcceptLanguagesService& accept_languages() {
     return accept_languages_;
   }
 
  private:
-  translate::TranslateAcceptLanguages accept_languages_;
+  language::AcceptLanguagesService accept_languages_;
 };
 
-TranslateAcceptLanguagesService::TranslateAcceptLanguagesService(
+AcceptLanguagesServiceForBrowserState::AcceptLanguagesServiceForBrowserState(
     PrefService* prefs)
     : accept_languages_(prefs, language::prefs::kAcceptLanguages) {}
 
-TranslateAcceptLanguagesService::~TranslateAcceptLanguagesService() {
-}
+AcceptLanguagesServiceForBrowserState::
+    ~AcceptLanguagesServiceForBrowserState() {}
 
 }  // namespace
 
@@ -54,19 +54,18 @@
 }
 
 // static
-translate::TranslateAcceptLanguages*
+language::AcceptLanguagesService*
 TranslateAcceptLanguagesFactory::GetForBrowserState(ChromeBrowserState* state) {
-  TranslateAcceptLanguagesService* service =
-      static_cast<TranslateAcceptLanguagesService*>(
+  AcceptLanguagesServiceForBrowserState* service =
+      static_cast<AcceptLanguagesServiceForBrowserState*>(
           GetInstance()->GetServiceForBrowserState(state, true));
   return &service->accept_languages();
 }
 
 TranslateAcceptLanguagesFactory::TranslateAcceptLanguagesFactory()
     : BrowserStateKeyedServiceFactory(
-          "TranslateAcceptLanguagesService",
-          BrowserStateDependencyManager::GetInstance()) {
-}
+          "AcceptLanguagesServiceForBrowserState",
+          BrowserStateDependencyManager::GetInstance()) {}
 
 TranslateAcceptLanguagesFactory::~TranslateAcceptLanguagesFactory() {
 }
@@ -76,7 +75,7 @@
     web::BrowserState* context) const {
   ChromeBrowserState* browser_state =
       ChromeBrowserState::FromBrowserState(context);
-  return std::make_unique<TranslateAcceptLanguagesService>(
+  return std::make_unique<AcceptLanguagesServiceForBrowserState>(
       browser_state->GetPrefs());
 }
 
diff --git a/ios/chrome/browser/translate/translate_accept_languages_factory.h b/ios/chrome/browser/translate/translate_accept_languages_factory.h
index 8cd7c69..e4fb2f94 100644
--- a/ios/chrome/browser/translate/translate_accept_languages_factory.h
+++ b/ios/chrome/browser/translate/translate_accept_languages_factory.h
@@ -12,15 +12,15 @@
 
 class ChromeBrowserState;
 
-namespace translate {
-class TranslateAcceptLanguages;
+namespace language {
+class AcceptLanguagesService;
 }
 
-// TranslateAcceptLanguagesFactory is a way to associate a
-// TranslateAcceptLanguages instance to a BrowserState.
+// TranslateAcceptLanguagesFactory is a way to associate an
+// AcceptLanguagesService instance to a BrowserState.
 class TranslateAcceptLanguagesFactory : public BrowserStateKeyedServiceFactory {
  public:
-  static translate::TranslateAcceptLanguages* GetForBrowserState(
+  static language::AcceptLanguagesService* GetForBrowserState(
       ChromeBrowserState* browser_state);
   static TranslateAcceptLanguagesFactory* GetInstance();
 
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_feature.h b/ios/chrome/browser/ui/ntp/new_tab_page_feature.h
index ba6f840..a22db366 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_feature.h
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_feature.h
@@ -23,6 +23,9 @@
 // Feature flag to enable static resource serving for the Discover feed.
 extern const base::Feature kEnableDiscoverFeedStaticResourceServing;
 
+// Feature flag to enable the sync promo on top of the discover feed.
+extern const base::Feature kEnableDiscoverFeedTopSyncPromo;
+
 // A parameter to indicate whether Reconstructed Templates is enabled for static
 // resource serving.
 extern const char kDiscoverFeedSRSReconstructedTemplatesEnabled[];
@@ -31,6 +34,15 @@
 // resource serving.
 extern const char kDiscoverFeedSRSPreloadTemplatesEnabled[];
 
+// A parameter to indicate the style used for the discover feed top promo.
+extern const char kDiscoverFeedTopSyncPromoStyleParam[];
+
+// A parameter value used for displaying the full with title promo style.
+extern const char kDiscoverFeedTopSyncPromoStyleFullWithTitle[];
+
+// A parameter value used for displaying the compact promo style.
+extern const char kDiscoverFeedTopSyncPromoStyleCompact[];
+
 // Feature flag to fix the NTP view hierarchy if it is broken before applying
 // constraints.
 // TODO(crbug.com/1262536): Remove this when it is fixed.
@@ -48,4 +60,7 @@
 // Whether the NTP view hierarchy repair is enabled.
 bool IsNTPViewHierarchyRepairEnabled();
 
+// Whether the Discover feed top sync promotion is enabled.
+bool IsDiscoverFeedTopSyncPromoEnabled();
+
 #endif  // IOS_CHROME_BROWSER_UI_NTP_NEW_TAB_PAGE_FEATURE_H_
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_feature.mm b/ios/chrome/browser/ui/ntp/new_tab_page_feature.mm
index cc27b86..bf73bda9 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_feature.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_feature.mm
@@ -26,6 +26,9 @@
     "EnableDiscoverFeedStaticResourceServing",
     base::FEATURE_DISABLED_BY_DEFAULT};
 
+const base::Feature kEnableDiscoverFeedTopSyncPromo{
+    "EnableDiscoverFeedTopSyncPromo", base::FEATURE_DISABLED_BY_DEFAULT};
+
 const char kDiscoverFeedSRSReconstructedTemplatesEnabled[] =
     "DiscoverFeedSRSReconstructedTemplatesEnabled";
 
@@ -35,6 +38,10 @@
 const base::Feature kNTPViewHierarchyRepair{"NTPViewHierarchyRepair",
                                             base::FEATURE_ENABLED_BY_DEFAULT};
 
+const char kDiscoverFeedTopSyncPromoStyleParam[] = "FeedTopPromoStyle";
+const char kDiscoverFeedTopSyncPromoStyleFullWithTitle[] = "fullWithTitle";
+const char kDiscoverFeedTopSyncPromoStyleCompact[] = "compact";
+
 bool IsDiscoverFeedPreviewEnabled() {
   return base::FeatureList::IsEnabled(kEnableDiscoverFeedPreview);
 }
@@ -50,3 +57,7 @@
 bool IsNTPViewHierarchyRepairEnabled() {
   return base::FeatureList::IsEnabled(kNTPViewHierarchyRepair);
 }
+
+bool IsDiscoverFeedTopSyncPromoEnabled() {
+  return base::FeatureList::IsEnabled(kEnableDiscoverFeedTopSyncPromo);
+}
diff --git a/ios/chrome/browser/ui/omnibox/popup/shared/popup_ui_configuration.swift b/ios/chrome/browser/ui/omnibox/popup/shared/popup_ui_configuration.swift
index 6135a037..a9d028d0 100644
--- a/ios/chrome/browser/ui/omnibox/popup/shared/popup_ui_configuration.swift
+++ b/ios/chrome/browser/ui/omnibox/popup/shared/popup_ui_configuration.swift
@@ -90,4 +90,30 @@
       }
     }
   }
+
+  /// This configuration can be used for the Previews project and has
+  /// reasonable defaults
+  static func previewsConfiguration() -> PopupUIConfiguration {
+    let UIConfiguration = PopupUIConfiguration(
+      toolbarConfiguration: ToolbarConfiguration(style: .NORMAL))
+    UIConfiguration.omniboxLeadingSpace = 10
+    UIConfiguration.omniboxTrailingSpace = 10
+    UIConfiguration.safeAreaTrailingSpace = 2
+    UIConfiguration.omniboxLeadingImageLeadingSpace = 22
+    UIConfiguration.omniboxTextFieldLeadingSpace = 51
+    return UIConfiguration
+  }
+
+  /// This configuration can be used for the Previews project and has
+  /// reasonable defaults for an iPad
+  static func previewsConfigurationIPad() -> PopupUIConfiguration {
+    let UIConfiguration = PopupUIConfiguration(
+      toolbarConfiguration: ToolbarConfiguration(style: .NORMAL))
+    UIConfiguration.omniboxLeadingSpace = 200
+    UIConfiguration.omniboxTrailingSpace = 120
+    UIConfiguration.safeAreaTrailingSpace = 200
+    UIConfiguration.omniboxLeadingImageLeadingSpace = 30
+    UIConfiguration.omniboxTextFieldLeadingSpace = 140
+    return UIConfiguration
+  }
 }
diff --git a/ios/chrome/browser/ui/omnibox/popup/shared/popup_view.swift b/ios/chrome/browser/ui/omnibox/popup/shared/popup_view.swift
index f99c494..4eaf25ab 100644
--- a/ios/chrome/browser/ui/omnibox/popup/shared/popup_view.swift
+++ b/ios/chrome/browser/ui/omnibox/popup/shared/popup_view.swift
@@ -4,21 +4,6 @@
 
 import SwiftUI
 
-/// Utility which provides a way to treat the `simultaneousGesture` view modifier as a value.
-struct SimultaneousGestureModifier<T: Gesture>: ViewModifier {
-  let gesture: T
-  let mask: GestureMask
-
-  init(_ gesture: T, including mask: GestureMask = .all) {
-    self.gesture = gesture
-    self.mask = mask
-  }
-
-  func body(content: Content) -> some View {
-    content.simultaneousGesture(gesture, including: mask)
-  }
-}
-
 /// A view modifier which embeds the content in a `ScrollViewReader` and calls `action`
 /// when the provided `value` changes. It is similar to the `onChange` view modifier, but provides
 /// a `ScrollViewProxy` object in addition to the new state of `value` when calling `action`.
@@ -159,66 +144,80 @@
     self.appearanceContainerType = appearanceContainerType
   }
 
+  /// Determines if a custom separator should be shown for a given row.
+  func shouldDisplayCustomSeparators(
+    section: PopupMatchSection, indexPath: IndexPath, isHighlighted: Bool
+  ) -> Bool {
+    // No separator on the last row in a section.
+    // No separators when there is one or 0 rows in a section.
+    // No separator on highlighted row.
+    return
+      !isHighlighted && (section.matches.count > 1)
+      && (indexPath.row < section.matches.count - 1)
+  }
+
+  /// View for a single PopupMatchSection of the suggestion list.
+  @ViewBuilder func sectionContents(
+    _ sectionIndex: Int, _ section: PopupMatchSection, _ geometry: GeometryProxy
+  ) -> some View {
+    ForEach(Array(zip(section.matches.indices, section.matches)), id: \.0) {
+      matchIndex, match in
+      let indexPath = IndexPath(row: matchIndex, section: sectionIndex)
+      let highlighted = indexPath == model.highlightedMatchIndexPath
+
+      PopupMatchRowView(
+        match: match,
+        isHighlighted: highlighted,
+        toolbarConfiguration: uiConfiguration.toolbarConfiguration,
+        selectionHandler: {
+          model.delegate?.autocompleteResultConsumer(
+            model, didSelectRow: UInt(matchIndex), inSection: UInt(sectionIndex))
+        },
+        trailingButtonHandler: {
+          model.delegate?.autocompleteResultConsumer(
+            model, didTapTrailingButtonForRow: UInt(matchIndex),
+            inSection: UInt(sectionIndex))
+        },
+        uiConfiguration: uiConfiguration,
+        shouldDisplayCustomSeparator: shouldDisplayCustomSeparators(
+          section: section, indexPath: indexPath, isHighlighted: highlighted)
+      )
+      .id(indexPath)
+      .deleteDisabled(!match.supportsDeletion)
+      .listRowInsets(Dimensions.matchListRowInsets)
+      .listRowBackground(Color.clear)
+      .accessibilityElement(children: .combine)
+      .accessibilityIdentifier(
+        OmniboxPopupAccessibilityIdentifierHelper.accessibilityIdentifierForRow(at: indexPath)
+      )
+      .environment(\.layoutDirection, layoutDirection)
+    }
+    .onDelete { indexSet in
+      for matchIndex in indexSet {
+        model.delegate?.autocompleteResultConsumer(
+          model, didSelectRowForDeletion: UInt(matchIndex), inSection: UInt(sectionIndex))
+      }
+    }
+  }
+
+  /// Section footer, to be used in variation two.
+  @ViewBuilder func footerForVariationTwo() -> some View {
+    Spacer()
+      // Use `leastNonzeroMagnitude` to remove the footer. Otherwise,
+      // it uses a default height.
+      .frame(height: CGFloat.leastNonzeroMagnitude)
+      .listRowInsets(EdgeInsets())
+  }
+
   func listContent(geometry: GeometryProxy) -> some View {
     ForEach(Array(zip(model.sections.indices, model.sections)), id: \.0) {
       sectionIndex, section in
 
-      let sectionContents =
-        ForEach(Array(zip(section.matches.indices, section.matches)), id: \.0) {
-          matchIndex, match in
-          let indexPath = IndexPath(row: matchIndex, section: sectionIndex)
-          let highlighted = indexPath == model.highlightedMatchIndexPath
-          // UI Variation 1 always has separators. Variation 2 doesn't have
-          // one on the last row in a section.
-          // If there is only one row or less in a section, no row separators.
-          let shouldDisplayCustomSeparator =
-            !highlighted && (section.matches.count > 1)
-            && (matchIndex < section.matches.count - 1)
-
-          PopupMatchRowView(
-            match: match,
-            isHighlighted: highlighted,
-            toolbarConfiguration: uiConfiguration.toolbarConfiguration,
-            selectionHandler: {
-              model.delegate?.autocompleteResultConsumer(
-                model, didSelectRow: UInt(matchIndex), inSection: UInt(sectionIndex))
-            },
-            trailingButtonHandler: {
-              model.delegate?.autocompleteResultConsumer(
-                model, didTapTrailingButtonForRow: UInt(matchIndex),
-                inSection: UInt(sectionIndex))
-            },
-            uiConfiguration: uiConfiguration,
-            shouldDisplayCustomSeparator: shouldDisplayCustomSeparator
-          )
-          .id(indexPath)
-          .deleteDisabled(!match.supportsDeletion)
-          .listRowInsets(Dimensions.matchListRowInsets)
-          .listRowBackground(Color.clear)
-          .accessibilityElement(children: .combine)
-          .accessibilityIdentifier(
-            OmniboxPopupAccessibilityIdentifierHelper.accessibilityIdentifierForRow(at: indexPath)
-          )
-          .environment(\.layoutDirection, layoutDirection)
-        }
-        .onDelete { indexSet in
-          for matchIndex in indexSet {
-            model.delegate?.autocompleteResultConsumer(
-              model, didSelectRowForDeletion: UInt(matchIndex), inSection: UInt(sectionIndex))
-          }
-        }
-
-      let footerForVariationTwo = Spacer()
-        // Use `leastNonzeroMagnitude` to remove the footer. Otherwise,
-        // it uses a default height.
-        .frame(height: CGFloat.leastNonzeroMagnitude)
-        .listRowInsets(EdgeInsets())
-
       Section(
         header: header(for: section, at: sectionIndex, geometry: geometry),
-        footer: popupUIVariation == .one ? nil : footerForVariationTwo
+        footer: popupUIVariation == .one ? nil : footerForVariationTwo()
       ) {
-        sectionContents
+        sectionContents(sectionIndex, section, geometry)
       }
     }
   }
@@ -429,19 +428,26 @@
 }
 
 struct PopupView_Previews: PreviewProvider {
+
+  static func model() -> PopupModel {
+    PopupModel(
+      matches: [PopupMatch.previews], headers: ["Suggestions"], delegate: nil)
+  }
+
   static var previews: some View {
-    let sample =
-      PopupView(
-        model: PopupModel(
-          matches: [PopupMatch.previews], headers: ["Suggestions"], delegate: nil),
-        uiConfiguration: PopupUIConfiguration(
-          toolbarConfiguration: ToolbarConfiguration(style: .NORMAL))
-      )
+
+    let sample = PopupView(
+      model: model(), uiConfiguration: PopupUIConfiguration.previewsConfiguration()
+    ).previewDevice(PreviewDevice(rawValue: "iPhone 13 mini"))
 
     sample.environment(\.popupUIVariation, .one)
     sample.environment(\.popupUIVariation, .two)
+
     sample.environment(\.locale, .init(identifier: "ar"))
 
+    PopupView(model: model(), uiConfiguration: PopupUIConfiguration.previewsConfigurationIPad())
+      .previewDevice(PreviewDevice(rawValue: "iPad Pro (11-inch)"))
+
     let darkSample = sample.environment(\.colorScheme, .dark)
 
     darkSample.environment(\.popupUIVariation, .one)
diff --git a/ios/chrome/browser/ui/omnibox/popup/swiftui_previews/omnibox_popup/external_defines.swift b/ios/chrome/browser/ui/omnibox/popup/swiftui_previews/omnibox_popup/external_defines.swift
index d45b2cc0..d61804c 100644
--- a/ios/chrome/browser/ui/omnibox/popup/swiftui_previews/omnibox_popup/external_defines.swift
+++ b/ios/chrome/browser/ui/omnibox/popup/swiftui_previews/omnibox_popup/external_defines.swift
@@ -58,3 +58,7 @@
     fatalError("This image ID is not available in the previews project")
   }
 }
+
+let kToolbarSeparatorHeight = 0.1
+let kContractedLocationBarHorizontalMargin = 15.0
+let kExpandedLocationBarLeadingMarginRefreshedPopup = 16.0
diff --git a/ios/chrome/browser/ui/omnibox/popup/swiftui_previews/omnibox_popup/popup_coordinator.swift b/ios/chrome/browser/ui/omnibox/popup/swiftui_previews/omnibox_popup/popup_coordinator.swift
index 6d1965d..1326ef4 100644
--- a/ios/chrome/browser/ui/omnibox/popup/swiftui_previews/omnibox_popup/popup_coordinator.swift
+++ b/ios/chrome/browser/ui/omnibox/popup/swiftui_previews/omnibox_popup/popup_coordinator.swift
@@ -31,18 +31,10 @@
     let mediator = PopupMediator()
     self.mediator = mediator
 
-    let uiConfiguration = PopupUIConfiguration(
-      toolbarConfiguration: ToolbarConfiguration(style: .NORMAL))
-    uiConfiguration.omniboxLeadingSpace = 10
-    uiConfiguration.omniboxTrailingSpace = 100
-    uiConfiguration.safeAreaTrailingSpace = 10
-    uiConfiguration.omniboxLeadingImageLeadingSpace = 22
-    uiConfiguration.omniboxTextFieldLeadingSpace = 51
-
     let viewController = UIHostingController(
       rootView: PopupView(
         model: mediator.model,
-        uiConfiguration: uiConfiguration
+        uiConfiguration: PopupUIConfiguration.previewsConfiguration()
       ).environment(\.popupUIVariation, .one))
     self.viewController = viewController
     viewController.view.translatesAutoresizingMaskIntoConstraints = false
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm
index 266dd106..3fecf05 100644
--- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm
+++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm
@@ -133,31 +133,36 @@
                                           handler:handler];
 }
 
-std::string UmaNameForDestination(Destination destination) {
+void RecordUmaActionForDestination(Destination destination) {
   switch (destination) {
     case Destination::Bookmarks:
-      return "MobileMenuAllBookmarks";
+      RecordAction(UserMetricsAction("MobileMenuAllBookmarks"));
+      break;
     case Destination::History:
-      return "MobileMenuHistory";
+      RecordAction(UserMetricsAction("MobileMenuHistory"));
+      break;
     case Destination::ReadingList:
-      return "MobileMenuReadingList";
+      RecordAction(UserMetricsAction("MobileMenuReadingList"));
+      break;
     case Destination::Passwords:
-      return "MobileMenuPasswords";
+      RecordAction(UserMetricsAction("MobileMenuPasswords"));
+      break;
     case Destination::Downloads:
-      return "MobileDownloadFolderUIShownFromToolsMenu";
+      RecordAction(
+          UserMetricsAction("MobileDownloadFolderUIShownFromToolsMenu"));
+      break;
     case Destination::RecentTabs:
-      return "MobileMenuRecentTabs";
+      RecordAction(UserMetricsAction("MobileMenuRecentTabs"));
+      break;
     case Destination::SiteInfo:
-      return "MobileMenuSiteInformation";
+      RecordAction(UserMetricsAction("MobileMenuSiteInformation"));
+      break;
     case Destination::Settings:
-      return "MobileMenuSettings";
+      RecordAction(UserMetricsAction("MobileMenuSettings"));
+      break;
   }
 }
 
-base::UserMetricsAction UmaActionForDestination(Destination destination) {
-  return UserMetricsAction(UmaNameForDestination(destination).c_str());
-}
-
 OverflowMenuDestination* CreateOverflowMenuDestination(
     int nameID,
     Destination destinationEnum,
@@ -167,7 +172,7 @@
   NSString* name = l10n_util::GetNSString(nameID);
 
   auto handlerWithMetrics = ^{
-    RecordAction(UmaActionForDestination(destinationEnum));
+    RecordUmaActionForDestination(destinationEnum);
     handler();
   };
 
diff --git a/ios/chrome/browser/ui/settings/password/passwords_table_view_controller.mm b/ios/chrome/browser/ui/settings/password/passwords_table_view_controller.mm
index b5efa2d..c5a36225 100644
--- a/ios/chrome/browser/ui/settings/password/passwords_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/password/passwords_table_view_controller.mm
@@ -577,7 +577,9 @@
                                    update:NO];
 
   // On-device encryption.
-  [self updateOnDeviceEncryptionSessionWithUpdateTableView:NO];
+  [self updateOnDeviceEncryptionSessionWithUpdateTableView:NO
+                                          withRowAnimation:
+                                              UITableViewRowAnimationNone];
 
   // Saved passwords.
   if (!_savedForms.empty()) {
@@ -622,13 +624,13 @@
 
 // Updates "on-device encryption" related UI.
 // |updateTableView| whether the Table View should be updated.
-- (void)updateOnDeviceEncryptionSessionWithUpdateTableView:
-    (BOOL)updateTableView {
+// |rowAnimation| the direction in which the row appears.
+- (void)updateOnDeviceEncryptionSessionWithUpdateTableView:(BOOL)updateTableView
+                                          withRowAnimation:
+                                              (UITableViewRowAnimation)
+                                                  rowAnimation {
   OnDeviceEncryptionState oldState = self.onDeviceEncryptionStateInModel;
-  OnDeviceEncryptionState newState =
-      self.navigationItem.searchController.active
-          ? OnDeviceEncryptionStateNotShown
-          : [self.delegate onDeviceEncryptionState];
+  OnDeviceEncryptionState newState = [self.delegate onDeviceEncryptionState];
   if (newState == oldState) {
     return;
   }
@@ -699,10 +701,10 @@
   }
   if (oldState == OnDeviceEncryptionStateNotShown) {
     [self.tableView insertSections:sectionIdentifierOnDeviceEncryptionIndexSet
-                  withRowAnimation:UITableViewRowAnimationAutomatic];
+                  withRowAnimation:rowAnimation];
   } else {
     [self.tableView reloadSections:sectionIdentifierOnDeviceEncryptionIndexSet
-                  withRowAnimation:UITableViewRowAnimationAutomatic];
+                  withRowAnimation:rowAnimation];
   }
 }
 
@@ -1213,7 +1215,12 @@
 }
 
 - (void)updateOnDeviceEncryptionSessionAndUpdateTableView {
-  [self updateOnDeviceEncryptionSessionWithUpdateTableView:YES];
+  if (!self.navigationItem.searchController.active) {
+    [self
+        updateOnDeviceEncryptionSessionWithUpdateTableView:YES
+                                          withRowAnimation:
+                                              UITableViewRowAnimationAutomatic];
+  }
 }
 
 #pragma mark - UITableViewDelegate
@@ -1259,12 +1266,22 @@
 
 - (void)willPresentSearchController:(UISearchController*)searchController {
   [self showScrim];
-  // Remove save passwords switch section and password check section.
+  // Remove save passwords switch section, password check section and
+  // on device encryption.
+
   [self
       performBatchTableViewUpdates:^{
+        // Sections must be removed from bottom to top, otherwise it crashes
+        [self clearSectionWithIdentifier:SectionIdentifierOnDeviceEncryption
+                        withRowAnimation:UITableViewRowAnimationTop];
+        self.onDeviceEncryptionStateInModel = OnDeviceEncryptionStateNotShown;
+
         [self clearSectionWithIdentifier:SectionIdentifierPasswordCheck
                         withRowAnimation:UITableViewRowAnimationTop];
 
+        [self clearSectionWithIdentifier:SectionIdentifierPasswordsInOtherApps
+                        withRowAnimation:UITableViewRowAnimationTop];
+
         [self clearSectionWithIdentifier:SectionIdentifierSavePasswordsSwitch
                         withRowAnimation:UITableViewRowAnimationTop];
 
@@ -1285,6 +1302,7 @@
   TableViewModel* model = self.tableViewModel;
   [self.tableView
       performBatchUpdates:^{
+        // Add "Save Password Switch" section.
         [model insertSectionWithIdentifier:SectionIdentifierSavePasswordsSwitch
                                    atIndex:0];
         [model setHeader:_manageAccountLinkItem
@@ -1304,12 +1322,31 @@
             arrayWithObjects:[NSIndexPath indexPathForRow:0
                                                 inSection:switchSection],
                              nil];
-        [model insertSectionWithIdentifier:SectionIdentifierPasswordCheck
+
+        // Add "Password in other app" section.
+        [model insertSectionWithIdentifier:SectionIdentifierPasswordsInOtherApps
                                    atIndex:1];
+        NSInteger otherAppSection = [model
+            sectionForSectionIdentifier:SectionIdentifierPasswordsInOtherApps];
+
+        [self.tableView insertSections:[NSIndexSet indexSetWithIndex:1]
+                      withRowAnimation:UITableViewRowAnimationTop];
+        [model addItem:_passwordsInOtherAppsItem
+            toSectionWithIdentifier:SectionIdentifierPasswordsInOtherApps];
+        [rowsIndexPaths
+            addObject:[NSIndexPath indexPathForRow:0
+                                         inSection:otherAppSection]];
+
+        [self.tableView insertRowsAtIndexPaths:rowsIndexPaths
+                              withRowAnimation:UITableViewRowAnimationTop];
+
+        // Add "Password check" section.
+        [model insertSectionWithIdentifier:SectionIdentifierPasswordCheck
+                                   atIndex:2];
         NSInteger checkSection =
             [model sectionForSectionIdentifier:SectionIdentifierPasswordCheck];
 
-        [self.tableView insertSections:[NSIndexSet indexSetWithIndex:1]
+        [self.tableView insertSections:[NSIndexSet indexSetWithIndex:2]
                       withRowAnimation:UITableViewRowAnimationTop];
         [model addItem:_passwordProblemsItem
             toSectionWithIdentifier:SectionIdentifierPasswordCheck];
@@ -1328,6 +1365,11 @@
                     kSupportForAddPasswordsInSettings)) {
           self.navigationController.toolbarHidden = NO;
         }
+
+        // Add "On-device encryption" section.
+        [self updateOnDeviceEncryptionSessionWithUpdateTableView:YES
+                                                withRowAnimation:
+                                                    UITableViewRowAnimationTop];
       }
                completion:nil];
 }
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_mediator.mm b/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_mediator.mm
index 33e352d..8998c16 100644
--- a/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_mediator.mm
+++ b/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_mediator.mm
@@ -39,7 +39,7 @@
 namespace {
 
 // The size of the symbol image.
-NSInteger kSymbolImagePointSize = 20;
+NSInteger kSymbolImagePointSize = 17;
 
 // List of item types.
 typedef NS_ENUM(NSInteger, ItemType) {
@@ -198,29 +198,33 @@
                                     detailText:(NSInteger)detailText
                        accessibilityIdentifier:
                            (NSString*)accessibilityIdentifier {
-  TableViewInfoButtonItem* managedItem =
+  TableViewInfoButtonItem* infoButtonItem =
       [[TableViewInfoButtonItem alloc] initWithType:type];
-  managedItem.text = l10n_util::GetNSString(titleId);
-  managedItem.detailText = l10n_util::GetNSString(detailText);
+  infoButtonItem.text = l10n_util::GetNSString(titleId);
+  infoButtonItem.detailText = l10n_util::GetNSString(detailText);
   // If Safe Browsing is controlled by enterprise, make non-selected options
   // greyed out.
   if (self.enterpriseEnabled && ![self shouldItemTypeHaveCheckmark:type]) {
-    managedItem.textColor =
+    infoButtonItem.textColor =
         [[UIColor colorNamed:kTextPrimaryColor] colorWithAlphaComponent:0.4f];
-    managedItem.detailTextColor =
+    infoButtonItem.detailTextColor =
         [[UIColor colorNamed:kTextSecondaryColor] colorWithAlphaComponent:0.4f];
-    managedItem.accessibilityHint = l10n_util::GetNSString(
+    infoButtonItem.accessibilityHint = l10n_util::GetNSString(
         IDS_IOS_TOGGLE_SETTING_MANAGED_ACCESSIBILITY_HINT);
   }
-  managedItem.image =
-      DefaultSymbolWithPointSize(kCheckmarkSymbol, kSymbolImagePointSize);
-  managedItem.tintColor = [self shouldItemTypeHaveCheckmark:type]
-                              ? [UIColor colorNamed:kBlueColor]
-                              : [UIColor clearColor];
-  managedItem.accessibilityIdentifier = accessibilityIdentifier;
-  managedItem.accessibilityDelegate = self;
+  UIImageConfiguration* configuration = [UIImageSymbolConfiguration
+      configurationWithPointSize:kSymbolImagePointSize
+                          weight:UIImageSymbolWeightSemibold
+                           scale:UIImageSymbolScaleMedium];
+  infoButtonItem.image =
+      DefaultSymbolWithConfiguration(kCheckmarkSymbol, configuration);
+  infoButtonItem.tintColor = [self shouldItemTypeHaveCheckmark:type]
+                                 ? [UIColor colorNamed:kBlueColor]
+                                 : [UIColor clearColor];
+  infoButtonItem.accessibilityIdentifier = accessibilityIdentifier;
+  infoButtonItem.accessibilityDelegate = self;
 
-  return managedItem;
+  return infoButtonItem;
 }
 
 // Returns whether an ItemType should have a checkmark based on its related
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_info_button_cell.mm b/ios/chrome/browser/ui/table_view/cells/table_view_info_button_cell.mm
index f89f886..80ad9144 100644
--- a/ios/chrome/browser/ui/table_view/cells/table_view_info_button_cell.mm
+++ b/ios/chrome/browser/ui/table_view/cells/table_view_info_button_cell.mm
@@ -65,6 +65,7 @@
     _iconImageView = [[UIImageView alloc] init];
     _iconImageView.translatesAutoresizingMaskIntoConstraints = NO;
     _iconImageView.hidden = YES;
+    _iconImageView.contentMode = UIViewContentModeCenter;
     [self.contentView addSubview:_iconImageView];
 
     UILayoutGuide* textLayoutGuide = [[UILayoutGuide alloc] init];
diff --git a/ios/web_view/internal/translate/cwv_translation_controller_unittest.mm b/ios/web_view/internal/translate/cwv_translation_controller_unittest.mm
index 3f4ff03..47d96958 100644
--- a/ios/web_view/internal/translate/cwv_translation_controller_unittest.mm
+++ b/ios/web_view/internal/translate/cwv_translation_controller_unittest.mm
@@ -54,12 +54,11 @@
 
 class MockWebViewTranslateClient : public WebViewTranslateClient {
  public:
-  MockWebViewTranslateClient(
-      PrefService* pref_service,
-      translate::TranslateRanker* translate_ranker,
-      language::LanguageModel* language_model,
-      web::WebState* web_state,
-      translate::TranslateAcceptLanguages* accept_languages)
+  MockWebViewTranslateClient(PrefService* pref_service,
+                             translate::TranslateRanker* translate_ranker,
+                             language::LanguageModel* language_model,
+                             web::WebState* web_state,
+                             language::AcceptLanguagesService* accept_languages)
       : WebViewTranslateClient(pref_service,
                                translate_ranker,
                                language_model,
@@ -127,7 +126,7 @@
     pref_service_.registry()->RegisterDictionaryPref(
         translate::TranslatePrefs::kPrefTranslateAutoNeverCount);
 
-    accept_languages_ = std::make_unique<translate::TranslateAcceptLanguages>(
+    accept_languages_ = std::make_unique<language::AcceptLanguagesService>(
         &pref_service_, language::prefs::kAcceptLanguages);
 
     auto translate_client = std::make_unique<MockWebViewTranslateClient>(
@@ -158,7 +157,7 @@
   translate::testing::MockTranslateRanker translate_ranker_;
   TestLanguageModel language_model_;
   TestingPrefServiceSimple pref_service_;
-  std::unique_ptr<translate::TranslateAcceptLanguages> accept_languages_;
+  std::unique_ptr<language::AcceptLanguagesService> accept_languages_;
   web::FakeBrowserState browser_state_;
   web::FakeWebState web_state_;
   MockWebViewTranslateClient* translate_client_;
diff --git a/ios/web_view/internal/translate/web_view_translate_accept_languages_factory.h b/ios/web_view/internal/translate/web_view_translate_accept_languages_factory.h
index 0a81e5f..35a0a3eb 100644
--- a/ios/web_view/internal/translate/web_view_translate_accept_languages_factory.h
+++ b/ios/web_view/internal/translate/web_view_translate_accept_languages_factory.h
@@ -10,20 +10,20 @@
 #include "base/no_destructor.h"
 #include "components/keyed_service/ios/browser_state_keyed_service_factory.h"
 
-namespace translate {
-class TranslateAcceptLanguages;
+namespace language {
+class AcceptLanguagesService;
 }
 
 namespace ios_web_view {
 
 class WebViewBrowserState;
 
-// TranslateAcceptLanguagesFactory is a way to associate a
-// TranslateAcceptLanguages instance to a BrowserState.
+// TranslateAcceptLanguagesFactory is a way to associate an
+// AcceptLanguagesService instance to a BrowserState.
 class WebViewTranslateAcceptLanguagesFactory
     : public BrowserStateKeyedServiceFactory {
  public:
-  static translate::TranslateAcceptLanguages* GetForBrowserState(
+  static language::AcceptLanguagesService* GetForBrowserState(
       WebViewBrowserState* browser_state);
   static WebViewTranslateAcceptLanguagesFactory* GetInstance();
 
diff --git a/ios/web_view/internal/translate/web_view_translate_accept_languages_factory.mm b/ios/web_view/internal/translate/web_view_translate_accept_languages_factory.mm
index 8d8d6d5..5c5a049a 100644
--- a/ios/web_view/internal/translate/web_view_translate_accept_languages_factory.mm
+++ b/ios/web_view/internal/translate/web_view_translate_accept_languages_factory.mm
@@ -7,9 +7,9 @@
 #include "base/no_destructor.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/keyed_service/ios/browser_state_dependency_manager.h"
+#include "components/language/core/browser/accept_languages_service.h"
 #include "components/language/core/browser/pref_names.h"
 #include "components/prefs/pref_service.h"
-#include "components/translate/core/browser/translate_accept_languages.h"
 #include "ios/web_view/internal/web_view_browser_state.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -18,33 +18,34 @@
 
 namespace {
 
-// TranslateAcceptLanguagesService is a thin container for
-// TranslateAcceptLanguages to enable associating it with a BrowserState.
-class TranslateAcceptLanguagesService : public KeyedService {
+// AcceptLanguagesServiceForBrowserState is a thin container for
+// AcceptLanguagesService to enable associating it with a BrowserState.
+class AcceptLanguagesServiceForBrowserState : public KeyedService {
  public:
-  explicit TranslateAcceptLanguagesService(PrefService* prefs);
+  explicit AcceptLanguagesServiceForBrowserState(PrefService* prefs);
 
-  TranslateAcceptLanguagesService(const TranslateAcceptLanguagesService&) =
-      delete;
-  TranslateAcceptLanguagesService& operator=(
-      const TranslateAcceptLanguagesService&) = delete;
+  AcceptLanguagesServiceForBrowserState(
+      const AcceptLanguagesServiceForBrowserState&) = delete;
+  AcceptLanguagesServiceForBrowserState& operator=(
+      const AcceptLanguagesServiceForBrowserState&) = delete;
 
-  ~TranslateAcceptLanguagesService() override;
+  ~AcceptLanguagesServiceForBrowserState() override;
 
-  // Returns the associated TranslateAcceptLanguages.
-  translate::TranslateAcceptLanguages& accept_languages() {
+  // Returns the associated AcceptLanguagesService.
+  language::AcceptLanguagesService& accept_languages() {
     return accept_languages_;
   }
 
  private:
-  translate::TranslateAcceptLanguages accept_languages_;
+  language::AcceptLanguagesService accept_languages_;
 };
 
-TranslateAcceptLanguagesService::TranslateAcceptLanguagesService(
+AcceptLanguagesServiceForBrowserState::AcceptLanguagesServiceForBrowserState(
     PrefService* prefs)
     : accept_languages_(prefs, language::prefs::kAcceptLanguages) {}
 
-TranslateAcceptLanguagesService::~TranslateAcceptLanguagesService() = default;
+AcceptLanguagesServiceForBrowserState::
+    ~AcceptLanguagesServiceForBrowserState() = default;
 
 }  // namespace
 
@@ -58,18 +59,18 @@
 }
 
 // static
-translate::TranslateAcceptLanguages*
+language::AcceptLanguagesService*
 WebViewTranslateAcceptLanguagesFactory::GetForBrowserState(
     WebViewBrowserState* browser_state) {
-  TranslateAcceptLanguagesService* service =
-      static_cast<TranslateAcceptLanguagesService*>(
+  AcceptLanguagesServiceForBrowserState* service =
+      static_cast<AcceptLanguagesServiceForBrowserState*>(
           GetInstance()->GetServiceForBrowserState(browser_state, true));
   return &service->accept_languages();
 }
 
 WebViewTranslateAcceptLanguagesFactory::WebViewTranslateAcceptLanguagesFactory()
     : BrowserStateKeyedServiceFactory(
-          "TranslateAcceptLanguagesService",
+          "AcceptLanguagesServiceForBrowserState",
           BrowserStateDependencyManager::GetInstance()) {}
 
 WebViewTranslateAcceptLanguagesFactory::
@@ -80,7 +81,7 @@
     web::BrowserState* context) const {
   WebViewBrowserState* browser_state =
       WebViewBrowserState::FromBrowserState(context);
-  return std::make_unique<TranslateAcceptLanguagesService>(
+  return std::make_unique<AcceptLanguagesServiceForBrowserState>(
       browser_state->GetPrefs());
 }
 
diff --git a/ios/web_view/internal/translate/web_view_translate_client.h b/ios/web_view/internal/translate/web_view_translate_client.h
index cb34866c..49d0e4d 100644
--- a/ios/web_view/internal/translate/web_view_translate_client.h
+++ b/ios/web_view/internal/translate/web_view_translate_client.h
@@ -8,9 +8,9 @@
 #include <memory>
 #include <string>
 
+#include "components/language/core/browser/accept_languages_service.h"
 #include "components/language/core/browser/language_model.h"
 #include "components/prefs/pref_service.h"
-#include "components/translate/core/browser/translate_accept_languages.h"
 #include "components/translate/core/browser/translate_client.h"
 #include "components/translate/core/browser/translate_manager.h"
 #include "components/translate/core/browser/translate_prefs.h"
@@ -35,7 +35,7 @@
       translate::TranslateRanker* translate_ranker,
       language::LanguageModel* language_model,
       web::WebState* web_state,
-      translate::TranslateAcceptLanguages* accept_languages);
+      language::AcceptLanguagesService* accept_languages);
 
   WebViewTranslateClient(const WebViewTranslateClient&) = delete;
   WebViewTranslateClient& operator=(const WebViewTranslateClient&) = delete;
@@ -67,7 +67,7 @@
   translate::IOSTranslateDriver* GetTranslateDriver() override;
   PrefService* GetPrefs() override;
   std::unique_ptr<translate::TranslatePrefs> GetTranslatePrefs() override;
-  translate::TranslateAcceptLanguages* GetTranslateAcceptLanguages() override;
+  language::AcceptLanguagesService* GetTranslateAcceptLanguages() override;
   int GetInfobarIconID() const override;
   std::unique_ptr<infobars::InfoBar> CreateInfoBar(
       std::unique_ptr<translate::TranslateInfoBarDelegate> delegate)
@@ -84,7 +84,7 @@
   PrefService* pref_service_;
   translate::TranslateManager translate_manager_;
   translate::IOSTranslateDriver translate_driver_;
-  translate::TranslateAcceptLanguages* accept_languages_;
+  language::AcceptLanguagesService* accept_languages_;
 
   // ObjC class that wraps this class.
   __weak CWVTranslationController* translation_controller_ = nil;
diff --git a/ios/web_view/internal/translate/web_view_translate_client.mm b/ios/web_view/internal/translate/web_view_translate_client.mm
index 507d84f..071a2f5 100644
--- a/ios/web_view/internal/translate/web_view_translate_client.mm
+++ b/ios/web_view/internal/translate/web_view_translate_client.mm
@@ -46,7 +46,7 @@
     translate::TranslateRanker* translate_ranker,
     language::LanguageModel* language_model,
     web::WebState* web_state,
-    translate::TranslateAcceptLanguages* accept_languages)
+    language::AcceptLanguagesService* accept_languages)
     : pref_service_(pref_service),
       translate_manager_(this, translate_ranker, language_model),
       translate_driver_(web_state,
@@ -114,7 +114,7 @@
   return std::make_unique<translate::TranslatePrefs>(GetPrefs());
 }
 
-translate::TranslateAcceptLanguages*
+language::AcceptLanguagesService*
 WebViewTranslateClient::GetTranslateAcceptLanguages() {
   return accept_languages_;
 }
diff --git a/media/gpu/chromeos/dmabuf_video_frame_pool.h b/media/gpu/chromeos/dmabuf_video_frame_pool.h
index 87840b21..74b0b79e 100644
--- a/media/gpu/chromeos/dmabuf_video_frame_pool.h
+++ b/media/gpu/chromeos/dmabuf_video_frame_pool.h
@@ -18,10 +18,6 @@
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
 
-namespace gpu {
-class GpuMemoryBufferFactory;
-}  // namespace gpu
-
 namespace media {
 
 // Forward declare for use in AsPlatformVideoFramePool.
@@ -38,7 +34,6 @@
 
   using CreateFrameCB =
       base::RepeatingCallback<CroStatus::Or<scoped_refptr<VideoFrame>>(
-          gpu::GpuMemoryBufferFactory*,
           VideoPixelFormat,
           const gfx::Size&,
           const gfx::Rect&,
diff --git a/media/gpu/chromeos/platform_video_frame_pool.cc b/media/gpu/chromeos/platform_video_frame_pool.cc
index 019bf5a..1f077cda 100644
--- a/media/gpu/chromeos/platform_video_frame_pool.cc
+++ b/media/gpu/chromeos/platform_video_frame_pool.cc
@@ -20,7 +20,6 @@
 
 // The default method to create frames.
 CroStatus::Or<scoped_refptr<VideoFrame>> DefaultCreateFrame(
-    gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
     VideoPixelFormat format,
     const gfx::Size& coded_size,
     const gfx::Rect& visible_rect,
@@ -34,8 +33,7 @@
   }
 
   scoped_refptr<VideoFrame> frame = CreateGpuMemoryBufferVideoFrame(
-      gpu_memory_buffer_factory, format, coded_size, visible_rect, natural_size,
-      timestamp,
+      format, coded_size, visible_rect, natural_size, timestamp,
       use_protected
           ? gfx::BufferUsage::PROTECTED_SCANOUT_VDA_WRITE
           : (use_linear_buffers ? gfx::BufferUsage::SCANOUT_CPU_READ_WRITE
@@ -54,10 +52,8 @@
 
 }  // namespace
 
-PlatformVideoFramePool::PlatformVideoFramePool(
-    gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory)
-    : create_frame_cb_(base::BindRepeating(&DefaultCreateFrame)),
-      gpu_memory_buffer_factory_(gpu_memory_buffer_factory) {
+PlatformVideoFramePool::PlatformVideoFramePool()
+    : create_frame_cb_(base::BindRepeating(&DefaultCreateFrame)) {
   DVLOGF(4);
   weak_this_ = weak_this_factory_.GetWeakPtr();
 }
@@ -107,11 +103,19 @@
     // with (10, 20), 100x100 we cannot (even though it's contained in the
     // former). Hence the use of GetRectSizeFromOrigin() to calculate the
     // visible rect for |new_frame|.
+    //
+    // TODO(b/230370976): after https://crrev.com/c/3597211,
+    // PlatformVideoFramePool doesn't use a GpuMemoryBufferFactory for
+    // allocating dma-bufs which means DRM framebuffers won't be created for a
+    // dma-buf at allocation time (instead, it will be created at the moment of
+    // creating a SharedImage). That means that we probably don't need to take
+    // the |visible_rect_| into account for IsSameFormat_Locked() any more which
+    // implies that we can create |new_frame| using gfx::Rect(coded_size) as
+    // the visible rectangle.
     CHECK(use_linear_buffers_.has_value());
     CroStatus::Or<scoped_refptr<VideoFrame>> new_frame = create_frame_cb_.Run(
-        gpu_memory_buffer_factory_, format, coded_size,
-        gfx::Rect(GetRectSizeFromOrigin(visible_rect_)), coded_size,
-        use_protected_, *use_linear_buffers_, base::TimeDelta());
+        format, coded_size, gfx::Rect(GetRectSizeFromOrigin(visible_rect_)),
+        coded_size, use_protected_, *use_linear_buffers_, base::TimeDelta());
     if (new_frame.has_error()) {
       // TODO(crbug.com/c/1103510) Push the error up instead of dropping it.
       return nullptr;
@@ -195,12 +199,19 @@
   // hardware overlay purposes. The caveat is that different visible rectangles
   // can map to the same framebuffer size, i.e., all the visible rectangles with
   // the same bottom-right corner map to the same framebuffer size.
+  //
+  // TODO(b/230370976): after https://crrev.com/c/3597211,
+  // PlatformVideoFramePool doesn't use a GpuMemoryBufferFactory for allocating
+  // dma-bufs which means DRM framebuffers won't be created for a dma-buf at
+  // allocation time (instead, it will be created at the moment of creating a
+  // SharedImage). That means that we probably don't need to take the
+  // |visible_rect| into account for IsSameFormat_Locked() any more.
   if (!IsSameFormat_Locked(format, coded_size, visible_rect, use_protected)) {
     DVLOGF(4) << "The video frame format is changed. Clearing the pool.";
     free_frames_.clear();
     auto maybe_frame = create_frame_cb_.Run(
-        gpu_memory_buffer_factory_, format, coded_size, visible_rect,
-        natural_size, use_protected, *use_linear_buffers_, base::TimeDelta());
+        format, coded_size, visible_rect, natural_size, use_protected,
+        *use_linear_buffers_, base::TimeDelta());
     if (maybe_frame.has_error())
       return std::move(maybe_frame).error();
     auto frame = std::move(maybe_frame).value();
diff --git a/media/gpu/chromeos/platform_video_frame_pool.h b/media/gpu/chromeos/platform_video_frame_pool.h
index 456a3ee..e16e9e4 100644
--- a/media/gpu/chromeos/platform_video_frame_pool.h
+++ b/media/gpu/chromeos/platform_video_frame_pool.h
@@ -37,12 +37,9 @@
 // old parameter values will be purged from the pool.
 class MEDIA_GPU_EXPORT PlatformVideoFramePool : public DmabufVideoFramePool {
  public:
-  explicit PlatformVideoFramePool(
-      gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory);
-
+  PlatformVideoFramePool();
   PlatformVideoFramePool(const PlatformVideoFramePool&) = delete;
   PlatformVideoFramePool& operator=(const PlatformVideoFramePool&) = delete;
-
   ~PlatformVideoFramePool() override;
 
   // Returns the ID of the GpuMemoryBuffer wrapped by |frame|.
@@ -111,11 +108,6 @@
   // The function used to allocate new frames.
   CreateFrameCB create_frame_cb_ GUARDED_BY(lock_);
 
-  // Used to allocate the video frame GpuMemoryBuffers, passed directly to
-  // the callback that creates video frames. Indirectly owned by GpuChildThread;
-  // therefore alive as long as the GPU process is.
-  gpu::GpuMemoryBufferFactory* const gpu_memory_buffer_factory_ = nullptr;
-
   // The arguments of current frame. We allocate new frames only if a pixel
   // format or size in |frame_layout_| is changed. When GetFrame() is
   // called, we update |visible_rect_| and |natural_size_| of wrapped frames.
diff --git a/media/gpu/chromeos/platform_video_frame_pool_unittest.cc b/media/gpu/chromeos/platform_video_frame_pool_unittest.cc
index e922fbc..2428ae9 100644
--- a/media/gpu/chromeos/platform_video_frame_pool_unittest.cc
+++ b/media/gpu/chromeos/platform_video_frame_pool_unittest.cc
@@ -25,7 +25,6 @@
 
 template <uint64_t modifier>
 CroStatus::Or<scoped_refptr<VideoFrame>> CreateGpuMemoryBufferVideoFrame(
-    gpu::GpuMemoryBufferFactory* factory,
     VideoPixelFormat format,
     const gfx::Size& coded_size,
     const gfx::Rect& visible_rect,
@@ -50,7 +49,7 @@
  public:
   PlatformVideoFramePoolTest()
       : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME),
-        pool_(new PlatformVideoFramePool(nullptr)) {
+        pool_(new PlatformVideoFramePool()) {
     SetCreateFrameCB(
         base::BindRepeating(&CreateGpuMemoryBufferVideoFrame<
                             gfx::NativePixmapHandle::kNoModifier>));
@@ -294,10 +293,10 @@
   const auto fourcc = Fourcc::FromVideoPixelFormat(GetParam());
   ASSERT_TRUE(fourcc.has_value());
   SetCreateFrameCB(base::BindRepeating(
-      [](gpu::GpuMemoryBufferFactory* factory, VideoPixelFormat format,
-         const gfx::Size& coded_size, const gfx::Rect& visible_rect,
-         const gfx::Size& natural_size, bool use_protected,
-         bool use_linear_buffers, base::TimeDelta timestamp) {
+      [](VideoPixelFormat format, const gfx::Size& coded_size,
+         const gfx::Rect& visible_rect, const gfx::Size& natural_size,
+         bool use_protected, bool use_linear_buffers,
+         base::TimeDelta timestamp) {
         return CroStatus::Or<scoped_refptr<VideoFrame>>(
             CroStatus::Codes::kFailedToCreateVideoFrame);
       }));
diff --git a/media/gpu/chromeos/platform_video_frame_utils.cc b/media/gpu/chromeos/platform_video_frame_utils.cc
index 584d89d8..96133de 100644
--- a/media/gpu/chromeos/platform_video_frame_utils.cc
+++ b/media/gpu/chromeos/platform_video_frame_utils.cc
@@ -21,9 +21,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/synchronization/lock.h"
-#include "gpu/ipc/common/gpu_client_ids.h"
 #include "gpu/ipc/common/gpu_memory_buffer_support.h"
-#include "gpu/ipc/service/gpu_memory_buffer_factory.h"
 #include "media/base/color_plane_layout.h"
 #include "media/base/format_utils.h"
 #include "media/base/scopedfd_helper.h"
@@ -168,38 +166,15 @@
 };
 
 gfx::GpuMemoryBufferHandle AllocateGpuMemoryBufferHandle(
-    gpu::GpuMemoryBufferFactory* factory,
     VideoPixelFormat pixel_format,
     const gfx::Size& coded_size,
-    const gfx::Rect& visible_rect,
-    gfx::BufferUsage buffer_usage,
-    base::ScopedClosureRunner& destroy_cb) {
+    gfx::BufferUsage buffer_usage) {
   gfx::GpuMemoryBufferHandle gmb_handle;
   auto buffer_format = VideoPixelFormatToGfxBufferFormat(pixel_format);
   if (!buffer_format)
     return gmb_handle;
-
-  if (!factory) {
-    return GbmDeviceWrapper::Get()->CreateGpuMemoryBuffer(
-        *buffer_format, coded_size, buffer_usage);
-  }
-
-  gmb_handle = factory->CreateGpuMemoryBuffer(
-      GetNextGpuMemoryBufferId(), coded_size,
-      /*framebuffer_size=*/GetRectSizeFromOrigin(visible_rect), *buffer_format,
-      buffer_usage, gpu::kPlatformVideoFramePoolClientId,
-      gfx::kNullAcceleratedWidget);
-  DCHECK(gmb_handle.is_null() || gmb_handle.type != gfx::NATIVE_PIXMAP ||
-         VideoFrame::NumPlanes(pixel_format) ==
-             gmb_handle.native_pixmap_handle.planes.size());
-  if (gmb_handle.is_null())
-    return gmb_handle;
-  destroy_cb.ReplaceClosure(
-      base::BindOnce(&gpu::GpuMemoryBufferFactory::DestroyGpuMemoryBuffer,
-                     base::Unretained(factory), gmb_handle.id,
-                     gpu::kPlatformVideoFramePoolClientId));
-
-  return gmb_handle;
+  return GbmDeviceWrapper::Get()->CreateGpuMemoryBuffer(
+      *buffer_format, coded_size, buffer_usage);
 }
 }  // namespace
 
@@ -212,17 +187,14 @@
 }
 
 scoped_refptr<VideoFrame> CreateGpuMemoryBufferVideoFrame(
-    gpu::GpuMemoryBufferFactory* factory,
     VideoPixelFormat pixel_format,
     const gfx::Size& coded_size,
     const gfx::Rect& visible_rect,
     const gfx::Size& natural_size,
     base::TimeDelta timestamp,
     gfx::BufferUsage buffer_usage) {
-  base::ScopedClosureRunner destroy_cb((base::DoNothing()));
   auto gmb_handle =
-      AllocateGpuMemoryBufferHandle(factory, pixel_format, coded_size,
-                                    visible_rect, buffer_usage, destroy_cb);
+      AllocateGpuMemoryBufferHandle(pixel_format, coded_size, buffer_usage);
   if (gmb_handle.is_null() || gmb_handle.type != gfx::NATIVE_PIXMAP)
     return nullptr;
 
@@ -247,8 +219,6 @@
   if (!frame)
     return nullptr;
 
-  frame->AddDestructionObserver(destroy_cb.Release());
-
   // We only support importing non-DISJOINT multi-planar GbmBuffer right now.
   // TODO(crbug.com/1258986): Add DISJOINT support.
   frame->metadata().is_webgpu_compatible = supports_zero_copy_webgpu_import;
@@ -257,17 +227,14 @@
 }
 
 scoped_refptr<VideoFrame> CreatePlatformVideoFrame(
-    gpu::GpuMemoryBufferFactory* factory,
     VideoPixelFormat pixel_format,
     const gfx::Size& coded_size,
     const gfx::Rect& visible_rect,
     const gfx::Size& natural_size,
     base::TimeDelta timestamp,
     gfx::BufferUsage buffer_usage) {
-  base::ScopedClosureRunner destroy_cb((base::DoNothing()));
   auto gmb_handle =
-      AllocateGpuMemoryBufferHandle(factory, pixel_format, coded_size,
-                                    visible_rect, buffer_usage, destroy_cb);
+      AllocateGpuMemoryBufferHandle(pixel_format, coded_size, buffer_usage);
   if (gmb_handle.is_null() || gmb_handle.type != gfx::NATIVE_PIXMAP)
     return nullptr;
 
@@ -292,20 +259,18 @@
   if (!frame)
     return nullptr;
 
-  frame->AddDestructionObserver(destroy_cb.Release());
   return frame;
 }
 
 absl::optional<VideoFrameLayout> GetPlatformVideoFrameLayout(
-    gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
     VideoPixelFormat pixel_format,
     const gfx::Size& coded_size,
     gfx::BufferUsage buffer_usage) {
   // |visible_rect| and |natural_size| do not matter here. |coded_size| is set
   // as a dummy variable.
-  auto frame = CreatePlatformVideoFrame(
-      gpu_memory_buffer_factory, pixel_format, coded_size,
-      gfx::Rect(coded_size), coded_size, base::TimeDelta(), buffer_usage);
+  auto frame =
+      CreatePlatformVideoFrame(pixel_format, coded_size, gfx::Rect(coded_size),
+                               coded_size, base::TimeDelta(), buffer_usage);
   return frame ? absl::make_optional<VideoFrameLayout>(frame->layout())
                : absl::nullopt;
 }
diff --git a/media/gpu/chromeos/platform_video_frame_utils.h b/media/gpu/chromeos/platform_video_frame_utils.h
index 89833bb..af278c8 100644
--- a/media/gpu/chromeos/platform_video_frame_utils.h
+++ b/media/gpu/chromeos/platform_video_frame_utils.h
@@ -13,27 +13,16 @@
 #include "ui/gfx/gpu_memory_buffer.h"
 #include "ui/gfx/linux/native_pixmap_dmabuf.h"
 
-namespace gpu {
-class GpuMemoryBufferFactory;
-}  // namespace gpu
-
 namespace media {
 
 // Returns a GpuMemoryBufferId that's guaranteed to be different from those
 // returned by previous calls. This function is thread safe.
 MEDIA_GPU_EXPORT gfx::GpuMemoryBufferId GetNextGpuMemoryBufferId();
 
-// Create GpuMemoryBuffer-based media::VideoFrame with |buffer_usage|.
-// See //media/base/video_frame.h for other parameters.
-// If |gpu_memory_buffer_factory| is not null, it's used to allocate the
-// GpuMemoryBuffer and it must outlive the returned VideoFrame. If it's null,
-// the buffer is allocated using the render node (this is intended to be used
-// only for the internals of video encoding when the usage is
-// VEA_READ_CAMERA_AND_CPU_READ_WRITE). It's safe to call this function
-// concurrently from multiple threads (as long as either
-// |gpu_memory_buffer_factory| is thread-safe or nullptr).
+// Creates a STORAGE_GPU_MEMORY_BUFFER VideoFrame backed by a NATIVE_PIXMAP
+// GpuMemoryBuffer allocated with |buffer_usage|. See //media/base/video_frame.h
+// for the other parameters. This function is thread-safe.
 MEDIA_GPU_EXPORT scoped_refptr<VideoFrame> CreateGpuMemoryBufferVideoFrame(
-    gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
     VideoPixelFormat pixel_format,
     const gfx::Size& coded_size,
     const gfx::Rect& visible_rect,
@@ -41,17 +30,10 @@
     base::TimeDelta timestamp,
     gfx::BufferUsage buffer_usage);
 
-// Create platform dependent media::VideoFrame with |buffer_usage|.
-// See //media/base/video_frame.h for other parameters.
-// If |gpu_memory_buffer_factory| is not null, it's used to allocate the
-// video frame's storage and it must outlive the returned VideoFrame. If it's
-// null, the buffer is allocated using the render node (this is intended to be
-// used only for the internals of video encoding when the usage is
-// VEA_READ_CAMERA_AND_CPU_READ_WRITE). It's safe to call this function
-// concurrently from multiple threads (as long as either
-// |gpu_memory_buffer_factory| is thread-safe or nullptr).
+// Creates a STORAGE_DMABUFS VideoFrame whose buffer is allocated with
+// |buffer_usage|. See //media/base/video_frame.h for the other parameters. This
+// function is thread-safe.
 MEDIA_GPU_EXPORT scoped_refptr<VideoFrame> CreatePlatformVideoFrame(
-    gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
     VideoPixelFormat pixel_format,
     const gfx::Size& coded_size,
     const gfx::Rect& visible_rect,
@@ -59,17 +41,13 @@
     base::TimeDelta timestamp,
     gfx::BufferUsage buffer_usage);
 
-// Get VideoFrameLayout of platform dependent video frame with |pixel_format|,
-// |coded_size| and |buffer_usage|. This function is not cost-free as this
-// allocates a platform dependent video frame.
-// If |gpu_memory_buffer_factory| is not null, it's used to allocate the
-// video frame's storage. If it's null, the storage is allocated using the
-// render node (this is intended to be used only for the internals of video
-// encoding when the usage is VEA_READ_CAMERA_AND_CPU_READ_WRITE). It's
-// safe to call this function concurrently from multiple threads (as long as
-// either |gpu_memory_buffer_factory| is thread-safe or nullptr).
+// Returns the VideoFrameLayout of a VideoFrame allocated with
+// CreatePlatformVideoFrame(), i.e., all parameters are forwarded to that
+// function (|visible_rect| is set to gfx::Rect(|coded_size|), |natural_size| is
+// set to |coded_size|, and |timestamp| is set to base::TimeDelta()). This
+// function is not cheap as it allocates a buffer. Returns absl::nullopt if the
+// buffer allocation fails. This function is thread-safe.
 MEDIA_GPU_EXPORT absl::optional<VideoFrameLayout> GetPlatformVideoFrameLayout(
-    gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
     VideoPixelFormat pixel_format,
     const gfx::Size& coded_size,
     gfx::BufferUsage buffer_usage);
diff --git a/media/gpu/chromeos/platform_video_frame_utils_unittest.cc b/media/gpu/chromeos/platform_video_frame_utils_unittest.cc
index f525ad9..fe3ff62 100644
--- a/media/gpu/chromeos/platform_video_frame_utils_unittest.cc
+++ b/media/gpu/chromeos/platform_video_frame_utils_unittest.cc
@@ -17,7 +17,6 @@
 #include "base/logging.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/time/time.h"
-#include "gpu/ipc/service/gpu_memory_buffer_factory.h"
 #include "media/base/color_plane_layout.h"
 #include "media/base/format_utils.h"
 #include "media/base/video_frame.h"
@@ -66,63 +65,6 @@
                                          std::move(dmabuf_fds),
                                          base::TimeDelta());
 }
-
-class FakeGpuMemoryBufferFactory : public gpu::GpuMemoryBufferFactory {
- public:
-  FakeGpuMemoryBufferFactory() = default;
-  ~FakeGpuMemoryBufferFactory() override {
-    for (const auto& buffers : gpu_memory_buffers_) {
-      if (!buffers.second.empty()) {
-        LOG(ERROR) << "client_id=" << buffers.first
-                   << ", the number of unreleased buffers="
-                   << buffers.second.size();
-        ADD_FAILURE();
-      }
-    }
-  }
-
-  // gpu::GpuMemoryBufferFactory implementation.
-  gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer(
-      gfx::GpuMemoryBufferId id,
-      const gfx::Size& size,
-      const gfx::Size& framebuffer_size,
-      gfx::BufferFormat format,
-      gfx::BufferUsage usage,
-      int client_id,
-      gpu::SurfaceHandle surface_handle) override {
-    if (base::Contains(gpu_memory_buffers_[client_id], id))
-      return gfx::GpuMemoryBufferHandle();
-
-    FakeGpuMemoryBuffer fake_gmb(size, format);
-    gfx::GpuMemoryBufferHandle handle = fake_gmb.CloneHandle();
-    handle.id = id;
-    gpu_memory_buffers_[client_id].insert(id);
-    return handle;
-  }
-
-  void DestroyGpuMemoryBuffer(gfx::GpuMemoryBufferId id,
-                              int client_id) override {
-    ASSERT_TRUE(base::Contains(gpu_memory_buffers_, client_id));
-    ASSERT_TRUE(base::Contains(gpu_memory_buffers_[client_id], id));
-    gpu_memory_buffers_[client_id].erase(id);
-  }
-
-  bool FillSharedMemoryRegionWithBufferContents(
-      gfx::GpuMemoryBufferHandle buffer_handle,
-      base::UnsafeSharedMemoryRegion shared_memory) override {
-    NOTIMPLEMENTED();
-    return false;
-  }
-
-  // Type-checking downcast routine.
-  gpu::ImageFactory* AsImageFactory() override {
-    NOTIMPLEMENTED();
-    return nullptr;
-  }
-
- private:
-  std::map<int, std::set<gfx::GpuMemoryBufferId>> gpu_memory_buffers_;
-};
 }  // namespace
 
 TEST(PlatformVideoFrameUtilsTest, CreateNativePixmapDmaBuf) {
@@ -159,6 +101,12 @@
   }
 }
 
+// TODO(b/230370976): remove this #if/#endif guard. To do so, we need to be able
+// to mock/fake the allocator used by CreatePlatformVideoFrame() and
+// CreateGpuMemoryBufferVideoFrame() so that those functions return a
+// non-nullptr frame on platforms where allocating NV12 buffers is not
+// supported.
+#if BUILDFLAG(IS_CHROMEOS_ASH)
 TEST(PlatformVideoFrameUtilsTest, CreateVideoFrame) {
   constexpr VideoPixelFormat kPixelFormat = PIXEL_FORMAT_NV12;
   constexpr gfx::Size kCodedSize(320, 240);
@@ -168,9 +116,6 @@
   constexpr gfx::BufferUsage kBufferUsage =
       gfx::BufferUsage::VEA_READ_CAMERA_AND_CPU_READ_WRITE;
 
-  auto gpu_memory_buffer_factory =
-      std::make_unique<FakeGpuMemoryBufferFactory>();
-
   const VideoFrame::StorageType storage_types[] = {
       VideoFrame::STORAGE_DMABUFS,
       VideoFrame::STORAGE_GPU_MEMORY_BUFFER,
@@ -179,14 +124,14 @@
     scoped_refptr<VideoFrame> frame;
     switch (storage_type) {
       case VideoFrame::STORAGE_DMABUFS:
-        frame = CreatePlatformVideoFrame(
-            gpu_memory_buffer_factory.get(), kPixelFormat, kCodedSize,
-            kVisibleRect, kNaturalSize, kTimeStamp, kBufferUsage);
+        frame =
+            CreatePlatformVideoFrame(kPixelFormat, kCodedSize, kVisibleRect,
+                                     kNaturalSize, kTimeStamp, kBufferUsage);
         break;
       case VideoFrame::STORAGE_GPU_MEMORY_BUFFER:
-        frame = CreateGpuMemoryBufferVideoFrame(
-            gpu_memory_buffer_factory.get(), kPixelFormat, kCodedSize,
-            kVisibleRect, kNaturalSize, kTimeStamp, kBufferUsage);
+        frame = CreateGpuMemoryBufferVideoFrame(kPixelFormat, kCodedSize,
+                                                kVisibleRect, kNaturalSize,
+                                                kTimeStamp, kBufferUsage);
         break;
       default:
         NOTREACHED();
@@ -214,4 +159,5 @@
     };
   }
 }
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 }  // namespace media
diff --git a/media/gpu/chromeos/video_decoder_pipeline.cc b/media/gpu/chromeos/video_decoder_pipeline.cc
index 3ec8199..d361aea 100644
--- a/media/gpu/chromeos/video_decoder_pipeline.cc
+++ b/media/gpu/chromeos/video_decoder_pipeline.cc
@@ -732,13 +732,8 @@
 
   if (need_aux_frame_pool) {
     // Initialize the auxiliary frame pool with the input format of the image
-    // processor. Note that we pass nullptr as the GpuMemoryBufferFactory. That
-    // way, the pool will allocate buffers using minigbm directly instead of
-    // going through Ozone which means it won't create DRM/KMS framebuffers for
-    // those buffers. This is good because these buffers don't end up as
-    // overlays anyway.
-    auxiliary_frame_pool_ = std::make_unique<PlatformVideoFramePool>(
-        /*gpu_memory_buffer_factory=*/nullptr);
+    // processor.
+    auxiliary_frame_pool_ = std::make_unique<PlatformVideoFramePool>();
 
     auxiliary_frame_pool_->set_parent_task_runner(decoder_task_runner_);
     CroStatus::Or<GpuBufferLayout> status_or_layout =
diff --git a/media/gpu/test/image_processor/image_processor_client.cc b/media/gpu/test/image_processor/image_processor_client.cc
index a2d70d4f..4944e9b 100644
--- a/media/gpu/test/image_processor/image_processor_client.cc
+++ b/media/gpu/test/image_processor/image_processor_client.cc
@@ -148,8 +148,7 @@
   ASSERT_TRUE_OR_RETURN_NULLPTR(input_layout);
 
   if (VideoFrame::IsStorageTypeMappable(input_storage_type)) {
-    return CloneVideoFrame(gpu_memory_buffer_factory_.get(),
-                           CreateVideoFrameFromImage(input_image).get(),
+    return CloneVideoFrame(CreateVideoFrameFromImage(input_image).get(),
                            *input_layout, VideoFrame::STORAGE_OWNED_MEMORY);
   } else {
     ASSERT_TRUE_OR_RETURN_NULLPTR(
@@ -162,8 +161,7 @@
         (PIXEL_FORMAT_NV12 == input_image.PixelFormat())
             ? gfx::BufferUsage::VEA_READ_CAMERA_AND_CPU_READ_WRITE
             : gfx::BufferUsage::GPU_READ_CPU_READ_WRITE;
-    return CloneVideoFrame(gpu_memory_buffer_factory_.get(),
-                           CreateVideoFrameFromImage(input_image).get(),
+    return CloneVideoFrame(CreateVideoFrameFromImage(input_image).get(),
                            *input_layout, input_storage_type, dst_buffer_usage);
   }
 }
@@ -190,15 +188,13 @@
       output_storage_type == VideoFrame::STORAGE_DMABUFS ||
       output_storage_type == VideoFrame::STORAGE_GPU_MEMORY_BUFFER);
   scoped_refptr<VideoFrame> output_frame = CreatePlatformVideoFrame(
-      gpu_memory_buffer_factory_.get(), output_layout->format(),
-      output_layout->coded_size(), gfx::Rect(output_image.Size()),
-      output_image.Size(), base::TimeDelta(),
+      output_layout->format(), output_layout->coded_size(),
+      gfx::Rect(output_image.Size()), output_image.Size(), base::TimeDelta(),
       gfx::BufferUsage::GPU_READ_CPU_READ_WRITE);
 
   if (output_storage_type == VideoFrame::STORAGE_GPU_MEMORY_BUFFER) {
     output_frame = CreateGpuMemoryBufferVideoFrame(
-        gpu_memory_buffer_factory_.get(), output_frame.get(),
-        gfx::BufferUsage::GPU_READ_CPU_READ_WRITE);
+        output_frame.get(), gfx::BufferUsage::GPU_READ_CPU_READ_WRITE);
   }
   return output_frame;
 }
diff --git a/media/gpu/test/video_encoder/video_encoder.cc b/media/gpu/test/video_encoder/video_encoder.cc
index 8f9b00f..3f5077b 100644
--- a/media/gpu/test/video_encoder/video_encoder.cc
+++ b/media/gpu/test/video_encoder/video_encoder.cc
@@ -6,7 +6,6 @@
 
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
-#include "gpu/ipc/service/gpu_memory_buffer_factory.h"
 #include "media/base/video_bitrate_allocation.h"
 #include "media/gpu/macros.h"
 #include "media/gpu/test/bitstream_helpers.h"
@@ -51,10 +50,9 @@
 // static
 std::unique_ptr<VideoEncoder> VideoEncoder::Create(
     const VideoEncoderClientConfig& config,
-    gpu::GpuMemoryBufferFactory* const gpu_memory_buffer_factory,
     std::vector<std::unique_ptr<BitstreamProcessor>> bitstream_processors) {
   auto video_encoder = base::WrapUnique(new VideoEncoder());
-  if (!video_encoder->CreateEncoderClient(config, gpu_memory_buffer_factory,
+  if (!video_encoder->CreateEncoderClient(config,
                                           std::move(bitstream_processors))) {
     return nullptr;
   }
@@ -78,7 +76,6 @@
 
 bool VideoEncoder::CreateEncoderClient(
     const VideoEncoderClientConfig& config,
-    gpu::GpuMemoryBufferFactory* const gpu_memory_buffer_factory,
     std::vector<std::unique_ptr<BitstreamProcessor>> bitstream_processors) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK_EQ(video_encoder_state_.load(), EncoderState::kUninitialized);
@@ -90,9 +87,8 @@
   EventCallback event_cb =
       base::BindRepeating(&VideoEncoder::NotifyEvent, base::Unretained(this));
 
-  encoder_client_ =
-      VideoEncoderClient::Create(event_cb, std::move(bitstream_processors),
-                                 gpu_memory_buffer_factory, config);
+  encoder_client_ = VideoEncoderClient::Create(
+      event_cb, std::move(bitstream_processors), config);
   if (!encoder_client_) {
     VLOGF(1) << "Failed to create video encoder client";
     return false;
diff --git a/media/gpu/test/video_encoder/video_encoder.h b/media/gpu/test/video_encoder/video_encoder.h
index 8b85d48..5beb859 100644
--- a/media/gpu/test/video_encoder/video_encoder.h
+++ b/media/gpu/test/video_encoder/video_encoder.h
@@ -18,10 +18,6 @@
 #include "base/thread_annotations.h"
 #include "base/time/time.h"
 
-namespace gpu {
-class GpuMemoryBufferFactory;
-}  // namespace gpu
-
 namespace media {
 class VideoBitrateAllocation;
 
@@ -59,7 +55,6 @@
   // destroyed on the same sequence where they are created.
   static std::unique_ptr<VideoEncoder> Create(
       const VideoEncoderClientConfig& config,
-      gpu::GpuMemoryBufferFactory* const gpu_memory_buffer_factory,
       std::vector<std::unique_ptr<BitstreamProcessor>> bitstream_processors =
           {});
 
@@ -123,7 +118,6 @@
 
   bool CreateEncoderClient(
       const VideoEncoderClientConfig& config,
-      gpu::GpuMemoryBufferFactory* const gpu_memory_buffer_factory,
       std::vector<std::unique_ptr<BitstreamProcessor>> bitstream_processors);
 
   // Notify the video encoder an event has occurred (e.g. bitstream ready).
diff --git a/media/gpu/test/video_encoder/video_encoder_client.cc b/media/gpu/test/video_encoder/video_encoder_client.cc
index b190d0b..a80a5e4 100644
--- a/media/gpu/test/video_encoder/video_encoder_client.cc
+++ b/media/gpu/test/video_encoder/video_encoder_client.cc
@@ -14,7 +14,6 @@
 #include "base/strings/string_number_conversions.h"
 #include "gpu/config/gpu_driver_bug_workarounds.h"
 #include "gpu/config/gpu_preferences.h"
-#include "gpu/ipc/service/gpu_memory_buffer_factory.h"
 #include "media/base/bind_to_current_loop.h"
 #include "media/base/bitrate.h"
 #include "media/base/media_log.h"
@@ -158,7 +157,6 @@
 VideoEncoderClient::VideoEncoderClient(
     const VideoEncoder::EventCallback& event_cb,
     std::vector<std::unique_ptr<BitstreamProcessor>> bitstream_processors,
-    gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
     const VideoEncoderClientConfig& config)
     : event_cb_(event_cb),
       bitstream_processors_(std::move(bitstream_processors)),
@@ -167,8 +165,7 @@
       encoder_client_state_(VideoEncoderClientState::kUninitialized),
       current_stats_(encoder_client_config_.framerate,
                      config.num_temporal_layers,
-                     config.num_spatial_layers),
-      gpu_memory_buffer_factory_(gpu_memory_buffer_factory) {
+                     config.num_spatial_layers) {
   DETACH_FROM_SEQUENCE(encoder_client_sequence_checker_);
 
   weak_this_ = weak_this_factory_.GetWeakPtr();
@@ -184,11 +181,9 @@
 std::unique_ptr<VideoEncoderClient> VideoEncoderClient::Create(
     const VideoEncoder::EventCallback& event_cb,
     std::vector<std::unique_ptr<BitstreamProcessor>> bitstream_processors,
-    gpu::GpuMemoryBufferFactory* const gpu_memory_buffer_factory,
     const VideoEncoderClientConfig& config) {
-  return base::WrapUnique(
-      new VideoEncoderClient(event_cb, std::move(bitstream_processors),
-                             gpu_memory_buffer_factory, config));
+  return base::WrapUnique(new VideoEncoderClient(
+      event_cb, std::move(bitstream_processors), config));
 }
 
 bool VideoEncoderClient::Initialize(const Video* video) {
@@ -321,8 +316,7 @@
       encoder_client_config_.input_storage_type ==
               VideoEncodeAccelerator::Config::StorageType::kGpuMemoryBuffer
           ? VideoFrame::STORAGE_GPU_MEMORY_BUFFER
-          : VideoFrame::STORAGE_MOJO_SHARED_BUFFER,
-      gpu_memory_buffer_factory_);
+          : VideoFrame::STORAGE_MOJO_SHARED_BUFFER);
 
   output_buffer_size_ = output_buffer_size;
 
diff --git a/media/gpu/test/video_encoder/video_encoder_client.h b/media/gpu/test/video_encoder/video_encoder_client.h
index 3ac9ee0f..75251717 100644
--- a/media/gpu/test/video_encoder/video_encoder_client.h
+++ b/media/gpu/test/video_encoder/video_encoder_client.h
@@ -22,10 +22,6 @@
 #include "media/gpu/test/video_encoder/video_encoder.h"
 #include "media/video/video_encode_accelerator.h"
 
-namespace gpu {
-class GpuMemoryBufferFactory;
-}
-
 namespace media {
 
 class Video;
@@ -120,15 +116,11 @@
 
   ~VideoEncoderClient() override;
 
-  // Return an instance of the VideoEncoderClient. The
-  // |gpu_memory_buffer_factory| will not be owned by the encoder client, the
-  // caller should guarantee it outlives the encoder client. The |event_cb| will
-  // be called whenever an event occurs (e.g. frame encoded) and should be
-  // thread-safe.
+  // Return an instance of the VideoEncoderClient. The |event_cb| will be called
+  // whenever an event occurs (e.g. frame encoded) and should be thread-safe.
   static std::unique_ptr<VideoEncoderClient> Create(
       const VideoEncoder::EventCallback& event_cb,
       std::vector<std::unique_ptr<BitstreamProcessor>> bitstream_processors,
-      gpu::GpuMemoryBufferFactory* const gpu_memory_buffer_factory,
       const VideoEncoderClientConfig& config);
 
   // Initialize the video encode accelerator for the specified |video|.
@@ -179,7 +171,6 @@
   VideoEncoderClient(
       const VideoEncoder::EventCallback& event_cb,
       std::vector<std::unique_ptr<BitstreamProcessor>> bitstream_processors,
-      gpu::GpuMemoryBufferFactory* const gpu_memory_buffer_factory,
       const VideoEncoderClientConfig& config);
 
   // Destroy the video encoder client.
@@ -282,8 +273,6 @@
   VideoEncoderStats current_stats_ GUARDED_BY(stats_lock_);
   mutable base::Lock stats_lock_;
 
-  gpu::GpuMemoryBufferFactory* const gpu_memory_buffer_factory_;
-
   SEQUENCE_CHECKER(test_sequence_checker_);
   SEQUENCE_CHECKER(encoder_client_sequence_checker_);
 
diff --git a/media/gpu/test/video_frame_helpers.cc b/media/gpu/test/video_frame_helpers.cc
index ead9b0a..409e1b7 100644
--- a/media/gpu/test/video_frame_helpers.cc
+++ b/media/gpu/test/video_frame_helpers.cc
@@ -13,7 +13,6 @@
 #include "base/logging.h"
 #include "base/memory/scoped_refptr.h"
 #include "gpu/ipc/common/gpu_memory_buffer_support.h"
-#include "gpu/ipc/service/gpu_memory_buffer_factory.h"
 #include "media/base/color_plane_layout.h"
 #include "media/base/format_utils.h"
 #include "media/base/video_frame.h"
@@ -317,7 +316,6 @@
 }
 
 scoped_refptr<VideoFrame> CloneVideoFrame(
-    gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
     const VideoFrame* const src_frame,
     const VideoFrameLayout& dst_layout,
     VideoFrame::StorageType dst_storage_type,
@@ -339,9 +337,9 @@
         return nullptr;
       }
       dst_frame = CreatePlatformVideoFrame(
-          gpu_memory_buffer_factory, dst_layout.format(),
-          dst_layout.coded_size(), src_frame->visible_rect(),
-          src_frame->natural_size(), src_frame->timestamp(), *dst_buffer_usage);
+          dst_layout.format(), dst_layout.coded_size(),
+          src_frame->visible_rect(), src_frame->natural_size(),
+          src_frame->timestamp(), *dst_buffer_usage);
       break;
 #endif  // BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION)
     case VideoFrame::STORAGE_OWNED_MEMORY:
@@ -369,8 +367,8 @@
     // Here, the content in |src_frame| is already copied to |dst_frame|, which
     // is a DMABUF based VideoFrame.
     // Create GpuMemoryBuffer based VideoFrame from |dst_frame|.
-    dst_frame = CreateGpuMemoryBufferVideoFrame(
-        gpu_memory_buffer_factory, dst_frame.get(), *dst_buffer_usage);
+    dst_frame =
+        CreateGpuMemoryBufferVideoFrame(dst_frame.get(), *dst_buffer_usage);
   }
 
   return dst_frame;
@@ -399,7 +397,6 @@
 }
 
 scoped_refptr<VideoFrame> CreateGpuMemoryBufferVideoFrame(
-    gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
     const VideoFrame* const frame,
     gfx::BufferUsage buffer_usage) {
   gfx::GpuMemoryBufferHandle gmb_handle;
diff --git a/media/gpu/test/video_frame_helpers.h b/media/gpu/test/video_frame_helpers.h
index 442d865..281f31e 100644
--- a/media/gpu/test/video_frame_helpers.h
+++ b/media/gpu/test/video_frame_helpers.h
@@ -13,10 +13,6 @@
 #include "ui/gfx/buffer_types.h"
 #include "ui/gfx/geometry/size.h"
 
-namespace gpu {
-class GpuMemoryBufferFactory;
-}
-
 namespace media {
 namespace test {
 
@@ -63,14 +59,11 @@
 // If |dst_storage_type| is STORAGE_DMABUFS, this function creates DMABUF-backed
 // VideoFrame with |dst_layout|. If |dst_storage_type| is STORAGE_OWNED_MEMORY,
 // this function creates memory-backed VideoFrame with |dst_layout|.
-// |dst_buffer_usage| and |gpu_memory_buffer_factory| must be specified if
-// |dst_storage_type| is STORAGE_DMABUFS or STORAGE_GPU_MEMORY_BUFFER, and in
-// that case the |gpu_memory_buffer_factory| will be used for the allocation to
-// create a graphic buffer with the requested usage.
+// |dst_buffer_usage| must be specified if |dst_storage_type| is STORAGE_DMABUFS
+// or STORAGE_GPU_MEMORY_BUFFER.
 // The created VideoFrame's content is the same as |src_frame|. The created
 // VideoFrame owns the buffer. Returns nullptr on failure.
 scoped_refptr<VideoFrame> CloneVideoFrame(
-    gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
     const VideoFrame* const src_frame,
     const VideoFrameLayout& dst_layout,
     VideoFrame::StorageType dst_storage_type = VideoFrame::STORAGE_OWNED_MEMORY,
@@ -89,7 +82,6 @@
 // |buffer_usage|.
 // This function works on ChromeOS only.
 scoped_refptr<VideoFrame> CreateGpuMemoryBufferVideoFrame(
-    gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
     const VideoFrame* const frame,
     gfx::BufferUsage buffer_usage);
 
diff --git a/media/gpu/test/video_player/test_vda_video_decoder.cc b/media/gpu/test/video_player/test_vda_video_decoder.cc
index 4da02fb..5e7e72c 100644
--- a/media/gpu/test/video_player/test_vda_video_decoder.cc
+++ b/media/gpu/test/video_player/test_vda_video_decoder.cc
@@ -43,14 +43,12 @@
     OnProvidePictureBuffersCB on_provide_picture_buffers_cb,
     const gfx::ColorSpace& target_color_space,
     FrameRenderer* const frame_renderer,
-    gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
     bool linear_output)
     : use_vd_vda_(use_vd_vda),
       on_provide_picture_buffers_cb_(std::move(on_provide_picture_buffers_cb)),
       target_color_space_(target_color_space),
       frame_renderer_(frame_renderer),
 #if BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION)
-      gpu_memory_buffer_factory_(gpu_memory_buffer_factory),
       linear_output_(linear_output),
 #endif  // BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION)
       decode_start_timestamps_(kTimestampCacheSize) {
@@ -244,8 +242,8 @@
 
 #if BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION)
     video_frame = CreateGpuMemoryBufferVideoFrame(
-        gpu_memory_buffer_factory_, format, dimensions, visible_rect,
-        visible_rect.size(), base::TimeDelta(),
+        format, dimensions, visible_rect, visible_rect.size(),
+        base::TimeDelta(),
         linear_output_ ? gfx::BufferUsage::SCANOUT_CPU_READ_WRITE
                        : gfx::BufferUsage::SCANOUT_VDA_WRITE);
 #endif  // BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION)
diff --git a/media/gpu/test/video_player/test_vda_video_decoder.h b/media/gpu/test/video_player/test_vda_video_decoder.h
index 3c9ca39f..3e945ff 100644
--- a/media/gpu/test/video_player/test_vda_video_decoder.h
+++ b/media/gpu/test/video_player/test_vda_video_decoder.h
@@ -12,7 +12,6 @@
 #include "base/containers/lru_cache.h"
 #include "base/sequence_checker.h"
 #include "base/time/time.h"
-#include "gpu/ipc/service/gpu_memory_buffer_factory.h"
 #include "media/base/video_decoder.h"
 #include "media/gpu/test/video_player/video_decoder_client.h"
 #include "media/media_buildflags.h"
@@ -38,7 +37,6 @@
                       OnProvidePictureBuffersCB on_provide_picture_buffers_cb,
                       const gfx::ColorSpace& target_color_space,
                       FrameRenderer* const frame_renderer,
-                      gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
                       bool linear_output = false);
 
   TestVDAVideoDecoder(const TestVDAVideoDecoder&) = delete;
@@ -118,8 +116,6 @@
   FrameRenderer* const frame_renderer_;
 
 #if BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION)
-  // Owned by VideoDecoderClient.
-  gpu::GpuMemoryBufferFactory* const gpu_memory_buffer_factory_;
   // Whether the decoder output buffers should be allocated with a linear
   // layout.
   const bool linear_output_;
diff --git a/media/gpu/test/video_player/video_decoder_client.cc b/media/gpu/test/video_player/video_decoder_client.cc
index faa0abba..d992db0 100644
--- a/media/gpu/test/video_player/video_decoder_client.cc
+++ b/media/gpu/test/video_player/video_decoder_client.cc
@@ -47,7 +47,6 @@
 
 VideoDecoderClient::VideoDecoderClient(
     const VideoPlayer::EventCallback& event_cb,
-    gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
     std::unique_ptr<FrameRenderer> renderer,
     std::vector<std::unique_ptr<VideoFrameProcessor>> frame_processors,
     const VideoDecoderClientConfig& config)
@@ -56,8 +55,7 @@
       frame_processors_(std::move(frame_processors)),
       decoder_client_config_(config),
       decoder_client_thread_("VDAClientDecoderThread"),
-      decoder_client_state_(VideoDecoderClientState::kUninitialized),
-      gpu_memory_buffer_factory_(gpu_memory_buffer_factory) {
+      decoder_client_state_(VideoDecoderClientState::kUninitialized) {
   DETACH_FROM_SEQUENCE(decoder_client_sequence_checker_);
 
   weak_this_ = weak_this_factory_.GetWeakPtr();
@@ -82,13 +80,12 @@
 // static
 std::unique_ptr<VideoDecoderClient> VideoDecoderClient::Create(
     const VideoPlayer::EventCallback& event_cb,
-    gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
     std::unique_ptr<FrameRenderer> frame_renderer,
     std::vector<std::unique_ptr<VideoFrameProcessor>> frame_processors,
     const VideoDecoderClientConfig& config) {
-  auto decoder_client = base::WrapUnique(new VideoDecoderClient(
-      event_cb, gpu_memory_buffer_factory, std::move(frame_renderer),
-      std::move(frame_processors), config));
+  auto decoder_client = base::WrapUnique(
+      new VideoDecoderClient(event_cb, std::move(frame_renderer),
+                             std::move(frame_processors), config));
   if (!decoder_client->CreateDecoder()) {
     return nullptr;
   }
@@ -187,7 +184,7 @@
 #if BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION)
       decoder_ = VideoDecoderPipeline::Create(
           base::ThreadTaskRunnerHandle::Get(),
-          std::make_unique<PlatformVideoFramePool>(gpu_memory_buffer_factory_),
+          std::make_unique<PlatformVideoFramePool>(),
           std::make_unique<VideoFrameConverter>(),
           std::make_unique<NullMediaLog>());
 #endif  // BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION)
@@ -204,7 +201,7 @@
           // |*this|. The lifetime of |decoder_| must be shorter than |*this|.
           base::BindRepeating(&VideoDecoderClient::ResolutionChangeTask,
                               base::Unretained(this)),
-          gfx::ColorSpace(), frame_renderer_.get(), gpu_memory_buffer_factory_,
+          gfx::ColorSpace(), frame_renderer_.get(),
           decoder_client_config_.linear_output);
       break;
   }
diff --git a/media/gpu/test/video_player/video_decoder_client.h b/media/gpu/test/video_player/video_decoder_client.h
index c0ee013..8f650e34 100644
--- a/media/gpu/test/video_player/video_decoder_client.h
+++ b/media/gpu/test/video_player/video_decoder_client.h
@@ -13,7 +13,6 @@
 #include "base/memory/weak_ptr.h"
 #include "base/sequence_checker.h"
 #include "base/threading/thread.h"
-#include "gpu/ipc/service/gpu_memory_buffer_factory.h"
 #include "media/base/decoder_status.h"
 #include "media/base/video_decoder.h"
 #include "media/base/video_decoder_config.h"
@@ -63,15 +62,12 @@
 
   ~VideoDecoderClient();
 
-  // Return an instance of the VideoDecoderClient. The
-  // |gpu_memory_buffer_factory| will not be owned by the decoder client, the
-  // caller should guarantee it outlives the decoder client. The |event_cb| will
-  // be called whenever an event occurs (e.g. frame decoded) and should be
-  // thread-safe. Initialization is performed asynchronous, upon completion a
-  // 'kInitialized' event will be thrown.
+  // Return an instance of the VideoDecoderClient. The |event_cb| will be called
+  // whenever an event occurs (e.g. frame decoded) and should be thread-safe.
+  // Initialization is performed asynchronous, upon completion a 'kInitialized'
+  // event will be thrown.
   static std::unique_ptr<VideoDecoderClient> Create(
       const VideoPlayer::EventCallback& event_cb,
-      gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
       std::unique_ptr<FrameRenderer> frame_renderer,
       std::vector<std::unique_ptr<VideoFrameProcessor>> frame_processors,
       const VideoDecoderClientConfig& config);
@@ -111,7 +107,6 @@
 
   VideoDecoderClient(
       const VideoPlayer::EventCallback& event_cb,
-      gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
       std::unique_ptr<FrameRenderer> renderer,
       std::vector<std::unique_ptr<VideoFrameProcessor>> frame_processors,
       const VideoDecoderClientConfig& config);
@@ -180,9 +175,6 @@
   // The video being decoded.
   const Video* video_ = nullptr;
 
-  // Owned by VideoPlayerTestEnvironment.
-  gpu::GpuMemoryBufferFactory* const gpu_memory_buffer_factory_;
-
   SEQUENCE_CHECKER(video_player_sequence_checker_);
   SEQUENCE_CHECKER(decoder_client_sequence_checker_);
 
diff --git a/media/gpu/test/video_player/video_player.cc b/media/gpu/test/video_player/video_player.cc
index 50ac184e2..7d2119fa 100644
--- a/media/gpu/test/video_player/video_player.cc
+++ b/media/gpu/test/video_player/video_player.cc
@@ -50,12 +50,10 @@
 // static
 std::unique_ptr<VideoPlayer> VideoPlayer::Create(
     const VideoDecoderClientConfig& config,
-    gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
     std::unique_ptr<FrameRenderer> frame_renderer,
     std::vector<std::unique_ptr<VideoFrameProcessor>> frame_processors) {
   auto video_player = base::WrapUnique(new VideoPlayer());
-  if (!video_player->CreateDecoderClient(config, gpu_memory_buffer_factory,
-                                         std::move(frame_renderer),
+  if (!video_player->CreateDecoderClient(config, std::move(frame_renderer),
                                          std::move(frame_processors))) {
     return nullptr;
   }
@@ -64,7 +62,6 @@
 
 bool VideoPlayer::CreateDecoderClient(
     const VideoDecoderClientConfig& config,
-    gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
     std::unique_ptr<FrameRenderer> frame_renderer,
     std::vector<std::unique_ptr<VideoFrameProcessor>> frame_processors) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -79,8 +76,7 @@
       base::BindRepeating(&VideoPlayer::NotifyEvent, base::Unretained(this));
 
   decoder_client_ = VideoDecoderClient::Create(
-      event_cb, gpu_memory_buffer_factory, std::move(frame_renderer),
-      std::move(frame_processors), config);
+      event_cb, std::move(frame_renderer), std::move(frame_processors), config);
   if (!decoder_client_) {
     VLOGF(1) << "Failed to create video decoder client";
     return false;
diff --git a/media/gpu/test/video_player/video_player.h b/media/gpu/test/video_player/video_player.h
index 1c47e90..7c5e426f 100644
--- a/media/gpu/test/video_player/video_player.h
+++ b/media/gpu/test/video_player/video_player.h
@@ -19,10 +19,6 @@
 #include "media/gpu/test/video_frame_helpers.h"
 #include "media/gpu/test/video_player/frame_renderer.h"
 
-namespace gpu {
-class GpuMemoryBufferFactory;
-}
-
 namespace media {
 namespace test {
 
@@ -65,12 +61,11 @@
 
   ~VideoPlayer();
 
-  // Create an instance of the video player. The |gpu_memory_buffer_factory|,
-  // |frame_renderer| and |frame_processors| will not be owned by the video
-  // player. The caller should guarantee they outlive the video player.
+  // Create an instance of the video player. The |frame_renderer| and
+  // |frame_processors| will not be owned by the video player. The caller should
+  // guarantee they outlive the video player.
   static std::unique_ptr<VideoPlayer> Create(
       const VideoDecoderClientConfig& config,
-      gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
       std::unique_ptr<FrameRenderer> frame_renderer,
       std::vector<std::unique_ptr<VideoFrameProcessor>> frame_processors = {});
 
@@ -133,7 +128,6 @@
 
   bool CreateDecoderClient(
       const VideoDecoderClientConfig& config,
-      gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
       std::unique_ptr<FrameRenderer> frame_renderer,
       std::vector<std::unique_ptr<VideoFrameProcessor>> frame_processors);
   void Destroy();
diff --git a/media/gpu/test/video_player/video_player_test_environment.cc b/media/gpu/test/video_player/video_player_test_environment.cc
index 510be49..ae979c4 100644
--- a/media/gpu/test/video_player/video_player_test_environment.cc
+++ b/media/gpu/test/video_player/video_player_test_environment.cc
@@ -79,9 +79,7 @@
       implementation_(implementation),
       linear_output_(linear_output),
       frame_output_config_(frame_output_config),
-      output_folder_(output_folder),
-      gpu_memory_buffer_factory_(
-          gpu::GpuMemoryBufferFactory::CreateNativeType(nullptr)) {}
+      output_folder_(output_folder) {}
 
 VideoPlayerTestEnvironment::~VideoPlayerTestEnvironment() = default;
 
@@ -89,11 +87,6 @@
   return video_.get();
 }
 
-gpu::GpuMemoryBufferFactory*
-VideoPlayerTestEnvironment::GetGpuMemoryBufferFactory() const {
-  return gpu_memory_buffer_factory_.get();
-}
-
 bool VideoPlayerTestEnvironment::IsValidatorEnabled() const {
   return validator_type_ != ValidatorType::kNone;
 }
diff --git a/media/gpu/test/video_player/video_player_test_environment.h b/media/gpu/test/video_player/video_player_test_environment.h
index 2c5fdad..1203ff9 100644
--- a/media/gpu/test/video_player/video_player_test_environment.h
+++ b/media/gpu/test/video_player/video_player_test_environment.h
@@ -9,7 +9,6 @@
 #include <memory>
 
 #include "base/files/file_path.h"
-#include "gpu/ipc/service/gpu_memory_buffer_factory.h"
 #include "media/gpu/test/video_frame_file_writer.h"
 #include "media/gpu/test/video_player/video_decoder_client.h"
 #include "media/gpu/test/video_test_environment.h"
@@ -61,12 +60,6 @@
   // Get the output folder.
   const base::FilePath& OutputFolder() const;
 
-  // Get the GpuMemoryBufferFactory for doing buffer allocations. This needs to
-  // survive as long as the process is alive just like in production which is
-  // why it's in here as there are threads that won't immediately die when an
-  // individual test is completed.
-  gpu::GpuMemoryBufferFactory* GetGpuMemoryBufferFactory() const;
-
  private:
   VideoPlayerTestEnvironment(
       std::unique_ptr<media::test::Video> video,
@@ -85,8 +78,6 @@
 
   const FrameOutputConfig frame_output_config_;
   const base::FilePath output_folder_;
-
-  std::unique_ptr<gpu::GpuMemoryBufferFactory> gpu_memory_buffer_factory_;
 };
 }  // namespace test
 }  // namespace media
diff --git a/media/gpu/test/video_test_environment.cc b/media/gpu/test/video_test_environment.cc
index de224496..86dd749 100644
--- a/media/gpu/test/video_test_environment.cc
+++ b/media/gpu/test/video_test_environment.cc
@@ -54,6 +54,8 @@
 #if defined(USE_OZONE)
   // Initialize Ozone. This is necessary to gain access to the GPU for hardware
   // video acceleration.
+  // TODO(b/230370976): we may no longer need to initialize Ozone since we don't
+  // use it for buffer allocation.
   LOG(WARNING) << "Initializing Ozone Platform...\n"
                   "If this hangs indefinitely please call 'stop ui' first!";
   ui::OzonePlatform::InitParams params;
diff --git a/media/gpu/test/video_test_helpers.cc b/media/gpu/test/video_test_helpers.cc
index 9d228f5..ded65e2a 100644
--- a/media/gpu/test/video_test_helpers.cc
+++ b/media/gpu/test/video_test_helpers.cc
@@ -13,7 +13,6 @@
 #include "base/memory/unsafe_shared_memory_region.h"
 #include "base/stl_util.h"
 #include "gpu/ipc/common/gpu_memory_buffer_support.h"
-#include "gpu/ipc/service/gpu_memory_buffer_factory.h"
 #include "media/base/format_utils.h"
 #include "media/base/video_codecs.h"
 #include "media/base/video_frame_layout.h"
@@ -380,24 +379,21 @@
   gfx::GpuMemoryBufferHandle gmb_handle;
 };
 
-AlignedDataHelper::AlignedDataHelper(
-    const std::vector<uint8_t>& stream,
-    uint32_t num_frames,
-    uint32_t num_read_frames,
-    bool reverse,
-    VideoPixelFormat pixel_format,
-    const gfx::Size& src_coded_size,
-    const gfx::Size& dst_coded_size,
-    const gfx::Rect& visible_rect,
-    const gfx::Size& natural_size,
-    uint32_t frame_rate,
-    VideoFrame::StorageType storage_type,
-    gpu::GpuMemoryBufferFactory* const gpu_memory_buffer_factory)
+AlignedDataHelper::AlignedDataHelper(const std::vector<uint8_t>& stream,
+                                     uint32_t num_frames,
+                                     uint32_t num_read_frames,
+                                     bool reverse,
+                                     VideoPixelFormat pixel_format,
+                                     const gfx::Size& src_coded_size,
+                                     const gfx::Size& dst_coded_size,
+                                     const gfx::Rect& visible_rect,
+                                     const gfx::Size& natural_size,
+                                     uint32_t frame_rate,
+                                     VideoFrame::StorageType storage_type)
     : num_frames_(num_frames),
       num_read_frames_(num_read_frames),
       reverse_(reverse),
       storage_type_(storage_type),
-      gpu_memory_buffer_factory_(gpu_memory_buffer_factory),
       visible_rect_(visible_rect),
       natural_size_(natural_size),
       time_stamp_interval_(base::Seconds(/*secs=*/0u)),
@@ -408,7 +404,6 @@
   UpdateFrameRate(frame_rate);
 
   if (storage_type_ == VideoFrame::STORAGE_GPU_MEMORY_BUFFER) {
-    LOG_ASSERT(gpu_memory_buffer_factory_ != nullptr);
     InitializeGpuMemoryBufferFrames(stream, pixel_format, src_coded_size,
                                     dst_coded_size);
   } else {
@@ -569,7 +564,7 @@
     const gfx::Size& dst_coded_size) {
 #if BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION)
   layout_ = GetPlatformVideoFrameLayout(
-      gpu_memory_buffer_factory_, pixel_format, dst_coded_size,
+      pixel_format, dst_coded_size,
       gfx::BufferUsage::VEA_READ_CAMERA_AND_CPU_READ_WRITE);
   ASSERT_TRUE(layout_) << "Failed getting platform VideoFrameLayout";
 
@@ -595,10 +590,9 @@
                         src_plane_rows[j]);
     }
     src_frame_ptr += src_video_frame_size;
-    auto frame =
-        CloneVideoFrame(gpu_memory_buffer_factory_, memory_frame.get(),
-                        *layout_, VideoFrame::STORAGE_GPU_MEMORY_BUFFER,
-                        gfx::BufferUsage::VEA_READ_CAMERA_AND_CPU_READ_WRITE);
+    auto frame = CloneVideoFrame(
+        memory_frame.get(), *layout_, VideoFrame::STORAGE_GPU_MEMORY_BUFFER,
+        gfx::BufferUsage::VEA_READ_CAMERA_AND_CPU_READ_WRITE);
     LOG_ASSERT(!!frame) << "Failed creating GpuMemoryBuffer VideoFrame";
     auto gmb_handle = CreateGpuMemoryBufferHandle(frame.get());
     LOG_ASSERT(!gmb_handle.is_null())
diff --git a/media/gpu/test/video_test_helpers.h b/media/gpu/test/video_test_helpers.h
index 791ecd19..ddff0f2 100644
--- a/media/gpu/test/video_test_helpers.h
+++ b/media/gpu/test/video_test_helpers.h
@@ -27,10 +27,6 @@
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
 
-namespace gpu {
-class GpuMemoryBufferFactory;
-}  // namespace gpu
-
 namespace media {
 namespace test {
 class Video;
@@ -172,19 +168,17 @@
 // frames is not consecutive.
 class AlignedDataHelper {
  public:
-  AlignedDataHelper(
-      const std::vector<uint8_t>& stream,
-      uint32_t num_frames,
-      uint32_t num_read_frames,
-      bool reverse,
-      VideoPixelFormat pixel_format,
-      const gfx::Size& src_coded_size,
-      const gfx::Size& dst_coded_size,
-      const gfx::Rect& visible_rect,
-      const gfx::Size& natural_size,
-      uint32_t frame_rate,
-      VideoFrame::StorageType storage_type,
-      gpu::GpuMemoryBufferFactory* const gpu_memory_buffer_factory);
+  AlignedDataHelper(const std::vector<uint8_t>& stream,
+                    uint32_t num_frames,
+                    uint32_t num_read_frames,
+                    bool reverse,
+                    VideoPixelFormat pixel_format,
+                    const gfx::Size& src_coded_size,
+                    const gfx::Size& dst_coded_size,
+                    const gfx::Rect& visible_rect,
+                    const gfx::Size& natural_size,
+                    uint32_t frame_rate,
+                    VideoFrame::StorageType storage_type);
   ~AlignedDataHelper();
 
   // Compute and return the next frame to be sent to the encoder.
@@ -233,7 +227,6 @@
   uint32_t frame_index_ = 0;
 
   const VideoFrame::StorageType storage_type_;
-  gpu::GpuMemoryBufferFactory* const gpu_memory_buffer_factory_;
 
   // The layout of VideoFrames returned by GetNextFrame().
   absl::optional<VideoFrameLayout> layout_;
diff --git a/media/gpu/v4l2/v4l2_video_encode_accelerator.cc b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc
index de980ae..755090d 100644
--- a/media/gpu/v4l2/v4l2_video_encode_accelerator.cc
+++ b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc
@@ -409,7 +409,7 @@
   }
 
   auto platform_layout = GetPlatformVideoFrameLayout(
-      /*gpu_memory_buffer_factory=*/nullptr, output_format, output_size,
+      output_format, output_size,
       gfx::BufferUsage::VEA_READ_CAMERA_AND_CPU_READ_WRITE);
   if (!platform_layout) {
     VLOGF(1) << "Failed to get Platform VideoFrameLayout";
@@ -479,7 +479,6 @@
     switch (output_config.storage_type()) {
       case VideoFrame::STORAGE_GPU_MEMORY_BUFFER:
         image_processor_output_buffers_[i] = CreateGpuMemoryBufferVideoFrame(
-            /*gpu_memory_buffer_factory=*/nullptr,
             output_config.fourcc.ToVideoPixelFormat(), output_config.size,
             output_config.visible_rect, output_config.visible_rect.size(),
             base::TimeDelta(),
@@ -1669,8 +1668,7 @@
   gfx::Size input_size = encoder_input_visible_rect_.size();
   if (native_input_mode_) {
     auto input_layout = GetPlatformVideoFrameLayout(
-        /*gpu_memory_buffer_factory=*/nullptr, input_format,
-        encoder_input_visible_rect_.size(),
+        input_format, encoder_input_visible_rect_.size(),
         gfx::BufferUsage::VEA_READ_CAMERA_AND_CPU_READ_WRITE);
     if (!input_layout)
       return false;
diff --git a/media/gpu/vaapi/vaapi_video_decoder.cc b/media/gpu/vaapi/vaapi_video_decoder.cc
index 7243cf6..ba79ac13 100644
--- a/media/gpu/vaapi/vaapi_video_decoder.cc
+++ b/media/gpu/vaapi/vaapi_video_decoder.cc
@@ -795,8 +795,7 @@
   // TODO(b/203240043): Create a GMB directly instead of allocating a
   // VideoFrame.
   scoped_refptr<VideoFrame> dummy_frame = CreateGpuMemoryBufferVideoFrame(
-      /*gpu_memory_buffer_factory=*/nullptr, *format, decoder_pic_size,
-      decoder_visible_rect, decoder_natural_size,
+      *format, decoder_pic_size, decoder_visible_rect, decoder_natural_size,
       /*timestamp=*/base::TimeDelta(),
       cdm_context_ref_ ? gfx::BufferUsage::PROTECTED_SCANOUT_VDA_WRITE
                        : gfx::BufferUsage::SCANOUT_VDA_WRITE);
@@ -840,7 +839,6 @@
 CroStatus::Or<scoped_refptr<VideoFrame>>
 VaapiVideoDecoder::AllocateCustomFrameProxy(
     base::WeakPtr<VaapiVideoDecoder> decoder,
-    gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
     VideoPixelFormat format,
     const gfx::Size& coded_size,
     const gfx::Rect& visible_rect,
@@ -850,13 +848,12 @@
     base::TimeDelta timestamp) {
   if (!decoder)
     return CroStatus::Codes::kFailedToCreateVideoFrame;
-  return decoder->AllocateCustomFrame(
-      gpu_memory_buffer_factory, format, coded_size, visible_rect, natural_size,
-      use_protected, use_linear_buffers, timestamp);
+  return decoder->AllocateCustomFrame(format, coded_size, visible_rect,
+                                      natural_size, use_protected,
+                                      use_linear_buffers, timestamp);
 }
 
 CroStatus::Or<scoped_refptr<VideoFrame>> VaapiVideoDecoder::AllocateCustomFrame(
-    gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
     VideoPixelFormat format,
     const gfx::Size& coded_size,
     const gfx::Rect& visible_rect,
diff --git a/media/gpu/vaapi/vaapi_video_decoder.h b/media/gpu/vaapi/vaapi_video_decoder.h
index f7462189..7c2e40a 100644
--- a/media/gpu/vaapi/vaapi_video_decoder.h
+++ b/media/gpu/vaapi/vaapi_video_decoder.h
@@ -36,10 +36,6 @@
 #include "ui/gfx/gpu_memory_buffer.h"
 #include "ui/gfx/hdr_metadata.h"
 
-namespace gpu {
-class GpuMemoryBufferFactory;
-}  // namespace gpu
-
 namespace media {
 
 class AcceleratedVideoDecoder;
@@ -176,7 +172,6 @@
   // Private static helper to allow using weak ptr instead of an unretained ptr.
   static CroStatus::Or<scoped_refptr<VideoFrame>> AllocateCustomFrameProxy(
       base::WeakPtr<VaapiVideoDecoder> decoder,
-      gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
       VideoPixelFormat format,
       const gfx::Size& coded_size,
       const gfx::Rect& visible_rect,
@@ -189,7 +184,6 @@
   // only used on linux, it also sets the required YCbCr information for the
   // frame it creates.
   CroStatus::Or<scoped_refptr<VideoFrame>> AllocateCustomFrame(
-      gpu::GpuMemoryBufferFactory* gpu_memory_buffer_factory,
       VideoPixelFormat format,
       const gfx::Size& coded_size,
       const gfx::Rect& visible_rect,
diff --git a/media/gpu/video_decode_accelerator_perf_tests.cc b/media/gpu/video_decode_accelerator_perf_tests.cc
index 1757ded..fb2a3df 100644
--- a/media/gpu/video_decode_accelerator_perf_tests.cc
+++ b/media/gpu/video_decode_accelerator_perf_tests.cc
@@ -356,9 +356,8 @@
     config.implementation = g_env->GetDecoderImplementation();
     config.linear_output = g_env->ShouldOutputLinearBuffers();
 
-    auto video_player = VideoPlayer::Create(
-        config, g_env->GetGpuMemoryBufferFactory(), std::move(frame_renderer),
-        std::move(frame_processors));
+    auto video_player = VideoPlayer::Create(config, std::move(frame_renderer),
+                                            std::move(frame_processors));
     LOG_ASSERT(video_player);
     LOG_ASSERT(video_player->Initialize(video));
 
diff --git a/media/gpu/video_decode_accelerator_tests.cc b/media/gpu/video_decode_accelerator_tests.cc
index de895d5..0286cbb 100644
--- a/media/gpu/video_decode_accelerator_tests.cc
+++ b/media/gpu/video_decode_accelerator_tests.cc
@@ -183,9 +183,8 @@
     config.implementation = g_env->GetDecoderImplementation();
     config.linear_output = g_env->ShouldOutputLinearBuffers();
 
-    auto video_player = VideoPlayer::Create(
-        config, g_env->GetGpuMemoryBufferFactory(), std::move(frame_renderer),
-        std::move(frame_processors));
+    auto video_player = VideoPlayer::Create(config, std::move(frame_renderer),
+                                            std::move(frame_processors));
     LOG_ASSERT(video_player);
     LOG_ASSERT(video_player->Initialize(video));
 
@@ -510,8 +509,7 @@
 TEST_F(VideoDecoderTest, DestroyBeforeInitialize) {
   VideoDecoderClientConfig config = VideoDecoderClientConfig();
   config.implementation = g_env->GetDecoderImplementation();
-  auto tvp = VideoPlayer::Create(config, g_env->GetGpuMemoryBufferFactory(),
-                                 FrameRendererDummy::Create());
+  auto tvp = VideoPlayer::Create(config, FrameRendererDummy::Create());
   EXPECT_NE(tvp, nullptr);
 }
 
diff --git a/media/gpu/video_encode_accelerator_perf_tests.cc b/media/gpu/video_encode_accelerator_perf_tests.cc
index d92634e..5d3a8ca 100644
--- a/media/gpu/video_encode_accelerator_perf_tests.cc
+++ b/media/gpu/video_encode_accelerator_perf_tests.cc
@@ -535,8 +535,7 @@
     }
 
     auto video_encoder =
-        VideoEncoder::Create(config, g_env->GetGpuMemoryBufferFactory(),
-                             std::move(bitstream_processors));
+        VideoEncoder::Create(config, std::move(bitstream_processors));
     LOG_ASSERT(video_encoder);
     LOG_ASSERT(video_encoder->Initialize(video));
 
diff --git a/media/gpu/video_encode_accelerator_tests.cc b/media/gpu/video_encode_accelerator_tests.cc
index cd865eb..5f0d56b 100644
--- a/media/gpu/video_encode_accelerator_tests.cc
+++ b/media/gpu/video_encode_accelerator_tests.cc
@@ -139,8 +139,7 @@
     LOG_ASSERT(video);
 
     auto video_encoder =
-        VideoEncoder::Create(config, g_env->GetGpuMemoryBufferFactory(),
-                             CreateBitstreamProcessors(video, config));
+        VideoEncoder::Create(config, CreateBitstreamProcessors(video, config));
     LOG_ASSERT(video_encoder);
 
     if (!video_encoder->Initialize(video))
@@ -407,8 +406,7 @@
   if (g_env->SpatialLayers().size() > 1)
     GTEST_SKIP() << "Skip SHMEM input test cases in spatial SVC encoding";
 
-  auto video_encoder = VideoEncoder::Create(GetDefaultConfig(),
-                                            g_env->GetGpuMemoryBufferFactory());
+  auto video_encoder = VideoEncoder::Create(GetDefaultConfig());
 
   EXPECT_NE(video_encoder, nullptr);
 }
diff --git a/media/mojo/services/gpu_mojo_media_client_cros.cc b/media/mojo/services/gpu_mojo_media_client_cros.cc
index c9c2652..25805bb 100644
--- a/media/mojo/services/gpu_mojo_media_client_cros.cc
+++ b/media/mojo/services/gpu_mojo_media_client_cros.cc
@@ -109,7 +109,7 @@
                                                  traits.gpu_info)) {
     case VideoDecoderType::kVaapi:
     case VideoDecoderType::kV4L2: {
-      auto frame_pool = std::make_unique<PlatformVideoFramePool>(nullptr);
+      auto frame_pool = std::make_unique<PlatformVideoFramePool>();
       auto frame_converter = MailboxVideoFrameConverter::Create(
           base::BindRepeating(&PlatformVideoFramePool::UnwrapFrame,
                               base::Unretained(frame_pool.get())),
diff --git a/media/mojo/services/stable_video_decoder_factory_service.cc b/media/mojo/services/stable_video_decoder_factory_service.cc
index 54e2f5f..52f9e8382 100644
--- a/media/mojo/services/stable_video_decoder_factory_service.cc
+++ b/media/mojo/services/stable_video_decoder_factory_service.cc
@@ -72,8 +72,7 @@
                   : std::make_unique<media::NullMediaLog>();
     return VideoDecoderPipeline::Create(
         /*client_task_runner=*/std::move(task_runner),
-        std::make_unique<PlatformVideoFramePool>(
-            /*gpu_memory_buffer_factory=*/nullptr),
+        std::make_unique<PlatformVideoFramePool>(),
         std::make_unique<media::VideoFrameConverter>(), std::move(log));
   }
 };
diff --git a/net/cert/internal/trust_store_mac.cc b/net/cert/internal/trust_store_mac.cc
index af7952d..128c376 100644
--- a/net/cert/internal/trust_store_mac.cc
+++ b/net/cert/internal/trust_store_mac.cc
@@ -1044,12 +1044,7 @@
     LOG(ERROR) << "CreateCertBufferFromBytes";
     return name_data;
   }
-  if (__builtin_available(macOS 10.12.4, *)) {
-    name_data.reset(SecCertificateCopyNormalizedIssuerSequence(cert_handle));
-  } else {
-    name_data.reset(
-        SecCertificateCopyNormalizedIssuerContent(cert_handle, nullptr));
-  }
+  name_data.reset(SecCertificateCopyNormalizedIssuerSequence(cert_handle));
   if (!name_data)
     LOG(ERROR) << "SecCertificateCopyNormalizedIssuerContent";
   return name_data;
diff --git a/ppapi/PRESUBMIT.py b/ppapi/PRESUBMIT.py
index f518d31..61e78a77 100644
--- a/ppapi/PRESUBMIT.py
+++ b/ppapi/PRESUBMIT.py
@@ -166,7 +166,7 @@
     # TODO(crbug.com/1222512): Use sys.executable instead of
     # input_api.python_executable once idl_tests.py is py3 compatible, drop
     # shell=True.
-    cmd = [input_api.python_executable, verify_ppapi_py
+    cmd = [input_api.python3_executable, verify_ppapi_py
            ] + nacl_sdk_files[i:i + files_per_command]
     results.extend(
         RunCmdAndCheck(
diff --git a/services/device/public/cpp/geolocation/BUILD.gn b/services/device/public/cpp/geolocation/BUILD.gn
index 8ee1a3e..1c9ef16c 100644
--- a/services/device/public/cpp/geolocation/BUILD.gn
+++ b/services/device/public/cpp/geolocation/BUILD.gn
@@ -15,7 +15,10 @@
   output_name = "geolocation_service"
 
   if (is_mac) {
-    frameworks = [ "CoreLocation.framework" ]
+    frameworks = [
+      "CoreLocation.framework",
+      "Foundation.framework",
+    ]
     sources += [
       "geolocation_manager_impl_mac.h",
       "geolocation_manager_impl_mac.mm",
diff --git a/services/network/cors/cors_url_loader.cc b/services/network/cors/cors_url_loader.cc
index 46d9dac..75ee0d7 100644
--- a/services/network/cors/cors_url_loader.cc
+++ b/services/network/cors/cors_url_loader.cc
@@ -636,14 +636,6 @@
   forwarding_client_->OnTransferSizeUpdated(transfer_size_diff);
 }
 
-void CorsURLLoader::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle body) {
-  DCHECK(network_loader_);
-  DCHECK(forwarding_client_);
-  DCHECK(!deferred_redirect_url_);
-  forwarding_client_->OnStartLoadingResponseBody(std::move(body));
-}
-
 void CorsURLLoader::OnComplete(const URLLoaderCompletionStatus& status) {
   DCHECK(network_loader_);
   DCHECK(forwarding_client_);
diff --git a/services/network/cors/cors_url_loader.h b/services/network/cors/cors_url_loader.h
index 0c64a44..9c52e2d 100644
--- a/services/network/cors/cors_url_loader.h
+++ b/services/network/cors/cors_url_loader.h
@@ -98,8 +98,6 @@
                         base::OnceCallback<void()> callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const URLLoaderCompletionStatus& status) override;
 
   static network::mojom::FetchResponseType CalculateResponseTaintingForTesting(
diff --git a/services/network/public/cpp/empty_url_loader_client.cc b/services/network/public/cpp/empty_url_loader_client.cc
index 09285bd..e4f6801d 100644
--- a/services/network/public/cpp/empty_url_loader_client.cc
+++ b/services/network/public/cpp/empty_url_loader_client.cc
@@ -66,8 +66,14 @@
 void EmptyURLLoaderClient::OnReceiveResponse(
     const mojom::URLResponseHeadPtr head,
     mojo::ScopedDataPipeConsumerHandle body) {
-  if (body)
-    OnStartLoadingResponseBody(std::move(body));
+  if (!body)
+    return;
+
+  // TODO(bashi): Consider failing the request rather than DCHECK in case a
+  // URLLoader is misbehaved.
+  DCHECK(!response_body_drainer_);
+  response_body_drainer_ =
+      std::make_unique<mojo::DataPipeDrainer>(this, std::move(body));
 }
 
 void EmptyURLLoaderClient::OnReceiveRedirect(
@@ -84,15 +90,6 @@
 
 void EmptyURLLoaderClient::OnTransferSizeUpdated(int32_t transfer_size_diff) {}
 
-void EmptyURLLoaderClient::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle body) {
-  // TODO(bashi): Consider failing the request rather than DCHECK in case a
-  // URLLoader is misbehaved.
-  DCHECK(!response_body_drainer_);
-  response_body_drainer_ =
-      std::make_unique<mojo::DataPipeDrainer>(this, std::move(body));
-}
-
 void EmptyURLLoaderClient::OnComplete(const URLLoaderCompletionStatus& status) {
   done_status_ = status;
   MaybeDone();
diff --git a/services/network/public/cpp/empty_url_loader_client.h b/services/network/public/cpp/empty_url_loader_client.h
index d313fce..eaea259f 100644
--- a/services/network/public/cpp/empty_url_loader_client.h
+++ b/services/network/public/cpp/empty_url_loader_client.h
@@ -47,8 +47,6 @@
                         OnUploadProgressCallback callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const URLLoaderCompletionStatus& status) override;
 
   // mojo::DataPipeDrainer::Client overrides:
diff --git a/services/network/public/cpp/empty_url_loader_client_unittest.cc b/services/network/public/cpp/empty_url_loader_client_unittest.cc
index e230c88..3d4475b 100644
--- a/services/network/public/cpp/empty_url_loader_client_unittest.cc
+++ b/services/network/public/cpp/empty_url_loader_client_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/test/task_environment.h"
 #include "mojo/public/cpp/system/data_pipe.h"
 #include "mojo/public/cpp/system/data_pipe_utils.h"
+#include "services/network/public/mojom/url_response_head.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace network {
@@ -38,7 +39,7 @@
 
   // Upcasting to mojom::URLLoaderClient to access mojom methods.
   mojom::URLLoaderClient* client = empty_client.get();
-  client->OnStartLoadingResponseBody(std::move(consumer_handle));
+  client->OnReceiveResponse(nullptr, std::move(consumer_handle));
   client->OnComplete(URLLoaderCompletionStatus(net::OK));
 
   EXPECT_TRUE(mojo::BlockingCopyFromString(body, producer_handle));
diff --git a/services/network/public/cpp/features.cc b/services/network/public/cpp/features.cc
index a143e46..de6ae3fe 100644
--- a/services/network/public/cpp/features.cc
+++ b/services/network/public/cpp/features.cc
@@ -249,10 +249,6 @@
 const base::Feature kURLLoaderSyncClient{"URLLoaderSyncClient",
                                          base::FEATURE_ENABLED_BY_DEFAULT};
 
-// Combine URLLoaderClient::OnReceiveResponse and OnStartLoadingResponseBody.
-const base::Feature kCombineResponseBody{"CombineResponseBody",
-                                         base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Don't wait for database write before responding to
 // RestrictedCookieManager::SetCookieFromString.
 const base::Feature kFasterSetCookie{"FasterSetCookie",
diff --git a/services/network/public/cpp/features.h b/services/network/public/cpp/features.h
index 917d25d..153fa68 100644
--- a/services/network/public/cpp/features.h
+++ b/services/network/public/cpp/features.h
@@ -98,9 +98,6 @@
 extern const base::Feature kURLLoaderSyncClient;
 
 COMPONENT_EXPORT(NETWORK_CPP)
-extern const base::Feature kCombineResponseBody;
-
-COMPONENT_EXPORT(NETWORK_CPP)
 extern const base::Feature kFasterSetCookie;
 
 COMPONENT_EXPORT(NETWORK_CPP)
diff --git a/services/network/public/cpp/simple_url_loader.cc b/services/network/public/cpp/simple_url_loader.cc
index bea2803..4d17f98a 100644
--- a/services/network/public/cpp/simple_url_loader.cc
+++ b/services/network/public/cpp/simple_url_loader.cc
@@ -325,8 +325,6 @@
   void OnUploadProgress(int64_t current_position,
                         int64_t total_size,
                         OnUploadProgressCallback ack_callback) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const URLLoaderCompletionStatus& status) override;
 
   // Choose the TaskPriority based on |resource_request_|'s net priority.
@@ -1676,10 +1674,17 @@
     return;
   }
 
-  if (!weak_this)
+  if (!weak_this || !body)
     return;
-  if (body)
-    OnStartLoadingResponseBody(std::move(body));
+
+  if (request_state_->body_started || !request_state_->response_info) {
+    // If this was already called, or the headers have not been received,
+    // the URLLoader is violating the API contract.
+    FinishWithResult(net::ERR_UNEXPECTED);
+    return;
+  }
+  request_state_->body_started = true;
+  body_handler_->OnStartLoadingResponseBody(std::move(body));
 }
 
 void SimpleURLLoaderImpl::OnReceiveRedirect(
@@ -1724,19 +1729,6 @@
   std::move(ack_callback).Run();
 }
 
-void SimpleURLLoaderImpl::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle body) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (request_state_->body_started || !request_state_->response_info) {
-    // If this was already called, or the headers have not yet been received,
-    // the URLLoader is violating the API contract.
-    FinishWithResult(net::ERR_UNEXPECTED);
-    return;
-  }
-  request_state_->body_started = true;
-  body_handler_->OnStartLoadingResponseBody(std::move(body));
-}
-
 void SimpleURLLoaderImpl::OnComplete(const URLLoaderCompletionStatus& status) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   // Request should not have been completed yet.
diff --git a/services/network/public/cpp/simple_url_loader_unittest.cc b/services/network/public/cpp/simple_url_loader_unittest.cc
index 73ff1fa..becf296 100644
--- a/services/network/public/cpp/simple_url_loader_unittest.cc
+++ b/services/network/public/cpp/simple_url_loader_unittest.cc
@@ -1955,7 +1955,8 @@
   kReceived401Response,
   // Receive a response with a 501 status code.
   kReceived501Response,
-  kBodyBufferReceived,
+  // Receive a response with no body data.
+  kReceivedResponseNoData,
   kBodyDataRead,
   // ResponseComplete indicates a success.
   kResponseComplete,
@@ -2098,8 +2099,11 @@
           response_info->headers =
               base::MakeRefCounted<net::HttpResponseHeaders>(
                   net::HttpUtil::AssembleRawHeaders(headers));
+          mojo::ScopedDataPipeConsumerHandle consumer_handle;
+          ASSERT_EQ(mojo::CreateDataPipe(1024, body_stream_, consumer_handle),
+                    MOJO_RESULT_OK);
           client_->OnReceiveResponse(std::move(response_info),
-                                     mojo::ScopedDataPipeConsumerHandle());
+                                     std::move(consumer_handle));
           break;
         }
         case TestLoaderEvent::kReceived401Response: {
@@ -2108,8 +2112,11 @@
           response_info->headers =
               base::MakeRefCounted<net::HttpResponseHeaders>(
                   net::HttpUtil::AssembleRawHeaders(headers));
+          mojo::ScopedDataPipeConsumerHandle consumer_handle;
+          ASSERT_EQ(mojo::CreateDataPipe(1024, body_stream_, consumer_handle),
+                    MOJO_RESULT_OK);
           client_->OnReceiveResponse(std::move(response_info),
-                                     mojo::ScopedDataPipeConsumerHandle());
+                                     std::move(consumer_handle));
           break;
         }
         case TestLoaderEvent::kReceived501Response: {
@@ -2118,15 +2125,21 @@
           response_info->headers =
               base::MakeRefCounted<net::HttpResponseHeaders>(
                   net::HttpUtil::AssembleRawHeaders(headers));
-          client_->OnReceiveResponse(std::move(response_info),
-                                     mojo::ScopedDataPipeConsumerHandle());
-          break;
-        }
-        case TestLoaderEvent::kBodyBufferReceived: {
           mojo::ScopedDataPipeConsumerHandle consumer_handle;
           ASSERT_EQ(mojo::CreateDataPipe(1024, body_stream_, consumer_handle),
                     MOJO_RESULT_OK);
-          client_->OnStartLoadingResponseBody(std::move(consumer_handle));
+          client_->OnReceiveResponse(std::move(response_info),
+                                     std::move(consumer_handle));
+          break;
+        }
+        case TestLoaderEvent::kReceivedResponseNoData: {
+          auto response_info = network::mojom::URLResponseHead::New();
+          std::string headers("HTTP/1.0 200 OK");
+          response_info->headers =
+              base::MakeRefCounted<net::HttpResponseHeaders>(
+                  net::HttpUtil::AssembleRawHeaders(headers));
+          client_->OnReceiveResponse(std::move(response_info),
+                                     mojo::ScopedDataPipeConsumerHandle());
           break;
         }
         case TestLoaderEvent::kBodyDataRead: {
@@ -2368,8 +2381,8 @@
 // is received.
 TEST_P(SimpleURLLoaderTest, ResponseCompleteAfterReceivedResponse) {
   MockURLLoaderFactory loader_factory(&task_environment_);
-  loader_factory.AddEvents(
-      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kResponseComplete});
+  loader_factory.AddEvents({TestLoaderEvent::kReceivedResponseNoData,
+                            TestLoaderEvent::kResponseComplete});
   std::unique_ptr<SimpleLoaderTestHelper> test_helper =
       CreateHelperForURL(GURL("foo://bar/"));
   loader_factory.RunTest(test_helper.get());
@@ -2382,8 +2395,8 @@
 
 TEST_P(SimpleURLLoaderTest, CloseClientPipeBeforeBodyStarts) {
   MockURLLoaderFactory loader_factory(&task_environment_);
-  loader_factory.AddEvents(
-      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kClientPipeClosed});
+  loader_factory.AddEvents({TestLoaderEvent::kReceivedResponseNoData,
+                            TestLoaderEvent::kClientPipeClosed});
   std::unique_ptr<SimpleLoaderTestHelper> test_helper =
       CreateHelperForURL(GURL("foo://bar/"));
   loader_factory.RunTest(test_helper.get());
@@ -2440,7 +2453,6 @@
           MockURLLoaderFactory loader_factory(&task_environment_);
           std::vector<TestLoaderEvent> events;
           events.push_back(TestLoaderEvent::kReceivedResponse);
-          events.push_back(TestLoaderEvent::kBodyBufferReceived);
           if (close_client_order == ClientCloseOrder::kBeforeData)
             events.push_back(close_client_event);
 
@@ -2509,7 +2521,7 @@
 // Make sure the close client pipe message doesn't cause any issues.
 TEST_P(SimpleURLLoaderTest, ErrorAndCloseClientPipeBeforeBodyStarts) {
   MockURLLoaderFactory loader_factory(&task_environment_);
-  loader_factory.AddEvents({TestLoaderEvent::kReceivedResponse,
+  loader_factory.AddEvents({TestLoaderEvent::kReceivedResponseNoData,
                             TestLoaderEvent::kResponseCompleteFailed,
                             TestLoaderEvent::kClientPipeClosed});
   std::unique_ptr<SimpleLoaderTestHelper> test_helper =
@@ -2528,9 +2540,9 @@
 TEST_P(SimpleURLLoaderTest, SuccessAndCloseClientPipeBeforeBodyComplete) {
   MockURLLoaderFactory loader_factory(&task_environment_);
   loader_factory.AddEvents(
-      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kBodyBufferReceived,
-       TestLoaderEvent::kResponseComplete, TestLoaderEvent::kClientPipeClosed,
-       TestLoaderEvent::kBodyDataRead, TestLoaderEvent::kBodyBufferClosed});
+      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kResponseComplete,
+       TestLoaderEvent::kClientPipeClosed, TestLoaderEvent::kBodyDataRead,
+       TestLoaderEvent::kBodyBufferClosed});
   std::unique_ptr<SimpleLoaderTestHelper> test_helper =
       CreateHelperForURL(GURL("foo://bar/"));
   loader_factory.RunTest(test_helper.get());
@@ -2551,9 +2563,9 @@
 TEST_P(SimpleURLLoaderTest, SuccessAndCloseClientPipeAfterBodyComplete) {
   MockURLLoaderFactory loader_factory(&task_environment_);
   loader_factory.AddEvents(
-      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kBodyBufferReceived,
-       TestLoaderEvent::kBodyDataRead, TestLoaderEvent::kBodyBufferClosed,
-       TestLoaderEvent::kResponseComplete, TestLoaderEvent::kClientPipeClosed});
+      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kBodyDataRead,
+       TestLoaderEvent::kBodyBufferClosed, TestLoaderEvent::kResponseComplete,
+       TestLoaderEvent::kClientPipeClosed});
   std::unique_ptr<SimpleLoaderTestHelper> test_helper =
       CreateHelperForURL(GURL("foo://bar/"));
   loader_factory.RunTest(test_helper.get());
@@ -2598,24 +2610,10 @@
   EXPECT_FALSE(test_helper->response_body());
 }
 
-TEST_P(SimpleURLLoaderTest, UnexpectedBodyBufferReceived) {
-  MockURLLoaderFactory loader_factory(&task_environment_);
-  loader_factory.AddEvents({TestLoaderEvent::kBodyBufferReceived});
-  std::unique_ptr<SimpleLoaderTestHelper> test_helper =
-      CreateHelperForURL(GURL("foo://bar/"));
-  loader_factory.RunTest(test_helper.get());
-
-  EXPECT_EQ(net::ERR_UNEXPECTED, test_helper->simple_url_loader()->NetError());
-  EXPECT_FALSE(test_helper->simple_url_loader()->CompletionStatus());
-  EXPECT_FALSE(test_helper->simple_url_loader()->ResponseInfo());
-  EXPECT_FALSE(test_helper->response_body());
-}
-
 TEST_P(SimpleURLLoaderTest, DoubleBodyBufferReceived) {
   MockURLLoaderFactory loader_factory(&task_environment_);
-  loader_factory.AddEvents({TestLoaderEvent::kReceivedResponse,
-                            TestLoaderEvent::kBodyBufferReceived,
-                            TestLoaderEvent::kBodyBufferReceived});
+  loader_factory.AddEvents(
+      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kReceivedResponse});
   std::unique_ptr<SimpleLoaderTestHelper> test_helper =
       CreateHelperForURL(GURL("foo://bar/"));
   loader_factory.RunTest(test_helper.get());
@@ -2628,9 +2626,9 @@
 
 TEST_P(SimpleURLLoaderTest, UnexpectedMessageAfterBodyStarts) {
   MockURLLoaderFactory loader_factory(&task_environment_);
-  loader_factory.AddEvents(
-      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kBodyBufferReceived,
-       TestLoaderEvent::kBodyDataRead, TestLoaderEvent::kReceivedRedirect});
+  loader_factory.AddEvents({TestLoaderEvent::kReceivedResponse,
+                            TestLoaderEvent::kBodyDataRead,
+                            TestLoaderEvent::kReceivedRedirect});
   std::unique_ptr<SimpleLoaderTestHelper> test_helper =
       CreateHelperForURL(GURL("foo://bar/"));
   loader_factory.RunTest(test_helper.get());
@@ -2643,9 +2641,9 @@
 
 TEST_P(SimpleURLLoaderTest, UnexpectedMessageAfterBodyStarts2) {
   MockURLLoaderFactory loader_factory(&task_environment_);
-  loader_factory.AddEvents(
-      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kBodyBufferReceived,
-       TestLoaderEvent::kBodyDataRead, TestLoaderEvent::kBodyBufferReceived});
+  loader_factory.AddEvents({TestLoaderEvent::kReceivedResponse,
+                            TestLoaderEvent::kBodyDataRead,
+                            TestLoaderEvent::kReceivedResponse});
   std::unique_ptr<SimpleLoaderTestHelper> test_helper =
       CreateHelperForURL(GURL("foo://bar/"));
   loader_factory.RunTest(test_helper.get());
@@ -2659,9 +2657,8 @@
 TEST_P(SimpleURLLoaderTest, UnexpectedMessageAfterBodyComplete) {
   MockURLLoaderFactory loader_factory(&task_environment_);
   loader_factory.AddEvents(
-      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kBodyBufferReceived,
-       TestLoaderEvent::kBodyDataRead, TestLoaderEvent::kBodyBufferClosed,
-       TestLoaderEvent::kBodyBufferReceived});
+      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kBodyDataRead,
+       TestLoaderEvent::kBodyBufferClosed, TestLoaderEvent::kReceivedResponse});
   std::unique_ptr<SimpleLoaderTestHelper> test_helper =
       CreateHelperForURL(GURL("foo://bar/"));
   loader_factory.RunTest(test_helper.get());
@@ -2675,9 +2672,8 @@
 TEST_P(SimpleURLLoaderTest, MoreDataThanExpected) {
   MockURLLoaderFactory loader_factory(&task_environment_);
   loader_factory.AddEvents(
-      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kBodyBufferReceived,
-       TestLoaderEvent::kBodyDataRead, TestLoaderEvent::kBodyDataRead,
-       TestLoaderEvent::kBodyBufferClosed,
+      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kBodyDataRead,
+       TestLoaderEvent::kBodyDataRead, TestLoaderEvent::kBodyBufferClosed,
        TestLoaderEvent::kResponseCompleteWithExtraData});
   std::unique_ptr<SimpleLoaderTestHelper> test_helper =
       CreateHelperForURL(GURL("foo://bar/"));
@@ -2693,9 +2689,9 @@
   // Make sure that intermediate states of download are reported to the
   // progress callback.
   MockURLLoaderFactory loader_factory(&task_environment_);
-  loader_factory.AddEvents(
-      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kBodyBufferReceived,
-       TestLoaderEvent::kBodyDataRead, TestLoaderEvent::kBodyDataRead});
+  loader_factory.AddEvents({TestLoaderEvent::kReceivedResponse,
+                            TestLoaderEvent::kBodyDataRead,
+                            TestLoaderEvent::kBodyDataRead});
   std::unique_ptr<SimpleLoaderTestHelper> test_helper =
       CreateHelperForURL(GURL("foo://bar/"));
 
@@ -2766,7 +2762,6 @@
     if (test_case.expect_success) {
       // Valid response with a 1-byte body.
       loader_factory.AddEvents({TestLoaderEvent::kReceivedResponse,
-                                TestLoaderEvent::kBodyBufferReceived,
                                 TestLoaderEvent::kBodyDataRead,
                                 TestLoaderEvent::kBodyBufferClosed,
                                 TestLoaderEvent::kResponseComplete});
@@ -2857,7 +2852,6 @@
     if (test_case.expect_success) {
       // Valid response with a 1-byte body.
       loader_factory.AddEvents({TestLoaderEvent::kReceivedResponse,
-                                TestLoaderEvent::kBodyBufferReceived,
                                 TestLoaderEvent::kBodyDataRead,
                                 TestLoaderEvent::kBodyBufferClosed,
                                 TestLoaderEvent::kResponseComplete});
@@ -2934,8 +2928,7 @@
                             TestLoaderEvent::kReceived501Response});
   loader_factory.AddEvents(
       {TestLoaderEvent::kReceivedRedirect, TestLoaderEvent::kReceivedResponse,
-       TestLoaderEvent::kBodyBufferReceived, TestLoaderEvent::kBodyBufferClosed,
-       TestLoaderEvent::kResponseComplete});
+       TestLoaderEvent::kBodyBufferClosed, TestLoaderEvent::kResponseComplete});
 
   int num_redirects = 0;
 
@@ -2967,24 +2960,22 @@
 TEST_P(SimpleURLLoaderTest, RetryOnNetworkChange) {
   // TestLoaderEvents up to (and including) a network change. Since
   // SimpleURLLoader always waits for the body buffer to be closed before
-  // retrying, everything that has a kBodyBufferReceived message must also have
+  // retrying, everything that has a KReceiveResponse message must also have
   // a kBodyBufferClosed message. Each test case will be tried against each of
   // these event sequences.
   const std::vector<std::vector<TestLoaderEvent>> kNetworkChangedEvents = {
       {TestLoaderEvent::kResponseCompleteNetworkChanged},
+      {TestLoaderEvent::kReceivedResponseNoData,
+       TestLoaderEvent::kResponseCompleteNetworkChanged},
+      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kBodyBufferClosed,
+       TestLoaderEvent::kResponseCompleteNetworkChanged},
       {TestLoaderEvent::kReceivedResponse,
-       TestLoaderEvent::kResponseCompleteNetworkChanged},
-      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kBodyBufferReceived,
-       TestLoaderEvent::kBodyBufferClosed,
-       TestLoaderEvent::kResponseCompleteNetworkChanged},
-      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kBodyBufferReceived,
        TestLoaderEvent::kResponseCompleteNetworkChanged,
        TestLoaderEvent::kBodyBufferClosed},
-      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kBodyBufferReceived,
-       TestLoaderEvent::kBodyDataRead, TestLoaderEvent::kBodyBufferClosed,
+      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kBodyDataRead,
+       TestLoaderEvent::kBodyBufferClosed,
        TestLoaderEvent::kResponseCompleteNetworkChanged},
-      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kBodyBufferReceived,
-       TestLoaderEvent::kBodyDataRead,
+      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kBodyDataRead,
        TestLoaderEvent::kResponseCompleteNetworkChanged,
        TestLoaderEvent::kBodyBufferClosed},
       {TestLoaderEvent::kReceivedRedirect,
@@ -3040,7 +3031,6 @@
       if (test_case.expect_success) {
         // Valid response with a 1-byte body.
         loader_factory.AddEvents({TestLoaderEvent::kReceivedResponse,
-                                  TestLoaderEvent::kBodyBufferReceived,
                                   TestLoaderEvent::kBodyDataRead,
                                   TestLoaderEvent::kBodyBufferClosed,
                                   TestLoaderEvent::kResponseComplete});
@@ -3152,8 +3142,7 @@
        TestLoaderEvent::kStartReadLongUploadBody,
        TestLoaderEvent::kWaitForLongUploadBodySize,
        TestLoaderEvent::kReadLongUploadBody, TestLoaderEvent::kReceivedResponse,
-       TestLoaderEvent::kBodyBufferReceived, TestLoaderEvent::kResponseComplete,
-       TestLoaderEvent::kBodyBufferClosed});
+       TestLoaderEvent::kResponseComplete, TestLoaderEvent::kBodyBufferClosed});
   std::unique_ptr<SimpleLoaderTestHelper> test_helper =
       CreateHelperForURL(GURL("foo://bar/"), "POST");
   test_helper->simple_url_loader()->AttachStringForUpload(long_string,
@@ -3184,8 +3173,7 @@
        TestLoaderEvent::kStartReadLongUploadBody,
        TestLoaderEvent::kWaitForLongUploadBodySize,
        TestLoaderEvent::kReadLongUploadBody, TestLoaderEvent::kReceivedResponse,
-       TestLoaderEvent::kBodyBufferReceived, TestLoaderEvent::kResponseComplete,
-       TestLoaderEvent::kBodyBufferClosed});
+       TestLoaderEvent::kResponseComplete, TestLoaderEvent::kBodyBufferClosed});
   std::unique_ptr<SimpleLoaderTestHelper> test_helper =
       CreateHelperForURL(GURL("foo://bar/"), "POST");
   test_helper->simple_url_loader()->AttachStringForUpload(long_string,
@@ -3317,7 +3305,6 @@
         MockURLLoaderFactory loader_factory(&task_environment_);
         std::vector<TestLoaderEvent> events;
         events.push_back(TestLoaderEvent::kReceivedResponse);
-        events.push_back(TestLoaderEvent::kBodyBufferReceived);
         if (body_data_read)
           events.push_back(TestLoaderEvent::kBodyDataRead);
         if (body_buffer_closed)
@@ -3498,8 +3485,7 @@
   MockURLLoaderFactory loader_factory(&task_environment_);
   loader_factory.AddEvents(
       {TestLoaderEvent::kAdvanceOneSecond, TestLoaderEvent::kReceivedResponse,
-       TestLoaderEvent::kBodyBufferReceived, TestLoaderEvent::kResponseComplete,
-       TestLoaderEvent::kBodyBufferClosed});
+       TestLoaderEvent::kResponseComplete, TestLoaderEvent::kBodyBufferClosed});
   std::unique_ptr<SimpleLoaderTestHelper> test_helper = CreateHelper();
   test_helper->simple_url_loader()->SetTimeoutDuration(base::Seconds(1));
 
@@ -3514,9 +3500,9 @@
 TEST_F(SimpleURLLoaderMockTimeTest, StreamResumeAfterTimeout) {
   MockURLLoaderFactory loader_factory(&task_environment_);
   loader_factory.AddEvents(
-      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kBodyBufferReceived,
-       TestLoaderEvent::kBodyDataRead, TestLoaderEvent::kAdvanceOneSecond,
-       TestLoaderEvent::kResponseComplete, TestLoaderEvent::kBodyBufferClosed});
+      {TestLoaderEvent::kReceivedResponse, TestLoaderEvent::kBodyDataRead,
+       TestLoaderEvent::kAdvanceOneSecond, TestLoaderEvent::kResponseComplete,
+       TestLoaderEvent::kBodyBufferClosed});
   std::unique_ptr<SimpleLoaderTestHelper> test_helper = CreateStreamHelper();
   test_helper->simple_url_loader()->SetTimeoutDuration(base::Seconds(1));
   test_helper->set_download_to_stream_capture_resume(true);
@@ -3540,8 +3526,7 @@
   MockURLLoaderFactory loader_factory(&task_environment_);
   loader_factory.AddEvents(
       {TestLoaderEvent::kAdvanceOneSecond, TestLoaderEvent::kReceivedResponse,
-       TestLoaderEvent::kBodyBufferReceived, TestLoaderEvent::kResponseComplete,
-       TestLoaderEvent::kBodyBufferClosed});
+       TestLoaderEvent::kResponseComplete, TestLoaderEvent::kBodyBufferClosed});
   std::unique_ptr<SimpleLoaderTestHelper> test_helper = CreateHelper();
   test_helper->simple_url_loader()->SetTimeoutDuration(base::Seconds(2));
 
@@ -3560,8 +3545,7 @@
   MockURLLoaderFactory loader_factory(&task_environment_);
   loader_factory.AddEvents(
       {TestLoaderEvent::kAdvanceOneSecond, TestLoaderEvent::kReceivedResponse,
-       TestLoaderEvent::kBodyBufferReceived, TestLoaderEvent::kResponseComplete,
-       TestLoaderEvent::kBodyBufferClosed});
+       TestLoaderEvent::kResponseComplete, TestLoaderEvent::kBodyBufferClosed});
   std::unique_ptr<SimpleLoaderTestHelper> test_helper = CreateHelper();
 
   loader_factory.RunTest(test_helper.get());
@@ -3580,8 +3564,7 @@
   loader_factory.AddEvents(
       {TestLoaderEvent::kAdvanceOneSecond, TestLoaderEvent::kReceivedRedirect,
        TestLoaderEvent::kAdvanceOneSecond, TestLoaderEvent::kReceivedResponse,
-       TestLoaderEvent::kBodyBufferReceived, TestLoaderEvent::kBodyBufferClosed,
-       TestLoaderEvent::kResponseComplete});
+       TestLoaderEvent::kBodyBufferClosed, TestLoaderEvent::kResponseComplete});
   std::unique_ptr<SimpleLoaderTestHelper> test_helper = CreateHelper();
   test_helper->simple_url_loader()->SetTimeoutDuration(base::Seconds(2));
 
@@ -3599,8 +3582,7 @@
                             TestLoaderEvent::kReceived501Response});
   loader_factory.AddEvents(
       {TestLoaderEvent::kAdvanceOneSecond, TestLoaderEvent::kReceivedResponse,
-       TestLoaderEvent::kBodyBufferReceived, TestLoaderEvent::kBodyBufferClosed,
-       TestLoaderEvent::kResponseComplete});
+       TestLoaderEvent::kBodyBufferClosed, TestLoaderEvent::kResponseComplete});
   std::unique_ptr<SimpleLoaderTestHelper> test_helper = CreateHelper();
   test_helper->simple_url_loader()->SetTimeoutDuration(base::Seconds(2));
   test_helper->simple_url_loader()->SetRetryOptions(
@@ -3623,8 +3605,7 @@
                             TestLoaderEvent::kReceived501Response});
   loader_factory.AddEvents(
       {TestLoaderEvent::kAdvanceOneSecond, TestLoaderEvent::kAdvanceOneSecond,
-       TestLoaderEvent::kBodyBufferReceived, TestLoaderEvent::kBodyBufferClosed,
-       TestLoaderEvent::kResponseComplete});
+       TestLoaderEvent::kBodyBufferClosed, TestLoaderEvent::kResponseComplete});
   std::unique_ptr<SimpleLoaderTestHelper> test_helper = CreateHelper();
   test_helper->simple_url_loader()->SetTimeoutDuration(
       base::Milliseconds(1900));
diff --git a/services/network/public/mojom/url_loader.mojom b/services/network/public/mojom/url_loader.mojom
index 4a25f94..f8281611 100644
--- a/services/network/public/mojom/url_loader.mojom
+++ b/services/network/public/mojom/url_loader.mojom
@@ -97,6 +97,8 @@
   OnReceiveEarlyHints(EarlyHints early_hints);
 
   // Called when the response head is received.
+  // The loader is expected to close its end of the pipe after finishing
+  // writing the body, so that the client knows when it is done reading.
   OnReceiveResponse(URLResponseHead head,
                     handle<data_pipe_consumer>? body);
 
@@ -127,13 +129,6 @@
   // done after the upcoming network servicification work.
   OnTransferSizeUpdated(int32 transfer_size_diff);
 
-  // Called when the loader starts loading response body. This is called after
-  // OnReceiveResponse is called.
-  //
-  // The loader is expected to close its end of the pipe after finishing
-  // writing the body, so that the client knows when it is done reading.
-  OnStartLoadingResponseBody(handle<data_pipe_consumer> body);
-
   // Called when the loading completes. No notification will be dispatched for
   // this client after this message arrives. |status| has its |ssl_info| field
   // set only when |kURLLoadOptionsSendSSLInfoForCertificateError| was set.
diff --git a/services/network/test/test_url_loader_client.cc b/services/network/test/test_url_loader_client.cc
index bb3a75c..fe980a8 100644
--- a/services/network/test/test_url_loader_client.cc
+++ b/services/network/test/test_url_loader_client.cc
@@ -34,8 +34,10 @@
   response_head_ = std::move(response_head);
   if (quit_closure_for_on_receive_response_)
     std::move(quit_closure_for_on_receive_response_).Run();
-  if (body)
-    OnStartLoadingResponseBody(std::move(body));
+
+  response_body_ = std::move(body);
+  if (quit_closure_for_on_start_loading_response_body_)
+    std::move(quit_closure_for_on_start_loading_response_body_).Run();
 }
 
 void TestURLLoaderClient::OnReceiveRedirect(
@@ -88,15 +90,6 @@
   std::move(ack_callback).Run();
 }
 
-void TestURLLoaderClient::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle body) {
-  EXPECT_TRUE(has_received_response_);
-  EXPECT_FALSE(has_received_completion_);
-  response_body_ = std::move(body);
-  if (quit_closure_for_on_start_loading_response_body_)
-    std::move(quit_closure_for_on_start_loading_response_body_).Run();
-}
-
 void TestURLLoaderClient::OnComplete(const URLLoaderCompletionStatus& status) {
   EXPECT_FALSE(has_received_completion_);
   has_received_completion_ = true;
diff --git a/services/network/test/test_url_loader_client.h b/services/network/test/test_url_loader_client.h
index 2792aa3..daf98496 100644
--- a/services/network/test/test_url_loader_client.h
+++ b/services/network/test/test_url_loader_client.h
@@ -47,8 +47,6 @@
   void OnUploadProgress(int64_t current_position,
                         int64_t total_size,
                         OnUploadProgressCallback ack_callback) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const URLLoaderCompletionStatus& status) override;
 
   bool has_received_early_hints() const { return has_received_early_hints_; }
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc
index 44ea979..8137159 100644
--- a/services/network/url_loader.cc
+++ b/services/network/url_loader.cc
@@ -1954,15 +1954,8 @@
   DCHECK_EQ(emitted_devtools_raw_request_, emitted_devtools_raw_response_);
   response_->emitted_extra_info = emitted_devtools_raw_request_;
 
-  if (base::FeatureList::IsEnabled(features::kCombineResponseBody)) {
-    url_loader_client_.Get()->OnReceiveResponse(response_->Clone(),
-                                                std::move(consumer_handle_));
-  } else {
-    url_loader_client_.Get()->OnReceiveResponse(
-        response_->Clone(), mojo::ScopedDataPipeConsumerHandle());
-    url_loader_client_.Get()->OnStartLoadingResponseBody(
-        std::move(consumer_handle_));
-  }
+  url_loader_client_.Get()->OnReceiveResponse(response_->Clone(),
+                                              std::move(consumer_handle_));
 }
 
 void URLLoader::CompletePendingWrite(bool success) {
@@ -2258,15 +2251,8 @@
   }
   producer_handle.reset();
 
-  if (base::FeatureList::IsEnabled(features::kCombineResponseBody)) {
-    url_loader_client_.Get()->OnReceiveResponse(response_->Clone(),
-                                                std::move(consumer_handle));
-  } else {
-    url_loader_client_.Get()->OnReceiveResponse(
-        response_->Clone(), mojo::ScopedDataPipeConsumerHandle());
-    url_loader_client_.Get()->OnStartLoadingResponseBody(
-        std::move(consumer_handle));
-  }
+  url_loader_client_.Get()->OnReceiveResponse(response_->Clone(),
+                                              std::move(consumer_handle));
 
   // Tell the real URLLoaderClient that the response has been completed.
   if (corb_detachable_) {
diff --git a/services/network/web_bundle/web_bundle_url_loader_factory.cc b/services/network/web_bundle/web_bundle_url_loader_factory.cc
index 12355de..bba2137 100644
--- a/services/network/web_bundle/web_bundle_url_loader_factory.cc
+++ b/services/network/web_bundle/web_bundle_url_loader_factory.cc
@@ -157,14 +157,6 @@
     wrapped_->OnTransferSizeUpdated(transfer_size_diff);
   }
 
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override {
-    mojo::ScopedDataPipeConsumerHandle consumer =
-        HandleReceiveBody(std::move(body));
-    if (consumer)
-      wrapped_->OnStartLoadingResponseBody(std::move(consumer));
-  }
-
   void OnComplete(const network::URLLoaderCompletionStatus& status) override {
     if (status.error_code != net::OK) {
       if (factory_)
@@ -232,13 +224,9 @@
     return weak_ptr_factory_.GetWeakPtr();
   }
 
-  void OnResponse(mojom::URLResponseHeadPtr response) {
-    client_->OnReceiveResponse(std::move(response),
-                               mojo::ScopedDataPipeConsumerHandle());
-  }
-
-  void OnData(mojo::ScopedDataPipeConsumerHandle consumer) {
-    client_->OnStartLoadingResponseBody(std::move(consumer));
+  void OnResponse(mojom::URLResponseHeadPtr response,
+                  mojo::ScopedDataPipeConsumerHandle consumer) {
+    client_->OnReceiveResponse(std::move(response), std::move(consumer));
   }
 
   void OnFail(net::Error error) {
@@ -266,8 +254,6 @@
     // essential parts from there, so that the two implementations won't
     // diverge further. That requires non-trivial refactoring.
     corb::SanitizeBlockedResponseHeaders(*response_head);
-    client_->OnReceiveResponse(std::move(response_head),
-                               mojo::ScopedDataPipeConsumerHandle());
 
     // Send empty body to the URLLoaderClient.
     mojo::ScopedDataPipeProducerHandle producer;
@@ -277,7 +263,7 @@
       return;
     }
     producer.reset();
-    client_->OnStartLoadingResponseBody(std::move(consumer));
+    client_->OnReceiveResponse(std::move(response_head), std::move(consumer));
 
     // CORB responses are reported as a success.
     CompleteBlockedResponse(net::OK, absl::nullopt);
@@ -859,15 +845,13 @@
       break;
   }
 
-  loader->OnResponse(std::move(response_head));
-
   mojo::ScopedDataPipeProducerHandle producer;
   mojo::ScopedDataPipeConsumerHandle consumer;
   if (CreateDataPipe(nullptr, producer, consumer) != MOJO_RESULT_OK) {
     loader->OnFail(net::ERR_INSUFFICIENT_RESOURCES);
     return;
   }
-  loader->OnData(std::move(consumer));
+  loader->OnResponse(std::move(response_head), std::move(consumer));
   source_->ReadToDataPipe(
       std::move(producer), payload_offset, payload_length,
       base::BindOnce(&URLLoader::OnWriteCompleted, loader->GetWeakPtr()));
diff --git a/storage/browser/blob/blob_url_loader.cc b/storage/browser/blob/blob_url_loader.cc
index aa80b1c..c69e62bfd 100644
--- a/storage/browser/blob/blob_url_loader.cc
+++ b/storage/browser/blob/blob_url_loader.cc
@@ -231,20 +231,12 @@
   // TODO(jam): some of this code can be shared with
   // services/network/url_loader.h
 
-  client_->OnReceiveResponse(
-      std::move(response),
-      base::FeatureList::IsEnabled(network::features::kCombineResponseBody)
-          ? std::move(response_body_consumer_handle_)
-          : mojo::ScopedDataPipeConsumerHandle());
+  client_->OnReceiveResponse(std::move(response),
+                             std::move(response_body_consumer_handle_));
   sent_headers_ = true;
 
   if (metadata.has_value())
     client_->OnReceiveCachedMetadata(std::move(metadata.value()));
-
-  if (!base::FeatureList::IsEnabled(network::features::kCombineResponseBody)) {
-    client_->OnStartLoadingResponseBody(
-        std::move(response_body_consumer_handle_));
-  }
 }
 
 }  // namespace storage
diff --git a/testing/buildbot/OWNERS b/testing/buildbot/OWNERS
index 7024c91..44f10e1 100644
--- a/testing/buildbot/OWNERS
+++ b/testing/buildbot/OWNERS
@@ -52,6 +52,7 @@
 
 # Fuchsia owners.
 per-file chromium.clang.json=chonggu@google.com
+per-file chromium.fuchsia.fyi.json=chonggu@google.com
 per-file chromium.fyi.json=chonggu@google.com
 per-file chromium.linux.json=chonggu@google.com
 per-file chromium.perf.fyi.json=chonggu@google.com
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json
index e9a604b..f135a46 100644
--- a/testing/buildbot/chrome.json
+++ b/testing/buildbot/chrome.json
@@ -1942,6 +1942,22 @@
       },
       {
         "args": [],
+        "cros_board": "atlas",
+        "cros_img": "atlas-release/R102-14695.25.0",
+        "name": "lacros_all_tast_tests ATLAS_RELEASE_BETA",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {},
+        "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
+        "test": "lacros_all_tast_tests",
+        "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/",
+        "timeout_sec": 10800,
+        "variant_id": "ATLAS_RELEASE_BETA"
+      },
+      {
+        "args": [],
         "cros_board": "eve",
         "cros_img": "eve-release/R104-14829.0.0",
         "name": "lacros_all_tast_tests EVE_RELEASE_LKGM",
@@ -1971,6 +1987,22 @@
         "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/",
         "timeout_sec": 10800,
         "variant_id": "EVE_RELEASE_DEV"
+      },
+      {
+        "args": [],
+        "cros_board": "eve",
+        "cros_img": "eve-release/R102-14695.25.0",
+        "name": "lacros_all_tast_tests EVE_RELEASE_BETA",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {},
+        "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
+        "test": "lacros_all_tast_tests",
+        "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/",
+        "timeout_sec": 10800,
+        "variant_id": "EVE_RELEASE_BETA"
       }
     ]
   },
@@ -2051,6 +2083,22 @@
       },
       {
         "args": [],
+        "cros_board": "hana",
+        "cros_img": "hana-release/R102-14695.25.0",
+        "name": "lacros_all_tast_tests HANA_RELEASE_BETA",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {},
+        "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
+        "test": "lacros_all_tast_tests",
+        "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/",
+        "timeout_sec": 10800,
+        "variant_id": "HANA_RELEASE_BETA"
+      },
+      {
+        "args": [],
         "cros_board": "jacuzzi",
         "cros_img": "jacuzzi-release/R104-14829.0.0",
         "name": "lacros_all_tast_tests JACUZZI_RELEASE_LKGM",
@@ -2082,6 +2130,22 @@
         "variant_id": "JACUZZI_RELEASE_DEV"
       },
       {
+        "args": [],
+        "cros_board": "jacuzzi",
+        "cros_img": "jacuzzi-release/R102-14695.25.0",
+        "name": "lacros_all_tast_tests JACUZZI_RELEASE_BETA",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {},
+        "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
+        "test": "lacros_all_tast_tests",
+        "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/",
+        "timeout_sec": 10800,
+        "variant_id": "JACUZZI_RELEASE_BETA"
+      },
+      {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.ozone_unittests.filter"
         ],
@@ -2119,6 +2183,23 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.ozone_unittests.filter"
         ],
+        "cros_board": "hana",
+        "cros_img": "hana-release/R102-14695.25.0",
+        "name": "ozone_unittests HANA_RELEASE_BETA",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {},
+        "test": "ozone_unittests",
+        "test_id_prefix": "ninja://ui/ozone:ozone_unittests/",
+        "timeout_sec": 3600,
+        "variant_id": "HANA_RELEASE_BETA"
+      },
+      {
+        "args": [
+          "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.ozone_unittests.filter"
+        ],
         "cros_board": "jacuzzi",
         "cros_img": "jacuzzi-release/R104-14829.0.0",
         "name": "ozone_unittests JACUZZI_RELEASE_LKGM",
@@ -2151,6 +2232,23 @@
       },
       {
         "args": [
+          "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.ozone_unittests.filter"
+        ],
+        "cros_board": "jacuzzi",
+        "cros_img": "jacuzzi-release/R102-14695.25.0",
+        "name": "ozone_unittests JACUZZI_RELEASE_BETA",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {},
+        "test": "ozone_unittests",
+        "test_id_prefix": "ninja://ui/ozone:ozone_unittests/",
+        "timeout_sec": 3600,
+        "variant_id": "JACUZZI_RELEASE_BETA"
+      },
+      {
+        "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.viz_unittests.filter"
         ],
         "cros_board": "hana",
@@ -2187,6 +2285,23 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.viz_unittests.filter"
         ],
+        "cros_board": "hana",
+        "cros_img": "hana-release/R102-14695.25.0",
+        "name": "viz_unittests HANA_RELEASE_BETA",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {},
+        "test": "viz_unittests",
+        "test_id_prefix": "ninja://components/viz:viz_unittests/",
+        "timeout_sec": 3600,
+        "variant_id": "HANA_RELEASE_BETA"
+      },
+      {
+        "args": [
+          "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.viz_unittests.filter"
+        ],
         "cros_board": "jacuzzi",
         "cros_img": "jacuzzi-release/R104-14829.0.0",
         "name": "viz_unittests JACUZZI_RELEASE_LKGM",
@@ -2216,6 +2331,23 @@
         "test_id_prefix": "ninja://components/viz:viz_unittests/",
         "timeout_sec": 3600,
         "variant_id": "JACUZZI_RELEASE_DEV"
+      },
+      {
+        "args": [
+          "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.viz_unittests.filter"
+        ],
+        "cros_board": "jacuzzi",
+        "cros_img": "jacuzzi-release/R102-14695.25.0",
+        "name": "viz_unittests JACUZZI_RELEASE_BETA",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {},
+        "test": "viz_unittests",
+        "test_id_prefix": "ninja://components/viz:viz_unittests/",
+        "timeout_sec": 3600,
+        "variant_id": "JACUZZI_RELEASE_BETA"
       }
     ]
   },
diff --git a/testing/buildbot/chromium.fuchsia.fyi.json b/testing/buildbot/chromium.fuchsia.fyi.json
index c9df3fb..b8f6f11c 100644
--- a/testing/buildbot/chromium.fuchsia.fyi.json
+++ b/testing/buildbot/chromium.fuchsia.fyi.json
@@ -1832,9 +1832,6 @@
         "test_id_prefix": "ninja://ui/latency:latency_unittests/"
       },
       {
-        "args": [
-          "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.lsan.media_unittests.filter"
-        ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -2082,9 +2079,6 @@
         "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/"
       },
       {
-        "args": [
-          "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.lsan.skia_unittests.filter"
-        ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
diff --git a/testing/buildbot/filters/BUILD.gn b/testing/buildbot/filters/BUILD.gn
index cb4e5b1..5ce5c82 100644
--- a/testing/buildbot/filters/BUILD.gn
+++ b/testing/buildbot/filters/BUILD.gn
@@ -250,7 +250,7 @@
 source_set("skia_unittests_filters") {
   testonly = true
 
-  data = [ "//testing/buildbot/filters/fuchsia.lsan.skia_unittests.filter" ]
+  data = []
 }
 
 source_set("perfetto_unittests_filters") {
@@ -306,7 +306,6 @@
     "//testing/buildbot/filters/android.emulator_11_12.media_unittests.filter",
     "//testing/buildbot/filters/android.emulator_m.media_unittests.filter",
     "//testing/buildbot/filters/fuchsia.debug.media_unittests.filter",
-    "//testing/buildbot/filters/fuchsia.lsan.media_unittests.filter",
   ]
 }
 
diff --git a/testing/buildbot/filters/fuchsia.lsan.media_unittests.filter b/testing/buildbot/filters/fuchsia.lsan.media_unittests.filter
deleted file mode 100644
index 2905b4a1..0000000
--- a/testing/buildbot/filters/fuchsia.lsan.media_unittests.filter
+++ /dev/null
@@ -1,4 +0,0 @@
-# crbug.com/1287362
--FuchsiaVideoDecoderTest.H264
--FuchsiaVideoDecoderTest.ReinitializeH264
--FuchsiaVideoDecoderTest.ResetAndReinitializeH264
diff --git a/testing/buildbot/filters/fuchsia.lsan.skia_unittests.filter b/testing/buildbot/filters/fuchsia.lsan.skia_unittests.filter
deleted file mode 100644
index 64399c6..0000000
--- a/testing/buildbot/filters/fuchsia.lsan.skia_unittests.filter
+++ /dev/null
@@ -1,4 +0,0 @@
-# https://crbug.com/1287367
--FuchsiaFontManagerTest.Caching
--FuchsiaFontManagerTest.ReleaseThenCreateAgain
--FuchsiaFontManagerTest.TypefaceOutlivesManager
diff --git a/testing/buildbot/filters/stable_test_filters/linux-stable-filter-combined-rel/components_unittests.filter b/testing/buildbot/filters/stable_test_filters/linux-stable-filter-combined-rel/components_unittests.filter
index 48a219e..f31682d7 100644
--- a/testing/buildbot/filters/stable_test_filters/linux-stable-filter-combined-rel/components_unittests.filter
+++ b/testing/buildbot/filters/stable_test_filters/linux-stable-filter-combined-rel/components_unittests.filter
@@ -31,6 +31,8 @@
 -AboutThisSiteValidation.InvalidSiteInfoProto
 -AboutThisSiteValidation.InvalidSource
 -AboutThisSiteValidation.ValidateProtos
+-AcceptLanguagesServiceTest.TestCanBeAcceptLanguage
+-AcceptLanguagesServiceTest.TestIsAcceptLanguage
 -AccessTokenFetcherTest.CanceledAccessTokenRequest
 -AccessTokenFetcherTest.EmptyAccountFailsButDoesNotCrash
 -AccessTokenFetcherTest.FailedAccessTokenRequest
@@ -15143,8 +15145,6 @@
 -TransactionalLevelDBTransactionTest.IteratorRemoveInvalidation
 -TransactionalLevelDBTransactionTest.IteratorSkipsScopesMetadata
 -TransactionalLevelDBTransactionTest.IteratorValueStaysTheSame
--TranslateAcceptLanguagesTest.TestCanBeAcceptLanguage
--TranslateAcceptLanguagesTest.TestIsAcceptLanguage
 -TranslateAgentTest.TestBuildTranslationScript
 -TranslateBrowserMetricsTest.ReportInitiationStatus
 -TranslateBrowserMetricsTest.ReportLanguageDetectionError
diff --git a/testing/buildbot/filters/stable_test_filters/linux-stable-filter-rel/components_unittests.filter b/testing/buildbot/filters/stable_test_filters/linux-stable-filter-rel/components_unittests.filter
index 48a219e..f31682d7 100644
--- a/testing/buildbot/filters/stable_test_filters/linux-stable-filter-rel/components_unittests.filter
+++ b/testing/buildbot/filters/stable_test_filters/linux-stable-filter-rel/components_unittests.filter
@@ -31,6 +31,8 @@
 -AboutThisSiteValidation.InvalidSiteInfoProto
 -AboutThisSiteValidation.InvalidSource
 -AboutThisSiteValidation.ValidateProtos
+-AcceptLanguagesServiceTest.TestCanBeAcceptLanguage
+-AcceptLanguagesServiceTest.TestIsAcceptLanguage
 -AccessTokenFetcherTest.CanceledAccessTokenRequest
 -AccessTokenFetcherTest.EmptyAccountFailsButDoesNotCrash
 -AccessTokenFetcherTest.FailedAccessTokenRequest
@@ -15143,8 +15145,6 @@
 -TransactionalLevelDBTransactionTest.IteratorRemoveInvalidation
 -TransactionalLevelDBTransactionTest.IteratorSkipsScopesMetadata
 -TransactionalLevelDBTransactionTest.IteratorValueStaysTheSame
--TranslateAcceptLanguagesTest.TestCanBeAcceptLanguage
--TranslateAcceptLanguagesTest.TestIsAcceptLanguage
 -TranslateAgentTest.TestBuildTranslationScript
 -TranslateBrowserMetricsTest.ReportInitiationStatus
 -TranslateBrowserMetricsTest.ReportLanguageDetectionError
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 52b01ddf..b316faf 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -2220,11 +2220,6 @@
           '--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.debug.media_unittests.filter',
         ],
       },
-      'fuchsia-fyi-x64-asan': {
-        'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.lsan.media_unittests.filter',
-        ],
-      },
     },
   },
   'mediapipe_validating_tests': {
@@ -2905,15 +2900,6 @@
       },
     },
   },
-  'skia_unittests': {
-    'modifications': {
-      'fuchsia-fyi-x64-asan': {
-        'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.lsan.skia_unittests.filter',
-        ],
-      },
-    },
-  },
   'snapshot_unittests': {
     'modifications': {
       'fuchsia-fyi-arm64-dbg': {
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index f6f2f8c..73343906 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -7468,8 +7468,10 @@
         'variants': [
           'CROS_HANA_RELEASE_LKGM',
           'CROS_HANA_RELEASE_DEV',
+          'CROS_HANA_RELEASE_BETA',
           'CROS_JACUZZI_RELEASE_LKGM',
           'CROS_JACUZZI_RELEASE_DEV',
+          'CROS_JACUZZI_RELEASE_BETA',
         ]
       },
     },
@@ -7492,8 +7494,10 @@
         'variants': [
           'CROS_ATLAS_RELEASE_LKGM',
           'CROS_ATLAS_RELEASE_DEV',
+          'CROS_ATLAS_RELEASE_BETA',
           'CROS_EVE_RELEASE_LKGM',
           'CROS_EVE_RELEASE_DEV',
+          'CROS_EVE_RELEASE_BETA',
         ]
       },
     },
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index 2880d2e..637e3f54 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -910,6 +910,15 @@
     'enabled': True,
     'identifier': 'ATLAS_RELEASE_DEV',
   },
+  'CROS_ATLAS_RELEASE_BETA': {
+    'skylab': {
+      'cros_board': 'atlas',
+      'cros_chrome_version': '102.0.5005.22',
+      'cros_img': 'atlas-release/R102-14695.25.0',
+    },
+    'enabled': True,
+    'identifier': 'ATLAS_RELEASE_BETA',
+  },
   'CROS_EVE_RELEASE_LKGM': {
     'skylab': {
       'cros_board': 'eve',
@@ -928,6 +937,15 @@
     'enabled': True,
     'identifier': 'EVE_RELEASE_DEV',
   },
+  'CROS_EVE_RELEASE_BETA': {
+    'skylab': {
+      'cros_board': 'eve',
+      'cros_chrome_version': '102.0.5005.22',
+      'cros_img': 'eve-release/R102-14695.25.0',
+    },
+    'enabled': True,
+    'identifier': 'EVE_RELEASE_BETA',
+  },
   'CROS_EVE_FULL': {
     'skylab': {
       'cros_board': 'eve',
@@ -955,6 +973,15 @@
     'enabled': True,
     'identifier': 'HANA_RELEASE_DEV',
   },
+  'CROS_HANA_RELEASE_BETA': {
+    'skylab': {
+      'cros_board': 'hana',
+      'cros_chrome_version': '102.0.5005.22',
+      'cros_img': 'hana-release/R102-14695.25.0',
+    },
+    'enabled': True,
+    'identifier': 'HANA_RELEASE_BETA',
+  },
   'CROS_JACUZZI_RELEASE_LKGM': {
     'skylab': {
       'cros_board': 'jacuzzi',
@@ -973,6 +1000,15 @@
     'enabled': True,
     'identifier': 'JACUZZI_RELEASE_DEV',
   },
+  'CROS_JACUZZI_RELEASE_BETA': {
+    'skylab': {
+      'cros_board': 'jacuzzi',
+      'cros_chrome_version': '102.0.5005.22',
+      'cros_img': 'jacuzzi-release/R102-14695.25.0',
+    },
+    'enabled': True,
+    'identifier': 'JACUZZI_RELEASE_BETA',
+  },
   'CROS_OCTOPUS_FULL': {
     'skylab': {
       'cros_board': 'octopus',
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 2f7988f..a4fdb0d 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -6893,7 +6893,6 @@
     "SideSearchDesktop": [
         {
             "platforms": [
-                "chromeos",
                 "chromeos_lacros",
                 "linux",
                 "mac",
@@ -6945,52 +6944,17 @@
             ]
         }
     ],
-    "SideSearchGoogle": [
+    "SideSearchDesktopChromeOS": [
         {
             "platforms": [
                 "chromeos"
             ],
             "experiments": [
                 {
-                    "name": "EnabledStatePerTab",
-                    "params": {
-                        "availability": "any",
-                        "event_trigger": "name:side_search_iph_tgr;comparator:==0;window:90;storage:360",
-                        "event_used": "name:side_search_opened;comparator:==0;window:90;storage:360",
-                        "session_rate": "<3"
-                    },
+                    "name": "SideSearchDesktop",
                     "enable_features": [
-                        "IPH_SideSearch",
-                        "SideSearch",
-                        "SideSearchStatePerTab"
-                    ]
-                },
-                {
-                    "name": "EnabledStatePerWindow",
-                    "params": {
-                        "availability": "any",
-                        "event_trigger": "name:side_search_iph_tgr;comparator:==0;window:90;storage:360",
-                        "event_used": "name:side_search_opened;comparator:==0;window:90;storage:360",
-                        "session_rate": "<3"
-                    },
-                    "enable_features": [
-                        "IPH_SideSearch",
-                        "SideSearch"
-                    ]
-                },
-                {
-                    "name": "SideSearchStatePerTabCacheControl",
-                    "params": {
-                        "availability": "any",
-                        "event_trigger": "name:side_search_iph_tgr;comparator:==0;window:90;storage:360",
-                        "event_used": "name:side_search_opened;comparator:==0;window:90;storage:360",
-                        "session_rate": "<3"
-                    },
-                    "enable_features": [
-                        "IPH_SideSearch",
-                        "SideSearch",
-                        "SideSearchClearCacheWhenClosed",
-                        "SideSearchStatePerTab"
+                        "SidePanelImprovedClobbering",
+                        "SideSearchDSESupport"
                     ]
                 }
             ]
diff --git a/third_party/blink/common/loader/mime_sniffing_throttle_unittest.cc b/third_party/blink/common/loader/mime_sniffing_throttle_unittest.cc
index 764442f7..f5ab67b7 100644
--- a/third_party/blink/common/loader/mime_sniffing_throttle_unittest.cc
+++ b/third_party/blink/common/loader/mime_sniffing_throttle_unittest.cc
@@ -119,18 +119,18 @@
 
     *original_client_receiver =
         source_loader_client_remote_.BindNewPipeAndPassReceiver();
+
+    if (no_body_)
+      return;
+
+    DCHECK(!source_body_handle_);
+    mojo::ScopedDataPipeConsumerHandle consumer;
+    EXPECT_EQ(MOJO_RESULT_OK,
+              mojo::CreateDataPipe(nullptr, source_body_handle_, consumer));
+    *body = std::move(consumer);
   }
 
   void LoadResponseBody(const std::string& body) {
-    if (!source_body_handle_.is_valid()) {
-      // Send OnStartLoadingResponseBody() if it's the first call.
-      mojo::ScopedDataPipeConsumerHandle consumer;
-      EXPECT_EQ(MOJO_RESULT_OK,
-                mojo::CreateDataPipe(nullptr, source_body_handle_, consumer));
-      source_loader_client_remote()->OnStartLoadingResponseBody(
-          std::move(consumer));
-    }
-
     MojoDataPipeSender sender(std::move(source_body_handle_));
     base::RunLoop loop;
     sender.Start(body, loop.QuitClosure());
@@ -163,8 +163,11 @@
     return 0;
   }
 
+  void ResetProducer() { source_body_handle_.reset(); }
+
   bool is_intercepted() const { return is_intercepted_; }
   bool is_resumed() const { return is_resumed_; }
+  void set_no_body() { no_body_ = true; }
 
   network::TestURLLoaderClient* destination_loader_client() {
     return &destination_loader_client_;
@@ -177,6 +180,7 @@
  private:
   bool is_intercepted_ = false;
   bool is_resumed_ = false;
+  bool no_body_ = false;
   network::mojom::URLResponseHeadPtr updated_response_head_;
   mojo::ScopedDataPipeConsumerHandle body_;
 
@@ -312,6 +316,7 @@
   GURL response_url("https://example.com");
   auto response_head = network::mojom::URLResponseHead::New();
   bool defer = false;
+  delegate->set_no_body();
   throttle->WillProcessResponse(response_url, response_head.get(), &defer);
   EXPECT_TRUE(defer);
   EXPECT_TRUE(delegate->is_intercepted());
@@ -340,12 +345,7 @@
   EXPECT_TRUE(defer);
   EXPECT_TRUE(delegate->is_intercepted());
 
-  mojo::ScopedDataPipeProducerHandle producer;
-  mojo::ScopedDataPipeConsumerHandle consumer;
-  CHECK_EQ(MOJO_RESULT_OK, mojo::CreateDataPipe(nullptr, producer, consumer));
-  delegate->source_loader_client_remote()->OnStartLoadingResponseBody(
-      std::move(consumer));
-  producer.reset();  // The pipe is empty.
+  delegate->ResetProducer();
 
   delegate->source_loader_client_remote()->OnComplete(
       network::URLLoaderCompletionStatus());
@@ -508,9 +508,6 @@
   delegate->destination_loader_client()->response_body_release();
   task_environment_.RunUntilIdle();
 
-  // Send the body after the pipe is closed. The the loader aborts.
-  delegate->LoadResponseBody("This is a text.");
-
   // Calling OnComplete should not crash.
   delegate->CompleteResponse();
   task_environment_.RunUntilIdle();
diff --git a/third_party/blink/common/loader/mime_sniffing_url_loader.cc b/third_party/blink/common/loader/mime_sniffing_url_loader.cc
index d3b31f9..085d819f 100644
--- a/third_party/blink/common/loader/mime_sniffing_url_loader.cc
+++ b/third_party/blink/common/loader/mime_sniffing_url_loader.cc
@@ -72,8 +72,17 @@
   source_url_loader_.Bind(std::move(source_url_loader_remote));
   source_url_client_receiver_.Bind(std::move(source_url_client_receiver),
                                    task_runner_);
-  if (body)
-    OnStartLoadingResponseBody(std::move(body));
+  if (!body)
+    return;
+
+  state_ = State::kSniffing;
+  body_consumer_handle_ = std::move(body);
+  body_consumer_watcher_.Watch(
+      body_consumer_handle_.get(),
+      MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
+      base::BindRepeating(&MimeSniffingURLLoader::OnBodyReadable,
+                          base::Unretained(this)));
+  body_consumer_watcher_.ArmOrNotify();
 }
 
 void MimeSniffingURLLoader::OnReceiveEarlyHints(
@@ -117,18 +126,6 @@
   destination_url_loader_client_->OnTransferSizeUpdated(transfer_size_diff);
 }
 
-void MimeSniffingURLLoader::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle body) {
-  state_ = State::kSniffing;
-  body_consumer_handle_ = std::move(body);
-  body_consumer_watcher_.Watch(
-      body_consumer_handle_.get(),
-      MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-      base::BindRepeating(&MimeSniffingURLLoader::OnBodyReadable,
-                          base::Unretained(this)));
-  body_consumer_watcher_.ArmOrNotify();
-}
-
 void MimeSniffingURLLoader::OnComplete(
     const network::URLLoaderCompletionStatus& status) {
   DCHECK(!complete_status_.has_value());
diff --git a/third_party/blink/common/loader/throttling_url_loader.cc b/third_party/blink/common/loader/throttling_url_loader.cc
index 14877e4..628ee37 100644
--- a/third_party/blink/common/loader/throttling_url_loader.cc
+++ b/third_party/blink/common/loader/throttling_url_loader.cc
@@ -840,16 +840,6 @@
   forwarding_client_->OnTransferSizeUpdated(transfer_size_diff);
 }
 
-void ThrottlingURLLoader::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle body) {
-  DCHECK_EQ(DEFERRED_NONE, deferred_stage_);
-  DCHECK(!loader_completed_);
-  TRACE_EVENT1("loading", "ThrottlingURLLoader::OnStartLoadingResponseBody",
-               "url", response_url_.possibly_invalid_spec());
-
-  forwarding_client_->OnStartLoadingResponseBody(std::move(body));
-}
-
 void ThrottlingURLLoader::OnComplete(
     const network::URLLoaderCompletionStatus& status) {
   DCHECK_EQ(DEFERRED_NONE, deferred_stage_);
diff --git a/third_party/blink/common/loader/throttling_url_loader_unittest.cc b/third_party/blink/common/loader/throttling_url_loader_unittest.cc
index a4edb43..e807d3e 100644
--- a/third_party/blink/common/loader/throttling_url_loader_unittest.cc
+++ b/third_party/blink/common/loader/throttling_url_loader_unittest.cc
@@ -220,8 +220,6 @@
                         OnUploadProgressCallback ack_callback) override {}
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override {}
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override {}
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override {}
   void OnComplete(const network::URLLoaderCompletionStatus& status) override {
     on_complete_called_++;
     if (on_complete_callback_)
diff --git a/third_party/blink/public/common/loader/mime_sniffing_url_loader.h b/third_party/blink/public/common/loader/mime_sniffing_url_loader.h
index 4168653..ab9b6279 100644
--- a/third_party/blink/public/common/loader/mime_sniffing_url_loader.h
+++ b/third_party/blink/public/common/loader/mime_sniffing_url_loader.h
@@ -31,21 +31,20 @@
 // Reads the response body and determines its mime type. This url loader buffers
 // the response body until the mime type is decided. MimeSniffingURLLoader
 // is expected to be created just after receiving OnReceiveResponse(), so this
-// handles only OnStartLoadingResponseBody() and OnComplete() as a
-// network::mojom::URLLoaderClient.
+// handles only OnComplete() as a network::mojom::URLLoaderClient.
 //
 // This loader has five states:
 // kWaitForBody: The initial state until the body is received (=
-//               OnStartLoadingResponseBody() is called) or the response is
+//               OnReceiveResponse() is called) or the response is
 //               finished (= OnComplete() is called). When body is provided, the
 //               state is changed to kSniffing. Otherwise the state goes to
 //               kCompleted.
 // kSniffing: Receives the body from the source loader and estimate the mime
 //            type. The received body is kept in this loader until the mime type
 //            is decided. When the mime type is decided or all body has been
-//            received, this loader will dispatch queued messages like
-//            OnStartLoadingResponseBody() to the destination
-//            loader client, and then the state is changed to kSending.
+//            received, this loader will dispatch queued messages to the
+//            destination loader client, and then the state is changed to
+//            kSending.
 // kSending: Receives the body and sends it to the destination loader client.
 //           The state changes to kCompleted after all data is sent.
 // kCompleted: All data has been sent to the destination loader.
@@ -99,8 +98,6 @@
                         OnUploadProgressCallback ack_callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   // network::mojom::URLLoader implementation (called from the destination of
diff --git a/third_party/blink/public/common/loader/throttling_url_loader.h b/third_party/blink/public/common/loader/throttling_url_loader.h
index 04ddf6e..a15bf47a 100644
--- a/third_party/blink/public/common/loader/throttling_url_loader.h
+++ b/third_party/blink/public/common/loader/throttling_url_loader.h
@@ -169,8 +169,6 @@
                         OnUploadProgressCallback ack_callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   void OnClientConnectionError();
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn
index 86cdee74..07b04f3 100644
--- a/third_party/blink/renderer/core/BUILD.gn
+++ b/third_party/blink/renderer/core/BUILD.gn
@@ -306,6 +306,7 @@
   }
 
   deps = [
+    ":generate_eventhandler_names",
     ":generated_settings_macros",
     "//build:chromeos_buildflags",
     "//components/paint_preview/common",
@@ -1214,6 +1215,28 @@
   }
 }
 
+# Generate a list of event handler attributes, for use by Trusted Types.
+action("generate_eventhandler_names") {
+  script = "//third_party/blink/renderer/build/scripts/run_with_pythonpath.py"
+  real_script = "trustedtypes/generate_eventhandler_names.py"
+  inputs = [
+    web_idl_database_filepath,
+    real_script,
+  ]
+  outputs = [ "$target_gen_dir/trustedtypes/event_handler_names.h" ]
+  deps = [ "//third_party/blink/renderer/bindings:web_idl_database" ]
+  args = [
+    "-I",
+    rebase_path("//third_party/blink/renderer/bindings/scripts",
+                root_build_dir),
+    rebase_path(real_script, root_build_dir),
+    "--webidl",
+    rebase_path(inputs[0], root_build_dir),
+    "--out",
+    rebase_path(outputs[0], root_build_dir),
+  ]
+}
+
 # Fuzzer for blink::TextResourceDecoder.
 fuzzer_test("text_resource_decoder_fuzzer") {
   sources = [
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index 21ed5006..d425688 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -2292,13 +2292,18 @@
   if (iter != attribute_types->end())
     return iter->value;
 
-  if (q_name.LocalName().StartsWith("on")) {
-    // TODO(jakubvrana): This requires TrustedScript in all attributes
-    // starting with "on", including e.g. "one". We use this pattern elsewhere
-    // (e.g. in IsEventHandlerAttribute) but it's not ideal. Consider using
-    // the event attribute of the resulting AttributeTriggers.
+  // Since event handlers can be defined on nearly all elements, we will
+  // consider them independently of the specific element they're attached to.
+  //
+  // Note: Element::IsEventHandlerAttribute is different and over-approximates
+  // event-handler-ness, since it is expected to work only for builtin
+  // attributes (like "onclick"), while Trusted Types needs to deal with
+  // whatever users pass into setAttribute (for example "one"). Also, it
+  // requires the actual Attribute rather than the QName, which means
+  // Element::IsEventHandlerAttribute can only be called after an attribute has
+  // been constructed.
+  if (IsTrustedTypesEventHandlerAttribute(q_name))
     return SpecificTrustedType::kScript;
-  }
 
   return SpecificTrustedType::kNone;
 }
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc
index 94acf5c..06ecb1fe 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -4365,6 +4365,17 @@
   DCHECK(!IsInPerformLayout());
   DCHECK(!frame_->GetDocument() || !frame_->GetDocument()->InStyleRecalc());
 
+  // When a frame is throttled, we delete its previous painted output, so it
+  // will need to be repainted, even if nothing else has changed.
+  if (LayoutView* layout_view = GetLayoutView())
+    layout_view->Layer()->SetNeedsRepaint();
+  // The painted output of the frame may be included in a cached subsequence
+  // associated with the embedding document, so invalidate the owner.
+  if (auto* owner = GetFrame().OwnerLayoutObject()) {
+    if (PaintLayer* owner_layer = owner->Layer())
+      owner_layer->SetNeedsRepaint();
+  }
+
   if (!CanThrottleRendering()) {
     // Start ticking animation frames again if necessary.
     if (GetPage())
@@ -4380,18 +4391,6 @@
     RunPaintLifecyclePhase(PaintBenchmarkMode::kNormal);
   }
 
-  // When a frame is throttled, we typically delete its previous painted
-  // output, so it will need to be repainted, even if nothing else has
-  // changed.
-  if (LayoutView* layout_view = GetLayoutView())
-    layout_view->Layer()->SetNeedsRepaint();
-  // The painted output of the frame may be included in a cached subsequence
-  // associated with the embedding document, so invalidate the owner.
-  if (auto* owner = GetFrame().OwnerLayoutObject()) {
-    if (PaintLayer* owner_layer = owner->Layer())
-      owner_layer->SetNeedsRepaint();
-  }
-
 #if DCHECK_IS_ON()
   // Make sure we never have an unthrottled frame inside a throttled one.
   LocalFrameView* parent = ParentFrameView();
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
index 3d55dc7..1aa0c5c 100644
--- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
@@ -1704,6 +1704,11 @@
 
   GetFrame()->GetDocument()->SetPrinting(Document::kBeforePrinting);
   DispatchPrintEventRecursively(event_type_names::kBeforeprint);
+  // In case the printing or print preview aborts for any reason, it is
+  // important not to leave the document in the kBeforePrinting state.
+  // See: crbug.com/1309595
+  if (GetFrame())
+    GetFrame()->GetDocument()->SetPrinting(Document::kNotPrinting);
 }
 
 void WebLocalFrameImpl::DispatchAfterPrintEvent() {
diff --git a/third_party/blink/renderer/core/layout/ng/legacy_layout_tree_walking.h b/third_party/blink/renderer/core/layout/ng/legacy_layout_tree_walking.h
index 553b40d..485a2b3 100644
--- a/third_party/blink/renderer/core/layout/ng/legacy_layout_tree_walking.h
+++ b/third_party/blink/renderer/core/layout/ng/legacy_layout_tree_walking.h
@@ -74,7 +74,7 @@
 // Return true if the layout object is a LayoutNG object that is managed by the
 // LayoutNG engine (i.e. its containing block is a LayoutNG object as well).
 inline bool IsManagedByLayoutNG(const LayoutObject& object) {
-  if (!object.IsLayoutNGObject())
+  if (!object.IsLayoutNGObject() && !object.IsLayoutReplaced())
     return false;
   if (object.IsOutOfFlowPositioned())
     return true;
diff --git a/third_party/blink/renderer/core/speculation_rules/document_speculation_rules.cc b/third_party/blink/renderer/core/speculation_rules/document_speculation_rules.cc
index 2697bbf..2238472 100644
--- a/third_party/blink/renderer/core/speculation_rules/document_speculation_rules.cc
+++ b/third_party/blink/renderer/core/speculation_rules/document_speculation_rules.cc
@@ -122,6 +122,11 @@
             execution_context)) {
       push_candidates(mojom::blink::SpeculationAction::kPrefetch,
                       rule_set->prefetch_rules());
+    }
+
+    // Ditto for SpeculationRulesPrefetchWithSubresources.
+    if (RuntimeEnabledFeatures::SpeculationRulesPrefetchWithSubresourcesEnabled(
+            execution_context)) {
       push_candidates(
           mojom::blink::SpeculationAction::kPrefetchWithSubresources,
           rule_set->prefetch_with_subresources_rules());
diff --git a/third_party/blink/renderer/core/speculation_rules/speculation_rule_set_test.cc b/third_party/blink/renderer/core/speculation_rules/speculation_rule_set_test.cc
index a608cc31..06af1371 100644
--- a/third_party/blink/renderer/core/speculation_rules/speculation_rule_set_test.cc
+++ b/third_party/blink/renderer/core/speculation_rules/speculation_rule_set_test.cc
@@ -332,7 +332,7 @@
   DummyPageHolder page_holder;
   StubSpeculationHost speculation_host;
   const String speculation_script =
-      R"({"prefetch_with_subresources": [
+      R"({"prefetch": [
            {"source": "list",
             "urls": ["https://example.com/foo", "https://example.com/bar"],
             "requires": ["anonymous-client-ip-when-cross-origin"]}
@@ -348,15 +348,13 @@
   ASSERT_EQ(candidates.size(), 3u);
   {
     const auto& candidate = candidates[0];
-    EXPECT_EQ(candidate->action,
-              mojom::blink::SpeculationAction::kPrefetchWithSubresources);
+    EXPECT_EQ(candidate->action, mojom::blink::SpeculationAction::kPrefetch);
     EXPECT_EQ(candidate->url, "https://example.com/foo");
     EXPECT_TRUE(candidate->requires_anonymous_client_ip_when_cross_origin);
   }
   {
     const auto& candidate = candidates[1];
-    EXPECT_EQ(candidate->action,
-              mojom::blink::SpeculationAction::kPrefetchWithSubresources);
+    EXPECT_EQ(candidate->action, mojom::blink::SpeculationAction::kPrefetch);
     EXPECT_EQ(candidate->url, "https://example.com/bar");
     EXPECT_TRUE(candidate->requires_anonymous_client_ip_when_cross_origin);
   }
@@ -404,7 +402,7 @@
   DummyPageHolder page_holder;
   StubSpeculationHost speculation_host;
   const String speculation_script =
-      R"({"prefetch_with_subresources": [
+      R"({"prefetch": [
            {"source": "list",
             "urls": ["https://example.com/foo", "https://example.com/bar"],
             "requires": ["anonymous-client-ip-when-cross-origin"]}
diff --git a/third_party/blink/renderer/core/trustedtypes/generate_eventhandler_names.py b/third_party/blink/renderer/core/trustedtypes/generate_eventhandler_names.py
new file mode 100755
index 0000000..8b063fe
--- /dev/null
+++ b/third_party/blink/renderer/core/trustedtypes/generate_eventhandler_names.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python
+# Copyright 2022 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import optparse
+import sys
+
+import web_idl
+
+
+# Read the WebIDL database and write a list of all event handler attributes.
+#
+# Reads the WebIDL database (--webidl) and writes a C++ .h file with a macro
+# containing all event handler names (to --out). All attributes declared as
+# EventHandler or On(BeforeUnload|Error)EventHandler types are considered
+# event handlers.
+#
+# The macro is called EVENT_HANDLER_LIST and follows the "X macro" model of
+# macro lists [1], as its used elsewhere [2] in the Chromium code base.
+#
+# [1] https://en.wikipedia.org/wiki/X_Macro
+# [2] https://source.chromium.org/search?q=%5E%23define%5C%20%5BA-Z_%5D*LIST%5C(%20file:v8
+def main(argv):
+    parser = optparse.OptionParser()
+    parser.add_option("--out")
+    parser.add_option("--webidl")
+    options, args = parser.parse_args(argv[1:])
+
+    for option in ("out", "webidl"):
+        if not getattr(options, option):
+            parser.error(f"--{option} is required.")
+    if args:
+        parser.error("No positional arguments supported.")
+
+    event_handlers = set()
+    event_handler_types = ("EventHandler", "OnBeforeUnloadEventHandler",
+                           "OnErrorEventHandler")
+
+    web_idl_database = web_idl.Database.read_from_file(options.webidl)
+    for interface in web_idl_database.interfaces:
+        for attribute in interface.attributes:
+            idl_type = attribute.idl_type
+            if (idl_type.is_typedef
+                    and idl_type.identifier in event_handler_types):
+                event_handlers.add(attribute.identifier)
+
+    license_and_header = """\
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+"""
+
+    with open(options.out, "w") as out:
+        print(license_and_header, file=out)
+        print("// Generated from WebIDL database. Don't edit, just generate.",
+              file=out)
+        print("//", file=out)
+        print(f"// Generator: {argv[0]}", file=out)
+        print("", file=out)
+        print("#define EVENT_HANDLER_LIST(EH) \\", file=out)
+        for event in sorted(event_handlers):
+            print(f"  EH({event}) \\", file=out)
+        print("\n", file=out)
+
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv))
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.cc b/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.cc
index 7d7d9e7d..469f234 100644
--- a/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.cc
+++ b/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.cc
@@ -19,6 +19,7 @@
 #include "third_party/blink/renderer/core/inspector/exception_metadata.h"
 #include "third_party/blink/renderer/core/inspector/identifiers_factory.h"
 #include "third_party/blink/renderer/core/probe/core_probes.h"
+#include "third_party/blink/renderer/core/trustedtypes/event_handler_names.h"
 #include "third_party/blink/renderer/core/trustedtypes/trusted_html.h"
 #include "third_party/blink/renderer/core/trustedtypes/trusted_script.h"
 #include "third_party/blink/renderer/core/trustedtypes/trusted_type_policy.h"
@@ -193,7 +194,10 @@
      true},
     {"*", "innerHTML", nullptr, SpecificTrustedType::kHTML, false, true},
     {"*", "outerHTML", nullptr, SpecificTrustedType::kHTML, false, true},
-    {"*", "on*", nullptr, SpecificTrustedType::kScript, true, false},
+#define FOREACH_EVENT_HANDLER(name) \
+  {"*", #name, nullptr, SpecificTrustedType::kScript, true, false},
+    EVENT_HANDLER_LIST(FOREACH_EVENT_HANDLER)
+#undef FOREACH_EVENT_HANDLER
 };
 
 // Does a type table entry match a property?
@@ -204,22 +208,20 @@
                     const String& ns) {
   DCHECK_EQ(tag.LowerASCII(), tag);
   return (left.element == tag || !strcmp(left.element, "*")) &&
-         (left.property == attr ||
-          (!strcmp(left.property, "on*") && attr.StartsWith("on"))) &&
-         left.element_namespace == ns && !left.is_not_property;
+         left.property == attr && left.element_namespace == ns &&
+         !left.is_not_property;
 }
 
 // Does a type table entry match an attribute?
 // (Attributes get queried by calling acecssor methods on the DOM. These are
-//  case-insensitivem, because DOM.)
+//  case-insensitive, because DOM.)
 bool EqualsAttribute(decltype(*kTypeTable)& left,
                      const String& tag,
                      const String& attr,
                      const String& ns) {
   DCHECK_EQ(tag.LowerASCII(), tag);
   return (left.element == tag || !strcmp(left.element, "*")) &&
-         (String(left.property).LowerASCII() == attr.LowerASCII() ||
-          (!strcmp(left.property, "on*") && attr.StartsWith("on"))) &&
+         CodeUnitCompareIgnoringASCIICase(attr, left.property) == 0 &&
          left.element_namespace == ns && !left.is_not_attribute;
 }
 
@@ -241,10 +243,10 @@
                                  const String&,
                                  const String&);
 
-String FindTypeInTypeTable(const String& tagName,
-                           const String& propertyName,
-                           const String& elementNS,
-                           PropertyEqualsFn equals) {
+SpecificTrustedType FindTypeInTypeTable(const String& tagName,
+                                        const String& propertyName,
+                                        const String& elementNS,
+                                        PropertyEqualsFn equals) {
   SpecificTrustedType type = SpecificTrustedType::kNone;
   for (auto* it = std::cbegin(kTypeTable); it != std::cend(kTypeTable); it++) {
     if ((*equals)(*it, tagName, propertyName, elementNS)) {
@@ -252,15 +254,23 @@
       break;
     }
   }
-  return getTrustedTypeName(type);
+  return type;
+}
+
+String FindTypeNameInTypeTable(const String& tagName,
+                               const String& propertyName,
+                               const String& elementNS,
+                               PropertyEqualsFn equals) {
+  return getTrustedTypeName(
+      FindTypeInTypeTable(tagName, propertyName, elementNS, equals));
 }
 
 String TrustedTypePolicyFactory::getPropertyType(
     const String& tagName,
     const String& propertyName,
     const String& elementNS) const {
-  return FindTypeInTypeTable(tagName.LowerASCII(), propertyName, elementNS,
-                             &EqualsProperty);
+  return FindTypeNameInTypeTable(tagName.LowerASCII(), propertyName, elementNS,
+                                 &EqualsProperty);
 }
 
 String TrustedTypePolicyFactory::getAttributeType(
@@ -268,8 +278,8 @@
     const String& attributeName,
     const String& tagNS,
     const String& attributeNS) const {
-  return FindTypeInTypeTable(tagName.LowerASCII(), attributeName, tagNS,
-                             &EqualsAttribute);
+  return FindTypeNameInTypeTable(tagName.LowerASCII(), attributeName, tagNS,
+                                 &EqualsAttribute);
 }
 
 String TrustedTypePolicyFactory::getPropertyType(
@@ -372,4 +382,20 @@
   visitor->Trace(policy_map_);
 }
 
+inline bool FindEventHandlerAttributeInTable(
+    const AtomicString& attributeName) {
+  return SpecificTrustedType::kScript ==
+         FindTypeInTypeTable("*", attributeName, String(), &EqualsAttribute);
+}
+
+bool TrustedTypePolicyFactory::IsEventHandlerAttributeName(
+    const AtomicString& attributeName) {
+  // Check that the "on" prefix indeed filters out only non-event handlers.
+  DCHECK(!FindEventHandlerAttributeInTable(attributeName) ||
+         attributeName.StartsWithIgnoringASCIICase("on"));
+
+  return attributeName.StartsWithIgnoringASCIICase("on") &&
+         FindEventHandlerAttributeInTable(attributeName);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.h b/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.h
index e44fe58..1288407 100644
--- a/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.h
+++ b/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.h
@@ -75,6 +75,13 @@
   ExecutionContext* GetExecutionContext() const override;
   void Trace(Visitor*) const override;
 
+  // Check whether a given attribute is considered an event handler.
+  //
+  // This function is largely unrelated to the TrustedTypePolicyFactory, but
+  // it reuses the data from getTypeMapping, which is why we have defined it
+  // here.
+  static bool IsEventHandlerAttributeName(const AtomicString& attributeName);
+
  private:
   const WrapperTypeInfo* GetWrapperTypeInfoFromScriptValue(ScriptState*,
                                                            const ScriptValue&);
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc b/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc
index 17ca747..12500449 100644
--- a/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc
+++ b/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc
@@ -599,4 +599,10 @@
   return TrustedTypesCheckForHTML(html, execution_context, exception_state);
 }
 
+bool IsTrustedTypesEventHandlerAttribute(const QualifiedName& q_name) {
+  return q_name.NamespaceURI().IsNull() &&
+         TrustedTypePolicyFactory::IsEventHandlerAttributeName(
+             q_name.LocalName());
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_types_util.h b/third_party/blink/renderer/core/trustedtypes/trusted_types_util.h
index c0e40d41..12733890 100644
--- a/third_party/blink/renderer/core/trustedtypes/trusted_types_util.h
+++ b/third_party/blink/renderer/core/trustedtypes/trusted_types_util.h
@@ -14,6 +14,7 @@
 
 class ExceptionState;
 class ExecutionContext;
+class QualifiedName;
 class V8UnionStringOrTrustedScript;
 class V8UnionStringTreatNullAsEmptyStringOrTrustedScript;
 
@@ -87,6 +88,16 @@
 // into account.
 CORE_EXPORT bool RequireTrustedTypesCheck(const ExecutionContext*);
 
+// Determine whether an attribute is considered an event handler by Trusted
+// Types.
+//
+// Note: This is different from Element::IsEventHandlerAttribute, because
+// Element only needs this distinction for built-in attributes, but not for
+// user-defined property names. But Trusted Types needs this for any built-in or
+// user-defined attribute/property, and thus must check against a list of known
+// event handlers.
+bool IsTrustedTypesEventHandlerAttribute(const QualifiedName&);
+
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_TRUSTEDTYPES_TRUSTED_TYPES_UTIL_H_
diff --git a/third_party/blink/renderer/modules/service_worker/navigation_preload_request.cc b/third_party/blink/renderer/modules/service_worker/navigation_preload_request.cc
index 1795feba..0355a8b8 100644
--- a/third_party/blink/renderer/modules/service_worker/navigation_preload_request.cc
+++ b/third_party/blink/renderer/modules/service_worker/navigation_preload_request.cc
@@ -90,13 +90,6 @@
 void NavigationPreloadRequest::OnTransferSizeUpdated(
     int32_t transfer_size_diff) {}
 
-void NavigationPreloadRequest::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle body) {
-  DCHECK(!body_.is_valid());
-  body_ = std::move(body);
-  MaybeReportResponseToOwner();
-}
-
 void NavigationPreloadRequest::OnComplete(
     const network::URLLoaderCompletionStatus& status) {
   if (status.error_code != net::OK) {
diff --git a/third_party/blink/renderer/modules/service_worker/navigation_preload_request.h b/third_party/blink/renderer/modules/service_worker/navigation_preload_request.h
index e174880..e68efb5 100644
--- a/third_party/blink/renderer/modules/service_worker/navigation_preload_request.h
+++ b/third_party/blink/renderer/modules/service_worker/navigation_preload_request.h
@@ -51,8 +51,6 @@
                         OnUploadProgressCallback ack_callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
  private:
diff --git a/third_party/blink/renderer/platform/loader/child_url_loader_factory_bundle.cc b/third_party/blink/renderer/platform/loader/child_url_loader_factory_bundle.cc
index 0d3d320..d3a7424 100644
--- a/third_party/blink/renderer/platform/loader/child_url_loader_factory_bundle.cc
+++ b/third_party/blink/renderer/platform/loader/child_url_loader_factory_bundle.cc
@@ -97,11 +97,6 @@
     client_sink_->OnTransferSizeUpdated(transfer_size_diff);
   }
 
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override {
-    client_sink_->OnStartLoadingResponseBody(std::move(body));
-  }
-
   void OnComplete(const network::URLLoaderCompletionStatus& status) override {
     client_sink_->OnComplete(status);
   }
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client.cc
index 823adb1..4e1285b 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client.cc
@@ -344,8 +344,43 @@
   if (!weak_this)
     return;
 
-  if (body)
-    OnStartLoadingResponseBody(std::move(body));
+  if (!body)
+    return;
+
+  has_received_response_body_ = true;
+
+  if (!NeedsStoringMessage()) {
+    // Send the message immediately.
+    resource_request_sender_->OnStartLoadingResponseBody(std::move(body));
+    return;
+  }
+
+  if (freeze_mode_ != WebLoaderFreezeMode::kBufferIncoming) {
+    // Defer the message, storing the original body pipe.
+    StoreAndDispatch(
+        std::make_unique<DeferredOnStartLoadingResponseBody>(std::move(body)));
+    return;
+  }
+
+  DCHECK(IsInflightNetworkRequestBackForwardCacheSupportEnabled());
+  // We want to run loading tasks while deferred (but without dispatching the
+  // messages). Drain the original pipe containing the response body into a
+  // new pipe so that we won't block the network service if we're deferred for
+  // a long time.
+  mojo::ScopedDataPipeProducerHandle new_body_producer;
+  mojo::ScopedDataPipeConsumerHandle new_body_consumer;
+  MojoResult result =
+      mojo::CreateDataPipe(nullptr, new_body_producer, new_body_consumer);
+  if (result != MOJO_RESULT_OK) {
+    OnComplete(
+        network::URLLoaderCompletionStatus(net::ERR_INSUFFICIENT_RESOURCES));
+    return;
+  }
+  body_buffer_ = std::make_unique<BodyBuffer>(
+      this, std::move(body), std::move(new_body_producer), task_runner_);
+
+  StoreAndDispatch(std::make_unique<DeferredOnStartLoadingResponseBody>(
+      std::move(new_body_consumer)));
 }
 
 BackForwardCacheLoaderHelper*
@@ -444,49 +479,6 @@
   }
 }
 
-void MojoURLLoaderClient::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle body) {
-  TRACE_EVENT1("loading", "MojoURLLoaderClient::OnStartLoadingResponseBody",
-               "url", last_loaded_url_.GetString().Utf8());
-
-  DCHECK(has_received_response_head_);
-  DCHECK(!has_received_response_body_);
-  has_received_response_body_ = true;
-
-  if (!NeedsStoringMessage()) {
-    // Send the message immediately.
-    resource_request_sender_->OnStartLoadingResponseBody(std::move(body));
-    return;
-  }
-
-  if (freeze_mode_ != WebLoaderFreezeMode::kBufferIncoming) {
-    // Defer the message, storing the original body pipe.
-    StoreAndDispatch(
-        std::make_unique<DeferredOnStartLoadingResponseBody>(std::move(body)));
-    return;
-  }
-
-  DCHECK(IsInflightNetworkRequestBackForwardCacheSupportEnabled());
-  // We want to run loading tasks while deferred (but without dispatching the
-  // messages). Drain the original pipe containing the response body into a
-  // new pipe so that we won't block the network service if we're deferred for
-  // a long time.
-  mojo::ScopedDataPipeProducerHandle new_body_producer;
-  mojo::ScopedDataPipeConsumerHandle new_body_consumer;
-  MojoResult result =
-      mojo::CreateDataPipe(nullptr, new_body_producer, new_body_consumer);
-  if (result != MOJO_RESULT_OK) {
-    OnComplete(
-        network::URLLoaderCompletionStatus(net::ERR_INSUFFICIENT_RESOURCES));
-    return;
-  }
-  body_buffer_ = std::make_unique<BodyBuffer>(
-      this, std::move(body), std::move(new_body_producer), task_runner_);
-
-  StoreAndDispatch(std::make_unique<DeferredOnStartLoadingResponseBody>(
-      std::move(new_body_consumer)));
-}
-
 void MojoURLLoaderClient::OnComplete(
     const network::URLLoaderCompletionStatus& status) {
   has_received_complete_ = true;
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client.h b/third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client.h
index 6bc1eab4..a56efee 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client.h
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client.h
@@ -69,8 +69,6 @@
                         OnUploadProgressCallback ack_callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   void EvictFromBackForwardCache(blink::mojom::RendererEvictionReason reason);
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client_unittest.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client_unittest.cc
index ba981646..6d3d3cb 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client_unittest.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client_unittest.cc
@@ -277,19 +277,18 @@
 }
 
 TEST_P(WebMojoURLLoaderClientTest, ResponseBody) {
-  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
-                                        mojo::ScopedDataPipeConsumerHandle());
-
-  EXPECT_FALSE(context_->received_response);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(context_->received_response);
-
   MojoCreateDataPipeOptions options = DataPipeOptions();
   mojo::ScopedDataPipeProducerHandle data_pipe_producer;
   mojo::ScopedDataPipeConsumerHandle data_pipe_consumer;
   EXPECT_EQ(MOJO_RESULT_OK, mojo::CreateDataPipe(&options, data_pipe_producer,
                                                  data_pipe_consumer));
-  url_loader_client_->OnStartLoadingResponseBody(std::move(data_pipe_consumer));
+  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
+                                        std::move(data_pipe_consumer));
+
+  EXPECT_FALSE(context_->received_response);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_TRUE(context_->received_response);
+
   uint32_t size = 5;
   MojoResult result =
       data_pipe_producer->WriteData("hello", &size, MOJO_WRITE_DATA_FLAG_NONE);
@@ -344,14 +343,13 @@
 TEST_P(WebMojoURLLoaderClientTest, OnCompleteWithResponseBody) {
   network::URLLoaderCompletionStatus status;
 
-  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
-                                        mojo::ScopedDataPipeConsumerHandle());
   MojoCreateDataPipeOptions options = DataPipeOptions();
   mojo::ScopedDataPipeProducerHandle data_pipe_producer;
   mojo::ScopedDataPipeConsumerHandle data_pipe_consumer;
   EXPECT_EQ(MOJO_RESULT_OK, mojo::CreateDataPipe(&options, data_pipe_producer,
                                                  data_pipe_consumer));
-  url_loader_client_->OnStartLoadingResponseBody(std::move(data_pipe_consumer));
+  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
+                                        std::move(data_pipe_consumer));
   uint32_t size = 5;
   MojoResult result =
       data_pipe_producer->WriteData("hello", &size, MOJO_WRITE_DATA_FLAG_NONE);
@@ -381,14 +379,13 @@
 TEST_P(WebMojoURLLoaderClientTest, OnCompleteShouldBeTheLastMessage) {
   network::URLLoaderCompletionStatus status;
 
-  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
-                                        mojo::ScopedDataPipeConsumerHandle());
   MojoCreateDataPipeOptions options = DataPipeOptions();
   mojo::ScopedDataPipeProducerHandle data_pipe_producer;
   mojo::ScopedDataPipeConsumerHandle data_pipe_consumer;
   EXPECT_EQ(MOJO_RESULT_OK, mojo::CreateDataPipe(&options, data_pipe_producer,
                                                  data_pipe_consumer));
-  url_loader_client_->OnStartLoadingResponseBody(std::move(data_pipe_consumer));
+  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
+                                        std::move(data_pipe_consumer));
   url_loader_client_->OnComplete(status);
 
   base::RunLoop().RunUntilIdle();
@@ -410,14 +407,13 @@
 
   network::URLLoaderCompletionStatus status;
 
-  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
-                                        mojo::ScopedDataPipeConsumerHandle());
   MojoCreateDataPipeOptions options = DataPipeOptions();
   mojo::ScopedDataPipeProducerHandle data_pipe_producer;
   mojo::ScopedDataPipeConsumerHandle data_pipe_consumer;
   EXPECT_EQ(MOJO_RESULT_OK, mojo::CreateDataPipe(&options, data_pipe_producer,
                                                  data_pipe_consumer));
-  url_loader_client_->OnStartLoadingResponseBody(std::move(data_pipe_consumer));
+  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
+                                        std::move(data_pipe_consumer));
   url_loader_client_->OnComplete(status);
 
   EXPECT_FALSE(context_->received_response);
@@ -433,15 +429,14 @@
 TEST_P(WebMojoURLLoaderClientTest, Defer) {
   network::URLLoaderCompletionStatus status;
 
-  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
-                                        mojo::ScopedDataPipeConsumerHandle());
   MojoCreateDataPipeOptions options = DataPipeOptions();
   mojo::ScopedDataPipeProducerHandle data_pipe_producer;
   mojo::ScopedDataPipeConsumerHandle data_pipe_consumer;
   EXPECT_EQ(MOJO_RESULT_OK, mojo::CreateDataPipe(&options, data_pipe_producer,
                                                  data_pipe_consumer));
   data_pipe_producer.reset();  // Empty body.
-  url_loader_client_->OnStartLoadingResponseBody(std::move(data_pipe_consumer));
+  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
+                                        std::move(data_pipe_consumer));
   url_loader_client_->OnComplete(status);
 
   EXPECT_FALSE(context_->received_response);
@@ -465,8 +460,6 @@
 TEST_P(WebMojoURLLoaderClientTest, DeferWithResponseBody) {
   network::URLLoaderCompletionStatus status;
 
-  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
-                                        mojo::ScopedDataPipeConsumerHandle());
   MojoCreateDataPipeOptions options = DataPipeOptions();
   mojo::ScopedDataPipeProducerHandle data_pipe_producer;
   mojo::ScopedDataPipeConsumerHandle data_pipe_consumer;
@@ -479,7 +472,8 @@
   EXPECT_EQ(msg1.size(), size);
   data_pipe_producer.reset();
 
-  url_loader_client_->OnStartLoadingResponseBody(std::move(data_pipe_consumer));
+  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
+                                        std::move(data_pipe_consumer));
   url_loader_client_->OnComplete(status);
 
   EXPECT_FALSE(context_->received_response);
@@ -508,16 +502,14 @@
        DeferredAndDeferredWithBackForwardCacheTransitions) {
   if (!DeferWithBackForwardCacheEnabled())
     return;
-  // Call OnReceiveResponse and OnStartLoadingResponseBody while
-  // deferred (not for back-forward cache).
+  // Call OnReceiveResponse while deferred (not for back-forward cache).
   client_->Freeze(WebLoaderFreezeMode::kStrict);
-  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
-                                        mojo::ScopedDataPipeConsumerHandle());
   mojo::ScopedDataPipeProducerHandle producer_handle;
   mojo::ScopedDataPipeConsumerHandle consumer_handle;
   ASSERT_EQ(MOJO_RESULT_OK,
             mojo::CreateDataPipe(nullptr, producer_handle, consumer_handle));
-  url_loader_client_->OnStartLoadingResponseBody(std::move(consumer_handle));
+  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
+                                        std::move(consumer_handle));
   base::RunLoop().RunUntilIdle();
   EXPECT_FALSE(context_->received_response);
   EXPECT_FALSE(context_->complete);
@@ -575,16 +567,14 @@
        DeferredWithBackForwardCacheStoppedDeferringBeforeClosing) {
   if (!DeferWithBackForwardCacheEnabled())
     return;
-  // Call OnReceiveResponse, OnStartLoadingResponseBody, OnComplete while
-  // deferred.
+  // Call OnReceiveResponse, OnComplete while deferred.
   client_->Freeze(WebLoaderFreezeMode::kBufferIncoming);
-  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
-                                        mojo::ScopedDataPipeConsumerHandle());
   mojo::ScopedDataPipeProducerHandle producer_handle;
   mojo::ScopedDataPipeConsumerHandle consumer_handle;
   ASSERT_EQ(MOJO_RESULT_OK,
             mojo::CreateDataPipe(nullptr, producer_handle, consumer_handle));
-  url_loader_client_->OnStartLoadingResponseBody(std::move(consumer_handle));
+  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
+                                        std::move(consumer_handle));
   network::URLLoaderCompletionStatus status;
   url_loader_client_->OnComplete(status);
   base::RunLoop().RunUntilIdle();
@@ -632,61 +622,18 @@
   EXPECT_EQ("helloworld", GetRequestPeerContextBody(context_));
 }
 
-TEST_P(WebMojoURLLoaderClientTest, DeferBodyWithoutOnComplete) {
-  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
-                                        mojo::ScopedDataPipeConsumerHandle());
-  // Call OnStartLoadingResponseBody while deferred.
-  client_->Freeze(WebLoaderFreezeMode::kStrict);
-  mojo::ScopedDataPipeProducerHandle producer_handle;
-  mojo::ScopedDataPipeConsumerHandle consumer_handle;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            mojo::CreateDataPipe(nullptr, producer_handle, consumer_handle));
-  url_loader_client_->OnStartLoadingResponseBody(std::move(consumer_handle));
-  base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(context_->received_response);
-  EXPECT_FALSE(context_->complete);
-  EXPECT_EQ("", GetRequestPeerContextBody(context_));
-
-  // Write data to the response body pipe, but don't close the connection yet.
-  std::string msg1 = "hello";
-  uint32_t size = static_cast<uint32_t>(msg1.size());
-  // We expect that the other end of the pipe to be ready to read the data
-  // immediately.
-  ASSERT_EQ(MOJO_RESULT_OK, producer_handle->WriteData(
-                                msg1.data(), &size, MOJO_WRITE_DATA_FLAG_NONE));
-  EXPECT_EQ(msg1.size(), size);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_EQ("", GetRequestPeerContextBody(context_));
-
-  // Stop deferring.
-  client_->Freeze(WebLoaderFreezeMode::kNone);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(context_->received_response);
-  EXPECT_FALSE(context_->complete);
-  EXPECT_EQ("hello", GetRequestPeerContextBody(context_));
-
-  // Close the response body pipe.
-  producer_handle.reset();
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(context_->received_response);
-  EXPECT_FALSE(context_->complete);
-  EXPECT_EQ("hello", GetRequestPeerContextBody(context_));
-}
-
 TEST_P(WebMojoURLLoaderClientTest,
        DeferredWithBackForwardCacheLongResponseBody) {
   if (!DeferWithBackForwardCacheEnabled())
     return;
-  // Call OnReceiveResponse, OnStartLoadingResponseBody, OnComplete while
-  // deferred.
+  // Call OnReceiveResponse, OnComplete while deferred.
   client_->Freeze(WebLoaderFreezeMode::kBufferIncoming);
-  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
-                                        mojo::ScopedDataPipeConsumerHandle());
   mojo::ScopedDataPipeProducerHandle producer_handle;
   mojo::ScopedDataPipeConsumerHandle consumer_handle;
   ASSERT_EQ(MOJO_RESULT_OK,
             mojo::CreateDataPipe(nullptr, producer_handle, consumer_handle));
-  url_loader_client_->OnStartLoadingResponseBody(std::move(consumer_handle));
+  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
+                                        std::move(consumer_handle));
   network::URLLoaderCompletionStatus status;
   url_loader_client_->OnComplete(status);
   base::RunLoop().RunUntilIdle();
@@ -745,8 +692,6 @@
 TEST_P(WebMojoURLLoaderClientTest, DeferWithTransferSizeUpdated) {
   network::URLLoaderCompletionStatus status;
 
-  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
-                                        mojo::ScopedDataPipeConsumerHandle());
   MojoCreateDataPipeOptions options = DataPipeOptions();
   mojo::ScopedDataPipeProducerHandle data_pipe_producer;
   mojo::ScopedDataPipeConsumerHandle data_pipe_consumer;
@@ -759,7 +704,8 @@
   EXPECT_EQ(5u, size);
   data_pipe_producer.reset();
 
-  url_loader_client_->OnStartLoadingResponseBody(std::move(data_pipe_consumer));
+  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
+                                        std::move(data_pipe_consumer));
   url_loader_client_->OnTransferSizeUpdated(4);
   url_loader_client_->OnComplete(status);
 
@@ -797,8 +743,6 @@
 
   url_loader_client_->OnReceiveRedirect(redirect_info,
                                         network::mojom::URLResponseHead::New());
-  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
-                                        mojo::ScopedDataPipeConsumerHandle());
   MojoCreateDataPipeOptions options = DataPipeOptions();
   mojo::ScopedDataPipeProducerHandle data_pipe_producer;
   mojo::ScopedDataPipeConsumerHandle data_pipe_consumer;
@@ -811,7 +755,8 @@
   EXPECT_EQ(5u, size);
   data_pipe_producer.reset();
 
-  url_loader_client_->OnStartLoadingResponseBody(std::move(data_pipe_consumer));
+  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
+                                        std::move(data_pipe_consumer));
   url_loader_client_->OnTransferSizeUpdated(4);
   url_loader_client_->OnComplete(status);
 
@@ -861,15 +806,14 @@
 
   network::URLLoaderCompletionStatus status;
 
-  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
-                                        mojo::ScopedDataPipeConsumerHandle());
   MojoCreateDataPipeOptions options = DataPipeOptions();
   mojo::ScopedDataPipeProducerHandle data_pipe_producer;
   mojo::ScopedDataPipeConsumerHandle data_pipe_consumer;
   EXPECT_EQ(MOJO_RESULT_OK, mojo::CreateDataPipe(&options, data_pipe_producer,
                                                  data_pipe_consumer));
   data_pipe_producer.reset();  // Empty body.
-  url_loader_client_->OnStartLoadingResponseBody(std::move(data_pipe_consumer));
+  url_loader_client_->OnReceiveResponse(network::mojom::URLResponseHead::New(),
+                                        std::move(data_pipe_consumer));
 
   url_loader_client_->OnTransferSizeUpdated(4);
   url_loader_client_->OnComplete(status);
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.cc
index ac3f450c..3ce9b71 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.cc
@@ -99,22 +99,6 @@
       transfer_size_diff);
 }
 
-void NavigationBodyLoader::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle handle) {
-  TRACE_EVENT1("loading", "NavigationBodyLoader::OnStartLoadingResponseBody",
-               "url", original_url_.GetString().Utf8());
-  DCHECK(!has_received_body_handle_);
-  DCHECK(!has_received_completion_);
-  has_received_body_handle_ = true;
-  has_seen_end_of_data_ = false;
-  handle_ = std::move(handle);
-  DCHECK(handle_.is_valid());
-  handle_watcher_.Watch(handle_.get(), MOJO_HANDLE_SIGNAL_READABLE,
-                        base::BindRepeating(&NavigationBodyLoader::OnReadable,
-                                            base::Unretained(this)));
-  OnReadable(MOJO_RESULT_OK);
-}
-
 void NavigationBodyLoader::OnComplete(
     const network::URLLoaderCompletionStatus& status) {
   // Except for errors, there must always be a response's body.
@@ -345,14 +329,24 @@
   // to read from the data pipe immediately which may potentially postpone the
   // method calls from the remote. That causes the flakiness of some layout
   // tests.
-  // TODO(minggang): The binding was executed after OnStartLoadingResponseBody
+  // TODO(minggang): The binding was executed after OnReceiveResponse
   // originally (prior to passing the response body from the browser process
   // during navigation), we should try to put it back if all the
   // webkit_layout_tests can pass in that way.
   BindURLLoaderAndContinue();
 
   DCHECK(response_body_.is_valid());
-  OnStartLoadingResponseBody(std::move(response_body_));
+
+  DCHECK(!has_received_body_handle_);
+  DCHECK(!has_received_completion_);
+  has_received_body_handle_ = true;
+  has_seen_end_of_data_ = false;
+  handle_ = std::move(response_body_);
+  DCHECK(handle_.is_valid());
+  handle_watcher_.Watch(handle_.get(), MOJO_HANDLE_SIGNAL_READABLE,
+                        base::BindRepeating(&NavigationBodyLoader::OnReadable,
+                                            base::Unretained(this)));
+  OnReadable(MOJO_RESULT_OK);
   // Don't use |this| here as it might have been destroyed.
 }
 
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.h b/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.h
index 6e7ddd3..b2534e4 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.h
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/navigation_body_loader.h
@@ -69,7 +69,7 @@
   // ContinueWithCodeCache
   //   notify client about cache
   // BindURLLoaderAndContinue
-  // OnStartLoadingResponseBody
+  // OnReceiveResponse
   //   start reading from the pipe
   // OnReadable (zero or more times)
   //   notify client about data
@@ -100,8 +100,6 @@
                         OnUploadProgressCallback callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle handle) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   void CodeCacheReceived(base::Time response_time, mojo_base::BigBuffer data);
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/web_resource_request_sender_unittest.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/web_resource_request_sender_unittest.cc
index 5d6ea12..e8ba6a33 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/web_resource_request_sender_unittest.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/web_resource_request_sender_unittest.cc
@@ -221,15 +221,15 @@
     NOTREACHED();
   }
 
-  void CallOnReceiveResponse(network::mojom::URLLoaderClient* client) {
+  void CallOnReceiveResponse(network::mojom::URLLoaderClient* client,
+                             mojo::ScopedDataPipeConsumerHandle body) {
     auto head = network::mojom::URLResponseHead::New();
     std::string raw_headers(kTestPageHeaders);
     std::replace(raw_headers.begin(), raw_headers.end(), '\n', '\0');
     head->headers = new net::HttpResponseHeaders(raw_headers);
     head->mime_type = kTestPageMimeType;
     head->charset = kTestPageCharset;
-    client->OnReceiveResponse(std::move(head),
-                              mojo::ScopedDataPipeConsumerHandle());
+    client->OnReceiveResponse(std::move(head), std::move(body));
   }
 
   std::unique_ptr<network::ResourceRequest> CreateResourceRequest() {
@@ -324,15 +324,14 @@
       std::move(loader_and_clients_[0].second));
   loader_and_clients_.clear();
 
-  // The wrapper eats all messages until RequestComplete message is sent.
-  CallOnReceiveResponse(client.get());
-
   mojo::ScopedDataPipeProducerHandle producer_handle;
   mojo::ScopedDataPipeConsumerHandle consumer_handle;
   auto options = DataPipeOptions();
   ASSERT_EQ(mojo::CreateDataPipe(&options, producer_handle, consumer_handle),
             MOJO_RESULT_OK);
-  client->OnStartLoadingResponseBody(std::move(consumer_handle));
+
+  // The wrapper eats all messages until RequestComplete message is sent.
+  CallOnReceiveResponse(client.get(), std::move(consumer_handle));
 
   uint32_t size = static_cast<uint32_t>(strlen(kTestPageContents));
   auto result = producer_handle->WriteData(kTestPageContents, &size,
@@ -373,13 +372,13 @@
       std::move(loader_and_clients_[0].second));
   loader_and_clients_.clear();
 
-  CallOnReceiveResponse(client.get());
   mojo::ScopedDataPipeProducerHandle producer_handle;
   mojo::ScopedDataPipeConsumerHandle consumer_handle;
   auto options = DataPipeOptions();
   ASSERT_EQ(mojo::CreateDataPipe(&options, producer_handle, consumer_handle),
             MOJO_RESULT_OK);
-  client->OnStartLoadingResponseBody(std::move(consumer_handle));
+
+  CallOnReceiveResponse(client.get(), std::move(consumer_handle));
   uint32_t size = static_cast<uint32_t>(strlen(kTestPageContents));
   auto result = producer_handle->WriteData(kTestPageContents, &size,
                                            MOJO_WRITE_DATA_FLAG_NONE);
@@ -495,14 +494,14 @@
     // copied.
     response_head->load_timing.request_start_time =
         base::Time() + base::Seconds(99);
-    client->OnReceiveResponse(std::move(response_head),
-                              mojo::ScopedDataPipeConsumerHandle());
 
     mojo::ScopedDataPipeProducerHandle producer_handle;
     mojo::ScopedDataPipeConsumerHandle consumer_handle;
     ASSERT_EQ(mojo::CreateDataPipe(nullptr, producer_handle, consumer_handle),
               MOJO_RESULT_OK);
-    client->OnStartLoadingResponseBody(std::move(consumer_handle));
+
+    client->OnReceiveResponse(std::move(response_head),
+                              std::move(consumer_handle));
     producer_handle.reset();  // The response is empty.
 
     network::URLLoaderCompletionStatus status;
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/worker_main_script_loader.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/worker_main_script_loader.cc
index 4561e01f..99192528 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/worker_main_script_loader.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/worker_main_script_loader.cc
@@ -155,12 +155,6 @@
 void WorkerMainScriptLoader::OnTransferSizeUpdated(int32_t transfer_size_diff) {
 }
 
-void WorkerMainScriptLoader::OnStartLoadingResponseBody(
-    mojo::ScopedDataPipeConsumerHandle handle) {
-  // This has already happened in the browser process.
-  NOTREACHED();
-}
-
 void WorkerMainScriptLoader::OnComplete(
     const network::URLLoaderCompletionStatus& status) {
   if (status.error_code != net::OK)
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/worker_main_script_loader.h b/third_party/blink/renderer/platform/loader/fetch/url_loader/worker_main_script_loader.h
index e5580d8b..2c35e75 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/worker_main_script_loader.h
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/worker_main_script_loader.h
@@ -71,8 +71,6 @@
                         OnUploadProgressCallback callback) override;
   void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override;
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle handle) override;
   void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   const KURL& GetRequestURL() const { return initial_request_url_; }
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 461f1f4..d3886f1 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -2191,7 +2191,7 @@
     // was enabled.
     {
       name: "SpeculationRules",
-      implied_by: ["SpeculationRulesPrefetchProxy", "Prerender2"],
+      implied_by: ["SpeculationRulesPrefetchProxy", "SpeculationRulesPrefetchWithSubresources", "Prerender2"],
       origin_trial_feature_name: "SpeculationRules__DONOTUSE",
     },
     // Origin trial to enable Speculation Rules for access to the prefetch proxy.
@@ -2201,6 +2201,9 @@
       origin_trial_feature_name: "SpeculationRulesPrefetch",
     },
     {
+      "name": "SpeculationRulesPrefetchWithSubresources",
+    },
+    {
       name: "SrcsetMaxDensity",
     },
     // Used as argument in attribute of stable-release functions/interfaces
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests
index ab5e00b..5ac161d7 100644
--- a/third_party/blink/web_tests/NeverFixTests
+++ b/third_party/blink/web_tests/NeverFixTests
@@ -1787,10 +1787,10 @@
 crbug.com/1016767 js/weakrefs/* [ Skip ]
 virtual/weakrefs/js/weakrefs/* [ Pass ]
 
-# The Wasm code cache requires disabling the baseline compiler, so only the
+# The Wasm code cache test requires access to V8 internals, so only the
 # virtual test should be run.
-http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test.js [ Skip ]
-virtual/wasm-site-isolated-code-cache/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test.js [ Pass ]
+http/tests/wasm/caching/code-cache.html [ Skip ]
+virtual/wasm-code-caching/http/tests/wasm/caching/code-cache.html [ Pass ]
 
 # This test run under virtual suites only.
 crbug.com/981970 external/wpt/fetch/http-cache/split-cache.html [ Skip ]
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests
index 911e15b..8396d8a 100644
--- a/third_party/blink/web_tests/SlowTests
+++ b/third_party/blink/web_tests/SlowTests
@@ -80,6 +80,7 @@
 crbug.com/678482 http/tests/devtools/debugger/fetch-breakpoints.js [ Slow ]
 crbug.com/1236466 inspector-protocol/runtime/runtime-execution-contexts-events.js [ Slow ]
 crbug.com/1229701 http/tests/inspector-protocol/network/disable-cache-media-resource.js [ Slow ]
+crbug.com/1300409 [ Win ] http/tests/inspector-protocol/network/websocket/offline-no-send.js [ Slow ]
 
 crbug.com/510337 cssom/cssvalue-comparison.html [ Slow ]
 
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index a5f55cb..88b04306 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -4685,10 +4685,6 @@
 # Sheriff 2019-03-05
 crbug.com/938200 http/tests/devtools/network/network-blocked-reason.js [ Pass Timeout ]
 
-# Skip before rebaselining expectations
-crbug.com/v8/12808 external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache.html [ Skip ]
-crbug.com/v8/12808 virtual/v8-off-thread-finalization/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache.html [ Skip ]
-
 # Caused a revert of a good change.
 crbug.com/931533 media/video-played-collapse.html [ Failure Pass ]
 
@@ -5674,6 +5670,7 @@
 crbug.com/1198698 external/wpt/clear-site-data/storage.https.html [ Pass Timeout ]
 
 # Sheriff 2021-04-14
+crbug.com/1198828 [ Win ] virtual/scroll-unification/fast/events/mouse-events-on-node-deletion.html [ Failure Pass ]
 crbug.com/1198828 [ Linux ] virtual/scroll-unification/fast/events/mouse-events-on-node-deletion.html [ Failure Pass ]
 
 # Sheriff 2021-04-15
@@ -5933,7 +5930,6 @@
 crbug.com/1222097 http/tests/canvas/captureStream-on-detached-canvas.html [ Skip ]
 crbug.com/1222097 virtual/plz-dedicated-worker/external/wpt/html/cross-origin-embedder-policy/blob.https.html [ Skip ]
 crbug.com/1222097 virtual/plz-dedicated-worker/external/wpt/html/cross-origin-embedder-policy/worker-inheritance.sub.https.html [ Skip ]
-crbug.com/1222097 virtual/wasm-site-isolated-code-cache/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test.js [ Skip ]
 crbug.com/1222097 external/wpt/uievents/order-of-events/mouse-events/mouseover-out.html [ Skip ]
 
 # Sheriff 2021-06-25
@@ -6883,13 +6879,11 @@
 crbug.com/1322072 external/wpt/fetch/content-type/script.window.html [ Failure Pass ]
 crbug.com/1286883 [ Mac ] fast/canvas/OffscreenCanvas-Bitmaprenderer-toBlob.html [ Failure Pass ]
 
-# Sheriff 2022-05-09
-crbug.com/1323626 [ Mac11-arm64 ] compositing/lots-of-img-layers.html [ Failure Pass ]
-crbug.com/1323626 [ Mac11-arm64 ] compositing/lots-of-img-layers-with-opacity.html [ Failure Pass ]
-crbug.com/1323627 [ Mac11-arm64 ] virtual/gpu-rasterization/images/color-profile-svg-foreign-object.html [ Failure Pass ]
-
 # Sheriff 2022-05-11
 crbug.com/1324428 fast/webgl/canvas-toDataURL-crash.html [ Crash Pass ]
 
 # Throttling a hidden-cross origin frame may stall animations.
 crbug.com/1323246 external/wpt/web-animations/timing-model/timelines/sibling-iframe-timeline.html [ Failure Pass ]
+
+# Sheriff 2022-05-16
+crbug.com/1325858 virtual/wasm-code-caching/http/tests/wasm/caching/code-cache.html [ Skip ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index dc02eee..25f42e6 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -461,11 +461,10 @@
     "args": ["--enable-blink-features=ExtraWebGLVideoTextureMetadata"]
   },
   {
-    "prefix": "wasm-site-isolated-code-cache",
+    "prefix": "wasm-code-caching",
     "platforms": ["Linux", "Mac", "Win"],
-    "bases": ["http/tests/devtools/wasm-isolated-code-cache"],
-    "args": ["--disable-features=WebAssemblyBaseline",
-             "--site-per-process"]
+    "bases": ["http/tests/wasm/caching"],
+    "args": ["--js-flags=--allow-natives-syntax"]
   },
   {
     "prefix": "wasm-csp",
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/orthogonal-replaced-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/orthogonal-replaced-crash.html
new file mode 100644
index 0000000..10474fd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/orthogonal-replaced-crash.html
@@ -0,0 +1,11 @@
+<!doctype html>
+<title>Chrome crash for replaced in orthogonal flow query container</title>
+<link rel="help" href="https://crbug.com/1325673">
+<p>Pass if no crash.</p>
+<iframe></iframe>
+<style>
+  body {
+    container-type: size;
+    writing-mode: vertical-rl;
+  }
+</style>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/child-indexed-pseudo-classes-in-has.html b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/child-indexed-pseudo-classes-in-has.html
new file mode 100644
index 0000000..5c689e23
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/child-indexed-pseudo-classes-in-has.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>CSS Selectors Invalidation: child-indexed pseudo classes in :has() argument</title>
+<link rel="author" title="Byungwoo Lee" href="blee@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/selectors/#relational">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+  #container ~ div { color: grey }
+  #container:has(:only-child) ~ #only_child { color: red }
+  #container:has(.orange:first-child) ~ #first_child { color: orange }
+  #container:has(.yellow:first-child) ~ #first_child { color: yellow }
+  #container:has(.green:first-child) ~ #first_child { color: green }
+  #container:has(.orange:last-child) ~ #last_child { color: orange }
+  #container:has(.yellow:last-child) ~ #last_child { color: yellow }
+  #container:has(.green:last-child) ~ #last_child { color: green }
+  #container:has(.orange:nth-child(3n)) ~ #nth_child_3n { color: orange }
+  #container:has(.yellow:nth-child(3n)) ~ #nth_child_3n { color: yellow }
+  #container:has(.green:nth-child(3n)) ~ #nth_child_3n { color: green }
+  #container:has(.orange:nth-child(3n+1)) ~ #nth_child_3n_1 { color: orange }
+  #container:has(.yellow:nth-child(3n+1)) ~ #nth_child_3n_1 { color: yellow }
+  #container:has(.green:nth-child(3n+1)) ~ #nth_child_3n_1 { color: green }
+  #container:has(.orange:nth-child(3n+2)) ~ #nth_child_3n_2 { color: orange }
+  #container:has(.yellow:nth-child(3n+2)) ~ #nth_child_3n_2 { color: yellow }
+  #container:has(.green:nth-child(3n+2)) ~ #nth_child_3n_2 { color: green }
+  #container:has(.orange:nth-child(3n)) ~ #nth_child_3n { color: orange }
+  #container:has(.yellow:nth-child(3n)) ~ #nth_child_3n { color: yellow }
+  #container:has(.green:nth-child(3n)) ~ #nth_child_3n { color: green }
+</style>
+<div id="container">
+</div>
+<div id="only_child"></div>
+<div id="first_child"></div>
+<div id="last_child"></div>
+<div id="nth_child_3n_1"></div>
+<div id="nth_child_3n_2"></div>
+<div id="nth_child_3n"></div>
+<script>
+const grey = "rgb(128, 128, 128)";
+const red = "rgb(255, 0, 0)";
+const orange = "rgb(255, 165, 0)";
+const yellow = "rgb(255, 255, 0)";
+const green = "rgb(0, 128, 0)";
+
+function testColors(test_name,
+                    only_child_color,
+                    first_child_color,
+                    last_child_color,
+                    nth_child_3n_1_color,
+                    nth_child_3n_2_color,
+                    nth_child_3n_color) {
+  test(function() {
+      assert_equals(getComputedStyle(only_child).color, only_child_color);
+  }, test_name + ": #only_child");
+  test(function() {
+      assert_equals(getComputedStyle(first_child).color, first_child_color);
+  }, test_name + ": #first_child");
+  test(function() {
+      assert_equals(getComputedStyle(last_child).color, last_child_color);
+  }, test_name + ": #last_child");
+  test(function() {
+      assert_equals(getComputedStyle(nth_child_3n_1).color, nth_child_3n_1_color);
+  }, test_name + ": #nth_child_3n_1");
+  test(function() {
+      assert_equals(getComputedStyle(nth_child_3n_2).color, nth_child_3n_2_color);
+  }, test_name + ": #nth_child_3n_2");
+  test(function() {
+      assert_equals(getComputedStyle(nth_child_3n).color, nth_child_3n_color);
+  }, test_name + ": #nth_child_3n");
+}
+
+testColors("Initial colors", grey, grey, grey, grey, grey, grey);
+
+let div1 = document.createElement("div");
+div1.id = "div1";
+div1.classList.add("green");
+container.insertBefore(div1, container.firstChild);
+testColors("Prepend #div1.green", red, green, green, green, grey, grey);
+
+let div2 = document.createElement("div");
+div2.id = "div2";
+div2.classList.add("yellow");
+container.insertBefore(div2, container.firstChild);
+testColors("Prepend #div2.yellow", grey, yellow, green, yellow, green, grey);
+
+let div3 = document.createElement("div");
+div3.id = "div3";
+div3.classList.add("orange");
+container.insertBefore(div3, container.firstChild);
+testColors("Prepend #div3.orange", grey, orange, green, orange, yellow, green);
+
+let div4 = document.createElement("div");
+div4.id = "div4";
+container.insertBefore(div4, container.firstChild);
+testColors("Prepend #div4", grey, grey, green, green, orange, yellow);
+
+let div5 = document.createElement("div");
+div5.id = "div5";
+container.insertBefore(div5, container.firstChild);
+testColors("Prepend #div5", grey, grey, green, yellow, green, orange);
+
+div1.remove();
+testColors("Remove #div1", grey, grey, yellow, yellow, grey, orange);
+
+div2.remove();
+testColors("Remove #div2", grey, grey, orange, grey, grey, orange);
+
+div3.remove();
+testColors("Remove #div3", grey, grey, grey, grey, grey, grey);
+
+div4.remove();
+testColors("Remove #div4", red, grey, grey, grey, grey, grey);
+
+div5.remove();
+testColors("Remove #div5", grey, grey, grey, grey, grey, grey);
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/empty-pseudo-in-has.html b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/empty-pseudo-in-has.html
new file mode 100644
index 0000000..83cf051
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/empty-pseudo-in-has.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>CSS Selectors Invalidation: :empty in :has() argument</title>
+<link rel="author" title="Byungwoo Lee" href="blee@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/selectors/#relational">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+  #subject { color: red }
+  #subject:has(:empty) { color: green }
+  #subject:has(:not(:empty)) { color: blue }
+</style>
+<div id="subject"></div>
+<script>
+const red = 'rgb(255, 0, 0)';
+const green = 'rgb(0, 128, 0)';
+const blue = 'rgb(0, 0, 255)';
+
+function testColor(test_name, color) {
+  test(function() {
+      assert_equals(getComputedStyle(subject).color, color);
+  }, test_name);
+}
+
+testColor("Empty #subject", red);
+
+let child = document.createElement("div");
+child.id = "child";
+subject.appendChild(child);
+
+testColor("Insert div#child to #subject", green);
+
+child.appendChild(document.createElement("div"));
+
+testColor("Insert div to div.#child", blue);
+
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/typed-child-indexed-pseudo-classes-in-has.html b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/typed-child-indexed-pseudo-classes-in-has.html
new file mode 100644
index 0000000..b3a91d67
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/typed-child-indexed-pseudo-classes-in-has.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>CSS Selectors Invalidation: typed child-indexed pseudo classes in :has() argument</title>
+<link rel="author" title="Byungwoo Lee" href="blee@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/selectors/#relational">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+  #container ~ div { color: grey }
+  #container:has(div:only-of-type) ~ #only_of_type { color: red }
+  #container:has(div.orange:first-of-type) ~ #first_of_type { color: orange }
+  #container:has(div.yellow:first-of-type) ~ #first_of_type { color: yellow }
+  #container:has(div.green:first-of-type) ~ #first_of_type { color: green }
+  #container:has(div.orange:last-of-type) ~ #last_of_type { color: orange }
+  #container:has(div.yellow:last-of-type) ~ #last_of_type { color: yellow }
+  #container:has(div.green:last-of-type) ~ #last_of_type { color: green }
+  #container:has(div.orange:nth-of-type(3n+1)) ~ #nth_of_type_3n_1 { color: orange }
+  #container:has(div.yellow:nth-of-type(3n+1)) ~ #nth_of_type_3n_1 { color: yellow }
+  #container:has(div.green:nth-of-type(3n+1)) ~ #nth_of_type_3n_1 { color: green }
+  #container:has(div.orange:nth-of-type(3n+2)) ~ #nth_of_type_3n_2 { color: orange }
+  #container:has(div.yellow:nth-of-type(3n+2)) ~ #nth_of_type_3n_2 { color: yellow }
+  #container:has(div.green:nth-of-type(3n+2)) ~ #nth_of_type_3n_2 { color: green }
+  #container:has(div.orange:nth-of-type(3n)) ~ #nth_of_type_3n { color: orange }
+  #container:has(div.yellow:nth-of-type(3n)) ~ #nth_of_type_3n { color: yellow }
+  #container:has(div.green:nth-of-type(3n)) ~ #nth_of_type_3n { color: green }
+</style>
+<div id="container">
+</div>
+<div id="only_of_type"></div>
+<div id="first_of_type"></div>
+<div id="last_of_type"></div>
+<div id="nth_of_type_3n_1"></div>
+<div id="nth_of_type_3n_2"></div>
+<div id="nth_of_type_3n"></div>
+<script>
+const grey = "rgb(128, 128, 128)";
+const red = "rgb(255, 0, 0)";
+const orange = "rgb(255, 165, 0)";
+const yellow = "rgb(255, 255, 0)";
+const green = "rgb(0, 128, 0)";
+
+function testColors(test_name,
+                    only_of_type_color,
+                    first_of_type_color,
+                    last_of_type_color,
+                    nth_of_type_3n_1_color,
+                    nth_of_type_3n_2_color,
+                    nth_of_type_3n_color) {
+  test(function() {
+      assert_equals(getComputedStyle(only_of_type).color, only_of_type_color);
+  }, test_name + ": #only_of_type");
+  test(function() {
+      assert_equals(getComputedStyle(first_of_type).color, first_of_type_color);
+  }, test_name + ": #first_of_type");
+  test(function() {
+      assert_equals(getComputedStyle(last_of_type).color, last_of_type_color);
+  }, test_name + ": #last_of_type");
+  test(function() {
+      assert_equals(getComputedStyle(nth_of_type_3n_1).color, nth_of_type_3n_1_color);
+  }, test_name + ": #nth_of_type_3n_1");
+  test(function() {
+      assert_equals(getComputedStyle(nth_of_type_3n_2).color, nth_of_type_3n_2_color);
+  }, test_name + ": #nth_of_type_3n_2");
+  test(function() {
+      assert_equals(getComputedStyle(nth_of_type_3n).color, nth_of_type_3n_color);
+  }, test_name + ": #nth_of_type_3n");
+}
+
+testColors("Initial colors", grey, grey, grey, grey, grey, grey);
+
+container.insertBefore(document.createElement("span"), container.firstChild);
+testColors("Prepend span (1)", grey, grey, grey, grey, grey, grey);
+
+let div1 = document.createElement("div");
+div1.id = "div1";
+div1.classList.add("green");
+container.insertBefore(div1, container.firstChild);
+testColors("Prepend #div1.green", red, green, green, green, grey, grey);
+
+container.insertBefore(document.createElement("span"), container.firstChild);
+testColors("Prepend span (2)", red, green, green, green, grey, grey);
+
+let div2 = document.createElement("div");
+div2.id = "div2";
+div2.classList.add("yellow");
+container.insertBefore(div2, container.firstChild);
+testColors("Prepend #div2.yellow", grey, yellow, green, yellow, green, grey);
+
+container.insertBefore(document.createElement("span"), container.firstChild);
+testColors("Prepend span (3)", grey, yellow, green, yellow, green, grey);
+
+let div3 = document.createElement("div");
+div3.id = "div3";
+div3.classList.add("orange");
+container.insertBefore(div3, container.firstChild);
+testColors("Prepend #div3.orange", grey, orange, green, orange, yellow, green);
+
+container.insertBefore(document.createElement("span"), container.firstChild);
+testColors("Prepend span (4)", grey, orange, green, orange, yellow, green);
+
+let div4 = document.createElement("div");
+div4.id = "div4";
+container.insertBefore(div4, container.firstChild);
+testColors("Prepend #div4", grey, grey, green, green, orange, yellow);
+
+container.insertBefore(document.createElement("span"), container.firstChild);
+testColors("Prepend span (5)", grey, grey, green, green, orange, yellow);
+
+let div5 = document.createElement("div");
+div5.id = "div5";
+container.insertBefore(div5, container.firstChild);
+testColors("Prepend #div5", grey, grey, green, yellow, green, orange);
+
+container.insertBefore(document.createElement("span"), container.firstChild);
+testColors("Prepend span (6)", grey, grey, green, yellow, green, orange);
+
+div1.remove();
+testColors("Remove #div1", grey, grey, yellow, yellow, grey, orange);
+
+div2.remove();
+testColors("Remove #div2", grey, grey, orange, grey, grey, orange);
+
+div3.remove();
+testColors("Remove #div3", grey, grey, grey, grey, grey, grey);
+
+div4.remove();
+testColors("Remove #div4", red, grey, grey, grey, grey, grey);
+
+div5.remove();
+testColors("Remove #div5", grey, grey, grey, grey, grey, grey);
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/trusted-types-event-handlers.tentative.html b/third_party/blink/web_tests/external/wpt/trusted-types/trusted-types-event-handlers.tentative.html
new file mode 100644
index 0000000..57f8d3d9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/trusted-types/trusted-types-event-handlers.tentative.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<head>
+  <script src="/resources/testharness.js"></script>
+  <script src="/resources/testharnessreport.js"></script>
+  <meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'">
+</head>
+<body>
+<script>
+const element = document.createElement("div");
+
+[
+  "onclick",
+  "onchange",
+  "onfocus",
+  "oNclick",
+  "OnClIcK"
+].forEach(name => {
+  test(t => {
+    assert_throws_js(TypeError,
+        _ => element.setAttribute(name, "2+2"));
+  }, `Event handler ${name} should be blocked.`);
+});
+
+[
+  "one",
+  "oNe",
+  "onIcon",
+  "offIcon",
+  "blubb"
+].forEach(name => {
+  test(t => {
+    element.setAttribute(name, "2+2");
+  }, `Non-event handler ${name} should not be blocked.`);
+});
+
+// We'd like to be sure we're not missing anything. Let's "query" an HTML
+// element about which attributes it knows.
+const div = document.createElement("div");
+for(name in div.__proto__) {
+  const should_be_event_handler = name.startsWith("on");
+  if (should_be_event_handler) {
+    test(t => {
+      assert_throws_js(TypeError,
+          _ => element.setAttribute(name, "2+2"));
+    }, `Event handler div.${name} should be blocked.`);
+  } else {
+    test(t => {
+      element.setAttribute(name, "2+2");
+    }, `Non-event handler div.${name} should not be blocked.`);
+  }
+}
+</script>
+</body>
diff --git a/third_party/blink/web_tests/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test.js b/third_party/blink/web_tests/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test.js
deleted file mode 100644
index 45a64f7..0000000
--- a/third_party/blink/web_tests/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test.js
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-(async function() {
-  TestRunner.addResult(`Tests V8 code cache for WebAssembly resources.\n`);
-  await TestRunner.loadLegacyModule('timeline'); await TestRunner.loadTestModule('performance_test_runner');
-  await TestRunner.showPanel('timeline');
-
-  // Clear browser cache to avoid any existing entries for the fetched
-  // scripts in the cache.
-  SDK.multitargetNetworkManager.clearBrowserCache();
-
-  async function runTests() {
-    // Asynchronous function to initiate tests in an iframe, and wait until
-    // compilation has finished.
-    const loadFrame = (url) => new Promise((resolve) => {
-      function receiveMessage(e) {
-        if (e.data == 'done') {
-          resolve(e);
-          window.removeEventListener('message', receiveMessage);
-        }
-      }
-      window.addEventListener('message', receiveMessage);
-      const iframe = document.createElement('iframe');
-      iframe.src = url;
-      document.body.appendChild(iframe);
-    });
-
-    // Test same-origin.
-    await loadFrame('http://127.0.0.1:8000/wasm/resources/wasm-cache-iframe.html');
-    // Ensure another origin must recompile everything.
-    await loadFrame('http://localhost:8000/wasm/resources/wasm-cache-iframe.html');
-
-    let script = document.createElement('script');
-    script.type = 'module';
-    script.text = 'window.finishTest()';
-    document.body.appendChild(script);
-    return new Promise(resolve => window.finishTest = resolve);
-  }
-
-  await TestRunner.evaluateInPagePromise(runTests.toString());
-
-  TestRunner.addResult(
-
-`WebAssembly trace events may be generated on multiple background threads, so
-the test sorts them by URL and type to make the output deterministic. We fetch
-2 small and 2 large .wasm resources, from 2 different origins. From these
-8 fetches, we expect:
-
-v8.wasm.cachedModule: 2 .wasm modules are cached
-v8.wasm.streamFromResponseCallback: 8 .wasm resources are fetched
-v8.wasm.compiledModule: 2 for large.wasm, 4 for small.wasm
-v8.wasm.moduleCacheHit: 2 for large.wasm
-`
-);
-
-  await PerformanceTestRunner.invokeWithTracing('runTests', processEvents);
-
-  function stringCompare(a, b) {
-    return a > b ? 1 : b > a ? -1 : 0;
-  }
-  function processEvents() {
-    // Since some WebAssembly compile events may be reported on different
-    // threads, sort events by URL and type, to get a deterministic test.
-    function compareEvents(a, b) {
-      let url_a = a.args['url'] || '';
-      let url_b = b.args['url'] || '';
-      if (url_a != url_b)
-        return stringCompare(url_a, url_b)
-
-      return stringCompare(a.name, b.name)
-    }
-
-    const event_types = new Set([
-      TimelineModel.TimelineModel.RecordType.WasmStreamFromResponseCallback,
-      TimelineModel.TimelineModel.RecordType.WasmCompiledModule,
-      TimelineModel.TimelineModel.RecordType.WasmCachedModule,
-      TimelineModel.TimelineModel.RecordType.WasmModuleCacheHit,
-      TimelineModel.TimelineModel.RecordType.WasmModuleCacheInvalid]);
-    const tracingModel = PerformanceTestRunner.tracingModel();
-
-    let events = new Array();
-    PerformanceTestRunner.tracingModel().sortedProcesses().forEach(
-      p => p.sortedThreads().forEach(
-        t => events = events.concat(t.events().filter(event => event_types.has(event.name)))));
-    events.sort(compareEvents);
-    events.forEach(PerformanceTestRunner.printTraceEventProperties);
-
-    TestRunner.completeTest();
-  }
-})();
diff --git a/third_party/blink/web_tests/http/tests/wasm/caching/code-cache.html b/third_party/blink/web_tests/http/tests/wasm/caching/code-cache.html
new file mode 100644
index 0000000..6235903
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/wasm/caching/code-cache.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+<script>
+async function instantiateAndRunModule(url)
+{
+  let {module, instance} = await WebAssembly.instantiateStreaming(fetch(url));
+
+  // Check if there is any TurboFan function in the compiled module.
+  let has_turbofan = false;
+  for (f in instance.exports) {
+    if (%IsTurboFanFunction(instance.exports[f])) {
+      has_turbofan = true;
+      break;
+    }
+  }
+
+  // Run all functions as long as unoptimized functions are left.
+  let has_unoptimized = true;
+  while (has_unoptimized) {
+    has_unoptimized = false;
+    for (f in instance.exports) {
+      // If this assert fails, it will cause a timeout and not an error.
+      assert_equals(42, instance.exports[f](1, 2, 4));
+      has_unoptimized ||= %IsLiftoffFunction(instance.exports[f]);
+    }
+  }
+  return has_turbofan;
+}
+
+promise_test(async () => {
+  const url = 'http://127.0.0.1:8000/wasm/resources/load-wasm.php?name=large.wasm&cors';
+  // Instantiate and run the module 3 times, as caching only happens after the
+  // second run.
+  let has_turbofan = await instantiateAndRunModule(url);
+  // The initial compilation should not have any TurboFan functions.
+  assert_false(has_turbofan);
+  // Collect the other instances to avoid the in-process module caching.
+  gc();
+  await instantiateAndRunModule(url);
+  gc();
+  has_turbofan = await instantiateAndRunModule(url);
+  // The compiled module should have been loaded from the cache, and should
+  // contain at least one TurboFan function.
+  assert_true(has_turbofan);
+}, "Test that wasm code caching works");
+
+promise_test(async () => {
+  const url = 'http://127.0.0.1:8000/wasm/resources/load-wasm.php?name=small.wasm&cors';
+  // Instantiate and run the module 3 times, as caching only happens after the
+  // second run.
+  let has_turbofan = await instantiateAndRunModule(url);
+  // The initial compilation should not have any TurboFan functions.
+  assert_false(has_turbofan);
+  // Collect the other instances to avoid the in-process module caching.
+  gc();
+  await instantiateAndRunModule(url);
+  gc();
+  has_turbofan = await instantiateAndRunModule(url);
+  // The module should be too small for caching, there should be no TurboFan.
+  assert_false(has_turbofan);
+}, "Test that small wasm modules don't get cached");
+
+promise_test(async () => {
+  const url1 = 'http://127.0.0.1:8000/wasm/resources/load-wasm.php?name=small.wasm&cors';
+  const url2 = 'http://localhost:8000/wasm/resources/load-wasm.php?name=small.wasm&cors';
+  let has_turbofan = await instantiateAndRunModule(url1);
+  // The module has already been optimized in the first test.
+  assert_true(has_turbofan);
+  gc();
+  // Load the same module again, but from a different origin.
+  has_turbofan = await instantiateAndRunModule(url2);
+  // Compiled modules of different origins should not share the cache.
+  assert_false(has_turbofan);
+}, "Test that different origins don't share the cache.");
+</script>
+</html>
diff --git a/third_party/blink/web_tests/http/tests/wasm/resources/large.wasm b/third_party/blink/web_tests/http/tests/wasm/resources/large.wasm
index fe5e206..0656f15 100644
--- a/third_party/blink/web_tests/http/tests/wasm/resources/large.wasm
+++ b/third_party/blink/web_tests/http/tests/wasm/resources/large.wasm
Binary files differ
diff --git a/third_party/blink/web_tests/http/tests/wasm/resources/wasm-cache-iframe.html b/third_party/blink/web_tests/http/tests/wasm/resources/wasm-cache-iframe.html
deleted file mode 100644
index 65537e89..0000000
--- a/third_party/blink/web_tests/http/tests/wasm/resources/wasm-cache-iframe.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<script src="../../../resources/testharness.js"></script>
-<script>
-// Instantiate a WASM module and make sure it works.
-async function instantiateModule(url)
-{
-  await WebAssembly.instantiateStreaming(fetch(url)).then(
-    ({module, instance}) => assert_equals(instance.exports.exported_func(), 42));
-}
-
-const url_base = 'http://127.0.0.1:8000/wasm/resources/load-wasm.php?name=';
-
-(async function runTests() {
-  await instantiateModule(url_base + 'small.wasm&cors');
-  await instantiateModule(url_base + 'small.wasm&cors');
-  await instantiateModule(url_base + 'large.wasm&cors');
-  await instantiateModule(url_base + 'large.wasm&cors');
-
-  window.top.postMessage('done', '*');
-})();
-
-</script>
-
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache-expected.txt
index 63bda116..85cfb60 100644
--- a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache-expected.txt
@@ -7,7 +7,7 @@
 PASS module: Run #1
 PASS module: Run #2
 PASS module: Run #3
-FAIL module: Run #4 promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/imports-a.js"
+PASS module: Run #4
 FAIL module: Run #5 promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/imports-a.js"
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/platform/generic/virtual/wasm-site-isolated-code-cache/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/wasm-site-isolated-code-cache/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test-expected.txt
deleted file mode 100644
index 16491b2..0000000
--- a/third_party/blink/web_tests/platform/generic/virtual/wasm-site-isolated-code-cache/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test-expected.txt
+++ /dev/null
@@ -1,169 +0,0 @@
-Tests V8 code cache for WebAssembly resources.
-
-WebAssembly trace events may be generated on multiple background threads, so
-the test sorts them by URL and type to make the output deterministic. We fetch
-2 small and 2 large .wasm resources, from 2 different origins. From these
-8 fetches, we expect:
-
-v8.wasm.cachedModule: 2 .wasm modules are cached
-v8.wasm.streamFromResponseCallback: 8 .wasm resources are fetched
-v8.wasm.compiledModule: 2 for large.wasm, 4 for small.wasm
-v8.wasm.moduleCacheHit: 2 for large.wasm
-
-v8.wasm.cachedModule Properties:
-{
-    data : {
-        producedCacheSize : <number>
-    }
-    endTime : <number>
-    startTime : <number>
-    type : "v8.wasm.cachedModule"
-}
-v8.wasm.cachedModule Properties:
-{
-    data : {
-        producedCacheSize : <number>
-    }
-    endTime : <number>
-    startTime : <number>
-    type : "v8.wasm.cachedModule"
-}
-v8.wasm.streamFromResponseCallback Properties:
-{
-    data : {
-    }
-    endTime : <number>
-    startTime : <number>
-    type : "v8.wasm.streamFromResponseCallback"
-}
-v8.wasm.streamFromResponseCallback Properties:
-{
-    data : {
-    }
-    endTime : <number>
-    startTime : <number>
-    type : "v8.wasm.streamFromResponseCallback"
-}
-v8.wasm.streamFromResponseCallback Properties:
-{
-    data : {
-    }
-    endTime : <number>
-    startTime : <number>
-    type : "v8.wasm.streamFromResponseCallback"
-}
-v8.wasm.streamFromResponseCallback Properties:
-{
-    data : {
-    }
-    endTime : <number>
-    startTime : <number>
-    type : "v8.wasm.streamFromResponseCallback"
-}
-v8.wasm.streamFromResponseCallback Properties:
-{
-    data : {
-    }
-    endTime : <number>
-    startTime : <number>
-    type : "v8.wasm.streamFromResponseCallback"
-}
-v8.wasm.streamFromResponseCallback Properties:
-{
-    data : {
-    }
-    endTime : <number>
-    startTime : <number>
-    type : "v8.wasm.streamFromResponseCallback"
-}
-v8.wasm.streamFromResponseCallback Properties:
-{
-    data : {
-    }
-    endTime : <number>
-    startTime : <number>
-    type : "v8.wasm.streamFromResponseCallback"
-}
-v8.wasm.streamFromResponseCallback Properties:
-{
-    data : {
-    }
-    endTime : <number>
-    startTime : <number>
-    type : "v8.wasm.streamFromResponseCallback"
-}
-v8.wasm.compiledModule Properties:
-{
-    data : {
-        url : http://127.0.0.1:8000/wasm/resources/load-wasm.php?name=large.wasm&cors
-    }
-    endTime : <number>
-    startTime : <number>
-    type : "v8.wasm.compiledModule"
-}
-v8.wasm.compiledModule Properties:
-{
-    data : {
-        url : http://127.0.0.1:8000/wasm/resources/load-wasm.php?name=large.wasm&cors
-    }
-    endTime : <number>
-    startTime : <number>
-    type : "v8.wasm.compiledModule"
-}
-v8.wasm.moduleCacheHit Properties:
-{
-    data : {
-        consumedCacheSize : <number>
-        url : http://127.0.0.1:8000/wasm/resources/load-wasm.php?name=large.wasm&cors
-    }
-    endTime : <number>
-    startTime : <number>
-    type : "v8.wasm.moduleCacheHit"
-}
-v8.wasm.moduleCacheHit Properties:
-{
-    data : {
-        consumedCacheSize : <number>
-        url : http://127.0.0.1:8000/wasm/resources/load-wasm.php?name=large.wasm&cors
-    }
-    endTime : <number>
-    startTime : <number>
-    type : "v8.wasm.moduleCacheHit"
-}
-v8.wasm.compiledModule Properties:
-{
-    data : {
-        url : http://127.0.0.1:8000/wasm/resources/load-wasm.php?name=small.wasm&cors
-    }
-    endTime : <number>
-    startTime : <number>
-    type : "v8.wasm.compiledModule"
-}
-v8.wasm.compiledModule Properties:
-{
-    data : {
-        url : http://127.0.0.1:8000/wasm/resources/load-wasm.php?name=small.wasm&cors
-    }
-    endTime : <number>
-    startTime : <number>
-    type : "v8.wasm.compiledModule"
-}
-v8.wasm.compiledModule Properties:
-{
-    data : {
-        url : http://127.0.0.1:8000/wasm/resources/load-wasm.php?name=small.wasm&cors
-    }
-    endTime : <number>
-    startTime : <number>
-    type : "v8.wasm.compiledModule"
-}
-v8.wasm.compiledModule Properties:
-{
-    data : {
-        url : http://127.0.0.1:8000/wasm/resources/load-wasm.php?name=small.wasm&cors
-    }
-    endTime : <number>
-    startTime : <number>
-    type : "v8.wasm.compiledModule"
-}
-
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/lots-of-img-layers-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/lots-of-img-layers-expected.png
new file mode 100644
index 0000000..dbf1f9e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/lots-of-img-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/lots-of-img-layers-with-opacity-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/lots-of-img-layers-with-opacity-expected.png
new file mode 100644
index 0000000..b54f81e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/lots-of-img-layers-with-opacity-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/gpu-rasterization/images/color-profile-svg-foreign-object-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/gpu-rasterization/images/color-profile-svg-foreign-object-expected.png
new file mode 100644
index 0000000..e06c2ea
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/gpu-rasterization/images/color-profile-svg-foreign-object-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/wasm-code-caching/README.md b/third_party/blink/web_tests/virtual/wasm-code-caching/README.md
new file mode 100644
index 0000000..5f548fd
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/wasm-code-caching/README.md
@@ -0,0 +1,5 @@
+# This suite runs the tests in http/tests/wasm/caching with
+# --js-flags=--allow-natives-syntax.
+# This feature is required to detect when caching has happened. The flag could
+# be avoided by making sure the test runs long enough. However, this would
+# either make the test slow on fast bots, or flaky on slow bots.
diff --git a/third_party/blink/web_tests/virtual/wasm-site-isolated-code-cache/http/tests/devtools/wasm-isolated-code-cache/README.txt b/third_party/blink/web_tests/virtual/wasm-site-isolated-code-cache/http/tests/devtools/wasm-isolated-code-cache/README.txt
deleted file mode 100644
index e0d2159..0000000
--- a/third_party/blink/web_tests/virtual/wasm-site-isolated-code-cache/http/tests/devtools/wasm-isolated-code-cache/README.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-# This suite runs the tests in http/tests/devtools/wasm-isolated-code-cache with
-# --enable-features=IsolatedCodeCache --site-per-process.
-# This feature is required for security to enforce site isolation on V8
-# code caches. Tracking bug: crbug.com/812168
diff --git a/third_party/ipcz/src/BUILD.gn b/third_party/ipcz/src/BUILD.gn
index 483aa39..354f450 100644
--- a/third_party/ipcz/src/BUILD.gn
+++ b/third_party/ipcz/src/BUILD.gn
@@ -162,10 +162,13 @@
   public = [
     "ipcz/api_object.h",
     "ipcz/block_allocator.h",
+    "ipcz/buffer_pool.h",
     "ipcz/driver_memory.h",
     "ipcz/driver_memory_mapping.h",
     "ipcz/driver_object.h",
     "ipcz/driver_transport.h",
+    "ipcz/fragment.h",
+    "ipcz/fragment_descriptor.h",
     "ipcz/link_side.h",
     "ipcz/link_type.h",
     "ipcz/message_internal.h",
@@ -186,10 +189,16 @@
   sources = [
     "ipcz/api_object.cc",
     "ipcz/block_allocator.cc",
+    "ipcz/block_allocator_pool.cc",
+    "ipcz/block_allocator_pool.h",
+    "ipcz/buffer_id.h",
+    "ipcz/buffer_pool.cc",
     "ipcz/driver_memory.cc",
     "ipcz/driver_memory_mapping.cc",
     "ipcz/driver_object.cc",
     "ipcz/driver_transport.cc",
+    "ipcz/fragment.cc",
+    "ipcz/fragment_descriptor.cc",
     "ipcz/link_side.cc",
     "ipcz/link_type.cc",
     "ipcz/local_router_link.cc",
@@ -255,6 +264,7 @@
     "api_test.cc",
     "connect_test.cc",
     "ipcz/block_allocator_test.cc",
+    "ipcz/buffer_pool_test.cc",
     "ipcz/driver_memory_test.cc",
     "ipcz/driver_object_test.cc",
     "ipcz/driver_transport_test.cc",
diff --git a/third_party/ipcz/src/ipcz/block_allocator.cc b/third_party/ipcz/src/ipcz/block_allocator.cc
index 46c75ca..99251c8 100644
--- a/third_party/ipcz/src/ipcz/block_allocator.cc
+++ b/third_party/ipcz/src/ipcz/block_allocator.cc
@@ -88,7 +88,7 @@
   free_block_at(last_block_index()).SetNextFreeBlock(kFrontBlockIndex);
 }
 
-void* BlockAllocator::Alloc() const {
+void* BlockAllocator::Allocate() const {
   BlockHeader front =
       block_header_at(kFrontBlockIndex).load(std::memory_order_relaxed);
   for (;;) {
diff --git a/third_party/ipcz/src/ipcz/block_allocator.h b/third_party/ipcz/src/ipcz/block_allocator.h
index dcc4f73b..8f6781b 100644
--- a/third_party/ipcz/src/ipcz/block_allocator.h
+++ b/third_party/ipcz/src/ipcz/block_allocator.h
@@ -60,10 +60,10 @@
   // Allocates a block from the allocator's managed region of memory and returns
   // a pointer to its base address, where `block_size()` contiguous bytes are
   // then owned by the caller. May return null if out of blocks.
-  void* Alloc() const;
+  void* Allocate() const;
 
   // Frees a block back to the allocator, given its base address as returned by
-  // a prior call to Alloc(). Returns true on success, or false on failure.
+  // a prior call to Allocate(). Returns true on success, or false on failure.
   // Failure implies that `ptr` was not a valid block to free.
   bool Free(void* ptr) const;
 
@@ -84,7 +84,7 @@
     // Only meaningful within the first block.
     //
     // This field is incremented any time the block's header changes, and it's
-    // used to resolve races between concurrent Alloc() or Free() operations
+    // used to resolve races between concurrent Allocate() or Free() operations
     // modifying the head of the free-list.
     //
     // For blocks other than the first block, this is always zero.
diff --git a/third_party/ipcz/src/ipcz/block_allocator_pool.cc b/third_party/ipcz/src/ipcz/block_allocator_pool.cc
new file mode 100644
index 0000000..bff96cb4
--- /dev/null
+++ b/third_party/ipcz/src/ipcz/block_allocator_pool.cc
@@ -0,0 +1,122 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ipcz/block_allocator_pool.h"
+
+#include "third_party/abseil-cpp/absl/synchronization/mutex.h"
+#include "util/log.h"
+#include "util/safe_math.h"
+
+namespace ipcz {
+
+BlockAllocatorPool::BlockAllocatorPool() = default;
+
+BlockAllocatorPool::~BlockAllocatorPool() = default;
+
+size_t BlockAllocatorPool::GetCapacity() {
+  absl::MutexLock lock(&mutex_);
+  return capacity_;
+}
+
+bool BlockAllocatorPool::Add(BufferId buffer_id,
+                             absl::Span<uint8_t> buffer_memory,
+                             const BlockAllocator& allocator) {
+  absl::MutexLock lock(&mutex_);
+  Entry* previous_tail = nullptr;
+  Entry* new_entry;
+  if (!entries_.empty()) {
+    previous_tail = &entries_.back();
+  }
+
+  capacity_ += allocator.capacity() * allocator.block_size();
+  entries_.emplace_back(buffer_id, buffer_memory, allocator);
+
+  new_entry = &entries_.back();
+  auto [it, inserted] = entry_map_.insert({buffer_id, new_entry});
+  if (!inserted) {
+    entries_.pop_back();
+    return false;
+  }
+
+  if (previous_tail) {
+    previous_tail->next = new_entry;
+  } else {
+    active_entry_ = new_entry;
+  }
+
+  return true;
+}
+
+Fragment BlockAllocatorPool::Allocate() {
+  // For the fast common case, we always start by trying to reuse the most
+  // recently used allocator.
+  Entry* entry = active_entry_.load(std::memory_order_relaxed);
+  if (!entry) {
+    return {};
+  }
+
+  Entry* starting_entry = entry;
+  do {
+    const BlockAllocator& allocator = entry->allocator;
+    void* block = allocator.Allocate();
+    if (block) {
+      // Success! Compute a FragmentDescriptor based on the block address and
+      // the mapped region's location.
+      const size_t offset =
+          (static_cast<uint8_t*>(block) - entry->buffer_memory.data());
+      if (entry->buffer_memory.size() - allocator.block_size() < offset) {
+        // Allocator did something bad and this span would fall outside of the
+        // mapped region's bounds.
+        DLOG(ERROR) << "Invalid address from BlockAllocator.";
+        return {};
+      }
+
+      if (entry != starting_entry) {
+        // Attempt to update the active entry to reflect our success. Since this
+        // is only meant as a helpful hint for future allocations, we don't
+        // really care whether it succeeds.
+        active_entry_.compare_exchange_weak(starting_entry, entry,
+                                            std::memory_order_relaxed);
+      }
+
+      FragmentDescriptor descriptor(
+          entry->buffer_id, checked_cast<uint32_t>(offset),
+          checked_cast<uint32_t>(allocator.block_size()));
+      return Fragment(descriptor, block);
+    }
+
+    // Allocation from the active allocator failed. Try another if available.
+    absl::MutexLock lock(&mutex_);
+    entry = entry->next;
+  } while (entry && entry != starting_entry);
+
+  return {};
+}
+
+bool BlockAllocatorPool::Free(const Fragment& fragment) {
+  Entry* entry;
+  {
+    absl::MutexLock lock(&mutex_);
+    auto it = entry_map_.find(fragment.buffer_id());
+    if (it == entry_map_.end()) {
+      DLOG(ERROR) << "Invalid Free() call on BlockAllocatorPool";
+      return false;
+    }
+
+    entry = it->second;
+  }
+
+  return entry->allocator.Free(fragment.address());
+}
+
+BlockAllocatorPool::Entry::Entry(BufferId buffer_id,
+                                 absl::Span<uint8_t> buffer_memory,
+                                 const BlockAllocator& allocator)
+    : buffer_id(buffer_id),
+      buffer_memory(buffer_memory),
+      allocator(allocator) {}
+
+BlockAllocatorPool::Entry::~Entry() = default;
+
+}  // namespace ipcz
diff --git a/third_party/ipcz/src/ipcz/block_allocator_pool.h b/third_party/ipcz/src/ipcz/block_allocator_pool.h
new file mode 100644
index 0000000..bbaed15
--- /dev/null
+++ b/third_party/ipcz/src/ipcz/block_allocator_pool.h
@@ -0,0 +1,93 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IPCZ_SRC_IPCZ_BLOCK_ALLOCATOR_POOL_H_
+#define IPCZ_SRC_IPCZ_BLOCK_ALLOCATOR_POOL_H_
+
+#include <atomic>
+#include <cstdint>
+#include <list>
+
+#include "ipcz/block_allocator.h"
+#include "ipcz/buffer_id.h"
+#include "ipcz/fragment.h"
+#include "third_party/abseil-cpp/absl/container/flat_hash_map.h"
+#include "third_party/abseil-cpp/absl/synchronization/mutex.h"
+#include "third_party/abseil-cpp/absl/types/span.h"
+
+namespace ipcz {
+
+// Manages a pool of BlockAllocators for a specific block size. This maintains
+// the allocators in a list along with a cached reference to the allocator most
+// recently used for a successful allocation.
+//
+// The pool cycles through its allocators as needed to satisfy new requests,
+// failing only once a complete pass over all allocators fails to yield a
+// successful allocation.
+//
+// BlockAllocatorPool is is thread-safe.
+class BlockAllocatorPool {
+ public:
+  BlockAllocatorPool();
+  ~BlockAllocatorPool();
+
+  // Returns the total allocable capacity (in bytes) within this pool. Note that
+  // this counts all blocks, including ones which are currently allocated.
+  size_t GetCapacity();
+
+  // Registers a new allocator. `buffer_memory` is the entire mapped region
+  // associated with `buffer_id`, not just the subspan managed by `allocator`.
+  //
+  // Note that each BlockAllocatorPool allows only one allocator per unique
+  // `buffer_id`. This returns false if an allocator was already registered for
+  // `buffer_id`, and true otherwise to indicate success.
+  bool Add(BufferId buffer_id,
+           absl::Span<uint8_t> buffer_memory,
+           const BlockAllocator& allocator);
+
+  // Allocates a block from the pool and returns a reference to it as a
+  // Fragment. Returns a null Fragment if a block could not be allocated.
+  Fragment Allocate();
+
+  // Frees a fragment previously allocated from one of this pool's allocators.
+  // Returns true if and only if `fragment` was a valid fragment to free.
+  bool Free(const Fragment& fragment);
+
+ private:
+  struct Entry {
+    Entry(BufferId buffer_id,
+          absl::Span<uint8_t> buffer_memory,
+          const BlockAllocator& allocator);
+    ~Entry();
+
+    const BufferId buffer_id;
+    const absl::Span<uint8_t> buffer_memory;
+    const BlockAllocator allocator;
+
+    // Cached pointer to the next entry.
+    Entry* next = nullptr;
+  };
+
+  absl::Mutex mutex_;
+
+  // List of all allocators added to this pool. Once added, elements are never
+  // removed from this list. Note that std::list is chosen so that Entry
+  // references are stable over time.
+  std::list<Entry> entries_ ABSL_GUARDED_BY(mutex_);
+
+  // Maps BufferId to a specific Entry in the pool, so individual Fragments can
+  // be freed efficiently by the pool.
+  absl::flat_hash_map<BufferId, Entry*> entry_map_ ABSL_GUARDED_BY(mutex_);
+
+  // The total capacity of all BlockAllocators added to the pool so far.
+  size_t capacity_ ABSL_GUARDED_BY(mutex_) = 0;
+
+  // An atomic cache of the most recently used Entry, for fast unsynchronized
+  // access in the common case.
+  std::atomic<Entry*> active_entry_{nullptr};
+};
+
+}  // namespace ipcz
+
+#endif  // IPCZ_SRC_IPCZ_BLOCK_ALLOCATOR_POOL_H_
diff --git a/third_party/ipcz/src/ipcz/block_allocator_test.cc b/third_party/ipcz/src/ipcz/block_allocator_test.cc
index ce8be2e..0132793 100644
--- a/third_party/ipcz/src/ipcz/block_allocator_test.cc
+++ b/third_party/ipcz/src/ipcz/block_allocator_test.cc
@@ -36,15 +36,15 @@
 
   std::set<void*> blocks;
   for (size_t i = 0; i < allocator().capacity(); ++i) {
-    void* block = allocator().Alloc();
+    void* block = allocator().Allocate();
     ASSERT_TRUE(block);
     memset(block, 0xaa, kBlockSize);
     auto [it, inserted] = blocks.insert(block);
     EXPECT_TRUE(inserted);
   }
 
-  // All capacity has been allocated, so Alloc() should fail.
-  EXPECT_FALSE(allocator().Alloc());
+  // All capacity has been allocated, so Allocate() should fail.
+  EXPECT_FALSE(allocator().Allocate());
 
   // The entire region (except the first block) should be filled with 0xaa
   // bytes, as all blocks were allocated and filled completely.
@@ -72,7 +72,7 @@
     for (size_t i = 0; i < kNumIterations; ++i) {
       size_t* data;
       do {
-        data = static_cast<size_t*>(allocator().Alloc());
+        data = static_cast<size_t*>(allocator().Allocate());
       } while (!data);
       *data = i;
       allocated_blocks[i].store(data, std::memory_order_release);
@@ -97,7 +97,7 @@
 }
 
 TEST_F(BlockAllocatorTest, StressTest) {
-  // This test creates a bunch of worker threads to race Alloc() and Free()
+  // This test creates a bunch of worker threads to race Allocate() and Free()
   // operations. Workers mark their allocated blocks and verify consistency of
   // markers when freeing them. Once all workers have finished, the test
   // verifies that all blocks are still allocable and none were lost due to racy
@@ -111,7 +111,7 @@
       size_t num_allocations = 0;
       for (size_t j = 0; j < kNumAllocationsPerIteration; ++j) {
         if (auto* p =
-                static_cast<std::atomic<uint32_t>*>(allocator().Alloc())) {
+                static_cast<std::atomic<uint32_t>*>(allocator().Allocate())) {
           allocations[num_allocations++] = p;
           p->store(id, std::memory_order_relaxed);
         }
@@ -136,7 +136,7 @@
 
   size_t allocable_capacity = 0;
   for (size_t i = 0; i < allocator().capacity(); ++i) {
-    void* p = allocator().Alloc();
+    void* p = allocator().Allocate();
     if (p) {
       ++allocable_capacity;
     }
diff --git a/third_party/ipcz/src/ipcz/buffer_id.h b/third_party/ipcz/src/ipcz/buffer_id.h
new file mode 100644
index 0000000..763a436d
--- /dev/null
+++ b/third_party/ipcz/src/ipcz/buffer_id.h
@@ -0,0 +1,23 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IPCZ_SRC_IPCZ_BUFFER_ID_H_
+#define IPCZ_SRC_IPCZ_BUFFER_ID_H_
+
+#include <cstdint>
+
+#include "util/strong_alias.h"
+
+namespace ipcz {
+
+// Identifies a shared memory buffer scoped to a NodeLink and owned by its
+// NodeLinkMemory via a BufferPool. New BufferIds are allocated atomically by
+// either side of the NodeLink.
+using BufferId = StrongAlias<class BufferIdTag, uint64_t>;
+
+constexpr BufferId kInvalidBufferId{~0};
+
+}  // namespace ipcz
+
+#endif  // IPCZ_SRC_IPCZ_BUFFER_ID_H_
diff --git a/third_party/ipcz/src/ipcz/buffer_pool.cc b/third_party/ipcz/src/ipcz/buffer_pool.cc
new file mode 100644
index 0000000..b6373ca
--- /dev/null
+++ b/third_party/ipcz/src/ipcz/buffer_pool.cc
@@ -0,0 +1,172 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ipcz/buffer_pool.h"
+
+#include <algorithm>
+
+#include "ipcz/block_allocator_pool.h"
+#include "third_party/abseil-cpp/absl/base/macros.h"
+#include "third_party/abseil-cpp/absl/container/flat_hash_map.h"
+#include "third_party/abseil-cpp/absl/numeric/bits.h"
+#include "third_party/abseil-cpp/absl/synchronization/mutex.h"
+
+namespace ipcz {
+
+BufferPool::BufferPool() = default;
+
+BufferPool::~BufferPool() = default;
+
+bool BufferPool::AddBuffer(BufferId id, DriverMemoryMapping mapping) {
+  ABSL_ASSERT(mapping.is_valid());
+
+  absl::MutexLock lock(&mutex_);
+  auto [it, inserted] = mappings_.insert({id, std::move(mapping)});
+  return inserted;
+}
+
+absl::Span<uint8_t> BufferPool::GetBufferMemory(BufferId id) {
+  absl::MutexLock lock(&mutex_);
+  auto it = mappings_.find(id);
+  if (it == mappings_.end()) {
+    return {};
+  }
+
+  return it->second.bytes();
+}
+
+Fragment BufferPool::GetFragment(const FragmentDescriptor& descriptor) {
+  if (descriptor.is_null()) {
+    return {};
+  }
+
+  absl::MutexLock lock(&mutex_);
+  auto it = mappings_.find(descriptor.buffer_id());
+  if (it == mappings_.end()) {
+    return Fragment(descriptor, nullptr);
+  }
+
+  auto& [id, mapping] = *it;
+  if (descriptor.end() > mapping.bytes().size()) {
+    return {};
+  }
+
+  return Fragment(descriptor, mapping.address_at(descriptor.offset()));
+}
+
+bool BufferPool::RegisterBlockAllocator(BufferId buffer_id,
+                                        const BlockAllocator& allocator) {
+  const size_t block_size = allocator.block_size();
+
+  absl::MutexLock lock(&mutex_);
+  auto mapping_it = mappings_.find(buffer_id);
+  if (mapping_it == mappings_.end()) {
+    return false;
+  }
+
+  auto& mapping = mapping_it->second;
+  if (&allocator.region().front() < &mapping.bytes().front() ||
+      &allocator.region().back() > &mapping.bytes().back()) {
+    return false;
+  }
+
+  auto [it, inserted] = block_allocator_pools_.insert({block_size, nullptr});
+  auto& pool = it->second;
+  if (inserted) {
+    pool = std::make_unique<BlockAllocatorPool>();
+  }
+
+  pool->Add(buffer_id, mapping.bytes(), allocator);
+  return true;
+}
+
+size_t BufferPool::GetTotalBlockAllocatorCapacity(size_t block_size) {
+  BlockAllocatorPool* pool;
+  {
+    absl::MutexLock lock(&mutex_);
+    auto it = block_allocator_pools_.find(block_size);
+    if (it == block_allocator_pools_.end()) {
+      return 0;
+    }
+
+    pool = it->second.get();
+  }
+
+  return pool->GetCapacity();
+}
+
+Fragment BufferPool::AllocateFragment(size_t num_bytes) {
+  const size_t block_size = absl::bit_ceil(num_bytes);
+  BlockAllocatorPool* pool;
+  {
+    absl::MutexLock lock(&mutex_);
+    auto it = block_allocator_pools_.lower_bound(block_size);
+    if (it == block_allocator_pools_.end()) {
+      return {};
+    }
+
+    // NOTE: BlockAllocatorPools live as long as this BufferPool once added, and
+    // they are thread-safe objects; so retaining this pointer through the
+    // extent of AllocateFragment() is safe.
+    pool = it->second.get();
+  }
+
+  return pool->Allocate();
+}
+
+Fragment BufferPool::AllocatePartialFragment(size_t preferred_num_bytes) {
+  // Limit the number of attempts we make to scale down the requested size in
+  // search of an available fragment. This value was chosen arbitrarily.
+  constexpr size_t kMaxAttempts = 3;
+
+  BlockAllocatorPoolMap::iterator pool_iter;
+  BlockAllocatorPool* pool;
+  {
+    absl::MutexLock lock(&mutex_);
+    if (block_allocator_pools_.empty()) {
+      return {};
+    }
+
+    pool_iter = block_allocator_pools_.lower_bound(preferred_num_bytes);
+    if (pool_iter == block_allocator_pools_.end()) {
+      --pool_iter;
+    }
+
+    pool = pool_iter->second.get();
+  }
+
+  for (size_t attempts = 0; attempts < kMaxAttempts; ++attempts) {
+    const Fragment fragment = pool->Allocate();
+    if (!fragment.is_null()) {
+      return fragment;
+    }
+
+    absl::MutexLock lock(&mutex_);
+    if (pool_iter == block_allocator_pools_.begin()) {
+      return {};
+    }
+
+    --pool_iter;
+    pool = pool_iter->second.get();
+  }
+
+  return {};
+}
+
+bool BufferPool::FreeFragment(const Fragment& fragment) {
+  BlockAllocatorPool* pool;
+  {
+    absl::MutexLock lock(&mutex_);
+    auto it = block_allocator_pools_.find(fragment.size());
+    if (it == block_allocator_pools_.end()) {
+      return false;
+    }
+
+    pool = it->second.get();
+  }
+
+  return pool->Free(fragment);
+}
+
+}  // namespace ipcz
diff --git a/third_party/ipcz/src/ipcz/buffer_pool.h b/third_party/ipcz/src/ipcz/buffer_pool.h
new file mode 100644
index 0000000..1268e74
--- /dev/null
+++ b/third_party/ipcz/src/ipcz/buffer_pool.h
@@ -0,0 +1,116 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IPCZ_SRC_IPCZ_BUFFER_POOL_H_
+#define IPCZ_SRC_IPCZ_BUFFER_POOL_H_
+
+#include <cstdint>
+#include <map>
+#include <memory>
+
+#include "ipcz/block_allocator.h"
+#include "ipcz/buffer_id.h"
+#include "ipcz/driver_memory_mapping.h"
+#include "ipcz/fragment.h"
+#include "ipcz/fragment_descriptor.h"
+#include "third_party/abseil-cpp/absl/container/flat_hash_map.h"
+#include "third_party/abseil-cpp/absl/synchronization/mutex.h"
+
+namespace ipcz {
+
+class BlockAllocatorPool;
+
+// BufferPool maintains ownership of an extensible collection of mapped
+// DriverMemory buffers, exposing access to them for dynamic memory allocation
+// and arbitrary state sharing. Every buffer owned by a BufferPool is identified
+// by a unique BufferId, and once a buffer is added to the pool it remains there
+// indefinitely.
+//
+// BufferPool objects are thread-safe.
+class BufferPool {
+ public:
+  BufferPool();
+  ~BufferPool();
+
+  // Registers `mapping` under `id` within this pool.
+  //
+  // Returns true if the mapping was successfully added, or false if the pool
+  // already had a buffer registered under the given `id`.
+  bool AddBuffer(BufferId id, DriverMemoryMapping mapping);
+
+  // Returns the full span of memory mapped by the identified buffer, or an
+  // empty span if no such buffer is registered with this BufferPool.
+  //
+  // Note that because buffers remain mapped indefinitely by the BufferPool
+  // once added, this span is safe to retain as long as the BufferPool itself
+  // remains alive.
+  absl::Span<uint8_t> GetBufferMemory(BufferId id);
+
+  // Resolves `descriptor` to a concrete Fragment. If the descriptor is null or
+  // describes a region of memory which exceeds the bounds of the identified
+  // buffer, this returns a null Fragment.
+  //
+  // If the descriptor's BufferId is not yet registered with this pool, this
+  // returns a pending Fragment with the same BufferId and dimensions as
+  // `descriptor`.
+  //
+  // Otherwise this returns a resolved Fragment which references an appropriate
+  // span of mapped memory.
+  Fragment GetFragment(const FragmentDescriptor& descriptor);
+
+  // Registers a BlockAllocator with this pool to support subsequent
+  // AllocateFragment() calls. If successful, the allocator may be used to
+  // fulfill fragment allocation requests for any size up to and including
+  // `block_size`.
+  //
+  // `buffer_id` must identify a buffer mapping which has already been
+  // registered to this pool via AddBuffer(), and `allocator` must be
+  // constructed over a span of memory which falls entirely within that mapping.
+  //
+  // Returns true on success and false on failure. Failure implies that either
+  // `buffer_id` was unknown or `allocator` does not manage memory within the
+  // identified buffer.
+  bool RegisterBlockAllocator(BufferId buffer_id,
+                              const BlockAllocator& allocator);
+
+  // Returns the total size in bytes of capacity available across all registered
+  // BlockAllocators for the given `block_size`.
+  size_t GetTotalBlockAllocatorCapacity(size_t block_size);
+
+  // Attempts to allocate an unused fragment from the pool with a size of at
+  // least `num_bytes`. For most allocations, this prefers to use a
+  // BlockAllocator for the smallest available block size which still fits
+  // `num_bytes`.
+  //
+  // If the BufferPool cannot accommodate the allocation request, this returns
+  // a null Fragment.
+  Fragment AllocateFragment(size_t num_bytes);
+
+  // Similar to AllocateFragment(), but this may allocate less space than
+  // requested if that's all that's available. May still return a null Fragment
+  // if the BufferPool has trouble finding available memory.
+  Fragment AllocatePartialFragment(size_t preferred_num_bytes);
+
+  // Frees a Fragment previously allocated from this pool via AllocateFragment()
+  // or AllocatePartialFragment(). Returns true if successful, or false if
+  // `fragment` does not identify a fragment allocated from a buffer managed by
+  // this pool.
+  bool FreeFragment(const Fragment& fragment);
+
+ private:
+  absl::Mutex mutex_;
+  absl::flat_hash_map<BufferId, DriverMemoryMapping> mappings_
+      ABSL_GUARDED_BY(mutex_);
+
+  // Mapping from block size to a pool of BlockAllocators for that size. When
+  // a new BlockAllocator is registered with this BufferPool, it's added to an
+  // appropriate BlockAllocatorPool within this map.
+  using BlockAllocatorPoolMap =
+      std::map<size_t, std::unique_ptr<BlockAllocatorPool>>;
+  BlockAllocatorPoolMap block_allocator_pools_ ABSL_GUARDED_BY(mutex_);
+};
+
+}  // namespace ipcz
+
+#endif  // IPCZ_SRC_IPCZ_BUFFER_POOL_H_
diff --git a/third_party/ipcz/src/ipcz/buffer_pool_test.cc b/third_party/ipcz/src/ipcz/buffer_pool_test.cc
new file mode 100644
index 0000000..fc8a43d
--- /dev/null
+++ b/third_party/ipcz/src/ipcz/buffer_pool_test.cc
@@ -0,0 +1,273 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ipcz/buffer_pool.h"
+
+#include <vector>
+
+#include "ipcz/block_allocator.h"
+#include "ipcz/driver_memory.h"
+#include "ipcz/driver_memory_mapping.h"
+#include "ipcz/node.h"
+#include "reference_drivers/single_process_reference_driver.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/abseil-cpp/absl/types/span.h"
+#include "util/ref_counted.h"
+
+namespace ipcz {
+namespace {
+
+class BufferPoolTest : public testing::Test {
+ protected:
+  DriverMemoryMapping AllocateDriverMemory(size_t size) {
+    return DriverMemory(node_, size).Map();
+  }
+
+ private:
+  const Ref<Node> node_{
+      MakeRefCounted<Node>(Node::Type::kBroker,
+                           reference_drivers::kSingleProcessReferenceDriver,
+                           IPCZ_INVALID_DRIVER_HANDLE)};
+};
+
+TEST_F(BufferPoolTest, AddBuffer) {
+  constexpr size_t kSize = 4096;
+  DriverMemoryMapping mapping = AllocateDriverMemory(kSize);
+  absl::Span<uint8_t> bytes = mapping.bytes();
+
+  BufferPool pool;
+  EXPECT_TRUE(pool.AddBuffer(BufferId{0}, std::move(mapping)));
+
+  auto memory = pool.GetBufferMemory(BufferId{0});
+  EXPECT_EQ(bytes.data(), memory.data());
+  EXPECT_EQ(bytes.size(), memory.size());
+
+  // No duplicates.
+  DriverMemoryMapping another_mapping = AllocateDriverMemory(kSize);
+  EXPECT_FALSE(pool.AddBuffer(BufferId{0}, std::move(another_mapping)));
+
+  // BufferId 0 is still the original buffer.
+  memory = pool.GetBufferMemory(BufferId{0});
+  EXPECT_EQ(bytes.data(), memory.data());
+  EXPECT_EQ(bytes.size(), memory.size());
+
+  DriverMemoryMapping yet_another_mapping = AllocateDriverMemory(kSize);
+  absl::Span<uint8_t> other_bytes = yet_another_mapping.bytes();
+  EXPECT_TRUE(pool.AddBuffer(BufferId{1}, std::move(yet_another_mapping)));
+
+  // BufferId 0 is still the original buffer.
+  memory = pool.GetBufferMemory(BufferId{0});
+  EXPECT_EQ(bytes.data(), memory.data());
+  EXPECT_EQ(bytes.size(), memory.size());
+
+  // BufferId 1 is available now too.
+  memory = pool.GetBufferMemory(BufferId{1});
+  EXPECT_EQ(other_bytes.data(), memory.data());
+  EXPECT_EQ(other_bytes.size(), memory.size());
+}
+
+TEST_F(BufferPoolTest, GetFragment) {
+  constexpr size_t kSize1 = 4096;
+  constexpr size_t kSize2 = 2048;
+  DriverMemoryMapping mapping1 = AllocateDriverMemory(kSize1);
+  DriverMemoryMapping mapping2 = AllocateDriverMemory(kSize2);
+  absl::Span<uint8_t> bytes1 = mapping1.bytes();
+  absl::Span<uint8_t> bytes2 = mapping2.bytes();
+
+  BufferPool pool;
+  EXPECT_TRUE(pool.AddBuffer(BufferId{1}, std::move(mapping1)));
+  EXPECT_TRUE(pool.AddBuffer(BufferId{2}, std::move(mapping2)));
+
+  // We can resolve fragments covering entire buffers.
+  Fragment fragment =
+      pool.GetFragment(FragmentDescriptor{BufferId{1}, 0, kSize1});
+  EXPECT_FALSE(fragment.is_null());
+  EXPECT_TRUE(fragment.is_addressable());
+  EXPECT_EQ(bytes1.data(), fragment.bytes().data());
+  EXPECT_EQ(kSize1, fragment.bytes().size());
+
+  fragment = pool.GetFragment(FragmentDescriptor{BufferId{2}, 0, kSize2});
+  EXPECT_FALSE(fragment.is_null());
+  EXPECT_TRUE(fragment.is_addressable());
+  EXPECT_EQ(bytes2.data(), fragment.bytes().data());
+  EXPECT_EQ(kSize2, fragment.bytes().size());
+
+  // We can resolve fragments covering a subspan of a buffer.
+  constexpr size_t kPartialFragmentOffset = 4;
+  constexpr size_t kPartialFragmentSize = kSize2 / 2;
+  fragment = pool.GetFragment(FragmentDescriptor{
+      BufferId{2}, kPartialFragmentOffset, kPartialFragmentSize});
+  EXPECT_FALSE(fragment.is_null());
+  EXPECT_TRUE(fragment.is_addressable());
+  EXPECT_EQ(bytes2.subspan(kPartialFragmentOffset).data(),
+            fragment.bytes().data());
+  EXPECT_EQ(kPartialFragmentSize, fragment.bytes().size());
+
+  // Unknown BufferIds resolve to pending fragments.
+  const FragmentDescriptor descriptor(BufferId{42}, 5, 1234);
+  fragment = pool.GetFragment(descriptor);
+  EXPECT_FALSE(fragment.is_null());
+  EXPECT_FALSE(fragment.is_addressable());
+  EXPECT_TRUE(fragment.is_pending());
+  EXPECT_EQ(descriptor.buffer_id(), fragment.buffer_id());
+  EXPECT_EQ(descriptor.offset(), fragment.offset());
+  EXPECT_EQ(descriptor.size(), fragment.size());
+
+  // Null descriptors resolve to null fragments.
+  fragment = pool.GetFragment({});
+  EXPECT_TRUE(fragment.is_null());
+
+  // Out-of-bounds descriptors resolve to null fragments too.
+  fragment = pool.GetFragment(FragmentDescriptor{BufferId{1}, 0, kSize1 + 1});
+  EXPECT_TRUE(fragment.is_null());
+}
+
+TEST_F(BufferPoolTest, BasicBlockAllocation) {
+  BufferPool pool;
+  pool.AddBuffer(BufferId{0}, AllocateDriverMemory(4096));
+  pool.AddBuffer(BufferId{1}, AllocateDriverMemory(4096));
+
+  constexpr size_t kBlockSize = 64;
+  BlockAllocator allocator1(pool.GetBufferMemory(BufferId{0}), kBlockSize);
+  allocator1.InitializeRegion();
+
+  BlockAllocator allocator2(pool.GetBufferMemory(BufferId{1}), kBlockSize);
+  allocator2.InitializeRegion();
+
+  EXPECT_TRUE(pool.RegisterBlockAllocator(BufferId{0}, allocator1));
+
+  // No duplicates.
+  EXPECT_FALSE(pool.RegisterBlockAllocator(BufferId{0}, allocator2));
+
+  EXPECT_TRUE(pool.RegisterBlockAllocator(BufferId{1}, allocator2));
+
+  EXPECT_EQ(kBlockSize * (allocator1.capacity() + allocator2.capacity()),
+            pool.GetTotalBlockAllocatorCapacity(kBlockSize));
+
+  // We can't free something that isn't a valid allocation.
+  EXPECT_FALSE(pool.FreeFragment(Fragment{{}, nullptr}));
+  EXPECT_FALSE(pool.FreeFragment(Fragment{{BufferId{1000}, 0, 1}, nullptr}));
+  EXPECT_FALSE(pool.FreeFragment(
+      Fragment{{BufferId{0}, 0, 1}, pool.GetBufferMemory(BufferId{0}).data()}));
+
+  // Allocate all available capacity.
+  std::vector<Fragment> fragments;
+  for (;;) {
+    Fragment fragment = pool.AllocateFragment(kBlockSize);
+    if (fragment.is_null()) {
+      break;
+    }
+    fragments.push_back(fragment);
+  }
+
+  EXPECT_EQ(allocator1.capacity() + allocator2.capacity(), fragments.size());
+  for (const Fragment& fragment : fragments) {
+    EXPECT_TRUE(pool.FreeFragment(fragment));
+  }
+}
+
+TEST_F(BufferPoolTest, BlockAllocationSizing) {
+  BufferPool pool;
+  EXPECT_TRUE(pool.AddBuffer(BufferId{1}, AllocateDriverMemory(4096)));
+  EXPECT_TRUE(pool.AddBuffer(BufferId{2}, AllocateDriverMemory(4096)));
+
+  constexpr size_t kBuffer1BlockSize = 64;
+  BlockAllocator allocator1(pool.GetBufferMemory(BufferId{1}),
+                            kBuffer1BlockSize);
+  allocator1.InitializeRegion();
+
+  constexpr size_t kBuffer2BlockSize = 128;
+  BlockAllocator allocator2(pool.GetBufferMemory(BufferId{2}),
+                            kBuffer2BlockSize);
+  allocator2.InitializeRegion();
+
+  EXPECT_TRUE(pool.RegisterBlockAllocator(BufferId{1}, allocator1));
+  EXPECT_TRUE(pool.RegisterBlockAllocator(BufferId{2}, allocator2));
+
+  // Allocations not larger than 64 bytes should be drawn from buffer 1.
+
+  Fragment fragment = pool.AllocateFragment(1);
+  EXPECT_TRUE(fragment.is_addressable());
+  EXPECT_EQ(BufferId{1}, fragment.buffer_id());
+  EXPECT_EQ(kBuffer1BlockSize, fragment.size());
+
+  fragment = pool.AllocateFragment(kBuffer1BlockSize / 2);
+  EXPECT_TRUE(fragment.is_addressable());
+  EXPECT_EQ(BufferId{1}, fragment.buffer_id());
+  EXPECT_EQ(kBuffer1BlockSize, fragment.size());
+
+  fragment = pool.AllocateFragment(kBuffer1BlockSize);
+  EXPECT_TRUE(fragment.is_addressable());
+  EXPECT_EQ(BufferId{1}, fragment.buffer_id());
+  EXPECT_EQ(kBuffer1BlockSize, fragment.size());
+
+  // Larger allocations which are still no larger than 128 bytes should be drawn
+  // from buffer 2.
+
+  fragment = pool.AllocateFragment(kBuffer1BlockSize + 1);
+  EXPECT_TRUE(fragment.is_addressable());
+  EXPECT_EQ(BufferId{2}, fragment.buffer_id());
+  EXPECT_EQ(kBuffer2BlockSize, fragment.size());
+
+  fragment = pool.AllocateFragment(kBuffer2BlockSize);
+  EXPECT_TRUE(fragment.is_addressable());
+  EXPECT_EQ(BufferId{2}, fragment.buffer_id());
+  EXPECT_EQ(kBuffer2BlockSize, fragment.size());
+
+  // Anything larger than kBuffer2BlockSize should fail to allocate.
+
+  fragment = pool.AllocateFragment(kBuffer2BlockSize + 1);
+  EXPECT_TRUE(fragment.is_null());
+}
+
+TEST_F(BufferPoolTest, PartialBlockAllocation) {
+  BufferPool pool;
+  EXPECT_TRUE(pool.AddBuffer(BufferId{1}, AllocateDriverMemory(4096)));
+  EXPECT_TRUE(pool.AddBuffer(BufferId{2}, AllocateDriverMemory(4096)));
+
+  constexpr size_t kBuffer1BlockSize = 64;
+  BlockAllocator allocator1(pool.GetBufferMemory(BufferId{1}),
+                            kBuffer1BlockSize);
+  allocator1.InitializeRegion();
+
+  constexpr size_t kBuffer2BlockSize = 128;
+  BlockAllocator allocator2(pool.GetBufferMemory(BufferId{2}),
+                            kBuffer2BlockSize);
+  allocator2.InitializeRegion();
+
+  EXPECT_TRUE(pool.RegisterBlockAllocator(BufferId{1}, allocator1));
+  EXPECT_TRUE(pool.RegisterBlockAllocator(BufferId{2}, allocator2));
+
+  // Oversized partial allocations can succceed.
+
+  Fragment partial_fragment =
+      pool.AllocatePartialFragment(kBuffer2BlockSize + 1);
+  EXPECT_TRUE(partial_fragment.is_addressable());
+  EXPECT_EQ(BufferId{2}, partial_fragment.buffer_id());
+  EXPECT_EQ(kBuffer2BlockSize, partial_fragment.size());
+
+  // If we exhaust a sufficient block size, we should fall back onto smaller
+  // block sizes.
+
+  // First allocate all available capacity for kBuffer2BlockSize.
+  std::vector<Fragment> fragments;
+  for (;;) {
+    Fragment fragment = pool.AllocateFragment(kBuffer2BlockSize);
+    if (fragment.is_null()) {
+      break;
+    }
+    fragments.push_back(fragment);
+  }
+
+  // A partial allocation of kBuffer2BlockSize should still succeed, albeit for
+  // a smaller size (kBuffer1BlockSize).
+
+  partial_fragment = pool.AllocatePartialFragment(kBuffer2BlockSize);
+  EXPECT_TRUE(partial_fragment.is_addressable());
+  EXPECT_EQ(BufferId{1}, partial_fragment.buffer_id());
+  EXPECT_EQ(kBuffer1BlockSize, partial_fragment.size());
+}
+
+}  // namespace
+}  // namespace ipcz
diff --git a/third_party/ipcz/src/ipcz/fragment.cc b/third_party/ipcz/src/ipcz/fragment.cc
new file mode 100644
index 0000000..2cb2e87
--- /dev/null
+++ b/third_party/ipcz/src/ipcz/fragment.cc
@@ -0,0 +1,25 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ipcz/fragment.h"
+
+#include <cstdint>
+
+#include "third_party/abseil-cpp/absl/base/macros.h"
+
+namespace ipcz {
+
+Fragment::Fragment(const FragmentDescriptor& descriptor, void* address)
+    : descriptor_(descriptor), address_(address) {
+  // If `address` is non-null, the descriptor must also be. Note that the
+  // inverse is not true, as a pending fragment may have a null mapped address
+  // but a non-null descriptor.
+  ABSL_ASSERT(address == nullptr || !descriptor_.is_null());
+}
+
+Fragment::Fragment(const Fragment&) = default;
+
+Fragment& Fragment::operator=(const Fragment&) = default;
+
+}  // namespace ipcz
diff --git a/third_party/ipcz/src/ipcz/fragment.h b/third_party/ipcz/src/ipcz/fragment.h
new file mode 100644
index 0000000..e1a87d2
--- /dev/null
+++ b/third_party/ipcz/src/ipcz/fragment.h
@@ -0,0 +1,77 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IPCZ_SRC_IPCZ_FRAGMENT_H_
+#define IPCZ_SRC_IPCZ_FRAGMENT_H_
+
+#include <cstdint>
+
+#include "ipcz/buffer_id.h"
+#include "ipcz/fragment_descriptor.h"
+#include "third_party/abseil-cpp/absl/base/macros.h"
+#include "third_party/abseil-cpp/absl/types/span.h"
+
+namespace ipcz {
+
+// Represents a span of memory located within the shared memory regions owned by
+// a NodeLinkMemory, via BufferPool. This is essentially a FragmentDescriptor
+// plus the actual mapped address of the given buffer and offset.
+struct Fragment {
+  constexpr Fragment() = default;
+
+  // Constructs a new Fragment over `descriptor`, mapped to `address`. If
+  // `address` is null, the Fragment is considered "pending" -- it has a
+  // potentially valid descriptor, but could not be resolved to a mapped address
+  // yet (e.g. because the relevant BufferPool doesn't have the identified
+  // buffer mapped yet.)
+  Fragment(const FragmentDescriptor& descriptor, void* address);
+  Fragment(const Fragment&);
+  Fragment& operator=(const Fragment&);
+
+  // A null fragment is a fragment with a null descriptor, meaning it does not
+  // reference a valid buffer ID.
+  bool is_null() const { return descriptor_.is_null(); }
+
+  // An addressable fragment is a fragment with a non-null mapped address (which
+  // also implies a non-null descriptor.)
+  bool is_addressable() const { return address_ != nullptr; }
+
+  // A pending fragment is one with a non-null descriptor but a null mapped
+  // address. Pending fragments may be resolved later, but are not themselves
+  // addressable.
+  bool is_pending() const { return !is_null() && !is_addressable(); }
+
+  BufferId buffer_id() const { return descriptor_.buffer_id(); }
+  uint32_t offset() const { return descriptor_.offset(); }
+  uint32_t size() const { return descriptor_.size(); }
+  const FragmentDescriptor& descriptor() const { return descriptor_; }
+
+  // Returns the mapped base address for this fragment. Null unless
+  // `is_addressable()` is true.
+  void* address() const { return address_; }
+
+  // Returns the span of mapped bytes corresponding to this fragment. Invalid
+  // to call unless `is_addressable()` is true.
+  absl::Span<const uint8_t> bytes() const {
+    ABSL_ASSERT(is_addressable());
+    return {static_cast<const uint8_t*>(address_), descriptor_.size()};
+  }
+
+  // Returns the span of mapped (mutable) bytes corresponding to this fragment.
+  // Invalid to call unless `is_addressable()` is true.
+  absl::Span<uint8_t> mutable_bytes() const {
+    ABSL_ASSERT(is_addressable());
+    return {static_cast<uint8_t*>(address_), descriptor_.size()};
+  }
+
+ private:
+  FragmentDescriptor descriptor_;
+
+  // The actual mapped address corresponding to `descriptor_`.
+  void* address_ = nullptr;
+};
+
+}  // namespace ipcz
+
+#endif  // IPCZ_SRC_IPCZ_FRAGMENT_H_
diff --git a/third_party/ipcz/src/ipcz/fragment_descriptor.cc b/third_party/ipcz/src/ipcz/fragment_descriptor.cc
new file mode 100644
index 0000000..1e65f28
--- /dev/null
+++ b/third_party/ipcz/src/ipcz/fragment_descriptor.cc
@@ -0,0 +1,14 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ipcz/fragment_descriptor.h"
+
+namespace ipcz {
+
+FragmentDescriptor::FragmentDescriptor(const FragmentDescriptor&) = default;
+
+FragmentDescriptor& FragmentDescriptor::operator=(const FragmentDescriptor&) =
+    default;
+
+}  // namespace ipcz
diff --git a/third_party/ipcz/src/ipcz/fragment_descriptor.h b/third_party/ipcz/src/ipcz/fragment_descriptor.h
new file mode 100644
index 0000000..578acca4
--- /dev/null
+++ b/third_party/ipcz/src/ipcz/fragment_descriptor.h
@@ -0,0 +1,59 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IPCZ_SRC_IPCZ_FRAGMENT_DESCRIPTOR_H_
+#define IPCZ_SRC_IPCZ_FRAGMENT_DESCRIPTOR_H_
+
+#include <cstdint>
+#include <tuple>
+
+#include "ipcz/buffer_id.h"
+#include "ipcz/ipcz.h"
+
+namespace ipcz {
+
+// Represents a span of memory within the shared memory regions owned by a
+// BufferPool. A FragmentDescriptor can be resolved to a concrete Fragment
+// by passing it to GetFragment() on an appropriate BufferPool object.
+//
+// NOTE: This is a wire structure which must remain stable over time.
+struct IPCZ_ALIGN(8) FragmentDescriptor {
+  // Constructs a null descriptor. Null descriptors always resolve to null
+  // fragments.
+  constexpr FragmentDescriptor() = default;
+
+  FragmentDescriptor(const FragmentDescriptor&);
+  FragmentDescriptor& operator=(const FragmentDescriptor&);
+
+  // Constructs a descriptor for a span of memory `size` bytes long, starting
+  // at byte `offset` within the buffer identified by `buffer_id` within some
+  // BufferPool.
+  constexpr FragmentDescriptor(BufferId buffer_id,
+                               uint32_t offset,
+                               uint32_t size)
+      : buffer_id_(buffer_id), offset_(offset), size_(size) {}
+
+  bool is_null() const { return buffer_id_ == kInvalidBufferId; }
+
+  BufferId buffer_id() const { return buffer_id_; }
+  uint32_t offset() const { return offset_; }
+  uint32_t size() const { return size_; }
+  uint32_t end() const { return offset_ + size_; }
+
+ private:
+  // Identifies the shared memory buffer in which the memory resides. This ID is
+  // scoped to a specific BufferPool (and therefore to a specific NodeLink).
+  BufferId buffer_id_ = kInvalidBufferId;
+
+  // The byte offset from the start of the identified shared memory buffer where
+  // this fragment begins.
+  uint32_t offset_ = 0;
+
+  // The size of this fragment in bytes.
+  uint32_t size_ = 0;
+};
+
+}  // namespace ipcz
+
+#endif  // IPCZ_SRC_IPCZ_FRAGMENT_DESCRIPTOR_H_
diff --git a/third_party/ipcz/src/util/strong_alias.h b/third_party/ipcz/src/util/strong_alias.h
index bc994fe6..d6faf97 100644
--- a/third_party/ipcz/src/util/strong_alias.h
+++ b/third_party/ipcz/src/util/strong_alias.h
@@ -5,6 +5,9 @@
 #ifndef IPCZ_SRC_UTIL_STRONG_ALIAS_H_
 #define IPCZ_SRC_UTIL_STRONG_ALIAS_H_
 
+#include <ostream>
+#include <utility>
+
 namespace ipcz {
 
 // Type-safe alternative for C++ type aliases. This is derived from Chromium's
diff --git a/tools/OWNERS b/tools/OWNERS
index 3b85ff1..9f7685ae 100644
--- a/tools/OWNERS
+++ b/tools/OWNERS
@@ -25,8 +25,6 @@
 
 per-file gyp-explain.py=thakis@chromium.org
 
-per-file gypv8sh.py=machenbach@chromium.org
-
 per-file include_tracer.py=thakis@chromium.org
 
 per-file ipc_messages_log.py=yfriedman@chromium.org
diff --git a/tools/cast3p/cast_core.version b/tools/cast3p/cast_core.version
index 9f7d9875..86f6ac2 100644
--- a/tools/cast3p/cast_core.version
+++ b/tools/cast3p/cast_core.version
@@ -1 +1 @@
-cast_20220428_0600_RC00
+cast_20220513_0600_RC00
diff --git a/tools/mb/mb.py b/tools/mb/mb.py
index 23f7128..5b30479 100755
--- a/tools/mb/mb.py
+++ b/tools/mb/mb.py
@@ -1510,9 +1510,11 @@
     is_android = 'target_os="android"' in vals['gn_args']
     is_cros = ('target_os="chromeos"' in vals['gn_args']
                or 'is_chromeos_device=true' in vals['gn_args'])
-    is_mac = self.platform == 'darwin'
     is_msan = 'is_msan=true' in vals['gn_args']
     is_ios = 'target_os="ios"' in vals['gn_args']
+    # pylint: disable=consider-using-ternary
+    is_mac = ((self.platform == 'darwin' and not is_ios)
+              or 'target_os="mac"' in vals['gn_args'])
 
     err = ''
     for f in files:
@@ -1699,7 +1701,9 @@
                or 'is_chromeos_device=true' in vals['gn_args'])
     is_cros_device = 'is_chromeos_device=true' in vals['gn_args']
     is_ios = 'target_os="ios"' in vals['gn_args']
-    is_mac = self.platform == 'darwin' and not is_ios
+    # pylint: disable=consider-using-ternary
+    is_mac = ((self.platform == 'darwin' and not is_ios)
+              or 'target_os="mac"' in vals['gn_args'])
     is_win = self.platform == 'win32' or 'target_os="win"' in vals['gn_args']
     is_lacros = 'chromeos_is_browser_only=true' in vals['gn_args']
 
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 9712f0c..ea02e5c 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -54459,7 +54459,6 @@
   <int value="-2112547309" label="ClickToCallReceiver:enabled"/>
   <int value="-2111273398" label="SendTabToSelfManageDevicesLink:enabled"/>
   <int value="-2111196530" label="EnableAssistantLauncherUI:disabled"/>
-  <int value="-2109929623" label="CombineResponseBody:enabled"/>
   <int value="-2108564200" label="AutofillUpstream:disabled"/>
   <int value="-2106960993" label="HarfBuzzPDFSubsetter:disabled"/>
   <int value="-2106763275" label="ArcRtVcpuQuadCore:enabled"/>
@@ -59887,7 +59886,6 @@
   <int value="1482039233" label="SearchSuggestionsOnLocalNtp:disabled"/>
   <int value="1482245628" label="OmniboxNativeVoiceSuggestProvider:enabled"/>
   <int value="1482839038" label="AutofillCreditCardAuthentication:enabled"/>
-  <int value="1483766877" label="CombineResponseBody:disabled"/>
   <int value="1483827594" label="webview-selective-image-inversion-darkening"/>
   <int value="1483980996" label="MacSyscallSandbox:enabled"/>
   <int value="1486092162"
@@ -91981,6 +91979,12 @@
   <int value="3" label="Token was cleared"/>
 </enum>
 
+<enum name="ToolbarCaptureType">
+  <int value="0" label="unknown"/>
+  <int value="1" label="top"/>
+  <int value="2" label="bottom"/>
+</enum>
+
 <enum name="TouchActions">
   <int value="0" label="NONE"/>
   <int value="1" label="PAN_LEFT"/>
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml
index 0f2325ff..dc16852 100644
--- a/tools/metrics/histograms/metadata/android/histograms.xml
+++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -3461,6 +3461,18 @@
       variants="ThumbnailProvider_ClientType"/>
 </histogram>
 
+<histogram name="Android.Toolbar.BitmapCapture" units="ToolbarCaptureType"
+    expires_after="2023-05-11">
+  <owner>skym@chromium.org</owner>
+  <owner>seacow@google.com</owner>
+  <summary>
+    Recorded when a toolbar view draws itself to a bitmap such that it can be
+    passed to the compositor and drawn by native. Performing a bitmap capture is
+    somewhat expensive opperation that must be done on the UI thread. It is
+    possible that high capture counts are correlated with scroll jank.
+  </summary>
+</histogram>
+
 <histogram name="Android.View.onDraw.30Seconds" units="count"
     expires_after="2022-10-30">
   <owner>nuskos@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/apps/histograms.xml b/tools/metrics/histograms/metadata/apps/histograms.xml
index 1bf6d71..7e83478 100644
--- a/tools/metrics/histograms/metadata/apps/histograms.xml
+++ b/tools/metrics/histograms/metadata/apps/histograms.xml
@@ -954,6 +954,22 @@
   </summary>
 </histogram>
 
+<histogram
+    name="Apps.AppList.SortDiscoveryDurationAfterEducationNudgeV2{TabletOrClamshell}"
+    units="ms" expires_after="M107">
+  <owner>andrewxu@chromium.org</owner>
+  <owner>tbarzic@chromium.org</owner>
+  <summary>
+    The time duration between showing the app list sort education nudge and the
+    first sort usage. This metric is recorded when app list sort is triggered
+    after the sort nudge is shown. The collected data are separated by the
+    tablet mode state under which the sort nudge is shown. In detail, if the
+    sort nudge shows initially in tablet (or clamshell), then the discovery
+    duration is reported using the histogram for tablet (or clamshell).
+  </summary>
+  <token key="TabletOrClamshell" variants="DisplayModes"/>
+</histogram>
+
 <histogram name="Apps.AppList.SortOrderOnSessionStart.{TabletOrClamshell}"
     enum="AppListSortOrder" expires_after="2022-09-01">
   <owner>andrewxu@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/navigation/histograms.xml b/tools/metrics/histograms/metadata/navigation/histograms.xml
index 616e941..e25f5c2c 100644
--- a/tools/metrics/histograms/metadata/navigation/histograms.xml
+++ b/tools/metrics/histograms/metadata/navigation/histograms.xml
@@ -1086,7 +1086,6 @@
   <token key="Method">
     <variant name="OnReceiveRedirect"/>
     <variant name="OnReceiveResponse"/>
-    <variant name="OnStartLoadingResponseBody"/>
   </token>
   <token key="FrameType" variants="FrameTypes"/>
 </histogram>
diff --git a/tools/metrics/histograms/metadata/power/histograms.xml b/tools/metrics/histograms/metadata/power/histograms.xml
index e020b1f..f5fa9b3 100644
--- a/tools/metrics/histograms/metadata/power/histograms.xml
+++ b/tools/metrics/histograms/metadata/power/histograms.xml
@@ -1168,6 +1168,14 @@
     in which at least one WebView is visible on the screen as
     &quot;foreground&quot; time. For Chrome, it considers any time the Chrome
     app is visible, including when in multi-window mode.
+
+    Note that the capacity counter can be implemented in different ways by
+    different devices/OEMs and its accuracy can vary (across devices and at
+    different times on the same device, also due to environmental factors like
+    device temperature or charge level).
+
+    We've found looking at the 99%ile-trimmed mean more useful than looking at
+    specific percentiles, especially when filtering for specific device models.
   </summary>
   <token key="Exclusive">
     <variant name="" summary=""/>
@@ -1223,6 +1231,11 @@
     in which at least one WebView is visible on the screen as
     &quot;foreground&quot; time. For Chrome, it considers any time the Chrome
     app is visible, including when in multi-window mode.
+
+    Note that the capacity counter can be implemented in different ways by
+    different devices/OEMs and its accuracy can vary (across devices and at
+    different times on the same device, also due to environmental factors like
+    device temperature or charge level).
   </summary>
   <token key="Exclusive">
     <variant name="" summary=""/>
@@ -1256,6 +1269,11 @@
     &quot;foreground&quot; time. For Chrome, it considers any time the Chrome
     app is visible, including when in multi-window mode.
 
+    Note that the capacity counter can be implemented in different ways by
+    different devices/OEMs and its accuracy can vary (across devices and at
+    different times on the same device, also due to environmental factors like
+    device temperature or charge level).
+
     For a histogram of daily per-user values, see the computed histogram
     Power.DailyForegroundBatteryDrain.
   </summary>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 7bcf3d50e..d0e78d3 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -21,8 +21,8 @@
             "full_remote_path": "perfetto-luci-artifacts/v25.0/mac-arm64/trace_processor_shell"
         },
         "linux": {
-            "hash": "6aac32f5f073df525fd01c1fa8560b8835ee2507",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/378c48e919baf08561d11f8261629bf007779131/trace_processor_shell"
+            "hash": "ae9e3dcf2246f4116bb335cd304026c4c3493187",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/c585628f4537d88115684c5ab5827cdfff90f7df/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/ui/accessibility/platform/ax_platform_node_cocoa.mm b/ui/accessibility/platform/ax_platform_node_cocoa.mm
index 7e77f2a..4e0ccbcd 100644
--- a/ui/accessibility/platform/ax_platform_node_cocoa.mm
+++ b/ui/accessibility/platform/ax_platform_node_cocoa.mm
@@ -1022,7 +1022,7 @@
     [axAttributes addObject:NSAccessibilityGrabbedAttribute];
 
   if (ui::SupportsRequired(role)) {
-    [axAttributes addObject:NSAccessibilityRequiredAttributeChrome];
+    [axAttributes addObject:NSAccessibilityRequiredAttribute];
   }
 
   // Url: add the url attribute only if the object has a valid url.
diff --git a/ui/accessibility/platform/ax_private_attributes_mac.h b/ui/accessibility/platform/ax_private_attributes_mac.h
index 96fc95b..7cf065e3 100644
--- a/ui/accessibility/platform/ax_private_attributes_mac.h
+++ b/ui/accessibility/platform/ax_private_attributes_mac.h
@@ -100,18 +100,4 @@
 AX_EXPORT constexpr NSString* const NSAccessibilityVisitedAttribute =
     @"AXVisited";
 
-#if defined(MAC_OS_X_VERSION_10_12) && \
-    (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)
-#warning NSAccessibilityRequiredAttributeChrome \
-  should be removed since the deployment target is >= 10.12
-#endif
-
-// The following private WebKit accessibility attribute became public in 10.12,
-// but it can't be used on all OS because it has availability of 10.12. Instead,
-// define a similarly named constant with the "Chrome" suffix, and the same
-// string. This is used as the key to a dictionary, so string-comparison will
-// work.
-AX_EXPORT constexpr NSString* const NSAccessibilityRequiredAttributeChrome =
-    @"AXRequired";
-
 #endif  // UI_ACCESSIBILITY_PLATFORM_AX_PRIVATE_ATTRIBUTES_MAC_H_
diff --git a/ui/accessibility/platform/inspect/ax_inspect_utils_mac.mm b/ui/accessibility/platform/inspect/ax_inspect_utils_mac.mm
index 6482789..4cd9a05 100644
--- a/ui/accessibility/platform/inspect/ax_inspect_utils_mac.mm
+++ b/ui/accessibility/platform/inspect/ax_inspect_utils_mac.mm
@@ -79,7 +79,7 @@
        NSAccessibilityMathPrescriptsAttribute,
        NSAccessibilityOwnsAttribute,
        NSAccessibilityPopupValueAttribute,
-       NSAccessibilityRequiredAttributeChrome,
+       NSAccessibilityRequiredAttribute,
        NSAccessibilityRoleDescriptionAttribute,
        NSAccessibilitySelectedAttribute,
        NSAccessibilityTitleAttribute,
diff --git a/ui/base/clipboard/clipboard_util_mac.mm b/ui/base/clipboard/clipboard_util_mac.mm
index 8db45d2..ee45b6e3c 100644
--- a/ui/base/clipboard/clipboard_util_mac.mm
+++ b/ui/base/clipboard/clipboard_util_mac.mm
@@ -219,10 +219,10 @@
   NSString* buffer_type = nil;
   switch (buffer) {
     case ClipboardBuffer::kCopyPaste:
-      buffer_type = NSGeneralPboard;
+      buffer_type = NSPasteboardNameGeneral;
       break;
     case ClipboardBuffer::kDrag:
-      buffer_type = NSDragPboard;
+      buffer_type = NSPasteboardNameDrag;
       break;
     case ClipboardBuffer::kSelection:
       NOTREACHED();
diff --git a/ui/base/cocoa/find_pasteboard.h b/ui/base/cocoa/find_pasteboard.h
index af199b0..c3daace 100644
--- a/ui/base/cocoa/find_pasteboard.h
+++ b/ui/base/cocoa/find_pasteboard.h
@@ -21,7 +21,7 @@
 // to get the text currently on the find pasteboard, and to receive
 // notifications when the text on the find pasteboard has changed. You should
 // always use this class instead of accessing
-// [NSPasteboard pasteboardWithName:NSFindPboard] directly.
+// [NSPasteboard pasteboardWithName:NSPasteboardNameFind] directly.
 //
 // This is not thread-safe and must be used on the main thread.
 //
diff --git a/ui/base/cocoa/find_pasteboard.mm b/ui/base/cocoa/find_pasteboard.mm
index 4850338..f1dae630 100644
--- a/ui/base/cocoa/find_pasteboard.mm
+++ b/ui/base/cocoa/find_pasteboard.mm
@@ -42,7 +42,7 @@
 }
 
 - (NSPasteboard*)findPboard {
-  return [NSPasteboard pasteboardWithName:NSFindPboard];
+  return [NSPasteboard pasteboardWithName:NSPasteboardNameFind];
 }
 
 - (void)loadTextFromPasteboard:(NSNotification*)notification {
diff --git a/ui/display/mac/screen_mac.mm b/ui/display/mac/screen_mac.mm
index a9d9934..1df332fd 100644
--- a/ui/display/mac/screen_mac.mm
+++ b/ui/display/mac/screen_mac.mm
@@ -119,7 +119,7 @@
     CGColorSpaceRef cg_color_space = [[screen colorSpace] CGColorSpace];
     if (cg_color_space) {
       base::ScopedCFTypeRef<CFDataRef> cf_icc_profile(
-          CGColorSpaceCopyICCProfile(cg_color_space));
+          CGColorSpaceCopyICCData(cg_color_space));
       if (cf_icc_profile) {
         icc_profile = gfx::ICCProfile::FromData(
             CFDataGetBytePtr(cf_icc_profile), CFDataGetLength(cf_icc_profile));
diff --git a/ui/gfx/mac/display_icc_profiles.cc b/ui/gfx/mac/display_icc_profiles.cc
index e00e980c..90d557d 100644
--- a/ui/gfx/mac/display_icc_profiles.cc
+++ b/ui/gfx/mac/display_icc_profiles.cc
@@ -41,8 +41,8 @@
   map_.clear();
 
   // Always add Apple's sRGB profile.
-  base::ScopedCFTypeRef<CFDataRef> srgb_icc(CGColorSpaceCopyICCProfile(
-      CGColorSpaceCreateWithName(kCGColorSpaceSRGB)));
+  base::ScopedCFTypeRef<CFDataRef> srgb_icc(
+      CGColorSpaceCopyICCData(CGColorSpaceCreateWithName(kCGColorSpaceSRGB)));
   map_[ColorSpace::CreateSRGB()] = srgb_icc;
 
   // Add the profiles for all active displays.
@@ -66,7 +66,7 @@
     if (!cg_color_space)
       continue;
     base::ScopedCFTypeRef<CFDataRef> icc_data(
-        CGColorSpaceCopyICCProfile(cg_color_space));
+        CGColorSpaceCopyICCData(cg_color_space));
     if (!icc_data)
       continue;
     ICCProfile icc_profile = ICCProfile::FromData(CFDataGetBytePtr(icc_data),
diff --git a/ui/gfx/mac/io_surface.cc b/ui/gfx/mac/io_surface.cc
index ee6ef50..1a9bbeb 100644
--- a/ui/gfx/mac/io_surface.cc
+++ b/ui/gfx/mac/io_surface.cc
@@ -318,7 +318,7 @@
   } else {
     CGColorSpaceRef color_space = base::mac::GetSRGBColorSpace();
     base::ScopedCFTypeRef<CFDataRef> color_space_icc(
-        CGColorSpaceCopyICCProfile(color_space));
+        CGColorSpaceCopyICCData(color_space));
     IOSurfaceSetValue(surface, CFSTR("IOSurfaceColorSpace"), color_space_icc);
   }
 
diff --git a/ui/gl/gl_display_manager.h b/ui/gl/gl_display_manager.h
index cbb55fc..1bdff3a 100644
--- a/ui/gl/gl_display_manager.h
+++ b/ui/gl/gl_display_manager.h
@@ -6,6 +6,7 @@
 #define UI_GL_GL_DISPLAY_MANAGER_H_
 
 #include <map>
+#include <memory>
 #include <vector>
 
 #include "base/check.h"
diff --git a/weblayer/browser/proxying_url_loader_factory_impl.cc b/weblayer/browser/proxying_url_loader_factory_impl.cc
index 2a2cce4..9cece1d 100644
--- a/weblayer/browser/proxying_url_loader_factory_impl.cc
+++ b/weblayer/browser/proxying_url_loader_factory_impl.cc
@@ -45,8 +45,6 @@
     const std::string& data) {
   mojo::Remote<network::mojom::URLLoaderClient> client(
       std::move(pending_client));
-  client->OnReceiveResponse(std::move(response_head),
-                            mojo::ScopedDataPipeConsumerHandle());
 
   mojo::ScopedDataPipeProducerHandle producer;
   mojo::ScopedDataPipeConsumerHandle consumer;
@@ -56,7 +54,7 @@
     return;
   }
 
-  client->OnStartLoadingResponseBody(std::move(consumer));
+  client->OnReceiveResponse(std::move(response_head), std::move(consumer));
 
   auto write_data = std::make_unique<WriteData>();
   write_data->client = std::move(client);
diff --git a/weblayer/browser/translate_accept_languages_factory.cc b/weblayer/browser/translate_accept_languages_factory.cc
index 904887f..fe16057 100644
--- a/weblayer/browser/translate_accept_languages_factory.cc
+++ b/weblayer/browser/translate_accept_languages_factory.cc
@@ -6,19 +6,19 @@
 
 #include "base/no_destructor.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/language/core/browser/accept_languages_service.h"
 #include "components/language/core/browser/pref_names.h"
 #include "components/prefs/pref_service.h"
-#include "components/translate/core/browser/translate_accept_languages.h"
 #include "components/user_prefs/user_prefs.h"
 #include "content/public/browser/browser_context.h"
 
 namespace weblayer {
 
 // static
-translate::TranslateAcceptLanguages*
+language::AcceptLanguagesService*
 TranslateAcceptLanguagesFactory::GetForBrowserContext(
     content::BrowserContext* context) {
-  return static_cast<translate::TranslateAcceptLanguages*>(
+  return static_cast<language::AcceptLanguagesService*>(
       GetInstance()->GetServiceForBrowserContext(context, true));
 }
 
@@ -31,14 +31,14 @@
 
 TranslateAcceptLanguagesFactory::TranslateAcceptLanguagesFactory()
     : BrowserContextKeyedServiceFactory(
-          "TranslateAcceptLanguages",
+          "AcceptLanguagesService",
           BrowserContextDependencyManager::GetInstance()) {}
 
 TranslateAcceptLanguagesFactory::~TranslateAcceptLanguagesFactory() = default;
 
 KeyedService* TranslateAcceptLanguagesFactory::BuildServiceInstanceFor(
     content::BrowserContext* browser_context) const {
-  return new translate::TranslateAcceptLanguages(
+  return new language::AcceptLanguagesService(
       user_prefs::UserPrefs::Get(browser_context),
       language::prefs::kAcceptLanguages);
 }
diff --git a/weblayer/browser/translate_accept_languages_factory.h b/weblayer/browser/translate_accept_languages_factory.h
index 257bcf1..27b9cf6d 100644
--- a/weblayer/browser/translate_accept_languages_factory.h
+++ b/weblayer/browser/translate_accept_languages_factory.h
@@ -8,14 +8,14 @@
 #include "base/no_destructor.h"
 #include "components/keyed_service/content/browser_context_keyed_service_factory.h"
 
-namespace translate {
-class TranslateAcceptLanguages;
+namespace language {
+class AcceptLanguagesService;
 }
 
 namespace weblayer {
 
-// TranslateAcceptLanguagesFactory is a way to associate a
-// TranslateAcceptLanguages instance to a BrowserContext.
+// TranslateAcceptLanguagesFactory is a way to associate an
+// AcceptLanguagesService instance to a BrowserContext.
 class TranslateAcceptLanguagesFactory
     : public BrowserContextKeyedServiceFactory {
  public:
@@ -24,7 +24,7 @@
   TranslateAcceptLanguagesFactory& operator=(
       const TranslateAcceptLanguagesFactory&) = delete;
 
-  static translate::TranslateAcceptLanguages* GetForBrowserContext(
+  static language::AcceptLanguagesService* GetForBrowserContext(
       content::BrowserContext* browser_context);
   static TranslateAcceptLanguagesFactory* GetInstance();
 
diff --git a/weblayer/browser/translate_client_impl.cc b/weblayer/browser/translate_client_impl.cc
index 5b02cad..ad15df2 100644
--- a/weblayer/browser/translate_client_impl.cc
+++ b/weblayer/browser/translate_client_impl.cc
@@ -114,7 +114,7 @@
   return CreateTranslatePrefs(GetPrefs());
 }
 
-translate::TranslateAcceptLanguages*
+language::AcceptLanguagesService*
 TranslateClientImpl::GetTranslateAcceptLanguages() {
   return TranslateAcceptLanguagesFactory::GetForBrowserContext(
       web_contents()->GetBrowserContext());
diff --git a/weblayer/browser/translate_client_impl.h b/weblayer/browser/translate_client_impl.h
index db471c84..78acc67 100644
--- a/weblayer/browser/translate_client_impl.h
+++ b/weblayer/browser/translate_client_impl.h
@@ -53,7 +53,7 @@
   translate::TranslateDriver* GetTranslateDriver() override;
   PrefService* GetPrefs() override;
   std::unique_ptr<translate::TranslatePrefs> GetTranslatePrefs() override;
-  translate::TranslateAcceptLanguages* GetTranslateAcceptLanguages() override;
+  language::AcceptLanguagesService* GetTranslateAcceptLanguages() override;
 #if BUILDFLAG(IS_ANDROID)
   std::unique_ptr<infobars::InfoBar> CreateInfoBar(
       std::unique_ptr<translate::TranslateInfoBarDelegate> delegate)